diff options
author | Ming Wong <miwong@nvidia.com> | 2015-01-13 12:02:31 -0800 |
---|---|---|
committer | Winnie Hsu <whsu@nvidia.com> | 2015-02-26 10:44:26 -0800 |
commit | c9a21f041658d65abefff5d40fc97e23c3683799 (patch) | |
tree | ed7be9c2ae4c418354359dbd728b85229a43df2c /arch | |
parent | 6606ce102dcc49f1e5868974468e8254f2a04e1d (diff) |
kernel: add support for ar1335
Bug 1598204
Change-Id: I453d18ce570e57c0feab8dc3b24cc2c957b95301
Signed-off-by: Ming Wong <miwong@nvidia.com>
Reviewed-on: http://git-master/r/672147
GVS: Gerrit_Virtual_Submit
Reviewed-by: Venkat Moganty <vmoganty@nvidia.com>
Diffstat (limited to 'arch')
4 files changed, 134 insertions, 0 deletions
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 57e147e5fba0..13645bb027df 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 @@ -367,6 +367,10 @@ c10 { regulator-consumer-supply = "avdd_hsic_mdm"; }; + c11 { + regulator-consumer-supply = "vdig_csi"; + regulator-consumer-device = "2-0036"; + }; }; }; @@ -405,6 +409,10 @@ regulator-consumer-supply = "vana"; regulator-consumer-device = "2-0018"; }; + c6 { + regulator-consumer-supply = "vana"; + regulator-consumer-device = "2-0036"; + }; }; }; 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 e84ffcc1c87d..6e35bef14643 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 @@ -80,6 +80,15 @@ platformdata = "ardbeg_ov4689_pdata"; }; }; + module6: module6@modules { + compatible = "sensor,rear"; + badge_info = "e1633_ar1335"; + + sensor { + profile = <&ar1335_1>; + platformdata = "ardbeg_ar1335_pdata"; + }; + }; }; profiles { imx135_1: imx135@2_0010 { @@ -339,6 +348,44 @@ CAMERA_END >; }; + ar1335_1: ar1335@2_0036 { + index = <7>; + chipname = "pcl_AR1335"; + type = "sensor"; + guid = "s_AR1335"; + position = <0>; + bustype = "i2c"; + busnum = <2>; + addr = <0x36>; + datalen = <2>; + pinmuxgrp = <0xFFFF>; + gpios = <3>; + regulators = "vana", "vif", "vdig_csi"; + clocks = "mclk"; + drivername = "ar1335"; + detect = <0x0002 0x3000 0xFFFF 0x0153>; + devid = <0x1335>; + poweron = < + CAMERA_IND_CLK_SET(10000) + CAMERA_GPIO_CLR(219) + CAMERA_REGULATOR_ON(0) + CAMERA_REGULATOR_ON(1) + CAMERA_REGULATOR_ON(2) + CAMERA_WAITMS(10) + CAMERA_GPIO_SET(219) + CAMERA_WAITMS(20) + CAMERA_END + >; + poweroff = < + CAMERA_IND_CLK_CLR + CAMERA_GPIO_CLR(219) + CAMERA_WAITUS(10) + CAMERA_REGULATOR_OFF(2) + CAMERA_REGULATOR_OFF(1) + CAMERA_REGULATOR_OFF(0) + CAMERA_END + >; + }; }; }; }; diff --git a/arch/arm/configs/tegra12_defconfig b/arch/arm/configs/tegra12_defconfig index d028d4a23ad5..6eda4c457494 100644 --- a/arch/arm/configs/tegra12_defconfig +++ b/arch/arm/configs/tegra12_defconfig @@ -344,6 +344,7 @@ CONFIG_VIDEO_IMX091=y CONFIG_VIDEO_IMX135=y CONFIG_VIDEO_AR0261=y CONFIG_VIDEO_AR0330=y +CONFIG_VIDEO_AR1335=y CONFIG_VIDEO_IMX132=y CONFIG_VIDEO_OV9772=y CONFIG_VIDEO_OV4689=y diff --git a/arch/arm/mach-tegra/board-ardbeg-sensors.c b/arch/arm/mach-tegra/board-ardbeg-sensors.c index c2fd85030283..9d621c0b708a 100644 --- a/arch/arm/mach-tegra/board-ardbeg-sensors.c +++ b/arch/arm/mach-tegra/board-ardbeg-sensors.c @@ -29,6 +29,7 @@ #include <media/camera.h> #include <media/ar0330.h> #include <media/ar0261.h> +#include <media/ar1335.h> #include <media/imx135.h> #include <media/imx179.h> #include <media/dw9718.h> @@ -690,6 +691,70 @@ static int ardbeg_imx135_power_off(struct imx135_power_rail *pw) return 0; } +static int ardbeg_ar1335_power_on(struct ar1335_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(CAM_RSTN, 0); + usleep_range(10, 20); + + err = regulator_enable(pw->avdd); + if (err) + goto ar1335_avdd_fail; + + err = regulator_enable(pw->iovdd); + if (err) + goto ar1335_iovdd_fail; + + err = regulator_enable(pw->dvdd); + if (err) + goto ar1335_dvdd_fail; + + usleep_range(1, 2); + gpio_set_value(CAM_RSTN, 1); + + usleep_range(300, 310); + + return 0; + +ar1335_dvdd_fail: + regulator_disable(pw->iovdd); + +ar1335_iovdd_fail: + regulator_disable(pw->avdd); + +ar1335_avdd_fail: + tegra_io_dpd_enable(&csia_io); + tegra_io_dpd_enable(&csib_io); + pr_err("%s failed.\n", __func__); + return -ENODEV; +} + +static int ardbeg_ar1335_power_off(struct ar1335_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->iovdd); + regulator_disable(pw->avdd); + 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; +} + static int ardbeg_imx179_power_on(struct imx179_power_rail *pw) { int err; @@ -757,6 +822,18 @@ static int ardbeg_imx179_power_off(struct imx179_power_rail *pw) return 0; } +struct ar1335_platform_data ardbeg_ar1335_data = { + .flash_cap = { + .enable = 1, + .edge_trig_en = 1, + .start_edge = 0, + .repeat = 1, + .delay_frm = 0, + }, + .power_on = ardbeg_ar1335_power_on, + .power_off = ardbeg_ar1335_power_off, +}; + struct imx135_platform_data ardbeg_imx135_data = { .flash_cap = { .enable = 1, @@ -1327,6 +1404,7 @@ static struct camera_data_blob ardbeg_camera_lut[] = { {"ardbeg_ar0330_pdata", &ardbeg_ar0330_data}, {"ardbeg_ar0330_front_pdata", &ardbeg_ar0330_front_data}, {"ardbeg_ov4689_pdata", &ardbeg_ov4689_data}, + {"ardbeg_ar1335_pdata", &ardbeg_ar1335_data}, {}, }; |