Add support for bq27521 battery monitor
Subsystems (5)
PATCH 1/1 Add support for bq27521 battery monitor
This adds basic support for BQ27521 battery monitor, used in Nokia N9 and N950. In particular, battery voltage is important to be able to tell when the battery is almost empty. Emptying battery on N950 is pretty painful, as flasher needs to be used to recover phone in such case.
Documentation/devicetree/bindings/power/supply/bq27xxx.txt +1 -0
@@ -15,6 +15,7 @@ Required properties: * "ti,bq27520g2" - BQ27520-g2 * "ti,bq27520g3" - BQ27520-g3 * "ti,bq27520g4" - BQ27520-g4 + * "ti,bq27521" - BQ27521 * "ti,bq27530" - BQ27530 * "ti,bq27531" - BQ27531 * "ti,bq27541" - BQ27541
drivers/power/supply/bq27xxx_battery.c +35 -0
@@ -381,6 +381,30 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = { [BQ27XXX_REG_AP ] =INVALID_REG_ADDR ,BQ27XXX_DM_REG_ROWS , }, + [BQ27521] = { /* FIXME */ + [BQ27XXX_REG_CTRL ] =0x02 , + [BQ27XXX_REG_TEMP ] =0x0a , + [BQ27XXX_REG_INT_TEMP ] =INVALID_REG_ADDR , + [BQ27XXX_REG_VOLT ] =0x0c , + [BQ27XXX_REG_AI ] =0x0e , + [BQ27XXX_REG_FLAGS ] =0x08 , + [BQ27XXX_REG_TTE ] =INVALID_REG_ADDR , + [BQ27XXX_REG_TTF ] =INVALID_REG_ADDR , + [BQ27XXX_REG_TTES ] =INVALID_REG_ADDR , + [BQ27XXX_REG_TTECP ] =INVALID_REG_ADDR , + [BQ27XXX_REG_NAC ] =INVALID_REG_ADDR , + [BQ27XXX_REG_FCC ] =INVALID_REG_ADDR , + [BQ27XXX_REG_CYCT ] =INVALID_REG_ADDR , + [BQ27XXX_REG_AE ] =INVALID_REG_ADDR , + [BQ27XXX_REG_SOC ] =INVALID_REG_ADDR , + [BQ27XXX_REG_DCAP ] =INVALID_REG_ADDR , + [BQ27XXX_REG_AP ] =INVALID_REG_ADDR , + [BQ27XXX_DM_CTRL ] =INVALID_REG_ADDR , + [BQ27XXX_DM_CLASS ] =INVALID_REG_ADDR , + [BQ27XXX_DM_BLOCK ] =INVALID_REG_ADDR , + [BQ27XXX_DM_DATA ] =INVALID_REG_ADDR , + [BQ27XXX_DM_CKSUM ] =INVALID_REG_ADDR , + }, [BQ27530 ] = { [BQ27XXX_REG_CTRL ] =0x00 , [BQ27XXX_REG_TEMP ] =0x06 ,
@@ -700,6 +724,15 @@ static enum power_supply_property bq27520g4_battery_props[] = { POWER_SUPPLY_PROP_MANUFACTURER, }; +static enum power_supply_property bq27521_battery_props[] = { +POWER_SUPPLY_PROP_STATUS , +POWER_SUPPLY_PROP_PRESENT , +POWER_SUPPLY_PROP_VOLTAGE_NOW , +POWER_SUPPLY_PROP_CURRENT_NOW , +POWER_SUPPLY_PROP_TEMP , +POWER_SUPPLY_PROP_TECHNOLOGY , +}; +static enum power_supply_property bq27530_battery_props[] = {POWER_SUPPLY_PROP_STATUS ,POWER_SUPPLY_PROP_PRESENT ,
@@ -792,6 +825,7 @@ static struct {BQ27XXX_PROP (BQ27520G2 , bq27520g2_battery_props),BQ27XXX_PROP (BQ27520G3 , bq27520g3_battery_props),BQ27XXX_PROP (BQ27520G4 , bq27520g4_battery_props), +BQ27XXX_PROP (BQ27521 , bq27521_battery_props),BQ27XXX_PROP (BQ27530 , bq27530_battery_props),BQ27XXX_PROP (BQ27541 , bq27541_battery_props), BQ27XXX_PROP(BQ27545, bq27545_battery_props),
@@ -1529,6 +1563,7 @@ static bool bq27xxx_battery_overtemp(struct bq27xxx_device_info *di, u16 flags)case BQ27520G2 :case BQ27520G3 :case BQ27520G4 : +case BQ27521 :case BQ27541 :case BQ27545 :return flags & (BQ27XXX_FLAG_OTC |BQ27XXX_FLAG_OTD );
drivers/power/supply/bq27xxx_battery_i2c.c +2 -0
@@ -239,6 +239,7 @@ static const struct i2c_device_id bq27xxx_i2c_id_table[] = { { "bq27520g2", BQ27520G2 }, { "bq27520g3", BQ27520G3 }, { "bq27520g4", BQ27520G4 }, + { "bq27521", BQ27521 }, { "bq27530", BQ27530 }, { "bq27531", BQ27530 }, { "bq27541", BQ27541 },
@@ -269,6 +270,7 @@ static const struct of_device_id bq27xxx_battery_i2c_of_match_table[] = { { .compatible = "ti,bq27520g2" }, { .compatible = "ti,bq27520g3" }, { .compatible = "ti,bq27520g4" }, + { .compatible = "ti,bq27521" }, { .compatible = "ti,bq27530" }, { .compatible = "ti,bq27531" }, { .compatible = "ti,bq27541" },
include/linux/power/bq27xxx_battery.h +1 -0
@@ -14,6 +14,7 @@ enum bq27xxx_chip {BQ27520G2 ,/* bq27520G2 */ BQ27520G3 ,/* bq27520G3 */ BQ27520G4 ,/* bq27520G4 */ +BQ27521 ,/* bq27521 */ BQ27530 ,/* bq27530, bq27531 */ BQ27541 ,/* bq27541, bq27542, bq27546, bq27742 */ BQ27545, /* bq27545 */
Signature · 9 lines
(english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 181 bytes Desc: Digital signature URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20171109/a84ce48e/attachment-0001.sig>
Quoted 25 lines · On Thursday 09 November 2017 22:06:15 Pavel Machek wrote:
drivers/power/supply/bq27xxx_battery.c +17
-0@@ -381,6 +381,30 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = { [BQ27XXX_REG_AP ] =INVALID_REG_ADDR ,BQ27XXX_DM_REG_ROWS , }, + [BQ27521] = { /* FIXME */ + [BQ27XXX_REG_CTRL ] =0x02 , + [BQ27XXX_REG_TEMP ] =0x0a , + [BQ27XXX_REG_INT_TEMP ] =INVALID_REG_ADDR , + [BQ27XXX_REG_VOLT ] =0x0c , + [BQ27XXX_REG_AI ] =0x0e , + [BQ27XXX_REG_FLAGS ] =0x08 , + [BQ27XXX_REG_TTE ] =INVALID_REG_ADDR , + [BQ27XXX_REG_TTF ] =INVALID_REG_ADDR , + [BQ27XXX_REG_TTES ] =INVALID_REG_ADDR , + [BQ27XXX_REG_TTECP ] =INVALID_REG_ADDR , + [BQ27XXX_REG_NAC ] =INVALID_REG_ADDR , + [BQ27XXX_REG_FCC ] =INVALID_REG_ADDR , + [BQ27XXX_REG_CYCT ] =INVALID_REG_ADDR , + [BQ27XXX_REG_AE ] =INVALID_REG_ADDR , + [BQ27XXX_REG_SOC ] =INVALID_REG_ADDR , + [BQ27XXX_REG_DCAP ] =INVALID_REG_ADDR ,
drivers/power/supply/bq27xxx_battery.c static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = { · line 410
Quoted 10 lines
drivers/power/supply/bq27xxx_battery.c +7
-0+ [BQ27XXX_REG_AP] = INVALID_REG_ADDR, + [BQ27XXX_DM_CTRL] = INVALID_REG_ADDR, + [BQ27XXX_DM_CLASS] = INVALID_REG_ADDR, + [BQ27XXX_DM_BLOCK] = INVALID_REG_ADDR, + [BQ27XXX_DM_DATA] = INVALID_REG_ADDR, + [BQ27XXX_DM_CKSUM ] =INVALID_REG_ADDR , + }, [BQ27530] = { [BQ27XXX_REG_CTRL ] =0x00 , [BQ27XXX_REG_TEMP ] =0x06 ,
Hi! IIRC those registers are valid only for sn27521 chip in revision 14 (or new). For older revision is used different register map. And detection of chip revision is somehow possible via some registers.
Signature · 2 lines
Pali Roh?r pali.rohar at gmail.com
Quoted 32 lines · Pali Roh?r
Quoted 31 lines · On Thursday 09 November 2017 22:06:15 Pavel Machek wrote:
drivers/power/supply/bq27xxx_battery.c +23
-0@@ -381,6 +381,30 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = { [BQ27XXX_REG_AP ] =INVALID_REG_ADDR ,BQ27XXX_DM_REG_ROWS , }, + [BQ27521] = { /* FIXME */ + [BQ27XXX_REG_CTRL ] =0x02 , + [BQ27XXX_REG_TEMP ] =0x0a , + [BQ27XXX_REG_INT_TEMP ] =INVALID_REG_ADDR , + [BQ27XXX_REG_VOLT ] =0x0c , + [BQ27XXX_REG_AI ] =0x0e , + [BQ27XXX_REG_FLAGS ] =0x08 , + [BQ27XXX_REG_TTE ] =INVALID_REG_ADDR , + [BQ27XXX_REG_TTF ] =INVALID_REG_ADDR , + [BQ27XXX_REG_TTES ] =INVALID_REG_ADDR , + [BQ27XXX_REG_TTECP ] =INVALID_REG_ADDR , + [BQ27XXX_REG_NAC ] =INVALID_REG_ADDR , + [BQ27XXX_REG_FCC ] =INVALID_REG_ADDR , + [BQ27XXX_REG_CYCT ] =INVALID_REG_ADDR , + [BQ27XXX_REG_AE ] =INVALID_REG_ADDR , + [BQ27XXX_REG_SOC ] =INVALID_REG_ADDR , + [BQ27XXX_REG_DCAP ] =INVALID_REG_ADDR , + [BQ27XXX_REG_AP ] =INVALID_REG_ADDR , + [BQ27XXX_DM_CTRL ] =INVALID_REG_ADDR , + [BQ27XXX_DM_CLASS ] =INVALID_REG_ADDR , + [BQ27XXX_DM_BLOCK ] =INVALID_REG_ADDR , + [BQ27XXX_DM_DATA ] =INVALID_REG_ADDR , + [BQ27XXX_DM_CKSUM ] =INVALID_REG_ADDR ,
Quoted 8 lines
drivers/power/supply/bq27xxx_battery.c static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = { · line 410
Quoted 4 lines
drivers/power/supply/bq27xxx_battery.c +1
-0+ }, [BQ27530] = { [BQ27XXX_REG_CTRL] = 0x00, [BQ27XXX_REG_TEMP] = 0x06,Hi! IIRC those registers are valid only for sn27521 chip in revision 14 (or new). For older revision is used different register map. And detection of chip revision is somehow possible via some registers.
Yes, I know.. I even had this, but as I can't test it, and early N950 samples should be very very rare, I'd prefer the patch as is.
@@ -1905,6 +1940,23 @@ int bq27xxx_battery_setup(struct bq27xxx_device_info *di)
dev_info(di->dev, "support ver. %s enabled\n", DRIVER_VERSION);
+ if (di->chip == BQ27521) {
+ int val;
+ val = di->bus.read(di, 0x32, false);
+ if (val == 0x2100) {
+ printk("rev. 13 chip detected; add support\n");
+ /* https://elinux.org/N950 has details */
+ return PTR_ERR(ENODEV);
+ }
+
+ val = di->bus.read(di, 0x34, false);
+ if ((val & 0xff00) != 0x2100) {
+ printk("rev. 14 chip not detected?!\n");
+ return PTR_ERR(EINVAL);
+ }
+ printk("verified chip rev. 14\n");
+ }
+
bq27xxx_battery_settings(di);
bq27xxx_battery_update(di);
Signature · 9 lines
(english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 181 bytes Desc: Digital signature URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20171109/c8612126/attachment.sig>
Quoted 58 lines · On Thursday 09 November 2017 22:45:40 Pavel Machek wrote:
Quoted 32 lines · Pali Roh?r
Quoted 31 lines · On Thursday 09 November 2017 22:06:15 Pavel Machek wrote:
drivers/power/supply/bq27xxx_battery.c +23
-0@@ -381,6 +381,30 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = { [BQ27XXX_REG_AP ] =INVALID_REG_ADDR ,BQ27XXX_DM_REG_ROWS , }, + [BQ27521] = { /* FIXME */ + [BQ27XXX_REG_CTRL ] =0x02 , + [BQ27XXX_REG_TEMP ] =0x0a , + [BQ27XXX_REG_INT_TEMP ] =INVALID_REG_ADDR , + [BQ27XXX_REG_VOLT ] =0x0c , + [BQ27XXX_REG_AI ] =0x0e , + [BQ27XXX_REG_FLAGS ] =0x08 , + [BQ27XXX_REG_TTE ] =INVALID_REG_ADDR , + [BQ27XXX_REG_TTF ] =INVALID_REG_ADDR , + [BQ27XXX_REG_TTES ] =INVALID_REG_ADDR , + [BQ27XXX_REG_TTECP ] =INVALID_REG_ADDR , + [BQ27XXX_REG_NAC ] =INVALID_REG_ADDR , + [BQ27XXX_REG_FCC ] =INVALID_REG_ADDR , + [BQ27XXX_REG_CYCT ] =INVALID_REG_ADDR , + [BQ27XXX_REG_AE ] =INVALID_REG_ADDR , + [BQ27XXX_REG_SOC ] =INVALID_REG_ADDR , + [BQ27XXX_REG_DCAP ] =INVALID_REG_ADDR , + [BQ27XXX_REG_AP ] =INVALID_REG_ADDR , + [BQ27XXX_DM_CTRL ] =INVALID_REG_ADDR , + [BQ27XXX_DM_CLASS ] =INVALID_REG_ADDR , + [BQ27XXX_DM_BLOCK ] =INVALID_REG_ADDR , + [BQ27XXX_DM_DATA ] =INVALID_REG_ADDR , + [BQ27XXX_DM_CKSUM ] =INVALID_REG_ADDR ,Quoted 8 lines
drivers/power/supply/bq27xxx_battery.c static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = { · line 410
Quoted 4 lines
drivers/power/supply/bq27xxx_battery.c +1
-0+ }, [BQ27530] = { [BQ27XXX_REG_CTRL] = 0x00, [BQ27XXX_REG_TEMP] = 0x06,Hi! IIRC those registers are valid only for sn27521 chip in revision 14 (or new). For older revision is used different register map. And detection of chip revision is somehow possible via some registers.
Yes, I know.. I even had this, but as I can't test it, and early N950 samples should be very very rare, I'd prefer the patch as is.
(quoted diff) +9
-0@@ -1905,6 +1940,23 @@ int bq27xxx_battery_setup(struct bq27xxx_device_info *di) dev_info(di->dev, "support ver. %s enabled\n", DRIVER_VERSION); + if (di->chip == BQ27521) { + int val; + val = di->bus.read(di, 0x32, false); + if (val == 0x2100) { + printk("rev. 13 chip detected; add support\n"); + /* https://elinux.org/N950 has details */ + return PTR_ERR(ENODEV); + } +
Review int bq27xxx_battery_setup(struct bq27xxx_device_info *di) · line 1961
Quoted 10 lines
(quoted diff) +8
-0+ val = di->bus.read(di, 0x34, false); + if ((val & 0xff00) != 0x2100) { + printk("rev. 14 chip not detected?!\n"); + return PTR_ERR(EINVAL); + } + printk("verified chip rev. 14\n"); + } + bq27xxx_battery_settings(di); bq27xxx_battery_update(di);
This change could be useful, specially if somebody got device with sn27521 chip which is not in revision 14 (no idea if in world are those chips used) -- at least would get message that current driver does not support it.
Signature · 2 lines
Pali Roh?r pali.rohar at gmail.com
PATCH 1/1 Add support for bq27521 battery monitor
In reply to Pavel MachekThis adds basic support for BQ27521 battery monitor, used in Nokia N9 and N950. In particular, battery voltage is important to be able to tell when the battery is almost empty. Emptying battery on N950 is pretty painful, as flasher needs to be used to recover phone in such case.
drivers/power/supply/bq27xxx_battery.c +37 -2
@@ -323,6 +323,30 @@ static u8 [BQ27XXX_REG_AP ] =INVALID_REG_ADDR ,BQ27XXX_DM_REG_ROWS , }, + bq27521_regs[BQ27XXX_REG_MAX ] = { + [BQ27XXX_REG_CTRL ] =0x02 , + [BQ27XXX_REG_TEMP ] =0x0a , + [BQ27XXX_REG_INT_TEMP ] =INVALID_REG_ADDR , + [BQ27XXX_REG_VOLT ] =0x0c , + [BQ27XXX_REG_AI ] =0x0e , + [BQ27XXX_REG_FLAGS ] =0x08 , + [BQ27XXX_REG_TTE ] =INVALID_REG_ADDR , + [BQ27XXX_REG_TTF ] =INVALID_REG_ADDR , + [BQ27XXX_REG_TTES ] =INVALID_REG_ADDR , + [BQ27XXX_REG_TTECP ] =INVALID_REG_ADDR , + [BQ27XXX_REG_NAC ] =INVALID_REG_ADDR , + [BQ27XXX_REG_FCC ] =INVALID_REG_ADDR , + [BQ27XXX_REG_CYCT ] =INVALID_REG_ADDR , + [BQ27XXX_REG_AE ] =INVALID_REG_ADDR , + [BQ27XXX_REG_SOC ] =INVALID_REG_ADDR , + [BQ27XXX_REG_DCAP ] =INVALID_REG_ADDR , + [BQ27XXX_REG_AP ] =INVALID_REG_ADDR , + [BQ27XXX_DM_CTRL ] =INVALID_REG_ADDR , + [BQ27XXX_DM_CLASS ] =INVALID_REG_ADDR , + [BQ27XXX_DM_BLOCK ] =INVALID_REG_ADDR , + [BQ27XXX_DM_DATA ] =INVALID_REG_ADDR , + [BQ27XXX_DM_CKSUM ] =INVALID_REG_ADDR , + }, bq27530_regs[BQ27XXX_REG_MAX ] = { [BQ27XXX_REG_CTRL ] =0x00 , [BQ27XXX_REG_TEMP ] =0x06 ,
@@ -557,6 +581,15 @@ static enum power_supply_property bq27520g4_props[] = { POWER_SUPPLY_PROP_MANUFACTURER, }; +static enum power_supply_property bq27521_props[] = { +POWER_SUPPLY_PROP_STATUS , +POWER_SUPPLY_PROP_PRESENT , +POWER_SUPPLY_PROP_VOLTAGE_NOW , +POWER_SUPPLY_PROP_CURRENT_NOW , +POWER_SUPPLY_PROP_TEMP , +POWER_SUPPLY_PROP_TECHNOLOGY , +}; +static enum power_supply_property bq27530_props[] = {POWER_SUPPLY_PROP_STATUS ,POWER_SUPPLY_PROP_PRESENT ,
@@ -671,6 +704,7 @@ static struct bq27xxx_dm_reg bq27500_dm_regs[] = {#define bq27520g2_dm_regs 0#define bq27520g3_dm_regs 0#define bq27520g4_dm_regs 0 +#define bq27521_dm_regs 0#define bq27530_dm_regs 0#define bq27531_dm_regs 0#define bq27541_dm_regs 0
@@ -717,8 +751,8 @@ static struct bq27xxx_dm_reg bq27621_dm_regs[] = {#endif #define BQ27XXX_O_ZERO 0x00000001 -#define BQ27XXX_O_OTDC 0x00000002 -#define BQ27XXX_O_UTOT 0x00000004 +#define BQ27XXX_O_OTDC 0x00000002/* has OTC/OTD overtemperature flags */ +#define BQ27XXX_O_UTOT 0x00000004/* has OT overtemperature flag */ #define BQ27XXX_O_CFGUP 0x00000008#define BQ27XXX_O_RAM 0x00000010
@@ -751,6 +785,7 @@ static struct { [BQ27520G2] = BQ27XXX_DATA(bq27520g2, 0 , BQ27XXX_O_OTDC), [BQ27520G3] = BQ27XXX_DATA(bq27520g3, 0 , BQ27XXX_O_OTDC), [BQ27520G4] = BQ27XXX_DATA(bq27520g4, 0 , BQ27XXX_O_OTDC), + [BQ27521] = BQ27XXX_DATA(bq27521, 0 , 0), [BQ27530] = BQ27XXX_DATA(bq27530, 0 , BQ27XXX_O_UTOT), [BQ27531] = BQ27XXX_DATA(bq27531, 0 , BQ27XXX_O_UTOT), [BQ27541] = BQ27XXX_DATA(bq27541, 0 , BQ27XXX_O_OTDC),
drivers/power/supply/bq27xxx_battery_i2c.c +2 -0
@@ -239,6 +239,7 @@ static const struct i2c_device_id bq27xxx_i2c_id_table[] = { { "bq27520g2", BQ27520G2 }, { "bq27520g3", BQ27520G3 }, { "bq27520g4", BQ27520G4 }, + { "bq27521", BQ27521 }, { "bq27530", BQ27530 }, { "bq27531", BQ27531 }, { "bq27541", BQ27541 },
@@ -269,6 +270,7 @@ static const struct of_device_id bq27xxx_battery_i2c_of_match_table[] = { { .compatible = "ti,bq27520g2" }, { .compatible = "ti,bq27520g3" }, { .compatible = "ti,bq27520g4" }, + { .compatible = "ti,bq27521" }, { .compatible = "ti,bq27530" }, { .compatible = "ti,bq27531" }, { .compatible = "ti,bq27541" },
include/linux/mfd/twl.h +1 -0
@@ -70,6 +70,7 @@ enum twl4030_module_ids {TWL4030_MODULE_INT ,TWL5031_MODULE_ACCESSORY , +TWL5031_MODULE_BCC ,TWL5031_MODULE_INTERRUPTS , TWL4030_MODULE_LAST,
include/linux/power/bq27xxx_battery.h +1 -0
@@ -15,6 +15,7 @@ enum bq27xxx_chip {BQ27520G2 ,/* bq27520G2 */ BQ27520G3 ,/* bq27520G3 */ BQ27520G4 ,/* bq27520G4 */ +BQ27521 ,/* bq27521 */ BQ27530 ,/* bq27530, bq27531 */ BQ27531 , BQ27541, /* bq27541, bq27542, bq27546, bq27742 */
Signature · 9 lines
(english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 181 bytes Desc: Digital signature URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20171110/17a1b5fa/attachment.sig>
Hi!
Quoted 5 lines
This adds basic support for BQ27521 battery monitor, used in Nokia N9 and N950. In particular, battery voltage is important to be able to tell when the battery is almost empty. Emptying battery on N950 is pretty painful, as flasher needs to be used to recover phone in such case.
Sebastian, ping? This one should not be too controversial.
If you could also apply the "shut down when battery is low", that would be nice.
Thanks,
Pavel
Quoted 125 lines
Signed-off-by Pavel Machek <[email protected]>drivers/power/supply/bq27xxx_battery.c +37
-2@@ -323,6 +323,30 @@ static u8 [BQ27XXX_REG_AP ] =INVALID_REG_ADDR ,BQ27XXX_DM_REG_ROWS , }, + bq27521_regs[BQ27XXX_REG_MAX ] = { + [BQ27XXX_REG_CTRL ] =0x02 , + [BQ27XXX_REG_TEMP ] =0x0a , + [BQ27XXX_REG_INT_TEMP ] =INVALID_REG_ADDR , + [BQ27XXX_REG_VOLT ] =0x0c , + [BQ27XXX_REG_AI ] =0x0e , + [BQ27XXX_REG_FLAGS ] =0x08 , + [BQ27XXX_REG_TTE ] =INVALID_REG_ADDR , + [BQ27XXX_REG_TTF ] =INVALID_REG_ADDR , + [BQ27XXX_REG_TTES ] =INVALID_REG_ADDR , + [BQ27XXX_REG_TTECP ] =INVALID_REG_ADDR , + [BQ27XXX_REG_NAC ] =INVALID_REG_ADDR , + [BQ27XXX_REG_FCC ] =INVALID_REG_ADDR , + [BQ27XXX_REG_CYCT ] =INVALID_REG_ADDR , + [BQ27XXX_REG_AE ] =INVALID_REG_ADDR , + [BQ27XXX_REG_SOC ] =INVALID_REG_ADDR , + [BQ27XXX_REG_DCAP ] =INVALID_REG_ADDR , + [BQ27XXX_REG_AP ] =INVALID_REG_ADDR , + [BQ27XXX_DM_CTRL ] =INVALID_REG_ADDR , + [BQ27XXX_DM_CLASS ] =INVALID_REG_ADDR , + [BQ27XXX_DM_BLOCK ] =INVALID_REG_ADDR , + [BQ27XXX_DM_DATA ] =INVALID_REG_ADDR , + [BQ27XXX_DM_CKSUM ] =INVALID_REG_ADDR , + }, bq27530_regs[BQ27XXX_REG_MAX ] = { [BQ27XXX_REG_CTRL ] =0x00 , [BQ27XXX_REG_TEMP ] =0x06 ,@@ -557,6 +581,15 @@ static enum power_supply_property bq27520g4_props[] = { POWER_SUPPLY_PROP_MANUFACTURER, }; +static enum power_supply_property bq27521_props[] = { +POWER_SUPPLY_PROP_STATUS , +POWER_SUPPLY_PROP_PRESENT , +POWER_SUPPLY_PROP_VOLTAGE_NOW , +POWER_SUPPLY_PROP_CURRENT_NOW , +POWER_SUPPLY_PROP_TEMP , +POWER_SUPPLY_PROP_TECHNOLOGY , +}; +static enum power_supply_property bq27530_props[] = {POWER_SUPPLY_PROP_STATUS ,POWER_SUPPLY_PROP_PRESENT ,@@ -671,6 +704,7 @@ static struct bq27xxx_dm_reg bq27500_dm_regs[] = {#define bq27520g2_dm_regs 0#define bq27520g3_dm_regs 0#define bq27520g4_dm_regs 0 +#define bq27521_dm_regs 0#define bq27530_dm_regs 0#define bq27531_dm_regs 0#define bq27541_dm_regs 0@@ -717,8 +751,8 @@ static struct bq27xxx_dm_reg bq27621_dm_regs[] = {#endif #define BQ27XXX_O_ZERO 0x00000001 -#define BQ27XXX_O_OTDC 0x00000002 -#define BQ27XXX_O_UTOT 0x00000004 +#define BQ27XXX_O_OTDC 0x00000002/* has OTC/OTD overtemperature flags */ +#define BQ27XXX_O_UTOT 0x00000004/* has OT overtemperature flag */ #define BQ27XXX_O_CFGUP 0x00000008#define BQ27XXX_O_RAM 0x00000010@@ -751,6 +785,7 @@ static struct { [BQ27520G2] = BQ27XXX_DATA(bq27520g2, 0 , BQ27XXX_O_OTDC), [BQ27520G3] = BQ27XXX_DATA(bq27520g3, 0 , BQ27XXX_O_OTDC), [BQ27520G4] = BQ27XXX_DATA(bq27520g4, 0 , BQ27XXX_O_OTDC), + [BQ27521] = BQ27XXX_DATA(bq27521, 0 , 0), [BQ27530] = BQ27XXX_DATA(bq27530, 0 , BQ27XXX_O_UTOT), [BQ27531] = BQ27XXX_DATA(bq27531, 0 , BQ27XXX_O_UTOT), [BQ27541] = BQ27XXX_DATA(bq27541, 0 , BQ27XXX_O_OTDC),drivers/power/supply/bq27xxx_battery_i2c.c +2
-0@@ -239,6 +239,7 @@ static const struct i2c_device_id bq27xxx_i2c_id_table[] = { { "bq27520g2", BQ27520G2 }, { "bq27520g3", BQ27520G3 }, { "bq27520g4", BQ27520G4 }, + { "bq27521", BQ27521 }, { "bq27530", BQ27530 }, { "bq27531", BQ27531 }, { "bq27541", BQ27541 },@@ -269,6 +270,7 @@ static const struct of_device_id bq27xxx_battery_i2c_of_match_table[] = { { .compatible = "ti,bq27520g2" }, { .compatible = "ti,bq27520g3" }, { .compatible = "ti,bq27520g4" }, + { .compatible = "ti,bq27521" }, { .compatible = "ti,bq27530" }, { .compatible = "ti,bq27531" }, { .compatible = "ti,bq27541" },include/linux/mfd/twl.h +1
-0@@ -70,6 +70,7 @@ enum twl4030_module_ids {TWL4030_MODULE_INT ,TWL5031_MODULE_ACCESSORY , +TWL5031_MODULE_BCC ,TWL5031_MODULE_INTERRUPTS , TWL4030_MODULE_LAST,include/linux/power/bq27xxx_battery.h +1
-0@@ -15,6 +15,7 @@ enum bq27xxx_chip {BQ27520G2 ,/* bq27520G2 */ BQ27520G3 ,/* bq27520G3 */ BQ27520G4 ,/* bq27520G4 */ +BQ27521 ,/* bq27521 */ BQ27530 ,/* bq27530, bq27531 */ BQ27531 , BQ27541, /* bq27541, bq27542, bq27546, bq27742 */
Signature · 9 lines
(english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 181 bytes Desc: Digital signature URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20171202/fec600f6/attachment.sig>
Andrew F. Davis
Acked-byQuoted 80 lines · Pavel Machek
Hi!
Quoted 5 lines
This adds basic support for BQ27521 battery monitor, used in Nokia N9 and N950. In particular, battery voltage is important to be able to tell when the battery is almost empty. Emptying battery on N950 is pretty painful, as flasher needs to be used to recover phone in such case.
Sebastian, ping? This one should not be too controversial.
If you could also apply the "shut down when battery is low", that would be nice.
Thanks,
PavelQuoted 64 lines
Signed-off-by Pavel Machek <[email protected]>drivers/power/supply/bq27xxx_battery.c +34
-0@@ -323,6 +323,30 @@ static u8 [BQ27XXX_REG_AP ] =INVALID_REG_ADDR ,BQ27XXX_DM_REG_ROWS , }, + bq27521_regs[BQ27XXX_REG_MAX ] = { + [BQ27XXX_REG_CTRL ] =0x02 , + [BQ27XXX_REG_TEMP ] =0x0a , + [BQ27XXX_REG_INT_TEMP ] =INVALID_REG_ADDR , + [BQ27XXX_REG_VOLT ] =0x0c , + [BQ27XXX_REG_AI ] =0x0e , + [BQ27XXX_REG_FLAGS ] =0x08 , + [BQ27XXX_REG_TTE ] =INVALID_REG_ADDR , + [BQ27XXX_REG_TTF ] =INVALID_REG_ADDR , + [BQ27XXX_REG_TTES ] =INVALID_REG_ADDR , + [BQ27XXX_REG_TTECP ] =INVALID_REG_ADDR , + [BQ27XXX_REG_NAC ] =INVALID_REG_ADDR , + [BQ27XXX_REG_FCC ] =INVALID_REG_ADDR , + [BQ27XXX_REG_CYCT ] =INVALID_REG_ADDR , + [BQ27XXX_REG_AE ] =INVALID_REG_ADDR , + [BQ27XXX_REG_SOC ] =INVALID_REG_ADDR , + [BQ27XXX_REG_DCAP ] =INVALID_REG_ADDR , + [BQ27XXX_REG_AP ] =INVALID_REG_ADDR , + [BQ27XXX_DM_CTRL ] =INVALID_REG_ADDR , + [BQ27XXX_DM_CLASS ] =INVALID_REG_ADDR , + [BQ27XXX_DM_BLOCK ] =INVALID_REG_ADDR , + [BQ27XXX_DM_DATA ] =INVALID_REG_ADDR , + [BQ27XXX_DM_CKSUM ] =INVALID_REG_ADDR , + }, bq27530_regs[BQ27XXX_REG_MAX ] = { [BQ27XXX_REG_CTRL ] =0x00 , [BQ27XXX_REG_TEMP ] =0x06 ,@@ -557,6 +581,15 @@ static enum power_supply_property bq27520g4_props[] = { POWER_SUPPLY_PROP_MANUFACTURER, }; +static enum power_supply_property bq27521_props[] = { +POWER_SUPPLY_PROP_STATUS , +POWER_SUPPLY_PROP_PRESENT , +POWER_SUPPLY_PROP_VOLTAGE_NOW , +POWER_SUPPLY_PROP_CURRENT_NOW , +POWER_SUPPLY_PROP_TEMP , +POWER_SUPPLY_PROP_TECHNOLOGY , +}; +static enum power_supply_property bq27530_props[] = {POWER_SUPPLY_PROP_STATUS ,POWER_SUPPLY_PROP_PRESENT ,@@ -671,6 +704,7 @@ static struct bq27xxx_dm_reg bq27500_dm_regs[] = {#define bq27520g2_dm_regs 0#define bq27520g3_dm_regs 0#define bq27520g4_dm_regs 0 +#define bq27521_dm_regs 0#define bq27530_dm_regs 0#define bq27531_dm_regs 0#define bq27541_dm_regs 0@@ -717,8 +751,8 @@ static struct bq27xxx_dm_reg bq27621_dm_regs[] = {#endif
Quoted 5 lines
drivers/power/supply/bq27xxx_battery.c static struct bq27xxx_dm_reg bq27621_dm_regs[] = { · line 755
Quoted 5 lines
drivers/power/supply/bq27xxx_battery.c +2
-2#define BQ27XXX_O_ZERO 0x00000001 -#define BQ27XXX_O_OTDC 0x00000002 -#define BQ27XXX_O_UTOT 0x00000004 +#define BQ27XXX_O_OTDC 0x00000002/* has OTC/OTD overtemperature flags */ +#define BQ27XXX_O_UTOT 0x00000004/* has OT overtemperature flag */
These should get turned into BIT() macros, but that's not your problem for this patch,
Quoted 59 lines
Quoted 56 lines
drivers/power/supply/bq27xxx_battery.c +1
-0#define BQ27XXX_O_CFGUP 0x00000008#define BQ27XXX_O_RAM 0x00000010@@ -751,6 +785,7 @@ static struct { [BQ27520G2] = BQ27XXX_DATA(bq27520g2, 0 , BQ27XXX_O_OTDC), [BQ27520G3] = BQ27XXX_DATA(bq27520g3, 0 , BQ27XXX_O_OTDC), [BQ27520G4] = BQ27XXX_DATA(bq27520g4, 0 , BQ27XXX_O_OTDC), + [BQ27521] = BQ27XXX_DATA(bq27521, 0 , 0), [BQ27530] = BQ27XXX_DATA(bq27530, 0 , BQ27XXX_O_UTOT), [BQ27531] = BQ27XXX_DATA(bq27531, 0 , BQ27XXX_O_UTOT), [BQ27541] = BQ27XXX_DATA(bq27541, 0 , BQ27XXX_O_OTDC),drivers/power/supply/bq27xxx_battery_i2c.c +2
-0@@ -239,6 +239,7 @@ static const struct i2c_device_id bq27xxx_i2c_id_table[] = { { "bq27520g2", BQ27520G2 }, { "bq27520g3", BQ27520G3 }, { "bq27520g4", BQ27520G4 }, + { "bq27521", BQ27521 }, { "bq27530", BQ27530 }, { "bq27531", BQ27531 }, { "bq27541", BQ27541 },@@ -269,6 +270,7 @@ static const struct of_device_id bq27xxx_battery_i2c_of_match_table[] = { { .compatible = "ti,bq27520g2" }, { .compatible = "ti,bq27520g3" }, { .compatible = "ti,bq27520g4" }, + { .compatible = "ti,bq27521" }, { .compatible = "ti,bq27530" }, { .compatible = "ti,bq27531" }, { .compatible = "ti,bq27541" },include/linux/mfd/twl.h +1
-0@@ -70,6 +70,7 @@ enum twl4030_module_ids {TWL4030_MODULE_INT ,TWL5031_MODULE_ACCESSORY , +TWL5031_MODULE_BCC ,TWL5031_MODULE_INTERRUPTS , TWL4030_MODULE_LAST,include/linux/power/bq27xxx_battery.h +1
-0@@ -15,6 +15,7 @@ enum bq27xxx_chip {BQ27520G2 ,/* bq27520G2 */ BQ27520G3 ,/* bq27520G3 */ BQ27520G4 ,/* bq27520G4 */ +BQ27521 ,/* bq27521 */ BQ27530 ,/* bq27530, bq27531 */ BQ27531 , BQ27541, /* bq27541, bq27542, bq27546, bq27742 */
Sebastian Reichel
maintainerHi,
Quoted 9 lines · Andrew F. Davis
Quoted 8 lines · Pavel Machek
Hi!
Quoted 5 lines
This adds basic support for BQ27521 battery monitor, used in Nokia N9 and N950. In particular, battery voltage is important to be able to tell when the battery is almost empty. Emptying battery on N950 is pretty painful, as flasher needs to be used to recover phone in such case.
Quoted 3 lines
Quoted 1 line
Sebastian, ping? This one should not be too controversial.
Acked-by Andrew F. Davis <[email protected]>
Thanks, queued, I dropped the spurious change in twl.h and added the dt-binding from the previous patch version, that was lost somehow.
Quoted 2 lines
Quoted 2 lines
If you could also apply the "shut down when battery is low", that would be nice.
I only have one with values specific to N900 hardcoded in the driver. That one can't be applied for obvious reasons.
-- Sebastian
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20171208/e6e946c7/attachment-0001.sig>
Lithium battery protection was Re: [PATCH v4.14] Add support for bq27521 battery monitor
Hi!
Quoted 6 lines
Quoted 6 lines
Quoted 6 lines
Quoted 5 lines
This adds basic support for BQ27521 battery monitor, used in Nokia N9 and N950. In particular, battery voltage is important to be able to tell when the battery is almost empty. Emptying battery on N950 is pretty painful, as flasher needs to be used to recover phone in such case.
Quoted 6 lines
Quoted 3 lines
Quoted 1 line
Sebastian, ping? This one should not be too controversial.
Acked-by Andrew F. Davis <[email protected]>Thanks, queued, I dropped the spurious change in
twl.hand added the dt-binding from the previous patch version, that was lost somehow.
Thanks!
Quoted 5 lines
Quoted 2 lines
Quoted 2 lines
If you could also apply the "shut down when battery is low", that would be nice.
I only have one with values specific to N900 hardcoded in the driver. That one can't be applied for obvious reasons.
Well... the values are not really N900-specific. They should work well on anything with lithium battery, because they basically depend only on battery chemistry.
I guess I can simplify patch to work with battery voltage only -- that's what hardware battery protection does -- and make shutdown voltage configurable ...?
Best regards,
Pavel
Signature · 9 lines
(english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 181 bytes Desc: Digital signature URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20171213/5571e850/attachment.sig>
Quoted 7 lines · Pavel Machek
This adds basic support for BQ27521 battery monitor, used in Nokia N9 and N950. In particular, battery voltage is important to be able to tell when the battery is almost empty. Emptying battery on N950 is pretty painful, as flasher needs to be used to recover phone in such case.
Signed-off-by Pavel Machek <[email protected]>
For the binding,