diff mbox series

[resend,05/10] Input: goodix - Add support for getting IRQ + reset GPIOs on Bay Trail devices

Message ID 20200221164735.508324-5-hdegoede@redhat.com (mailing list archive)
State Superseded
Headers show
Series [resend,01/10] Input: goodix - Refactor IRQ pin GPIO accesses | expand

Commit Message

Hans de Goede Feb. 21, 2020, 4:47 p.m. UTC
On most Bay Trail (x86, UEFI + ACPI) devices the ACPI tables do not have
a _DSD with a "daffd814-6eba-4d8c-8a91-bc9bbf4aa301" UUID, adding
"irq-gpios" and "reset-gpios" mappings, so we cannot get the GPIOS by name
without first manually adding mappings ourselves.

These devices contain 2 GpioIo resource in their _CRS table, on all 4 such
devices which I have access to, the order of the 2 GPIOs is reset, int.

Note that the GPIO to which the touchscreen controller irq pin is connected
is configured in direct-irq mode on these Bay Trail devices, the
pinctrl-baytrail.c driver still allows controlling the pin as a GPIO in
this case, but this is not necessarily the case on other X86 ACPI
platforms, nor do we have a guarantee that the GPIO order is the same
elsewhere, so we limit the use of a _CRS table with 2 GpioIo resources
to Bay Trail devices only.

BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1786317
BugLink: https://github.com/nexus511/gpd-ubuntu-packages/issues/10
BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=199207
Cc: Dmitry Mastykin <mastichi@gmail.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 drivers/input/touchscreen/goodix.c | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

Comments

Bastien Nocera March 2, 2020, 11:24 a.m. UTC | #1
On Fri, 2020-02-21 at 17:47 +0100, Hans de Goede wrote:
> On most Bay Trail (x86, UEFI + ACPI) devices the ACPI tables do not
> have
> a _DSD with a "daffd814-6eba-4d8c-8a91-bc9bbf4aa301" UUID, adding
> "irq-gpios" and "reset-gpios" mappings, so we cannot get the GPIOS by
> name
> without first manually adding mappings ourselves.
> 
> These devices contain 2 GpioIo resource in their _CRS table, on all 4
> such
> devices which I have access to, the order of the 2 GPIOs is reset,
> int.
> 
> Note that the GPIO to which the touchscreen controller irq pin is
> connected
> is configured in direct-irq mode on these Bay Trail devices, the
> pinctrl-baytrail.c driver still allows controlling the pin as a GPIO
> in
> this case, but this is not necessarily the case on other X86 ACPI
> platforms, nor do we have a guarantee that the GPIO order is the same
> elsewhere, so we limit the use of a _CRS table with 2 GpioIo
> resources
> to Bay Trail devices only.
> 
> BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1786317
> BugLink: https://github.com/nexus511/gpd-ubuntu-packages/issues/10
> BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=199207
> Cc: Dmitry Mastykin <mastichi@gmail.com>
> Signed-off-by: Hans de Goede <hdegoede@redhat.com>

This is gross, but...

Reviewed-by: Bastien Nocera <hadess@hadess.net>

> ---
>  drivers/input/touchscreen/goodix.c | 19 +++++++++++++++++++
>  1 file changed, 19 insertions(+)
> 
> diff --git a/drivers/input/touchscreen/goodix.c
> b/drivers/input/touchscreen/goodix.c
> index 9de2f325ac6e..d178aa33b529 100644
> --- a/drivers/input/touchscreen/goodix.c
> +++ b/drivers/input/touchscreen/goodix.c
> @@ -610,6 +610,21 @@ static int goodix_reset(struct goodix_ts_data
> *ts)
>  }
>  
>  #if defined CONFIG_X86 && defined CONFIG_ACPI
> +#include <asm/cpu_device_id.h>
> +#include <asm/intel-family.h>
> +
> +static const struct x86_cpu_id baytrail_cpu_ids[] = {
> +	{ X86_VENDOR_INTEL, 6, INTEL_FAM6_ATOM_SILVERMONT,
> X86_FEATURE_ANY, },
> +	{}
> +};
> +
> +static inline bool is_byt(void)
> +{
> +	const struct x86_cpu_id *id = x86_match_cpu(baytrail_cpu_ids);
> +
> +	return !!id;
> +}
> +
>  static const struct acpi_gpio_params first_gpio = { 0, 0, false };
>  static const struct acpi_gpio_params second_gpio = { 1, 0, false };
>  
> @@ -675,6 +690,10 @@ static int goodix_add_acpi_gpio_mappings(struct
> goodix_ts_data *ts)
>  	} else if (ts->gpio_count == 2 && ts->gpio_int_idx == 1) {
>  		ts->irq_pin_access_method = irq_pin_access_acpi_gpio;
>  		gpio_mapping = acpi_goodix_int_last_gpios;
> +	} else if (is_byt() && ts->gpio_count == 2 && ts->gpio_int_idx
> == -1) {
> +		dev_info(dev, "No ACPI GpioInt resource, assuming that
> the GPIO order is reset, int\n");
> +		ts->irq_pin_access_method = irq_pin_access_acpi_gpio;
> +		gpio_mapping = acpi_goodix_int_last_gpios;
>  	} else {
>  		dev_warn(dev, "Unexpected ACPI resources: gpio_count
> %d, gpio_int_idx %d\n",
>  			 ts->gpio_count, ts->gpio_int_idx);
diff mbox series

Patch

diff --git a/drivers/input/touchscreen/goodix.c b/drivers/input/touchscreen/goodix.c
index 9de2f325ac6e..d178aa33b529 100644
--- a/drivers/input/touchscreen/goodix.c
+++ b/drivers/input/touchscreen/goodix.c
@@ -610,6 +610,21 @@  static int goodix_reset(struct goodix_ts_data *ts)
 }
 
 #if defined CONFIG_X86 && defined CONFIG_ACPI
+#include <asm/cpu_device_id.h>
+#include <asm/intel-family.h>
+
+static const struct x86_cpu_id baytrail_cpu_ids[] = {
+	{ X86_VENDOR_INTEL, 6, INTEL_FAM6_ATOM_SILVERMONT, X86_FEATURE_ANY, },
+	{}
+};
+
+static inline bool is_byt(void)
+{
+	const struct x86_cpu_id *id = x86_match_cpu(baytrail_cpu_ids);
+
+	return !!id;
+}
+
 static const struct acpi_gpio_params first_gpio = { 0, 0, false };
 static const struct acpi_gpio_params second_gpio = { 1, 0, false };
 
@@ -675,6 +690,10 @@  static int goodix_add_acpi_gpio_mappings(struct goodix_ts_data *ts)
 	} else if (ts->gpio_count == 2 && ts->gpio_int_idx == 1) {
 		ts->irq_pin_access_method = irq_pin_access_acpi_gpio;
 		gpio_mapping = acpi_goodix_int_last_gpios;
+	} else if (is_byt() && ts->gpio_count == 2 && ts->gpio_int_idx == -1) {
+		dev_info(dev, "No ACPI GpioInt resource, assuming that the GPIO order is reset, int\n");
+		ts->irq_pin_access_method = irq_pin_access_acpi_gpio;
+		gpio_mapping = acpi_goodix_int_last_gpios;
 	} else {
 		dev_warn(dev, "Unexpected ACPI resources: gpio_count %d, gpio_int_idx %d\n",
 			 ts->gpio_count, ts->gpio_int_idx);