static void bq24192_vbat_work(struct work_struct *work) { struct bq24192_chip *chip = container_of(work, struct bq24192_chip, vbat_work.work); int step_current_ma; int step_input_i_ma; if (chip->vbat_noti_stat == ADC_TM_HIGH_STATE) { step_current_ma = chip->dwn_chg_i_ma; step_input_i_ma = chip->dwn_input_i_ma; chip->adc_param.state_request = ADC_TM_LOW_THR_ENABLE; chip->adc_param.high_thr = DISABLE_HIGH_THR; chip->adc_param.low_thr = (chip->step_dwn_thr_mv - 100) * 1000; } else { step_current_ma = chip->up_chg_i_ma; step_input_i_ma = chip->up_input_i_ma; chip->adc_param.state_request = ADC_TM_HIGH_THR_ENABLE; chip->adc_param.high_thr = chip->step_dwn_thr_mv * 1000; chip->adc_param.low_thr = DISABLE_LOW_THR; } if (bq24192_is_charger_present(chip)) { pr_info("change to chg current = %d, input_limit = %d\n", step_current_ma, step_input_i_ma); bq24192_set_input_i_limit(chip, step_input_i_ma); bq24192_set_ibat_max(chip, step_current_ma); qpnp_adc_tm_channel_measure(&chip->adc_param); } wake_unlock(&chip->chg_wake_lock); }
static int bcl_config_vph_adc(struct bcl_context *bcl, enum bcl_iavail_threshold_type thresh_type) { int ret = 0; if (bcl->bcl_mode == BCL_DEVICE_DISABLED || bcl->bcl_monitor_type != BCL_IBAT_MONITOR_TYPE) return -EINVAL; bcl->btm_vph_adc_param.low_thr = bcl->btm_vph_low_thresh; bcl->btm_vph_adc_param.high_thr = bcl->btm_vph_high_thresh; switch (thresh_type) { case BCL_HIGH_THRESHOLD_TYPE: bcl->btm_vph_adc_param.state_request = ADC_TM_HIGH_THR_ENABLE; break; case BCL_LOW_THRESHOLD_TYPE: bcl->btm_vph_adc_param.state_request = ADC_TM_LOW_THR_ENABLE; break; case BCL_LOW_THRESHOLD_TYPE_MIN: bcl->btm_vph_adc_param.state_request = ADC_TM_LOW_THR_ENABLE; bcl->btm_vph_adc_param.low_thr = bcl->btm_charger_ic_low_thresh; break; default: pr_err("Invalid threshold type:%d\n", thresh_type); return -EINVAL; } bcl->btm_vph_adc_param.timer_interval = adc_timer_val_usec[ADC_MEAS1_INTERVAL_31P3MS]; bcl->btm_vph_adc_param.btm_ctx = bcl; bcl->btm_vph_adc_param.threshold_notification = bcl_vph_notification; bcl->btm_vph_adc_param.channel = bcl->btm_vph_chan; ret = qpnp_adc_tm_channel_measure(bcl->btm_adc_tm_dev, &bcl->btm_vph_adc_param); if (ret < 0) pr_err("Error configuring BTM for Vph. ret:%d\n", ret); else pr_debug("Vph config. poll:%d high_uv:%d(%s) low_uv:%d(%s)\n", bcl->btm_vph_adc_param.timer_interval, bcl->btm_vph_adc_param.high_thr, (bcl->btm_vph_adc_param.state_request == ADC_TM_HIGH_THR_ENABLE) ? "enabled" : "disabled", bcl->btm_vph_adc_param.low_thr, (bcl->btm_vph_adc_param.state_request == ADC_TM_LOW_THR_ENABLE) ? "enabled" : "disabled"); return ret; }
static int bq24192_step_down_detect_disable(struct bq24192_chip *chip) { int ret; chip->adc_param.state_request = ADC_TM_HIGH_LOW_THR_DISABLE; chip->adc_param.threshold_notification = bq24192_vbat_notification; chip->adc_param.channel = VBAT_SNS; ret = qpnp_adc_tm_channel_measure(&chip->adc_param); if (ret) pr_err("request ADC error %d\n", ret); cancel_delayed_work_sync(&chip->vbat_work); if (wake_lock_active(&chip->chg_wake_lock)) { pr_debug("releasing wakelock\n"); wake_unlock(&chip->chg_wake_lock); } return ret; }
static int bq24192_step_down_detect_init(struct bq24192_chip *chip) { int ret; ret = qpnp_adc_tm_is_ready(); if (ret) { pr_err("qpnp_adc is not ready"); return ret; } chip->adc_param.high_thr = chip->step_dwn_thr_mv * 1000; chip->adc_param.low_thr = DISABLE_LOW_THR; chip->adc_param.timer_interval = ADC_MEAS1_INTERVAL_2S; chip->adc_param.state_request = ADC_TM_HIGH_LOW_THR_ENABLE; chip->adc_param.btm_ctx = chip; chip->adc_param.threshold_notification = bq24192_vbat_notification; chip->adc_param.channel = VBAT_SNS; ret = qpnp_adc_tm_channel_measure(&chip->adc_param); if (ret) pr_err("request ADC error %d\n", ret); return ret; }