gpio: pca953x: Drop unneeded ACPI_PTR()
PATCH v4 1/2 gpio: pca953x: Drop unneeded ACPI_PTR()
ACPI_PTR() becomes a no-op when !CONFIG_ACPI. This is not needed since we always have ID table enabled. Moreover, in the mentioned case compiler will complain about defined but not used variable.
---
v4: reincluded to the series since had not been applied yet
drivers/gpio/gpio-pca953x.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpio/gpio-pca953x.c +1 -1
@@ -1176,7 +1176,7 @@ static struct i2c_driver pca953x_driver = { .name = "pca953x", .pm = &pca953x_pm_ops, .of_match_table = pca953x_dt_ids, - .acpi_match_table = ACPI_PTR(pca953x_acpi_ids), + .acpi_match_table = pca953x_acpi_ids, }, .probe = pca953x_probe, .remove = pca953x_remove,
Signature · 1 line
2.26.2
PATCH v4 2/2 gpio: pca953x: Override IRQ for one of the expanders on Galileo Gen 2
ACPI table on Intel Galileo Gen 2 has wrong pin number for IRQ resource of one of the I²C GPIO expanders. Since we know what that number is and luckily have GPIO bases fixed for SoC's controllers, we may use a simple DMI quirk to match the platform and retrieve GpioInt() pin on it for the expander in question.
---
v4: addressed some concerns, made code compact (Mika)
drivers/gpio/gpio-pca953x.c | 79 +++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+)
drivers/gpio/gpio-pca953x.c +79 -0
@@ -107,6 +107,79 @@ static const struct i2c_device_id pca953x_id[] = { };MODULE_DEVICE_TABLE (i2c, pca953x_id); +#ifdef CONFIG_GPIO_PCA953X_IRQ + +#include <linux/dmi.h> +#include <linux/gpio.h> +#include <linux/list.h> + +static const struct dmi_system_id pca953x_dmi_acpi_irq_info[] = { + { +/* +* On Intel Galileo Gen 2 board the IRQ pin of one of +* the I²C GPIO expanders, which has GpioInt() resource, +* is provided as an absolute number instead of being +* relative. Since first controller (gpio-sch.c) and +* second (gpio-dwapb.c) are at the fixed bases, we may +* safely refer to the number in the global space to get +* an IRQ out of it. +*/ + .matches = { +DMI_EXACT_MATCH (DMI_BOARD_NAME ,"GalileoGen2" ), + }, + }, + {} +}; + +#ifdef CONFIG_ACPI +static int pca953x_acpi_get_pin (struct acpi_resource *ares,void *data) +{ +struct acpi_resource_gpio *agpio; +int *pin = data; + +if (acpi_gpio_get_irq_resource (ares, &agpio)) + *pin = agpio->pin_table[0 ]; +return 1 ; +} + +static int pca953x_acpi_find_pin (struct device *dev) +{ +struct acpi_device *adev =ACPI_COMPANION (dev); +int pin = -ENOENT , ret; +LIST_HEAD (r); + + ret =acpi_dev_get_resources (adev, &r, pca953x_acpi_get_pin, &pin); +acpi_dev_free_resource_list (&r); +if (ret <0 ) +return ret; + +return pin; +} +#else +static inline int pca953x_acpi_find_pin (struct device *dev) {return -ENXIO ; } +#endif + +static int pca953x_acpi_get_irq (struct device *dev) +{ +int pin, ret; + + pin =pca953x_acpi_find_pin (dev); +if (pin <0 ) +return pin; + +dev_info (dev,"Applying ACPI interrupt quirk (GPIO %d)\n" , pin); + +if (!gpio_is_valid (pin)) +return -EINVAL ; + + ret =gpio_request (pin,"pca953x interrupt" ); +if (ret) +return ret; + +return gpio_to_irq (pin); +} +#endif +static const struct acpi_device_id pca953x_acpi_ids[] = { {"INT3491" ,16 |PCA953X_TYPE |PCA_LATCH_INT , }, { }
@@ -752,6 +825,12 @@ static int pca953x_irq_setup(struct pca953x_chip *chip, int irq_base)DECLARE_BITMAP (irq_stat,MAX_LINE );int ret; +if (dmi_first_match (pca953x_dmi_acpi_irq_info)) { + ret =pca953x_acpi_get_irq (&client->dev); +if (ret >0 ) + client->irq = ret; + } +if (!client->irq)return 0 ;
Signature · 1 line
2.26.2
Re: [PATCH v4 2/2] gpio: pca953x: Override IRQ for one of the expanders on Galileo Gen 2
Quoted 7 lines · Andy Shevchenko
ACPI table on Intel Galileo Gen 2 has wrong pin number for IRQ resource of one of the I²C GPIO expanders. Since we know what that number is and luckily have GPIO bases fixed for SoC's controllers, we may use a simple DMI quirk to match the platform and retrieve
GpioInt()pin on it for the expander in question.Suggested-by Mika Westerberg <[email protected]>
I don't think this is needed since I did not suggest you to write this patch. I only gave a couple of review comments.
Quoted 1 line
Signed-off-by Andy Shevchenko <[email protected]>
Re: [PATCH v4 2/2] gpio: pca953x: Override IRQ for one of the expanders on Galileo Gen 2
Quoted 11 lines · Mika Westerberg
Quoted 7 lines · Andy Shevchenko
ACPI table on Intel Galileo Gen 2 has wrong pin number for IRQ resource of one of the I²C GPIO expanders. Since we know what that number is and luckily have GPIO bases fixed for SoC's controllers, we may use a simple DMI quirk to match the platform and retrieve
GpioInt()pin on it for the expander in question.Suggested-by Mika Westerberg <[email protected]>I don't think this is needed since I did not suggest you to write this patch. I only gave a couple of review comments.
You suggested the way to avoid a quirk which brings us to almost rewritten version of this. I think it's appropriate to put your tag, but if you insist, I'll remove it.
Quoted 3 lines
Quoted 1 line
Signed-off-by Andy Shevchenko <[email protected]>Reviewed-by Mika Westerberg <[email protected]>
Thank you!
Signature · 2 lines
With Best Regards, Andy Shevchenko
Re: [PATCH v4 2/2] gpio: pca953x: Override IRQ for one of the expanders on Galileo Gen 2
In reply to Andy ShevchenkoQuoted 5 lines · Andy Shevchenko
ACPI table on Intel Galileo Gen 2 has wrong pin number for IRQ resource of one of the I²C GPIO expanders. Since we know what that number is and luckily have GPIO bases fixed for SoC's controllers, we may use a simple DMI quirk to match the platform and retrieve
GpioInt()pin on it for the expander in question.
Since patch 1 from this series has been applied and I fixed few more bugs I sent recently the series of four fixes with this one included as v1.
So, please, consider that one instead. I also applied Mika's tag.
Signature · 2 lines
With Best Regards, Andy Shevchenko