Lines Matching +full:current +full:- +full:boost +full:- +full:microamp

1 // SPDX-License-Identifier: GPL-2.0-only
9 #include <linux/devm-helpers.h>
18 #include <linux/mfd/rt5033-private.h>
46 struct regmap *regmap = charger->regmap; in rt5033_get_charger_state()
73 if (charger->otg) in rt5033_get_charger_state()
81 struct regmap *regmap = charger->regmap; in rt5033_get_charger_type()
103 struct regmap *regmap = charger->regmap; in rt5033_get_charger_current_limit()
119 struct regmap *regmap = charger->regmap; in rt5033_get_charger_const_voltage()
135 struct rt5033_charger_data *chg = &charger->chg; in rt5033_init_const_charge()
141 if (chg->const_uvolt < RT5033_CHARGER_CONST_VOLTAGE_LIMIT_MIN || in rt5033_init_const_charge()
142 chg->const_uvolt > RT5033_CHARGER_CONST_VOLTAGE_LIMIT_MAX) { in rt5033_init_const_charge()
143 dev_err(charger->dev, in rt5033_init_const_charge()
144 "Value 'constant-charge-voltage-max-microvolt' out of range\n"); in rt5033_init_const_charge()
145 return -EINVAL; in rt5033_init_const_charge()
148 if (chg->const_uvolt == RT5033_CHARGER_CONST_VOLTAGE_LIMIT_MIN) in rt5033_init_const_charge()
150 else if (chg->const_uvolt == RT5033_CHARGER_CONST_VOLTAGE_LIMIT_MAX) in rt5033_init_const_charge()
153 val = chg->const_uvolt; in rt5033_init_const_charge()
154 val -= RT5033_CHARGER_CONST_VOLTAGE_LIMIT_MIN; in rt5033_init_const_charge()
159 ret = regmap_update_bits(charger->regmap, RT5033_REG_CHG_CTRL2, in rt5033_init_const_charge()
163 dev_err(charger->dev, "Failed regmap update\n"); in rt5033_init_const_charge()
164 return -EINVAL; in rt5033_init_const_charge()
168 charger->cv_regval = reg_data; in rt5033_init_const_charge()
170 /* Set end of charge current */ in rt5033_init_const_charge()
171 if (chg->eoc_uamp < RT5033_CHARGER_EOC_MIN || in rt5033_init_const_charge()
172 chg->eoc_uamp > RT5033_CHARGER_EOC_MAX) { in rt5033_init_const_charge()
173 dev_err(charger->dev, in rt5033_init_const_charge()
174 "Value 'charge-term-current-microamp' out of range\n"); in rt5033_init_const_charge()
175 return -EINVAL; in rt5033_init_const_charge()
178 if (chg->eoc_uamp == RT5033_CHARGER_EOC_MIN) in rt5033_init_const_charge()
180 else if (chg->eoc_uamp == RT5033_CHARGER_EOC_MAX) in rt5033_init_const_charge()
183 val = chg->eoc_uamp; in rt5033_init_const_charge()
185 val -= RT5033_CHARGER_EOC_MIN; in rt5033_init_const_charge()
189 val -= RT5033_CHARGER_EOC_REF; in rt5033_init_const_charge()
197 ret = regmap_update_bits(charger->regmap, RT5033_REG_CHG_CTRL4, in rt5033_init_const_charge()
200 dev_err(charger->dev, "Failed regmap update\n"); in rt5033_init_const_charge()
201 return -EINVAL; in rt5033_init_const_charge()
209 struct rt5033_charger_data *chg = &charger->chg; in rt5033_init_fast_charge()
214 /* Set limit input current */ in rt5033_init_fast_charge()
215 ret = regmap_update_bits(charger->regmap, RT5033_REG_CHG_CTRL1, in rt5033_init_fast_charge()
218 dev_err(charger->dev, "Failed regmap update\n"); in rt5033_init_fast_charge()
219 return -EINVAL; in rt5033_init_fast_charge()
222 /* Set fast-charge mode charging current */ in rt5033_init_fast_charge()
223 if (chg->fast_uamp < RT5033_CHARGER_FAST_CURRENT_MIN || in rt5033_init_fast_charge()
224 chg->fast_uamp > RT5033_CHARGER_FAST_CURRENT_MAX) { in rt5033_init_fast_charge()
225 dev_err(charger->dev, in rt5033_init_fast_charge()
226 "Value 'constant-charge-current-max-microamp' out of range\n"); in rt5033_init_fast_charge()
227 return -EINVAL; in rt5033_init_fast_charge()
230 if (chg->fast_uamp == RT5033_CHARGER_FAST_CURRENT_MIN) in rt5033_init_fast_charge()
232 else if (chg->fast_uamp == RT5033_CHARGER_FAST_CURRENT_MAX) in rt5033_init_fast_charge()
235 val = chg->fast_uamp; in rt5033_init_fast_charge()
236 val -= RT5033_CHARGER_FAST_CURRENT_MIN; in rt5033_init_fast_charge()
241 ret = regmap_update_bits(charger->regmap, RT5033_REG_CHG_CTRL5, in rt5033_init_fast_charge()
245 dev_err(charger->dev, "Failed regmap update\n"); in rt5033_init_fast_charge()
246 return -EINVAL; in rt5033_init_fast_charge()
254 struct rt5033_charger_data *chg = &charger->chg; in rt5033_init_pre_charge()
259 /* Set pre-charge threshold voltage */ in rt5033_init_pre_charge()
260 if (chg->pre_uvolt < RT5033_CHARGER_PRE_THRESHOLD_LIMIT_MIN || in rt5033_init_pre_charge()
261 chg->pre_uvolt > RT5033_CHARGER_PRE_THRESHOLD_LIMIT_MAX) { in rt5033_init_pre_charge()
262 dev_err(charger->dev, in rt5033_init_pre_charge()
263 "Value 'precharge-upper-limit-microvolt' out of range\n"); in rt5033_init_pre_charge()
264 return -EINVAL; in rt5033_init_pre_charge()
267 if (chg->pre_uvolt == RT5033_CHARGER_PRE_THRESHOLD_LIMIT_MIN) in rt5033_init_pre_charge()
269 else if (chg->pre_uvolt == RT5033_CHARGER_PRE_THRESHOLD_LIMIT_MAX) in rt5033_init_pre_charge()
272 val = chg->pre_uvolt; in rt5033_init_pre_charge()
273 val -= RT5033_CHARGER_PRE_THRESHOLD_LIMIT_MIN; in rt5033_init_pre_charge()
278 ret = regmap_update_bits(charger->regmap, RT5033_REG_CHG_CTRL5, in rt5033_init_pre_charge()
281 dev_err(charger->dev, "Failed regmap update\n"); in rt5033_init_pre_charge()
282 return -EINVAL; in rt5033_init_pre_charge()
285 /* Set pre-charge mode charging current */ in rt5033_init_pre_charge()
286 if (chg->pre_uamp < RT5033_CHARGER_PRE_CURRENT_LIMIT_MIN || in rt5033_init_pre_charge()
287 chg->pre_uamp > RT5033_CHARGER_PRE_CURRENT_LIMIT_MAX) { in rt5033_init_pre_charge()
288 dev_err(charger->dev, in rt5033_init_pre_charge()
289 "Value 'precharge-current-microamp' out of range\n"); in rt5033_init_pre_charge()
290 return -EINVAL; in rt5033_init_pre_charge()
293 if (chg->pre_uamp == RT5033_CHARGER_PRE_CURRENT_LIMIT_MIN) in rt5033_init_pre_charge()
295 else if (chg->pre_uamp == RT5033_CHARGER_PRE_CURRENT_LIMIT_MAX) in rt5033_init_pre_charge()
298 val = chg->pre_uamp; in rt5033_init_pre_charge()
299 val -= RT5033_CHARGER_PRE_CURRENT_LIMIT_MIN; in rt5033_init_pre_charge()
304 ret = regmap_update_bits(charger->regmap, RT5033_REG_CHG_CTRL4, in rt5033_init_pre_charge()
308 dev_err(charger->dev, "Failed regmap update\n"); in rt5033_init_pre_charge()
309 return -EINVAL; in rt5033_init_pre_charge()
320 ret = regmap_update_bits(charger->regmap, RT5033_REG_CHG_CTRL1, in rt5033_charger_reg_init()
323 dev_err(charger->dev, "Failed to enable charging termination.\n"); in rt5033_charger_reg_init()
324 return -EINVAL; in rt5033_charger_reg_init()
331 ret = regmap_update_bits(charger->regmap, RT5033_REG_CHG_CTRL4, in rt5033_charger_reg_init()
334 dev_err(charger->dev, "Failed to disable MIVR.\n"); in rt5033_charger_reg_init()
335 return -EINVAL; in rt5033_charger_reg_init()
357 mutex_lock(&charger->lock); in rt5033_charger_set_otg()
359 /* Set OTG boost v_out to 5 volts */ in rt5033_charger_set_otg()
360 ret = regmap_update_bits(charger->regmap, RT5033_REG_CHG_CTRL2, in rt5033_charger_set_otg()
364 dev_err(charger->dev, "Failed set OTG boost v_out\n"); in rt5033_charger_set_otg()
365 ret = -EINVAL; in rt5033_charger_set_otg()
370 ret = regmap_update_bits(charger->regmap, RT5033_REG_CHG_CTRL1, in rt5033_charger_set_otg()
373 dev_err(charger->dev, "Failed to update OTG mode.\n"); in rt5033_charger_set_otg()
374 ret = -EINVAL; in rt5033_charger_set_otg()
379 if (charger->online) in rt5033_charger_set_otg()
380 charger->online = false; in rt5033_charger_set_otg()
382 charger->otg = true; in rt5033_charger_set_otg()
385 mutex_unlock(&charger->lock); in rt5033_charger_set_otg()
396 data = charger->cv_regval; in rt5033_charger_unset_otg()
397 ret = regmap_update_bits(charger->regmap, RT5033_REG_CHG_CTRL2, in rt5033_charger_unset_otg()
401 dev_err(charger->dev, "Failed to restore constant voltage\n"); in rt5033_charger_unset_otg()
402 return -EINVAL; in rt5033_charger_unset_otg()
406 ret = regmap_update_bits(charger->regmap, RT5033_REG_CHG_CTRL1, in rt5033_charger_unset_otg()
409 dev_err(charger->dev, "Failed to update charger mode.\n"); in rt5033_charger_unset_otg()
410 return -EINVAL; in rt5033_charger_unset_otg()
413 charger->otg = false; in rt5033_charger_unset_otg()
422 mutex_lock(&charger->lock); in rt5033_charger_set_charging()
425 if (charger->otg) { in rt5033_charger_set_charging()
428 mutex_unlock(&charger->lock); in rt5033_charger_set_charging()
429 return -EINVAL; in rt5033_charger_set_charging()
433 charger->online = true; in rt5033_charger_set_charging()
435 mutex_unlock(&charger->lock); in rt5033_charger_set_charging()
444 mutex_lock(&charger->lock); in rt5033_charger_set_mivr()
449 * prevents an input voltage drop due to insufficient current provided in rt5033_charger_set_mivr()
451 * charging current and thus slows the charging. in rt5033_charger_set_mivr()
453 ret = regmap_update_bits(charger->regmap, RT5033_REG_CHG_CTRL4, in rt5033_charger_set_mivr()
456 dev_err(charger->dev, "Failed to set MIVR level.\n"); in rt5033_charger_set_mivr()
457 mutex_unlock(&charger->lock); in rt5033_charger_set_mivr()
458 return -EINVAL; in rt5033_charger_set_mivr()
461 charger->mivr_enabled = true; in rt5033_charger_set_mivr()
463 mutex_unlock(&charger->lock); in rt5033_charger_set_mivr()
475 mutex_lock(&charger->lock); in rt5033_charger_set_disconnect()
478 if (charger->mivr_enabled) { in rt5033_charger_set_disconnect()
479 ret = regmap_update_bits(charger->regmap, in rt5033_charger_set_disconnect()
484 dev_err(charger->dev, "Failed to disable MIVR.\n"); in rt5033_charger_set_disconnect()
485 ret = -EINVAL; in rt5033_charger_set_disconnect()
489 charger->mivr_enabled = false; in rt5033_charger_set_disconnect()
492 if (charger->otg) { in rt5033_charger_set_disconnect()
495 ret = -EINVAL; in rt5033_charger_set_disconnect()
500 if (charger->online) in rt5033_charger_set_disconnect()
501 charger->online = false; in rt5033_charger_set_disconnect()
504 mutex_unlock(&charger->lock); in rt5033_charger_set_disconnect()
527 val->intval = rt5033_get_charger_state(charger); in rt5033_charger_get_property()
530 val->intval = rt5033_get_charger_type(charger); in rt5033_charger_get_property()
533 val->intval = rt5033_get_charger_current_limit(charger); in rt5033_charger_get_property()
536 val->intval = rt5033_get_charger_const_voltage(charger); in rt5033_charger_get_property()
539 val->strval = RT5033_CHARGER_MODEL; in rt5033_charger_get_property()
542 val->strval = RT5033_MANUFACTURER; in rt5033_charger_get_property()
545 val->intval = charger->online; in rt5033_charger_get_property()
548 return -EINVAL; in rt5033_charger_get_property()
556 struct rt5033_charger_data *chg = &charger->chg; in rt5033_charger_dt_init()
560 ret = power_supply_get_battery_info(charger->psy, &info); in rt5033_charger_dt_init()
562 return dev_err_probe(charger->dev, -EINVAL, in rt5033_charger_dt_init()
566 chg->pre_uamp = info->precharge_current_ua; in rt5033_charger_dt_init()
567 chg->fast_uamp = info->constant_charge_current_max_ua; in rt5033_charger_dt_init()
568 chg->eoc_uamp = info->charge_term_current_ua; in rt5033_charger_dt_init()
569 chg->pre_uvolt = info->precharge_voltage_max_uv; in rt5033_charger_dt_init()
570 chg->const_uvolt = info->constant_charge_voltage_max_uv; in rt5033_charger_dt_init()
579 struct extcon_dev *edev = charger->edev; in rt5033_charger_extcon_work()
602 dev_err(charger->dev, "failed to set USB mode\n"); in rt5033_charger_extcon_work()
605 dev_info(charger->dev, "USB mode. connector type: %d\n", in rt5033_charger_extcon_work()
617 dev_err(charger->dev, "failed to set charging\n"); in rt5033_charger_extcon_work()
620 dev_info(charger->dev, "charging. connector type: %d\n", in rt5033_charger_extcon_work()
626 dev_err(charger->dev, "failed to set OTG\n"); in rt5033_charger_extcon_work()
629 dev_info(charger->dev, "OTG enabled\n"); in rt5033_charger_extcon_work()
634 dev_err(charger->dev, "failed to set disconnect\n"); in rt5033_charger_extcon_work()
637 dev_info(charger->dev, "disconnected\n"); in rt5033_charger_extcon_work()
641 power_supply_changed(charger->psy); in rt5033_charger_extcon_work()
650 schedule_work(&charger->extcon_work); in rt5033_charger_extcon_notifier()
656 .name = "rt5033-charger",
670 charger = devm_kzalloc(&pdev->dev, sizeof(*charger), GFP_KERNEL); in rt5033_charger_probe()
672 return -ENOMEM; in rt5033_charger_probe()
675 charger->dev = &pdev->dev; in rt5033_charger_probe()
676 charger->regmap = dev_get_regmap(pdev->dev.parent, NULL); in rt5033_charger_probe()
677 mutex_init(&charger->lock); in rt5033_charger_probe()
679 psy_cfg.fwnode = dev_fwnode(&pdev->dev); in rt5033_charger_probe()
682 charger->psy = devm_power_supply_register(charger->dev, in rt5033_charger_probe()
685 if (IS_ERR(charger->psy)) in rt5033_charger_probe()
686 return dev_err_probe(charger->dev, PTR_ERR(charger->psy), in rt5033_charger_probe()
701 np_conn = of_parse_phandle(pdev->dev.of_node, "richtek,usb-connector", 0); in rt5033_charger_probe()
703 charger->edev = extcon_find_edev_by_node(np_edev); in rt5033_charger_probe()
704 if (IS_ERR(charger->edev)) { in rt5033_charger_probe()
705 dev_warn(charger->dev, "no extcon device found in device-tree\n"); in rt5033_charger_probe()
709 ret = devm_work_autocancel(charger->dev, &charger->extcon_work, in rt5033_charger_probe()
712 dev_err(charger->dev, "failed to initialize extcon work\n"); in rt5033_charger_probe()
716 charger->extcon_nb.notifier_call = rt5033_charger_extcon_notifier; in rt5033_charger_probe()
717 ret = devm_extcon_register_notifier_all(charger->dev, charger->edev, in rt5033_charger_probe()
718 &charger->extcon_nb); in rt5033_charger_probe()
720 dev_err(charger->dev, "failed to register extcon notifier\n"); in rt5033_charger_probe()
728 { "rt5033-charger", },
734 { .compatible = "richtek,rt5033-charger", },
741 .name = "rt5033-charger",