Re: [PATCH v3 07/10] arm: omap4430sdp: Add support for omap4iss camera
Hi Sakari, On Sun, May 13, 2012 at 7:24 PM, Sakari Ailus sakari.ai...@iki.fi wrote: Hi Sergio, On Thu, May 03, 2012 at 10:20:47PM -0500, Aguirre, Sergio wrote: Hi Sakari, On Thu, May 3, 2012 at 7:03 AM, Aguirre, Sergio saagui...@ti.com wrote: Hi Sakari, Thanks for reviewing. On Wed, May 2, 2012 at 2:47 PM, Sakari Ailus sakari.ai...@iki.fi wrote: Hi Sergio, Thanks for the patches!! On Wed, May 02, 2012 at 10:15:46AM -0500, Sergio Aguirre wrote: ... +static int sdp4430_ov_cam1_power(struct v4l2_subdev *subdev, int on) +{ + struct device *dev = subdev-v4l2_dev-dev; + int ret; + + if (on) { + if (!regulator_is_enabled(sdp4430_cam2pwr_reg)) { + ret = regulator_enable(sdp4430_cam2pwr_reg); + if (ret) { + dev_err(dev, + Error in enabling sensor power regulator 'cam2pwr'\n); + return ret; + } + + msleep(50); + } + + gpio_set_value(OMAP4430SDP_GPIO_CAM_PDN_B, 1); + msleep(10); + ret = clk_enable(sdp4430_cam1_aux_clk); /* Enable XCLK */ + if (ret) { + dev_err(dev, + Error in clk_enable() in %s(%d)\n, + __func__, on); + gpio_set_value(OMAP4430SDP_GPIO_CAM_PDN_B, 0); + return ret; + } + msleep(10); + } else { + clk_disable(sdp4430_cam1_aux_clk); + msleep(1); + gpio_set_value(OMAP4430SDP_GPIO_CAM_PDN_B, 0); + if (regulator_is_enabled(sdp4430_cam2pwr_reg)) { + ret = regulator_disable(sdp4430_cam2pwr_reg); + if (ret) { + dev_err(dev, + Error in disabling sensor power regulator 'cam2pwr'\n); + return ret; + } + } + } + + return 0; +} Isn't this something that should be part of the sensor driver? There's nothing in the above code that would be board specific, except the names of the clocks, regulators and GPIOs. The sensor driver could hold the names instead; this would be also compatible with the device tree. Agreed. I see what you mean... I'll take care of that. Can you please check out these patches? 1. http://gitorious.org/omap4-v4l2-camera/omap4-v4l2-camera/commit/cb6c10d58053180364461e6bc8d30d1ec87e6e22 Ideally we should really get rid of the board code callbacks. What do you need to do there? Well, in a OMAP44xx Blaze: http://svtronics.com/products/27-blaze-mdp The CSI2-A interface has 2 possible sensor inputs: - Sony IMX060 12 MP - OmniVision OV5650 5MP Which are muxed with a High speed differential selector. (Analog devices part: ADG936, found here: http://www.analog.com/static/imported-files/data_sheets/ADG936_936R.pdf) And to make it more fun, you switch that with a GPIO in an Audio IC (TWL6040) ! Quite a mess, but leaves me with few options, so that's why I need that to be board specific, and that by providing these function that can be used to take care of such creative designs :P Have better ideas? 2. http://gitorious.org/omap4-v4l2-camera/omap4-v4l2-camera/commit/6732e0db25c6647b34ef8f01c244a49a1fd6b45d Isn't reset voltage level (high or low) a property of the sensor rather than the board? Well, I know sometimes the people who typically design the hardware can be quite inventive. ;) Unfortunately, that's exactly the case! Again, in this creative design in Blaze platform I mentioned above, they also have a level inverter just before the RESET pin in the sensor. So that makes it active high, from the GPIO driver point of view :/ Not sure if there's a better way of handling this... Thanks for the comments! Regards, Sergio 3. http://gitorious.org/omap4-v4l2-camera/omap4-v4l2-camera/commit/d61c4e3142dc9cae972f9128fe73d986838c0ca1 4. http://gitorious.org/omap4-v4l2-camera/omap4-v4l2-camera/commit/e83f36001c7f7cbe184ad094d9b0c95c39e5028f Cheers, -- Sakari Ailus e-mail: sakari.ai...@iki.fi jabber/XMPP/Gmail: sai...@retiisi.org.uk -- To unsubscribe from this list: send the line unsubscribe linux-media in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line unsubscribe linux-omap in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v3 07/10] arm: omap4430sdp: Add support for omap4iss camera
Hi Sergio, On Thu, May 03, 2012 at 10:20:47PM -0500, Aguirre, Sergio wrote: Hi Sakari, On Thu, May 3, 2012 at 7:03 AM, Aguirre, Sergio saagui...@ti.com wrote: Hi Sakari, Thanks for reviewing. On Wed, May 2, 2012 at 2:47 PM, Sakari Ailus sakari.ai...@iki.fi wrote: Hi Sergio, Thanks for the patches!! On Wed, May 02, 2012 at 10:15:46AM -0500, Sergio Aguirre wrote: ... +static int sdp4430_ov_cam1_power(struct v4l2_subdev *subdev, int on) +{ + struct device *dev = subdev-v4l2_dev-dev; + int ret; + + if (on) { + if (!regulator_is_enabled(sdp4430_cam2pwr_reg)) { + ret = regulator_enable(sdp4430_cam2pwr_reg); + if (ret) { + dev_err(dev, + Error in enabling sensor power regulator 'cam2pwr'\n); + return ret; + } + + msleep(50); + } + + gpio_set_value(OMAP4430SDP_GPIO_CAM_PDN_B, 1); + msleep(10); + ret = clk_enable(sdp4430_cam1_aux_clk); /* Enable XCLK */ + if (ret) { + dev_err(dev, + Error in clk_enable() in %s(%d)\n, + __func__, on); + gpio_set_value(OMAP4430SDP_GPIO_CAM_PDN_B, 0); + return ret; + } + msleep(10); + } else { + clk_disable(sdp4430_cam1_aux_clk); + msleep(1); + gpio_set_value(OMAP4430SDP_GPIO_CAM_PDN_B, 0); + if (regulator_is_enabled(sdp4430_cam2pwr_reg)) { + ret = regulator_disable(sdp4430_cam2pwr_reg); + if (ret) { + dev_err(dev, + Error in disabling sensor power regulator 'cam2pwr'\n); + return ret; + } + } + } + + return 0; +} Isn't this something that should be part of the sensor driver? There's nothing in the above code that would be board specific, except the names of the clocks, regulators and GPIOs. The sensor driver could hold the names instead; this would be also compatible with the device tree. Agreed. I see what you mean... I'll take care of that. Can you please check out these patches? 1. http://gitorious.org/omap4-v4l2-camera/omap4-v4l2-camera/commit/cb6c10d58053180364461e6bc8d30d1ec87e6e22 Ideally we should really get rid of the board code callbacks. What do you need to do there? 2. http://gitorious.org/omap4-v4l2-camera/omap4-v4l2-camera/commit/6732e0db25c6647b34ef8f01c244a49a1fd6b45d Isn't reset voltage level (high or low) a property of the sensor rather than the board? Well, I know sometimes the people who typically design the hardware can be quite inventive. ;) 3. http://gitorious.org/omap4-v4l2-camera/omap4-v4l2-camera/commit/d61c4e3142dc9cae972f9128fe73d986838c0ca1 4. http://gitorious.org/omap4-v4l2-camera/omap4-v4l2-camera/commit/e83f36001c7f7cbe184ad094d9b0c95c39e5028f Cheers, -- Sakari Ailus e-mail: sakari.ai...@iki.fi jabber/XMPP/Gmail: sai...@retiisi.org.uk -- To unsubscribe from this list: send the line unsubscribe linux-omap in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v3 07/10] arm: omap4430sdp: Add support for omap4iss camera
Hi Sakari, Thanks for reviewing. On Wed, May 2, 2012 at 2:47 PM, Sakari Ailus sakari.ai...@iki.fi wrote: Hi Sergio, Thanks for the patches!! On Wed, May 02, 2012 at 10:15:46AM -0500, Sergio Aguirre wrote: ... +static int sdp4430_ov_cam1_power(struct v4l2_subdev *subdev, int on) +{ + struct device *dev = subdev-v4l2_dev-dev; + int ret; + + if (on) { + if (!regulator_is_enabled(sdp4430_cam2pwr_reg)) { + ret = regulator_enable(sdp4430_cam2pwr_reg); + if (ret) { + dev_err(dev, + Error in enabling sensor power regulator 'cam2pwr'\n); + return ret; + } + + msleep(50); + } + + gpio_set_value(OMAP4430SDP_GPIO_CAM_PDN_B, 1); + msleep(10); + ret = clk_enable(sdp4430_cam1_aux_clk); /* Enable XCLK */ + if (ret) { + dev_err(dev, + Error in clk_enable() in %s(%d)\n, + __func__, on); + gpio_set_value(OMAP4430SDP_GPIO_CAM_PDN_B, 0); + return ret; + } + msleep(10); + } else { + clk_disable(sdp4430_cam1_aux_clk); + msleep(1); + gpio_set_value(OMAP4430SDP_GPIO_CAM_PDN_B, 0); + if (regulator_is_enabled(sdp4430_cam2pwr_reg)) { + ret = regulator_disable(sdp4430_cam2pwr_reg); + if (ret) { + dev_err(dev, + Error in disabling sensor power regulator 'cam2pwr'\n); + return ret; + } + } + } + + return 0; +} Isn't this something that should be part of the sensor driver? There's nothing in the above code that would be board specific, except the names of the clocks, regulators and GPIOs. The sensor driver could hold the names instead; this would be also compatible with the device tree. Agreed. I see what you mean... I'll take care of that. It should be possible to have s_power() callback NULL, too. +static int sdp4430_ov_cam2_power(struct v4l2_subdev *subdev, int on) +{ + struct device *dev = subdev-v4l2_dev-dev; + int ret; + + if (on) { + u8 gpoctl = 0; + + ret = regulator_enable(sdp4430_cam2pwr_reg); + if (ret) { + dev_err(dev, + Error in enabling sensor power regulator 'cam2pwr'\n); + return ret; + } + + msleep(50); + + if (twl_i2c_read_u8(TWL_MODULE_AUDIO_VOICE, gpoctl, + TWL6040_REG_GPOCTL)) + return -ENODEV; + if (twl_i2c_write_u8(TWL_MODULE_AUDIO_VOICE, + gpoctl | TWL6040_GPO3, + TWL6040_REG_GPOCTL)) + return -ENODEV; The above piece of code looks quite interesting. What does it do? Well, this is because the camera adapter board in 4430SDP has 3 sensors actually: - 1 Sony IMX060 12.1 MP sensor - 2 OmniVision OV5650 sensors And there's 3 wideband analog switches, like this: http://www.analog.com/static/imported-files/data_sheets/ADG936_936R.pdf That basically select either IMX060 or OV5650 for CSI2A input. So, this commands are because the TWL6040 chip has a GPO pin to toggle this, instead of an OMAP GPIO (Don't ask me why :) ) Anyways... I see your point, maybe this should be explained better through a comment. Regards, Sergio Kind regards, -- Sakari Ailus e-mail: sakari.ai...@iki.fi jabber/XMPP/Gmail: sai...@retiisi.org.uk -- To unsubscribe from this list: send the line unsubscribe linux-omap in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v3 07/10] arm: omap4430sdp: Add support for omap4iss camera
Hi Sakari, On Thu, May 3, 2012 at 7:03 AM, Aguirre, Sergio saagui...@ti.com wrote: Hi Sakari, Thanks for reviewing. On Wed, May 2, 2012 at 2:47 PM, Sakari Ailus sakari.ai...@iki.fi wrote: Hi Sergio, Thanks for the patches!! On Wed, May 02, 2012 at 10:15:46AM -0500, Sergio Aguirre wrote: ... +static int sdp4430_ov_cam1_power(struct v4l2_subdev *subdev, int on) +{ + struct device *dev = subdev-v4l2_dev-dev; + int ret; + + if (on) { + if (!regulator_is_enabled(sdp4430_cam2pwr_reg)) { + ret = regulator_enable(sdp4430_cam2pwr_reg); + if (ret) { + dev_err(dev, + Error in enabling sensor power regulator 'cam2pwr'\n); + return ret; + } + + msleep(50); + } + + gpio_set_value(OMAP4430SDP_GPIO_CAM_PDN_B, 1); + msleep(10); + ret = clk_enable(sdp4430_cam1_aux_clk); /* Enable XCLK */ + if (ret) { + dev_err(dev, + Error in clk_enable() in %s(%d)\n, + __func__, on); + gpio_set_value(OMAP4430SDP_GPIO_CAM_PDN_B, 0); + return ret; + } + msleep(10); + } else { + clk_disable(sdp4430_cam1_aux_clk); + msleep(1); + gpio_set_value(OMAP4430SDP_GPIO_CAM_PDN_B, 0); + if (regulator_is_enabled(sdp4430_cam2pwr_reg)) { + ret = regulator_disable(sdp4430_cam2pwr_reg); + if (ret) { + dev_err(dev, + Error in disabling sensor power regulator 'cam2pwr'\n); + return ret; + } + } + } + + return 0; +} Isn't this something that should be part of the sensor driver? There's nothing in the above code that would be board specific, except the names of the clocks, regulators and GPIOs. The sensor driver could hold the names instead; this would be also compatible with the device tree. Agreed. I see what you mean... I'll take care of that. Can you please check out these patches? 1. http://gitorious.org/omap4-v4l2-camera/omap4-v4l2-camera/commit/cb6c10d58053180364461e6bc8d30d1ec87e6e22 2. http://gitorious.org/omap4-v4l2-camera/omap4-v4l2-camera/commit/6732e0db25c6647b34ef8f01c244a49a1fd6b45d 3. http://gitorious.org/omap4-v4l2-camera/omap4-v4l2-camera/commit/d61c4e3142dc9cae972f9128fe73d986838c0ca1 4. http://gitorious.org/omap4-v4l2-camera/omap4-v4l2-camera/commit/e83f36001c7f7cbe184ad094d9b0c95c39e5028f I want to see if I got your point properly... Regards, Sergio It should be possible to have s_power() callback NULL, too. +static int sdp4430_ov_cam2_power(struct v4l2_subdev *subdev, int on) +{ + struct device *dev = subdev-v4l2_dev-dev; + int ret; + + if (on) { + u8 gpoctl = 0; + + ret = regulator_enable(sdp4430_cam2pwr_reg); + if (ret) { + dev_err(dev, + Error in enabling sensor power regulator 'cam2pwr'\n); + return ret; + } + + msleep(50); + + if (twl_i2c_read_u8(TWL_MODULE_AUDIO_VOICE, gpoctl, + TWL6040_REG_GPOCTL)) + return -ENODEV; + if (twl_i2c_write_u8(TWL_MODULE_AUDIO_VOICE, + gpoctl | TWL6040_GPO3, + TWL6040_REG_GPOCTL)) + return -ENODEV; The above piece of code looks quite interesting. What does it do? Well, this is because the camera adapter board in 4430SDP has 3 sensors actually: - 1 Sony IMX060 12.1 MP sensor - 2 OmniVision OV5650 sensors And there's 3 wideband analog switches, like this: http://www.analog.com/static/imported-files/data_sheets/ADG936_936R.pdf That basically select either IMX060 or OV5650 for CSI2A input. So, this commands are because the TWL6040 chip has a GPO pin to toggle this, instead of an OMAP GPIO (Don't ask me why :) ) Anyways... I see your point, maybe this should be explained better through a comment. Regards, Sergio Kind regards, -- Sakari Ailus e-mail: sakari.ai...@iki.fi jabber/XMPP/Gmail: sai...@retiisi.org.uk -- To unsubscribe from this list: send the line unsubscribe linux-omap in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH v3 07/10] arm: omap4430sdp: Add support for omap4iss camera
This adds support for camera interface with the support for following sensors: - OV5640 - OV5650 Signed-off-by: Sergio Aguirre saagui...@ti.com --- arch/arm/mach-omap2/Kconfig| 16 + arch/arm/mach-omap2/Makefile |2 + arch/arm/mach-omap2/board-4430sdp-camera.c | 415 arch/arm/mach-omap2/board-4430sdp.c| 20 ++ 4 files changed, 453 insertions(+), 0 deletions(-) create mode 100644 arch/arm/mach-omap2/board-4430sdp-camera.c diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig index 8141b76..54645aa 100644 --- a/arch/arm/mach-omap2/Kconfig +++ b/arch/arm/mach-omap2/Kconfig @@ -335,6 +335,22 @@ config MACH_OMAP_4430SDP select OMAP_PACKAGE_CBS select REGULATOR_FIXED_VOLTAGE if REGULATOR +config MACH_OMAP_4430SDP_CAMERA_SUPPORT + bool OMAP 4430 SDP board Camera support + depends on MACH_OMAP_4430SDP + select MEDIA_SUPPORT + select MEDIA_CONTROLLER + select VIDEO_DEV + select VIDEO_V4L2_SUBDEV_API + select V4L_PLATFORM_DRIVERS + select VIDEO_OMAP4 + select VIDEO_OV5640 + select VIDEO_OV5650 + help + Enable Camera HW support for OMAP 4430 SDP board + This is for using the OMAP4 ISS CSI2A Camera sensor + interface. + config MACH_OMAP4_PANDA bool OMAP4 Panda Board default y diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index 49f92bc..ebd8f63 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile @@ -239,6 +239,8 @@ obj-$(CONFIG_MACH_TI8148EVM)+= board-ti8168evm.o # Platform specific device init code +obj-$(CONFIG_MACH_OMAP_4430SDP_CAMERA_SUPPORT) += board-4430sdp-camera.o + omap-flash-$(CONFIG_MTD_NAND_OMAP2):= board-flash.o omap-flash-$(CONFIG_MTD_ONENAND_OMAP2) := board-flash.o obj-y += $(omap-flash-y) $(omap-flash-m) diff --git a/arch/arm/mach-omap2/board-4430sdp-camera.c b/arch/arm/mach-omap2/board-4430sdp-camera.c new file mode 100644 index 000..9a8881f --- /dev/null +++ b/arch/arm/mach-omap2/board-4430sdp-camera.c @@ -0,0 +1,415 @@ +#include linux/gpio.h +#include linux/clk.h +#include linux/delay.h +#include linux/i2c/twl.h +#include linux/mfd/twl6040.h +#include linux/regulator/consumer.h + +#include plat/i2c.h +#include plat/omap-pm.h + +#include asm/mach-types.h + +#include media/ov5640.h +#include media/ov5650.h + +#include devices.h +#include ../../../drivers/media/video/omap4iss/iss.h + +#include control.h +#include mux.h + +#define OMAP4430SDP_GPIO_CAM_PDN_B 38 +#define OMAP4430SDP_GPIO_CAM_PDN_C 39 + +static struct clk *sdp4430_cam1_aux_clk; +static struct clk *sdp4430_cam2_aux_clk; +static struct regulator *sdp4430_cam2pwr_reg; + +static int sdp4430_ov_cam1_power(struct v4l2_subdev *subdev, int on) +{ + struct device *dev = subdev-v4l2_dev-dev; + int ret; + + if (on) { + if (!regulator_is_enabled(sdp4430_cam2pwr_reg)) { + ret = regulator_enable(sdp4430_cam2pwr_reg); + if (ret) { + dev_err(dev, + Error in enabling sensor power regulator 'cam2pwr'\n); + return ret; + } + + msleep(50); + } + + gpio_set_value(OMAP4430SDP_GPIO_CAM_PDN_B, 1); + msleep(10); + ret = clk_enable(sdp4430_cam1_aux_clk); /* Enable XCLK */ + if (ret) { + dev_err(dev, + Error in clk_enable() in %s(%d)\n, + __func__, on); + gpio_set_value(OMAP4430SDP_GPIO_CAM_PDN_B, 0); + return ret; + } + msleep(10); + } else { + clk_disable(sdp4430_cam1_aux_clk); + msleep(1); + gpio_set_value(OMAP4430SDP_GPIO_CAM_PDN_B, 0); + if (regulator_is_enabled(sdp4430_cam2pwr_reg)) { + ret = regulator_disable(sdp4430_cam2pwr_reg); + if (ret) { + dev_err(dev, + Error in disabling sensor power regulator 'cam2pwr'\n); + return ret; + } + } + } + + return 0; +} + +static int sdp4430_ov_cam2_power(struct v4l2_subdev *subdev, int on) +{ + struct device *dev = subdev-v4l2_dev-dev; + int ret; + + if (on) { + u8 gpoctl = 0; + + ret = regulator_enable(sdp4430_cam2pwr_reg); + if (ret) { + dev_err(dev, + Error in enabling sensor power regulator 'cam2pwr'\n); + return ret; + } + +
Re: [PATCH v3 07/10] arm: omap4430sdp: Add support for omap4iss camera
Hi Sergio, Thanks for the patches!! On Wed, May 02, 2012 at 10:15:46AM -0500, Sergio Aguirre wrote: ... +static int sdp4430_ov_cam1_power(struct v4l2_subdev *subdev, int on) +{ + struct device *dev = subdev-v4l2_dev-dev; + int ret; + + if (on) { + if (!regulator_is_enabled(sdp4430_cam2pwr_reg)) { + ret = regulator_enable(sdp4430_cam2pwr_reg); + if (ret) { + dev_err(dev, + Error in enabling sensor power regulator 'cam2pwr'\n); + return ret; + } + + msleep(50); + } + + gpio_set_value(OMAP4430SDP_GPIO_CAM_PDN_B, 1); + msleep(10); + ret = clk_enable(sdp4430_cam1_aux_clk); /* Enable XCLK */ + if (ret) { + dev_err(dev, + Error in clk_enable() in %s(%d)\n, + __func__, on); + gpio_set_value(OMAP4430SDP_GPIO_CAM_PDN_B, 0); + return ret; + } + msleep(10); + } else { + clk_disable(sdp4430_cam1_aux_clk); + msleep(1); + gpio_set_value(OMAP4430SDP_GPIO_CAM_PDN_B, 0); + if (regulator_is_enabled(sdp4430_cam2pwr_reg)) { + ret = regulator_disable(sdp4430_cam2pwr_reg); + if (ret) { + dev_err(dev, + Error in disabling sensor power regulator 'cam2pwr'\n); + return ret; + } + } + } + + return 0; +} Isn't this something that should be part of the sensor driver? There's nothing in the above code that would be board specific, except the names of the clocks, regulators and GPIOs. The sensor driver could hold the names instead; this would be also compatible with the device tree. It should be possible to have s_power() callback NULL, too. +static int sdp4430_ov_cam2_power(struct v4l2_subdev *subdev, int on) +{ + struct device *dev = subdev-v4l2_dev-dev; + int ret; + + if (on) { + u8 gpoctl = 0; + + ret = regulator_enable(sdp4430_cam2pwr_reg); + if (ret) { + dev_err(dev, + Error in enabling sensor power regulator 'cam2pwr'\n); + return ret; + } + + msleep(50); + + if (twl_i2c_read_u8(TWL_MODULE_AUDIO_VOICE, gpoctl, + TWL6040_REG_GPOCTL)) + return -ENODEV; + if (twl_i2c_write_u8(TWL_MODULE_AUDIO_VOICE, + gpoctl | TWL6040_GPO3, + TWL6040_REG_GPOCTL)) + return -ENODEV; The above piece of code looks quite interesting. What does it do? Kind regards, -- Sakari Ailus e-mail: sakari.ai...@iki.fi jabber/XMPP/Gmail: sai...@retiisi.org.uk -- To unsubscribe from this list: send the line unsubscribe linux-omap in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html