Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

power: supply: bq24190_charger: Add power_supply_battery_info support

Set pre-charge and charge-term current, obtained from power_supply_battery_info.
Add sysfs attributes precharge_current & charge_term_current.

Cc: Hans de Goede <hdegoede@redhat.com>
Acked-by: Tony Lindgren <tony@atomide.com>
Signed-off-by: Liam Breck <kernel@networkimprov.net>
Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>

authored by

Liam Breck and committed by
Sebastian Reichel
14e1a131 8412a5be

+87
+87
drivers/power/supply/bq24190_charger.c
··· 59 59 #define BQ24190_REG_PCTCC_IPRECHG_MASK (BIT(7) | BIT(6) | BIT(5) | \ 60 60 BIT(4)) 61 61 #define BQ24190_REG_PCTCC_IPRECHG_SHIFT 4 62 + #define BQ24190_REG_PCTCC_IPRECHG_MIN 128 63 + #define BQ24190_REG_PCTCC_IPRECHG_MAX 2048 62 64 #define BQ24190_REG_PCTCC_ITERM_MASK (BIT(3) | BIT(2) | BIT(1) | \ 63 65 BIT(0)) 64 66 #define BQ24190_REG_PCTCC_ITERM_SHIFT 0 67 + #define BQ24190_REG_PCTCC_ITERM_MIN 128 68 + #define BQ24190_REG_PCTCC_ITERM_MAX 2048 65 69 66 70 #define BQ24190_REG_CVC 0x04 /* Charge Voltage Control */ 67 71 #define BQ24190_REG_CVC_VREG_MASK (BIT(7) | BIT(6) | BIT(5) | \ ··· 166 162 bool initialized; 167 163 bool irq_event; 168 164 u16 sys_min; 165 + u16 iprechg; 166 + u16 iterm; 169 167 struct mutex f_reg_lock; 170 168 u8 f_reg; 171 169 u8 ss_reg; ··· 549 543 return ret; 550 544 } 551 545 546 + if (bdi->iprechg) { 547 + v = bdi->iprechg / 128 - 1; // manual section 9.5.1.4, table 11 548 + ret = bq24190_write_mask(bdi, BQ24190_REG_PCTCC, 549 + BQ24190_REG_PCTCC_IPRECHG_MASK, 550 + BQ24190_REG_PCTCC_IPRECHG_SHIFT, 551 + v); 552 + if (ret < 0) 553 + return ret; 554 + } 555 + 556 + if (bdi->iterm) { 557 + v = bdi->iterm / 128 - 1; // manual section 9.5.1.4, table 11 558 + ret = bq24190_write_mask(bdi, BQ24190_REG_PCTCC, 559 + BQ24190_REG_PCTCC_ITERM_MASK, 560 + BQ24190_REG_PCTCC_ITERM_SHIFT, 561 + v); 562 + if (ret < 0) 563 + return ret; 564 + } 565 + 552 566 return 0; 553 567 } 554 568 ··· 817 791 return bq24190_battery_set_temp_alert_max(bdi, val); 818 792 } 819 793 794 + static int bq24190_charger_get_precharge(struct bq24190_dev_info *bdi, 795 + union power_supply_propval *val) 796 + { 797 + u8 v; 798 + int ret; 799 + 800 + ret = bq24190_read_mask(bdi, BQ24190_REG_PCTCC, 801 + BQ24190_REG_PCTCC_IPRECHG_MASK, 802 + BQ24190_REG_PCTCC_IPRECHG_SHIFT, &v); 803 + if (ret < 0) 804 + return ret; 805 + 806 + val->intval = ++v * 128 * 1000; 807 + return 0; 808 + } 809 + 810 + static int bq24190_charger_get_charge_term(struct bq24190_dev_info *bdi, 811 + union power_supply_propval *val) 812 + { 813 + u8 v; 814 + int ret; 815 + 816 + ret = bq24190_read_mask(bdi, BQ24190_REG_PCTCC, 817 + BQ24190_REG_PCTCC_ITERM_MASK, 818 + BQ24190_REG_PCTCC_ITERM_SHIFT, &v); 819 + if (ret < 0) 820 + return ret; 821 + 822 + val->intval = ++v * 128 * 1000; 823 + return 0; 824 + } 825 + 820 826 static int bq24190_charger_get_current(struct bq24190_dev_info *bdi, 821 827 union power_supply_propval *val) 822 828 { ··· 996 938 case POWER_SUPPLY_PROP_TEMP_ALERT_MAX: 997 939 ret = bq24190_charger_get_temp_alert_max(bdi, val); 998 940 break; 941 + case POWER_SUPPLY_PROP_PRECHARGE_CURRENT: 942 + ret = bq24190_charger_get_precharge(bdi, val); 943 + break; 944 + case POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT: 945 + ret = bq24190_charger_get_charge_term(bdi, val); 946 + break; 999 947 case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT: 1000 948 ret = bq24190_charger_get_current(bdi, val); 1001 949 break; ··· 1108 1044 POWER_SUPPLY_PROP_ONLINE, 1109 1045 POWER_SUPPLY_PROP_STATUS, 1110 1046 POWER_SUPPLY_PROP_TEMP_ALERT_MAX, 1047 + POWER_SUPPLY_PROP_PRECHARGE_CURRENT, 1048 + POWER_SUPPLY_PROP_CHARGE_TERM_CURRENT, 1111 1049 POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT, 1112 1050 POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX, 1113 1051 POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE, ··· 1589 1523 static int bq24190_get_config(struct bq24190_dev_info *bdi) 1590 1524 { 1591 1525 const char * const s = "ti,system-minimum-microvolt"; 1526 + struct power_supply_battery_info info = {}; 1592 1527 int v; 1593 1528 1594 1529 if (device_property_read_u32(bdi->dev, s, &v) == 0) { ··· 1599 1532 bdi->sys_min = v; 1600 1533 else 1601 1534 dev_warn(bdi->dev, "invalid value for %s: %u\n", s, v); 1535 + } 1536 + 1537 + if (bdi->dev->of_node && 1538 + !power_supply_get_battery_info(bdi->charger, &info)) { 1539 + v = info.precharge_current_ua / 1000; 1540 + if (v >= BQ24190_REG_PCTCC_IPRECHG_MIN 1541 + && v <= BQ24190_REG_PCTCC_IPRECHG_MAX) 1542 + bdi->iprechg = v; 1543 + else 1544 + dev_warn(bdi->dev, "invalid value for battery:precharge-current-microamp: %d\n", 1545 + v); 1546 + 1547 + v = info.charge_term_current_ua / 1000; 1548 + if (v >= BQ24190_REG_PCTCC_ITERM_MIN 1549 + && v <= BQ24190_REG_PCTCC_ITERM_MAX) 1550 + bdi->iterm = v; 1551 + else 1552 + dev_warn(bdi->dev, "invalid value for battery:charge-term-current-microamp: %d\n", 1553 + v); 1602 1554 } 1603 1555 1604 1556 return 0; ··· 1687 1601 } 1688 1602 1689 1603 charger_cfg.drv_data = bdi; 1604 + charger_cfg.of_node = dev->of_node; 1690 1605 charger_cfg.supplied_to = bq24190_charger_supplied_to; 1691 1606 charger_cfg.num_supplicants = ARRAY_SIZE(bq24190_charger_supplied_to), 1692 1607 bdi->charger = power_supply_register(dev, &bq24190_charger_desc,