diff --git a/arch/arm/mach-msm/board-msm7627a-camera.c b/arch/arm/mach-msm/board-msm7627a-camera.c index 22690733180..94b8710e3b6 100644 --- a/arch/arm/mach-msm/board-msm7627a-camera.c +++ b/arch/arm/mach-msm/board-msm7627a-camera.c @@ -206,9 +206,9 @@ static struct msm_camera_sensor_platform_info sensor_board_info_ov5647 = { }; static struct msm_camera_sensor_flash_src msm_flash_src_ov5647 = { - .flash_sr_type = MSM_CAMERA_FLASH_SRC_LED, - ._fsrc.led_src.led_name = "flashlight", - ._fsrc.led_src.led_name_len = 10, + .flash_sr_type = MSM_CAMERA_FLASH_SRC_LED1, + ._fsrc.ext_driver_src.led_en = 13, + ._fsrc.ext_driver_src.led_flash_en = 32, }; static struct msm_camera_sensor_flash_data flash_ov5647 = { diff --git a/arch/arm/mach-msm/include/mach/board.h b/arch/arm/mach-msm/include/mach/board.h index 82b14455a70..f01b0f7cf9f 100644 --- a/arch/arm/mach-msm/include/mach/board.h +++ b/arch/arm/mach-msm/include/mach/board.h @@ -99,6 +99,7 @@ struct msm_camera_legacy_device_platform_data { #define MSM_CAMERA_FLASH_SRC_CURRENT_DRIVER (0x00000001<<2) #define MSM_CAMERA_FLASH_SRC_EXT (0x00000001<<3) #define MSM_CAMERA_FLASH_SRC_LED (0x00000001<<3) +#define MSM_CAMERA_FLASH_SRC_LED1 (0x00000001<<4) struct msm_camera_sensor_flash_pmic { uint8_t num_of_src; diff --git a/drivers/media/video/msm/flash.c b/drivers/media/video/msm/flash.c index 6985f3cf2c5..a86e5c4b7f8 100644 --- a/drivers/media/video/msm/flash.c +++ b/drivers/media/video/msm/flash.c @@ -212,6 +212,66 @@ int msm_camera_flash_current_driver( #endif /* CONFIG_LEDS_PMIC8058 */ return rc; } + +int msm_camera_flash_led( + struct msm_camera_sensor_flash_external *external, + unsigned led_state) +{ + int rc = 0; + + CDBG("msm_camera_flash_led: %d\n", led_state); + switch (led_state) { + case MSM_CAMERA_LED_INIT: + rc = gpio_request(external->led_en, "sgm3141"); + CDBG("MSM_CAMERA_LED_INIT: gpio_req: %d %d\n", + external->led_en, rc); + if (!rc) + gpio_direction_output(external->led_en, 0); + else + return 0; + + rc = gpio_request(external->led_flash_en, "sgm3141"); + CDBG("MSM_CAMERA_LED_INIT: gpio_req: %d %d\n", + external->led_flash_en, rc); + if (!rc) + gpio_direction_output(external->led_flash_en, 0); + + break; + + case MSM_CAMERA_LED_RELEASE: + CDBG("MSM_CAMERA_LED_RELEASE\n"); + gpio_set_value_cansleep(external->led_en, 0); + gpio_free(external->led_en); + gpio_set_value_cansleep(external->led_flash_en, 0); + gpio_free(external->led_flash_en); + break; + + case MSM_CAMERA_LED_OFF: + CDBG("MSM_CAMERA_LED_OFF\n"); + gpio_set_value_cansleep(external->led_en, 0); + gpio_set_value_cansleep(external->led_flash_en, 0); + break; + + case MSM_CAMERA_LED_LOW: + CDBG("MSM_CAMERA_LED_LOW\n"); + gpio_set_value_cansleep(external->led_en, 1); + gpio_set_value_cansleep(external->led_flash_en, 1); + break; + + case MSM_CAMERA_LED_HIGH: + CDBG("MSM_CAMERA_LED_HIGH\n"); + gpio_set_value_cansleep(external->led_en, 1); + gpio_set_value_cansleep(external->led_flash_en, 1); + break; + + default: + rc = -EFAULT; + break; + } + + return rc; +} + int msm_camera_flash_external( struct msm_camera_sensor_flash_external *external, unsigned led_state) @@ -439,6 +499,12 @@ int32_t msm_camera_flash_set_led_state( led_state); break; + case MSM_CAMERA_FLASH_SRC_LED1: + rc = msm_camera_flash_led( + &fdata->flash_src->_fsrc.ext_driver_src, + led_state); + break; + default: rc = -ENODEV; break;