* [PATCH 2/2] Input: atmel_mxt_ts - support capacitive keys
2023-02-27 20:50 [PATCH 1/2] dt-bindings: input: atmel,maxtouch: add linux,keycodes André Apitzsch
@ 2023-02-27 20:50 ` André Apitzsch
2023-03-06 22:54 ` Linus Walleij
2023-03-07 8:57 ` Claudiu.Beznea
2023-02-28 8:18 ` [PATCH 1/2] dt-bindings: input: atmel,maxtouch: add linux,keycodes Krzysztof Kozlowski
` (2 subsequent siblings)
3 siblings, 2 replies; 7+ messages in thread
From: André Apitzsch @ 2023-02-27 20:50 UTC (permalink / raw)
To: Nick Dyer, Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski,
Nicolas Ferre, Alexandre Belloni, Claudiu Beznea, Linus Walleij,
linux-input, devicetree, linux-arm-kernel, linux-kernel
Cc: ~postmarketos/upstreaming, André Apitzsch
Add support for touch keys found in some Atmel touch controller
configurations.
Signed-off-by: André Apitzsch <git@apitzsch.eu>
---
drivers/input/touchscreen/atmel_mxt_ts.c | 85 ++++++++++++++++++++++++
1 file changed, 85 insertions(+)
diff --git a/drivers/input/touchscreen/atmel_mxt_ts.c b/drivers/input/touchscreen/atmel_mxt_ts.c
index 996bf434e1cb..eb368dd1abf0 100644
--- a/drivers/input/touchscreen/atmel_mxt_ts.c
+++ b/drivers/input/touchscreen/atmel_mxt_ts.c
@@ -55,6 +55,7 @@
#define MXT_TOUCH_KEYARRAY_T15 15
#define MXT_TOUCH_PROXIMITY_T23 23
#define MXT_TOUCH_PROXKEY_T52 52
+#define MXT_TOUCH_PTC_KEYS_T97 97
#define MXT_PROCI_GRIPFACE_T20 20
#define MXT_PROCG_NOISE_T22 22
#define MXT_PROCI_ONETOUCH_T24 24
@@ -326,9 +327,13 @@ struct mxt_data {
u16 T71_address;
u8 T9_reportid_min;
u8 T9_reportid_max;
+ u8 T15_reportid_min;
+ u8 T15_reportid_max;
u16 T18_address;
u8 T19_reportid;
u16 T44_address;
+ u8 T97_reportid_min;
+ u8 T97_reportid_max;
u8 T100_reportid_min;
u8 T100_reportid_max;
@@ -344,6 +349,9 @@ struct mxt_data {
u32 *t19_keymap;
unsigned int t19_num_keys;
+ u32 *t15_keymap;
+ unsigned int t15_num_keys;
+
enum mxt_suspend_mode suspend_mode;
u32 wakeup_method;
@@ -375,6 +383,7 @@ static bool mxt_object_readable(unsigned int type)
case MXT_TOUCH_KEYARRAY_T15:
case MXT_TOUCH_PROXIMITY_T23:
case MXT_TOUCH_PROXKEY_T52:
+ case MXT_TOUCH_PTC_KEYS_T97:
case MXT_TOUCH_MULTITOUCHSCREEN_T100:
case MXT_PROCI_GRIPFACE_T20:
case MXT_PROCG_NOISE_T22:
@@ -891,6 +900,25 @@ static void mxt_proc_t9_message(struct mxt_data *data, u8 *message)
data->update_input = true;
}
+static void mxt_proc_t15_messages(struct mxt_data *data, u8 *message)
+{
+ struct input_dev *input_dev = data->input_dev;
+ unsigned long keystates = get_unaligned_le32(&message[2]);
+ int key;
+
+ for (key = 0; key < data->t15_num_keys; key++) {
+ input_report_key(input_dev, data->t15_keymap[key],
+ !!(keystates & BIT(key)));
+ }
+
+ data->update_input = true;
+}
+
+static void mxt_proc_t97_messages(struct mxt_data *data, u8 *message)
+{
+ mxt_proc_t15_messages(data, message);
+}
+
static void mxt_proc_t100_message(struct mxt_data *data, u8 *message)
{
struct device *dev = &data->client->dev;
@@ -1017,6 +1045,12 @@ static int mxt_proc_message(struct mxt_data *data, u8 *message)
} else if (report_id >= data->T9_reportid_min &&
report_id <= data->T9_reportid_max) {
mxt_proc_t9_message(data, message);
+ } else if (report_id >= data->T15_reportid_min &&
+ report_id <= data->T15_reportid_max) {
+ mxt_proc_t15_messages(data, message);
+ } else if (report_id >= data->T97_reportid_min &&
+ report_id <= data->T97_reportid_max) {
+ mxt_proc_t97_messages(data, message);
} else if (report_id >= data->T100_reportid_min &&
report_id <= data->T100_reportid_max) {
mxt_proc_t100_message(data, message);
@@ -1689,9 +1723,13 @@ static void mxt_free_object_table(struct mxt_data *data)
data->T71_address = 0;
data->T9_reportid_min = 0;
data->T9_reportid_max = 0;
+ data->T15_reportid_min = 0;
+ data->T15_reportid_max = 0;
data->T18_address = 0;
data->T19_reportid = 0;
data->T44_address = 0;
+ data->T97_reportid_min = 0;
+ data->T97_reportid_max = 0;
data->T100_reportid_min = 0;
data->T100_reportid_max = 0;
data->max_reportid = 0;
@@ -1764,6 +1802,10 @@ static int mxt_parse_object_table(struct mxt_data *data,
object->num_report_ids - 1;
data->num_touchids = object->num_report_ids;
break;
+ case MXT_TOUCH_KEYARRAY_T15:
+ data->T15_reportid_min = min_id;
+ data->T15_reportid_max = max_id;
+ break;
case MXT_SPT_COMMSCONFIG_T18:
data->T18_address = object->start_address;
break;
@@ -1773,6 +1815,10 @@ static int mxt_parse_object_table(struct mxt_data *data,
case MXT_SPT_GPIOPWM_T19:
data->T19_reportid = min_id;
break;
+ case MXT_TOUCH_PTC_KEYS_T97:
+ data->T97_reportid_min = min_id;
+ data->T97_reportid_max = max_id;
+ break;
case MXT_TOUCH_MULTITOUCHSCREEN_T100:
data->multitouch = MXT_TOUCH_MULTITOUCHSCREEN_T100;
data->T100_reportid_min = min_id;
@@ -2050,6 +2096,7 @@ static int mxt_initialize_input_device(struct mxt_data *data)
int error;
unsigned int num_mt_slots;
unsigned int mt_flags = 0;
+ int i;
switch (data->multitouch) {
case MXT_TOUCH_MULTI_T9:
@@ -2095,6 +2142,10 @@ static int mxt_initialize_input_device(struct mxt_data *data)
input_dev->open = mxt_input_open;
input_dev->close = mxt_input_close;
+ input_dev->keycode = data->t15_keymap;
+ input_dev->keycodemax = data->t15_num_keys;
+ input_dev->keycodesize = sizeof(data->t15_keymap[0]);
+
input_set_capability(input_dev, EV_KEY, BTN_TOUCH);
/* For single touch */
@@ -2162,6 +2213,12 @@ static int mxt_initialize_input_device(struct mxt_data *data)
0, 255, 0, 0);
}
+ /* For T15 and T97 Key Array */
+ if (data->T15_reportid_min || data->T97_reportid_min) {
+ for (i = 0; i < data->t15_num_keys; i++)
+ input_set_capability(input_dev, EV_KEY, data->t15_keymap[i]);
+ }
+
input_set_drvdata(input_dev, data);
error = input_register_device(input_dev);
@@ -3080,8 +3137,10 @@ static void mxt_input_close(struct input_dev *dev)
static int mxt_parse_device_properties(struct mxt_data *data)
{
static const char keymap_property[] = "linux,gpio-keymap";
+ static const char buttons_property[] = "linux,keycodes";
struct device *dev = &data->client->dev;
u32 *keymap;
+ u32 *buttonmap;
int n_keys;
int error;
@@ -3111,6 +3170,32 @@ static int mxt_parse_device_properties(struct mxt_data *data)
data->t19_num_keys = n_keys;
}
+ if (device_property_present(dev, buttons_property)) {
+ n_keys = device_property_count_u32(dev, buttons_property);
+ if (n_keys <= 0) {
+ error = n_keys < 0 ? n_keys : -EINVAL;
+ dev_err(dev, "invalid/malformed '%s' property: %d\n",
+ buttons_property, error);
+ return error;
+ }
+
+ buttonmap = devm_kmalloc_array(dev, n_keys, sizeof(*buttonmap),
+ GFP_KERNEL);
+ if (!buttonmap)
+ return -ENOMEM;
+
+ error = device_property_read_u32_array(dev, buttons_property,
+ buttonmap, n_keys);
+ if (error) {
+ dev_err(dev, "failed to parse '%s' property: %d\n",
+ buttons_property, error);
+ return error;
+ }
+
+ data->t15_keymap = buttonmap;
+ data->t15_num_keys = n_keys;
+ }
+
return 0;
}
--
2.39.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 1/2] dt-bindings: input: atmel,maxtouch: add linux,keycodes
2023-02-27 20:50 [PATCH 1/2] dt-bindings: input: atmel,maxtouch: add linux,keycodes André Apitzsch
2023-02-27 20:50 ` [PATCH 2/2] Input: atmel_mxt_ts - support capacitive keys André Apitzsch
@ 2023-02-28 8:18 ` Krzysztof Kozlowski
2023-03-06 14:19 ` Linus Walleij
2023-03-25 10:37 ` André Apitzsch
3 siblings, 0 replies; 7+ messages in thread
From: Krzysztof Kozlowski @ 2023-02-28 8:18 UTC (permalink / raw)
To: André Apitzsch, Nick Dyer, Dmitry Torokhov, Rob Herring,
Krzysztof Kozlowski, Nicolas Ferre, Alexandre Belloni,
Claudiu Beznea, Linus Walleij, linux-input, devicetree,
linux-arm-kernel, linux-kernel
Cc: ~postmarketos/upstreaming
On 27/02/2023 21:50, André Apitzsch wrote:
> In some configurations the touch controller can support the touch keys.
> Document the linux,keycodes property that enables those keys and
> specifies the keycodes that should be used to report the key events.
>
> Signed-off-by: André Apitzsch <git@apitzsch.eu>
> ---
Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/2] dt-bindings: input: atmel,maxtouch: add linux,keycodes
2023-02-27 20:50 [PATCH 1/2] dt-bindings: input: atmel,maxtouch: add linux,keycodes André Apitzsch
2023-02-27 20:50 ` [PATCH 2/2] Input: atmel_mxt_ts - support capacitive keys André Apitzsch
2023-02-28 8:18 ` [PATCH 1/2] dt-bindings: input: atmel,maxtouch: add linux,keycodes Krzysztof Kozlowski
@ 2023-03-06 14:19 ` Linus Walleij
2023-03-25 10:37 ` André Apitzsch
3 siblings, 0 replies; 7+ messages in thread
From: Linus Walleij @ 2023-03-06 14:19 UTC (permalink / raw)
To: André Apitzsch
Cc: Nick Dyer, Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski,
Nicolas Ferre, Alexandre Belloni, Claudiu Beznea, linux-input,
devicetree, linux-arm-kernel, linux-kernel,
~postmarketos/upstreaming
On Mon, Feb 27, 2023 at 9:50 PM André Apitzsch <git@apitzsch.eu> wrote:
> In some configurations the touch controller can support the touch keys.
> Document the linux,keycodes property that enables those keys and
> specifies the keycodes that should be used to report the key events.
>
> Signed-off-by: André Apitzsch <git@apitzsch.eu>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Yours,
Linus Walleij
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/2] dt-bindings: input: atmel,maxtouch: add linux,keycodes
2023-02-27 20:50 [PATCH 1/2] dt-bindings: input: atmel,maxtouch: add linux,keycodes André Apitzsch
` (2 preceding siblings ...)
2023-03-06 14:19 ` Linus Walleij
@ 2023-03-25 10:37 ` André Apitzsch
3 siblings, 0 replies; 7+ messages in thread
From: André Apitzsch @ 2023-03-25 10:37 UTC (permalink / raw)
To: Nick Dyer, Dmitry Torokhov
Cc: Rob Herring, Krzysztof Kozlowski, Nicolas Ferre,
Alexandre Belloni, Claudiu Beznea, Linus Walleij, linux-input,
devicetree, linux-arm-kernel, linux-kernel,
~postmarketos/upstreaming
Am Montag, dem 27.02.2023 um 21:50 +0100 schrieb André Apitzsch:
> In some configurations the touch controller can support the touch keys.
> Document the linux,keycodes property that enables those keys and
> specifies the keycodes that should be used to report the key events.
>
> Signed-off-by: André Apitzsch <git@apitzsch.eu>
> ---
> .../devicetree/bindings/input/atmel,maxtouch.yaml | 7 +++++++
> 1 file changed, 7 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/input/atmel,maxtouch.yaml b/Documentation/devicetree/bindings/input/atmel,maxtouch.yaml
> index 3ec579d63570..c40799355ed7 100644
> --- a/Documentation/devicetree/bindings/input/atmel,maxtouch.yaml
> +++ b/Documentation/devicetree/bindings/input/atmel,maxtouch.yaml
> @@ -14,6 +14,9 @@ description: |
> Atmel maXTouch touchscreen or touchpads such as the mXT244
> and similar devices.
>
> +allOf:
> + - $ref: input.yaml#
> +
> properties:
> compatible:
> const: atmel,maxtouch
> @@ -60,6 +63,10 @@ properties:
> or experiment to determine which bit corresponds to which input. Use
> KEY_RESERVED for unused padding values.
>
> + linux,keycodes:
> + minItems: 1
> + maxItems: 8
> +
> atmel,wakeup-method:
> $ref: /schemas/types.yaml#/definitions/uint32
> description: |
>
> base-commit: 982818426a0ffaf93b0621826ed39a84be3d7d62
Hi Nick, hi Dmitry,
Friendly ping.
What is missing to get this up-streamed?
Best regards,
André
^ permalink raw reply [flat|nested] 7+ messages in thread