aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-exynos/midas-camera.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-exynos/midas-camera.c')
-rw-r--r--arch/arm/mach-exynos/midas-camera.c228
1 files changed, 188 insertions, 40 deletions
diff --git a/arch/arm/mach-exynos/midas-camera.c b/arch/arm/mach-exynos/midas-camera.c
index d120808..636ba13 100644
--- a/arch/arm/mach-exynos/midas-camera.c
+++ b/arch/arm/mach-exynos/midas-camera.c
@@ -75,18 +75,38 @@ static int __init camera_class_init(void)
subsys_initcall(camera_class_init);
+#if defined(CONFIG_MACH_T0)
+#ifdef CONFIG_TARGET_LOCALE_EUR
+#ifdef CONFIG_MACH_T0_EUR_LTE
+#define USE_8M_CAM_SENSOR_CORE_REVISION 0x04
+#else /*T0_EUR_3G*/
+#define USE_8M_CAM_SENSOR_CORE_REVISION 0x05
+#endif
+#elif defined(CONFIG_TARGET_LOCALE_CHN)
+#define USE_8M_CAM_SENSOR_CORE_REVISION 0x05
+#else
+#define USE_8M_CAM_SENSOR_CORE_REVISION 0x04
+#endif
+#elif defined(CONFIG_MACH_BAFFIN)
+#define FRONT_CAM_MCLK_DEVIDED_REVISION 0x00
+#define USE_8M_CAM_SENSOR_CORE_REVISION 0x00
+#else
#if defined(CONFIG_MACH_C1_KOR_SKT) || defined(CONFIG_MACH_C1_KOR_KT)
-#define FRONT_CAM_MCLK_DEVIDED_REVISION 0x06
+#define FRONT_CAM_MCLK_DEVIDED_REVISION 0x07
#define USE_8M_CAM_SENSOR_CORE_REVISION 0x09
#elif defined(CONFIG_MACH_C1_KOR_LGT)
-#define FRONT_CAM_MCLK_DEVIDED_REVISION 0x04
+#define FRONT_CAM_MCLK_DEVIDED_REVISION 0x05
#define USE_8M_CAM_SENSOR_CORE_REVISION 0x07
#elif defined(CONFIG_MACH_C1_USA_ATT)
-#define FRONT_CAM_MCLK_DEVIDED_REVISION 0x05
-#elif defined(CONFIG_MACH_C1VZW)
-#define FRONT_CAM_MCLK_DEVIDED_REVISION 0x0A
+#define FRONT_CAM_MCLK_DEVIDED_REVISION 0x06
+#define USE_8M_CAM_SENSOR_CORE_REVISION 0x09
+#elif defined(CONFIG_MACH_REDWOOD)
+#define FRONT_CAM_MCLK_DEVIDED_REVISION 0x04
+#define USE_8M_CAM_SENSOR_CORE_REVISION 0xFF
#else
-#define FRONT_CAM_MCLK_DEVIDED_REVISION 0x08
+#define FRONT_CAM_MCLK_DEVIDED_REVISION 0x09
+#define USE_8M_CAM_SENSOR_CORE_REVISION 0xFF
+#endif
#endif
#if defined(CONFIG_VIDEO_FIMC)
@@ -323,7 +343,15 @@ static int s5k6a3_gpio_request(void)
return ret;
}
- if (system_rev <= FRONT_CAM_MCLK_DEVIDED_REVISION)
+#if defined(CONFIG_MACH_T0) || defined(CONFIG_MACH_M3) || \
+ defined(CONFIG_MACH_SLP_T0_LTE)
+ ret = gpio_request(GPIO_VTCAM_MCLK, "GPM2");
+ if (ret) {
+ printk(KERN_ERR "fail to request gpio(GPIO_VTCAM_MCLK)\n");
+ return ret;
+ }
+#else
+ if (system_rev < FRONT_CAM_MCLK_DEVIDED_REVISION)
ret = gpio_request(GPIO_CAM_MCLK, "GPJ1");
else
ret = gpio_request(GPIO_VTCAM_MCLK, "GPM2");
@@ -331,6 +359,7 @@ static int s5k6a3_gpio_request(void)
printk(KERN_ERR "fail to request gpio(GPIO_VTCAM_MCLK)\n");
return ret;
}
+#endif
ret = gpio_request(GPIO_CAM_VT_nRST, "GPM1");
if (ret) {
@@ -357,7 +386,17 @@ static int s5k6a3_power_on(void)
udelay(100);
/* MCLK */
- if (system_rev <= FRONT_CAM_MCLK_DEVIDED_REVISION) {
+#if defined(CONFIG_MACH_T0) || defined(CONFIG_MACH_M3) ||\
+ defined(CONFIG_MACH_SLP_T0_LTE)
+ ret = s3c_gpio_cfgpin(GPIO_VTCAM_MCLK, S3C_GPIO_SFN(3));
+ s3c_gpio_setpull(GPIO_VTCAM_MCLK, S3C_GPIO_PULL_NONE);
+#if defined(CONFIG_MACH_T0) || defined(CONFIG_MACH_SLP_T0_LTE)
+ s5p_gpio_set_drvstr(GPIO_VTCAM_MCLK, S5P_GPIO_DRVSTR_LV1);
+#else
+ s5p_gpio_set_drvstr(GPIO_VTCAM_MCLK, S5P_GPIO_DRVSTR_LV2);
+#endif
+#else
+ if (system_rev < FRONT_CAM_MCLK_DEVIDED_REVISION) {
ret = s3c_gpio_cfgpin(GPIO_CAM_MCLK, S3C_GPIO_SFN(2));
s3c_gpio_setpull(GPIO_CAM_MCLK, S3C_GPIO_PULL_NONE);
s5p_gpio_set_drvstr(GPIO_CAM_MCLK, S5P_GPIO_DRVSTR_LV2);
@@ -366,6 +405,7 @@ static int s5k6a3_power_on(void)
s3c_gpio_setpull(GPIO_VTCAM_MCLK, S3C_GPIO_PULL_NONE);
s5p_gpio_set_drvstr(GPIO_VTCAM_MCLK, S5P_GPIO_DRVSTR_LV2);
}
+#endif
CAM_CHECK_ERR_RET(ret, "cfg mclk");
/* VT_RESET */
@@ -382,10 +422,16 @@ static int s5k6a3_power_on(void)
gpio_free(GPIO_CAM_IO_EN);
gpio_free(GPIO_CAM_VT_nRST);
- if (system_rev <= FRONT_CAM_MCLK_DEVIDED_REVISION)
+
+#if defined(CONFIG_MACH_T0) || defined(CONFIG_MACH_M3) || \
+ defined(CONFIG_MACH_SLP_T0_LTE)
+ gpio_free(GPIO_VTCAM_MCLK);
+#else
+ if (system_rev < FRONT_CAM_MCLK_DEVIDED_REVISION)
gpio_free(GPIO_CAM_MCLK);
else
gpio_free(GPIO_VTCAM_MCLK);
+#endif
return ret;
}
@@ -419,7 +465,12 @@ static int s5k6a3_power_down(void)
udelay(500);
/* MCLK */
- if (system_rev <= FRONT_CAM_MCLK_DEVIDED_REVISION) {
+#if defined(CONFIG_MACH_T0) || defined(CONFIG_MACH_M3) || \
+ defined(CONFIG_MACH_SLP_T0_LTE)
+ ret = s3c_gpio_cfgpin(GPIO_VTCAM_MCLK, S3C_GPIO_INPUT);
+ s3c_gpio_setpull(GPIO_VTCAM_MCLK, S3C_GPIO_PULL_DOWN);
+#else
+ if (system_rev < FRONT_CAM_MCLK_DEVIDED_REVISION) {
ret = s3c_gpio_cfgpin(GPIO_CAM_MCLK, S3C_GPIO_INPUT);
s3c_gpio_setpull(GPIO_CAM_MCLK, S3C_GPIO_PULL_DOWN);
@@ -427,15 +478,21 @@ static int s5k6a3_power_down(void)
ret = s3c_gpio_cfgpin(GPIO_VTCAM_MCLK, S3C_GPIO_INPUT);
s3c_gpio_setpull(GPIO_VTCAM_MCLK, S3C_GPIO_PULL_DOWN);
}
+#endif
CAM_CHECK_ERR(ret, "cfg mclk");
gpio_free(GPIO_CAM_IO_EN);
gpio_free(GPIO_CAM_VT_nRST);
- if (system_rev <= FRONT_CAM_MCLK_DEVIDED_REVISION)
+#if defined(CONFIG_MACH_T0) || defined(CONFIG_MACH_M3) || \
+ defined(CONFIG_MACH_SLP_T0_LTE)
+ gpio_free(GPIO_VTCAM_MCLK);
+#else
+ if (system_rev < FRONT_CAM_MCLK_DEVIDED_REVISION)
gpio_free(GPIO_CAM_MCLK);
else
gpio_free(GPIO_VTCAM_MCLK);
+#endif
return ret;
}
@@ -462,10 +519,12 @@ error_out:
static const char *s5k6a3_get_clk_name(void)
{
-#ifdef CONFIG_MACH_P4NOTE
+#if defined(CONFIG_MACH_P4NOTE) || \
+ defined(CONFIG_MACH_T0) || defined(CONFIG_MACH_M3) \
+ || defined(CONFIG_MACH_SLP_T0_LTE)
return "sclk_cam1";
#else
- if (system_rev <= FRONT_CAM_MCLK_DEVIDED_REVISION)
+ if (system_rev < FRONT_CAM_MCLK_DEVIDED_REVISION)
return "sclk_cam0";
else
return "sclk_cam1";
@@ -653,20 +712,28 @@ static int s5c73m3_gpio_request(void)
printk(KERN_ERR "fail to request gpio(GPIO_CAM_IO_EN)\n");
return ret;
}
-
+#if defined(CONFIG_MACH_M3_JPN_DCM)
+ ret = gpio_request(GPIO_CAM_AF_EN, "GPM1");
+#else
ret = gpio_request(GPIO_CAM_AF_EN, "GPM0");
+#endif
if (ret) {
printk(KERN_ERR "faile to request gpio(GPIO_CAM_AF_EN)\n");
return ret;
}
+#if defined(CONFIG_MACH_M3_JPN_DCM)
+ ret = gpio_request(GPIO_ISP_CORE_EN, "GPM1");
+#else
ret = gpio_request(GPIO_ISP_CORE_EN, "GPM0");
+#endif
if (ret) {
printk(KERN_ERR "fail to request gpio(GPIO_ISP_CORE_EN)\n");
return ret;
}
-#if defined(CONFIG_MACH_C1) && defined(CONFIG_TARGET_LOCALE_KOR)
+#if defined(CONFIG_MACH_C1) || defined(CONFIG_MACH_T0) || \
+ defined(CONFIG_MACH_SLP_T0_LTE) || defined(CONFIG_MACH_BAFFIN)
if (system_rev >= USE_8M_CAM_SENSOR_CORE_REVISION) {
ret = gpio_request(GPIO_CAM_SENSOR_CORE_EN, "GPM0");
if (ret) {
@@ -687,7 +754,8 @@ static void s5c73m3_gpio_free(void)
gpio_free(GPIO_CAM_AF_EN);
gpio_free(GPIO_ISP_CORE_EN);
-#if defined(CONFIG_MACH_C1) && defined(CONFIG_TARGET_LOCALE_KOR)
+#if defined(CONFIG_MACH_C1) || defined(CONFIG_MACH_T0) || \
+ defined(CONFIG_MACH_SLP_T0_LTE) || defined(CONFIG_MACH_BAFFIN)
if (system_rev >= USE_8M_CAM_SENSOR_CORE_REVISION)
gpio_free(GPIO_CAM_SENSOR_CORE_EN);
#endif
@@ -724,11 +792,14 @@ static int s5c73m3_power_on(void)
CAM_CHECK_ERR_RET(ret, "output IO_EN");
/* CAM_SENSOR_CORE_1.2V */
-#if defined(CONFIG_MACH_C1) && defined(CONFIG_TARGET_LOCALE_KOR)
+#if defined(CONFIG_MACH_C1) || defined(CONFIG_MACH_T0) || \
+ defined(CONFIG_MACH_SLP_T0_LTE) || defined(CONFIG_MACH_BAFFIN)
+ printk(KERN_DEBUG "system_rev : %d\n", system_rev);
if (system_rev >= USE_8M_CAM_SENSOR_CORE_REVISION) {
ret = gpio_direction_output(GPIO_CAM_SENSOR_CORE_EN, 1);
CAM_CHECK_ERR_RET(ret, "output CAM_SENSOR_CORE_EN");
- mdelay(5);
+ /* delay is needed : external LDO is slower than MCLK control*/
+ udelay(200);
} else {
regulator = regulator_get(NULL, "cam_sensor_core_1.2v");
if (IS_ERR(regulator))
@@ -754,7 +825,11 @@ static int s5c73m3_power_on(void)
ret = s3c_gpio_cfgpin(GPIO_CAM_MCLK, S3C_GPIO_SFN(2));
CAM_CHECK_ERR_RET(ret, "cfg mclk");
s3c_gpio_setpull(GPIO_CAM_MCLK, S3C_GPIO_PULL_NONE);
+#if defined(CONFIG_MACH_T0) || defined(CONFIG_MACH_SLP_T0_LTE)
+ s5p_gpio_set_drvstr(GPIO_CAM_MCLK, S5P_GPIO_DRVSTR_LV2);
+#else
s5p_gpio_set_drvstr(GPIO_CAM_MCLK, S5P_GPIO_DRVSTR_LV3);
+#endif
/* CAM_AF_2.8V */
ret = gpio_direction_output(GPIO_CAM_AF_EN, 1);
@@ -836,7 +911,8 @@ static int s5c73m3_power_down(void)
CAM_CHECK_ERR(ret, "disable cam_isp_sensor_1.8v");
/* CAM_SENSOR_CORE_1.2V */
-#if defined(CONFIG_MACH_C1) && defined(CONFIG_TARGET_LOCALE_KOR)
+#if defined(CONFIG_MACH_C1) || defined(CONFIG_MACH_T0) || \
+ defined(CONFIG_MACH_SLP_T0_LTE) || defined(CONFIG_MACH_BAFFIN)
if (system_rev >= USE_8M_CAM_SENSOR_CORE_REVISION) {
ret = gpio_direction_output(GPIO_CAM_SENSOR_CORE_EN, 0);
CAM_CHECK_ERR_RET(ret, "output CAM_SENSOR_CORE_EN");
@@ -912,11 +988,6 @@ error_out:
static int s5c73m3_get_i2c_busnum(void)
{
-#if 0
- if (system_rev == 0x03) /*M0, M1 REV00*/
- return 18;
- else
-#endif
return 0;
}
@@ -1005,7 +1076,11 @@ static int m5mo_power_on(void)
printk(KERN_ERR "faile to request gpio(GPIO_CAM_VGA_nRST)\n");
return ret;
}
+#if defined(CONFIG_MACH_M3_JPN_DCM)
+ ret = gpio_request(GPIO_ISP_CORE_EN, "GPM1");
+#else
ret = gpio_request(GPIO_ISP_CORE_EN, "GPM0");
+#endif
if (ret) {
printk(KERN_ERR "fail to request gpio(CAM_SENSOR_CORE)\n");
return ret;
@@ -1143,7 +1218,11 @@ static int m5mo_power_down(void)
printk(KERN_ERR "faile to request gpio(GPIO_CAM_VGA_nRST)\n");
return ret;
}
+#if defined(CONFIG_MACH_M3_JPN_DCM)
+ ret = gpio_request(GPIO_ISP_CORE_EN, "GPM1");
+#else
ret = gpio_request(GPIO_ISP_CORE_EN, "GPM0");
+#endif
if (ret) {
printk(KERN_ERR "fail to request gpio(CAM_SENSOR_CORE)\n");
return ret;
@@ -1360,7 +1439,11 @@ static int m9mo_power_on(void)
printk(KERN_DEBUG "%s: in\n", __func__);
+#if defined(CONFIG_MACH_M3_JPN_DCM)
+ ret = gpio_request(GPIO_ISP_CORE_EN, "GPM1");
+#else
ret = gpio_request(GPIO_ISP_CORE_EN, "GPM0");
+#endif
if (ret) {
printk(KERN_ERR "faile to request gpio(GPIO_ISP_CORE_EN)\n");
return ret;
@@ -1385,16 +1468,6 @@ static int m9mo_power_on(void)
regulator_put(regulator);
CAM_CHECK_ERR_RET(ret, "enable cam_isp_1.2v");
- /* CAM_SENSOR_CORE_1.2V (CIS 1.2V) => LDO17*/
- regulator = regulator_get(NULL, "cam_sensor_core_1.2v");
- if (IS_ERR(regulator)) {
- CAM_CHECK_ERR_RET(ret, "output Err cam_sensor_core_1.2v");
- return -ENODEV;
- }
- ret = regulator_enable(regulator);
- regulator_put(regulator);
- CAM_CHECK_ERR_RET(ret, "enable cam_sensor_core_1.2v");
-
/* CAM_ISP_1.8V (ISP 1.8V) => LDO23*/
regulator = regulator_get(NULL, "cam_isp_1.8v");
if (IS_ERR(regulator)) {
@@ -1423,6 +1496,16 @@ static int m9mo_power_on(void)
regulator_put(regulator);
CAM_CHECK_ERR_RET(ret, "enable cam_sensor_2.8v");
+ /* CAM_SENSOR_CORE_1.2V (CIS 1.2V) => LDO17*/
+ regulator = regulator_get(NULL, "cam_sensor_core_1.2v");
+ if (IS_ERR(regulator)) {
+ CAM_CHECK_ERR_RET(ret, "output Err cam_sensor_core_1.2v");
+ return -ENODEV;
+ }
+ ret = regulator_enable(regulator);
+ regulator_put(regulator);
+ CAM_CHECK_ERR_RET(ret, "enable cam_sensor_core_1.2v");
+
/* MCLK */
ret = s3c_gpio_cfgpin(GPIO_CAM_MCLK, S3C_GPIO_SFN(2));
CAM_CHECK_ERR_RET(ret, "cfg mclk");
@@ -1459,7 +1542,11 @@ static int m9mo_power_down(void)
return ret;
}
}
+#if defined(CONFIG_MACH_M3_JPN_DCM)
+ ret = gpio_request(GPIO_ISP_CORE_EN, "GPM1");
+#else
ret = gpio_request(GPIO_ISP_CORE_EN, "GPM0");
+#endif
if (ret) {
printk(KERN_ERR "faile to request gpio(GPIO_ISP_CORE_EN)\n");
return ret;
@@ -1565,6 +1652,7 @@ static int m9mo_power_down(void)
gpio_free(GPIO_MOT_EN);
gpio_free(GPIO_SAMBAZ_RESET);
}
+
gpio_free(GPIO_ISP_CORE_EN);
gpio_free(GPIO_ISP_RESET);
@@ -1577,6 +1665,57 @@ static int m9mo_flash_power(int enable)
return 0;
}
+static int m9mo_af_led_power_on(void)
+{
+ struct regulator *regulator;
+ int ret = 0;
+
+ /* AF_LED 3.3V => LDO24*/
+ regulator = regulator_get(NULL, "led_3.3v");
+ if (IS_ERR(regulator)) {
+ CAM_CHECK_ERR_RET(ret, "output Err led_3.3v");
+ return -ENODEV;
+ }
+ ret = regulator_enable(regulator);
+ regulator_put(regulator);
+ CAM_CHECK_ERR_RET(ret, "enable led_3.3v");
+
+ return ret;
+}
+
+static int m9mo_af_led_power_down(void)
+{
+ struct regulator *regulator;
+ int ret = 0;
+
+ /* AF_LED 3.3V => LDO24*/
+ regulator = regulator_get(NULL, "led_3.3v");
+ if (IS_ERR(regulator))
+ return -ENODEV;
+ if (regulator_is_enabled(regulator))
+ ret = regulator_force_disable(regulator);
+ regulator_put(regulator);
+ CAM_CHECK_ERR(ret, "disable led_3.3v");
+
+ return ret;
+}
+
+static int m9mo_af_led_power(int enable)
+{
+ int ret = 0;
+
+ printk(KERN_ERR "%s %s\n", __func__, enable ? "on" : "down");
+ if (enable) {
+ ret = m9mo_af_led_power_on();
+ if (unlikely(ret))
+ goto error_out;
+ } else {
+ ret = m9mo_af_led_power_down();
+ }
+error_out:
+ return ret;
+}
+
static int m9mo_power(int enable)
{
int ret = 0;
@@ -1623,7 +1762,7 @@ static int m9mo_config_sambaz(int enable)
}
ret = gpio_direction_output(GPIO_MOT_EN, 1);
CAM_CHECK_ERR(ret, "output reset");
- msleep(100);
+ msleep(2);
}
regulator = regulator_get(NULL, "mot_3.3v");
@@ -1632,7 +1771,7 @@ static int m9mo_config_sambaz(int enable)
ret = regulator_enable(regulator);
regulator_put(regulator);
CAM_CHECK_ERR_RET(ret, "mot_3.3v");
- mdelay(100);
+ mdelay(2);
regulator = regulator_get(NULL, "ois_1.5v");
if (IS_ERR(regulator))
@@ -1640,12 +1779,12 @@ static int m9mo_config_sambaz(int enable)
ret = regulator_enable(regulator);
regulator_put(regulator);
CAM_CHECK_ERR_RET(ret, "ois_1.5v");
- mdelay(10);
+ mdelay(2);
if (system_rev > 0) {
ret = gpio_direction_output(GPIO_SAMBAZ_RESET, 1);
CAM_CHECK_ERR(ret, "output reset");
- msleep(100);
+ msleep(2);
gpio_free(GPIO_MOT_EN);
gpio_free(GPIO_SAMBAZ_RESET);
@@ -1684,6 +1823,7 @@ static struct m9mo_platform_data m9mo_plat = {
.is_mipi = 1,
.config_isp_irq = m9mo_config_isp_irq,
.config_sambaz = m9mo_config_sambaz,
+ .af_led_power = m9mo_af_led_power,
.irq = IRQ_EINT(2),
};
@@ -1740,7 +1880,7 @@ static void isx012_flashtimer_handler(unsigned long data)
int ret = -ENODEV;
atomic_t *flash_status = (atomic_t *)data;
- pr_info("********** flashtimer_handler **********\n");
+ pr_info("********** flash_handler off **********\n");
ret = gpio_direction_output(GPIO_CAM_FLASH_EN, 0);
atomic_set(flash_status, ISX012_FLASH_OFF);
@@ -1780,7 +1920,7 @@ static int isx012_flash_en(u32 mode, u32 onoff)
ret = gpio_direction_output(GPIO_CAM_MOVIE_EN, 1);
else {
ret = gpio_direction_output(GPIO_CAM_FLASH_EN, 1);
- flash_timer.expires = get_jiffies_64() + HZ / 2;
+ flash_timer.expires = get_jiffies_64() + HZ;
add_timer(&flash_timer);
}
CAM_CHECK_ERR_GOTO(ret, out,
@@ -2655,7 +2795,11 @@ static int sr200pc20m_power_on(void)
printk(KERN_ERR "faile to request gpio(GPIO_CAM_VGA_nRST)\n");
return ret;
}
+#if defined(CONFIG_MACH_M3_JPN_DCM)
+ ret = gpio_request(GPIO_ISP_CORE_EN, "GPM1");
+#else
ret = gpio_request(GPIO_ISP_CORE_EN, "GPM0");
+#endif
if (ret) {
printk(KERN_ERR "fail to request gpio(CAM_SENSOR_CORE)\n");
return ret;
@@ -2773,7 +2917,11 @@ static int sr200pc20m_power_off(void)
printk(KERN_ERR "faile to request gpio(GPIO_CAM_VGA_nRST)\n");
return ret;
}
+#if defined(CONFIG_MACH_M3_JPN_DCM)
+ ret = gpio_request(GPIO_ISP_CORE_EN, "GPM1");
+#else
ret = gpio_request(GPIO_ISP_CORE_EN, "GPM0");
+#endif
if (ret) {
printk(KERN_ERR "fail to request gpio(CAM_SENSOR_CORE)\n");
return ret;