diff options
Diffstat (limited to 'arch/arm/mach-exynos/midas-camera.c')
-rw-r--r-- | arch/arm/mach-exynos/midas-camera.c | 228 |
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 d1208086cbd..636ba134564 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; |