Merge branch 'for-linus' of git://git.open-osd.org/linux-open-osd
[pandora-kernel.git] / arch / mips / bcm47xx / gpio.c
index e4a5ee9..57b425f 100644 (file)
@@ -20,42 +20,82 @@ static DECLARE_BITMAP(gpio_in_use, BCM47XX_EXTIF_GPIO_LINES);
 
 int gpio_request(unsigned gpio, const char *tag)
 {
-       if (ssb_chipco_available(&ssb_bcm47xx.chipco) &&
-           ((unsigned)gpio >= BCM47XX_CHIPCO_GPIO_LINES))
-               return -EINVAL;
+       switch (bcm47xx_bus_type) {
+#ifdef CONFIG_BCM47XX_SSB
+       case BCM47XX_BUS_TYPE_SSB:
+               if (ssb_chipco_available(&bcm47xx_bus.ssb.chipco) &&
+                   ((unsigned)gpio >= BCM47XX_CHIPCO_GPIO_LINES))
+                       return -EINVAL;
 
-       if (ssb_extif_available(&ssb_bcm47xx.extif) &&
-           ((unsigned)gpio >= BCM47XX_EXTIF_GPIO_LINES))
-               return -EINVAL;
+               if (ssb_extif_available(&bcm47xx_bus.ssb.extif) &&
+                   ((unsigned)gpio >= BCM47XX_EXTIF_GPIO_LINES))
+                       return -EINVAL;
 
-       if (test_and_set_bit(gpio, gpio_in_use))
-               return -EBUSY;
+               if (test_and_set_bit(gpio, gpio_in_use))
+                       return -EBUSY;
 
-       return 0;
+               return 0;
+#endif
+#ifdef CONFIG_BCM47XX_BCMA
+       case BCM47XX_BUS_TYPE_BCMA:
+               if (gpio >= BCM47XX_CHIPCO_GPIO_LINES)
+                       return -EINVAL;
+
+               if (test_and_set_bit(gpio, gpio_in_use))
+                       return -EBUSY;
+
+               return 0;
+#endif
+       }
+       return -EINVAL;
 }
 EXPORT_SYMBOL(gpio_request);
 
 void gpio_free(unsigned gpio)
 {
-       if (ssb_chipco_available(&ssb_bcm47xx.chipco) &&
-           ((unsigned)gpio >= BCM47XX_CHIPCO_GPIO_LINES))
-               return;
+       switch (bcm47xx_bus_type) {
+#ifdef CONFIG_BCM47XX_SSB
+       case BCM47XX_BUS_TYPE_SSB:
+               if (ssb_chipco_available(&bcm47xx_bus.ssb.chipco) &&
+                   ((unsigned)gpio >= BCM47XX_CHIPCO_GPIO_LINES))
+                       return;
+
+               if (ssb_extif_available(&bcm47xx_bus.ssb.extif) &&
+                   ((unsigned)gpio >= BCM47XX_EXTIF_GPIO_LINES))
+                       return;
 
-       if (ssb_extif_available(&ssb_bcm47xx.extif) &&
-           ((unsigned)gpio >= BCM47XX_EXTIF_GPIO_LINES))
+               clear_bit(gpio, gpio_in_use);
                return;
+#endif
+#ifdef CONFIG_BCM47XX_BCMA
+       case BCM47XX_BUS_TYPE_BCMA:
+               if (gpio >= BCM47XX_CHIPCO_GPIO_LINES)
+                       return;
 
-       clear_bit(gpio, gpio_in_use);
+               clear_bit(gpio, gpio_in_use);
+               return;
+#endif
+       }
 }
 EXPORT_SYMBOL(gpio_free);
 
 int gpio_to_irq(unsigned gpio)
 {
-       if (ssb_chipco_available(&ssb_bcm47xx.chipco))
-               return ssb_mips_irq(ssb_bcm47xx.chipco.dev) + 2;
-       else if (ssb_extif_available(&ssb_bcm47xx.extif))
-               return ssb_mips_irq(ssb_bcm47xx.extif.dev) + 2;
-       else
-               return -EINVAL;
+       switch (bcm47xx_bus_type) {
+#ifdef CONFIG_BCM47XX_SSB
+       case BCM47XX_BUS_TYPE_SSB:
+               if (ssb_chipco_available(&bcm47xx_bus.ssb.chipco))
+                       return ssb_mips_irq(bcm47xx_bus.ssb.chipco.dev) + 2;
+               else if (ssb_extif_available(&bcm47xx_bus.ssb.extif))
+                       return ssb_mips_irq(bcm47xx_bus.ssb.extif.dev) + 2;
+               else
+                       return -EINVAL;
+#endif
+#ifdef CONFIG_BCM47XX_BCMA
+       case BCM47XX_BUS_TYPE_BCMA:
+               return bcma_core_mips_irq(bcm47xx_bus.bcma.bus.drv_cc.core) + 2;
+#endif
+       }
+       return -EINVAL;
 }
 EXPORT_SYMBOL_GPL(gpio_to_irq);