From: Mika Westerberg <mika.westerberg@linux.intel.com>
To: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: linux-gpio@vger.kernel.org,
Linus Walleij <linus.walleij@linaro.org>,
Bartosz Golaszewski <bgolaszewski@baylibre.com>
Subject: Re: [PATCH v2] gpio: pca953x: Override IRQ for one of the expanders on Galileo Gen 2
Date: Tue, 26 May 2020 08:31:01 +0300 [thread overview]
Message-ID: <20200526053101.GD247495@lahna.fi.intel.com> (raw)
In-Reply-To: <20200525190845.60959-1-andriy.shevchenko@linux.intel.com>
On Mon, May 25, 2020 at 10:08:45PM +0300, Andy Shevchenko wrote:
> 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 <mika.westerberg@linux.intel.com>
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> ---
> v2: did everything in the driver (Mika)
> drivers/gpio/gpio-pca953x.c | 65 +++++++++++++++++++++++++++++++++++++
> 1 file changed, 65 insertions(+)
>
> diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c
> index 1fca8dd7824f..0d30f19782a2 100644
> --- a/drivers/gpio/gpio-pca953x.c
> +++ b/drivers/gpio/gpio-pca953x.c
> @@ -10,6 +10,7 @@
>
> #include <linux/acpi.h>
> #include <linux/bitmap.h>
> +#include <linux/dmi.h>
> #include <linux/gpio/driver.h>
> #include <linux/gpio/consumer.h>
> #include <linux/i2c.h>
> @@ -107,6 +108,62 @@ static const struct i2c_device_id pca953x_id[] = {
> };
> MODULE_DEVICE_TABLE(i2c, pca953x_id);
>
> +#ifdef CONFIG_GPIO_PCA953X_IRQ
> +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 acpi_status 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))
> + return AE_OK;
> +
> + *pin = agpio->pin_table[0];
> + return AE_CTRL_TERMINATE;
> +}
> +
> +static int pca953x_acpi_find_pin(acpi_handle handle)
> +{
> + int p = -ENOENT;
> +
> + acpi_walk_resources(handle, METHOD_NAME__CRS, pca953x_acpi_get_pin, &p);
> + return p;
> +}
> +#else
> +static inline int pca953x_acpi_find_pin(acpi_handle handle) { return -ENXIO; }
> +#endif
> +
> +static int pca953x_acpi_get_irq(struct device *dev)
> +{
> + int pin;
> +
> + pin = pca953x_acpi_find_pin(ACPI_HANDLE(dev));
> + if (pin < 0)
> + return pin;
> +
> + dev_info(dev, "Applying ACPI interrupt quirk (GPIO %d)\n", pin);
> + return gpiod_to_irq(gpio_to_desc(pin));
You need to request the GPIO as well, I missed that from my example.
Sorry about that.
Otherwise looks good.
next prev parent reply other threads:[~2020-05-26 5:31 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-05-25 19:08 [PATCH v2] gpio: pca953x: Override IRQ for one of the expanders on Galileo Gen 2 Andy Shevchenko
2020-05-26 5:31 ` Mika Westerberg [this message]
2020-05-26 13:11 ` Andy Shevchenko
2020-05-26 13:34 ` Mika Westerberg
2020-05-27 5:43 ` Linus Walleij
2020-05-27 9:10 ` Andy Shevchenko
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200526053101.GD247495@lahna.fi.intel.com \
--to=mika.westerberg@linux.intel.com \
--cc=andriy.shevchenko@linux.intel.com \
--cc=bgolaszewski@baylibre.com \
--cc=linus.walleij@linaro.org \
--cc=linux-gpio@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.