2 * linux/arch/arm/mach-omap2/devices.c
4 * OMAP2 platform device setup/initialization
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
12 #include <linux/kernel.h>
13 #include <linux/init.h>
14 #include <linux/platform_device.h>
16 #include <linux/clk.h>
17 #include <linux/err.h>
18 #include <linux/slab.h>
21 #include <mach/hardware.h>
22 #include <mach/irqs.h>
23 #include <asm/mach-types.h>
24 #include <asm/mach/map.h>
28 #include <plat/board.h>
29 #include <plat/mcbsp.h>
30 #include <mach/gpio.h>
33 #include <plat/omap_hwmod.h>
34 #include <plat/omap_device.h>
35 #include <plat/omap4-keypad.h>
41 #define L3_MODULES_MAX_LEN 12
44 static int __init omap3_l3_init(void)
47 struct omap_hwmod *oh;
48 struct platform_device *pdev;
49 char oh_name[L3_MODULES_MAX_LEN];
52 * To avoid code running on other OMAPs in
55 if (!(cpu_is_omap34xx()))
58 l = snprintf(oh_name, L3_MODULES_MAX_LEN, "l3_main");
60 oh = omap_hwmod_lookup(oh_name);
63 pr_err("could not look up %s\n", oh_name);
65 pdev = omap_device_build("omap_l3_smx", 0, oh, NULL, 0,
68 WARN(IS_ERR(pdev), "could not build omap_device for %s\n", oh_name);
70 return IS_ERR(pdev) ? PTR_ERR(pdev) : 0;
72 postcore_initcall(omap3_l3_init);
74 static int __init omap4_l3_init(void)
77 struct omap_hwmod *oh[3];
78 struct platform_device *pdev;
79 char oh_name[L3_MODULES_MAX_LEN];
81 /* If dtb is there, the devices will be created dynamically */
82 if (of_have_populated_dt())
86 * To avoid code running on other OMAPs in
89 if (!(cpu_is_omap44xx()))
92 for (i = 0; i < L3_MODULES; i++) {
93 l = snprintf(oh_name, L3_MODULES_MAX_LEN, "l3_main_%d", i+1);
95 oh[i] = omap_hwmod_lookup(oh_name);
97 pr_err("could not look up %s\n", oh_name);
100 pdev = omap_device_build_ss("omap_l3_noc", 0, oh, 3, NULL,
103 WARN(IS_ERR(pdev), "could not build omap_device for %s\n", oh_name);
105 return IS_ERR(pdev) ? PTR_ERR(pdev) : 0;
107 postcore_initcall(omap4_l3_init);
109 #if defined(CONFIG_VIDEO_OMAP2) || defined(CONFIG_VIDEO_OMAP2_MODULE)
111 static struct resource omap2cam_resources[] = {
113 .start = OMAP24XX_CAMERA_BASE,
114 .end = OMAP24XX_CAMERA_BASE + 0xfff,
115 .flags = IORESOURCE_MEM,
118 .start = INT_24XX_CAM_IRQ,
119 .flags = IORESOURCE_IRQ,
123 static struct platform_device omap2cam_device = {
124 .name = "omap24xxcam",
126 .num_resources = ARRAY_SIZE(omap2cam_resources),
127 .resource = omap2cam_resources,
131 static struct resource omap3isp_resources[] = {
133 .start = OMAP3430_ISP_BASE,
134 .end = OMAP3430_ISP_END,
135 .flags = IORESOURCE_MEM,
138 .start = OMAP3430_ISP_CCP2_BASE,
139 .end = OMAP3430_ISP_CCP2_END,
140 .flags = IORESOURCE_MEM,
143 .start = OMAP3430_ISP_CCDC_BASE,
144 .end = OMAP3430_ISP_CCDC_END,
145 .flags = IORESOURCE_MEM,
148 .start = OMAP3430_ISP_HIST_BASE,
149 .end = OMAP3430_ISP_HIST_END,
150 .flags = IORESOURCE_MEM,
153 .start = OMAP3430_ISP_H3A_BASE,
154 .end = OMAP3430_ISP_H3A_END,
155 .flags = IORESOURCE_MEM,
158 .start = OMAP3430_ISP_PREV_BASE,
159 .end = OMAP3430_ISP_PREV_END,
160 .flags = IORESOURCE_MEM,
163 .start = OMAP3430_ISP_RESZ_BASE,
164 .end = OMAP3430_ISP_RESZ_END,
165 .flags = IORESOURCE_MEM,
168 .start = OMAP3430_ISP_SBL_BASE,
169 .end = OMAP3430_ISP_SBL_END,
170 .flags = IORESOURCE_MEM,
173 .start = OMAP3430_ISP_CSI2A_REGS1_BASE,
174 .end = OMAP3430_ISP_CSI2A_REGS1_END,
175 .flags = IORESOURCE_MEM,
178 .start = OMAP3430_ISP_CSIPHY2_BASE,
179 .end = OMAP3430_ISP_CSIPHY2_END,
180 .flags = IORESOURCE_MEM,
183 .start = OMAP3630_ISP_CSI2A_REGS2_BASE,
184 .end = OMAP3630_ISP_CSI2A_REGS2_END,
185 .flags = IORESOURCE_MEM,
188 .start = OMAP3630_ISP_CSI2C_REGS1_BASE,
189 .end = OMAP3630_ISP_CSI2C_REGS1_END,
190 .flags = IORESOURCE_MEM,
193 .start = OMAP3630_ISP_CSIPHY1_BASE,
194 .end = OMAP3630_ISP_CSIPHY1_END,
195 .flags = IORESOURCE_MEM,
198 .start = OMAP3630_ISP_CSI2C_REGS2_BASE,
199 .end = OMAP3630_ISP_CSI2C_REGS2_END,
200 .flags = IORESOURCE_MEM,
203 .start = INT_34XX_CAM_IRQ,
204 .flags = IORESOURCE_IRQ,
208 static struct platform_device omap3isp_device = {
211 .num_resources = ARRAY_SIZE(omap3isp_resources),
212 .resource = omap3isp_resources,
215 int omap3_init_camera(struct isp_platform_data *pdata)
217 omap3isp_device.dev.platform_data = pdata;
218 return platform_device_register(&omap3isp_device);
221 static inline void omap_init_camera(void)
223 #if defined(CONFIG_VIDEO_OMAP2) || defined(CONFIG_VIDEO_OMAP2_MODULE)
224 if (cpu_is_omap24xx())
225 platform_device_register(&omap2cam_device);
229 int __init omap4_keyboard_init(struct omap4_keypad_platform_data
230 *sdp4430_keypad_data, struct omap_board_data *bdata)
232 struct platform_device *pdev;
233 struct omap_hwmod *oh;
234 struct omap4_keypad_platform_data *keypad_data;
235 unsigned int id = -1;
236 char *oh_name = "kbd";
237 char *name = "omap4-keypad";
239 oh = omap_hwmod_lookup(oh_name);
241 pr_err("Could not look up %s\n", oh_name);
245 keypad_data = sdp4430_keypad_data;
247 pdev = omap_device_build(name, id, oh, keypad_data,
248 sizeof(struct omap4_keypad_platform_data), NULL, 0, 0);
251 WARN(1, "Can't build omap_device for %s:%s.\n",
253 return PTR_ERR(pdev);
255 oh->mux = omap_hwmod_mux_init(bdata->pads, bdata->pads_cnt);
260 #if defined(CONFIG_OMAP_MBOX_FWK) || defined(CONFIG_OMAP_MBOX_FWK_MODULE)
261 static inline void omap_init_mbox(void)
263 struct omap_hwmod *oh;
264 struct platform_device *pdev;
266 oh = omap_hwmod_lookup("mailbox");
268 pr_err("%s: unable to find hwmod\n", __func__);
272 pdev = omap_device_build("omap-mailbox", -1, oh, NULL, 0, NULL, 0, 0);
273 WARN(IS_ERR(pdev), "%s: could not build device, err %ld\n",
274 __func__, PTR_ERR(pdev));
277 static inline void omap_init_mbox(void) { }
278 #endif /* CONFIG_OMAP_MBOX_FWK */
280 static inline void omap_init_sti(void) {}
282 #if defined(CONFIG_SND_SOC) || defined(CONFIG_SND_SOC_MODULE)
284 static struct platform_device omap_pcm = {
285 .name = "omap-pcm-audio",
290 * OMAP2420 has 2 McBSP ports
291 * OMAP2430 has 5 McBSP ports
292 * OMAP3 has 5 McBSP ports
293 * OMAP4 has 4 McBSP ports
295 OMAP_MCBSP_PLATFORM_DEVICE(1);
296 OMAP_MCBSP_PLATFORM_DEVICE(2);
297 OMAP_MCBSP_PLATFORM_DEVICE(3);
298 OMAP_MCBSP_PLATFORM_DEVICE(4);
299 OMAP_MCBSP_PLATFORM_DEVICE(5);
301 static void omap_init_audio(void)
303 platform_device_register(&omap_mcbsp1);
304 platform_device_register(&omap_mcbsp2);
305 if (cpu_is_omap243x() || cpu_is_omap34xx() || cpu_is_omap44xx()) {
306 platform_device_register(&omap_mcbsp3);
307 platform_device_register(&omap_mcbsp4);
309 if (cpu_is_omap243x() || cpu_is_omap34xx())
310 platform_device_register(&omap_mcbsp5);
312 platform_device_register(&omap_pcm);
316 static inline void omap_init_audio(void) {}
319 #if defined(CONFIG_SPI_OMAP24XX) || defined(CONFIG_SPI_OMAP24XX_MODULE)
321 #include <plat/mcspi.h>
323 static int omap_mcspi_init(struct omap_hwmod *oh, void *unused)
325 struct platform_device *pdev;
326 char *name = "omap2_mcspi";
327 struct omap2_mcspi_platform_config *pdata;
329 struct omap2_mcspi_dev_attr *mcspi_attrib = oh->dev_attr;
331 pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
333 pr_err("Memory allocation for McSPI device failed\n");
337 pdata->num_cs = mcspi_attrib->num_chipselect;
338 switch (oh->class->rev) {
339 case OMAP2_MCSPI_REV:
340 case OMAP3_MCSPI_REV:
341 pdata->regs_offset = 0;
343 case OMAP4_MCSPI_REV:
344 pdata->regs_offset = OMAP4_MCSPI_REG_OFFSET;
347 pr_err("Invalid McSPI Revision value\n");
352 pdev = omap_device_build(name, spi_num, oh, pdata,
353 sizeof(*pdata), NULL, 0, 0);
354 WARN(IS_ERR(pdev), "Can't build omap_device for %s:%s\n",
360 static void omap_init_mcspi(void)
362 omap_hwmod_for_each_by_class("mcspi", omap_mcspi_init, NULL);
366 static inline void omap_init_mcspi(void) {}
369 static struct resource omap2_pmu_resource = {
372 .flags = IORESOURCE_IRQ,
375 static struct resource omap3_pmu_resource = {
376 .start = INT_34XX_BENCH_MPU_EMUL,
377 .end = INT_34XX_BENCH_MPU_EMUL,
378 .flags = IORESOURCE_IRQ,
381 static struct platform_device omap_pmu_device = {
383 .id = ARM_PMU_DEVICE_CPU,
387 static void omap_init_pmu(void)
389 if (cpu_is_omap24xx())
390 omap_pmu_device.resource = &omap2_pmu_resource;
391 else if (cpu_is_omap34xx())
392 omap_pmu_device.resource = &omap3_pmu_resource;
396 platform_device_register(&omap_pmu_device);
400 #if defined(CONFIG_CRYPTO_DEV_OMAP_SHAM) || defined(CONFIG_CRYPTO_DEV_OMAP_SHAM_MODULE)
402 #ifdef CONFIG_ARCH_OMAP2
403 static struct resource omap2_sham_resources[] = {
405 .start = OMAP24XX_SEC_SHA1MD5_BASE,
406 .end = OMAP24XX_SEC_SHA1MD5_BASE + 0x64,
407 .flags = IORESOURCE_MEM,
410 .start = INT_24XX_SHA1MD5,
411 .flags = IORESOURCE_IRQ,
414 static int omap2_sham_resources_sz = ARRAY_SIZE(omap2_sham_resources);
416 #define omap2_sham_resources NULL
417 #define omap2_sham_resources_sz 0
420 #ifdef CONFIG_ARCH_OMAP3
421 static struct resource omap3_sham_resources[] = {
423 .start = OMAP34XX_SEC_SHA1MD5_BASE,
424 .end = OMAP34XX_SEC_SHA1MD5_BASE + 0x64,
425 .flags = IORESOURCE_MEM,
428 .start = INT_34XX_SHA1MD52_IRQ,
429 .flags = IORESOURCE_IRQ,
432 .start = OMAP34XX_DMA_SHA1MD5_RX,
433 .flags = IORESOURCE_DMA,
436 static int omap3_sham_resources_sz = ARRAY_SIZE(omap3_sham_resources);
438 #define omap3_sham_resources NULL
439 #define omap3_sham_resources_sz 0
442 static struct platform_device sham_device = {
447 static void omap_init_sham(void)
449 if (cpu_is_omap24xx()) {
450 sham_device.resource = omap2_sham_resources;
451 sham_device.num_resources = omap2_sham_resources_sz;
452 } else if (cpu_is_omap34xx()) {
453 sham_device.resource = omap3_sham_resources;
454 sham_device.num_resources = omap3_sham_resources_sz;
456 pr_err("%s: platform not supported\n", __func__);
459 platform_device_register(&sham_device);
462 static inline void omap_init_sham(void) { }
465 #if defined(CONFIG_CRYPTO_DEV_OMAP_AES) || defined(CONFIG_CRYPTO_DEV_OMAP_AES_MODULE)
467 #ifdef CONFIG_ARCH_OMAP2
468 static struct resource omap2_aes_resources[] = {
470 .start = OMAP24XX_SEC_AES_BASE,
471 .end = OMAP24XX_SEC_AES_BASE + 0x4C,
472 .flags = IORESOURCE_MEM,
475 .start = OMAP24XX_DMA_AES_TX,
476 .flags = IORESOURCE_DMA,
479 .start = OMAP24XX_DMA_AES_RX,
480 .flags = IORESOURCE_DMA,
483 static int omap2_aes_resources_sz = ARRAY_SIZE(omap2_aes_resources);
485 #define omap2_aes_resources NULL
486 #define omap2_aes_resources_sz 0
489 #ifdef CONFIG_ARCH_OMAP3
490 static struct resource omap3_aes_resources[] = {
492 .start = OMAP34XX_SEC_AES_BASE,
493 .end = OMAP34XX_SEC_AES_BASE + 0x4C,
494 .flags = IORESOURCE_MEM,
497 .start = OMAP34XX_DMA_AES2_TX,
498 .flags = IORESOURCE_DMA,
501 .start = OMAP34XX_DMA_AES2_RX,
502 .flags = IORESOURCE_DMA,
505 static int omap3_aes_resources_sz = ARRAY_SIZE(omap3_aes_resources);
507 #define omap3_aes_resources NULL
508 #define omap3_aes_resources_sz 0
511 static struct platform_device aes_device = {
516 static void omap_init_aes(void)
518 if (cpu_is_omap24xx()) {
519 aes_device.resource = omap2_aes_resources;
520 aes_device.num_resources = omap2_aes_resources_sz;
521 } else if (cpu_is_omap34xx()) {
522 aes_device.resource = omap3_aes_resources;
523 aes_device.num_resources = omap3_aes_resources_sz;
525 pr_err("%s: platform not supported\n", __func__);
528 platform_device_register(&aes_device);
532 static inline void omap_init_aes(void) { }
535 /*-------------------------------------------------------------------------*/
537 #if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE)
539 static inline void omap242x_mmc_mux(struct omap_mmc_platform_data
542 if ((mmc_controller->slots[0].switch_pin > 0) && \
543 (mmc_controller->slots[0].switch_pin < OMAP_MAX_GPIO_LINES))
544 omap_mux_init_gpio(mmc_controller->slots[0].switch_pin,
545 OMAP_PIN_INPUT_PULLUP);
546 if ((mmc_controller->slots[0].gpio_wp > 0) && \
547 (mmc_controller->slots[0].gpio_wp < OMAP_MAX_GPIO_LINES))
548 omap_mux_init_gpio(mmc_controller->slots[0].gpio_wp,
549 OMAP_PIN_INPUT_PULLUP);
551 omap_mux_init_signal("sdmmc_cmd", 0);
552 omap_mux_init_signal("sdmmc_clki", 0);
553 omap_mux_init_signal("sdmmc_clko", 0);
554 omap_mux_init_signal("sdmmc_dat0", 0);
555 omap_mux_init_signal("sdmmc_dat_dir0", 0);
556 omap_mux_init_signal("sdmmc_cmd_dir", 0);
557 if (mmc_controller->slots[0].caps & MMC_CAP_4_BIT_DATA) {
558 omap_mux_init_signal("sdmmc_dat1", 0);
559 omap_mux_init_signal("sdmmc_dat2", 0);
560 omap_mux_init_signal("sdmmc_dat3", 0);
561 omap_mux_init_signal("sdmmc_dat_dir1", 0);
562 omap_mux_init_signal("sdmmc_dat_dir2", 0);
563 omap_mux_init_signal("sdmmc_dat_dir3", 0);
567 * Use internal loop-back in MMC/SDIO Module Input Clock
570 if (mmc_controller->slots[0].internal_clock) {
571 u32 v = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);
573 omap_ctrl_writel(v, OMAP2_CONTROL_DEVCONF0);
577 void __init omap242x_init_mmc(struct omap_mmc_platform_data **mmc_data)
579 char *name = "mmci-omap";
582 pr_err("%s fails: Incomplete platform data\n", __func__);
586 omap242x_mmc_mux(mmc_data[0]);
587 omap_mmc_add(name, 0, OMAP2_MMC1_BASE, OMAP2420_MMC_SIZE,
588 INT_24XX_MMC_IRQ, mmc_data[0]);
593 /*-------------------------------------------------------------------------*/
595 #if defined(CONFIG_HDQ_MASTER_OMAP) || defined(CONFIG_HDQ_MASTER_OMAP_MODULE)
596 #if defined(CONFIG_SOC_OMAP2430) || defined(CONFIG_SOC_OMAP3430)
597 #define OMAP_HDQ_BASE 0x480B2000
599 static struct resource omap_hdq_resources[] = {
601 .start = OMAP_HDQ_BASE,
602 .end = OMAP_HDQ_BASE + 0x1C,
603 .flags = IORESOURCE_MEM,
606 .start = INT_24XX_HDQ_IRQ,
607 .flags = IORESOURCE_IRQ,
610 static struct platform_device omap_hdq_dev = {
614 .platform_data = NULL,
616 .num_resources = ARRAY_SIZE(omap_hdq_resources),
617 .resource = omap_hdq_resources,
619 static inline void omap_hdq_init(void)
621 (void) platform_device_register(&omap_hdq_dev);
624 static inline void omap_hdq_init(void) {}
627 /*---------------------------------------------------------------------------*/
629 #if defined(CONFIG_VIDEO_OMAP2_VOUT) || \
630 defined(CONFIG_VIDEO_OMAP2_VOUT_MODULE)
631 #if defined(CONFIG_FB_OMAP2) || defined(CONFIG_FB_OMAP2_MODULE)
632 static struct resource omap_vout_resource[3 - CONFIG_FB_OMAP2_NUM_FBS] = {
635 static struct resource omap_vout_resource[2] = {
639 static struct platform_device omap_vout_device = {
641 .num_resources = ARRAY_SIZE(omap_vout_resource),
642 .resource = &omap_vout_resource[0],
645 static void omap_init_vout(void)
647 if (platform_device_register(&omap_vout_device) < 0)
648 printk(KERN_ERR "Unable to register OMAP-VOUT device\n");
651 static inline void omap_init_vout(void) {}
654 /*-------------------------------------------------------------------------*/
656 static int __init omap2_init_devices(void)
659 * please keep these calls, and their implementations above,
660 * in alphabetical order so they're easier to sort through.
675 arch_initcall(omap2_init_devices);
677 #if defined(CONFIG_OMAP_WATCHDOG) || defined(CONFIG_OMAP_WATCHDOG_MODULE)
678 static int __init omap_init_wdt(void)
681 struct platform_device *pdev;
682 struct omap_hwmod *oh;
683 char *oh_name = "wd_timer2";
684 char *dev_name = "omap_wdt";
686 if (!cpu_class_is_omap2())
689 oh = omap_hwmod_lookup(oh_name);
691 pr_err("Could not look up wd_timer%d hwmod\n", id);
695 pdev = omap_device_build(dev_name, id, oh, NULL, 0, NULL, 0, 0);
696 WARN(IS_ERR(pdev), "Can't build omap_device for %s:%s.\n",
700 subsys_initcall(omap_init_wdt);