Lines Matching +full:enable +full:- +full:usb +full:- +full:charging
1 // SPDX-License-Identifier: GPL-2.0
7 #include <linux/usb/phy.h>
62 bool charging;
69 regmap_update_bits(info->regmap, info->base + SC2731_CHG_CFG0,
72 regmap_update_bits(info->regmap, info->base + SC2731_CHG_CFG0,
80 /* Enable charger constant current mode */
81 ret = regmap_update_bits(info->regmap, info->base + SC2731_CHG_CFG0,
86 /* Start charging */
87 return regmap_update_bits(info->regmap, info->base + SC2731_CHG_CFG0,
105 return regmap_update_bits(info->regmap, info->base + SC2731_CHG_CFG5,
121 val = (cur - SC2731_CURRENT_PRECHG) / SC2731_CURRENT_STEP;
123 /* Set pre-charge current as 450 mA */
124 ret = regmap_update_bits(info->regmap, info->base + SC2731_CHG_CFG0,
130 return regmap_update_bits(info->regmap, info->base + SC2731_CHG_CFG1,
139 ret = regmap_read(info->regmap, SC2731_CHARGE_STATUS, &val);
155 ret = regmap_read(info->regmap, info->base + SC2731_CHG_CFG1, &val);
171 ret = regmap_read(info->regmap, info->base + SC2731_CHG_CFG5, &val);
195 return -EINVAL;
209 mutex_lock(&info->lock);
211 if (!info->charging) {
212 mutex_unlock(&info->lock);
213 return -ENODEV;
218 ret = sc2731_charger_set_current(info, val->intval / 1000);
220 dev_err(info->dev, "set charge current failed\n");
225 val->intval / 1000);
227 dev_err(info->dev, "set input current limit failed\n");
231 ret = -EINVAL;
234 mutex_unlock(&info->lock);
246 mutex_lock(&info->lock);
250 if (info->charging)
251 val->intval = sc2731_charger_get_status(info);
253 val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
257 if (!info->charging) {
258 val->intval = 0;
264 val->intval = cur * 1000;
269 if (!info->charging) {
270 val->intval = 0;
276 val->intval = cur * 1000;
281 ret = -EINVAL;
285 mutex_unlock(&info->lock);
329 mutex_lock(&info->lock);
331 if (info->limit > 0 && !info->charging) {
333 ret = sc2731_charger_set_current_limit(info, info->limit);
337 ret = sc2731_charger_set_current(info, info->limit);
345 info->charging = true;
346 } else if (!info->limit && info->charging) {
347 /* Stop charging */
348 info->charging = false;
353 mutex_unlock(&info->lock);
362 info->limit = limit;
364 schedule_work(&info->work);
375 /* Enable charger module */
376 ret = regmap_update_bits(info->regmap, SC2731_MODULE_EN1,
381 ret = power_supply_get_battery_info(info->psy_usb, &bat_info);
383 dev_warn(info->dev, "no battery information is supplied\n");
393 term_currrent = bat_info->charge_term_current_ua / 1000;
400 cur_val = ((term_currrent - 90) / 25) + 1;
402 term_voltage = bat_info->constant_charge_voltage_max_uv / 1000;
408 vol_val = (term_voltage - 4200) / 100;
412 power_supply_put_battery_info(info->psy_usb, bat_info);
416 ret = regmap_update_bits(info->regmap, info->base + SC2731_CHG_CFG2,
422 ret = regmap_update_bits(info->regmap, info->base + SC2731_CHG_CFG0,
433 regmap_update_bits(info->regmap, SC2731_MODULE_EN1, SC2731_CHARGE_EN, 0);
442 * If the USB charger status has been USB_CHARGER_PRESENT before
446 if (info->usb_phy->chg_state != USB_CHARGER_PRESENT)
449 usb_phy_get_charger_current(info->usb_phy, &min, &max);
450 info->limit = min;
452 schedule_work(&info->work);
457 struct device_node *np = pdev->dev.of_node;
462 info = devm_kzalloc(&pdev->dev, sizeof(*info), GFP_KERNEL);
464 return -ENOMEM;
466 mutex_init(&info->lock);
467 info->dev = &pdev->dev;
468 INIT_WORK(&info->work, sc2731_charger_work);
470 info->regmap = dev_get_regmap(pdev->dev.parent, NULL);
471 if (!info->regmap) {
472 dev_err(&pdev->dev, "failed to get charger regmap\n");
473 return -ENODEV;
476 ret = of_property_read_u32(np, "reg", &info->base);
478 dev_err(&pdev->dev, "failed to get register address\n");
479 return -ENODEV;
483 charger_cfg.fwnode = dev_fwnode(&pdev->dev);
484 info->psy_usb = devm_power_supply_register(&pdev->dev,
487 if (IS_ERR(info->psy_usb)) {
488 dev_err(&pdev->dev, "failed to register power supply\n");
489 return PTR_ERR(info->psy_usb);
496 info->usb_phy = devm_usb_get_phy_by_phandle(&pdev->dev, "phys", 0);
497 if (IS_ERR(info->usb_phy)) {
498 dev_err(&pdev->dev, "failed to find USB phy\n");
499 return PTR_ERR(info->usb_phy);
502 info->usb_notify.notifier_call = sc2731_charger_usb_change;
503 ret = usb_register_notifier(info->usb_phy, &info->usb_notify);
505 dev_err(&pdev->dev, "failed to register notifier: %d\n", ret);
518 usb_unregister_notifier(info->usb_phy, &info->usb_notify);
522 { .compatible = "sprd,sc2731-charger", },
529 .name = "sc2731-charger",