static void bcl_periph_vbat_notify(enum bcl_trip_type type, int trip_temp, void *data) { if (type == BCL_HIGH_TRIP) bcl_vph_notify(BCL_HIGH_THRESHOLD); else bcl_vph_notify(BCL_LOW_THRESHOLD); return; }
static void bcl_vph_notification(enum qpnp_tm_state state, void *ctx) { struct bcl_context *bcl = ctx; int ret = 0; mutex_lock(&bcl_notify_mutex); if (bcl->btm_mode == BCL_MONITOR_DISABLED) goto unlock_and_exit; switch (state) { case ADC_TM_LOW_STATE: if (bcl->btm_mode != BCL_VPH_MONITOR_MODE) { pr_err("Low thresh received with invalid btm mode:%d\n", bcl->btm_mode); ibat_mode_set(BCL_DEVICE_DISABLED); goto unlock_and_exit; } pr_debug("Initiating Ibat current monitoring\n"); bcl_vph_notify(BCL_LOW_THRESHOLD); bcl_config_ibat_adc(gbcl, BCL_HIGH_THRESHOLD_TYPE); bcl_config_vph_adc(gbcl, BCL_HIGH_THRESHOLD_TYPE); bcl->btm_mode = BCL_IBAT_MONITOR_MODE; break; case ADC_TM_HIGH_STATE: if (bcl->btm_mode != BCL_IBAT_MONITOR_MODE && bcl->btm_mode != BCL_IBAT_HIGH_LOAD_MODE) { pr_err("High thresh received with invalid btm mode:%d\n" , bcl->btm_mode); ibat_mode_set(BCL_DEVICE_DISABLED); goto unlock_and_exit; } pr_debug("Exiting Ibat current monitoring\n"); bcl->btm_mode = BCL_VPH_MONITOR_MODE; ret = ibat_disable(); if (ret) { pr_err("Error disabling ibat ADC. err:%d\n", ret); goto unlock_and_exit; } bcl_vph_notify(BCL_HIGH_THRESHOLD); bcl_config_vph_adc(gbcl, BCL_LOW_THRESHOLD_TYPE); break; default: goto set_thresh; } unlock_and_exit: mutex_unlock(&bcl_notify_mutex); return; set_thresh: mutex_unlock(&bcl_notify_mutex); bcl_config_vph_adc(gbcl, BCL_HIGH_THRESHOLD_TYPE); return; }
static void bcl_periph_mode_set(enum bcl_device_mode mode) { int ret = 0; if (mode == BCL_DEVICE_ENABLED) { power_supply_callback(&bcl_psy); ret = power_supply_register(gbcl->dev, &bcl_psy); if (ret < 0) { pr_err("Unable to register bcl_psy rc = %d\n", ret); return; } ret = msm_bcl_set_threshold(BCL_PARAM_CURRENT, BCL_HIGH_TRIP, &gbcl->ibat_high_thresh); if (ret) { pr_err("Error setting Ibat high threshold. err:%d\n", ret); return; } ret = msm_bcl_set_threshold(BCL_PARAM_CURRENT, BCL_LOW_TRIP, &gbcl->ibat_low_thresh); if (ret) { pr_err("Error setting Ibat low threshold. err:%d\n", ret); return; } ret = msm_bcl_set_threshold(BCL_PARAM_VOLTAGE, BCL_LOW_TRIP, &gbcl->vbat_low_thresh); if (ret) { pr_err("Error setting Vbat low threshold. err:%d\n", ret); return; } ret = msm_bcl_set_threshold(BCL_PARAM_VOLTAGE, BCL_HIGH_TRIP, &gbcl->vbat_high_thresh); if (ret) { pr_err("Error setting Vbat high threshold. err:%d\n", ret); return; } ret = msm_bcl_enable(); if (ret) { pr_err("Error enabling BCL\n"); return; } gbcl->btm_mode = BCL_VPH_MONITOR_MODE; } else { power_supply_unregister(&bcl_psy); ret = msm_bcl_disable(); if (ret) { pr_err("Error disabling BCL\n"); return; } gbcl->btm_mode = BCL_MONITOR_DISABLED; bcl_soc_state = BCL_THRESHOLD_DISABLED; bcl_vph_notify(BCL_HIGH_THRESHOLD); bcl_ibat_notify(BCL_LOW_THRESHOLD); bcl_handle_hotplug(NULL); } }
static void bcl_vph_notification(enum qpnp_tm_state state, void *ctx) { struct bcl_context *bcl = ctx; mutex_lock(&bcl_notify_mutex); if (bcl->btm_mode == BCL_MONITOR_DISABLED) goto unlock_and_exit; switch (state) { case ADC_TM_LOW_STATE: bcl_vph_notify(BCL_LOW_THRESHOLD); break; case ADC_TM_HIGH_STATE: bcl_vph_notify(BCL_HIGH_THRESHOLD); break; default: break; } unlock_and_exit: mutex_unlock(&bcl_notify_mutex); return; }
int bcl_voltage_notify(bool is_high_thresh) { int ret = 0; if (!gbcl) { pr_err("BCL Driver not configured\n"); return -EINVAL; } if (gbcl->bcl_mode == BCL_DEVICE_ENABLED) { pr_err("BCL Driver is enabled\n"); return -EINVAL; } bcl_vph_notify((is_high_thresh) ? BCL_HIGH_THRESHOLD : BCL_LOW_THRESHOLD); return ret; }
static int vph_disable(void) { int ret = 0; ret = qpnp_adc_tm_disable_chan_meas(gbcl->btm_adc_tm_dev, &gbcl->btm_vph_adc_param); if (ret) { pr_err("Error disabling ADC. err:%d\n", ret); gbcl->bcl_mode = BCL_DEVICE_ENABLED; gbcl->btm_mode = BCL_VPH_MONITOR_MODE; goto vph_disable_exit; } bcl_vph_notify(BCL_THRESHOLD_DISABLED); gbcl->btm_mode = BCL_MONITOR_DISABLED; vph_disable_exit: return ret; }