bcma: initialize sprom earlier
[openwrt/staging/mkresin.git] / target / linux / brcm47xx / patches-3.3 / 501-bcma-add-gpio-driver.patch
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)));
5 }
6
7 + spin_lock_init(&cc->gpio_lock);
8 +
9 cc->setup_done = true;
10 }
11
12 @@ -92,34 +94,81 @@ u32 bcma_chipco_irq_status(struct bcma_d
13
14 u32 bcma_chipco_gpio_in(struct bcma_drv_cc *cc, u32 mask)
15 {
16 - return bcma_cc_read32(cc, BCMA_CC_GPIOIN) & mask;
17 + unsigned long flags;
18 + u32 res;
19 +
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);
23 +
24 + return res;
25 }
26 +EXPORT_SYMBOL_GPL(bcma_chipco_gpio_in);
27
28 u32 bcma_chipco_gpio_out(struct bcma_drv_cc *cc, u32 mask, u32 value)
29 {
30 - return bcma_cc_write32_masked(cc, BCMA_CC_GPIOOUT, mask, value);
31 + unsigned long flags;
32 + u32 res;
33 +
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);
37 +
38 + return res;
39 }
40 +EXPORT_SYMBOL_GPL(bcma_chipco_gpio_out);
41
42 u32 bcma_chipco_gpio_outen(struct bcma_drv_cc *cc, u32 mask, u32 value)
43 {
44 - return bcma_cc_write32_masked(cc, BCMA_CC_GPIOOUTEN, mask, value);
45 + unsigned long flags;
46 + u32 res;
47 +
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);
51 +
52 + return res;
53 }
54 +EXPORT_SYMBOL_GPL(bcma_chipco_gpio_outen);
55
56 u32 bcma_chipco_gpio_control(struct bcma_drv_cc *cc, u32 mask, u32 value)
57 {
58 - return bcma_cc_write32_masked(cc, BCMA_CC_GPIOCTL, mask, value);
59 + unsigned long flags;
60 + u32 res;
61 +
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);
65 +
66 + return res;
67 }
68 EXPORT_SYMBOL_GPL(bcma_chipco_gpio_control);
69
70 u32 bcma_chipco_gpio_intmask(struct bcma_drv_cc *cc, u32 mask, u32 value)
71 {
72 - return bcma_cc_write32_masked(cc, BCMA_CC_GPIOIRQ, mask, value);
73 + unsigned long flags;
74 + u32 res;
75 +
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);
79 +
80 + return res;
81 }
82 +EXPORT_SYMBOL_GPL(bcma_chipco_gpio_intmask);
83
84 u32 bcma_chipco_gpio_polarity(struct bcma_drv_cc *cc, u32 mask, u32 value)
85 {
86 - return bcma_cc_write32_masked(cc, BCMA_CC_GPIOPOL, mask, value);
87 + unsigned long flags;
88 + u32 res;
89 +
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);
93 +
94 + return res;
95 }
96 +EXPORT_SYMBOL_GPL(bcma_chipco_gpio_polarity);
97
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 {
103 int nr_serial_ports;
104 struct bcma_serial_port serial_ports[4];
105 #endif /* CONFIG_BCMA_DRIVER_MIPS */
106 +
107 + /* Lock for GPIO register access. */
108 + spinlock_t gpio_lock;
109 };
110
111 /* Register access */
112 @@ -525,13 +528,22 @@ void bcma_chipco_irq_mask(struct bcma_dr
113
114 u32 bcma_chipco_irq_status(struct bcma_drv_cc *cc, u32 mask);
115
116 +#define BCMA_CC_GPIO_LINES 16
117 +
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,
129 + u32 value);
130 +extern u32 bcma_chipco_gpio_intmask(struct bcma_drv_cc *cc, u32 mask,
131 + u32 value);
132 +extern u32 bcma_chipco_gpio_polarity(struct bcma_drv_cc *cc, u32 mask,
133 + u32 value);
134 +static inline int bcma_chipco_gpio_count(void)
135 +{
136 + return BCMA_CC_GPIO_LINES;
137 +}
138
139 /* PMU support */
140 extern void bcma_pmu_init(struct bcma_drv_cc *cc);