summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/board-whistler-sensors.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-tegra/board-whistler-sensors.c')
-rw-r--r--arch/arm/mach-tegra/board-whistler-sensors.c77
1 files changed, 60 insertions, 17 deletions
diff --git a/arch/arm/mach-tegra/board-whistler-sensors.c b/arch/arm/mach-tegra/board-whistler-sensors.c
index cae4d04bdb0c..f077822bb2df 100644
--- a/arch/arm/mach-tegra/board-whistler-sensors.c
+++ b/arch/arm/mach-tegra/board-whistler-sensors.c
@@ -1,7 +1,7 @@
/*
* arch/arm/mach-tegra/board-whistler-sensors.c
*
- * Copyright (c) 2010, NVIDIA, All Rights Reserved.
+ * Copyright (c) 2010-2011, NVIDIA, All Rights Reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -18,12 +18,14 @@
*
*/
+#include <linux/delay.h>
#include <linux/i2c.h>
#include <mach/gpio.h>
#include <media/ov5650.h>
#include <linux/regulator/consumer.h>
#include <linux/err.h>
#include <linux/adt7461.h>
+#include <generated/mach-types.h>
#include "gpio-names.h"
@@ -35,12 +37,14 @@
#define ADXL34X_IRQ_GPIO TEGRA_GPIO_PAA1
#define ISL29018_IRQ_GPIO TEGRA_GPIO_PK2
-#define ADT7461_IRQ_GPIO TEGRA_GPIO_PI2
+#define ADT7461_IRQ_GPIO TEGRA_GPIO_PI2
extern void tegra_throttling_enable(bool enable);
static struct regulator *reg_avdd_cam1; /* LDO9 */
static struct regulator *reg_vdd_af; /* LDO13 */
+static struct regulator *reg_vdd_mipi; /* LDO17 */
+static struct regulator *reg_vddio_vi; /* LDO18 */
static int whistler_camera_init(void)
{
@@ -67,14 +71,15 @@ static int whistler_camera_init(void)
gpio_direction_output(CAMERA_FLASH_EN2_GPIO, 0);
gpio_export(CAMERA_FLASH_EN2_GPIO, false);
+ gpio_set_value(CAMERA1_PWDN_GPIO, 1);
+ mdelay(5);
+
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);
+ gpio_set_value(CAMERA1_PWDN_GPIO, 0);
if (!reg_avdd_cam1) {
reg_avdd_cam1 = regulator_get(NULL, "vdd_cam1");
@@ -85,25 +90,31 @@ static int whistler_ov5650_power_on(void)
}
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);
+ mdelay(5);
+ if (!reg_vdd_mipi) {
+ reg_vdd_mipi = regulator_get(NULL, "vddio_mipi");
+ if (IS_ERR_OR_NULL(reg_vdd_mipi)) {
+ pr_err("whistler_ov5650_power_on: vddio_mipi failed\n");
+ reg_vdd_mipi = NULL;
+ return PTR_ERR(reg_vdd_mipi);
}
- regulator_enable(reg_vdd_af);
+ regulator_enable(reg_vdd_mipi);
}
+ gpio_set_value(CAMERA1_RESET_GPIO, 1);
+ mdelay(10);
+ gpio_set_value(CAMERA1_RESET_GPIO, 0);
+ mdelay(5);
+ gpio_set_value(CAMERA1_RESET_GPIO, 1);
+ mdelay(20);
+
return 0;
}
static int whistler_ov5650_power_off(void)
{
- gpio_set_value(CAMERA1_PWDN_GPIO, 0);
+ gpio_set_value(CAMERA1_PWDN_GPIO, 1);
gpio_set_value(CAMERA1_RESET_GPIO, 0);
- gpio_set_value(CAMERA_AF_PD_GPIO, 0);
if (reg_avdd_cam1) {
regulator_disable(reg_avdd_cam1);
@@ -116,6 +127,7 @@ static int whistler_ov5650_power_off(void)
regulator_put(reg_vdd_af);
reg_vdd_af = NULL;
}
+
return 0;
}
@@ -197,11 +209,42 @@ int __init whistler_sensors_init(void)
i2c_register_board_info(0, whistler_i2c1_board_info,
ARRAY_SIZE(whistler_i2c1_board_info));
+ i2c_register_board_info(4, whistler_i2c4_board_info,
+ ARRAY_SIZE(whistler_i2c4_board_info));
+
i2c_register_board_info(3, whistler_i2c3_board_info,
ARRAY_SIZE(whistler_i2c3_board_info));
- i2c_register_board_info(4, whistler_i2c4_board_info,
- ARRAY_SIZE(whistler_i2c4_board_info));
+ return 0;
+}
+
+int __init whistler_sensor_late_init(void)
+{
+ int ret;
+
+ if (!machine_is_whistler())
+ return 0;
+ reg_vddio_vi = regulator_get(NULL, "vddio_vi");
+ if (IS_ERR_OR_NULL(reg_vddio_vi)) {
+ pr_err("%s: Couldn't get regulator vddio_vi\n", __func__);
+ return PTR_ERR(reg_vddio_vi);
+ }
+
+ /* set vddio_vi voltage to 1.8v */
+ ret = regulator_set_voltage(reg_vddio_vi, 1800*1000, 1800*1000);
+ if (ret) {
+ pr_err("%s: Failed to set vddio_vi to 1.8v\n", __func__);
+ goto fail_put_regulator;
+ }
+
+ regulator_put(reg_vddio_vi);
return 0;
+
+fail_put_regulator:
+ regulator_put(reg_vddio_vi);
+ return ret;
}
+
+late_initcall(whistler_sensor_late_init);
+