Lines Matching refs:charger

170 static void rk817_bat_calib_vol(struct rk817_charger *charger)
177 regmap_bulk_read(charger->rk808->regmap, RK817_GAS_GAUGE_VCALIB0_H,
181 regmap_bulk_read(charger->rk808->regmap, RK817_GAS_GAUGE_VCALIB1_H,
186 charger->voltage_k = (4025 - 2300) * 1000 /
188 charger->voltage_b = 4025 - (charger->voltage_k * vcalib1) / 1000;
191 static void rk817_bat_calib_cur(struct rk817_charger *charger)
196 regmap_bulk_read(charger->rk808->regmap, RK817_GAS_GAUGE_IOFFSET_H,
198 regmap_bulk_write(charger->rk808->regmap, RK817_GAS_GAUGE_CAL_OFFSET_H,
206 static int rk817_record_battery_nvram_values(struct rk817_charger *charger)
215 put_unaligned_le24(charger->soc, bulk_reg);
216 ret = regmap_bulk_write(charger->rk808->regmap, RK817_GAS_GAUGE_BAT_R1,
224 rsoc = (charger->soc * charger->fcc_mah) / 100000;
226 ret = regmap_bulk_write(charger->rk808->regmap, RK817_GAS_GAUGE_DATA0,
231 put_unaligned_le24(charger->fcc_mah, bulk_reg);
232 ret = regmap_bulk_write(charger->rk808->regmap, RK817_GAS_GAUGE_DATA3,
240 static int rk817_bat_calib_cap(struct rk817_charger *charger)
242 struct rk808 *rk808 = charger->rk808;
248 if (charger->charge_status == CHARGE_FINISH && (!charger->soc_cal)) {
260 charger->soc = 100000;
261 charge_now_adc = CHARGE_TO_ADC(charger->fcc_mah,
262 charger->res_div);
267 charger->soc_cal = 1;
268 dev_dbg(charger->dev,
270 charger->soc, charger->fcc_mah * 1000);
277 if (charger->charge_status == CHARGE_FINISH && charger->soc_cal) {
284 charger->res_div);
289 if (charge_now / 1000 > charger->fcc_mah) {
290 dev_dbg(charger->dev,
298 charge_now_adc = CHARGE_TO_ADC(charger->fcc_mah,
299 charger->res_div);
315 regmap_bulk_read(charger->rk808->regmap, RK817_GAS_GAUGE_BAT_VOL_H,
318 volt_avg = (charger->voltage_k * tmp) + 1000 * charger->voltage_b;
319 if (volt_avg <= charger->bat_voltage_min_design_uv &&
320 charger->soc_cal) {
325 charger->res_div);
331 charger->fcc_mah = charger->fcc_mah - (charge_now / 1000);
333 dev_dbg(charger->dev,
335 charger->fcc_mah * 1000);
341 if (volt_avg <= charger->bat_voltage_min_design_uv) {
342 charger->soc = 0;
343 charge_now_adc = CHARGE_TO_ADC(0, charger->res_div);
347 dev_warn(charger->dev,
349 volt_avg, charger->bat_voltage_min_design_uv);
352 rk817_record_battery_nvram_values(charger);
357 static void rk817_read_props(struct rk817_charger *charger)
368 regmap_read(charger->rk808->regmap, RK817_GAS_GAUGE_ADC_CONFIG1, &reg);
370 rk817_bat_calib_cur(charger);
371 rk817_bat_calib_vol(charger);
372 regmap_write_bits(charger->rk808->regmap,
379 regmap_bulk_read(charger->rk808->regmap, RK817_GAS_GAUGE_Q_PRES_H3,
382 charger->charge_now_uah = ADC_TO_CHARGE_UAH(tmp, charger->res_div);
383 if (charger->charge_now_uah < 0)
384 charger->charge_now_uah = 0;
385 if (charger->charge_now_uah > charger->fcc_mah * 1000)
386 charger->charge_now_uah = charger->fcc_mah * 1000;
389 charger->soc = charger->charge_now_uah * 100 / charger->fcc_mah;
392 regmap_bulk_read(charger->rk808->regmap, RK817_GAS_GAUGE_BAT_VOL_H,
395 charger->volt_avg_uv = (charger->voltage_k * tmp) + 1000 *
396 charger->voltage_b;
402 regmap_bulk_read(charger->rk808->regmap, RK817_GAS_GAUGE_BAT_CUR_H,
405 charger->cur_avg_ua = ADC_TO_CURRENT(tmp, charger->res_div);
412 regmap_read(charger->rk808->regmap, RK817_PMIC_CHRG_OUT, &reg);
413 charger->max_chg_cur_ua =
420 regmap_read(charger->rk808->regmap, RK817_PMIC_CHRG_OUT, &reg);
421 charger->max_chg_volt_uv = ((((reg & RK817_CHRG_VOL_SEL) >> 4) *
425 regmap_read(charger->rk808->regmap, RK817_PMIC_CHRG_STS, &reg);
426 charger->battery_present = (reg & RK817_BAT_EXS);
429 regmap_read(charger->rk808->regmap, RK817_PMIC_CHRG_STS, &reg);
430 charger->charge_status = (reg >> 4) & 0x07;
433 * Get charger input voltage. Note that on my example hardware (an
444 regmap_bulk_read(charger->rk808->regmap, RK817_GAS_GAUGE_USB_VOL_H,
448 tmp = ((charger->voltage_k * reg / 1000 + charger->voltage_b) *
450 charger->charger_input_volt_avg_uv = tmp * 1000;
452 charger->charger_input_volt_avg_uv = 0;
456 rk817_bat_calib_cap(charger);
463 struct rk817_charger *charger = power_supply_get_drvdata(ps);
467 val->intval = charger->battery_present;
470 if (charger->cur_avg_ua < 0) {
474 switch (charger->charge_status) {
498 switch (charger->charge_status) {
516 val->intval = charger->fcc_mah * 1000;
519 val->intval = charger->bat_charge_full_design_uah;
525 val->intval = charger->charge_now_uah;
528 val->intval = charger->bat_voltage_min_design_uv;
532 val->intval = (charger->soc + 500) / 1000;
539 val->intval = charger->volt_avg_uv;
542 val->intval = charger->cur_avg_ua;
545 val->intval = charger->max_chg_cur_ua;
548 val->intval = charger->max_chg_volt_uv;
551 val->intval = charger->bat_voltage_max_design_uv;
563 struct rk817_charger *charger = power_supply_get_drvdata(ps);
567 val->intval = charger->plugged_in;
578 val->intval = charger->charger_input_volt_avg_uv;
597 struct rk817_charger *charger;
599 charger = (struct rk817_charger *)cg;
600 charger->plugged_in = 1;
601 power_supply_changed(charger->chg_ps);
602 power_supply_changed(charger->bat_ps);
604 charger->soc_cal = 0;
606 rk817_read_props(charger);
608 dev_dbg(charger->dev, "Power Cord Inserted\n");
615 struct rk817_charger *charger;
618 charger = (struct rk817_charger *)cg;
619 rk808 = charger->rk808;
620 charger->plugged_in = 0;
621 power_supply_changed(charger->bat_ps);
622 power_supply_changed(charger->chg_ps);
644 rk817_read_props(charger);
646 dev_dbg(charger->dev, "Power Cord Removed\n");
690 .name = "rk817-charger",
699 static int rk817_read_battery_nvram_values(struct rk817_charger *charger)
705 ret = regmap_bulk_read(charger->rk808->regmap,
709 charger->fcc_mah = get_unaligned_le24(bulk_reg);
717 if ((charger->fcc_mah < 500) ||
718 ((charger->fcc_mah * 1000) > charger->bat_charge_full_design_uah)) {
719 dev_info(charger->dev,
721 charger->bat_charge_full_design_uah);
722 charger->fcc_mah = charger->bat_charge_full_design_uah / 1000;
732 ret = regmap_bulk_read(charger->rk808->regmap,
736 charger->soc = get_unaligned_le24(bulk_reg);
737 if (charger->soc > 10000)
738 charger->soc = 10000;
739 if (charger->soc < 0)
740 charger->soc = 0;
746 rk817_read_or_set_full_charge_on_boot(struct rk817_charger *charger,
749 struct rk808 *rk808 = charger->rk808;
772 boot_voltage = (charger->voltage_k * tmp) +
773 1000 * charger->voltage_b;
779 charger->soc = power_supply_batinfo_ocv2cap(bat_info,
782 if (charger->soc < 0)
783 charger->soc = 0;
786 charger->fcc_mah = charger->bat_charge_full_design_uah / 1000;
794 ret = rk817_record_battery_nvram_values(charger);
798 ret = rk817_read_battery_nvram_values(charger);
808 charger->res_div) / 1000;
826 boot_voltage = (charger->voltage_k * tmp) +
827 1000 * charger->voltage_b;
828 charger->soc =
833 charger->soc = (boot_charge_mah * 1000 * 100 /
834 charger->fcc_mah);
842 boot_charge_mah = charger->soc * charger->fcc_mah / 100 / 1000;
843 if (boot_charge_mah > charger->fcc_mah)
844 boot_charge_mah = charger->fcc_mah;
845 tmp = CHARGE_TO_ADC(boot_charge_mah, charger->res_div);
853 tmp = CHARGE_TO_ADC((charger->bat_charge_full_design_uah / 1000),
854 charger->res_div);
864 static int rk817_battery_init(struct rk817_charger *charger,
867 struct rk808 *rk808 = charger->rk808;
875 charger->plugged_in = (tmp & RK817_PLUG_IN_STS);
892 rk817_bat_calib_vol(charger);
895 tmp = CURRENT_TO_ADC(charger->sleep_enter_current_ua,
896 charger->res_div);
902 tmp = CURRENT_TO_ADC(charger->sleep_filter_current_ua,
903 charger->res_div);
927 return dev_err_probe(charger->dev, -EINVAL,
928 "invalid max charger voltage, value %u unsupported\n",
932 dev_info(charger->dev,
938 return dev_err_probe(charger->dev, -EINVAL,
939 "invalid max charger current, value %u unsupported\n",
943 dev_info(charger->dev,
957 return dev_err_probe(charger->dev, -EINVAL,
958 "invalid max charger voltage, value %u unsupported\n",
962 return dev_err_probe(charger->dev, -EINVAL,
963 "invalid max charger current, value %u unsupported\n",
974 dev_emerg(charger->dev,
975 "Danger, unable to set max charger voltage: %u\n",
982 dev_emerg(charger->dev,
983 "Danger, unable to set max charger current: %u\n",
997 dev_warn(charger->dev,
1011 ret = rk817_read_or_set_full_charge_on_boot(charger, bat_info);
1038 struct rk817_charger *charger;
1040 charger = container_of(work, struct rk817_charger, work.work);
1042 rk817_read_props(charger);
1045 queue_delayed_work(system_wq, &charger->work, msecs_to_jiffies(8000));
1058 struct rk817_charger *charger;
1067 node = of_get_child_by_name(dev->parent->of_node, "charger");
1075 charger = devm_kzalloc(&pdev->dev, sizeof(*charger), GFP_KERNEL);
1076 if (!charger)
1079 charger->rk808 = rk808;
1081 charger->dev = &pdev->dev;
1082 platform_set_drvdata(pdev, charger);
1084 rk817_bat_calib_vol(charger);
1086 pscfg.drv_data = charger;
1104 charger->res_div = (of_value == 20000) ? 2 : 1;
1117 charger->sleep_enter_current_ua = of_value;
1128 charger->sleep_filter_current_ua = of_value;
1130 charger->bat_ps = devm_power_supply_register(&pdev->dev,
1132 if (IS_ERR(charger->bat_ps))
1136 charger->chg_ps = devm_power_supply_register(&pdev->dev,
1138 if (IS_ERR(charger->chg_ps))
1142 ret = power_supply_get_battery_info(charger->bat_ps,
1159 charger->bat_charge_full_design_uah = bat_info->charge_full_design_uah;
1160 charger->bat_voltage_min_design_uv = bat_info->voltage_min_design_uv;
1161 charger->bat_voltage_max_design_uv = bat_info->voltage_max_design_uv;
1167 ret = rk817_battery_init(charger, bat_info);
1171 power_supply_put_battery_info(charger->bat_ps, bat_info);
1181 ret = devm_request_threaded_irq(charger->dev, plugin_irq, NULL,
1184 "rk817_plug_in", charger);
1190 ret = devm_request_threaded_irq(charger->dev, plugout_irq, NULL,
1193 "rk817_plug_out", charger);
1199 ret = devm_delayed_work_autocancel(&pdev->dev, &charger->work,
1205 mod_delayed_work(system_wq, &charger->work, 0);
1213 struct rk817_charger *charger = dev_get_drvdata(dev);
1216 mod_delayed_work(system_wq, &charger->work, 0);
1226 .name = "rk817-charger",
1236 MODULE_ALIAS("platform:rk817-charger");