Blame view

arch/arm/mach-omap1/devices.c 8.08 KB
7c38cf021   Tony Lindgren   [ARM] 2890/1: OMA...
1
2
3
4
5
6
7
8
9
10
  /*
   * linux/arch/arm/mach-omap1/devices.c
   *
   * OMAP1 platform device setup/initialization
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation; either version 2 of the License, or
   * (at your option) any later version.
   */
1a96edd70   Janusz Krzysztofik   OMAP1: Add suppor...
11
  #include <linux/dma-mapping.h>
2f8163baa   Russell King   ARM: gpio: conver...
12
  #include <linux/gpio.h>
7c38cf021   Tony Lindgren   [ARM] 2890/1: OMA...
13
14
15
  #include <linux/module.h>
  #include <linux/kernel.h>
  #include <linux/init.h>
d052d1bef   Russell King   Create platform_d...
16
  #include <linux/platform_device.h>
fced80c73   Russell King   [ARM] Convert asm...
17
  #include <linux/io.h>
c5c4dce45   Cory Maccarrone   omap1: Add 7xx cl...
18
  #include <linux/spi/spi.h>
7c38cf021   Tony Lindgren   [ARM] 2890/1: OMA...
19

706afddaf   Aaro Koskinen   arm: omap1: add m...
20
  #include <mach/camera.h>
a09e64fbc   Russell King   [ARM] Move includ...
21
  #include <mach/hardware.h>
7c38cf021   Tony Lindgren   [ARM] 2890/1: OMA...
22
  #include <asm/mach/map.h>
4e65331c6   Tony Lindgren   ARM: 7159/1: OMAP...
23
  #include "common.h"
ce491cf85   Tony Lindgren   omap: headers: Mo...
24
25
26
  #include <plat/tc.h>
  #include <plat/board.h>
  #include <plat/mux.h>
ce491cf85   Tony Lindgren   omap: headers: Mo...
27
  #include <plat/mmc.h>
c5c4dce45   Cory Maccarrone   omap1: Add 7xx cl...
28
  #include <plat/omap7xx.h>
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
29
  #include <plat/mcbsp.h>
7c38cf021   Tony Lindgren   [ARM] 2890/1: OMA...
30

e9b7086b8   Tony Lindgren   ARM: OMAP: Fix re...
31
  #include "clock.h"
7c38cf021   Tony Lindgren   [ARM] 2890/1: OMA...
32
  /*-------------------------------------------------------------------------*/
db68b189f   David Brownell   [PATCH] add rtc-o...
33
  #if defined(CONFIG_RTC_DRV_OMAP) || defined(CONFIG_RTC_DRV_OMAP_MODULE)
7c38cf021   Tony Lindgren   [ARM] 2890/1: OMA...
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
  
  #define	OMAP_RTC_BASE		0xfffb4800
  
  static struct resource rtc_resources[] = {
  	{
  		.start		= OMAP_RTC_BASE,
  		.end		= OMAP_RTC_BASE + 0x5f,
  		.flags		= IORESOURCE_MEM,
  	},
  	{
  		.start		= INT_RTC_TIMER,
  		.flags		= IORESOURCE_IRQ,
  	},
  	{
  		.start		= INT_RTC_ALARM,
  		.flags		= IORESOURCE_IRQ,
  	},
  };
  
  static struct platform_device omap_rtc_device = {
  	.name           = "omap_rtc",
  	.id             = -1,
7c38cf021   Tony Lindgren   [ARM] 2890/1: OMA...
56
57
58
59
60
61
62
63
64
65
66
  	.num_resources	= ARRAY_SIZE(rtc_resources),
  	.resource	= rtc_resources,
  };
  
  static void omap_init_rtc(void)
  {
  	(void) platform_device_register(&omap_rtc_device);
  }
  #else
  static inline void omap_init_rtc(void) {}
  #endif
c40fae952   Tony Lindgren   ARM: OMAP: Sync c...
67
  static inline void omap_init_mbox(void) { }
c40fae952   Tony Lindgren   ARM: OMAP: Sync c...
68

