add support for the dwc_otg USB controller
[openwrt/openwrt.git] / target / linux / octeon / patches / 017-platform_devices.patch
1 From: David Daney <ddaney@caviumnetworks.com>
2 Date: Wed, 16 Sep 2009 21:54:18 +0000 (-0700)
3 Subject: MIPS: Octeon: Move some platform device registration to its own file.
4 X-Git-Tag: linux-2.6.32-rc1~29
5 X-Git-Url: http://www.linux-mips.org/git?p=linux.git;a=commitdiff_plain;h=936c111e;hp=e1302af3482d3955f5a6100160e595e792d5f1e4
6
7 MIPS: Octeon: Move some platform device registration to its own file.
8
9 There is a bunch of platform device registration in
10 arch/mips/cavium-octeon/setup.c. We move it to its own file in
11 preparation for adding more platform devices.
12
13 Signed-off-by: David Daney <ddaney@caviumnetworks.com>
14 Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
15 ---
16
17 diff --git a/arch/mips/cavium-octeon/Makefile b/arch/mips/cavium-octeon/Makefile
18 index d6903c3..1394362 100644
19 --- a/arch/mips/cavium-octeon/Makefile
20 +++ b/arch/mips/cavium-octeon/Makefile
21 @@ -6,10 +6,10 @@
22 # License. See the file "COPYING" in the main directory of this archive
23 # for more details.
24 #
25 -# Copyright (C) 2005-2008 Cavium Networks
26 +# Copyright (C) 2005-2009 Cavium Networks
27 #
28
29 -obj-y := setup.o serial.o octeon-irq.o csrc-octeon.o
30 +obj-y := setup.o serial.o octeon-platform.o octeon-irq.o csrc-octeon.o
31 obj-y += dma-octeon.o flash_setup.o
32 obj-y += octeon-memcpy.o
33
34 diff --git a/arch/mips/cavium-octeon/octeon-platform.c b/arch/mips/cavium-octeon/octeon-platform.c
35 new file mode 100644
36 index 0000000..be711dd
37 --- /dev/null
38 +++ b/arch/mips/cavium-octeon/octeon-platform.c
39 @@ -0,0 +1,164 @@
40 +/*
41 + * This file is subject to the terms and conditions of the GNU General Public
42 + * License. See the file "COPYING" in the main directory of this archive
43 + * for more details.
44 + *
45 + * Copyright (C) 2004-2009 Cavium Networks
46 + * Copyright (C) 2008 Wind River Systems
47 + */
48 +
49 +#include <linux/init.h>
50 +#include <linux/irq.h>
51 +#include <linux/module.h>
52 +#include <linux/platform_device.h>
53 +
54 +#include <asm/octeon/octeon.h>
55 +#include <asm/octeon/cvmx-rnm-defs.h>
56 +
57 +static struct octeon_cf_data octeon_cf_data;
58 +
59 +static int __init octeon_cf_device_init(void)
60 +{
61 + union cvmx_mio_boot_reg_cfgx mio_boot_reg_cfg;
62 + unsigned long base_ptr, region_base, region_size;
63 + struct platform_device *pd;
64 + struct resource cf_resources[3];
65 + unsigned int num_resources;
66 + int i;
67 + int ret = 0;
68 +
69 + /* Setup octeon-cf platform device if present. */
70 + base_ptr = 0;
71 + if (octeon_bootinfo->major_version == 1
72 + && octeon_bootinfo->minor_version >= 1) {
73 + if (octeon_bootinfo->compact_flash_common_base_addr)
74 + base_ptr =
75 + octeon_bootinfo->compact_flash_common_base_addr;
76 + } else {
77 + base_ptr = 0x1d000800;
78 + }
79 +
80 + if (!base_ptr)
81 + return ret;
82 +
83 + /* Find CS0 region. */
84 + for (i = 0; i < 8; i++) {
85 + mio_boot_reg_cfg.u64 = cvmx_read_csr(CVMX_MIO_BOOT_REG_CFGX(i));
86 + region_base = mio_boot_reg_cfg.s.base << 16;
87 + region_size = (mio_boot_reg_cfg.s.size + 1) << 16;
88 + if (mio_boot_reg_cfg.s.en && base_ptr >= region_base
89 + && base_ptr < region_base + region_size)
90 + break;
91 + }
92 + if (i >= 7) {
93 + /* i and i + 1 are CS0 and CS1, both must be less than 8. */
94 + goto out;
95 + }
96 + octeon_cf_data.base_region = i;
97 + octeon_cf_data.is16bit = mio_boot_reg_cfg.s.width;
98 + octeon_cf_data.base_region_bias = base_ptr - region_base;
99 + memset(cf_resources, 0, sizeof(cf_resources));
100 + num_resources = 0;
101 + cf_resources[num_resources].flags = IORESOURCE_MEM;
102 + cf_resources[num_resources].start = region_base;
103 + cf_resources[num_resources].end = region_base + region_size - 1;
104 + num_resources++;
105 +
106 +
107 + if (!(base_ptr & 0xfffful)) {
108 + /*
109 + * Boot loader signals availability of DMA (true_ide
110 + * mode) by setting low order bits of base_ptr to
111 + * zero.
112 + */
113 +
114 + /* Asume that CS1 immediately follows. */
115 + mio_boot_reg_cfg.u64 =
116 + cvmx_read_csr(CVMX_MIO_BOOT_REG_CFGX(i + 1));
117 + region_base = mio_boot_reg_cfg.s.base << 16;
118 + region_size = (mio_boot_reg_cfg.s.size + 1) << 16;
119 + if (!mio_boot_reg_cfg.s.en)
120 + goto out;
121 +
122 + cf_resources[num_resources].flags = IORESOURCE_MEM;
123 + cf_resources[num_resources].start = region_base;
124 + cf_resources[num_resources].end = region_base + region_size - 1;
125 + num_resources++;
126 +
127 + octeon_cf_data.dma_engine = 0;
128 + cf_resources[num_resources].flags = IORESOURCE_IRQ;
129 + cf_resources[num_resources].start = OCTEON_IRQ_BOOTDMA;
130 + cf_resources[num_resources].end = OCTEON_IRQ_BOOTDMA;
131 + num_resources++;
132 + } else {
133 + octeon_cf_data.dma_engine = -1;
134 + }
135 +
136 + pd = platform_device_alloc("pata_octeon_cf", -1);
137 + if (!pd) {
138 + ret = -ENOMEM;
139 + goto out;
140 + }
141 + pd->dev.platform_data = &octeon_cf_data;
142 +
143 + ret = platform_device_add_resources(pd, cf_resources, num_resources);
144 + if (ret)
145 + goto fail;
146 +
147 + ret = platform_device_add(pd);
148 + if (ret)
149 + goto fail;
150 +
151 + return ret;
152 +fail:
153 + platform_device_put(pd);
154 +out:
155 + return ret;
156 +}
157 +device_initcall(octeon_cf_device_init);
158 +
159 +/* Octeon Random Number Generator. */
160 +static int __init octeon_rng_device_init(void)
161 +{
162 + struct platform_device *pd;
163 + int ret = 0;
164 +
165 + struct resource rng_resources[] = {
166 + {
167 + .flags = IORESOURCE_MEM,
168 + .start = XKPHYS_TO_PHYS(CVMX_RNM_CTL_STATUS),
169 + .end = XKPHYS_TO_PHYS(CVMX_RNM_CTL_STATUS) + 0xf
170 + }, {
171 + .flags = IORESOURCE_MEM,
172 + .start = cvmx_build_io_address(8, 0),
173 + .end = cvmx_build_io_address(8, 0) + 0x7
174 + }
175 + };
176 +
177 + pd = platform_device_alloc("octeon_rng", -1);
178 + if (!pd) {
179 + ret = -ENOMEM;
180 + goto out;
181 + }
182 +
183 + ret = platform_device_add_resources(pd, rng_resources,
184 + ARRAY_SIZE(rng_resources));
185 + if (ret)
186 + goto fail;
187 +
188 + ret = platform_device_add(pd);
189 + if (ret)
190 + goto fail;
191 +
192 + return ret;
193 +fail:
194 + platform_device_put(pd);
195 +
196 +out:
197 + return ret;
198 +}
199 +device_initcall(octeon_rng_device_init);
200 +
201 +MODULE_AUTHOR("David Daney <ddaney@caviumnetworks.com>");
202 +MODULE_LICENSE("GPL");
203 +MODULE_DESCRIPTION("Platform driver for Octeon SOC");
204 diff --git a/arch/mips/cavium-octeon/setup.c b/arch/mips/cavium-octeon/setup.c
205 index 468a120..b321d3b 100644
206 --- a/arch/mips/cavium-octeon/setup.c
207 +++ b/arch/mips/cavium-octeon/setup.c
208 @@ -11,7 +11,6 @@
209 #include <linux/delay.h>
210 #include <linux/interrupt.h>
211 #include <linux/io.h>
212 -#include <linux/irq.h>
213 #include <linux/serial.h>
214 #include <linux/smp.h>
215 #include <linux/types.h>
216 @@ -33,7 +32,6 @@
217 #include <asm/time.h>
218
219 #include <asm/octeon/octeon.h>
220 -#include <asm/octeon/cvmx-rnm-defs.h>
221
222 #ifdef CONFIG_CAVIUM_DECODE_RSL
223 extern void cvmx_interrupt_rsl_decode(void);
224 @@ -825,147 +823,3 @@ void prom_free_prom_memory(void)
225 CONFIG_CAVIUM_RESERVE32_USE_WIRED_TLB option is set */
226 octeon_hal_setup_reserved32();
227 }
228 -
229 -static struct octeon_cf_data octeon_cf_data;
230 -
231 -static int __init octeon_cf_device_init(void)
232 -{
233 - union cvmx_mio_boot_reg_cfgx mio_boot_reg_cfg;
234 - unsigned long base_ptr, region_base, region_size;
235 - struct platform_device *pd;
236 - struct resource cf_resources[3];
237 - unsigned int num_resources;
238 - int i;
239 - int ret = 0;
240 -
241 - /* Setup octeon-cf platform device if present. */
242 - base_ptr = 0;
243 - if (octeon_bootinfo->major_version == 1
244 - && octeon_bootinfo->minor_version >= 1) {
245 - if (octeon_bootinfo->compact_flash_common_base_addr)
246 - base_ptr =
247 - octeon_bootinfo->compact_flash_common_base_addr;
248 - } else {
249 - base_ptr = 0x1d000800;
250 - }
251 -
252 - if (!base_ptr)
253 - return ret;
254 -
255 - /* Find CS0 region. */
256 - for (i = 0; i < 8; i++) {
257 - mio_boot_reg_cfg.u64 = cvmx_read_csr(CVMX_MIO_BOOT_REG_CFGX(i));
258 - region_base = mio_boot_reg_cfg.s.base << 16;
259 - region_size = (mio_boot_reg_cfg.s.size + 1) << 16;
260 - if (mio_boot_reg_cfg.s.en && base_ptr >= region_base
261 - && base_ptr < region_base + region_size)
262 - break;
263 - }
264 - if (i >= 7) {
265 - /* i and i + 1 are CS0 and CS1, both must be less than 8. */
266 - goto out;
267 - }
268 - octeon_cf_data.base_region = i;
269 - octeon_cf_data.is16bit = mio_boot_reg_cfg.s.width;
270 - octeon_cf_data.base_region_bias = base_ptr - region_base;
271 - memset(cf_resources, 0, sizeof(cf_resources));
272 - num_resources = 0;
273 - cf_resources[num_resources].flags = IORESOURCE_MEM;
274 - cf_resources[num_resources].start = region_base;
275 - cf_resources[num_resources].end = region_base + region_size - 1;
276 - num_resources++;
277 -
278 -
279 - if (!(base_ptr & 0xfffful)) {
280 - /*
281 - * Boot loader signals availability of DMA (true_ide
282 - * mode) by setting low order bits of base_ptr to
283 - * zero.
284 - */
285 -
286 - /* Asume that CS1 immediately follows. */
287 - mio_boot_reg_cfg.u64 =
288 - cvmx_read_csr(CVMX_MIO_BOOT_REG_CFGX(i + 1));
289 - region_base = mio_boot_reg_cfg.s.base << 16;
290 - region_size = (mio_boot_reg_cfg.s.size + 1) << 16;
291 - if (!mio_boot_reg_cfg.s.en)
292 - goto out;
293 -
294 - cf_resources[num_resources].flags = IORESOURCE_MEM;
295 - cf_resources[num_resources].start = region_base;
296 - cf_resources[num_resources].end = region_base + region_size - 1;
297 - num_resources++;
298 -
299 - octeon_cf_data.dma_engine = 0;
300 - cf_resources[num_resources].flags = IORESOURCE_IRQ;
301 - cf_resources[num_resources].start = OCTEON_IRQ_BOOTDMA;
302 - cf_resources[num_resources].end = OCTEON_IRQ_BOOTDMA;
303 - num_resources++;
304 - } else {
305 - octeon_cf_data.dma_engine = -1;
306 - }
307 -
308 - pd = platform_device_alloc("pata_octeon_cf", -1);
309 - if (!pd) {
310 - ret = -ENOMEM;
311 - goto out;
312 - }
313 - pd->dev.platform_data = &octeon_cf_data;
314 -
315 - ret = platform_device_add_resources(pd, cf_resources, num_resources);
316 - if (ret)
317 - goto fail;
318 -
319 - ret = platform_device_add(pd);
320 - if (ret)
321 - goto fail;
322 -
323 - return ret;
324 -fail:
325 - platform_device_put(pd);
326 -out:
327 - return ret;
328 -}
329 -device_initcall(octeon_cf_device_init);
330 -
331 -/* Octeon Random Number Generator. */
332 -static int __init octeon_rng_device_init(void)
333 -{
334 - struct platform_device *pd;
335 - int ret = 0;
336 -
337 - struct resource rng_resources[] = {
338 - {
339 - .flags = IORESOURCE_MEM,
340 - .start = XKPHYS_TO_PHYS(CVMX_RNM_CTL_STATUS),
341 - .end = XKPHYS_TO_PHYS(CVMX_RNM_CTL_STATUS) + 0xf
342 - }, {
343 - .flags = IORESOURCE_MEM,
344 - .start = cvmx_build_io_address(8, 0),
345 - .end = cvmx_build_io_address(8, 0) + 0x7
346 - }
347 - };
348 -
349 - pd = platform_device_alloc("octeon_rng", -1);
350 - if (!pd) {
351 - ret = -ENOMEM;
352 - goto out;
353 - }
354 -
355 - ret = platform_device_add_resources(pd, rng_resources,
356 - ARRAY_SIZE(rng_resources));
357 - if (ret)
358 - goto fail;
359 -
360 - ret = platform_device_add(pd);
361 - if (ret)
362 - goto fail;
363 -
364 - return ret;
365 -fail:
366 - platform_device_put(pd);
367 -
368 -out:
369 - return ret;
370 -}
371 -device_initcall(octeon_rng_device_init);