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