d88746652   Tony Lindgren   omap mmc: Add bet...
69
70
71
72
73
74
75
76
  /*-------------------------------------------------------------------------*/
  
  #if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE)
  
  static inline void omap1_mmc_mux(struct omap_mmc_platform_data *mmc_controller,
  			int controller_nr)
  {
  	if (controller_nr == 0) {
490a56652   Cory Maccarrone   omap1: mmc: Add p...
77
78
79
80
81
82
83
84
85
  		if (cpu_is_omap7xx()) {
  			omap_cfg_reg(MMC_7XX_CMD);
  			omap_cfg_reg(MMC_7XX_CLK);
  			omap_cfg_reg(MMC_7XX_DAT0);
  		} else {
  			omap_cfg_reg(MMC_CMD);
  			omap_cfg_reg(MMC_CLK);
  			omap_cfg_reg(MMC_DAT0);
  		}
d88746652   Tony Lindgren   omap mmc: Add bet...
86
87
88
89
90
  		if (cpu_is_omap1710()) {
  			omap_cfg_reg(M15_1710_MMC_CLKI);
  			omap_cfg_reg(P19_1710_MMC_CMDDIR);
  			omap_cfg_reg(P20_1710_MMC_DATDIR0);
  		}
490a56652   Cory Maccarrone   omap1: mmc: Add p...
91
  		if (mmc_controller->slots[0].wires == 4 && !cpu_is_omap7xx()) {
d88746652   Tony Lindgren   omap mmc: Add bet...
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
  			omap_cfg_reg(MMC_DAT1);
  			/* NOTE: DAT2 can be on W10 (here) or M15 */
  			if (!mmc_controller->slots[0].nomux)
  				omap_cfg_reg(MMC_DAT2);
  			omap_cfg_reg(MMC_DAT3);
  		}
  	}
  
  	/* Block 2 is on newer chips, and has many pinout options */
  	if (cpu_is_omap16xx() && controller_nr == 1) {
  		if (!mmc_controller->slots[1].nomux) {
  			omap_cfg_reg(Y8_1610_MMC2_CMD);
  			omap_cfg_reg(Y10_1610_MMC2_CLK);
  			omap_cfg_reg(R18_1610_MMC2_CLKIN);
  			omap_cfg_reg(W8_1610_MMC2_DAT0);
90c62bf08   Tony Lindgren   omap mmc: Add low...
107
  			if (mmc_controller->slots[1].wires == 4) {
d88746652   Tony Lindgren   omap mmc: Add bet...
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
  				omap_cfg_reg(V8_1610_MMC2_DAT1);
  				omap_cfg_reg(W15_1610_MMC2_DAT2);
  				omap_cfg_reg(R10_1610_MMC2_DAT3);
  			}
  
  			/* These are needed for the level shifter */
  			omap_cfg_reg(V9_1610_MMC2_CMDDIR);
  			omap_cfg_reg(V5_1610_MMC2_DATDIR0);
  			omap_cfg_reg(W19_1610_MMC2_DATDIR1);
  		}
  
  		/* Feedback clock must be set on OMAP-1710 MMC2 */
  		if (cpu_is_omap1710())
  			omap_writel(omap_readl(MOD_CONF_CTRL_1) | (1 << 24),
  					MOD_CONF_CTRL_1);
  	}
  }
  
  void __init omap1_init_mmc(struct omap_mmc_platform_data **mmc_data,
  			int nr_controllers)
  {
  	int i;
  
  	for (i = 0; i < nr_controllers; i++) {
  		unsigned long base, size;
  		unsigned int irq = 0;
  
  		if (!mmc_data[i])
  			continue;
  
  		omap1_mmc_mux(mmc_data[i], i);
  
  		switch (i) {
  		case 0:
  			base = OMAP1_MMC1_BASE;
  			irq = INT_MMC;
  			break;
  		case 1:
  			if (!cpu_is_omap16xx())
  				return;
  			base = OMAP1_MMC2_BASE;
  			irq = INT_1610_MMC2;
  			break;
  		default:
  			continue;
  		}
  		size = OMAP1_MMC_SIZE;
0dffb5c57   Tony Lindgren   ARM: OMAP: Fix hs...
155
  		omap_mmc_add("mmci-omap", i, base, size, irq, mmc_data[i]);
d88746652   Tony Lindgren   omap mmc: Add bet...
156
157
158
159
160
161
  	};
  }
  
  #endif
  
  /*-------------------------------------------------------------------------*/
