|
|
|
@ -58,8 +58,6 @@ |
|
|
|
|
|
|
|
|
|
#include <linux/power/bq27xxx_battery.h> |
|
|
|
|
|
|
|
|
|
#define DRIVER_VERSION "1.2.0" |
|
|
|
|
|
|
|
|
|
#define BQ27XXX_MANUFACTURER "Texas Instruments" |
|
|
|
|
|
|
|
|
|
/* BQ27XXX Flags */ |
|
|
|
@ -132,8 +130,8 @@ enum bq27xxx_reg_index { |
|
|
|
|
[BQ27XXX_DM_CKSUM] = 0x60 |
|
|
|
|
|
|
|
|
|
/* Register mappings */ |
|
|
|
|
static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = { |
|
|
|
|
[BQ27000] = { |
|
|
|
|
static u8 |
|
|
|
|
bq27000_regs[BQ27XXX_REG_MAX] = { |
|
|
|
|
[BQ27XXX_REG_CTRL] = 0x00, |
|
|
|
|
[BQ27XXX_REG_TEMP] = 0x06, |
|
|
|
|
[BQ27XXX_REG_INT_TEMP] = INVALID_REG_ADDR, |
|
|
|
@ -157,7 +155,7 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = { |
|
|
|
|
[BQ27XXX_DM_DATA] = INVALID_REG_ADDR, |
|
|
|
|
[BQ27XXX_DM_CKSUM] = INVALID_REG_ADDR, |
|
|
|
|
}, |
|
|
|
|
[BQ27010] = { |
|
|
|
|
bq27010_regs[BQ27XXX_REG_MAX] = { |
|
|
|
|
[BQ27XXX_REG_CTRL] = 0x00, |
|
|
|
|
[BQ27XXX_REG_TEMP] = 0x06, |
|
|
|
|
[BQ27XXX_REG_INT_TEMP] = INVALID_REG_ADDR, |
|
|
|
@ -181,7 +179,7 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = { |
|
|
|
|
[BQ27XXX_DM_DATA] = INVALID_REG_ADDR, |
|
|
|
|
[BQ27XXX_DM_CKSUM] = INVALID_REG_ADDR, |
|
|
|
|
}, |
|
|
|
|
[BQ2750X] = { |
|
|
|
|
bq2750x_regs[BQ27XXX_REG_MAX] = { |
|
|
|
|
[BQ27XXX_REG_CTRL] = 0x00, |
|
|
|
|
[BQ27XXX_REG_TEMP] = 0x06, |
|
|
|
|
[BQ27XXX_REG_INT_TEMP] = 0x28, |
|
|
|
@ -201,47 +199,9 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = { |
|
|
|
|
[BQ27XXX_REG_AP] = INVALID_REG_ADDR, |
|
|
|
|
BQ27XXX_DM_REG_ROWS, |
|
|
|
|
}, |
|
|
|
|
[BQ2751X] = { |
|
|
|
|
[BQ27XXX_REG_CTRL] = 0x00, |
|
|
|
|
[BQ27XXX_REG_TEMP] = 0x06, |
|
|
|
|
[BQ27XXX_REG_INT_TEMP] = 0x28, |
|
|
|
|
[BQ27XXX_REG_VOLT] = 0x08, |
|
|
|
|
[BQ27XXX_REG_AI] = 0x14, |
|
|
|
|
[BQ27XXX_REG_FLAGS] = 0x0a, |
|
|
|
|
[BQ27XXX_REG_TTE] = 0x16, |
|
|
|
|
[BQ27XXX_REG_TTF] = INVALID_REG_ADDR, |
|
|
|
|
[BQ27XXX_REG_TTES] = 0x1a, |
|
|
|
|
[BQ27XXX_REG_TTECP] = INVALID_REG_ADDR, |
|
|
|
|
[BQ27XXX_REG_NAC] = 0x0c, |
|
|
|
|
[BQ27XXX_REG_FCC] = 0x12, |
|
|
|
|
[BQ27XXX_REG_CYCT] = 0x1e, |
|
|
|
|
[BQ27XXX_REG_AE] = INVALID_REG_ADDR, |
|
|
|
|
[BQ27XXX_REG_SOC] = 0x20, |
|
|
|
|
[BQ27XXX_REG_DCAP] = 0x2e, |
|
|
|
|
[BQ27XXX_REG_AP] = INVALID_REG_ADDR, |
|
|
|
|
BQ27XXX_DM_REG_ROWS, |
|
|
|
|
}, |
|
|
|
|
[BQ27500] = { |
|
|
|
|
[BQ27XXX_REG_CTRL] = 0x00, |
|
|
|
|
[BQ27XXX_REG_TEMP] = 0x06, |
|
|
|
|
[BQ27XXX_REG_INT_TEMP] = INVALID_REG_ADDR, |
|
|
|
|
[BQ27XXX_REG_VOLT] = 0x08, |
|
|
|
|
[BQ27XXX_REG_AI] = 0x14, |
|
|
|
|
[BQ27XXX_REG_FLAGS] = 0x0a, |
|
|
|
|
[BQ27XXX_REG_TTE] = 0x16, |
|
|
|
|
[BQ27XXX_REG_TTF] = 0x18, |
|
|
|
|
[BQ27XXX_REG_TTES] = 0x1c, |
|
|
|
|
[BQ27XXX_REG_TTECP] = 0x26, |
|
|
|
|
[BQ27XXX_REG_NAC] = 0x0c, |
|
|
|
|
[BQ27XXX_REG_FCC] = 0x12, |
|
|
|
|
[BQ27XXX_REG_CYCT] = 0x2a, |
|
|
|
|
[BQ27XXX_REG_AE] = 0x22, |
|
|
|
|
[BQ27XXX_REG_SOC] = 0x2c, |
|
|
|
|
[BQ27XXX_REG_DCAP] = 0x3c, |
|
|
|
|
[BQ27XXX_REG_AP] = 0x24, |
|
|
|
|
BQ27XXX_DM_REG_ROWS, |
|
|
|
|
}, |
|
|
|
|
[BQ27510G1] = { |
|
|
|
|
#define bq2751x_regs bq27510g3_regs |
|
|
|
|
#define bq2752x_regs bq27510g3_regs |
|
|
|
|
bq27500_regs[BQ27XXX_REG_MAX] = { |
|
|
|
|
[BQ27XXX_REG_CTRL] = 0x00, |
|
|
|
|
[BQ27XXX_REG_TEMP] = 0x06, |
|
|
|
|
[BQ27XXX_REG_INT_TEMP] = INVALID_REG_ADDR, |
|
|
|
@ -261,27 +221,9 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = { |
|
|
|
|
[BQ27XXX_REG_AP] = 0x24, |
|
|
|
|
BQ27XXX_DM_REG_ROWS, |
|
|
|
|
}, |
|
|
|
|
[BQ27510G2] = { |
|
|
|
|
[BQ27XXX_REG_CTRL] = 0x00, |
|
|
|
|
[BQ27XXX_REG_TEMP] = 0x06, |
|
|
|
|
[BQ27XXX_REG_INT_TEMP] = INVALID_REG_ADDR, |
|
|
|
|
[BQ27XXX_REG_VOLT] = 0x08, |
|
|
|
|
[BQ27XXX_REG_AI] = 0x14, |
|
|
|
|
[BQ27XXX_REG_FLAGS] = 0x0a, |
|
|
|
|
[BQ27XXX_REG_TTE] = 0x16, |
|
|
|
|
[BQ27XXX_REG_TTF] = 0x18, |
|
|
|
|
[BQ27XXX_REG_TTES] = 0x1c, |
|
|
|
|
[BQ27XXX_REG_TTECP] = 0x26, |
|
|
|
|
[BQ27XXX_REG_NAC] = 0x0c, |
|
|
|
|
[BQ27XXX_REG_FCC] = 0x12, |
|
|
|
|
[BQ27XXX_REG_CYCT] = 0x2a, |
|
|
|
|
[BQ27XXX_REG_AE] = 0x22, |
|
|
|
|
[BQ27XXX_REG_SOC] = 0x2c, |
|
|
|
|
[BQ27XXX_REG_DCAP] = 0x3c, |
|
|
|
|
[BQ27XXX_REG_AP] = 0x24, |
|
|
|
|
BQ27XXX_DM_REG_ROWS, |
|
|
|
|
}, |
|
|
|
|
[BQ27510G3] = { |
|
|
|
|
#define bq27510g1_regs bq27500_regs |
|
|
|
|
#define bq27510g2_regs bq27500_regs |
|
|
|
|
bq27510g3_regs[BQ27XXX_REG_MAX] = { |
|
|
|
|
[BQ27XXX_REG_CTRL] = 0x00, |
|
|
|
|
[BQ27XXX_REG_TEMP] = 0x06, |
|
|
|
|
[BQ27XXX_REG_INT_TEMP] = 0x28, |
|
|
|
@ -301,7 +243,7 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = { |
|
|
|
|
[BQ27XXX_REG_AP] = INVALID_REG_ADDR, |
|
|
|
|
BQ27XXX_DM_REG_ROWS, |
|
|
|
|
}, |
|
|
|
|
[BQ27520G1] = { |
|
|
|
|
bq27520g1_regs[BQ27XXX_REG_MAX] = { |
|
|
|
|
[BQ27XXX_REG_CTRL] = 0x00, |
|
|
|
|
[BQ27XXX_REG_TEMP] = 0x06, |
|
|
|
|
[BQ27XXX_REG_INT_TEMP] = INVALID_REG_ADDR, |
|
|
|
@ -321,7 +263,7 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = { |
|
|
|
|
[BQ27XXX_REG_AP] = 0x24, |
|
|
|
|
BQ27XXX_DM_REG_ROWS, |
|
|
|
|
}, |
|
|
|
|
[BQ27520G2] = { |
|
|
|
|
bq27520g2_regs[BQ27XXX_REG_MAX] = { |
|
|
|
|
[BQ27XXX_REG_CTRL] = 0x00, |
|
|
|
|
[BQ27XXX_REG_TEMP] = 0x06, |
|
|
|
|
[BQ27XXX_REG_INT_TEMP] = 0x36, |
|
|
|
@ -341,7 +283,7 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = { |
|
|
|
|
[BQ27XXX_REG_AP] = 0x24, |
|
|
|
|
BQ27XXX_DM_REG_ROWS, |
|
|
|
|
}, |
|
|
|
|
[BQ27520G3] = { |
|
|
|
|
bq27520g3_regs[BQ27XXX_REG_MAX] = { |
|
|
|
|
[BQ27XXX_REG_CTRL] = 0x00, |
|
|
|
|
[BQ27XXX_REG_TEMP] = 0x06, |
|
|
|
|
[BQ27XXX_REG_INT_TEMP] = 0x36, |
|
|
|
@ -361,7 +303,7 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = { |
|
|
|
|
[BQ27XXX_REG_AP] = 0x24, |
|
|
|
|
BQ27XXX_DM_REG_ROWS, |
|
|
|
|
}, |
|
|
|
|
[BQ27520G4] = { |
|
|
|
|
bq27520g4_regs[BQ27XXX_REG_MAX] = { |
|
|
|
|
[BQ27XXX_REG_CTRL] = 0x00, |
|
|
|
|
[BQ27XXX_REG_TEMP] = 0x06, |
|
|
|
|
[BQ27XXX_REG_INT_TEMP] = 0x28, |
|
|
|
@ -381,7 +323,7 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = { |
|
|
|
|
[BQ27XXX_REG_AP] = INVALID_REG_ADDR, |
|
|
|
|
BQ27XXX_DM_REG_ROWS, |
|
|
|
|
}, |
|
|
|
|
[BQ27530] = { |
|
|
|
|
bq27530_regs[BQ27XXX_REG_MAX] = { |
|
|
|
|
[BQ27XXX_REG_CTRL] = 0x00, |
|
|
|
|
[BQ27XXX_REG_TEMP] = 0x06, |
|
|
|
|
[BQ27XXX_REG_INT_TEMP] = 0x32, |
|
|
|
@ -401,7 +343,8 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = { |
|
|
|
|
[BQ27XXX_REG_AP] = 0x24, |
|
|
|
|
BQ27XXX_DM_REG_ROWS, |
|
|
|
|
}, |
|
|
|
|
[BQ27541] = { |
|
|
|
|
#define bq27531_regs bq27530_regs |
|
|
|
|
bq27541_regs[BQ27XXX_REG_MAX] = { |
|
|
|
|
[BQ27XXX_REG_CTRL] = 0x00, |
|
|
|
|
[BQ27XXX_REG_TEMP] = 0x06, |
|
|
|
|
[BQ27XXX_REG_INT_TEMP] = 0x28, |
|
|
|
@ -421,7 +364,10 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = { |
|
|
|
|
[BQ27XXX_REG_AP] = 0x24, |
|
|
|
|
BQ27XXX_DM_REG_ROWS, |
|
|
|
|
}, |
|
|
|
|
[BQ27545] = { |
|
|
|
|
#define bq27542_regs bq27541_regs |
|
|
|
|
#define bq27546_regs bq27541_regs |
|
|
|
|
#define bq27742_regs bq27541_regs |
|
|
|
|
bq27545_regs[BQ27XXX_REG_MAX] = { |
|
|
|
|
[BQ27XXX_REG_CTRL] = 0x00, |
|
|
|
|
[BQ27XXX_REG_TEMP] = 0x06, |
|
|
|
|
[BQ27XXX_REG_INT_TEMP] = 0x28, |
|
|
|
@ -441,7 +387,7 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = { |
|
|
|
|
[BQ27XXX_REG_AP] = 0x24, |
|
|
|
|
BQ27XXX_DM_REG_ROWS, |
|
|
|
|
}, |
|
|
|
|
[BQ27421] = { |
|
|
|
|
bq27421_regs[BQ27XXX_REG_MAX] = { |
|
|
|
|
[BQ27XXX_REG_CTRL] = 0x00, |
|
|
|
|
[BQ27XXX_REG_TEMP] = 0x02, |
|
|
|
|
[BQ27XXX_REG_INT_TEMP] = 0x1e, |
|
|
|
@ -460,10 +406,12 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = { |
|
|
|
|
[BQ27XXX_REG_DCAP] = 0x3c, |
|
|
|
|
[BQ27XXX_REG_AP] = 0x18, |
|
|
|
|
BQ27XXX_DM_REG_ROWS, |
|
|
|
|
}, |
|
|
|
|
}; |
|
|
|
|
}; |
|
|
|
|
#define bq27425_regs bq27421_regs |
|
|
|
|
#define bq27441_regs bq27421_regs |
|
|
|
|
#define bq27621_regs bq27421_regs |
|
|
|
|
|
|
|
|
|
static enum power_supply_property bq27000_battery_props[] = { |
|
|
|
|
static enum power_supply_property bq27000_props[] = { |
|
|
|
|
POWER_SUPPLY_PROP_STATUS, |
|
|
|
|
POWER_SUPPLY_PROP_PRESENT, |
|
|
|
|
POWER_SUPPLY_PROP_VOLTAGE_NOW, |
|
|
|
@ -485,7 +433,7 @@ static enum power_supply_property bq27000_battery_props[] = { |
|
|
|
|
POWER_SUPPLY_PROP_MANUFACTURER, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static enum power_supply_property bq27010_battery_props[] = { |
|
|
|
|
static enum power_supply_property bq27010_props[] = { |
|
|
|
|
POWER_SUPPLY_PROP_STATUS, |
|
|
|
|
POWER_SUPPLY_PROP_PRESENT, |
|
|
|
|
POWER_SUPPLY_PROP_VOLTAGE_NOW, |
|
|
|
@ -505,25 +453,11 @@ static enum power_supply_property bq27010_battery_props[] = { |
|
|
|
|
POWER_SUPPLY_PROP_MANUFACTURER, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static enum power_supply_property bq2750x_battery_props[] = { |
|
|
|
|
POWER_SUPPLY_PROP_STATUS, |
|
|
|
|
POWER_SUPPLY_PROP_PRESENT, |
|
|
|
|
POWER_SUPPLY_PROP_VOLTAGE_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_CURRENT_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_CAPACITY, |
|
|
|
|
POWER_SUPPLY_PROP_CAPACITY_LEVEL, |
|
|
|
|
POWER_SUPPLY_PROP_TEMP, |
|
|
|
|
POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_TECHNOLOGY, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_FULL, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, |
|
|
|
|
POWER_SUPPLY_PROP_CYCLE_COUNT, |
|
|
|
|
POWER_SUPPLY_PROP_HEALTH, |
|
|
|
|
POWER_SUPPLY_PROP_MANUFACTURER, |
|
|
|
|
}; |
|
|
|
|
#define bq2750x_props bq27510g3_props |
|
|
|
|
#define bq2751x_props bq27510g3_props |
|
|
|
|
#define bq2752x_props bq27510g3_props |
|
|
|
|
|
|
|
|
|
static enum power_supply_property bq2751x_battery_props[] = { |
|
|
|
|
static enum power_supply_property bq27500_props[] = { |
|
|
|
|
POWER_SUPPLY_PROP_STATUS, |
|
|
|
|
POWER_SUPPLY_PROP_PRESENT, |
|
|
|
|
POWER_SUPPLY_PROP_VOLTAGE_NOW, |
|
|
|
@ -532,16 +466,21 @@ static enum power_supply_property bq2751x_battery_props[] = { |
|
|
|
|
POWER_SUPPLY_PROP_CAPACITY_LEVEL, |
|
|
|
|
POWER_SUPPLY_PROP_TEMP, |
|
|
|
|
POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_TIME_TO_FULL_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_TECHNOLOGY, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_FULL, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, |
|
|
|
|
POWER_SUPPLY_PROP_CYCLE_COUNT, |
|
|
|
|
POWER_SUPPLY_PROP_ENERGY_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_POWER_AVG, |
|
|
|
|
POWER_SUPPLY_PROP_HEALTH, |
|
|
|
|
POWER_SUPPLY_PROP_MANUFACTURER, |
|
|
|
|
}; |
|
|
|
|
#define bq27510g1_props bq27500_props |
|
|
|
|
#define bq27510g2_props bq27500_props |
|
|
|
|
|
|
|
|
|
static enum power_supply_property bq27500_battery_props[] = { |
|
|
|
|
static enum power_supply_property bq27510g3_props[] = { |
|
|
|
|
POWER_SUPPLY_PROP_STATUS, |
|
|
|
|
POWER_SUPPLY_PROP_PRESENT, |
|
|
|
|
POWER_SUPPLY_PROP_VOLTAGE_NOW, |
|
|
|
@ -550,19 +489,16 @@ static enum power_supply_property bq27500_battery_props[] = { |
|
|
|
|
POWER_SUPPLY_PROP_CAPACITY_LEVEL, |
|
|
|
|
POWER_SUPPLY_PROP_TEMP, |
|
|
|
|
POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_TIME_TO_FULL_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_TECHNOLOGY, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_FULL, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, |
|
|
|
|
POWER_SUPPLY_PROP_CYCLE_COUNT, |
|
|
|
|
POWER_SUPPLY_PROP_ENERGY_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_POWER_AVG, |
|
|
|
|
POWER_SUPPLY_PROP_HEALTH, |
|
|
|
|
POWER_SUPPLY_PROP_MANUFACTURER, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static enum power_supply_property bq27510g1_battery_props[] = { |
|
|
|
|
static enum power_supply_property bq27520g1_props[] = { |
|
|
|
|
POWER_SUPPLY_PROP_STATUS, |
|
|
|
|
POWER_SUPPLY_PROP_PRESENT, |
|
|
|
|
POWER_SUPPLY_PROP_VOLTAGE_NOW, |
|
|
|
@ -576,14 +512,15 @@ static enum power_supply_property bq27510g1_battery_props[] = { |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_FULL, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, |
|
|
|
|
POWER_SUPPLY_PROP_CYCLE_COUNT, |
|
|
|
|
POWER_SUPPLY_PROP_ENERGY_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_POWER_AVG, |
|
|
|
|
POWER_SUPPLY_PROP_HEALTH, |
|
|
|
|
POWER_SUPPLY_PROP_MANUFACTURER, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static enum power_supply_property bq27510g2_battery_props[] = { |
|
|
|
|
#define bq27520g2_props bq27500_props |
|
|
|
|
|
|
|
|
|
static enum power_supply_property bq27520g3_props[] = { |
|
|
|
|
POWER_SUPPLY_PROP_STATUS, |
|
|
|
|
POWER_SUPPLY_PROP_PRESENT, |
|
|
|
|
POWER_SUPPLY_PROP_VOLTAGE_NOW, |
|
|
|
@ -592,7 +529,6 @@ static enum power_supply_property bq27510g2_battery_props[] = { |
|
|
|
|
POWER_SUPPLY_PROP_CAPACITY_LEVEL, |
|
|
|
|
POWER_SUPPLY_PROP_TEMP, |
|
|
|
|
POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_TIME_TO_FULL_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_TECHNOLOGY, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_FULL, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_NOW, |
|
|
|
@ -604,7 +540,7 @@ static enum power_supply_property bq27510g2_battery_props[] = { |
|
|
|
|
POWER_SUPPLY_PROP_MANUFACTURER, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static enum power_supply_property bq27510g3_battery_props[] = { |
|
|
|
|
static enum power_supply_property bq27520g4_props[] = { |
|
|
|
|
POWER_SUPPLY_PROP_STATUS, |
|
|
|
|
POWER_SUPPLY_PROP_PRESENT, |
|
|
|
|
POWER_SUPPLY_PROP_VOLTAGE_NOW, |
|
|
|
@ -616,13 +552,12 @@ static enum power_supply_property bq27510g3_battery_props[] = { |
|
|
|
|
POWER_SUPPLY_PROP_TECHNOLOGY, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_FULL, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, |
|
|
|
|
POWER_SUPPLY_PROP_CYCLE_COUNT, |
|
|
|
|
POWER_SUPPLY_PROP_HEALTH, |
|
|
|
|
POWER_SUPPLY_PROP_MANUFACTURER, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static enum power_supply_property bq27520g1_battery_props[] = { |
|
|
|
|
static enum power_supply_property bq27530_props[] = { |
|
|
|
|
POWER_SUPPLY_PROP_STATUS, |
|
|
|
|
POWER_SUPPLY_PROP_PRESENT, |
|
|
|
|
POWER_SUPPLY_PROP_VOLTAGE_NOW, |
|
|
|
@ -631,18 +566,17 @@ static enum power_supply_property bq27520g1_battery_props[] = { |
|
|
|
|
POWER_SUPPLY_PROP_CAPACITY_LEVEL, |
|
|
|
|
POWER_SUPPLY_PROP_TEMP, |
|
|
|
|
POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_TIME_TO_FULL_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_TECHNOLOGY, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_FULL, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, |
|
|
|
|
POWER_SUPPLY_PROP_ENERGY_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_POWER_AVG, |
|
|
|
|
POWER_SUPPLY_PROP_HEALTH, |
|
|
|
|
POWER_SUPPLY_PROP_CYCLE_COUNT, |
|
|
|
|
POWER_SUPPLY_PROP_MANUFACTURER, |
|
|
|
|
}; |
|
|
|
|
#define bq27531_props bq27530_props |
|
|
|
|
|
|
|
|
|
static enum power_supply_property bq27520g2_battery_props[] = { |
|
|
|
|
static enum power_supply_property bq27541_props[] = { |
|
|
|
|
POWER_SUPPLY_PROP_STATUS, |
|
|
|
|
POWER_SUPPLY_PROP_PRESENT, |
|
|
|
|
POWER_SUPPLY_PROP_VOLTAGE_NOW, |
|
|
|
@ -651,19 +585,20 @@ static enum power_supply_property bq27520g2_battery_props[] = { |
|
|
|
|
POWER_SUPPLY_PROP_CAPACITY_LEVEL, |
|
|
|
|
POWER_SUPPLY_PROP_TEMP, |
|
|
|
|
POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_TIME_TO_FULL_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_TECHNOLOGY, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_FULL, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, |
|
|
|
|
POWER_SUPPLY_PROP_CYCLE_COUNT, |
|
|
|
|
POWER_SUPPLY_PROP_ENERGY_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_POWER_AVG, |
|
|
|
|
POWER_SUPPLY_PROP_HEALTH, |
|
|
|
|
POWER_SUPPLY_PROP_MANUFACTURER, |
|
|
|
|
}; |
|
|
|
|
#define bq27542_props bq27541_props |
|
|
|
|
#define bq27546_props bq27541_props |
|
|
|
|
#define bq27742_props bq27541_props |
|
|
|
|
|
|
|
|
|
static enum power_supply_property bq27520g3_battery_props[] = { |
|
|
|
|
static enum power_supply_property bq27545_props[] = { |
|
|
|
|
POWER_SUPPLY_PROP_STATUS, |
|
|
|
|
POWER_SUPPLY_PROP_PRESENT, |
|
|
|
|
POWER_SUPPLY_PROP_VOLTAGE_NOW, |
|
|
|
@ -675,15 +610,13 @@ static enum power_supply_property bq27520g3_battery_props[] = { |
|
|
|
|
POWER_SUPPLY_PROP_TECHNOLOGY, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_FULL, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, |
|
|
|
|
POWER_SUPPLY_PROP_HEALTH, |
|
|
|
|
POWER_SUPPLY_PROP_CYCLE_COUNT, |
|
|
|
|
POWER_SUPPLY_PROP_ENERGY_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_POWER_AVG, |
|
|
|
|
POWER_SUPPLY_PROP_HEALTH, |
|
|
|
|
POWER_SUPPLY_PROP_MANUFACTURER, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static enum power_supply_property bq27520g4_battery_props[] = { |
|
|
|
|
static enum power_supply_property bq27421_props[] = { |
|
|
|
|
POWER_SUPPLY_PROP_STATUS, |
|
|
|
|
POWER_SUPPLY_PROP_PRESENT, |
|
|
|
|
POWER_SUPPLY_PROP_VOLTAGE_NOW, |
|
|
|
@ -691,111 +624,144 @@ static enum power_supply_property bq27520g4_battery_props[] = { |
|
|
|
|
POWER_SUPPLY_PROP_CAPACITY, |
|
|
|
|
POWER_SUPPLY_PROP_CAPACITY_LEVEL, |
|
|
|
|
POWER_SUPPLY_PROP_TEMP, |
|
|
|
|
POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_TECHNOLOGY, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_FULL, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_CYCLE_COUNT, |
|
|
|
|
POWER_SUPPLY_PROP_HEALTH, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, |
|
|
|
|
POWER_SUPPLY_PROP_MANUFACTURER, |
|
|
|
|
}; |
|
|
|
|
#define bq27425_props bq27421_props |
|
|
|
|
#define bq27441_props bq27421_props |
|
|
|
|
#define bq27621_props bq27421_props |
|
|
|
|
|
|
|
|
|
static enum power_supply_property bq27530_battery_props[] = { |
|
|
|
|
POWER_SUPPLY_PROP_STATUS, |
|
|
|
|
POWER_SUPPLY_PROP_PRESENT, |
|
|
|
|
POWER_SUPPLY_PROP_VOLTAGE_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_CURRENT_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_CAPACITY, |
|
|
|
|
POWER_SUPPLY_PROP_CAPACITY_LEVEL, |
|
|
|
|
POWER_SUPPLY_PROP_TEMP, |
|
|
|
|
POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_TECHNOLOGY, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_FULL, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_POWER_AVG, |
|
|
|
|
POWER_SUPPLY_PROP_HEALTH, |
|
|
|
|
POWER_SUPPLY_PROP_CYCLE_COUNT, |
|
|
|
|
POWER_SUPPLY_PROP_MANUFACTURER, |
|
|
|
|
struct bq27xxx_dm_reg { |
|
|
|
|
u8 subclass_id; |
|
|
|
|
u8 offset; |
|
|
|
|
u8 bytes; |
|
|
|
|
u16 min, max; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static enum power_supply_property bq27541_battery_props[] = { |
|
|
|
|
POWER_SUPPLY_PROP_STATUS, |
|
|
|
|
POWER_SUPPLY_PROP_PRESENT, |
|
|
|
|
POWER_SUPPLY_PROP_VOLTAGE_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_CURRENT_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_CAPACITY, |
|
|
|
|
POWER_SUPPLY_PROP_CAPACITY_LEVEL, |
|
|
|
|
POWER_SUPPLY_PROP_TEMP, |
|
|
|
|
POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_TECHNOLOGY, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_FULL, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, |
|
|
|
|
POWER_SUPPLY_PROP_CYCLE_COUNT, |
|
|
|
|
POWER_SUPPLY_PROP_POWER_AVG, |
|
|
|
|
POWER_SUPPLY_PROP_HEALTH, |
|
|
|
|
POWER_SUPPLY_PROP_MANUFACTURER, |
|
|
|
|
enum bq27xxx_dm_reg_id { |
|
|
|
|
BQ27XXX_DM_DESIGN_CAPACITY = 0, |
|
|
|
|
BQ27XXX_DM_DESIGN_ENERGY, |
|
|
|
|
BQ27XXX_DM_TERMINATE_VOLTAGE, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static enum power_supply_property bq27545_battery_props[] = { |
|
|
|
|
POWER_SUPPLY_PROP_STATUS, |
|
|
|
|
POWER_SUPPLY_PROP_PRESENT, |
|
|
|
|
POWER_SUPPLY_PROP_VOLTAGE_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_CURRENT_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_CAPACITY, |
|
|
|
|
POWER_SUPPLY_PROP_CAPACITY_LEVEL, |
|
|
|
|
POWER_SUPPLY_PROP_TEMP, |
|
|
|
|
POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_TECHNOLOGY, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_FULL, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_HEALTH, |
|
|
|
|
POWER_SUPPLY_PROP_CYCLE_COUNT, |
|
|
|
|
POWER_SUPPLY_PROP_POWER_AVG, |
|
|
|
|
POWER_SUPPLY_PROP_MANUFACTURER, |
|
|
|
|
#define bq27000_dm_regs 0 |
|
|
|
|
#define bq27010_dm_regs 0 |
|
|
|
|
#define bq2750x_dm_regs 0 |
|
|
|
|
#define bq2751x_dm_regs 0 |
|
|
|
|
#define bq2752x_dm_regs 0 |
|
|
|
|
|
|
|
|
|
#if 0 /* not yet tested */
|
|
|
|
|
static struct bq27xxx_dm_reg bq27500_dm_regs[] = { |
|
|
|
|
[BQ27XXX_DM_DESIGN_CAPACITY] = { 48, 10, 2, 0, 65535 }, |
|
|
|
|
[BQ27XXX_DM_DESIGN_ENERGY] = { }, /* missing on chip */ |
|
|
|
|
[BQ27XXX_DM_TERMINATE_VOLTAGE] = { 80, 48, 2, 1000, 32767 }, |
|
|
|
|
}; |
|
|
|
|
#else |
|
|
|
|
#define bq27500_dm_regs 0 |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
static enum power_supply_property bq27421_battery_props[] = { |
|
|
|
|
POWER_SUPPLY_PROP_STATUS, |
|
|
|
|
POWER_SUPPLY_PROP_PRESENT, |
|
|
|
|
POWER_SUPPLY_PROP_VOLTAGE_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_CURRENT_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_CAPACITY, |
|
|
|
|
POWER_SUPPLY_PROP_CAPACITY_LEVEL, |
|
|
|
|
POWER_SUPPLY_PROP_TEMP, |
|
|
|
|
POWER_SUPPLY_PROP_TECHNOLOGY, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_FULL, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_NOW, |
|
|
|
|
POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, |
|
|
|
|
POWER_SUPPLY_PROP_MANUFACTURER, |
|
|
|
|
/* todo create data memory definitions from datasheets and test on chips */ |
|
|
|
|
#define bq27510g1_dm_regs 0 |
|
|
|
|
#define bq27510g2_dm_regs 0 |
|
|
|
|
#define bq27510g3_dm_regs 0 |
|
|
|
|
#define bq27520g1_dm_regs 0 |
|
|
|
|
#define bq27520g2_dm_regs 0 |
|
|
|
|
#define bq27520g3_dm_regs 0 |
|
|
|
|
#define bq27520g4_dm_regs 0 |
|
|
|
|
#define bq27530_dm_regs 0 |
|
|
|
|
#define bq27531_dm_regs 0 |
|
|
|
|
#define bq27541_dm_regs 0 |
|
|
|
|
#define bq27542_dm_regs 0 |
|
|
|
|
#define bq27546_dm_regs 0 |
|
|
|
|
#define bq27742_dm_regs 0 |
|
|
|
|
|
|
|
|
|
#if 0 /* not yet tested */
|
|
|
|
|
static struct bq27xxx_dm_reg bq27545_dm_regs[] = { |
|
|
|
|
[BQ27XXX_DM_DESIGN_CAPACITY] = { 48, 23, 2, 0, 32767 }, |
|
|
|
|
[BQ27XXX_DM_DESIGN_ENERGY] = { 48, 25, 2, 0, 32767 }, |
|
|
|
|
[BQ27XXX_DM_TERMINATE_VOLTAGE] = { 80, 67, 2, 2800, 3700 }, |
|
|
|
|
}; |
|
|
|
|
#else |
|
|
|
|
#define bq27545_dm_regs 0 |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#define BQ27XXX_PROP(_id, _prop) \ |
|
|
|
|
[_id] = { \
|
|
|
|
|
.props = _prop, \
|
|
|
|
|
.size = ARRAY_SIZE(_prop), \
|
|
|
|
|
} |
|
|
|
|
static struct bq27xxx_dm_reg bq27421_dm_regs[] = { |
|
|
|
|
[BQ27XXX_DM_DESIGN_CAPACITY] = { 82, 10, 2, 0, 8000 }, |
|
|
|
|
[BQ27XXX_DM_DESIGN_ENERGY] = { 82, 12, 2, 0, 32767 }, |
|
|
|
|
[BQ27XXX_DM_TERMINATE_VOLTAGE] = { 82, 16, 2, 2500, 3700 }, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static struct bq27xxx_dm_reg bq27425_dm_regs[] = { |
|
|
|
|
[BQ27XXX_DM_DESIGN_CAPACITY] = { 82, 12, 2, 0, 32767 }, |
|
|
|
|
[BQ27XXX_DM_DESIGN_ENERGY] = { 82, 14, 2, 0, 32767 }, |
|
|
|
|
[BQ27XXX_DM_TERMINATE_VOLTAGE] = { 82, 18, 2, 2800, 3700 }, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
#if 0 /* not yet tested */
|
|
|
|
|
#define bq27441_dm_regs bq27421_dm_regs |
|
|
|
|
#else |
|
|
|
|
#define bq27441_dm_regs 0 |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#if 0 /* not yet tested */
|
|
|
|
|
static struct bq27xxx_dm_reg bq27621_dm_regs[] = { |
|
|
|
|
[BQ27XXX_DM_DESIGN_CAPACITY] = { 82, 3, 2, 0, 8000 }, |
|
|
|
|
[BQ27XXX_DM_DESIGN_ENERGY] = { 82, 5, 2, 0, 32767 }, |
|
|
|
|
[BQ27XXX_DM_TERMINATE_VOLTAGE] = { 82, 9, 2, 2500, 3700 }, |
|
|
|
|
}; |
|
|
|
|
#else |
|
|
|
|
#define bq27621_dm_regs 0 |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#define BQ27XXX_O_ZERO 0x00000001 |
|
|
|
|
#define BQ27XXX_O_OTDC 0x00000002 |
|
|
|
|
#define BQ27XXX_O_UTOT 0x00000004 |
|
|
|
|
#define BQ27XXX_O_CFGUP 0x00000008 |
|
|
|
|
#define BQ27XXX_O_RAM 0x00000010 |
|
|
|
|
|
|
|
|
|
#define BQ27XXX_DATA(ref, key, opt) { \ |
|
|
|
|
.opts = (opt), \
|
|
|
|
|
.unseal_key = key, \
|
|
|
|
|
.regs = ref##_regs, \
|
|
|
|
|
.dm_regs = ref##_dm_regs, \
|
|
|
|
|
.props = ref##_props, \
|
|
|
|
|
.props_size = ARRAY_SIZE(ref##_props) } |
|
|
|
|
|
|
|
|
|
static struct { |
|
|
|
|
u32 opts; |
|
|
|
|
u32 unseal_key; |
|
|
|
|
u8 *regs; |
|
|
|
|
struct bq27xxx_dm_reg *dm_regs; |
|
|
|
|
enum power_supply_property *props; |
|
|
|
|
size_t size; |
|
|
|
|
} bq27xxx_battery_props[] = { |
|
|
|
|
BQ27XXX_PROP(BQ27000, bq27000_battery_props), |
|
|
|
|
BQ27XXX_PROP(BQ27010, bq27010_battery_props), |
|
|
|
|
BQ27XXX_PROP(BQ2750X, bq2750x_battery_props), |
|
|
|
|
BQ27XXX_PROP(BQ2751X, bq2751x_battery_props), |
|
|
|
|
BQ27XXX_PROP(BQ27500, bq27500_battery_props), |
|
|
|
|
BQ27XXX_PROP(BQ27510G1, bq27510g1_battery_props), |
|
|
|
|
BQ27XXX_PROP(BQ27510G2, bq27510g2_battery_props), |
|
|
|
|
BQ27XXX_PROP(BQ27510G3, bq27510g3_battery_props), |
|
|
|
|
BQ27XXX_PROP(BQ27520G1, bq27520g1_battery_props), |
|
|
|
|
BQ27XXX_PROP(BQ27520G2, bq27520g2_battery_props), |
|
|
|
|
BQ27XXX_PROP(BQ27520G3, bq27520g3_battery_props), |
|
|
|
|
BQ27XXX_PROP(BQ27520G4, bq27520g4_battery_props), |
|
|
|
|
BQ27XXX_PROP(BQ27530, bq27530_battery_props), |
|
|
|
|
BQ27XXX_PROP(BQ27541, bq27541_battery_props), |
|
|
|
|
BQ27XXX_PROP(BQ27545, bq27545_battery_props), |
|
|
|
|
BQ27XXX_PROP(BQ27421, bq27421_battery_props), |
|
|
|
|
size_t props_size; |
|
|
|
|
} bq27xxx_chip_data[] = { |
|
|
|
|
[BQ27000] = BQ27XXX_DATA(bq27000, 0 , BQ27XXX_O_ZERO), |
|
|
|
|
[BQ27010] = BQ27XXX_DATA(bq27010, 0 , BQ27XXX_O_ZERO), |
|
|
|
|
[BQ2750X] = BQ27XXX_DATA(bq2750x, 0 , BQ27XXX_O_OTDC), |
|
|
|
|
[BQ2751X] = BQ27XXX_DATA(bq2751x, 0 , BQ27XXX_O_OTDC), |
|
|
|
|
[BQ2752X] = BQ27XXX_DATA(bq2752x, 0 , BQ27XXX_O_OTDC), |
|
|
|
|
[BQ27500] = BQ27XXX_DATA(bq27500, 0x04143672, BQ27XXX_O_OTDC), |
|
|
|
|
[BQ27510G1] = BQ27XXX_DATA(bq27510g1, 0 , BQ27XXX_O_OTDC), |
|
|
|
|
[BQ27510G2] = BQ27XXX_DATA(bq27510g2, 0 , BQ27XXX_O_OTDC), |
|
|
|
|
[BQ27510G3] = BQ27XXX_DATA(bq27510g3, 0 , BQ27XXX_O_OTDC), |
|
|
|
|
[BQ27520G1] = BQ27XXX_DATA(bq27520g1, 0 , BQ27XXX_O_OTDC), |
|
|
|
|
[BQ27520G2] = BQ27XXX_DATA(bq27520g2, 0 , BQ27XXX_O_OTDC), |
|
|
|
|
[BQ27520G3] = BQ27XXX_DATA(bq27520g3, 0 , BQ27XXX_O_OTDC), |
|
|
|
|
[BQ27520G4] = BQ27XXX_DATA(bq27520g4, 0 , BQ27XXX_O_OTDC), |
|
|
|
|
[BQ27530] = BQ27XXX_DATA(bq27530, 0 , BQ27XXX_O_UTOT), |
|
|
|
|
[BQ27531] = BQ27XXX_DATA(bq27531, 0 , BQ27XXX_O_UTOT), |
|
|
|
|
[BQ27541] = BQ27XXX_DATA(bq27541, 0 , BQ27XXX_O_OTDC), |
|
|
|
|
[BQ27542] = BQ27XXX_DATA(bq27542, 0 , BQ27XXX_O_OTDC), |
|
|
|
|
[BQ27546] = BQ27XXX_DATA(bq27546, 0 , BQ27XXX_O_OTDC), |
|
|
|
|
[BQ27742] = BQ27XXX_DATA(bq27742, 0 , BQ27XXX_O_OTDC), |
|
|
|
|
[BQ27545] = BQ27XXX_DATA(bq27545, 0x04143672, BQ27XXX_O_OTDC), |
|
|
|
|
[BQ27421] = BQ27XXX_DATA(bq27421, 0x80008000, BQ27XXX_O_UTOT | BQ27XXX_O_CFGUP | BQ27XXX_O_RAM), |
|
|
|
|
[BQ27425] = BQ27XXX_DATA(bq27425, 0x04143672, BQ27XXX_O_UTOT | BQ27XXX_O_CFGUP), |
|
|
|
|
[BQ27441] = BQ27XXX_DATA(bq27441, 0x80008000, BQ27XXX_O_UTOT | BQ27XXX_O_CFGUP | BQ27XXX_O_RAM), |
|
|
|
|
[BQ27621] = BQ27XXX_DATA(bq27621, 0x80008000, BQ27XXX_O_UTOT | BQ27XXX_O_CFGUP | BQ27XXX_O_RAM), |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static DEFINE_MUTEX(bq27xxx_list_lock); |
|
|
|
@ -805,13 +771,6 @@ static LIST_HEAD(bq27xxx_battery_devices); |
|
|
|
|
|
|
|
|
|
#define BQ27XXX_DM_SZ 32 |
|
|
|
|
|
|
|
|
|
struct bq27xxx_dm_reg { |
|
|
|
|
u8 subclass_id; |
|
|
|
|
u8 offset; |
|
|
|
|
u8 bytes; |
|
|
|
|
u16 min, max; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* struct bq27xxx_dm_buf - chip data memory buffer |
|
|
|
|
* @class: data memory subclass_id |
|
|
|
@ -844,12 +803,6 @@ static inline u16 *bq27xxx_dm_reg_ptr(struct bq27xxx_dm_buf *buf, |
|
|
|
|
return NULL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
enum bq27xxx_dm_reg_id { |
|
|
|
|
BQ27XXX_DM_DESIGN_CAPACITY = 0, |
|
|
|
|
BQ27XXX_DM_DESIGN_ENERGY, |
|
|
|
|
BQ27XXX_DM_TERMINATE_VOLTAGE, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static const char * const bq27xxx_dm_reg_name[] = { |
|
|
|
|
[BQ27XXX_DM_DESIGN_CAPACITY] = "design-capacity", |
|
|
|
|
[BQ27XXX_DM_DESIGN_ENERGY] = "design-energy", |
|
|
|
@ -1092,9 +1045,9 @@ static void bq27xxx_battery_update_dm_block(struct bq27xxx_device_info *di, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_BATTERY_BQ27XXX_DT_UPDATES_NVM |
|
|
|
|
if (!di->ram_chip && !bq27xxx_dt_to_nvm) { |
|
|
|
|
if (!(di->opts & BQ27XXX_O_RAM) && !bq27xxx_dt_to_nvm) { |
|
|
|
|
#else |
|
|
|
|
if (!di->ram_chip) { |
|
|
|
|
if (!(di->opts & BQ27XXX_O_RAM)) { |
|
|
|
|
#endif |
|
|
|
|
/* devicetree and NVM differ; defer to NVM */ |
|
|
|
|
dev_warn(di->dev, "%s has %u; update to %u disallowed " |
|
|
|
@ -1130,7 +1083,7 @@ static int bq27xxx_battery_cfgupdate_priv(struct bq27xxx_device_info *di, bool a |
|
|
|
|
return ret; |
|
|
|
|
} while (!!(ret & BQ27XXX_FLAG_CFGUP) != active && --try); |
|
|
|
|
|
|
|
|
|
if (!try) { |
|
|
|
|
if (!try && di->chip != BQ27425) { // 425 has a bug
|
|
|
|
|
dev_err(di->dev, "timed out waiting for cfgupdate flag %d\n", active); |
|
|
|
|
return -EINVAL; |
|
|
|
|
} |
|
|
|
@ -1162,7 +1115,7 @@ static inline int bq27xxx_battery_soft_reset(struct bq27xxx_device_info *di) |
|
|
|
|
static int bq27xxx_battery_write_dm_block(struct bq27xxx_device_info *di, |
|
|
|
|
struct bq27xxx_dm_buf *buf) |
|
|
|
|
{ |
|
|
|
|
bool cfgup = di->chip == BQ27421; /* assume related chips need cfgupdate */ |
|
|
|
|
bool cfgup = di->opts & BQ27XXX_O_CFGUP; |
|
|
|
|
int ret; |
|
|
|
|
|
|
|
|
|
if (!buf->dirty) |
|
|
|
@ -1261,7 +1214,7 @@ static void bq27xxx_battery_set_config(struct bq27xxx_device_info *di, |
|
|
|
|
|
|
|
|
|
bq27xxx_battery_seal(di); |
|
|
|
|
|
|
|
|
|
if (updated && di->chip != BQ27421) { /* not a cfgupdate chip, so reset */ |
|
|
|
|
if (updated && !(di->opts & BQ27XXX_O_CFGUP)) { |
|
|
|
|
bq27xxx_write(di, BQ27XXX_REG_CTRL, BQ27XXX_RESET, false); |
|
|
|
|
BQ27XXX_MSLEEP(300); /* reset time is not documented */ |
|
|
|
|
} |
|
|
|
@ -1328,7 +1281,7 @@ static int bq27xxx_battery_read_soc(struct bq27xxx_device_info *di) |
|
|
|
|
{ |
|
|
|
|
int soc; |
|
|
|
|
|
|
|
|
|
if (di->chip == BQ27000 || di->chip == BQ27010) |
|
|
|
|
if (di->opts & BQ27XXX_O_ZERO) |
|
|
|
|
soc = bq27xxx_read(di, BQ27XXX_REG_SOC, true); |
|
|
|
|
else |
|
|
|
|
soc = bq27xxx_read(di, BQ27XXX_REG_SOC, false); |
|
|
|
@ -1354,7 +1307,7 @@ static int bq27xxx_battery_read_charge(struct bq27xxx_device_info *di, u8 reg) |
|
|
|
|
return charge; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (di->chip == BQ27000 || di->chip == BQ27010) |
|
|
|
|
if (di->opts & BQ27XXX_O_ZERO) |
|
|
|
|
charge *= BQ27XXX_CURRENT_CONSTANT / BQ27XXX_RS; |
|
|
|
|
else |
|
|
|
|
charge *= 1000; |
|
|
|
@ -1370,7 +1323,7 @@ static inline int bq27xxx_battery_read_nac(struct bq27xxx_device_info *di) |
|
|
|
|
{ |
|
|
|
|
int flags; |
|
|
|
|
|
|
|
|
|
if (di->chip == BQ27000 || di->chip == BQ27010) { |
|
|
|
|
if (di->opts & BQ27XXX_O_ZERO) { |
|
|
|
|
flags = bq27xxx_read(di, BQ27XXX_REG_FLAGS, true); |
|
|
|
|
if (flags >= 0 && (flags & BQ27000_FLAG_CI)) |
|
|
|
|
return -ENODATA; |
|
|
|
@ -1396,7 +1349,7 @@ static int bq27xxx_battery_read_dcap(struct bq27xxx_device_info *di) |
|
|
|
|
{ |
|
|
|
|
int dcap; |
|
|
|
|
|
|
|
|
|
if (di->chip == BQ27000 || di->chip == BQ27010) |
|
|
|
|
if (di->opts & BQ27XXX_O_ZERO) |
|
|
|
|
dcap = bq27xxx_read(di, BQ27XXX_REG_DCAP, true); |
|
|
|
|
else |
|
|
|
|
dcap = bq27xxx_read(di, BQ27XXX_REG_DCAP, false); |
|
|
|
@ -1406,7 +1359,7 @@ static int bq27xxx_battery_read_dcap(struct bq27xxx_device_info *di) |
|
|
|
|
return dcap; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (di->chip == BQ27000 || di->chip == BQ27010) |
|
|
|
|
if (di->opts & BQ27XXX_O_ZERO) |
|
|
|
|
dcap = (dcap << 8) * BQ27XXX_CURRENT_CONSTANT / BQ27XXX_RS; |
|
|
|
|
else |
|
|
|
|
dcap *= 1000; |
|
|
|
@ -1428,7 +1381,7 @@ static int bq27xxx_battery_read_energy(struct bq27xxx_device_info *di) |
|
|
|
|
return ae; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (di->chip == BQ27000 || di->chip == BQ27010) |
|
|
|
|
if (di->opts & BQ27XXX_O_ZERO) |
|
|
|
|
ae *= BQ27XXX_POWER_CONSTANT / BQ27XXX_RS; |
|
|
|
|
else |
|
|
|
|
ae *= 1000; |
|
|
|
@ -1450,7 +1403,7 @@ static int bq27xxx_battery_read_temperature(struct bq27xxx_device_info *di) |
|
|
|
|
return temp; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (di->chip == BQ27000 || di->chip == BQ27010) |
|
|
|
|
if (di->opts & BQ27XXX_O_ZERO) |
|
|
|
|
temp = 5 * temp / 2; |
|
|
|
|
|
|
|
|
|
return temp; |
|
|
|
@ -1507,7 +1460,7 @@ static int bq27xxx_battery_read_pwr_avg(struct bq27xxx_device_info *di) |
|
|
|
|
return tval; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (di->chip == BQ27000 || di->chip == BQ27010) |
|
|
|
|
if (di->opts & BQ27XXX_O_ZERO) |
|
|
|
|
return (tval * BQ27XXX_POWER_CONSTANT) / BQ27XXX_RS; |
|
|
|
|
else |
|
|
|
|
return tval; |
|
|
|
@ -1518,26 +1471,12 @@ static int bq27xxx_battery_read_pwr_avg(struct bq27xxx_device_info *di) |
|
|
|
|
*/ |
|
|
|
|
static bool bq27xxx_battery_overtemp(struct bq27xxx_device_info *di, u16 flags) |
|
|
|
|
{ |
|
|
|
|
switch (di->chip) { |
|
|
|
|
case BQ2750X: |
|
|
|
|
case BQ2751X: |
|
|
|
|
case BQ27500: |
|
|
|
|
case BQ27510G1: |
|
|
|
|
case BQ27510G2: |
|
|
|
|
case BQ27510G3: |
|
|
|
|
case BQ27520G1: |
|
|
|
|
case BQ27520G2: |
|
|
|
|
case BQ27520G3: |
|
|
|
|
case BQ27520G4: |
|
|
|
|
case BQ27541: |
|
|
|
|
case BQ27545: |
|
|
|
|
if (di->opts & BQ27XXX_O_OTDC) |
|
|
|
|
return flags & (BQ27XXX_FLAG_OTC | BQ27XXX_FLAG_OTD); |
|
|
|
|
case BQ27530: |
|
|
|
|
case BQ27421: |
|
|
|
|
if (di->opts & BQ27XXX_O_UTOT) |
|
|
|
|
return flags & BQ27XXX_FLAG_OT; |
|
|
|
|
default: |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
@ -1545,7 +1484,7 @@ static bool bq27xxx_battery_overtemp(struct bq27xxx_device_info *di, u16 flags) |
|
|
|
|
*/ |
|
|
|
|
static bool bq27xxx_battery_undertemp(struct bq27xxx_device_info *di, u16 flags) |
|
|
|
|
{ |
|
|
|
|
if (di->chip == BQ27530 || di->chip == BQ27421) |
|
|
|
|
if (di->opts & BQ27XXX_O_UTOT) |
|
|
|
|
return flags & BQ27XXX_FLAG_UT; |
|
|
|
|
|
|
|
|
|
return false; |
|
|
|
@ -1556,7 +1495,7 @@ static bool bq27xxx_battery_undertemp(struct bq27xxx_device_info *di, u16 flags) |
|
|
|
|
*/ |
|
|
|
|
static bool bq27xxx_battery_dead(struct bq27xxx_device_info *di, u16 flags) |
|
|
|
|
{ |
|
|
|
|
if (di->chip == BQ27000 || di->chip == BQ27010) |
|
|
|
|
if (di->opts & BQ27XXX_O_ZERO) |
|
|
|
|
return flags & (BQ27000_FLAG_EDV1 | BQ27000_FLAG_EDVF); |
|
|
|
|
else |
|
|
|
|
return flags & (BQ27XXX_FLAG_SOC1 | BQ27XXX_FLAG_SOCF); |
|
|
|
@ -1569,7 +1508,7 @@ static bool bq27xxx_battery_dead(struct bq27xxx_device_info *di, u16 flags) |
|
|
|
|
static int bq27xxx_battery_read_health(struct bq27xxx_device_info *di) |
|
|
|
|
{ |
|
|
|
|
int flags; |
|
|
|
|
bool has_singe_flag = di->chip == BQ27000 || di->chip == BQ27010; |
|
|
|
|
bool has_singe_flag = di->opts & BQ27XXX_O_ZERO; |
|
|
|
|
|
|
|
|
|
flags = bq27xxx_read(di, BQ27XXX_REG_FLAGS, has_singe_flag); |
|
|
|
|
if (flags < 0) { |
|
|
|
@ -1591,8 +1530,8 @@ static int bq27xxx_battery_read_health(struct bq27xxx_device_info *di) |
|
|
|
|
void bq27xxx_battery_update(struct bq27xxx_device_info *di) |
|
|
|
|
{ |
|
|
|
|
struct bq27xxx_reg_cache cache = {0, }; |
|
|
|
|
bool has_ci_flag = di->chip == BQ27000 || di->chip == BQ27010; |
|
|
|
|
bool has_singe_flag = di->chip == BQ27000 || di->chip == BQ27010; |
|
|
|
|
bool has_ci_flag = di->opts & BQ27XXX_O_ZERO; |
|
|
|
|
bool has_singe_flag = di->opts & BQ27XXX_O_ZERO; |
|
|
|
|
|
|
|
|
|
cache.flags = bq27xxx_read(di, BQ27XXX_REG_FLAGS, has_singe_flag); |
|
|
|
|
if ((cache.flags & 0xff) == 0xff) |
|
|
|
@ -1670,7 +1609,7 @@ static int bq27xxx_battery_current(struct bq27xxx_device_info *di, |
|
|
|
|
return curr; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (di->chip == BQ27000 || di->chip == BQ27010) { |
|
|
|
|
if (di->opts & BQ27XXX_O_ZERO) { |
|
|
|
|
flags = bq27xxx_read(di, BQ27XXX_REG_FLAGS, true); |
|
|
|
|
if (flags & BQ27000_FLAG_CHGS) { |
|
|
|
|
dev_dbg(di->dev, "negative current!\n"); |
|
|
|
@ -1691,7 +1630,7 @@ static int bq27xxx_battery_status(struct bq27xxx_device_info *di, |
|
|
|
|
{ |
|
|
|
|
int status; |
|
|
|
|
|
|
|
|
|
if (di->chip == BQ27000 || di->chip == BQ27010) { |
|
|
|
|
if (di->opts & BQ27XXX_O_ZERO) { |
|
|
|
|
if (di->cache.flags & BQ27000_FLAG_FC) |
|
|
|
|
status = POWER_SUPPLY_STATUS_FULL; |
|
|
|
|
else if (di->cache.flags & BQ27000_FLAG_CHGS) |
|
|
|
@ -1719,7 +1658,7 @@ static int bq27xxx_battery_capacity_level(struct bq27xxx_device_info *di, |
|
|
|
|
{ |
|
|
|
|
int level; |
|
|
|
|
|
|
|
|
|
if (di->chip == BQ27000 || di->chip == BQ27010) { |
|
|
|
|
if (di->opts & BQ27XXX_O_ZERO) { |
|
|
|
|
if (di->cache.flags & BQ27000_FLAG_FC) |
|
|
|
|
level = POWER_SUPPLY_CAPACITY_LEVEL_FULL; |
|
|
|
|
else if (di->cache.flags & BQ27000_FLAG_EDV1) |
|
|
|
@ -1884,7 +1823,11 @@ int bq27xxx_battery_setup(struct bq27xxx_device_info *di) |
|
|
|
|
|
|
|
|
|
INIT_DELAYED_WORK(&di->work, bq27xxx_battery_poll); |
|
|
|
|
mutex_init(&di->lock); |
|
|
|
|
di->regs = bq27xxx_regs[di->chip]; |
|
|
|
|
|
|
|
|
|
di->regs = bq27xxx_chip_data[di->chip].regs; |
|
|
|
|
di->unseal_key = bq27xxx_chip_data[di->chip].unseal_key; |
|
|
|
|
di->dm_regs = bq27xxx_chip_data[di->chip].dm_regs; |
|
|
|
|
di->opts = bq27xxx_chip_data[di->chip].opts; |
|
|
|
|
|
|
|
|
|
psy_desc = devm_kzalloc(di->dev, sizeof(*psy_desc), GFP_KERNEL); |
|
|
|
|
if (!psy_desc) |
|
|
|
@ -1892,8 +1835,8 @@ int bq27xxx_battery_setup(struct bq27xxx_device_info *di) |
|
|
|
|
|
|
|
|
|
psy_desc->name = di->name; |
|
|
|
|
psy_desc->type = POWER_SUPPLY_TYPE_BATTERY; |
|
|
|
|
psy_desc->properties = bq27xxx_battery_props[di->chip].props; |
|
|
|
|
psy_desc->num_properties = bq27xxx_battery_props[di->chip].size; |
|
|
|
|
psy_desc->properties = bq27xxx_chip_data[di->chip].props; |
|
|
|
|
psy_desc->num_properties = bq27xxx_chip_data[di->chip].props_size; |
|
|
|
|
psy_desc->get_property = bq27xxx_battery_get_property; |
|
|
|
|
psy_desc->external_power_changed = bq27xxx_external_power_changed; |
|
|
|
|
|
|
|
|
@ -1903,8 +1846,6 @@ int bq27xxx_battery_setup(struct bq27xxx_device_info *di) |
|
|
|
|
return PTR_ERR(di->bat); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
dev_info(di->dev, "support ver. %s enabled\n", DRIVER_VERSION); |
|
|
|
|
|
|
|
|
|
bq27xxx_battery_settings(di); |
|
|
|
|
bq27xxx_battery_update(di); |
|
|
|
|
|
|
|
|
@ -1938,110 +1879,6 @@ void bq27xxx_battery_teardown(struct bq27xxx_device_info *di) |
|
|
|
|
} |
|
|
|
|
EXPORT_SYMBOL_GPL(bq27xxx_battery_teardown); |
|
|
|
|
|
|
|
|
|
static int bq27xxx_battery_platform_read(struct bq27xxx_device_info *di, u8 reg, |
|
|
|
|
bool single) |
|
|
|
|
{ |
|
|
|
|
struct device *dev = di->dev; |
|
|
|
|
struct bq27xxx_platform_data *pdata = dev->platform_data; |
|
|
|
|
unsigned int timeout = 3; |
|
|
|
|
int upper, lower; |
|
|
|
|
int temp; |
|
|
|
|
|
|
|
|
|
if (!single) { |
|
|
|
|
/* Make sure the value has not changed in between reading the
|
|
|
|
|
* lower and the upper part */ |
|
|
|
|
upper = pdata->read(dev, reg + 1); |
|
|
|
|
do { |
|
|
|
|
temp = upper; |
|
|
|
|
if (upper < 0) |
|
|
|
|
return upper; |
|
|
|
|
|
|
|
|
|
lower = pdata->read(dev, reg); |
|
|
|
|
if (lower < 0) |
|
|
|
|
return lower; |
|
|
|
|
|
|
|
|
|
upper = pdata->read(dev, reg + 1); |
|
|
|
|
} while (temp != upper && --timeout); |
|
|
|
|
|
|
|
|
|
if (timeout == 0) |
|
|
|
|
return -EIO; |
|
|
|
|
|
|
|
|
|
return (upper << 8) | lower; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return pdata->read(dev, reg); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int bq27xxx_battery_platform_probe(struct platform_device *pdev) |
|
|
|
|
{ |
|
|
|
|
struct bq27xxx_device_info *di; |
|
|
|
|
struct bq27xxx_platform_data *pdata = pdev->dev.platform_data; |
|
|
|
|
|
|
|
|
|
if (!pdata) { |
|
|
|
|
dev_err(&pdev->dev, "no platform_data supplied\n"); |
|
|
|
|
return -EINVAL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!pdata->read) { |
|
|
|
|
dev_err(&pdev->dev, "no hdq read callback supplied\n"); |
|
|
|
|
return -EINVAL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!pdata->chip) { |
|
|
|
|
dev_err(&pdev->dev, "no device supplied\n"); |
|
|
|
|
return -EINVAL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
di = devm_kzalloc(&pdev->dev, sizeof(*di), GFP_KERNEL); |
|
|
|
|
if (!di) |
|
|
|
|
return -ENOMEM; |
|
|
|
|
|
|
|
|
|
platform_set_drvdata(pdev, di); |
|
|
|
|
|
|
|
|
|
di->dev = &pdev->dev; |
|
|
|
|
di->chip = pdata->chip; |
|
|
|
|
di->name = pdata->name ?: dev_name(&pdev->dev); |
|
|
|
|
di->bus.read = bq27xxx_battery_platform_read; |
|
|
|
|
|
|
|
|
|
return bq27xxx_battery_setup(di); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int bq27xxx_battery_platform_remove(struct platform_device *pdev) |
|
|
|
|
{ |
|
|
|
|
struct bq27xxx_device_info *di = platform_get_drvdata(pdev); |
|
|
|
|
|
|
|
|
|
bq27xxx_battery_teardown(di); |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static const struct platform_device_id bq27xxx_battery_platform_id_table[] = { |
|
|
|
|
{ "bq27000-battery", }, |
|
|
|
|
{ /* sentinel */ } |
|
|
|
|
}; |
|
|
|
|
MODULE_DEVICE_TABLE(platform, bq27xxx_battery_platform_id_table); |
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_OF |
|
|
|
|
static const struct of_device_id bq27xxx_battery_platform_of_match_table[] = { |
|
|
|
|
{ .compatible = "ti,bq27000" }, |
|
|
|
|
{}, |
|
|
|
|
}; |
|
|
|
|
MODULE_DEVICE_TABLE(of, bq27xxx_battery_platform_of_match_table); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
static struct platform_driver bq27xxx_battery_platform_driver = { |
|
|
|
|
.probe = bq27xxx_battery_platform_probe, |
|
|
|
|
.remove = bq27xxx_battery_platform_remove, |
|
|
|
|
.driver = { |
|
|
|
|
.name = "bq27000-battery", |
|
|
|
|
.of_match_table = of_match_ptr(bq27xxx_battery_platform_of_match_table), |
|
|
|
|
}, |
|
|
|
|
.id_table = bq27xxx_battery_platform_id_table, |
|
|
|
|
}; |
|
|
|
|
module_platform_driver(bq27xxx_battery_platform_driver); |
|
|
|
|
|
|
|
|
|
MODULE_ALIAS("platform:bq27000-battery"); |
|
|
|
|
|
|
|
|
|
MODULE_AUTHOR("Rodolfo Giometti <giometti@linux.it>"); |
|
|
|
|
MODULE_DESCRIPTION("BQ27xxx battery monitor driver"); |
|
|
|
|
MODULE_LICENSE("GPL"); |
|
|
|
|