From 06fbaa35d53dcba3b8ebccebc86710131f3eff3b Mon Sep 17 00:00:00 2001 From: Even Xu Date: Wed, 30 Nov 2011 09:33:09 +0800 Subject: [PATCH] ENGR00163497-2 MX6Q: Add io_init for mipi sensor and camera sensor 1. Add io_init function for mipi sensor and camera sensor. 2. Remove "mipi_sensor" cmd line Signed-off-by: Even Xu --- arch/arm/mach-mx6/board-mx6q_arm2.c | 107 ++++++++++++++++------------ 1 file changed, 60 insertions(+), 47 deletions(-) diff --git a/arch/arm/mach-mx6/board-mx6q_arm2.c b/arch/arm/mach-mx6/board-mx6q_arm2.c index 6af5dc31ffd9..8adf623e74eb 100644 --- a/arch/arm/mach-mx6/board-mx6q_arm2.c +++ b/arch/arm/mach-mx6/board-mx6q_arm2.c @@ -111,7 +111,6 @@ static struct clk *sata_clk; static int esai_record; static int spdif_en; static int flexcan_en; -static int mipi_sensor; extern struct regulator *(*get_cpu_regulator)(void); extern void (*put_cpu_regulator)(void); @@ -257,23 +256,6 @@ static iomux_v3_cfg_t mx6q_arm2_pads[] = { MX6Q_PAD_DISP0_DAT22__IPU1_DISP0_DAT_22, MX6Q_PAD_DISP0_DAT23__IPU1_DISP0_DAT_23, - /* ipu1 csi0 */ - MX6Q_PAD_CSI0_DAT12__IPU1_CSI0_D_12, - MX6Q_PAD_CSI0_DAT13__IPU1_CSI0_D_13, - MX6Q_PAD_CSI0_DAT14__IPU1_CSI0_D_14, - MX6Q_PAD_CSI0_DAT15__IPU1_CSI0_D_15, - MX6Q_PAD_CSI0_DAT16__IPU1_CSI0_D_16, - MX6Q_PAD_CSI0_DAT17__IPU1_CSI0_D_17, - MX6Q_PAD_CSI0_DAT18__IPU1_CSI0_D_18, - MX6Q_PAD_CSI0_DAT19__IPU1_CSI0_D_19, - MX6Q_PAD_CSI0_VSYNC__IPU1_CSI0_VSYNC, - MX6Q_PAD_CSI0_MCLK__IPU1_CSI0_HSYNC, - MX6Q_PAD_CSI0_PIXCLK__IPU1_CSI0_PIXCLK, - /* camera reset */ - MX6Q_PAD_GPIO_19__GPIO_4_5, - /* camera powerdown */ - MX6Q_PAD_CSI0_DAT5__GPIO_5_23, - MX6Q_PAD_EIM_D24__GPIO_3_24, /* UART2 */ @@ -330,6 +312,26 @@ static iomux_v3_cfg_t mx6q_arm2_esai_record_pads[] = { MX6Q_PAD_ENET_REF_CLK__ESAI1_FSR, }; +static iomux_v3_cfg_t mx6q_arm2_csi0_sensor_pads[] = { + MX6Q_PAD_GPIO_0__CCM_CLKO, + /* ipu1 csi0 */ + MX6Q_PAD_CSI0_DAT12__IPU1_CSI0_D_12, + MX6Q_PAD_CSI0_DAT13__IPU1_CSI0_D_13, + MX6Q_PAD_CSI0_DAT14__IPU1_CSI0_D_14, + MX6Q_PAD_CSI0_DAT15__IPU1_CSI0_D_15, + MX6Q_PAD_CSI0_DAT16__IPU1_CSI0_D_16, + MX6Q_PAD_CSI0_DAT17__IPU1_CSI0_D_17, + MX6Q_PAD_CSI0_DAT18__IPU1_CSI0_D_18, + MX6Q_PAD_CSI0_DAT19__IPU1_CSI0_D_19, + MX6Q_PAD_CSI0_VSYNC__IPU1_CSI0_VSYNC, + MX6Q_PAD_CSI0_MCLK__IPU1_CSI0_HSYNC, + MX6Q_PAD_CSI0_PIXCLK__IPU1_CSI0_PIXCLK, + /* camera reset */ + MX6Q_PAD_GPIO_19__GPIO_4_5, + /* camera powerdown */ + MX6Q_PAD_CSI0_DAT5__GPIO_5_23, +}; + static iomux_v3_cfg_t mx6q_arm2_mipi_sensor_pads[] = { MX6Q_PAD_CSI0_MCLK__CCM_CLKO, }; @@ -666,19 +668,58 @@ static struct fsl_mxc_dvi_platform_data sabr_ddc_dvi_data = { .update = ddc_dvi_update, }; +static void mx6q_csi0_io_init(void) +{ + mxc_iomux_v3_setup_multiple_pads(mx6q_arm2_csi0_sensor_pads, + ARRAY_SIZE(mx6q_arm2_csi0_sensor_pads)); + + /* Camera reset */ + gpio_request(MX6Q_SMD_CSI0_RST, "cam-reset"); + gpio_direction_output(MX6Q_SMD_CSI0_RST, 1); + + /* Camera power down */ + gpio_request(MX6Q_SMD_CSI0_PWN, "cam-pwdn"); + gpio_direction_output(MX6Q_SMD_CSI0_PWN, 1); + msleep(1); + gpio_set_value(MX6Q_SMD_CSI0_PWN, 0); + + /* For MX6Q GPR1 bit19 and bit20 meaning: + * Bit19: 0 - Enable mipi to IPU1 CSI0 + * virtual channel is fixed to 0 + * 1 - Enable parallel interface to IPU1 CSI0 + * Bit20: 0 - Enable mipi to IPU2 CSI1 + * virtual channel is fixed to 3 + * 1 - Enable parallel interface to IPU2 CSI1 + * IPU1 CSI1 directly connect to mipi csi2, + * virtual channel is fixed to 1 + * IPU2 CSI0 directly connect to mipi csi2, + * virtual channel is fixed to 2 + */ + mxc_iomux_set_gpr_register(1, 19, 1, 1); +} + static struct fsl_mxc_camera_platform_data camera_data = { .analog_regulator = "DA9052_LDO7", .core_regulator = "DA9052_LDO9", .mclk = 24000000, .csi = 0, + .io_init = mx6q_csi0_io_init, }; +static void mx6q_mipi_sensor_io_init(void) +{ + mxc_iomux_v3_setup_multiple_pads(mx6q_arm2_mipi_sensor_pads, + ARRAY_SIZE(mx6q_arm2_mipi_sensor_pads)); + + mxc_iomux_set_gpr_register(1, 19, 1, 0); +} + static struct fsl_mxc_camera_platform_data ov5640_mipi_data = { .mclk = 24000000, .csi = 0, + .io_init = mx6q_mipi_sensor_io_init, }; - static struct i2c_board_info mxc_i2c0_board_info[] __initdata = { { I2C_BOARD_INFO("cs42888", 0x48), @@ -1340,27 +1381,6 @@ static void __init fixup_mxc_board(struct machine_desc *desc, struct tag *tags, set_cpu_voltage = mx6_arm2_set_cpu_voltage; } -static int __init early_enable_mipi_sensor(char *p) -{ - mipi_sensor = 1; - return 0; -} -early_param("mipi_sensor", early_enable_mipi_sensor); - -static inline void __init mx6q_csi0_io_init(void) -{ - /* Camera reset */ - gpio_request(MX6Q_SMD_CSI0_RST, "cam-reset"); - gpio_direction_output(MX6Q_SMD_CSI0_RST, 1); - - /* Camera power down */ - gpio_request(MX6Q_SMD_CSI0_PWN, "cam-pwdn"); - gpio_direction_output(MX6Q_SMD_CSI0_PWN, 1); - msleep(1); - gpio_set_value(MX6Q_SMD_CSI0_PWN, 0); - mxc_iomux_set_gpr_register(1, 19, 1, 1); -} - static int __init early_enable_spdif(char *p) { spdif_en = 1; @@ -1437,10 +1457,6 @@ static void __init mx6_board_init(void) ARRAY_SIZE(mx6q_arm2_can_pads)); } - if (mipi_sensor) - mxc_iomux_v3_setup_multiple_pads(mx6q_arm2_mipi_sensor_pads, - ARRAY_SIZE(mx6q_arm2_mipi_sensor_pads)); - gp_reg_id = arm2_dvfscore_data.reg_id; mx6q_arm2_init_uart(); imx6q_add_mipi_csi2(&mipi_csi2_pdata); @@ -1496,9 +1512,6 @@ static void __init mx6_board_init(void) imx_asrc_data.asrc_audio_clk = clk_get(NULL, "asrc_serial_clk"); imx6q_add_asrc(&imx_asrc_data); - if (!mipi_sensor) - mx6q_csi0_io_init(); - /* DISP0 Detect */ gpio_request(MX6Q_ARM2_DISP0_DET_INT, "disp0-detect"); gpio_direction_input(MX6Q_ARM2_DISP0_DET_INT); -- 2.39.5