switch: update for brcm47xx target
authorHauke Mehrtens <hauke@hauke-m.de>
Thu, 4 Aug 2011 20:07:58 +0000 (20:07 +0000)
committerHauke Mehrtens <hauke@hauke-m.de>
Thu, 4 Aug 2011 20:07:58 +0000 (20:07 +0000)
* remove suport for 2.4 kernel
* add support for bcma bus

SVN-Revision: 27904

package/switch/Makefile
package/switch/src/gpio-bcm947xx.h
package/switch/src/gpio.h
package/switch/src/switch-adm.c
package/switch/src/switch-core.c
package/switch/src/switch-core.h
package/switch/src/switch-robo.c

index 17158dac8bcba8eea4b26c4a66d2d8975600de98..364416de793f796d1773bef3b037d1a5bd0db0cd 100644 (file)
@@ -33,10 +33,6 @@ define Build/Prepare
        $(CP) ./src/* $(PKG_BUILD_DIR)/
 endef
 
-ifeq ($(BOARD),brcm47xx)
-    BUILDFLAGS := -DBROADCOM
-endif
-
 define Build/Compile
        $(MAKE) -C "$(LINUX_DIR)" \
                CROSS_COMPILE="$(TARGET_CROSS)" \
index 9135f916a76bbdd9d38f9f47d5e95e2d17f3c38f..23c221da879b3b9bfb48561bbfb00ca436c270e5 100644 (file)
@@ -1,75 +1,55 @@
 #ifndef __SWITCH_GPIO_H
 #define __SWITCH_GPIO_H
-#include <linux/interrupt.h>
 
-#ifndef BCMDRIVER
 #include <linux/ssb/ssb_embedded.h>
-
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,25)
-#define ssb ssb_bcm47xx
-#endif
-
-extern struct ssb_bus ssb;
-
+#include <linux/bcma/bcma_driver_chipcommon.h>
+#include <bcm47xx.h>
 
 static inline u32 gpio_in(void)
 {
-       return ssb_gpio_in(&ssb, ~0);
+       switch (bcm47xx_bus_type) {
+#ifdef CONFIG_BCM47XX_SSB
+       case BCM47XX_BUS_TYPE_SSB:
+               return ssb_gpio_in(&bcm47xx_bus.ssb, ~0);
+#endif
+#ifdef CONFIG_BCM47XX_BCMA
+       case BCM47XX_BUS_TYPE_BCMA:
+               return bcma_chipco_gpio_in(&bcm47xx_bus.bcma.bus.drv_cc, ~0);
+#endif
+       }
+       return -EINVAL;
 }
 
 static inline u32 gpio_out(u32 mask, u32 value)
 {
-       return ssb_gpio_out(&ssb, mask, 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;
 }
 
 static inline u32 gpio_outen(u32 mask, u32 value)
 {
-       return ssb_gpio_outen(&ssb, mask, value);
-}
-
-static inline u32 gpio_control(u32 mask, u32 value)
-{
-       return ssb_gpio_control(&ssb, mask, value);
-}
-
-static inline u32 gpio_intmask(u32 mask, u32 value)
-{
-       return ssb_gpio_intmask(&ssb, mask, value);
-}
-
-static inline u32 gpio_intpolarity(u32 mask, u32 value)
-{
-       return ssb_gpio_polarity(&ssb, mask, value);
-}
-
-#else
-
-#include <typedefs.h>
-#include <osl.h>
-#include <bcmdevs.h>
-#include <sbutils.h>
-#include <sbconfig.h>
-#include <sbchipc.h>
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
-#include <sbmips.h>
-#else
-#include <hndcpu.h>
+       switch (bcm47xx_bus_type) {
+#ifdef CONFIG_BCM47XX_SSB
+       case BCM47XX_BUS_TYPE_SSB:
+               ssb_gpio_outen(&bcm47xx_bus.ssb, mask, value);
+               return 0;
 #endif
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
-#define sbh bcm947xx_sbh
-#define sbh_lock bcm947xx_sbh_lock
+#ifdef CONFIG_BCM47XX_BCMA
+       case BCM47XX_BUS_TYPE_BCMA:
+               bcma_chipco_gpio_outen(&bcm47xx_bus.bcma.bus.drv_cc, mask, value);
+               return 0;
 #endif
+       }
+       return -EINVAL;
+}
 
-extern void *sbh;
-extern spinlock_t sbh_lock;
-
-#define gpio_in()      sb_gpioin(sbh)
-#define gpio_out(mask, value)  sb_gpioout(sbh, mask, ((value) & (mask)), GPIO_DRV_PRIORITY)
-#define gpio_outen(mask, value)        sb_gpioouten(sbh, mask, value, GPIO_DRV_PRIORITY)
-#define gpio_control(mask, value)      sb_gpiocontrol(sbh, mask, value, GPIO_DRV_PRIORITY)
-#define gpio_intmask(mask, value)      sb_gpiointmask(sbh, mask, value, GPIO_DRV_PRIORITY)
-#define gpio_intpolarity(mask, value)  sb_gpiointpolarity(sbh, mask, value, GPIO_DRV_PRIORITY)
-
-#endif /* BCMDRIVER */
 #endif /* __SWITCH_GPIO_H */
