2022-11-17 19:28:16

by Lin, Meng-Bo

[permalink] [raw]
Subject: [RESEND PATCH 0/3] Add supports for Imagis IST3038 and IST30XXB

This series adds supports for Imagis IST3038 and IST30XXB IC, which are
variants of Imagis IST3038 IC. They have a different register map
(labeled protocol b), but otherwise it seems to be the same IC.
It is also possible to support various other Imagis ICs using
protocol b, such as (but not limited to) IST3044B, IST3026, IST3032,
IST3026B, IST3032B. However, most of them (all except IST3044B)
use a different coordinate format, so extra effort would be needed
to support those.

Tested on Samsung Galaxy Core Prime and Grand Max.



2022-11-17 19:29:52

by Lin, Meng-Bo

[permalink] [raw]
Subject: [RESNED PATCH 3/3] input/touchscreen: imagis: Add supports for Imagis IST3038 and IST30XXB

From: Markuss Broks <[email protected]>

Imagis IST3038 and IST30XXB are other variants of Imagis IST3038 IC, which
have a different register interface from IST3038C (possibly firmware
defined).

This should also work for IST3044B (though untested), however other
variants using this interface/protocol(IST3026, IST3032, IST3026B,
IST3032B) have a different format for coordinates, and they'd need
additional effort to be supported by this driver.

Signed-off-by: Markuss Broks <[email protected]>
[Use IST3038C_REG_CHIPID_BASE]
Signed-off-by: Lin, Meng-Bo <[email protected]>
---
drivers/input/touchscreen/imagis.c | 71 +++++++++++++++++++++++++-----
1 file changed, 60 insertions(+), 11 deletions(-)

diff --git a/drivers/input/touchscreen/imagis.c b/drivers/input/touchscreen/imagis.c
index b667914a44f1..ac07b24496eb 100644
--- a/drivers/input/touchscreen/imagis.c
+++ b/drivers/input/touchscreen/imagis.c
@@ -13,7 +13,8 @@

#define IST3038C_HIB_ACCESS (0x800B << 16)
#define IST3038C_DIRECT_ACCESS BIT(31)
-#define IST3038C_REG_CHIPID 0x40001000
+#define IST3038C_REG_CHIPID_BASE 0x40001000
+#define IST3038C_REG_CHIPID(base) (base | IST3038C_DIRECT_ACCESS)
#define IST3038C_REG_HIB_BASE 0x30000100
#define IST3038C_REG_TOUCH_STATUS (IST3038C_REG_HIB_BASE | IST3038C_HIB_ACCESS)
#define IST3038C_REG_TOUCH_COORD (IST3038C_REG_HIB_BASE | IST3038C_HIB_ACCESS | 0x8)
@@ -31,8 +32,24 @@
#define IST3038C_FINGER_COUNT_SHIFT 12
#define IST3038C_FINGER_STATUS_MASK GENMASK(9, 0)

