select BOOT_RAW
select CEVT_R4K
select CSRC_R4K
-@@ -100,7 +101,6 @@ config BCM47XX
- select IRQ_CPU
+@@ -101,7 +102,6 @@ config BCM47XX
+ select NO_EXCEPT_FILL
select SYS_SUPPORTS_32BIT_KERNEL
select SYS_SUPPORTS_LITTLE_ENDIAN
- select GENERIC_GPIO
Support for BCM47XX based boards
--- a/arch/mips/bcm47xx/gpio.c
+++ b/arch/mips/bcm47xx/gpio.c
-@@ -4,81 +4,198 @@
+@@ -4,83 +4,154 @@
* for more details.
*
* Copyright (C) 2007 Aurelien Jarno <aurelien@aurel32.net>
-#include <asm/mach-bcm47xx/gpio.h>
+#include <linux/ssb/ssb_embedded.h>
+#include <linux/bcma/bcma.h>
-+#include <linux/bcma/bcma_driver_gpio.h>
+
+#include <bcm47xx.h>
- 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;
+-
+- return 0;
+ return ssb_gpio_in(&bcm47xx_bus.ssb, mask);
-+#endif
-+#ifdef CONFIG_BCM47XX_BCMA
-+ case BCM47XX_BUS_TYPE_BCMA:
-+ return bcma_gpio_in(&bcm47xx_bus.bcma.bus, mask);
+ #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 bcma_chipco_gpio_in(&bcm47xx_bus.bcma.bus.drv_cc, mask);
+#endif
+ }
+ return -EINVAL;
+}
+EXPORT_SYMBOL(bcm47xx_gpio_in);
-- if (test_and_set_bit(gpio, gpio_in_use))
-- return -EBUSY;
+- return 0;
+u32 bcm47xx_gpio_out(u32 mask, u32 value)
+{
+ switch (bcm47xx_bus_type) {
+#endif
+#ifdef CONFIG_BCM47XX_BCMA
+ case BCM47XX_BUS_TYPE_BCMA:
-+ return bcma_gpio_out(&bcm47xx_bus.bcma.bus, mask, value);
-+#endif
-+ }
-+ return -EINVAL;
-+}
++ return bcma_chipco_gpio_out(&bcm47xx_bus.bcma.bus.drv_cc, mask,
++ value);
+ #endif
+ }
+ return -EINVAL;
+ }
+-EXPORT_SYMBOL(gpio_request);
+EXPORT_SYMBOL(bcm47xx_gpio_out);
-- return 0;
+-void gpio_free(unsigned gpio)
+u32 bcm47xx_gpio_outen(u32 mask, u32 value)
-+{
-+ switch (bcm47xx_bus_type) {
-+#ifdef CONFIG_BCM47XX_SSB
-+ case BCM47XX_BUS_TYPE_SSB:
+ {
+ 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;
+ return ssb_gpio_outen(&bcm47xx_bus.ssb, mask, value);
- #endif
- #ifdef CONFIG_BCM47XX_BCMA
- case BCM47XX_BUS_TYPE_BCMA:
-- if (gpio >= BCM47XX_CHIPCO_GPIO_LINES)
-- return -EINVAL;
-+ return bcma_gpio_outen(&bcm47xx_bus.bcma.bus, mask, value);
++#endif
++#ifdef CONFIG_BCM47XX_BCMA
++ case BCM47XX_BUS_TYPE_BCMA:
++ return bcma_chipco_gpio_outen(&bcm47xx_bus.bcma.bus.drv_cc,
++ mask, value);
+#endif
+ }
+ return -EINVAL;
+}
+EXPORT_SYMBOL(bcm47xx_gpio_outen);
-- if (test_and_set_bit(gpio, gpio_in_use))
-- return -EBUSY;
+- if (ssb_extif_available(&bcm47xx_bus.ssb.extif) &&
+- ((unsigned)gpio >= BCM47XX_EXTIF_GPIO_LINES))
+- return;
+u32 bcm47xx_gpio_control(u32 mask, u32 value)
+{
+ switch (bcm47xx_bus_type) {
+#endif
+#ifdef CONFIG_BCM47XX_BCMA
+ case BCM47XX_BUS_TYPE_BCMA:
-+ return bcma_gpio_control(&bcm47xx_bus.bcma.bus, mask, value);
++ return bcma_chipco_gpio_control(&bcm47xx_bus.bcma.bus.drv_cc,
++ mask, value);
+#endif
+ }
+ return -EINVAL;
+}
+EXPORT_SYMBOL(bcm47xx_gpio_control);
-- return 0;
+- clear_bit(gpio, gpio_in_use);
+- return;
+u32 bcm47xx_gpio_intmask(u32 mask, u32 value)
+{
+ switch (bcm47xx_bus_type) {
+#ifdef CONFIG_BCM47XX_SSB
+ case BCM47XX_BUS_TYPE_SSB:
+ return ssb_gpio_intmask(&bcm47xx_bus.ssb, mask, value);
-+#endif
-+#ifdef CONFIG_BCM47XX_BCMA
-+ case BCM47XX_BUS_TYPE_BCMA:
-+ return bcma_gpio_intmask(&bcm47xx_bus.bcma.bus, mask, value);
#endif
- }
- return -EINVAL;
- }
--EXPORT_SYMBOL(gpio_request);
+ #ifdef CONFIG_BCM47XX_BCMA
+ case BCM47XX_BUS_TYPE_BCMA:
+- if (gpio >= BCM47XX_CHIPCO_GPIO_LINES)
+- return;
++ return bcma_chipco_gpio_intmask(&bcm47xx_bus.bcma.bus.drv_cc,
++ mask, value);
++#endif
++ }
++ return -EINVAL;
++}
+EXPORT_SYMBOL(bcm47xx_gpio_intmask);
--void gpio_free(unsigned gpio)
+- clear_bit(gpio, gpio_in_use);
+- return;
+u32 bcm47xx_gpio_polarity(u32 mask, u32 value)
- {
- 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;
++{
++ switch (bcm47xx_bus_type) {
++#ifdef CONFIG_BCM47XX_SSB
++ case BCM47XX_BUS_TYPE_SSB:
+ return ssb_gpio_polarity(&bcm47xx_bus.ssb, mask, value);
+#endif
+#ifdef CONFIG_BCM47XX_BCMA
+ case BCM47XX_BUS_TYPE_BCMA:
-+ return bcma_gpio_polarity(&bcm47xx_bus.bcma.bus, mask, value);
-+#endif
-+ }
++ return bcma_chipco_gpio_polarity(&bcm47xx_bus.bcma.bus.drv_cc,
++ mask, value);
+ #endif
+ }
+ return -EINVAL;
+}
+EXPORT_SYMBOL(bcm47xx_gpio_polarity);
+
+
-+
+static int bcm47xx_gpio_get_value(struct gpio_chip *chip, unsigned gpio)
+{
+ return bcm47xx_gpio_in(1 << gpio);
+ /* then set the gpio mode */
+ bcm47xx_gpio_outen(1 << gpio, 1 << gpio);
+ return 0;
-+}
+ }
+-EXPORT_SYMBOL(gpio_free);
+
+-int gpio_to_irq(unsigned gpio)
++static int bcm47xx_gpio_to_irq(struct gpio_chip *chip, unsigned gpio)
+ {
+ switch (bcm47xx_bus_type) {
+ #ifdef CONFIG_BCM47XX_SSB
+@@ -99,4 +170,55 @@ int gpio_to_irq(unsigned gpio)
+ }
+ return -EINVAL;
+ }
+-EXPORT_SYMBOL_GPL(gpio_to_irq);
+
+static struct gpio_chip bcm47xx_gpio_chip = {
+ .label = "bcm47xx",
+ .set = bcm47xx_gpio_set_value,
+ .direction_input = bcm47xx_gpio_direction_input,
+ .direction_output = bcm47xx_gpio_direction_output,
++ .to_irq = bcm47xx_gpio_to_irq,
+ .base = 0,
+};
-
-- if (ssb_extif_available(&bcm47xx_bus.ssb.extif) &&
-- ((unsigned)gpio >= BCM47XX_EXTIF_GPIO_LINES))
-- return;
++
+void __init bcm47xx_gpio_init(void)
+{
+ int err;
-
-- clear_bit(gpio, gpio_in_use);
-- return;
++
+ switch (bcm47xx_bus_type) {
+#ifdef CONFIG_BCM47XX_SSB
+ case BCM47XX_BUS_TYPE_SSB:
+ bcm47xx_gpio_count = ssb_gpio_count(&bcm47xx_bus.ssb);
- #endif
- #ifdef CONFIG_BCM47XX_BCMA
- case BCM47XX_BUS_TYPE_BCMA:
-- if (gpio >= BCM47XX_CHIPCO_GPIO_LINES)
-- return;
--
-- clear_bit(gpio, gpio_in_use);
-- return;
-+ bcm47xx_gpio_count = bcma_gpio_count(&bcm47xx_bus.bcma.bus);
- #endif
- }
++ break;
++#endif
++#ifdef CONFIG_BCM47XX_BCMA
++ case BCM47XX_BUS_TYPE_BCMA:
++ bcm47xx_gpio_count = bcma_chipco_gpio_count();
++ break;
++#endif
++ }
+
+ bcm47xx_gpio_chip.ngpio = bcm47xx_gpio_count;
+
+ err = gpiochip_add(&bcm47xx_gpio_chip);
+ if (err)
+ panic("cannot add BCM47xx GPIO chip, error=%d", err);
- }
--EXPORT_SYMBOL(gpio_free);
++}
+
+int gpio_get_value(unsigned gpio)
+{
+ __gpio_set_value(gpio, value);
+}
+EXPORT_SYMBOL(gpio_set_value);
-
- int gpio_to_irq(unsigned gpio)
- {
-@@ -99,4 +216,11 @@ int gpio_to_irq(unsigned gpio)
- }
- return -EINVAL;
- }
--EXPORT_SYMBOL_GPL(gpio_to_irq);
-+EXPORT_SYMBOL(gpio_to_irq);
-+
-+int irq_to_gpio(unsigned irq)
-+{
-+ /* FIXME */
-+ return -EINVAL;
-+}
-+EXPORT_SYMBOL(irq_to_gpio);
--- a/arch/mips/bcm47xx/setup.c
+++ b/arch/mips/bcm47xx/setup.c
-@@ -344,6 +344,8 @@ void __init plat_mem_setup(void)
+@@ -252,6 +252,8 @@ void __init plat_mem_setup(void)
_machine_restart = bcm47xx_machine_restart;
_machine_halt = bcm47xx_machine_halt;
pm_power_off = bcm47xx_machine_halt;
+ err = gpio_request(WGT634U_GPIO_RESET, "reset-buton");
+ if (err) {
-+ printk(KERN_INFO "Can not register gpio fir reset button\n");
++ printk(KERN_INFO "Can not register gpio for reset button\n");
+ return 0;
+ }
+
if (!request_irq(gpio_to_irq(WGT634U_GPIO_RESET),
gpio_interrupt, IRQF_SHARED,
- "WGT634U GPIO", ccore)) {
+ "WGT634U GPIO", &bcm47xx_bus.ssb.chipco)) {
--- a/arch/mips/include/asm/mach-bcm47xx/bcm47xx.h
+++ b/arch/mips/include/asm/mach-bcm47xx/bcm47xx.h
@@ -56,4 +56,6 @@ void bcm47xx_fill_bcma_boardinfo(struct
#endif /* __ASM_BCM47XX_H */
--- a/arch/mips/include/asm/mach-bcm47xx/gpio.h
+++ b/arch/mips/include/asm/mach-bcm47xx/gpio.h
-@@ -4,152 +4,39 @@
+@@ -4,152 +4,42 @@
* for more details.
*
* Copyright (C) 2007 Aurelien Jarno <aurelien@aurel32.net>
-extern int gpio_request(unsigned gpio, const char *label);
-extern void gpio_free(unsigned gpio);
-extern int gpio_to_irq(unsigned gpio);
-+#define ARCH_NR_GPIOS 64
-+#include <asm-generic/gpio.h>
-
+-
-static inline int gpio_get_value(unsigned gpio)
-{
- switch (bcm47xx_bus_type) {
-{
- return 0;
-}
+-
+-static inline int gpio_is_valid(unsigned gpio)
+-{
+- return gpio < (BCM47XX_EXTIF_GPIO_LINES + BCM47XX_CHIPCO_GPIO_LINES);
+-}
++#define ARCH_NR_GPIOS 64
++#include <asm-generic/gpio.h>
+
+/* low level BCM47xx gpio api */
+u32 bcm47xx_gpio_in(u32 mask);
+u32 bcm47xx_gpio_out(u32 mask, u32 value);
+u32 bcm47xx_gpio_intmask(u32 mask, u32 value);
+u32 bcm47xx_gpio_polarity(u32 mask, u32 value);
--static inline int gpio_is_valid(unsigned gpio)
--{
-- return gpio < (BCM47XX_EXTIF_GPIO_LINES + BCM47XX_CHIPCO_GPIO_LINES);
--}
-+int gpio_to_irq(unsigned gpio);
-+int irq_to_gpio(unsigned irq);
-+int gpio_get_value(unsigned gpio);
-+void gpio_set_value(unsigned gpio, int value);
-
--
-static inline int gpio_direction_input(unsigned gpio)
-+static inline void gpio_intmask(unsigned gpio, int value)
- {
+-{
- switch (bcm47xx_bus_type) {
-#ifdef CONFIG_BCM47XX_SSB
- case BCM47XX_BUS_TYPE_SSB:
-#endif
- }
- return -EINVAL;
-+ bcm47xx_gpio_intmask(1 << gpio, value ? 1 << gpio : 0);
- }
+-}
++int gpio_get_value(unsigned gpio);
++void gpio_set_value(unsigned gpio, int value);
-static inline int gpio_direction_output(unsigned gpio, int value)
-+static inline void gpio_polarity(unsigned gpio, int value)
++static inline void gpio_intmask(unsigned gpio, int value)
{
- switch (bcm47xx_bus_type) {
-#ifdef CONFIG_BCM47XX_SSB
-#endif
- }
- return -EINVAL;
-+ bcm47xx_gpio_polarity(1 << gpio, value ? 1 << gpio : 0);
++ bcm47xx_gpio_intmask(1 << gpio, value ? 1 << gpio : 0);
}
-static inline int gpio_intmask(unsigned gpio, int value)
--{
++static inline void gpio_polarity(unsigned gpio, int value)
+ {
- switch (bcm47xx_bus_type) {
-#ifdef CONFIG_BCM47XX_SSB
- case BCM47XX_BUS_TYPE_SSB:
-#endif
- }
- return -EINVAL;
--}
--
++ bcm47xx_gpio_polarity(1 << gpio, value ? 1 << gpio : 0);
+ }
+
-static inline int gpio_polarity(unsigned gpio, int value)
--{
++static inline int irq_to_gpio(int gpio)
+ {
- switch (bcm47xx_bus_type) {
-#ifdef CONFIG_BCM47XX_SSB
- case BCM47XX_BUS_TYPE_SSB:
- return 0;
-#endif
- }
-- return -EINVAL;
--}
+ return -EINVAL;
+ }
+#define gpio_cansleep __gpio_cansleep
++#define gpio_to_irq __gpio_to_irq
#endif /* __BCM47XX_GPIO_H */