Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ssb: Fix the GPIO API

This fixes the GPIO API to be usable.

Signed-off-by: Michael Buesch <mb@bu3sch.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>

authored by

Michael Buesch and committed by
John W. Linville
c2bcbe65 42bfad4f

+60 -18
+29 -6
drivers/ssb/driver_chipcommon.c
··· 39 39 ssb_write32(cc->dev, offset, value); 40 40 } 41 41 42 - static inline void chipco_write32_masked(struct ssb_chipcommon *cc, u16 offset, 43 - u32 mask, u32 value) 42 + static inline u32 chipco_write32_masked(struct ssb_chipcommon *cc, u16 offset, 43 + u32 mask, u32 value) 44 44 { 45 45 value &= mask; 46 46 value |= chipco_read32(cc, offset) & ~mask; 47 47 chipco_write32(cc, offset, value); 48 + 49 + return value; 48 50 } 49 51 50 52 void ssb_chipco_set_clockmode(struct ssb_chipcommon *cc, ··· 357 355 { 358 356 return chipco_read32(cc, SSB_CHIPCO_GPIOIN) & mask; 359 357 } 358 + EXPORT_SYMBOL(ssb_chipco_gpio_in); 360 359 361 - void ssb_chipco_gpio_out(struct ssb_chipcommon *cc, u32 mask, u32 value) 360 + u32 ssb_chipco_gpio_out(struct ssb_chipcommon *cc, u32 mask, u32 value) 362 361 { 363 - chipco_write32_masked(cc, SSB_CHIPCO_GPIOOUT, mask, value); 362 + return chipco_write32_masked(cc, SSB_CHIPCO_GPIOOUT, mask, value); 364 363 } 364 + EXPORT_SYMBOL(ssb_chipco_gpio_out); 365 365 366 - void ssb_chipco_gpio_outen(struct ssb_chipcommon *cc, u32 mask, u32 value) 366 + u32 ssb_chipco_gpio_outen(struct ssb_chipcommon *cc, u32 mask, u32 value) 367 367 { 368 - chipco_write32_masked(cc, SSB_CHIPCO_GPIOOUTEN, mask, value); 368 + return chipco_write32_masked(cc, SSB_CHIPCO_GPIOOUTEN, mask, value); 369 369 } 370 + EXPORT_SYMBOL(ssb_chipco_gpio_outen); 371 + 372 + u32 ssb_chipco_gpio_control(struct ssb_chipcommon *cc, u32 mask, u32 value) 373 + { 374 + return chipco_write32_masked(cc, SSB_CHIPCO_GPIOCTL, mask, value); 375 + } 376 + EXPORT_SYMBOL(ssb_chipco_gpio_control); 377 + 378 + u32 ssb_chipco_gpio_intmask(struct ssb_chipcommon *cc, u32 mask, u32 value) 379 + { 380 + return chipco_write32_masked(cc, SSB_CHIPCO_GPIOIRQ, mask, value); 381 + } 382 + EXPORT_SYMBOL(ssb_chipco_gpio_intmask); 383 + 384 + u32 ssb_chipco_gpio_polarity(struct ssb_chipcommon *cc, u32 mask, u32 value) 385 + { 386 + return chipco_write32_masked(cc, SSB_CHIPCO_GPIOPOL, mask, value); 387 + } 388 + EXPORT_SYMBOL(ssb_chipco_gpio_polarity); 370 389 371 390 #ifdef CONFIG_SSB_SERIAL 372 391 int ssb_chipco_serial_init(struct ssb_chipcommon *cc,
+20 -4
drivers/ssb/driver_extif.c
··· 27 27 ssb_write32(extif->dev, offset, value); 28 28 } 29 29 30 - static inline void extif_write32_masked(struct ssb_extif *extif, u16 offset, 31 - u32 mask, u32 value) 30 + static inline u32 extif_write32_masked(struct ssb_extif *extif, u16 offset, 31 + u32 mask, u32 value) 32 32 { 33 33 value &= mask; 34 34 value |= extif_read32(extif, offset) & ~mask; 35 35 extif_write32(extif, offset, value); 36 + 37 + return value; 36 38 } 37 39 38 40 #ifdef CONFIG_SSB_SERIAL ··· 122 120 { 123 121 return extif_read32(extif, SSB_EXTIF_GPIO_IN) & mask; 124 122 } 123 + EXPORT_SYMBOL(ssb_extif_gpio_in); 125 124 126 - void ssb_extif_gpio_out(struct ssb_extif *extif, u32 mask, u32 value) 125 + u32 ssb_extif_gpio_out(struct ssb_extif *extif, u32 mask, u32 value) 127 126 { 128 127 return extif_write32_masked(extif, SSB_EXTIF_GPIO_OUT(0), 129 128 mask, value); 130 129 } 130 + EXPORT_SYMBOL(ssb_extif_gpio_out); 131 131 132 - void ssb_extif_gpio_outen(struct ssb_extif *extif, u32 mask, u32 value) 132 + u32 ssb_extif_gpio_outen(struct ssb_extif *extif, u32 mask, u32 value) 133 133 { 134 134 return extif_write32_masked(extif, SSB_EXTIF_GPIO_OUTEN(0), 135 135 mask, value); 136 136 } 137 + EXPORT_SYMBOL(ssb_extif_gpio_outen); 137 138 139 + u32 ssb_extif_gpio_polarity(struct ssb_extif *extif, u32 mask, u32 value) 140 + { 141 + return extif_write32_masked(extif, SSB_EXTIF_GPIO_INTPOL, mask, value); 142 + } 143 + EXPORT_SYMBOL(ssb_extif_gpio_polarity); 144 + 145 + u32 ssb_extif_gpio_intmask(struct ssb_extif *extif, u32 mask, u32 value) 146 + { 147 + return extif_write32_masked(extif, SSB_EXTIF_GPIO_INTMASK, mask, value); 148 + } 149 + EXPORT_SYMBOL(ssb_extif_gpio_intmask);
+6 -4
include/linux/ssb/ssb_driver_chipcommon.h
··· 390 390 extern void ssb_chipco_watchdog_timer_set(struct ssb_chipcommon *cc, 391 391 u32 ticks); 392 392 393 + /* Chipcommon GPIO pin access. */ 393 394 u32 ssb_chipco_gpio_in(struct ssb_chipcommon *cc, u32 mask); 394 - 395 - void ssb_chipco_gpio_out(struct ssb_chipcommon *cc, u32 mask, u32 value); 396 - 397 - void ssb_chipco_gpio_outen(struct ssb_chipcommon *cc, u32 mask, u32 value); 395 + u32 ssb_chipco_gpio_out(struct ssb_chipcommon *cc, u32 mask, u32 value); 396 + u32 ssb_chipco_gpio_outen(struct ssb_chipcommon *cc, u32 mask, u32 value); 397 + u32 ssb_chipco_gpio_control(struct ssb_chipcommon *cc, u32 mask, u32 value); 398 + u32 ssb_chipco_gpio_intmask(struct ssb_chipcommon *cc, u32 mask, u32 value); 399 + u32 ssb_chipco_gpio_polarity(struct ssb_chipcommon *cc, u32 mask, u32 value); 398 400 399 401 #ifdef CONFIG_SSB_SERIAL 400 402 extern int ssb_chipco_serial_init(struct ssb_chipcommon *cc,
+5 -4
include/linux/ssb/ssb_driver_extif.h
··· 174 174 extern void ssb_extif_watchdog_timer_set(struct ssb_extif *extif, 175 175 u32 ticks); 176 176 177 + /* Extif GPIO pin access */ 177 178 u32 ssb_extif_gpio_in(struct ssb_extif *extif, u32 mask); 178 - 179 - void ssb_extif_gpio_out(struct ssb_extif *extif, u32 mask, u32 value); 180 - 181 - void ssb_extif_gpio_outen(struct ssb_extif *extif, u32 mask, u32 value); 179 + u32 ssb_extif_gpio_out(struct ssb_extif *extif, u32 mask, u32 value); 180 + u32 ssb_extif_gpio_outen(struct ssb_extif *extif, u32 mask, u32 value); 181 + u32 ssb_extif_gpio_polarity(struct ssb_extif *extif, u32 mask, u32 value); 182 + u32 ssb_extif_gpio_intmask(struct ssb_extif *extif, u32 mask, u32 value); 182 183 183 184 #ifdef CONFIG_SSB_SERIAL 184 185 extern int ssb_extif_serial_init(struct ssb_extif *extif,