Browse Source

switch: update for brcm47xx target

* remove suport for 2.4 kernel
* add support for bcma bus

SVN-Revision: 27904
Hauke Mehrtens 14 years ago
parent
commit
b220442c75

+ 0 - 4
package/switch/Makefile

@@ -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)" \

+ 36 - 56
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 */

+ 1 - 1
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."

+ 33 - 25
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 <[email protected]>");
 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)

+ 0 - 1
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) {

+ 0 - 4
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 {

+ 13 - 11
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;
 }