mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: "Uwe Kleine-König" <u.kleine-koenig@baylibre.com>
To: Lukas Timmermann <foss@timmermann.space>
Cc: "Dmitry Torokhov" <dmitry.torokhov@gmail.com>,
	"Rob Herring" <robh@kernel.org>,
	"Krzysztof Kozlowski" <krzk+dt@kernel.org>,
	"Conor Dooley" <conor+dt@kernel.org>,
	"Andi Shyti" <andi.shyti@kernel.org>,
	"Peter Griffin" <peter.griffin@linaro.org>,
	"André Draszik" <andre.draszik@linaro.org>,
	"Tudor Ambarus" <tudor.ambarus@linaro.org>,
	"Alim Akhtar" <alim.akhtar@samsung.com>,
	linux-input@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	linux-samsung-soc@vger.kernel.org
Subject: Re: [PATCH 2/7] Input: s6sy761 - split into core and I2C modules
Date: Mon, 12 Oct 2026 13:04:36 +0200	[thread overview]
Message-ID: <asy92cwqv8Xjc2PX@monoceros> (raw)
In-Reply-To: <20261011-lat3st-google-raven-touch-upstream-v1-2-2a9f55159b9e@timmermann.space>

[-- Attachment #1: Type: text/plain, Size: 19674 bytes --]

On Sun, Oct 11, 2026 at 02:44:57PM +0200, Lukas Timmermann wrote:
> Split this driver into a bus-agnostic core and I2C transport part in
> preparation for adding SPI support. Also add a mutex because the
> driver now has a transfer buffer shared between IRQ, sysfs
> and PM threads.
> 
> The Kconfig is backwards-compatible and should work on boards with an
> S6SY761 touchscreen as before. The I2C transfers of the driver should be
> byte by byte identical.
> 
> The modules are now called s6sy761_core and s6sy761_i2c.
> 
> Signed-off-by: Lukas Timmermann <foss@timmermann.space>
> ---
>  drivers/input/touchscreen/Kconfig                  |   8 +-
>  drivers/input/touchscreen/Makefile                 |   3 +-
>  .../touchscreen/{s6sy761.c => s6sy761_core.c}      | 214 +++++++++------------
>  drivers/input/touchscreen/s6sy761_core.h           |  34 ++++
>  drivers/input/touchscreen/s6sy761_i2c.c            | 112 +++++++++++
>  5 files changed, 245 insertions(+), 126 deletions(-)
> 
> diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig
> index 9b9ae8ac3f7f..76651a61324f 100644
> --- a/drivers/input/touchscreen/Kconfig
> +++ b/drivers/input/touchscreen/Kconfig
> @@ -535,8 +535,12 @@ config TOUCHSCREEN_S6SY761
>  
>  	  If unsure, say N
>  
> -	  To compile this driver as module, choose M here: the
> -	  module will be called s6sy761.
> +	  To compile this driver as a module, choose M here: the
> +	  modules will be called s6sy761_core and s6sy761_i2c.
> +	select TOUCHSCREEN_S6SY761_I2C if I2C
> +
> +config TOUCHSCREEN_S6SY761_I2C
> +	tristate
>  
>  config TOUCHSCREEN_GUNZE
>  	tristate "Gunze AHL-51S touchscreen"
> diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile
> index bfd9de83389d..24b8fb1e38d3 100644
> --- a/drivers/input/touchscreen/Makefile
> +++ b/drivers/input/touchscreen/Makefile
> @@ -77,7 +77,8 @@ obj-$(CONFIG_TOUCHSCREEN_USB_COMPOSITE)	+= usbtouchscreen.o
>  obj-$(CONFIG_TOUCHSCREEN_PENMOUNT)	+= penmount.o
>  obj-$(CONFIG_TOUCHSCREEN_PIXCIR)	+= pixcir_i2c_ts.o
>  obj-$(CONFIG_TOUCHSCREEN_RM_TS)		+= raydium_i2c_ts.o
> -obj-$(CONFIG_TOUCHSCREEN_S6SY761)	+= s6sy761.o
> +obj-$(CONFIG_TOUCHSCREEN_S6SY761)	+= s6sy761_core.o
> +obj-$(CONFIG_TOUCHSCREEN_S6SY761_I2C)	+= s6sy761_i2c.o
>  obj-$(CONFIG_TOUCHSCREEN_SILEAD)	+= silead.o
>  obj-$(CONFIG_TOUCHSCREEN_SIS_I2C)	+= sis_i2c.o
>  obj-$(CONFIG_TOUCHSCREEN_ST1232)	+= st1232.o
> diff --git a/drivers/input/touchscreen/s6sy761.c b/drivers/input/touchscreen/s6sy761_core.c
> similarity index 71%
> rename from drivers/input/touchscreen/s6sy761.c
> rename to drivers/input/touchscreen/s6sy761_core.c
> index 899c179fb2d3..0e455060dbc0 100644
> --- a/drivers/input/touchscreen/s6sy761.c
> +++ b/drivers/input/touchscreen/s6sy761_core.c
> @@ -3,18 +3,21 @@
>  //
>  // Copyright (c) 2017 Samsung Electronics Co., Ltd.
>  // Copyright (c) 2017 Andi Shyti <andi@etezian.org>
> +// Copyright (c) 2026 Lukas Timmermann <foss@timmermann.space>
>  
>  #include <linux/unaligned.h>
>  #include <linux/delay.h>
> -#include <linux/i2c.h>
>  #include <linux/input/mt.h>
>  #include <linux/input/touchscreen.h>
>  #include <linux/interrupt.h>
>  #include <linux/irq.h>
>  #include <linux/module.h>
> +#include <linux/mutex.h>
>  #include <linux/pm_runtime.h>
>  #include <linux/regulator/consumer.h>
>  
> +#include "s6sy761_core.h"
> +
>  /* commands */
>  #define S6SY761_SENSE_ON		0x10
>  #define S6SY761_SENSE_OFF		0x11
> @@ -84,22 +87,18 @@
>  #define S6SY761_APP_FLASH		0x3
>  #define S6SY761_APP_SLEEP		0x4
>  
> -#define S6SY761_EVENT_SIZE		8
> -#define S6SY761_EVENT_COUNT		32
>  #define S6SY761_DEVID_SIZE		3
>  #define S6SY761_PANEL_ID_SIZE		11
>  #define S6SY761_TS_STATUS_SIZE		5
>  #define S6SY761_MAX_FINGERS		10
>  
> -#define S6SY761_DEV_NAME	"s6sy761"
> -
> -enum s6sy761_regulators {
> -	S6SY761_REGULATOR_VDD,
> -	S6SY761_REGULATOR_AVDD,
> -};
> -
>  struct s6sy761_data {
> -	struct i2c_client *client;
> +	struct device *dev;
> +	const struct s6sy761_bus_ops *bus_ops;
> +	u8 *xfer_buf;
> +	/* serializes bus access and protects xfer_buf */
> +	struct mutex xfer_lock;
> +	int irq;
>  	struct regulator_bulk_data regulators[2];
>  	struct input_dev *input;
>  	struct touchscreen_properties prop;
> @@ -110,33 +109,21 @@ struct s6sy761_data {
>  	u8 tx_channel;
>  };
>  
> -/*
> - * We can't simply use i2c_smbus_read_i2c_block_data because we
> - * need to read more than 255 bytes
> - */
> -static int s6sy761_read_events(struct s6sy761_data *sdata, u16 n_events)
> -{
> -	u8 cmd = S6SY761_READ_ALL_EVENT;
> -	struct i2c_msg msgs[2] = {
> -		{
> -			.addr	= sdata->client->addr,
> -			.len	= 1,
> -			.buf	= &cmd,
> -		},
> -		{
> -			.addr	= sdata->client->addr,
> -			.flags	= I2C_M_RD,
> -			.len	= (n_events * S6SY761_EVENT_SIZE),
> -			.buf	= sdata->data + S6SY761_EVENT_SIZE,
> -		},
> -	};
> -	int ret;
> +enum s6sy761_regulators {
> +	S6SY761_REGULATOR_VDD,
> +	S6SY761_REGULATOR_AVDD,
> +};
>  
> -	ret = i2c_transfer(sdata->client->adapter, msgs, ARRAY_SIZE(msgs));
> -	if (ret < 0)
> -		return ret;
> +static int s6sy761_read(struct s6sy761_data *sdata, u8 cmd, size_t len, void *buf)
> +{
> +	guard(mutex)(&sdata->xfer_lock);
> +	return sdata->bus_ops->read(sdata->dev, sdata->xfer_buf, cmd, len, buf);
> +}
>  
> -	return ret == ARRAY_SIZE(msgs) ? 0 : -EIO;
> +static int s6sy761_write(struct s6sy761_data *sdata, u8 cmd, size_t len, const void *buf)
> +{
> +	guard(mutex)(&sdata->xfer_lock);
> +	return sdata->bus_ops->write(sdata->dev, sdata->xfer_buf, cmd, len, buf);
>  }
>  
>  static void s6sy761_report_coordinates(struct s6sy761_data *sdata,
> @@ -226,12 +213,10 @@ static irqreturn_t s6sy761_irq_handler(int irq, void *dev)
>  	int ret;
>  	u8 n_events;
>  
> -	ret = i2c_smbus_read_i2c_block_data(sdata->client,
> -					    S6SY761_READ_ONE_EVENT,
> -					    S6SY761_EVENT_SIZE,
> -					    sdata->data);
> +	ret = s6sy761_read(sdata, S6SY761_READ_ONE_EVENT,
> +			   S6SY761_EVENT_SIZE, sdata->data);
>  	if (ret < 0) {
> -		dev_err(&sdata->client->dev, "failed to read events\n");
> +		dev_err(sdata->dev, "failed to read events\n");
>  		return IRQ_HANDLED;
>  	}
>  
> @@ -243,9 +228,11 @@ static irqreturn_t s6sy761_irq_handler(int irq, void *dev)
>  		return IRQ_HANDLED;
>  
>  	if (n_events) {
> -		ret = s6sy761_read_events(sdata, n_events);
> +		ret = s6sy761_read(sdata, S6SY761_READ_ALL_EVENT,
> +				   n_events * S6SY761_EVENT_SIZE,
> +				   sdata->data + S6SY761_EVENT_SIZE);
>  		if (ret < 0) {
> -			dev_err(&sdata->client->dev, "failed to read events\n");
> +			dev_err(sdata->dev, "failed to read events\n");
>  			return IRQ_HANDLED;
>  		}
>  	}
> @@ -259,7 +246,7 @@ static int s6sy761_input_open(struct input_dev *dev)
>  {
>  	struct s6sy761_data *sdata = input_get_drvdata(dev);
>  
> -	return i2c_smbus_write_byte(sdata->client, S6SY761_SENSE_ON);
> +	return s6sy761_write(sdata, S6SY761_SENSE_ON, 0, NULL);
>  }
>  
>  static void s6sy761_input_close(struct input_dev *dev)
> @@ -267,9 +254,9 @@ static void s6sy761_input_close(struct input_dev *dev)
>  	struct s6sy761_data *sdata = input_get_drvdata(dev);
>  	int ret;
>  
> -	ret = i2c_smbus_write_byte(sdata->client, S6SY761_SENSE_OFF);
> +	ret = s6sy761_write(sdata, S6SY761_SENSE_OFF, 0, NULL);
>  	if (ret)
> -		dev_err(&sdata->client->dev, "failed to turn off sensing\n");
> +		dev_err(sdata->dev, "failed to turn off sensing\n");
>  }
>  
>  static ssize_t s6sy761_sysfs_devid(struct device *dev,
> @@ -286,12 +273,23 @@ static struct attribute *s6sy761_sysfs_attrs[] = {
>  	&dev_attr_devid.attr,
>  	NULL
>  };
> -ATTRIBUTE_GROUPS(s6sy761_sysfs);
> +
> +static const struct attribute_group s6sy761_sysfs_group = {
> +	.attrs = s6sy761_sysfs_attrs,
> +};
> +
> +const struct attribute_group *s6sy761_sysfs_groups[] = {
> +	&s6sy761_sysfs_group,
> +	NULL,
> +};
> +EXPORT_SYMBOL_NS_GPL(s6sy761_sysfs_groups, "S6SY761");
>  
>  static int s6sy761_power_on(struct s6sy761_data *sdata)
>  {
> +	__le16 touch_func;
>  	u8 buffer[S6SY761_EVENT_SIZE];
>  	u8 event;
> +	u8 status;
>  	int ret;
>  
>  	ret = regulator_bulk_enable(ARRAY_SIZE(sdata->regulators),
> @@ -302,10 +300,7 @@ static int s6sy761_power_on(struct s6sy761_data *sdata)
>  	msleep(140);
>  
>  	/* double check whether the touch is functional */
> -	ret = i2c_smbus_read_i2c_block_data(sdata->client,
> -					    S6SY761_READ_ONE_EVENT,
> -					    S6SY761_EVENT_SIZE,
> -					    buffer);
> +	ret = s6sy761_read(sdata, S6SY761_READ_ONE_EVENT, S6SY761_EVENT_SIZE, buffer);
>  	if (ret < 0)
>  		return ret;
>  
> @@ -317,18 +312,17 @@ static int s6sy761_power_on(struct s6sy761_data *sdata)
>  		return -ENODEV;
>  	}
>  
> -	ret = i2c_smbus_read_byte_data(sdata->client, S6SY761_BOOT_STATUS);
> +	ret = s6sy761_read(sdata, S6SY761_BOOT_STATUS, 1, &status);
>  	if (ret < 0)
>  		return ret;
>  
>  	/* for some reasons the device might be stuck in the bootloader */
> -	if (ret != S6SY761_BS_APPLICATION)
> +	if (status != S6SY761_BS_APPLICATION)
>  		return -ENODEV;
>  
>  	/* enable touch functionality */
> -	ret = i2c_smbus_write_word_data(sdata->client,
> -					S6SY761_TOUCH_FUNCTION,
> -					S6SY761_MASK_TOUCH);
> +	touch_func = cpu_to_le16(S6SY761_MASK_TOUCH);
> +	ret = s6sy761_write(sdata, S6SY761_TOUCH_FUNCTION, sizeof(touch_func), &touch_func);
>  	if (ret)
>  		return ret;
>  
> @@ -339,25 +333,20 @@ static int s6sy761_hw_init(struct s6sy761_data *sdata,
>  			   unsigned int *max_x, unsigned int *max_y)
>  {
>  	u8 buffer[S6SY761_PANEL_ID_SIZE]; /* larger read size */
> +	u8 integrity;
>  	int ret;
>  
>  	ret = s6sy761_power_on(sdata);
>  	if (ret)
>  		return ret;
>  
> -	ret = i2c_smbus_read_i2c_block_data(sdata->client,
> -					    S6SY761_DEVICE_ID,
> -					    S6SY761_DEVID_SIZE,
> -					    buffer);
> +	ret = s6sy761_read(sdata, S6SY761_DEVICE_ID, S6SY761_DEVID_SIZE, buffer);
>  	if (ret < 0)
>  		return ret;
>  
>  	sdata->devid = get_unaligned_be16(buffer + 1);
>  
> -	ret = i2c_smbus_read_i2c_block_data(sdata->client,
> -					    S6SY761_PANEL_INFO,
> -					    S6SY761_PANEL_ID_SIZE,
> -					    buffer);
> +	ret = s6sy761_read(sdata, S6SY761_PANEL_INFO, S6SY761_PANEL_ID_SIZE, buffer);
>  	if (ret < 0)
>  		return ret;
>  
> @@ -367,11 +356,10 @@ static int s6sy761_hw_init(struct s6sy761_data *sdata,
>  	/* if no tx channels defined, at least keep one */
>  	sdata->tx_channel = max_t(u8, buffer[8], 1);
>  
> -	ret = i2c_smbus_read_byte_data(sdata->client,
> -				       S6SY761_FIRMWARE_INTEGRITY);
> +	ret = s6sy761_read(sdata, S6SY761_FIRMWARE_INTEGRITY, 1, &integrity);
>  	if (ret < 0)
>  		return ret;
> -	else if (ret != S6SY761_FW_OK)
> +	else if (integrity != S6SY761_FW_OK)
>  		return -ENODEV;
>  
>  	return 0;
> @@ -381,38 +369,44 @@ static void s6sy761_power_off(void *data)
>  {
>  	struct s6sy761_data *sdata = data;
>  
> -	disable_irq(sdata->client->irq);
> +	disable_irq(sdata->irq);
>  	regulator_bulk_disable(ARRAY_SIZE(sdata->regulators),
>  						sdata->regulators);
>  }
>  
> -static int s6sy761_probe(struct i2c_client *client)
> +int s6sy761_probe(struct device *dev, const struct s6sy761_bus_ops *bus_ops, int irq)
>  {
>  	struct s6sy761_data *sdata;
>  	unsigned int max_x, max_y;
>  	int err;
>  
> -	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C |
> -						I2C_FUNC_SMBUS_BYTE_DATA |
> -						I2C_FUNC_SMBUS_I2C_BLOCK))
> -		return -ENODEV;
> -
> -	sdata = devm_kzalloc(&client->dev, sizeof(*sdata), GFP_KERNEL);
> +	sdata = devm_kzalloc(dev, sizeof(*sdata), GFP_KERNEL);
>  	if (!sdata)
>  		return -ENOMEM;
>  
> -	i2c_set_clientdata(client, sdata);
> -	sdata->client = client;
> +	sdata->xfer_buf = devm_kzalloc(dev, S6SY761_XFER_BUFFER_SIZE, GFP_KERNEL);
> +	if (!sdata->xfer_buf)
> +		return -ENOMEM;
> +
> +	dev_set_drvdata(dev, sdata);
> +
> +	sdata->bus_ops = bus_ops;
> +	sdata->dev = dev;
> +	sdata->irq = irq;
> +
> +	err = devm_mutex_init(dev, &sdata->xfer_lock);
> +	if (err)
> +		return err;
>  
>  	sdata->regulators[S6SY761_REGULATOR_VDD].supply = "vdd";
>  	sdata->regulators[S6SY761_REGULATOR_AVDD].supply = "avdd";
> -	err = devm_regulator_bulk_get(&client->dev,
> +	err = devm_regulator_bulk_get(dev,
>  				      ARRAY_SIZE(sdata->regulators),
>  				      sdata->regulators);
>  	if (err)
>  		return err;
>  
> -	err = devm_add_action_or_reset(&client->dev, s6sy761_power_off, sdata);
> +	err = devm_add_action_or_reset(dev, s6sy761_power_off, sdata);
>  	if (err)
>  		return err;
>  
> @@ -420,12 +414,12 @@ static int s6sy761_probe(struct i2c_client *client)
>  	if (err)
>  		return err;
>  
> -	sdata->input = devm_input_allocate_device(&client->dev);
> +	sdata->input = devm_input_allocate_device(dev);
>  	if (!sdata->input)
>  		return -ENOMEM;
>  
>  	sdata->input->name = S6SY761_DEV_NAME;
> -	sdata->input->id.bustype = BUS_I2C;
> +	sdata->input->id.bustype = bus_ops->bustype;
>  	sdata->input->open = s6sy761_input_open;
>  	sdata->input->close = s6sy761_input_close;
>  
> @@ -441,7 +435,7 @@ static int s6sy761_probe(struct i2c_client *client)
>  
>  	if (!input_abs_get_max(sdata->input, ABS_X) ||
>  	    !input_abs_get_max(sdata->input, ABS_Y)) {
> -		dev_warn(&client->dev, "the axis have not been set\n");
> +		dev_warn(dev, "the axis have not been set\n");
>  	}
>  
>  	err = input_mt_init_slots(sdata->input, sdata->tx_channel,
> @@ -455,37 +449,39 @@ static int s6sy761_probe(struct i2c_client *client)
>  	if (err)
>  		return err;
>  
> -	err = devm_request_threaded_irq(&client->dev, client->irq, NULL,
> +	err = devm_request_threaded_irq(dev, sdata->irq, NULL,
>  					s6sy761_irq_handler,
>  					IRQF_TRIGGER_LOW | IRQF_ONESHOT,
>  					"s6sy761_irq", sdata);
>  	if (err)
>  		return err;
>  
> -	pm_runtime_enable(&client->dev);
> +	pm_runtime_enable(dev);
>  
>  	return 0;
>  }
> +EXPORT_SYMBOL_NS_GPL(s6sy761_probe, "S6SY761");
>  
> -static void s6sy761_remove(struct i2c_client *client)
> +void s6sy761_remove(struct device *dev)
>  {
> -	pm_runtime_disable(&client->dev);
> +	pm_runtime_disable(dev);
>  }
> +EXPORT_SYMBOL_NS_GPL(s6sy761_remove, "S6SY761");
>  
>  static int s6sy761_runtime_suspend(struct device *dev)
>  {
>  	struct s6sy761_data *sdata = dev_get_drvdata(dev);
> +	u8 mode = S6SY761_APP_SLEEP;
>  
> -	return i2c_smbus_write_byte_data(sdata->client,
> -				S6SY761_APPLICATION_MODE, S6SY761_APP_SLEEP);
> +	return s6sy761_write(sdata, S6SY761_APPLICATION_MODE, 1, &mode);
>  }
>  
>  static int s6sy761_runtime_resume(struct device *dev)
>  {
>  	struct s6sy761_data *sdata = dev_get_drvdata(dev);
> +	u8 mode = S6SY761_APP_NORMAL;
>  
> -	return i2c_smbus_write_byte_data(sdata->client,
> -				S6SY761_APPLICATION_MODE, S6SY761_APP_NORMAL);
> +	return s6sy761_write(sdata, S6SY761_APPLICATION_MODE, 1, &mode);
>  }
>  
>  static int s6sy761_suspend(struct device *dev)
> @@ -506,51 +502,23 @@ static int s6sy761_resume(struct device *dev)
>  	if (err)
>  		return err;
>  
> -	enable_irq(sdata->client->irq);
> +	enable_irq(sdata->irq);
>  
>  	guard(mutex)(&sdata->input->mutex);
>  
>  	if (!input_device_enabled(sdata->input))
>  		return 0;
>  
> -	err = i2c_smbus_write_byte(sdata->client, S6SY761_SENSE_ON);
> +	err = s6sy761_write(sdata, S6SY761_SENSE_ON, 0, NULL);
>  
>  	return err;
>  }
>  
> -static const struct dev_pm_ops s6sy761_pm_ops = {
> +EXPORT_NS_GPL_DEV_PM_OPS(s6sy761_pm_ops, S6SY761) = {
>  	SYSTEM_SLEEP_PM_OPS(s6sy761_suspend, s6sy761_resume)
>  	RUNTIME_PM_OPS(s6sy761_runtime_suspend, s6sy761_runtime_resume, NULL)
>  };
>  
> -#ifdef CONFIG_OF
> -static const struct of_device_id s6sy761_of_match[] = {
> -	{ .compatible = "samsung,s6sy761", },
> -	{ },
> -};
> -MODULE_DEVICE_TABLE(of, s6sy761_of_match);
> -#endif
> -
> -static const struct i2c_device_id s6sy761_id[] = {
> -	{ .name = "s6sy761" },
> -	{ }
> -};
> -MODULE_DEVICE_TABLE(i2c, s6sy761_id);
> -
> -static struct i2c_driver s6sy761_driver = {
> -	.driver = {
> -		.name = S6SY761_DEV_NAME,
> -		.dev_groups = s6sy761_sysfs_groups,
> -		.of_match_table = of_match_ptr(s6sy761_of_match),
> -		.pm = pm_ptr(&s6sy761_pm_ops),
> -	},
> -	.probe = s6sy761_probe,
> -	.remove = s6sy761_remove,
> -	.id_table = s6sy761_id,
> -};
> -
> -module_i2c_driver(s6sy761_driver);
> -
>  MODULE_AUTHOR("Andi Shyti <andi.shyti@samsung.com>");
> -MODULE_DESCRIPTION("Samsung S6SY761 Touch Screen");
> -MODULE_LICENSE("GPL v2");
> +MODULE_DESCRIPTION("Samsung S6SY761 Touch Screen core");
> +MODULE_LICENSE("GPL");
> diff --git a/drivers/input/touchscreen/s6sy761_core.h b/drivers/input/touchscreen/s6sy761_core.h
> new file mode 100644
> index 000000000000..059cd5a36a34
> --- /dev/null
> +++ b/drivers/input/touchscreen/s6sy761_core.h
> @@ -0,0 +1,34 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +#ifndef _S6SY761_H
> +#define _S6SY761_H
> +
> +#include <linux/align.h>
> +#include <linux/types.h>
> +
> +#define S6SY761_EVENT_SIZE			8
> +#define S6SY761_EVENT_COUNT			32
> +/* largest SPI read: reply header + all events + checksum */
> +#define S6SY761_XFER_BUFFER_SIZE	ALIGN(7 + S6SY761_EVENT_SIZE * S6SY761_EVENT_COUNT + 1, 4)
> +
> +#define S6SY761_DEV_NAME	"s6sy761"
> +
> +struct device;
> +struct dev_pm_ops;
> +struct attribute_group;
> +
> +struct s6sy761_bus_ops {
> +	u16 bustype;
> +	int (*write)(struct device *dev, u8 *xfer_buf,
> +		     u8 cmd, size_t length, const void *values);
> +	int (*read)(struct device *dev, u8 *xfer_buf,
> +		    u8 cmd, size_t length, void *values);
> +};
> +
> +extern const struct dev_pm_ops s6sy761_pm_ops;
> +
> +extern const struct attribute_group *s6sy761_sysfs_groups[];
> +
> +int s6sy761_probe(struct device *dev, const struct s6sy761_bus_ops *bus_ops, int irq);
> +void s6sy761_remove(struct device *dev);
> +
> +#endif
> diff --git a/drivers/input/touchscreen/s6sy761_i2c.c b/drivers/input/touchscreen/s6sy761_i2c.c
> new file mode 100644
> index 000000000000..b5cbebfd722a
> --- /dev/null
> +++ b/drivers/input/touchscreen/s6sy761_i2c.c
> @@ -0,0 +1,112 @@
> +// SPDX-License-Identifier: GPL-2.0
> +// Samsung S6SY761 I2C Touchscreen device driver
> +//
> +// Copyright (c) 2017 Samsung Electronics Co., Ltd.
> +// Copyright (c) 2017 Andi Shyti <andi@etezian.org>
> +// Copyright (c) 2026 Lukas Timmermann <foss@timmermann.space>
> +
> +#include <linux/input.h>
> +#include <linux/i2c.h>
> +#include <linux/mod_devicetable.h>

Please don't add new usages of <linux/mod_devicetable.h>. <linux/i2c.h>
is enough to get the definition of of_device_id and i2c_device_id.

I didn't look into the other patches of this series in detail, but I
suspect that the same holds true in your spi patch. <linux/spi/spi.h>
provides of_device_id and spi_device_id, so don't add
<linux/mod_devicetable.h> there either.

(If you want to go full iwyu, use the subsystem specific headers below
linux/device-id/.

> +static const struct of_device_id s6sy761_of_match[] = {
> +	{ .compatible = "samsung,s6sy761", },
> +	{ },

No trailing comma after the list terminator please.

> +};
> +MODULE_DEVICE_TABLE(of, s6sy761_of_match);
> +
> +static const struct i2c_device_id s6sy761_id[] = {
> +	{ "s6sy761" },

please make this: { .name = "s6sy761" }

Best regards
Uwe

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

  reply	other threads:[~2026-10-12 11:04 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-11 12:44 [PATCH 0/7] Input: s6sy761 - add SPI support for the S6SY791 Lukas Timmermann
2026-10-11 12:44 ` [PATCH 1/7] dt-bindings: input: touchscreen: samsung,s6sy761: Add S6SY791 and reset GPIO Lukas Timmermann
2026-10-12 11:30   ` Krzysztof Kozlowski
2026-10-11 12:44 ` [PATCH 2/7] Input: s6sy761 - split into core and I2C modules Lukas Timmermann
2026-10-12 11:04   ` Uwe Kleine-König [this message]
2026-10-11 12:44 ` [PATCH 3/7] Input: s6sy761 - add reset GPIO support Lukas Timmermann
2026-10-11 12:44 ` [PATCH 4/7] Input: s6sy761 - add SPI support for S6SY791 Lukas Timmermann
2026-10-11 12:45 ` [PATCH 5/7] arm64: dts: exynos: gs101-pixel-common: add labels for touchscreen supplies Lukas Timmermann
2026-10-11 12:45 ` [PATCH 6/7] arm64: dts: exynos: gs101-raven: add S6SY791 touchscreen Lukas Timmermann
2026-10-11 12:45 ` [PATCH 7/7] MAINTAINERS: add entry for Samsung S6SY761 touchscreen driver Lukas Timmermann

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=asy92cwqv8Xjc2PX@monoceros \
    --to=u.kleine-koenig@baylibre.com \
    --cc=alim.akhtar@samsung.com \
    --cc=andi.shyti@kernel.org \
    --cc=andre.draszik@linaro.org \
    --cc=conor+dt@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=dmitry.torokhov@gmail.com \
    --cc=foss@timmermann.space \
    --cc=krzk+dt@kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-input@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-samsung-soc@vger.kernel.org \
    --cc=peter.griffin@linaro.org \
    --cc=robh@kernel.org \
    --cc=tudor.ambarus@linaro.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®