diff options
Diffstat (limited to 'package/switch/src')
-rw-r--r-- | package/switch/src/gpio-bcm947xx.h | 92 | ||||
-rw-r--r-- | package/switch/src/gpio.h | 2 | ||||
-rw-r--r-- | package/switch/src/switch-adm.c | 58 | ||||
-rw-r--r-- | package/switch/src/switch-core.c | 1 | ||||
-rw-r--r-- | package/switch/src/switch-core.h | 4 | ||||
-rw-r--r-- | package/switch/src/switch-robo.c | 24 |
6 files changed, 83 insertions, 98 deletions
diff --git a/package/switch/src/gpio-bcm947xx.h b/package/switch/src/gpio-bcm947xx.h index 9135f91..23c221d 100644 --- a/package/switch/src/gpio-bcm947xx.h +++ b/package/switch/src/gpio-bcm947xx.h @@ -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 */ diff --git a/package/switch/src/gpio.h b/package/switch/src/gpio.h index e541cda..90bafd3 100644 --- a/package/switch/src/gpio.h +++ b/package/switch/src/gpio.h @@ -8,7 +8,7 @@ #ifndef __GPIO_H #define __GPIO_H -#ifdef BROADCOM +#ifdef CONFIG_BCM47XX #include "gpio-bcm947xx.h" #else #warning "Unsupported configuration." diff --git a/package/switch/src/switch-adm.c b/package/switch/src/switch-adm.c index fa59c3f..2aff142 100644 --- a/package/switch/src/switch-adm.c +++ b/package/switch/src/switch-adm.c @@ -37,6 +37,10 @@ #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) diff --git a/package/switch/src/switch-core.c b/package/switch/src/switch-core.c index 2e53959..f5b248a 100644 --- a/package/switch/src/switch-core.c +++ b/package/switch/src/switch-core.c @@ -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) { diff --git a/package/switch/src/switch-core.h b/package/switch/src/switch-core.h index c9ab90d..a2114cf 100644 --- a/package/switch/src/switch-core.h +++ b/package/switch/src/switch-core.h @@ -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 { diff --git a/package/switch/src/switch-robo.c b/package/switch/src/switch-robo.c index 817fba3..ec9e337 100644 --- a/package/switch/src/switch-robo.c +++ b/package/switch/src/switch-robo.c @@ -34,6 +34,10 @@ #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: " @@ -63,14 +67,6 @@ #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; } |