aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/brcm47xx
diff options
context:
space:
mode:
authorHauke Mehrtens <hauke@hauke-m.de>2013-01-10 14:05:18 +0000
committerHauke Mehrtens <hauke@hauke-m.de>2013-01-10 14:05:18 +0000
commit885eea184225e2d190f7aa8742ac806034caa9fc (patch)
treed60d951609d8e3a315c92b06a0670dc814525594 /target/linux/brcm47xx
parenta2950fabd4c84c867bf303e2e92bf99c2eb8b87a (diff)
downloadupstream-885eea184225e2d190f7aa8742ac806034caa9fc.tar.gz
upstream-885eea184225e2d190f7aa8742ac806034caa9fc.tar.bz2
upstream-885eea184225e2d190f7aa8742ac806034caa9fc.zip
kernel: update bcma and ssb to master-2013-01-09 from wireless-testing
SVN-Revision: 35080
Diffstat (limited to 'target/linux/brcm47xx')
-rw-r--r--target/linux/brcm47xx/config-3.64
-rw-r--r--target/linux/brcm47xx/patches-3.6/015-MIPS-BCM47XX-remove-GPIO-driver.patch360
-rw-r--r--target/linux/brcm47xx/patches-3.6/016-MIPS-BCM47XX-select-GPIOLIB-for-BCMA-on-bcm47xx-platform.patch21
-rw-r--r--target/linux/brcm47xx/patches-3.6/060-ssb-add-serial-flash-driver.patch100
-rw-r--r--target/linux/brcm47xx/patches-3.6/061-ssb-register-parallel-flash-device.patch4
-rw-r--r--target/linux/brcm47xx/patches-3.6/070-bcma-add-functions-to-write-to-serial-flash.patch8
-rw-r--r--target/linux/brcm47xx/patches-3.6/071-bcma-add-functions-to-write-to-nand-flash.patch10
-rw-r--r--target/linux/brcm47xx/patches-3.6/072-bcma-register-parallel-flash-device.patch6
-rw-r--r--target/linux/brcm47xx/patches-3.6/080-MIPS-BCM47XX-rewrite-nvram-probing.patch16
-rw-r--r--target/linux/brcm47xx/patches-3.6/116-MIPS-BCM47xx-Remove-CFE-console.patch2
-rw-r--r--target/linux/brcm47xx/patches-3.6/119-fix-boot.patch6
-rw-r--r--target/linux/brcm47xx/patches-3.6/180-bcma-make-bcma_find_core_unit-accessible-by-other-pa.patch24
-rw-r--r--target/linux/brcm47xx/patches-3.6/181-bcma-explicit-assigne-irq-numbers.patch101
-rw-r--r--target/linux/brcm47xx/patches-3.6/182-bcma-make-some-info-messages-debug.patch40
-rw-r--r--target/linux/brcm47xx/patches-3.6/183-bcma-mips-show-also-disabled-irqs.patch56
-rw-r--r--target/linux/brcm47xx/patches-3.6/184-bcma-mips-remove-assigned_irqs.patch21
-rw-r--r--target/linux/brcm47xx/patches-3.6/185-bcma-rename-oldirqflag-to-irqinitmask-to-better-matc.patch24
-rw-r--r--target/linux/brcm47xx/patches-3.6/220-bcma-fix-detection-of-serial-flash-chips.patch11
-rw-r--r--target/linux/brcm47xx/patches-3.6/235-bcma-dont-expose-mips-irq.patch13
-rw-r--r--target/linux/brcm47xx/patches-3.6/280-activate_ssb_support_in_usb.patch4
-rw-r--r--target/linux/brcm47xx/patches-3.6/400-arch-bcm47xx.patch146
-rw-r--r--target/linux/brcm47xx/patches-3.6/500-ssb-add-function-to-return-number-of-gpio-lines.patch40
-rw-r--r--target/linux/brcm47xx/patches-3.6/501-bcma-add-gpio-driver.patch140
-rw-r--r--target/linux/brcm47xx/patches-3.6/502-bcm47xx-rewrite-gpio-handling.patch493
-rw-r--r--target/linux/brcm47xx/patches-3.6/812-disable_wgt634u_crap.patch23
-rw-r--r--target/linux/brcm47xx/patches-3.6/820-wgt634u-nvram-fix.patch13
26 files changed, 610 insertions, 1076 deletions
diff --git a/target/linux/brcm47xx/config-3.6 b/target/linux/brcm47xx/config-3.6
index ae56ccf4dc..7f1ea7d724 100644
--- a/target/linux/brcm47xx/config-3.6
+++ b/target/linux/brcm47xx/config-3.6
@@ -3,9 +3,9 @@ CONFIG_ARCH_DISCARD_MEMBLOCK=y
CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=y
CONFIG_ARCH_HAVE_CUSTOM_GPIO_H=y
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
-CONFIG_ARCH_REQUIRE_GPIOLIB=y
CONFIG_ARCH_SUSPEND_POSSIBLE=y
CONFIG_ARCH_WANT_IPC_PARSE_VERSION=y
+CONFIG_ARCH_WANT_OPTIONAL_GPIOLIB=y
# CONFIG_ARPD is not set
CONFIG_BCM47XX=y
CONFIG_BCM47XX_BCMA=y
@@ -15,6 +15,7 @@ CONFIG_BCMA=y
CONFIG_BCMA_BLOCKIO=y
CONFIG_BCMA_DEBUG=y
CONFIG_BCMA_DRIVER_GMAC_CMN=y
+CONFIG_BCMA_DRIVER_GPIO=y
CONFIG_BCMA_DRIVER_MIPS=y
CONFIG_BCMA_DRIVER_PCI_HOSTMODE=y
CONFIG_BCMA_HOST_PCI=y
@@ -120,6 +121,7 @@ CONFIG_SSB_BLOCKIO=y
CONFIG_SSB_DEBUG=y
CONFIG_SSB_DRIVER_EXTIF=y
CONFIG_SSB_DRIVER_GIGE=y
+CONFIG_SSB_DRIVER_GPIO=y
CONFIG_SSB_DRIVER_MIPS=y
CONFIG_SSB_DRIVER_PCICORE=y
CONFIG_SSB_DRIVER_PCICORE_POSSIBLE=y
diff --git a/target/linux/brcm47xx/patches-3.6/015-MIPS-BCM47XX-remove-GPIO-driver.patch b/target/linux/brcm47xx/patches-3.6/015-MIPS-BCM47XX-remove-GPIO-driver.patch
new file mode 100644
index 0000000000..b39bdc4412
--- /dev/null
+++ b/target/linux/brcm47xx/patches-3.6/015-MIPS-BCM47XX-remove-GPIO-driver.patch
@@ -0,0 +1,360 @@
+commit 2da4c74dc3711275e82856e62884c99f7a45f541
+Author: Hauke Mehrtens <hauke@hauke-m.de>
+Date: Tue Nov 20 22:24:34 2012 +0000
+
+ MIPS: BCM47XX: remove GPIO driver
+
+ Instated of providing an own GPIO driver use the one provided by ssb and
+ bcma.
+
+ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
+ Patchwork: http://patchwork.linux-mips.org/patch/4592
+ Acked-by: Florian Fainelli <florian@openwrt.org>
+
+--- a/arch/mips/Kconfig
++++ b/arch/mips/Kconfig
+@@ -101,6 +101,7 @@ config ATH79
+
+ config BCM47XX
+ bool "Broadcom BCM47XX based boards"
++ select ARCH_WANT_OPTIONAL_GPIOLIB
+ select CEVT_R4K
+ select CSRC_R4K
+ select DMA_NONCOHERENT
+@@ -108,7 +109,6 @@ config BCM47XX
+ select IRQ_CPU
+ select SYS_SUPPORTS_32BIT_KERNEL
+ select SYS_SUPPORTS_LITTLE_ENDIAN
+- select GENERIC_GPIO
+ select SYS_HAS_EARLY_PRINTK
+ select CFE
+ help
+--- a/arch/mips/bcm47xx/Kconfig
++++ b/arch/mips/bcm47xx/Kconfig
+@@ -9,6 +9,7 @@ config BCM47XX_SSB
+ select SSB_EMBEDDED
+ select SSB_B43_PCI_BRIDGE if PCI
+ select SSB_PCICORE_HOSTMODE if PCI
++ select SSB_DRIVER_GPIO
+ default y
+ help
+ Add support for old Broadcom BCM47xx boards with Sonics Silicon Backplane support.
+@@ -23,6 +24,7 @@ config BCM47XX_BCMA
+ select BCMA_DRIVER_MIPS
+ select BCMA_HOST_PCI if PCI
+ select BCMA_DRIVER_PCI_HOSTMODE if PCI
++ select BCMA_DRIVER_GPIO
+ default y
+ help
+ Add support for new Broadcom BCM47xx boards with Broadcom specific Advanced Microcontroller Bus.
+--- a/arch/mips/bcm47xx/Makefile
++++ b/arch/mips/bcm47xx/Makefile
+@@ -3,5 +3,5 @@
+ # under Linux.
+ #
+
+-obj-y += gpio.o irq.o nvram.o prom.o serial.o setup.o time.o sprom.o
++obj-y += irq.o nvram.o prom.o serial.o setup.o time.o sprom.o
+ obj-$(CONFIG_BCM47XX_SSB) += wgt634u.o
+--- a/arch/mips/bcm47xx/gpio.c
++++ /dev/null
+@@ -1,102 +0,0 @@
+-/*
+- * This file is subject to the terms and conditions of the GNU General Public
+- * License. See the file "COPYING" in the main directory of this archive
+- * for more details.
+- *
+- * Copyright (C) 2007 Aurelien Jarno <aurelien@aurel32.net>
+- */
+-
+-#include <linux/export.h>
+-#include <linux/ssb/ssb.h>
+-#include <linux/ssb/ssb_driver_chipcommon.h>
+-#include <linux/ssb/ssb_driver_extif.h>
+-#include <asm/mach-bcm47xx/bcm47xx.h>
+-#include <asm/mach-bcm47xx/gpio.h>
+-
+-#if (BCM47XX_CHIPCO_GPIO_LINES > BCM47XX_EXTIF_GPIO_LINES)
+-static DECLARE_BITMAP(gpio_in_use, BCM47XX_CHIPCO_GPIO_LINES);
+-#else
+-static DECLARE_BITMAP(gpio_in_use, BCM47XX_EXTIF_GPIO_LINES);
+-#endif
+-
+-int gpio_request(unsigned gpio, const char *tag)
+-{
+- 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(&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;
+-#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)
+-{
+- 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;
+-
+- 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);
+- return;
+-#endif
+- }
+-}
+-EXPORT_SYMBOL(gpio_free);
+-
+-int gpio_to_irq(unsigned gpio)
+-{
+- 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);
+--- a/arch/mips/bcm47xx/wgt634u.c
++++ b/arch/mips/bcm47xx/wgt634u.c
+@@ -11,6 +11,7 @@
+ #include <linux/leds.h>
+ #include <linux/mtd/physmap.h>
+ #include <linux/ssb/ssb.h>
++#include <linux/ssb/ssb_embedded.h>
+ #include <linux/interrupt.h>
+ #include <linux/reboot.h>
+ #include <linux/gpio.h>
+@@ -116,7 +117,8 @@ static irqreturn_t gpio_interrupt(int ir
+
+ /* Interrupt are level triggered, revert the interrupt polarity
+ to clear the interrupt. */
+- gpio_polarity(WGT634U_GPIO_RESET, state);
++ ssb_gpio_polarity(&bcm47xx_bus.ssb, 1 << WGT634U_GPIO_RESET,
++ state ? 1 << WGT634U_GPIO_RESET : 0);
+
+ if (!state) {
+ printk(KERN_INFO "Reset button pressed");
+@@ -150,7 +152,9 @@ static int __init wgt634u_init(void)
+ gpio_interrupt, IRQF_SHARED,
+ "WGT634U GPIO", &bcm47xx_bus.ssb.chipco)) {
+ gpio_direction_input(WGT634U_GPIO_RESET);
+- gpio_intmask(WGT634U_GPIO_RESET, 1);
++ ssb_gpio_intmask(&bcm47xx_bus.ssb,
++ 1 << WGT634U_GPIO_RESET,
++ 1 << WGT634U_GPIO_RESET);
+ ssb_chipco_irq_mask(&bcm47xx_bus.ssb.chipco,
+ SSB_CHIPCO_IRQ_GPIO,
+ SSB_CHIPCO_IRQ_GPIO);
+--- a/arch/mips/include/asm/mach-bcm47xx/gpio.h
++++ b/arch/mips/include/asm/mach-bcm47xx/gpio.h
+@@ -1,155 +1,17 @@
+-/*
+- * This file is subject to the terms and conditions of the GNU General Public
+- * License. See the file "COPYING" in the main directory of this archive
+- * for more details.
+- *
+- * Copyright (C) 2007 Aurelien Jarno <aurelien@aurel32.net>
+- */
++#ifndef __ASM_MIPS_MACH_BCM47XX_GPIO_H
++#define __ASM_MIPS_MACH_BCM47XX_GPIO_H
+
+-#ifndef __BCM47XX_GPIO_H
+-#define __BCM47XX_GPIO_H
++#include <asm-generic/gpio.h>
+
+-#include <linux/ssb/ssb_embedded.h>
+-#include <linux/bcma/bcma.h>
+-#include <asm/mach-bcm47xx/bcm47xx.h>
++#define gpio_get_value __gpio_get_value
++#define gpio_set_value __gpio_set_value
+
+-#define BCM47XX_EXTIF_GPIO_LINES 5
+-#define BCM47XX_CHIPCO_GPIO_LINES 16
++#define gpio_cansleep __gpio_cansleep
++#define gpio_to_irq __gpio_to_irq
+
+-extern int gpio_request(unsigned gpio, const char *label);
+-extern void gpio_free(unsigned gpio);
+-extern int gpio_to_irq(unsigned gpio);
+-
+-static inline int gpio_get_value(unsigned gpio)
++static inline int irq_to_gpio(unsigned int irq)
+ {
+- switch (bcm47xx_bus_type) {
+-#ifdef CONFIG_BCM47XX_SSB
+- case BCM47XX_BUS_TYPE_SSB:
+- return ssb_gpio_in(&bcm47xx_bus.ssb, 1 << gpio);
+-#endif
+-#ifdef CONFIG_BCM47XX_BCMA
+- case BCM47XX_BUS_TYPE_BCMA:
+- return bcma_chipco_gpio_in(&bcm47xx_bus.bcma.bus.drv_cc,
+- 1 << gpio);
+-#endif
+- }
+ return -EINVAL;
+ }
+
+-#define gpio_get_value_cansleep gpio_get_value
+-
+-static inline void gpio_set_value(unsigned gpio, int value)
+-{
+- switch (bcm47xx_bus_type) {
+-#ifdef CONFIG_BCM47XX_SSB
+- case BCM47XX_BUS_TYPE_SSB:
+- ssb_gpio_out(&bcm47xx_bus.ssb, 1 << gpio,
+- value ? 1 << gpio : 0);
+- return;
+-#endif
+-#ifdef CONFIG_BCM47XX_BCMA
+- case BCM47XX_BUS_TYPE_BCMA:
+- bcma_chipco_gpio_out(&bcm47xx_bus.bcma.bus.drv_cc, 1 << gpio,
+- value ? 1 << gpio : 0);
+- return;
+ #endif
+- }
+-}
+-
+-#define gpio_set_value_cansleep gpio_set_value
+-
+-static inline int gpio_cansleep(unsigned gpio)
+-{
+- return 0;
+-}
+-
+-static inline int gpio_is_valid(unsigned gpio)
+-{
+- return gpio < (BCM47XX_EXTIF_GPIO_LINES + BCM47XX_CHIPCO_GPIO_LINES);
+-}
+-
+-
+-static inline int gpio_direction_input(unsigned gpio)
+-{
+- switch (bcm47xx_bus_type) {
+-#ifdef CONFIG_BCM47XX_SSB
+- case BCM47XX_BUS_TYPE_SSB:
+- ssb_gpio_outen(&bcm47xx_bus.ssb, 1 << gpio, 0);
+- return 0;
+-#endif
+-#ifdef CONFIG_BCM47XX_BCMA
+- case BCM47XX_BUS_TYPE_BCMA:
+- bcma_chipco_gpio_outen(&bcm47xx_bus.bcma.bus.drv_cc, 1 << gpio,
+- 0);
+- return 0;
+-#endif
+- }
+- return -EINVAL;
+-}
+-
+-static inline int gpio_direction_output(unsigned gpio, int value)
+-{
+- switch (bcm47xx_bus_type) {
+-#ifdef CONFIG_BCM47XX_SSB
+- case BCM47XX_BUS_TYPE_SSB:
+- /* first set the gpio out value */
+- ssb_gpio_out(&bcm47xx_bus.ssb, 1 << gpio,
+- value ? 1 << gpio : 0);
+- /* then set the gpio mode */
+- ssb_gpio_outen(&bcm47xx_bus.ssb, 1 << gpio, 1 << gpio);
+- return 0;
+-#endif
+-#ifdef CONFIG_BCM47XX_BCMA
+- case BCM47XX_BUS_TYPE_BCMA:
+- /* first set the gpio out value */
+- bcma_chipco_gpio_out(&bcm47xx_bus.bcma.bus.drv_cc, 1 << gpio,
+- value ? 1 << gpio : 0);
+- /* then set the gpio mode */
+- bcma_chipco_gpio_outen(&bcm47xx_bus.bcma.bus.drv_cc, 1 << gpio,
+- 1 << gpio);
+- return 0;
+-#endif
+- }
+- return -EINVAL;
+-}
+-
+-static inline int gpio_intmask(unsigned gpio, int value)
+-{
+- switch (bcm47xx_bus_type) {
+-#ifdef CONFIG_BCM47XX_SSB
+- case BCM47XX_BUS_TYPE_SSB:
+- ssb_gpio_intmask(&bcm47xx_bus.ssb, 1 << gpio,
+- value ? 1 << gpio : 0);
+- return 0;
+-#endif
+-#ifdef CONFIG_BCM47XX_BCMA
+- case BCM47XX_BUS_TYPE_BCMA:
+- bcma_chipco_gpio_intmask(&bcm47xx_bus.bcma.bus.drv_cc,
+- 1 << gpio, value ? 1 << gpio : 0);
+- return 0;
+-#endif
+- }
+- return -EINVAL;
+-}
+-
+-static inline int gpio_polarity(unsigned gpio, int value)
+-{
+- switch (bcm47xx_bus_type) {
+-#ifdef CONFIG_BCM47XX_SSB
+- case BCM47XX_BUS_TYPE_SSB:
+- ssb_gpio_polarity(&bcm47xx_bus.ssb, 1 << gpio,
+- value ? 1 << gpio : 0);
+- return 0;
+-#endif
+-#ifdef CONFIG_BCM47XX_BCMA
+- case BCM47XX_BUS_TYPE_BCMA:
+- bcma_chipco_gpio_polarity(&bcm47xx_bus.bcma.bus.drv_cc,
+- 1 << gpio, value ? 1 << gpio : 0);
+- return 0;
+-#endif
+- }
+- return -EINVAL;
+-}
+-
+-
+-#endif /* __BCM47XX_GPIO_H */
diff --git a/target/linux/brcm47xx/patches-3.6/016-MIPS-BCM47XX-select-GPIOLIB-for-BCMA-on-bcm47xx-platform.patch b/target/linux/brcm47xx/patches-3.6/016-MIPS-BCM47XX-select-GPIOLIB-for-BCMA-on-bcm47xx-platform.patch
new file mode 100644
index 0000000000..dba65de43d
--- /dev/null
+++ b/target/linux/brcm47xx/patches-3.6/016-MIPS-BCM47XX-select-GPIOLIB-for-BCMA-on-bcm47xx-platform.patch
@@ -0,0 +1,21 @@
+--- a/arch/mips/bcm47xx/Kconfig
++++ b/arch/mips/bcm47xx/Kconfig
+@@ -8,8 +8,10 @@ config BCM47XX_SSB
+ select SSB_DRIVER_EXTIF
+ select SSB_EMBEDDED
+ select SSB_B43_PCI_BRIDGE if PCI
++ select SSB_DRIVER_PCICORE if PCI
+ select SSB_PCICORE_HOSTMODE if PCI
+ select SSB_DRIVER_GPIO
++ select GPIOLIB
+ default y
+ help
+ Add support for old Broadcom BCM47xx boards with Sonics Silicon Backplane support.
+@@ -25,6 +27,7 @@ config BCM47XX_BCMA
+ select BCMA_HOST_PCI if PCI
+ select BCMA_DRIVER_PCI_HOSTMODE if PCI
+ select BCMA_DRIVER_GPIO
++ select GPIOLIB
+ default y
+ help
+ Add support for new Broadcom BCM47xx boards with Broadcom specific Advanced Microcontroller Bus.
diff --git a/target/linux/brcm47xx/patches-3.6/060-ssb-add-serial-flash-driver.patch b/target/linux/brcm47xx/patches-3.6/060-ssb-add-serial-flash-driver.patch
index 8b218f3070..c40a58ecaa 100644
--- a/target/linux/brcm47xx/patches-3.6/060-ssb-add-serial-flash-driver.patch
+++ b/target/linux/brcm47xx/patches-3.6/060-ssb-add-serial-flash-driver.patch
@@ -1,47 +1,36 @@
--- a/drivers/ssb/Kconfig
+++ b/drivers/ssb/Kconfig
-@@ -143,6 +143,11 @@ config SSB_EMBEDDED
- depends on SSB_DRIVER_MIPS
- default y
+@@ -139,7 +139,7 @@ config SSB_DRIVER_MIPS
-+config SSB_SFLASH
-+ bool
+ config SSB_SFLASH
+ bool "SSB serial flash support"
+- depends on SSB_DRIVER_MIPS && BROKEN
+ depends on SSB_DRIVER_MIPS
-+ default y
-+
- config SSB_DRIVER_EXTIF
- bool "SSB Broadcom EXTIF core driver"
- depends on SSB_DRIVER_MIPS
---- a/drivers/ssb/Makefile
-+++ b/drivers/ssb/Makefile
-@@ -11,6 +11,7 @@ ssb-$(CONFIG_SSB_SDIOHOST) += sdio.o
- # built-in drivers
- ssb-y += driver_chipcommon.o
- ssb-y += driver_chipcommon_pmu.o
-+ssb-$(CONFIG_SSB_SFLASH) += driver_chipcommon_sflash.o
- ssb-$(CONFIG_SSB_DRIVER_MIPS) += driver_mipscore.o
- ssb-$(CONFIG_SSB_DRIVER_EXTIF) += driver_extif.o
- ssb-$(CONFIG_SSB_DRIVER_PCICORE) += driver_pcicore.o
---- /dev/null
+ default y
+
+ # Assumption: We are on embedded, if we compile the MIPS core.
+--- a/drivers/ssb/driver_chipcommon_sflash.c
+++ b/drivers/ssb/driver_chipcommon_sflash.c
-@@ -0,0 +1,395 @@
-+/*
-+ * Broadcom specific AMBA
-+ * ChipCommon serial flash interface
+@@ -1,18 +1,395 @@
+ /*
+ * Sonics Silicon Backplane
+ * ChipCommon serial flash interface
+ * Copyright 2011, Jonas Gorski <jonas.gorski@gmail.com>
+ * Copyright 2011, 2012, Hauke Mehrtens <hauke@hauke-m.de>
+ * Copyright 2010, Broadcom Corporation
-+ *
-+ * Licensed under the GNU/GPL. See COPYING for details.
-+ */
-+
+ *
+ * Licensed under the GNU/GPL. See COPYING for details.
+ */
+
+#include <linux/platform_device.h>
+#include <linux/delay.h>
-+#include <linux/ssb/ssb.h>
+ #include <linux/ssb/ssb.h>
+#include <linux/ssb/ssb_driver_chipcommon.h>
-+
-+#include "ssb_private.h"
-+
+
+ #include "ssb_private.h"
+
+-/* Initialize serial flash access */
+-int ssb_sflash_init(struct ssb_chipcommon *cc)
+#define NUM_RETRIES 3
+
+static struct resource ssb_sflash_resource = {
@@ -169,7 +158,8 @@
+
+/* Poll for command completion. Returns zero when complete. */
+static int ssb_sflash_poll(struct bcm47xx_sflash *dev, u32 offset)
-+{
+ {
+- pr_err("Serial flash support is not implemented yet!\n");
+ struct ssb_chipcommon *chipco = dev->scc;
+
+ if (offset >= chipco->sflash.size)
@@ -417,21 +407,10 @@
+ ssb_sflash_dev.resource[0].end = ssb_sflash_dev.resource[0].start +
+ sflash->size;
+ ssb_sflash_dev.dev.platform_data = sflash;
-+
+
+- return -ENOTSUPP;
+ return 0;
-+}
---- a/drivers/ssb/driver_mipscore.c
-+++ b/drivers/ssb/driver_mipscore.c
-@@ -203,7 +203,8 @@ static void ssb_mips_flash_detect(struct
- switch (bus->chipco.capabilities & SSB_CHIPCO_CAP_FLASHT) {
- case SSB_CHIPCO_FLASHT_STSER:
- case SSB_CHIPCO_FLASHT_ATSER:
-- pr_err("Serial flash not supported\n");
-+ pr_debug("Found serial flash\n");
-+ ssb_sflash_init(&bus->chipco);
- break;
- case SSB_CHIPCO_FLASHT_PARA:
- pr_debug("Found parallel flash\n");
+ }
--- a/drivers/ssb/main.c
+++ b/drivers/ssb/main.c
@@ -19,6 +19,7 @@
@@ -460,23 +439,14 @@
/* Unwind the already registered devices. */
--- a/drivers/ssb/ssb_private.h
+++ b/drivers/ssb/ssb_private.h
-@@ -242,4 +242,16 @@ static inline int ssb_watchdog_register(
- }
- #endif /* CONFIG_SSB_EMBEDDED */
-
-+#ifdef CONFIG_SSB_SFLASH
-+/* driver_chipcommon_sflash.c */
-+int ssb_sflash_init(struct ssb_chipcommon *chipco);
+@@ -220,6 +220,7 @@ extern u32 ssb_chipco_watchdog_timer_set
+ /* driver_chipcommon_sflash.c */
+ #ifdef CONFIG_SSB_SFLASH
+ int ssb_sflash_init(struct ssb_chipcommon *cc);
+extern struct platform_device ssb_sflash_dev;
-+#else
-+static inline int ssb_sflash_init(struct ssb_chipcommon *chipco)
-+{
-+ pr_err("Serial flash not supported\n");
-+ return 0;
-+}
-+#endif /* CONFIG_SSB_SFLASH */
-+
- #endif /* LINUX_SSB_PRIVATE_H_ */
+ #else
+ static inline int ssb_sflash_init(struct ssb_chipcommon *cc)
+ {
--- a/include/linux/ssb/ssb_driver_chipcommon.h
+++ b/include/linux/ssb/ssb_driver_chipcommon.h
@@ -13,6 +13,8 @@
@@ -515,7 +485,7 @@
#define SSB_CHIPCO_FLASHCTL_ST_RES 0x03AB /* Read Electronic Signature */
#define SSB_CHIPCO_FLASHCTL_ST_CSA 0x1000 /* Keep chip select asserted */
#define SSB_CHIPCO_FLASHCTL_ST_SSE 0x0220 /* Sub-sector Erase */
-@@ -593,6 +606,9 @@ struct ssb_chipcommon {
+@@ -594,6 +607,9 @@ struct ssb_chipcommon {
struct ssb_chipcommon_pmu pmu;
u32 ticks_per_ms;
u32 max_timer_ms;
diff --git a/target/linux/brcm47xx/patches-3.6/061-ssb-register-parallel-flash-device.patch b/target/linux/brcm47xx/patches-3.6/061-ssb-register-parallel-flash-device.patch
index b2f85ae656..3c90013d6c 100644
--- a/target/linux/brcm47xx/patches-3.6/061-ssb-register-parallel-flash-device.patch
+++ b/target/linux/brcm47xx/patches-3.6/061-ssb-register-parallel-flash-device.patch
@@ -67,9 +67,9 @@
error:
--- a/drivers/ssb/ssb_private.h
+++ b/drivers/ssb/ssb_private.h
-@@ -254,4 +254,6 @@ static inline int ssb_sflash_init(struct
+@@ -271,4 +271,6 @@ static inline int ssb_gpio_init(struct s
}
- #endif /* CONFIG_SSB_SFLASH */
+ #endif /* CONFIG_SSB_DRIVER_GPIO */
+extern struct platform_device ssb_pflash_dev;
+
diff --git a/target/linux/brcm47xx/patches-3.6/070-bcma-add-functions-to-write-to-serial-flash.patch b/target/linux/brcm47xx/patches-3.6/070-bcma-add-functions-to-write-to-serial-flash.patch
index 5acc2cf27b..98cd795a52 100644
--- a/target/linux/brcm47xx/patches-3.6/070-bcma-add-functions-to-write-to-serial-flash.patch
+++ b/target/linux/brcm47xx/patches-3.6/070-bcma-add-functions-to-write-to-serial-flash.patch
@@ -307,16 +307,16 @@
e->name, sflash->size / 1024, sflash->blocksize,
--- a/include/linux/bcma/bcma_driver_chipcommon.h
+++ b/include/linux/bcma/bcma_driver_chipcommon.h
-@@ -3,6 +3,8 @@
-
+@@ -4,6 +4,8 @@
#include <linux/platform_device.h>
+ #include <linux/gpio.h>
+#include <linux/mtd/bcm47xx_sflash.h>
+
/** ChipCommon core registers. **/
#define BCMA_CC_ID 0x0000
#define BCMA_CC_ID_ID 0x0000FFFF
-@@ -518,17 +520,6 @@ struct bcma_pflash {
+@@ -519,17 +521,6 @@ struct bcma_pflash {
u32 window_size;
};
@@ -334,7 +334,7 @@
#ifdef CONFIG_BCMA_NFLASH
struct mtd_info;
-@@ -563,7 +554,7 @@ struct bcma_drv_cc {
+@@ -564,7 +555,7 @@ struct bcma_drv_cc {
#ifdef CONFIG_BCMA_DRIVER_MIPS
struct bcma_pflash pflash;
#ifdef CONFIG_BCMA_SFLASH
diff --git a/target/linux/brcm47xx/patches-3.6/071-bcma-add-functions-to-write-to-nand-flash.patch b/target/linux/brcm47xx/patches-3.6/071-bcma-add-functions-to-write-to-nand-flash.patch
index f1b4f7feb7..7a21298236 100644
--- a/target/linux/brcm47xx/patches-3.6/071-bcma-add-functions-to-write-to-nand-flash.patch
+++ b/target/linux/brcm47xx/patches-3.6/071-bcma-add-functions-to-write-to-nand-flash.patch
@@ -181,15 +181,15 @@
+}
--- a/include/linux/bcma/bcma_driver_chipcommon.h
+++ b/include/linux/bcma/bcma_driver_chipcommon.h
-@@ -4,6 +4,7 @@
- #include <linux/platform_device.h>
+@@ -5,6 +5,7 @@
+ #include <linux/gpio.h>
#include <linux/mtd/bcm47xx_sflash.h>
+#include <linux/mtd/bcm47xx_nand.h>
/** ChipCommon core registers. **/
#define BCMA_CC_ID 0x0000
-@@ -521,17 +522,6 @@ struct bcma_pflash {
+@@ -522,17 +523,6 @@ struct bcma_pflash {
};
@@ -207,7 +207,7 @@
struct bcma_serial_port {
void *regs;
unsigned long clockspeed;
-@@ -557,7 +547,7 @@ struct bcma_drv_cc {
+@@ -558,7 +548,7 @@ struct bcma_drv_cc {
struct bcm47xx_sflash sflash;
#endif
#ifdef CONFIG_BCMA_NFLASH
@@ -216,7 +216,7 @@
#endif
int nr_serial_ports;
-@@ -616,4 +606,13 @@ extern void bcma_chipco_regctl_maskset(s
+@@ -625,4 +615,13 @@ extern void bcma_chipco_regctl_maskset(s
u32 offset, u32 mask, u32 set);
extern void bcma_pmu_spuravoid_pllupdate(struct bcma_drv_cc *cc, int spuravoid);
diff --git a/target/linux/brcm47xx/patches-3.6/072-bcma-register-parallel-flash-device.patch b/target/linux/brcm47xx/patches-3.6/072-bcma-register-parallel-flash-device.patch
index cacb903430..f21608b0b8 100644
--- a/target/linux/brcm47xx/patches-3.6/072-bcma-register-parallel-flash-device.patch
+++ b/target/linux/brcm47xx/patches-3.6/072-bcma-register-parallel-flash-device.patch
@@ -1,6 +1,6 @@
--- a/drivers/bcma/bcma_private.h
+++ b/drivers/bcma/bcma_private.h
-@@ -45,6 +45,7 @@ int bcma_sprom_get(struct bcma_bus *bus)
+@@ -47,6 +47,7 @@ int bcma_sprom_get(struct bcma_bus *bus)
/* driver_chipcommon.c */
#ifdef CONFIG_BCMA_DRIVER_MIPS
void bcma_chipco_serial_init(struct bcma_drv_cc *cc);
@@ -18,7 +18,7 @@
/* The 47162a0 hangs when reading MIPS DMP registers registers */
static inline bool bcma_core_mips_bcm47162a0_quirk(struct bcma_device *dev)
-@@ -178,6 +179,19 @@ u32 bcma_cpu_clock(struct bcma_drv_mips
+@@ -201,6 +202,19 @@ u32 bcma_cpu_clock(struct bcma_drv_mips
}
EXPORT_SYMBOL(bcma_cpu_clock);
@@ -38,7 +38,7 @@
static void bcma_core_mips_flash_detect(struct bcma_drv_mips *mcore)
{
struct bcma_bus *bus = mcore->core->bus;
-@@ -200,6 +214,9 @@ static void bcma_core_mips_flash_detect(
+@@ -223,6 +237,9 @@ static void bcma_core_mips_flash_detect(
cc->pflash.buswidth = 1;
else
cc->pflash.buswidth = 2;
diff --git a/target/linux/brcm47xx/patches-3.6/080-MIPS-BCM47XX-rewrite-nvram-probing.patch b/target/linux/brcm47xx/patches-3.6/080-MIPS-BCM47XX-rewrite-nvram-probing.patch
index ecc9e04134..1e75b10fbb 100644
--- a/target/linux/brcm47xx/patches-3.6/080-MIPS-BCM47XX-rewrite-nvram-probing.patch
+++ b/target/linux/brcm47xx/patches-3.6/080-MIPS-BCM47XX-rewrite-nvram-probing.patch
@@ -9,7 +9,7 @@
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
-@@ -18,83 +18,166 @@
+@@ -18,83 +18,168 @@
#include <linux/kernel.h>
#include <linux/string.h>
#include <asm/addrspace.h>
@@ -122,14 +122,15 @@
+ memset(dst, 0x0, NVRAM_SPACE - i);
+
+ return 0;
- }
-
--int nvram_getenv(char *name, char *val, size_t val_len)
++}
++
+#ifdef CONFIG_BCM47XX_SSB
+static int nvram_init_ssb(void)
+{
+ struct ssb_mipscore *mcore = &bcm47xx_bus.ssb.mipscore;
++#ifdef CONFIG_SSB_SFLASH
+ struct ssb_chipcommon *chipco = &bcm47xx_bus.ssb.chipco;
++#endif
+ u32 base;
+ u32 lim;
+
@@ -177,9 +178,10 @@
+ }
+
+ return nvram_find_and_copy(base, lim);
-+}
+ }
+#endif
-+
+
+-int nvram_getenv(char *name, char *val, size_t val_len)
+static int nvram_init(void)
+{
+ switch (bcm47xx_bus_type) {
@@ -214,7 +216,7 @@
/* Look for name=value and return value */
var = &nvram_buf[sizeof(struct nvram_header)];
-@@ -110,6 +193,6 @@ int nvram_getenv(char *name, char *val,
+@@ -110,6 +195,6 @@ int nvram_getenv(char *name, char *val,
return snprintf(val, val_len, "%s", value);
}
}
diff --git a/target/linux/brcm47xx/patches-3.6/116-MIPS-BCM47xx-Remove-CFE-console.patch b/target/linux/brcm47xx/patches-3.6/116-MIPS-BCM47xx-Remove-CFE-console.patch
index f068ac8b46..f7ace42f7f 100644
--- a/target/linux/brcm47xx/patches-3.6/116-MIPS-BCM47xx-Remove-CFE-console.patch
+++ b/target/linux/brcm47xx/patches-3.6/116-MIPS-BCM47xx-Remove-CFE-console.patch
@@ -17,9 +17,9 @@ Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -109,7 +109,6 @@ config BCM47XX
+ select IRQ_CPU
select SYS_SUPPORTS_32BIT_KERNEL
select SYS_SUPPORTS_LITTLE_ENDIAN
- select GENERIC_GPIO
- select SYS_HAS_EARLY_PRINTK
select CFE
help
diff --git a/target/linux/brcm47xx/patches-3.6/119-fix-boot.patch b/target/linux/brcm47xx/patches-3.6/119-fix-boot.patch
index 6abfd8d27f..db9883b79f 100644
--- a/target/linux/brcm47xx/patches-3.6/119-fix-boot.patch
+++ b/target/linux/brcm47xx/patches-3.6/119-fix-boot.patch
@@ -1,9 +1,9 @@
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
-@@ -101,11 +101,13 @@ config ATH79
-
+@@ -102,11 +102,13 @@ config ATH79
config BCM47XX
bool "Broadcom BCM47XX based boards"
+ select ARCH_WANT_OPTIONAL_GPIOLIB
+ select BOOT_RAW
select CEVT_R4K
select CSRC_R4K
@@ -13,4 +13,4 @@
+ select NO_EXCEPT_FILL
select SYS_SUPPORTS_32BIT_KERNEL
select SYS_SUPPORTS_LITTLE_ENDIAN
- select GENERIC_GPIO
+ select CFE
diff --git a/target/linux/brcm47xx/patches-3.6/180-bcma-make-bcma_find_core_unit-accessible-by-other-pa.patch b/target/linux/brcm47xx/patches-3.6/180-bcma-make-bcma_find_core_unit-accessible-by-other-pa.patch
deleted file mode 100644
index 147ac3416a..0000000000
--- a/target/linux/brcm47xx/patches-3.6/180-bcma-make-bcma_find_core_unit-accessible-by-other-pa.patch
+++ /dev/null
@@ -1,24 +0,0 @@
---- a/drivers/bcma/bcma_private.h
-+++ b/drivers/bcma/bcma_private.h
-@@ -31,6 +31,8 @@ int __init bcma_bus_early_register(struc
- int bcma_bus_suspend(struct bcma_bus *bus);
- int bcma_bus_resume(struct bcma_bus *bus);
- #endif
-+struct bcma_device *bcma_find_core_unit(struct bcma_bus *bus, u16 coreid,
-+ u8 unit);
-
- /* scan.c */
- int bcma_bus_scan(struct bcma_bus *bus);
---- a/drivers/bcma/main.c
-+++ b/drivers/bcma/main.c
-@@ -81,8 +81,8 @@ struct bcma_device *bcma_find_core(struc
- }
- EXPORT_SYMBOL_GPL(bcma_find_core);
-
--static struct bcma_device *bcma_find_core_unit(struct bcma_bus *bus, u16 coreid,
-- u8 unit)
-+struct bcma_device *bcma_find_core_unit(struct bcma_bus *bus, u16 coreid,
-+ u8 unit)
- {
- struct bcma_device *core;
-
diff --git a/target/linux/brcm47xx/patches-3.6/181-bcma-explicit-assigne-irq-numbers.patch b/target/linux/brcm47xx/patches-3.6/181-bcma-explicit-assigne-irq-numbers.patch
deleted file mode 100644
index 501f8d66b3..0000000000
--- a/target/linux/brcm47xx/patches-3.6/181-bcma-explicit-assigne-irq-numbers.patch
+++ /dev/null
@@ -1,101 +0,0 @@
---- a/drivers/bcma/driver_mips.c
-+++ b/drivers/bcma/driver_mips.c
-@@ -148,6 +148,22 @@ static void bcma_core_mips_set_irq(struc
- dev->id.id, oldirq + 2, irq + 2);
- }
-
-+static void bcma_core_mips_set_irq_name(struct bcma_bus *bus, unsigned int irq,
-+ u16 coreid, u8 unit)
-+{
-+ struct bcma_device *core;
-+
-+ core = bcma_find_core_unit(bus, coreid, unit);
-+ if (!core) {
-+ bcma_warn(bus,
-+ "Can not find core (id: 0x%x, unit %i) for IRQ configuration.\n",
-+ coreid, unit);
-+ return;
-+ }
-+
-+ bcma_core_mips_set_irq(core, irq);
-+}
-+
- static void bcma_core_mips_print_irq(struct bcma_device *dev, unsigned int irq)
- {
- int i;
-@@ -259,35 +275,47 @@ void bcma_core_mips_init(struct bcma_drv
-
- mcore->assigned_irqs = 1;
-
-- /* Assign IRQs to all cores on the bus */
-- list_for_each_entry(core, &bus->cores, list) {
-- int mips_irq;
-- if (core->irq)
-- continue;
--
-- mips_irq = bcma_core_mips_irq(core);
-- if (mips_irq > 4)
-- core->irq = 0;
-- else
-- core->irq = mips_irq + 2;
-- if (core->irq > 5)
-- continue;
-- switch (core->id.id) {
-- case BCMA_CORE_PCI:
-- case BCMA_CORE_PCIE:
-- case BCMA_CORE_ETHERNET:
-- case BCMA_CORE_ETHERNET_GBIT:
-- case BCMA_CORE_MAC_GBIT:
-- case BCMA_CORE_80211:
-- case BCMA_CORE_USB20_HOST:
-- /* These devices get their own IRQ line if available,
-- * the rest goes on IRQ0
-- */
-- if (mcore->assigned_irqs <= 4)
-- bcma_core_mips_set_irq(core,
-- mcore->assigned_irqs++);
-- break;
-+ switch (bus->chipinfo.id) {
-+ case BCMA_CHIP_ID_BCM4716:
-+ case BCMA_CHIP_ID_BCM4748:
-+ bcma_core_mips_set_irq_name(bus, 1, BCMA_CORE_80211, 0);
-+ bcma_core_mips_set_irq_name(bus, 2, BCMA_CORE_MAC_GBIT, 0);
-+ bcma_core_mips_set_irq_name(bus, 3, BCMA_CORE_USB20_HOST, 0);
-+ bcma_core_mips_set_irq_name(bus, 4, BCMA_CORE_PCIE, 0);
-+ bcma_core_mips_set_irq_name(bus, 0, BCMA_CORE_CHIPCOMMON, 0);
-+ bcma_core_mips_set_irq_name(bus, 0, BCMA_CORE_I2S, 0);
-+ break;
-+ case BCMA_CHIP_ID_BCM5356:
-+ case BCMA_CHIP_ID_BCM47162:
-+ case BCMA_CHIP_ID_BCM53572:
-+ bcma_core_mips_set_irq_name(bus, 1, BCMA_CORE_80211, 0);
-+ bcma_core_mips_set_irq_name(bus, 2, BCMA_CORE_MAC_GBIT, 0);
-+ bcma_core_mips_set_irq_name(bus, 0, BCMA_CORE_CHIPCOMMON, 0);
-+ break;
-+ case BCMA_CHIP_ID_BCM5357:
-+ case BCMA_CHIP_ID_BCM4749:
-+ bcma_core_mips_set_irq_name(bus, 1, BCMA_CORE_80211, 0);
-+ bcma_core_mips_set_irq_name(bus, 2, BCMA_CORE_MAC_GBIT, 0);
-+ bcma_core_mips_set_irq_name(bus, 3, BCMA_CORE_USB20_HOST, 0);
-+ bcma_core_mips_set_irq_name(bus, 0, BCMA_CORE_CHIPCOMMON, 0);
-+ bcma_core_mips_set_irq_name(bus, 0, BCMA_CORE_I2S, 0);
-+ break;
-+ case BCMA_CHIP_ID_BCM4706:
-+ bcma_core_mips_set_irq_name(bus, 1, BCMA_CORE_PCIE, 0);
-+ bcma_core_mips_set_irq_name(bus, 2, BCMA_CORE_4706_MAC_GBIT,
-+ 0);
-+ bcma_core_mips_set_irq_name(bus, 3, BCMA_CORE_PCIE, 1);
-+ bcma_core_mips_set_irq_name(bus, 4, BCMA_CORE_USB20_HOST, 0);
-+ bcma_core_mips_set_irq_name(bus, 0, BCMA_CORE_4706_CHIPCOMMON,
-+ 0);
-+ break;
-+ default:
-+ list_for_each_entry(core, &bus->cores, list) {
-+ core->irq = bcma_core_irq(core);
- }
-+ bcma_err(bus,
-+ "Unknown device (0x%x) found, can not configure IRQs\n",
-+ bus->chipinfo.id);
- }
- bcma_info(bus, "IRQ reconfiguration done\n");
- bcma_core_mips_dump_irq(bus);
diff --git a/target/linux/brcm47xx/patches-3.6/182-bcma-make-some-info-messages-debug.patch b/target/linux/brcm47xx/patches-3.6/182-bcma-make-some-info-messages-debug.patch
deleted file mode 100644
index 4250216f30..0000000000
--- a/target/linux/brcm47xx/patches-3.6/182-bcma-make-some-info-messages-debug.patch
+++ /dev/null
@@ -1,40 +0,0 @@
---- a/drivers/bcma/driver_mips.c
-+++ b/drivers/bcma/driver_mips.c
-@@ -144,8 +144,8 @@ static void bcma_core_mips_set_irq(struc
- 1 << irqflag);
- }
-
-- bcma_info(bus, "set_irq: core 0x%04x, irq %d => %d\n",
-- dev->id.id, oldirq + 2, irq + 2);
-+ bcma_debug(bus, "set_irq: core 0x%04x, irq %d => %d\n",
-+ dev->id.id, oldirq + 2, irq + 2);
- }
-
- static void bcma_core_mips_set_irq_name(struct bcma_bus *bus, unsigned int irq,
-@@ -168,7 +168,7 @@ static void bcma_core_mips_print_irq(str
- {
- int i;
- static const char *irq_name[] = {"2(S)", "3", "4", "5", "6", "D", "I"};
-- printk(KERN_INFO KBUILD_MODNAME ": core 0x%04x, irq :", dev->id.id);
-+ printk(KERN_DEBUG KBUILD_MODNAME ": core 0x%04x, irq :", dev->id.id);
- for (i = 0; i <= 6; i++)
- printk(" %s%s", irq_name[i], i == irq ? "*" : " ");
- printk("\n");
-@@ -269,7 +269,7 @@ void bcma_core_mips_init(struct bcma_drv
- if (mcore->setup_done)
- return;
-
-- bcma_info(bus, "Initializing MIPS core...\n");
-+ bcma_debug(bus, "Initializing MIPS core...\n");
-
- bcma_core_mips_early_init(mcore);
-
-@@ -317,7 +317,7 @@ void bcma_core_mips_init(struct bcma_drv
- "Unknown device (0x%x) found, can not configure IRQs\n",
- bus->chipinfo.id);
- }
-- bcma_info(bus, "IRQ reconfiguration done\n");
-+ bcma_debug(bus, "IRQ reconfiguration done\n");
- bcma_core_mips_dump_irq(bus);
-
- mcore->setup_done = true;
diff --git a/target/linux/brcm47xx/patches-3.6/183-bcma-mips-show-also-disabled-irqs.patch b/target/linux/brcm47xx/patches-3.6/183-bcma-mips-show-also-disabled-irqs.patch
deleted file mode 100644
index d44b3068e7..0000000000
--- a/target/linux/brcm47xx/patches-3.6/183-bcma-mips-show-also-disabled-irqs.patch
+++ /dev/null
@@ -1,56 +0,0 @@
---- a/drivers/bcma/driver_mips.c
-+++ b/drivers/bcma/driver_mips.c
-@@ -75,11 +75,16 @@ static u32 bcma_core_mips_irqflag(struct
- return dev->core_index;
- flag = bcma_aread32(dev, BCMA_MIPS_OOBSELOUTA30);
-
-- return flag & 0x1F;
-+ if (flag)
-+ return flag & 0x1F;
-+ else
-+ return 0x3f;
- }
-
- /* Get the MIPS IRQ assignment for a specified device.
- * If unassigned, 0 is returned.
-+ * If disabled, 5 is returned.
-+ * If not supported, 6 is returned.
- */
- unsigned int bcma_core_mips_irq(struct bcma_device *dev)
- {
-@@ -88,13 +93,15 @@ unsigned int bcma_core_mips_irq(struct b
- unsigned int irq;
-
- irqflag = bcma_core_mips_irqflag(dev);
-+ if (irqflag == 0x3f)
-+ return 6;
-
-- for (irq = 1; irq <= 4; irq++)
-+ for (irq = 0; irq <= 4; irq++)
- if (bcma_read32(mdev, BCMA_MIPS_MIPS74K_INTMASK(irq)) &
- (1 << irqflag))
- return irq;
-
-- return 0;
-+ return 5;
- }
- EXPORT_SYMBOL(bcma_core_mips_irq);
-
-@@ -115,7 +122,7 @@ static void bcma_core_mips_set_irq(struc
- bcma_write32(mdev, BCMA_MIPS_MIPS74K_INTMASK(0),
- bcma_read32(mdev, BCMA_MIPS_MIPS74K_INTMASK(0)) &
- ~(1 << irqflag));
-- else
-+ else if (oldirq != 5)
- bcma_write32(mdev, BCMA_MIPS_MIPS74K_INTMASK(oldirq), 0);
-
- /* assign the new one */
-@@ -145,7 +152,7 @@ static void bcma_core_mips_set_irq(struc
- }
-
- bcma_debug(bus, "set_irq: core 0x%04x, irq %d => %d\n",
-- dev->id.id, oldirq + 2, irq + 2);
-+ dev->id.id, oldirq <= 4 ? oldirq + 2 : 0, irq + 2);
- }
-
- static void bcma_core_mips_set_irq_name(struct bcma_bus *bus, unsigned int irq,
diff --git a/target/linux/brcm47xx/patches-3.6/184-bcma-mips-remove-assigned_irqs.patch b/target/linux/brcm47xx/patches-3.6/184-bcma-mips-remove-assigned_irqs.patch
deleted file mode 100644
index c402e111f8..0000000000
--- a/target/linux/brcm47xx/patches-3.6/184-bcma-mips-remove-assigned_irqs.patch
+++ /dev/null
@@ -1,21 +0,0 @@
---- a/drivers/bcma/driver_mips.c
-+++ b/drivers/bcma/driver_mips.c
-@@ -280,8 +280,6 @@ void bcma_core_mips_init(struct bcma_drv
-
- bcma_core_mips_early_init(mcore);
-
-- mcore->assigned_irqs = 1;
--
- switch (bus->chipinfo.id) {
- case BCMA_CHIP_ID_BCM4716:
- case BCMA_CHIP_ID_BCM4748:
---- a/include/linux/bcma/bcma_driver_mips.h
-+++ b/include/linux/bcma/bcma_driver_mips.h
-@@ -36,7 +36,6 @@ struct bcma_drv_mips {
- struct bcma_device *core;
- u8 setup_done:1;
- u8 early_setup_done:1;
-- unsigned int assigned_irqs;
- };
-
- #ifdef CONFIG_BCMA_DRIVER_MIPS
diff --git a/target/linux/brcm47xx/patches-3.6/185-bcma-rename-oldirqflag-to-irqinitmask-to-better-matc.patch b/target/linux/brcm47xx/patches-3.6/185-bcma-rename-oldirqflag-to-irqinitmask-to-better-matc.patch
deleted file mode 100644
index 5fb952f604..0000000000
--- a/target/linux/brcm47xx/patches-3.6/185-bcma-rename-oldirqflag-to-irqinitmask-to-better-matc.patch
+++ /dev/null
@@ -1,24 +0,0 @@
---- a/drivers/bcma/driver_mips.c
-+++ b/drivers/bcma/driver_mips.c
-@@ -131,9 +131,9 @@ static void bcma_core_mips_set_irq(struc
- bcma_read32(mdev, BCMA_MIPS_MIPS74K_INTMASK(0)) |
- (1 << irqflag));
- } else {
-- u32 oldirqflag = bcma_read32(mdev,
-- BCMA_MIPS_MIPS74K_INTMASK(irq));
-- if (oldirqflag) {
-+ u32 irqinitmask = bcma_read32(mdev,
-+ BCMA_MIPS_MIPS74K_INTMASK(irq));
-+ if (irqinitmask) {
- struct bcma_device *core;
-
- /* backplane irq line is in use, find out who uses
-@@ -141,7 +141,7 @@ static void bcma_core_mips_set_irq(struc
- */
- list_for_each_entry(core, &bus->cores, list) {
- if ((1 << bcma_core_mips_irqflag(core)) ==
-- oldirqflag) {
-+ irqinitmask) {
- bcma_core_mips_set_irq(core, 0);
- break;
- }
diff --git a/target/linux/brcm47xx/patches-3.6/220-bcma-fix-detection-of-serial-flash-chips.patch b/target/linux/brcm47xx/patches-3.6/220-bcma-fix-detection-of-serial-flash-chips.patch
deleted file mode 100644
index 156771216d..0000000000
--- a/target/linux/brcm47xx/patches-3.6/220-bcma-fix-detection-of-serial-flash-chips.patch
+++ /dev/null
@@ -1,11 +0,0 @@
---- a/drivers/bcma/driver_chipcommon_sflash.c
-+++ b/drivers/bcma/driver_chipcommon_sflash.c
-@@ -42,7 +42,7 @@ static const struct bcma_sflash_tbl_e bc
- { "M25P40", 0x12, 0x10000, 8, },
-
- { "M25P16", 0x14, 0x10000, 32, },
-- { "M25P32", 0x14, 0x10000, 64, },
-+ { "M25P32", 0x15, 0x10000, 64, },
- { "M25P64", 0x16, 0x10000, 128, },
- { "M25FL128", 0x17, 0x10000, 256, },
- { 0 },
diff --git a/target/linux/brcm47xx/patches-3.6/235-bcma-dont-expose-mips-irq.patch b/target/linux/brcm47xx/patches-3.6/235-bcma-dont-expose-mips-irq.patch
index 5df8636058..b7cf0bced4 100644
--- a/target/linux/brcm47xx/patches-3.6/235-bcma-dont-expose-mips-irq.patch
+++ b/target/linux/brcm47xx/patches-3.6/235-bcma-dont-expose-mips-irq.patch
@@ -10,7 +10,7 @@
#endif /* LINUX_BCMA_DRIVER_MIPS_H_ */
--- a/drivers/bcma/driver_chipcommon.c
+++ b/drivers/bcma/driver_chipcommon.c
-@@ -258,7 +258,7 @@ void bcma_chipco_serial_init(struct bcma
+@@ -329,7 +329,7 @@ void bcma_chipco_serial_init(struct bcma
return;
}
@@ -64,17 +64,6 @@
+ return bcma_core_irq(pc_host->pdev->core);
}
EXPORT_SYMBOL(bcma_core_pci_pcibios_map_irq);
---- a/arch/mips/bcm47xx/gpio.c
-+++ b/arch/mips/bcm47xx/gpio.c
-@@ -94,7 +94,7 @@ int gpio_to_irq(unsigned gpio)
- #endif
- #ifdef CONFIG_BCM47XX_BCMA
- case BCM47XX_BUS_TYPE_BCMA:
-- return bcma_core_mips_irq(bcm47xx_bus.bcma.bus.drv_cc.core) + 2;
-+ return bcma_core_irq(bcm47xx_bus.bcma.bus.drv_cc.core);
- #endif
- }
- return -EINVAL;
--- a/arch/mips/bcm47xx/serial.c
+++ b/arch/mips/bcm47xx/serial.c
@@ -62,7 +62,7 @@ static int __init uart8250_init_bcma(voi
diff --git a/target/linux/brcm47xx/patches-3.6/280-activate_ssb_support_in_usb.patch b/target/linux/brcm47xx/patches-3.6/280-activate_ssb_support_in_usb.patch
index 8b858e11ba..c4382ed514 100644
--- a/target/linux/brcm47xx/patches-3.6/280-activate_ssb_support_in_usb.patch
+++ b/target/linux/brcm47xx/patches-3.6/280-activate_ssb_support_in_usb.patch
@@ -15,8 +15,8 @@ This prevents the options from being delete with make kernel_oldconfig.
bool "BCMA Broadcom MIPS core driver"
--- a/drivers/ssb/Kconfig
+++ b/drivers/ssb/Kconfig
-@@ -146,6 +146,7 @@ config SSB_EMBEDDED
- config SSB_SFLASH
+@@ -146,6 +146,7 @@ config SSB_SFLASH
+ config SSB_EMBEDDED
bool
depends on SSB_DRIVER_MIPS
+ select USB_HCD_SSB if USB_EHCI_HCD || USB_OHCI_HCD
diff --git a/target/linux/brcm47xx/patches-3.6/400-arch-bcm47xx.patch b/target/linux/brcm47xx/patches-3.6/400-arch-bcm47xx.patch
index 1ed0b8ab66..c8c3158c10 100644
--- a/target/linux/brcm47xx/patches-3.6/400-arch-bcm47xx.patch
+++ b/target/linux/brcm47xx/patches-3.6/400-arch-bcm47xx.patch
@@ -1,6 +1,6 @@
--- a/arch/mips/bcm47xx/nvram.c
+++ b/arch/mips/bcm47xx/nvram.c
-@@ -196,3 +196,30 @@ int bcm47xx_nvram_getenv(char *name, cha
+@@ -198,3 +198,30 @@ int bcm47xx_nvram_getenv(char *name, cha
return -ENOENT;
}
EXPORT_SYMBOL(bcm47xx_nvram_getenv);
@@ -31,3 +31,147 @@
+ return NULL;
+}
+EXPORT_SYMBOL(nvram_get);
+--- a/arch/mips/bcm47xx/Makefile
++++ b/arch/mips/bcm47xx/Makefile
+@@ -4,4 +4,5 @@
+ #
+
+ obj-y += irq.o nvram.o prom.o serial.o setup.o time.o sprom.o
++obj-y += gpio.o
+ obj-$(CONFIG_BCM47XX_SSB) += wgt634u.o
+--- /dev/null
++++ b/arch/mips/bcm47xx/gpio.c
+@@ -0,0 +1,119 @@
++/*
++ * This file is subject to the terms and conditions of the GNU General Public
++ * License. See the file "COPYING" in the main directory of this archive
++ * for more details.
++ *
++ * Copyright (C) 2007 Aurelien Jarno <aurelien@aurel32.net>
++ * Copyright (C) 2012 Hauke Mehrtens <hauke@hauke-m.de>
++ *
++ * Parts of this file are based on Atheros AR71XX/AR724X/AR913X GPIO
++ */
++
++#include <linux/export.h>
++#include <linux/gpio.h>
++#include <linux/ssb/ssb_embedded.h>
++#include <linux/bcma/bcma.h>
++
++#include <bcm47xx.h>
++
++/* low level BCM47xx gpio api */
++u32 bcm47xx_gpio_in(u32 mask)
++{
++ switch (bcm47xx_bus_type) {
++#ifdef CONFIG_BCM47XX_SSB
++ case BCM47XX_BUS_TYPE_SSB:
++ return ssb_gpio_in(&bcm47xx_bus.ssb, mask);
++#endif
++#ifdef CONFIG_BCM47XX_BCMA
++ case BCM47XX_BUS_TYPE_BCMA:
++ return bcma_chipco_gpio_in(&bcm47xx_bus.bcma.bus.drv_cc, mask);
++#endif
++ }
++ return -EINVAL;
++}
++EXPORT_SYMBOL(bcm47xx_gpio_in);
++
++u32 bcm47xx_gpio_out(u32 mask, u32 value)
++{
++ switch (bcm47xx_bus_type) {
++#ifdef CONFIG_BCM47XX_SSB
++ case BCM47XX_BUS_TYPE_SSB:
++ return ssb_gpio_out(&bcm47xx_bus.ssb, mask, value);
++#endif
++#ifdef CONFIG_BCM47XX_BCMA
++ case BCM47XX_BUS_TYPE_BCMA:
++ return bcma_chipco_gpio_out(&bcm47xx_bus.bcma.bus.drv_cc, mask,
++ value);
++#endif
++ }
++ return -EINVAL;
++}
++EXPORT_SYMBOL(bcm47xx_gpio_out);
++
++u32 bcm47xx_gpio_outen(u32 mask, u32 value)
++{
++ switch (bcm47xx_bus_type) {
++#ifdef CONFIG_BCM47XX_SSB
++ case BCM47XX_BUS_TYPE_SSB:
++ return ssb_gpio_outen(&bcm47xx_bus.ssb, 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);
++
++u32 bcm47xx_gpio_control(u32 mask, u32 value)
++{
++ switch (bcm47xx_bus_type) {
++#ifdef CONFIG_BCM47XX_SSB
++ case BCM47XX_BUS_TYPE_SSB:
++ return ssb_gpio_control(&bcm47xx_bus.ssb, mask, value);
++#endif
++#ifdef CONFIG_BCM47XX_BCMA
++ case BCM47XX_BUS_TYPE_BCMA:
++ return bcma_chipco_gpio_control(&bcm47xx_bus.bcma.bus.drv_cc,
++ mask, value);
++#endif
++ }
++ return -EINVAL;
++}
++EXPORT_SYMBOL(bcm47xx_gpio_control);
++
++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_chipco_gpio_intmask(&bcm47xx_bus.bcma.bus.drv_cc,
++ mask, value);
++#endif
++ }
++ return -EINVAL;
++}
++EXPORT_SYMBOL(bcm47xx_gpio_intmask);
++
++u32 bcm47xx_gpio_polarity(u32 mask, u32 value)
++{
++ 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_chipco_gpio_polarity(&bcm47xx_bus.bcma.bus.drv_cc,
++ mask, value);
++#endif
++ }
++ return -EINVAL;
++}
++EXPORT_SYMBOL(bcm47xx_gpio_polarity);
+--- a/arch/mips/include/asm/mach-bcm47xx/gpio.h
++++ b/arch/mips/include/asm/mach-bcm47xx/gpio.h
+@@ -14,4 +14,11 @@ static inline int irq_to_gpio(unsigned i
+ return -EINVAL;
+ }
+
++u32 bcm47xx_gpio_in(u32 mask);
++u32 bcm47xx_gpio_out(u32 mask, u32 value);
++u32 bcm47xx_gpio_outen(u32 mask, u32 value);
++u32 bcm47xx_gpio_control(u32 mask, u32 value);
++u32 bcm47xx_gpio_intmask(u32 mask, u32 value);
++u32 bcm47xx_gpio_polarity(u32 mask, u32 value);
++
+ #endif
diff --git a/target/linux/brcm47xx/patches-3.6/500-ssb-add-function-to-return-number-of-gpio-lines.patch b/target/linux/brcm47xx/patches-3.6/500-ssb-add-function-to-return-number-of-gpio-lines.patch
deleted file mode 100644
index 8c4634c03b..0000000000
--- a/target/linux/brcm47xx/patches-3.6/500-ssb-add-function-to-return-number-of-gpio-lines.patch
+++ /dev/null
@@ -1,40 +0,0 @@
---- a/drivers/ssb/embedded.c
-+++ b/drivers/ssb/embedded.c
-@@ -171,6 +171,18 @@ u32 ssb_gpio_polarity(struct ssb_bus *bu
- }
- EXPORT_SYMBOL(ssb_gpio_polarity);
-
-+int ssb_gpio_count(struct ssb_bus *bus)
-+{
-+ if (ssb_chipco_available(&bus->chipco))
-+ return SSB_GPIO_CHIPCO_LINES;
-+ else if (ssb_extif_available(&bus->extif))
-+ return SSB_GPIO_EXTIF_LINES;
-+ else
-+ SSB_WARN_ON(1);
-+ return 0;
-+}
-+EXPORT_SYMBOL(ssb_gpio_count);
-+
- #ifdef CONFIG_SSB_DRIVER_GIGE
- static int gige_pci_init_callback(struct ssb_bus *bus, unsigned long data)
- {
---- a/include/linux/ssb/ssb_embedded.h
-+++ b/include/linux/ssb/ssb_embedded.h
-@@ -7,6 +7,9 @@
-
- extern int ssb_watchdog_timer_set(struct ssb_bus *bus, u32 ticks);
-
-+#define SSB_GPIO_EXTIF_LINES 5
-+#define SSB_GPIO_CHIPCO_LINES 16
-+
- /* Generic GPIO API */
- u32 ssb_gpio_in(struct ssb_bus *bus, u32 mask);
- u32 ssb_gpio_out(struct ssb_bus *bus, u32 mask, u32 value);
-@@ -14,5 +17,6 @@ u32 ssb_gpio_outen(struct ssb_bus *bus,
- u32 ssb_gpio_control(struct ssb_bus *bus, u32 mask, u32 value);
- u32 ssb_gpio_intmask(struct ssb_bus *bus, u32 mask, u32 value);
- u32 ssb_gpio_polarity(struct ssb_bus *bus, u32 mask, u32 value);
-+int ssb_gpio_count(struct ssb_bus *bus);
-
- #endif /* LINUX_SSB_EMBEDDED_H_ */
diff --git a/target/linux/brcm47xx/patches-3.6/501-bcma-add-gpio-driver.patch b/target/linux/brcm47xx/patches-3.6/501-bcma-add-gpio-driver.patch
deleted file mode 100644
index d00a164eb9..0000000000
--- a/target/linux/brcm47xx/patches-3.6/501-bcma-add-gpio-driver.patch
+++ /dev/null
@@ -1,140 +0,0 @@
---- a/drivers/bcma/driver_chipcommon.c
-+++ b/drivers/bcma/driver_chipcommon.c
-@@ -158,6 +158,8 @@ void bcma_core_chipcommon_init(struct bc
- }
- cc->ticks_per_ms = bcma_chipco_watchdog_ticks_per_ms(cc);
-
-+ spin_lock_init(&cc->gpio_lock);
-+
- cc->setup_done = true;
- }
-
-@@ -197,34 +199,81 @@ u32 bcma_chipco_irq_status(struct bcma_d
-
- u32 bcma_chipco_gpio_in(struct bcma_drv_cc *cc, u32 mask)
- {
-- return bcma_cc_read32(cc, BCMA_CC_GPIOIN) & mask;
-+ unsigned long flags;
-+ u32 res;
-+
-+ spin_lock_irqsave(&cc->gpio_lock, flags);
-+ res = bcma_cc_read32(cc, BCMA_CC_GPIOIN) & mask;
-+ spin_unlock_irqrestore(&cc->gpio_lock, flags);
-+
-+ return res;
- }
-+EXPORT_SYMBOL_GPL(bcma_chipco_gpio_in);
-
- u32 bcma_chipco_gpio_out(struct bcma_drv_cc *cc, u32 mask, u32 value)
- {
-- return bcma_cc_write32_masked(cc, BCMA_CC_GPIOOUT, mask, value);
-+ unsigned long flags;
-+ u32 res;
-+
-+ spin_lock_irqsave(&cc->gpio_lock, flags);
-+ res = bcma_cc_write32_masked(cc, BCMA_CC_GPIOOUT, mask, value);
-+ spin_unlock_irqrestore(&cc->gpio_lock, flags);
-+
-+ return res;
- }
-+EXPORT_SYMBOL_GPL(bcma_chipco_gpio_out);
-
- u32 bcma_chipco_gpio_outen(struct bcma_drv_cc *cc, u32 mask, u32 value)
- {
-- return bcma_cc_write32_masked(cc, BCMA_CC_GPIOOUTEN, mask, value);
-+ unsigned long flags;
-+ u32 res;
-+
-+ spin_lock_irqsave(&cc->gpio_lock, flags);
-+ res = bcma_cc_write32_masked(cc, BCMA_CC_GPIOOUTEN, mask, value);
-+ spin_unlock_irqrestore(&cc->gpio_lock, flags);
-+
-+ return res;
- }
-+EXPORT_SYMBOL_GPL(bcma_chipco_gpio_outen);
-
- u32 bcma_chipco_gpio_control(struct bcma_drv_cc *cc, u32 mask, u32 value)
- {
-- return bcma_cc_write32_masked(cc, BCMA_CC_GPIOCTL, mask, value);
-+ unsigned long flags;
-+ u32 res;
-+
-+ spin_lock_irqsave(&cc->gpio_lock, flags);
-+ res = bcma_cc_write32_masked(cc, BCMA_CC_GPIOCTL, mask, value);
-+ spin_unlock_irqrestore(&cc->gpio_lock, flags);
-+
-+ return res;
- }
- EXPORT_SYMBOL_GPL(bcma_chipco_gpio_control);
-
- u32 bcma_chipco_gpio_intmask(struct bcma_drv_cc *cc, u32 mask, u32 value)
- {
-- return bcma_cc_write32_masked(cc, BCMA_CC_GPIOIRQ, mask, value);
-+ unsigned long flags;
-+ u32 res;
-+
-+ spin_lock_irqsave(&cc->gpio_lock, flags);
-+ res = bcma_cc_write32_masked(cc, BCMA_CC_GPIOIRQ, mask, value);
-+ spin_unlock_irqrestore(&cc->gpio_lock, flags);
-+
-+ return res;
- }
-+EXPORT_SYMBOL_GPL(bcma_chipco_gpio_intmask);
-
- u32 bcma_chipco_gpio_polarity(struct bcma_drv_cc *cc, u32 mask, u32 value)
- {
-- return bcma_cc_write32_masked(cc, BCMA_CC_GPIOPOL, mask, value);
-+ unsigned long flags;
-+ u32 res;
-+
-+ spin_lock_irqsave(&cc->gpio_lock, flags);
-+ res = bcma_cc_write32_masked(cc, BCMA_CC_GPIOPOL, mask, value);
-+ spin_unlock_irqrestore(&cc->gpio_lock, flags);
-+
-+ return res;
- }
-+EXPORT_SYMBOL_GPL(bcma_chipco_gpio_polarity);
-
- #ifdef CONFIG_BCMA_DRIVER_MIPS
- void bcma_chipco_serial_init(struct bcma_drv_cc *cc)
---- a/include/linux/bcma/bcma_driver_chipcommon.h
-+++ b/include/linux/bcma/bcma_driver_chipcommon.h
-@@ -555,6 +555,9 @@ struct bcma_drv_cc {
- #endif /* CONFIG_BCMA_DRIVER_MIPS */
- u32 ticks_per_ms;
- struct platform_device *watchdog;
-+
-+ /* Lock for GPIO register access. */
-+ spinlock_t gpio_lock;
- };
-
- /* Register access */
-@@ -584,13 +587,22 @@ void bcma_chipco_irq_mask(struct bcma_dr
-
- u32 bcma_chipco_irq_status(struct bcma_drv_cc *cc, u32 mask);
-
-+#define BCMA_CC_GPIO_LINES 16
-+
- /* Chipcommon GPIO pin access. */
--u32 bcma_chipco_gpio_in(struct bcma_drv_cc *cc, u32 mask);
--u32 bcma_chipco_gpio_out(struct bcma_drv_cc *cc, u32 mask, u32 value);
--u32 bcma_chipco_gpio_outen(struct bcma_drv_cc *cc, u32 mask, u32 value);
--u32 bcma_chipco_gpio_control(struct bcma_drv_cc *cc, u32 mask, u32 value);
--u32 bcma_chipco_gpio_intmask(struct bcma_drv_cc *cc, u32 mask, u32 value);
--u32 bcma_chipco_gpio_polarity(struct bcma_drv_cc *cc, u32 mask, u32 value);
-+extern u32 bcma_chipco_gpio_in(struct bcma_drv_cc *cc, u32 mask);
-+extern u32 bcma_chipco_gpio_out(struct bcma_drv_cc *cc, u32 mask, u32 value);
-+extern u32 bcma_chipco_gpio_outen(struct bcma_drv_cc *cc, u32 mask, u32 value);
-+extern u32 bcma_chipco_gpio_control(struct bcma_drv_cc *cc, u32 mask,
-+ u32 value);
-+extern u32 bcma_chipco_gpio_intmask(struct bcma_drv_cc *cc, u32 mask,
-+ u32 value);
-+extern u32 bcma_chipco_gpio_polarity(struct bcma_drv_cc *cc, u32 mask,
-+ u32 value);
-+static inline int bcma_chipco_gpio_count(void)
-+{
-+ return BCMA_CC_GPIO_LINES;
-+}
-
- /* PMU support */
- extern void bcma_pmu_init(struct bcma_drv_cc *cc);
diff --git a/target/linux/brcm47xx/patches-3.6/502-bcm47xx-rewrite-gpio-handling.patch b/target/linux/brcm47xx/patches-3.6/502-bcm47xx-rewrite-gpio-handling.patch
deleted file mode 100644
index cff3184d88..0000000000
--- a/target/linux/brcm47xx/patches-3.6/502-bcm47xx-rewrite-gpio-handling.patch
+++ /dev/null
@@ -1,493 +0,0 @@
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -101,6 +101,7 @@ config ATH79
-
- config BCM47XX
- bool "Broadcom BCM47XX based boards"
-+ select ARCH_REQUIRE_GPIOLIB
- select BOOT_RAW
- select CEVT_R4K
- select CSRC_R4K
-@@ -110,7 +111,6 @@ config BCM47XX
- select NO_EXCEPT_FILL
- select SYS_SUPPORTS_32BIT_KERNEL
- select SYS_SUPPORTS_LITTLE_ENDIAN
-- select GENERIC_GPIO
- select CFE
- help
- Support for BCM47XX based boards
---- a/arch/mips/bcm47xx/gpio.c
-+++ b/arch/mips/bcm47xx/gpio.c
-@@ -4,83 +4,154 @@
- * for more details.
- *
- * Copyright (C) 2007 Aurelien Jarno <aurelien@aurel32.net>
-+ * Copyright (C) 2012 Hauke Mehrtens <hauke@hauke-m.de>
-+ *
-+ * Parts of this file are based on Atheros AR71XX/AR724X/AR913X GPIO
- */
-
- #include <linux/export.h>
-+#include <linux/gpio.h>
- #include <linux/ssb/ssb.h>
--#include <linux/ssb/ssb_driver_chipcommon.h>
--#include <linux/ssb/ssb_driver_extif.h>
--#include <asm/mach-bcm47xx/bcm47xx.h>
--#include <asm/mach-bcm47xx/gpio.h>
-+#include <linux/ssb/ssb_embedded.h>
-+#include <linux/bcma/bcma.h>
-+
-+#include <bcm47xx.h>
-
--#if (BCM47XX_CHIPCO_GPIO_LINES > BCM47XX_EXTIF_GPIO_LINES)
--static DECLARE_BITMAP(gpio_in_use, BCM47XX_CHIPCO_GPIO_LINES);
--#else
--static DECLARE_BITMAP(gpio_in_use, BCM47XX_EXTIF_GPIO_LINES);
--#endif
-
--int gpio_request(unsigned gpio, const char *tag)
-+static unsigned long bcm47xx_gpio_count;
-+
-+/* low level BCM47xx gpio api */
-+u32 bcm47xx_gpio_in(u32 mask)
- {
- 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(&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:
-- 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);
-
-- return 0;
-+u32 bcm47xx_gpio_out(u32 mask, u32 value)
-+{
-+ switch (bcm47xx_bus_type) {
-+#ifdef CONFIG_BCM47XX_SSB
-+ case BCM47XX_BUS_TYPE_SSB:
-+ return ssb_gpio_out(&bcm47xx_bus.ssb, mask, value);
-+#endif
-+#ifdef CONFIG_BCM47XX_BCMA
-+ case BCM47XX_BUS_TYPE_BCMA:
-+ 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);
-
--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:
-- 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:
-+ return bcma_chipco_gpio_outen(&bcm47xx_bus.bcma.bus.drv_cc,
-+ mask, value);
-+#endif
-+ }
-+ return -EINVAL;
-+}
-+EXPORT_SYMBOL(bcm47xx_gpio_outen);
-
-- 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) {
-+#ifdef CONFIG_BCM47XX_SSB
-+ case BCM47XX_BUS_TYPE_SSB:
-+ return ssb_gpio_control(&bcm47xx_bus.ssb, mask, value);
-+#endif
-+#ifdef CONFIG_BCM47XX_BCMA
-+ case BCM47XX_BUS_TYPE_BCMA:
-+ return bcma_chipco_gpio_control(&bcm47xx_bus.bcma.bus.drv_cc,
-+ mask, value);
-+#endif
-+ }
-+ return -EINVAL;
-+}
-+EXPORT_SYMBOL(bcm47xx_gpio_control);
-
-- 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:
-- 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);
-
-- 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:
-+ return ssb_gpio_polarity(&bcm47xx_bus.ssb, mask, value);
-+#endif
-+#ifdef CONFIG_BCM47XX_BCMA
-+ case BCM47XX_BUS_TYPE_BCMA:
-+ 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);
-+}
-+
-+static void bcm47xx_gpio_set_value(struct gpio_chip *chip,
-+ unsigned gpio, int value)
-+{
-+ bcm47xx_gpio_out(1 << gpio, value ? 1 << gpio : 0);
-+}
-+
-+static int bcm47xx_gpio_direction_input(struct gpio_chip *chip,
-+ unsigned gpio)
-+{
-+ bcm47xx_gpio_outen(1 << gpio, 0);
-+ return 0;
-+}
-+
-+static int bcm47xx_gpio_direction_output(struct gpio_chip *chip,
-+ unsigned gpio, int value)
-+{
-+ /* first set the gpio out value */
-+ bcm47xx_gpio_out(1 << gpio, value ? 1 << gpio : 0);
-+ /* 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",
-+ .get = bcm47xx_gpio_get_value,
-+ .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,
-+};
-+
-+void __init bcm47xx_gpio_init(void)
-+{
-+ int err;
-+
-+ switch (bcm47xx_bus_type) {
-+#ifdef CONFIG_BCM47XX_SSB
-+ case BCM47XX_BUS_TYPE_SSB:
-+ bcm47xx_gpio_count = ssb_gpio_count(&bcm47xx_bus.ssb);
-+ 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);
-+}
-+
-+int gpio_get_value(unsigned gpio)
-+{
-+ if (gpio < bcm47xx_gpio_count)
-+ return bcm47xx_gpio_in(1 << gpio);
-+
-+ return __gpio_get_value(gpio);
-+}
-+EXPORT_SYMBOL(gpio_get_value);
-+
-+void gpio_set_value(unsigned gpio, int value)
-+{
-+ if (gpio < bcm47xx_gpio_count)
-+ bcm47xx_gpio_out(1 << gpio, value ? 1 << gpio : 0);
-+ else
-+ __gpio_set_value(gpio, value);
-+}
-+EXPORT_SYMBOL(gpio_set_value);
---- a/arch/mips/bcm47xx/setup.c
-+++ b/arch/mips/bcm47xx/setup.c
-@@ -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;
-+
-+ bcm47xx_gpio_init();
- }
-
- static int __init bcm47xx_register_bus_complete(void)
---- a/arch/mips/bcm47xx/wgt634u.c
-+++ b/arch/mips/bcm47xx/wgt634u.c
-@@ -133,6 +133,7 @@ static int __init wgt634u_init(void)
- * been allocated ranges 00:09:5b:xx:xx:xx and 00:0f:b5:xx:xx:xx.
- */
- u8 *et0mac;
-+ int err;
-
- if (bcm47xx_bus_type != BCM47XX_BUS_TYPE_SSB)
- return -ENODEV;
-@@ -146,6 +147,12 @@ static int __init wgt634u_init(void)
-
- printk(KERN_INFO "WGT634U machine detected.\n");
-
-+ err = gpio_request(WGT634U_GPIO_RESET, "reset-buton");
-+ if (err) {
-+ 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", &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
- const char *prefix);
- #endif
-
-+void bcm47xx_gpio_init(void);
-+
- #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,42 @@
- * for more details.
- *
- * Copyright (C) 2007 Aurelien Jarno <aurelien@aurel32.net>
-+ * Copyright (C) 2012 Hauke Mehrtens <hauke@hauke-m.de>
- */
-
- #ifndef __BCM47XX_GPIO_H
- #define __BCM47XX_GPIO_H
-
--#include <linux/ssb/ssb_embedded.h>
--#include <linux/bcma/bcma.h>
--#include <asm/mach-bcm47xx/bcm47xx.h>
--
--#define BCM47XX_EXTIF_GPIO_LINES 5
--#define BCM47XX_CHIPCO_GPIO_LINES 16
--
--extern int gpio_request(unsigned gpio, const char *label);
--extern void gpio_free(unsigned gpio);
--extern int gpio_to_irq(unsigned gpio);
--
--static inline int gpio_get_value(unsigned gpio)
--{
-- switch (bcm47xx_bus_type) {
--#ifdef CONFIG_BCM47XX_SSB
-- case BCM47XX_BUS_TYPE_SSB:
-- return ssb_gpio_in(&bcm47xx_bus.ssb, 1 << gpio);
--#endif
--#ifdef CONFIG_BCM47XX_BCMA
-- case BCM47XX_BUS_TYPE_BCMA:
-- return bcma_chipco_gpio_in(&bcm47xx_bus.bcma.bus.drv_cc,
-- 1 << gpio);
--#endif
-- }
-- return -EINVAL;
--}
--
--#define gpio_get_value_cansleep gpio_get_value
--
--static inline void gpio_set_value(unsigned gpio, int value)
--{
-- switch (bcm47xx_bus_type) {
--#ifdef CONFIG_BCM47XX_SSB
-- case BCM47XX_BUS_TYPE_SSB:
-- ssb_gpio_out(&bcm47xx_bus.ssb, 1 << gpio,
-- value ? 1 << gpio : 0);
-- return;
--#endif
--#ifdef CONFIG_BCM47XX_BCMA
-- case BCM47XX_BUS_TYPE_BCMA:
-- bcma_chipco_gpio_out(&bcm47xx_bus.bcma.bus.drv_cc, 1 << gpio,
-- value ? 1 << gpio : 0);
-- return;
--#endif
-- }
--}
--
--#define gpio_set_value_cansleep gpio_set_value
--
--static inline int gpio_cansleep(unsigned gpio)
--{
-- 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_outen(u32 mask, u32 value);
-+u32 bcm47xx_gpio_control(u32 mask, u32 value);
-+u32 bcm47xx_gpio_intmask(u32 mask, u32 value);
-+u32 bcm47xx_gpio_polarity(u32 mask, u32 value);
-
--static inline int gpio_direction_input(unsigned gpio)
--{
-- switch (bcm47xx_bus_type) {
--#ifdef CONFIG_BCM47XX_SSB
-- case BCM47XX_BUS_TYPE_SSB:
-- ssb_gpio_outen(&bcm47xx_bus.ssb, 1 << gpio, 0);
-- return 0;
--#endif
--#ifdef CONFIG_BCM47XX_BCMA
-- case BCM47XX_BUS_TYPE_BCMA:
-- bcma_chipco_gpio_outen(&bcm47xx_bus.bcma.bus.drv_cc, 1 << gpio,
-- 0);
-- return 0;
--#endif
-- }
-- return -EINVAL;
--}
-+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_intmask(unsigned gpio, int value)
- {
-- switch (bcm47xx_bus_type) {
--#ifdef CONFIG_BCM47XX_SSB
-- case BCM47XX_BUS_TYPE_SSB:
-- /* first set the gpio out value */
-- ssb_gpio_out(&bcm47xx_bus.ssb, 1 << gpio,
-- value ? 1 << gpio : 0);
-- /* then set the gpio mode */
-- ssb_gpio_outen(&bcm47xx_bus.ssb, 1 << gpio, 1 << gpio);
-- return 0;
--#endif
--#ifdef CONFIG_BCM47XX_BCMA
-- case BCM47XX_BUS_TYPE_BCMA:
-- /* first set the gpio out value */
-- bcma_chipco_gpio_out(&bcm47xx_bus.bcma.bus.drv_cc, 1 << gpio,
-- value ? 1 << gpio : 0);
-- /* then set the gpio mode */
-- bcma_chipco_gpio_outen(&bcm47xx_bus.bcma.bus.drv_cc, 1 << gpio,
-- 1 << gpio);
-- return 0;
--#endif
-- }
-- return -EINVAL;
-+ 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:
-- ssb_gpio_intmask(&bcm47xx_bus.ssb, 1 << gpio,
-- value ? 1 << gpio : 0);
-- return 0;
--#endif
--#ifdef CONFIG_BCM47XX_BCMA
-- case BCM47XX_BUS_TYPE_BCMA:
-- bcma_chipco_gpio_intmask(&bcm47xx_bus.bcma.bus.drv_cc,
-- 1 << gpio, value ? 1 << gpio : 0);
-- return 0;
--#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:
-- ssb_gpio_polarity(&bcm47xx_bus.ssb, 1 << gpio,
-- value ? 1 << gpio : 0);
-- return 0;
--#endif
--#ifdef CONFIG_BCM47XX_BCMA
-- case BCM47XX_BUS_TYPE_BCMA:
-- bcma_chipco_gpio_polarity(&bcm47xx_bus.bcma.bus.drv_cc,
-- 1 << gpio, value ? 1 << gpio : 0);
-- return 0;
--#endif
-- }
- 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.6/812-disable_wgt634u_crap.patch b/target/linux/brcm47xx/patches-3.6/812-disable_wgt634u_crap.patch
index 2819ca1739..0dc1564ad2 100644
--- a/target/linux/brcm47xx/patches-3.6/812-disable_wgt634u_crap.patch
+++ b/target/linux/brcm47xx/patches-3.6/812-disable_wgt634u_crap.patch
@@ -1,13 +1,13 @@
--- a/arch/mips/bcm47xx/Makefile
+++ b/arch/mips/bcm47xx/Makefile
-@@ -4,4 +4,3 @@
- #
+@@ -5,4 +5,3 @@
- obj-y += gpio.o irq.o nvram.o prom.o serial.o setup.o time.o sprom.o
+ obj-y += irq.o nvram.o prom.o serial.o setup.o time.o sprom.o
+ obj-y += gpio.o
-obj-$(CONFIG_BCM47XX_SSB) += wgt634u.o
--- a/arch/mips/bcm47xx/wgt634u.c
+++ /dev/null
-@@ -1,177 +0,0 @@
+@@ -1,174 +0,0 @@
-/*
- * This file is subject to the terms and conditions of the GNU General Public
- * License. See the file "COPYING" in the main directory of this archive
@@ -21,6 +21,7 @@
-#include <linux/leds.h>
-#include <linux/mtd/physmap.h>
-#include <linux/ssb/ssb.h>
+-#include <linux/ssb/ssb_embedded.h>
-#include <linux/interrupt.h>
-#include <linux/reboot.h>
-#include <linux/gpio.h>
@@ -126,7 +127,8 @@
-
- /* Interrupt are level triggered, revert the interrupt polarity
- to clear the interrupt. */
-- gpio_polarity(WGT634U_GPIO_RESET, state);
+- ssb_gpio_polarity(&bcm47xx_bus.ssb, 1 << WGT634U_GPIO_RESET,
+- state ? 1 << WGT634U_GPIO_RESET : 0);
-
- if (!state) {
- printk(KERN_INFO "Reset button pressed");
@@ -143,7 +145,6 @@
- * been allocated ranges 00:09:5b:xx:xx:xx and 00:0f:b5:xx:xx:xx.
- */
- u8 *et0mac;
-- int err;
-
- if (bcm47xx_bus_type != BCM47XX_BUS_TYPE_SSB)
- return -ENODEV;
@@ -157,17 +158,13 @@
-
- printk(KERN_INFO "WGT634U machine detected.\n");
-
-- err = gpio_request(WGT634U_GPIO_RESET, "reset-buton");
-- if (err) {
-- 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", &bcm47xx_bus.ssb.chipco)) {
- gpio_direction_input(WGT634U_GPIO_RESET);
-- gpio_intmask(WGT634U_GPIO_RESET, 1);
+- ssb_gpio_intmask(&bcm47xx_bus.ssb,
+- 1 << WGT634U_GPIO_RESET,
+- 1 << WGT634U_GPIO_RESET);
- ssb_chipco_irq_mask(&bcm47xx_bus.ssb.chipco,
- SSB_CHIPCO_IRQ_GPIO,
- SSB_CHIPCO_IRQ_GPIO);
diff --git a/target/linux/brcm47xx/patches-3.6/820-wgt634u-nvram-fix.patch b/target/linux/brcm47xx/patches-3.6/820-wgt634u-nvram-fix.patch
index 74b17c74e6..745ff501ae 100644
--- a/target/linux/brcm47xx/patches-3.6/820-wgt634u-nvram-fix.patch
+++ b/target/linux/brcm47xx/patches-3.6/820-wgt634u-nvram-fix.patch
@@ -5,12 +5,11 @@ out the configuration than the in kernel cfe config reader.
--- a/arch/mips/bcm47xx/Makefile
+++ b/arch/mips/bcm47xx/Makefile
-@@ -3,4 +3,4 @@
- # under Linux.
- #
+@@ -5,3 +5,4 @@
--obj-y += gpio.o irq.o nvram.o prom.o serial.o setup.o time.o sprom.o
-+obj-y += gpio.o irq.o nvram.o prom.o serial.o setup.o time.o sprom.o cfe_env.o
+ obj-y += irq.o nvram.o prom.o serial.o setup.o time.o sprom.o
+ obj-y += gpio.o
++obj-y += cfe_env.o
--- /dev/null
+++ b/arch/mips/bcm47xx/cfe_env.c
@@ -0,0 +1,229 @@
@@ -281,7 +280,7 @@ out the configuration than the in kernel cfe config reader.
/* TODO: when nvram is on nand flash check for bad blocks first. */
off = FLASH_MIN;
while (off <= lim) {
-@@ -179,6 +201,12 @@ int bcm47xx_nvram_getenv(char *name, cha
+@@ -181,6 +203,12 @@ int bcm47xx_nvram_getenv(char *name, cha
return err;
}
@@ -294,7 +293,7 @@ out the configuration than the in kernel cfe config reader.
/* Look for name=value and return value */
var = &nvram_buf[sizeof(struct nvram_header)];
end = nvram_buf + sizeof(nvram_buf) - 2;
-@@ -207,6 +235,9 @@ char *nvram_get(const char *name)
+@@ -209,6 +237,9 @@ char *nvram_get(const char *name)
if (!nvram_buf[0])
nvram_init();