aboutsummaryrefslogtreecommitdiffstats
path: root/recipes-kernel/linux/linux-omap-psp-2.6.32/cam/0006-omap3beagle-camera-Add-support-for-regulators.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes-kernel/linux/linux-omap-psp-2.6.32/cam/0006-omap3beagle-camera-Add-support-for-regulators.patch')
-rw-r--r--recipes-kernel/linux/linux-omap-psp-2.6.32/cam/0006-omap3beagle-camera-Add-support-for-regulators.patch238
1 files changed, 238 insertions, 0 deletions
diff --git a/recipes-kernel/linux/linux-omap-psp-2.6.32/cam/0006-omap3beagle-camera-Add-support-for-regulators.patch b/recipes-kernel/linux/linux-omap-psp-2.6.32/cam/0006-omap3beagle-camera-Add-support-for-regulators.patch
new file mode 100644
index 0000000000..1af46198f3
--- /dev/null
+++ b/recipes-kernel/linux/linux-omap-psp-2.6.32/cam/0006-omap3beagle-camera-Add-support-for-regulators.patch
@@ -0,0 +1,238 @@
+From a8bad5bfa652d2e35575f864da6192d41c85c818 Mon Sep 17 00:00:00 2001
+From: Sergio Aguirre <saaguirre@ti.com>
+Date: Fri, 11 Jun 2010 16:50:39 -0500
+Subject: [PATCH 06/75] omap3beagle: camera: Add support for regulators
+
+Signed-off-by: Sergio Aguirre <saaguirre@ti.com>
+---
+ arch/arm/mach-omap2/board-omap3beagle-camera.c | 92 +++++++++++++++++++++---
+ arch/arm/mach-omap2/board-omap3beagle.c | 53 ++++++++++++++
+ 2 files changed, 135 insertions(+), 10 deletions(-)
+
+diff --git a/arch/arm/mach-omap2/board-omap3beagle-camera.c b/arch/arm/mach-omap2/board-omap3beagle-camera.c
+index e93437f..af8581a 100644
+--- a/arch/arm/mach-omap2/board-omap3beagle-camera.c
++++ b/arch/arm/mach-omap2/board-omap3beagle-camera.c
+@@ -28,8 +28,9 @@
+ #include <linux/gpio.h>
+ #include <linux/mm.h>
+ #include <linux/videodev2.h>
+-#include <linux/i2c/twl.h>
++#include <linux/regulator/consumer.h>
+ #include <linux/delay.h>
++#include <linux/platform_device.h>
+
+ #include <plat/mux.h>
+ #include <plat/board.h>
+@@ -50,6 +51,11 @@
+
+ #define CAM_USE_XCLKA 1
+
++static struct regulator *beagle_mt9t111_reg1;
++static struct regulator *beagle_mt9t111_reg2;
++
++static struct device *beaglecam_dev;
++
+ #if defined(CONFIG_VIDEO_MT9T111) || defined(CONFIG_VIDEO_MT9T111_MODULE)
+ static struct isp_interface_config mt9t111_if_config = {
+ .ccdc_par_ser = ISP_PARLL,
+@@ -157,10 +163,13 @@ static int mt9t111_power_set(struct v4l2_int_device *s, enum v4l2_power power)
+
+ switch (power) {
+ case V4L2_POWER_OFF:
++ case V4L2_POWER_STANDBY:
+ isp_set_xclk(vdev->cam->isp, 0, CAM_USE_XCLKA);
+- break;
+
+- case V4L2_POWER_STANDBY:
++ if (regulator_is_enabled(beagle_mt9t111_reg1))
++ regulator_disable(beagle_mt9t111_reg1);
++ if (regulator_is_enabled(beagle_mt9t111_reg2))
++ regulator_disable(beagle_mt9t111_reg2);
+ break;
+
+ case V4L2_POWER_ON:
+@@ -169,6 +178,12 @@ static int mt9t111_power_set(struct v4l2_int_device *s, enum v4l2_power power)
+ #if defined(CONFIG_VIDEO_OMAP3) || defined(CONFIG_VIDEO_OMAP3_MODULE)
+ isp_configure_interface(vdev->cam->isp, &mt9t111_if_config);
+ #endif
++
++ /* turn on analog power */
++ regulator_enable(beagle_mt9t111_reg1);
++ regulator_enable(beagle_mt9t111_reg2);
++ udelay(100);
++
+ break;
+
+ default:
+@@ -196,16 +211,22 @@ static struct i2c_board_info __initdata mt9t111_i2c_board_info = {
+
+ #endif /* #ifdef CONFIG_VIDEO_MT9T111 */
+
+-/**
+- * @brief omap3beaglelmb_init - module init function. Should be called before any
+- * client driver init call
+- *
+- * @return result of operation - 0 is success
+- */
+-int __init omap3beaglelmb_init(void)
++
++static int beagle_cam_probe(struct platform_device *pdev)
+ {
+ int err;
+
++ beagle_mt9t111_reg1 = regulator_get(beaglecam_dev, "vaux3_1");
++ if (IS_ERR(beagle_mt9t111_reg1)) {
++ dev_err(beaglecam_dev, "vaux3_1 regulator missing\n");
++ return PTR_ERR(beagle_mt9t111_reg1);
++ }
++ beagle_mt9t111_reg2 = regulator_get(beaglecam_dev, "vaux4_1");
++ if (IS_ERR(beagle_mt9t111_reg2)) {
++ dev_err(beaglecam_dev, "vaux4_1 regulator missing\n");
++ regulator_put(beagle_mt9t111_reg1);
++ return PTR_ERR(beagle_mt9t111_reg2);
++ }
+ /*
+ * Register the I2C devices present in the board to the I2C
+ * framework.
+@@ -221,8 +242,59 @@ int __init omap3beaglelmb_init(void)
+ return err;
+ }
+ #endif
++
++ beaglecam_dev = &pdev->dev;
++
+ printk(KERN_INFO MODULE_NAME ": Driver registration complete \n");
+
+ return 0;
+ }
++
++static int beagle_cam_remove(struct platform_device *pdev)
++{
++ if (regulator_is_enabled(beagle_mt9t111_reg1))
++ regulator_disable(beagle_mt9t111_reg1);
++ regulator_put(beagle_mt9t111_reg1);
++ if (regulator_is_enabled(beagle_mt9t111_reg2))
++ regulator_disable(beagle_mt9t111_reg2);
++ regulator_put(beagle_mt9t111_reg2);
++
++ return 0;
++}
++
++static int beagle_cam_suspend(struct device *dev)
++{
++ return 0;
++}
++
++static int beagle_cam_resume(struct device *dev)
++{
++ return 0;
++}
++
++static struct dev_pm_ops beagle_cam_pm_ops = {
++ .suspend = beagle_cam_suspend,
++ .resume = beagle_cam_resume,
++};
++
++static struct platform_driver beagle_cam_driver = {
++ .probe = beagle_cam_probe,
++ .remove = beagle_cam_remove,
++ .driver = {
++ .name = "beagle_cam",
++ .pm = &beagle_cam_pm_ops,
++ },
++};
++
++/**
++ * @brief omap3beaglelmb_init - module init function. Should be called before any
++ * client driver init call
++ *
++ * @return result of operation - 0 is success
++ */
++int __init omap3beaglelmb_init(void)
++{
++ platform_driver_register(&beagle_cam_driver);
++ return 0;
++}
+ arch_initcall(omap3beaglelmb_init);
+diff --git a/arch/arm/mach-omap2/board-omap3beagle.c b/arch/arm/mach-omap2/board-omap3beagle.c
+index d6b69a6..aa16acd 100644
+--- a/arch/arm/mach-omap2/board-omap3beagle.c
++++ b/arch/arm/mach-omap2/board-omap3beagle.c
+@@ -403,6 +403,56 @@ static struct twl4030_gpio_platform_data beagle_gpio_data = {
+ .setup = beagle_twl_gpio_setup,
+ };
+
++
++static struct platform_device beagle_cam_device = {
++ .name = "beagle_cam",
++ .id = -1,
++};
++
++static struct regulator_consumer_supply beagle_vaux3_supplies[] = {
++ {
++ .supply = "vaux3_1",
++ .dev = &beagle_cam_device.dev,
++ },
++};
++
++static struct regulator_consumer_supply beagle_vaux4_supplies[] = {
++ {
++ .supply = "vaux4_1",
++ .dev = &beagle_cam_device.dev,
++ },
++};
++
++/* VAUX3 for CAM_1V8 */
++static struct regulator_init_data beagle_vaux3 = {
++ .constraints = {
++ .min_uV = 1800000,
++ .max_uV = 1800000,
++ .apply_uV = true,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL
++ | REGULATOR_MODE_STANDBY,
++ .valid_ops_mask = REGULATOR_CHANGE_MODE
++ | REGULATOR_CHANGE_STATUS,
++ },
++ .num_consumer_supplies = ARRAY_SIZE(beagle_vaux3_supplies),
++ .consumer_supplies = beagle_vaux3_supplies,
++};
++
++/* VAUX4 for CAM_2V8 */
++static struct regulator_init_data beagle_vaux4 = {
++ .constraints = {
++ .min_uV = 2800000,
++ .max_uV = 2800000,
++ .apply_uV = true,
++ .valid_modes_mask = REGULATOR_MODE_NORMAL
++ | REGULATOR_MODE_STANDBY,
++ .valid_ops_mask = REGULATOR_CHANGE_MODE
++ | REGULATOR_CHANGE_STATUS,
++ },
++ .num_consumer_supplies = ARRAY_SIZE(beagle_vaux4_supplies),
++ .consumer_supplies = beagle_vaux4_supplies,
++};
++
+ /* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
+ static struct regulator_init_data beagle_vmmc1 = {
+ .constraints = {
+@@ -492,6 +542,8 @@ static struct twl4030_platform_data beagle_twldata = {
+ .vsim = &beagle_vsim,
+ .vdac = &beagle_vdac,
+ .vpll2 = &beagle_vpll2,
++ .vaux3 = &beagle_vaux3,
++ .vaux4 = &beagle_vaux4,
+ };
+
+ static struct i2c_board_info __initdata beagle_i2c1_boardinfo[] = {
+@@ -658,6 +710,7 @@ static struct platform_device *omap3_beagle_devices[] __initdata = {
+ &leds_gpio,
+ &keys_gpio,
+ &beagle_dss_device,
++ &beagle_cam_device,
+ };
+
+ static void __init omap3beagle_flash_init(void)
+--
+1.6.6.1
+