From patchwork Mon May 16 18:34:52 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stephen Boyd X-Patchwork-Id: 12851350 Received: from mail-pj1-f50.google.com (mail-pj1-f50.google.com [209.85.216.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D3C3D1376 for ; Mon, 16 May 2022 18:34:56 +0000 (UTC) Received: by mail-pj1-f50.google.com with SMTP id a23-20020a17090acb9700b001df4e9f4870so132099pju.1 for ; Mon, 16 May 2022 11:34:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=B+y3ghcGTNoWHMuz4m4RXJ7SgZxKsd4M4FdcYQjzA2w=; b=cxqvyxqR0vj/bC96KVA7ctZ0rsu4BnDz2HIF7A+msr0g3QETbAY8RBEt6+NmkbvCLy I3EdnrcacKqv1OChq/MXrd5hWhvvjQCvo8XPjWe6ssVQ6QA4elagVf9pTiAxQxHG7dUD 8nZgN9OGTySge3vXLW2ce4lQQWGTL54dsFoz8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=B+y3ghcGTNoWHMuz4m4RXJ7SgZxKsd4M4FdcYQjzA2w=; b=njyP/Oe2cRvj0fMimT31/BHiKPKlwVwbrf79RvBe/DwbEotzYKK8WKX3JYvldA2g2g 1ZSFp7U2JIvcFjK0BxyFPnvWFCELftiGFZSGPfTDAyUhIUW7TB0KbMI9XnhjnrKS0V4l tirlavfDRcrAXrHCpj9sBrQA5Wa/JGW4P9msSkaVdmHFPiQL31kWyUAcv2cDNBFIj8Rl ge37RRcUVZvY61srXxtsRLecSM1PNCVNUg0w8iT6ufH0u3mmVDrn7h/vaJC9y7gF4EoS JZahMRgR0sP8kW+bTn9PuU6VLhS1DQEHfCb9SJEjmPunNn8bDGLr4ickvOeuzNzOvY2p xpjw== X-Gm-Message-State: AOAM5338P60jE5/evzZB4fFY+Xo8plv7kpR8cVMyqqia6nzH/XX16tiG F1FhdzFxn7yo3uKZKUBOw4vgYg== X-Google-Smtp-Source: ABdhPJx0C4tIVn/hfIjxZ5wNuIjfUUrnAcrjq0nD/REk4Z4lhVGVQF0SHx8yweOLPBONMShvr56Kig== X-Received: by 2002:a17:90b:4f41:b0:1de:bd14:7721 with SMTP id pj1-20020a17090b4f4100b001debd147721mr21000140pjb.9.1652726096358; Mon, 16 May 2022 11:34:56 -0700 (PDT) Received: from smtp.gmail.com ([2620:15c:202:201:7d0d:b8ac:a3e3:757a]) by smtp.gmail.com with ESMTPSA id w16-20020a1709026f1000b0015e8d4eb24fsm7331090plk.153.2022.05.16.11.34.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 May 2022 11:34:55 -0700 (PDT) From: Stephen Boyd To: Dmitry Torokhov Cc: linux-kernel@vger.kernel.org, patches@lists.linux.dev, chrome-platform@lists.linux.dev, Krzysztof Kozlowski , Rob Herring , devicetree@vger.kernel.org, Benson Leung , Guenter Roeck , Douglas Anderson , Hsin-Yi Wang , "Joseph S. Barrera III" Subject: [PATCH v5 2/2] Input: cros-ec-keyb - skip keyboard registration w/o cros-ec-keyb compatible Date: Mon, 16 May 2022 11:34:52 -0700 Message-Id: <20220516183452.942008-3-swboyd@chromium.org> X-Mailer: git-send-email 2.36.0.550.gb090851708-goog In-Reply-To: <20220516183452.942008-1-swboyd@chromium.org> References: <20220516183452.942008-1-swboyd@chromium.org> Precedence: bulk X-Mailing-List: chrome-platform@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 In commit 4352e23a7ff2 ("Input: cros-ec-keyb - only register keyboard if rows/columns exist") we skipped registration of the keyboard if the row/columns property didn't exist, but that has a slight problem for existing DTBs. The DTBs have the rows/columns properties, so removing the properties to indicate only switches exist makes this keyboard driver fail to probe, resulting in broken power and volume buttons. Ease the migration of existing DTBs by skipping keyboard registration if the google,cros-ec-keyb-switches compatible exists. The end result is that new DTBs can either choose to remove the matrix keymap properties or leave them in place and add this new compatible indicating the matrix keyboard properties should be ignored. Existing DTBs will continue to work, but they will keep registering the keyboard that does nothing. To fix that problem we can add this extra compatible to existing devicetrees and the keyboard will stop being registered. Finally, if google,cros-ec-keyb is missing then this driver won't even attempt to register the matrix keyboard. Of course, this driver won't probe until this patch is applied in that scenario, but that's OK. This last case is likely only going to be used by new devicetrees created after this commit. Cc: Krzysztof Kozlowski Cc: Rob Herring Cc: Cc: Benson Leung Cc: Guenter Roeck Reviewed-by: Douglas Anderson Cc: Hsin-Yi Wang Cc: "Joseph S. Barrera III" Fixes: 4352e23a7ff2 ("Input: cros-ec-keyb - only register keyboard if rows/columns exist") Signed-off-by: Stephen Boyd --- drivers/input/keyboard/cros_ec_keyb.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/drivers/input/keyboard/cros_ec_keyb.c b/drivers/input/keyboard/cros_ec_keyb.c index eef909e52e23..bdbb263e8586 100644 --- a/drivers/input/keyboard/cros_ec_keyb.c +++ b/drivers/input/keyboard/cros_ec_keyb.c @@ -464,8 +464,13 @@ static int cros_ec_keyb_register_bs(struct cros_ec_keyb *ckdev) return ret; switches = get_unaligned_le32(&event_data.switches); - if (!buttons && !switches) + if (!buttons && !switches) { + /* Fail probe if we expected buttons/switches */ + if (of_device_is_compatible(dev->of_node, "google,cros-ec-keyb-switches")) + return -ENODEV; + return 0; + } /* * We call the non-matrix buttons/switches 'input1', if present. @@ -536,14 +541,10 @@ static int cros_ec_keyb_register_matrix(struct cros_ec_keyb *ckdev) u32 *physmap; u32 key_pos; unsigned int row, col, scancode, n_physmap; + bool has_keyboard; - /* - * No rows and columns? There isn't a matrix but maybe there are - * switches to register in cros_ec_keyb_register_bs() because - * this is a detachable device. - */ - if (!device_property_present(dev, "keypad,num-rows") && - !device_property_present(dev, "keypad,num-cols")) + has_keyboard = device_get_match_data(dev); + if (!has_keyboard) return 0; err = matrix_keypad_parse_properties(dev, &ckdev->rows, &ckdev->cols); @@ -718,8 +719,13 @@ static int cros_ec_keyb_remove(struct platform_device *pdev) #ifdef CONFIG_OF static const struct of_device_id cros_ec_keyb_of_match[] = { - { .compatible = "google,cros-ec-keyb" }, - {}, + { + /* Must be first */ + .compatible = "google,cros-ec-keyb", + .data = (void *)true + }, + { .compatible = "google,cros-ec-keyb-switches" }, + {} }; MODULE_DEVICE_TABLE(of, cros_ec_keyb_of_match); #endif