summaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorKassey Li <kasseyl@nvidia.com>2014-12-11 17:54:31 +0800
committerMatthew Pedro <mapedro@nvidia.com>2015-04-15 18:35:12 -0700
commit46f03f55b25c08721384ed0eabe85913da7a15da (patch)
treed4c11c0a4a2d5490942ef2295029a878efd289e4 /arch
parenta2d5506261b58d191b01b5c677c02cebedda6436 (diff)
kernel: add imx185 sensor support
Bug 200044433 Change-Id: I792062649c247229270678a44d10323d2744b569 Signed-off-by: Kassey Li <kasseyl@nvidia.com> Reviewed-on: http://git-master/r/721561 Reviewed-by: Matthew Pedro <mapedro@nvidia.com> Tested-by: Matthew Pedro <mapedro@nvidia.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/arm/boot/dts/tegra124-jetson_tk1-pm375-000-c00-00.dts4
-rw-r--r--arch/arm/boot/dts/tegra124-platforms/tegra124-jetson_tk1-pmic-pm375-0000-c00-00.dtsi4
-rw-r--r--arch/arm/boot/dts/tegra124-platforms/tegra124-pm359-camera-a00.dtsi46
-rw-r--r--arch/arm/configs/tegra12_defconfig1
-rw-r--r--arch/arm/mach-tegra/board-ardbeg-sensors.c72
5 files changed, 127 insertions, 0 deletions
diff --git a/arch/arm/boot/dts/tegra124-jetson_tk1-pm375-000-c00-00.dts b/arch/arm/boot/dts/tegra124-jetson_tk1-pm375-000-c00-00.dts
index 9d3559b4e0dd..130318405480 100644
--- a/arch/arm/boot/dts/tegra124-jetson_tk1-pm375-000-c00-00.dts
+++ b/arch/arm/boot/dts/tegra124-jetson_tk1-pm375-000-c00-00.dts
@@ -74,6 +74,10 @@
reset-gpios = <&gpio TEGRA_GPIO(BB, 3) 0>;
cam1-gpios = <&gpio TEGRA_GPIO(BB, 5) 0>;
};
+ imx185@2_001A {
+ use-of-node = "yes";
+ cam1-gpios = <&gpio TEGRA_GPIO(BB, 5) 0>;
+ };
};
dpd {
default-enable;
diff --git a/arch/arm/boot/dts/tegra124-platforms/tegra124-jetson_tk1-pmic-pm375-0000-c00-00.dtsi b/arch/arm/boot/dts/tegra124-platforms/tegra124-jetson_tk1-pmic-pm375-0000-c00-00.dtsi
index 13645bb027df..5cf96a280775 100644
--- a/arch/arm/boot/dts/tegra124-platforms/tegra124-jetson_tk1-pmic-pm375-0000-c00-00.dtsi
+++ b/arch/arm/boot/dts/tegra124-platforms/tegra124-jetson_tk1-pmic-pm375-0000-c00-00.dtsi
@@ -322,6 +322,10 @@
regulator-consumer-supply = "vi2c";
regulator-consumer-device = "2-0030";
};
+ c10 {
+ regulator-consumer-supply = "vif";
+ regulator-consumer-device = "2-001a";
+ };
};
};
diff --git a/arch/arm/boot/dts/tegra124-platforms/tegra124-pm359-camera-a00.dtsi b/arch/arm/boot/dts/tegra124-platforms/tegra124-pm359-camera-a00.dtsi
index 6e35bef14643..06dde15adef2 100644
--- a/arch/arm/boot/dts/tegra124-platforms/tegra124-pm359-camera-a00.dtsi
+++ b/arch/arm/boot/dts/tegra124-platforms/tegra124-pm359-camera-a00.dtsi
@@ -89,6 +89,17 @@
platformdata = "ardbeg_ar1335_pdata";
};
};
+
+ module7: module7@modules {
+ compatible = "sensor,rear";
+ badge_info = "imx185_camera";
+
+ sensor {
+ profile = <&imx185_1>;
+ platformdata = "ardbeg_imx185_pdata";
+ };
+ };
+
};
profiles {
imx135_1: imx135@2_0010 {
@@ -130,6 +141,41 @@
CAMERA_END
>;
};
+ imx185_1: imx185@2_001A {
+ index = <1>;
+ chipname = "pcl_IMX185";
+ type = "sensor";
+ guid = "s_IMX185";
+ position = <0>;
+ bustype = "i2c";
+ busnum = <2>;
+ addr = <0x1A>;
+ datalen = <2>;
+ pinmuxgrp = <0xFFFF>;
+ gpios = <0>;
+ regulators = "vif";
+ clocks = "mclk";
+ drivername = "imx185";
+ detect = <0x1 0x3010 0x00FF 0x39>;
+ devid = <0x0185>;
+ poweron = <
+ CAMERA_IND_CLK_SET(37125)
+ CAMERA_GPIO_CLR(221)
+ CAMERA_REGULATOR_ON(0)
+ CAMERA_WAITUS(10)
+ CAMERA_WAITMS(5)
+ CAMERA_GPIO_SET(221)
+ CAMERA_WAITUS(300)
+ CAMERA_END
+ >;
+ poweroff = <
+ CAMERA_IND_CLK_CLR
+ CAMERA_GPIO_CLR(221)
+ CAMERA_REGULATOR_OFF(0)
+ CAMERA_WAITUS(10)
+ CAMERA_END
+ >;
+ };
dw9718_1: dw9718@2_000c {
index = <2>;
chipname = "pcl_DW9718";
diff --git a/arch/arm/configs/tegra12_defconfig b/arch/arm/configs/tegra12_defconfig
index ca4ee771e28e..cf472db65f37 100644
--- a/arch/arm/configs/tegra12_defconfig
+++ b/arch/arm/configs/tegra12_defconfig
@@ -355,6 +355,7 @@ CONFIG_TORCH_AS364X=y
CONFIG_VIDEO_AD5816=y
CONFIG_VIDEO_DW9718=y
CONFIG_VIDEO_IMX179=y
+CONFIG_VIDEO_IMX185=y
CONFIG_VIDEO_CAMERA=y
CONFIG_SOC_CAMERA=y
CONFIG_SOC_CAMERA_PLATFORM=m
diff --git a/arch/arm/mach-tegra/board-ardbeg-sensors.c b/arch/arm/mach-tegra/board-ardbeg-sensors.c
index 9915bf07152d..57bb10d1a4ca 100644
--- a/arch/arm/mach-tegra/board-ardbeg-sensors.c
+++ b/arch/arm/mach-tegra/board-ardbeg-sensors.c
@@ -32,6 +32,7 @@
#include <media/ar1335.h>
#include <media/imx135.h>
#include <media/imx179.h>
+#include <media/imx185.h>
#include <media/dw9718.h>
#include <media/as364x.h>
#include <media/ov5693.h>
@@ -833,6 +834,70 @@ struct ar1335_platform_data ardbeg_ar1335_data = {
.power_on = ardbeg_ar1335_power_on,
.power_off = ardbeg_ar1335_power_off,
};
+static int ardbeg_imx185_power_on(struct imx185_power_rail *pw)
+{
+ int err;
+
+ if (unlikely(WARN_ON(!pw || !pw->iovdd || !pw->avdd)))
+ return -EFAULT;
+
+ /* disable CSIA/B IOs DPD mode to turn on camera for ardbeg */
+ tegra_io_dpd_disable(&csia_io);
+ tegra_io_dpd_disable(&csib_io);
+
+ gpio_set_value(CAM1_PWDN, 0);
+ usleep_range(10, 20);
+
+ err = regulator_enable(pw->dvdd);
+ if (err)
+ goto imx185_dvdd_fail;
+
+ err = regulator_enable(pw->iovdd);
+ if (err)
+ goto imx185_iovdd_fail;
+
+ err = regulator_enable(pw->avdd);
+ if (err)
+ goto imx185_avdd_fail;
+
+ usleep_range(1, 2);
+ gpio_set_value(CAM1_PWDN, 1);
+
+ usleep_range(300, 310);
+
+ return 0;
+
+
+imx185_avdd_fail:
+ regulator_disable(pw->iovdd);
+
+imx185_iovdd_fail:
+ regulator_disable(pw->dvdd);
+
+imx185_dvdd_fail:
+ tegra_io_dpd_enable(&csia_io);
+ tegra_io_dpd_enable(&csib_io);
+ pr_err("%s failed.\n", __func__);
+ return -ENODEV;
+}
+
+static int ardbeg_imx185_power_off(struct imx185_power_rail *pw)
+{
+ if (unlikely(WARN_ON(!pw || !pw->iovdd || !pw->avdd))) {
+ tegra_io_dpd_enable(&csia_io);
+ tegra_io_dpd_enable(&csib_io);
+ return -EFAULT;
+ }
+
+ regulator_disable(pw->avdd);
+ regulator_disable(pw->iovdd);
+ regulator_disable(pw->dvdd);
+
+ /* put CSIA/B IOs into DPD mode to save additional power for ardbeg */
+ tegra_io_dpd_enable(&csia_io);
+ tegra_io_dpd_enable(&csib_io);
+ return 0;
+}
struct imx135_platform_data ardbeg_imx135_data = {
.flash_cap = {
@@ -1243,6 +1308,12 @@ static struct ov5693_platform_data ardbeg_ov5693_pdata = {
.has_eeprom = 1,
};
+static struct imx185_platform_data ardbeg_imx185_data = {
+ .power_on = ardbeg_imx185_power_on,
+ .power_off = ardbeg_imx185_power_off,
+ .mclk_name = "mclk",
+};
+
static int ardbeg_ov5693_front_power_on(struct ov5693_power_rail *pw)
{
int err;
@@ -1393,6 +1464,7 @@ static struct ad5823_platform_data ardbeg_ad5823_pdata = {
static struct camera_data_blob ardbeg_camera_lut[] = {
{"ardbeg_imx135_pdata", &ardbeg_imx135_data},
+ {"ardbeg_imx185_pdata", &ardbeg_imx185_data},
{"ardbeg_dw9718_pdata", &ardbeg_dw9718_data},
{"ardbeg_ar0261_pdata", &ardbeg_ar0261_data},
{"ardbeg_mt9m114_pdata", &ardbeg_mt9m114_pdata},