diff options
Diffstat (limited to 'arch')
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}, |