1 --- a/drivers/bcma/driver_chipcommon.c
2 +++ b/drivers/bcma/driver_chipcommon.c
3 @@ -70,6 +70,8 @@ void bcma_core_chipcommon_init(struct bc
4 (leddc_off << BCMA_CC_GPIOTIMER_OFFTIME_SHIFT)));
7 + spin_lock_init(&cc->gpio_lock);
12 @@ -92,34 +94,81 @@ u32 bcma_chipco_irq_status(struct bcma_d
14 u32 bcma_chipco_gpio_in(struct bcma_drv_cc *cc, u32 mask)
16 - return bcma_cc_read32(cc, BCMA_CC_GPIOIN) & mask;
17 + unsigned long flags;
20 + spin_lock_irqsave(&cc->gpio_lock, flags);
21 + res = bcma_cc_read32(cc, BCMA_CC_GPIOIN) & mask;
22 + spin_unlock_irqrestore(&cc->gpio_lock, flags);
26 +EXPORT_SYMBOL_GPL(bcma_chipco_gpio_in);
28 u32 bcma_chipco_gpio_out(struct bcma_drv_cc *cc, u32 mask, u32 value)
30 - return bcma_cc_write32_masked(cc, BCMA_CC_GPIOOUT, mask, value);
31 + unsigned long flags;
34 + spin_lock_irqsave(&cc->gpio_lock, flags);
35 + res = bcma_cc_write32_masked(cc, BCMA_CC_GPIOOUT, mask, value);
36 + spin_unlock_irqrestore(&cc->gpio_lock, flags);
40 +EXPORT_SYMBOL_GPL(bcma_chipco_gpio_out);
42 u32 bcma_chipco_gpio_outen(struct bcma_drv_cc *cc, u32 mask, u32 value)
44 - return bcma_cc_write32_masked(cc, BCMA_CC_GPIOOUTEN, mask, value);
45 + unsigned long flags;
48 + spin_lock_irqsave(&cc->gpio_lock, flags);
49 + res = bcma_cc_write32_masked(cc, BCMA_CC_GPIOOUTEN, mask, value);
50 + spin_unlock_irqrestore(&cc->gpio_lock, flags);
54 +EXPORT_SYMBOL_GPL(bcma_chipco_gpio_outen);
56 u32 bcma_chipco_gpio_control(struct bcma_drv_cc *cc, u32 mask, u32 value)
58 - return bcma_cc_write32_masked(cc, BCMA_CC_GPIOCTL, mask, value);
59 + unsigned long flags;
62 + spin_lock_irqsave(&cc->gpio_lock, flags);
63 + res = bcma_cc_write32_masked(cc, BCMA_CC_GPIOCTL, mask, value);
64 + spin_unlock_irqrestore(&cc->gpio_lock, flags);
68 EXPORT_SYMBOL_GPL(bcma_chipco_gpio_control);
70 u32 bcma_chipco_gpio_intmask(struct bcma_drv_cc *cc, u32 mask, u32 value)
72 - return bcma_cc_write32_masked(cc, BCMA_CC_GPIOIRQ, mask, value);
73 + unsigned long flags;
76 + spin_lock_irqsave(&cc->gpio_lock, flags);
77 + res = bcma_cc_write32_masked(cc, BCMA_CC_GPIOIRQ, mask, value);
78 + spin_unlock_irqrestore(&cc->gpio_lock, flags);
82 +EXPORT_SYMBOL_GPL(bcma_chipco_gpio_intmask);
84 u32 bcma_chipco_gpio_polarity(struct bcma_drv_cc *cc, u32 mask, u32 value)
86 - return bcma_cc_write32_masked(cc, BCMA_CC_GPIOPOL, mask, value);
87 + unsigned long flags;
90 + spin_lock_irqsave(&cc->gpio_lock, flags);
91 + res = bcma_cc_write32_masked(cc, BCMA_CC_GPIOPOL, mask, value);
92 + spin_unlock_irqrestore(&cc->gpio_lock, flags);
96 +EXPORT_SYMBOL_GPL(bcma_chipco_gpio_polarity);
98 #ifdef CONFIG_BCMA_DRIVER_MIPS
99 void bcma_chipco_serial_init(struct bcma_drv_cc *cc)
100 --- a/include/linux/bcma/bcma_driver_chipcommon.h
101 +++ b/include/linux/bcma/bcma_driver_chipcommon.h
102 @@ -495,6 +495,9 @@ struct bcma_drv_cc {
104 struct bcma_serial_port serial_ports[4];
105 #endif /* CONFIG_BCMA_DRIVER_MIPS */
107 + /* Lock for GPIO register access. */
108 + spinlock_t gpio_lock;
111 /* Register access */
112 @@ -525,13 +528,22 @@ void bcma_chipco_irq_mask(struct bcma_dr
114 u32 bcma_chipco_irq_status(struct bcma_drv_cc *cc, u32 mask);
116 +#define BCMA_CC_GPIO_LINES 16
118 /* Chipcommon GPIO pin access. */
119 -u32 bcma_chipco_gpio_in(struct bcma_drv_cc *cc, u32 mask);
120 -u32 bcma_chipco_gpio_out(struct bcma_drv_cc *cc, u32 mask, u32 value);
121 -u32 bcma_chipco_gpio_outen(struct bcma_drv_cc *cc, u32 mask, u32 value);
122 -u32 bcma_chipco_gpio_control(struct bcma_drv_cc *cc, u32 mask, u32 value);
123 -u32 bcma_chipco_gpio_intmask(struct bcma_drv_cc *cc, u32 mask, u32 value);
124 -u32 bcma_chipco_gpio_polarity(struct bcma_drv_cc *cc, u32 mask, u32 value);
125 +extern u32 bcma_chipco_gpio_in(struct bcma_drv_cc *cc, u32 mask);
126 +extern u32 bcma_chipco_gpio_out(struct bcma_drv_cc *cc, u32 mask, u32 value);
127 +extern u32 bcma_chipco_gpio_outen(struct bcma_drv_cc *cc, u32 mask, u32 value);
128 +extern u32 bcma_chipco_gpio_control(struct bcma_drv_cc *cc, u32 mask,
130 +extern u32 bcma_chipco_gpio_intmask(struct bcma_drv_cc *cc, u32 mask,
132 +extern u32 bcma_chipco_gpio_polarity(struct bcma_drv_cc *cc, u32 mask,
134 +static inline int bcma_chipco_gpio_count(void)
136 + return BCMA_CC_GPIO_LINES;
140 extern void bcma_pmu_init(struct bcma_drv_cc *cc);