diff options
Diffstat (limited to 'target/linux/generic-2.6/patches-2.6.23/930-ssb_fixes.patch')
-rw-r--r-- | target/linux/generic-2.6/patches-2.6.23/930-ssb_fixes.patch | 292 |
1 files changed, 292 insertions, 0 deletions
diff --git a/target/linux/generic-2.6/patches-2.6.23/930-ssb_fixes.patch b/target/linux/generic-2.6/patches-2.6.23/930-ssb_fixes.patch new file mode 100644 index 0000000000..ce3a007b67 --- /dev/null +++ b/target/linux/generic-2.6/patches-2.6.23/930-ssb_fixes.patch @@ -0,0 +1,292 @@ +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 <linux/ssb/ssb_driver_chipcommon.h> + #include <linux/ssb/ssb_driver_mips.h> + #include <linux/ssb/ssb_driver_extif.h> +@@ -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 |