From: Sebastian Reichel <sre@kernel.org>
To: Liam Breck <liam@networkimprov.net>
Cc: "Pali Rohár" <pali.rohar@gmail.com>,
linux-pm@vger.kernel.org, "Paul Kocialkowski" <contact@paulk.fr>,
"Liam Breck" <kernel@networkimprov.net>
Subject: Re: [RFC v2 2/5] power: supply: bq27xxx: Add chip IDs for previously shadowed chips
Date: Sat, 12 Aug 2017 17:02:43 +0200 [thread overview]
Message-ID: <20170812150243.yglsy42mpigff6gw@earth> (raw)
In-Reply-To: <20170807062216.19988-3-liam@networkimprov.net>
[-- Attachment #1: Type: text/plain, Size: 15075 bytes --]
Hi,
On Sun, Aug 06, 2017 at 11:22:13PM -0700, Liam Breck wrote:
> From: Liam Breck <kernel@networkimprov.net>
>
> For the existing feature set, these chips act like ones already listed,
> so they had been given false but functional IDs. We will be adding features
> which obsolete that shadowing, so the following IDs are added:
> BQ2752X, 531, 542, 546, 742, 425, 441, 621
Patch looks ok, but the patch description does not match the patch?
-- Sebastian
> Chip-specific features are now tracked by BQ27XXX_O_* flags in di->opts.
>
> No functional changes to the driver.
>
> Signed-off-by: Liam Breck <kernel@networkimprov.net>
> ---
> drivers/power/supply/bq27xxx_battery.c | 120 +++++++++++++++++------------
> drivers/power/supply/bq27xxx_battery_i2c.c | 16 ++--
> include/linux/power/bq27xxx_battery.h | 9 +++
> 3 files changed, 86 insertions(+), 59 deletions(-)
>
> diff --git a/drivers/power/supply/bq27xxx_battery.c b/drivers/power/supply/bq27xxx_battery.c
> index dd84e3d9..b186216d 100644
> --- a/drivers/power/supply/bq27xxx_battery.c
> +++ b/drivers/power/supply/bq27xxx_battery.c
> @@ -221,6 +221,7 @@ static u8
> [BQ27XXX_REG_AP] = INVALID_REG_ADDR,
> BQ27XXX_DM_REG_ROWS,
> },
> +#define bq2752x_regs bq2751x_regs
> bq27500_regs[BQ27XXX_REG_MAX] = {
> [BQ27XXX_REG_CTRL] = 0x00,
> [BQ27XXX_REG_TEMP] = 0x06,
> @@ -401,6 +402,7 @@ static u8
> [BQ27XXX_REG_AP] = 0x24,
> BQ27XXX_DM_REG_ROWS,
> },
> +#define bq27531_regs bq27530_regs
> bq27541_regs[BQ27XXX_REG_MAX] = {
> [BQ27XXX_REG_CTRL] = 0x00,
> [BQ27XXX_REG_TEMP] = 0x06,
> @@ -421,6 +423,9 @@ static u8
> [BQ27XXX_REG_AP] = 0x24,
> BQ27XXX_DM_REG_ROWS,
> },
> +#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,
> @@ -461,6 +466,9 @@ static u8
> [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_props[] = {
> POWER_SUPPLY_PROP_STATUS,
> @@ -539,6 +547,7 @@ static enum power_supply_property bq2751x_props[] = {
> POWER_SUPPLY_PROP_HEALTH,
> POWER_SUPPLY_PROP_MANUFACTURER,
> };
> +#define bq2752x_props bq2751x_props
>
> static enum power_supply_property bq27500_props[] = {
> POWER_SUPPLY_PROP_STATUS,
> @@ -716,6 +725,7 @@ static enum power_supply_property bq27530_props[] = {
> POWER_SUPPLY_PROP_CYCLE_COUNT,
> POWER_SUPPLY_PROP_MANUFACTURER,
> };
> +#define bq27531_props bq27530_props
>
> static enum power_supply_property bq27541_props[] = {
> POWER_SUPPLY_PROP_STATUS,
> @@ -735,6 +745,9 @@ static enum power_supply_property bq27541_props[] = {
> 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 bq27545_props[] = {
> POWER_SUPPLY_PROP_STATUS,
> @@ -768,33 +781,50 @@ static enum power_supply_property bq27421_props[] = {
> 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
>
> -#define BQ27XXX_DATA(ref) { \
> +#define BQ27XXX_O_ZERO 0x00000001
> +#define BQ27XXX_O_OTDC 0x00000002
> +#define BQ27XXX_O_UTOT 0x00000004
> +
> +#define BQ27XXX_DATA(ref, opt) { \
> + .opts = (opt), \
> .regs = ref##_regs, \
> .props = ref##_props, \
> .props_size = ARRAY_SIZE(ref##_props) }
>
> static struct {
> + u32 opts;
> u8 *regs;
> enum power_supply_property *props;
> size_t props_size;
> } bq27xxx_chip_data[] = {
> - [BQ27000] = BQ27XXX_DATA(bq27000),
> - [BQ27010] = BQ27XXX_DATA(bq27010),
> - [BQ2750X] = BQ27XXX_DATA(bq2750x),
> - [BQ2751X] = BQ27XXX_DATA(bq2751x),
> - [BQ27500] = BQ27XXX_DATA(bq27500),
> - [BQ27510G1] = BQ27XXX_DATA(bq27510g1),
> - [BQ27510G2] = BQ27XXX_DATA(bq27510g2),
> - [BQ27510G3] = BQ27XXX_DATA(bq27510g3),
> - [BQ27520G1] = BQ27XXX_DATA(bq27520g1),
> - [BQ27520G2] = BQ27XXX_DATA(bq27520g2),
> - [BQ27520G3] = BQ27XXX_DATA(bq27520g3),
> - [BQ27520G4] = BQ27XXX_DATA(bq27520g4),
> - [BQ27530] = BQ27XXX_DATA(bq27530),
> - [BQ27541] = BQ27XXX_DATA(bq27541),
> - [BQ27545] = BQ27XXX_DATA(bq27545),
> - [BQ27421] = BQ27XXX_DATA(bq27421),
> + [BQ27000] = BQ27XXX_DATA(bq27000, BQ27XXX_O_ZERO),
> + [BQ27010] = BQ27XXX_DATA(bq27010, BQ27XXX_O_ZERO),
> + [BQ2750X] = BQ27XXX_DATA(bq2750x, BQ27XXX_O_OTDC),
> + [BQ2751X] = BQ27XXX_DATA(bq2751x, BQ27XXX_O_OTDC),
> + [BQ2752X] = BQ27XXX_DATA(bq2752x, BQ27XXX_O_OTDC),
> + [BQ27500] = BQ27XXX_DATA(bq27500, BQ27XXX_O_OTDC),
> + [BQ27510G1] = BQ27XXX_DATA(bq27510g1, BQ27XXX_O_OTDC),
> + [BQ27510G2] = BQ27XXX_DATA(bq27510g2, BQ27XXX_O_OTDC),
> + [BQ27510G3] = BQ27XXX_DATA(bq27510g3, BQ27XXX_O_OTDC),
> + [BQ27520G1] = BQ27XXX_DATA(bq27520g1, BQ27XXX_O_OTDC),
> + [BQ27520G2] = BQ27XXX_DATA(bq27520g2, BQ27XXX_O_OTDC),
> + [BQ27520G3] = BQ27XXX_DATA(bq27520g3, BQ27XXX_O_OTDC),
> + [BQ27520G4] = BQ27XXX_DATA(bq27520g4, BQ27XXX_O_OTDC),
> + [BQ27530] = BQ27XXX_DATA(bq27530, BQ27XXX_O_UTOT),
> + [BQ27531] = BQ27XXX_DATA(bq27531, BQ27XXX_O_UTOT),
> + [BQ27541] = BQ27XXX_DATA(bq27541, BQ27XXX_O_OTDC),
> + [BQ27542] = BQ27XXX_DATA(bq27542, BQ27XXX_O_OTDC),
> + [BQ27546] = BQ27XXX_DATA(bq27546, BQ27XXX_O_OTDC),
> + [BQ27742] = BQ27XXX_DATA(bq27742, BQ27XXX_O_OTDC),
> + [BQ27545] = BQ27XXX_DATA(bq27545, BQ27XXX_O_OTDC),
> + [BQ27421] = BQ27XXX_DATA(bq27421, BQ27XXX_O_UTOT),
> + [BQ27425] = BQ27XXX_DATA(bq27425, BQ27XXX_O_UTOT),
> + [BQ27441] = BQ27XXX_DATA(bq27441, BQ27XXX_O_UTOT),
> + [BQ27621] = BQ27XXX_DATA(bq27621, BQ27XXX_O_UTOT),
> };
>
> static DEFINE_MUTEX(bq27xxx_list_lock);
> @@ -1327,7 +1357,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);
> @@ -1353,7 +1383,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;
> @@ -1369,7 +1399,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;
> @@ -1395,7 +1425,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);
> @@ -1405,7 +1435,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;
> @@ -1427,7 +1457,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;
> @@ -1449,7 +1479,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;
> @@ -1506,7 +1536,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;
> @@ -1517,26 +1547,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;
> }
>
> /*
> @@ -1544,7 +1560,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;
> @@ -1555,7 +1571,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);
> @@ -1568,7 +1584,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) {
> @@ -1590,8 +1606,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)
> @@ -1669,7 +1685,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");
> @@ -1690,7 +1706,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)
> @@ -1718,7 +1734,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)
> @@ -1883,7 +1899,9 @@ int bq27xxx_battery_setup(struct bq27xxx_device_info *di)
>
> INIT_DELAYED_WORK(&di->work, bq27xxx_battery_poll);
> mutex_init(&di->lock);
> +
> di->regs = bq27xxx_chip_data[di->chip].regs;
> + di->opts = bq27xxx_chip_data[di->chip].opts;
>
> psy_desc = devm_kzalloc(di->dev, sizeof(*psy_desc), GFP_KERNEL);
> if (!psy_desc)
> diff --git a/drivers/power/supply/bq27xxx_battery_i2c.c b/drivers/power/supply/bq27xxx_battery_i2c.c
> index a5972214..0b11ed47 100644
> --- a/drivers/power/supply/bq27xxx_battery_i2c.c
> +++ b/drivers/power/supply/bq27xxx_battery_i2c.c
> @@ -230,7 +230,7 @@ static const struct i2c_device_id bq27xxx_i2c_id_table[] = {
> { "bq27210", BQ27010 },
> { "bq27500", BQ2750X },
> { "bq27510", BQ2751X },
> - { "bq27520", BQ2751X },
> + { "bq27520", BQ2752X },
> { "bq27500-1", BQ27500 },
> { "bq27510g1", BQ27510G1 },
> { "bq27510g2", BQ27510G2 },
> @@ -240,16 +240,16 @@ static const struct i2c_device_id bq27xxx_i2c_id_table[] = {
> { "bq27520g3", BQ27520G3 },
> { "bq27520g4", BQ27520G4 },
> { "bq27530", BQ27530 },
> - { "bq27531", BQ27530 },
> + { "bq27531", BQ27531 },
> { "bq27541", BQ27541 },
> - { "bq27542", BQ27541 },
> - { "bq27546", BQ27541 },
> - { "bq27742", BQ27541 },
> + { "bq27542", BQ27542 },
> + { "bq27546", BQ27546 },
> + { "bq27742", BQ27742 },
> { "bq27545", BQ27545 },
> { "bq27421", BQ27421 },
> - { "bq27425", BQ27421 },
> - { "bq27441", BQ27421 },
> - { "bq27621", BQ27421 },
> + { "bq27425", BQ27425 },
> + { "bq27441", BQ27441 },
> + { "bq27621", BQ27621 },
> {},
> };
> MODULE_DEVICE_TABLE(i2c, bq27xxx_i2c_id_table);
> diff --git a/include/linux/power/bq27xxx_battery.h b/include/linux/power/bq27xxx_battery.h
> index 11e11685..77fe94f1 100644
> --- a/include/linux/power/bq27xxx_battery.h
> +++ b/include/linux/power/bq27xxx_battery.h
> @@ -6,6 +6,7 @@ enum bq27xxx_chip {
> BQ27010, /* bq27010, bq27210 */
> BQ2750X, /* bq27500 deprecated alias */
> BQ2751X, /* bq27510, bq27520 deprecated alias */
> + BQ2752X,
> BQ27500, /* bq27500/1 */
> BQ27510G1, /* bq27510G1 */
> BQ27510G2, /* bq27510G2 */
> @@ -15,9 +16,16 @@ enum bq27xxx_chip {
> BQ27520G3, /* bq27520G3 */
> BQ27520G4, /* bq27520G4 */
> BQ27530, /* bq27530, bq27531 */
> + BQ27531,
> BQ27541, /* bq27541, bq27542, bq27546, bq27742 */
> + BQ27542,
> + BQ27546,
> + BQ27742,
> BQ27545, /* bq27545 */
> BQ27421, /* bq27421, bq27425, bq27441, bq27621 */
> + BQ27425,
> + BQ27441,
> + BQ27621,
> };
>
> /**
> @@ -64,6 +72,7 @@ struct bq27xxx_device_info {
> int id;
> enum bq27xxx_chip chip;
> bool ram_chip;
> + u32 opts;
> const char *name;
> struct bq27xxx_dm_reg *dm_regs;
> u32 unseal_key;
> --
> 2.13.2
>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
next prev parent reply other threads:[~2017-08-12 15:02 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-08-07 6:22 [RFC v2 0/5] bq27xxx_battery data memory update Liam Breck
2017-08-07 6:22 ` [RFC v2 1/5] power: supply: bq27xxx: Create single chip data table Liam Breck
2017-08-09 16:08 ` Sebastian Reichel
2017-08-12 0:52 ` Liam Breck
2017-08-12 16:39 ` Sebastian Reichel
2017-08-07 6:22 ` [RFC v2 2/5] power: supply: bq27xxx: Add chip IDs for previously shadowed chips Liam Breck
2017-08-12 15:02 ` Sebastian Reichel [this message]
2017-08-12 17:56 ` Liam Breck
2017-08-12 18:45 ` Sebastian Reichel
2017-08-07 6:22 ` [RFC v2 3/5] power: supply: bq27xxx: Enable data memory update for certain chips Liam Breck
2017-08-12 16:04 ` Sebastian Reichel
2017-08-12 18:00 ` Liam Breck
2017-08-12 18:57 ` Sebastian Reichel
2017-08-07 6:22 ` [RFC v2 4/5] power: supply: bq27xxx: Flag identical chip data when in debug mode Liam Breck
2017-08-12 16:25 ` Sebastian Reichel
2017-08-12 18:35 ` Liam Breck
2017-08-12 18:40 ` Liam Breck
2017-08-07 6:22 ` [RFC v2 5/5] power: supply: bq27xxx: Remove duplicate chip data arrays Liam Breck
2017-08-12 16:22 ` Sebastian Reichel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170812150243.yglsy42mpigff6gw@earth \
--to=sre@kernel.org \
--cc=contact@paulk.fr \
--cc=kernel@networkimprov.net \
--cc=liam@networkimprov.net \
--cc=linux-pm@vger.kernel.org \
--cc=pali.rohar@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox