|
@@ -59,6 +59,7 @@
|
|
|
#define BANK_OFF(n) (((n) < 3) ? (n) << 2 : 0x100 + (((n) - 3) << 2))
|
|
|
|
|
|
int pxa_last_gpio;
|
|
|
+static int irq_base;
|
|
|
|
|
|
#ifdef CONFIG_OF
|
|
|
static struct irq_domain *domain;
|
|
@@ -166,63 +167,14 @@ static inline int __gpio_is_occupied(unsigned gpio)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-#ifdef CONFIG_ARCH_PXA
|
|
|
-static inline int __pxa_gpio_to_irq(int gpio)
|
|
|
-{
|
|
|
- if (gpio_is_pxa_type(gpio_type))
|
|
|
- return PXA_GPIO_TO_IRQ(gpio);
|
|
|
- return -1;
|
|
|
-}
|
|
|
-
|
|
|
-static inline int __pxa_irq_to_gpio(int irq)
|
|
|
-{
|
|
|
- if (gpio_is_pxa_type(gpio_type))
|
|
|
- return irq - PXA_GPIO_TO_IRQ(0);
|
|
|
- return -1;
|
|
|
-}
|
|
|
-#else
|
|
|
-static inline int __pxa_gpio_to_irq(int gpio) { return -1; }
|
|
|
-static inline int __pxa_irq_to_gpio(int irq) { return -1; }
|
|
|
-#endif
|
|
|
-
|
|
|
-#ifdef CONFIG_ARCH_MMP
|
|
|
-static inline int __mmp_gpio_to_irq(int gpio)
|
|
|
-{
|
|
|
- if (gpio_is_mmp_type(gpio_type))
|
|
|
- return MMP_GPIO_TO_IRQ(gpio);
|
|
|
- return -1;
|
|
|
-}
|
|
|
-
|
|
|
-static inline int __mmp_irq_to_gpio(int irq)
|
|
|
-{
|
|
|
- if (gpio_is_mmp_type(gpio_type))
|
|
|
- return irq - MMP_GPIO_TO_IRQ(0);
|
|
|
- return -1;
|
|
|
-}
|
|
|
-#else
|
|
|
-static inline int __mmp_gpio_to_irq(int gpio) { return -1; }
|
|
|
-static inline int __mmp_irq_to_gpio(int irq) { return -1; }
|
|
|
-#endif
|
|
|
-
|
|
|
static int pxa_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
|
|
|
{
|
|
|
- int gpio, ret;
|
|
|
-
|
|
|
- gpio = chip->base + offset;
|
|
|
- ret = __pxa_gpio_to_irq(gpio);
|
|
|
- if (ret >= 0)
|
|
|
- return ret;
|
|
|
- return __mmp_gpio_to_irq(gpio);
|
|
|
+ return chip->base + offset + irq_base;
|
|
|
}
|
|
|
|
|
|
int pxa_irq_to_gpio(int irq)
|
|
|
{
|
|
|
- int ret;
|
|
|
-
|
|
|
- ret = __pxa_irq_to_gpio(irq);
|
|
|
- if (ret >= 0)
|
|
|
- return ret;
|
|
|
- return __mmp_irq_to_gpio(irq);
|
|
|
+ return irq - irq_base;
|
|
|
}
|
|
|
|
|
|
static int pxa_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
|
|
@@ -510,7 +462,7 @@ const struct irq_domain_ops pxa_irq_domain_ops = {
|
|
|
#ifdef CONFIG_OF
|
|
|
static int __devinit pxa_gpio_probe_dt(struct platform_device *pdev)
|
|
|
{
|
|
|
- int ret, nr_banks, nr_gpios, irq_base;
|
|
|
+ int ret, nr_banks, nr_gpios;
|
|
|
struct device_node *prev, *next, *np = pdev->dev.of_node;
|
|
|
const struct of_device_id *of_id =
|
|
|
of_match_device(pxa_gpio_dt_ids, &pdev->dev);
|
|
@@ -564,10 +516,20 @@ static int __devinit pxa_gpio_probe(struct platform_device *pdev)
|
|
|
int irq0 = 0, irq1 = 0, irq_mux, gpio_offset = 0;
|
|
|
|
|
|
ret = pxa_gpio_probe_dt(pdev);
|
|
|
- if (ret < 0)
|
|
|
+ if (ret < 0) {
|
|
|
pxa_last_gpio = pxa_gpio_nums();
|
|
|
- else
|
|
|
+#ifdef CONFIG_ARCH_PXA
|
|
|
+ if (gpio_is_pxa_type(gpio_type))
|
|
|
+ irq_base = PXA_GPIO_TO_IRQ(0);
|
|
|
+#endif
|
|
|
+#ifdef CONFIG_ARCH_MMP
|
|
|
+ if (gpio_is_mmp_type(gpio_type))
|
|
|
+ irq_base = MMP_GPIO_TO_IRQ(0);
|
|
|
+#endif
|
|
|
+ } else {
|
|
|
use_of = 1;
|
|
|
+ }
|
|
|
+
|
|
|
if (!pxa_last_gpio)
|
|
|
return -EINVAL;
|
|
|
|