aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-mx3
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-mx3')
-rw-r--r--arch/arm/mach-mx3/pcm037.c118
1 files changed, 106 insertions, 12 deletions
diff --git a/arch/arm/mach-mx3/pcm037.c b/arch/arm/mach-mx3/pcm037.c
index c6f61a1f06c8..d7b29b724a61 100644
--- a/arch/arm/mach-mx3/pcm037.c
+++ b/arch/arm/mach-mx3/pcm037.c
@@ -18,7 +18,7 @@
18 18
19#include <linux/types.h> 19#include <linux/types.h>
20#include <linux/init.h> 20#include <linux/init.h>
21 21#include <linux/dma-mapping.h>
22#include <linux/platform_device.h> 22#include <linux/platform_device.h>
23#include <linux/mtd/physmap.h> 23#include <linux/mtd/physmap.h>
24#include <linux/mtd/plat-ram.h> 24#include <linux/mtd/plat-ram.h>
@@ -33,22 +33,23 @@
33#include <linux/irq.h> 33#include <linux/irq.h>
34#include <linux/fsl_devices.h> 34#include <linux/fsl_devices.h>
35 35
36#include <mach/hardware.h> 36#include <media/soc_camera.h>
37
37#include <asm/mach-types.h> 38#include <asm/mach-types.h>
38#include <asm/mach/arch.h> 39#include <asm/mach/arch.h>
39#include <asm/mach/time.h> 40#include <asm/mach/time.h>
40#include <asm/mach/map.h> 41#include <asm/mach/map.h>
42#include <mach/board-pcm037.h>
41#include <mach/common.h> 43#include <mach/common.h>
44#include <mach/hardware.h>
45#include <mach/i2c.h>
42#include <mach/imx-uart.h> 46#include <mach/imx-uart.h>
43#include <mach/iomux-mx3.h> 47#include <mach/iomux-mx3.h>
44#include <mach/ipu.h> 48#include <mach/ipu.h>
45#include <mach/board-pcm037.h> 49#include <mach/mmc.h>
50#include <mach/mx3_camera.h>
46#include <mach/mx3fb.h> 51#include <mach/mx3fb.h>
47#include <mach/mxc_nand.h> 52#include <mach/mxc_nand.h>
48#include <mach/mmc.h>
49#ifdef CONFIG_I2C_IMX
50#include <mach/i2c.h>
51#endif
52 53
53#include "devices.h" 54#include "devices.h"
54 55
@@ -56,6 +57,8 @@ static unsigned int pcm037_pins[] = {
56 /* I2C */ 57 /* I2C */
57 MX31_PIN_CSPI2_MOSI__SCL, 58 MX31_PIN_CSPI2_MOSI__SCL,
58 MX31_PIN_CSPI2_MISO__SDA, 59 MX31_PIN_CSPI2_MISO__SDA,
60 MX31_PIN_CSPI2_SS2__I2C3_SDA,
61 MX31_PIN_CSPI2_SCLK__I2C3_SCL,
59 /* SDHC1 */ 62 /* SDHC1 */
60 MX31_PIN_SD1_DATA3__SD1_DATA3, 63 MX31_PIN_SD1_DATA3__SD1_DATA3,
61 MX31_PIN_SD1_DATA2__SD1_DATA2, 64 MX31_PIN_SD1_DATA2__SD1_DATA2,
@@ -120,6 +123,22 @@ static unsigned int pcm037_pins[] = {
120 MX31_PIN_D3_SPL__D3_SPL, 123 MX31_PIN_D3_SPL__D3_SPL,
121 MX31_PIN_D3_CLS__D3_CLS, 124 MX31_PIN_D3_CLS__D3_CLS,
122 MX31_PIN_LCS0__GPI03_23, 125 MX31_PIN_LCS0__GPI03_23,
126 /* CSI */
127 IOMUX_MODE(MX31_PIN_CSI_D5, IOMUX_CONFIG_GPIO),
128 MX31_PIN_CSI_D6__CSI_D6,
129 MX31_PIN_CSI_D7__CSI_D7,
130 MX31_PIN_CSI_D8__CSI_D8,
131 MX31_PIN_CSI_D9__CSI_D9,
132 MX31_PIN_CSI_D10__CSI_D10,
133 MX31_PIN_CSI_D11__CSI_D11,
134 MX31_PIN_CSI_D12__CSI_D12,
135 MX31_PIN_CSI_D13__CSI_D13,
136 MX31_PIN_CSI_D14__CSI_D14,
137 MX31_PIN_CSI_D15__CSI_D15,
138 MX31_PIN_CSI_HSYNC__CSI_HSYNC,
139 MX31_PIN_CSI_MCLK__CSI_MCLK,
140 MX31_PIN_CSI_PIXCLK__CSI_PIXCLK,
141 MX31_PIN_CSI_VSYNC__CSI_VSYNC,
123}; 142};
124 143
125static struct physmap_flash_data pcm037_flash_data = { 144static struct physmap_flash_data pcm037_flash_data = {
@@ -250,19 +269,43 @@ static struct mxc_nand_platform_data pcm037_nand_board_info = {
250 .hw_ecc = 1, 269 .hw_ecc = 1,
251}; 270};
252 271
253#ifdef CONFIG_I2C_IMX
254static struct imxi2c_platform_data pcm037_i2c_1_data = { 272static struct imxi2c_platform_data pcm037_i2c_1_data = {
255 .bitrate = 100000, 273 .bitrate = 100000,
256}; 274};
257 275
276static struct imxi2c_platform_data pcm037_i2c_2_data = {
277 .bitrate = 20000,
278};
279
258static struct at24_platform_data board_eeprom = { 280static struct at24_platform_data board_eeprom = {
259 .byte_len = 4096, 281 .byte_len = 4096,
260 .page_size = 32, 282 .page_size = 32,
261 .flags = AT24_FLAG_ADDR16, 283 .flags = AT24_FLAG_ADDR16,
262}; 284};
263 285
286static int pcm037_camera_power(struct device *dev, int on)
287{
288 /* disable or enable the camera in X7 or X8 PCM970 connector */
289 gpio_set_value(IOMUX_TO_GPIO(MX31_PIN_CSI_D5), !on);
290 return 0;
291}
292
293static struct i2c_board_info pcm037_i2c_2_devices[] = {
294 {
295 I2C_BOARD_INFO("mt9t031", 0x5d),
296 },
297};
298
299static struct soc_camera_link iclink = {
300 .bus_id = 0, /* Must match with the camera ID */
301 .power = pcm037_camera_power,
302 .board_info = &pcm037_i2c_2_devices[0],
303 .i2c_adapter_id = 2,
304 .module_name = "mt9t031",
305};
306
264static struct i2c_board_info pcm037_i2c_devices[] = { 307static struct i2c_board_info pcm037_i2c_devices[] = {
265 { 308 {
266 I2C_BOARD_INFO("at24", 0x52), /* E0=0, E1=1, E2=0 */ 309 I2C_BOARD_INFO("at24", 0x52), /* E0=0, E1=1, E2=0 */
267 .platform_data = &board_eeprom, 310 .platform_data = &board_eeprom,
268 }, { 311 }, {
@@ -270,7 +313,14 @@ static struct i2c_board_info pcm037_i2c_devices[] = {
270 .type = "pcf8563", 313 .type = "pcf8563",
271 } 314 }
272}; 315};
273#endif 316
317static struct platform_device pcm037_camera = {
318 .name = "soc-camera-pdrv",
319 .id = 0,
320 .dev = {
321 .platform_data = &iclink,
322 },
323};
274 324
275/* Not connected by default */ 325/* Not connected by default */
276#ifdef PCM970_SDHC_RW_SWITCH 326#ifdef PCM970_SDHC_RW_SWITCH
@@ -334,9 +384,41 @@ static struct imxmmc_platform_data sdhc_pdata = {
334 .exit = pcm970_sdhc1_exit, 384 .exit = pcm970_sdhc1_exit,
335}; 385};
336 386
387struct mx3_camera_pdata camera_pdata = {
388 .dma_dev = &mx3_ipu.dev,
389 .flags = MX3_CAMERA_DATAWIDTH_8 | MX3_CAMERA_DATAWIDTH_10,
390 .mclk_10khz = 2000,
391};
392
393static int __init pcm037_camera_alloc_dma(const size_t buf_size)
394{
395 dma_addr_t dma_handle;
396 void *buf;
397 int dma;
398
399 if (buf_size < 2 * 1024 * 1024)
400 return -EINVAL;
401
402 buf = dma_alloc_coherent(NULL, buf_size, &dma_handle, GFP_KERNEL);
403 if (!buf) {
404 pr_err("%s: cannot allocate camera buffer-memory\n", __func__);
405 return -ENOMEM;
406 }
407
408 memset(buf, 0, buf_size);
409
410 dma = dma_declare_coherent_memory(&mx3_camera.dev,
411 dma_handle, dma_handle, buf_size,
412 DMA_MEMORY_MAP | DMA_MEMORY_EXCLUSIVE);
413
414 /* The way we call dma_declare_coherent_memory only a malloc can fail */
415 return dma & DMA_MEMORY_MAP ? 0 : -ENOMEM;
416}
417
337static struct platform_device *devices[] __initdata = { 418static struct platform_device *devices[] __initdata = {
338 &pcm037_flash, 419 &pcm037_flash,
339 &pcm037_sram_device, 420 &pcm037_sram_device,
421 &pcm037_camera,
340}; 422};
341 423
342static struct ipu_platform_data mx3_ipu_data = { 424static struct ipu_platform_data mx3_ipu_data = {
@@ -415,18 +497,30 @@ static void __init mxc_board_init(void)
415 } 497 }
416 498
417 499
418#ifdef CONFIG_I2C_IMX 500 /* I2C adapters and devices */
419 i2c_register_board_info(1, pcm037_i2c_devices, 501 i2c_register_board_info(1, pcm037_i2c_devices,
420 ARRAY_SIZE(pcm037_i2c_devices)); 502 ARRAY_SIZE(pcm037_i2c_devices));
421 503
422 mxc_register_device(&mxc_i2c_device1, &pcm037_i2c_1_data); 504 mxc_register_device(&mxc_i2c_device1, &pcm037_i2c_1_data);
423#endif 505 mxc_register_device(&mxc_i2c_device2, &pcm037_i2c_2_data);
506
424 mxc_register_device(&mxc_nand_device, &pcm037_nand_board_info); 507 mxc_register_device(&mxc_nand_device, &pcm037_nand_board_info);
425 mxc_register_device(&mxcsdhc_device0, &sdhc_pdata); 508 mxc_register_device(&mxcsdhc_device0, &sdhc_pdata);
426 mxc_register_device(&mx3_ipu, &mx3_ipu_data); 509 mxc_register_device(&mx3_ipu, &mx3_ipu_data);
427 mxc_register_device(&mx3_fb, &mx3fb_pdata); 510 mxc_register_device(&mx3_fb, &mx3fb_pdata);
428 if (!gpio_usbotg_hs_activate()) 511 if (!gpio_usbotg_hs_activate())
429 mxc_register_device(&mxc_otg_udc_device, &usb_pdata); 512 mxc_register_device(&mxc_otg_udc_device, &usb_pdata);
513
514 /* CSI */
515 /* Camera power: default - off */
516 ret = gpio_request(IOMUX_TO_GPIO(MX31_PIN_CSI_D5), "mt9t031-power");
517 if (!ret)
518 gpio_direction_output(IOMUX_TO_GPIO(MX31_PIN_CSI_D5), 1);
519 else
520 iclink.power = NULL;
521
522 if (!pcm037_camera_alloc_dma(4 * 1024 * 1024))
523 mxc_register_device(&mx3_camera, &camera_pdata);
430} 524}
431 525
432static void __init pcm037_timer_init(void) 526static void __init pcm037_timer_init(void)