diff options
-rw-r--r-- | arch/powerpc/boot/dts/pcm032.dts | 392 | ||||
-rwxr-xr-x | arch/powerpc/boot/wrapper | 4 | ||||
-rw-r--r-- | arch/powerpc/include/asm/mpc52xx.h | 1 | ||||
-rw-r--r-- | arch/powerpc/platforms/52xx/Kconfig | 1 | ||||
-rw-r--r-- | arch/powerpc/platforms/52xx/mpc5200_simple.c | 3 | ||||
-rw-r--r-- | arch/powerpc/platforms/52xx/mpc52xx_common.c | 37 | ||||
-rw-r--r-- | arch/powerpc/platforms/52xx/mpc52xx_gpt.c | 39 | ||||
-rw-r--r-- | drivers/spi/xilinx_spi.c | 9 |
8 files changed, 442 insertions, 44 deletions
diff --git a/arch/powerpc/boot/dts/pcm032.dts b/arch/powerpc/boot/dts/pcm032.dts new file mode 100644 index 000000000000..030042678392 --- /dev/null +++ b/arch/powerpc/boot/dts/pcm032.dts | |||
@@ -0,0 +1,392 @@ | |||
1 | /* | ||
2 | * phyCORE-MPC5200B-IO (pcm032) board Device Tree Source | ||
3 | * | ||
4 | * Copyright (C) 2006-2009 Pengutronix | ||
5 | * Sascha Hauer <s.hauer@pengutronix.de> | ||
6 | * Juergen Beisert <j.beisert@pengutronix.de> | ||
7 | * Wolfram Sang <w.sang@pengutronix.de> | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify it | ||
10 | * under the terms of the GNU General Public License as published by the | ||
11 | * Free Software Foundation; either version 2 of the License, or (at your | ||
12 | * option) any later version. | ||
13 | */ | ||
14 | |||
15 | /dts-v1/; | ||
16 | |||
17 | / { | ||
18 | model = "phytec,pcm032"; | ||
19 | compatible = "phytec,pcm032"; | ||
20 | #address-cells = <1>; | ||
21 | #size-cells = <1>; | ||
22 | interrupt-parent = <&mpc5200_pic>; | ||
23 | |||
24 | cpus { | ||
25 | #address-cells = <1>; | ||
26 | #size-cells = <0>; | ||
27 | |||
28 | PowerPC,5200@0 { | ||
29 | device_type = "cpu"; | ||
30 | reg = <0>; | ||
31 | d-cache-line-size = <32>; | ||
32 | i-cache-line-size = <32>; | ||
33 | d-cache-size = <0x4000>; // L1, 16K | ||
34 | i-cache-size = <0x4000>; // L1, 16K | ||
35 | timebase-frequency = <0>; // from bootloader | ||
36 | bus-frequency = <0>; // from bootloader | ||
37 | clock-frequency = <0>; // from bootloader | ||
38 | }; | ||
39 | }; | ||
40 | |||
41 | memory { | ||
42 | device_type = "memory"; | ||
43 | reg = <0x00000000 0x08000000>; // 128MB | ||
44 | }; | ||
45 | |||
46 | soc5200@f0000000 { | ||
47 | #address-cells = <1>; | ||
48 | #size-cells = <1>; | ||
49 | compatible = "fsl,mpc5200b-immr"; | ||
50 | ranges = <0 0xf0000000 0x0000c000>; | ||
51 | bus-frequency = <0>; // from bootloader | ||
52 | system-frequency = <0>; // from bootloader | ||
53 | |||
54 | cdm@200 { | ||
55 | compatible = "fsl,mpc5200b-cdm","fsl,mpc5200-cdm"; | ||
56 | reg = <0x200 0x38>; | ||
57 | }; | ||
58 | |||
59 | mpc5200_pic: interrupt-controller@500 { | ||
60 | // 5200 interrupts are encoded into two levels; | ||
61 | interrupt-controller; | ||
62 | #interrupt-cells = <3>; | ||
63 | compatible = "fsl,mpc5200b-pic","fsl,mpc5200-pic"; | ||
64 | reg = <0x500 0x80>; | ||
65 | }; | ||
66 | |||
67 | timer@600 { // General Purpose Timer | ||
68 | compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; | ||
69 | reg = <0x600 0x10>; | ||
70 | interrupts = <1 9 0>; | ||
71 | fsl,has-wdt; | ||
72 | }; | ||
73 | |||
74 | timer@610 { // General Purpose Timer | ||
75 | compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; | ||
76 | reg = <0x610 0x10>; | ||
77 | interrupts = <1 10 0>; | ||
78 | }; | ||
79 | |||
80 | gpt2: timer@620 { // General Purpose Timer in GPIO mode | ||
81 | compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; | ||
82 | reg = <0x620 0x10>; | ||
83 | interrupts = <1 11 0>; | ||
84 | gpio-controller; | ||
85 | #gpio-cells = <2>; | ||
86 | }; | ||
87 | |||
88 | gpt3: timer@630 { // General Purpose Timer in GPIO mode | ||
89 | compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; | ||
90 | reg = <0x630 0x10>; | ||
91 | interrupts = <1 12 0>; | ||
92 | gpio-controller; | ||
93 | #gpio-cells = <2>; | ||
94 | }; | ||
95 | |||
96 | gpt4: timer@640 { // General Purpose Timer in GPIO mode | ||
97 | compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; | ||
98 | reg = <0x640 0x10>; | ||
99 | interrupts = <1 13 0>; | ||
100 | gpio-controller; | ||
101 | #gpio-cells = <2>; | ||
102 | }; | ||
103 | |||
104 | gpt5: timer@650 { // General Purpose Timer in GPIO mode | ||
105 | compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; | ||
106 | reg = <0x650 0x10>; | ||
107 | interrupts = <1 14 0>; | ||
108 | gpio-controller; | ||
109 | #gpio-cells = <2>; | ||
110 | }; | ||
111 | |||
112 | gpt6: timer@660 { // General Purpose Timer in GPIO mode | ||
113 | compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; | ||
114 | reg = <0x660 0x10>; | ||
115 | interrupts = <1 15 0>; | ||
116 | gpio-controller; | ||
117 | #gpio-cells = <2>; | ||
118 | }; | ||
119 | |||
120 | gpt7: timer@670 { // General Purpose Timer in GPIO mode | ||
121 | compatible = "fsl,mpc5200b-gpt","fsl,mpc5200-gpt"; | ||
122 | reg = <0x670 0x10>; | ||
123 | interrupts = <1 16 0>; | ||
124 | gpio-controller; | ||
125 | #gpio-cells = <2>; | ||
126 | }; | ||
127 | |||
128 | rtc@800 { // Real time clock | ||
129 | compatible = "fsl,mpc5200b-rtc","fsl,mpc5200-rtc"; | ||
130 | reg = <0x800 0x100>; | ||
131 | interrupts = <1 5 0 1 6 0>; | ||
132 | }; | ||
133 | |||
134 | can@900 { | ||
135 | compatible = "fsl,mpc5200b-mscan","fsl,mpc5200-mscan"; | ||
136 | interrupts = <2 17 0>; | ||
137 | reg = <0x900 0x80>; | ||
138 | }; | ||
139 | |||
140 | can@980 { | ||
141 | compatible = "fsl,mpc5200b-mscan","fsl,mpc5200-mscan"; | ||
142 | interrupts = <2 18 0>; | ||
143 | reg = <0x980 0x80>; | ||
144 | }; | ||
145 | |||
146 | gpio_simple: gpio@b00 { | ||
147 | compatible = "fsl,mpc5200b-gpio","fsl,mpc5200-gpio"; | ||
148 | reg = <0xb00 0x40>; | ||
149 | interrupts = <1 7 0>; | ||
150 | gpio-controller; | ||
151 | #gpio-cells = <2>; | ||
152 | }; | ||
153 | |||
154 | gpio_wkup: gpio@c00 { | ||
155 | compatible = "fsl,mpc5200b-gpio-wkup","fsl,mpc5200-gpio-wkup"; | ||
156 | reg = <0xc00 0x40>; | ||
157 | interrupts = <1 8 0 0 3 0>; | ||
158 | gpio-controller; | ||
159 | #gpio-cells = <2>; | ||
160 | }; | ||
161 | |||
162 | spi@f00 { | ||
163 | compatible = "fsl,mpc5200b-spi","fsl,mpc5200-spi"; | ||
164 | reg = <0xf00 0x20>; | ||
165 | interrupts = <2 13 0 2 14 0>; | ||
166 | }; | ||
167 | |||
168 | usb@1000 { | ||
169 | compatible = "fsl,mpc5200b-ohci","fsl,mpc5200-ohci","ohci-be"; | ||
170 | reg = <0x1000 0xff>; | ||
171 | interrupts = <2 6 0>; | ||
172 | }; | ||
173 | |||
174 | dma-controller@1200 { | ||
175 | compatible = "fsl,mpc5200b-bestcomm","fsl,mpc5200-bestcomm"; | ||
176 | reg = <0x1200 0x80>; | ||
177 | interrupts = <3 0 0 3 1 0 3 2 0 3 3 0 | ||
178 | 3 4 0 3 5 0 3 6 0 3 7 0 | ||
179 | 3 8 0 3 9 0 3 10 0 3 11 0 | ||
180 | 3 12 0 3 13 0 3 14 0 3 15 0>; | ||
181 | }; | ||
182 | |||
183 | xlb@1f00 { | ||
184 | compatible = "fsl,mpc5200b-xlb","fsl,mpc5200-xlb"; | ||
185 | reg = <0x1f00 0x100>; | ||
186 | }; | ||
187 | |||
188 | ac97@2000 { /* PSC1 is ac97 */ | ||
189 | compatible = "fsl,mpc5200b-psc-ac97","fsl,mpc5200-psc-ac97"; | ||
190 | cell-index = <0>; | ||
191 | reg = <0x2000 0x100>; | ||
192 | interrupts = <2 1 0>; | ||
193 | }; | ||
194 | |||
195 | /* PSC2 port is used by CAN1/2 */ | ||
196 | |||
197 | serial@2400 { /* PSC3 in UART mode */ | ||
198 | compatible = "fsl,mpc5200b-psc-uart","fsl,mpc5200-psc-uart"; | ||
199 | cell-index = <2>; | ||
200 | reg = <0x2400 0x100>; | ||
201 | interrupts = <2 3 0>; | ||
202 | }; | ||
203 | |||
204 | /* PSC4 is ??? */ | ||
205 | |||
206 | /* PSC5 is ??? */ | ||
207 | |||
208 | serial@2c00 { /* PSC6 in UART mode */ | ||
209 | compatible = "fsl,mpc5200b-psc-uart","fsl,mpc5200-psc-uart"; | ||
210 | cell-index = <5>; | ||
211 | reg = <0x2c00 0x100>; | ||
212 | interrupts = <2 4 0>; | ||
213 | }; | ||
214 | |||
215 | ethernet@3000 { | ||
216 | compatible = "fsl,mpc5200b-fec","fsl,mpc5200-fec"; | ||
217 | reg = <0x3000 0x400>; | ||
218 | local-mac-address = [ 00 00 00 00 00 00 ]; | ||
219 | interrupts = <2 5 0>; | ||
220 | phy-handle = <&phy0>; | ||
221 | }; | ||
222 | |||
223 | mdio@3000 { | ||
224 | #address-cells = <1>; | ||
225 | #size-cells = <0>; | ||
226 | compatible = "fsl,mpc5200b-mdio","fsl,mpc5200-mdio"; | ||
227 | reg = <0x3000 0x400>; // fec range, since we need to setup fec interrupts | ||
228 | interrupts = <2 5 0>; // these are for "mii command finished", not link changes & co. | ||
229 | |||
230 | phy0: ethernet-phy@0 { | ||
231 | reg = <0>; | ||
232 | }; | ||
233 | }; | ||
234 | |||
235 | ata@3a00 { | ||
236 | compatible = "fsl,mpc5200b-ata","fsl,mpc5200-ata"; | ||
237 | reg = <0x3a00 0x100>; | ||
238 | interrupts = <2 7 0>; | ||
239 | }; | ||
240 | |||
241 | i2c@3d00 { | ||
242 | #address-cells = <1>; | ||
243 | #size-cells = <0>; | ||
244 | compatible = "fsl,mpc5200b-i2c","fsl,mpc5200-i2c","fsl-i2c"; | ||
245 | reg = <0x3d00 0x40>; | ||
246 | interrupts = <2 15 0>; | ||
247 | fsl5200-clocking; | ||
248 | }; | ||
249 | |||
250 | i2c@3d40 { | ||
251 | #address-cells = <1>; | ||
252 | #size-cells = <0>; | ||
253 | compatible = "fsl,mpc5200b-i2c","fsl,mpc5200-i2c","fsl-i2c"; | ||
254 | reg = <0x3d40 0x40>; | ||
255 | interrupts = <2 16 0>; | ||
256 | fsl5200-clocking; | ||
257 | rtc@51 { | ||
258 | compatible = "nxp,pcf8563"; | ||
259 | reg = <0x51>; | ||
260 | }; | ||
261 | eeprom@52 { | ||
262 | compatible = "at24,24c32"; | ||
263 | reg = <0x52>; | ||
264 | }; | ||
265 | }; | ||
266 | |||
267 | sram@8000 { | ||
268 | compatible = "fsl,mpc5200b-sram","fsl,mpc5200-sram"; | ||
269 | reg = <0x8000 0x4000>; | ||
270 | }; | ||
271 | }; | ||
272 | |||
273 | pci@f0000d00 { | ||
274 | #interrupt-cells = <1>; | ||
275 | #size-cells = <2>; | ||
276 | #address-cells = <3>; | ||
277 | device_type = "pci"; | ||
278 | compatible = "fsl,mpc5200b-pci","fsl,mpc5200-pci"; | ||
279 | reg = <0xf0000d00 0x100>; | ||
280 | interrupt-map-mask = <0xf800 0 0 7>; | ||
281 | interrupt-map = <0xc000 0 0 1 &mpc5200_pic 0 0 3 // 1st slot | ||
282 | 0xc000 0 0 2 &mpc5200_pic 1 1 3 | ||
283 | 0xc000 0 0 3 &mpc5200_pic 1 2 3 | ||
284 | 0xc000 0 0 4 &mpc5200_pic 1 3 3 | ||
285 | |||
286 | 0xc800 0 0 1 &mpc5200_pic 1 1 3 // 2nd slot | ||
287 | 0xc800 0 0 2 &mpc5200_pic 1 2 3 | ||
288 | 0xc800 0 0 3 &mpc5200_pic 1 3 3 | ||
289 | 0xc800 0 0 4 &mpc5200_pic 0 0 3>; | ||
290 | clock-frequency = <0>; // From boot loader | ||
291 | interrupts = <2 8 0 2 9 0 2 10 0>; | ||
292 | bus-range = <0 0>; | ||
293 | ranges = <0x42000000 0 0x80000000 0x80000000 0 0x20000000 | ||
294 | 0x02000000 0 0xa0000000 0xa0000000 0 0x10000000 | ||
295 | 0x01000000 0 0x00000000 0xb0000000 0 0x01000000>; | ||
296 | }; | ||
297 | |||
298 | localbus { | ||
299 | compatible = "fsl,mpc5200b-lpb","fsl,mpc5200-lpb","simple-bus"; | ||
300 | |||
301 | #address-cells = <2>; | ||
302 | #size-cells = <1>; | ||
303 | |||
304 | ranges = <0 0 0xfe000000 0x02000000 | ||
305 | 1 0 0xfc000000 0x02000000 | ||
306 | 2 0 0xfbe00000 0x00200000 | ||
307 | 3 0 0xf9e00000 0x02000000 | ||
308 | 4 0 0xf7e00000 0x02000000 | ||
309 | 5 0 0xe6000000 0x02000000 | ||
310 | 6 0 0xe8000000 0x02000000 | ||
311 | 7 0 0xea000000 0x02000000>; | ||
312 | |||
313 | flash@0,0 { | ||
314 | compatible = "cfi-flash"; | ||
315 | reg = <0 0 0x02000000>; | ||
316 | bank-width = <4>; | ||
317 | #size-cells = <1>; | ||
318 | #address-cells = <1>; | ||
319 | |||
320 | partition@0 { | ||
321 | label = "ubootl"; | ||
322 | reg = <0x00000000 0x00040000>; | ||
323 | }; | ||
324 | partition@40000 { | ||
325 | label = "kernel"; | ||
326 | reg = <0x00040000 0x001c0000>; | ||
327 | }; | ||
328 | partition@200000 { | ||
329 | label = "jffs2"; | ||
330 | reg = <0x00200000 0x01d00000>; | ||
331 | }; | ||
332 | partition@1f00000 { | ||
333 | label = "uboot"; | ||
334 | reg = <0x01f00000 0x00040000>; | ||
335 | }; | ||
336 | partition@1f40000 { | ||
337 | label = "env"; | ||
338 | reg = <0x01f40000 0x00040000>; | ||
339 | }; | ||
340 | partition@1f80000 { | ||
341 | label = "oftree"; | ||
342 | reg = <0x01f80000 0x00040000>; | ||
343 | }; | ||
344 | partition@1fc0000 { | ||
345 | label = "space"; | ||
346 | reg = <0x01fc0000 0x00040000>; | ||
347 | }; | ||
348 | }; | ||
349 | |||
350 | sram@2,0 { | ||
351 | compatible = "mtd-ram"; | ||
352 | reg = <2 0 0x00200000>; | ||
353 | bank-width = <2>; | ||
354 | }; | ||
355 | |||
356 | /* | ||
357 | * example snippets for FPGA | ||
358 | * | ||
359 | * fpga@3,0 { | ||
360 | * compatible = "fpga_driver"; | ||
361 | * reg = <3 0 0x02000000>; | ||
362 | * bank-width = <4>; | ||
363 | * }; | ||
364 | * | ||
365 | * fpga@4,0 { | ||
366 | * compatible = "fpga_driver"; | ||
367 | * reg = <4 0 0x02000000>; | ||
368 | * bank-width = <4>; | ||
369 | * }; | ||
370 | */ | ||
371 | |||
372 | /* | ||
373 | * example snippets for free chipselects | ||
374 | * | ||
375 | * device@5,0 { | ||
376 | * compatible = "custom_driver"; | ||
377 | * reg = <5 0 0x02000000>; | ||
378 | * }; | ||
379 | * | ||
380 | * device@6,0 { | ||
381 | * compatible = "custom_driver"; | ||
382 | * reg = <6 0 0x02000000>; | ||
383 | * }; | ||
384 | * | ||
385 | * device@7,0 { | ||
386 | * compatible = "custom_driver"; | ||
387 | * reg = <7 0 0x02000000>; | ||
388 | * }; | ||
389 | */ | ||
390 | }; | ||
391 | }; | ||
392 | |||
diff --git a/arch/powerpc/boot/wrapper b/arch/powerpc/boot/wrapper index 6170bbf339a3..3ac75aecdb94 100755 --- a/arch/powerpc/boot/wrapper +++ b/arch/powerpc/boot/wrapper | |||
@@ -214,11 +214,11 @@ simpleboot-virtex405-*) | |||
214 | binary=y | 214 | binary=y |
215 | ;; | 215 | ;; |
216 | simpleboot-virtex440-*) | 216 | simpleboot-virtex440-*) |
217 | platformo="$object/simpleboot.o $object/virtex.o" | 217 | platformo="$object/fixed-head.o $object/simpleboot.o $object/virtex.o" |
218 | binary=y | 218 | binary=y |
219 | ;; | 219 | ;; |
220 | simpleboot-*) | 220 | simpleboot-*) |
221 | platformo="$object/simpleboot.o" | 221 | platformo="$object/fixed-head.o $object/simpleboot.o" |
222 | binary=y | 222 | binary=y |
223 | ;; | 223 | ;; |
224 | asp834x-redboot) | 224 | asp834x-redboot) |
diff --git a/arch/powerpc/include/asm/mpc52xx.h b/arch/powerpc/include/asm/mpc52xx.h index 81a23932a160..52e049cd9e68 100644 --- a/arch/powerpc/include/asm/mpc52xx.h +++ b/arch/powerpc/include/asm/mpc52xx.h | |||
@@ -273,6 +273,7 @@ extern void mpc5200_setup_xlb_arbiter(void); | |||
273 | extern void mpc52xx_declare_of_platform_devices(void); | 273 | extern void mpc52xx_declare_of_platform_devices(void); |
274 | extern void mpc52xx_map_common_devices(void); | 274 | extern void mpc52xx_map_common_devices(void); |
275 | extern int mpc52xx_set_psc_clkdiv(int psc_id, int clkdiv); | 275 | extern int mpc52xx_set_psc_clkdiv(int psc_id, int clkdiv); |
276 | extern unsigned int mpc52xx_get_xtal_freq(struct device_node *node); | ||
276 | extern void mpc52xx_restart(char *cmd); | 277 | extern void mpc52xx_restart(char *cmd); |
277 | 278 | ||
278 | /* mpc52xx_pic.c */ | 279 | /* mpc52xx_pic.c */ |
diff --git a/arch/powerpc/platforms/52xx/Kconfig b/arch/powerpc/platforms/52xx/Kconfig index e0b9454ae691..8b8e9560a315 100644 --- a/arch/powerpc/platforms/52xx/Kconfig +++ b/arch/powerpc/platforms/52xx/Kconfig | |||
@@ -24,6 +24,7 @@ config PPC_MPC5200_SIMPLE | |||
24 | are: | 24 | are: |
25 | intercontrol,digsy-mtc | 25 | intercontrol,digsy-mtc |
26 | phytec,pcm030 | 26 | phytec,pcm030 |
27 | phytec,pcm032 | ||
27 | promess,motionpro | 28 | promess,motionpro |
28 | schindler,cm5200 | 29 | schindler,cm5200 |
29 | tqc,tqm5200 | 30 | tqc,tqm5200 |
diff --git a/arch/powerpc/platforms/52xx/mpc5200_simple.c b/arch/powerpc/platforms/52xx/mpc5200_simple.c index d5e1471e51f7..c31e5b534f0a 100644 --- a/arch/powerpc/platforms/52xx/mpc5200_simple.c +++ b/arch/powerpc/platforms/52xx/mpc5200_simple.c | |||
@@ -51,8 +51,9 @@ static void __init mpc5200_simple_setup_arch(void) | |||
51 | /* list of the supported boards */ | 51 | /* list of the supported boards */ |
52 | static char *board[] __initdata = { | 52 | static char *board[] __initdata = { |
53 | "intercontrol,digsy-mtc", | 53 | "intercontrol,digsy-mtc", |
54 | "promess,motionpro", | ||
55 | "phytec,pcm030", | 54 | "phytec,pcm030", |
55 | "phytec,pcm032", | ||
56 | "promess,motionpro", | ||
56 | "schindler,cm5200", | 57 | "schindler,cm5200", |
57 | "tqc,tqm5200", | 58 | "tqc,tqm5200", |
58 | NULL | 59 | NULL |
diff --git a/arch/powerpc/platforms/52xx/mpc52xx_common.c b/arch/powerpc/platforms/52xx/mpc52xx_common.c index e9d2cf632eeb..8e3dd5a0f228 100644 --- a/arch/powerpc/platforms/52xx/mpc52xx_common.c +++ b/arch/powerpc/platforms/52xx/mpc52xx_common.c | |||
@@ -206,6 +206,43 @@ int mpc52xx_set_psc_clkdiv(int psc_id, int clkdiv) | |||
206 | EXPORT_SYMBOL(mpc52xx_set_psc_clkdiv); | 206 | EXPORT_SYMBOL(mpc52xx_set_psc_clkdiv); |
207 | 207 | ||
208 | /** | 208 | /** |
209 | * mpc52xx_get_xtal_freq - Get SYS_XTAL_IN frequency for a device | ||
210 | * | ||
211 | * @node: device node | ||
212 | * | ||
213 | * Returns the frequency of the external oscillator clock connected | ||
214 | * to the SYS_XTAL_IN pin, or 0 if it cannot be determined. | ||
215 | */ | ||
216 | unsigned int mpc52xx_get_xtal_freq(struct device_node *node) | ||
217 | { | ||
218 | u32 val; | ||
219 | unsigned int freq; | ||
220 | |||
221 | if (!mpc52xx_cdm) | ||
222 | return 0; | ||
223 | |||
224 | freq = mpc52xx_find_ipb_freq(node); | ||
225 | if (!freq) | ||
226 | return 0; | ||
227 | |||
228 | if (in_8(&mpc52xx_cdm->ipb_clk_sel) & 0x1) | ||
229 | freq *= 2; | ||
230 | |||
231 | val = in_be32(&mpc52xx_cdm->rstcfg); | ||
232 | if (val & (1 << 5)) | ||
233 | freq *= 8; | ||
234 | else | ||
235 | freq *= 4; | ||
236 | if (val & (1 << 6)) | ||
237 | freq /= 12; | ||
238 | else | ||
239 | freq /= 16; | ||
240 | |||
241 | return freq; | ||
242 | } | ||
243 | EXPORT_SYMBOL(mpc52xx_get_xtal_freq); | ||
244 | |||
245 | /** | ||
209 | * mpc52xx_restart: ppc_md->restart hook for mpc5200 using the watchdog timer | 246 | * mpc52xx_restart: ppc_md->restart hook for mpc5200 using the watchdog timer |
210 | */ | 247 | */ |
211 | void | 248 | void |
diff --git a/arch/powerpc/platforms/52xx/mpc52xx_gpt.c b/arch/powerpc/platforms/52xx/mpc52xx_gpt.c index cb038dc67a85..bfbcd418e690 100644 --- a/arch/powerpc/platforms/52xx/mpc52xx_gpt.c +++ b/arch/powerpc/platforms/52xx/mpc52xx_gpt.c | |||
@@ -335,44 +335,6 @@ static void | |||
335 | mpc52xx_gpt_gpio_setup(struct mpc52xx_gpt_priv *p, struct device_node *np) { } | 335 | mpc52xx_gpt_gpio_setup(struct mpc52xx_gpt_priv *p, struct device_node *np) { } |
336 | #endif /* defined(CONFIG_GPIOLIB) */ | 336 | #endif /* defined(CONFIG_GPIOLIB) */ |
337 | 337 | ||
338 | /*********************************************************************** | ||
339 | * SYSFS attributes | ||
340 | */ | ||
341 | #if defined(CONFIG_SYSFS) | ||
342 | static ssize_t mpc52xx_gpt_show_regs(struct device *dev, | ||
343 | struct device_attribute *attr, char *buf) | ||
344 | { | ||
345 | struct mpc52xx_gpt_priv *gpt = dev_get_drvdata(dev); | ||
346 | int i, len = 0; | ||
347 | u32 __iomem *regs = (void __iomem *) gpt->regs; | ||
348 | |||
349 | for (i = 0; i < 4; i++) | ||
350 | len += sprintf(buf + len, "%.8x ", in_be32(regs + i)); | ||
351 | len += sprintf(buf + len, "\n"); | ||
352 | |||
353 | return len; | ||
354 | } | ||
355 | |||
356 | static struct device_attribute mpc52xx_gpt_attrib[] = { | ||
357 | __ATTR(regs, S_IRUGO | S_IWUSR, mpc52xx_gpt_show_regs, NULL), | ||
358 | }; | ||
359 | |||
360 | static void mpc52xx_gpt_create_attribs(struct mpc52xx_gpt_priv *gpt) | ||
361 | { | ||
362 | int i, err = 0; | ||
363 | |||
364 | for (i = 0; i < ARRAY_SIZE(mpc52xx_gpt_attrib); i++) { | ||
365 | err = device_create_file(gpt->dev, &mpc52xx_gpt_attrib[i]); | ||
366 | if (err) | ||
367 | dev_err(gpt->dev, "error creating attribute %i\n", i); | ||
368 | } | ||
369 | |||
370 | } | ||
371 | |||
372 | #else /* defined(CONFIG_SYSFS) */ | ||
373 | static void mpc52xx_gpt_create_attribs(struct mpc52xx_gpt_priv *) { return 0; } | ||
374 | #endif /* defined(CONFIG_SYSFS) */ | ||
375 | |||
376 | /* --------------------------------------------------------------------- | 338 | /* --------------------------------------------------------------------- |
377 | * of_platform bus binding code | 339 | * of_platform bus binding code |
378 | */ | 340 | */ |
@@ -395,7 +357,6 @@ static int __devinit mpc52xx_gpt_probe(struct of_device *ofdev, | |||
395 | 357 | ||
396 | dev_set_drvdata(&ofdev->dev, gpt); | 358 | dev_set_drvdata(&ofdev->dev, gpt); |
397 | 359 | ||
398 | mpc52xx_gpt_create_attribs(gpt); | ||
399 | mpc52xx_gpt_gpio_setup(gpt, ofdev->node); | 360 | mpc52xx_gpt_gpio_setup(gpt, ofdev->node); |
400 | mpc52xx_gpt_irq_setup(gpt, ofdev->node); | 361 | mpc52xx_gpt_irq_setup(gpt, ofdev->node); |
401 | 362 | ||
diff --git a/drivers/spi/xilinx_spi.c b/drivers/spi/xilinx_spi.c index fe7e5f35e5d0..494d3f756e29 100644 --- a/drivers/spi/xilinx_spi.c +++ b/drivers/spi/xilinx_spi.c | |||
@@ -354,7 +354,7 @@ static int __init xilinx_spi_of_probe(struct of_device *ofdev, | |||
354 | if (xspi->regs == NULL) { | 354 | if (xspi->regs == NULL) { |
355 | rc = -ENOMEM; | 355 | rc = -ENOMEM; |
356 | dev_warn(&ofdev->dev, "ioremap failure\n"); | 356 | dev_warn(&ofdev->dev, "ioremap failure\n"); |
357 | goto put_master; | 357 | goto release_mem; |
358 | } | 358 | } |
359 | xspi->irq = r_irq->start; | 359 | xspi->irq = r_irq->start; |
360 | 360 | ||
@@ -365,7 +365,7 @@ static int __init xilinx_spi_of_probe(struct of_device *ofdev, | |||
365 | prop = of_get_property(ofdev->node, "xlnx,num-ss-bits", &len); | 365 | prop = of_get_property(ofdev->node, "xlnx,num-ss-bits", &len); |
366 | if (!prop || len < sizeof(*prop)) { | 366 | if (!prop || len < sizeof(*prop)) { |
367 | dev_warn(&ofdev->dev, "no 'xlnx,num-ss-bits' property\n"); | 367 | dev_warn(&ofdev->dev, "no 'xlnx,num-ss-bits' property\n"); |
368 | goto put_master; | 368 | goto unmap_io; |
369 | } | 369 | } |
370 | master->num_chipselect = *prop; | 370 | master->num_chipselect = *prop; |
371 | 371 | ||
@@ -397,6 +397,8 @@ free_irq: | |||
397 | free_irq(xspi->irq, xspi); | 397 | free_irq(xspi->irq, xspi); |
398 | unmap_io: | 398 | unmap_io: |
399 | iounmap(xspi->regs); | 399 | iounmap(xspi->regs); |
400 | release_mem: | ||
401 | release_mem_region(r_mem->start, resource_size(r_mem)); | ||
400 | put_master: | 402 | put_master: |
401 | spi_master_put(master); | 403 | spi_master_put(master); |
402 | return rc; | 404 | return rc; |
@@ -406,6 +408,7 @@ static int __devexit xilinx_spi_remove(struct of_device *ofdev) | |||
406 | { | 408 | { |
407 | struct xilinx_spi *xspi; | 409 | struct xilinx_spi *xspi; |
408 | struct spi_master *master; | 410 | struct spi_master *master; |
411 | struct resource r_mem; | ||
409 | 412 | ||
410 | master = platform_get_drvdata(ofdev); | 413 | master = platform_get_drvdata(ofdev); |
411 | xspi = spi_master_get_devdata(master); | 414 | xspi = spi_master_get_devdata(master); |
@@ -413,6 +416,8 @@ static int __devexit xilinx_spi_remove(struct of_device *ofdev) | |||
413 | spi_bitbang_stop(&xspi->bitbang); | 416 | spi_bitbang_stop(&xspi->bitbang); |
414 | free_irq(xspi->irq, xspi); | 417 | free_irq(xspi->irq, xspi); |
415 | iounmap(xspi->regs); | 418 | iounmap(xspi->regs); |
419 | if (!of_address_to_resource(ofdev->node, 0, &r_mem)) | ||
420 | release_mem_region(r_mem.start, resource_size(&r_mem)); | ||
416 | dev_set_drvdata(&ofdev->dev, 0); | 421 | dev_set_drvdata(&ofdev->dev, 0); |
417 | spi_master_put(xspi->bitbang.master); | 422 | spi_master_put(xspi->bitbang.master); |
418 | 423 | ||