Lines Matching +full:charging +full:- +full:current

1 // SPDX-License-Identifier: GPL-2.0-only
23 #include <dt-bindings/power/summit,smb347-charger.h>
26 #define SMB3XX_SOFT_TEMP_COMPENSATE_DEFAULT -1
29 #define SMB3XX_TEMP_USE_DEFAULT -273
34 * reloaded from non-volatile registers after POR.
136 * struct smb347_charger - smb347 charger instance
147 * @max_charge_current: maximum current (in uA) the battery can be charged
149 * @pre_charge_current: current (in uA) to use in pre-charging phase
150 * @termination_current: current (in uA) used to determine when the
151 * charging cycle terminates
153 * pre-charge to fast charge mode
154 * @mains_current_limit: maximum input current drawn from AC/DC input (in uA)
155 * @usb_hc_current_limit: maximum input high current (in uA) drawn from USB
158 * current [%100 - %130] (in degree C)
159 * @soft_cold_temp_limit: soft cold temperature limit [%0 - %15] (in degree C),
161 * @soft_hot_temp_limit: soft hot temperature limit [%40 - %55] (in degree C),
163 * @hard_cold_temp_limit: hard cold temperature limit [%-5 - %10] (in degree C),
165 * @hard_hot_temp_limit: hard hot temperature limit [%50 - %65] (in degree C),
167 * @suspend_on_hard_temp_limit: suspend charging when hard limit is hit
170 * @charge_current_compensation: current (in uA) for charging compensation
171 * current when temperature hits soft limits
175 * @enable_control: how charging enable/disable is controlled
182 * example OTG charging controlled via OTG transceiver driver and not by
192 * If zero value is given in any of the current and voltage values, the
237 /* Fast charge current in uA */
246 /* Pre-charge current in uA */
253 /* Termination current in uA */
263 /* Input current limit in uA */
273 /* Charge current compensation in uA */
280 /* Convert register value to current using lookup table */
284 return -EINVAL;
288 /* Convert current to register value using lookup table */
296 return i > 0 ? i - 1 : -EINVAL;
300 * smb347_update_ps_status - refreshes the power source status
314 ret = regmap_read(smb->regmap, IRQSTAT_E, &val);
322 if (smb->use_mains)
324 if (smb->use_usb)
327 ret = smb->mains_online != dc || smb->usb_online != usb;
328 smb->mains_online = dc;
329 smb->usb_online = usb;
335 * smb347_is_ps_online - returns whether input power source is connected
345 return smb->usb_online || smb->mains_online;
349 * smb347_charging_status - returns status of charging
352 * Function returns charging status. %0 means no charging is in progress,
353 * %1 means pre-charging, %2 fast-charging and %3 taper-charging.
363 ret = regmap_read(smb->regmap, STAT_C, &val);
372 if (smb->enable_control != SMB3XX_CHG_ENABLE_SW) {
373 dev_dbg(smb->dev, "charging enable/disable in SW disabled\n");
377 if (enable && smb->usb_vbus_enabled) {
378 dev_dbg(smb->dev, "charging not enabled because USB is in host mode\n");
382 return regmap_update_bits(smb->regmap, CMD_A, CMD_A_CHG_ENABLED,
402 * disable or enable the charging. We do it manually because it
408 dev_err(smb->dev, "failed to enable charging\n");
412 dev_err(smb->dev, "failed to disable charging\n");
420 unsigned int id = smb->id;
423 if (smb->max_charge_current) {
425 smb->max_charge_current);
429 ret = regmap_update_bits(smb->regmap, CFG_CHARGE_CURRENT,
436 if (smb->pre_charge_current) {
438 smb->pre_charge_current);
442 ret = regmap_update_bits(smb->regmap, CFG_CHARGE_CURRENT,
449 if (smb->termination_current) {
451 smb->termination_current);
455 ret = regmap_update_bits(smb->regmap, CFG_CHARGE_CURRENT,
466 unsigned int id = smb->id;
469 if (smb->mains_current_limit) {
471 smb->mains_current_limit);
475 ret = regmap_update_bits(smb->regmap, CFG_CURRENT_LIMIT,
482 if (smb->usb_hc_current_limit) {
484 smb->usb_hc_current_limit);
488 ret = regmap_update_bits(smb->regmap, CFG_CURRENT_LIMIT,
501 if (smb->pre_to_fast_voltage) {
502 ret = smb->pre_to_fast_voltage;
505 ret = clamp_val(ret, 2400000, 3000000) - 2400000;
508 ret = regmap_update_bits(smb->regmap, CFG_FLOAT_VOLTAGE,
515 if (smb->max_charge_voltage) {
516 ret = smb->max_charge_voltage;
519 ret = clamp_val(ret, 3500000, 4500000) - 3500000;
522 ret = regmap_update_bits(smb->regmap, CFG_FLOAT_VOLTAGE,
533 unsigned int id = smb->id;
538 if (smb->chip_temp_threshold) {
539 val = smb->chip_temp_threshold;
542 val = clamp_val(val, 100, 130) - 100;
545 ret = regmap_update_bits(smb->regmap, CFG_OTG,
552 if (smb->soft_cold_temp_limit != SMB3XX_TEMP_USE_DEFAULT) {
553 val = smb->soft_cold_temp_limit;
560 ret = regmap_update_bits(smb->regmap, CFG_TEMP_LIMIT,
569 if (smb->soft_hot_temp_limit != SMB3XX_TEMP_USE_DEFAULT) {
570 val = smb->soft_hot_temp_limit;
572 val = clamp_val(val, 40, 55) - 40;
575 ret = regmap_update_bits(smb->regmap, CFG_TEMP_LIMIT,
584 if (smb->hard_cold_temp_limit != SMB3XX_TEMP_USE_DEFAULT) {
585 val = smb->hard_cold_temp_limit;
587 val = clamp_val(val, -5, 10) + 5;
592 ret = regmap_update_bits(smb->regmap, CFG_TEMP_LIMIT,
601 if (smb->hard_hot_temp_limit != SMB3XX_TEMP_USE_DEFAULT) {
602 val = smb->hard_hot_temp_limit;
604 val = clamp_val(val, 50, 65) - 50;
607 ret = regmap_update_bits(smb->regmap, CFG_TEMP_LIMIT,
621 * current and/or voltage depending on the configuration.
623 * When hard limit is hit, the device will suspend charging
627 ret = regmap_update_bits(smb->regmap, CFG_THERM,
633 if (smb->suspend_on_hard_temp_limit) {
634 ret = regmap_update_bits(smb->regmap, CFG_SYSOK,
640 if (smb->soft_temp_limit_compensation !=
642 val = smb->soft_temp_limit_compensation & 0x3;
644 ret = regmap_update_bits(smb->regmap, CFG_THERM,
650 ret = regmap_update_bits(smb->regmap, CFG_THERM,
657 if (smb->charge_current_compensation) {
659 smb->charge_current_compensation);
663 ret = regmap_update_bits(smb->regmap, CFG_OTG,
674 * smb347_set_writable - enables/disables writing to non-volatile registers
677 * You can enable/disable writing to the non-volatile configuration
685 struct i2c_client *client = to_i2c_client(smb->dev);
688 if (writable && irq_toggle && !smb->irq_unsupported)
689 disable_irq(client->irq);
691 ret = regmap_update_bits(smb->regmap, CMD_A, CMD_A_ALLOW_WRITE,
694 if ((!writable || ret) && irq_toggle && !smb->irq_unsupported)
695 enable_irq(client->irq);
729 /* If USB charging is disabled we put the USB in suspend mode */
730 if (!smb->use_usb) {
731 ret = regmap_update_bits(smb->regmap, CMD_A,
739 * If configured by platform data, we enable hardware Auto-OTG
742 ret = regmap_update_bits(smb->regmap, CFG_OTHER, CFG_OTHER_RID_MASK,
743 smb->use_usb_otg ? CFG_OTHER_RID_ENABLED_AUTO_OTG : 0);
748 switch (smb->enable_control) {
751 ret = regmap_set_bits(smb->regmap, CFG_PIN, CFG_PIN_EN_CTRL);
757 * Make the charging functionality controllable by a write to the
761 switch (smb->enable_control) {
773 ret = regmap_update_bits(smb->regmap, CFG_PIN, CFG_PIN_EN_CTRL_MASK,
779 ret = regmap_update_bits(smb->regmap, CFG_PIN, CFG_PIN_EN_APSD_IRQ, 0);
804 ret = regmap_read(smb->regmap, STAT_C, &stat_c);
806 dev_warn(smb->dev, "reading STAT_C failed\n");
810 ret = regmap_read(smb->regmap, IRQSTAT_C, &irqstat_c);
812 dev_warn(smb->dev, "reading IRQSTAT_C failed\n");
816 ret = regmap_read(smb->regmap, IRQSTAT_D, &irqstat_d);
818 dev_warn(smb->dev, "reading IRQSTAT_D failed\n");
822 ret = regmap_read(smb->regmap, IRQSTAT_E, &irqstat_e);
824 dev_warn(smb->dev, "reading IRQSTAT_E failed\n");
830 * If the error is recovered charging will resume again.
833 dev_err(smb->dev, "charging stopped due to charger error\n");
834 if (smb->use_mains)
835 power_supply_changed(smb->mains);
836 if (smb->use_usb)
837 power_supply_changed(smb->usb);
842 * If we reached the termination current the battery is charged and
843 * we can update the status now. Charging is automatically
848 if (smb->use_mains)
849 power_supply_changed(smb->mains);
850 if (smb->use_usb)
851 power_supply_changed(smb->usb);
853 dev_dbg(smb->dev, "going to HW maintenance mode\n");
862 dev_dbg(smb->dev, "total Charge Timeout INT received\n");
865 dev_warn(smb->dev, "charging stopped due to timeout\n");
866 if (smb->use_mains)
867 power_supply_changed(smb->mains);
868 if (smb->use_usb)
869 power_supply_changed(smb->usb);
880 if (smb->use_mains)
881 power_supply_changed(smb->mains);
882 if (smb->use_usb)
883 power_supply_changed(smb->usb);
895 if (smb->irq_unsupported)
904 * - under voltage
905 * - termination current reached
906 * - charger timeout
907 * - charger error
909 ret = regmap_update_bits(smb->regmap, CFG_FAULT_IRQ, 0xff,
914 ret = regmap_update_bits(smb->regmap, CFG_STATUS_IRQ, 0xff,
920 ret = regmap_update_bits(smb->regmap, CFG_PIN, CFG_PIN_EN_CHARGER_ERROR,
942 smb->irq_unsupported = true;
948 if (!client->irq)
959 ret = regmap_update_bits(smb->regmap, CFG_STAT,
966 dev_warn(smb->dev, "failed to initialize IRQ: %d\n", ret);
967 dev_warn(smb->dev, "disabling IRQ support\n");
971 ret = devm_request_threaded_irq(smb->dev, client->irq, NULL,
973 client->name, smb);
977 smb->irq_unsupported = false;
987 * Returns the constant charge current programmed
992 unsigned int id = smb->id;
997 return -ENODATA;
999 ret = regmap_read(smb->regmap, STAT_B, &v);
1004 * The current value is composition of FCC and PCC values
1029 return -ENODATA;
1031 ret = regmap_read(smb->regmap, STAT_A, &v);
1050 if (psy->desc->type == POWER_SUPPLY_TYPE_USB) {
1051 if (!smb->usb_online)
1054 if (!smb->mains_online)
1058 ret = regmap_read(smb->regmap, STAT_C, &val);
1065 * set to NOT CHARGING upon charger error
1066 * or charging has stopped.
1072 * set to charging if battery is in pre-charge,
1073 * fast charge or taper charging mode.
1079 * charge, fast charge or taper charging mode AND
1080 * charging is terminated at least once.
1086 * occured but charging is not in progress!!!
1107 val->intval = ret;
1111 if (psy->desc->type == POWER_SUPPLY_TYPE_USB) {
1112 if (!smb->usb_online)
1113 return -ENODATA;
1115 if (!smb->mains_online)
1116 return -ENODATA;
1120 * We handle trickle and pre-charging the same, and taper
1125 val->intval = POWER_SUPPLY_CHARGE_TYPE_TRICKLE;
1128 val->intval = POWER_SUPPLY_CHARGE_TYPE_FAST;
1131 val->intval = POWER_SUPPLY_CHARGE_TYPE_NONE;
1137 if (psy->desc->type == POWER_SUPPLY_TYPE_USB)
1138 val->intval = smb->usb_online;
1140 val->intval = smb->mains_online;
1147 val->intval = ret;
1154 val->intval = ret;
1158 return -EINVAL;
1169 struct i2c_client *client = to_i2c_client(smb->dev);
1172 if (!smb->irq_unsupported)
1173 disable_irq(client->irq);
1177 if (!smb->irq_unsupported)
1178 enable_irq(client->irq);
1236 struct device *dev = smb->dev;
1238 smb->soft_temp_limit_compensation =
1242 * pre-initialize the values. See smb347_get_battery_info() below.
1244 smb->soft_cold_temp_limit = SMB3XX_TEMP_USE_DEFAULT;
1245 smb->hard_cold_temp_limit = SMB3XX_TEMP_USE_DEFAULT;
1246 smb->soft_hot_temp_limit = SMB3XX_TEMP_USE_DEFAULT;
1247 smb->hard_hot_temp_limit = SMB3XX_TEMP_USE_DEFAULT;
1249 /* Charging constraints */
1250 device_property_read_u32(dev, "summit,fast-voltage-threshold-microvolt",
1251 &smb->pre_to_fast_voltage);
1252 device_property_read_u32(dev, "summit,mains-current-limit-microamp",
1253 &smb->mains_current_limit);
1254 device_property_read_u32(dev, "summit,usb-current-limit-microamp",
1255 &smb->usb_hc_current_limit);
1258 device_property_read_u32(dev, "summit,chip-temperature-threshold-celsius",
1259 &smb->chip_temp_threshold);
1260 device_property_read_u32(dev, "summit,soft-compensation-method",
1261 &smb->soft_temp_limit_compensation);
1262 device_property_read_u32(dev, "summit,charge-current-compensation-microamp",
1263 &smb->charge_current_compensation);
1265 /* Supported charging mode */
1266 smb->use_mains = device_property_read_bool(dev, "summit,enable-mains-charging");
1267 smb->use_usb = device_property_read_bool(dev, "summit,enable-usb-charging");
1268 smb->use_usb_otg = device_property_read_bool(dev, "summit,enable-otg-charging");
1270 /* Select charging control */
1271 device_property_read_u32(dev, "summit,enable-charge-control",
1272 &smb->enable_control);
1278 device_property_read_u32(dev, "summit,inok-polarity",
1279 &smb->inok_polarity);
1288 if (smb->mains)
1289 supply = smb->mains;
1291 supply = smb->usb;
1294 if (err == -ENXIO || err == -ENODEV)
1299 if (info->constant_charge_current_max_ua != -EINVAL)
1300 smb->max_charge_current = info->constant_charge_current_max_ua;
1302 if (info->constant_charge_voltage_max_uv != -EINVAL)
1303 smb->max_charge_voltage = info->constant_charge_voltage_max_uv;
1305 if (info->precharge_current_ua != -EINVAL)
1306 smb->pre_charge_current = info->precharge_current_ua;
1308 if (info->charge_term_current_ua != -EINVAL)
1309 smb->termination_current = info->charge_term_current_ua;
1311 if (info->temp_alert_min != INT_MIN)
1312 smb->soft_cold_temp_limit = info->temp_alert_min;
1314 if (info->temp_alert_max != INT_MAX)
1315 smb->soft_hot_temp_limit = info->temp_alert_max;
1317 if (info->temp_min != INT_MIN)
1318 smb->hard_cold_temp_limit = info->temp_min;
1320 if (info->temp_max != INT_MAX)
1321 smb->hard_hot_temp_limit = info->temp_max;
1324 if (smb->hard_cold_temp_limit != SMB3XX_TEMP_USE_DEFAULT ||
1325 smb->hard_hot_temp_limit != SMB3XX_TEMP_USE_DEFAULT)
1326 smb->suspend_on_hard_temp_limit = true;
1337 ret = regmap_read(smb->regmap, CFG_OTG, &val);
1343 * access to the datasheet, assume it's limit-enable.
1362 ret = regmap_update_bits(smb->regmap, CFG_OTG, mask, val);
1364 dev_err(smb->dev, "failed to change USB current limit\n");
1396 if (device_property_read_bool(&rdev->dev, "summit,needs-inok-toggle")) {
1399 if (smb->inok_polarity == SMB3XX_SYSOK_INOK_ACTIVE_LOW)
1406 ret = regmap_update_bits(smb->regmap, CFG_SYSOK,
1409 dev_err(smb->dev, "failed to disable INOK\n");
1416 dev_err(smb->dev, "failed to get USB VBUS current limit\n");
1424 dev_err(smb->dev, "failed to preset USB VBUS current limit\n");
1428 ret = regmap_set_bits(smb->regmap, CMD_A, CMD_A_OTG_ENABLED);
1430 dev_err(smb->dev, "failed to enable USB VBUS\n");
1434 smb->usb_vbus_enabled = true;
1438 dev_err(smb->dev, "failed to restore USB VBUS current limit\n");
1456 ret = regmap_clear_bits(smb->regmap, CMD_A, CMD_A_OTG_ENABLED);
1458 dev_err(smb->dev, "failed to disable USB VBUS\n");
1462 smb->usb_vbus_enabled = false;
1464 if (device_property_read_bool(&rdev->dev, "summit,needs-inok-toggle")) {
1467 if (smb->inok_polarity == SMB3XX_SYSOK_INOK_ACTIVE_HIGH)
1470 ret = regmap_update_bits(smb->regmap, CFG_SYSOK,
1473 dev_err(smb->dev, "failed to enable INOK\n");
1503 .name = "smb347-mains",
1511 .name = "smb347-usb",
1519 .name = "smb347-usb-vbus",
1520 .of_match = of_match_ptr("usb-vbus"),
1536 struct device *dev = &client->dev;
1542 return -ENOMEM;
1543 smb->dev = &client->dev;
1544 smb->id = id->driver_data;
1548 if (!smb->use_mains && !smb->use_usb)
1549 return -EINVAL;
1551 smb->regmap = devm_regmap_init_i2c(client, &smb347_regmap);
1552 if (IS_ERR(smb->regmap))
1553 return PTR_ERR(smb->regmap);
1557 if (smb->use_mains) {
1558 smb->mains = devm_power_supply_register(dev, &smb347_mains_desc,
1560 if (IS_ERR(smb->mains))
1561 return PTR_ERR(smb->mains);
1564 if (smb->use_usb) {
1565 smb->usb = devm_power_supply_register(dev, &smb347_usb_desc,
1567 if (IS_ERR(smb->usb))
1568 return PTR_ERR(smb->usb);
1585 usb_rdev_cfg.regmap = smb->regmap;
1587 smb->usb_rdev = devm_regulator_register(dev,
1590 if (IS_ERR(smb->usb_rdev)) {
1592 return PTR_ERR(smb->usb_rdev);
1602 smb347_usb_vbus_regulator_disable(smb->usb_rdev);