index e541cdac55ca3950a1071cfb549614c850791ec8..90bafd39ed82c2108d2d36b71798da9b6c041afa 100644 (file)
@@ -8,7 +8,7 @@
 #ifndef __GPIO_H
 #define __GPIO_H
 
-#ifdef BROADCOM
+#ifdef CONFIG_BCM47XX
 #include "gpio-bcm947xx.h"
 #else
 #warning "Unsupported configuration."
index fa59c3fb8d208f5dc8da623a17fdf1bc90ab3894..2aff14207b380aa0b19e1c1d02042b9e96cd99ca 100644 (file)
 #include "switch-core.h"
 #include "gpio.h"
 
+#ifdef CONFIG_BCM47XX
+#include <nvram.h>
+#endif
+
 #define DRIVER_NAME "adm6996"
 #define DRIVER_VERSION "0.01"
 
@@ -48,19 +52,11 @@ static int force = 0;
 
 MODULE_AUTHOR("Felix Fietkau <openwrt@nbd.name>");
 MODULE_LICENSE("GPL");
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,52)
 module_param(eecs, int, 0);
 module_param(eesk, int, 0);
 module_param(eedi, int, 0);
 module_param(eerc, int, 0);
 module_param(force, int, 0);
-#else
-MODULE_PARM(eecs, "i");
-MODULE_PARM(eesk, "i");
-MODULE_PARM(eedi, "i");
-MODULE_PARM(eerc, "i");
-MODULE_PARM(force, "i");
-#endif
 
 /* Minimum timing constants */
 #define EECK_EDGE_TIME  3   /* 3us - max(adm 2.5us, 93c 1us) */
@@ -74,8 +70,7 @@ MODULE_PARM(force, "i");
 
 #define atoi(str) simple_strtoul(((str != NULL) ? str : ""), NULL, 0)
 
-#ifdef BROADCOM
-extern char *nvram_get(char *name);
+#ifdef CONFIG_BCM47XX
 
 /* Return gpio pin number assigned to the named pin */
 /*
@@ -88,15 +83,16 @@ extern char *nvram_get(char *name);
 static unsigned int get_gpiopin(char *pin_name, unsigned int def_pin)
 {
        char name[] = "gpioXXXX";
-       char *val;
+       char val[10];
        unsigned int pin;
 
        /* Go thru all possibilities till a match in pin name */
        for (pin = 0; pin < 16; pin ++) {
                sprintf(name, "gpio%d", pin);
-               val = nvram_get(name);
-               if (val && !strcmp(val, pin_name))
-                       return pin;
+               if (nvram_getenv(name, val, sizeof(val)) >= 0) {
+                       if (!strcmp(val, pin_name))
+                               return pin;
+               }
        }
        return def_pin;
 }
