linux-input.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v7 1/2] dt-bindings: input: cros-ec-keyb: Add a new property
@ 2021-01-15 20:24 Philip Chen
  2021-01-15 20:24 ` [PATCH v7 2/2] Input: cros-ec-keyb - Expose function row physical map to userspace Philip Chen
                   ` (3 more replies)
  0 siblings, 4 replies; 8+ messages in thread
From: Philip Chen @ 2021-01-15 20:24 UTC (permalink / raw)
  To: LKML, dmitry.torokhov
  Cc: swboyd, dianders, Philip Chen, Benson Leung,
	Enric Balletbo i Serra, Guenter Roeck, Rob Herring, Simon Glass,
	devicetree, linux-input

Add 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 <philipchen@chromium.org>
---

Changes in v7:
- Use MATRIX_KEY macro to describe `function-row-physmap`

Changes in v6:
- remove $ref and add `function-row-physmap` to the example

Changes in v5:
- add minItems and maxItems for `function-row-physmap`

Changes in v2:
- add `function-row-physmap` instead of `google,custom-keyb-top-row`

 .../bindings/input/google,cros-ec-keyb.yaml   | 24 +++++++++++++++++++
 1 file changed, 24 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..5377b232fa10f 100644
--- a/Documentation/devicetree/bindings/input/google,cros-ec-keyb.yaml
+++ b/Documentation/devicetree/bindings/input/google,cros-ec-keyb.yaml
@@ -31,6 +31,17 @@ properties:
       if the EC does not have its own logic or hardware for this.
     type: boolean
 
+  function-row-physmap:
+    minItems: 1
+    maxItems: 15
+    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
 
@@ -38,11 +49,24 @@ unevaluatedProperties: false
 
 examples:
   - |
