Hi Stephen,

On 10/16/2013 12:25 PM, Stephen Warren wrote:
From: Stephen Warren <[email protected]>

Whenever an IRQ is claimed or freed, call gpio_lock_as_irq() or
gpio_unlock_as_irq() on the associated GPIO, to prevent that GPIO from
being configured in a manner incompatible with an interrupt.

Signed-off-by: Stephen Warren <[email protected]>
---
  drivers/gpio/gpio-tegra.c | 18 ++++++++++++++++++
  1 file changed, 18 insertions(+)

diff --git a/drivers/gpio/gpio-tegra.c b/drivers/gpio/gpio-tegra.c
index 9a62672..cfd3b90 100644
--- a/drivers/gpio/gpio-tegra.c
+++ b/drivers/gpio/gpio-tegra.c
@@ -75,6 +75,7 @@ struct tegra_gpio_bank {
  #endif
  };

+static struct device *dev;
  static struct irq_domain *irq_domain;
  static void __iomem *regs;
  static u32 tegra_gpio_bank_count;
@@ -205,6 +206,7 @@ static int tegra_gpio_irq_set_type(struct irq_data *d, 
unsigned int type)
        int lvl_type;
        int val;
        unsigned long flags;
+       int ret;

        switch (type & IRQ_TYPE_SENSE_MASK) {
        case IRQ_TYPE_EDGE_RISING:
@@ -231,6 +233,12 @@ static int tegra_gpio_irq_set_type(struct irq_data *d, 
unsigned int type)
                return -EINVAL;
        }

+       ret = gpio_lock_as_irq(&tegra_gpio_chip, gpio);
+       if (ret) {
+               dev_err(dev, "unable to lock Tegra GPIO %d as IRQ\n", gpio);

As a suggestion, you could add a pointer to dev on tegra gpio priv data
and recover it using ira_data_get_irq_chip_data(), instead of using
static file-scope variable.

Br, David Cohen

--
To unsubscribe from this list: send the line "unsubscribe linux-gpio" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to