Lines Matching +full:loop +full:- +full:powered

1 // SPDX-License-Identifier: GPL-2.0-or-later
21 #define RT9455_DRIVER_NAME "rt9455-charger"
165 #define GET_MASK(fid) (BIT(rt9455_reg_fields[fid].msb + 1) - \
169 * Each array initialised below shows the possible real-world values for a
171 * ascending order. The index of each real-world value represents the value
265 for (i = 0; i < tbl_size - 1; i++)
269 return (tbl_size - 1);
279 ret = regmap_field_read(info->regmap_fields[field], &v);
283 v = (v >= tbl_size) ? (tbl_size - 1) : v;
295 return regmap_field_write(info->regmap_fields[field], idx);
300 struct device *dev = &info->client->dev;
304 ret = regmap_field_write(info->regmap_fields[F_RST], 0x01);
311 * To make sure that reset operation has finished, loop until RST bit
315 ret = regmap_field_read(info->regmap_fields[F_RST], &v);
325 } while (--limit);
328 return -EIO;
350 "main-battery",
359 ret = regmap_field_read(info->regmap_fields[F_PWR_RDY],
362 dev_err(&info->client->dev, "Failed to read PWR_RDY bit\n");
371 val->intval = POWER_SUPPLY_STATUS_DISCHARGING;
375 ret = regmap_field_read(info->regmap_fields[F_STAT], &v);
377 dev_err(&info->client->dev, "Failed to read STAT bits\n");
391 val->intval = POWER_SUPPLY_STATUS_NOT_CHARGING;
394 val->intval = POWER_SUPPLY_STATUS_CHARGING;
397 val->intval = POWER_SUPPLY_STATUS_FULL;
400 val->intval = POWER_SUPPLY_STATUS_UNKNOWN;
408 struct device *dev = &info->client->dev;
412 val->intval = POWER_SUPPLY_HEALTH_GOOD;
414 ret = regmap_read(info->regmap, RT9455_REG_IRQ1, &v);
421 val->intval = POWER_SUPPLY_HEALTH_OVERHEAT;
425 val->intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
429 val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
433 ret = regmap_read(info->regmap, RT9455_REG_IRQ2, &v);
440 val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
444 val->intval = POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE;
448 ret = regmap_read(info->regmap, RT9455_REG_IRQ3, &v);
455 val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
459 val->intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE;
463 val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
467 val->intval = POWER_SUPPLY_HEALTH_SAFETY_TIMER_EXPIRE;
471 ret = regmap_field_read(info->regmap_fields[F_STAT], &v);
478 val->intval = POWER_SUPPLY_HEALTH_UNSPEC_FAILURE;
491 ret = regmap_field_read(info->regmap_fields[F_BATAB], &v);
493 dev_err(&info->client->dev, "Failed to read BATAB bit\n");
501 val->intval = !v;
512 ret = regmap_field_read(info->regmap_fields[F_PWR_RDY], &v);
514 dev_err(&info->client->dev, "Failed to read PWR_RDY bit\n");
518 val->intval = (int)v;
534 dev_err(&info->client->dev, "Failed to read ICHRG value\n");
538 val->intval = curr;
546 int idx = ARRAY_SIZE(rt9455_ichrg_values) - 1;
548 val->intval = rt9455_ichrg_values[idx];
564 dev_err(&info->client->dev, "Failed to read VOREG value\n");
568 val->intval = voltage;
576 int idx = ARRAY_SIZE(rt9455_vmreg_values) - 1;
578 val->intval = rt9455_vmreg_values[idx];
586 struct device *dev = &info->client->dev;
607 val->intval = ichrg * ieoc_percentage / 100;
636 val->intval = POWER_SUPPLY_SCOPE_SYSTEM;
641 val->strval = RT9455_MODEL_NAME;
644 val->strval = RT9455_MANUFACTURER;
647 return -ENODATA;
655 struct device *dev = &info->client->dev;
665 ret = regmap_field_write(info->regmap_fields[F_TE], 1);
672 ret = regmap_field_write(info->regmap_fields[F_TE_SHDN_EN], 1);
682 ret = regmap_field_write(info->regmap_fields[F_BATD_EN], 1);
699 ret = regmap_field_write(info->regmap_fields[F_TMR_EN], 0x00);
705 /* Set ICHRG to value retrieved from device-specific data */
714 /* Set IEOC Percentage to value retrieved from device-specific data */
724 /* Set VOREG to value retrieved from device-specific data */
728 info->voreg);
735 idx = ARRAY_SIZE(rt9455_vmreg_values) - 1;
746 * Set MIVR to value retrieved from device-specific data.
749 if (mivr == -1)
761 * Set IAICR to value retrieved from device-specific data.
764 if (iaicr == -1)
779 ret = regmap_field_write(info->regmap_fields[F_IAICR_INT], 0x01);
790 ret = regmap_field_write(info->regmap_fields[F_CHMIVRIM], 0x01);
810 struct device *dev = &info->client->dev;
816 info->boost_voltage);
836 struct device *dev = &info->client->dev;
842 info->voreg);
856 struct device *dev = &info->client->dev;
861 ret = regmap_read(info->regmap, RT9455_REG_IRQ1, &irq1);
867 ret = regmap_read(info->regmap, RT9455_REG_MASK1, &mask1);
889 ret = regmap_field_write(info->regmap_fields[F_BATABM],
897 ret = regmap_read(info->regmap, RT9455_REG_MASK2, &mask2);
905 info->regmap_fields[F_CHTERMIM], 0x00);
914 info->regmap_fields[F_CHRCHGIM], 0x00);
925 cancel_delayed_work_sync(&info->max_charging_time_work);
933 &info->batt_presence_work,
950 struct device *dev = &info->client->dev;
954 ret = regmap_read(info->regmap, RT9455_REG_IRQ2, &irq2);
960 ret = regmap_read(info->regmap, RT9455_REG_MASK2, &mask2);
980 &info->pwr_rdy_work,
992 info->regmap_fields[F_CHTERMIM], 0x01);
1003 cancel_delayed_work_sync(&info->max_charging_time_work);
1009 ret = regmap_field_write(info->regmap_fields[F_CHG_EN],
1017 info->regmap_fields[F_CHTERMIM], 0x00);
1033 &info->max_charging_time_work,
1044 "Charger warning. Thermal regulation loop active\n");
1049 "Charger warning. Input voltage MIVR loop active\n");
1062 struct device *dev = &info->client->dev;
1066 ret = regmap_read(info->regmap, RT9455_REG_IRQ3, &irq3);
1072 ret = regmap_read(info->regmap, RT9455_REG_MASK3, &mask3);
1102 ret = regmap_field_write(info->regmap_fields[F_OPA_MODE],
1126 dev = &info->client->dev;
1128 if (irq != info->client->irq) {
1133 ret = regmap_field_read(info->regmap_fields[F_STAT], &status);
1177 if (info->charger)
1178 power_supply_changed(info->charger);
1188 struct device *dev = &info->client->dev;
1191 if (!dev->of_node && !ACPI_HANDLE(dev)) {
1193 return -EINVAL;
1199 ret = device_property_read_u32(dev, "richtek,output-charge-current",
1202 dev_err(dev, "Error: missing \"output-charge-current\" property\n");
1206 ret = device_property_read_u32(dev, "richtek,end-of-charge-percentage",
1209 dev_err(dev, "Error: missing \"end-of-charge-percentage\" property\n");
1214 "richtek,battery-regulation-voltage",
1215 &info->voreg);
1217 dev_err(dev, "Error: missing \"battery-regulation-voltage\" property\n");
1221 ret = device_property_read_u32(dev, "richtek,boost-output-voltage",
1222 &info->boost_voltage);
1224 dev_err(dev, "Error: missing \"boost-output-voltage\" property\n");
1232 device_property_read_u32(dev, "richtek,min-input-voltage-regulation",
1234 device_property_read_u32(dev, "richtek,avg-input-current-regulation",
1244 struct device *dev = &info->client->dev;
1255 * USB_EVENT_NONE, this means the consumer device powered by the
1260 ret = regmap_field_write(info->regmap_fields[F_OPA_MODE],
1270 ret = regmap_field_write(info->regmap_fields[F_IAICR],
1284 struct device *dev = &info->client->dev;
1295 * USB_EVENT_VBUS, this means the consumer device powered by the
1300 ret = regmap_field_write(info->regmap_fields[F_OPA_MODE],
1310 ret = regmap_field_write(info->regmap_fields[F_IAICR],
1324 struct device *dev = &info->client->dev;
1336 * it should be powered by the charger.
1340 ret = regmap_field_write(info->regmap_fields[F_OPA_MODE],
1350 ret = regmap_field_write(info->regmap_fields[F_IAICR],
1364 struct device *dev = &info->client->dev;
1375 * USB_EVENT_CHARGER, this means the consumer device powered by
1380 ret = regmap_field_write(info->regmap_fields[F_OPA_MODE],
1390 ret = regmap_field_write(info->regmap_fields[F_IAICR],
1405 struct device *dev = &info->client->dev;
1413 ret = regmap_field_read(info->regmap_fields[F_OPA_MODE],
1420 ret = regmap_field_read(info->regmap_fields[F_IAICR],
1448 struct device *dev = &info->client->dev;
1452 ret = regmap_field_read(info->regmap_fields[F_PWR_RDY], &pwr_rdy);
1460 cancel_delayed_work_sync(&info->max_charging_time_work);
1464 ret = regmap_field_write(info->regmap_fields[F_CHG_EN],
1471 &info->max_charging_time_work,
1479 power_supply_changed(info->charger);
1486 struct device *dev = &info->client->dev;
1490 ret = regmap_field_write(info->regmap_fields[F_CHG_EN],
1500 struct device *dev = &info->client->dev;
1504 ret = regmap_read(info->regmap, RT9455_REG_IRQ1, &irq1);
1516 &info->batt_presence_work,
1520 &info->max_charging_time_work,
1523 ret = regmap_read(info->regmap, RT9455_REG_MASK1, &mask1);
1530 ret = regmap_field_write(info->regmap_fields[F_BATABM],
1539 power_supply_changed(info->charger);
1587 struct i2c_adapter *adapter = client->adapter;
1588 struct device *dev = &client->dev;
1592 * Mandatory device-specific data values. Also, VOREG and boost output
1597 /* Optional device-specific data values. */
1598 u32 mivr = -1, iaicr = -1;
1603 return -ENODEV;
1607 return -ENOMEM;
1609 info->client = client;
1612 info->regmap = devm_regmap_init_i2c(client,
1614 if (IS_ERR(info->regmap)) {
1616 return -EINVAL;
1620 info->regmap_fields[i] =
1621 devm_regmap_field_alloc(dev, info->regmap,
1623 if (IS_ERR(info->regmap_fields[i])) {
1626 return PTR_ERR(info->regmap_fields[i]);
1638 info->usb_phy = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2);
1639 if (IS_ERR(info->usb_phy)) {
1642 info->nb.notifier_call = rt9455_usb_event;
1643 ret = usb_register_notifier(info->usb_phy, &info->nb);
1650 info->nb.notifier_call = NULL;
1655 INIT_DEFERRABLE_WORK(&info->pwr_rdy_work, rt9455_pwr_rdy_work_callback);
1656 INIT_DEFERRABLE_WORK(&info->max_charging_time_work,
1658 INIT_DEFERRABLE_WORK(&info->batt_presence_work,
1666 ret = devm_request_threaded_irq(dev, client->irq, NULL,
1681 info->charger = devm_power_supply_register(dev, &rt9455_charger_desc,
1683 if (IS_ERR(info->charger)) {
1685 ret = PTR_ERR(info->charger);
1693 if (info->nb.notifier_call) {
1694 usb_unregister_notifier(info->usb_phy, &info->nb);
1695 info->nb.notifier_call = NULL;
1708 dev_err(&info->client->dev, "Failed to set charger to its default values\n");
1711 if (info->nb.notifier_call)
1712 usb_unregister_notifier(info->usb_phy, &info->nb);
1715 cancel_delayed_work_sync(&info->pwr_rdy_work);
1716 cancel_delayed_work_sync(&info->max_charging_time_work);
1717 cancel_delayed_work_sync(&info->batt_presence_work);
1753 MODULE_AUTHOR("Anda-Maria Nicolae <anda-maria.nicolae@intel.com>");