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 <linux/ssb/ssb_driver_chipcommon.h>
 #include <linux/ssb/ssb_driver_mips.h>
 #include <linux/ssb/ssb_driver_extif.h>
@@ -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 */
