From patchwork Tue Jan 5 02:22:33 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Philip Chen X-Patchwork-Id: 11997987 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-19.0 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6E055C43381 for ; Tue, 5 Jan 2021 02:23:35 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 43AF9229C9 for ; Tue, 5 Jan 2021 02:23:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728054AbhAECXV (ORCPT ); Mon, 4 Jan 2021 21:23:21 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57172 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727822AbhAECXU (ORCPT ); Mon, 4 Jan 2021 21:23:20 -0500 Received: from mail-pj1-x1029.google.com (mail-pj1-x1029.google.com [IPv6:2607:f8b0:4864:20::1029]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 22EEFC061793 for ; Mon, 4 Jan 2021 18:22:40 -0800 (PST) Received: by mail-pj1-x1029.google.com with SMTP id w1so613317pjc.0 for ; Mon, 04 Jan 2021 18:22:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=F5v4P5OpFzV6txdYAKpaZWpOyrHHIe3zcVp3Rukxxyc=; b=Fd9C5eh1l5XGQUug3JLCx6bXUXKY2FUOKpd6xlqkQRS4CPI390Ko/dfC8c7+vc+ZCB 8LRQiiZclIEgvq2hT9O1puypOipuNsqJg3xHYYFMfBXXj6OYTmYqXk4UNMPP8vIfNzbd MvNlgkR593pRrJ5kR/GRGLiJPzW26BDErirJ8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=F5v4P5OpFzV6txdYAKpaZWpOyrHHIe3zcVp3Rukxxyc=; b=U9reaChMrtO1ZfoxTEpLeUEMVGJRrDgSGV2zpWxmMgwL1bqyI12YBoKcPbJbLzktwA t32tO6WXNZ5ElPftb8NiZfnnPonMtOX7RNFGqwWSaO30obL1M0hOPEANHr6usnHveKG2 eDA4Gtpvn+qluKGbF7y7N8uPtFg2hR2VaqIoPBPzvJefDnjwyEBltYhYwEgKLcCATSl3 ptGGUabr3wocLIz8Oquuu+b5uLoTzeLg+MeyuNZKzKSvw/sIf4XJeBuOcHaGRQLX0RuV MxCWL3s88VmvUpEFkjNFp2DodD2/eEGf37ZZRdidE8dj8OYdtGQ2Gs7H7+fVqVU94BjE qelg== X-Gm-Message-State: AOAM531OX+FbIWyceulqWRns9DcnWBPpDH6ZuNT1Q7aSTllDXM5/4jAX CX7wF4TnUEZdVq8qM+BRIqwUuA== X-Google-Smtp-Source: ABdhPJwgn2j95/Q5PEpRXUFGNFU6+5GQKsifIo8y/OfwXh0gOAuL2TXdXcMbclnQUpdHu4w07X64NQ== X-Received: by 2002:a17:902:778e:b029:da:feef:8f2d with SMTP id o14-20020a170902778eb02900dafeef8f2dmr74759358pll.25.1609813359737; Mon, 04 Jan 2021 18:22:39 -0800 (PST) Received: from philipchen.mtv.corp.google.com ([2620:15c:202:201:a6ae:11ff:fe11:fd59]) by smtp.gmail.com with ESMTPSA id t23sm56732903pfc.0.2021.01.04.18.22.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 04 Jan 2021 18:22:39 -0800 (PST) From: Philip Chen To: LKML , dmitry.torokhov@gmail.com Cc: dianders@chromium.org, swboyd@chromium.org, Philip Chen , Benson Leung , Enric Balletbo i Serra , Guenter Roeck , Rob Herring , Simon Glass , devicetree@vger.kernel.org, linux-input@vger.kernel.org Subject: [PATCH v3 1/2] dt-bindings: input: cros-ec-keyb: Add a new property Date: Mon, 4 Jan 2021 18:22:33 -0800 Message-Id: <20210104182154.v3.1.I025fb861cd5fa0ef5286b7dce514728e9df7ae74@changeid> X-Mailer: git-send-email 2.26.2 MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org This patch adds a new property `function-row-physmap` to the device tree for the custom keyboard top row design. The property describes the rows/columns of the top row keys from left to right. Signed-off-by: Philip Chen --- (no changes since v2) Changes in v2: - add `function-row-physmap` instead of `google,custom-keyb-top-row` .../devicetree/bindings/input/google,cros-ec-keyb.yaml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Documentation/devicetree/bindings/input/google,cros-ec-keyb.yaml b/Documentation/devicetree/bindings/input/google,cros-ec-keyb.yaml index 8e50c14a9d778..7acdb33781d30 100644 --- a/Documentation/devicetree/bindings/input/google,cros-ec-keyb.yaml +++ b/Documentation/devicetree/bindings/input/google,cros-ec-keyb.yaml @@ -31,6 +31,16 @@ properties: if the EC does not have its own logic or hardware for this. type: boolean + function-row-physmap: + $ref: '/schemas/types.yaml#/definitions/uint32-array' + description: | + An ordered u32 array describing the rows/columns (in the scan matrix) + of top row keys from physical left (KEY_F1) to right. Each entry + encodes the row/column as: + (((row) & 0xFF) << 24) | (((column) & 0xFF) << 16) + where the lower 16 bits are reserved. This property is specified only + when the keyboard has a custom design for the top row keys. + required: - compatible From patchwork Tue Jan 5 02:22:34 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Philip Chen X-Patchwork-Id: 11997989 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-19.0 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 53C4AC433E6 for ; Tue, 5 Jan 2021 02:23:35 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 22287225AB for ; Tue, 5 Jan 2021 02:23:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728073AbhAECXZ (ORCPT ); Mon, 4 Jan 2021 21:23:25 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:57184 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728047AbhAECXX (ORCPT ); Mon, 4 Jan 2021 21:23:23 -0500 Received: from mail-pj1-x1033.google.com (mail-pj1-x1033.google.com [IPv6:2607:f8b0:4864:20::1033]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C2340C061796 for ; Mon, 4 Jan 2021 18:22:42 -0800 (PST) Received: by mail-pj1-x1033.google.com with SMTP id lj6so800883pjb.0 for ; Mon, 04 Jan 2021 18:22:42 -0800 (PST) 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=Hn4C3X73ZRbSUEbsAMTPQXDD220zuLG8ISgW8JZ0kw8=; b=ZVs0uBSCYstjUZV8aa/ghv2YMc+dygqubFe481E2kUOyqSeGsbK/5Qc0WkR5rdO/g3 iI0z/umCQgz+slespf0fQctD0eRL5U9sy135yBKjJiNKelx/Yu1HNuG6vASFloLKhWPc aDW1tv05eLZ+ME0MfpTLFOvciysF5w/x46iaI= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Hn4C3X73ZRbSUEbsAMTPQXDD220zuLG8ISgW8JZ0kw8=; b=WJyomeMe6oLL13maIsK7+1V4kogilHERJqaH54azkVSy9rtKfuz/VQvYJsN4sDbQ9v b19QYCD9en9UmstkLnxPMsal1ir0CNoj8+FhXlRrVOWHTVrAXdA0AQmxvjLGDqYhUEov BfJznNQnNXKIH6en0Eop9ryPGtwCUaIavlnYAbu9yGnxAMShd0YRxq+Qw+fuZCqjy9Nv ANrNsp6WjfT92pPSO9BqZFwdbI1LNnSDwd6M7XXEWY9xGV0ZdNjMtkGDWU7FPhMNWVFz K2W0mcbvH3534nl7C6Lv1T3/AbJOB0RV3fnQDyzfmY94geeNq8ydlo+F89Ie5MfOPxYd 8ZKg== X-Gm-Message-State: AOAM532UUsUnVfT8EzncUjAQ/xFu1o4fP4ouFY9M3nhxtayBALHlBjYC 7quroglUIzeNjjdmO+c8FticzonSOI4g+Q== X-Google-Smtp-Source: ABdhPJyWMHymXF4igTbKBfJVsA5Rb/egHmTti4iuRwMLoUXkwpt+7OHa4u095QBqwTrfCfVlMDhAHA== X-Received: by 2002:a17:90b:1b49:: with SMTP id nv9mr1740967pjb.112.1609813362409; Mon, 04 Jan 2021 18:22:42 -0800 (PST) Received: from philipchen.mtv.corp.google.com ([2620:15c:202:201:a6ae:11ff:fe11:fd59]) by smtp.gmail.com with ESMTPSA id t23sm56732903pfc.0.2021.01.04.18.22.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 04 Jan 2021 18:22:41 -0800 (PST) From: Philip Chen To: LKML , dmitry.torokhov@gmail.com Cc: dianders@chromium.org, swboyd@chromium.org, Philip Chen , Benson Leung , Enric Balletbo i Serra , Guenter Roeck , Lee Jones , Rajat Jain , linux-input@vger.kernel.org Subject: [PATCH v3 2/2] Input: cros-ec-keyb - Expose function row physical map to userspace Date: Mon, 4 Jan 2021 18:22:34 -0800 Message-Id: <20210104182154.v3.2.Ibe7d7d53c5b4fe72c60de90111ff763b53f38dbb@changeid> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20210104182154.v3.1.I025fb861cd5fa0ef5286b7dce514728e9df7ae74@changeid> References: <20210104182154.v3.1.I025fb861cd5fa0ef5286b7dce514728e9df7ae74@changeid> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org The top-row keys in a keyboard usually have dual functionalities. E.g. A function key "F1" is also an action key "Browser back". Therefore, when an application receives an action key code from a top-row key press, the application needs to know how to correlate the action key code with the function key code and do the conversion whenever necessary. Since the userpace already knows the key scanlines (row/column) associated with a received key code. Essentially, the userspace only needs a mapping between the key row/column and the matching physical location in the top row. This patch enhances the cros-ec-keyb driver to create such a mapping and expose it to userspace in the form of a function-row-physmap attribute. The attribute would be a space separated ordered list of row/column codes, for the keys in the function row, in a left-to-right order. The attribute will only be present when the device has a custom design for the top-row keys. Signed-off-by: Philip Chen --- Changes in v3: - parse `function-row-physmap` from DT earlier, when we probe cros_ec_keyb, and then store the extracted info in struct cros_ec_keyb. Changes in v2: - create function-row-physmap file in sysfs by parsing `function-row-physmap` property from DT - assume the device already has a correct keymap to reflect the custom top-row keys (if they exist) drivers/input/keyboard/cros_ec_keyb.c | 82 +++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/drivers/input/keyboard/cros_ec_keyb.c b/drivers/input/keyboard/cros_ec_keyb.c index b379ed7628781..d804430d384d6 100644 --- a/drivers/input/keyboard/cros_ec_keyb.c +++ b/drivers/input/keyboard/cros_ec_keyb.c @@ -27,6 +27,8 @@ #include +#define MAX_NUM_TOP_ROW_KEYS 15 + /** * struct cros_ec_keyb - Structure representing EC keyboard device * @@ -42,6 +44,9 @@ * @idev: The input device for the matrix keys. * @bs_idev: The input device for non-matrix buttons and switches (or NULL). * @notifier: interrupt event notifier for transport devices + * @function_row_physmap: An array of the encoded rows/columns for the top + * row function keys, in an order from left to right + * @num_function_row_keys: The number of top row keys in a custom keyboard */ struct cros_ec_keyb { unsigned int rows; @@ -49,6 +54,7 @@ struct cros_ec_keyb { int row_shift; const struct matrix_keymap_data *keymap_data; bool ghost_filter; + bool has_custom_top_row_keys; uint8_t *valid_keys; uint8_t *old_kb_state; @@ -58,6 +64,9 @@ struct cros_ec_keyb { struct input_dev *idev; struct input_dev *bs_idev; struct notifier_block notifier; + + u16 function_row_physmap[MAX_NUM_TOP_ROW_KEYS]; + u8 num_function_row_keys; }; /** @@ -527,6 +536,8 @@ static int cros_ec_keyb_register_matrix(struct cros_ec_keyb *ckdev) struct input_dev *idev; const char *phys; int err; + u32 top_row_key_pos[MAX_NUM_TOP_ROW_KEYS] = {0}; + u8 i; err = matrix_keypad_parse_properties(dev, &ckdev->rows, &ckdev->cols); if (err) @@ -578,6 +589,22 @@ static int cros_ec_keyb_register_matrix(struct cros_ec_keyb *ckdev) ckdev->idev = idev; cros_ec_keyb_compute_valid_keys(ckdev); + if (of_property_read_variable_u32_array(dev->of_node, + "function-row-physmap", + top_row_key_pos, + 0, + MAX_NUM_TOP_ROW_KEYS) > 0) { + for (i = 0; i < MAX_NUM_TOP_ROW_KEYS; i++) { + if (!top_row_key_pos[i]) + break; + ckdev->function_row_physmap[i] = MATRIX_SCAN_CODE( + KEY_ROW(top_row_key_pos[i]), + KEY_COL(top_row_key_pos[i]), + ckdev->row_shift); + } + ckdev->num_function_row_keys = i; + } + err = input_register_device(ckdev->idev); if (err) { dev_err(dev, "cannot register input device\n"); @@ -587,6 +614,52 @@ static int cros_ec_keyb_register_matrix(struct cros_ec_keyb *ckdev) return 0; } +static ssize_t function_row_physmap_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + ssize_t size = 0; + u8 i; + struct cros_ec_keyb *ckdev = dev_get_drvdata(dev); + + if (!ckdev->num_function_row_keys) + return 0; + + for (i = 0; i < ckdev->num_function_row_keys; i++) + size += scnprintf(buf + size, PAGE_SIZE - size, "%02X ", + ckdev->function_row_physmap[i]); + size += scnprintf(buf + size, PAGE_SIZE - size, "\n"); + + return size; +} + +static DEVICE_ATTR_RO(function_row_physmap); + +static struct attribute *cros_ec_keyb_attrs[] = { + &dev_attr_function_row_physmap.attr, + NULL, +}; + +static umode_t cros_ec_keyb_attr_is_visible(struct kobject *kobj, + struct attribute *attr, + int n) +{ + struct device *dev = container_of(kobj, struct device, kobj); + struct cros_ec_keyb *ckdev = dev_get_drvdata(dev); + + if (attr == &dev_attr_function_row_physmap.attr && + !ckdev->num_function_row_keys) + return 0; + + return attr->mode; +} + +static const struct attribute_group cros_ec_keyb_attr_group = { + .is_visible = cros_ec_keyb_attr_is_visible, + .attrs = cros_ec_keyb_attrs, +}; + + static int cros_ec_keyb_probe(struct platform_device *pdev) { struct cros_ec_device *ec = dev_get_drvdata(pdev->dev.parent); @@ -617,6 +690,12 @@ static int cros_ec_keyb_probe(struct platform_device *pdev) return err; } + err = sysfs_create_group(&dev->kobj, &cros_ec_keyb_attr_group); + if (err) { + dev_err(dev, "failed to create attributes. err=%d\n", err); + return err; + } + ckdev->notifier.notifier_call = cros_ec_keyb_work; err = blocking_notifier_chain_register(&ckdev->ec->event_notifier, &ckdev->notifier); @@ -632,6 +711,9 @@ static int cros_ec_keyb_probe(struct platform_device *pdev) static int cros_ec_keyb_remove(struct platform_device *pdev) { struct cros_ec_keyb *ckdev = dev_get_drvdata(&pdev->dev); + struct device *dev = &pdev->dev; + + sysfs_remove_group(&dev->kobj, &cros_ec_keyb_attr_group); blocking_notifier_chain_unregister(&ckdev->ec->event_notifier, &ckdev->notifier);