Merge branch 'for-2.6.39' of git://linux-nfs.org/~bfields/linux
[pandora-kernel.git] / arch / arm / mach-davinci / devices-da8xx.c
1 /*
2  * DA8XX/OMAP L1XX platform device data
3  *
4  * Copyright (c) 2007-2009, MontaVista Software, Inc. <source@mvista.com>
5  * Derived from code that was:
6  *      Copyright (C) 2006 Komal Shah <komal_shah802003@yahoo.com>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  */
13 #include <linux/init.h>
14 #include <linux/platform_device.h>
15 #include <linux/dma-mapping.h>
16 #include <linux/serial_8250.h>
17
18 #include <mach/cputype.h>
19 #include <mach/common.h>
20 #include <mach/time.h>
21 #include <mach/da8xx.h>
22 #include <mach/cpuidle.h>
23
24 #include "clock.h"
25
26 #define DA8XX_TPCC_BASE                 0x01c00000
27 #define DA850_MMCSD1_BASE               0x01e1b000
28 #define DA850_TPCC1_BASE                0x01e30000
29 #define DA8XX_TPTC0_BASE                0x01c08000
30 #define DA8XX_TPTC1_BASE                0x01c08400
31 #define DA850_TPTC2_BASE                0x01e38000
32 #define DA8XX_WDOG_BASE                 0x01c21000 /* DA8XX_TIMER64P1_BASE */
33 #define DA8XX_I2C0_BASE                 0x01c22000
34 #define DA8XX_RTC_BASE                  0x01C23000
35 #define DA8XX_EMAC_CPPI_PORT_BASE       0x01e20000
36 #define DA8XX_EMAC_CPGMACSS_BASE        0x01e22000
37 #define DA8XX_EMAC_CPGMAC_BASE          0x01e23000
38 #define DA8XX_EMAC_MDIO_BASE            0x01e24000
39 #define DA8XX_GPIO_BASE                 0x01e26000
40 #define DA8XX_I2C1_BASE                 0x01e28000
41 #define DA8XX_SPI0_BASE                 0x01c41000
42 #define DA8XX_SPI1_BASE                 0x01f0e000
43
44 #define DA8XX_EMAC_CTRL_REG_OFFSET      0x3000
45 #define DA8XX_EMAC_MOD_REG_OFFSET       0x2000
46 #define DA8XX_EMAC_RAM_OFFSET           0x0000
47 #define DA8XX_EMAC_CTRL_RAM_SIZE        SZ_8K
48
49 #define DA8XX_DMA_SPI0_RX       EDMA_CTLR_CHAN(0, 14)
50 #define DA8XX_DMA_SPI0_TX       EDMA_CTLR_CHAN(0, 15)
51 #define DA8XX_DMA_MMCSD0_RX     EDMA_CTLR_CHAN(0, 16)
52 #define DA8XX_DMA_MMCSD0_TX     EDMA_CTLR_CHAN(0, 17)
53 #define DA8XX_DMA_SPI1_RX       EDMA_CTLR_CHAN(0, 18)
54 #define DA8XX_DMA_SPI1_TX       EDMA_CTLR_CHAN(0, 19)
55 #define DA850_DMA_MMCSD1_RX     EDMA_CTLR_CHAN(1, 28)
56 #define DA850_DMA_MMCSD1_TX     EDMA_CTLR_CHAN(1, 29)
57
58 void __iomem *da8xx_syscfg0_base;
59 void __iomem *da8xx_syscfg1_base;
60
61 static struct plat_serial8250_port da8xx_serial_pdata[] = {
62         {
63                 .mapbase        = DA8XX_UART0_BASE,
64                 .irq            = IRQ_DA8XX_UARTINT0,
65                 .flags          = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
66                                         UPF_IOREMAP,
67                 .iotype         = UPIO_MEM,
68                 .regshift       = 2,
69         },
70         {
71                 .mapbase        = DA8XX_UART1_BASE,
72                 .irq            = IRQ_DA8XX_UARTINT1,
73                 .flags          = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
74                                         UPF_IOREMAP,
75                 .iotype         = UPIO_MEM,
76                 .regshift       = 2,
77         },
78         {
79                 .mapbase        = DA8XX_UART2_BASE,
80                 .irq            = IRQ_DA8XX_UARTINT2,
81                 .flags          = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
82                                         UPF_IOREMAP,
83                 .iotype         = UPIO_MEM,
84                 .regshift       = 2,
85         },
86         {
87                 .flags  = 0,
88         },
89 };
90
91 struct platform_device da8xx_serial_device = {
92         .name   = "serial8250",
93         .id     = PLAT8250_DEV_PLATFORM,
94         .dev    = {
95                 .platform_data  = da8xx_serial_pdata,
96         },
97 };
98
99 static const s8 da8xx_queue_tc_mapping[][2] = {
100         /* {event queue no, TC no} */
101         {0, 0},
102         {1, 1},
103         {-1, -1}
104 };
105
106 static const s8 da8xx_queue_priority_mapping[][2] = {
107         /* {event queue no, Priority} */
108         {0, 3},
109         {1, 7},
110         {-1, -1}
111 };
112
113 static const s8 da850_queue_tc_mapping[][2] = {
114         /* {event queue no, TC no} */
115         {0, 0},
116         {-1, -1}
117 };
118
119 static const s8 da850_queue_priority_mapping[][2] = {
120         /* {event queue no, Priority} */
121         {0, 3},
122         {-1, -1}
123 };
124
125 static struct edma_soc_info da830_edma_cc0_info = {
126         .n_channel              = 32,
127         .n_region               = 4,
128         .n_slot                 = 128,
129         .n_tc                   = 2,
130         .n_cc                   = 1,
131         .queue_tc_mapping       = da8xx_queue_tc_mapping,
132         .queue_priority_mapping = da8xx_queue_priority_mapping,
133 };
134
135 static struct edma_soc_info *da830_edma_info[EDMA_MAX_CC] = {
136         &da830_edma_cc0_info,
137 };
138
139 static struct edma_soc_info da850_edma_cc_info[] = {
140         {
141                 .n_channel              = 32,
142                 .n_region               = 4,
143                 .n_slot                 = 128,
144                 .n_tc                   = 2,
145                 .n_cc                   = 1,
146                 .queue_tc_mapping       = da8xx_queue_tc_mapping,
147                 .queue_priority_mapping = da8xx_queue_priority_mapping,
148         },
149         {
150                 .n_channel              = 32,
151                 .n_region               = 4,
152                 .n_slot                 = 128,
153                 .n_tc                   = 1,
154                 .n_cc                   = 1,
155                 .queue_tc_mapping       = da850_queue_tc_mapping,
156                 .queue_priority_mapping = da850_queue_priority_mapping,
157         },
158 };
159
160 static struct edma_soc_info *da850_edma_info[EDMA_MAX_CC] = {
161         &da850_edma_cc_info[0],
162         &da850_edma_cc_info[1],
163 };
164
165 static struct resource da830_edma_resources[] = {
166         {
167                 .name   = "edma_cc0",
168                 .start  = DA8XX_TPCC_BASE,
169                 .end    = DA8XX_TPCC_BASE + SZ_32K - 1,
170                 .flags  = IORESOURCE_MEM,
171         },
172         {
173                 .name   = "edma_tc0",
174                 .start  = DA8XX_TPTC0_BASE,
175                 .end    = DA8XX_TPTC0_BASE + SZ_1K - 1,
176                 .flags  = IORESOURCE_MEM,
177         },
178         {
179                 .name   = "edma_tc1",
180                 .start  = DA8XX_TPTC1_BASE,
181                 .end    = DA8XX_TPTC1_BASE + SZ_1K - 1,
182                 .flags  = IORESOURCE_MEM,
183         },
184         {
185                 .name   = "edma0",
186                 .start  = IRQ_DA8XX_CCINT0,
187                 .flags  = IORESOURCE_IRQ,
188         },
189         {
190                 .name   = "edma0_err",
191                 .start  = IRQ_DA8XX_CCERRINT,
192                 .flags  = IORESOURCE_IRQ,
193         },
194 };
195
196 static struct resource da850_edma_resources[] = {
197         {
198                 .name   = "edma_cc0",
199                 .start  = DA8XX_TPCC_BASE,
200                 .end    = DA8XX_TPCC_BASE + SZ_32K - 1,
201                 .flags  = IORESOURCE_MEM,
202         },
203         {
204                 .name   = "edma_tc0",
205                 .start  = DA8XX_TPTC0_BASE,
206                 .end    = DA8XX_TPTC0_BASE + SZ_1K - 1,
207                 .flags  = IORESOURCE_MEM,
208         },
209         {
210                 .name   = "edma_tc1",
211                 .start  = DA8XX_TPTC1_BASE,
212                 .end    = DA8XX_TPTC1_BASE + SZ_1K - 1,
213                 .flags  = IORESOURCE_MEM,
214         },
215         {
216                 .name   = "edma_cc1",
217                 .start  = DA850_TPCC1_BASE,
218                 .end    = DA850_TPCC1_BASE + SZ_32K - 1,
219                 .flags  = IORESOURCE_MEM,
220         },
221         {
222                 .name   = "edma_tc2",
223                 .start  = DA850_TPTC2_BASE,
224                 .end    = DA850_TPTC2_BASE + SZ_1K - 1,
225                 .flags  = IORESOURCE_MEM,
226         },
227         {
228                 .name   = "edma0",
229                 .start  = IRQ_DA8XX_CCINT0,
230                 .flags  = IORESOURCE_IRQ,
231         },
232         {
233                 .name   = "edma0_err",
234                 .start  = IRQ_DA8XX_CCERRINT,
235                 .flags  = IORESOURCE_IRQ,
236         },
237         {
238                 .name   = "edma1",
239                 .start  = IRQ_DA850_CCINT1,
240                 .flags  = IORESOURCE_IRQ,
241         },
242         {
243                 .name   = "edma1_err",
244                 .start  = IRQ_DA850_CCERRINT1,
245                 .flags  = IORESOURCE_IRQ,
246         },
247 };
248
249 static struct platform_device da830_edma_device = {
250         .name           = "edma",
251         .id             = -1,
252         .dev = {
253                 .platform_data = da830_edma_info,
254         },
255         .num_resources  = ARRAY_SIZE(da830_edma_resources),
256         .resource       = da830_edma_resources,
257 };
258
259 static struct platform_device da850_edma_device = {
260         .name           = "edma",
261         .id             = -1,
262         .dev = {
263                 .platform_data = da850_edma_info,
264         },
265         .num_resources  = ARRAY_SIZE(da850_edma_resources),
266         .resource       = da850_edma_resources,
267 };
268
269 int __init da830_register_edma(struct edma_rsv_info *rsv)
270 {
271         da830_edma_cc0_info.rsv = rsv;
272
273         return platform_device_register(&da830_edma_device);
274 }
275
276 int __init da850_register_edma(struct edma_rsv_info *rsv[2])
277 {
278         if (rsv) {
279                 da850_edma_cc_info[0].rsv = rsv[0];
280                 da850_edma_cc_info[1].rsv = rsv[1];
281         }
282
283         return platform_device_register(&da850_edma_device);
284 }
285
286 static struct resource da8xx_i2c_resources0[] = {
287         {
288                 .start  = DA8XX_I2C0_BASE,
289                 .end    = DA8XX_I2C0_BASE + SZ_4K - 1,
290                 .flags  = IORESOURCE_MEM,
291         },
292         {
293                 .start  = IRQ_DA8XX_I2CINT0,
294                 .end    = IRQ_DA8XX_I2CINT0,
295                 .flags  = IORESOURCE_IRQ,
296         },
297 };
298
299 static struct platform_device da8xx_i2c_device0 = {
300         .name           = "i2c_davinci",
301         .id             = 1,
302         .num_resources  = ARRAY_SIZE(da8xx_i2c_resources0),
303         .resource       = da8xx_i2c_resources0,
304 };
305
306 static struct resource da8xx_i2c_resources1[] = {
307         {
308                 .start  = DA8XX_I2C1_BASE,
309                 .end    = DA8XX_I2C1_BASE + SZ_4K - 1,
310                 .flags  = IORESOURCE_MEM,
311         },
312         {
313                 .start  = IRQ_DA8XX_I2CINT1,
314                 .end    = IRQ_DA8XX_I2CINT1,
315                 .flags  = IORESOURCE_IRQ,
316         },
317 };
318
319 static struct platform_device da8xx_i2c_device1 = {
320         .name           = "i2c_davinci",
321         .id             = 2,
322         .num_resources  = ARRAY_SIZE(da8xx_i2c_resources1),
323         .resource       = da8xx_i2c_resources1,
324 };
325
326 int __init da8xx_register_i2c(int instance,
327                 struct davinci_i2c_platform_data *pdata)
328 {
329         struct platform_device *pdev;
330
331         if (instance == 0)
332                 pdev = &da8xx_i2c_device0;
333         else if (instance == 1)
334                 pdev = &da8xx_i2c_device1;
335         else
336                 return -EINVAL;
337
338         pdev->dev.platform_data = pdata;
339         return platform_device_register(pdev);
340 }
341
342 static struct resource da8xx_watchdog_resources[] = {
343         {
344                 .start  = DA8XX_WDOG_BASE,
345                 .end    = DA8XX_WDOG_BASE + SZ_4K - 1,
346                 .flags  = IORESOURCE_MEM,
347         },
348 };
349
350 struct platform_device da8xx_wdt_device = {
351         .name           = "watchdog",
352         .id             = -1,
353         .num_resources  = ARRAY_SIZE(da8xx_watchdog_resources),
354         .resource       = da8xx_watchdog_resources,
355 };
356
357 int __init da8xx_register_watchdog(void)
358 {
359         return platform_device_register(&da8xx_wdt_device);
360 }
361
362 static struct resource da8xx_emac_resources[] = {
363         {
364                 .start  = DA8XX_EMAC_CPPI_PORT_BASE,
365                 .end    = DA8XX_EMAC_CPPI_PORT_BASE + SZ_16K - 1,
366                 .flags  = IORESOURCE_MEM,
367         },
368         {
369                 .start  = IRQ_DA8XX_C0_RX_THRESH_PULSE,
370                 .end    = IRQ_DA8XX_C0_RX_THRESH_PULSE,
371                 .flags  = IORESOURCE_IRQ,
372         },
373         {
374                 .start  = IRQ_DA8XX_C0_RX_PULSE,
375                 .end    = IRQ_DA8XX_C0_RX_PULSE,
376                 .flags  = IORESOURCE_IRQ,
377         },
378         {
379                 .start  = IRQ_DA8XX_C0_TX_PULSE,
380                 .end    = IRQ_DA8XX_C0_TX_PULSE,
381                 .flags  = IORESOURCE_IRQ,
382         },
383         {
384                 .start  = IRQ_DA8XX_C0_MISC_PULSE,
385                 .end    = IRQ_DA8XX_C0_MISC_PULSE,
386                 .flags  = IORESOURCE_IRQ,
387         },
388 };
389
390 struct emac_platform_data da8xx_emac_pdata = {
391         .ctrl_reg_offset        = DA8XX_EMAC_CTRL_REG_OFFSET,
392         .ctrl_mod_reg_offset    = DA8XX_EMAC_MOD_REG_OFFSET,
393         .ctrl_ram_offset        = DA8XX_EMAC_RAM_OFFSET,
394         .ctrl_ram_size          = DA8XX_EMAC_CTRL_RAM_SIZE,
395         .version                = EMAC_VERSION_2,
396 };
397
398 static struct platform_device da8xx_emac_device = {
399         .name           = "davinci_emac",
400         .id             = 1,
401         .dev = {
402                 .platform_data  = &da8xx_emac_pdata,
403         },
404         .num_resources  = ARRAY_SIZE(da8xx_emac_resources),
405         .resource       = da8xx_emac_resources,
406 };
407
408 static struct resource da8xx_mdio_resources[] = {
409         {
410                 .start  = DA8XX_EMAC_MDIO_BASE,
411                 .end    = DA8XX_EMAC_MDIO_BASE + SZ_4K - 1,
412                 .flags  = IORESOURCE_MEM,
413         },
414 };
415
416 static struct platform_device da8xx_mdio_device = {
417         .name           = "davinci_mdio",
418         .id             = 0,
419         .num_resources  = ARRAY_SIZE(da8xx_mdio_resources),
420         .resource       = da8xx_mdio_resources,
421 };
422
423 int __init da8xx_register_emac(void)
424 {
425         int ret;
426
427         ret = platform_device_register(&da8xx_mdio_device);
428         if (ret < 0)
429                 return ret;
430         ret = platform_device_register(&da8xx_emac_device);
431         if (ret < 0)
432                 return ret;
433         ret = clk_add_alias(NULL, dev_name(&da8xx_mdio_device.dev),
434                             NULL, &da8xx_emac_device.dev);
435         return ret;
436 }
437
438 static struct resource da830_mcasp1_resources[] = {
439         {
440                 .name   = "mcasp1",
441                 .start  = DAVINCI_DA830_MCASP1_REG_BASE,
442                 .end    = DAVINCI_DA830_MCASP1_REG_BASE + (SZ_1K * 12) - 1,
443                 .flags  = IORESOURCE_MEM,
444         },
445         /* TX event */
446         {
447                 .start  = DAVINCI_DA830_DMA_MCASP1_AXEVT,
448                 .end    = DAVINCI_DA830_DMA_MCASP1_AXEVT,
449                 .flags  = IORESOURCE_DMA,
450         },
451         /* RX event */
452         {
453                 .start  = DAVINCI_DA830_DMA_MCASP1_AREVT,
454                 .end    = DAVINCI_DA830_DMA_MCASP1_AREVT,
455                 .flags  = IORESOURCE_DMA,
456         },
457 };
458
459 static struct platform_device da830_mcasp1_device = {
460         .name           = "davinci-mcasp",
461         .id             = 1,
462         .num_resources  = ARRAY_SIZE(da830_mcasp1_resources),
463         .resource       = da830_mcasp1_resources,
464 };
465
466 static struct resource da850_mcasp_resources[] = {
467         {
468                 .name   = "mcasp",
469                 .start  = DAVINCI_DA8XX_MCASP0_REG_BASE,
470                 .end    = DAVINCI_DA8XX_MCASP0_REG_BASE + (SZ_1K * 12) - 1,
471                 .flags  = IORESOURCE_MEM,
472         },
473         /* TX event */
474         {
475                 .start  = DAVINCI_DA8XX_DMA_MCASP0_AXEVT,
476                 .end    = DAVINCI_DA8XX_DMA_MCASP0_AXEVT,
477                 .flags  = IORESOURCE_DMA,
478         },
479         /* RX event */
480         {
481                 .start  = DAVINCI_DA8XX_DMA_MCASP0_AREVT,
482                 .end    = DAVINCI_DA8XX_DMA_MCASP0_AREVT,
483                 .flags  = IORESOURCE_DMA,
484         },
485 };
486
487 static struct platform_device da850_mcasp_device = {
488         .name           = "davinci-mcasp",
489         .id             = 0,
490         .num_resources  = ARRAY_SIZE(da850_mcasp_resources),
491         .resource       = da850_mcasp_resources,
492 };
493
494 struct platform_device davinci_pcm_device = {
495         .name   = "davinci-pcm-audio",
496         .id     = -1,
497 };
498
499 void __init da8xx_register_mcasp(int id, struct snd_platform_data *pdata)
500 {
501         platform_device_register(&davinci_pcm_device);
502
503         /* DA830/OMAP-L137 has 3 instances of McASP */
504         if (cpu_is_davinci_da830() && id == 1) {
505                 da830_mcasp1_device.dev.platform_data = pdata;
506                 platform_device_register(&da830_mcasp1_device);
507         } else if (cpu_is_davinci_da850()) {
508                 da850_mcasp_device.dev.platform_data = pdata;
509                 platform_device_register(&da850_mcasp_device);
510         }
511 }
512
513 static const struct display_panel disp_panel = {
514         QVGA,
515         16,
516         16,
517         COLOR_ACTIVE,
518 };
519
520 static struct lcd_ctrl_config lcd_cfg = {
521         &disp_panel,
522         .ac_bias                = 255,
523         .ac_bias_intrpt         = 0,
524         .dma_burst_sz           = 16,
525         .bpp                    = 16,
526         .fdd                    = 255,
527         .tft_alt_mode           = 0,
528         .stn_565_mode           = 0,
529         .mono_8bit_mode         = 0,
530         .invert_line_clock      = 1,
531         .invert_frm_clock       = 1,
532         .sync_edge              = 0,
533         .sync_ctrl              = 1,
534         .raster_order           = 0,
535 };
536
537 struct da8xx_lcdc_platform_data sharp_lcd035q3dg01_pdata = {
538         .manu_name              = "sharp",
539         .controller_data        = &lcd_cfg,
540         .type                   = "Sharp_LCD035Q3DG01",
541 };
542
543 struct da8xx_lcdc_platform_data sharp_lk043t1dg01_pdata = {
544         .manu_name              = "sharp",
545         .controller_data        = &lcd_cfg,
546         .type                   = "Sharp_LK043T1DG01",
547 };
548
549 static struct resource da8xx_lcdc_resources[] = {
550         [0] = { /* registers */
551                 .start  = DA8XX_LCD_CNTRL_BASE,
552                 .end    = DA8XX_LCD_CNTRL_BASE + SZ_4K - 1,
553                 .flags  = IORESOURCE_MEM,
554         },
555         [1] = { /* interrupt */
556                 .start  = IRQ_DA8XX_LCDINT,
557                 .end    = IRQ_DA8XX_LCDINT,
558                 .flags  = IORESOURCE_IRQ,
559         },
560 };
561
562 static struct platform_device da8xx_lcdc_device = {
563         .name           = "da8xx_lcdc",
564         .id             = 0,
565         .num_resources  = ARRAY_SIZE(da8xx_lcdc_resources),
566         .resource       = da8xx_lcdc_resources,
567 };
568
569 int __init da8xx_register_lcdc(struct da8xx_lcdc_platform_data *pdata)
570 {
571         da8xx_lcdc_device.dev.platform_data = pdata;
572         return platform_device_register(&da8xx_lcdc_device);
573 }
574
575 static struct resource da8xx_mmcsd0_resources[] = {
576         {               /* registers */
577                 .start  = DA8XX_MMCSD0_BASE,
578                 .end    = DA8XX_MMCSD0_BASE + SZ_4K - 1,
579                 .flags  = IORESOURCE_MEM,
580         },
581         {               /* interrupt */
582                 .start  = IRQ_DA8XX_MMCSDINT0,
583                 .end    = IRQ_DA8XX_MMCSDINT0,
584                 .flags  = IORESOURCE_IRQ,
585         },
586         {               /* DMA RX */
587                 .start  = DA8XX_DMA_MMCSD0_RX,
588                 .end    = DA8XX_DMA_MMCSD0_RX,
589                 .flags  = IORESOURCE_DMA,
590         },
591         {               /* DMA TX */
592                 .start  = DA8XX_DMA_MMCSD0_TX,
593                 .end    = DA8XX_DMA_MMCSD0_TX,
594                 .flags  = IORESOURCE_DMA,
595         },
596 };
597
598 static struct platform_device da8xx_mmcsd0_device = {
599         .name           = "davinci_mmc",
600         .id             = 0,
601         .num_resources  = ARRAY_SIZE(da8xx_mmcsd0_resources),
602         .resource       = da8xx_mmcsd0_resources,
603 };
604
605 int __init da8xx_register_mmcsd0(struct davinci_mmc_config *config)
606 {
607         da8xx_mmcsd0_device.dev.platform_data = config;
608         return platform_device_register(&da8xx_mmcsd0_device);
609 }
610
611 #ifdef CONFIG_ARCH_DAVINCI_DA850
612 static struct resource da850_mmcsd1_resources[] = {
613         {               /* registers */
614                 .start  = DA850_MMCSD1_BASE,
615                 .end    = DA850_MMCSD1_BASE + SZ_4K - 1,
616                 .flags  = IORESOURCE_MEM,
617         },
618         {               /* interrupt */
619                 .start  = IRQ_DA850_MMCSDINT0_1,
620                 .end    = IRQ_DA850_MMCSDINT0_1,
621                 .flags  = IORESOURCE_IRQ,
622         },
623         {               /* DMA RX */
624                 .start  = DA850_DMA_MMCSD1_RX,
625                 .end    = DA850_DMA_MMCSD1_RX,
626                 .flags  = IORESOURCE_DMA,
627         },
628         {               /* DMA TX */
629                 .start  = DA850_DMA_MMCSD1_TX,
630                 .end    = DA850_DMA_MMCSD1_TX,
631                 .flags  = IORESOURCE_DMA,
632         },
633 };
634
635 static struct platform_device da850_mmcsd1_device = {
636         .name           = "davinci_mmc",
637         .id             = 1,
638         .num_resources  = ARRAY_SIZE(da850_mmcsd1_resources),
639         .resource       = da850_mmcsd1_resources,
640 };
641
642 int __init da850_register_mmcsd1(struct davinci_mmc_config *config)
643 {
644         da850_mmcsd1_device.dev.platform_data = config;
645         return platform_device_register(&da850_mmcsd1_device);
646 }
647 #endif
648
649 static struct resource da8xx_rtc_resources[] = {
650         {
651                 .start          = DA8XX_RTC_BASE,
652                 .end            = DA8XX_RTC_BASE + SZ_4K - 1,
653                 .flags          = IORESOURCE_MEM,
654         },
655         { /* timer irq */
656                 .start          = IRQ_DA8XX_RTC,
657                 .end            = IRQ_DA8XX_RTC,
658                 .flags          = IORESOURCE_IRQ,
659         },
660         { /* alarm irq */
661                 .start          = IRQ_DA8XX_RTC,
662                 .end            = IRQ_DA8XX_RTC,
663                 .flags          = IORESOURCE_IRQ,
664         },
665 };
666
667 static struct platform_device da8xx_rtc_device = {
668         .name           = "omap_rtc",
669         .id             = -1,
670         .num_resources  = ARRAY_SIZE(da8xx_rtc_resources),
671         .resource       = da8xx_rtc_resources,
672 };
673
674 int da8xx_register_rtc(void)
675 {
676         int ret;
677         void __iomem *base;
678
679         base = ioremap(DA8XX_RTC_BASE, SZ_4K);
680         if (WARN_ON(!base))
681                 return -ENOMEM;
682
683         /* Unlock the rtc's registers */
684         __raw_writel(0x83e70b13, base + 0x6c);
685         __raw_writel(0x95a4f1e0, base + 0x70);
686
687         iounmap(base);
688
689         ret = platform_device_register(&da8xx_rtc_device);
690         if (!ret)
691                 /* Atleast on DA850, RTC is a wakeup source */
692                 device_init_wakeup(&da8xx_rtc_device.dev, true);
693
694         return ret;
695 }
696
697 static void __iomem *da8xx_ddr2_ctlr_base;
698 void __iomem * __init da8xx_get_mem_ctlr(void)
699 {
700         if (da8xx_ddr2_ctlr_base)
701                 return da8xx_ddr2_ctlr_base;
702
703         da8xx_ddr2_ctlr_base = ioremap(DA8XX_DDR2_CTL_BASE, SZ_32K);
704         if (!da8xx_ddr2_ctlr_base)
705                 pr_warning("%s: Unable to map DDR2 controller", __func__);
706
707         return da8xx_ddr2_ctlr_base;
708 }
709
710 static struct resource da8xx_cpuidle_resources[] = {
711         {
712                 .start          = DA8XX_DDR2_CTL_BASE,
713                 .end            = DA8XX_DDR2_CTL_BASE + SZ_32K - 1,
714                 .flags          = IORESOURCE_MEM,
715         },
716 };
717
718 /* DA8XX devices support DDR2 power down */
719 static struct davinci_cpuidle_config da8xx_cpuidle_pdata = {
720         .ddr2_pdown     = 1,
721 };
722
723
724 static struct platform_device da8xx_cpuidle_device = {
725         .name                   = "cpuidle-davinci",
726         .num_resources          = ARRAY_SIZE(da8xx_cpuidle_resources),
727         .resource               = da8xx_cpuidle_resources,
728         .dev = {
729                 .platform_data  = &da8xx_cpuidle_pdata,
730         },
731 };
732
733 int __init da8xx_register_cpuidle(void)
734 {
735         da8xx_cpuidle_pdata.ddr2_ctlr_base = da8xx_get_mem_ctlr();
736
737         return platform_device_register(&da8xx_cpuidle_device);
738 }
739
740 static struct resource da8xx_spi0_resources[] = {
741         [0] = {
742                 .start  = DA8XX_SPI0_BASE,
743                 .end    = DA8XX_SPI0_BASE + SZ_4K - 1,
744                 .flags  = IORESOURCE_MEM,
745         },
746         [1] = {
747                 .start  = IRQ_DA8XX_SPINT0,
748                 .end    = IRQ_DA8XX_SPINT0,
749                 .flags  = IORESOURCE_IRQ,
750         },
751         [2] = {
752                 .start  = DA8XX_DMA_SPI0_RX,
753                 .end    = DA8XX_DMA_SPI0_RX,
754                 .flags  = IORESOURCE_DMA,
755         },
756         [3] = {
757                 .start  = DA8XX_DMA_SPI0_TX,
758                 .end    = DA8XX_DMA_SPI0_TX,
759                 .flags  = IORESOURCE_DMA,
760         },
761 };
762
763 static struct resource da8xx_spi1_resources[] = {
764         [0] = {
765                 .start  = DA8XX_SPI1_BASE,
766                 .end    = DA8XX_SPI1_BASE + SZ_4K - 1,
767                 .flags  = IORESOURCE_MEM,
768         },
769         [1] = {
770                 .start  = IRQ_DA8XX_SPINT1,
771                 .end    = IRQ_DA8XX_SPINT1,
772                 .flags  = IORESOURCE_IRQ,
773         },
774         [2] = {
775                 .start  = DA8XX_DMA_SPI1_RX,
776                 .end    = DA8XX_DMA_SPI1_RX,
777                 .flags  = IORESOURCE_DMA,
778         },
779         [3] = {
780                 .start  = DA8XX_DMA_SPI1_TX,
781                 .end    = DA8XX_DMA_SPI1_TX,
782                 .flags  = IORESOURCE_DMA,
783         },
784 };
785
786 struct davinci_spi_platform_data da8xx_spi_pdata[] = {
787         [0] = {
788                 .version        = SPI_VERSION_2,
789                 .intr_line      = 1,
790                 .dma_event_q    = EVENTQ_0,
791         },
792         [1] = {
793                 .version        = SPI_VERSION_2,
794                 .intr_line      = 1,
795                 .dma_event_q    = EVENTQ_0,
796         },
797 };
798
799 static struct platform_device da8xx_spi_device[] = {
800         [0] = {
801                 .name           = "spi_davinci",
802                 .id             = 0,
803                 .num_resources  = ARRAY_SIZE(da8xx_spi0_resources),
804                 .resource       = da8xx_spi0_resources,
805                 .dev            = {
806                         .platform_data = &da8xx_spi_pdata[0],
807                 },
808         },
809         [1] = {
810                 .name           = "spi_davinci",
811                 .id             = 1,
812                 .num_resources  = ARRAY_SIZE(da8xx_spi1_resources),
813                 .resource       = da8xx_spi1_resources,
814                 .dev            = {
815                         .platform_data = &da8xx_spi_pdata[1],
816                 },
817         },
818 };
819
820 int __init da8xx_register_spi(int instance, struct spi_board_info *info,
821                               unsigned len)
822 {
823         int ret;
824
825         if (instance < 0 || instance > 1)
826                 return -EINVAL;
827
828         ret = spi_register_board_info(info, len);
829         if (ret)
830                 pr_warning("%s: failed to register board info for spi %d :"
831                            " %d\n", __func__, instance, ret);
832
833         da8xx_spi_pdata[instance].num_chipselect = len;
834
835         return platform_device_register(&da8xx_spi_device[instance]);
836 }