ADS7845 support is buggy in this driver.
These patches fix various issues to get it work properly.
Luca Ellero (3):
ads7846: don't report pressure for ads7845
ads7846: always set last command to PWRDOWN
ads7846: don't check penirq immediately for 7845
drivers/input/touchscreen/ads7846.c | 23 +++++++++++++----------
1 file changed, 13 insertions(+), 10 deletions(-)
--
2.25.1
From: Luca Ellero <[email protected]>
ADS7845 doesn't support pressure.
This patch avoids the following error reported by libinput-list-devices:
"ADS7845 Touchscreen: kernel bug: device has min == max on ABS_PRESSURE"
Signed-off-by: Luca Ellero <[email protected]>
---
drivers/input/touchscreen/ads7846.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c
index bed68a68f330..24605c40d039 100644
--- a/drivers/input/touchscreen/ads7846.c
+++ b/drivers/input/touchscreen/ads7846.c
@@ -1316,8 +1316,9 @@ static int ads7846_probe(struct spi_device *spi)
pdata->y_min ? : 0,
pdata->y_max ? : MAX_12BIT,
0, 0);
- input_set_abs_params(input_dev, ABS_PRESSURE,
- pdata->pressure_min, pdata->pressure_max, 0, 0);
+ if (ts->model != 7845)
+ input_set_abs_params(input_dev, ABS_PRESSURE,
+ pdata->pressure_min, pdata->pressure_max, 0, 0);
/*
* Parse common framework properties. Must be done here to ensure the
--
2.25.1
From: Luca Ellero <[email protected]>
To discard false readings, one should use "ti,penirq-recheck-delay-usecs".
Checking get_pendown_state() at the beginning, most of the time fails
causing malfunctioning.
Signed-off-by: Luca Ellero <[email protected]>
---
drivers/input/touchscreen/ads7846.c | 8 +-------
1 file changed, 1 insertion(+), 7 deletions(-)
diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c
index 9e15cdf6faa0..122d3a13b7c5 100644
--- a/drivers/input/touchscreen/ads7846.c
+++ b/drivers/input/touchscreen/ads7846.c
@@ -843,14 +843,8 @@ static void ads7846_report_state(struct ads7846 *ts)
if (x == MAX_12BIT)
x = 0;
- if (ts->model == 7843) {
+ if (ts->model == 7843 || ts->model == 7845) {
Rt = ts->pressure_max / 2;
- } else if (ts->model == 7845) {
- if (get_pendown_state(ts))
- Rt = ts->pressure_max / 2;
- else
- Rt = 0;
- dev_vdbg(&ts->spi->dev, "x/y: %d/%d, PD %d\n", x, y, Rt);
} else if (likely(x && z1)) {
/* compute touch pressure resistance using equation #2 */
Rt = z2;
--
2.25.1
From: Luca Ellero <[email protected]>
This was broken on controllers with 3 commands as ads7845.
READ_Z1 was sent instead.
Signed-off-by: Luca Ellero <[email protected]>
---
drivers/input/touchscreen/ads7846.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c
index 24605c40d039..9e15cdf6faa0 100644
--- a/drivers/input/touchscreen/ads7846.c
+++ b/drivers/input/touchscreen/ads7846.c
@@ -1066,6 +1066,9 @@ static int ads7846_setup_spi_msg(struct ads7846 *ts,
struct ads7846_buf_layout *l = &packet->l[cmd_idx];
unsigned int max_count;
+ if (cmd_idx == packet->cmds - 1)
+ cmd_idx = ADS7846_PWDOWN;
+
if (ads7846_cmd_need_settle(cmd_idx))
max_count = packet->count + packet->count_skip;
else
@@ -1102,7 +1105,12 @@ static int ads7846_setup_spi_msg(struct ads7846 *ts,
for (cmd_idx = 0; cmd_idx < packet->cmds; cmd_idx++) {
struct ads7846_buf_layout *l = &packet->l[cmd_idx];
- u8 cmd = ads7846_get_cmd(cmd_idx, vref);
+ u8 cmd;
+
+ if (cmd_idx == packet->cmds - 1)
+ cmd_idx = ADS7846_PWDOWN;
+
+ cmd = ads7846_get_cmd(cmd_idx, vref);
for (b = 0; b < l->count; b++)
packet->tx[l->offset + b].cmd = cmd;
--
2.25.1
On Thu, Jul 14, 2022 at 10:43:18AM +0200, Luca Ellero wrote:
> From: Luca Ellero <[email protected]>
>
> This was broken on controllers with 3 commands as ads7845.
> READ_Z1 was sent instead.
What is "This"? Please, make commit message more understandable by its own.
With that fixed,
Reviewed-by: Andy Shevchenko <[email protected]>
> Signed-off-by: Luca Ellero <[email protected]>
> ---
> drivers/input/touchscreen/ads7846.c | 10 +++++++++-
> 1 file changed, 9 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c
> index 24605c40d039..9e15cdf6faa0 100644
> --- a/drivers/input/touchscreen/ads7846.c
> +++ b/drivers/input/touchscreen/ads7846.c
> @@ -1066,6 +1066,9 @@ static int ads7846_setup_spi_msg(struct ads7846 *ts,
> struct ads7846_buf_layout *l = &packet->l[cmd_idx];
> unsigned int max_count;
>
> + if (cmd_idx == packet->cmds - 1)
> + cmd_idx = ADS7846_PWDOWN;
> +
> if (ads7846_cmd_need_settle(cmd_idx))
> max_count = packet->count + packet->count_skip;
> else
> @@ -1102,7 +1105,12 @@ static int ads7846_setup_spi_msg(struct ads7846 *ts,
>
> for (cmd_idx = 0; cmd_idx < packet->cmds; cmd_idx++) {
> struct ads7846_buf_layout *l = &packet->l[cmd_idx];
> - u8 cmd = ads7846_get_cmd(cmd_idx, vref);
> + u8 cmd;
> +
> + if (cmd_idx == packet->cmds - 1)
> + cmd_idx = ADS7846_PWDOWN;
> +
> + cmd = ads7846_get_cmd(cmd_idx, vref);
>
> for (b = 0; b < l->count; b++)
> packet->tx[l->offset + b].cmd = cmd;
> --
> 2.25.1
>
--
With Best Regards,
Andy Shevchenko
On Thu, Jul 14, 2022 at 10:43:19AM +0200, Luca Ellero wrote:
> From: Luca Ellero <[email protected]>
>
> To discard false readings, one should use "ti,penirq-recheck-delay-usecs".
> Checking get_pendown_state() at the beginning, most of the time fails
> causing malfunctioning.
Reviewed-by: Andy Shevchenko <[email protected]>
> Signed-off-by: Luca Ellero <[email protected]>
> ---
> drivers/input/touchscreen/ads7846.c | 8 +-------
> 1 file changed, 1 insertion(+), 7 deletions(-)
>
> diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c
> index 9e15cdf6faa0..122d3a13b7c5 100644
> --- a/drivers/input/touchscreen/ads7846.c
> +++ b/drivers/input/touchscreen/ads7846.c
> @@ -843,14 +843,8 @@ static void ads7846_report_state(struct ads7846 *ts)
> if (x == MAX_12BIT)
> x = 0;
>
> - if (ts->model == 7843) {
> + if (ts->model == 7843 || ts->model == 7845) {
> Rt = ts->pressure_max / 2;
> - } else if (ts->model == 7845) {
> - if (get_pendown_state(ts))
> - Rt = ts->pressure_max / 2;
> - else
> - Rt = 0;
> - dev_vdbg(&ts->spi->dev, "x/y: %d/%d, PD %d\n", x, y, Rt);
> } else if (likely(x && z1)) {
> /* compute touch pressure resistance using equation #2 */
> Rt = z2;
> --
> 2.25.1
>
--
With Best Regards,
Andy Shevchenko
On Thu, Jul 14, 2022 at 10:43:17AM +0200, Luca Ellero wrote:
> From: Luca Ellero <[email protected]>
>
> ADS7845 doesn't support pressure.
> This patch avoids the following error reported by libinput-list-devices:
> "ADS7845 Touchscreen: kernel bug: device has min == max on ABS_PRESSURE"
Missed period, otherwise looks good.
Reviewed-by: Andy Shevchenko <[email protected]>
> Signed-off-by: Luca Ellero <[email protected]>
> ---
> drivers/input/touchscreen/ads7846.c | 5 +++--
> 1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c
> index bed68a68f330..24605c40d039 100644
> --- a/drivers/input/touchscreen/ads7846.c
> +++ b/drivers/input/touchscreen/ads7846.c
> @@ -1316,8 +1316,9 @@ static int ads7846_probe(struct spi_device *spi)
> pdata->y_min ? : 0,
> pdata->y_max ? : MAX_12BIT,
> 0, 0);
> - input_set_abs_params(input_dev, ABS_PRESSURE,
> - pdata->pressure_min, pdata->pressure_max, 0, 0);
> + if (ts->model != 7845)
> + input_set_abs_params(input_dev, ABS_PRESSURE,
> + pdata->pressure_min, pdata->pressure_max, 0, 0);
>
> /*
> * Parse common framework properties. Must be done here to ensure the
> --
> 2.25.1
>
--
With Best Regards,
Andy Shevchenko
On 14/07/2022 13:32, Andy Shevchenko wrote:
> On Thu, Jul 14, 2022 at 10:43:17AM +0200, Luca Ellero wrote:
>> From: Luca Ellero <[email protected]>
>>
>> ADS7845 doesn't support pressure.
>> This patch avoids the following error reported by libinput-list-devices:
>> "ADS7845 Touchscreen: kernel bug: device has min == max on ABS_PRESSURE"
>
> Missed period, otherwise looks good.
>
> Reviewed-by: Andy Shevchenko <[email protected]>
>
>> Signed-off-by: Luca Ellero <[email protected]>
>> ---
>> drivers/input/touchscreen/ads7846.c | 5 +++--
>> 1 file changed, 3 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c
>> index bed68a68f330..24605c40d039 100644
>> --- a/drivers/input/touchscreen/ads7846.c
>> +++ b/drivers/input/touchscreen/ads7846.c
>> @@ -1316,8 +1316,9 @@ static int ads7846_probe(struct spi_device *spi)
>> pdata->y_min ? : 0,
>> pdata->y_max ? : MAX_12BIT,
>> 0, 0);
>> - input_set_abs_params(input_dev, ABS_PRESSURE,
>> - pdata->pressure_min, pdata->pressure_max, 0, 0);
>> + if (ts->model != 7845)
>> + input_set_abs_params(input_dev, ABS_PRESSURE,
>> + pdata->pressure_min, pdata->pressure_max, 0, 0);
>>
>> /*
>> * Parse common framework properties. Must be done here to ensure the
>> --
>> 2.25.1
>>
>
Hi Andy,
thank you for your comments.
I will resend v2 of the patches.
Regards
Luca
--
Luca Ellero
E-mail: [email protected]
Internet: http://www.brickedbrain.com