diff --git a/target/linux/brcm47xx/patches-3.3/502-bcm47xx-rewrite-gpio-handling.patch b/target/linux/brcm47xx/patches-3.3/502-bcm47xx-rewrite-gpio-handling.patch
index 25262bd68dd595e6ab5d27315718b71da3f7a9c5..f38dcf6db3ea9877dd612a0fc9cec70f034941d8 100644
--- a/target/linux/brcm47xx/patches-3.3/502-bcm47xx-rewrite-gpio-handling.patch
+++ b/target/linux/brcm47xx/patches-3.3/502-bcm47xx-rewrite-gpio-handling.patch
@@ -18,7 +18,7 @@
  	 Support for BCM47XX based boards
 --- a/arch/mips/bcm47xx/gpio.c
 +++ b/arch/mips/bcm47xx/gpio.c
-@@ -4,81 +4,198 @@
+@@ -4,83 +4,150 @@
   * for more details.
   *
   * Copyright (C) 2007 Aurelien Jarno <aurelien@aurel32.net>
@@ -62,10 +62,20 @@
 -		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:
+ #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_gpio_in(&bcm47xx_bus.bcma.bus, mask);
 +#endif
 +	}
@@ -73,8 +83,7 @@
 +}
 +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) {
@@ -85,24 +94,26 @@
 +#ifdef CONFIG_BCM47XX_BCMA
 +	case BCM47XX_BUS_TYPE_BCMA:
 +		return bcma_gpio_out(&bcm47xx_bus.bcma.bus, mask, value);
-+#endif
-+	}
-+	return -EINVAL;
-+}
+ #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;
++#endif
++#ifdef CONFIG_BCM47XX_BCMA
++	case BCM47XX_BUS_TYPE_BCMA:
 +		return bcma_gpio_outen(&bcm47xx_bus.bcma.bus, mask, value);
 +#endif
 +	}
@@ -110,8 +121,9 @@
 +}
 +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) {
@@ -128,46 +140,45 @@
 +}
 +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_gpio_intmask(&bcm47xx_bus.bcma.bus, 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
-+	}
+ #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);
@@ -194,7 +205,19 @@
 +	/* 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 +166,55 @@ int gpio_to_irq(unsigned gpio)
+ 	}
+ 	return -EINVAL;
+ }
+-EXPORT_SYMBOL_GPL(gpio_to_irq);
 +
 +static struct gpio_chip bcm47xx_gpio_chip = {
 +	.label			= "bcm47xx",
@@ -202,41 +225,33 @@
 +	.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;
++		break;
++#endif
++#ifdef CONFIG_BCM47XX_BCMA
++	case BCM47XX_BUS_TYPE_BCMA:
 +		bcm47xx_gpio_count = bcma_gpio_count(&bcm47xx_bus.bcma.bus);
- #endif
- 	}
++		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)
 +{
@@ -255,22 +270,6 @@
 +		__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)
@@ -298,7 +297,7 @@
  
 +		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;
 +		}
 +
@@ -316,7 +315,7 @@
  #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>
@@ -336,9 +335,7 @@
 -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) {
@@ -381,6 +378,14 @@
 -{
 -	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);
@@ -389,19 +394,8 @@
 +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:
@@ -416,11 +410,12 @@
 -#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
@@ -444,11 +439,12 @@
 -#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:
@@ -464,10 +460,12 @@
 -#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:
@@ -482,9 +480,10 @@
 -		return 0;
 -#endif
 -	}
--	return -EINVAL;
--}
+ 	return -EINVAL;
+ }
  
 +#define gpio_cansleep	__gpio_cansleep
++#define gpio_to_irq __gpio_to_irq
  
  #endif /* __BCM47XX_GPIO_H */
diff --git a/target/linux/brcm47xx/patches-3.3/812-disable_wgt634u_crap.patch b/target/linux/brcm47xx/patches-3.3/812-disable_wgt634u_crap.patch
index e675c5309e7794945c3436e4633d772664fd5e82..a2902e7c72c24d426758b8bba4f96e54ccaa245e 100644
--- a/target/linux/brcm47xx/patches-3.3/812-disable_wgt634u_crap.patch
+++ b/target/linux/brcm47xx/patches-3.3/812-disable_wgt634u_crap.patch
@@ -159,7 +159,7 @@
 -
 -		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;
 -		}
 -