2008-02-19 09:24:18 +08:00
|
|
|
Index: linux-2.6.23.16/drivers/ssb/driver_mipscore.c
|
2007-10-13 10:04:37 +08:00
|
|
|
===================================================================
|
2008-02-19 09:24:18 +08:00
|
|
|
--- 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
|
2007-10-13 10:04:37 +08:00
|
|
|
ssb_mips_serial_init(mcore);
|
|
|
|
ssb_mips_flash_detect(mcore);
|
|
|
|
}
|
|
|
|
+
|
|
|
|
+EXPORT_SYMBOL(ssb_mips_irq);
|
2008-02-19 09:24:18 +08:00
|
|
|
Index: linux-2.6.23.16/include/linux/ssb/ssb_driver_chipcommon.h
|
2007-10-13 10:04:37 +08:00
|
|
|
===================================================================
|
2008-02-19 09:24:18 +08:00
|
|
|
--- 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
|
2007-10-14 10:47:36 +08:00
|
|
|
extern void ssb_chipco_watchdog_timer_set(struct ssb_chipcommon *cc,
|
|
|
|
u32 ticks);
|
2007-10-13 10:04:37 +08:00
|
|
|
|
2007-10-14 10:47:36 +08:00
|
|
|
-u32 ssb_chipco_gpio_in(struct ssb_chipcommon *cc, u32 mask);
|
2007-10-13 10:04:37 +08:00
|
|
|
+/* GPIO functions */
|
|
|
|
+static inline u32 ssb_chipco_gpio_in(struct ssb_chipcommon *cc,
|
|
|
|
+ u32 mask)
|
|
|
|
+{
|
|
|
|
+ return ssb_read32(cc->dev, SSB_CHIPCO_GPIOIN) & mask;
|
|
|
|
+}
|
2007-10-14 10:47:36 +08:00
|
|
|
|
|
|
|
-void ssb_chipco_gpio_out(struct ssb_chipcommon *cc, u32 mask, u32 value);
|
2007-10-13 10:04:37 +08:00
|
|
|
+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);
|
|
|
|
+}
|
2007-10-14 10:47:36 +08:00
|
|
|
|
|
|
|
-void ssb_chipco_gpio_outen(struct ssb_chipcommon *cc, u32 mask, u32 value);
|
2007-10-13 10:04:37 +08:00
|
|
|
+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);
|
2007-10-14 10:47:36 +08:00
|
|
|
|
2007-10-13 10:04:37 +08:00
|
|
|
#ifdef CONFIG_SSB_SERIAL
|
|
|
|
extern int ssb_chipco_serial_init(struct ssb_chipcommon *cc,
|
2008-02-19 09:24:18 +08:00
|
|
|
Index: linux-2.6.23.16/include/linux/ssb/ssb_driver_extif.h
|
2007-10-13 10:04:37 +08:00
|
|
|
===================================================================
|
2008-02-19 09:24:18 +08:00
|
|
|
--- 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
|
2007-10-14 10:47:36 +08:00
|
|
|
@@ -153,7 +153,6 @@
|
2007-10-13 10:04:37 +08:00
|
|
|
#define SSB_EXTIF_WATCHDOG_CLK 48000000 /* Hz */
|
|
|
|
|
2007-10-14 10:47:36 +08:00
|
|
|
|
|
|
|
-
|
|
|
|
#ifdef CONFIG_SSB_DRIVER_EXTIF
|
|
|
|
|
|
|
|
struct ssb_extif {
|
2008-02-19 09:24:18 +08:00
|
|
|
@@ -171,17 +170,42 @@ extern void ssb_extif_get_clockcontrol(s
|
2007-10-14 10:47:36 +08:00
|
|
|
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 */
|
|
|
|
|
2007-10-13 10:04:37 +08:00
|
|
|
+/* 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);
|
|
|
|
+}
|
2007-10-14 10:47:36 +08:00
|
|
|
+
|
2007-10-13 10:04:37 +08:00
|
|
|
|
2007-10-14 10:47:36 +08:00
|
|
|
#else /* CONFIG_SSB_DRIVER_EXTIF */
|
|
|
|
/* extif disabled */
|
2008-02-19 09:24:18 +08:00
|
|
|
Index: linux-2.6.23.16/include/linux/ssb/ssb.h
|
2007-10-13 10:04:37 +08:00
|
|
|
===================================================================
|
2008-02-19 09:24:18 +08:00
|
|
|
--- 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 {
|
2007-10-13 10:04:37 +08:00
|
|
|
#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>
|
2008-02-19 09:24:18 +08:00
|
|
|
@@ -349,6 +355,16 @@ static inline void ssb_write32(struct ss
|
2007-10-13 10:04:37 +08:00
|
|
|
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. */
|
2008-02-19 09:24:18 +08:00
|
|
|
Index: linux-2.6.23.16/drivers/ssb/driver_chipcommon.c
|
2007-10-14 10:47:36 +08:00
|
|
|
===================================================================
|
2008-02-19 09:24:18 +08:00
|
|
|
--- 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
|
2007-10-14 10:47:36 +08:00
|
|
|
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)
|
2008-02-19 09:24:18 +08:00
|
|
|
Index: linux-2.6.23.16/drivers/ssb/driver_extif.c
|
2007-10-14 10:47:36 +08:00
|
|
|
===================================================================
|
2008-02-19 09:24:18 +08:00
|
|
|
--- 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
|
2007-10-14 10:47:36 +08:00
|
|
|
*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);
|
|
|
|
-}
|
|
|
|
|
2008-02-19 09:24:18 +08:00
|
|
|
Index: linux-2.6.23.16/include/linux/mod_devicetable.h
|
2007-10-14 10:47:36 +08:00
|
|
|
===================================================================
|
2008-02-19 09:24:18 +08:00
|
|
|
--- 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 {
|
2007-10-14 10:47:36 +08:00
|
|
|
#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 */
|
2008-02-19 09:24:18 +08:00
|
|
|
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
|