Commit a007b709 authored by David Brownell's avatar David Brownell Committed by Tony Lindgren

ARM: OMAP: gpios implement new to_irq()

Make OMAP use the new __gpio_to_irq() hook, to make it easier to
support IRQs coming in from off-chip gpio controllers like the
TWL4030/TPS65930 chip used on OMAP3 boads like Beagleboard.org and
the Gumstix Overo.
Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
parent 21c867f1
...@@ -1285,6 +1285,14 @@ static void gpio_set(struct gpio_chip *chip, unsigned offset, int value) ...@@ -1285,6 +1285,14 @@ static void gpio_set(struct gpio_chip *chip, unsigned offset, int value)
spin_unlock_irqrestore(&bank->lock, flags); spin_unlock_irqrestore(&bank->lock, flags);
} }
static int gpio_2irq(struct gpio_chip *chip, unsigned offset)
{
struct gpio_bank *bank;
bank = container_of(chip, struct gpio_bank, chip);
return bank->virtual_irq_start + offset;
}
/*---------------------------------------------------------------------*/ /*---------------------------------------------------------------------*/
static int initialized; static int initialized;
...@@ -1480,6 +1488,7 @@ static int __init _omap_gpio_init(void) ...@@ -1480,6 +1488,7 @@ static int __init _omap_gpio_init(void)
bank->chip.get = gpio_get; bank->chip.get = gpio_get;
bank->chip.direction_output = gpio_output; bank->chip.direction_output = gpio_output;
bank->chip.set = gpio_set; bank->chip.set = gpio_set;
bank->chip.to_irq = gpio_2irq;
if (bank_is_mpuio(bank)) { if (bank_is_mpuio(bank)) {
bank->chip.label = "mpuio"; bank->chip.label = "mpuio";
#ifdef CONFIG_ARCH_OMAP16XX #ifdef CONFIG_ARCH_OMAP16XX
......
...@@ -109,16 +109,24 @@ static inline int gpio_cansleep(unsigned gpio) ...@@ -109,16 +109,24 @@ static inline int gpio_cansleep(unsigned gpio)
static inline int gpio_to_irq(unsigned gpio) static inline int gpio_to_irq(unsigned gpio)
{ {
if (gpio < (OMAP_MAX_GPIO_LINES + 16)) return __gpio_to_irq(gpio);
return OMAP_GPIO_IRQ(gpio);
return -EINVAL;
} }
static inline int irq_to_gpio(unsigned irq) static inline int irq_to_gpio(unsigned irq)
{ {
int tmp;
/* omap1 SOC mpuio */
if (cpu_class_is_omap1() && (irq < (IH_MPUIO_BASE + 16))) if (cpu_class_is_omap1() && (irq < (IH_MPUIO_BASE + 16)))
return (irq - IH_MPUIO_BASE) + OMAP_MAX_GPIO_LINES; return (irq - IH_MPUIO_BASE) + OMAP_MAX_GPIO_LINES;
return irq - IH_GPIO_BASE;
/* SOC gpio */
tmp = irq - IH_GPIO_BASE;
if (tmp < OMAP_MAX_GPIO_LINES)
return tmp;
/* we don't supply reverse mappings for non-SOC gpios */
return -EIO;
} }
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment