xref: /openbmc/linux/arch/arm/mach-pxa/devices.c (revision b8bb76713ec50df2f11efee386e16f93d51e1076)
1 #include <linux/module.h>
2 #include <linux/kernel.h>
3 #include <linux/init.h>
4 #include <linux/platform_device.h>
5 #include <linux/dma-mapping.h>
6 
7 #include <mach/udc.h>
8 #include <mach/pxafb.h>
9 #include <mach/mmc.h>
10 #include <mach/irda.h>
11 #include <mach/i2c.h>
12 #include <mach/ohci.h>
13 #include <mach/pxa27x_keypad.h>
14 #include <mach/pxa2xx_spi.h>
15 #include <mach/camera.h>
16 #include <mach/audio.h>
17 #include <mach/pxa3xx_nand.h>
18 
19 #include "devices.h"
20 #include "generic.h"
21 
22 void __init pxa_register_device(struct platform_device *dev, void *data)
23 {
24 	int ret;
25 
26 	dev->dev.platform_data = data;
27 
28 	ret = platform_device_register(dev);
29 	if (ret)
30 		dev_err(&dev->dev, "unable to register device: %d\n", ret);
31 }
32 
33 static struct resource pxamci_resources[] = {
34 	[0] = {
35 		.start	= 0x41100000,
36 		.end	= 0x41100fff,
37 		.flags	= IORESOURCE_MEM,
38 	},
39 	[1] = {
40 		.start	= IRQ_MMC,
41 		.end	= IRQ_MMC,
42 		.flags	= IORESOURCE_IRQ,
43 	},
44 	[2] = {
45 		.start	= 21,
46 		.end	= 21,
47 		.flags	= IORESOURCE_DMA,
48 	},
49 	[3] = {
50 		.start	= 22,
51 		.end	= 22,
52 		.flags	= IORESOURCE_DMA,
53 	},
54 };
55 
56 static u64 pxamci_dmamask = 0xffffffffUL;
57 
58 struct platform_device pxa_device_mci = {
59 	.name		= "pxa2xx-mci",
60 	.id		= 0,
61 	.dev		= {
62 		.dma_mask = &pxamci_dmamask,
63 		.coherent_dma_mask = 0xffffffff,
64 	},
65 	.num_resources	= ARRAY_SIZE(pxamci_resources),
66 	.resource	= pxamci_resources,
67 };
68 
69 void __init pxa_set_mci_info(struct pxamci_platform_data *info)
70 {
71 	pxa_register_device(&pxa_device_mci, info);
72 }
73 
74 
75 static struct pxa2xx_udc_mach_info pxa_udc_info;
76 
77 void __init pxa_set_udc_info(struct pxa2xx_udc_mach_info *info)
78 {
79 	memcpy(&pxa_udc_info, info, sizeof *info);
80 }
81 
82 static struct resource pxa2xx_udc_resources[] = {
83 	[0] = {
84 		.start	= 0x40600000,
85 		.end	= 0x4060ffff,
86 		.flags	= IORESOURCE_MEM,
87 	},
88 	[1] = {
89 		.start	= IRQ_USB,
90 		.end	= IRQ_USB,
91 		.flags	= IORESOURCE_IRQ,
92 	},
93 };
94 
95 static u64 udc_dma_mask = ~(u32)0;
96 
97 struct platform_device pxa25x_device_udc = {
98 	.name		= "pxa25x-udc",
99 	.id		= -1,
100 	.resource	= pxa2xx_udc_resources,
101 	.num_resources	= ARRAY_SIZE(pxa2xx_udc_resources),
102 	.dev		=  {
103 		.platform_data	= &pxa_udc_info,
104 		.dma_mask	= &udc_dma_mask,
105 	}
106 };
107 
108 struct platform_device pxa27x_device_udc = {
109 	.name		= "pxa27x-udc",
110 	.id		= -1,
111 	.resource	= pxa2xx_udc_resources,
112 	.num_resources	= ARRAY_SIZE(pxa2xx_udc_resources),
113 	.dev		=  {
114 		.platform_data	= &pxa_udc_info,
115 		.dma_mask	= &udc_dma_mask,
116 	}
117 };
118 
119 static struct resource pxafb_resources[] = {
120 	[0] = {
121 		.start	= 0x44000000,
122 		.end	= 0x4400ffff,
123 		.flags	= IORESOURCE_MEM,
124 	},
125 	[1] = {
126 		.start	= IRQ_LCD,
127 		.end	= IRQ_LCD,
128 		.flags	= IORESOURCE_IRQ,
129 	},
130 };
131 
132 static u64 fb_dma_mask = ~(u64)0;
133 
134 struct platform_device pxa_device_fb = {
135 	.name		= "pxa2xx-fb",
136 	.id		= -1,
137 	.dev		= {
138 		.dma_mask	= &fb_dma_mask,
139 		.coherent_dma_mask = 0xffffffff,
140 	},
141 	.num_resources	= ARRAY_SIZE(pxafb_resources),
142 	.resource	= pxafb_resources,
143 };
144 
145 void __init set_pxa_fb_info(struct pxafb_mach_info *info)
146 {
147 	pxa_register_device(&pxa_device_fb, info);
148 }
149 
150 void __init set_pxa_fb_parent(struct device *parent_dev)
151 {
152 	pxa_device_fb.dev.parent = parent_dev;
153 }
154 
155 static struct resource pxa_resource_ffuart[] = {
156 	{
157 		.start	= 0x40100000,
158 		.end	= 0x40100023,
159 		.flags	= IORESOURCE_MEM,
160 	}, {
161 		.start	= IRQ_FFUART,
162 		.end	= IRQ_FFUART,
163 		.flags	= IORESOURCE_IRQ,
164 	}
165 };
166 
167 struct platform_device pxa_device_ffuart= {
168 	.name		= "pxa2xx-uart",
169 	.id		= 0,
170 	.resource	= pxa_resource_ffuart,
171 	.num_resources	= ARRAY_SIZE(pxa_resource_ffuart),
172 };
173 
174 static struct resource pxa_resource_btuart[] = {
175 	{
176 		.start	= 0x40200000,
177 		.end	= 0x40200023,
178 		.flags	= IORESOURCE_MEM,
179 	}, {
180 		.start	= IRQ_BTUART,
181 		.end	= IRQ_BTUART,
182 		.flags	= IORESOURCE_IRQ,
183 	}
184 };
185 
186 struct platform_device pxa_device_btuart = {
187 	.name		= "pxa2xx-uart",
188 	.id		= 1,
189 	.resource	= pxa_resource_btuart,
190 	.num_resources	= ARRAY_SIZE(pxa_resource_btuart),
191 };
192 
193 static struct resource pxa_resource_stuart[] = {
194 	{
195 		.start	= 0x40700000,
196 		.end	= 0x40700023,
197 		.flags	= IORESOURCE_MEM,
198 	}, {
199 		.start	= IRQ_STUART,
200 		.end	= IRQ_STUART,
201 		.flags	= IORESOURCE_IRQ,
202 	}
203 };
204 
205 struct platform_device pxa_device_stuart = {
206 	.name		= "pxa2xx-uart",
207 	.id		= 2,
208 	.resource	= pxa_resource_stuart,
209 	.num_resources	= ARRAY_SIZE(pxa_resource_stuart),
210 };
211 
212 static struct resource pxa_resource_hwuart[] = {
213 	{
214 		.start	= 0x41600000,
215 		.end	= 0x4160002F,
216 		.flags	= IORESOURCE_MEM,
217 	}, {
218 		.start	= IRQ_HWUART,
219 		.end	= IRQ_HWUART,
220 		.flags	= IORESOURCE_IRQ,
221 	}
222 };
223 
224 struct platform_device pxa_device_hwuart = {
225 	.name		= "pxa2xx-uart",
226 	.id		= 3,
227 	.resource	= pxa_resource_hwuart,
228 	.num_resources	= ARRAY_SIZE(pxa_resource_hwuart),
229 };
230 
231 static struct resource pxai2c_resources[] = {
232 	{
233 		.start	= 0x40301680,
234 		.end	= 0x403016a3,
235 		.flags	= IORESOURCE_MEM,
236 	}, {
237 		.start	= IRQ_I2C,
238 		.end	= IRQ_I2C,
239 		.flags	= IORESOURCE_IRQ,
240 	},
241 };
242 
243 struct platform_device pxa_device_i2c = {
244 	.name		= "pxa2xx-i2c",
245 	.id		= 0,
246 	.resource	= pxai2c_resources,
247 	.num_resources	= ARRAY_SIZE(pxai2c_resources),
248 };
249 
250 void __init pxa_set_i2c_info(struct i2c_pxa_platform_data *info)
251 {
252 	pxa_register_device(&pxa_device_i2c, info);
253 }
254 
255 #ifdef CONFIG_PXA27x
256 static struct resource pxa27x_resources_i2c_power[] = {
257 	{
258 		.start	= 0x40f00180,
259 		.end	= 0x40f001a3,
260 		.flags	= IORESOURCE_MEM,
261 	}, {
262 		.start	= IRQ_PWRI2C,
263 		.end	= IRQ_PWRI2C,
264 		.flags	= IORESOURCE_IRQ,
265 	},
266 };
267 
268 struct platform_device pxa27x_device_i2c_power = {
269 	.name		= "pxa2xx-i2c",
270 	.id		= 1,
271 	.resource	= pxa27x_resources_i2c_power,
272 	.num_resources	= ARRAY_SIZE(pxa27x_resources_i2c_power),
273 };
274 #endif
275 
276 #ifdef CONFIG_PXA3xx
277 static struct resource pxa3xx_resources_i2c_power[] = {
278 	{
279 		.start  = 0x40f500c0,
280 		.end    = 0x40f500d3,
281 		.flags	= IORESOURCE_MEM,
282 	}, {
283 		.start	= IRQ_PWRI2C,
284 		.end	= IRQ_PWRI2C,
285 		.flags	= IORESOURCE_IRQ,
286 	},
287 };
288 
289 struct platform_device pxa3xx_device_i2c_power = {
290 	.name		= "pxa2xx-i2c",
291 	.id		= 1,
292 	.resource	= pxa3xx_resources_i2c_power,
293 	.num_resources	= ARRAY_SIZE(pxa3xx_resources_i2c_power),
294 };
295 #endif
296 
297 static struct resource pxai2s_resources[] = {
298 	{
299 		.start	= 0x40400000,
300 		.end	= 0x40400083,
301 		.flags	= IORESOURCE_MEM,
302 	}, {
303 		.start	= IRQ_I2S,
304 		.end	= IRQ_I2S,
305 		.flags	= IORESOURCE_IRQ,
306 	},
307 };
308 
309 struct platform_device pxa_device_i2s = {
310 	.name		= "pxa2xx-i2s",
311 	.id		= -1,
312 	.resource	= pxai2s_resources,
313 	.num_resources	= ARRAY_SIZE(pxai2s_resources),
314 };
315 
316 static u64 pxaficp_dmamask = ~(u32)0;
317 
318 struct platform_device pxa_device_ficp = {
319 	.name		= "pxa2xx-ir",
320 	.id		= -1,
321 	.dev		= {
322 		.dma_mask = &pxaficp_dmamask,
323 		.coherent_dma_mask = 0xffffffff,
324 	},
325 };
326 
327 void __init pxa_set_ficp_info(struct pxaficp_platform_data *info)
328 {
329 	pxa_register_device(&pxa_device_ficp, info);
330 }
331 
332 static struct resource pxa_rtc_resources[] = {
333 	[0] = {
334 		.start  = 0x40900000,
335 		.end	= 0x40900000 + 0x3b,
336 		.flags  = IORESOURCE_MEM,
337 	},
338 	[1] = {
339 		.start  = IRQ_RTC1Hz,
340 		.end    = IRQ_RTC1Hz,
341 		.flags  = IORESOURCE_IRQ,
342 	},
343 	[2] = {
344 		.start  = IRQ_RTCAlrm,
345 		.end    = IRQ_RTCAlrm,
346 		.flags  = IORESOURCE_IRQ,
347 	},
348 };
349 
350 struct platform_device sa1100_device_rtc = {
351 	.name		= "sa1100-rtc",
352 	.id		= -1,
353 };
354 
355 struct platform_device pxa_device_rtc = {
356 	.name		= "pxa-rtc",
357 	.id		= -1,
358 	.num_resources  = ARRAY_SIZE(pxa_rtc_resources),
359 	.resource       = pxa_rtc_resources,
360 };
361 
362 static struct resource pxa_ac97_resources[] = {
363 	[0] = {
364 		.start  = 0x40500000,
365 		.end	= 0x40500000 + 0xfff,
366 		.flags  = IORESOURCE_MEM,
367 	},
368 	[1] = {
369 		.start  = IRQ_AC97,
370 		.end    = IRQ_AC97,
371 		.flags  = IORESOURCE_IRQ,
372 	},
373 };
374 
375 static u64 pxa_ac97_dmamask = 0xffffffffUL;
376 
377 struct platform_device pxa_device_ac97 = {
378 	.name           = "pxa2xx-ac97",
379 	.id             = -1,
380 	.dev            = {
381 		.dma_mask = &pxa_ac97_dmamask,
382 		.coherent_dma_mask = 0xffffffff,
383 	},
384 	.num_resources  = ARRAY_SIZE(pxa_ac97_resources),
385 	.resource       = pxa_ac97_resources,
386 };
387 
388 void __init pxa_set_ac97_info(pxa2xx_audio_ops_t *ops)
389 {
390 	pxa_register_device(&pxa_device_ac97, ops);
391 }
392 
393 #ifdef CONFIG_PXA25x
394 
395 static struct resource pxa25x_resource_pwm0[] = {
396 	[0] = {
397 		.start	= 0x40b00000,
398 		.end	= 0x40b0000f,
399 		.flags	= IORESOURCE_MEM,
400 	},
401 };
402 
403 struct platform_device pxa25x_device_pwm0 = {
404 	.name		= "pxa25x-pwm",
405 	.id		= 0,
406 	.resource	= pxa25x_resource_pwm0,
407 	.num_resources	= ARRAY_SIZE(pxa25x_resource_pwm0),
408 };
409 
410 static struct resource pxa25x_resource_pwm1[] = {
411 	[0] = {
412 		.start	= 0x40c00000,
413 		.end	= 0x40c0000f,
414 		.flags	= IORESOURCE_MEM,
415 	},
416 };
417 
418 struct platform_device pxa25x_device_pwm1 = {
419 	.name		= "pxa25x-pwm",
420 	.id		= 1,
421 	.resource	= pxa25x_resource_pwm1,
422 	.num_resources	= ARRAY_SIZE(pxa25x_resource_pwm1),
423 };
424 
425 static u64 pxa25x_ssp_dma_mask = DMA_BIT_MASK(32);
426 
427 static struct resource pxa25x_resource_ssp[] = {
428 	[0] = {
429 		.start	= 0x41000000,
430 		.end	= 0x4100001f,
431 		.flags	= IORESOURCE_MEM,
432 	},
433 	[1] = {
434 		.start	= IRQ_SSP,
435 		.end	= IRQ_SSP,
436 		.flags	= IORESOURCE_IRQ,
437 	},
438 	[2] = {
439 		/* DRCMR for RX */
440 		.start	= 13,
441 		.end	= 13,
442 		.flags	= IORESOURCE_DMA,
443 	},
444 	[3] = {
445 		/* DRCMR for TX */
446 		.start	= 14,
447 		.end	= 14,
448 		.flags	= IORESOURCE_DMA,
449 	},
450 };
451 
452 struct platform_device pxa25x_device_ssp = {
453 	.name		= "pxa25x-ssp",
454 	.id		= 0,
455 	.dev		= {
456 		.dma_mask = &pxa25x_ssp_dma_mask,
457 		.coherent_dma_mask = DMA_BIT_MASK(32),
458 	},
459 	.resource	= pxa25x_resource_ssp,
460 	.num_resources	= ARRAY_SIZE(pxa25x_resource_ssp),
461 };
462 
463 static u64 pxa25x_nssp_dma_mask = DMA_BIT_MASK(32);
464 
465 static struct resource pxa25x_resource_nssp[] = {
466 	[0] = {
467 		.start	= 0x41400000,
468 		.end	= 0x4140002f,
469 		.flags	= IORESOURCE_MEM,
470 	},
471 	[1] = {
472 		.start	= IRQ_NSSP,
473 		.end	= IRQ_NSSP,
474 		.flags	= IORESOURCE_IRQ,
475 	},
476 	[2] = {
477 		/* DRCMR for RX */
478 		.start	= 15,
479 		.end	= 15,
480 		.flags	= IORESOURCE_DMA,
481 	},
482 	[3] = {
483 		/* DRCMR for TX */
484 		.start	= 16,
485 		.end	= 16,
486 		.flags	= IORESOURCE_DMA,
487 	},
488 };
489 
490 struct platform_device pxa25x_device_nssp = {
491 	.name		= "pxa25x-nssp",
492 	.id		= 1,
493 	.dev		= {
494 		.dma_mask = &pxa25x_nssp_dma_mask,
495 		.coherent_dma_mask = DMA_BIT_MASK(32),
496 	},
497 	.resource	= pxa25x_resource_nssp,
498 	.num_resources	= ARRAY_SIZE(pxa25x_resource_nssp),
499 };
500 
501 static u64 pxa25x_assp_dma_mask = DMA_BIT_MASK(32);
502 
503 static struct resource pxa25x_resource_assp[] = {
504 	[0] = {
505 		.start	= 0x41500000,
506 		.end	= 0x4150002f,
507 		.flags	= IORESOURCE_MEM,
508 	},
509 	[1] = {
510 		.start	= IRQ_ASSP,
511 		.end	= IRQ_ASSP,
512 		.flags	= IORESOURCE_IRQ,
513 	},
514 	[2] = {
515 		/* DRCMR for RX */
516 		.start	= 23,
517 		.end	= 23,
518 		.flags	= IORESOURCE_DMA,
519 	},
520 	[3] = {
521 		/* DRCMR for TX */
522 		.start	= 24,
523 		.end	= 24,
524 		.flags	= IORESOURCE_DMA,
525 	},
526 };
527 
528 struct platform_device pxa25x_device_assp = {
529 	/* ASSP is basically equivalent to NSSP */
530 	.name		= "pxa25x-nssp",
531 	.id		= 2,
532 	.dev		= {
533 		.dma_mask = &pxa25x_assp_dma_mask,
534 		.coherent_dma_mask = DMA_BIT_MASK(32),
535 	},
536 	.resource	= pxa25x_resource_assp,
537 	.num_resources	= ARRAY_SIZE(pxa25x_resource_assp),
538 };
539 #endif /* CONFIG_PXA25x */
540 
541 #if defined(CONFIG_PXA27x) || defined(CONFIG_PXA3xx)
542 
543 static struct resource pxa27x_resource_keypad[] = {
544 	[0] = {
545 		.start	= 0x41500000,
546 		.end	= 0x4150004c,
547 		.flags	= IORESOURCE_MEM,
548 	},
549 	[1] = {
550 		.start	= IRQ_KEYPAD,
551 		.end	= IRQ_KEYPAD,
552 		.flags	= IORESOURCE_IRQ,
553 	},
554 };
555 
556 struct platform_device pxa27x_device_keypad = {
557 	.name		= "pxa27x-keypad",
558 	.id		= -1,
559 	.resource	= pxa27x_resource_keypad,
560 	.num_resources	= ARRAY_SIZE(pxa27x_resource_keypad),
561 };
562 
563 void __init pxa_set_keypad_info(struct pxa27x_keypad_platform_data *info)
564 {
565 	pxa_register_device(&pxa27x_device_keypad, info);
566 }
567 
568 static u64 pxa27x_ohci_dma_mask = DMA_BIT_MASK(32);
569 
570 static struct resource pxa27x_resource_ohci[] = {
571 	[0] = {
572 		.start  = 0x4C000000,
573 		.end    = 0x4C00ff6f,
574 		.flags  = IORESOURCE_MEM,
575 	},
576 	[1] = {
577 		.start  = IRQ_USBH1,
578 		.end    = IRQ_USBH1,
579 		.flags  = IORESOURCE_IRQ,
580 	},
581 };
582 
583 struct platform_device pxa27x_device_ohci = {
584 	.name		= "pxa27x-ohci",
585 	.id		= -1,
586 	.dev		= {
587 		.dma_mask = &pxa27x_ohci_dma_mask,
588 		.coherent_dma_mask = DMA_BIT_MASK(32),
589 	},
590 	.num_resources  = ARRAY_SIZE(pxa27x_resource_ohci),
591 	.resource       = pxa27x_resource_ohci,
592 };
593 
594 void __init pxa_set_ohci_info(struct pxaohci_platform_data *info)
595 {
596 	pxa_register_device(&pxa27x_device_ohci, info);
597 }
598 
599 static u64 pxa27x_ssp1_dma_mask = DMA_BIT_MASK(32);
600 
601 static struct resource pxa27x_resource_ssp1[] = {
602 	[0] = {
603 		.start	= 0x41000000,
604 		.end	= 0x4100003f,
605 		.flags	= IORESOURCE_MEM,
606 	},
607 	[1] = {
608 		.start	= IRQ_SSP,
609 		.end	= IRQ_SSP,
610 		.flags	= IORESOURCE_IRQ,
611 	},
612 	[2] = {
613 		/* DRCMR for RX */
614 		.start	= 13,
615 		.end	= 13,
616 		.flags	= IORESOURCE_DMA,
617 	},
618 	[3] = {
619 		/* DRCMR for TX */
620 		.start	= 14,
621 		.end	= 14,
622 		.flags	= IORESOURCE_DMA,
623 	},
624 };
625 
626 struct platform_device pxa27x_device_ssp1 = {
627 	.name		= "pxa27x-ssp",
628 	.id		= 0,
629 	.dev		= {
630 		.dma_mask = &pxa27x_ssp1_dma_mask,
631 		.coherent_dma_mask = DMA_BIT_MASK(32),
632 	},
633 	.resource	= pxa27x_resource_ssp1,
634 	.num_resources	= ARRAY_SIZE(pxa27x_resource_ssp1),
635 };
636 
637 static u64 pxa27x_ssp2_dma_mask = DMA_BIT_MASK(32);
638 
639 static struct resource pxa27x_resource_ssp2[] = {
640 	[0] = {
641 		.start	= 0x41700000,
642 		.end	= 0x4170003f,
643 		.flags	= IORESOURCE_MEM,
644 	},
645 	[1] = {
646 		.start	= IRQ_SSP2,
647 		.end	= IRQ_SSP2,
648 		.flags	= IORESOURCE_IRQ,
649 	},
650 	[2] = {
651 		/* DRCMR for RX */
652 		.start	= 15,
653 		.end	= 15,
654 		.flags	= IORESOURCE_DMA,
655 	},
656 	[3] = {
657 		/* DRCMR for TX */
658 		.start	= 16,
659 		.end	= 16,
660 		.flags	= IORESOURCE_DMA,
661 	},
662 };
663 
664 struct platform_device pxa27x_device_ssp2 = {
665 	.name		= "pxa27x-ssp",
666 	.id		= 1,
667 	.dev		= {
668 		.dma_mask = &pxa27x_ssp2_dma_mask,
669 		.coherent_dma_mask = DMA_BIT_MASK(32),
670 	},
671 	.resource	= pxa27x_resource_ssp2,
672 	.num_resources	= ARRAY_SIZE(pxa27x_resource_ssp2),
673 };
674 
675 static u64 pxa27x_ssp3_dma_mask = DMA_BIT_MASK(32);
676 
677 static struct resource pxa27x_resource_ssp3[] = {
678 	[0] = {
679 		.start	= 0x41900000,
680 		.end	= 0x4190003f,
681 		.flags	= IORESOURCE_MEM,
682 	},
683 	[1] = {
684 		.start	= IRQ_SSP3,
685 		.end	= IRQ_SSP3,
686 		.flags	= IORESOURCE_IRQ,
687 	},
688 	[2] = {
689 		/* DRCMR for RX */
690 		.start	= 66,
691 		.end	= 66,
692 		.flags	= IORESOURCE_DMA,
693 	},
694 	[3] = {
695 		/* DRCMR for TX */
696 		.start	= 67,
697 		.end	= 67,
698 		.flags	= IORESOURCE_DMA,
699 	},
700 };
701 
702 struct platform_device pxa27x_device_ssp3 = {
703 	.name		= "pxa27x-ssp",
704 	.id		= 2,
705 	.dev		= {
706 		.dma_mask = &pxa27x_ssp3_dma_mask,
707 		.coherent_dma_mask = DMA_BIT_MASK(32),
708 	},
709 	.resource	= pxa27x_resource_ssp3,
710 	.num_resources	= ARRAY_SIZE(pxa27x_resource_ssp3),
711 };
712 
713 static struct resource pxa27x_resource_pwm0[] = {
714 	[0] = {
715 		.start	= 0x40b00000,
716 		.end	= 0x40b0001f,
717 		.flags	= IORESOURCE_MEM,
718 	},
719 };
720 
721 struct platform_device pxa27x_device_pwm0 = {
722 	.name		= "pxa27x-pwm",
723 	.id		= 0,
724 	.resource	= pxa27x_resource_pwm0,
725 	.num_resources	= ARRAY_SIZE(pxa27x_resource_pwm0),
726 };
727 
728 static struct resource pxa27x_resource_pwm1[] = {
729 	[0] = {
730 		.start	= 0x40c00000,
731 		.end	= 0x40c0001f,
732 		.flags	= IORESOURCE_MEM,
733 	},
734 };
735 
736 struct platform_device pxa27x_device_pwm1 = {
737 	.name		= "pxa27x-pwm",
738 	.id		= 1,
739 	.resource	= pxa27x_resource_pwm1,
740 	.num_resources	= ARRAY_SIZE(pxa27x_resource_pwm1),
741 };
742 
743 static struct resource pxa27x_resource_camera[] = {
744 	[0] = {
745 		.start	= 0x50000000,
746 		.end	= 0x50000fff,
747 		.flags	= IORESOURCE_MEM,
748 	},
749 	[1] = {
750 		.start	= IRQ_CAMERA,
751 		.end	= IRQ_CAMERA,
752 		.flags	= IORESOURCE_IRQ,
753 	},
754 };
755 
756 static u64 pxa27x_dma_mask_camera = DMA_BIT_MASK(32);
757 
758 static struct platform_device pxa27x_device_camera = {
759 	.name		= "pxa27x-camera",
760 	.id		= 0, /* This is used to put cameras on this interface */
761 	.dev		= {
762 		.dma_mask      		= &pxa27x_dma_mask_camera,
763 		.coherent_dma_mask	= 0xffffffff,
764 	},
765 	.num_resources	= ARRAY_SIZE(pxa27x_resource_camera),
766 	.resource	= pxa27x_resource_camera,
767 };
768 
769 void __init pxa_set_camera_info(struct pxacamera_platform_data *info)
770 {
771 	pxa_register_device(&pxa27x_device_camera, info);
772 }
773 #endif /* CONFIG_PXA27x || CONFIG_PXA3xx */
774 
775 #ifdef CONFIG_PXA3xx
776 static u64 pxa3xx_ssp4_dma_mask = DMA_BIT_MASK(32);
777 
778 static struct resource pxa3xx_resource_ssp4[] = {
779 	[0] = {
780 		.start	= 0x41a00000,
781 		.end	= 0x41a0003f,
782 		.flags	= IORESOURCE_MEM,
783 	},
784 	[1] = {
785 		.start	= IRQ_SSP4,
786 		.end	= IRQ_SSP4,
787 		.flags	= IORESOURCE_IRQ,
788 	},
789 	[2] = {
790 		/* DRCMR for RX */
791 		.start	= 2,
792 		.end	= 2,
793 		.flags	= IORESOURCE_DMA,
794 	},
795 	[3] = {
796 		/* DRCMR for TX */
797 		.start	= 3,
798 		.end	= 3,
799 		.flags	= IORESOURCE_DMA,
800 	},
801 };
802 
803 struct platform_device pxa3xx_device_ssp4 = {
804 	/* PXA3xx SSP is basically equivalent to PXA27x */
805 	.name		= "pxa27x-ssp",
806 	.id		= 3,
807 	.dev		= {
808 		.dma_mask = &pxa3xx_ssp4_dma_mask,
809 		.coherent_dma_mask = DMA_BIT_MASK(32),
810 	},
811 	.resource	= pxa3xx_resource_ssp4,
812 	.num_resources	= ARRAY_SIZE(pxa3xx_resource_ssp4),
813 };
814 
815 static struct resource pxa3xx_resources_mci2[] = {
816 	[0] = {
817 		.start	= 0x42000000,
818 		.end	= 0x42000fff,
819 		.flags	= IORESOURCE_MEM,
820 	},
821 	[1] = {
822 		.start	= IRQ_MMC2,
823 		.end	= IRQ_MMC2,
824 		.flags	= IORESOURCE_IRQ,
825 	},
826 	[2] = {
827 		.start	= 93,
828 		.end	= 93,
829 		.flags	= IORESOURCE_DMA,
830 	},
831 	[3] = {
832 		.start	= 94,
833 		.end	= 94,
834 		.flags	= IORESOURCE_DMA,
835 	},
836 };
837 
838 struct platform_device pxa3xx_device_mci2 = {
839 	.name		= "pxa2xx-mci",
840 	.id		= 1,
841 	.dev		= {
842 		.dma_mask = &pxamci_dmamask,
843 		.coherent_dma_mask =	0xffffffff,
844 	},
845 	.num_resources	= ARRAY_SIZE(pxa3xx_resources_mci2),
846 	.resource	= pxa3xx_resources_mci2,
847 };
848 
849 void __init pxa3xx_set_mci2_info(struct pxamci_platform_data *info)
850 {
851 	pxa_register_device(&pxa3xx_device_mci2, info);
852 }
853 
854 static struct resource pxa3xx_resources_mci3[] = {
855 	[0] = {
856 		.start	= 0x42500000,
857 		.end	= 0x42500fff,
858 		.flags	= IORESOURCE_MEM,
859 	},
860 	[1] = {
861 		.start	= IRQ_MMC3,
862 		.end	= IRQ_MMC3,
863 		.flags	= IORESOURCE_IRQ,
864 	},
865 	[2] = {
866 		.start	= 100,
867 		.end	= 100,
868 		.flags	= IORESOURCE_DMA,
869 	},
870 	[3] = {
871 		.start	= 101,
872 		.end	= 101,
873 		.flags	= IORESOURCE_DMA,
874 	},
875 };
876 
877 struct platform_device pxa3xx_device_mci3 = {
878 	.name		= "pxa2xx-mci",
879 	.id		= 2,
880 	.dev		= {
881 		.dma_mask = &pxamci_dmamask,
882 		.coherent_dma_mask = 0xffffffff,
883 	},
884 	.num_resources	= ARRAY_SIZE(pxa3xx_resources_mci3),
885 	.resource	= pxa3xx_resources_mci3,
886 };
887 
888 void __init pxa3xx_set_mci3_info(struct pxamci_platform_data *info)
889 {
890 	pxa_register_device(&pxa3xx_device_mci3, info);
891 }
892 
893 static struct resource pxa3xx_resources_nand[] = {
894 	[0] = {
895 		.start	= 0x43100000,
896 		.end	= 0x43100053,
897 		.flags	= IORESOURCE_MEM,
898 	},
899 	[1] = {
900 		.start	= IRQ_NAND,
901 		.end	= IRQ_NAND,
902 		.flags	= IORESOURCE_IRQ,
903 	},
904 	[2] = {
905 		/* DRCMR for Data DMA */
906 		.start	= 97,
907 		.end	= 97,
908 		.flags	= IORESOURCE_DMA,
909 	},
910 	[3] = {
911 		/* DRCMR for Command DMA */
912 		.start	= 99,
913 		.end	= 99,
914 		.flags	= IORESOURCE_DMA,
915 	},
916 };
917 
918 static u64 pxa3xx_nand_dma_mask = DMA_BIT_MASK(32);
919 
920 struct platform_device pxa3xx_device_nand = {
921 	.name		= "pxa3xx-nand",
922 	.id		= -1,
923 	.dev		= {
924 		.dma_mask = &pxa3xx_nand_dma_mask,
925 		.coherent_dma_mask = DMA_BIT_MASK(32),
926 	},
927 	.num_resources	= ARRAY_SIZE(pxa3xx_resources_nand),
928 	.resource	= pxa3xx_resources_nand,
929 };
930 
931 void __init pxa3xx_set_nand_info(struct pxa3xx_nand_platform_data *info)
932 {
933 	pxa_register_device(&pxa3xx_device_nand, info);
934 }
935 #endif /* CONFIG_PXA3xx */
936 
937 /* pxa2xx-spi platform-device ID equals respective SSP platform-device ID + 1.
938  * See comment in arch/arm/mach-pxa/ssp.c::ssp_probe() */
939 void __init pxa2xx_set_spi_info(unsigned id, struct pxa2xx_spi_master *info)
940 {
941 	struct platform_device *pd;
942 
943 	pd = platform_device_alloc("pxa2xx-spi", id);
944 	if (pd == NULL) {
945 		printk(KERN_ERR "pxa2xx-spi: failed to allocate device id %d\n",
946 		       id);
947 		return;
948 	}
949 
950 	pd->dev.platform_data = info;
951 	platform_device_add(pd);
952 }
953