hc
2023-12-09 b22da3d8526a935aa31e086e63f60ff3246cb61c
kernel/drivers/power/supply/bq27xxx_battery.c
....@@ -1,48 +1,44 @@
1
+// SPDX-License-Identifier: GPL-2.0
12 /*
23 * BQ27xxx battery driver
34 *
45 * Copyright (C) 2008 Rodolfo Giometti <giometti@linux.it>
56 * Copyright (C) 2008 Eurotech S.p.A. <info@eurotech.it>
67 * 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>
89 * Copyright (C) 2017 Liam Breck <kernel@networkimprov.net>
910 *
1011 * Based on a previous work by Copyright (C) 2008 Texas Instruments, Inc.
1112 *
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
- *
2013 * 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
4642 */
4743
4844 #include <linux/device.h>
....@@ -78,6 +74,11 @@
7874 #define BQ27000_FLAG_CI BIT(4) /* Capacity Inaccurate flag */
7975 #define BQ27000_FLAG_FC BIT(5)
8076 #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 */
8182
8283 /* control register params */
8384 #define BQ27XXX_SEALED 0x20
....@@ -431,11 +432,72 @@
431432 [BQ27XXX_REG_DCAP] = 0x3c,
432433 [BQ27XXX_REG_AP] = 0x18,
433434 BQ27XXX_DM_REG_ROWS,
434
- };
435
+ },
436
+#define bq27411_regs bq27421_regs
435437 #define bq27425_regs bq27421_regs
436438 #define bq27426_regs bq27421_regs
437439 #define bq27441_regs bq27421_regs
438440 #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
+ };
439501
440502 static enum power_supply_property bq27000_props[] = {
441503 POWER_SUPPLY_PROP_STATUS,
....@@ -665,10 +727,70 @@
665727 POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,
666728 POWER_SUPPLY_PROP_MANUFACTURER,
667729 };
730
+#define bq27411_props bq27421_props
668731 #define bq27425_props bq27421_props
669732 #define bq27426_props bq27421_props
670733 #define bq27441_props bq27421_props
671734 #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
+};
672794
673795 struct bq27xxx_dm_reg {
674796 u8 subclass_id;
....@@ -725,6 +847,12 @@
725847 #define bq27545_dm_regs 0
726848 #endif
727849
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
+
728856 static struct bq27xxx_dm_reg bq27421_dm_regs[] = {
729857 [BQ27XXX_DM_DESIGN_CAPACITY] = { 82, 10, 2, 0, 8000 },
730858 [BQ27XXX_DM_DESIGN_ENERGY] = { 82, 12, 2, 0, 32767 },
....@@ -759,11 +887,19 @@
759887 #define bq27621_dm_regs 0
760888 #endif
761889
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 */
767903
768904 #define BQ27XXX_DATA(ref, key, opt) { \
769905 .opts = (opt), \
....@@ -781,8 +917,8 @@
781917 enum power_supply_property *props;
782918 size_t props_size;
783919 } 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),
786922 [BQ2750X] = BQ27XXX_DATA(bq2750x, 0 , BQ27XXX_O_OTDC),
787923 [BQ2751X] = BQ27XXX_DATA(bq2751x, 0 , BQ27XXX_O_OTDC),
788924 [BQ2752X] = BQ27XXX_DATA(bq2752x, 0 , BQ27XXX_O_OTDC),
....@@ -802,11 +938,16 @@
802938 [BQ27546] = BQ27XXX_DATA(bq27546, 0 , BQ27XXX_O_OTDC),
803939 [BQ27742] = BQ27XXX_DATA(bq27742, 0 , BQ27XXX_O_OTDC),
804940 [BQ27545] = BQ27XXX_DATA(bq27545, 0x04143672, BQ27XXX_O_OTDC),
941
+ [BQ27411] = BQ27XXX_DATA(bq27411, 0x80008000, BQ27XXX_O_UTOT | BQ27XXX_O_CFGUP | BQ27XXX_O_RAM),
805942 [BQ27421] = BQ27XXX_DATA(bq27421, 0x80008000, BQ27XXX_O_UTOT | BQ27XXX_O_CFGUP | BQ27XXX_O_RAM),
806943 [BQ27425] = BQ27XXX_DATA(bq27425, 0x04143672, BQ27XXX_O_UTOT | BQ27XXX_O_CFGUP),
807944 [BQ27426] = BQ27XXX_DATA(bq27426, 0x80008000, BQ27XXX_O_UTOT | BQ27XXX_O_CFGUP | BQ27XXX_O_RAM),
808945 [BQ27441] = BQ27XXX_DATA(bq27441, 0x80008000, BQ27XXX_O_UTOT | BQ27XXX_O_CFGUP | BQ27XXX_O_RAM),
809946 [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),
810951 };
811952
812953 static DEFINE_MUTEX(bq27xxx_list_lock);
....@@ -1326,7 +1467,7 @@
13261467 {
13271468 int soc;
13281469
1329
- if (di->opts & BQ27XXX_O_ZERO)
1470
+ if (di->opts & BQ27XXX_O_SOC_SI)
13301471 soc = bq27xxx_read(di, BQ27XXX_REG_SOC, true);
13311472 else
13321473 soc = bq27xxx_read(di, BQ27XXX_REG_SOC, false);
....@@ -1521,31 +1662,20 @@
15211662 {
15221663 if (di->opts & BQ27XXX_O_ZERO)
15231664 return flags & (BQ27000_FLAG_EDV1 | BQ27000_FLAG_EDVF);
1665
+ else if (di->opts & BQ27Z561_O_BITS)
1666
+ return flags & BQ27Z561_FLAG_FDC;
15241667 else
15251668 return flags & (BQ27XXX_FLAG_SOC1 | BQ27XXX_FLAG_SOCF);
15261669 }
15271670
1528
-/*
1529
- * Read flag register.
1530
- * Return < 0 if something fails.
1531
- */
15321671 static int bq27xxx_battery_read_health(struct bq27xxx_device_info *di)
15331672 {
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
-
15431673 /* Unlikely but important to return first */
1544
- if (unlikely(bq27xxx_battery_overtemp(di, flags)))
1674
+ if (unlikely(bq27xxx_battery_overtemp(di, di->cache.flags)))
15451675 return POWER_SUPPLY_HEALTH_OVERHEAT;
1546
- if (unlikely(bq27xxx_battery_undertemp(di, flags)))
1676
+ if (unlikely(bq27xxx_battery_undertemp(di, di->cache.flags)))
15471677 return POWER_SUPPLY_HEALTH_COLD;
1548
- if (unlikely(bq27xxx_battery_dead(di, flags)))
1678
+ if (unlikely(bq27xxx_battery_dead(di, di->cache.flags)))
15491679 return POWER_SUPPLY_HEALTH_DEAD;
15501680
15511681 return POWER_SUPPLY_HEALTH_GOOD;
....@@ -1554,7 +1684,7 @@
15541684 void bq27xxx_battery_update(struct bq27xxx_device_info *di)
15551685 {
15561686 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;
15581688 bool has_singe_flag = di->opts & BQ27XXX_O_ZERO;
15591689
15601690 cache.flags = bq27xxx_read(di, BQ27XXX_REG_FLAGS, has_singe_flag);
....@@ -1578,10 +1708,12 @@
15781708 cache.time_to_empty_avg = bq27xxx_battery_read_time(di, BQ27XXX_REG_TTECP);
15791709 if (di->regs[BQ27XXX_REG_TTF] != INVALID_REG_ADDR)
15801710 cache.time_to_full = bq27xxx_battery_read_time(di, BQ27XXX_REG_TTF);
1711
+
15811712 cache.charge_full = bq27xxx_battery_read_fcc(di);
15821713 cache.capacity = bq27xxx_battery_read_soc(di);
15831714 if (di->regs[BQ27XXX_REG_AE] != INVALID_REG_ADDR)
15841715 cache.energy = bq27xxx_battery_read_energy(di);
1716
+ di->cache.flags = cache.flags;
15851717 cache.health = bq27xxx_battery_read_health(di);
15861718 }
15871719 if (di->regs[BQ27XXX_REG_CYCT] != INVALID_REG_ADDR)
....@@ -1592,7 +1724,8 @@
15921724 di->charge_design_full = bq27xxx_battery_read_dcap(di);
15931725 }
15941726
1595
- if (di->cache.capacity != cache.capacity)
1727
+ if ((di->cache.capacity != cache.capacity) ||
1728
+ (di->cache.flags != cache.flags))
15961729 power_supply_changed(di->bat);
15971730
15981731 if (memcmp(&di->cache, &cache, sizeof(cache)) != 0)
....@@ -1685,6 +1818,13 @@
16851818 status = POWER_SUPPLY_STATUS_CHARGING;
16861819 else
16871820 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;
16881828 } else {
16891829 if (di->cache.flags & BQ27XXX_FLAG_FC)
16901830 status = POWER_SUPPLY_STATUS_FULL;
....@@ -1714,6 +1854,13 @@
17141854 else if (di->cache.flags & BQ27000_FLAG_EDV1)
17151855 level = POWER_SUPPLY_CAPACITY_LEVEL_LOW;
17161856 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)
17171864 level = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
17181865 else
17191866 level = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
....@@ -1815,7 +1962,10 @@
18151962 ret = bq27xxx_simple_value(di->cache.time_to_full, val);
18161963 break;
18171964 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;
18191969 break;
18201970 case POWER_SUPPLY_PROP_CHARGE_NOW:
18211971 ret = bq27xxx_simple_value(bq27xxx_battery_read_nac(di), val);
....@@ -1891,13 +2041,9 @@
18912041 psy_desc->external_power_changed = bq27xxx_external_power_changed;
18922042
18932043 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");
19012047
19022048 bq27xxx_battery_settings(di);
19032049 bq27xxx_battery_update(di);