diff options
author | Troy Kisky <troy.kisky@boundarydevices.com> | 2013-06-05 14:42:11 -0700 |
---|---|---|
committer | Eric Nelson <eric.nelson@boundarydevices.com> | 2013-06-09 10:56:00 -0700 |
commit | 73898f34936475555d4797c0c64b24c4952c0c9a (patch) | |
tree | d7d098da9fda1eb3dd1eef25646adb4ba6d8dfd8 /arch/arm/mach-mx6 | |
parent | 03a44cec1d5fe718a39ed1d562d731d7e7be8bc8 (diff) |
mx6_nitrogen6x: add adv7180 tv input camera
Diffstat (limited to 'arch/arm/mach-mx6')
-rw-r--r-- | arch/arm/mach-mx6/board-mx6_nitrogen6x.c | 106 | ||||
-rw-r--r-- | arch/arm/mach-mx6/pads-mx6_nitrogen6x.h | 13 |
2 files changed, 90 insertions, 29 deletions
diff --git a/arch/arm/mach-mx6/board-mx6_nitrogen6x.c b/arch/arm/mach-mx6/board-mx6_nitrogen6x.c index 659f29a3cfa1..97932d1ec6d6 100644 --- a/arch/arm/mach-mx6/board-mx6_nitrogen6x.c +++ b/arch/arm/mach-mx6/board-mx6_nitrogen6x.c @@ -408,7 +408,7 @@ static struct i2c_board_info mxc_i2c0_board_info[] __initdata = { }, }; -static void camera_reset(int power_gp, int reset_gp, int reset_gp2) +static void camera_reset(int power_gp, int poweroff_level, int reset_gp, int reset_gp2) { pr_info("%s: power_gp=0x%x, reset_gp=0x%x reset_gp2=0x%x\n", __func__, power_gp, reset_gp, reset_gp2); @@ -417,13 +417,13 @@ static void camera_reset(int power_gp, int reset_gp, int reset_gp2) gpio_request(reset_gp, "cam-reset"); if (reset_gp2 >= 0) gpio_request(reset_gp2, "cam-reset2"); - gpio_direction_output(power_gp, 1); + gpio_direction_output(power_gp, poweroff_level); /* Camera reset */ gpio_direction_output(reset_gp, 0); if (reset_gp2 >= 0) gpio_direction_output(reset_gp2, 0); msleep(1); - gpio_set_value(power_gp, 0); + gpio_set_value(power_gp, poweroff_level ^ 1); msleep(1); gpio_set_value(reset_gp, 1); if (reset_gp2 >= 0) @@ -441,7 +441,7 @@ static void camera_reset(int power_gp, int reset_gp, int reset_gp2) */ struct pwm_device *mipi_pwm; -static void mx6_mipi_camera_io_init(void) +static void ov5640_mipi_camera_io_init(void) { IOMUX_SETUP(mipi_pads); @@ -456,13 +456,13 @@ static void mx6_mipi_camera_io_init(void) pwm_enable(mipi_pwm); } - camera_reset(IMX_GPIO_NR(6, 9), IMX_GPIO_NR(2, 5), IMX_GPIO_NR(6, 11)); + camera_reset(IMX_GPIO_NR(6, 9), 1, IMX_GPIO_NR(2, 5), IMX_GPIO_NR(6, 11)); /* for mx6dl, mipi virtual channel 1 connect to csi 1*/ if (cpu_is_mx6dl()) mxc_iomux_set_gpr_register(13, 3, 3, 1); } -static void mx6_mipi_camera_powerdown(int powerdown) +static void ov5640_mipi_camera_powerdown(int powerdown) { if (!IS_ERR(mipi_pwm)) { if (powerdown) { @@ -483,22 +483,23 @@ static void mx6_mipi_camera_powerdown(int powerdown) static struct fsl_mxc_camera_platform_data ov5640_mipi_data = { .mclk = 22000000, .csi = 0, - .io_init = mx6_mipi_camera_io_init, - .pwdn = mx6_mipi_camera_powerdown, + .io_init = ov5640_mipi_camera_io_init, + .pwdn = ov5640_mipi_camera_powerdown, }; -#else +#endif + +#if defined(CONFIG_MXC_CAMERA_OV5642) || defined(CONFIG_MXC_CAMERA_OV5642_MODULE) /* * GPIO_6 GPIO[1]:6 (ov5642) - J5 - CSI0 power down * GPIO_8 GPIO[1]:8 (ov5642) - J5 - CSI0 reset * NANDF_CS0 GPIO[6]:11 (ov5642) - J5 - reset * SD1_DAT0 GPIO[1]:16 (ov5642) - J5 - GP */ -static void mx6_csi0_io_init(void) +static void ov5642_io_init(void) { IOMUX_SETUP(csi0_sensor_pads); - camera_reset(GP_CSI0_PWN, GP_CSI0_RST, - IMX_GPIO_NR(6, 11)); + camera_reset(GP_CSI0_PWN, 1, GP_CSI0_RST, IMX_GPIO_NR(6, 11)); /* For MX6Q GPR1 bit19 and bit20 meaning: * Bit19: 0 - Enable mipi to IPU1 CSI0 * virtual channel is fixed to 0 @@ -517,7 +518,7 @@ static void mx6_csi0_io_init(void) mxc_iomux_set_gpr_register(13, 0, 3, 4); } -static void mx6_csi0_powerdown(int powerdown) +static void ov5642_powerdown(int powerdown) { pr_info("%s: powerdown=%d, power_gp=0x%x\n", __func__, powerdown, GP_CSI0_PWN); @@ -525,16 +526,41 @@ static void mx6_csi0_powerdown(int powerdown) msleep(2); } -static struct fsl_mxc_camera_platform_data camera_data = { +static struct fsl_mxc_camera_platform_data ov5642_data = { .mclk = 24000000, .mclk_source = 0, .csi = 0, - .io_init = mx6_csi0_io_init, - .pwdn = mx6_csi0_powerdown, + .io_init = ov5642_io_init, + .pwdn = ov5642_powerdown, }; #endif +static void adv7180_pwdn(int powerdown) +{ + pr_info("%s: powerdown=%d, power_gp=0x%x\n", + __func__, powerdown, IMX_GPIO_NR(3, 13)); + gpio_set_value(IMX_GPIO_NR(3, 13), powerdown ? 0 : 1); +} + +static void adv7180_io_init(void) +{ + camera_reset(IMX_GPIO_NR(3, 13), 0, IMX_GPIO_NR(3, 14), -1); + + if (cpu_is_mx6q()) + mxc_iomux_set_gpr_register(1, 20, 1, 1); + else + mxc_iomux_set_gpr_register(13, 3, 3, 4); +} + +static struct fsl_mxc_tvin_platform_data adv7180_data = { + .pwdn = adv7180_pwdn, + .io_init = adv7180_io_init, + .cvbs = true, + .ipu = 1, + .csi = 1, +}; + static struct i2c_board_info mxc_i2c1_board_info[] __initdata = { { I2C_BOARD_INFO("mxc_hdmi_i2c", 0x50), @@ -544,10 +570,11 @@ static struct i2c_board_info mxc_i2c1_board_info[] __initdata = { I2C_BOARD_INFO("ov5640_mipi", 0x3c), .platform_data = (void *)&ov5640_mipi_data, }, -#else +#endif +#if defined(CONFIG_MXC_CAMERA_OV5642) || defined(CONFIG_MXC_CAMERA_OV5642_MODULE) { I2C_BOARD_INFO("ov5642", 0x3c), - .platform_data = (void *)&camera_data, + .platform_data = (void *)&ov5642_data, }, #endif }; @@ -585,6 +612,11 @@ static struct i2c_board_info mxc_i2c2_board_info[] __initdata = { I2C_BOARD_INFO("mxc_adv739x", 0x2a), .platform_data = (void *)&adv7391_data, }, + { + I2C_BOARD_INFO("adv7180", 0x20), + .platform_data = (void *)&adv7180_data, + .irq = gpio_to_irq(IMX_GPIO_NR(5, 0)), /* EIM_WAIT */ + }, }; static void usbotg_vbus(bool on) @@ -833,17 +865,30 @@ static struct imx_ipuv3_platform_data ipu_data[] = { }; static struct fsl_mxc_capture_platform_data capture_data[] = { +#if defined(CONFIG_MXC_CAMERA_OV5642) || defined(CONFIG_MXC_CAMERA_OV5642_MODULE) { - .csi = 0, .ipu = 0, + .csi = 0, .mclk_source = 0, .is_mipi = 0, - }, { - .csi = 1, + }, +#endif +#if defined(CONFIG_MXC_CAMERA_OV5640_MIPI) || defined(CONFIG_MXC_CAMERA_OV5640_MIPI_MODULE) + { .ipu = 0, + .csi = 0, .mclk_source = 0, .is_mipi = 1, }, +#endif +#if defined(CONFIG_MXC_TVIN_ADV7180) || defined(CONFIG_MXC_TVIN_ADV7180_MODULE) + { + .ipu = 1, + .csi = 1, + .mclk_source = 0, + .is_mipi = 0, + }, +#endif }; @@ -1210,6 +1255,7 @@ static void __init board_init(void) j = ARRAY_SIZE(fb_data); } else { j = (ARRAY_SIZE(fb_data) + 1) / 2; + adv7180_data.ipu = 0; } for (i = 0; i < j; i++) imx6q_add_ipuv3fb(i, &fb_data[i]); @@ -1218,9 +1264,21 @@ static void __init board_init(void) imx6q_add_lcdif(&lcdif_data); imx6q_add_ldb(&ldb_data); imx6q_add_bt656(&bt656_data); - imx6q_add_v4l2_output(0); - imx6q_add_v4l2_capture(0, &capture_data[0]); - imx6q_add_v4l2_capture(1, &capture_data[1]); + voutdev = imx6q_add_v4l2_output(0); + if (vout_mem.res_msize && voutdev) { + dma_declare_coherent_memory(&voutdev->dev, + vout_mem.res_mbase, + vout_mem.res_mbase, + vout_mem.res_msize, + DMA_MEMORY_MAP | DMA_MEMORY_EXCLUSIVE); + } + + for (i = 0; i < ARRAY_SIZE(capture_data); i++) { + if (!cpu_is_mx6q()) + capture_data[i].ipu = 0; + imx6q_add_v4l2_capture(i, &capture_data[i]); + } + imx6q_add_mipi_csi2(&mipi_csi2_pdata); imx6q_add_imx_snvs_rtc(); diff --git a/arch/arm/mach-mx6/pads-mx6_nitrogen6x.h b/arch/arm/mach-mx6/pads-mx6_nitrogen6x.h index e74b116001e3..c049773534c2 100644 --- a/arch/arm/mach-mx6/pads-mx6_nitrogen6x.h +++ b/arch/arm/mach-mx6/pads-mx6_nitrogen6x.h @@ -187,14 +187,15 @@ static iomux_v3_cfg_t MX6NAME(common_pads)[] = { MX6PAD(EIM_DA12__IPU2_CSI1_VSYNC), /* GPIO3[12] */ MX6PAD(EIM_A16__IPU2_CSI1_PIXCLK), /* GPIO2[22] */ #endif - MX6PAD(EIM_DA13__GPIO_3_13), /* GPIO3[13] - power down */ - MX6PAD(EIM_DA14__GPIO_3_14), /* GPIO3[14] - camera reset */ + MX6PAD(EIM_DA13__GPIO_3_13), /* Power */ + MX6PAD(EIM_DA14__GPIO_3_14), /* Reset */ + MX6PAD(EIM_WAIT__GPIO_5_0), /* Irq */ + MX6PAD(EIM_A24__GPIO_5_4), /* Field */ + MX6PAD(EIM_RW__GPIO_2_26), /* GPIO2[26] - unused */ MX6PAD(EIM_LBA__GPIO_2_27), /* GPIO2[27] - unused */ MX6PAD(EIM_EB3__GPIO_2_31), /* GPIO2[31] - unused */ MX6PAD(EIM_DA15__GPIO_3_15), /* GPIO3[15] - unused */ - MX6PAD(EIM_WAIT__GPIO_5_0), /* GPIO5[0] - unused */ - MX6PAD(EIM_A24__GPIO_5_4), /* GPIO5[4] - unused */ /* NANDF_CS1/2/3 are unused for sabrelite */ NEW_PAD_CTRL(MX6PAD(NANDF_CS1__GPIO_6_14), N6_IRQ_TEST_PADCFG), /* wl1271 wl_irq */ @@ -321,7 +322,9 @@ static iomux_v3_cfg_t MX6NAME(mipi_pads)[] = { MX6PAD(GPIO_6__GPIO_1_6), /* Camera GP */ 0 }; -#else +#endif + +#if defined(CONFIG_MXC_CAMERA_OV5642) || defined(CONFIG_MXC_CAMERA_OV5642_MODULE) static iomux_v3_cfg_t MX6NAME(csi0_sensor_pads)[] = { /* IPU1 Camera */ MX6PAD(CSI0_DAT8__IPU1_CSI0_D_8), |