+    #include <dt-bindings/input/input.h>
     cros-ec-keyb {
         compatible = "google,cros-ec-keyb";
         keypad,num-rows = <8>;
         keypad,num-columns = <13>;
         google,needs-ghost-filter;
+        function-row-physmap = <
+            MATRIX_KEY(0x00, 0x02, 0)   /* T1 */
+            MATRIX_KEY(0x03, 0x02, 0)   /* T2 */
+            MATRIX_KEY(0x02, 0x02, 0)   /* T3 */
+            MATRIX_KEY(0x01, 0x02, 0)   /* T4 */
+            MATRIX_KEY(0x03, 0x04, 0)   /* T5 */
+            MATRIX_KEY(0x02, 0x04, 0)   /* T6 */
+            MATRIX_KEY(0x01, 0x04, 0)   /* T7 */
+            MATRIX_KEY(0x02, 0x09, 0)   /* T8 */
+            MATRIX_KEY(0x01, 0x09, 0)   /* T9 */
+            MATRIX_KEY(0x00, 0x04, 0)   /* T10 */
+        >;
         /*
          * Keymap entries take the form of 0xRRCCKKKK where
          * RR=Row CC=Column KKKK=Key Code
-- 
2.26.2


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v7 2/2] Input: cros-ec-keyb - Expose function row physical map to userspace
  2021-01-15 20:24 [PATCH v7 1/2] dt-bindings: input: cros-ec-keyb: Add a new property Philip Chen
@ 2021-01-15 20:24 ` Philip Chen
  2021-01-15 20:34   ` Stephen Boyd
  2021-02-23  5:07   ` Dmitry Torokhov
  2021-01-15 20:34 ` [PATCH v7 1/2] dt-bindings: input: cros-ec-keyb: Add a new property Stephen Boyd
                   ` (2 subsequent siblings)
  3 siblings, 2 replies; 8+ messages in thread
From: Philip Chen @ 2021-01-15 20:24 UTC (permalink / raw)
  To: LKML, dmitry.torokhov
  Cc: swboyd, dianders, Philip Chen, Benson Leung,
	Enric Balletbo i Serra, Guenter Roeck, Lee Jones, Rajat Jain,
	linux-input

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.

So, enhance 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 <philipchen@chromium.org>
---

(no changes since v6)

Changes in v6:
- add to Documentation/ABI
- update cros_ec_keyb_register_matrix() to improve readability

Changes in v5:
- change the data type for a few local variables
- update function_row_physmap_show() and cros_ec_keyb_register_matrix()
  to improve readability/efficiency

Changes in v4:
- replace sysfs_create_group() with devm_device_add_group()
- remove an unused member in struct cros_ec_keyb

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)

 .../testing/sysfs-driver-input-cros-ec-keyb   |  6 ++
 drivers/input/keyboard/cros_ec_keyb.c         | 79 +++++++++++++++++++
 2 files changed, 85 insertions(+)
 create mode 100644 Documentation/ABI/testing/sysfs-driver-input-cros-ec-keyb

diff --git a/Documentation/ABI/testing/sysfs-driver-input-cros-ec-keyb b/Documentation/ABI/testing/sysfs-driver-input-cros-ec-keyb
new file mode 100644
index 0000000000000..c7afc2328045c
--- /dev/null
+++ b/Documentation/ABI/testing/sysfs-driver-input-cros-ec-keyb
@@ -0,0 +1,6 @@
+What:		/sys/class/input/input(x)/device/function_row_physmap
+Date:		January 2021
+Contact:	Philip Chen <philipchen@chromium.org>
+Description:	A space separated list of scancodes for the top row keys,
+		ordered by the physical positions of the keys, from left
+		to right.
diff --git a/drivers/input/keyboard/cros_ec_keyb.c b/drivers/input/keyboard/cros_ec_keyb.c
index b379ed7628781..38457d9641bdf 100644
--- a/drivers/input/keyboard/cros_ec_keyb.c
+++ b/drivers/input/keyboard/cros_ec_keyb.c
@@ -27,6 +27,8 @@
 
 #include <asm/unaligned.h>
 
+#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;
@@ -58,6 +63,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];
+	size_t num_function_row_keys;
 };
 
 /**
@@ -527,6 +535,11 @@ static int cros_ec_keyb_register_matrix(struct cros_ec_keyb *ckdev)
 	struct input_dev *idev;
 	const char *phys;
 	int err;
+	struct property *prop;
+	const __be32 *p;
+	u16 *physmap;
+	u32 key_pos;
+	int row, col;
 
 	err = matrix_keypad_parse_properties(dev, &ckdev->rows, &ckdev->cols);
 	if (err)
@@ -578,6 +591,21 @@ static int cros_ec_keyb_register_matrix(struct cros_ec_keyb *ckdev)
 	ckdev->idev = idev;
 	cros_ec_keyb_compute_valid_keys(ckdev);
 
+	physmap = ckdev->function_row_physmap;
+	of_property_for_each_u32(dev->of_node, "function-row-physmap",
+				 prop, p, key_pos) {
+		if (ckdev->num_function_row_keys == MAX_NUM_TOP_ROW_KEYS) {
+			dev_warn(dev, "Only support up to %d top row keys\n",
+				 MAX_NUM_TOP_ROW_KEYS);
+			break;
+		}
+		row = KEY_ROW(key_pos);
+		col = KEY_COL(key_pos);
+		*physmap = MATRIX_SCAN_CODE(row, col, ckdev->row_shift);
+		physmap++;
+		ckdev->num_function_row_keys++;
+	}
+
 	err = input_register_device(ckdev->idev);
 	if (err) {
 		dev_err(dev, "cannot register input device\n");
@@ -587,6 +615,51 @@ 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;
+	int i;
+	struct cros_ec_keyb *ckdev = dev_get_drvdata(dev);
+	u16 *physmap = ckdev->function_row_physmap;
+
+	for (i = 0; i < ckdev->num_function_row_keys; i++)
+		size += scnprintf(buf + size, PAGE_SIZE - size,
+				  "%s%02X", size ? " " : "", physmap[i]);
+	if (size)
+		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 = devm_device_add_group(dev, &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);
-- 
2.26.2


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH v7 1/2] dt-bindings: input: cros-ec-keyb: Add a new property
  2021-01-15 20:24 [PATCH v7 1/2] dt-bindings: input: cros-ec-keyb: Add a new property Philip Chen
  2021-01-15 20:24 ` [PATCH v7 2/2] Input: cros-ec-keyb - Expose function row physical map to userspace Philip Chen
@ 2021-01-15 20:34 ` Stephen Boyd
  2021-01-25 23:15 ` Rob Herring
  2021-02-23  5:07 ` Dmitry Torokhov
  3 siblings, 0 replies; 8+ messages in thread
From: Stephen Boyd @ 2021-01-15 20:34 UTC (permalink / raw)
  To: LKML, Philip Chen, dmitry.torokhov
  Cc: dianders, Philip Chen, Benson Leung, Enric Balletbo i Serra,
	Guenter Roeck, Rob Herring, Simon Glass, devicetree, linux-input

Quoting Philip Chen (2021-01-15 12:24:29)
> Add 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 <philipchen@chromium.org>
> ---

Reviewed-by: Stephen Boyd <swboyd@chromium.org>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v7 2/2] Input: cros-ec-keyb - Expose function row physical map to userspace
  2021-01-15 20:24 ` [PATCH v7 2/2] Input: cros-ec-keyb - Expose function row physical map to userspace Philip Chen
@ 2021-01-15 20:34   ` Stephen Boyd
  2021-02-04 23:58     ` Philip Chen
  2021-02-23  5:07   ` Dmitry Torokhov
  1 sibling, 1 reply; 8+ messages in thread
From: Stephen Boyd @ 2021-01-15 20:34 UTC (permalink / raw)
  To: LKML, Philip Chen, dmitry.torokhov
  Cc: dianders, Philip Chen, Benson Leung, Enric Balletbo i Serra,
	Guenter Roeck, Lee Jones, Rajat Jain, linux-input

Quoting Philip Chen (2021-01-15 12:24:30)
> 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.
> 
> So, enhance 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 <philipchen@chromium.org>
> ---

Reviewed-by: Stephen Boyd <swboyd@chromium.org>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v7 1/2] dt-bindings: input: cros-ec-keyb: Add a new property
  2021-01-15 20:24 [PATCH v7 1/2] dt-bindings: input: cros-ec-keyb: Add a new property Philip Chen
  2021-01-15 20:24 ` [PATCH v7 2/2] Input: cros-ec-keyb - Expose function row physical map to userspace Philip Chen
  2021-01-15 20:34 ` [PATCH v7 1/2] dt-bindings: input: cros-ec-keyb: Add a new property Stephen Boyd
@ 2021-01-25 23:15 ` Rob Herring
  2021-02-23  5:07 ` Dmitry Torokhov
  3 siblings, 0 replies; 8+ messages in thread
From: Rob Herring @ 2021-01-25 23:15 UTC (permalink / raw)
  To: Philip Chen
  Cc: devicetree, Guenter Roeck, swboyd, linux-input, dianders,
	Simon Glass, Rob Herring, Benson Leung, dmitry.torokhov, LKML,
	Enric Balletbo i Serra

On Fri, 15 Jan 2021 12:24:29 -0800, Philip Chen wrote:
> Add 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 <philipchen@chromium.org>
> ---
> 
> Changes in v7:
> - Use MATRIX_KEY macro to describe `function-row-physmap`
> 
> Changes in v6:
> - remove $ref and add `function-row-physmap` to the example
> 
> Changes in v5:
> - add minItems and maxItems for `function-row-physmap`
> 
> Changes in v2:
> - add `function-row-physmap` instead of `google,custom-keyb-top-row`
> 
>  .../bindings/input/google,cros-ec-keyb.yaml   | 24 +++++++++++++++++++
>  1 file changed, 24 insertions(+)
> 

Reviewed-by: Rob Herring <robh@kernel.org>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v7 2/2] Input: cros-ec-keyb - Expose function row physical map to userspace
  2021-01-15 20:34   ` Stephen Boyd
@ 2021-02-04 23:58     ` Philip Chen
  0 siblings, 0 replies; 8+ messages in thread
From: Philip Chen @ 2021-02-04 23:58 UTC (permalink / raw)
  To: Stephen Boyd
  Cc: LKML, Dmitry Torokhov, Douglas Anderson, Benson Leung,
	Enric Balletbo i Serra, Guenter Roeck, Lee Jones, Rajat Jain,
	linux-input

Hi maintainers,

Friendly ping - can we actually land patch series v7?
Or do you expect any update from me?

On Fri, Jan 15, 2021 at 12:34 PM Stephen Boyd <swboyd@chromium.org> wrote:
>
> Quoting Philip Chen (2021-01-15 12:24:30)
> > 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.
> >
> > So, enhance 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 <philipchen@chromium.org>
> > ---
>
> Reviewed-by: Stephen Boyd <swboyd@chromium.org>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v7 1/2] dt-bindings: input: cros-ec-keyb: Add a new property
  2021-01-15 20:24 [PATCH v7 1/2] dt-bindings: input: cros-ec-keyb: Add a new property Philip Chen
                   ` (2 preceding siblings ...)
  2021-01-25 23:15 ` Rob Herring
@ 2021-02-23  5:07 ` Dmitry Torokhov
  3 siblings, 0 replies; 8+ messages in thread
From: Dmitry Torokhov @ 2021-02-23  5:07 UTC (permalink / raw)
  To: Philip Chen
  Cc: LKML, swboyd, dianders, Benson Leung, Enric Balletbo i Serra,
	Guenter Roeck, Rob Herring, Simon Glass, devicetree, linux-input

On Fri, Jan 15, 2021 at 12:24:29PM -0800, Philip Chen wrote:
> Add 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 <philipchen@chromium.org>

Applied, thank you.

-- 
Dmitry

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v7 2/2] Input: cros-ec-keyb - Expose function row physical map to userspace
  2021-01-15 20:24 ` [PATCH v7 2/2] Input: cros-ec-keyb - Expose function row physical map to userspace Philip Chen
  2021-01-15 20:34   ` Stephen Boyd
@ 2021-02-23  5:07   ` Dmitry Torokhov
  1 sibling, 0 replies; 8+ messages in thread
From: Dmitry Torokhov @ 2021-02-23  5:07 UTC (permalink / raw)
  To: Philip Chen
  Cc: LKML, swboyd, dianders, Benson Leung, Enric Balletbo i Serra,
	Guenter Roeck, Lee Jones, Rajat Jain, linux-input

On Fri, Jan 15, 2021 at 12:24:30PM -0800, Philip Chen wrote:
> 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.
> 
> So, enhance 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 <philipchen@chromium.org>

Applied, thank you.

-- 
Dmitry

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2021-02-23  5:08 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-01-15 20:24 [PATCH v7 1/2] dt-bindings: input: cros-ec-keyb: Add a new property Philip Chen
2021-01-15 20:24 ` [PATCH v7 2/2] Input: cros-ec-keyb - Expose function row physical map to userspace Philip Chen
2021-01-15 20:34   ` Stephen Boyd
2021-02-04 23:58     ` Philip Chen
2021-02-23  5:07   ` Dmitry Torokhov
2021-01-15 20:34 ` [PATCH v7 1/2] dt-bindings: input: cros-ec-keyb: Add a new property Stephen Boyd
2021-01-25 23:15 ` Rob Herring
2021-02-23  5:07 ` Dmitry Torokhov

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).