Index: linux-2.6.23/drivers/ssb/driver_mipscore.c =================================================================== --- linux-2.6.23.orig/drivers/ssb/driver_mipscore.c 2007-10-14 04:32:45.793470742 +0200 +++ linux-2.6.23/drivers/ssb/driver_mipscore.c 2007-10-14 04:33:25.155713862 +0200 @@ -222,3 +222,5 @@ ssb_mips_serial_init(mcore); ssb_mips_flash_detect(mcore); } + +EXPORT_SYMBOL(ssb_mips_irq); Index: linux-2.6.23/include/linux/ssb/ssb_driver_chipcommon.h =================================================================== --- linux-2.6.23.orig/include/linux/ssb/ssb_driver_chipcommon.h 2007-10-14 04:32:45.817472111 +0200 +++ linux-2.6.23/include/linux/ssb/ssb_driver_chipcommon.h 2007-10-14 04:33:25.159714091 +0200 @@ -382,11 +382,45 @@ extern void ssb_chipco_watchdog_timer_set(struct ssb_chipcommon *cc, u32 ticks); -u32 ssb_chipco_gpio_in(struct ssb_chipcommon *cc, u32 mask); +/* GPIO functions */ +static inline u32 ssb_chipco_gpio_in(struct ssb_chipcommon *cc, + u32 mask) +{ + return ssb_read32(cc->dev, SSB_CHIPCO_GPIOIN) & mask; +} -void ssb_chipco_gpio_out(struct ssb_chipcommon *cc, u32 mask, u32 value); +static inline u32 ssb_chipco_gpio_out(struct ssb_chipcommon *cc, + u32 mask, u32 value) +{ + return ssb_write32_masked(cc->dev, SSB_CHIPCO_GPIOOUT, mask, value); +} -void ssb_chipco_gpio_outen(struct ssb_chipcommon *cc, u32 mask, u32 value); +static inline u32 ssb_chipco_gpio_outen(struct ssb_chipcommon *cc, + u32 mask, u32 value) +{ + return ssb_write32_masked(cc->dev, SSB_CHIPCO_GPIOOUTEN, mask, value); +} + +static inline u32 ssb_chipco_gpio_control(struct ssb_chipcommon *cc, + u32 mask, u32 value) +{ + return ssb_write32_masked(cc->dev, SSB_CHIPCO_GPIOCTL, mask, value); +} + +static inline u32 ssb_chipco_gpio_intmask(struct ssb_chipcommon *cc, + u32 mask, u32 value) +{ + return ssb_write32_masked(cc->dev, SSB_CHIPCO_GPIOIRQ, mask, value); +} + +static inline u32 ssb_chipco_gpio_polarity(struct ssb_chipcommon *cc, + u32 mask, u32 value) +{ + return ssb_write32_masked(cc->dev, SSB_CHIPCO_GPIOPOL, mask, value); +} +/* TODO: GPIO reservation */ + +extern int ssb_chipco_watchdog(struct ssb_chipcommon *cc, uint ticks); #ifdef CONFIG_SSB_SERIAL extern int ssb_chipco_serial_init(struct ssb_chipcommon *cc, Index: linux-2.6.23/include/linux/ssb/ssb_driver_extif.h =================================================================== --- linux-2.6.23.orig/include/linux/ssb/ssb_driver_extif.h 2007-10-14 04:32:45.821472339 +0200 +++ linux-2.6.23/include/linux/ssb/ssb_driver_extif.h 2007-10-14 04:33:25.167714544 +0200 @@ -153,7 +153,6 @@ #define SSB_EXTIF_WATCHDOG_CLK 48000000 /* Hz */ - #ifdef CONFIG_SSB_DRIVER_EXTIF struct ssb_extif { @@ -171,17 +170,42 @@ extern void ssb_extif_timing_init(struct ssb_extif *extif, unsigned long ns); -u32 ssb_extif_gpio_in(struct ssb_extif *extif, u32 mask); - -void ssb_extif_gpio_out(struct ssb_extif *extif, u32 mask, u32 value); - -void ssb_extif_gpio_outen(struct ssb_extif *extif, u32 mask, u32 value); - #ifdef CONFIG_SSB_SERIAL extern int ssb_extif_serial_init(struct ssb_extif *extif, struct ssb_serial_port *ports); #endif /* CONFIG_SSB_SERIAL */ +/* GPIO functions */ +static inline u32 ssb_extif_gpio_in(struct ssb_extif *extif, + u32 mask) +{ + return ssb_read32(extif->dev, SSB_EXTIF_GPIO_IN) & mask; +} + +static inline u32 ssb_extif_gpio_out(struct ssb_extif *extif, + u32 mask, u32 value) +{ + return ssb_write32_masked(extif->dev, SSB_EXTIF_GPIO_OUT(0), mask, value); +} + +static inline u32 ssb_extif_gpio_outen(struct ssb_extif *extif, + u32 mask, u32 value) +{ + return ssb_write32_masked(extif->dev, SSB_EXTIF_GPIO_OUTEN(0), mask, value); +} + +static inline u32 ssb_extif_gpio_polarity(struct ssb_extif *extif, + u32 mask, u32 value) +{ + return ssb_write32_masked(extif->dev, SSB_EXTIF_GPIO_INTPOL, mask, value); +} + +static inline u32 ssb_extif_gpio_intmask(struct ssb_extif *extif, + u32 mask, u32 value) +{ + return ssb_write32_masked(extif->dev, SSB_EXTIF_GPIO_INTMASK, mask, value); +} + #else /* CONFIG_SSB_DRIVER_EXTIF */ /* extif disabled */ Index: linux-2.6.23/include/linux/ssb/ssb.h =================================================================== --- linux-2.6.23.orig/include/linux/ssb/ssb.h 2007-10-14 04:32:45.833473010 +0200 +++ linux-2.6.23/include/linux/ssb/ssb.h 2007-10-14 04:33:25.171714773 +0200 @@ -255,6 +255,12 @@ #define SSB_CHIPPACK_BCM4712M 2 /* Medium 225pin 4712 */ #define SSB_CHIPPACK_BCM4712L 0 /* Large 340pin 4712 */ +static inline u16 ssb_read16(struct ssb_device *dev, u16 offset); +static inline u32 ssb_read32(struct ssb_device *dev, u16 offset); +static inline void ssb_write16(struct ssb_device *dev, u16 offset, u16 value); +static inline void ssb_write32(struct ssb_device *dev, u16 offset, u32 value); +static inline u32 ssb_write32_masked(struct ssb_device *dev, u16 offset, u32 mask, u32 value); + #include #include #include @@ -385,6 +391,16 @@ dev->ops->write32(dev, offset, value); } +static inline u32 ssb_write32_masked(struct ssb_device *dev, + u16 offset, + u32 mask, + u32 value) +{ + value &= mask; + value |= ssb_read32(dev, offset) & ~mask; + ssb_write32(dev, offset, value); + return value; +} /* Translation (routing) bits that need to be ORed to DMA * addresses before they are given to a device. */ Index: linux-2.6.23/drivers/ssb/driver_chipcommon.c =================================================================== --- linux-2.6.23.orig/drivers/ssb/driver_chipcommon.c 2007-10-14 04:32:45.797470966 +0200 +++ linux-2.6.23/drivers/ssb/driver_chipcommon.c 2007-10-14 04:33:25.175715001 +0200 @@ -351,21 +351,6 @@ chipco_write32(cc, SSB_CHIPCO_WATCHDOG, ticks); } -u32 ssb_chipco_gpio_in(struct ssb_chipcommon *cc, u32 mask) -{ - return chipco_read32(cc, SSB_CHIPCO_GPIOIN) & mask; -} - -void ssb_chipco_gpio_out(struct ssb_chipcommon *cc, u32 mask, u32 value) -{ - chipco_write32_masked(cc, SSB_CHIPCO_GPIOOUT, mask, value); -} - -void ssb_chipco_gpio_outen(struct ssb_chipcommon *cc, u32 mask, u32 value) -{ - chipco_write32_masked(cc, SSB_CHIPCO_GPIOOUTEN, mask, value); -} - #ifdef CONFIG_SSB_SERIAL int ssb_chipco_serial_init(struct ssb_chipcommon *cc, struct ssb_serial_port *ports) Index: linux-2.6.23/drivers/ssb/driver_extif.c =================================================================== --- linux-2.6.23.orig/drivers/ssb/driver_extif.c 2007-10-14 04:32:45.809471640 +0200 +++ linux-2.6.23/drivers/ssb/driver_extif.c 2007-10-14 04:33:25.179715231 +0200 @@ -110,20 +110,4 @@ *m = extif_read32(extif, SSB_EXTIF_CLOCK_SB); } -u32 ssb_extif_gpio_in(struct ssb_extif *extif, u32 mask) -{ - return extif_read32(extif, SSB_EXTIF_GPIO_IN) & mask; -} - -void ssb_extif_gpio_out(struct ssb_extif *extif, u32 mask, u32 value) -{ - return extif_write32_masked(extif, SSB_EXTIF_GPIO_OUT(0), - mask, value); -} - -void ssb_extif_gpio_outen(struct ssb_extif *extif, u32 mask, u32 value) -{ - return extif_write32_masked(extif, SSB_EXTIF_GPIO_OUTEN(0), - mask, value); -} Index: linux-2.6.23/include/linux/mod_devicetable.h =================================================================== --- linux-2.6.23.orig/include/linux/mod_devicetable.h 2007-10-14 04:35:22.102378272 +0200 +++ linux-2.6.23/include/linux/mod_devicetable.h 2007-10-14 04:34:41.172045787 +0200 @@ -340,4 +340,19 @@ #define PA_HVERSION_ANY_ID 0xffff #define PA_SVERSION_ANY_ID 0xffffffff +/* SSB core, see drivers/ssb/ */ +struct ssb_device_id { + __u16 vendor; + __u16 coreid; + __u8 revision; +}; +#define SSB_DEVICE(_vendor, _coreid, _revision) \ + { .vendor = _vendor, .coreid = _coreid, .revision = _revision, } +#define SSB_DEVTABLE_END \ + { 0, }, + +#define SSB_ANY_VENDOR 0xFFFF +#define SSB_ANY_ID 0xFFFF +#define SSB_ANY_REV 0xFF + #endif /* LINUX_MOD_DEVICETABLE_H */