All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
To: Nikita Travkin <nikita@trvn.ru>
Cc: Rob Herring <robh+dt@kernel.org>,
	Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
	Conor Dooley <conor+dt@kernel.org>,
	Michael Srba <Michael.Srba@seznam.cz>,
	Linus Walleij <linus.walleij@linaro.org>,
	linux-input@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org,
	~postmarketos/upstreaming@lists.sr.ht
Subject: Re: [PATCH RESEND v4 2/2] input: zinitix: Add touchkey support
Date: Mon, 15 Jul 2024 22:45:58 -0700	[thread overview]
Message-ID: <ZpYJFo7q-V2jWPpa@google.com> (raw)
In-Reply-To: <20240713-zinitix-tkey-v4-2-14b7e2d5ace3@trvn.ru>

Hi Nikita,

On Sat, Jul 13, 2024 at 08:28:09PM +0500, Nikita Travkin wrote:
> Zinitix touch controllers can use some of the sense lines for virtual
> keys (like those found on many phones). Add support for those keys.
> 
> Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
> Signed-off-by: Nikita Travkin <nikita@trvn.ru>

A few comments:

> ---
>  drivers/input/touchscreen/zinitix.c | 61 +++++++++++++++++++++++++++++++++++--
>  1 file changed, 58 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/input/touchscreen/zinitix.c b/drivers/input/touchscreen/zinitix.c
> index 1b4807ba4624..75390d67689e 100644
> --- a/drivers/input/touchscreen/zinitix.c
> +++ b/drivers/input/touchscreen/zinitix.c
> @@ -119,6 +119,7 @@
>  
>  #define DEFAULT_TOUCH_POINT_MODE		2
>  #define MAX_SUPPORTED_FINGER_NUM		5
> +#define MAX_SUPPORTED_BUTTON_NUM		8
>  
>  #define CHIP_ON_DELAY				15 // ms
>  #define FIRMWARE_ON_DELAY			40 // ms
> @@ -146,6 +147,8 @@ struct bt541_ts_data {
>  	struct touchscreen_properties prop;
>  	struct regulator_bulk_data supplies[2];
>  	u32 zinitix_mode;
> +	u32 keycodes[MAX_SUPPORTED_BUTTON_NUM];
> +	int num_keycodes;
>  };
>  
>  static int zinitix_read_data(struct i2c_client *client,
> @@ -195,6 +198,7 @@ static int zinitix_init_touch(struct bt541_ts_data *bt541)
>  	struct i2c_client *client = bt541->client;
>  	int i;
>  	int error;
> +	u16 int_flags = 0;

It is initialized unconditionally below, no need to initialize here.

>  
>  	error = zinitix_write_cmd(client, ZINITIX_SWRESET_CMD);
>  	if (error) {
> @@ -225,6 +229,11 @@ static int zinitix_init_touch(struct bt541_ts_data *bt541)
>  	if (error)
>  		return error;
>  
> +	error = zinitix_write_u16(client, ZINITIX_BUTTON_SUPPORTED_NUM,
> +				  bt541->num_keycodes);
> +	if (error)
> +		return error;
> +
>  	error = zinitix_write_u16(client, ZINITIX_INITIAL_TOUCH_MODE,
>  				  bt541->zinitix_mode);
>  	if (error)
> @@ -235,9 +244,12 @@ static int zinitix_init_touch(struct bt541_ts_data *bt541)
>  	if (error)
>  		return error;
>  
> -	error = zinitix_write_u16(client, ZINITIX_INT_ENABLE_FLAG,
> -				  BIT_PT_CNT_CHANGE | BIT_DOWN | BIT_MOVE |
> -					BIT_UP);
> +	int_flags = BIT_PT_CNT_CHANGE | BIT_DOWN | BIT_MOVE | BIT_UP;
> +

Drop empty line.

> +	if (bt541->num_keycodes)
> +		int_flags |= BIT_ICON_EVENT;
> +
> +	error = zinitix_write_u16(client, ZINITIX_INT_ENABLE_FLAG, int_flags);
>  	if (error)
>  		return error;
>  
> @@ -350,6 +362,15 @@ static void zinitix_report_finger(struct bt541_ts_data *bt541, int slot,
>  	}
>  }
>  
> +static void zinitix_report_keys(struct bt541_ts_data *bt541, u16 icon_events)
> +{
> +	int i;
> +
> +	for (i = 0; i < bt541->num_keycodes; i++)
> +		input_report_key(bt541->input_dev,
> +				 bt541->keycodes[i], !!(icon_events & BIT(i)));
> +}
> +
>  static irqreturn_t zinitix_ts_irq_handler(int irq, void *bt541_handler)
>  {
>  	struct bt541_ts_data *bt541 = bt541_handler;
> @@ -358,6 +379,7 @@ static irqreturn_t zinitix_ts_irq_handler(int irq, void *bt541_handler)
>  	unsigned long finger_mask;
>  	int error;
>  	int i;
> +	__le16 icon_events = 0;

I do not believe this needs to be initialized.

>  
>  	memset(&touch_event, 0, sizeof(struct touch_event));
>  
> @@ -368,6 +390,17 @@ static irqreturn_t zinitix_ts_irq_handler(int irq, void *bt541_handler)
>  		goto out;
>  	}
>  
> +	if (le16_to_cpu(touch_event.status) & BIT_ICON_EVENT) {
> +		error = zinitix_read_data(bt541->client, ZINITIX_ICON_STATUS_REG,
> +					  &icon_events, sizeof(icon_events));
> +		if (error) {
> +			dev_err(&client->dev, "Failed to read icon events\n");
> +			goto out;
> +		}
> +
> +		zinitix_report_keys(bt541, le16_to_cpu(icon_events));
> +	}
> +
>  	finger_mask = touch_event.finger_mask;
>  	for_each_set_bit(i, &finger_mask, MAX_SUPPORTED_FINGER_NUM) {
>  		const struct point_coord *p = &touch_event.point_coord[i];
> @@ -453,6 +486,7 @@ static int zinitix_init_input_dev(struct bt541_ts_data *bt541)
>  {
>  	struct input_dev *input_dev;
>  	int error;
> +	int i;
>  
>  	input_dev = devm_input_allocate_device(&bt541->client->dev);
>  	if (!input_dev) {
> @@ -470,6 +504,14 @@ static int zinitix_init_input_dev(struct bt541_ts_data *bt541)
>  	input_dev->open = zinitix_input_open;
>  	input_dev->close = zinitix_input_close;
>  
> +	if (bt541->num_keycodes) {
> +		input_dev->keycode = bt541->keycodes;
> +		input_dev->keycodemax = bt541->num_keycodes;
> +		input_dev->keycodesize = sizeof(bt541->keycodes[0]);
> +		for (i = 0; i < bt541->num_keycodes; i++)
> +			input_set_capability(input_dev, EV_KEY, bt541->keycodes[i]);
> +	}
> +
>  	input_set_capability(input_dev, EV_ABS, ABS_MT_POSITION_X);
>  	input_set_capability(input_dev, EV_ABS, ABS_MT_POSITION_Y);
>  	input_set_abs_params(input_dev, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0);
> @@ -534,6 +576,19 @@ static int zinitix_ts_probe(struct i2c_client *client)
>  		return error;
>  	}
>  
> +	bt541->num_keycodes = of_property_read_variable_u32_array(
> +					client->dev.of_node, "linux,keycodes",
> +					bt541->keycodes, 0,
> +					ARRAY_SIZE(bt541->keycodes));

Please use generic device properties (device_property_*). There is no
equivalent for "read variable" so you'll need 2 calls, one to figure out
the array size and another one to read it.

See drivers/input/keyboard/mpr121_touchkey.c for an example.

> +	if (bt541->num_keycodes == -EINVAL) {
> +		bt541->num_keycodes = 0;
> +	} else if (bt541->num_keycodes < 0) {
> +		dev_err(&client->dev,
> +			"Unable to parse \"linux,keycodes\" property: %d\n",
> +			bt541->num_keycodes);
> +		return bt541->num_keycodes;
> +	}
> +
>  	error = zinitix_init_input_dev(bt541);
>  	if (error) {
>  		dev_err(&client->dev,
> 
> -- 
> 2.45.2
> 

Thanks.

-- 
Dmitry

  reply	other threads:[~2024-07-16  5:46 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-07-13 15:28 [PATCH RESEND v4 0/2] Add touch-keys support to the Zinitix touch driver Nikita Travkin
2024-07-13 15:28 ` [PATCH RESEND v4 1/2] dt-bindings: input: zinitix: Document touch-keys support Nikita Travkin
2024-07-13 15:28 ` [PATCH RESEND v4 2/2] input: zinitix: Add touchkey support Nikita Travkin
2024-07-16  5:45   ` Dmitry Torokhov [this message]
2024-07-16  7:32     ` Nikita Travkin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ZpYJFo7q-V2jWPpa@google.com \
    --to=dmitry.torokhov@gmail.com \
    --cc=Michael.Srba@seznam.cz \
    --cc=conor+dt@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=krzysztof.kozlowski+dt@linaro.org \
    --cc=linus.walleij@linaro.org \
    --cc=linux-input@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=nikita@trvn.ru \
    --cc=robh+dt@kernel.org \
    --cc=~postmarketos/upstreaming@lists.sr.ht \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.