.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0 |
---|
1 | 2 | /* |
---|
2 | 3 | * BQ27xxx battery driver |
---|
3 | 4 | * |
---|
4 | 5 | * Copyright (C) 2008 Rodolfo Giometti <giometti@linux.it> |
---|
5 | 6 | * Copyright (C) 2008 Eurotech S.p.A. <info@eurotech.it> |
---|
6 | 7 | * Copyright (C) 2010-2011 Lars-Peter Clausen <lars@metafoo.de> |
---|
7 | | - * Copyright (C) 2011 Pali Rohár <pali.rohar@gmail.com> |
---|
| 8 | + * Copyright (C) 2011 Pali Rohár <pali@kernel.org> |
---|
8 | 9 | * Copyright (C) 2017 Liam Breck <kernel@networkimprov.net> |
---|
9 | 10 | * |
---|
10 | 11 | * Based on a previous work by Copyright (C) 2008 Texas Instruments, Inc. |
---|
11 | 12 | * |
---|
12 | | - * This package is free software; you can redistribute it and/or modify |
---|
13 | | - * it under the terms of the GNU General Public License version 2 as |
---|
14 | | - * published by the Free Software Foundation. |
---|
15 | | - * |
---|
16 | | - * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR |
---|
17 | | - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED |
---|
18 | | - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. |
---|
19 | | - * |
---|
20 | 13 | * Datasheets: |
---|
21 | | - * http://www.ti.com/product/bq27000 |
---|
22 | | - * http://www.ti.com/product/bq27200 |
---|
23 | | - * http://www.ti.com/product/bq27010 |
---|
24 | | - * http://www.ti.com/product/bq27210 |
---|
25 | | - * http://www.ti.com/product/bq27500 |
---|
26 | | - * http://www.ti.com/product/bq27510-g1 |
---|
27 | | - * http://www.ti.com/product/bq27510-g2 |
---|
28 | | - * http://www.ti.com/product/bq27510-g3 |
---|
29 | | - * http://www.ti.com/product/bq27520-g1 |
---|
30 | | - * http://www.ti.com/product/bq27520-g2 |
---|
31 | | - * http://www.ti.com/product/bq27520-g3 |
---|
32 | | - * http://www.ti.com/product/bq27520-g4 |
---|
33 | | - * http://www.ti.com/product/bq27530-g1 |
---|
34 | | - * http://www.ti.com/product/bq27531-g1 |
---|
35 | | - * http://www.ti.com/product/bq27541-g1 |
---|
36 | | - * http://www.ti.com/product/bq27542-g1 |
---|
37 | | - * http://www.ti.com/product/bq27546-g1 |
---|
38 | | - * http://www.ti.com/product/bq27742-g1 |
---|
39 | | - * http://www.ti.com/product/bq27545-g1 |
---|
40 | | - * http://www.ti.com/product/bq27421-g1 |
---|
41 | | - * http://www.ti.com/product/bq27425-g1 |
---|
42 | | - * http://www.ti.com/product/bq27426 |
---|
43 | | - * http://www.ti.com/product/bq27411-g1 |
---|
44 | | - * http://www.ti.com/product/bq27441-g1 |
---|
45 | | - * http://www.ti.com/product/bq27621-g1 |
---|
| 14 | + * https://www.ti.com/product/bq27000 |
---|
| 15 | + * https://www.ti.com/product/bq27200 |
---|
| 16 | + * https://www.ti.com/product/bq27010 |
---|
| 17 | + * https://www.ti.com/product/bq27210 |
---|
| 18 | + * https://www.ti.com/product/bq27500 |
---|
| 19 | + * https://www.ti.com/product/bq27510-g1 |
---|
| 20 | + * https://www.ti.com/product/bq27510-g2 |
---|
| 21 | + * https://www.ti.com/product/bq27510-g3 |
---|
| 22 | + * https://www.ti.com/product/bq27520-g1 |
---|
| 23 | + * https://www.ti.com/product/bq27520-g2 |
---|
| 24 | + * https://www.ti.com/product/bq27520-g3 |
---|
| 25 | + * https://www.ti.com/product/bq27520-g4 |
---|
| 26 | + * https://www.ti.com/product/bq27530-g1 |
---|
| 27 | + * https://www.ti.com/product/bq27531-g1 |
---|
| 28 | + * https://www.ti.com/product/bq27541-g1 |
---|
| 29 | + * https://www.ti.com/product/bq27542-g1 |
---|
| 30 | + * https://www.ti.com/product/bq27546-g1 |
---|
| 31 | + * https://www.ti.com/product/bq27742-g1 |
---|
| 32 | + * https://www.ti.com/product/bq27545-g1 |
---|
| 33 | + * https://www.ti.com/product/bq27421-g1 |
---|
| 34 | + * https://www.ti.com/product/bq27425-g1 |
---|
| 35 | + * https://www.ti.com/product/bq27426 |
---|
| 36 | + * https://www.ti.com/product/bq27411-g1 |
---|
| 37 | + * https://www.ti.com/product/bq27441-g1 |
---|
| 38 | + * https://www.ti.com/product/bq27621-g1 |
---|
| 39 | + * https://www.ti.com/product/bq27z561 |
---|
| 40 | + * https://www.ti.com/product/bq28z610 |
---|
| 41 | + * https://www.ti.com/product/bq34z100-g1 |
---|
46 | 42 | */ |
---|
47 | 43 | |
---|
48 | 44 | #include <linux/device.h> |
---|
.. | .. |
---|
78 | 74 | #define BQ27000_FLAG_CI BIT(4) /* Capacity Inaccurate flag */ |
---|
79 | 75 | #define BQ27000_FLAG_FC BIT(5) |
---|
80 | 76 | #define BQ27000_FLAG_CHGS BIT(7) /* Charge state flag */ |
---|
| 77 | + |
---|
| 78 | +/* BQ27Z561 has different layout for Flags register */ |
---|
| 79 | +#define BQ27Z561_FLAG_FDC BIT(4) /* Battery fully discharged */ |
---|
| 80 | +#define BQ27Z561_FLAG_FC BIT(5) /* Battery fully charged */ |
---|
| 81 | +#define BQ27Z561_FLAG_DIS_CH BIT(6) /* Battery is discharging */ |
---|
81 | 82 | |
---|
82 | 83 | /* control register params */ |
---|
83 | 84 | #define BQ27XXX_SEALED 0x20 |
---|
.. | .. |
---|
431 | 432 | [BQ27XXX_REG_DCAP] = 0x3c, |
---|
432 | 433 | [BQ27XXX_REG_AP] = 0x18, |
---|
433 | 434 | BQ27XXX_DM_REG_ROWS, |
---|
434 | | - }; |
---|
| 435 | + }, |
---|
| 436 | +#define bq27411_regs bq27421_regs |
---|
435 | 437 | #define bq27425_regs bq27421_regs |
---|
436 | 438 | #define bq27426_regs bq27421_regs |
---|
437 | 439 | #define bq27441_regs bq27421_regs |
---|
438 | 440 | #define bq27621_regs bq27421_regs |
---|
| 441 | + bq27z561_regs[BQ27XXX_REG_MAX] = { |
---|
| 442 | + [BQ27XXX_REG_CTRL] = 0x00, |
---|
| 443 | + [BQ27XXX_REG_TEMP] = 0x06, |
---|
| 444 | + [BQ27XXX_REG_INT_TEMP] = INVALID_REG_ADDR, |
---|
| 445 | + [BQ27XXX_REG_VOLT] = 0x08, |
---|
| 446 | + [BQ27XXX_REG_AI] = 0x14, |
---|
| 447 | + [BQ27XXX_REG_FLAGS] = 0x0a, |
---|
| 448 | + [BQ27XXX_REG_TTE] = 0x16, |
---|
| 449 | + [BQ27XXX_REG_TTF] = 0x18, |
---|
| 450 | + [BQ27XXX_REG_TTES] = INVALID_REG_ADDR, |
---|
| 451 | + [BQ27XXX_REG_TTECP] = INVALID_REG_ADDR, |
---|
| 452 | + [BQ27XXX_REG_NAC] = INVALID_REG_ADDR, |
---|
| 453 | + [BQ27XXX_REG_FCC] = 0x12, |
---|
| 454 | + [BQ27XXX_REG_CYCT] = 0x2a, |
---|
| 455 | + [BQ27XXX_REG_AE] = 0x22, |
---|
| 456 | + [BQ27XXX_REG_SOC] = 0x2c, |
---|
| 457 | + [BQ27XXX_REG_DCAP] = 0x3c, |
---|
| 458 | + [BQ27XXX_REG_AP] = 0x22, |
---|
| 459 | + BQ27XXX_DM_REG_ROWS, |
---|
| 460 | + }, |
---|
| 461 | + bq28z610_regs[BQ27XXX_REG_MAX] = { |
---|
| 462 | + [BQ27XXX_REG_CTRL] = 0x00, |
---|
| 463 | + [BQ27XXX_REG_TEMP] = 0x06, |
---|
| 464 | + [BQ27XXX_REG_INT_TEMP] = INVALID_REG_ADDR, |
---|
| 465 | + [BQ27XXX_REG_VOLT] = 0x08, |
---|
| 466 | + [BQ27XXX_REG_AI] = 0x14, |
---|
| 467 | + [BQ27XXX_REG_FLAGS] = 0x0a, |
---|
| 468 | + [BQ27XXX_REG_TTE] = 0x16, |
---|
| 469 | + [BQ27XXX_REG_TTF] = 0x18, |
---|
| 470 | + [BQ27XXX_REG_TTES] = INVALID_REG_ADDR, |
---|
| 471 | + [BQ27XXX_REG_TTECP] = INVALID_REG_ADDR, |
---|
| 472 | + [BQ27XXX_REG_NAC] = INVALID_REG_ADDR, |
---|
| 473 | + [BQ27XXX_REG_FCC] = 0x12, |
---|
| 474 | + [BQ27XXX_REG_CYCT] = 0x2a, |
---|
| 475 | + [BQ27XXX_REG_AE] = 0x22, |
---|
| 476 | + [BQ27XXX_REG_SOC] = 0x2c, |
---|
| 477 | + [BQ27XXX_REG_DCAP] = 0x3c, |
---|
| 478 | + [BQ27XXX_REG_AP] = 0x22, |
---|
| 479 | + BQ27XXX_DM_REG_ROWS, |
---|
| 480 | + }, |
---|
| 481 | + bq34z100_regs[BQ27XXX_REG_MAX] = { |
---|
| 482 | + [BQ27XXX_REG_CTRL] = 0x00, |
---|
| 483 | + [BQ27XXX_REG_TEMP] = 0x0c, |
---|
| 484 | + [BQ27XXX_REG_INT_TEMP] = 0x2a, |
---|
| 485 | + [BQ27XXX_REG_VOLT] = 0x08, |
---|
| 486 | + [BQ27XXX_REG_AI] = 0x0a, |
---|
| 487 | + [BQ27XXX_REG_FLAGS] = 0x0e, |
---|
| 488 | + [BQ27XXX_REG_TTE] = 0x18, |
---|
| 489 | + [BQ27XXX_REG_TTF] = 0x1a, |
---|
| 490 | + [BQ27XXX_REG_TTES] = 0x1e, |
---|
| 491 | + [BQ27XXX_REG_TTECP] = INVALID_REG_ADDR, |
---|
| 492 | + [BQ27XXX_REG_NAC] = INVALID_REG_ADDR, |
---|
| 493 | + [BQ27XXX_REG_FCC] = 0x06, |
---|
| 494 | + [BQ27XXX_REG_CYCT] = 0x2c, |
---|
| 495 | + [BQ27XXX_REG_AE] = 0x24, |
---|
| 496 | + [BQ27XXX_REG_SOC] = 0x02, |
---|
| 497 | + [BQ27XXX_REG_DCAP] = 0x3c, |
---|
| 498 | + [BQ27XXX_REG_AP] = 0x22, |
---|
| 499 | + BQ27XXX_DM_REG_ROWS, |
---|
| 500 | + }; |
---|
439 | 501 | |
---|
440 | 502 | static enum power_supply_property bq27000_props[] = { |
---|
441 | 503 | POWER_SUPPLY_PROP_STATUS, |
---|
.. | .. |
---|
665 | 727 | POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, |
---|
666 | 728 | POWER_SUPPLY_PROP_MANUFACTURER, |
---|
667 | 729 | }; |
---|
| 730 | +#define bq27411_props bq27421_props |
---|
668 | 731 | #define bq27425_props bq27421_props |
---|
669 | 732 | #define bq27426_props bq27421_props |
---|
670 | 733 | #define bq27441_props bq27421_props |
---|
671 | 734 | #define bq27621_props bq27421_props |
---|
| 735 | + |
---|
| 736 | +static enum power_supply_property bq27z561_props[] = { |
---|
| 737 | + POWER_SUPPLY_PROP_STATUS, |
---|
| 738 | + POWER_SUPPLY_PROP_PRESENT, |
---|
| 739 | + POWER_SUPPLY_PROP_VOLTAGE_NOW, |
---|
| 740 | + POWER_SUPPLY_PROP_CURRENT_NOW, |
---|
| 741 | + POWER_SUPPLY_PROP_CAPACITY, |
---|
| 742 | + POWER_SUPPLY_PROP_CAPACITY_LEVEL, |
---|
| 743 | + POWER_SUPPLY_PROP_TEMP, |
---|
| 744 | + POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW, |
---|
| 745 | + POWER_SUPPLY_PROP_TIME_TO_FULL_NOW, |
---|
| 746 | + POWER_SUPPLY_PROP_TECHNOLOGY, |
---|
| 747 | + POWER_SUPPLY_PROP_CHARGE_FULL, |
---|
| 748 | + POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, |
---|
| 749 | + POWER_SUPPLY_PROP_CYCLE_COUNT, |
---|
| 750 | + POWER_SUPPLY_PROP_POWER_AVG, |
---|
| 751 | + POWER_SUPPLY_PROP_HEALTH, |
---|
| 752 | + POWER_SUPPLY_PROP_MANUFACTURER, |
---|
| 753 | +}; |
---|
| 754 | + |
---|
| 755 | +static enum power_supply_property bq28z610_props[] = { |
---|
| 756 | + POWER_SUPPLY_PROP_STATUS, |
---|
| 757 | + POWER_SUPPLY_PROP_PRESENT, |
---|
| 758 | + POWER_SUPPLY_PROP_VOLTAGE_NOW, |
---|
| 759 | + POWER_SUPPLY_PROP_CURRENT_NOW, |
---|
| 760 | + POWER_SUPPLY_PROP_CAPACITY, |
---|
| 761 | + POWER_SUPPLY_PROP_CAPACITY_LEVEL, |
---|
| 762 | + POWER_SUPPLY_PROP_TEMP, |
---|
| 763 | + POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW, |
---|
| 764 | + POWER_SUPPLY_PROP_TIME_TO_FULL_NOW, |
---|
| 765 | + POWER_SUPPLY_PROP_TECHNOLOGY, |
---|
| 766 | + POWER_SUPPLY_PROP_CHARGE_FULL, |
---|
| 767 | + POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, |
---|
| 768 | + POWER_SUPPLY_PROP_CYCLE_COUNT, |
---|
| 769 | + POWER_SUPPLY_PROP_POWER_AVG, |
---|
| 770 | + POWER_SUPPLY_PROP_HEALTH, |
---|
| 771 | + POWER_SUPPLY_PROP_MANUFACTURER, |
---|
| 772 | +}; |
---|
| 773 | + |
---|
| 774 | +static enum power_supply_property bq34z100_props[] = { |
---|
| 775 | + POWER_SUPPLY_PROP_STATUS, |
---|
| 776 | + POWER_SUPPLY_PROP_PRESENT, |
---|
| 777 | + POWER_SUPPLY_PROP_VOLTAGE_NOW, |
---|
| 778 | + POWER_SUPPLY_PROP_CURRENT_NOW, |
---|
| 779 | + POWER_SUPPLY_PROP_CAPACITY, |
---|
| 780 | + POWER_SUPPLY_PROP_CAPACITY_LEVEL, |
---|
| 781 | + POWER_SUPPLY_PROP_TEMP, |
---|
| 782 | + POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW, |
---|
| 783 | + POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG, |
---|
| 784 | + POWER_SUPPLY_PROP_TIME_TO_FULL_NOW, |
---|
| 785 | + POWER_SUPPLY_PROP_TECHNOLOGY, |
---|
| 786 | + POWER_SUPPLY_PROP_CHARGE_FULL, |
---|
| 787 | + POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, |
---|
| 788 | + POWER_SUPPLY_PROP_CYCLE_COUNT, |
---|
| 789 | + POWER_SUPPLY_PROP_ENERGY_NOW, |
---|
| 790 | + POWER_SUPPLY_PROP_POWER_AVG, |
---|
| 791 | + POWER_SUPPLY_PROP_HEALTH, |
---|
| 792 | + POWER_SUPPLY_PROP_MANUFACTURER, |
---|
| 793 | +}; |
---|
672 | 794 | |
---|
673 | 795 | struct bq27xxx_dm_reg { |
---|
674 | 796 | u8 subclass_id; |
---|
.. | .. |
---|
725 | 847 | #define bq27545_dm_regs 0 |
---|
726 | 848 | #endif |
---|
727 | 849 | |
---|
| 850 | +static struct bq27xxx_dm_reg bq27411_dm_regs[] = { |
---|
| 851 | + [BQ27XXX_DM_DESIGN_CAPACITY] = { 82, 10, 2, 0, 32767 }, |
---|
| 852 | + [BQ27XXX_DM_DESIGN_ENERGY] = { 82, 12, 2, 0, 32767 }, |
---|
| 853 | + [BQ27XXX_DM_TERMINATE_VOLTAGE] = { 82, 16, 2, 2800, 3700 }, |
---|
| 854 | +}; |
---|
| 855 | + |
---|
728 | 856 | static struct bq27xxx_dm_reg bq27421_dm_regs[] = { |
---|
729 | 857 | [BQ27XXX_DM_DESIGN_CAPACITY] = { 82, 10, 2, 0, 8000 }, |
---|
730 | 858 | [BQ27XXX_DM_DESIGN_ENERGY] = { 82, 12, 2, 0, 32767 }, |
---|
.. | .. |
---|
759 | 887 | #define bq27621_dm_regs 0 |
---|
760 | 888 | #endif |
---|
761 | 889 | |
---|
762 | | -#define BQ27XXX_O_ZERO 0x00000001 |
---|
763 | | -#define BQ27XXX_O_OTDC 0x00000002 /* has OTC/OTD overtemperature flags */ |
---|
764 | | -#define BQ27XXX_O_UTOT 0x00000004 /* has OT overtemperature flag */ |
---|
765 | | -#define BQ27XXX_O_CFGUP 0x00000008 |
---|
766 | | -#define BQ27XXX_O_RAM 0x00000010 |
---|
| 890 | +#define bq27z561_dm_regs 0 |
---|
| 891 | +#define bq28z610_dm_regs 0 |
---|
| 892 | +#define bq34z100_dm_regs 0 |
---|
| 893 | + |
---|
| 894 | +#define BQ27XXX_O_ZERO BIT(0) |
---|
| 895 | +#define BQ27XXX_O_OTDC BIT(1) /* has OTC/OTD overtemperature flags */ |
---|
| 896 | +#define BQ27XXX_O_UTOT BIT(2) /* has OT overtemperature flag */ |
---|
| 897 | +#define BQ27XXX_O_CFGUP BIT(3) |
---|
| 898 | +#define BQ27XXX_O_RAM BIT(4) |
---|
| 899 | +#define BQ27Z561_O_BITS BIT(5) |
---|
| 900 | +#define BQ27XXX_O_SOC_SI BIT(6) /* SoC is single register */ |
---|
| 901 | +#define BQ27XXX_O_HAS_CI BIT(7) /* has Capacity Inaccurate flag */ |
---|
| 902 | +#define BQ27XXX_O_MUL_CHEM BIT(8) /* multiple chemistries supported */ |
---|
767 | 903 | |
---|
768 | 904 | #define BQ27XXX_DATA(ref, key, opt) { \ |
---|
769 | 905 | .opts = (opt), \ |
---|
.. | .. |
---|
781 | 917 | enum power_supply_property *props; |
---|
782 | 918 | size_t props_size; |
---|
783 | 919 | } bq27xxx_chip_data[] = { |
---|
784 | | - [BQ27000] = BQ27XXX_DATA(bq27000, 0 , BQ27XXX_O_ZERO), |
---|
785 | | - [BQ27010] = BQ27XXX_DATA(bq27010, 0 , BQ27XXX_O_ZERO), |
---|
| 920 | + [BQ27000] = BQ27XXX_DATA(bq27000, 0 , BQ27XXX_O_ZERO | BQ27XXX_O_SOC_SI | BQ27XXX_O_HAS_CI), |
---|
| 921 | + [BQ27010] = BQ27XXX_DATA(bq27010, 0 , BQ27XXX_O_ZERO | BQ27XXX_O_SOC_SI | BQ27XXX_O_HAS_CI), |
---|
786 | 922 | [BQ2750X] = BQ27XXX_DATA(bq2750x, 0 , BQ27XXX_O_OTDC), |
---|
787 | 923 | [BQ2751X] = BQ27XXX_DATA(bq2751x, 0 , BQ27XXX_O_OTDC), |
---|
788 | 924 | [BQ2752X] = BQ27XXX_DATA(bq2752x, 0 , BQ27XXX_O_OTDC), |
---|
.. | .. |
---|
802 | 938 | [BQ27546] = BQ27XXX_DATA(bq27546, 0 , BQ27XXX_O_OTDC), |
---|
803 | 939 | [BQ27742] = BQ27XXX_DATA(bq27742, 0 , BQ27XXX_O_OTDC), |
---|
804 | 940 | [BQ27545] = BQ27XXX_DATA(bq27545, 0x04143672, BQ27XXX_O_OTDC), |
---|
| 941 | + [BQ27411] = BQ27XXX_DATA(bq27411, 0x80008000, BQ27XXX_O_UTOT | BQ27XXX_O_CFGUP | BQ27XXX_O_RAM), |
---|
805 | 942 | [BQ27421] = BQ27XXX_DATA(bq27421, 0x80008000, BQ27XXX_O_UTOT | BQ27XXX_O_CFGUP | BQ27XXX_O_RAM), |
---|
806 | 943 | [BQ27425] = BQ27XXX_DATA(bq27425, 0x04143672, BQ27XXX_O_UTOT | BQ27XXX_O_CFGUP), |
---|
807 | 944 | [BQ27426] = BQ27XXX_DATA(bq27426, 0x80008000, BQ27XXX_O_UTOT | BQ27XXX_O_CFGUP | BQ27XXX_O_RAM), |
---|
808 | 945 | [BQ27441] = BQ27XXX_DATA(bq27441, 0x80008000, BQ27XXX_O_UTOT | BQ27XXX_O_CFGUP | BQ27XXX_O_RAM), |
---|
809 | 946 | [BQ27621] = BQ27XXX_DATA(bq27621, 0x80008000, BQ27XXX_O_UTOT | BQ27XXX_O_CFGUP | BQ27XXX_O_RAM), |
---|
| 947 | + [BQ27Z561] = BQ27XXX_DATA(bq27z561, 0 , BQ27Z561_O_BITS), |
---|
| 948 | + [BQ28Z610] = BQ27XXX_DATA(bq28z610, 0 , BQ27Z561_O_BITS), |
---|
| 949 | + [BQ34Z100] = BQ27XXX_DATA(bq34z100, 0 , BQ27XXX_O_OTDC | BQ27XXX_O_SOC_SI | \ |
---|
| 950 | + BQ27XXX_O_HAS_CI | BQ27XXX_O_MUL_CHEM), |
---|
810 | 951 | }; |
---|
811 | 952 | |
---|
812 | 953 | static DEFINE_MUTEX(bq27xxx_list_lock); |
---|
.. | .. |
---|
1326 | 1467 | { |
---|
1327 | 1468 | int soc; |
---|
1328 | 1469 | |
---|
1329 | | - if (di->opts & BQ27XXX_O_ZERO) |
---|
| 1470 | + if (di->opts & BQ27XXX_O_SOC_SI) |
---|
1330 | 1471 | soc = bq27xxx_read(di, BQ27XXX_REG_SOC, true); |
---|
1331 | 1472 | else |
---|
1332 | 1473 | soc = bq27xxx_read(di, BQ27XXX_REG_SOC, false); |
---|
.. | .. |
---|
1521 | 1662 | { |
---|
1522 | 1663 | if (di->opts & BQ27XXX_O_ZERO) |
---|
1523 | 1664 | return flags & (BQ27000_FLAG_EDV1 | BQ27000_FLAG_EDVF); |
---|
| 1665 | + else if (di->opts & BQ27Z561_O_BITS) |
---|
| 1666 | + return flags & BQ27Z561_FLAG_FDC; |
---|
1524 | 1667 | else |
---|
1525 | 1668 | return flags & (BQ27XXX_FLAG_SOC1 | BQ27XXX_FLAG_SOCF); |
---|
1526 | 1669 | } |
---|
1527 | 1670 | |
---|
1528 | | -/* |
---|
1529 | | - * Read flag register. |
---|
1530 | | - * Return < 0 if something fails. |
---|
1531 | | - */ |
---|
1532 | 1671 | static int bq27xxx_battery_read_health(struct bq27xxx_device_info *di) |
---|
1533 | 1672 | { |
---|
1534 | | - int flags; |
---|
1535 | | - bool has_singe_flag = di->opts & BQ27XXX_O_ZERO; |
---|
1536 | | - |
---|
1537 | | - flags = bq27xxx_read(di, BQ27XXX_REG_FLAGS, has_singe_flag); |
---|
1538 | | - if (flags < 0) { |
---|
1539 | | - dev_err(di->dev, "error reading flag register:%d\n", flags); |
---|
1540 | | - return flags; |
---|
1541 | | - } |
---|
1542 | | - |
---|
1543 | 1673 | /* Unlikely but important to return first */ |
---|
1544 | | - if (unlikely(bq27xxx_battery_overtemp(di, flags))) |
---|
| 1674 | + if (unlikely(bq27xxx_battery_overtemp(di, di->cache.flags))) |
---|
1545 | 1675 | return POWER_SUPPLY_HEALTH_OVERHEAT; |
---|
1546 | | - if (unlikely(bq27xxx_battery_undertemp(di, flags))) |
---|
| 1676 | + if (unlikely(bq27xxx_battery_undertemp(di, di->cache.flags))) |
---|
1547 | 1677 | return POWER_SUPPLY_HEALTH_COLD; |
---|
1548 | | - if (unlikely(bq27xxx_battery_dead(di, flags))) |
---|
| 1678 | + if (unlikely(bq27xxx_battery_dead(di, di->cache.flags))) |
---|
1549 | 1679 | return POWER_SUPPLY_HEALTH_DEAD; |
---|
1550 | 1680 | |
---|
1551 | 1681 | return POWER_SUPPLY_HEALTH_GOOD; |
---|
.. | .. |
---|
1554 | 1684 | void bq27xxx_battery_update(struct bq27xxx_device_info *di) |
---|
1555 | 1685 | { |
---|
1556 | 1686 | struct bq27xxx_reg_cache cache = {0, }; |
---|
1557 | | - bool has_ci_flag = di->opts & BQ27XXX_O_ZERO; |
---|
| 1687 | + bool has_ci_flag = di->opts & BQ27XXX_O_HAS_CI; |
---|
1558 | 1688 | bool has_singe_flag = di->opts & BQ27XXX_O_ZERO; |
---|
1559 | 1689 | |
---|
1560 | 1690 | cache.flags = bq27xxx_read(di, BQ27XXX_REG_FLAGS, has_singe_flag); |
---|
.. | .. |
---|
1578 | 1708 | cache.time_to_empty_avg = bq27xxx_battery_read_time(di, BQ27XXX_REG_TTECP); |
---|
1579 | 1709 | if (di->regs[BQ27XXX_REG_TTF] != INVALID_REG_ADDR) |
---|
1580 | 1710 | cache.time_to_full = bq27xxx_battery_read_time(di, BQ27XXX_REG_TTF); |
---|
| 1711 | + |
---|
1581 | 1712 | cache.charge_full = bq27xxx_battery_read_fcc(di); |
---|
1582 | 1713 | cache.capacity = bq27xxx_battery_read_soc(di); |
---|
1583 | 1714 | if (di->regs[BQ27XXX_REG_AE] != INVALID_REG_ADDR) |
---|
1584 | 1715 | cache.energy = bq27xxx_battery_read_energy(di); |
---|
| 1716 | + di->cache.flags = cache.flags; |
---|
1585 | 1717 | cache.health = bq27xxx_battery_read_health(di); |
---|
1586 | 1718 | } |
---|
1587 | 1719 | if (di->regs[BQ27XXX_REG_CYCT] != INVALID_REG_ADDR) |
---|
.. | .. |
---|
1592 | 1724 | di->charge_design_full = bq27xxx_battery_read_dcap(di); |
---|
1593 | 1725 | } |
---|
1594 | 1726 | |
---|
1595 | | - if (di->cache.capacity != cache.capacity) |
---|
| 1727 | + if ((di->cache.capacity != cache.capacity) || |
---|
| 1728 | + (di->cache.flags != cache.flags)) |
---|
1596 | 1729 | power_supply_changed(di->bat); |
---|
1597 | 1730 | |
---|
1598 | 1731 | if (memcmp(&di->cache, &cache, sizeof(cache)) != 0) |
---|
.. | .. |
---|
1685 | 1818 | status = POWER_SUPPLY_STATUS_CHARGING; |
---|
1686 | 1819 | else |
---|
1687 | 1820 | status = POWER_SUPPLY_STATUS_DISCHARGING; |
---|
| 1821 | + } else if (di->opts & BQ27Z561_O_BITS) { |
---|
| 1822 | + if (di->cache.flags & BQ27Z561_FLAG_FC) |
---|
| 1823 | + status = POWER_SUPPLY_STATUS_FULL; |
---|
| 1824 | + else if (di->cache.flags & BQ27Z561_FLAG_DIS_CH) |
---|
| 1825 | + status = POWER_SUPPLY_STATUS_DISCHARGING; |
---|
| 1826 | + else |
---|
| 1827 | + status = POWER_SUPPLY_STATUS_CHARGING; |
---|
1688 | 1828 | } else { |
---|
1689 | 1829 | if (di->cache.flags & BQ27XXX_FLAG_FC) |
---|
1690 | 1830 | status = POWER_SUPPLY_STATUS_FULL; |
---|
.. | .. |
---|
1714 | 1854 | else if (di->cache.flags & BQ27000_FLAG_EDV1) |
---|
1715 | 1855 | level = POWER_SUPPLY_CAPACITY_LEVEL_LOW; |
---|
1716 | 1856 | else if (di->cache.flags & BQ27000_FLAG_EDVF) |
---|
| 1857 | + level = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL; |
---|
| 1858 | + else |
---|
| 1859 | + level = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL; |
---|
| 1860 | + } else if (di->opts & BQ27Z561_O_BITS) { |
---|
| 1861 | + if (di->cache.flags & BQ27Z561_FLAG_FC) |
---|
| 1862 | + level = POWER_SUPPLY_CAPACITY_LEVEL_FULL; |
---|
| 1863 | + else if (di->cache.flags & BQ27Z561_FLAG_FDC) |
---|
1717 | 1864 | level = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL; |
---|
1718 | 1865 | else |
---|
1719 | 1866 | level = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL; |
---|
.. | .. |
---|
1815 | 1962 | ret = bq27xxx_simple_value(di->cache.time_to_full, val); |
---|
1816 | 1963 | break; |
---|
1817 | 1964 | case POWER_SUPPLY_PROP_TECHNOLOGY: |
---|
1818 | | - val->intval = POWER_SUPPLY_TECHNOLOGY_LION; |
---|
| 1965 | + if (di->opts & BQ27XXX_O_MUL_CHEM) |
---|
| 1966 | + val->intval = POWER_SUPPLY_TECHNOLOGY_UNKNOWN; |
---|
| 1967 | + else |
---|
| 1968 | + val->intval = POWER_SUPPLY_TECHNOLOGY_LION; |
---|
1819 | 1969 | break; |
---|
1820 | 1970 | case POWER_SUPPLY_PROP_CHARGE_NOW: |
---|
1821 | 1971 | ret = bq27xxx_simple_value(bq27xxx_battery_read_nac(di), val); |
---|
.. | .. |
---|
1891 | 2041 | psy_desc->external_power_changed = bq27xxx_external_power_changed; |
---|
1892 | 2042 | |
---|
1893 | 2043 | di->bat = power_supply_register_no_ws(di->dev, psy_desc, &psy_cfg); |
---|
1894 | | - if (IS_ERR(di->bat)) { |
---|
1895 | | - if (PTR_ERR(di->bat) == -EPROBE_DEFER) |
---|
1896 | | - dev_dbg(di->dev, "failed to register battery, deferring probe\n"); |
---|
1897 | | - else |
---|
1898 | | - dev_err(di->dev, "failed to register battery\n"); |
---|
1899 | | - return PTR_ERR(di->bat); |
---|
1900 | | - } |
---|
| 2044 | + if (IS_ERR(di->bat)) |
---|
| 2045 | + return dev_err_probe(di->dev, PTR_ERR(di->bat), |
---|
| 2046 | + "failed to register battery\n"); |
---|
1901 | 2047 | |
---|
1902 | 2048 | bq27xxx_battery_settings(di); |
---|
1903 | 2049 | bq27xxx_battery_update(di); |
---|