c5c4dce45   Cory Maccarrone   omap1: Add 7xx cl...
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
  /* OMAP7xx SPI support */
  #if defined(CONFIG_SPI_OMAP_100K) || defined(CONFIG_SPI_OMAP_100K_MODULE)
  
  struct platform_device omap_spi1 = {
  	.name           = "omap1_spi100k",
  	.id             = 1,
  };
  
  struct platform_device omap_spi2 = {
  	.name           = "omap1_spi100k",
  	.id             = 2,
  };
  
  static void omap_init_spi100k(void)
  {
  	omap_spi1.dev.platform_data = ioremap(OMAP7XX_SPI1_BASE, 0x7ff);
  	if (omap_spi1.dev.platform_data)
  		platform_device_register(&omap_spi1);
  
  	omap_spi2.dev.platform_data = ioremap(OMAP7XX_SPI2_BASE, 0x7ff);
  	if (omap_spi2.dev.platform_data)
  		platform_device_register(&omap_spi2);
  }
  
  #else
  static inline void omap_init_spi100k(void)
  {
  }
  #endif
1a96edd70   Janusz Krzysztofik   OMAP1: Add suppor...
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
  
  #define OMAP1_CAMERA_BASE	0xfffb6800
  #define OMAP1_CAMERA_IOSIZE	0x1c
  
  static struct resource omap1_camera_resources[] = {
  	[0] = {
  		.start	= OMAP1_CAMERA_BASE,
  		.end	= OMAP1_CAMERA_BASE + OMAP1_CAMERA_IOSIZE - 1,
  		.flags	= IORESOURCE_MEM,
  	},
  	[1] = {
  		.start	= INT_CAMERA,
  		.flags	= IORESOURCE_IRQ,
  	},
  };
  
  static u64 omap1_camera_dma_mask = DMA_BIT_MASK(32);
  
  static struct platform_device omap1_camera_device = {
  	.name		= "omap1-camera",
  	.id		= 0, /* This is used to put cameras on this interface */
  	.dev		= {
  		.dma_mask		= &omap1_camera_dma_mask,
  		.coherent_dma_mask	= DMA_BIT_MASK(32),
  	},
  	.num_resources	= ARRAY_SIZE(omap1_camera_resources),
  	.resource	= omap1_camera_resources,
  };
  
  void __init omap1_camera_init(void *info)
  {
  	struct platform_device *dev = &omap1_camera_device;
  	int ret;
  
  	dev->dev.platform_data = info;
  
  	ret = platform_device_register(dev);
  	if (ret)
  		dev_err(&dev->dev, "unable to register device: %d
  ", ret);
  }
c5c4dce45   Cory Maccarrone   omap1: Add 7xx cl...
232
  /*-------------------------------------------------------------------------*/
9b6553cd0   Tony Lindgren   [ARM] 3433/1: ARM...
233
  static inline void omap_init_sti(void) {}
7c38cf021   Tony Lindgren   [ARM] 2890/1: OMA...
234

f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
  #if defined(CONFIG_SND_SOC) || defined(CONFIG_SND_SOC_MODULE)
  
  static struct platform_device omap_pcm = {
  	.name	= "omap-pcm-audio",
  	.id	= -1,
  };
  
  OMAP_MCBSP_PLATFORM_DEVICE(1);
  OMAP_MCBSP_PLATFORM_DEVICE(2);
  OMAP_MCBSP_PLATFORM_DEVICE(3);
  
  static void omap_init_audio(void)
  {
  	platform_device_register(&omap_mcbsp1);
  	platform_device_register(&omap_mcbsp2);
  	if (!cpu_is_omap7xx())
  		platform_device_register(&omap_mcbsp3);
  	platform_device_register(&omap_pcm);
  }
  
  #else
  static inline void omap_init_audio(void) {}
  #endif
7c38cf021   Tony Lindgren   [ARM] 2890/1: OMA...
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
  /*-------------------------------------------------------------------------*/
  
  /*
   * This gets called after board-specific INIT_MACHINE, and initializes most
   * on-chip peripherals accessible on this board (except for few like USB):
   *
   *  (a) Does any "standard config" pin muxing needed.  Board-specific
   *	code will have muxed GPIO pins and done "nonstandard" setup;
   *	that code could live in the boot loader.
   *  (b) Populating board-specific platform_data with the data drivers
   *	rely on to handle wiring variations.
   *  (c) Creating platform devices as meaningful on this board and
   *	with this kernel configuration.
   *
   * Claiming GPIOs, and setting their direction and initial values, is the
   * responsibility of the device drivers.  So is responding to probe().
   *
25985edce   Lucas De Marchi   Fix common misspe...
275
   * Board-specific knowledge like creating devices or pin setup is to be
7c38cf021   Tony Lindgren   [ARM] 2890/1: OMA...
276
277
278
279
   * kept out of drivers as much as possible.  In particular, pin setup
   * may be handled by the boot loader, and drivers should expect it will
   * normally have been done by the time they're probed.
   */
3179a0193   Tony Lindgren   [ARM] 3141/1: OMA...
280
  static int __init omap1_init_devices(void)
7c38cf021   Tony Lindgren   [ARM] 2890/1: OMA...
281
  {
7f9187c26   Tony Lindgren   omap1: Add initca...
282
283
  	if (!cpu_class_is_omap1())
  		return -ENODEV;
a66cb3454   Tony Lindgren   ARM: OMAP: Map SR...
284
  	omap_sram_init();
e9b7086b8   Tony Lindgren   ARM: OMAP: Fix re...
285
  	omap1_clk_late_init();
a66cb3454   Tony Lindgren   ARM: OMAP: Map SR...
286

7c38cf021   Tony Lindgren   [ARM] 2890/1: OMA...
287
288
289
  	/* please keep these calls, and their implementations above,
  	 * in alphabetical order so they're easier to sort through.
  	 */
c40fae952   Tony Lindgren   ARM: OMAP: Sync c...
290
291
  
  	omap_init_mbox();
7c38cf021   Tony Lindgren   [ARM] 2890/1: OMA...
292
  	omap_init_rtc();
c5c4dce45   Cory Maccarrone   omap1: Add 7xx cl...
293
  	omap_init_spi100k();
9b6553cd0   Tony Lindgren   [ARM] 3433/1: ARM...
294
  	omap_init_sti();
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
295
  	omap_init_audio();
7c38cf021   Tony Lindgren   [ARM] 2890/1: OMA...
296
297
298
  
  	return 0;
  }
3179a0193   Tony Lindgren   [ARM] 3141/1: OMA...
299
  arch_initcall(omap1_init_devices);
7c38cf021   Tony Lindgren   [ARM] 2890/1: OMA...
300

f2ce62312   Varadarajan, Charulatha   OMAP: WDT: Split ...
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
  #if defined(CONFIG_OMAP_WATCHDOG) || defined(CONFIG_OMAP_WATCHDOG_MODULE)
  
  static struct resource wdt_resources[] = {
  	{
  		.start		= 0xfffeb000,
  		.end		= 0xfffeb07F,
  		.flags		= IORESOURCE_MEM,
  	},
  };
  
  static struct platform_device omap_wdt_device = {
  	.name	   = "omap_wdt",
  	.id	     = -1,
  	.num_resources	= ARRAY_SIZE(wdt_resources),
  	.resource	= wdt_resources,
  };
  
  static int __init omap_init_wdt(void)
  {
  	if (!cpu_is_omap16xx())
dfcccd3aa   Felipe Balbi   arm: omap1: devic...
321
  		return -ENODEV;
f2ce62312   Varadarajan, Charulatha   OMAP: WDT: Split ...
322

dfcccd3aa   Felipe Balbi   arm: omap1: devic...
323
  	return platform_device_register(&omap_wdt_device);
f2ce62312   Varadarajan, Charulatha   OMAP: WDT: Split ...
324
325
326
  }
  subsys_initcall(omap_init_wdt);
  #endif