From: Wu Guoxing Date: Mon, 21 May 2012 01:21:12 +0000 (+0800) Subject: ENGR00209062-1: mx6dq and mx6dl dual camera support X-Git-Tag: v3.0.35-fsl~1006 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=e0e2c428625022653cf3898cc345ddb82b886eca;p=karo-tx-linux.git ENGR00209062-1: mx6dq and mx6dl dual camera support dual camera support for mx6q and mx6dl: 1. let mipi and parallel camera working on different csi 2. the two camera can work independently and synchronously 3. the two camera will be registered and different video device(/dev/video0, /dev/video1) 4. when both camera are working, the can not use the same ipu channel, that is, when camera one using PRP_ENC_MEM or PRP_VF_MEM channel, the other one can only use CSI_MEM this is the arch part changes. Signed-off-by: Wu Guoxing --- diff --git a/arch/arm/mach-mx6/board-mx6q_arm2.c b/arch/arm/mach-mx6/board-mx6q_arm2.c index d89dddbf449b..deecf7a62c8f 100644 --- a/arch/arm/mach-mx6/board-mx6q_arm2.c +++ b/arch/arm/mach-mx6/board-mx6q_arm2.c @@ -585,6 +585,7 @@ static struct fsl_mxc_camera_platform_data camera_data = { .analog_regulator = "DA9052_LDO7", .core_regulator = "DA9052_LDO9", .mclk = 24000000, + .mclk_source = 0, .csi = 0, .io_init = mx6_csi0_io_init, }; @@ -646,15 +647,15 @@ static void mx6_mipi_sensor_io_init(void) mxc_iomux_v3_setup_multiple_pads(mipi_sensor_pads, mipi_sensor_pads_cnt); - if (cpu_is_mx6q()) - mxc_iomux_set_gpr_register(1, 19, 1, 0); + /*for mx6dl, mipi virtual channel 1 connect to csi 1*/ if (cpu_is_mx6dl()) - mxc_iomux_set_gpr_register(13, 0, 3, 0); + mxc_iomux_set_gpr_register(13, 3, 3, 1); } static struct fsl_mxc_camera_platform_data ov5640_mipi_data = { .mclk = 24000000, - .csi = 0, + .csi = 1, + .mclk_source = 0, .io_init = mx6_mipi_sensor_io_init, }; @@ -1524,6 +1525,21 @@ static struct mipi_csi2_platform_data mipi_csi2_pdata = { .pixel_clk = "emi_clk", }; +static struct fsl_mxc_capture_platform_data capture_data[] = { + { + .csi = 0, + .ipu = 0, + .mclk_source = 0, + .is_mipi = 0, + }, { + .csi = 1, + .ipu = 0, + .mclk_source = 0, + .is_mipi = 1, + }, +}; + + static void arm2_suspend_enter(void) { /* suspend preparation */ @@ -2076,7 +2092,8 @@ static void __init mx6_arm2_init(void) imx6q_add_lcdif(&lcdif_data); imx6q_add_ldb(&ldb_data); imx6q_add_v4l2_output(0); - imx6q_add_v4l2_capture(0); + imx6q_add_v4l2_capture(0, &capture_data[0]); + imx6q_add_v4l2_capture(1, &capture_data[1]); imx6q_add_imx_snvs_rtc(); diff --git a/arch/arm/mach-mx6/board-mx6q_sabreauto.c b/arch/arm/mach-mx6/board-mx6q_sabreauto.c index da68deaa108a..29eda27698df 100644 --- a/arch/arm/mach-mx6/board-mx6q_sabreauto.c +++ b/arch/arm/mach-mx6/board-mx6q_sabreauto.c @@ -1268,6 +1268,21 @@ static struct mxc_spdif_platform_data mxc_spdif_data = { .spdif_clk = NULL, /* spdif bus clk */ }; +static struct fsl_mxc_capture_platform_data capture_data[] = { + { + .csi = 0, + .ipu = 0, + .mclk_source = 0, + .is_mipi = 0, + }, { + .csi = 1, + .ipu = 0, + .mclk_source = 0, + .is_mipi = 1, + }, +}; + + /*! * Board specific initialization. */ @@ -1404,7 +1419,8 @@ static void __init mx6_board_init(void) imx6q_add_lcdif(&lcdif_data); imx6q_add_ldb(&ldb_data); imx6q_add_v4l2_output(0); - imx6q_add_v4l2_capture(0); + imx6q_add_v4l2_capture(0, &capture_data[0]); + imx6q_add_v4l2_capture(1, &capture_data[1]); imx6q_add_android_device_buttons(); imx6q_add_imx_snvs_rtc(); diff --git a/arch/arm/mach-mx6/board-mx6q_sabrelite.c b/arch/arm/mach-mx6/board-mx6q_sabrelite.c index ce7305ad440b..7fd9fbab260e 100644 --- a/arch/arm/mach-mx6/board-mx6q_sabrelite.c +++ b/arch/arm/mach-mx6/board-mx6q_sabrelite.c @@ -595,6 +595,7 @@ static void mx6q_csi0_io_init(void) static struct fsl_mxc_camera_platform_data camera_data = { .mclk = 24000000, + .mclk_source = 0, .csi = 0, .io_init = mx6q_csi0_io_init, }; @@ -831,6 +832,21 @@ static struct imx_ipuv3_platform_data ipu_data[] = { }, }; +static struct fsl_mxc_capture_platform_data capture_data[] = { + { + .csi = 0, + .ipu = 0, + .mclk_source = 0, + .is_mipi = 0, + }, { + .csi = 1, + .ipu = 0, + .mclk_source = 0, + .is_mipi = 1, + }, +}; + + static void sabrelite_suspend_enter(void) { /* suspend preparation */ @@ -1086,7 +1102,8 @@ static void __init mx6_sabrelite_board_init(void) imx6q_add_lcdif(&lcdif_data); imx6q_add_ldb(&ldb_data); imx6q_add_v4l2_output(0); - imx6q_add_v4l2_capture(0); + imx6q_add_v4l2_capture(0, &capture_data[0]); + imx6q_add_v4l2_capture(1, &capture_data[1]); imx6q_add_mipi_csi2(&mipi_csi2_pdata); imx6q_add_imx_snvs_rtc(); diff --git a/arch/arm/mach-mx6/board-mx6q_sabresd.c b/arch/arm/mach-mx6/board-mx6q_sabresd.c index 94d7cb7ef16b..f8263f880706 100644 --- a/arch/arm/mach-mx6/board-mx6q_sabresd.c +++ b/arch/arm/mach-mx6/board-mx6q_sabresd.c @@ -510,6 +510,7 @@ static void mx6q_csi0_io_init(void) static struct fsl_mxc_camera_platform_data camera_data = { .mclk = 22000000, + .mclk_source = 0, .csi = 0, .io_init = mx6q_csi0_io_init, .pwdn = mx6q_csi0_cam_powerdown, @@ -542,16 +543,15 @@ static void mx6q_mipi_sensor_io_init(void) msleep(1); gpio_set_value(SABRESD_MIPICSI_PWN, 0); - if (cpu_is_mx6q()) - mxc_iomux_set_gpr_register(1, 19, 1, 0); - if (cpu_is_mx6dl()) { - mxc_iomux_set_gpr_register(13, 0, 3, 0); - } + /*for mx6dl, mipi virtual channel 1 connect to csi 1*/ + if (cpu_is_mx6dl()) + mxc_iomux_set_gpr_register(13, 3, 3, 1); } static struct fsl_mxc_camera_platform_data mipi_csi2_data = { .mclk = 24000000, - .csi = 0, + .mclk_source = 0, + .csi = 1, .io_init = mx6q_mipi_sensor_io_init, .pwdn = mx6q_mipi_powerdown, }; @@ -1301,6 +1301,21 @@ static struct imx_ipuv3_platform_data ipu_data[] = { }, }; +static struct fsl_mxc_capture_platform_data capture_data[] = { + { + .csi = 0, + .ipu = 0, + .mclk_source = 0, + .is_mipi = 0, + }, { + .csi = 1, + .ipu = 0, + .mclk_source = 0, + .is_mipi = 1, + }, +}; + + static void sabresd_suspend_enter(void) { /* suspend preparation */ @@ -1530,7 +1545,7 @@ static void __init fixup_mxc_board(struct machine_desc *desc, struct tag *tags, static struct mipi_csi2_platform_data mipi_csi2_pdata = { .ipu_id = 0, - .csi_id = 0, + .csi_id = 1, .v_channel = 0, .lanes = 2, .dphy_clk = "mipi_pllref_clk", @@ -1629,7 +1644,8 @@ static void __init mx6_sabresd_board_init(void) imx6q_add_lcdif(&lcdif_data); imx6q_add_ldb(&ldb_data); imx6q_add_v4l2_output(0); - imx6q_add_v4l2_capture(0); + imx6q_add_v4l2_capture(0, &capture_data[0]); + imx6q_add_v4l2_capture(1, &capture_data[1]); imx6q_add_mipi_csi2(&mipi_csi2_pdata); imx6q_add_imx_snvs_rtc(); diff --git a/arch/arm/mach-mx6/devices-imx6q.h b/arch/arm/mach-mx6/devices-imx6q.h index 95686a0e19a8..ae72fa10b6e1 100644 --- a/arch/arm/mach-mx6/devices-imx6q.h +++ b/arch/arm/mach-mx6/devices-imx6q.h @@ -123,9 +123,9 @@ extern const struct imx_ldb_data imx6q_ldb_data __initconst; platform_device_register_resndata(NULL, "mxc_v4l2_output",\ id, NULL, 0, NULL, 0); -#define imx6q_add_v4l2_capture(id) \ +#define imx6q_add_v4l2_capture(id, pdata) \ platform_device_register_resndata(NULL, "mxc_v4l2_capture",\ - id, NULL, 0, NULL, 0); + id, NULL, 0, pdata, sizeof(*pdata)); extern const struct imx_mxc_hdmi_data imx6q_mxc_hdmi_data __initconst; #define imx6q_add_mxc_hdmi(pdata) \