Index: linux-2.6.23.16/drivers/ssb/driver_mipscore.c =================================================================== --- linux-2.6.23.16.orig/drivers/ssb/driver_mipscore.c 2008-02-19 01:35:53.000000000 +0100 +++ linux-2.6.23.16/drivers/ssb/driver_mipscore.c 2008-02-19 02:01:16.000000000 +0100 @@ -222,3 +222,5 @@ void ssb_mipscore_init(struct ssb_mipsco ssb_mips_serial_init(mcore); ssb_mips_flash_detect(mcore); } + +EXPORT_SYMBOL(ssb_mips_irq); Index: linux-2.6.23.16/include/linux/ssb/ssb_driver_chipcommon.h =================================================================== --- linux-2.6.23.16.orig/include/linux/ssb/ssb_driver_chipcommon.h 2008-02-19 01:35:53.000000000 +0100 +++ linux-2.6.23.16/include/linux/ssb/ssb_driver_chipcommon.h 2008-02-19 02:01:10.000000000 +0100 @@ -382,11 +382,45 @@ extern void ssb_chipco_set_clockmode(str 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.16/include/linux/ssb/ssb_driver_extif.h =================================================================== --- linux-2.6.23.16.orig/include/linux/ssb/ssb_driver_extif.h 2008-02-19 01:35:53.000000000 +0100 +++ linux-2.6.23.16/include/linux/ssb/ssb_driver_extif.h 2008-02-19 01:39:40.000000000 +0100 @@ -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_get_clockcontrol(s 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.16/include/linux/ssb/ssb.h =================================================================== --- linux-2.6.23.16.orig/include/linux/ssb/ssb.h 2008-02-19 01:35:53.000000000 +0100 +++ linux-2.6.23.16/include/linux/ssb/ssb.h 2008-02-19 01:39:40.000000000 +0100 @@ -217,6 +217,12 @@ enum ssb_bustype { #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 @@ -349,6 +355,16 @@ static inline void ssb_write32(struct ss 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.16/drivers/ssb/driver_chipcommon.c =================================================================== --- linux-2.6.23.16.orig/drivers/ssb/driver_chipcommon.c 2008-02-19 01:35:53.000000000 +0100 +++ linux-2.6.23.16/drivers/ssb/driver_chipcommon.c 2008-02-19 02:01:16.000000000 +0100 @@ -351,21 +351,6 @@ void ssb_chipco_watchdog_timer_set(struc 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.16/drivers/ssb/driver_extif.c =================================================================== --- linux-2.6.23.16.orig/drivers/ssb/driver_extif.c 2008-02-19 01:35:53.000000000 +0100 +++ linux-2.6.23.16/drivers/ssb/driver_extif.c 2008-02-19 01:39:40.000000000 +0100 @@ -110,20 +110,4 @@ void ssb_extif_get_clockcontrol(struct s *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.16/include/linux/mod_devicetable.h =================================================================== --- linux-2.6.23.16.orig/include/linux/mod_devicetable.h 2008-02-19 01:35:53.000000000 +0100 +++ linux-2.6.23.16/include/linux/mod_devicetable.h 2008-02-19 01:39:40.000000000 +0100 @@ -340,4 +340,19 @@ struct parisc_device_id { #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 */ Index: linux-2.6.23.16/drivers/ssb/main.c =================================================================== --- linux-2.6.23.16.orig/drivers/ssb/main.c 2008-02-19 01:45:24.000000000 +0100 +++ linux-2.6.23.16/drivers/ssb/main.c 2008-02-19 02:01:16.000000000 +0100 @@ -321,14 +321,16 @@ static int ssb_bus_match(struct device * return 0; } -static int ssb_device_uevent(struct device *dev, struct kobj_uevent_env *env) +static int ssb_device_uevent(struct device *dev, char **envp, + int num_envp, char *buffer, int buffer_size) { struct ssb_device *ssb_dev = dev_to_ssb_dev(dev); + int i = 0, len = 0; if (!dev) return -ENODEV; - return add_uevent_var(env, + return add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &len, "MODALIAS=ssb:v%04Xid%04Xrev%02X", ssb_dev->id.vendor, ssb_dev->id.coreid, ssb_dev->id.revision); Index: linux-2.6.23.16/drivers/ssb/scan.c =================================================================== --- linux-2.6.23.16.orig/drivers/ssb/scan.c 2008-02-16 19:08:13.000000000 +0100 +++ linux-2.6.23.16/drivers/ssb/scan.c 2008-02-19 01:56:02.000000000 +0100 @@ -391,12 +391,14 @@ int ssb_bus_scan(struct ssb_bus *bus, if (bus->bustype == SSB_BUSTYPE_PCI) { /* Ignore PCI cores on PCI-E cards. * Ignore PCI-E cores on PCI cards. */ + //FIXME kernel 2.6.23 doesn't have is_pcie. Add this check back when updating to 2.6.24 or later. if (dev->id.coreid == SSB_DEV_PCI) { - if (bus->host_pci->is_pcie) - continue; +//FIXME if (bus->host_pci->is_pcie) +//FIXME continue; } else { - if (!bus->host_pci->is_pcie) - continue; + continue; //FIXME +//FIXME if (!bus->host_pci->is_pcie) +//FIXME continue; } } if (bus->pcicore.dev) { Index: linux-2.6.23.16/drivers/ssb/driver_pcicore.c =================================================================== --- linux-2.6.23.16.orig/drivers/ssb/driver_pcicore.c 2008-02-19 02:01:11.000000000 +0100 +++ linux-2.6.23.16/drivers/ssb/driver_pcicore.c 2008-02-19 02:01:32.000000000 +0100 @@ -362,7 +362,7 @@ static int pcicore_is_in_hostmode(struct chipid_top != 0x5300) return 0; - if (bus->sprom.r1.boardflags_lo & SSB_PCICORE_BFL_NOPCI) + if (bus->sprom.boardflags_lo & SSB_PCICORE_BFL_NOPCI) return 0; /* The 200-pin BCM4712 package does not bond out PCI. Even when