1 /* 2 * linux/arch/arm/mach-omap2/devices.c 3 * 4 * OMAP2 platform device setup/initialization 5 * 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. 10 */ 11 12 #include <linux/module.h> 13 #include <linux/kernel.h> 14 #include <linux/init.h> 15 #include <linux/platform_device.h> 16 #include <linux/io.h> 17 18 #include <mach/hardware.h> 19 #include <asm/mach-types.h> 20 #include <asm/mach/map.h> 21 22 #include <mach/tc.h> 23 #include <mach/board.h> 24 #include <mach/mux.h> 25 #include <mach/gpio.h> 26 #include <mach/eac.h> 27 28 #if defined(CONFIG_OMAP_DSP) || defined(CONFIG_OMAP_DSP_MODULE) 29 #define OMAP2_MBOX_BASE IO_ADDRESS(OMAP24XX_MAILBOX_BASE) 30 31 static struct resource mbox_resources[] = { 32 { 33 .start = OMAP2_MBOX_BASE, 34 .end = OMAP2_MBOX_BASE + 0x11f, 35 .flags = IORESOURCE_MEM, 36 }, 37 { 38 .start = INT_24XX_MAIL_U0_MPU, 39 .flags = IORESOURCE_IRQ, 40 }, 41 { 42 .start = INT_24XX_MAIL_U3_MPU, 43 .flags = IORESOURCE_IRQ, 44 }, 45 }; 46 47 static struct platform_device mbox_device = { 48 .name = "mailbox", 49 .id = -1, 50 .num_resources = ARRAY_SIZE(mbox_resources), 51 .resource = mbox_resources, 52 }; 53 54 static inline void omap_init_mbox(void) 55 { 56 platform_device_register(&mbox_device); 57 } 58 #else 59 static inline void omap_init_mbox(void) { } 60 #endif 61 62 #if defined(CONFIG_OMAP_STI) 63 64 #if defined(CONFIG_ARCH_OMAP2) 65 66 #define OMAP2_STI_BASE 0x48068000 67 #define OMAP2_STI_CHANNEL_BASE 0x54000000 68 #define OMAP2_STI_IRQ 4 69 70 static struct resource sti_resources[] = { 71 { 72 .start = OMAP2_STI_BASE, 73 .end = OMAP2_STI_BASE + 0x7ff, 74 .flags = IORESOURCE_MEM, 75 }, 76 { 77 .start = OMAP2_STI_CHANNEL_BASE, 78 .end = OMAP2_STI_CHANNEL_BASE + SZ_64K - 1, 79 .flags = IORESOURCE_MEM, 80 }, 81 { 82 .start = OMAP2_STI_IRQ, 83 .flags = IORESOURCE_IRQ, 84 } 85 }; 86 #elif defined(CONFIG_ARCH_OMAP3) 87 88 #define OMAP3_SDTI_BASE 0x54500000 89 #define OMAP3_SDTI_CHANNEL_BASE 0x54600000 90 91 static struct resource sti_resources[] = { 92 { 93 .start = OMAP3_SDTI_BASE, 94 .end = OMAP3_SDTI_BASE + 0xFFF, 95 .flags = IORESOURCE_MEM, 96 }, 97 { 98 .start = OMAP3_SDTI_CHANNEL_BASE, 99 .end = OMAP3_SDTI_CHANNEL_BASE + SZ_1M - 1, 100 .flags = IORESOURCE_MEM, 101 } 102 }; 103 104 #endif 105 106 static struct platform_device sti_device = { 107 .name = "sti", 108 .id = -1, 109 .num_resources = ARRAY_SIZE(sti_resources), 110 .resource = sti_resources, 111 }; 112 113 static inline void omap_init_sti(void) 114 { 115 platform_device_register(&sti_device); 116 } 117 #else 118 static inline void omap_init_sti(void) {} 119 #endif 120 121 #if defined(CONFIG_SPI_OMAP24XX) || defined(CONFIG_SPI_OMAP24XX_MODULE) 122 123 #include <mach/mcspi.h> 124 125 #define OMAP2_MCSPI1_BASE 0x48098000 126 #define OMAP2_MCSPI2_BASE 0x4809a000 127 #define OMAP2_MCSPI3_BASE 0x480b8000 128 #define OMAP2_MCSPI4_BASE 0x480ba000 129 130 static struct omap2_mcspi_platform_config omap2_mcspi1_config = { 131 .num_cs = 4, 132 }; 133 134 static struct resource omap2_mcspi1_resources[] = { 135 { 136 .start = OMAP2_MCSPI1_BASE, 137 .end = OMAP2_MCSPI1_BASE + 0xff, 138 .flags = IORESOURCE_MEM, 139 }, 140 }; 141 142 static struct platform_device omap2_mcspi1 = { 143 .name = "omap2_mcspi", 144 .id = 1, 145 .num_resources = ARRAY_SIZE(omap2_mcspi1_resources), 146 .resource = omap2_mcspi1_resources, 147 .dev = { 148 .platform_data = &omap2_mcspi1_config, 149 }, 150 }; 151 152 static struct omap2_mcspi_platform_config omap2_mcspi2_config = { 153 .num_cs = 2, 154 }; 155 156 static struct resource omap2_mcspi2_resources[] = { 157 { 158 .start = OMAP2_MCSPI2_BASE, 159 .end = OMAP2_MCSPI2_BASE + 0xff, 160 .flags = IORESOURCE_MEM, 161 }, 162 }; 163 164 static struct platform_device omap2_mcspi2 = { 165 .name = "omap2_mcspi", 166 .id = 2, 167 .num_resources = ARRAY_SIZE(omap2_mcspi2_resources), 168 .resource = omap2_mcspi2_resources, 169 .dev = { 170 .platform_data = &omap2_mcspi2_config, 171 }, 172 }; 173 174 #if defined(CONFIG_ARCH_OMAP2430) || defined(CONFIG_ARCH_OMAP3) 175 static struct omap2_mcspi_platform_config omap2_mcspi3_config = { 176 .num_cs = 2, 177 }; 178 179 static struct resource omap2_mcspi3_resources[] = { 180 { 181 .start = OMAP2_MCSPI3_BASE, 182 .end = OMAP2_MCSPI3_BASE + 0xff, 183 .flags = IORESOURCE_MEM, 184 }, 185 }; 186 187 static struct platform_device omap2_mcspi3 = { 188 .name = "omap2_mcspi", 189 .id = 3, 190 .num_resources = ARRAY_SIZE(omap2_mcspi3_resources), 191 .resource = omap2_mcspi3_resources, 192 .dev = { 193 .platform_data = &omap2_mcspi3_config, 194 }, 195 }; 196 #endif 197 198 #ifdef CONFIG_ARCH_OMAP3 199 static struct omap2_mcspi_platform_config omap2_mcspi4_config = { 200 .num_cs = 1, 201 }; 202 203 static struct resource omap2_mcspi4_resources[] = { 204 { 205 .start = OMAP2_MCSPI4_BASE, 206 .end = OMAP2_MCSPI4_BASE + 0xff, 207 .flags = IORESOURCE_MEM, 208 }, 209 }; 210 211 static struct platform_device omap2_mcspi4 = { 212 .name = "omap2_mcspi", 213 .id = 4, 214 .num_resources = ARRAY_SIZE(omap2_mcspi4_resources), 215 .resource = omap2_mcspi4_resources, 216 .dev = { 217 .platform_data = &omap2_mcspi4_config, 218 }, 219 }; 220 #endif 221 222 static void omap_init_mcspi(void) 223 { 224 platform_device_register(&omap2_mcspi1); 225 platform_device_register(&omap2_mcspi2); 226 #if defined(CONFIG_ARCH_OMAP2430) || defined(CONFIG_ARCH_OMAP3) 227 platform_device_register(&omap2_mcspi3); 228 #endif 229 #ifdef CONFIG_ARCH_OMAP3 230 platform_device_register(&omap2_mcspi4); 231 #endif 232 } 233 234 #else 235 static inline void omap_init_mcspi(void) {} 236 #endif 237 238 #ifdef CONFIG_SND_OMAP24XX_EAC 239 240 #define OMAP2_EAC_BASE 0x48090000 241 242 static struct resource omap2_eac_resources[] = { 243 { 244 .start = OMAP2_EAC_BASE, 245 .end = OMAP2_EAC_BASE + 0x109, 246 .flags = IORESOURCE_MEM, 247 }, 248 }; 249 250 static struct platform_device omap2_eac_device = { 251 .name = "omap24xx-eac", 252 .id = -1, 253 .num_resources = ARRAY_SIZE(omap2_eac_resources), 254 .resource = omap2_eac_resources, 255 .dev = { 256 .platform_data = NULL, 257 }, 258 }; 259 260 void omap_init_eac(struct eac_platform_data *pdata) 261 { 262 omap2_eac_device.dev.platform_data = pdata; 263 platform_device_register(&omap2_eac_device); 264 } 265 266 #else 267 void omap_init_eac(struct eac_platform_data *pdata) {} 268 #endif 269 270 #ifdef CONFIG_OMAP_SHA1_MD5 271 static struct resource sha1_md5_resources[] = { 272 { 273 .start = OMAP24XX_SEC_SHA1MD5_BASE, 274 .end = OMAP24XX_SEC_SHA1MD5_BASE + 0x64, 275 .flags = IORESOURCE_MEM, 276 }, 277 { 278 .start = INT_24XX_SHA1MD5, 279 .flags = IORESOURCE_IRQ, 280 } 281 }; 282 283 static struct platform_device sha1_md5_device = { 284 .name = "OMAP SHA1/MD5", 285 .id = -1, 286 .num_resources = ARRAY_SIZE(sha1_md5_resources), 287 .resource = sha1_md5_resources, 288 }; 289 290 static void omap_init_sha1_md5(void) 291 { 292 platform_device_register(&sha1_md5_device); 293 } 294 #else 295 static inline void omap_init_sha1_md5(void) { } 296 #endif 297 298 #if defined(CONFIG_HDQ_MASTER_OMAP) || defined(CONFIG_HDQ_MASTER_OMAP_MODULE) 299 #if defined(CONFIG_ARCH_OMAP2430) || defined(CONFIG_ARCH_OMAP3430) 300 #define OMAP_HDQ_BASE 0x480B2000 301 #endif 302 static struct resource omap_hdq_resources[] = { 303 { 304 .start = OMAP_HDQ_BASE, 305 .end = OMAP_HDQ_BASE + 0x1C, 306 .flags = IORESOURCE_MEM, 307 }, 308 { 309 .start = INT_24XX_HDQ_IRQ, 310 .flags = IORESOURCE_IRQ, 311 }, 312 }; 313 static struct platform_device omap_hdq_dev = { 314 .name = "omap_hdq", 315 .id = 0, 316 .dev = { 317 .platform_data = NULL, 318 }, 319 .num_resources = ARRAY_SIZE(omap_hdq_resources), 320 .resource = omap_hdq_resources, 321 }; 322 static inline void omap_hdq_init(void) 323 { 324 (void) platform_device_register(&omap_hdq_dev); 325 } 326 #else 327 static inline void omap_hdq_init(void) {} 328 #endif 329 330 /*-------------------------------------------------------------------------*/ 331 332 static int __init omap2_init_devices(void) 333 { 334 /* please keep these calls, and their implementations above, 335 * in alphabetical order so they're easier to sort through. 336 */ 337 omap_init_mbox(); 338 omap_init_mcspi(); 339 omap_hdq_init(); 340 omap_init_sti(); 341 omap_init_sha1_md5(); 342 343 return 0; 344 } 345 arch_initcall(omap2_init_devices); 346