diff options
Diffstat (limited to 'target/linux/brcm47xx')
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(); |