diff options
author | Sachin Nikam <snikam@nvidia.com> | 2011-01-28 18:51:46 +0530 |
---|---|---|
committer | Varun Colbert <vcolbert@nvidia.com> | 2011-02-03 19:06:36 -0800 |
commit | 70c271da73807481a2a6405b63be30071b244c83 (patch) | |
tree | 2d943ca812f145c4d89fc13ccebe2b7e06eb16ca /arch | |
parent | 50cc69413c7ac5f1e093273c6b93131c1752e143 (diff) |
[ARM] tegra: whistler: camera: sensor power on/off
Correcting the GPIO names for sensor power.
Enabling regulator when sensor is opened and disabling it when
sensor is closed.
Bug 783488
Change-Id: I62c5dd8bfc7a1a63e1ff42450af3699a3ecd66f8
Reviewed-on: http://git-master/r/17472
Tested-by: Sachin Nikam <snikam@nvidia.com>
Reviewed-by: Daniel Willemsen <dwillemsen@nvidia.com>
Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/arm/mach-tegra/board-whistler-sensors.c | 106 |
1 files changed, 74 insertions, 32 deletions
diff --git a/arch/arm/mach-tegra/board-whistler-sensors.c b/arch/arm/mach-tegra/board-whistler-sensors.c index d133c6cd6fa5..a882e437baf9 100644 --- a/arch/arm/mach-tegra/board-whistler-sensors.c +++ b/arch/arm/mach-tegra/board-whistler-sensors.c @@ -21,54 +21,96 @@ #include <linux/i2c.h> #include <mach/gpio.h> #include <media/ov5650.h> - +#include <linux/regulator/consumer.h> +#include <linux/err.h> #include "gpio-names.h" -#define ADXL34X_IRQ_GPIO TEGRA_GPIO_PAA1 -#define CAMERA_RESET2_SHUTTER_GPIO TEGRA_GPIO_PBB1 -#define CAMERA_PWNDN1_GPIO TEGRA_GPIO_PBB4 -#define CAMERA_PWNDN2_STROBE_GPIO TEGRA_GPIO_PBB5 -#define CAMERA_RESET1_GPIO TEGRA_GPIO_PD2 -#define CAMERA_FLASH_GPIO TEGRA_GPIO_PA0 -#define ISL29018_IRQ_GPIO TEGRA_GPIO_PK2 +#define CAMERA1_PWDN_GPIO TEGRA_GPIO_PT2 +#define CAMERA1_RESET_GPIO TEGRA_GPIO_PD2 +#define CAMERA_AF_PD_GPIO TEGRA_GPIO_PT3 +#define CAMERA_FLASH_EN1_GPIO TEGRA_GPIO_PBB4 +#define CAMERA_FLASH_EN2_GPIO TEGRA_GPIO_PA0 + +#define ADXL34X_IRQ_GPIO TEGRA_GPIO_PAA1 +#define ISL29018_IRQ_GPIO TEGRA_GPIO_PK2 + +static struct regulator *reg_avdd_cam1; /* LDO9 */ +static struct regulator *reg_vdd_af; /* LDO13 */ static int whistler_camera_init(void) { - tegra_gpio_enable(CAMERA_PWNDN1_GPIO); - gpio_request(CAMERA_PWNDN1_GPIO, "camera_powerdown"); - gpio_direction_output(CAMERA_PWNDN1_GPIO, 0); - gpio_export(CAMERA_PWNDN1_GPIO, false); - - tegra_gpio_enable(CAMERA_RESET1_GPIO); - gpio_request(CAMERA_RESET1_GPIO, "camera_reset1"); - gpio_direction_output(CAMERA_RESET1_GPIO, 1); - gpio_export(CAMERA_RESET1_GPIO, false); - - tegra_gpio_enable(CAMERA_RESET2_SHUTTER_GPIO); - gpio_request(CAMERA_RESET2_SHUTTER_GPIO, "camera_reset2_shutter"); - gpio_direction_output(CAMERA_RESET2_SHUTTER_GPIO, 1); - gpio_export(CAMERA_RESET2_SHUTTER_GPIO, false); - - tegra_gpio_enable(CAMERA_PWNDN2_STROBE_GPIO); - gpio_request(CAMERA_PWNDN2_STROBE_GPIO, "camera_pwrdwn2_strobe"); - gpio_direction_output(CAMERA_PWNDN2_STROBE_GPIO, 0); - gpio_export(CAMERA_PWNDN2_STROBE_GPIO, false); - - tegra_gpio_enable(CAMERA_FLASH_GPIO); - gpio_request(CAMERA_FLASH_GPIO, "camera_flash"); - gpio_direction_output(CAMERA_FLASH_GPIO, 0); - gpio_export(CAMERA_FLASH_GPIO, false); + tegra_gpio_enable(CAMERA1_PWDN_GPIO); + gpio_request(CAMERA1_PWDN_GPIO, "camera1_powerdown"); + gpio_direction_output(CAMERA1_PWDN_GPIO, 0); + + tegra_gpio_enable(CAMERA1_RESET_GPIO); + gpio_request(CAMERA1_RESET_GPIO, "camera1_reset"); + gpio_direction_output(CAMERA1_RESET_GPIO, 0); + + tegra_gpio_enable(CAMERA_AF_PD_GPIO); + gpio_request(CAMERA_AF_PD_GPIO, "camera_autofocus"); + gpio_direction_output(CAMERA_AF_PD_GPIO, 0); + gpio_export(CAMERA_AF_PD_GPIO, false); + + tegra_gpio_enable(CAMERA_FLASH_EN1_GPIO); + gpio_request(CAMERA_FLASH_EN1_GPIO, "camera_flash_en1"); + gpio_direction_output(CAMERA_FLASH_EN1_GPIO, 0); + gpio_export(CAMERA_FLASH_EN1_GPIO, false); + + tegra_gpio_enable(CAMERA_FLASH_EN2_GPIO); + gpio_request(CAMERA_FLASH_EN2_GPIO, "camera_flash_en2"); + gpio_direction_output(CAMERA_FLASH_EN2_GPIO, 0); + gpio_export(CAMERA_FLASH_EN2_GPIO, false); return 0; } static int whistler_ov5650_power_on(void) { + gpio_set_value(CAMERA1_PWDN_GPIO, 1); + gpio_set_value(CAMERA1_RESET_GPIO, 1); + gpio_set_value(CAMERA_AF_PD_GPIO, 1); + + if (!reg_avdd_cam1) { + reg_avdd_cam1 = regulator_get(NULL, "vdd_cam1"); + if (IS_ERR_OR_NULL(reg_avdd_cam1)) { + pr_err("whistler_ov5650_power_on: vdd_cam1 failed\n"); + reg_avdd_cam1 = NULL; + return PTR_ERR(reg_avdd_cam1); + } + regulator_enable(reg_avdd_cam1); + } + + if (!reg_vdd_af) { + reg_vdd_af = regulator_get(NULL, "vdd_vcore_af"); + if (IS_ERR_OR_NULL(reg_vdd_af)) { + pr_err("whistler_ov5650_power_on: vdd_vcore_af failed\n"); + reg_vdd_af = NULL; + return PTR_ERR(reg_vdd_af); + } + regulator_enable(reg_vdd_af); + } + return 0; } static int whistler_ov5650_power_off(void) { + gpio_set_value(CAMERA1_PWDN_GPIO, 0); + gpio_set_value(CAMERA1_RESET_GPIO, 0); + gpio_set_value(CAMERA_AF_PD_GPIO, 0); + + if (reg_avdd_cam1) { + regulator_disable(reg_avdd_cam1); + regulator_put(reg_avdd_cam1); + reg_avdd_cam1 = NULL; + } + + if (reg_vdd_af) { + regulator_disable(reg_vdd_af); + regulator_put(reg_vdd_af); + reg_vdd_af = NULL; + } return 0; } |