• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
omap_init_rtc(void)56 static void omap_init_rtc(void)
57 {
58 	(void) platform_device_register(&omap_rtc_device);
59 }
60 #else
omap_init_rtc(void)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		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		= "mailbox",
90 	.id		= -1,
91 	.num_resources	= ARRAY_SIZE(mbox_resources),
92 	.resource	= mbox_resources,
93 };
94 
omap_init_mbox(void)95 static inline void omap_init_mbox(void)
96 {
97 	platform_device_register(&mbox_device);
98 }
99 #else
omap_init_mbox(void)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 
omap1_mmc_mux(struct omap_mmc_platform_data * mmc_controller,int controller_nr)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 
omap1_init_mmc(struct omap_mmc_platform_data ** mmc_data,int nr_controllers)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 
omap_init_sti(void)221 static inline void omap_init_sti(void)
222 {
223 	platform_device_register(&sti_device);
224 }
225 #else
omap_init_sti(void)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  */
omap1_init_devices(void)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