+#define IST30XX_REG_STATUS 0x20
+#define IST30XXB_REG_CHIPID_BASE 0x40000000
+#define IST30XX_WHOAMI 0x30003000
+#define IST30XXA_WHOAMI 0x300a300a
+#define IST30XXB_WHOAMI 0x300b300b
+#define IST3038_WHOAMI 0x30383038
+
+struct imagis_properties {
+ unsigned int interrupt_msg_cmd;
+ unsigned int touch_coord_cmd;
+ unsigned int chipid_base;
+ unsigned int whoami_val;
+ bool protocol_b;
+};
+
struct imagis_ts {
struct i2c_client *client;
+ const struct imagis_properties *tdata;
struct input_dev *input_dev;
struct touchscreen_properties prop;
struct regulator_bulk_data supplies[2];
@@ -84,8 +101,7 @@ static irqreturn_t imagis_interrupt(int irq, void *dev_id)
int i;
int error;

- error = imagis_i2c_read_reg(ts, IST3038C_REG_INTR_MESSAGE,
- &intr_message);
+ error = imagis_i2c_read_reg(ts, ts->tdata->interrupt_msg_cmd, &intr_message);
if (error) {
dev_err(&ts->client->dev,
"failed to read the interrupt message: %d\n", error);
@@ -104,9 +120,13 @@ static irqreturn_t imagis_interrupt(int irq, void *dev_id)
finger_pressed = intr_message & IST3038C_FINGER_STATUS_MASK;

for (i = 0; i < finger_count; i++) {
- error = imagis_i2c_read_reg(ts,
- IST3038C_REG_TOUCH_COORD + (i * 4),
- &finger_status);
+ if (ts->tdata->protocol_b)
+ error = imagis_i2c_read_reg(ts,
+ ts->tdata->touch_coord_cmd, &finger_status);
+ else
+ error = imagis_i2c_read_reg(ts,
+ ts->tdata->touch_coord_cmd + (i * 4),
+ &finger_status);
if (error) {
dev_err(&ts->client->dev,
"failed to read coordinates for finger %d: %d\n",
@@ -261,6 +281,12 @@ static int imagis_probe(struct i2c_client *i2c)

ts->client = i2c;

+ ts->tdata = device_get_match_data(dev);
+ if (!ts->tdata) {
+ dev_err(dev, "missing chip data\n");
+ return -EINVAL;
+ }
+
error = imagis_init_regulators(ts);
if (error) {
dev_err(dev, "regulator init error: %d\n", error);
@@ -279,15 +305,13 @@ static int imagis_probe(struct i2c_client *i2c)
return error;
}

- error = imagis_i2c_read_reg(ts,
- IST3038C_REG_CHIPID | IST3038C_DIRECT_ACCESS,
- &chip_id);
+ error = imagis_i2c_read_reg(ts, IST3038C_REG_CHIPID(ts->tdata->chipid_base), &chip_id);
if (error) {
dev_err(dev, "chip ID read failure: %d\n", error);
return error;
}

- if (chip_id != IST3038C_WHOAMI) {
+ if (chip_id != ts->tdata->whoami_val) {
dev_err(dev, "unknown chip ID: 0x%x\n", chip_id);
return -EINVAL;
}
@@ -343,9 +367,34 @@ static int __maybe_unused imagis_resume(struct device *dev)

static SIMPLE_DEV_PM_OPS(imagis_pm_ops, imagis_suspend, imagis_resume);

+static const struct imagis_properties imagis_3038_data = {
+ .interrupt_msg_cmd = IST30XX_REG_STATUS,
+ .touch_coord_cmd = IST30XX_REG_STATUS,
+ .chipid_base = IST30XXB_REG_CHIPID_BASE,
+ .whoami_val = IST3038_WHOAMI,
+ .protocol_b = true,
+};
+
+static const struct imagis_properties imagis_3038c_data = {
+ .interrupt_msg_cmd = IST3038C_REG_INTR_MESSAGE,
+ .touch_coord_cmd = IST3038C_REG_TOUCH_COORD,
+ .chipid_base = IST3038C_REG_CHIPID_BASE,
+ .whoami_val = IST3038C_WHOAMI,
+};
+
+static const struct imagis_properties imagis_30xxb_data = {
+ .interrupt_msg_cmd = IST30XX_REG_STATUS,
+ .touch_coord_cmd = IST30XX_REG_STATUS,
+ .chipid_base = IST30XXB_REG_CHIPID_BASE,
+ .whoami_val = IST30XXB_WHOAMI,
+ .protocol_b = true,
+};
+
#ifdef CONFIG_OF
static const struct of_device_id imagis_of_match[] = {
- { .compatible = "imagis,ist3038c", },
+ { .compatible = "imagis,ist3038", .data = &imagis_3038_data },
+ { .compatible = "imagis,ist3038c", .data = &imagis_3038c_data },
+ { .compatible = "imagis,ist30xxb", .data = &imagis_30xxb_data },
{ },
};
MODULE_DEVICE_TABLE(of, imagis_of_match);
--
2.30.2



2022-11-17 20:15:40

by Lin, Meng-Bo

[permalink] [raw]
Subject: [RESNED PATCH 2/3] input/touchscreen: imagis: Correct the maximum touch area value

From: Markuss Broks <[email protected]>

As specified in downstream IST3038/IST30XXB driver and proved by testing,
the correct maximum reported value of touch area is 16.

Signed-off-by: Markuss Broks <[email protected]>
[Change from IST3038B to IST3038 and IST30XXB]
Signed-off-by: Lin, Meng-Bo <[email protected]>
---
drivers/input/touchscreen/imagis.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/input/touchscreen/imagis.c b/drivers/input/touchscreen/imagis.c
index e2697e6c6d2a..b667914a44f1 100644
--- a/drivers/input/touchscreen/imagis.c
+++ b/drivers/input/touchscreen/imagis.c
@@ -210,7 +210,7 @@ static int imagis_init_input_dev(struct imagis_ts *ts)

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_TOUCH_MAJOR, 0, 255, 0, 0);
+ input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, 16, 0, 0);

touchscreen_parse_properties(input_dev, true, &ts->prop);
if (!ts->prop.max_x || !ts->prop.max_y) {
--
2.30.2



2022-11-17 20:15:55

by Lin, Meng-Bo

[permalink] [raw]
Subject: [RESNED PATCH 1/3] dt-bindings: input/touchscreen: Add compatible for IST3038 and IST30XXB

From: Markuss Broks <[email protected]>

Imagis IST3038 and IST30XXB are variants (firmware?) of Imagis IST3038 IC,
add the compatible for them to the IST3038C bindings.

Signed-off-by: Markuss Broks <[email protected]>
[Change from IST3038B to IST3038 and IST30XXB]
Signed-off-by: Lin, Meng-Bo <[email protected]>
---
.../devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml | 2 ++
1 file changed, 2 insertions(+)

diff --git a/Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml b/Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml
index e3a2b871e50c..85390f6ffe36 100644
--- a/Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml
+++ b/Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml
@@ -18,7 +18,9 @@ properties:

compatible:
enum:
+ - imagis,ist3038
- imagis,ist3038c
+ - imagis,ist30xxb

reg:
maxItems: 1
--
2.30.2



2022-11-18 06:40:26

by Dmitry Torokhov

[permalink] [raw]
Subject: Re: [RESNED PATCH 1/3] dt-bindings: input/touchscreen: Add compatible for IST3038 and IST30XXB

On Thu, Nov 17, 2022 at 07:15:03PM +0000, Lin, Meng-Bo wrote:
> From: Markuss Broks <[email protected]>
>
> Imagis IST3038 and IST30XXB are variants (firmware?) of Imagis IST3038 IC,
> add the compatible for them to the IST3038C bindings.
>
> Signed-off-by: Markuss Broks <[email protected]>
> [Change from IST3038B to IST3038 and IST30XXB]
> Signed-off-by: Lin, Meng-Bo <[email protected]>
> ---
> .../devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml b/Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml
> index e3a2b871e50c..85390f6ffe36 100644
> --- a/Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml
> +++ b/Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml
> @@ -18,7 +18,9 @@ properties:
>
> compatible:
> enum:
> + - imagis,ist3038
> - imagis,ist3038c
> + - imagis,ist30xxb

I do not believe wildcard compatibles are allowed.

Thanks.

--
Dmitry

2022-11-18 15:03:53

by Krzysztof Kozlowski

[permalink] [raw]
Subject: Re: [RESNED PATCH 1/3] dt-bindings: input/touchscreen: Add compatible for IST3038 and IST30XXB

On 17/11/2022 20:15, Lin, Meng-Bo wrote:
> From: Markuss Broks <[email protected]>
>
> Imagis IST3038 and IST30XXB are variants (firmware?) of Imagis IST3038 IC,
> add the compatible for them to the IST3038C bindings.
>
> Signed-off-by: Markuss Broks <[email protected]>
> [Change from IST3038B to IST3038 and IST30XXB]
> Signed-off-by: Lin, Meng-Bo <[email protected]>
> ---
> .../devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml b/Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml
> index e3a2b871e50c..85390f6ffe36 100644
> --- a/Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml
> +++ b/Documentation/devicetree/bindings/input/touchscreen/imagis,ist3038c.yaml
> @@ -18,7 +18,9 @@ properties:
>
> compatible:
> enum:
> + - imagis,ist3038
> - imagis,ist3038c
> + - imagis,ist30xxb

I don't get why this is a resend, but comments from v1 apply.

Best regards,
Krzysztof