Ejemplo n.º 1
0
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;
}
Ejemplo n.º 3
0
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;
}
Ejemplo n.º 4
0
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;
}