@@ -495,9 +491,16 @@ static int detect_adm(void)
 {
        int ret = 0;
 
-#ifdef BROADCOM
-       int boardflags = atoi(nvram_get("boardflags"));
-        int boardnum = atoi(nvram_get("boardnum"));
+#ifdef CONFIG_BCM47XX
+       char buf[20];
+       int boardflags = 0;
+       int boardnum = 0;
+               
+       if (nvram_getenv("boardflags", buf, sizeof(buf)) >= 0)
+               boardflags = simple_strtoul(buf, NULL, 0);
+
+       if (nvram_getenv("boardnum", buf, sizeof(buf)) >= 0)
+               boardnum = simple_strtoul(buf, NULL, 0);
 
        if ((boardnum == 44) && (boardflags == 0x0388)) {  /* Trendware TEW-411BRP+ */
                ret = 1;
@@ -515,14 +518,19 @@ static int detect_adm(void)
                eedi = get_gpiopin("adm_eedi", 4);
                eerc = get_gpiopin("adm_rc", 0);
 
-       } else if ((strcmp(nvram_get("boardtype") ?: "", "bcm94710dev") == 0) &&
-                       (strncmp(nvram_get("boardnum") ?: "", "42", 2) == 0)) {
-               /* WRT54G v1.1 hack */
-               eecs = 2;
-               eesk = 3;
-               eedi = 5;
-
-               ret = 1;
+       } else if (nvram_getenv("boardtype", buf, sizeof(buf)) >= 0) {
+               if (strcmp(buf, "bcm94710dev") == 0) {
+                       if (nvram_getenv("boardnum", buf, sizeof(buf)) >= 0) {
+                               if (strncmp(buf, "42", 2) == 0) {
+                                       /* WRT54G v1.1 hack */
+                                       eecs = 2;
+                                       eesk = 3;
+                                       eedi = 5;
+
+                                       ret = 1;
+                               }
+                       }
+               }
        }
 
        if (eecs)
index 2e5395950e7fc74c5705e0c66612662ca6af7b65..f5b248aadbb2b60bbc15e06a38c7c9c7ba847458 100644 (file)
@@ -394,7 +394,6 @@ switch_vlan_config *switch_parse_vlan(switch_driver *driver, char *buf)
 
 int switch_device_registered (char* device) {
        struct list_head *pos;
-       switch_driver *new;
 
        list_for_each(pos, &drivers.list) {
                if (strcmp(list_entry(pos, switch_driver, list)->interface, device) == 0) {
index c9ab90dde81eb311a1b35df55a0ed7ece0df017d..a2114cf92d9f196b0f2866188b286b59a12cb619 100644 (file)
@@ -9,10 +9,6 @@
 #define SWITCH_MEDIA_100       2
 #define SWITCH_MEDIA_FD                4
 
-#ifndef KERNEL_VERSION
-#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
-#endif
-
 typedef int (*switch_handler)(void *driver, char *buf, int nr);
 
 typedef struct {
index 817fba3f48f28087bfd6ec0c6bf3f5eb1a80d1d3..ec9e3373375ac3dea59359121430969a51c6aad3 100644 (file)
 #include "switch-core.h"
 #include "etc53xx.h"
 
+#ifdef CONFIG_BCM47XX
+#include <nvram.h>
+#endif
+
 #define DRIVER_NAME            "bcm53xx"
 #define DRIVER_VERSION         "0.02"
 #define PFX                    "roboswitch: "
 #define SIOCGETCPHYRD           (SIOCDEVPRIVATE + 9)
 #define SIOCSETCPHYWR           (SIOCDEVPRIVATE + 10)
 
-/* Only available on brcm47xx */
-#ifdef BROADCOM
-extern char *nvram_get(const char *name);
-#define getvar(str) (nvram_get(str)?:"")
-#else
-#define getvar(str) ""
-#endif
-
 /* Data structure for a Roboswitch device. */
 struct robo_switch {
        char *device;                   /* The device name string (ethX) */
@@ -258,6 +254,9 @@ static int robo_switch_enable(void)
 {
        unsigned int i, last_port;
        u16 val;
+#ifdef CONFIG_BCM47XX
+       char buf[20];
+#endif
 
        val = robo_read16(ROBO_CTRL_PAGE, ROBO_SWITCH_MODE);
        if (!(val & (1 << 1))) {
@@ -278,10 +277,13 @@ static int robo_switch_enable(void)
                        robo_write16(ROBO_CTRL_PAGE, i, 0);
        }
 
+#ifdef CONFIG_BCM47XX
        /* WAN port LED, except for Netgear WGT634U */
-       if (strcmp(getvar("nvram_type"), "cfe") != 0)
-               robo_write16(ROBO_CTRL_PAGE, 0x16, 0x1F);
-
+       if (nvram_getenv("nvram_type", buf, sizeof(buf)) >= 0) {
+               if (strcmp(buf, "cfe") != 0)
+                       robo_write16(ROBO_CTRL_PAGE, 0x16, 0x1F);
+       }
+#endif
        return 0;
 }