1 /* 2 * linux/arch/arm/mach-omap1/devices.c 3 * 4 * OMAP1 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/map.h> 20 21 #include <mach/tc.h> 22 #include <mach/board.h> 23 #include <mach/mux.h> 24 #include <mach/gpio.h> 25 #include <mach/mmc.h> 26 27 /*-------------------------------------------------------------------------*/ 28 29 #if defined(CONFIG_RTC_DRV_OMAP) || defined(CONFIG_RTC_DRV_OMAP_MODULE) 30 31 #define OMAP_RTC_BASE 0xfffb4800 32 33 static struct resource rtc_resources[] = { 34 { 35 .start = OMAP_RTC_BASE, 36 .end = OMAP_RTC_BASE + 0x5f, 37 .flags = IORESOURCE_MEM, 38 }, 39 { 40 .start = INT_RTC_TIMER, 41 .flags = IORESOURCE_IRQ, 42 }, 43 { 44 .start = INT_RTC_ALARM, 45 .flags = IORESOURCE_IRQ, 46 }, 47 }; 48 49 static struct platform_device omap_rtc_device = { 50 .name = "omap_rtc", 51 .id = -1, 52 .num_resources = ARRAY_SIZE(rtc_resources), 53 .resource = rtc_resources, 54 }; 55 56 static void omap_init_rtc(void) 57 { 58 (void) platform_device_register(&omap_rtc_device); 59 } 60 #else 61 static inline void omap_init_rtc(void) {} 62 #endif 63 64 #if defined(CONFIG_OMAP_DSP) || defined(CONFIG_OMAP_DSP_MODULE) 65 66 #if defined(CONFIG_ARCH_OMAP15XX) 67 # define OMAP1_MBOX_SIZE 0x23 68 # define INT_DSP_MAILBOX1 INT_1510_DSP_MAILBOX1 69 #elif defined(CONFIG_ARCH_OMAP16XX) 70 # define OMAP1_MBOX_SIZE 0x2f 71 # define INT_DSP_MAILBOX1 INT_1610_DSP_MAILBOX1 72 #endif 73 74 #define OMAP1_MBOX_BASE OMAP1_IO_ADDRESS(OMAP16XX_MAILBOX_BASE) 75 76 static struct resource mbox_resources[] = { 77 { 78 .start = OMAP1_MBOX_BASE, 79 .end = OMAP1_MBOX_BASE + OMAP1_MBOX_SIZE, 80 .flags = IORESOURCE_MEM, 81 }, 82 { 83 .start = INT_DSP_MAILBOX1, 84 .flags = IORESOURCE_IRQ, 85 }, 86 }; 87 88 static struct platform_device mbox_device = { 89 .name = "omap1-mailbox", 90 .id = -1, 91 .num_resources = ARRAY_SIZE(mbox_resources), 92 .resource = mbox_resources, 93 }; 94 95 static inline void omap_init_mbox(void) 96 { 97 platform_device_register(&mbox_device); 98 } 99 #else 100 static inline void omap_init_mbox(void) { } 101 #endif 102 103 /*-------------------------------------------------------------------------*/ 104 105 #if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) 106 107 static inline void omap1_mmc_mux(struct omap_mmc_platform_data *mmc_controller, 108 int controller_nr) 109 { 110 if (controller_nr == 0) { 111 omap_cfg_reg(MMC_CMD); 112 omap_cfg_reg(MMC_CLK); 113 omap_cfg_reg(MMC_DAT0); 114 if (cpu_is_omap1710()) { 115 omap_cfg_reg(M15_1710_MMC_CLKI); 116 omap_cfg_reg(P19_1710_MMC_CMDDIR); 117 omap_cfg_reg(P20_1710_MMC_DATDIR0); 118 } 119 if (mmc_controller->slots[0].wires == 4) { 120 omap_cfg_reg(MMC_DAT1); 121 /* NOTE: DAT2 can be on W10 (here) or M15 */ 122 if (!mmc_controller->slots[0].nomux) 123 omap_cfg_reg(MMC_DAT2); 124 omap_cfg_reg(MMC_DAT3); 125 } 126 } 127 128 /* Block 2 is on newer chips, and has many pinout options */ 129 if (cpu_is_omap16xx() && controller_nr == 1) { 130 if (!mmc_controller->slots[1].nomux) { 131 omap_cfg_reg(Y8_1610_MMC2_CMD); 132 omap_cfg_reg(Y10_1610_MMC2_CLK); 133 omap_cfg_reg(R18_1610_MMC2_CLKIN); 134 omap_cfg_reg(W8_1610_MMC2_DAT0); 135 if (mmc_controller->slots[1].wires == 4) { 136 omap_cfg_reg(V8_1610_MMC2_DAT1); 137 omap_cfg_reg(W15_1610_MMC2_DAT2); 138 omap_cfg_reg(R10_1610_MMC2_DAT3); 139 } 140 141 /* These are needed for the level shifter */ 142 omap_cfg_reg(V9_1610_MMC2_CMDDIR); 143 omap_cfg_reg(V5_1610_MMC2_DATDIR0); 144 omap_cfg_reg(W19_1610_MMC2_DATDIR1); 145 } 146 147 /* Feedback clock must be set on OMAP-1710 MMC2 */ 148 if (cpu_is_omap1710()) 149 omap_writel(omap_readl(MOD_CONF_CTRL_1) | (1 << 24), 150 MOD_CONF_CTRL_1); 151 } 152 } 153 154 void __init omap1_init_mmc(struct omap_mmc_platform_data **mmc_data, 155 int nr_controllers) 156 { 157 int i; 158 159 for (i = 0; i < nr_controllers; i++) { 160 unsigned long base, size; 161 unsigned int irq = 0; 162 163 if (!mmc_data[i]) 164 continue; 165 166 omap1_mmc_mux(mmc_data[i], i); 167 168 switch (i) { 169 case 0: 170 base = OMAP1_MMC1_BASE; 171 irq = INT_MMC; 172 break; 173 case 1: 174 if (!cpu_is_omap16xx()) 175 return; 176 base = OMAP1_MMC2_BASE; 177 irq = INT_1610_MMC2; 178 break; 179 default: 180 continue; 181 } 182 size = OMAP1_MMC_SIZE; 183 184 omap_mmc_add("mmci-omap", i, base, size, irq, mmc_data[i]); 185 }; 186 } 187 188 #endif 189 190 /*-------------------------------------------------------------------------*/ 191 192 #if defined(CONFIG_OMAP_STI) 193 194 #define OMAP1_STI_BASE 0xfffea000 195 #define OMAP1_STI_CHANNEL_BASE (OMAP1_STI_BASE + 0x400) 196 197 static struct resource sti_resources[] = { 198 { 199 .start = OMAP1_STI_BASE, 200 .end = OMAP1_STI_BASE + SZ_1K - 1, 201 .flags = IORESOURCE_MEM, 202 }, 203 { 204 .start = OMAP1_STI_CHANNEL_BASE, 205 .end = OMAP1_STI_CHANNEL_BASE + SZ_1K - 1, 206 .flags = IORESOURCE_MEM, 207 }, 208 { 209 .start = INT_1610_STI, 210 .flags = IORESOURCE_IRQ, 211 } 212 }; 213 214 static struct platform_device sti_device = { 215 .name = "sti", 216 .id = -1, 217 .num_resources = ARRAY_SIZE(sti_resources), 218 .resource = sti_resources, 219 }; 220 221 static inline void omap_init_sti(void) 222 { 223 platform_device_register(&sti_device); 224 } 225 #else 226 static inline void omap_init_sti(void) {} 227 #endif 228 229 /*-------------------------------------------------------------------------*/ 230 231 /* 232 * This gets called after board-specific INIT_MACHINE, and initializes most 233 * on-chip peripherals accessible on this board (except for few like USB): 234 * 235 * (a) Does any "standard config" pin muxing needed. Board-specific 236 * code will have muxed GPIO pins and done "nonstandard" setup; 237 * that code could live in the boot loader. 238 * (b) Populating board-specific platform_data with the data drivers 239 * rely on to handle wiring variations. 240 * (c) Creating platform devices as meaningful on this board and 241 * with this kernel configuration. 242 * 243 * Claiming GPIOs, and setting their direction and initial values, is the 244 * responsibility of the device drivers. So is responding to probe(). 245 * 246 * Board-specific knowlege like creating devices or pin setup is to be 247 * kept out of drivers as much as possible. In particular, pin setup 248 * may be handled by the boot loader, and drivers should expect it will 249 * normally have been done by the time they're probed. 250 */ 251 static int __init omap1_init_devices(void) 252 { 253 /* please keep these calls, and their implementations above, 254 * in alphabetical order so they're easier to sort through. 255 */ 256 257 omap_init_mbox(); 258 omap_init_rtc(); 259 omap_init_sti(); 260 261 return 0; 262 } 263 arch_initcall(omap1_init_devices); 264 265