|
43 | 43 | * https://www.ti.com/product/bq27411-g1
|
44 | 44 | * https://www.ti.com/product/bq27441-g1
|
45 | 45 | * https://www.ti.com/product/bq27621-g1
|
| 46 | + * https://www.ti.com/product/bq27z561 |
46 | 47 | */
|
47 | 48 |
|
48 | 49 | #include <linux/device.h>
|
|
79 | 80 | #define BQ27000_FLAG_FC BIT(5)
|
80 | 81 | #define BQ27000_FLAG_CHGS BIT(7) /* Charge state flag */
|
81 | 82 |
|
| 83 | +/* BQ27Z561 has different layout for Flags register */ |
| 84 | +#define BQ27Z561_FLAG_FDC BIT(4) /* Battery fully discharged */ |
| 85 | +#define BQ27Z561_FLAG_FC BIT(5) /* Battery fully charged */ |
| 86 | +#define BQ27Z561_FLAG_DIS_CH BIT(6) /* Battery is discharging */ |
| 87 | + |
82 | 88 | /* control register params */
|
83 | 89 | #define BQ27XXX_SEALED 0x20
|
84 | 90 | #define BQ27XXX_SET_CFGUPDATE 0x13
|
@@ -431,12 +437,32 @@ static u8
|
431 | 437 | [BQ27XXX_REG_DCAP] = 0x3c,
|
432 | 438 | [BQ27XXX_REG_AP] = 0x18,
|
433 | 439 | BQ27XXX_DM_REG_ROWS,
|
434 |
| - }; |
| 440 | + }, |
435 | 441 | #define bq27411_regs bq27421_regs
|
436 | 442 | #define bq27425_regs bq27421_regs
|
437 | 443 | #define bq27426_regs bq27421_regs
|
438 | 444 | #define bq27441_regs bq27421_regs
|
439 | 445 | #define bq27621_regs bq27421_regs
|
| 446 | + bq27z561_regs[BQ27XXX_REG_MAX] = { |
| 447 | + [BQ27XXX_REG_CTRL] = 0x00, |
| 448 | + [BQ27XXX_REG_TEMP] = 0x06, |
| 449 | + [BQ27XXX_REG_INT_TEMP] = INVALID_REG_ADDR, |
| 450 | + [BQ27XXX_REG_VOLT] = 0x08, |
| 451 | + [BQ27XXX_REG_AI] = 0x14, |
| 452 | + [BQ27XXX_REG_FLAGS] = 0x0a, |
| 453 | + [BQ27XXX_REG_TTE] = 0x16, |
| 454 | + [BQ27XXX_REG_TTF] = 0x18, |
| 455 | + [BQ27XXX_REG_TTES] = INVALID_REG_ADDR, |
| 456 | + [BQ27XXX_REG_TTECP] = INVALID_REG_ADDR, |
| 457 | + [BQ27XXX_REG_NAC] = INVALID_REG_ADDR, |
| 458 | + [BQ27XXX_REG_FCC] = 0x12, |
| 459 | + [BQ27XXX_REG_CYCT] = 0x2a, |
| 460 | + [BQ27XXX_REG_AE] = 0x22, |
| 461 | + [BQ27XXX_REG_SOC] = 0x2c, |
| 462 | + [BQ27XXX_REG_DCAP] = 0x3c, |
| 463 | + [BQ27XXX_REG_AP] = 0x22, |
| 464 | + BQ27XXX_DM_REG_ROWS, |
| 465 | + }; |
440 | 466 |
|
441 | 467 | static enum power_supply_property bq27000_props[] = {
|
442 | 468 | POWER_SUPPLY_PROP_STATUS,
|
@@ -672,6 +698,25 @@ static enum power_supply_property bq27421_props[] = {
|
672 | 698 | #define bq27441_props bq27421_props
|
673 | 699 | #define bq27621_props bq27421_props
|
674 | 700 |
|
| 701 | +static enum power_supply_property bq27z561_props[] = { |
| 702 | + POWER_SUPPLY_PROP_STATUS, |
| 703 | + POWER_SUPPLY_PROP_PRESENT, |
| 704 | + POWER_SUPPLY_PROP_VOLTAGE_NOW, |
| 705 | + POWER_SUPPLY_PROP_CURRENT_NOW, |
| 706 | + POWER_SUPPLY_PROP_CAPACITY, |
| 707 | + POWER_SUPPLY_PROP_CAPACITY_LEVEL, |
| 708 | + POWER_SUPPLY_PROP_TEMP, |
| 709 | + POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW, |
| 710 | + POWER_SUPPLY_PROP_TIME_TO_FULL_NOW, |
| 711 | + POWER_SUPPLY_PROP_TECHNOLOGY, |
| 712 | + POWER_SUPPLY_PROP_CHARGE_FULL, |
| 713 | + POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, |
| 714 | + POWER_SUPPLY_PROP_CYCLE_COUNT, |
| 715 | + POWER_SUPPLY_PROP_POWER_AVG, |
| 716 | + POWER_SUPPLY_PROP_HEALTH, |
| 717 | + POWER_SUPPLY_PROP_MANUFACTURER, |
| 718 | +}; |
| 719 | + |
675 | 720 | struct bq27xxx_dm_reg {
|
676 | 721 | u8 subclass_id;
|
677 | 722 | u8 offset;
|
@@ -767,11 +812,14 @@ static struct bq27xxx_dm_reg bq27621_dm_regs[] = {
|
767 | 812 | #define bq27621_dm_regs 0
|
768 | 813 | #endif
|
769 | 814 |
|
| 815 | +#define bq27z561_dm_regs 0 |
| 816 | + |
770 | 817 | #define BQ27XXX_O_ZERO 0x00000001
|
771 | 818 | #define BQ27XXX_O_OTDC 0x00000002 /* has OTC/OTD overtemperature flags */
|
772 | 819 | #define BQ27XXX_O_UTOT 0x00000004 /* has OT overtemperature flag */
|
773 | 820 | #define BQ27XXX_O_CFGUP 0x00000008
|
774 | 821 | #define BQ27XXX_O_RAM 0x00000010
|
| 822 | +#define BQ27Z561_O_BITS 0x00000020 |
775 | 823 |
|
776 | 824 | #define BQ27XXX_DATA(ref, key, opt) { \
|
777 | 825 | .opts = (opt), \
|
@@ -816,6 +864,7 @@ static struct {
|
816 | 864 | [BQ27426] = BQ27XXX_DATA(bq27426, 0x80008000, BQ27XXX_O_UTOT | BQ27XXX_O_CFGUP | BQ27XXX_O_RAM),
|
817 | 865 | [BQ27441] = BQ27XXX_DATA(bq27441, 0x80008000, BQ27XXX_O_UTOT | BQ27XXX_O_CFGUP | BQ27XXX_O_RAM),
|
818 | 866 | [BQ27621] = BQ27XXX_DATA(bq27621, 0x80008000, BQ27XXX_O_UTOT | BQ27XXX_O_CFGUP | BQ27XXX_O_RAM),
|
| 867 | + [BQ27Z561] = BQ27XXX_DATA(bq27z561, 0 , BQ27Z561_O_BITS), |
819 | 868 | };
|
820 | 869 |
|
821 | 870 | static DEFINE_MUTEX(bq27xxx_list_lock);
|
@@ -1551,6 +1600,8 @@ static bool bq27xxx_battery_dead(struct bq27xxx_device_info *di, u16 flags)
|
1551 | 1600 | {
|
1552 | 1601 | if (di->opts & BQ27XXX_O_ZERO)
|
1553 | 1602 | return flags & (BQ27000_FLAG_EDV1 | BQ27000_FLAG_EDVF);
|
| 1603 | + else if (di->opts & BQ27Z561_O_BITS) |
| 1604 | + return flags & BQ27Z561_FLAG_FDC; |
1554 | 1605 | else
|
1555 | 1606 | return flags & (BQ27XXX_FLAG_SOC1 | BQ27XXX_FLAG_SOCF);
|
1556 | 1607 | }
|
@@ -1595,6 +1646,7 @@ void bq27xxx_battery_update(struct bq27xxx_device_info *di)
|
1595 | 1646 | cache.time_to_empty_avg = bq27xxx_battery_read_time(di, BQ27XXX_REG_TTECP);
|
1596 | 1647 | if (di->regs[BQ27XXX_REG_TTF] != INVALID_REG_ADDR)
|
1597 | 1648 | cache.time_to_full = bq27xxx_battery_read_time(di, BQ27XXX_REG_TTF);
|
| 1649 | + |
1598 | 1650 | cache.charge_full = bq27xxx_battery_read_fcc(di);
|
1599 | 1651 | cache.capacity = bq27xxx_battery_read_soc(di);
|
1600 | 1652 | if (di->regs[BQ27XXX_REG_AE] != INVALID_REG_ADDR)
|
@@ -1682,6 +1734,13 @@ static int bq27xxx_battery_status(struct bq27xxx_device_info *di,
|
1682 | 1734 | status = POWER_SUPPLY_STATUS_NOT_CHARGING;
|
1683 | 1735 | else
|
1684 | 1736 | status = POWER_SUPPLY_STATUS_DISCHARGING;
|
| 1737 | + } else if (di->opts & BQ27Z561_O_BITS) { |
| 1738 | + if (di->cache.flags & BQ27Z561_FLAG_FC) |
| 1739 | + status = POWER_SUPPLY_STATUS_FULL; |
| 1740 | + else if (di->cache.flags & BQ27Z561_FLAG_DIS_CH) |
| 1741 | + status = POWER_SUPPLY_STATUS_DISCHARGING; |
| 1742 | + else |
| 1743 | + status = POWER_SUPPLY_STATUS_CHARGING; |
1685 | 1744 | } else {
|
1686 | 1745 | if (di->cache.flags & BQ27XXX_FLAG_FC)
|
1687 | 1746 | status = POWER_SUPPLY_STATUS_FULL;
|
@@ -1710,6 +1769,13 @@ static int bq27xxx_battery_capacity_level(struct bq27xxx_device_info *di,
|
1710 | 1769 | level = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
|
1711 | 1770 | else
|
1712 | 1771 | level = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
|
| 1772 | + } else if (di->opts & BQ27Z561_O_BITS) { |
| 1773 | + if (di->cache.flags & BQ27Z561_FLAG_FC) |
| 1774 | + level = POWER_SUPPLY_CAPACITY_LEVEL_FULL; |
| 1775 | + else if (di->cache.flags & BQ27Z561_FLAG_FDC) |
| 1776 | + level = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL; |
| 1777 | + else |
| 1778 | + level = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL; |
1713 | 1779 | } else {
|
1714 | 1780 | if (di->cache.flags & BQ27XXX_FLAG_FC)
|
1715 | 1781 | level = POWER_SUPPLY_CAPACITY_LEVEL_FULL;
|
|
0 commit comments