ssb: Move the generic ssb fixes patch to the generic kernel.
[openwrt/svn-archive/archive.git] / target / linux / generic-2.6 / patches-2.6.23 / 930-ssb_fixes.patch
1 Index: linux-2.6.23.16/drivers/ssb/driver_mipscore.c
2 ===================================================================
3 --- linux-2.6.23.16.orig/drivers/ssb/driver_mipscore.c 2008-02-19 01:35:53.000000000 +0100
4 +++ linux-2.6.23.16/drivers/ssb/driver_mipscore.c 2008-02-19 02:01:16.000000000 +0100
5 @@ -222,3 +222,5 @@ void ssb_mipscore_init(struct ssb_mipsco
6 ssb_mips_serial_init(mcore);
7 ssb_mips_flash_detect(mcore);
8 }
9 +
10 +EXPORT_SYMBOL(ssb_mips_irq);
11 Index: linux-2.6.23.16/include/linux/ssb/ssb_driver_chipcommon.h
12 ===================================================================
13 --- linux-2.6.23.16.orig/include/linux/ssb/ssb_driver_chipcommon.h 2008-02-19 01:35:53.000000000 +0100
14 +++ linux-2.6.23.16/include/linux/ssb/ssb_driver_chipcommon.h 2008-02-19 02:01:10.000000000 +0100
15 @@ -382,11 +382,45 @@ extern void ssb_chipco_set_clockmode(str
16 extern void ssb_chipco_watchdog_timer_set(struct ssb_chipcommon *cc,
17 u32 ticks);
18
19 -u32 ssb_chipco_gpio_in(struct ssb_chipcommon *cc, u32 mask);
20 +/* GPIO functions */
21 +static inline u32 ssb_chipco_gpio_in(struct ssb_chipcommon *cc,
22 + u32 mask)
23 +{
24 + return ssb_read32(cc->dev, SSB_CHIPCO_GPIOIN) & mask;
25 +}
26
27 -void ssb_chipco_gpio_out(struct ssb_chipcommon *cc, u32 mask, u32 value);
28 +static inline u32 ssb_chipco_gpio_out(struct ssb_chipcommon *cc,
29 + u32 mask, u32 value)
30 +{
31 + return ssb_write32_masked(cc->dev, SSB_CHIPCO_GPIOOUT, mask, value);
32 +}
33
34 -void ssb_chipco_gpio_outen(struct ssb_chipcommon *cc, u32 mask, u32 value);
35 +static inline u32 ssb_chipco_gpio_outen(struct ssb_chipcommon *cc,
36 + u32 mask, u32 value)
37 +{
38 + return ssb_write32_masked(cc->dev, SSB_CHIPCO_GPIOOUTEN, mask, value);
39 +}
40 +
41 +static inline u32 ssb_chipco_gpio_control(struct ssb_chipcommon *cc,
42 + u32 mask, u32 value)
43 +{
44 + return ssb_write32_masked(cc->dev, SSB_CHIPCO_GPIOCTL, mask, value);
45 +}
46 +
47 +static inline u32 ssb_chipco_gpio_intmask(struct ssb_chipcommon *cc,
48 + u32 mask, u32 value)
49 +{
50 + return ssb_write32_masked(cc->dev, SSB_CHIPCO_GPIOIRQ, mask, value);
51 +}
52 +
53 +static inline u32 ssb_chipco_gpio_polarity(struct ssb_chipcommon *cc,
54 + u32 mask, u32 value)
55 +{
56 + return ssb_write32_masked(cc->dev, SSB_CHIPCO_GPIOPOL, mask, value);
57 +}
58 +/* TODO: GPIO reservation */
59 +
60 +extern int ssb_chipco_watchdog(struct ssb_chipcommon *cc, uint ticks);
61
62 #ifdef CONFIG_SSB_SERIAL
63 extern int ssb_chipco_serial_init(struct ssb_chipcommon *cc,
64 Index: linux-2.6.23.16/include/linux/ssb/ssb_driver_extif.h
65 ===================================================================
66 --- linux-2.6.23.16.orig/include/linux/ssb/ssb_driver_extif.h 2008-02-19 01:35:53.000000000 +0100
67 +++ linux-2.6.23.16/include/linux/ssb/ssb_driver_extif.h 2008-02-19 01:39:40.000000000 +0100
68 @@ -153,7 +153,6 @@
69 #define SSB_EXTIF_WATCHDOG_CLK 48000000 /* Hz */
70
71
72 -
73 #ifdef CONFIG_SSB_DRIVER_EXTIF
74
75 struct ssb_extif {
76 @@ -171,17 +170,42 @@ extern void ssb_extif_get_clockcontrol(s
77 extern void ssb_extif_timing_init(struct ssb_extif *extif,
78 unsigned long ns);
79
80 -u32 ssb_extif_gpio_in(struct ssb_extif *extif, u32 mask);
81 -
82 -void ssb_extif_gpio_out(struct ssb_extif *extif, u32 mask, u32 value);
83 -
84 -void ssb_extif_gpio_outen(struct ssb_extif *extif, u32 mask, u32 value);
85 -
86 #ifdef CONFIG_SSB_SERIAL
87 extern int ssb_extif_serial_init(struct ssb_extif *extif,
88 struct ssb_serial_port *ports);
89 #endif /* CONFIG_SSB_SERIAL */
90
91 +/* GPIO functions */
92 +static inline u32 ssb_extif_gpio_in(struct ssb_extif *extif,
93 + u32 mask)
94 +{
95 + return ssb_read32(extif->dev, SSB_EXTIF_GPIO_IN) & mask;
96 +}
97 +
98 +static inline u32 ssb_extif_gpio_out(struct ssb_extif *extif,
99 + u32 mask, u32 value)
100 +{
101 + return ssb_write32_masked(extif->dev, SSB_EXTIF_GPIO_OUT(0), mask, value);
102 +}
103 +
104 +static inline u32 ssb_extif_gpio_outen(struct ssb_extif *extif,
105 + u32 mask, u32 value)
106 +{
107 + return ssb_write32_masked(extif->dev, SSB_EXTIF_GPIO_OUTEN(0), mask, value);
108 +}
109 +
110 +static inline u32 ssb_extif_gpio_polarity(struct ssb_extif *extif,
111 + u32 mask, u32 value)
112 +{
113 + return ssb_write32_masked(extif->dev, SSB_EXTIF_GPIO_INTPOL, mask, value);
114 +}
115 +
116 +static inline u32 ssb_extif_gpio_intmask(struct ssb_extif *extif,
117 + u32 mask, u32 value)
118 +{
119 + return ssb_write32_masked(extif->dev, SSB_EXTIF_GPIO_INTMASK, mask, value);
120 +}
121 +
122
123 #else /* CONFIG_SSB_DRIVER_EXTIF */
124 /* extif disabled */
125 Index: linux-2.6.23.16/include/linux/ssb/ssb.h
126 ===================================================================
127 --- linux-2.6.23.16.orig/include/linux/ssb/ssb.h 2008-02-19 01:35:53.000000000 +0100
128 +++ linux-2.6.23.16/include/linux/ssb/ssb.h 2008-02-19 01:39:40.000000000 +0100
129 @@ -217,6 +217,12 @@ enum ssb_bustype {
130 #define SSB_CHIPPACK_BCM4712M 2 /* Medium 225pin 4712 */
131 #define SSB_CHIPPACK_BCM4712L 0 /* Large 340pin 4712 */
132
133 +static inline u16 ssb_read16(struct ssb_device *dev, u16 offset);
134 +static inline u32 ssb_read32(struct ssb_device *dev, u16 offset);
135 +static inline void ssb_write16(struct ssb_device *dev, u16 offset, u16 value);
136 +static inline void ssb_write32(struct ssb_device *dev, u16 offset, u32 value);
137 +static inline u32 ssb_write32_masked(struct ssb_device *dev, u16 offset, u32 mask, u32 value);
138 +
139 #include <linux/ssb/ssb_driver_chipcommon.h>
140 #include <linux/ssb/ssb_driver_mips.h>
141 #include <linux/ssb/ssb_driver_extif.h>
142 @@ -349,6 +355,16 @@ static inline void ssb_write32(struct ss
143 dev->ops->write32(dev, offset, value);
144 }
145
146 +static inline u32 ssb_write32_masked(struct ssb_device *dev,
147 + u16 offset,
148 + u32 mask,
149 + u32 value)
150 +{
151 + value &= mask;
152 + value |= ssb_read32(dev, offset) & ~mask;
153 + ssb_write32(dev, offset, value);
154 + return value;
155 +}
156
157 /* Translation (routing) bits that need to be ORed to DMA
158 * addresses before they are given to a device. */
159 Index: linux-2.6.23.16/drivers/ssb/driver_chipcommon.c
160 ===================================================================
161 --- linux-2.6.23.16.orig/drivers/ssb/driver_chipcommon.c 2008-02-19 01:35:53.000000000 +0100
162 +++ linux-2.6.23.16/drivers/ssb/driver_chipcommon.c 2008-02-19 02:01:16.000000000 +0100
163 @@ -351,21 +351,6 @@ void ssb_chipco_watchdog_timer_set(struc
164 chipco_write32(cc, SSB_CHIPCO_WATCHDOG, ticks);
165 }
166
167 -u32 ssb_chipco_gpio_in(struct ssb_chipcommon *cc, u32 mask)
168 -{
169 - return chipco_read32(cc, SSB_CHIPCO_GPIOIN) & mask;
170 -}
171 -
172 -void ssb_chipco_gpio_out(struct ssb_chipcommon *cc, u32 mask, u32 value)
173 -{
174 - chipco_write32_masked(cc, SSB_CHIPCO_GPIOOUT, mask, value);
175 -}
176 -
177 -void ssb_chipco_gpio_outen(struct ssb_chipcommon *cc, u32 mask, u32 value)
178 -{
179 - chipco_write32_masked(cc, SSB_CHIPCO_GPIOOUTEN, mask, value);
180 -}
181 -
182 #ifdef CONFIG_SSB_SERIAL
183 int ssb_chipco_serial_init(struct ssb_chipcommon *cc,
184 struct ssb_serial_port *ports)
185 Index: linux-2.6.23.16/drivers/ssb/driver_extif.c
186 ===================================================================
187 --- linux-2.6.23.16.orig/drivers/ssb/driver_extif.c 2008-02-19 01:35:53.000000000 +0100
188 +++ linux-2.6.23.16/drivers/ssb/driver_extif.c 2008-02-19 01:39:40.000000000 +0100
189 @@ -110,20 +110,4 @@ void ssb_extif_get_clockcontrol(struct s
190 *m = extif_read32(extif, SSB_EXTIF_CLOCK_SB);
191 }
192
193 -u32 ssb_extif_gpio_in(struct ssb_extif *extif, u32 mask)
194 -{
195 - return extif_read32(extif, SSB_EXTIF_GPIO_IN) & mask;
196 -}
197 -
198 -void ssb_extif_gpio_out(struct ssb_extif *extif, u32 mask, u32 value)
199 -{
200 - return extif_write32_masked(extif, SSB_EXTIF_GPIO_OUT(0),
201 - mask, value);
202 -}
203 -
204 -void ssb_extif_gpio_outen(struct ssb_extif *extif, u32 mask, u32 value)
205 -{
206 - return extif_write32_masked(extif, SSB_EXTIF_GPIO_OUTEN(0),
207 - mask, value);
208 -}
209
210 Index: linux-2.6.23.16/include/linux/mod_devicetable.h
211 ===================================================================
212 --- linux-2.6.23.16.orig/include/linux/mod_devicetable.h 2008-02-19 01:35:53.000000000 +0100
213 +++ linux-2.6.23.16/include/linux/mod_devicetable.h 2008-02-19 01:39:40.000000000 +0100
214 @@ -340,4 +340,19 @@ struct parisc_device_id {
215 #define PA_HVERSION_ANY_ID 0xffff
216 #define PA_SVERSION_ANY_ID 0xffffffff
217
218 +/* SSB core, see drivers/ssb/ */
219 +struct ssb_device_id {
220 + __u16 vendor;
221 + __u16 coreid;
222 + __u8 revision;
223 +};
224 +#define SSB_DEVICE(_vendor, _coreid, _revision) \
225 + { .vendor = _vendor, .coreid = _coreid, .revision = _revision, }
226 +#define SSB_DEVTABLE_END \
227 + { 0, },
228 +
229 +#define SSB_ANY_VENDOR 0xFFFF
230 +#define SSB_ANY_ID 0xFFFF
231 +#define SSB_ANY_REV 0xFF
232 +
233 #endif /* LINUX_MOD_DEVICETABLE_H */
234 Index: linux-2.6.23.16/drivers/ssb/main.c
235 ===================================================================
236 --- linux-2.6.23.16.orig/drivers/ssb/main.c 2008-02-19 01:45:24.000000000 +0100
237 +++ linux-2.6.23.16/drivers/ssb/main.c 2008-02-19 02:01:16.000000000 +0100
238 @@ -321,14 +321,16 @@ static int ssb_bus_match(struct device *
239 return 0;
240 }
241
242 -static int ssb_device_uevent(struct device *dev, struct kobj_uevent_env *env)
243 +static int ssb_device_uevent(struct device *dev, char **envp,
244 + int num_envp, char *buffer, int buffer_size)
245 {
246 struct ssb_device *ssb_dev = dev_to_ssb_dev(dev);
247 + int i = 0, len = 0;
248
249 if (!dev)
250 return -ENODEV;
251
252 - return add_uevent_var(env,
253 + return add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &len,
254 "MODALIAS=ssb:v%04Xid%04Xrev%02X",
255 ssb_dev->id.vendor, ssb_dev->id.coreid,
256 ssb_dev->id.revision);
257 Index: linux-2.6.23.16/drivers/ssb/scan.c
258 ===================================================================
259 --- linux-2.6.23.16.orig/drivers/ssb/scan.c 2008-02-16 19:08:13.000000000 +0100
260 +++ linux-2.6.23.16/drivers/ssb/scan.c 2008-02-19 01:56:02.000000000 +0100
261 @@ -391,12 +391,14 @@ int ssb_bus_scan(struct ssb_bus *bus,
262 if (bus->bustype == SSB_BUSTYPE_PCI) {
263 /* Ignore PCI cores on PCI-E cards.
264 * Ignore PCI-E cores on PCI cards. */
265 + //FIXME kernel 2.6.23 doesn't have is_pcie. Add this check back when updating to 2.6.24 or later.
266 if (dev->id.coreid == SSB_DEV_PCI) {
267 - if (bus->host_pci->is_pcie)
268 - continue;
269 +//FIXME if (bus->host_pci->is_pcie)
270 +//FIXME continue;
271 } else {
272 - if (!bus->host_pci->is_pcie)
273 - continue;
274 + continue; //FIXME
275 +//FIXME if (!bus->host_pci->is_pcie)
276 +//FIXME continue;
277 }
278 }
279 if (bus->pcicore.dev) {
280 Index: linux-2.6.23.16/drivers/ssb/driver_pcicore.c
281 ===================================================================
282 --- linux-2.6.23.16.orig/drivers/ssb/driver_pcicore.c 2008-02-19 02:01:11.000000000 +0100
283 +++ linux-2.6.23.16/drivers/ssb/driver_pcicore.c 2008-02-19 02:01:32.000000000 +0100
284 @@ -362,7 +362,7 @@ static int pcicore_is_in_hostmode(struct
285 chipid_top != 0x5300)
286 return 0;
287
288 - if (bus->sprom.r1.boardflags_lo & SSB_PCICORE_BFL_NOPCI)
289 + if (bus->sprom.boardflags_lo & SSB_PCICORE_BFL_NOPCI)
290 return 0;
291
292 /* The 200-pin BCM4712 package does not bond out PCI. Even when