diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-03-17 22:08:06 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-03-17 22:08:06 -0400 |
commit | 411f5c7a502769ccc0377c5ba36cb0b283847ba8 (patch) | |
tree | 2c3a29671e3f923de48c55f94194849264a7bf53 /arch/arm/mach-mx3/mach-mx31_3ds.c | |
parent | 6d7ed21d17e640b120b902a314143e5ef4917a70 (diff) | |
parent | 9ced9f03d12d7539e86b0bff5bc750153c976c34 (diff) |
Merge branch 'devel-stable' of master.kernel.org:/home/rmk/linux-2.6-arm
* 'devel-stable' of master.kernel.org:/home/rmk/linux-2.6-arm: (289 commits)
davinci: DM644x EVM: register MUSB device earlier
davinci: add spi devices on tnetv107x evm
davinci: add ssp config for tnetv107x evm board
davinci: add tnetv107x ssp platform device
spi: add ti-ssp spi master driver
mfd: add driver for sequencer serial port
ARM: EXYNOS4: Implement Clock gating for System MMU
ARM: EXYNOS4: Enhancement of System MMU driver
ARM: EXYNOS4: Add support for gpio interrupts
ARM: S5P: Add function to register gpio interrupt bank data
ARM: S5P: Cleanup S5P gpio interrupt code
ARM: EXYNOS4: Add missing GPYx banks
ARM: S3C64XX: Fix section mismatch from cpufreq init
ARM: EXYNOS4: Add keypad device to the SMDKV310
ARM: EXYNOS4: Update clocks for keypad
ARM: EXYNOS4: Update keypad base address
ARM: EXYNOS4: Add keypad device helpers
ARM: EXYNOS4: Add support for SATA on ARMLEX4210
plat-nomadik: make GPIO interrupts work with cpuidle ApSleep
mach-u300: define a dummy filter function for coh901318
...
Fix up various conflicts in
- arch/arm/mach-exynos4/cpufreq.c
- arch/arm/mach-mxs/gpio.c
- drivers/net/Kconfig
- drivers/tty/serial/Kconfig
- drivers/tty/serial/Makefile
- drivers/usb/gadget/fsl_mxc_udc.c
- drivers/video/Kconfig
Diffstat (limited to 'arch/arm/mach-mx3/mach-mx31_3ds.c')
-rw-r--r-- | arch/arm/mach-mx3/mach-mx31_3ds.c | 462 |
1 files changed, 421 insertions, 41 deletions
diff --git a/arch/arm/mach-mx3/mach-mx31_3ds.c b/arch/arm/mach-mx3/mach-mx31_3ds.c index 0d65db885be7..544d3e414f58 100644 --- a/arch/arm/mach-mx3/mach-mx31_3ds.c +++ b/arch/arm/mach-mx3/mach-mx31_3ds.c | |||
@@ -21,9 +21,13 @@ | |||
21 | #include <linux/platform_device.h> | 21 | #include <linux/platform_device.h> |
22 | #include <linux/mfd/mc13783.h> | 22 | #include <linux/mfd/mc13783.h> |
23 | #include <linux/spi/spi.h> | 23 | #include <linux/spi/spi.h> |
24 | #include <linux/spi/l4f00242t03.h> | ||
24 | #include <linux/regulator/machine.h> | 25 | #include <linux/regulator/machine.h> |
25 | #include <linux/usb/otg.h> | 26 | #include <linux/usb/otg.h> |
26 | #include <linux/usb/ulpi.h> | 27 | #include <linux/usb/ulpi.h> |
28 | #include <linux/memblock.h> | ||
29 | |||
30 | #include <media/soc_camera.h> | ||
27 | 31 | ||
28 | #include <mach/hardware.h> | 32 | #include <mach/hardware.h> |
29 | #include <asm/mach-types.h> | 33 | #include <asm/mach-types.h> |
@@ -35,6 +39,10 @@ | |||
35 | #include <mach/iomux-mx3.h> | 39 | #include <mach/iomux-mx3.h> |
36 | #include <mach/3ds_debugboard.h> | 40 | #include <mach/3ds_debugboard.h> |
37 | #include <mach/ulpi.h> | 41 | #include <mach/ulpi.h> |
42 | #include <mach/mmc.h> | ||
43 | #include <mach/ipu.h> | ||
44 | #include <mach/mx3fb.h> | ||
45 | #include <mach/mx3_camera.h> | ||
38 | 46 | ||
39 | #include "devices-imx31.h" | 47 | #include "devices-imx31.h" |
40 | #include "devices.h" | 48 | #include "devices.h" |
@@ -42,10 +50,6 @@ | |||
42 | /* CPLD IRQ line for external uart, external ethernet etc */ | 50 | /* CPLD IRQ line for external uart, external ethernet etc */ |
43 | #define EXPIO_PARENT_INT IOMUX_TO_IRQ(MX31_PIN_GPIO1_1) | 51 | #define EXPIO_PARENT_INT IOMUX_TO_IRQ(MX31_PIN_GPIO1_1) |
44 | 52 | ||
45 | /* | ||
46 | * This file contains the board-specific initialization routines. | ||
47 | */ | ||
48 | |||
49 | static int mx31_3ds_pins[] = { | 53 | static int mx31_3ds_pins[] = { |
50 | /* UART1 */ | 54 | /* UART1 */ |
51 | MX31_PIN_CTS1__CTS1, | 55 | MX31_PIN_CTS1__CTS1, |
@@ -53,6 +57,12 @@ static int mx31_3ds_pins[] = { | |||
53 | MX31_PIN_TXD1__TXD1, | 57 | MX31_PIN_TXD1__TXD1, |
54 | MX31_PIN_RXD1__RXD1, | 58 | MX31_PIN_RXD1__RXD1, |
55 | IOMUX_MODE(MX31_PIN_GPIO1_1, IOMUX_CONFIG_GPIO), | 59 | IOMUX_MODE(MX31_PIN_GPIO1_1, IOMUX_CONFIG_GPIO), |
60 | /*SPI0*/ | ||
61 | MX31_PIN_CSPI1_SCLK__SCLK, | ||
62 | MX31_PIN_CSPI1_MOSI__MOSI, | ||
63 | MX31_PIN_CSPI1_MISO__MISO, | ||
64 | MX31_PIN_CSPI1_SPI_RDY__SPI_RDY, | ||
65 | MX31_PIN_CSPI1_SS2__SS2, /* CS for LCD */ | ||
56 | /* SPI 1 */ | 66 | /* SPI 1 */ |
57 | MX31_PIN_CSPI2_SCLK__SCLK, | 67 | MX31_PIN_CSPI2_SCLK__SCLK, |
58 | MX31_PIN_CSPI2_MOSI__MOSI, | 68 | MX31_PIN_CSPI2_MOSI__MOSI, |
@@ -100,6 +110,252 @@ static int mx31_3ds_pins[] = { | |||
100 | IOMUX_MODE(MX31_PIN_PC_RW_B, IOMUX_CONFIG_ALT1), | 110 | IOMUX_MODE(MX31_PIN_PC_RW_B, IOMUX_CONFIG_ALT1), |
101 | /* USB Host2 reset */ | 111 | /* USB Host2 reset */ |
102 | IOMUX_MODE(MX31_PIN_USB_BYP, IOMUX_CONFIG_GPIO), | 112 | IOMUX_MODE(MX31_PIN_USB_BYP, IOMUX_CONFIG_GPIO), |
113 | /* I2C1 */ | ||
114 | MX31_PIN_I2C_CLK__I2C1_SCL, | ||
115 | MX31_PIN_I2C_DAT__I2C1_SDA, | ||
116 | /* SDHC1 */ | ||
117 | MX31_PIN_SD1_DATA3__SD1_DATA3, | ||
118 | MX31_PIN_SD1_DATA2__SD1_DATA2, | ||
119 | MX31_PIN_SD1_DATA1__SD1_DATA1, | ||
120 | MX31_PIN_SD1_DATA0__SD1_DATA0, | ||
121 | MX31_PIN_SD1_CLK__SD1_CLK, | ||
122 | MX31_PIN_SD1_CMD__SD1_CMD, | ||
123 | MX31_PIN_GPIO3_1__GPIO3_1, /* Card detect */ | ||
124 | MX31_PIN_GPIO3_0__GPIO3_0, /* OE */ | ||
125 | /* Framebuffer */ | ||
126 | MX31_PIN_LD0__LD0, | ||
127 | MX31_PIN_LD1__LD1, | ||
128 | MX31_PIN_LD2__LD2, | ||
129 | MX31_PIN_LD3__LD3, | ||
130 | MX31_PIN_LD4__LD4, | ||
131 | MX31_PIN_LD5__LD5, | ||
132 | MX31_PIN_LD6__LD6, | ||
133 | MX31_PIN_LD7__LD7, | ||
134 | MX31_PIN_LD8__LD8, | ||
135 | MX31_PIN_LD9__LD9, | ||
136 | MX31_PIN_LD10__LD10, | ||
137 | MX31_PIN_LD11__LD11, | ||
138 | MX31_PIN_LD12__LD12, | ||
139 | MX31_PIN_LD13__LD13, | ||
140 | MX31_PIN_LD14__LD14, | ||
141 | MX31_PIN_LD15__LD15, | ||
142 | MX31_PIN_LD16__LD16, | ||
143 | MX31_PIN_LD17__LD17, | ||
144 | MX31_PIN_VSYNC3__VSYNC3, | ||
145 | MX31_PIN_HSYNC__HSYNC, | ||
146 | MX31_PIN_FPSHIFT__FPSHIFT, | ||
147 | MX31_PIN_CONTRAST__CONTRAST, | ||
148 | /* CSI */ | ||
149 | MX31_PIN_CSI_D6__CSI_D6, | ||
150 | MX31_PIN_CSI_D7__CSI_D7, | ||
151 | MX31_PIN_CSI_D8__CSI_D8, | ||
152 | MX31_PIN_CSI_D9__CSI_D9, | ||
153 | MX31_PIN_CSI_D10__CSI_D10, | ||
154 | MX31_PIN_CSI_D11__CSI_D11, | ||
155 | MX31_PIN_CSI_D12__CSI_D12, | ||
156 | MX31_PIN_CSI_D13__CSI_D13, | ||
157 | MX31_PIN_CSI_D14__CSI_D14, | ||
158 | MX31_PIN_CSI_D15__CSI_D15, | ||
159 | MX31_PIN_CSI_HSYNC__CSI_HSYNC, | ||
160 | MX31_PIN_CSI_MCLK__CSI_MCLK, | ||
161 | MX31_PIN_CSI_PIXCLK__CSI_PIXCLK, | ||
162 | MX31_PIN_CSI_VSYNC__CSI_VSYNC, | ||
163 | MX31_PIN_CSI_D5__GPIO3_5, /* CMOS PWDN */ | ||
164 | IOMUX_MODE(MX31_PIN_RI_DTE1, IOMUX_CONFIG_GPIO), /* CMOS reset */ | ||
165 | }; | ||
166 | |||
167 | /* | ||
168 | * Camera support | ||
169 | */ | ||
170 | static phys_addr_t mx3_camera_base __initdata; | ||
171 | #define MX31_3DS_CAMERA_BUF_SIZE SZ_8M | ||
172 | |||
173 | #define MX31_3DS_GPIO_CAMERA_PW IOMUX_TO_GPIO(MX31_PIN_CSI_D5) | ||
174 | #define MX31_3DS_GPIO_CAMERA_RST IOMUX_TO_GPIO(MX31_PIN_RI_DTE1) | ||
175 | |||
176 | static struct gpio mx31_3ds_camera_gpios[] = { | ||
177 | { MX31_3DS_GPIO_CAMERA_PW, GPIOF_OUT_INIT_HIGH, "camera-power" }, | ||
178 | { MX31_3DS_GPIO_CAMERA_RST, GPIOF_OUT_INIT_HIGH, "camera-reset" }, | ||
179 | }; | ||
180 | |||
181 | static int __init mx31_3ds_camera_alloc_dma(void) | ||
182 | { | ||
183 | int dma; | ||
184 | |||
185 | if (!mx3_camera_base) | ||
186 | return -ENOMEM; | ||
187 | |||
188 | dma = dma_declare_coherent_memory(&mx3_camera.dev, | ||
189 | mx3_camera_base, mx3_camera_base, | ||
190 | MX31_3DS_CAMERA_BUF_SIZE, | ||
191 | DMA_MEMORY_MAP | DMA_MEMORY_EXCLUSIVE); | ||
192 | |||
193 | if (!(dma & DMA_MEMORY_MAP)) | ||
194 | return -ENOMEM; | ||
195 | |||
196 | return 0; | ||
197 | } | ||
198 | |||
199 | static int mx31_3ds_camera_power(struct device *dev, int on) | ||
200 | { | ||
201 | /* enable or disable the camera */ | ||
202 | pr_debug("%s: %s the camera\n", __func__, on ? "ENABLE" : "DISABLE"); | ||
203 | gpio_set_value(MX31_3DS_GPIO_CAMERA_PW, on ? 0 : 1); | ||
204 | |||
205 | if (!on) | ||
206 | goto out; | ||
207 | |||
208 | /* If enabled, give a reset impulse */ | ||
209 | gpio_set_value(MX31_3DS_GPIO_CAMERA_RST, 0); | ||
210 | msleep(20); | ||
211 | gpio_set_value(MX31_3DS_GPIO_CAMERA_RST, 1); | ||
212 | msleep(100); | ||
213 | |||
214 | out: | ||
215 | return 0; | ||
216 | } | ||
217 | |||
218 | static struct i2c_board_info mx31_3ds_i2c_camera = { | ||
219 | I2C_BOARD_INFO("ov2640", 0x30), | ||
220 | }; | ||
221 | |||
222 | static struct regulator_bulk_data mx31_3ds_camera_regs[] = { | ||
223 | { .supply = "cmos_vcore" }, | ||
224 | { .supply = "cmos_2v8" }, | ||
225 | }; | ||
226 | |||
227 | static struct soc_camera_link iclink_ov2640 = { | ||
228 | .bus_id = 0, | ||
229 | .board_info = &mx31_3ds_i2c_camera, | ||
230 | .i2c_adapter_id = 0, | ||
231 | .power = mx31_3ds_camera_power, | ||
232 | .regulators = mx31_3ds_camera_regs, | ||
233 | .num_regulators = ARRAY_SIZE(mx31_3ds_camera_regs), | ||
234 | }; | ||
235 | |||
236 | static struct platform_device mx31_3ds_ov2640 = { | ||
237 | .name = "soc-camera-pdrv", | ||
238 | .id = 0, | ||
239 | .dev = { | ||
240 | .platform_data = &iclink_ov2640, | ||
241 | }, | ||
242 | }; | ||
243 | |||
244 | struct mx3_camera_pdata mx31_3ds_camera_pdata = { | ||
245 | .dma_dev = &mx3_ipu.dev, | ||
246 | .flags = MX3_CAMERA_DATAWIDTH_10, | ||
247 | .mclk_10khz = 2600, | ||
248 | }; | ||
249 | |||
250 | /* | ||
251 | * FB support | ||
252 | */ | ||
253 | static const struct fb_videomode fb_modedb[] = { | ||
254 | { /* 480x640 @ 60 Hz */ | ||
255 | .name = "Epson-VGA", | ||
256 | .refresh = 60, | ||
257 | .xres = 480, | ||
258 | .yres = 640, | ||
259 | .pixclock = 41701, | ||
260 | .left_margin = 20, | ||
261 | .right_margin = 41, | ||
262 | .upper_margin = 10, | ||
263 | .lower_margin = 5, | ||
264 | .hsync_len = 20, | ||
265 | .vsync_len = 10, | ||
266 | .sync = FB_SYNC_OE_ACT_HIGH | FB_SYNC_CLK_INVERT, | ||
267 | .vmode = FB_VMODE_NONINTERLACED, | ||
268 | .flag = 0, | ||
269 | }, | ||
270 | }; | ||
271 | |||
272 | static struct ipu_platform_data mx3_ipu_data = { | ||
273 | .irq_base = MXC_IPU_IRQ_START, | ||
274 | }; | ||
275 | |||
276 | static struct mx3fb_platform_data mx3fb_pdata = { | ||
277 | .dma_dev = &mx3_ipu.dev, | ||
278 | .name = "Epson-VGA", | ||
279 | .mode = fb_modedb, | ||
280 | .num_modes = ARRAY_SIZE(fb_modedb), | ||
281 | }; | ||
282 | |||
283 | /* LCD */ | ||
284 | static struct l4f00242t03_pdata mx31_3ds_l4f00242t03_pdata = { | ||
285 | .reset_gpio = IOMUX_TO_GPIO(MX31_PIN_LCS1), | ||
286 | .data_enable_gpio = IOMUX_TO_GPIO(MX31_PIN_SER_RS), | ||
287 | .core_supply = "lcd_2v8", | ||
288 | .io_supply = "vdd_lcdio", | ||
289 | }; | ||
290 | |||
291 | /* | ||
292 | * Support for SD card slot in personality board | ||
293 | */ | ||
294 | #define MX31_3DS_GPIO_SDHC1_CD IOMUX_TO_GPIO(MX31_PIN_GPIO3_1) | ||
295 | #define MX31_3DS_GPIO_SDHC1_BE IOMUX_TO_GPIO(MX31_PIN_GPIO3_0) | ||
296 | |||
297 | static struct gpio mx31_3ds_sdhc1_gpios[] = { | ||
298 | { MX31_3DS_GPIO_SDHC1_CD, GPIOF_IN, "sdhc1-card-detect" }, | ||
299 | { MX31_3DS_GPIO_SDHC1_BE, GPIOF_OUT_INIT_LOW, "sdhc1-bus-en" }, | ||
300 | }; | ||
301 | |||
302 | static int mx31_3ds_sdhc1_init(struct device *dev, | ||
303 | irq_handler_t detect_irq, | ||
304 | void *data) | ||
305 | { | ||
306 | int ret; | ||
307 | |||
308 | ret = gpio_request_array(mx31_3ds_sdhc1_gpios, | ||
309 | ARRAY_SIZE(mx31_3ds_sdhc1_gpios)); | ||
310 | if (ret) { | ||
311 | pr_warning("Unable to request the SD/MMC GPIOs.\n"); | ||
312 | return ret; | ||
313 | } | ||
314 | |||
315 | ret = request_irq(IOMUX_TO_IRQ(MX31_PIN_GPIO3_1), | ||
316 | detect_irq, IRQF_DISABLED | | ||
317 | IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, | ||
318 | "sdhc1-detect", data); | ||
319 | if (ret) { | ||
320 | pr_warning("Unable to request the SD/MMC card-detect IRQ.\n"); | ||
321 | goto gpio_free; | ||
322 | } | ||
323 | |||
324 | return 0; | ||
325 | |||
326 | gpio_free: | ||
327 | gpio_free_array(mx31_3ds_sdhc1_gpios, | ||
328 | ARRAY_SIZE(mx31_3ds_sdhc1_gpios)); | ||
329 | return ret; | ||
330 | } | ||
331 | |||
332 | static void mx31_3ds_sdhc1_exit(struct device *dev, void *data) | ||
333 | { | ||
334 | free_irq(IOMUX_TO_IRQ(MX31_PIN_GPIO3_1), data); | ||
335 | gpio_free_array(mx31_3ds_sdhc1_gpios, | ||
336 | ARRAY_SIZE(mx31_3ds_sdhc1_gpios)); | ||
337 | } | ||
338 | |||
339 | static void mx31_3ds_sdhc1_setpower(struct device *dev, unsigned int vdd) | ||
340 | { | ||
341 | /* | ||
342 | * While the voltage stuff is done by the driver, activate the | ||
343 | * Buffer Enable Pin only if there is a card in slot to fix the card | ||
344 | * voltage issue caused by bi-directional chip TXB0108 on 3Stack. | ||
345 | * Done here because at this stage we have for sure a debounced value | ||
346 | * of the presence of the card, showed by the value of vdd. | ||
347 | * 7 == ilog2(MMC_VDD_165_195) | ||
348 | */ | ||
349 | if (vdd > 7) | ||
350 | gpio_set_value(MX31_3DS_GPIO_SDHC1_BE, 1); | ||
351 | else | ||
352 | gpio_set_value(MX31_3DS_GPIO_SDHC1_BE, 0); | ||
353 | } | ||
354 | |||
355 | static struct imxmmc_platform_data sdhc1_pdata = { | ||
356 | .init = mx31_3ds_sdhc1_init, | ||
357 | .exit = mx31_3ds_sdhc1_exit, | ||
358 | .setpower = mx31_3ds_sdhc1_setpower, | ||
103 | }; | 359 | }; |
104 | 360 | ||
105 | /* | 361 | /* |
@@ -138,7 +394,71 @@ static struct regulator_init_data gpo_init = { | |||
138 | } | 394 | } |
139 | }; | 395 | }; |
140 | 396 | ||
141 | static struct mc13783_regulator_init_data mx31_3ds_regulators[] = { | 397 | static struct regulator_consumer_supply vmmc2_consumers[] = { |
398 | REGULATOR_SUPPLY("vmmc", "mxc-mmc.0"), | ||
399 | }; | ||
400 | |||
401 | static struct regulator_init_data vmmc2_init = { | ||
402 | .constraints = { | ||
403 | .min_uV = 3000000, | ||
404 | .max_uV = 3000000, | ||
405 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | | ||
406 | REGULATOR_CHANGE_STATUS, | ||
407 | }, | ||
408 | .num_consumer_supplies = ARRAY_SIZE(vmmc2_consumers), | ||
409 | .consumer_supplies = vmmc2_consumers, | ||
410 | }; | ||
411 | |||
412 | static struct regulator_consumer_supply vmmc1_consumers[] = { | ||
413 | REGULATOR_SUPPLY("lcd_2v8", NULL), | ||
414 | REGULATOR_SUPPLY("cmos_2v8", "soc-camera-pdrv.0"), | ||
415 | }; | ||
416 | |||
417 | static struct regulator_init_data vmmc1_init = { | ||
418 | .constraints = { | ||
419 | .min_uV = 2800000, | ||
420 | .max_uV = 2800000, | ||
421 | .apply_uV = 1, | ||
422 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | | ||
423 | REGULATOR_CHANGE_STATUS, | ||
424 | }, | ||
425 | .num_consumer_supplies = ARRAY_SIZE(vmmc1_consumers), | ||
426 | .consumer_supplies = vmmc1_consumers, | ||
427 | }; | ||
428 | |||
429 | static struct regulator_consumer_supply vgen_consumers[] = { | ||
430 | REGULATOR_SUPPLY("vdd_lcdio", NULL), | ||
431 | }; | ||
432 | |||
433 | static struct regulator_init_data vgen_init = { | ||
434 | .constraints = { | ||
435 | .min_uV = 1800000, | ||
436 | .max_uV = 1800000, | ||
437 | .apply_uV = 1, | ||
438 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | | ||
439 | REGULATOR_CHANGE_STATUS, | ||
440 | }, | ||
441 | .num_consumer_supplies = ARRAY_SIZE(vgen_consumers), | ||
442 | .consumer_supplies = vgen_consumers, | ||
443 | }; | ||
444 | |||
445 | static struct regulator_consumer_supply vvib_consumers[] = { | ||
446 | REGULATOR_SUPPLY("cmos_vcore", "soc-camera-pdrv.0"), | ||
447 | }; | ||
448 | |||
449 | static struct regulator_init_data vvib_init = { | ||
450 | .constraints = { | ||
451 | .min_uV = 1300000, | ||
452 | .max_uV = 1300000, | ||
453 | .apply_uV = 1, | ||
454 | .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE | | ||
455 | REGULATOR_CHANGE_STATUS, | ||
456 | }, | ||
457 | .num_consumer_supplies = ARRAY_SIZE(vvib_consumers), | ||
458 | .consumer_supplies = vvib_consumers, | ||
459 | }; | ||
460 | |||
461 | static struct mc13xxx_regulator_init_data mx31_3ds_regulators[] = { | ||
142 | { | 462 | { |
143 | .id = MC13783_REG_PWGT1SPI, /* Power Gate for ARM core. */ | 463 | .id = MC13783_REG_PWGT1SPI, /* Power Gate for ARM core. */ |
144 | .init_data = &pwgtx_init, | 464 | .init_data = &pwgtx_init, |
@@ -152,17 +472,38 @@ static struct mc13783_regulator_init_data mx31_3ds_regulators[] = { | |||
152 | }, { | 472 | }, { |
153 | .id = MC13783_REG_GPO3, /* Turn on 3.3V */ | 473 | .id = MC13783_REG_GPO3, /* Turn on 3.3V */ |
154 | .init_data = &gpo_init, | 474 | .init_data = &gpo_init, |
475 | }, { | ||
476 | .id = MC13783_REG_VMMC2, /* Power MMC/SD, WiFi/Bluetooth. */ | ||
477 | .init_data = &vmmc2_init, | ||
478 | }, { | ||
479 | .id = MC13783_REG_VMMC1, /* Power LCD, CMOS, FM, GPS, Accel. */ | ||
480 | .init_data = &vmmc1_init, | ||
481 | }, { | ||
482 | .id = MC13783_REG_VGEN, /* Power LCD */ | ||
483 | .init_data = &vgen_init, | ||
484 | }, { | ||
485 | .id = MC13783_REG_VVIB, /* Power CMOS */ | ||
486 | .init_data = &vvib_init, | ||
155 | }, | 487 | }, |
156 | }; | 488 | }; |
157 | 489 | ||
158 | /* MC13783 */ | 490 | /* MC13783 */ |
159 | static struct mc13783_platform_data mc13783_pdata __initdata = { | 491 | static struct mc13xxx_platform_data mc13783_pdata __initdata = { |
160 | .regulators = mx31_3ds_regulators, | 492 | .regulators = mx31_3ds_regulators, |
161 | .num_regulators = ARRAY_SIZE(mx31_3ds_regulators), | 493 | .num_regulators = ARRAY_SIZE(mx31_3ds_regulators), |
162 | .flags = MC13783_USE_REGULATOR | MC13783_USE_TOUCHSCREEN, | 494 | .flags = MC13XXX_USE_REGULATOR | MC13XXX_USE_TOUCHSCREEN |
163 | }; | 495 | }; |
164 | 496 | ||
165 | /* SPI */ | 497 | /* SPI */ |
498 | static int spi0_internal_chipselect[] = { | ||
499 | MXC_SPI_CS(2), | ||
500 | }; | ||
501 | |||
502 | static const struct spi_imx_master spi0_pdata __initconst = { | ||
503 | .chipselect = spi0_internal_chipselect, | ||
504 | .num_chipselect = ARRAY_SIZE(spi0_internal_chipselect), | ||
505 | }; | ||
506 | |||
166 | static int spi1_internal_chipselect[] = { | 507 | static int spi1_internal_chipselect[] = { |
167 | MXC_SPI_CS(0), | 508 | MXC_SPI_CS(0), |
168 | MXC_SPI_CS(2), | 509 | MXC_SPI_CS(2), |
@@ -182,6 +523,12 @@ static struct spi_board_info mx31_3ds_spi_devs[] __initdata = { | |||
182 | .platform_data = &mc13783_pdata, | 523 | .platform_data = &mc13783_pdata, |
183 | .irq = IOMUX_TO_IRQ(MX31_PIN_GPIO1_3), | 524 | .irq = IOMUX_TO_IRQ(MX31_PIN_GPIO1_3), |
184 | .mode = SPI_CS_HIGH, | 525 | .mode = SPI_CS_HIGH, |
526 | }, { | ||
527 | .modalias = "l4f00242t03", | ||
528 | .max_speed_hz = 5000000, | ||
529 | .bus_num = 0, | ||
530 | .chip_select = 0, /* SS2 */ | ||
531 | .platform_data = &mx31_3ds_l4f00242t03_pdata, | ||
185 | }, | 532 | }, |
186 | }; | 533 | }; |
187 | 534 | ||
@@ -245,6 +592,11 @@ usbotg_free_reset: | |||
245 | return err; | 592 | return err; |
246 | } | 593 | } |
247 | 594 | ||
595 | static int mx31_3ds_otg_init(struct platform_device *pdev) | ||
596 | { | ||
597 | return mx31_initialize_usb_hw(pdev->id, MXC_EHCI_POWER_PINS_ENABLED); | ||
598 | } | ||
599 | |||
248 | static int mx31_3ds_host2_init(struct platform_device *pdev) | 600 | static int mx31_3ds_host2_init(struct platform_device *pdev) |
249 | { | 601 | { |
250 | int err; | 602 | int err; |
@@ -276,25 +628,25 @@ static int mx31_3ds_host2_init(struct platform_device *pdev) | |||
276 | 628 | ||
277 | mdelay(1); | 629 | mdelay(1); |
278 | gpio_set_value(USBH2_RST_B, 1); | 630 | gpio_set_value(USBH2_RST_B, 1); |
279 | return 0; | 631 | |
632 | mdelay(10); | ||
633 | |||
634 | return mx31_initialize_usb_hw(pdev->id, MXC_EHCI_POWER_PINS_ENABLED); | ||
280 | 635 | ||
281 | usbotg_free_reset: | 636 | usbotg_free_reset: |
282 | gpio_free(USBH2_RST_B); | 637 | gpio_free(USBH2_RST_B); |
283 | return err; | 638 | return err; |
284 | } | 639 | } |
285 | 640 | ||
286 | #if defined(CONFIG_USB_ULPI) | ||
287 | static struct mxc_usbh_platform_data otg_pdata __initdata = { | 641 | static struct mxc_usbh_platform_data otg_pdata __initdata = { |
642 | .init = mx31_3ds_otg_init, | ||
288 | .portsc = MXC_EHCI_MODE_ULPI, | 643 | .portsc = MXC_EHCI_MODE_ULPI, |
289 | .flags = MXC_EHCI_POWER_PINS_ENABLED, | ||
290 | }; | 644 | }; |
291 | 645 | ||
292 | static struct mxc_usbh_platform_data usbh2_pdata __initdata = { | 646 | static struct mxc_usbh_platform_data usbh2_pdata __initdata = { |
293 | .init = mx31_3ds_host2_init, | 647 | .init = mx31_3ds_host2_init, |
294 | .portsc = MXC_EHCI_MODE_ULPI, | 648 | .portsc = MXC_EHCI_MODE_ULPI, |
295 | .flags = MXC_EHCI_POWER_PINS_ENABLED, | ||
296 | }; | 649 | }; |
297 | #endif | ||
298 | 650 | ||
299 | static const struct fsl_usb2_platform_data usbotg_pdata __initconst = { | 651 | static const struct fsl_usb2_platform_data usbotg_pdata __initconst = { |
300 | .operating_mode = FSL_USB2_DR_DEVICE, | 652 | .operating_mode = FSL_USB2_DR_DEVICE, |
@@ -320,19 +672,18 @@ static const struct imxuart_platform_data uart_pdata __initconst = { | |||
320 | .flags = IMXUART_HAVE_RTSCTS, | 672 | .flags = IMXUART_HAVE_RTSCTS, |
321 | }; | 673 | }; |
322 | 674 | ||
323 | /* | 675 | static const struct imxi2c_platform_data mx31_3ds_i2c0_data __initconst = { |
324 | * Set up static virtual mappings. | 676 | .bitrate = 100000, |
325 | */ | 677 | }; |
326 | static void __init mx31_3ds_map_io(void) | ||
327 | { | ||
328 | mx31_map_io(); | ||
329 | } | ||
330 | 678 | ||
331 | /*! | 679 | static struct platform_device *devices[] __initdata = { |
332 | * Board specific initialization. | 680 | &mx31_3ds_ov2640, |
333 | */ | 681 | }; |
334 | static void __init mxc_board_init(void) | 682 | |
683 | static void __init mx31_3ds_init(void) | ||
335 | { | 684 | { |
685 | int ret; | ||
686 | |||
336 | mxc_iomux_setup_multiple_pins(mx31_3ds_pins, ARRAY_SIZE(mx31_3ds_pins), | 687 | mxc_iomux_setup_multiple_pins(mx31_3ds_pins, ARRAY_SIZE(mx31_3ds_pins), |
337 | "mx31_3ds"); | 688 | "mx31_3ds"); |
338 | 689 | ||
@@ -343,20 +694,22 @@ static void __init mxc_board_init(void) | |||
343 | spi_register_board_info(mx31_3ds_spi_devs, | 694 | spi_register_board_info(mx31_3ds_spi_devs, |
344 | ARRAY_SIZE(mx31_3ds_spi_devs)); | 695 | ARRAY_SIZE(mx31_3ds_spi_devs)); |
345 | 696 | ||
697 | platform_add_devices(devices, ARRAY_SIZE(devices)); | ||
698 | |||
346 | imx31_add_imx_keypad(&mx31_3ds_keymap_data); | 699 | imx31_add_imx_keypad(&mx31_3ds_keymap_data); |
347 | 700 | ||
348 | mx31_3ds_usbotg_init(); | 701 | mx31_3ds_usbotg_init(); |
349 | #if defined(CONFIG_USB_ULPI) | ||
350 | if (otg_mode_host) { | 702 | if (otg_mode_host) { |
351 | otg_pdata.otg = otg_ulpi_create(&mxc_ulpi_access_ops, | 703 | otg_pdata.otg = imx_otg_ulpi_create(ULPI_OTG_DRVVBUS | |
352 | ULPI_OTG_DRVVBUS | ULPI_OTG_DRVVBUS_EXT); | 704 | ULPI_OTG_DRVVBUS_EXT); |
353 | 705 | if (otg_pdata.otg) | |
354 | imx31_add_mxc_ehci_otg(&otg_pdata); | 706 | imx31_add_mxc_ehci_otg(&otg_pdata); |
355 | } | 707 | } |
356 | usbh2_pdata.otg = otg_ulpi_create(&mxc_ulpi_access_ops, | 708 | usbh2_pdata.otg = imx_otg_ulpi_create(ULPI_OTG_DRVVBUS | |
357 | ULPI_OTG_DRVVBUS | ULPI_OTG_DRVVBUS_EXT); | 709 | ULPI_OTG_DRVVBUS_EXT); |
358 | imx31_add_mxc_ehci_hs(2, &usbh2_pdata); | 710 | if (usbh2_pdata.otg) |
359 | #endif | 711 | imx31_add_mxc_ehci_hs(2, &usbh2_pdata); |
712 | |||
360 | if (!otg_mode_host) | 713 | if (!otg_mode_host) |
361 | imx31_add_fsl_usb2_udc(&usbotg_pdata); | 714 | imx31_add_fsl_usb2_udc(&usbotg_pdata); |
362 | 715 | ||
@@ -364,6 +717,26 @@ static void __init mxc_board_init(void) | |||
364 | printk(KERN_WARNING "Init of the debug board failed, all " | 717 | printk(KERN_WARNING "Init of the debug board failed, all " |
365 | "devices on the debug board are unusable.\n"); | 718 | "devices on the debug board are unusable.\n"); |
366 | imx31_add_imx2_wdt(NULL); | 719 | imx31_add_imx2_wdt(NULL); |
720 | imx31_add_imx_i2c0(&mx31_3ds_i2c0_data); | ||
721 | imx31_add_mxc_mmc(0, &sdhc1_pdata); | ||
722 | |||
723 | imx31_add_spi_imx0(&spi0_pdata); | ||
724 | mxc_register_device(&mx3_ipu, &mx3_ipu_data); | ||
725 | mxc_register_device(&mx3_fb, &mx3fb_pdata); | ||
726 | |||
727 | /* CSI */ | ||
728 | /* Camera power: default - off */ | ||
729 | ret = gpio_request_array(mx31_3ds_camera_gpios, | ||
730 | ARRAY_SIZE(mx31_3ds_camera_gpios)); | ||
731 | if (ret) { | ||
732 | pr_err("Failed to request camera gpios"); | ||
733 | iclink_ov2640.power = NULL; | ||
734 | } | ||
735 | |||
736 | if (!mx31_3ds_camera_alloc_dma()) | ||
737 | mxc_register_device(&mx3_camera, &mx31_3ds_camera_pdata); | ||
738 | else | ||
739 | pr_err("Failed to allocate dma memory for camera"); | ||
367 | } | 740 | } |
368 | 741 | ||
369 | static void __init mx31_3ds_timer_init(void) | 742 | static void __init mx31_3ds_timer_init(void) |
@@ -375,15 +748,22 @@ static struct sys_timer mx31_3ds_timer = { | |||
375 | .init = mx31_3ds_timer_init, | 748 | .init = mx31_3ds_timer_init, |
376 | }; | 749 | }; |
377 | 750 | ||
378 | /* | 751 | static void __init mx31_3ds_reserve(void) |
379 | * The following uses standard kernel macros defined in arch.h in order to | 752 | { |
380 | * initialize __mach_desc_MX31_3DS data structure. | 753 | /* reserve MX31_3DS_CAMERA_BUF_SIZE bytes for mx3-camera */ |
381 | */ | 754 | mx3_camera_base = memblock_alloc(MX31_3DS_CAMERA_BUF_SIZE, |
755 | MX31_3DS_CAMERA_BUF_SIZE); | ||
756 | memblock_free(mx3_camera_base, MX31_3DS_CAMERA_BUF_SIZE); | ||
757 | memblock_remove(mx3_camera_base, MX31_3DS_CAMERA_BUF_SIZE); | ||
758 | } | ||
759 | |||
382 | MACHINE_START(MX31_3DS, "Freescale MX31PDK (3DS)") | 760 | MACHINE_START(MX31_3DS, "Freescale MX31PDK (3DS)") |
383 | /* Maintainer: Freescale Semiconductor, Inc. */ | 761 | /* Maintainer: Freescale Semiconductor, Inc. */ |
384 | .boot_params = MX3x_PHYS_OFFSET + 0x100, | 762 | .boot_params = MX3x_PHYS_OFFSET + 0x100, |
385 | .map_io = mx31_3ds_map_io, | 763 | .map_io = mx31_map_io, |
386 | .init_irq = mx31_init_irq, | 764 | .init_early = imx31_init_early, |
387 | .init_machine = mxc_board_init, | 765 | .init_irq = mx31_init_irq, |
388 | .timer = &mx31_3ds_timer, | 766 | .timer = &mx31_3ds_timer, |
767 | .init_machine = mx31_3ds_init, | ||
768 | .reserve = mx31_3ds_reserve, | ||
389 | MACHINE_END | 769 | MACHINE_END |