drivers/input/touchscreen/goodix.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+)
The touchscreen on the SUPI S10 reports inverted Y coordinates, causing
touch input to be mirrored vertically relative to the display.
Add a DMI-based quirk to invert the Y coordinate on this device so that
touch input matches the display orientation.
Tested on SUPI S10 tablet with Goodix touchscreen controller.
Signed-off-by: Yajat Kumar <yajatapps3@gmail.com>
---
drivers/input/touchscreen/goodix.c | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/drivers/input/touchscreen/goodix.c b/drivers/input/touchscreen/goodix.c
index f8798d11ec03..d675a85a9312 100644
--- a/drivers/input/touchscreen/goodix.c
+++ b/drivers/input/touchscreen/goodix.c
@@ -160,6 +160,22 @@ static const struct dmi_system_id inverted_x_screen[] = {
{}
};
+/*
+ * Those tablets have their y coordinate inverted
+ */
+static const struct dmi_system_id inverted_y_screen[] = {
+#if defined(CONFIG_DMI) && defined(CONFIG_X86)
+ {
+ .ident = "SUPI S10",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "SUPI"),
+ DMI_MATCH(DMI_PRODUCT_NAME, "S10")
+ },
+ },
+#endif
+ {}
+};
+
/**
* goodix_i2c_read - read data from a register of the i2c slave device.
*
@@ -1212,6 +1228,12 @@ static int goodix_configure_dev(struct goodix_ts_data *ts)
"Applying 'inverted x screen' quirk\n");
}
+ if (dmi_check_system(inverted_y_screen)) {
+ ts->prop.invert_y = true;
+ dev_dbg(&ts->client->dev,
+ "Applying 'inverted y screen' quirk\n");
+ }
+
error = input_mt_init_slots(ts->input_dev, ts->max_touch_num,
INPUT_MT_DIRECT | INPUT_MT_DROP_UNUSED);
if (error) {
--
2.51.0
Hi Yajat,
On 30-Dec-25 23:16, Yajat Kumar wrote:
> The touchscreen on the SUPI S10 reports inverted Y coordinates, causing
> touch input to be mirrored vertically relative to the display.
>
> Add a DMI-based quirk to invert the Y coordinate on this device so that
> touch input matches the display orientation.
>
> Tested on SUPI S10 tablet with Goodix touchscreen controller.
>
> Signed-off-by: Yajat Kumar <yajatapps3@gmail.com>
Thank you for your patch. This kind of quirks really belong
in drivers/platform/x86/touchscreen_dmi.c instead of in individual
touchscreen drivers.
The inverted_x_screen[] DMI quirk is a left-over from before we
moved these quirks to touchscreen_dmi.c and unfortunately we cannot
move this because we've not been able to find someone to test this.
I've attached a patch which should fix the issue using
touchscreen_dmi.c . Note you may need to change the GDIX1001 in
the patch to GDIX1002, see "ls /sys/bus/i2c/devices" to see which
ACPI HID your touchscreen is using.
Can you please test the attached patch ?
Regards,
Hans
> ---
> drivers/input/touchscreen/goodix.c | 22 ++++++++++++++++++++++
> 1 file changed, 22 insertions(+)
>
> diff --git a/drivers/input/touchscreen/goodix.c b/drivers/input/touchscreen/goodix.c
> index f8798d11ec03..d675a85a9312 100644
> --- a/drivers/input/touchscreen/goodix.c
> +++ b/drivers/input/touchscreen/goodix.c
> @@ -160,6 +160,22 @@ static const struct dmi_system_id inverted_x_screen[] = {
> {}
> };
>
> +/*
> + * Those tablets have their y coordinate inverted
> + */
> +static const struct dmi_system_id inverted_y_screen[] = {
> +#if defined(CONFIG_DMI) && defined(CONFIG_X86)
> + {
> + .ident = "SUPI S10",
> + .matches = {
> + DMI_MATCH(DMI_SYS_VENDOR, "SUPI"),
> + DMI_MATCH(DMI_PRODUCT_NAME, "S10")
> + },
> + },
> +#endif
> + {}
> +};
> +
> /**
> * goodix_i2c_read - read data from a register of the i2c slave device.
> *
> @@ -1212,6 +1228,12 @@ static int goodix_configure_dev(struct goodix_ts_data *ts)
> "Applying 'inverted x screen' quirk\n");
> }
>
> + if (dmi_check_system(inverted_y_screen)) {
> + ts->prop.invert_y = true;
> + dev_dbg(&ts->client->dev,
> + "Applying 'inverted y screen' quirk\n");
> + }
> +
> error = input_mt_init_slots(ts->input_dev, ts->max_touch_num,
> INPUT_MT_DIRECT | INPUT_MT_DROP_UNUSED);
> if (error) {
Hi Yajat,
On 11-Jan-26 22:30, Hans de Goede wrote:
> Hi Yajat,
>
> On 30-Dec-25 23:16, Yajat Kumar wrote:
>> The touchscreen on the SUPI S10 reports inverted Y coordinates, causing
>> touch input to be mirrored vertically relative to the display.
>>
>> Add a DMI-based quirk to invert the Y coordinate on this device so that
>> touch input matches the display orientation.
>>
>> Tested on SUPI S10 tablet with Goodix touchscreen controller.
>>
>> Signed-off-by: Yajat Kumar <yajatapps3@gmail.com>
>
> Thank you for your patch. This kind of quirks really belong
> in drivers/platform/x86/touchscreen_dmi.c instead of in individual
> touchscreen drivers.
>
> The inverted_x_screen[] DMI quirk is a left-over from before we
> moved these quirks to touchscreen_dmi.c and unfortunately we cannot
> move this because we've not been able to find someone to test this.
>
> I've attached a patch which should fix the issue using
> touchscreen_dmi.c . Note you may need to change the GDIX1001 in
> the patch to GDIX1002, see "ls /sys/bus/i2c/devices" to see which
> ACPI HID your touchscreen is using.
>
> Can you please test the attached patch ?
Can you please confirm if the attached patch works, or at
a minimum check if the touchscreen is listed as i2c-GDIX1001:*
or i2c-GDIX1002:* under /sys/bus/i2c/devices ?
Regards,
Hans
>> ---
>> drivers/input/touchscreen/goodix.c | 22 ++++++++++++++++++++++
>> 1 file changed, 22 insertions(+)
>>
>> diff --git a/drivers/input/touchscreen/goodix.c b/drivers/input/touchscreen/goodix.c
>> index f8798d11ec03..d675a85a9312 100644
>> --- a/drivers/input/touchscreen/goodix.c
>> +++ b/drivers/input/touchscreen/goodix.c
>> @@ -160,6 +160,22 @@ static const struct dmi_system_id inverted_x_screen[] = {
>> {}
>> };
>>
>> +/*
>> + * Those tablets have their y coordinate inverted
>> + */
>> +static const struct dmi_system_id inverted_y_screen[] = {
>> +#if defined(CONFIG_DMI) && defined(CONFIG_X86)
>> + {
>> + .ident = "SUPI S10",
>> + .matches = {
>> + DMI_MATCH(DMI_SYS_VENDOR, "SUPI"),
>> + DMI_MATCH(DMI_PRODUCT_NAME, "S10")
>> + },
>> + },
>> +#endif
>> + {}
>> +};
>> +
>> /**
>> * goodix_i2c_read - read data from a register of the i2c slave device.
>> *
>> @@ -1212,6 +1228,12 @@ static int goodix_configure_dev(struct goodix_ts_data *ts)
>> "Applying 'inverted x screen' quirk\n");
>> }
>>
>> + if (dmi_check_system(inverted_y_screen)) {
>> + ts->prop.invert_y = true;
>> + dev_dbg(&ts->client->dev,
>> + "Applying 'inverted y screen' quirk\n");
>> + }
>> +
>> error = input_mt_init_slots(ts->input_dev, ts->max_touch_num,
>> INPUT_MT_DIRECT | INPUT_MT_DROP_UNUSED);
>> if (error) {
Subject: Re: [PATCH] touchscreen-dmi quirk for SUPI S10
Hi Hans,
I’ve tested the attached patch on the SUPI S10.
The touchscreen uses ACPI HID GDIX1001, so no change is needed there.
With the patch applied, the Y axis is no longer inverted and touch
input now matches the display orientation correctly.
You can add:
Tested-by: Yajat Kumar <yajatapps3@gmail.com>
Thanks for the quick fix and explanation.
Regards,
Yajat Kumar
On Sun, Jan 11, 2026 at 4:30 PM Hans de Goede <hansg@kernel.org> wrote:
>
> Hi Yajat,
>
> On 30-Dec-25 23:16, Yajat Kumar wrote:
> > The touchscreen on the SUPI S10 reports inverted Y coordinates, causing
> > touch input to be mirrored vertically relative to the display.
> >
> > Add a DMI-based quirk to invert the Y coordinate on this device so that
> > touch input matches the display orientation.
> >
> > Tested on SUPI S10 tablet with Goodix touchscreen controller.
> >
> > Signed-off-by: Yajat Kumar <yajatapps3@gmail.com>
>
> Thank you for your patch. This kind of quirks really belong
> in drivers/platform/x86/touchscreen_dmi.c instead of in individual
> touchscreen drivers.
>
> The inverted_x_screen[] DMI quirk is a left-over from before we
> moved these quirks to touchscreen_dmi.c and unfortunately we cannot
> move this because we've not been able to find someone to test this.
>
> I've attached a patch which should fix the issue using
> touchscreen_dmi.c . Note you may need to change the GDIX1001 in
> the patch to GDIX1002, see "ls /sys/bus/i2c/devices" to see which
> ACPI HID your touchscreen is using.
>
> Can you please test the attached patch ?
>
> Regards,
>
> Hans
>
>
>
> > ---
> > drivers/input/touchscreen/goodix.c | 22 ++++++++++++++++++++++
> > 1 file changed, 22 insertions(+)
> >
> > diff --git a/drivers/input/touchscreen/goodix.c b/drivers/input/touchscreen/goodix.c
> > index f8798d11ec03..d675a85a9312 100644
> > --- a/drivers/input/touchscreen/goodix.c
> > +++ b/drivers/input/touchscreen/goodix.c
> > @@ -160,6 +160,22 @@ static const struct dmi_system_id inverted_x_screen[] = {
> > {}
> > };
> >
> > +/*
> > + * Those tablets have their y coordinate inverted
> > + */
> > +static const struct dmi_system_id inverted_y_screen[] = {
> > +#if defined(CONFIG_DMI) && defined(CONFIG_X86)
> > + {
> > + .ident = "SUPI S10",
> > + .matches = {
> > + DMI_MATCH(DMI_SYS_VENDOR, "SUPI"),
> > + DMI_MATCH(DMI_PRODUCT_NAME, "S10")
> > + },
> > + },
> > +#endif
> > + {}
> > +};
> > +
> > /**
> > * goodix_i2c_read - read data from a register of the i2c slave device.
> > *
> > @@ -1212,6 +1228,12 @@ static int goodix_configure_dev(struct goodix_ts_data *ts)
> > "Applying 'inverted x screen' quirk\n");
> > }
> >
> > + if (dmi_check_system(inverted_y_screen)) {
> > + ts->prop.invert_y = true;
> > + dev_dbg(&ts->client->dev,
> > + "Applying 'inverted y screen' quirk\n");
> > + }
> > +
> > error = input_mt_init_slots(ts->input_dev, ts->max_touch_num,
> > INPUT_MT_DIRECT | INPUT_MT_DROP_UNUSED);
> > if (error) {
© 2016 - 2026 Red Hat, Inc.