From 9c890993a9b1d0b7a49acbf69b4606ab91409b31 Mon Sep 17 00:00:00 2001 From: Patrick Jakob Date: Thu, 15 Sep 2016 15:37:45 +0200 Subject: [PATCH 1/2] Improve armstonea9r2 DT audio sgtl5000 clock Improve the clock chain of the sgtl 5000 codec. Until now the clock for the sgtl5000 (cko1) and the clock of the mipi camera have the same clock frequence because the output frequence were on cko1 and cko2. So if you change the sgtl5000 clock you automatically change the mipi clock too because they depend on each other. Now you can change the clock of the sgtl5000 independent from the mipi clock. --- arch/arm/boot/dts/armstonea9r2qdl.dtsi | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/arch/arm/boot/dts/armstonea9r2qdl.dtsi b/arch/arm/boot/dts/armstonea9r2qdl.dtsi index c7c8fb4..c6628d8 100755 --- a/arch/arm/boot/dts/armstonea9r2qdl.dtsi +++ b/arch/arm/boot/dts/armstonea9r2qdl.dtsi @@ -425,18 +425,16 @@ &clks { assigned-clocks = <&clks IMX6QDL_CLK_PLL4_AUDIO_DIV>, - <&clks IMX6QDL_CLK_SSI1_SEL>, - <&clks IMX6QDL_CLK_SSI1>, - <&clks IMX6QDL_CLK_CKO2_SEL>, + <&clks IMX6QDL_CLK_CKO1_SEL>, + <&clks IMX6QDL_CLK_CKO1_PODF>, <&clks IMX6QDL_CLK_CKO>; assigned-clock-parents = <0>, <&clks IMX6QDL_CLK_PLL4_AUDIO_DIV>, <0>, - <&clks IMX6QDL_CLK_SSI1>, - <&clks IMX6QDL_CLK_CKO2>; -//### assigned-clock-rates = <786432000>, <0>, <24576000>; - assigned-clock-rates = <786432000>, <0>, <12288000>; + <&clks IMX6QDL_CLK_CKO1>; + + assigned-clock-rates = <98304000>, <98304000>, <12288000>; }; #ifdef CONFIG_ARMSTONEA9R2_SPI_FLASH -- 2.1.0 From 0cc20662ad8653b05e9f2cd1320c0239a59b4d12 Mon Sep 17 00:00:00 2001 From: Patrick Jakob Date: Fri, 16 Sep 2016 10:08:55 +0200 Subject: [PATCH 2/2] Improve armstonea9r2 dt and driver for mipi camera Device Tree changes: - Set the correct pin mux settings for the camera pwdn and clock. - remove all #if0 for the mipi configuration in device tree. Comment out the reset-gpios because with our adapter the reset will be automatically generated and we dont need a gpio for it. Mipi driver change: - The mipi driver expected a reset gpio if we dont have one the driver probe fails. On our adapter the reset of the camera will be automatically created so the driver doesnt perform the reset. We improved the driver that it can handle if no reset gpio is declared. --- arch/arm/boot/dts/armstonea9r2qdl.dtsi | 17 ++++++++++------- drivers/media/platform/mxc/capture/ov5640_mipi.c | 16 +++++++++++----- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/arch/arm/boot/dts/armstonea9r2qdl.dtsi b/arch/arm/boot/dts/armstonea9r2qdl.dtsi index c6628d8..1866f3b 100755 --- a/arch/arm/boot/dts/armstonea9r2qdl.dtsi +++ b/arch/arm/boot/dts/armstonea9r2qdl.dtsi @@ -582,7 +582,7 @@ }; #endif -#if 0 + /* If you want to use mipi camera you have to check the clock because cko2 * is used by sgtl5000 audio driver so you have to change the &clk node to * ck01. Therefore you have to set PLL_AUDIO, CCM_ANALOG_MISC2n[MSB:LSB] */ @@ -598,14 +598,15 @@ rev B board is VGEN5 */ DVDD-supply = <®_camera_dvdd>; /* 1.5v*/ pwn-gpios = <&gpio5 24 GPIO_ACTIVE_HIGH>; - /* not available */ - rst-gpios = <&gpio5 23 GPIO_ACTIVE_LOW>; + /* With our camera adapter we dont need a reset pin because the + * reset will be automatically generated on our adapter. Other + * cameras maybe need a gpio to perform a reset. */ + /* rst-gpios = ; */ csi_id = <1>; mclk = <24000000>; mclk_source = <0>; }; #endif /* CONFIG_ARMSTONEA9R2_SERIAL_CAMERA */ -#endif }; #endif /* CONFIG_ARMSTONEA9R2_I2C_C */ @@ -718,7 +719,7 @@ }; #endif -#if 0 + #ifdef CONFIG_ARMSTONEA9R2_SERIAL_CAMERA &mipi_csi { status = "okay"; @@ -728,7 +729,7 @@ lanes = <2>; }; #endif -#endif + #ifdef CONFIG_ARMSTONEA9R2_SGTL5000_AUDIO &ssi1 { @@ -963,8 +964,10 @@ /* Audio clock 24MHz */ MX6QDL_PAD_GPIO_0__CCM_CLKO1 0x130b0 + /* Camera clock, ref. ov564x_mipi */ - //MX6QDL_PAD_NANDF_CS2__CCM_CLKO2 0x130b0 + MX6QDL_PAD_NANDF_CS2__CCM_CLKO2 0x130b0 + MX6QDL_PAD_CSI0_DAT6__GPIO5_IO24 0x17059 /* VLCD_ON and 5V_3V3 (external Pull Up) * for reg_vlcd */ diff --git a/drivers/media/platform/mxc/capture/ov5640_mipi.c b/drivers/media/platform/mxc/capture/ov5640_mipi.c index 0d146b5..4b571c5 100644 --- a/drivers/media/platform/mxc/capture/ov5640_mipi.c +++ b/drivers/media/platform/mxc/capture/ov5640_mipi.c @@ -691,6 +691,9 @@ static void ov5640_standby(s32 enable) static void ov5640_reset(void) { + if (rst_gpio < 0 || pwn_gpio < 0) + return; + /* camera reset */ gpio_set_value(rst_gpio, 1); @@ -1997,12 +2000,15 @@ static int ov5640_probe(struct i2c_client *client, rst_gpio = of_get_named_gpio(dev->of_node, "rst-gpios", 0); if (!gpio_is_valid(rst_gpio)) { dev_warn(dev, "no sensor reset pin available"); - return -EINVAL; - } - retval = devm_gpio_request_one(dev, rst_gpio, GPIOF_OUT_INIT_HIGH, + rst_gpio = -1; + } else { + retval = devm_gpio_request_one(dev, rst_gpio, GPIOF_OUT_INIT_HIGH, "ov5640_mipi_reset"); - if (retval < 0) - return retval; + if (retval < 0) { + dev_warn(dev, "Failed to set reset pin\n"); + return retval; + } + } /* Set initial values for the sensor struct. */ memset(&ov5640_data, 0, sizeof(ov5640_data)); -- 2.1.0