diff options
Diffstat (limited to 'package/switch')
| -rw-r--r-- | package/switch/Makefile | 15 | ||||
| -rw-r--r-- | package/switch/src/gpio-bcm947xx.h | 86 | ||||
| -rw-r--r-- | package/switch/src/gpio.h | 41 | ||||
| -rw-r--r-- | package/switch/src/switch-adm.c | 34 | 
4 files changed, 118 insertions, 58 deletions
diff --git a/package/switch/Makefile b/package/switch/Makefile index 0ad6c3398..172d9911f 100644 --- a/package/switch/Makefile +++ b/package/switch/Makefile @@ -4,7 +4,7 @@  # This is free software, licensed under the GNU General Public License v2.  # See /LICENSE for more information.  # -# $Id:$ +# $Id$  include $(TOPDIR)/rules.mk  include $(INCLUDE_DIR)/kernel.mk @@ -18,7 +18,7 @@ include $(INCLUDE_DIR)/package.mk  define KernelPackage/switch    SUBMENU:=Other modules -  DEPENDS:=@LINUX_2_6_BRCM||LINUX_2_4_BRCM +  DEPENDS:=@LINUX_2_6_BRCM||LINUX_2_4_BRCM||LINUX_2_6_BRCM47XX    TITLE:=Switch drivers    DESCRIPTION:=\  	This package contains switch drivers for ADM6996L and BCM53XX RoboSwitch. @@ -35,12 +35,21 @@ define Build/Prepare  	$(CP) ./src/* $(PKG_BUILD_DIR)/  endef +ifeq ($(BOARD),brcm) +BUILDFLAGS := -DBROADCOM -DBCMDRIVER +else +ifeq ($(BOARD),brcm47xx) +BUILDFLAGS := -DBROADCOM +endif +endif + +  define Build/Compile  	$(MAKE) -C "$(LINUX_DIR)" \  		CROSS_COMPILE="$(TARGET_CROSS)" \  		ARCH="$(LINUX_KARCH)" \  		SUBDIRS="$(PKG_BUILD_DIR)" \ -		EXTRA_CFLAGS="-DBCMGPIO2" \ +		EXTRA_CFLAGS="$(BUILDFLAGS)" \  		modules  endef diff --git a/package/switch/src/gpio-bcm947xx.h b/package/switch/src/gpio-bcm947xx.h new file mode 100644 index 000000000..384ea3ea1 --- /dev/null +++ b/package/switch/src/gpio-bcm947xx.h @@ -0,0 +1,86 @@ +#ifndef __SWITCH_GPIO_H +#define __SWITCH_GPIO_H +#include <linux/interrupt.h> + +#ifndef BCMDRIVER +#include <linux/ssb/ssb.h> +#include <linux/ssb/ssb_driver_chipcommon.h> +#include <linux/ssb/ssb_driver_extif.h> + +extern struct ssb_bus ssb; + +#define gpio_op(op, param...) \ +	do { \ +		if (ssb.chipco.dev) \ +			return ssb_chipco_gpio_##op(&ssb.chipco, param); \ +		else if (ssb.extif.dev) \ +			return ssb_extif_gpio_##op(&ssb.extif, param); \ +		else \ +			return 0; \ +	} while (0); +		 + +static inline u32 gpio_in(void) +{ +	gpio_op(in, ~0); +} + +static inline u32 gpio_out(u32 mask, u32 value) +{ +	gpio_op(out, mask, value); +} + +static inline u32 gpio_outen(u32 mask, u32 value) +{ +	gpio_op(outen, mask, value); +} + +static inline u32 gpio_control(u32 mask, u32 value) +{ +	if (ssb.chipco.dev) +		return ssb_chipco_gpio_control(&ssb.chipco, mask, value); +	else +		return 0; +} + +static inline u32 gpio_intmask(u32 mask, u32 value) +{ +	gpio_op(intmask, mask, value); +} + +static inline u32 gpio_intpolarity(u32 mask, u32 value) +{ +	gpio_op(polarity, 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> +#endif + +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) +#define sbh bcm947xx_sbh +#define sbh_lock bcm947xx_sbh_lock +#endif + +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 800ae25a9..f4fadfc64 100644 --- a/package/switch/src/gpio.h +++ b/package/switch/src/gpio.h @@ -8,45 +8,10 @@  #ifndef __GPIO_H  #define __GPIO_H -#if defined(BCMGPIO2) - -#ifdef LINUX_2_4 -#define sbh bcm947xx_sbh -extern void *bcm947xx_sbh; -#else -extern void *sbh; -#endif - -extern __u32 sb_gpioin(void *sbh); -extern __u32 sb_gpiointpolarity(void *sbh, __u32 mask, __u32 val, __u8 prio); -extern __u32 sb_gpiointmask(void *sbh, __u32 mask, __u32 val, __u8 prio); -extern __u32 sb_gpioouten(void *sbh, __u32 mask, __u32 val, __u8 prio); -extern __u32 sb_gpioout(void *sbh, __u32 mask, __u32 val, __u8 prio); - -#define gpioin() sb_gpioin(sbh) -#define gpiointpolarity(mask,val) sb_gpiointpolarity(sbh, mask, val, 0) -#define gpiointmask(mask,val) sb_gpiointmask(sbh, mask, val, 0) -#define gpioouten(mask,val) sb_gpioouten(sbh, mask, val, 0) -#define gpioout(mask,val) sb_gpioout(sbh, mask, val, 0) - -#elif defined(BCMGPIO) - -#define sbh bcm947xx_sbh -extern void *bcm947xx_sbh; -extern __u32 sb_gpioin(void *sbh); -extern __u32 sb_gpiointpolarity(void *sbh, __u32 mask, __u32 val); -extern __u32 sb_gpiointmask(void *sbh, __u32 mask, __u32 val); -extern __u32 sb_gpioouten(void *sbh, __u32 mask, __u32 val); -extern __u32 sb_gpioout(void *sbh, __u32 mask, __u32 val); - -#define gpioin() sb_gpioin(sbh) -#define gpiointpolarity(mask,val) sb_gpiointpolarity(sbh, mask, val) -#define gpiointmask(mask,val) sb_gpiointmask(sbh, mask, val) -#define gpioouten(mask,val) sb_gpioouten(sbh, mask, val) -#define gpioout(mask,val) sb_gpioout(sbh, mask, val) - +#ifdef BROADCOM +#include "gpio-bcm947xx.h"  #else -#error Unsupported/unknown GPIO configuration +#error "Unsupported configuration."  #endif  #endif /* __GPIO_H */ diff --git a/package/switch/src/switch-adm.c b/package/switch/src/switch-adm.c index 85805f6b3..8d96316b7 100644 --- a/package/switch/src/switch-adm.c +++ b/package/switch/src/switch-adm.c @@ -109,7 +109,7 @@ static void adm_write(int cs, char *buf, unsigned int bits)  	int i, len = (bits + 7) / 8;  	__u8 mask; -	gpioout(eecs, (cs ? eecs : 0)); +	gpio_out(eecs, (cs ? eecs : 0));  	udelay(EECK_EDGE_TIME);  	/* Byte assemble from MSB to LSB */ @@ -117,25 +117,25 @@ static void adm_write(int cs, char *buf, unsigned int bits)  		/* Bit bang from MSB to LSB */  		for (mask = 0x80; mask && bits > 0; mask >>= 1, bits --) {  			/* Clock low */ -			gpioout(eesk, 0); +			gpio_out(eesk, 0);  			udelay(EECK_EDGE_TIME);  			/* Output on rising edge */ -			gpioout(eedi, ((mask & buf[i]) ? eedi : 0)); +			gpio_out(eedi, ((mask & buf[i]) ? eedi : 0));  			udelay(EEDI_SETUP_TIME);  			/* Clock high */ -			gpioout(eesk, eesk); +			gpio_out(eesk, eesk);  			udelay(EECK_EDGE_TIME);  		}  	}  	/* Clock low */ -	gpioout(eesk, 0); +	gpio_out(eesk, 0);  	udelay(EECK_EDGE_TIME);  	if (cs) -		gpioout(eecs, 0); +		gpio_out(eecs, 0);  } @@ -144,7 +144,7 @@ static void adm_read(int cs, char *buf, unsigned int bits)  	int i, len = (bits + 7) / 8;  	__u8 mask; -	gpioout(eecs, (cs ? eecs : 0)); +	gpio_out(eecs, (cs ? eecs : 0));  	udelay(EECK_EDGE_TIME);  	/* Byte assemble from MSB to LSB */ @@ -156,16 +156,16 @@ static void adm_read(int cs, char *buf, unsigned int bits)  			__u8 gp;  			/* Clock low */ -			gpioout(eesk, 0); +			gpio_out(eesk, 0);  			udelay(EECK_EDGE_TIME);  			/* Input on rising edge */ -			gp = gpioin(); +			gp = gpio_in();  			if (gp & eedi)  				byte |= mask;  			/* Clock high */ -			gpioout(eesk, eesk); +			gpio_out(eesk, eesk);  			udelay(EECK_EDGE_TIME);  		} @@ -173,11 +173,11 @@ static void adm_read(int cs, char *buf, unsigned int bits)  	}  	/* Clock low */ -	gpioout(eesk, 0); +	gpio_out(eesk, 0);  	udelay(EECK_EDGE_TIME);  	if (cs) -		gpioout(eecs, 0); +		gpio_out(eecs, 0);  } @@ -185,10 +185,10 @@ static void adm_read(int cs, char *buf, unsigned int bits)  static void adm_enout(__u8 pins, __u8 val)  {     	/* Prepare GPIO output value */ -	gpioout(pins, val); +	gpio_out(pins, val);  	/* Enable GPIO outputs */ -	gpioouten(pins, pins); +	gpio_outen(pins, pins);  	udelay(EECK_EDGE_TIME);  } @@ -197,7 +197,7 @@ static void adm_enout(__u8 pins, __u8 val)  static void adm_disout(__u8 pins)  {     	/* Disable GPIO outputs */ -	gpioouten(pins, 0); +	gpio_outen(pins, 0);  	udelay(EECK_EDGE_TIME);  } @@ -208,11 +208,11 @@ static void adm_adclk(int clocks)  	int i;  	for (i = 0; i < clocks; i++) {  		/* Clock high */ -		gpioout(eesk, eesk); +		gpio_out(eesk, eesk);  		udelay(EECK_EDGE_TIME);  		/* Clock low */ -		gpioout(eesk, 0); +		gpio_out(eesk, 0);  		udelay(EECK_EDGE_TIME);  	}  }  | 
