2023-10-01 14:14:25

by Duje Mihanović

[permalink] [raw]
Subject: [PATCH RFC v4 6/6] input: ads7846: Move wait_for_sync() logic to driver

If this code is left in the board file, the sync GPIO would have to be
separated into another lookup table during conversion to the GPIO
descriptor API (which is also done in this patch).

The only user of this code (Sharp Spitz) is also converted in this
patch.

Signed-off-by: Duje Mihanović <[email protected]>
---
arch/arm/mach-pxa/spitz.c | 12 ++----------
drivers/input/touchscreen/ads7846.c | 22 +++++++++++++++-------
include/linux/spi/ads7846.h | 1 -
3 files changed, 17 insertions(+), 18 deletions(-)

diff --git a/arch/arm/mach-pxa/spitz.c b/arch/arm/mach-pxa/spitz.c
index 701fba130ac4..22d5c5645b8f 100644
--- a/arch/arm/mach-pxa/spitz.c
+++ b/arch/arm/mach-pxa/spitz.c
@@ -520,22 +520,12 @@ static inline void spitz_leds_init(void) {}
* SSP Devices
******************************************************************************/
#if defined(CONFIG_SPI_PXA2XX) || defined(CONFIG_SPI_PXA2XX_MODULE)
-static void spitz_ads7846_wait_for_hsync(void)
-{
- while (gpio_get_value(SPITZ_GPIO_HSYNC))
- cpu_relax();
-
- while (!gpio_get_value(SPITZ_GPIO_HSYNC))
- cpu_relax();
-}
-
static struct ads7846_platform_data spitz_ads7846_info = {
.model = 7846,
.vref_delay_usecs = 100,
.x_plate_ohms = 419,
.y_plate_ohms = 486,
.pressure_max = 1024,
- .wait_for_sync = spitz_ads7846_wait_for_hsync,
};

static struct gpiod_lookup_table spitz_ads7846_gpio_table = {
@@ -543,6 +533,8 @@ static struct gpiod_lookup_table spitz_ads7846_gpio_table = {
.table = {
GPIO_LOOKUP("gpio-pxa", SPITZ_GPIO_TP_INT,
"pendown", GPIO_ACTIVE_LOW),
+ GPIO_LOOKUP("gpio-pxa", SPITZ_GPIO_HSYNC,
+ "sync", GPIO_ACTIVE_LOW),
{ }
},
};
diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c
index faea40dd66d0..894f179bfa8d 100644
--- a/drivers/input/touchscreen/ads7846.c
+++ b/drivers/input/touchscreen/ads7846.c
@@ -138,8 +138,7 @@ struct ads7846 {
void *filter_data;
int (*get_pendown_state)(void);
struct gpio_desc *gpio_pendown;
-
- void (*wait_for_sync)(void);
+ struct gpio_desc *sync;
};

enum ads7846_filter {
@@ -636,9 +635,14 @@ static const struct attribute_group ads784x_attr_group = {
};

/*--------------------------------------------------------------------------*/
-
-static void null_wait_for_sync(void)
+static void ads7846_wait_for_sync(struct ads7846 *ts)
{
+ if (!ts->sync) return;
+ while (!gpiod_get_value(ts->sync))
+ cpu_relax();
+
+ while (gpiod_get_value(ts->sync))
+ cpu_relax();
}

static int ads7846_debounce_filter(void *ads, int data_idx, int *val)
@@ -803,7 +807,7 @@ static void ads7846_read_state(struct ads7846 *ts)
packet->last_cmd_idx = 0;

while (true) {
- ts->wait_for_sync();
+ ads7846_wait_for_sync(ts);

m = &ts->msg[msg_idx];
error = spi_sync(ts->spi, m);
@@ -1261,8 +1265,6 @@ static int ads7846_probe(struct spi_device *spi)
ts->penirq_recheck_delay_usecs =
pdata->penirq_recheck_delay_usecs;

- ts->wait_for_sync = pdata->wait_for_sync ? : null_wait_for_sync;
-
snprintf(ts->phys, sizeof(ts->phys), "%s/input0", dev_name(dev));
snprintf(ts->name, sizeof(ts->name), "ADS%d Touchscreen", ts->model);

@@ -1361,6 +1363,12 @@ static int ads7846_probe(struct spi_device *spi)
if (err)
return err;

+ ts->sync = devm_gpiod_get_optional(dev, "sync", GPIOD_IN);
+ if (IS_ERR(ts->sync)) {
+ dev_err(dev, "Failed to get sync GPIO: %pe\n", ts->sync);
+ return PTR_ERR(ts->sync);
+ }
+
err = input_register_device(input_dev);
if (err)
return err;
diff --git a/include/linux/spi/ads7846.h b/include/linux/spi/ads7846.h
index a04c1c34c344..fa7c4f119023 100644
--- a/include/linux/spi/ads7846.h
+++ b/include/linux/spi/ads7846.h
@@ -38,7 +38,6 @@ struct ads7846_platform_data {
int gpio_pendown_debounce; /* platform specific debounce time for
* the gpio_pendown */
int (*get_pendown_state)(void);
- void (*wait_for_sync)(void);
bool wakeup;
unsigned long irq_flags;
};

--
2.42.0



2023-10-01 22:37:21

by Andy Shevchenko

[permalink] [raw]
Subject: Re: [PATCH RFC v4 6/6] input: ads7846: Move wait_for_sync() logic to driver

On Sun, Oct 1, 2023 at 5:13 PM Duje Mihanović <[email protected]> wrote:
>
> If this code is left in the board file, the sync GPIO would have to be
> separated into another lookup table during conversion to the GPIO
> descriptor API (which is also done in this patch).
>
> The only user of this code (Sharp Spitz) is also converted in this
> patch.

Suggested-by: Linus... ?

...

> +static void ads7846_wait_for_sync(struct ads7846 *ts)

I would name it ..._wait_for_sync_gpio.

...

> + ts->sync = devm_gpiod_get_optional(dev, "sync", GPIOD_IN);
> + if (IS_ERR(ts->sync)) {

> + dev_err(dev, "Failed to get sync GPIO: %pe\n", ts->sync);
> + return PTR_ERR(ts->sync);

return dev_err_probe(...); ?

> + }

--
With Best Regards,
Andy Shevchenko

2023-10-02 11:50:20

by Mark Brown

[permalink] [raw]
Subject: Re: [PATCH RFC v4 6/6] input: ads7846: Move wait_for_sync() logic to driver

On Sun, Oct 01, 2023 at 04:12:57PM +0200, Duje Mihanović wrote:
> If this code is left in the board file, the sync GPIO would have to be
> separated into another lookup table during conversion to the GPIO
> descriptor API (which is also done in this patch).

Acked-by: Mark Brown <[email protected]>


Attachments:
(No filename) (308.00 B)
signature.asc (499.00 B)
Download all attachments

2023-10-02 13:13:34

by Linus Walleij

[permalink] [raw]
Subject: Re: [PATCH RFC v4 6/6] input: ads7846: Move wait_for_sync() logic to driver

On Sun, Oct 1, 2023 at 4:13 PM Duje Mihanović <[email protected]> wrote:

> If this code is left in the board file, the sync GPIO would have to be
> separated into another lookup table during conversion to the GPIO
> descriptor API (which is also done in this patch).
>
> The only user of this code (Sharp Spitz) is also converted in this
> patch.
>
> Signed-off-by: Duje Mihanović <[email protected]>

Looking good!
With Andy's nits fixed:
Reviewed-by: Linus Walleij <[email protected]>

Yours,
Linus Walleij