diff --git a/drivers/Makefile b/drivers/Makefile index 2ab203025f..ed3cbb5275 100644 --- a/drivers/Makefile +++ b/drivers/Makefile @@ -168,6 +168,13 @@ camera-$(CONFIG_LEDS_QPNP_FLASH_V2) += \ cam_sensor_module/cam_flash/cam_flash_core.o \ cam_sensor_module/cam_flash/cam_flash_soc.o +ifneq (,$(filter $(CONFIG_LEDS_QTI_FLASH),y m)) +camera-y += \ + cam_sensor_module/cam_flash/cam_flash_dev.o \ + cam_sensor_module/cam_flash/cam_flash_core.o \ + cam_sensor_module/cam_flash/cam_flash_soc.o +endif + camera-$(CONFIG_SPECTRA_CUSTOM) += \ cam_cust/cam_custom_hw_mgr/cam_custom_hw1/cam_custom_sub_mod_soc.o \ cam_cust/cam_custom_hw_mgr/cam_custom_hw1/cam_custom_sub_mod_dev.o \ diff --git a/drivers/cam_sensor_module/cam_flash/cam_flash_core.c b/drivers/cam_sensor_module/cam_flash/cam_flash_core.c index 2d8df8a0ac..fa8943fc8e 100644 --- a/drivers/cam_sensor_module/cam_flash/cam_flash_core.c +++ b/drivers/cam_sensor_module/cam_flash/cam_flash_core.c @@ -11,76 +11,35 @@ #include "cam_common_util.h" #include "cam_packet_util.h" -static int cam_flash_prepare(struct cam_flash_ctrl *flash_ctrl, - bool regulator_enable) +int cam_flash_led_prepare(struct led_trigger *trigger, int options, + int *max_current, bool is_wled) { int rc = 0; - struct cam_flash_private_soc *soc_private = - (struct cam_flash_private_soc *) - flash_ctrl->soc_info.soc_private; - if (!(flash_ctrl->switch_trigger)) { - CAM_ERR(CAM_FLASH, "Invalid argument"); - return -EINVAL; - } - - if (soc_private->is_wled_flash) { - if (regulator_enable && - flash_ctrl->is_regulator_enabled == false) { - rc = wled_flash_led_prepare(flash_ctrl->switch_trigger, - ENABLE_REGULATOR, NULL); - if (rc) { - CAM_ERR(CAM_FLASH, "enable reg failed: rc: %d", - rc); - return rc; - } - - flash_ctrl->is_regulator_enabled = true; - } else if (!regulator_enable && - flash_ctrl->is_regulator_enabled == true) { - rc = wled_flash_led_prepare(flash_ctrl->switch_trigger, - DISABLE_REGULATOR, NULL); - if (rc) { - CAM_ERR(CAM_FLASH, "disalbe reg fail: rc: %d", - rc); - return rc; - } - - flash_ctrl->is_regulator_enabled = false; - } else { - CAM_ERR(CAM_FLASH, "Wrong Wled flash state: %d", - flash_ctrl->flash_state); - rc = -EINVAL; + if (is_wled) { +#ifdef CONFIG_BACKLIGHT_QCOM_SPMI_WLED + rc = wled_flash_led_prepare(trigger, options, max_current); + if (rc) { + CAM_ERR(CAM_FLASH, "enable reg failed: rc: %d", + rc); + return rc; } +#else + return -EPERM; +#endif } else { - if (regulator_enable && - (flash_ctrl->is_regulator_enabled == false)) { - rc = qpnp_flash_led_prepare(flash_ctrl->switch_trigger, - ENABLE_REGULATOR, NULL); - if (rc) { - CAM_ERR(CAM_FLASH, - "Regulator enable failed rc = %d", rc); - return rc; - } - - flash_ctrl->is_regulator_enabled = true; - } else if ((!regulator_enable) && - (flash_ctrl->is_regulator_enabled == true)) { - rc = qpnp_flash_led_prepare(flash_ctrl->switch_trigger, - DISABLE_REGULATOR, NULL); - if (rc) { - CAM_ERR(CAM_FLASH, - "Regulator disable failed rc = %d", rc); - return rc; - } - - flash_ctrl->is_regulator_enabled = false; - } else { - CAM_ERR(CAM_FLASH, "Wrong Flash State : %d", - flash_ctrl->flash_state); - rc = -EINVAL; +#if IS_REACHABLE(CONFIG_LEDS_QPNP_FLASH_V2) + rc = qpnp_flash_led_prepare(trigger, options, max_current); +#elif IS_REACHABLE(CONFIG_LEDS_QTI_FLASH) + rc = qti_flash_led_prepare(trigger, options, max_current); +#endif + if (rc) { + CAM_ERR(CAM_FLASH, + "Regulator enable failed rc = %d", rc); + return rc; } } + return rc; } @@ -180,39 +139,6 @@ free_power_settings: return rc; } -int cam_flash_pmic_power_ops(struct cam_flash_ctrl *fctrl, - bool regulator_enable) -{ - int rc = 0; - - if (!(fctrl->switch_trigger)) { - CAM_ERR(CAM_FLASH, "Invalid argument"); - return -EINVAL; - } - - if (regulator_enable) { - rc = cam_flash_prepare(fctrl, true); - if (rc) { - CAM_ERR(CAM_FLASH, - "Enable Regulator Failed rc = %d", rc); - return rc; - } - fctrl->last_flush_req = 0; - } - - if (!regulator_enable) { - if ((fctrl->flash_state == CAM_FLASH_STATE_START) && - (fctrl->is_regulator_enabled == true)) { - rc = cam_flash_prepare(fctrl, false); - if (rc) - CAM_ERR(CAM_FLASH, - "Disable Regulator Failed rc: %d", rc); - } - } - - return rc; -} - int cam_flash_i2c_power_ops(struct cam_flash_ctrl *fctrl, bool regulator_enable) { @@ -1366,13 +1292,6 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg) fctrl->nrt_info.cmn_attr.cmd_type = CAMERA_SENSOR_FLASH_CMD_TYPE_INIT_INFO; - rc = fctrl->func_tbl.power_ops(fctrl, true); - if (rc) { - CAM_ERR(CAM_FLASH, - "Enable Regulator Failed rc = %d", rc); - return rc; - } - fctrl->flash_state = CAM_FLASH_STATE_CONFIG; break; @@ -1599,16 +1518,9 @@ int cam_flash_pmic_pkt_parser(struct cam_flash_ctrl *fctrl, void *arg) flash_query_info = (struct cam_flash_query_curr *)cmd_buf; - if (soc_private->is_wled_flash) - rc = wled_flash_led_prepare( - fctrl->switch_trigger, - QUERY_MAX_AVAIL_CURRENT, - &query_curr_ma); - else - rc = qpnp_flash_led_prepare( - fctrl->switch_trigger, - QUERY_MAX_AVAIL_CURRENT, - &query_curr_ma); + rc = cam_flash_led_prepare(fctrl->switch_trigger, + QUERY_MAX_AVAIL_CURRENT, &query_curr_ma, + soc_private->is_wled_flash); CAM_DBG(CAM_FLASH, "query_curr_ma = %d", query_curr_ma); @@ -1784,10 +1696,12 @@ void cam_flash_shutdown(struct cam_flash_ctrl *fctrl) if ((fctrl->flash_state == CAM_FLASH_STATE_CONFIG) || (fctrl->flash_state == CAM_FLASH_STATE_START)) { fctrl->func_tbl.flush_req(fctrl, FLUSH_ALL, 0); - rc = fctrl->func_tbl.power_ops(fctrl, false); - if (rc) - CAM_ERR(CAM_FLASH, "Power Down Failed rc: %d", - rc); + if (fctrl->func_tbl.power_ops) { + rc = fctrl->func_tbl.power_ops(fctrl, false); + if (rc) + CAM_ERR(CAM_FLASH, "Power Down Failed rc: %d", + rc); + } } rc = cam_flash_release_dev(fctrl); diff --git a/drivers/cam_sensor_module/cam_flash/cam_flash_core.h b/drivers/cam_sensor_module/cam_flash/cam_flash_core.h index c382809dbb..f4e451c1ef 100644 --- a/drivers/cam_sensor_module/cam_flash/cam_flash_core.h +++ b/drivers/cam_sensor_module/cam_flash/cam_flash_core.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. */ #ifndef _CAM_FLASH_CORE_H_ @@ -14,6 +14,8 @@ int cam_flash_establish_link(struct cam_req_mgr_core_dev_link_setup *link); int cam_flash_apply_request(struct cam_req_mgr_apply_request *apply); int cam_flash_process_evt(struct cam_req_mgr_link_evt_data *event_data); int cam_flash_flush_request(struct cam_req_mgr_flush_request *flush); +int cam_flash_led_prepare(struct led_trigger *trigger, int options, + int *max_current, bool is_wled); #endif /*_CAM_FLASH_CORE_H_*/ diff --git a/drivers/cam_sensor_module/cam_flash/cam_flash_dev.c b/drivers/cam_sensor_module/cam_flash/cam_flash_dev.c index 6b872be656..320caa6d9c 100644 --- a/drivers/cam_sensor_module/cam_flash/cam_flash_dev.c +++ b/drivers/cam_sensor_module/cam_flash/cam_flash_dev.c @@ -120,8 +120,10 @@ static int32_t cam_flash_driver_cmd(struct cam_flash_ctrl *fctrl, CAM_WARN(CAM_FLASH, "Failed in destroying the device Handle"); - if (fctrl->func_tbl.power_ops(fctrl, false)) - CAM_WARN(CAM_FLASH, "Power Down Failed"); + if (fctrl->func_tbl.power_ops) { + if (fctrl->func_tbl.power_ops(fctrl, false)) + CAM_WARN(CAM_FLASH, "Power Down Failed"); + } fctrl->flash_state = CAM_FLASH_STATE_INIT; break; @@ -461,7 +463,7 @@ static int cam_flash_component_bind(struct device *dev, /* PMIC Flash */ fctrl->func_tbl.parser = cam_flash_pmic_pkt_parser; fctrl->func_tbl.apply_setting = cam_flash_pmic_apply_setting; - fctrl->func_tbl.power_ops = cam_flash_pmic_power_ops; + fctrl->func_tbl.power_ops = NULL; fctrl->func_tbl.flush_req = cam_flash_pmic_flush_request; } diff --git a/drivers/cam_sensor_module/cam_flash/cam_flash_dev.h b/drivers/cam_sensor_module/cam_flash/cam_flash_dev.h index 59911a5fb3..64bb25308d 100644 --- a/drivers/cam_sensor_module/cam_flash/cam_flash_dev.h +++ b/drivers/cam_sensor_module/cam_flash/cam_flash_dev.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* - * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. */ #ifndef _CAM_FLASH_DEV_H_ @@ -13,12 +13,18 @@ #include #include #include -#include #include #include #include #include #include + +#if IS_REACHABLE(CONFIG_LEDS_QPNP_FLASH_V2) +#include +#elif IS_REACHABLE(CONFIG_LEDS_QTI_FLASH) +#include +#endif + #include "cam_req_mgr_util.h" #include "cam_req_mgr_interface.h" #include "cam_subdev.h" diff --git a/drivers/cam_sensor_module/cam_flash/cam_flash_soc.c b/drivers/cam_sensor_module/cam_flash/cam_flash_soc.c index 762977f4b9..dc56aebfe7 100644 --- a/drivers/cam_sensor_module/cam_flash/cam_flash_soc.c +++ b/drivers/cam_sensor_module/cam_flash/cam_flash_soc.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. */ #include @@ -78,10 +78,11 @@ static int32_t cam_get_source_node_info( &fctrl->flash_trigger[i]); if (soc_private->is_wled_flash) { - rc = wled_flash_led_prepare( + rc = cam_flash_led_prepare( fctrl->flash_trigger[i], - QUERY_MAX_CURRENT, - &soc_private->flash_max_current[i]); + QUERY_MAX_AVAIL_CURRENT, + &soc_private->flash_max_current[i], + true); if (rc) { CAM_ERR(CAM_FLASH, "WLED FLASH max_current read fail: %d", @@ -94,6 +95,9 @@ static int32_t cam_get_source_node_info( rc = of_property_read_u32(flash_src_node, "qcom,max-current", &soc_private->flash_max_current[i]); + rc &= of_property_read_u32(flash_src_node, + "qcom,max-current-ma", + &soc_private->flash_max_current[i]); if (rc < 0) { CAM_WARN(CAM_FLASH, "LED FLASH max-current read fail: %d", @@ -165,10 +169,11 @@ static int32_t cam_get_source_node_info( &fctrl->torch_trigger[i]); if (soc_private->is_wled_flash) { - rc = wled_flash_led_prepare( + rc = cam_flash_led_prepare( fctrl->torch_trigger[i], - QUERY_MAX_CURRENT, - &soc_private->torch_max_current[i]); + QUERY_MAX_AVAIL_CURRENT, + &soc_private->torch_max_current[i], + true); if (rc) { CAM_ERR(CAM_FLASH, "WLED TORCH max_current read fail: %d", @@ -180,6 +185,9 @@ static int32_t cam_get_source_node_info( rc = of_property_read_u32(torch_src_node, "qcom,max-current", &soc_private->torch_max_current[i]); + rc &= of_property_read_u32(torch_src_node, + "qcom,max-current-ma", + &soc_private->torch_max_current[i]); if (rc < 0) { CAM_WARN(CAM_FLASH, "LED-TORCH max-current read failed: %d", diff --git a/drivers/camera_main.c b/drivers/camera_main.c index 35bd853f44..6583c922a1 100644 --- a/drivers/camera_main.c +++ b/drivers/camera_main.c @@ -23,7 +23,8 @@ #include "cam_eeprom_dev.h" #include "cam_ois_dev.h" -#if IS_REACHABLE(CONFIG_LEDS_QPNP_FLASH_V2) +#if IS_REACHABLE(CONFIG_LEDS_QPNP_FLASH_V2) || \ + IS_REACHABLE(CONFIG_LEDS_QTI_FLASH) #include "cam_flash_dev.h" #endif @@ -102,7 +103,8 @@ static const struct camera_submodule_component camera_sensor[] = { {&cam_sensor_driver_init, &cam_sensor_driver_exit}, {&cam_eeprom_driver_init, &cam_eeprom_driver_exit}, {&cam_ois_driver_init, &cam_ois_driver_exit}, -#if IS_REACHABLE(CONFIG_LEDS_QPNP_FLASH_V2) +#if IS_REACHABLE(CONFIG_LEDS_QPNP_FLASH_V2) || \ + IS_REACHABLE(CONFIG_LEDS_QTI_FLASH) {&cam_flash_init_module, &cam_flash_exit_module}, #endif #endif @@ -238,7 +240,8 @@ static struct platform_driver *const cam_component_drivers[] = { &cam_sensor_platform_driver, &cam_eeprom_platform_driver, &cam_ois_platform_driver, -#if IS_REACHABLE(CONFIG_LEDS_QPNP_FLASH_V2) +#if IS_REACHABLE(CONFIG_LEDS_QPNP_FLASH_V2) || \ + IS_REACHABLE(CONFIG_LEDS_QTI_FLASH) &cam_flash_platform_driver, #endif #endif diff --git a/drivers/camera_main.h b/drivers/camera_main.h index 3de446d08b..af832ee60f 100644 --- a/drivers/camera_main.h +++ b/drivers/camera_main.h @@ -34,7 +34,8 @@ extern struct platform_driver cam_actuator_platform_driver; extern struct platform_driver cam_sensor_platform_driver; extern struct platform_driver cam_eeprom_platform_driver; extern struct platform_driver cam_ois_platform_driver; -#if IS_REACHABLE(CONFIG_LEDS_QPNP_FLASH_V2) +#if IS_REACHABLE(CONFIG_LEDS_QPNP_FLASH_V2) || \ + IS_REACHABLE(CONFIG_LEDS_QTI_FLASH) extern struct platform_driver cam_flash_platform_driver; #endif #endif