diff options
| author | Aurelien Jarno <aurelien@aurel32.net> | 2008-10-14 05:44:26 -0400 |
|---|---|---|
| committer | Ralf Baechle <ralf@linux-mips.org> | 2008-10-15 07:46:50 -0400 |
| commit | b06f3e19a673e44ff56ce265600c5c6eb99aa914 (patch) | |
| tree | 50ae6bf47907f1f2e71f849e0638281a2d86f80d | |
| parent | d412283cef135811e1ed6c3840376c239f4920dd (diff) | |
MIPS: BCM47xx: Use the new SSB GPIO API
This patch simplifies the BCM47xx GPIO code by using the new SSB GPIO
API, which does a lot things that were implemented directly in the
BCM47xx code.
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
| -rw-r--r-- | arch/mips/Kconfig | 1 | ||||
| -rw-r--r-- | arch/mips/bcm47xx/gpio.c | 85 | ||||
| -rw-r--r-- | arch/mips/bcm47xx/setup.c | 5 | ||||
| -rw-r--r-- | arch/mips/include/asm/mach-bcm47xx/gpio.h | 41 |
4 files changed, 58 insertions, 74 deletions
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig index cd5fbf6f0784..b905744d7915 100644 --- a/arch/mips/Kconfig +++ b/arch/mips/Kconfig | |||
| @@ -52,6 +52,7 @@ config BCM47XX | |||
| 52 | select SSB | 52 | select SSB |
| 53 | select SSB_DRIVER_MIPS | 53 | select SSB_DRIVER_MIPS |
| 54 | select SSB_DRIVER_EXTIF | 54 | select SSB_DRIVER_EXTIF |
| 55 | select SSB_EMBEDDED | ||
| 55 | select SSB_PCICORE_HOSTMODE if PCI | 56 | select SSB_PCICORE_HOSTMODE if PCI |
| 56 | select GENERIC_GPIO | 57 | select GENERIC_GPIO |
| 57 | select SYS_HAS_EARLY_PRINTK | 58 | select SYS_HAS_EARLY_PRINTK |
diff --git a/arch/mips/bcm47xx/gpio.c b/arch/mips/bcm47xx/gpio.c index f5a53acf995a..9b798800258c 100644 --- a/arch/mips/bcm47xx/gpio.c +++ b/arch/mips/bcm47xx/gpio.c | |||
| @@ -12,68 +12,51 @@ | |||
| 12 | #include <asm/mach-bcm47xx/bcm47xx.h> | 12 | #include <asm/mach-bcm47xx/bcm47xx.h> |
| 13 | #include <asm/mach-bcm47xx/gpio.h> | 13 | #include <asm/mach-bcm47xx/gpio.h> |
| 14 | 14 | ||
| 15 | int bcm47xx_gpio_to_irq(unsigned gpio) | 15 | #if (BCM47XX_CHIPCO_GPIO_LINES > BCM47XX_EXTIF_GPIO_LINES) |
| 16 | static DECLARE_BITMAP(gpio_in_use, BCM47XX_CHIPCO_GPIO_LINES); | ||
| 17 | #else | ||
| 18 | static DECLARE_BITMAP(gpio_in_use, BCM47XX_EXTIF_GPIO_LINES); | ||
| 19 | #endif | ||
| 20 | |||
| 21 | int gpio_request(unsigned gpio, const char *tag) | ||
| 16 | { | 22 | { |
| 17 | if (ssb_bcm47xx.chipco.dev) | 23 | if (ssb_chipco_available(&ssb_bcm47xx.chipco) && |
| 18 | return ssb_mips_irq(ssb_bcm47xx.chipco.dev) + 2; | 24 | ((unsigned)gpio >= BCM47XX_CHIPCO_GPIO_LINES)) |
| 19 | else if (ssb_bcm47xx.extif.dev) | ||
| 20 | return ssb_mips_irq(ssb_bcm47xx.extif.dev) + 2; | ||
| 21 | else | ||
| 22 | return -EINVAL; | 25 | return -EINVAL; |
| 23 | } | ||
| 24 | EXPORT_SYMBOL_GPL(bcm47xx_gpio_to_irq); | ||
| 25 | 26 | ||
| 26 | int bcm47xx_gpio_get_value(unsigned gpio) | 27 | if (ssb_extif_available(&ssb_bcm47xx.extif) && |
| 27 | { | 28 | ((unsigned)gpio >= BCM47XX_EXTIF_GPIO_LINES)) |
| 28 | if (ssb_bcm47xx.chipco.dev) | 29 | return -EINVAL; |
| 29 | return ssb_chipco_gpio_in(&ssb_bcm47xx.chipco, 1 << gpio); | ||
| 30 | else if (ssb_bcm47xx.extif.dev) | ||
| 31 | return ssb_extif_gpio_in(&ssb_bcm47xx.extif, 1 << gpio); | ||
| 32 | else | ||
| 33 | return 0; | ||
| 34 | } | ||
| 35 | EXPORT_SYMBOL_GPL(bcm47xx_gpio_get_value); | ||
| 36 | 30 | ||
| 37 | void bcm47xx_gpio_set_value(unsigned gpio, int value) | 31 | if (test_and_set_bit(gpio, gpio_in_use)) |
| 38 | { | 32 | return -EBUSY; |
| 39 | if (ssb_bcm47xx.chipco.dev) | ||
| 40 | ssb_chipco_gpio_out(&ssb_bcm47xx.chipco, | ||
| 41 | 1 << gpio, | ||
| 42 | value ? 1 << gpio : 0); | ||
| 43 | else if (ssb_bcm47xx.extif.dev) | ||
| 44 | ssb_extif_gpio_out(&ssb_bcm47xx.extif, | ||
| 45 | 1 << gpio, | ||
| 46 | value ? 1 << gpio : 0); | ||
| 47 | } | ||
| 48 | EXPORT_SYMBOL_GPL(bcm47xx_gpio_set_value); | ||
| 49 | 33 | ||
| 50 | int bcm47xx_gpio_direction_input(unsigned gpio) | ||
| 51 | { | ||
| 52 | if (ssb_bcm47xx.chipco.dev && (gpio < BCM47XX_CHIPCO_GPIO_LINES)) | ||
| 53 | ssb_chipco_gpio_outen(&ssb_bcm47xx.chipco, | ||
| 54 | 1 << gpio, 0); | ||
| 55 | else if (ssb_bcm47xx.extif.dev && (gpio < BCM47XX_EXTIF_GPIO_LINES)) | ||
| 56 | ssb_extif_gpio_outen(&ssb_bcm47xx.extif, | ||
| 57 | 1 << gpio, 0); | ||
| 58 | else | ||
| 59 | return -EINVAL; | ||
| 60 | return 0; | 34 | return 0; |
| 61 | } | 35 | } |
| 62 | EXPORT_SYMBOL_GPL(bcm47xx_gpio_direction_input); | 36 | EXPORT_SYMBOL(gpio_request); |
| 63 | 37 | ||
| 64 | int bcm47xx_gpio_direction_output(unsigned gpio, int value) | 38 | void gpio_free(unsigned gpio) |
| 65 | { | 39 | { |
| 66 | bcm47xx_gpio_set_value(gpio, value); | 40 | if (ssb_chipco_available(&ssb_bcm47xx.chipco) && |
| 41 | ((unsigned)gpio >= BCM47XX_CHIPCO_GPIO_LINES)) | ||
| 42 | return; | ||
| 43 | |||
| 44 | if (ssb_extif_available(&ssb_bcm47xx.extif) && | ||
| 45 | ((unsigned)gpio >= BCM47XX_EXTIF_GPIO_LINES)) | ||
| 46 | return; | ||
| 47 | |||
| 48 | clear_bit(gpio, gpio_in_use); | ||
| 49 | } | ||
| 50 | EXPORT_SYMBOL(gpio_free); | ||
| 67 | 51 | ||
| 68 | if (ssb_bcm47xx.chipco.dev && (gpio < BCM47XX_CHIPCO_GPIO_LINES)) | 52 | int gpio_to_irq(unsigned gpio) |
| 69 | ssb_chipco_gpio_outen(&ssb_bcm47xx.chipco, | 53 | { |
| 70 | 1 << gpio, 1 << gpio); | 54 | if (ssb_chipco_available(&ssb_bcm47xx.chipco)) |
| 71 | else if (ssb_bcm47xx.extif.dev && (gpio < BCM47XX_EXTIF_GPIO_LINES)) | 55 | return ssb_mips_irq(ssb_bcm47xx.chipco.dev) + 2; |
| 72 | ssb_extif_gpio_outen(&ssb_bcm47xx.extif, | 56 | else if (ssb_extif_available(&ssb_bcm47xx.extif)) |
| 73 | 1 << gpio, 1 << gpio); | 57 | return ssb_mips_irq(ssb_bcm47xx.extif.dev) + 2; |
| 74 | else | 58 | else |
| 75 | return -EINVAL; | 59 | return -EINVAL; |
| 76 | return 0; | ||
| 77 | } | 60 | } |
| 78 | EXPORT_SYMBOL_GPL(bcm47xx_gpio_direction_output); | 61 | EXPORT_SYMBOL_GPL(gpio_to_irq); |
| 79 | 62 | ||
diff --git a/arch/mips/bcm47xx/setup.c b/arch/mips/bcm47xx/setup.c index 8d36f186890e..2f580fa160c9 100644 --- a/arch/mips/bcm47xx/setup.c +++ b/arch/mips/bcm47xx/setup.c | |||
| @@ -27,6 +27,7 @@ | |||
| 27 | 27 | ||
| 28 | #include <linux/types.h> | 28 | #include <linux/types.h> |
| 29 | #include <linux/ssb/ssb.h> | 29 | #include <linux/ssb/ssb.h> |
| 30 | #include <linux/ssb/ssb_embedded.h> | ||
| 30 | #include <asm/bootinfo.h> | 31 | #include <asm/bootinfo.h> |
| 31 | #include <asm/reboot.h> | 32 | #include <asm/reboot.h> |
| 32 | #include <asm/time.h> | 33 | #include <asm/time.h> |
| @@ -41,7 +42,7 @@ static void bcm47xx_machine_restart(char *command) | |||
| 41 | printk(KERN_ALERT "Please stand by while rebooting the system...\n"); | 42 | printk(KERN_ALERT "Please stand by while rebooting the system...\n"); |
| 42 | local_irq_disable(); | 43 | local_irq_disable(); |
| 43 | /* Set the watchdog timer to reset immediately */ | 44 | /* Set the watchdog timer to reset immediately */ |
| 44 | ssb_chipco_watchdog_timer_set(&ssb_bcm47xx.chipco, 1); | 45 | ssb_watchdog_timer_set(&ssb_bcm47xx, 1); |
| 45 | while (1) | 46 | while (1) |
| 46 | cpu_relax(); | 47 | cpu_relax(); |
| 47 | } | 48 | } |
| @@ -50,7 +51,7 @@ static void bcm47xx_machine_halt(void) | |||
| 50 | { | 51 | { |
| 51 | /* Disable interrupts and watchdog and spin forever */ | 52 | /* Disable interrupts and watchdog and spin forever */ |
| 52 | local_irq_disable(); | 53 | local_irq_disable(); |
| 53 | ssb_chipco_watchdog_timer_set(&ssb_bcm47xx.chipco, 0); | 54 | ssb_watchdog_timer_set(&ssb_bcm47xx, 0); |
| 54 | while (1) | 55 | while (1) |
| 55 | cpu_relax(); | 56 | cpu_relax(); |
| 56 | } | 57 | } |
diff --git a/arch/mips/include/asm/mach-bcm47xx/gpio.h b/arch/mips/include/asm/mach-bcm47xx/gpio.h index cfc8f4d618ce..d8ff4cd89ab5 100644 --- a/arch/mips/include/asm/mach-bcm47xx/gpio.h +++ b/arch/mips/include/asm/mach-bcm47xx/gpio.h | |||
| @@ -9,47 +9,46 @@ | |||
| 9 | #ifndef __BCM47XX_GPIO_H | 9 | #ifndef __BCM47XX_GPIO_H |
| 10 | #define __BCM47XX_GPIO_H | 10 | #define __BCM47XX_GPIO_H |
| 11 | 11 | ||
| 12 | #include <linux/ssb/ssb_embedded.h> | ||
| 13 | #include <asm/mach-bcm47xx/bcm47xx.h> | ||
| 14 | |||
| 12 | #define BCM47XX_EXTIF_GPIO_LINES 5 | 15 | #define BCM47XX_EXTIF_GPIO_LINES 5 |
| 13 | #define BCM47XX_CHIPCO_GPIO_LINES 16 | 16 | #define BCM47XX_CHIPCO_GPIO_LINES 16 |
| 14 | 17 | ||
| 15 | extern int bcm47xx_gpio_to_irq(unsigned gpio); | 18 | extern int gpio_request(unsigned gpio, const char *label); |
| 16 | extern int bcm47xx_gpio_get_value(unsigned gpio); | 19 | extern void gpio_free(unsigned gpio); |
| 17 | extern void bcm47xx_gpio_set_value(unsigned gpio, int value); | 20 | extern int gpio_to_irq(unsigned gpio); |
| 18 | extern int bcm47xx_gpio_direction_input(unsigned gpio); | ||
| 19 | extern int bcm47xx_gpio_direction_output(unsigned gpio, int value); | ||
| 20 | |||
| 21 | static inline int gpio_request(unsigned gpio, const char *label) | ||
| 22 | { | ||
| 23 | return 0; | ||
| 24 | } | ||
| 25 | 21 | ||
| 26 | static inline void gpio_free(unsigned gpio) | 22 | static inline int gpio_get_value(unsigned gpio) |
| 27 | { | 23 | { |
| 24 | return ssb_gpio_in(&ssb_bcm47xx, 1 << gpio); | ||
| 28 | } | 25 | } |
| 29 | 26 | ||
| 30 | static inline int gpio_to_irq(unsigned gpio) | 27 | static inline void gpio_set_value(unsigned gpio, int value) |
| 31 | { | 28 | { |
| 32 | return bcm47xx_gpio_to_irq(gpio); | 29 | ssb_gpio_out(&ssb_bcm47xx, 1 << gpio, value ? 1 << gpio : 0); |
| 33 | } | 30 | } |
| 34 | 31 | ||
| 35 | static inline int gpio_get_value(unsigned gpio) | 32 | static inline int gpio_direction_input(unsigned gpio) |
| 36 | { | 33 | { |
| 37 | return bcm47xx_gpio_get_value(gpio); | 34 | return ssb_gpio_outen(&ssb_bcm47xx, 1 << gpio, 0); |
| 38 | } | 35 | } |
| 39 | 36 | ||
| 40 | static inline void gpio_set_value(unsigned gpio, int value) | 37 | static inline int gpio_direction_output(unsigned gpio, int value) |
| 41 | { | 38 | { |
| 42 | bcm47xx_gpio_set_value(gpio, value); | 39 | return ssb_gpio_outen(&ssb_bcm47xx, 1 << gpio, 1 << gpio); |
| 43 | } | 40 | } |
| 44 | 41 | ||
| 45 | static inline int gpio_direction_input(unsigned gpio) | 42 | static int gpio_intmask(unsigned gpio, int value) |
| 46 | { | 43 | { |
| 47 | return bcm47xx_gpio_direction_input(gpio); | 44 | return ssb_gpio_intmask(&ssb_bcm47xx, 1 << gpio, |
| 45 | value ? 1 << gpio : 0); | ||
| 48 | } | 46 | } |
| 49 | 47 | ||
| 50 | static inline int gpio_direction_output(unsigned gpio, int value) | 48 | static int gpio_polarity(unsigned gpio, int value) |
| 51 | { | 49 | { |
| 52 | return bcm47xx_gpio_direction_output(gpio, value); | 50 | return ssb_gpio_polarity(&ssb_bcm47xx, 1 << gpio, |
| 51 | value ? 1 << gpio : 0); | ||
| 53 | } | 52 | } |
| 54 | 53 | ||
| 55 | 54 | ||
