aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/exynos/fimc-is/fimc-is-helper.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/video/exynos/fimc-is/fimc-is-helper.c')
-rw-r--r--drivers/media/video/exynos/fimc-is/fimc-is-helper.c85
1 files changed, 81 insertions, 4 deletions
diff --git a/drivers/media/video/exynos/fimc-is/fimc-is-helper.c b/drivers/media/video/exynos/fimc-is/fimc-is-helper.c
index ef0d163..8cac853 100644
--- a/drivers/media/video/exynos/fimc-is/fimc-is-helper.c
+++ b/drivers/media/video/exynos/fimc-is/fimc-is-helper.c
@@ -31,6 +31,7 @@
#include <linux/gpio.h>
#include <linux/gpio_event.h>
#include <plat/gpio-cfg.h>
+#include <plat/cpu.h>
#include "fimc-is-core.h"
#include "fimc-is-regs.h"
@@ -1039,18 +1040,46 @@ void fimc_is_hw_open_sensor(struct fimc_is_dev *dev, u32 id, u32 sensor_index)
writel(id, dev->regs + ISSR1);
switch (sensor_index) {
case SENSOR_S5K3H2_CSI_A:
+ sensor_ext = (struct sensor_open_extended *)
+ &dev->is_p_region->shared;
+ sensor_ext->actuator_type = 1;
+ sensor_ext->mclk = 0;
+ sensor_ext->mipi_lane_num = 0;
+ sensor_ext->mipi_speed = 0;
+ sensor_ext->fast_open_sensor = 0;
+ sensor_ext->self_calibration_mode = 0;
+ if (samsung_rev() >= EXYNOS4412_REV_2_0)
+ sensor_ext->i2c_sclk = 88000000;
+ else
+ sensor_ext->i2c_sclk = 80000000;
+ fimc_is_mem_cache_clean((void *)dev->is_p_region,
+ IS_PARAM_SIZE);
dev->af.use_af = 1;
dev->sensor.sensor_type = SENSOR_S5K3H2_CSI_A;
writel(SENSOR_NAME_S5K3H2, dev->regs + ISSR2);
writel(SENSOR_CONTROL_I2C0, dev->regs + ISSR3);
- writel(0x0, dev->regs + ISSR4);
+ writel(virt_to_phys(sensor_ext), dev->regs + ISSR4);
break;
case SENSOR_S5K3H2_CSI_B:
+ sensor_ext = (struct sensor_open_extended *)
+ &dev->is_p_region->shared;
+ sensor_ext->actuator_type = 1;
+ sensor_ext->mclk = 0;
+ sensor_ext->mipi_lane_num = 0;
+ sensor_ext->mipi_speed = 0;
+ sensor_ext->fast_open_sensor = 0;
+ sensor_ext->self_calibration_mode = 0;
+ if (samsung_rev() >= EXYNOS4412_REV_2_0)
+ sensor_ext->i2c_sclk = 88000000;
+ else
+ sensor_ext->i2c_sclk = 80000000;
+ fimc_is_mem_cache_clean((void *)dev->is_p_region,
+ IS_PARAM_SIZE);
dev->af.use_af = 1;
dev->sensor.sensor_type = SENSOR_S5K3H2_CSI_B;
writel(SENSOR_NAME_S5K3H2, dev->regs + ISSR2);
writel(SENSOR_CONTROL_I2C1, dev->regs + ISSR3);
- writel(0x0, dev->regs + ISSR4);
+ writel(virt_to_phys(sensor_ext), dev->regs + ISSR4);
break;
case SENSOR_S5K6A3_CSI_A:
sensor_ext = (struct sensor_open_extended *)
@@ -1061,6 +1090,10 @@ void fimc_is_hw_open_sensor(struct fimc_is_dev *dev, u32 id, u32 sensor_index)
sensor_ext->mipi_speed = 0;
sensor_ext->fast_open_sensor = 0;
sensor_ext->self_calibration_mode = 1;
+ if (samsung_rev() >= EXYNOS4412_REV_2_0)
+ sensor_ext->i2c_sclk = 88000000;
+ else
+ sensor_ext->i2c_sclk = 80000000;
fimc_is_mem_cache_clean((void *)dev->is_p_region,
IS_PARAM_SIZE);
dev->af.use_af = 0;
@@ -1078,6 +1111,10 @@ void fimc_is_hw_open_sensor(struct fimc_is_dev *dev, u32 id, u32 sensor_index)
sensor_ext->mipi_speed = 0;
sensor_ext->fast_open_sensor = 0;
sensor_ext->self_calibration_mode = 1;
+ if (samsung_rev() >= EXYNOS4412_REV_2_0)
+ sensor_ext->i2c_sclk = 88000000;
+ else
+ sensor_ext->i2c_sclk = 80000000;
fimc_is_mem_cache_clean((void *)dev->is_p_region,
IS_PARAM_SIZE);
dev->af.use_af = 0;
@@ -1095,6 +1132,10 @@ void fimc_is_hw_open_sensor(struct fimc_is_dev *dev, u32 id, u32 sensor_index)
sensor_ext->mipi_speed = 0;
sensor_ext->fast_open_sensor = 0;
sensor_ext->self_calibration_mode = 0;
+ if (samsung_rev() >= EXYNOS4412_REV_2_0)
+ sensor_ext->i2c_sclk = 88000000;
+ else
+ sensor_ext->i2c_sclk = 80000000;
fimc_is_mem_cache_clean((void *)dev->is_p_region,
IS_PARAM_SIZE);
dev->af.use_af = 1;
@@ -1112,6 +1153,10 @@ void fimc_is_hw_open_sensor(struct fimc_is_dev *dev, u32 id, u32 sensor_index)
sensor_ext->mipi_speed = 0;
sensor_ext->fast_open_sensor = 0;
sensor_ext->self_calibration_mode = 0;
+ if (samsung_rev() >= EXYNOS4412_REV_2_0)
+ sensor_ext->i2c_sclk = 88000000;
+ else
+ sensor_ext->i2c_sclk = 80000000;
fimc_is_mem_cache_clean((void *)dev->is_p_region,
IS_PARAM_SIZE);
dev->af.use_af = 1;
@@ -1121,18 +1166,46 @@ void fimc_is_hw_open_sensor(struct fimc_is_dev *dev, u32 id, u32 sensor_index)
writel(virt_to_phys(sensor_ext), dev->regs + ISSR4);
break;
case SENSOR_S5K4E5_CSI_A:
+ sensor_ext = (struct sensor_open_extended *)
+ &dev->is_p_region->shared;
+ sensor_ext->actuator_type = 1;
+ sensor_ext->mclk = 0;
+ sensor_ext->mipi_lane_num = 0;
+ sensor_ext->mipi_speed = 0;
+ sensor_ext->fast_open_sensor = 0;
+ sensor_ext->self_calibration_mode = 0;
+ if (samsung_rev() >= EXYNOS4412_REV_2_0)
+ sensor_ext->i2c_sclk = 88000000;
+ else
+ sensor_ext->i2c_sclk = 80000000;
+ fimc_is_mem_cache_clean((void *)dev->is_p_region,
+ IS_PARAM_SIZE);
dev->af.use_af = 1;
dev->sensor.sensor_type = SENSOR_S5K4E5_CSI_A;
writel(SENSOR_NAME_S5K4E5, dev->regs + ISSR2);
writel(SENSOR_CONTROL_I2C0, dev->regs + ISSR3);
- writel(0x0, dev->regs + ISSR4);
+ writel(virt_to_phys(sensor_ext), dev->regs + ISSR4);
break;
case SENSOR_S5K4E5_CSI_B:
+ sensor_ext = (struct sensor_open_extended *)
+ &dev->is_p_region->shared;
+ sensor_ext->actuator_type = 1;
+ sensor_ext->mclk = 0;
+ sensor_ext->mipi_lane_num = 0;
+ sensor_ext->mipi_speed = 0;
+ sensor_ext->fast_open_sensor = 0;
+ sensor_ext->self_calibration_mode = 0;
+ if (samsung_rev() >= EXYNOS4412_REV_2_0)
+ sensor_ext->i2c_sclk = 88000000;
+ else
+ sensor_ext->i2c_sclk = 80000000;
+ fimc_is_mem_cache_clean((void *)dev->is_p_region,
+ IS_PARAM_SIZE);
dev->af.use_af = 1;
dev->sensor.sensor_type = SENSOR_S5K4E5_CSI_B;
writel(SENSOR_NAME_S5K4E5, dev->regs + ISSR2);
writel(SENSOR_CONTROL_I2C1, dev->regs + ISSR3);
- writel(0x0, dev->regs + ISSR4);
+ writel(virt_to_phys(sensor_ext), dev->regs + ISSR4);
break;
case SENSOR_S5K6A3_CSI_B_CUSTOM:
sensor_ext = (struct sensor_open_extended *)
@@ -1143,6 +1216,10 @@ void fimc_is_hw_open_sensor(struct fimc_is_dev *dev, u32 id, u32 sensor_index)
sensor_ext->mipi_speed = 0;
sensor_ext->fast_open_sensor = 6;
sensor_ext->self_calibration_mode = 1;
+ if (samsung_rev() >= EXYNOS4412_REV_2_0)
+ sensor_ext->i2c_sclk = 88000000;
+ else
+ sensor_ext->i2c_sclk = 80000000;
fimc_is_mem_cache_clean((void *)dev->is_p_region,
IS_PARAM_SIZE);
dev->af.use_af = 0;