All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 0/5] bq27xxx_battery data memory update
@ 2017-08-24  3:36 Liam Breck
  2017-08-24  3:36 ` [PATCH v3 1/5] power: supply: bq27xxx: Create single chip data table Liam Breck
                   ` (5 more replies)
  0 siblings, 6 replies; 63+ messages in thread
From: Liam Breck @ 2017-08-24  3:36 UTC (permalink / raw)
  To: Sebastian Reichel, Pali Rohár, linux-pm; +Cc: Paul Kocialkowski

Overview:
* Reorganizes chip data definitions
* Enables features landed in these patches:
  dt-bindings: power: supply: bq27xxx: Add monitored-battery documentation
  power: supply: bq27xxx: Add chip data memory read/write support
  power: supply: bq27xxx: Add power_supply_battery_info support
* Supports the following chips (only BQ27425 is active)
  BQ27500, 545, 425, 421, 441, 621

Changes in v3:
* BQ27425 tested; workaround minor chip bug
* Dropped driver_version
* Fixed dbg_dupes logic for .props & .dm_regs
* Dropped two props array dupes

Changes in v2:
* Added di->opts flags for remaining chip features
* Commented out untested bq27xxx_dm_regs parameters
* Changed dbg_dupes to run only once

Notes on v1:
* Not fully tested (hence RFC tag)


Liam Breck (5):
  power: supply: bq27xxx: Create single chip data table
  power: supply: bq27xxx: Add chip IDs for previously shadowed chips
  power: supply: bq27xxx: Enable data memory update for certain chips
  power: supply: bq27xxx: Flag identical chip data when in debug mode
  power: supply: bq27xxx: Remove duplicate chip data arrays

 drivers/power/supply/bq27xxx_battery.c     | 514 ++++++++++++++---------------
 drivers/power/supply/bq27xxx_battery_i2c.c |  16 +-
 include/linux/power/bq27xxx_battery.h      |  10 +-
 3 files changed, 265 insertions(+), 275 deletions(-)

-- 
2.13.2

^ permalink raw reply	[flat|nested] 63+ messages in thread

* [PATCH v3 1/5] power: supply: bq27xxx: Create single chip data table
  2017-08-24  3:36 [PATCH v3 0/5] bq27xxx_battery data memory update Liam Breck
@ 2017-08-24  3:36 ` Liam Breck
  2017-08-24  3:36 ` [PATCH v3 2/5] power: supply: bq27xxx: Add chip IDs for previously shadowed chips Liam Breck
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 63+ messages in thread
From: Liam Breck @ 2017-08-24  3:36 UTC (permalink / raw)
  To: Sebastian Reichel, Pali Rohár, linux-pm
  Cc: Paul Kocialkowski, Liam Breck

From: Liam Breck <kernel@networkimprov.net>

To support new features which require different data for each chip, we
unify the bq27xxx_regs and bq27xxx_battery_props tables into a single one.

No functional changes to the driver.

Signed-off-by: Liam Breck <kernel@networkimprov.net>
---
 drivers/power/supply/bq27xxx_battery.c | 121 ++++++++++++++++-----------------
 1 file changed, 60 insertions(+), 61 deletions(-)

diff --git a/drivers/power/supply/bq27xxx_battery.c b/drivers/power/supply/bq27xxx_battery.c
index ed44439d..dd84e3d9 100644
--- a/drivers/power/supply/bq27xxx_battery.c
+++ b/drivers/power/supply/bq27xxx_battery.c
@@ -132,8 +132,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 +157,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 +181,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,7 +201,7 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = {
 		[BQ27XXX_REG_AP] = INVALID_REG_ADDR,
 		BQ27XXX_DM_REG_ROWS,
 	},
-	[BQ2751X] = {
+	bq2751x_regs[BQ27XXX_REG_MAX] = {
 		[BQ27XXX_REG_CTRL] = 0x00,
 		[BQ27XXX_REG_TEMP] = 0x06,
 		[BQ27XXX_REG_INT_TEMP] = 0x28,
@@ -221,7 +221,7 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = {
 		[BQ27XXX_REG_AP] = INVALID_REG_ADDR,
 		BQ27XXX_DM_REG_ROWS,
 	},
-	[BQ27500] = {
+	bq27500_regs[BQ27XXX_REG_MAX] = {
 		[BQ27XXX_REG_CTRL] = 0x00,
 		[BQ27XXX_REG_TEMP] = 0x06,
 		[BQ27XXX_REG_INT_TEMP] = INVALID_REG_ADDR,
@@ -241,7 +241,7 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = {
 		[BQ27XXX_REG_AP] = 0x24,
 		BQ27XXX_DM_REG_ROWS,
 	},
-	[BQ27510G1] = {
+	bq27510g1_regs[BQ27XXX_REG_MAX] = {
 		[BQ27XXX_REG_CTRL] = 0x00,
 		[BQ27XXX_REG_TEMP] = 0x06,
 		[BQ27XXX_REG_INT_TEMP] = INVALID_REG_ADDR,
@@ -261,7 +261,7 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = {
 		[BQ27XXX_REG_AP] = 0x24,
 		BQ27XXX_DM_REG_ROWS,
 	},
-	[BQ27510G2] = {
+	bq27510g2_regs[BQ27XXX_REG_MAX] = {
 		[BQ27XXX_REG_CTRL] = 0x00,
 		[BQ27XXX_REG_TEMP] = 0x06,
 		[BQ27XXX_REG_INT_TEMP] = INVALID_REG_ADDR,
@@ -281,7 +281,7 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = {
 		[BQ27XXX_REG_AP] = 0x24,
 		BQ27XXX_DM_REG_ROWS,
 	},
-	[BQ27510G3] = {
+	bq27510g3_regs[BQ27XXX_REG_MAX] = {
 		[BQ27XXX_REG_CTRL] = 0x00,
 		[BQ27XXX_REG_TEMP] = 0x06,
 		[BQ27XXX_REG_INT_TEMP] = 0x28,
@@ -301,7 +301,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 +321,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 +341,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 +361,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 +381,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 +401,7 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = {
 		[BQ27XXX_REG_AP] = 0x24,
 		BQ27XXX_DM_REG_ROWS,
 	},
-	[BQ27541] = {
+	bq27541_regs[BQ27XXX_REG_MAX] = {
 		[BQ27XXX_REG_CTRL] = 0x00,
 		[BQ27XXX_REG_TEMP] = 0x06,
 		[BQ27XXX_REG_INT_TEMP] = 0x28,
@@ -421,7 +421,7 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = {
 		[BQ27XXX_REG_AP] = 0x24,
 		BQ27XXX_DM_REG_ROWS,
 	},
-	[BQ27545] = {
+	bq27545_regs[BQ27XXX_REG_MAX] = {
 		[BQ27XXX_REG_CTRL] = 0x00,
 		[BQ27XXX_REG_TEMP] = 0x06,
 		[BQ27XXX_REG_INT_TEMP] = 0x28,
@@ -441,7 +441,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 +460,9 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = {
 		[BQ27XXX_REG_DCAP] = 0x3c,
 		[BQ27XXX_REG_AP] = 0x18,
 		BQ27XXX_DM_REG_ROWS,
-	},
-};
+	};
 
-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 +484,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,7 +504,7 @@ static enum power_supply_property bq27010_battery_props[] = {
 	POWER_SUPPLY_PROP_MANUFACTURER,
 };
 
-static enum power_supply_property bq2750x_battery_props[] = {
+static enum power_supply_property bq2750x_props[] = {
 	POWER_SUPPLY_PROP_STATUS,
 	POWER_SUPPLY_PROP_PRESENT,
 	POWER_SUPPLY_PROP_VOLTAGE_NOW,
@@ -523,7 +522,7 @@ static enum power_supply_property bq2750x_battery_props[] = {
 	POWER_SUPPLY_PROP_MANUFACTURER,
 };
 
-static enum power_supply_property bq2751x_battery_props[] = {
+static enum power_supply_property bq2751x_props[] = {
 	POWER_SUPPLY_PROP_STATUS,
 	POWER_SUPPLY_PROP_PRESENT,
 	POWER_SUPPLY_PROP_VOLTAGE_NOW,
@@ -541,7 +540,7 @@ static enum power_supply_property bq2751x_battery_props[] = {
 	POWER_SUPPLY_PROP_MANUFACTURER,
 };
 
-static enum power_supply_property bq27500_battery_props[] = {
+static enum power_supply_property bq27500_props[] = {
 	POWER_SUPPLY_PROP_STATUS,
 	POWER_SUPPLY_PROP_PRESENT,
 	POWER_SUPPLY_PROP_VOLTAGE_NOW,
@@ -562,7 +561,7 @@ static enum power_supply_property bq27500_battery_props[] = {
 	POWER_SUPPLY_PROP_MANUFACTURER,
 };
 
-static enum power_supply_property bq27510g1_battery_props[] = {
+static enum power_supply_property bq27510g1_props[] = {
 	POWER_SUPPLY_PROP_STATUS,
 	POWER_SUPPLY_PROP_PRESENT,
 	POWER_SUPPLY_PROP_VOLTAGE_NOW,
@@ -583,7 +582,7 @@ static enum power_supply_property bq27510g1_battery_props[] = {
 	POWER_SUPPLY_PROP_MANUFACTURER,
 };
 
-static enum power_supply_property bq27510g2_battery_props[] = {
+static enum power_supply_property bq27510g2_props[] = {
 	POWER_SUPPLY_PROP_STATUS,
 	POWER_SUPPLY_PROP_PRESENT,
 	POWER_SUPPLY_PROP_VOLTAGE_NOW,
@@ -604,7 +603,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 bq27510g3_props[] = {
 	POWER_SUPPLY_PROP_STATUS,
 	POWER_SUPPLY_PROP_PRESENT,
 	POWER_SUPPLY_PROP_VOLTAGE_NOW,
@@ -622,7 +621,7 @@ static enum power_supply_property bq27510g3_battery_props[] = {
 	POWER_SUPPLY_PROP_MANUFACTURER,
 };
 
-static enum power_supply_property bq27520g1_battery_props[] = {
+static enum power_supply_property bq27520g1_props[] = {
 	POWER_SUPPLY_PROP_STATUS,
 	POWER_SUPPLY_PROP_PRESENT,
 	POWER_SUPPLY_PROP_VOLTAGE_NOW,
@@ -642,7 +641,7 @@ static enum power_supply_property bq27520g1_battery_props[] = {
 	POWER_SUPPLY_PROP_MANUFACTURER,
 };
 
-static enum power_supply_property bq27520g2_battery_props[] = {
+static enum power_supply_property bq27520g2_props[] = {
 	POWER_SUPPLY_PROP_STATUS,
 	POWER_SUPPLY_PROP_PRESENT,
 	POWER_SUPPLY_PROP_VOLTAGE_NOW,
@@ -663,7 +662,7 @@ static enum power_supply_property bq27520g2_battery_props[] = {
 	POWER_SUPPLY_PROP_MANUFACTURER,
 };
 
-static enum power_supply_property bq27520g3_battery_props[] = {
+static enum power_supply_property bq27520g3_props[] = {
 	POWER_SUPPLY_PROP_STATUS,
 	POWER_SUPPLY_PROP_PRESENT,
 	POWER_SUPPLY_PROP_VOLTAGE_NOW,
@@ -683,7 +682,7 @@ static enum power_supply_property bq27520g3_battery_props[] = {
 	POWER_SUPPLY_PROP_MANUFACTURER,
 };
 
-static enum power_supply_property bq27520g4_battery_props[] = {
+static enum power_supply_property bq27520g4_props[] = {
 	POWER_SUPPLY_PROP_STATUS,
 	POWER_SUPPLY_PROP_PRESENT,
 	POWER_SUPPLY_PROP_VOLTAGE_NOW,
@@ -700,7 +699,7 @@ static enum power_supply_property bq27520g4_battery_props[] = {
 	POWER_SUPPLY_PROP_MANUFACTURER,
 };
 
-static enum power_supply_property bq27530_battery_props[] = {
+static enum power_supply_property bq27530_props[] = {
 	POWER_SUPPLY_PROP_STATUS,
 	POWER_SUPPLY_PROP_PRESENT,
 	POWER_SUPPLY_PROP_VOLTAGE_NOW,
@@ -718,7 +717,7 @@ static enum power_supply_property bq27530_battery_props[] = {
 	POWER_SUPPLY_PROP_MANUFACTURER,
 };
 
-static enum power_supply_property bq27541_battery_props[] = {
+static enum power_supply_property bq27541_props[] = {
 	POWER_SUPPLY_PROP_STATUS,
 	POWER_SUPPLY_PROP_PRESENT,
 	POWER_SUPPLY_PROP_VOLTAGE_NOW,
@@ -737,7 +736,7 @@ static enum power_supply_property bq27541_battery_props[] = {
 	POWER_SUPPLY_PROP_MANUFACTURER,
 };
 
-static enum power_supply_property bq27545_battery_props[] = {
+static enum power_supply_property bq27545_props[] = {
 	POWER_SUPPLY_PROP_STATUS,
 	POWER_SUPPLY_PROP_PRESENT,
 	POWER_SUPPLY_PROP_VOLTAGE_NOW,
@@ -755,7 +754,7 @@ static enum power_supply_property bq27545_battery_props[] = {
 	POWER_SUPPLY_PROP_MANUFACTURER,
 };
 
-static enum power_supply_property bq27421_battery_props[] = {
+static enum power_supply_property bq27421_props[] = {
 	POWER_SUPPLY_PROP_STATUS,
 	POWER_SUPPLY_PROP_PRESENT,
 	POWER_SUPPLY_PROP_VOLTAGE_NOW,
@@ -770,32 +769,32 @@ static enum power_supply_property bq27421_battery_props[] = {
 	POWER_SUPPLY_PROP_MANUFACTURER,
 };
 
-#define BQ27XXX_PROP(_id, _prop)		\
-	[_id] = {				\
-		.props = _prop,			\
-		.size = ARRAY_SIZE(_prop),	\
-	}
+#define BQ27XXX_DATA(ref) {			\
+	.regs  = ref##_regs,			\
+	.props = ref##_props,			\
+	.props_size = ARRAY_SIZE(ref##_props) }
 
 static struct {
+	u8 *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),
+	[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),
 };
 
 static DEFINE_MUTEX(bq27xxx_list_lock);
@@ -1884,7 +1883,7 @@ 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;
 
 	psy_desc = devm_kzalloc(di->dev, sizeof(*psy_desc), GFP_KERNEL);
 	if (!psy_desc)
@@ -1892,8 +1891,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;
 
-- 
2.13.2

^ permalink raw reply	[flat|nested] 63+ messages in thread

* [PATCH v3 2/5] power: supply: bq27xxx: Add chip IDs for previously shadowed chips
  2017-08-24  3:36 [PATCH v3 0/5] bq27xxx_battery data memory update Liam Breck
  2017-08-24  3:36 ` [PATCH v3 1/5] power: supply: bq27xxx: Create single chip data table Liam Breck
@ 2017-08-24  3:36 ` Liam Breck
  2017-08-24  3:36 ` [PATCH v3 3/5] power: supply: bq27xxx: Enable data memory update for certain chips Liam Breck
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 63+ messages in thread
From: Liam Breck @ 2017-08-24  3:36 UTC (permalink / raw)
  To: Sebastian Reichel, Pali Rohár, linux-pm
  Cc: Paul Kocialkowski, Liam Breck

From: Liam Breck <kernel@networkimprov.net>

For the existing features, these chips act like others already ID'd,
so they had false but functional IDs. We will be adding features
which require correct IDs, so the following IDs are added:
BQ2752X, 531, 542, 546, 742, 425, 441, 621

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

^ permalink raw reply	[flat|nested] 63+ messages in thread

* [PATCH v3 3/5] power: supply: bq27xxx: Enable data memory update for certain chips
  2017-08-24  3:36 [PATCH v3 0/5] bq27xxx_battery data memory update Liam Breck
  2017-08-24  3:36 ` [PATCH v3 1/5] power: supply: bq27xxx: Create single chip data table Liam Breck
  2017-08-24  3:36 ` [PATCH v3 2/5] power: supply: bq27xxx: Add chip IDs for previously shadowed chips Liam Breck
@ 2017-08-24  3:36 ` Liam Breck
  2017-08-24  3:36 ` [PATCH v3 4/5] power: supply: bq27xxx: Flag identical chip data when in debug mode Liam Breck
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 63+ messages in thread
From: Liam Breck @ 2017-08-24  3:36 UTC (permalink / raw)
  To: Sebastian Reichel, Pali Rohár, linux-pm
  Cc: Paul Kocialkowski, Liam Breck

From: Liam Breck <kernel@networkimprov.net>

Support data memory update on BQ27425. Parameters from TI datasheets are also
provided for BQ27500, 545, 421, 441, 621; however these are commented out,
as they are not tested.

Add BQ27XXX_O_CFGUP & _O_RAM for use in bq27xxx_chip_data[n].opts
and by data memory update functions.

Signed-off-by: Liam Breck <kernel@networkimprov.net>
---
 drivers/power/supply/bq27xxx_battery.c | 175 ++++++++++++++++++++++++---------
 include/linux/power/bq27xxx_battery.h  |   1 -
 2 files changed, 126 insertions(+), 50 deletions(-)

diff --git a/drivers/power/supply/bq27xxx_battery.c b/drivers/power/supply/bq27xxx_battery.c
index b186216d..f2e55b90 100644
--- a/drivers/power/supply/bq27xxx_battery.c
+++ b/drivers/power/supply/bq27xxx_battery.c
@@ -58,8 +58,6 @@
 
 #include <linux/power/bq27xxx_battery.h>
 
-#define DRIVER_VERSION		"1.2.0"
-
 #define BQ27XXX_MANUFACTURER	"Texas Instruments"
 
 /* BQ27XXX Flags */
@@ -785,46 +783,138 @@ static enum power_supply_property bq27421_props[] = {
 #define bq27441_props bq27421_props
 #define bq27621_props bq27421_props
 
+struct bq27xxx_dm_reg {
+	u8 subclass_id;
+	u8 offset;
+	u8 bytes;
+	u16 min, max;
+};
+
+enum bq27xxx_dm_reg_id {
+	BQ27XXX_DM_DESIGN_CAPACITY = 0,
+	BQ27XXX_DM_DESIGN_ENERGY,
+	BQ27XXX_DM_TERMINATE_VOLTAGE,
+};
+
+#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
+
+/* 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
+
+#if 0 /* not yet tested */
+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 },
+};
+#else
+#define bq27421_dm_regs 0
+#endif
+
+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, opt) {		\
+#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 props_size;
 } bq27xxx_chip_data[] = {
-	[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),
+	[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);
@@ -834,13 +924,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
@@ -873,12 +956,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",
@@ -1121,9 +1198,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 "
@@ -1159,7 +1236,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;
 	}
@@ -1191,7 +1268,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)
@@ -1290,7 +1367,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 */
 	}
@@ -1900,8 +1977,10 @@ 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;
+	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)
@@ -1920,8 +1999,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);
 
diff --git a/include/linux/power/bq27xxx_battery.h b/include/linux/power/bq27xxx_battery.h
index 77fe94f1..8a8a3f61 100644
--- a/include/linux/power/bq27xxx_battery.h
+++ b/include/linux/power/bq27xxx_battery.h
@@ -71,7 +71,6 @@ struct bq27xxx_device_info {
 	struct device *dev;
 	int id;
 	enum bq27xxx_chip chip;
-	bool ram_chip;
 	u32 opts;
 	const char *name;
 	struct bq27xxx_dm_reg *dm_regs;
-- 
2.13.2

^ permalink raw reply	[flat|nested] 63+ messages in thread

* [PATCH v3 4/5] power: supply: bq27xxx: Flag identical chip data when in debug mode
  2017-08-24  3:36 [PATCH v3 0/5] bq27xxx_battery data memory update Liam Breck
                   ` (2 preceding siblings ...)
  2017-08-24  3:36 ` [PATCH v3 3/5] power: supply: bq27xxx: Enable data memory update for certain chips Liam Breck
@ 2017-08-24  3:36 ` Liam Breck
  2017-08-24  3:36 ` [PATCH v3 5/5] power: supply: bq27xxx: Remove duplicate chip data arrays Liam Breck
  2017-08-29 10:54 ` [PATCH v3 0/5] bq27xxx_battery data memory update Sebastian Reichel
  5 siblings, 0 replies; 63+ messages in thread
From: Liam Breck @ 2017-08-24  3:36 UTC (permalink / raw)
  To: Sebastian Reichel, Pali Rohár, linux-pm
  Cc: Paul Kocialkowski, Liam Breck

From: Liam Breck <kernel@networkimprov.net>

The driver has 13 unique register maps, several of which are shared
by multiple chips. When adding support for a new chip, it's easy to
add a duplicate map by mistake.

In debug mode we now scan bq27xxx_chip_data[n].regs/props/dm_regs for
duplicates.

Signed-off-by: Liam Breck <kernel@networkimprov.net>
---
 drivers/power/supply/bq27xxx_battery.c | 39 +++++++++++++++++++++++++++++++++-
 1 file changed, 38 insertions(+), 1 deletion(-)

diff --git a/drivers/power/supply/bq27xxx_battery.c b/drivers/power/supply/bq27xxx_battery.c
index f2e55b90..3a6b9549 100644
--- a/drivers/power/supply/bq27xxx_battery.c
+++ b/drivers/power/supply/bq27xxx_battery.c
@@ -883,7 +883,7 @@ static struct bq27xxx_dm_reg bq27621_dm_regs[] = {
 	.props = ref##_props,			\
 	.props_size = ARRAY_SIZE(ref##_props) }
 
-static struct {
+static struct bq27xxx_chip_datum {
 	u32 opts;
 	u32 unseal_key;
 	u8 *regs;
@@ -917,6 +917,39 @@ static struct {
 	[BQ27621]   = BQ27XXX_DATA(bq27621,   0x80008000, BQ27XXX_O_UTOT | BQ27XXX_O_CFGUP | BQ27XXX_O_RAM),
 };
 
+static void __maybe_unused bq27xxx_battery_dbg_dupes(struct bq27xxx_device_info *di)
+{
+	static bool once = false;
+	const size_t max = ARRAY_SIZE(bq27xxx_chip_data);
+	const char * const msg = "bq27xxx_chip_data[%d].%s & [%d].%s are identical\n";
+	struct bq27xxx_chip_datum *a, *b;
+	int i, j;
+
+	if (once)
+		return;
+	once = true;
+
+	for (i = 1; i < max-1; i++) {
+		a = bq27xxx_chip_data + i;
+
+		for (j = i+1; j < max; j++) {
+			b = bq27xxx_chip_data + j;
+
+			if (a->regs != b->regs &&
+			    !memcmp(a->regs, b->regs, sizeof(bq27000_regs)))
+				dev_warn(di->dev, msg, i, "regs", j, "regs");
+
+			if (a->props != b->props && a->props_size == b->props_size &&
+			    !memcmp(a->props, b->props, a->props_size * sizeof(a->props[0])))
+				dev_warn(di->dev, msg, i, "props", j, "props");
+
+			if (a->dm_regs != b->dm_regs && a->dm_regs && b->dm_regs &&
+			    !memcmp(a->dm_regs, b->dm_regs, sizeof(bq27425_dm_regs)))
+				dev_warn(di->dev, msg, i, "dm_regs", j, "dm_regs");
+		}
+	}
+}
+
 static DEFINE_MUTEX(bq27xxx_list_lock);
 static LIST_HEAD(bq27xxx_battery_devices);
 
@@ -1974,6 +2007,10 @@ int bq27xxx_battery_setup(struct bq27xxx_device_info *di)
 		.drv_data = di,
 	};
 
+#ifdef DEBUG
+	bq27xxx_battery_dbg_dupes(di);
+#endif
+
 	INIT_DELAYED_WORK(&di->work, bq27xxx_battery_poll);
 	mutex_init(&di->lock);
 
-- 
2.13.2

^ permalink raw reply	[flat|nested] 63+ messages in thread

* [PATCH v3 5/5] power: supply: bq27xxx: Remove duplicate chip data arrays
  2017-08-24  3:36 [PATCH v3 0/5] bq27xxx_battery data memory update Liam Breck
                   ` (3 preceding siblings ...)
  2017-08-24  3:36 ` [PATCH v3 4/5] power: supply: bq27xxx: Flag identical chip data when in debug mode Liam Breck
@ 2017-08-24  3:36 ` Liam Breck
  2017-08-29 10:54 ` [PATCH v3 0/5] bq27xxx_battery data memory update Sebastian Reichel
  5 siblings, 0 replies; 63+ messages in thread
From: Liam Breck @ 2017-08-24  3:36 UTC (permalink / raw)
  To: Sebastian Reichel, Pali Rohár, linux-pm
  Cc: Paul Kocialkowski, Liam Breck

From: Liam Breck <kernel@networkimprov.net>

BQ2751X & BQ27510G3 have identical regs & props.
BQ2750X & BQ27510G3 have identical props.
BQ27500 & BQ27510G1 & BQ27510G2 have identical regs & props.
BQ27500 & BQ27520G2 have identical props.
Remove the duplicate arrays.

No functional changes to the driver.

Signed-off-by: Liam Breck <kernel@networkimprov.net>
---
 drivers/power/supply/bq27xxx_battery.c | 169 ++-------------------------------
 1 file changed, 10 insertions(+), 159 deletions(-)

diff --git a/drivers/power/supply/bq27xxx_battery.c b/drivers/power/supply/bq27xxx_battery.c
index 3a6b9549..b6c3120c 100644
--- a/drivers/power/supply/bq27xxx_battery.c
+++ b/drivers/power/supply/bq27xxx_battery.c
@@ -199,27 +199,8 @@ static u8
 		[BQ27XXX_REG_AP] = INVALID_REG_ADDR,
 		BQ27XXX_DM_REG_ROWS,
 	},
-	bq2751x_regs[BQ27XXX_REG_MAX] = {
-		[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,
-	},
-#define bq2752x_regs bq2751x_regs
+#define bq2751x_regs bq27510g3_regs
+#define bq2752x_regs bq27510g3_regs
 	bq27500_regs[BQ27XXX_REG_MAX] = {
 		[BQ27XXX_REG_CTRL] = 0x00,
 		[BQ27XXX_REG_TEMP] = 0x06,
@@ -240,46 +221,8 @@ static u8
 		[BQ27XXX_REG_AP] = 0x24,
 		BQ27XXX_DM_REG_ROWS,
 	},
-	bq27510g1_regs[BQ27XXX_REG_MAX] = {
-		[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,
-	},
-	bq27510g2_regs[BQ27XXX_REG_MAX] = {
-		[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,
-	},
+#define bq27510g1_regs bq27500_regs
+#define bq27510g2_regs bq27500_regs
 	bq27510g3_regs[BQ27XXX_REG_MAX] = {
 		[BQ27XXX_REG_CTRL] = 0x00,
 		[BQ27XXX_REG_TEMP] = 0x06,
@@ -510,42 +453,9 @@ static enum power_supply_property bq27010_props[] = {
 	POWER_SUPPLY_PROP_MANUFACTURER,
 };
 
-static enum power_supply_property bq2750x_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,
-};
-
-static enum power_supply_property bq2751x_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 bq2752x_props bq2751x_props
+#define bq2750x_props bq27510g3_props
+#define bq2751x_props bq27510g3_props
+#define bq2752x_props bq27510g3_props
 
 static enum power_supply_property bq27500_props[] = {
 	POWER_SUPPLY_PROP_STATUS,
@@ -567,48 +477,8 @@ static enum power_supply_property bq27500_props[] = {
 	POWER_SUPPLY_PROP_HEALTH,
 	POWER_SUPPLY_PROP_MANUFACTURER,
 };
-
-static enum power_supply_property bq27510g1_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_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 bq27510g2_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_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 bq27510g3_props[] = {
 	POWER_SUPPLY_PROP_STATUS,
@@ -648,26 +518,7 @@ static enum power_supply_property bq27520g1_props[] = {
 	POWER_SUPPLY_PROP_MANUFACTURER,
 };
 
-static enum power_supply_property bq27520g2_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_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 bq27520g2_props bq27500_props
 
 static enum power_supply_property bq27520g3_props[] = {
 	POWER_SUPPLY_PROP_STATUS,
-- 
2.13.2

^ permalink raw reply	[flat|nested] 63+ messages in thread

* Re: [PATCH v3 0/5] bq27xxx_battery data memory update
  2017-08-24  3:36 [PATCH v3 0/5] bq27xxx_battery data memory update Liam Breck
                   ` (4 preceding siblings ...)
  2017-08-24  3:36 ` [PATCH v3 5/5] power: supply: bq27xxx: Remove duplicate chip data arrays Liam Breck
@ 2017-08-29 10:54 ` Sebastian Reichel
  2017-08-29 15:31   ` Andrew F. Davis
  5 siblings, 1 reply; 63+ messages in thread
From: Sebastian Reichel @ 2017-08-29 10:54 UTC (permalink / raw)
  To: Liam Breck; +Cc: Pali Rohár, linux-pm, Paul Kocialkowski

[-- Attachment #1: Type: text/plain, Size: 1577 bytes --]

Hi,

On Wed, Aug 23, 2017 at 08:36:12PM -0700, Liam Breck wrote:
> Overview:
> * Reorganizes chip data definitions
> * Enables features landed in these patches:
>   dt-bindings: power: supply: bq27xxx: Add monitored-battery documentation
>   power: supply: bq27xxx: Add chip data memory read/write support
>   power: supply: bq27xxx: Add power_supply_battery_info support
> * Supports the following chips (only BQ27425 is active)
>   BQ27500, 545, 425, 421, 441, 621
> 
> Changes in v3:
> * BQ27425 tested; workaround minor chip bug
> * Dropped driver_version
> * Fixed dbg_dupes logic for .props & .dm_regs
> * Dropped two props array dupes
> 
> Changes in v2:
> * Added di->opts flags for remaining chip features
> * Commented out untested bq27xxx_dm_regs parameters
> * Changed dbg_dupes to run only once
> 
> Notes on v1:
> * Not fully tested (hence RFC tag)

Thanks, full series queued.

-- Sebastian

> Liam Breck (5):
>   power: supply: bq27xxx: Create single chip data table
>   power: supply: bq27xxx: Add chip IDs for previously shadowed chips
>   power: supply: bq27xxx: Enable data memory update for certain chips
>   power: supply: bq27xxx: Flag identical chip data when in debug mode
>   power: supply: bq27xxx: Remove duplicate chip data arrays
> 
>  drivers/power/supply/bq27xxx_battery.c     | 514 ++++++++++++++---------------
>  drivers/power/supply/bq27xxx_battery_i2c.c |  16 +-
>  include/linux/power/bq27xxx_battery.h      |  10 +-
>  3 files changed, 265 insertions(+), 275 deletions(-)
> 
> -- 
> 2.13.2
> 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 63+ messages in thread

* Re: [PATCH v3 0/5] bq27xxx_battery data memory update
  2017-08-29 10:54 ` [PATCH v3 0/5] bq27xxx_battery data memory update Sebastian Reichel
@ 2017-08-29 15:31   ` Andrew F. Davis
  2017-08-29 21:22     ` Sebastian Reichel
  2017-08-29 22:29     ` Liam Breck
  0 siblings, 2 replies; 63+ messages in thread
From: Andrew F. Davis @ 2017-08-29 15:31 UTC (permalink / raw)
  To: Sebastian Reichel, Liam Breck
  Cc: Pali Rohár, linux-pm, Paul Kocialkowski

On 08/29/2017 05:54 AM, Sebastian Reichel wrote:
> Hi,
> 
> On Wed, Aug 23, 2017 at 08:36:12PM -0700, Liam Breck wrote:
>> Overview:
>> * Reorganizes chip data definitions
>> * Enables features landed in these patches:
>>   dt-bindings: power: supply: bq27xxx: Add monitored-battery documentation
>>   power: supply: bq27xxx: Add chip data memory read/write support
>>   power: supply: bq27xxx: Add power_supply_battery_info support
>> * Supports the following chips (only BQ27425 is active)
>>   BQ27500, 545, 425, 421, 441, 621
>>
>> Changes in v3:
>> * BQ27425 tested; workaround minor chip bug
>> * Dropped driver_version
>> * Fixed dbg_dupes logic for .props & .dm_regs
>> * Dropped two props array dupes
>>
>> Changes in v2:
>> * Added di->opts flags for remaining chip features
>> * Commented out untested bq27xxx_dm_regs parameters
>> * Changed dbg_dupes to run only once
>>
>> Notes on v1:
>> * Not fully tested (hence RFC tag)
> 
> Thanks, full series queued.
> 
> -- Sebastian
> 

Hold up, I'm just now seeing this series, looks like Liam left me out of
the CC despite being a reviewer in the MAINTAINERS file.. (possibly due
to me actually reviewing these patches and making him fix shit). I've
actively NACK'd some of these changes previously, making this all the
sneakier -_-

Anyway, I've not got the time to fight these changes anymore, but at
very least could you drop 4/5, it's static analysis code made into a
runtime check built into a kernel driver, if not at least add my
nacked-by. :)

>> Liam Breck (5):
>>   power: supply: bq27xxx: Create single chip data table
>>   power: supply: bq27xxx: Add chip IDs for previously shadowed chips
>>   power: supply: bq27xxx: Enable data memory update for certain chips
>>   power: supply: bq27xxx: Flag identical chip data when in debug mode
>>   power: supply: bq27xxx: Remove duplicate chip data arrays
>>
>>  drivers/power/supply/bq27xxx_battery.c     | 514 ++++++++++++++---------------
>>  drivers/power/supply/bq27xxx_battery_i2c.c |  16 +-
>>  include/linux/power/bq27xxx_battery.h      |  10 +-
>>  3 files changed, 265 insertions(+), 275 deletions(-)
>>
>> -- 
>> 2.13.2
>>

^ permalink raw reply	[flat|nested] 63+ messages in thread

* Re: [PATCH v3 0/5] bq27xxx_battery data memory update
  2017-08-29 15:31   ` Andrew F. Davis
@ 2017-08-29 21:22     ` Sebastian Reichel
  2017-08-29 23:07       ` Liam Breck
  2017-08-29 22:29     ` Liam Breck
  1 sibling, 1 reply; 63+ messages in thread
From: Sebastian Reichel @ 2017-08-29 21:22 UTC (permalink / raw)
  To: Andrew F. Davis; +Cc: Liam Breck, Pali Rohár, linux-pm, Paul Kocialkowski

[-- Attachment #1: Type: text/plain, Size: 2936 bytes --]

[adding Julia to Cc for Coccinelle question]

Hi,

On Tue, Aug 29, 2017 at 10:31:57AM -0500, Andrew F. Davis wrote:
> On 08/29/2017 05:54 AM, Sebastian Reichel wrote:
> > On Wed, Aug 23, 2017 at 08:36:12PM -0700, Liam Breck wrote:
> >> Overview:
> >> * Reorganizes chip data definitions
> >> * Enables features landed in these patches:
> >>   dt-bindings: power: supply: bq27xxx: Add monitored-battery documentation
> >>   power: supply: bq27xxx: Add chip data memory read/write support
> >>   power: supply: bq27xxx: Add power_supply_battery_info support
> >> * Supports the following chips (only BQ27425 is active)
> >>   BQ27500, 545, 425, 421, 441, 621
> >>
> >> Changes in v3:
> >> * BQ27425 tested; workaround minor chip bug
> >> * Dropped driver_version
> >> * Fixed dbg_dupes logic for .props & .dm_regs
> >> * Dropped two props array dupes
> >>
> >> Changes in v2:
> >> * Added di->opts flags for remaining chip features
> >> * Commented out untested bq27xxx_dm_regs parameters
> >> * Changed dbg_dupes to run only once
> >>
> >> Notes on v1:
> >> * Not fully tested (hence RFC tag)
> > 
> > Thanks, full series queued.
> > 
> > -- Sebastian
> > 
> 
> Hold up, I'm just now seeing this series, looks like Liam left me out of
> the CC despite being a reviewer in the MAINTAINERS file.. (possibly due
> to me actually reviewing these patches and making him fix shit). I've
> actively NACK'd some of these changes previously, making this all the
> sneakier -_-

oh, I did not notice, that you are no longer Cc'd.

> Anyway, I've not got the time to fight these changes anymore, but at
> very least could you drop 4/5, it's static analysis code made into a
> runtime check built into a kernel driver, if not at least add my
> nacked-by. :)

Since it's not critical at all and nobody depends on it, I dropped 4/5
for now. I agree, that checking it at runtime is not nice. On the other
hand I do think a duplication check makes sense. Doing a static
check should be possible, but I have no idea how to implement this
(without much effort). I suspect Coccinelle can do it, so I added
Julia.

For reference this is the runtime check:
https://patchwork.kernel.org/patch/9918953/

-- Sebastian

> >> Liam Breck (5):
> >>   power: supply: bq27xxx: Create single chip data table
> >>   power: supply: bq27xxx: Add chip IDs for previously shadowed chips
> >>   power: supply: bq27xxx: Enable data memory update for certain chips
> >>   power: supply: bq27xxx: Flag identical chip data when in debug mode
> >>   power: supply: bq27xxx: Remove duplicate chip data arrays
> >>
> >>  drivers/power/supply/bq27xxx_battery.c     | 514 ++++++++++++++---------------
> >>  drivers/power/supply/bq27xxx_battery_i2c.c |  16 +-
> >>  include/linux/power/bq27xxx_battery.h      |  10 +-
> >>  3 files changed, 265 insertions(+), 275 deletions(-)
> >>
> >> -- 
> >> 2.13.2
> >>

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 63+ messages in thread

* Re: [PATCH v3 0/5] bq27xxx_battery data memory update
  2017-08-29 15:31   ` Andrew F. Davis
  2017-08-29 21:22     ` Sebastian Reichel
@ 2017-08-29 22:29     ` Liam Breck
  1 sibling, 0 replies; 63+ messages in thread
From: Liam Breck @ 2017-08-29 22:29 UTC (permalink / raw)
  To: Andrew F. Davis
  Cc: Sebastian Reichel, Pali Rohár, linux-pm, Paul Kocialkowski

Hi Andrew,

On Tue, Aug 29, 2017 at 8:31 AM, Andrew F. Davis <afd@ti.com> wrote:
> On 08/29/2017 05:54 AM, Sebastian Reichel wrote:
>> Hi,
>>
>> On Wed, Aug 23, 2017 at 08:36:12PM -0700, Liam Breck wrote:
>>> Overview:
>>> * Reorganizes chip data definitions
>>> * Enables features landed in these patches:
>>>   dt-bindings: power: supply: bq27xxx: Add monitored-battery documentation
>>>   power: supply: bq27xxx: Add chip data memory read/write support
>>>   power: supply: bq27xxx: Add power_supply_battery_info support
>>> * Supports the following chips (only BQ27425 is active)
>>>   BQ27500, 545, 425, 421, 441, 621
>>>
>>> Changes in v3:
>>> * BQ27425 tested; workaround minor chip bug
>>> * Dropped driver_version
>>> * Fixed dbg_dupes logic for .props & .dm_regs
>>> * Dropped two props array dupes
>>>
>>> Changes in v2:
>>> * Added di->opts flags for remaining chip features
>>> * Commented out untested bq27xxx_dm_regs parameters
>>> * Changed dbg_dupes to run only once
>>>
>>> Notes on v1:
>>> * Not fully tested (hence RFC tag)
>>
>> Thanks, full series queued.
>>
>> -- Sebastian
>>
>
> Hold up, I'm just now seeing this series, looks like Liam left me out of
> the CC despite being a reviewer in the MAINTAINERS file.. (possibly due
> to me actually reviewing these patches and making him fix shit). I've
> actively NACK'd some of these changes previously, making this all the
> sneakier -_-
>
> Anyway, I've not got the time to fight these changes anymore, but at
> very least could you drop 4/5, it's static analysis code made into a
> runtime check built into a kernel driver, if not at least add my
> nacked-by. :)

I switched to CCing Pali, also a listed maintainer.

In our final discussion of the initial series enabling this feature
(which Sebastian queued without your ack) I found your comments to be
unhelpful, and your followups to my questions and clarifications, if
you provided any, to be inscrutable:

https://patchwork.kernel.org/patch/9710815/
https://patchwork.kernel.org/patch/9710817/
https://patchwork.kernel.org/patch/9710819/

That was after a sequence of 15 revisions (incl partial series) over 3
months, each of which you reviewed casually, forcing me to produce
repeated revs with few changes. Where you commented, your tone was
often pejorative. And you offered to, but never did, test this on
chips I don't have. I sadly concluded that you did not respect my time
nor my perspective. After Sebastian queued the series without your
ack, I felt it was reasonable to drop you from CC.

Sebastian raised two things you had complained about: 1) the real/fake
chip IDs, which he suggested a solution for; and 2) the data dupes
checking, whereon he agreed with me that it could be moved to static
analysis later by someone with knowledge of those tools.

BTW another bq27xxx patchset was submitted on April 30, and you made
no comment on it:

https://patchwork.kernel.org/patch/9706157/
https://patchwork.kernel.org/patch/9706159/
https://patchwork.kernel.org/patch/9706165/
https://patchwork.kernel.org/patch/9706169/
https://patchwork.kernel.org/patch/9706175/

Liam

^ permalink raw reply	[flat|nested] 63+ messages in thread

* Re: [PATCH v3 0/5] bq27xxx_battery data memory update
  2017-08-29 21:22     ` Sebastian Reichel
@ 2017-08-29 23:07       ` Liam Breck
  2017-08-30  0:29           ` [Cocci] " Sebastian Reichel
  0 siblings, 1 reply; 63+ messages in thread
From: Liam Breck @ 2017-08-29 23:07 UTC (permalink / raw)
  To: Sebastian Reichel
  Cc: Andrew F. Davis, Pali Rohár, linux-pm, Paul Kocialkowski

Hi Sebastian,

I don't see a Julia in CC list...

On Tue, Aug 29, 2017 at 2:22 PM, Sebastian Reichel
<sebastian.reichel@collabora.co.uk> wrote:
> [adding Julia to Cc for Coccinelle question]
>
> Hi,
>
> On Tue, Aug 29, 2017 at 10:31:57AM -0500, Andrew F. Davis wrote:
>> On 08/29/2017 05:54 AM, Sebastian Reichel wrote:
>> > On Wed, Aug 23, 2017 at 08:36:12PM -0700, Liam Breck wrote:
>> >> Overview:
>> >> * Reorganizes chip data definitions
>> >> * Enables features landed in these patches:
>> >>   dt-bindings: power: supply: bq27xxx: Add monitored-battery documentation
>> >>   power: supply: bq27xxx: Add chip data memory read/write support
>> >>   power: supply: bq27xxx: Add power_supply_battery_info support
>> >> * Supports the following chips (only BQ27425 is active)
>> >>   BQ27500, 545, 425, 421, 441, 621
>> >>
>> >> Changes in v3:
>> >> * BQ27425 tested; workaround minor chip bug
>> >> * Dropped driver_version
>> >> * Fixed dbg_dupes logic for .props & .dm_regs
>> >> * Dropped two props array dupes
>> >>
>> >> Changes in v2:
>> >> * Added di->opts flags for remaining chip features
>> >> * Commented out untested bq27xxx_dm_regs parameters
>> >> * Changed dbg_dupes to run only once
>> >>
>> >> Notes on v1:
>> >> * Not fully tested (hence RFC tag)
>> >
>> > Thanks, full series queued.
>> >
>> > -- Sebastian
>> >
>>
>> Hold up, I'm just now seeing this series, looks like Liam left me out of
>> the CC despite being a reviewer in the MAINTAINERS file.. (possibly due
>> to me actually reviewing these patches and making him fix shit). I've
>> actively NACK'd some of these changes previously, making this all the
>> sneakier -_-
>
> oh, I did not notice, that you are no longer Cc'd.

Not that it matters, but Andrew told me he does not work in the TI
department that makes these battery chips, and that TI has not
requested he do bq27xxx maintenance. I had to post on the TI E2E
support forum to resolve questions that arose during the dm-update
series. I suspect I have read more of the BQ27* docs than Andrew has
at this point :-)

>> Anyway, I've not got the time to fight these changes anymore, but at
>> very least could you drop 4/5, it's static analysis code made into a
>> runtime check built into a kernel driver, if not at least add my
>> nacked-by. :)
>
> Since it's not critical at all and nobody depends on it, I dropped 4/5
> for now. I agree, that checking it at runtime is not nice. On the other
> hand I do think a duplication check makes sense. Doing a static
> check should be possible, but I have no idea how to implement this
> (without much effort). I suspect Coccinelle can do it, so I added
> Julia.
>
> For reference this is the runtime check:
> https://patchwork.kernel.org/patch/9918953/

If someone can rewrite this as static analysis in the immediate
future, I'm all for it. If not, pls keep the patch until it can be
replaced.

It has already flagged 160 lines of duplicate data, from a previous
total of 660. And it only runs during ifdef DEBUG.

^ permalink raw reply	[flat|nested] 63+ messages in thread

* Re: [PATCH v3 0/5] bq27xxx_battery data memory update
  2017-08-29 23:07       ` Liam Breck
@ 2017-08-30  0:29           ` Sebastian Reichel
  0 siblings, 0 replies; 63+ messages in thread
From: Sebastian Reichel @ 2017-08-30  0:29 UTC (permalink / raw)
  To: Julia Lawall, Gilles Muller, Nicolas Palix, Michal Marek, cocci
  Cc: Liam Breck, Andrew F. Davis, Pali Rohár, linux-pm

[-- Attachment #1: Type: text/plain, Size: 2216 bytes --]

Hi,

On Tue, Aug 29, 2017 at 04:07:12PM -0700, Liam Breck wrote:
> I don't see a Julia in CC list...

<_< let's try that again.

> On Tue, Aug 29, 2017 at 2:22 PM, Sebastian Reichel
> <sebastian.reichel@collabora.co.uk> wrote:
> > [adding Julia to Cc for Coccinelle question]
> >
> > Hi,
> >
> > On Tue, Aug 29, 2017 at 10:31:57AM -0500, Andrew F. Davis wrote:
> >> On 08/29/2017 05:54 AM, Sebastian Reichel wrote:
> >> > On Wed, Aug 23, 2017 at 08:36:12PM -0700, Liam Breck wrote:
> >> >> Overview:
> >> >> * Reorganizes chip data definitions
> >> >> * Enables features landed in these patches:
> >> >>   dt-bindings: power: supply: bq27xxx: Add monitored-battery documentation
> >> >>   power: supply: bq27xxx: Add chip data memory read/write support
> >> >>   power: supply: bq27xxx: Add power_supply_battery_info support
> >> >> * Supports the following chips (only BQ27425 is active)
> >> >>   BQ27500, 545, 425, 421, 441, 621
> >> >>
> >> >> Changes in v3:
> >> >> * BQ27425 tested; workaround minor chip bug
> >> >> * Dropped driver_version
> >> >> * Fixed dbg_dupes logic for .props & .dm_regs
> >> >> * Dropped two props array dupes
> >> >>
> >> >> Changes in v2:
> >> >> * Added di->opts flags for remaining chip features
> >> >> * Commented out untested bq27xxx_dm_regs parameters
> >> >> * Changed dbg_dupes to run only once
> >> >>
> >> >> Notes on v1:
> >> >> * Not fully tested (hence RFC tag)
> >> >
> >> > Thanks, full series queued.
> >> >
> >> > -- Sebastian
> >>
> >> Anyway, I've not got the time to fight these changes anymore, but at
> >> very least could you drop 4/5, it's static analysis code made into a
> >> runtime check built into a kernel driver, if not at least add my
> >> nacked-by. :)
> >
> > Since it's not critical at all and nobody depends on it, I dropped 4/5
> > for now. I agree, that checking it at runtime is not nice. On the other
> > hand I do think a duplication check makes sense. Doing a static
> > check should be possible, but I have no idea how to implement this
> > (without much effort). I suspect Coccinelle can do it, so I added
> > Julia.
> >
> > For reference this is the runtime check:
> > https://patchwork.kernel.org/patch/9918953/
>
> [...]

-- Sebastian

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 63+ messages in thread

* [Cocci] [PATCH v3 0/5] bq27xxx_battery data memory update
@ 2017-08-30  0:29           ` Sebastian Reichel
  0 siblings, 0 replies; 63+ messages in thread
From: Sebastian Reichel @ 2017-08-30  0:29 UTC (permalink / raw)
  To: cocci

Hi,

On Tue, Aug 29, 2017 at 04:07:12PM -0700, Liam Breck wrote:
> I don't see a Julia in CC list...

<_< let's try that again.

> On Tue, Aug 29, 2017 at 2:22 PM, Sebastian Reichel
> <sebastian.reichel@collabora.co.uk> wrote:
> > [adding Julia to Cc for Coccinelle question]
> >
> > Hi,
> >
> > On Tue, Aug 29, 2017 at 10:31:57AM -0500, Andrew F. Davis wrote:
> >> On 08/29/2017 05:54 AM, Sebastian Reichel wrote:
> >> > On Wed, Aug 23, 2017 at 08:36:12PM -0700, Liam Breck wrote:
> >> >> Overview:
> >> >> * Reorganizes chip data definitions
> >> >> * Enables features landed in these patches:
> >> >>   dt-bindings: power: supply: bq27xxx: Add monitored-battery documentation
> >> >>   power: supply: bq27xxx: Add chip data memory read/write support
> >> >>   power: supply: bq27xxx: Add power_supply_battery_info support
> >> >> * Supports the following chips (only BQ27425 is active)
> >> >>   BQ27500, 545, 425, 421, 441, 621
> >> >>
> >> >> Changes in v3:
> >> >> * BQ27425 tested; workaround minor chip bug
> >> >> * Dropped driver_version
> >> >> * Fixed dbg_dupes logic for .props & .dm_regs
> >> >> * Dropped two props array dupes
> >> >>
> >> >> Changes in v2:
> >> >> * Added di->opts flags for remaining chip features
> >> >> * Commented out untested bq27xxx_dm_regs parameters
> >> >> * Changed dbg_dupes to run only once
> >> >>
> >> >> Notes on v1:
> >> >> * Not fully tested (hence RFC tag)
> >> >
> >> > Thanks, full series queued.
> >> >
> >> > -- Sebastian
> >>
> >> Anyway, I've not got the time to fight these changes anymore, but at
> >> very least could you drop 4/5, it's static analysis code made into a
> >> runtime check built into a kernel driver, if not at least add my
> >> nacked-by. :)
> >
> > Since it's not critical at all and nobody depends on it, I dropped 4/5
> > for now. I agree, that checking it at runtime is not nice. On the other
> > hand I do think a duplication check makes sense. Doing a static
> > check should be possible, but I have no idea how to implement this
> > (without much effort). I suspect Coccinelle can do it, so I added
> > Julia.
> >
> > For reference this is the runtime check:
> > https://patchwork.kernel.org/patch/9918953/
>
> [...]

-- Sebastian
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <https://systeme.lip6.fr/pipermail/cocci/attachments/20170830/a6b38e47/attachment.asc>

^ permalink raw reply	[flat|nested] 63+ messages in thread

* Re: [PATCH v3 0/5] bq27xxx_battery data memory update
  2017-08-30  0:29           ` [Cocci] " Sebastian Reichel
@ 2017-08-30  1:14             ` Liam Breck
  -1 siblings, 0 replies; 63+ messages in thread
From: Liam Breck @ 2017-08-30  1:14 UTC (permalink / raw)
  To: Sebastian Reichel
  Cc: Julia Lawall, Gilles Muller, Nicolas Palix, Michal Marek, cocci,
	Andrew F. Davis, Pali Rohár, linux-pm

Coccinelle folks,

On Tue, Aug 29, 2017 at 5:29 PM, Sebastian Reichel
<sebastian.reichel@collabora.co.uk> wrote:
> Hi,
>
> On Tue, Aug 29, 2017 at 04:07:12PM -0700, Liam Breck wrote:
>> I don't see a Julia in CC list...
>
> <_< let's try that again.
>
>> On Tue, Aug 29, 2017 at 2:22 PM, Sebastian Reichel
>> <sebastian.reichel@collabora.co.uk> wrote:
>> > [adding Julia to Cc for Coccinelle question]
>> >
>> > Hi,
>> >
>> > On Tue, Aug 29, 2017 at 10:31:57AM -0500, Andrew F. Davis wrote:
>> >> On 08/29/2017 05:54 AM, Sebastian Reichel wrote:
>> >> > On Wed, Aug 23, 2017 at 08:36:12PM -0700, Liam Breck wrote:
>> >> >> Overview:
>> >> >> * Reorganizes chip data definitions
>> >> >> * Enables features landed in these patches:
>> >> >>   dt-bindings: power: supply: bq27xxx: Add monitored-battery documentation
>> >> >>   power: supply: bq27xxx: Add chip data memory read/write support
>> >> >>   power: supply: bq27xxx: Add power_supply_battery_info support
>> >> >> * Supports the following chips (only BQ27425 is active)
>> >> >>   BQ27500, 545, 425, 421, 441, 621
>> >> >>
>> >> >> Changes in v3:
>> >> >> * BQ27425 tested; workaround minor chip bug
>> >> >> * Dropped driver_version
>> >> >> * Fixed dbg_dupes logic for .props & .dm_regs
>> >> >> * Dropped two props array dupes
>> >> >>
>> >> >> Changes in v2:
>> >> >> * Added di->opts flags for remaining chip features
>> >> >> * Commented out untested bq27xxx_dm_regs parameters
>> >> >> * Changed dbg_dupes to run only once
>> >> >>
>> >> >> Notes on v1:
>> >> >> * Not fully tested (hence RFC tag)
>> >> >
>> >> > Thanks, full series queued.
>> >> >
>> >> > -- Sebastian
>> >>
>> >> Anyway, I've not got the time to fight these changes anymore, but at
>> >> very least could you drop 4/5, it's static analysis code made into a
>> >> runtime check built into a kernel driver, if not at least add my
>> >> nacked-by. :)
>> >
>> > Since it's not critical at all and nobody depends on it, I dropped 4/5
>> > for now. I agree, that checking it at runtime is not nice. On the other
>> > hand I do think a duplication check makes sense. Doing a static
>> > check should be possible, but I have no idea how to implement this
>> > (without much effort). I suspect Coccinelle can do it, so I added
>> > Julia.
>> >
>> > For reference this is the runtime check:
>> > https://patchwork.kernel.org/patch/9918953/

The data structures being checked start here:
https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n138

And are aggregated here:
https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n743

Liam

^ permalink raw reply	[flat|nested] 63+ messages in thread

* [Cocci] [PATCH v3 0/5] bq27xxx_battery data memory update
@ 2017-08-30  1:14             ` Liam Breck
  0 siblings, 0 replies; 63+ messages in thread
From: Liam Breck @ 2017-08-30  1:14 UTC (permalink / raw)
  To: cocci

Coccinelle folks,

On Tue, Aug 29, 2017 at 5:29 PM, Sebastian Reichel
<sebastian.reichel@collabora.co.uk> wrote:
> Hi,
>
> On Tue, Aug 29, 2017 at 04:07:12PM -0700, Liam Breck wrote:
>> I don't see a Julia in CC list...
>
> <_< let's try that again.
>
>> On Tue, Aug 29, 2017 at 2:22 PM, Sebastian Reichel
>> <sebastian.reichel@collabora.co.uk> wrote:
>> > [adding Julia to Cc for Coccinelle question]
>> >
>> > Hi,
>> >
>> > On Tue, Aug 29, 2017 at 10:31:57AM -0500, Andrew F. Davis wrote:
>> >> On 08/29/2017 05:54 AM, Sebastian Reichel wrote:
>> >> > On Wed, Aug 23, 2017 at 08:36:12PM -0700, Liam Breck wrote:
>> >> >> Overview:
>> >> >> * Reorganizes chip data definitions
>> >> >> * Enables features landed in these patches:
>> >> >>   dt-bindings: power: supply: bq27xxx: Add monitored-battery documentation
>> >> >>   power: supply: bq27xxx: Add chip data memory read/write support
>> >> >>   power: supply: bq27xxx: Add power_supply_battery_info support
>> >> >> * Supports the following chips (only BQ27425 is active)
>> >> >>   BQ27500, 545, 425, 421, 441, 621
>> >> >>
>> >> >> Changes in v3:
>> >> >> * BQ27425 tested; workaround minor chip bug
>> >> >> * Dropped driver_version
>> >> >> * Fixed dbg_dupes logic for .props & .dm_regs
>> >> >> * Dropped two props array dupes
>> >> >>
>> >> >> Changes in v2:
>> >> >> * Added di->opts flags for remaining chip features
>> >> >> * Commented out untested bq27xxx_dm_regs parameters
>> >> >> * Changed dbg_dupes to run only once
>> >> >>
>> >> >> Notes on v1:
>> >> >> * Not fully tested (hence RFC tag)
>> >> >
>> >> > Thanks, full series queued.
>> >> >
>> >> > -- Sebastian
>> >>
>> >> Anyway, I've not got the time to fight these changes anymore, but at
>> >> very least could you drop 4/5, it's static analysis code made into a
>> >> runtime check built into a kernel driver, if not at least add my
>> >> nacked-by. :)
>> >
>> > Since it's not critical at all and nobody depends on it, I dropped 4/5
>> > for now. I agree, that checking it at runtime is not nice. On the other
>> > hand I do think a duplication check makes sense. Doing a static
>> > check should be possible, but I have no idea how to implement this
>> > (without much effort). I suspect Coccinelle can do it, so I added
>> > Julia.
>> >
>> > For reference this is the runtime check:
>> > https://patchwork.kernel.org/patch/9918953/

The data structures being checked start here:
https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n138

And are aggregated here:
https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n743

Liam

^ permalink raw reply	[flat|nested] 63+ messages in thread

* Re: [PATCH v3 0/5] bq27xxx_battery data memory update
  2017-08-30  1:14             ` [Cocci] " Liam Breck
@ 2017-08-30  6:01               ` Julia Lawall
  -1 siblings, 0 replies; 63+ messages in thread
From: Julia Lawall @ 2017-08-30  6:01 UTC (permalink / raw)
  To: Liam Breck
  Cc: linux-pm, Nicolas Palix, Michal Marek, Pali Rohár,
	Sebastian Reichel, cocci



On Tue, 29 Aug 2017, Liam Breck wrote:

> Coccinelle folks,
>
> On Tue, Aug 29, 2017 at 5:29 PM, Sebastian Reichel
> <sebastian.reichel@collabora.co.uk> wrote:
> > Hi,
> >
> > On Tue, Aug 29, 2017 at 04:07:12PM -0700, Liam Breck wrote:
> >> I don't see a Julia in CC list...
> >
> > <_< let's try that again.
> >
> >> On Tue, Aug 29, 2017 at 2:22 PM, Sebastian Reichel
> >> <sebastian.reichel@collabora.co.uk> wrote:
> >> > [adding Julia to Cc for Coccinelle question]
> >> >
> >> > Hi,
> >> >
> >> > On Tue, Aug 29, 2017 at 10:31:57AM -0500, Andrew F. Davis wrote:
> >> >> On 08/29/2017 05:54 AM, Sebastian Reichel wrote:
> >> >> > On Wed, Aug 23, 2017 at 08:36:12PM -0700, Liam Breck wrote:
> >> >> >> Overview:
> >> >> >> * Reorganizes chip data definitions
> >> >> >> * Enables features landed in these patches:
> >> >> >>   dt-bindings: power: supply: bq27xxx: Add monitored-battery documentation
> >> >> >>   power: supply: bq27xxx: Add chip data memory read/write support
> >> >> >>   power: supply: bq27xxx: Add power_supply_battery_info support
> >> >> >> * Supports the following chips (only BQ27425 is active)
> >> >> >>   BQ27500, 545, 425, 421, 441, 621
> >> >> >>
> >> >> >> Changes in v3:
> >> >> >> * BQ27425 tested; workaround minor chip bug
> >> >> >> * Dropped driver_version
> >> >> >> * Fixed dbg_dupes logic for .props & .dm_regs
> >> >> >> * Dropped two props array dupes
> >> >> >>
> >> >> >> Changes in v2:
> >> >> >> * Added di->opts flags for remaining chip features
> >> >> >> * Commented out untested bq27xxx_dm_regs parameters
> >> >> >> * Changed dbg_dupes to run only once
> >> >> >>
> >> >> >> Notes on v1:
> >> >> >> * Not fully tested (hence RFC tag)
> >> >> >
> >> >> > Thanks, full series queued.
> >> >> >
> >> >> > -- Sebastian
> >> >>
> >> >> Anyway, I've not got the time to fight these changes anymore, but at
> >> >> very least could you drop 4/5, it's static analysis code made into a
> >> >> runtime check built into a kernel driver, if not at least add my
> >> >> nacked-by. :)
> >> >
> >> > Since it's not critical at all and nobody depends on it, I dropped 4/5
> >> > for now. I agree, that checking it at runtime is not nice. On the other
> >> > hand I do think a duplication check makes sense. Doing a static
> >> > check should be possible, but I have no idea how to implement this
> >> > (without much effort). I suspect Coccinelle can do it, so I added
> >> > Julia.
> >> >
> >> > For reference this is the runtime check:
> >> > https://patchwork.kernel.org/patch/9918953/
>
> The data structures being checked start here:
> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n138
>
> And are aggregated here:
> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n743

It looks like it could be possible, since there are a lot of constants
involved.  I will look into it.

julia

^ permalink raw reply	[flat|nested] 63+ messages in thread

* [Cocci] [PATCH v3 0/5] bq27xxx_battery data memory update
@ 2017-08-30  6:01               ` Julia Lawall
  0 siblings, 0 replies; 63+ messages in thread
From: Julia Lawall @ 2017-08-30  6:01 UTC (permalink / raw)
  To: cocci



On Tue, 29 Aug 2017, Liam Breck wrote:

> Coccinelle folks,
>
> On Tue, Aug 29, 2017 at 5:29 PM, Sebastian Reichel
> <sebastian.reichel@collabora.co.uk> wrote:
> > Hi,
> >
> > On Tue, Aug 29, 2017 at 04:07:12PM -0700, Liam Breck wrote:
> >> I don't see a Julia in CC list...
> >
> > <_< let's try that again.
> >
> >> On Tue, Aug 29, 2017 at 2:22 PM, Sebastian Reichel
> >> <sebastian.reichel@collabora.co.uk> wrote:
> >> > [adding Julia to Cc for Coccinelle question]
> >> >
> >> > Hi,
> >> >
> >> > On Tue, Aug 29, 2017 at 10:31:57AM -0500, Andrew F. Davis wrote:
> >> >> On 08/29/2017 05:54 AM, Sebastian Reichel wrote:
> >> >> > On Wed, Aug 23, 2017 at 08:36:12PM -0700, Liam Breck wrote:
> >> >> >> Overview:
> >> >> >> * Reorganizes chip data definitions
> >> >> >> * Enables features landed in these patches:
> >> >> >>   dt-bindings: power: supply: bq27xxx: Add monitored-battery documentation
> >> >> >>   power: supply: bq27xxx: Add chip data memory read/write support
> >> >> >>   power: supply: bq27xxx: Add power_supply_battery_info support
> >> >> >> * Supports the following chips (only BQ27425 is active)
> >> >> >>   BQ27500, 545, 425, 421, 441, 621
> >> >> >>
> >> >> >> Changes in v3:
> >> >> >> * BQ27425 tested; workaround minor chip bug
> >> >> >> * Dropped driver_version
> >> >> >> * Fixed dbg_dupes logic for .props & .dm_regs
> >> >> >> * Dropped two props array dupes
> >> >> >>
> >> >> >> Changes in v2:
> >> >> >> * Added di->opts flags for remaining chip features
> >> >> >> * Commented out untested bq27xxx_dm_regs parameters
> >> >> >> * Changed dbg_dupes to run only once
> >> >> >>
> >> >> >> Notes on v1:
> >> >> >> * Not fully tested (hence RFC tag)
> >> >> >
> >> >> > Thanks, full series queued.
> >> >> >
> >> >> > -- Sebastian
> >> >>
> >> >> Anyway, I've not got the time to fight these changes anymore, but at
> >> >> very least could you drop 4/5, it's static analysis code made into a
> >> >> runtime check built into a kernel driver, if not at least add my
> >> >> nacked-by. :)
> >> >
> >> > Since it's not critical at all and nobody depends on it, I dropped 4/5
> >> > for now. I agree, that checking it at runtime is not nice. On the other
> >> > hand I do think a duplication check makes sense. Doing a static
> >> > check should be possible, but I have no idea how to implement this
> >> > (without much effort). I suspect Coccinelle can do it, so I added
> >> > Julia.
> >> >
> >> > For reference this is the runtime check:
> >> > https://patchwork.kernel.org/patch/9918953/
>
> The data structures being checked start here:
> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n138
>
> And are aggregated here:
> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n743

It looks like it could be possible, since there are a lot of constants
involved.  I will look into it.

julia

^ permalink raw reply	[flat|nested] 63+ messages in thread

* Re: [PATCH v3 0/5] bq27xxx_battery data memory update
  2017-08-30  1:14             ` [Cocci] " Liam Breck
@ 2017-08-31  9:54               ` Julia Lawall
  -1 siblings, 0 replies; 63+ messages in thread
From: Julia Lawall @ 2017-08-31  9:54 UTC (permalink / raw)
  To: Liam Breck
  Cc: Sebastian Reichel, Gilles Muller, Nicolas Palix, Michal Marek,
	cocci, Andrew F. Davis, Pali Rohár, linux-pm



On Tue, 29 Aug 2017, Liam Breck wrote:

> Coccinelle folks,
>
> On Tue, Aug 29, 2017 at 5:29 PM, Sebastian Reichel
> <sebastian.reichel@collabora.co.uk> wrote:
> > Hi,
> >
> > On Tue, Aug 29, 2017 at 04:07:12PM -0700, Liam Breck wrote:
> >> I don't see a Julia in CC list...
> >
> > <_< let's try that again.
> >
> >> On Tue, Aug 29, 2017 at 2:22 PM, Sebastian Reichel
> >> <sebastian.reichel@collabora.co.uk> wrote:
> >> > [adding Julia to Cc for Coccinelle question]
> >> >
> >> > Hi,
> >> >
> >> > On Tue, Aug 29, 2017 at 10:31:57AM -0500, Andrew F. Davis wrote:
> >> >> On 08/29/2017 05:54 AM, Sebastian Reichel wrote:
> >> >> > On Wed, Aug 23, 2017 at 08:36:12PM -0700, Liam Breck wrote:
> >> >> >> Overview:
> >> >> >> * Reorganizes chip data definitions
> >> >> >> * Enables features landed in these patches:
> >> >> >>   dt-bindings: power: supply: bq27xxx: Add monitored-battery documentation
> >> >> >>   power: supply: bq27xxx: Add chip data memory read/write support
> >> >> >>   power: supply: bq27xxx: Add power_supply_battery_info support
> >> >> >> * Supports the following chips (only BQ27425 is active)
> >> >> >>   BQ27500, 545, 425, 421, 441, 621
> >> >> >>
> >> >> >> Changes in v3:
> >> >> >> * BQ27425 tested; workaround minor chip bug
> >> >> >> * Dropped driver_version
> >> >> >> * Fixed dbg_dupes logic for .props & .dm_regs
> >> >> >> * Dropped two props array dupes
> >> >> >>
> >> >> >> Changes in v2:
> >> >> >> * Added di->opts flags for remaining chip features
> >> >> >> * Commented out untested bq27xxx_dm_regs parameters
> >> >> >> * Changed dbg_dupes to run only once
> >> >> >>
> >> >> >> Notes on v1:
> >> >> >> * Not fully tested (hence RFC tag)
> >> >> >
> >> >> > Thanks, full series queued.
> >> >> >
> >> >> > -- Sebastian
> >> >>
> >> >> Anyway, I've not got the time to fight these changes anymore, but at
> >> >> very least could you drop 4/5, it's static analysis code made into a
> >> >> runtime check built into a kernel driver, if not at least add my
> >> >> nacked-by. :)
> >> >
> >> > Since it's not critical at all and nobody depends on it, I dropped 4/5
> >> > for now. I agree, that checking it at runtime is not nice. On the other
> >> > hand I do think a duplication check makes sense. Doing a static
> >> > check should be possible, but I have no idea how to implement this
> >> > (without much effort). I suspect Coccinelle can do it, so I added
> >> > Julia.
> >> >
> >> > For reference this is the runtime check:
> >> > https://patchwork.kernel.org/patch/9918953/
>
> The data structures being checked start here:
> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n138
>
> And are aggregated here:
> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n743

I worked a bit on this, but unfortunately there is a major parsing
problem, and most of the definitions are ignored.  Specifically, the
definitions of the regs variables are interspersed with eg:

#define bq27510g1_regs bq27500_regs

I'm not sure whether this would be convenient to fix, since parsing is
rather delicate.  Coccinelle doesn't run cpp first.  It tries to parse
macros definitions so that their code can be transformed as needed t the
place of the definition.

julia

^ permalink raw reply	[flat|nested] 63+ messages in thread

* [Cocci] [PATCH v3 0/5] bq27xxx_battery data memory update
@ 2017-08-31  9:54               ` Julia Lawall
  0 siblings, 0 replies; 63+ messages in thread
From: Julia Lawall @ 2017-08-31  9:54 UTC (permalink / raw)
  To: cocci



On Tue, 29 Aug 2017, Liam Breck wrote:

> Coccinelle folks,
>
> On Tue, Aug 29, 2017 at 5:29 PM, Sebastian Reichel
> <sebastian.reichel@collabora.co.uk> wrote:
> > Hi,
> >
> > On Tue, Aug 29, 2017 at 04:07:12PM -0700, Liam Breck wrote:
> >> I don't see a Julia in CC list...
> >
> > <_< let's try that again.
> >
> >> On Tue, Aug 29, 2017 at 2:22 PM, Sebastian Reichel
> >> <sebastian.reichel@collabora.co.uk> wrote:
> >> > [adding Julia to Cc for Coccinelle question]
> >> >
> >> > Hi,
> >> >
> >> > On Tue, Aug 29, 2017 at 10:31:57AM -0500, Andrew F. Davis wrote:
> >> >> On 08/29/2017 05:54 AM, Sebastian Reichel wrote:
> >> >> > On Wed, Aug 23, 2017 at 08:36:12PM -0700, Liam Breck wrote:
> >> >> >> Overview:
> >> >> >> * Reorganizes chip data definitions
> >> >> >> * Enables features landed in these patches:
> >> >> >>   dt-bindings: power: supply: bq27xxx: Add monitored-battery documentation
> >> >> >>   power: supply: bq27xxx: Add chip data memory read/write support
> >> >> >>   power: supply: bq27xxx: Add power_supply_battery_info support
> >> >> >> * Supports the following chips (only BQ27425 is active)
> >> >> >>   BQ27500, 545, 425, 421, 441, 621
> >> >> >>
> >> >> >> Changes in v3:
> >> >> >> * BQ27425 tested; workaround minor chip bug
> >> >> >> * Dropped driver_version
> >> >> >> * Fixed dbg_dupes logic for .props & .dm_regs
> >> >> >> * Dropped two props array dupes
> >> >> >>
> >> >> >> Changes in v2:
> >> >> >> * Added di->opts flags for remaining chip features
> >> >> >> * Commented out untested bq27xxx_dm_regs parameters
> >> >> >> * Changed dbg_dupes to run only once
> >> >> >>
> >> >> >> Notes on v1:
> >> >> >> * Not fully tested (hence RFC tag)
> >> >> >
> >> >> > Thanks, full series queued.
> >> >> >
> >> >> > -- Sebastian
> >> >>
> >> >> Anyway, I've not got the time to fight these changes anymore, but at
> >> >> very least could you drop 4/5, it's static analysis code made into a
> >> >> runtime check built into a kernel driver, if not at least add my
> >> >> nacked-by. :)
> >> >
> >> > Since it's not critical at all and nobody depends on it, I dropped 4/5
> >> > for now. I agree, that checking it at runtime is not nice. On the other
> >> > hand I do think a duplication check makes sense. Doing a static
> >> > check should be possible, but I have no idea how to implement this
> >> > (without much effort). I suspect Coccinelle can do it, so I added
> >> > Julia.
> >> >
> >> > For reference this is the runtime check:
> >> > https://patchwork.kernel.org/patch/9918953/
>
> The data structures being checked start here:
> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n138
>
> And are aggregated here:
> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n743

I worked a bit on this, but unfortunately there is a major parsing
problem, and most of the definitions are ignored.  Specifically, the
definitions of the regs variables are interspersed with eg:

#define bq27510g1_regs bq27500_regs

I'm not sure whether this would be convenient to fix, since parsing is
rather delicate.  Coccinelle doesn't run cpp first.  It tries to parse
macros definitions so that their code can be transformed as needed t the
place of the definition.

julia

^ permalink raw reply	[flat|nested] 63+ messages in thread

* Re: [PATCH v3 0/5] bq27xxx_battery data memory update
  2017-08-31  9:54               ` [Cocci] " Julia Lawall
@ 2017-08-31 11:01                 ` Liam Breck
  -1 siblings, 0 replies; 63+ messages in thread
From: Liam Breck @ 2017-08-31 11:01 UTC (permalink / raw)
  To: Julia Lawall
  Cc: Linux PM mailing list, Nicolas Palix, Michal Marek,
	Pali Rohár, Sebastian Reichel, cocci

On Thu, Aug 31, 2017 at 2:54 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
>
>
> On Tue, 29 Aug 2017, Liam Breck wrote:
>
>> Coccinelle folks,
>>
>> On Tue, Aug 29, 2017 at 5:29 PM, Sebastian Reichel
>> <sebastian.reichel@collabora.co.uk> wrote:
>> > Hi,
>> >
>> > On Tue, Aug 29, 2017 at 04:07:12PM -0700, Liam Breck wrote:
>> >> I don't see a Julia in CC list...
>> >
>> > <_< let's try that again.
>> >
>> >> On Tue, Aug 29, 2017 at 2:22 PM, Sebastian Reichel
>> >> <sebastian.reichel@collabora.co.uk> wrote:
>> >> > [adding Julia to Cc for Coccinelle question]
>> >> >
>> >> > Hi,
>> >> >
>> >> > On Tue, Aug 29, 2017 at 10:31:57AM -0500, Andrew F. Davis wrote:
>> >> >> On 08/29/2017 05:54 AM, Sebastian Reichel wrote:
>> >> >> > On Wed, Aug 23, 2017 at 08:36:12PM -0700, Liam Breck wrote:
>> >> >> >> Overview:
>> >> >> >> * Reorganizes chip data definitions
>> >> >> >> * Enables features landed in these patches:
>> >> >> >>   dt-bindings: power: supply: bq27xxx: Add monitored-battery documentation
>> >> >> >>   power: supply: bq27xxx: Add chip data memory read/write support
>> >> >> >>   power: supply: bq27xxx: Add power_supply_battery_info support
>> >> >> >> * Supports the following chips (only BQ27425 is active)
>> >> >> >>   BQ27500, 545, 425, 421, 441, 621
>> >> >> >>
>> >> >> >> Changes in v3:
>> >> >> >> * BQ27425 tested; workaround minor chip bug
>> >> >> >> * Dropped driver_version
>> >> >> >> * Fixed dbg_dupes logic for .props & .dm_regs
>> >> >> >> * Dropped two props array dupes
>> >> >> >>
>> >> >> >> Changes in v2:
>> >> >> >> * Added di->opts flags for remaining chip features
>> >> >> >> * Commented out untested bq27xxx_dm_regs parameters
>> >> >> >> * Changed dbg_dupes to run only once
>> >> >> >>
>> >> >> >> Notes on v1:
>> >> >> >> * Not fully tested (hence RFC tag)
>> >> >> >
>> >> >> > Thanks, full series queued.
>> >> >> >
>> >> >> > -- Sebastian
>> >> >>
>> >> >> Anyway, I've not got the time to fight these changes anymore, but at
>> >> >> very least could you drop 4/5, it's static analysis code made into a
>> >> >> runtime check built into a kernel driver, if not at least add my
>> >> >> nacked-by. :)
>> >> >
>> >> > Since it's not critical at all and nobody depends on it, I dropped 4/5
>> >> > for now. I agree, that checking it at runtime is not nice. On the other
>> >> > hand I do think a duplication check makes sense. Doing a static
>> >> > check should be possible, but I have no idea how to implement this
>> >> > (without much effort). I suspect Coccinelle can do it, so I added
>> >> > Julia.
>> >> >
>> >> > For reference this is the runtime check:
>> >> > https://patchwork.kernel.org/patch/9918953/
>>
>> The data structures being checked start here:
>> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n138
>>
>> And are aggregated here:
>> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n743
>
> I worked a bit on this, but unfortunately there is a major parsing
> problem, and most of the definitions are ignored.  Specifically, the
> definitions of the regs variables are interspersed with eg:
>
> #define bq27510g1_regs bq27500_regs

You can transform the macros with sed to either of:

static u8 *bq27510g1_regs = 0 // skip comparison if x == 0

static u8 bq27510g1_regs[BQ27XXX_REG_MAX] = { 0xFF } // skip
comparison if x[0] == 0xff

Does that help?

> I'm not sure whether this would be convenient to fix, since parsing is
> rather delicate.  Coccinelle doesn't run cpp first.  It tries to parse
> macros definitions so that their code can be transformed as needed t the
> place of the definition.

^ permalink raw reply	[flat|nested] 63+ messages in thread

* [Cocci] [PATCH v3 0/5] bq27xxx_battery data memory update
@ 2017-08-31 11:01                 ` Liam Breck
  0 siblings, 0 replies; 63+ messages in thread
From: Liam Breck @ 2017-08-31 11:01 UTC (permalink / raw)
  To: cocci

On Thu, Aug 31, 2017 at 2:54 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
>
>
> On Tue, 29 Aug 2017, Liam Breck wrote:
>
>> Coccinelle folks,
>>
>> On Tue, Aug 29, 2017 at 5:29 PM, Sebastian Reichel
>> <sebastian.reichel@collabora.co.uk> wrote:
>> > Hi,
>> >
>> > On Tue, Aug 29, 2017 at 04:07:12PM -0700, Liam Breck wrote:
>> >> I don't see a Julia in CC list...
>> >
>> > <_< let's try that again.
>> >
>> >> On Tue, Aug 29, 2017 at 2:22 PM, Sebastian Reichel
>> >> <sebastian.reichel@collabora.co.uk> wrote:
>> >> > [adding Julia to Cc for Coccinelle question]
>> >> >
>> >> > Hi,
>> >> >
>> >> > On Tue, Aug 29, 2017 at 10:31:57AM -0500, Andrew F. Davis wrote:
>> >> >> On 08/29/2017 05:54 AM, Sebastian Reichel wrote:
>> >> >> > On Wed, Aug 23, 2017 at 08:36:12PM -0700, Liam Breck wrote:
>> >> >> >> Overview:
>> >> >> >> * Reorganizes chip data definitions
>> >> >> >> * Enables features landed in these patches:
>> >> >> >>   dt-bindings: power: supply: bq27xxx: Add monitored-battery documentation
>> >> >> >>   power: supply: bq27xxx: Add chip data memory read/write support
>> >> >> >>   power: supply: bq27xxx: Add power_supply_battery_info support
>> >> >> >> * Supports the following chips (only BQ27425 is active)
>> >> >> >>   BQ27500, 545, 425, 421, 441, 621
>> >> >> >>
>> >> >> >> Changes in v3:
>> >> >> >> * BQ27425 tested; workaround minor chip bug
>> >> >> >> * Dropped driver_version
>> >> >> >> * Fixed dbg_dupes logic for .props & .dm_regs
>> >> >> >> * Dropped two props array dupes
>> >> >> >>
>> >> >> >> Changes in v2:
>> >> >> >> * Added di->opts flags for remaining chip features
>> >> >> >> * Commented out untested bq27xxx_dm_regs parameters
>> >> >> >> * Changed dbg_dupes to run only once
>> >> >> >>
>> >> >> >> Notes on v1:
>> >> >> >> * Not fully tested (hence RFC tag)
>> >> >> >
>> >> >> > Thanks, full series queued.
>> >> >> >
>> >> >> > -- Sebastian
>> >> >>
>> >> >> Anyway, I've not got the time to fight these changes anymore, but at
>> >> >> very least could you drop 4/5, it's static analysis code made into a
>> >> >> runtime check built into a kernel driver, if not at least add my
>> >> >> nacked-by. :)
>> >> >
>> >> > Since it's not critical at all and nobody depends on it, I dropped 4/5
>> >> > for now. I agree, that checking it at runtime is not nice. On the other
>> >> > hand I do think a duplication check makes sense. Doing a static
>> >> > check should be possible, but I have no idea how to implement this
>> >> > (without much effort). I suspect Coccinelle can do it, so I added
>> >> > Julia.
>> >> >
>> >> > For reference this is the runtime check:
>> >> > https://patchwork.kernel.org/patch/9918953/
>>
>> The data structures being checked start here:
>> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n138
>>
>> And are aggregated here:
>> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n743
>
> I worked a bit on this, but unfortunately there is a major parsing
> problem, and most of the definitions are ignored.  Specifically, the
> definitions of the regs variables are interspersed with eg:
>
> #define bq27510g1_regs bq27500_regs

You can transform the macros with sed to either of:

static u8 *bq27510g1_regs = 0 // skip comparison if x == 0

static u8 bq27510g1_regs[BQ27XXX_REG_MAX] = { 0xFF } // skip
comparison if x[0] == 0xff

Does that help?

> I'm not sure whether this would be convenient to fix, since parsing is
> rather delicate.  Coccinelle doesn't run cpp first.  It tries to parse
> macros definitions so that their code can be transformed as needed t the
> place of the definition.

^ permalink raw reply	[flat|nested] 63+ messages in thread

* Re: [PATCH v3 0/5] bq27xxx_battery data memory update
  2017-08-31 11:01                 ` [Cocci] " Liam Breck
@ 2017-08-31 11:33                   ` Julia Lawall
  -1 siblings, 0 replies; 63+ messages in thread
From: Julia Lawall @ 2017-08-31 11:33 UTC (permalink / raw)
  To: Liam Breck
  Cc: Sebastian Reichel, Gilles Muller, Nicolas Palix, Michal Marek,
	cocci, Andrew F. Davis, Pali Rohár, Linux PM mailing list



On Thu, 31 Aug 2017, Liam Breck wrote:

> On Thu, Aug 31, 2017 at 2:54 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
> >
> >
> > On Tue, 29 Aug 2017, Liam Breck wrote:
> >
> >> Coccinelle folks,
> >>
> >> On Tue, Aug 29, 2017 at 5:29 PM, Sebastian Reichel
> >> <sebastian.reichel@collabora.co.uk> wrote:
> >> > Hi,
> >> >
> >> > On Tue, Aug 29, 2017 at 04:07:12PM -0700, Liam Breck wrote:
> >> >> I don't see a Julia in CC list...
> >> >
> >> > <_< let's try that again.
> >> >
> >> >> On Tue, Aug 29, 2017 at 2:22 PM, Sebastian Reichel
> >> >> <sebastian.reichel@collabora.co.uk> wrote:
> >> >> > [adding Julia to Cc for Coccinelle question]
> >> >> >
> >> >> > Hi,
> >> >> >
> >> >> > On Tue, Aug 29, 2017 at 10:31:57AM -0500, Andrew F. Davis wrote:
> >> >> >> On 08/29/2017 05:54 AM, Sebastian Reichel wrote:
> >> >> >> > On Wed, Aug 23, 2017 at 08:36:12PM -0700, Liam Breck wrote:
> >> >> >> >> Overview:
> >> >> >> >> * Reorganizes chip data definitions
> >> >> >> >> * Enables features landed in these patches:
> >> >> >> >>   dt-bindings: power: supply: bq27xxx: Add monitored-battery documentation
> >> >> >> >>   power: supply: bq27xxx: Add chip data memory read/write support
> >> >> >> >>   power: supply: bq27xxx: Add power_supply_battery_info support
> >> >> >> >> * Supports the following chips (only BQ27425 is active)
> >> >> >> >>   BQ27500, 545, 425, 421, 441, 621
> >> >> >> >>
> >> >> >> >> Changes in v3:
> >> >> >> >> * BQ27425 tested; workaround minor chip bug
> >> >> >> >> * Dropped driver_version
> >> >> >> >> * Fixed dbg_dupes logic for .props & .dm_regs
> >> >> >> >> * Dropped two props array dupes
> >> >> >> >>
> >> >> >> >> Changes in v2:
> >> >> >> >> * Added di->opts flags for remaining chip features
> >> >> >> >> * Commented out untested bq27xxx_dm_regs parameters
> >> >> >> >> * Changed dbg_dupes to run only once
> >> >> >> >>
> >> >> >> >> Notes on v1:
> >> >> >> >> * Not fully tested (hence RFC tag)
> >> >> >> >
> >> >> >> > Thanks, full series queued.
> >> >> >> >
> >> >> >> > -- Sebastian
> >> >> >>
> >> >> >> Anyway, I've not got the time to fight these changes anymore, but at
> >> >> >> very least could you drop 4/5, it's static analysis code made into a
> >> >> >> runtime check built into a kernel driver, if not at least add my
> >> >> >> nacked-by. :)
> >> >> >
> >> >> > Since it's not critical at all and nobody depends on it, I dropped 4/5
> >> >> > for now. I agree, that checking it at runtime is not nice. On the other
> >> >> > hand I do think a duplication check makes sense. Doing a static
> >> >> > check should be possible, but I have no idea how to implement this
> >> >> > (without much effort). I suspect Coccinelle can do it, so I added
> >> >> > Julia.
> >> >> >
> >> >> > For reference this is the runtime check:
> >> >> > https://patchwork.kernel.org/patch/9918953/
> >>
> >> The data structures being checked start here:
> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n138
> >>
> >> And are aggregated here:
> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n743
> >
> > I worked a bit on this, but unfortunately there is a major parsing
> > problem, and most of the definitions are ignored.  Specifically, the
> > definitions of the regs variables are interspersed with eg:
> >
> > #define bq27510g1_regs bq27500_regs
>
> You can transform the macros with sed to either of:
>
> static u8 *bq27510g1_regs = 0 // skip comparison if x == 0
>
> static u8 bq27510g1_regs[BQ27XXX_REG_MAX] = { 0xFF } // skip
> comparison if x[0] == 0xff
>
> Does that help?

Not quite, because it's really a list of variable declarations, like

int a, b, c, d;

The following could be fine:

*bq27510g1_regs = 0,

julia



>
> > I'm not sure whether this would be convenient to fix, since parsing is
> > rather delicate.  Coccinelle doesn't run cpp first.  It tries to parse
> > macros definitions so that their code can be transformed as needed t the
> > place of the definition.
>

^ permalink raw reply	[flat|nested] 63+ messages in thread

* [Cocci] [PATCH v3 0/5] bq27xxx_battery data memory update
@ 2017-08-31 11:33                   ` Julia Lawall
  0 siblings, 0 replies; 63+ messages in thread
From: Julia Lawall @ 2017-08-31 11:33 UTC (permalink / raw)
  To: cocci



On Thu, 31 Aug 2017, Liam Breck wrote:

> On Thu, Aug 31, 2017 at 2:54 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
> >
> >
> > On Tue, 29 Aug 2017, Liam Breck wrote:
> >
> >> Coccinelle folks,
> >>
> >> On Tue, Aug 29, 2017 at 5:29 PM, Sebastian Reichel
> >> <sebastian.reichel@collabora.co.uk> wrote:
> >> > Hi,
> >> >
> >> > On Tue, Aug 29, 2017 at 04:07:12PM -0700, Liam Breck wrote:
> >> >> I don't see a Julia in CC list...
> >> >
> >> > <_< let's try that again.
> >> >
> >> >> On Tue, Aug 29, 2017 at 2:22 PM, Sebastian Reichel
> >> >> <sebastian.reichel@collabora.co.uk> wrote:
> >> >> > [adding Julia to Cc for Coccinelle question]
> >> >> >
> >> >> > Hi,
> >> >> >
> >> >> > On Tue, Aug 29, 2017 at 10:31:57AM -0500, Andrew F. Davis wrote:
> >> >> >> On 08/29/2017 05:54 AM, Sebastian Reichel wrote:
> >> >> >> > On Wed, Aug 23, 2017 at 08:36:12PM -0700, Liam Breck wrote:
> >> >> >> >> Overview:
> >> >> >> >> * Reorganizes chip data definitions
> >> >> >> >> * Enables features landed in these patches:
> >> >> >> >>   dt-bindings: power: supply: bq27xxx: Add monitored-battery documentation
> >> >> >> >>   power: supply: bq27xxx: Add chip data memory read/write support
> >> >> >> >>   power: supply: bq27xxx: Add power_supply_battery_info support
> >> >> >> >> * Supports the following chips (only BQ27425 is active)
> >> >> >> >>   BQ27500, 545, 425, 421, 441, 621
> >> >> >> >>
> >> >> >> >> Changes in v3:
> >> >> >> >> * BQ27425 tested; workaround minor chip bug
> >> >> >> >> * Dropped driver_version
> >> >> >> >> * Fixed dbg_dupes logic for .props & .dm_regs
> >> >> >> >> * Dropped two props array dupes
> >> >> >> >>
> >> >> >> >> Changes in v2:
> >> >> >> >> * Added di->opts flags for remaining chip features
> >> >> >> >> * Commented out untested bq27xxx_dm_regs parameters
> >> >> >> >> * Changed dbg_dupes to run only once
> >> >> >> >>
> >> >> >> >> Notes on v1:
> >> >> >> >> * Not fully tested (hence RFC tag)
> >> >> >> >
> >> >> >> > Thanks, full series queued.
> >> >> >> >
> >> >> >> > -- Sebastian
> >> >> >>
> >> >> >> Anyway, I've not got the time to fight these changes anymore, but at
> >> >> >> very least could you drop 4/5, it's static analysis code made into a
> >> >> >> runtime check built into a kernel driver, if not at least add my
> >> >> >> nacked-by. :)
> >> >> >
> >> >> > Since it's not critical at all and nobody depends on it, I dropped 4/5
> >> >> > for now. I agree, that checking it at runtime is not nice. On the other
> >> >> > hand I do think a duplication check makes sense. Doing a static
> >> >> > check should be possible, but I have no idea how to implement this
> >> >> > (without much effort). I suspect Coccinelle can do it, so I added
> >> >> > Julia.
> >> >> >
> >> >> > For reference this is the runtime check:
> >> >> > https://patchwork.kernel.org/patch/9918953/
> >>
> >> The data structures being checked start here:
> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n138
> >>
> >> And are aggregated here:
> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n743
> >
> > I worked a bit on this, but unfortunately there is a major parsing
> > problem, and most of the definitions are ignored.  Specifically, the
> > definitions of the regs variables are interspersed with eg:
> >
> > #define bq27510g1_regs bq27500_regs
>
> You can transform the macros with sed to either of:
>
> static u8 *bq27510g1_regs = 0 // skip comparison if x == 0
>
> static u8 bq27510g1_regs[BQ27XXX_REG_MAX] = { 0xFF } // skip
> comparison if x[0] == 0xff
>
> Does that help?

Not quite, because it's really a list of variable declarations, like

int a, b, c, d;

The following could be fine:

*bq27510g1_regs = 0,

julia



>
> > I'm not sure whether this would be convenient to fix, since parsing is
> > rather delicate.  Coccinelle doesn't run cpp first.  It tries to parse
> > macros definitions so that their code can be transformed as needed t the
> > place of the definition.
>

^ permalink raw reply	[flat|nested] 63+ messages in thread

* Re: [PATCH v3 0/5] bq27xxx_battery data memory update
  2017-08-31 11:33                   ` [Cocci] " Julia Lawall
@ 2017-08-31 11:43                     ` Liam Breck
  -1 siblings, 0 replies; 63+ messages in thread
From: Liam Breck @ 2017-08-31 11:43 UTC (permalink / raw)
  To: Julia Lawall
  Cc: Sebastian Reichel, Gilles Muller, Nicolas Palix, Michal Marek,
	cocci, Andrew F. Davis, Pali Rohár, Linux PM mailing list

On Thu, Aug 31, 2017 at 4:33 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
>
>
> On Thu, 31 Aug 2017, Liam Breck wrote:
>
>> On Thu, Aug 31, 2017 at 2:54 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
>> >
>> >
>> > On Tue, 29 Aug 2017, Liam Breck wrote:
>> >
>> >> Coccinelle folks,
>> >>
>> >> On Tue, Aug 29, 2017 at 5:29 PM, Sebastian Reichel
>> >> <sebastian.reichel@collabora.co.uk> wrote:
>> >> > Hi,
>> >> >
>> >> > On Tue, Aug 29, 2017 at 04:07:12PM -0700, Liam Breck wrote:
>> >> >> I don't see a Julia in CC list...
>> >> >
>> >> > <_< let's try that again.
>> >> >
>> >> >> On Tue, Aug 29, 2017 at 2:22 PM, Sebastian Reichel
>> >> >> <sebastian.reichel@collabora.co.uk> wrote:
>> >> >> > [adding Julia to Cc for Coccinelle question]
>> >> >> >
>> >> >> > Hi,
>> >> >> >
>> >> >> > On Tue, Aug 29, 2017 at 10:31:57AM -0500, Andrew F. Davis wrote:
>> >> >> >> On 08/29/2017 05:54 AM, Sebastian Reichel wrote:
>> >> >> >> > On Wed, Aug 23, 2017 at 08:36:12PM -0700, Liam Breck wrote:
>> >> >> >> >> Overview:
>> >> >> >> >> * Reorganizes chip data definitions
>> >> >> >> >> * Enables features landed in these patches:
>> >> >> >> >>   dt-bindings: power: supply: bq27xxx: Add monitored-battery documentation
>> >> >> >> >>   power: supply: bq27xxx: Add chip data memory read/write support
>> >> >> >> >>   power: supply: bq27xxx: Add power_supply_battery_info support
>> >> >> >> >> * Supports the following chips (only BQ27425 is active)
>> >> >> >> >>   BQ27500, 545, 425, 421, 441, 621
>> >> >> >> >>
>> >> >> >> >> Changes in v3:
>> >> >> >> >> * BQ27425 tested; workaround minor chip bug
>> >> >> >> >> * Dropped driver_version
>> >> >> >> >> * Fixed dbg_dupes logic for .props & .dm_regs
>> >> >> >> >> * Dropped two props array dupes
>> >> >> >> >>
>> >> >> >> >> Changes in v2:
>> >> >> >> >> * Added di->opts flags for remaining chip features
>> >> >> >> >> * Commented out untested bq27xxx_dm_regs parameters
>> >> >> >> >> * Changed dbg_dupes to run only once
>> >> >> >> >>
>> >> >> >> >> Notes on v1:
>> >> >> >> >> * Not fully tested (hence RFC tag)
>> >> >> >> >
>> >> >> >> > Thanks, full series queued.
>> >> >> >> >
>> >> >> >> > -- Sebastian
>> >> >> >>
>> >> >> >> Anyway, I've not got the time to fight these changes anymore, but at
>> >> >> >> very least could you drop 4/5, it's static analysis code made into a
>> >> >> >> runtime check built into a kernel driver, if not at least add my
>> >> >> >> nacked-by. :)
>> >> >> >
>> >> >> > Since it's not critical at all and nobody depends on it, I dropped 4/5
>> >> >> > for now. I agree, that checking it at runtime is not nice. On the other
>> >> >> > hand I do think a duplication check makes sense. Doing a static
>> >> >> > check should be possible, but I have no idea how to implement this
>> >> >> > (without much effort). I suspect Coccinelle can do it, so I added
>> >> >> > Julia.
>> >> >> >
>> >> >> > For reference this is the runtime check:
>> >> >> > https://patchwork.kernel.org/patch/9918953/
>> >>
>> >> The data structures being checked start here:
>> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n138
>> >>
>> >> And are aggregated here:
>> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n743
>> >
>> > I worked a bit on this, but unfortunately there is a major parsing
>> > problem, and most of the definitions are ignored.  Specifically, the
>> > definitions of the regs variables are interspersed with eg:
>> >
>> > #define bq27510g1_regs bq27500_regs
>>
>> You can transform the macros with sed to either of:
>>
>> static u8 *bq27510g1_regs = 0 // skip comparison if x == 0
>>
>> static u8 bq27510g1_regs[BQ27XXX_REG_MAX] = { 0xFF } // skip
>> comparison if x[0] == 0xff
>>
>> Does that help?
>
> Not quite, because it's really a list of variable declarations, like
>
> int a, b, c, d;
>
> The following could be fine:
>
> *bq27510g1_regs = 0,

i forgot about the static u8 at the top of the array set. But yes,
just drop static u8 from either of the alternatives I gave.

^ permalink raw reply	[flat|nested] 63+ messages in thread

* [Cocci] [PATCH v3 0/5] bq27xxx_battery data memory update
@ 2017-08-31 11:43                     ` Liam Breck
  0 siblings, 0 replies; 63+ messages in thread
From: Liam Breck @ 2017-08-31 11:43 UTC (permalink / raw)
  To: cocci

On Thu, Aug 31, 2017 at 4:33 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
>
>
> On Thu, 31 Aug 2017, Liam Breck wrote:
>
>> On Thu, Aug 31, 2017 at 2:54 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
>> >
>> >
>> > On Tue, 29 Aug 2017, Liam Breck wrote:
>> >
>> >> Coccinelle folks,
>> >>
>> >> On Tue, Aug 29, 2017 at 5:29 PM, Sebastian Reichel
>> >> <sebastian.reichel@collabora.co.uk> wrote:
>> >> > Hi,
>> >> >
>> >> > On Tue, Aug 29, 2017 at 04:07:12PM -0700, Liam Breck wrote:
>> >> >> I don't see a Julia in CC list...
>> >> >
>> >> > <_< let's try that again.
>> >> >
>> >> >> On Tue, Aug 29, 2017 at 2:22 PM, Sebastian Reichel
>> >> >> <sebastian.reichel@collabora.co.uk> wrote:
>> >> >> > [adding Julia to Cc for Coccinelle question]
>> >> >> >
>> >> >> > Hi,
>> >> >> >
>> >> >> > On Tue, Aug 29, 2017 at 10:31:57AM -0500, Andrew F. Davis wrote:
>> >> >> >> On 08/29/2017 05:54 AM, Sebastian Reichel wrote:
>> >> >> >> > On Wed, Aug 23, 2017 at 08:36:12PM -0700, Liam Breck wrote:
>> >> >> >> >> Overview:
>> >> >> >> >> * Reorganizes chip data definitions
>> >> >> >> >> * Enables features landed in these patches:
>> >> >> >> >>   dt-bindings: power: supply: bq27xxx: Add monitored-battery documentation
>> >> >> >> >>   power: supply: bq27xxx: Add chip data memory read/write support
>> >> >> >> >>   power: supply: bq27xxx: Add power_supply_battery_info support
>> >> >> >> >> * Supports the following chips (only BQ27425 is active)
>> >> >> >> >>   BQ27500, 545, 425, 421, 441, 621
>> >> >> >> >>
>> >> >> >> >> Changes in v3:
>> >> >> >> >> * BQ27425 tested; workaround minor chip bug
>> >> >> >> >> * Dropped driver_version
>> >> >> >> >> * Fixed dbg_dupes logic for .props & .dm_regs
>> >> >> >> >> * Dropped two props array dupes
>> >> >> >> >>
>> >> >> >> >> Changes in v2:
>> >> >> >> >> * Added di->opts flags for remaining chip features
>> >> >> >> >> * Commented out untested bq27xxx_dm_regs parameters
>> >> >> >> >> * Changed dbg_dupes to run only once
>> >> >> >> >>
>> >> >> >> >> Notes on v1:
>> >> >> >> >> * Not fully tested (hence RFC tag)
>> >> >> >> >
>> >> >> >> > Thanks, full series queued.
>> >> >> >> >
>> >> >> >> > -- Sebastian
>> >> >> >>
>> >> >> >> Anyway, I've not got the time to fight these changes anymore, but at
>> >> >> >> very least could you drop 4/5, it's static analysis code made into a
>> >> >> >> runtime check built into a kernel driver, if not at least add my
>> >> >> >> nacked-by. :)
>> >> >> >
>> >> >> > Since it's not critical at all and nobody depends on it, I dropped 4/5
>> >> >> > for now. I agree, that checking it at runtime is not nice. On the other
>> >> >> > hand I do think a duplication check makes sense. Doing a static
>> >> >> > check should be possible, but I have no idea how to implement this
>> >> >> > (without much effort). I suspect Coccinelle can do it, so I added
>> >> >> > Julia.
>> >> >> >
>> >> >> > For reference this is the runtime check:
>> >> >> > https://patchwork.kernel.org/patch/9918953/
>> >>
>> >> The data structures being checked start here:
>> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n138
>> >>
>> >> And are aggregated here:
>> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n743
>> >
>> > I worked a bit on this, but unfortunately there is a major parsing
>> > problem, and most of the definitions are ignored.  Specifically, the
>> > definitions of the regs variables are interspersed with eg:
>> >
>> > #define bq27510g1_regs bq27500_regs
>>
>> You can transform the macros with sed to either of:
>>
>> static u8 *bq27510g1_regs = 0 // skip comparison if x == 0
>>
>> static u8 bq27510g1_regs[BQ27XXX_REG_MAX] = { 0xFF } // skip
>> comparison if x[0] == 0xff
>>
>> Does that help?
>
> Not quite, because it's really a list of variable declarations, like
>
> int a, b, c, d;
>
> The following could be fine:
>
> *bq27510g1_regs = 0,

i forgot about the static u8 at the top of the array set. But yes,
just drop static u8 from either of the alternatives I gave.

^ permalink raw reply	[flat|nested] 63+ messages in thread

* Re: [PATCH v3 0/5] bq27xxx_battery data memory update
  2017-08-31 11:43                     ` [Cocci] " Liam Breck
@ 2017-09-05 19:15                       ` Liam Breck
  -1 siblings, 0 replies; 63+ messages in thread
From: Liam Breck @ 2017-09-05 19:15 UTC (permalink / raw)
  To: Julia Lawall
  Cc: Linux PM mailing list, Nicolas Palix, Michal Marek,
	Pali Rohár, Sebastian Reichel, cocci

Hi Julia, any luck on this?

On Thu, Aug 31, 2017 at 4:43 AM, Liam Breck <liam@networkimprov.net> wrote:
> On Thu, Aug 31, 2017 at 4:33 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
>>
>>
>> On Thu, 31 Aug 2017, Liam Breck wrote:
>>
>>> On Thu, Aug 31, 2017 at 2:54 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
>>> >
>>> >
>>> > On Tue, 29 Aug 2017, Liam Breck wrote:
>>> >
>>> >> Coccinelle folks,
>>> >>
>>> >> On Tue, Aug 29, 2017 at 5:29 PM, Sebastian Reichel
>>> >> <sebastian.reichel@collabora.co.uk> wrote:
>>> >> > Hi,
>>> >> >
>>> >> > On Tue, Aug 29, 2017 at 04:07:12PM -0700, Liam Breck wrote:
>>> >> >> I don't see a Julia in CC list...
>>> >> >
>>> >> > <_< let's try that again.
>>> >> >
>>> >> >> On Tue, Aug 29, 2017 at 2:22 PM, Sebastian Reichel
>>> >> >> <sebastian.reichel@collabora.co.uk> wrote:
>>> >> >> > [adding Julia to Cc for Coccinelle question]
>>> >> >> >
>>> >> >> > Hi,
>>> >> >> >
>>> >> >> > On Tue, Aug 29, 2017 at 10:31:57AM -0500, Andrew F. Davis wrote:
>>> >> >> >> On 08/29/2017 05:54 AM, Sebastian Reichel wrote:
>>> >> >> >> > On Wed, Aug 23, 2017 at 08:36:12PM -0700, Liam Breck wrote:
>>> >> >> >> >> Overview:
>>> >> >> >> >> * Reorganizes chip data definitions
>>> >> >> >> >> * Enables features landed in these patches:
>>> >> >> >> >>   dt-bindings: power: supply: bq27xxx: Add monitored-battery documentation
>>> >> >> >> >>   power: supply: bq27xxx: Add chip data memory read/write support
>>> >> >> >> >>   power: supply: bq27xxx: Add power_supply_battery_info support
>>> >> >> >> >> * Supports the following chips (only BQ27425 is active)
>>> >> >> >> >>   BQ27500, 545, 425, 421, 441, 621
>>> >> >> >> >>
>>> >> >> >> >> Changes in v3:
>>> >> >> >> >> * BQ27425 tested; workaround minor chip bug
>>> >> >> >> >> * Dropped driver_version
>>> >> >> >> >> * Fixed dbg_dupes logic for .props & .dm_regs
>>> >> >> >> >> * Dropped two props array dupes
>>> >> >> >> >>
>>> >> >> >> >> Changes in v2:
>>> >> >> >> >> * Added di->opts flags for remaining chip features
>>> >> >> >> >> * Commented out untested bq27xxx_dm_regs parameters
>>> >> >> >> >> * Changed dbg_dupes to run only once
>>> >> >> >> >>
>>> >> >> >> >> Notes on v1:
>>> >> >> >> >> * Not fully tested (hence RFC tag)
>>> >> >> >> >
>>> >> >> >> > Thanks, full series queued.
>>> >> >> >> >
>>> >> >> >> > -- Sebastian
>>> >> >> >>
>>> >> >> >> Anyway, I've not got the time to fight these changes anymore, but at
>>> >> >> >> very least could you drop 4/5, it's static analysis code made into a
>>> >> >> >> runtime check built into a kernel driver, if not at least add my
>>> >> >> >> nacked-by. :)
>>> >> >> >
>>> >> >> > Since it's not critical at all and nobody depends on it, I dropped 4/5
>>> >> >> > for now. I agree, that checking it at runtime is not nice. On the other
>>> >> >> > hand I do think a duplication check makes sense. Doing a static
>>> >> >> > check should be possible, but I have no idea how to implement this
>>> >> >> > (without much effort). I suspect Coccinelle can do it, so I added
>>> >> >> > Julia.
>>> >> >> >
>>> >> >> > For reference this is the runtime check:
>>> >> >> > https://patchwork.kernel.org/patch/9918953/
>>> >>
>>> >> The data structures being checked start here:
>>> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n138
>>> >>
>>> >> And are aggregated here:
>>> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n743
>>> >
>>> > I worked a bit on this, but unfortunately there is a major parsing
>>> > problem, and most of the definitions are ignored.  Specifically, the
>>> > definitions of the regs variables are interspersed with eg:
>>> >
>>> > #define bq27510g1_regs bq27500_regs
>>>
>>> You can transform the macros with sed to either of:
>>>
>>> static u8 *bq27510g1_regs = 0 // skip comparison if x == 0
>>>
>>> static u8 bq27510g1_regs[BQ27XXX_REG_MAX] = { 0xFF } // skip
>>> comparison if x[0] == 0xff
>>>
>>> Does that help?
>>
>> Not quite, because it's really a list of variable declarations, like
>>
>> int a, b, c, d;
>>
>> The following could be fine:
>>
>> *bq27510g1_regs = 0,
>
> i forgot about the static u8 at the top of the array set. But yes,
> just drop static u8 from either of the alternatives I gave.

^ permalink raw reply	[flat|nested] 63+ messages in thread

* [Cocci] [PATCH v3 0/5] bq27xxx_battery data memory update
@ 2017-09-05 19:15                       ` Liam Breck
  0 siblings, 0 replies; 63+ messages in thread
From: Liam Breck @ 2017-09-05 19:15 UTC (permalink / raw)
  To: cocci

Hi Julia, any luck on this?

On Thu, Aug 31, 2017 at 4:43 AM, Liam Breck <liam@networkimprov.net> wrote:
> On Thu, Aug 31, 2017 at 4:33 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
>>
>>
>> On Thu, 31 Aug 2017, Liam Breck wrote:
>>
>>> On Thu, Aug 31, 2017 at 2:54 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
>>> >
>>> >
>>> > On Tue, 29 Aug 2017, Liam Breck wrote:
>>> >
>>> >> Coccinelle folks,
>>> >>
>>> >> On Tue, Aug 29, 2017 at 5:29 PM, Sebastian Reichel
>>> >> <sebastian.reichel@collabora.co.uk> wrote:
>>> >> > Hi,
>>> >> >
>>> >> > On Tue, Aug 29, 2017 at 04:07:12PM -0700, Liam Breck wrote:
>>> >> >> I don't see a Julia in CC list...
>>> >> >
>>> >> > <_< let's try that again.
>>> >> >
>>> >> >> On Tue, Aug 29, 2017 at 2:22 PM, Sebastian Reichel
>>> >> >> <sebastian.reichel@collabora.co.uk> wrote:
>>> >> >> > [adding Julia to Cc for Coccinelle question]
>>> >> >> >
>>> >> >> > Hi,
>>> >> >> >
>>> >> >> > On Tue, Aug 29, 2017 at 10:31:57AM -0500, Andrew F. Davis wrote:
>>> >> >> >> On 08/29/2017 05:54 AM, Sebastian Reichel wrote:
>>> >> >> >> > On Wed, Aug 23, 2017 at 08:36:12PM -0700, Liam Breck wrote:
>>> >> >> >> >> Overview:
>>> >> >> >> >> * Reorganizes chip data definitions
>>> >> >> >> >> * Enables features landed in these patches:
>>> >> >> >> >>   dt-bindings: power: supply: bq27xxx: Add monitored-battery documentation
>>> >> >> >> >>   power: supply: bq27xxx: Add chip data memory read/write support
>>> >> >> >> >>   power: supply: bq27xxx: Add power_supply_battery_info support
>>> >> >> >> >> * Supports the following chips (only BQ27425 is active)
>>> >> >> >> >>   BQ27500, 545, 425, 421, 441, 621
>>> >> >> >> >>
>>> >> >> >> >> Changes in v3:
>>> >> >> >> >> * BQ27425 tested; workaround minor chip bug
>>> >> >> >> >> * Dropped driver_version
>>> >> >> >> >> * Fixed dbg_dupes logic for .props & .dm_regs
>>> >> >> >> >> * Dropped two props array dupes
>>> >> >> >> >>
>>> >> >> >> >> Changes in v2:
>>> >> >> >> >> * Added di->opts flags for remaining chip features
>>> >> >> >> >> * Commented out untested bq27xxx_dm_regs parameters
>>> >> >> >> >> * Changed dbg_dupes to run only once
>>> >> >> >> >>
>>> >> >> >> >> Notes on v1:
>>> >> >> >> >> * Not fully tested (hence RFC tag)
>>> >> >> >> >
>>> >> >> >> > Thanks, full series queued.
>>> >> >> >> >
>>> >> >> >> > -- Sebastian
>>> >> >> >>
>>> >> >> >> Anyway, I've not got the time to fight these changes anymore, but at
>>> >> >> >> very least could you drop 4/5, it's static analysis code made into a
>>> >> >> >> runtime check built into a kernel driver, if not at least add my
>>> >> >> >> nacked-by. :)
>>> >> >> >
>>> >> >> > Since it's not critical at all and nobody depends on it, I dropped 4/5
>>> >> >> > for now. I agree, that checking it at runtime is not nice. On the other
>>> >> >> > hand I do think a duplication check makes sense. Doing a static
>>> >> >> > check should be possible, but I have no idea how to implement this
>>> >> >> > (without much effort). I suspect Coccinelle can do it, so I added
>>> >> >> > Julia.
>>> >> >> >
>>> >> >> > For reference this is the runtime check:
>>> >> >> > https://patchwork.kernel.org/patch/9918953/
>>> >>
>>> >> The data structures being checked start here:
>>> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n138
>>> >>
>>> >> And are aggregated here:
>>> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n743
>>> >
>>> > I worked a bit on this, but unfortunately there is a major parsing
>>> > problem, and most of the definitions are ignored.  Specifically, the
>>> > definitions of the regs variables are interspersed with eg:
>>> >
>>> > #define bq27510g1_regs bq27500_regs
>>>
>>> You can transform the macros with sed to either of:
>>>
>>> static u8 *bq27510g1_regs = 0 // skip comparison if x == 0
>>>
>>> static u8 bq27510g1_regs[BQ27XXX_REG_MAX] = { 0xFF } // skip
>>> comparison if x[0] == 0xff
>>>
>>> Does that help?
>>
>> Not quite, because it's really a list of variable declarations, like
>>
>> int a, b, c, d;
>>
>> The following could be fine:
>>
>> *bq27510g1_regs = 0,
>
> i forgot about the static u8 at the top of the array set. But yes,
> just drop static u8 from either of the alternatives I gave.

^ permalink raw reply	[flat|nested] 63+ messages in thread

* Re: [PATCH v3 0/5] bq27xxx_battery data memory update
  2017-09-05 19:15                       ` [Cocci] " Liam Breck
@ 2017-09-05 20:14                         ` Julia Lawall
  -1 siblings, 0 replies; 63+ messages in thread
From: Julia Lawall @ 2017-09-05 20:14 UTC (permalink / raw)
  To: Liam Breck
  Cc: Julia Lawall, Sebastian Reichel, Gilles Muller, Nicolas Palix,
	Michal Marek, cocci, Andrew F. Davis, Pali Rohár,
	Linux PM mailing list



On Tue, 5 Sep 2017, Liam Breck wrote:

> Hi Julia, any luck on this?

I was trying to improve the parser, but it seems that my improvements
don't have a sufficient effect so I will try your suggestion of just
seding out the offending code.

julia

>
> On Thu, Aug 31, 2017 at 4:43 AM, Liam Breck <liam@networkimprov.net> wrote:
> > On Thu, Aug 31, 2017 at 4:33 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
> >>
> >>
> >> On Thu, 31 Aug 2017, Liam Breck wrote:
> >>
> >>> On Thu, Aug 31, 2017 at 2:54 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
> >>> >
> >>> >
> >>> > On Tue, 29 Aug 2017, Liam Breck wrote:
> >>> >
> >>> >> Coccinelle folks,
> >>> >>
> >>> >> On Tue, Aug 29, 2017 at 5:29 PM, Sebastian Reichel
> >>> >> <sebastian.reichel@collabora.co.uk> wrote:
> >>> >> > Hi,
> >>> >> >
> >>> >> > On Tue, Aug 29, 2017 at 04:07:12PM -0700, Liam Breck wrote:
> >>> >> >> I don't see a Julia in CC list...
> >>> >> >
> >>> >> > <_< let's try that again.
> >>> >> >
> >>> >> >> On Tue, Aug 29, 2017 at 2:22 PM, Sebastian Reichel
> >>> >> >> <sebastian.reichel@collabora.co.uk> wrote:
> >>> >> >> > [adding Julia to Cc for Coccinelle question]
> >>> >> >> >
> >>> >> >> > Hi,
> >>> >> >> >
> >>> >> >> > On Tue, Aug 29, 2017 at 10:31:57AM -0500, Andrew F. Davis wrote:
> >>> >> >> >> On 08/29/2017 05:54 AM, Sebastian Reichel wrote:
> >>> >> >> >> > On Wed, Aug 23, 2017 at 08:36:12PM -0700, Liam Breck wrote:
> >>> >> >> >> >> Overview:
> >>> >> >> >> >> * Reorganizes chip data definitions
> >>> >> >> >> >> * Enables features landed in these patches:
> >>> >> >> >> >>   dt-bindings: power: supply: bq27xxx: Add monitored-battery documentation
> >>> >> >> >> >>   power: supply: bq27xxx: Add chip data memory read/write support
> >>> >> >> >> >>   power: supply: bq27xxx: Add power_supply_battery_info support
> >>> >> >> >> >> * Supports the following chips (only BQ27425 is active)
> >>> >> >> >> >>   BQ27500, 545, 425, 421, 441, 621
> >>> >> >> >> >>
> >>> >> >> >> >> Changes in v3:
> >>> >> >> >> >> * BQ27425 tested; workaround minor chip bug
> >>> >> >> >> >> * Dropped driver_version
> >>> >> >> >> >> * Fixed dbg_dupes logic for .props & .dm_regs
> >>> >> >> >> >> * Dropped two props array dupes
> >>> >> >> >> >>
> >>> >> >> >> >> Changes in v2:
> >>> >> >> >> >> * Added di->opts flags for remaining chip features
> >>> >> >> >> >> * Commented out untested bq27xxx_dm_regs parameters
> >>> >> >> >> >> * Changed dbg_dupes to run only once
> >>> >> >> >> >>
> >>> >> >> >> >> Notes on v1:
> >>> >> >> >> >> * Not fully tested (hence RFC tag)
> >>> >> >> >> >
> >>> >> >> >> > Thanks, full series queued.
> >>> >> >> >> >
> >>> >> >> >> > -- Sebastian
> >>> >> >> >>
> >>> >> >> >> Anyway, I've not got the time to fight these changes anymore, but at
> >>> >> >> >> very least could you drop 4/5, it's static analysis code made into a
> >>> >> >> >> runtime check built into a kernel driver, if not at least add my
> >>> >> >> >> nacked-by. :)
> >>> >> >> >
> >>> >> >> > Since it's not critical at all and nobody depends on it, I dropped 4/5
> >>> >> >> > for now. I agree, that checking it at runtime is not nice. On the other
> >>> >> >> > hand I do think a duplication check makes sense. Doing a static
> >>> >> >> > check should be possible, but I have no idea how to implement this
> >>> >> >> > (without much effort). I suspect Coccinelle can do it, so I added
> >>> >> >> > Julia.
> >>> >> >> >
> >>> >> >> > For reference this is the runtime check:
> >>> >> >> > https://patchwork.kernel.org/patch/9918953/
> >>> >>
> >>> >> The data structures being checked start here:
> >>> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n138
> >>> >>
> >>> >> And are aggregated here:
> >>> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n743
> >>> >
> >>> > I worked a bit on this, but unfortunately there is a major parsing
> >>> > problem, and most of the definitions are ignored.  Specifically, the
> >>> > definitions of the regs variables are interspersed with eg:
> >>> >
> >>> > #define bq27510g1_regs bq27500_regs
> >>>
> >>> You can transform the macros with sed to either of:
> >>>
> >>> static u8 *bq27510g1_regs = 0 // skip comparison if x == 0
> >>>
> >>> static u8 bq27510g1_regs[BQ27XXX_REG_MAX] = { 0xFF } // skip
> >>> comparison if x[0] == 0xff
> >>>
> >>> Does that help?
> >>
> >> Not quite, because it's really a list of variable declarations, like
> >>
> >> int a, b, c, d;
> >>
> >> The following could be fine:
> >>
> >> *bq27510g1_regs = 0,
> >
> > i forgot about the static u8 at the top of the array set. But yes,
> > just drop static u8 from either of the alternatives I gave.
>

^ permalink raw reply	[flat|nested] 63+ messages in thread

* [Cocci] [PATCH v3 0/5] bq27xxx_battery data memory update
@ 2017-09-05 20:14                         ` Julia Lawall
  0 siblings, 0 replies; 63+ messages in thread
From: Julia Lawall @ 2017-09-05 20:14 UTC (permalink / raw)
  To: cocci



On Tue, 5 Sep 2017, Liam Breck wrote:

> Hi Julia, any luck on this?

I was trying to improve the parser, but it seems that my improvements
don't have a sufficient effect so I will try your suggestion of just
seding out the offending code.

julia

>
> On Thu, Aug 31, 2017 at 4:43 AM, Liam Breck <liam@networkimprov.net> wrote:
> > On Thu, Aug 31, 2017 at 4:33 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
> >>
> >>
> >> On Thu, 31 Aug 2017, Liam Breck wrote:
> >>
> >>> On Thu, Aug 31, 2017 at 2:54 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
> >>> >
> >>> >
> >>> > On Tue, 29 Aug 2017, Liam Breck wrote:
> >>> >
> >>> >> Coccinelle folks,
> >>> >>
> >>> >> On Tue, Aug 29, 2017 at 5:29 PM, Sebastian Reichel
> >>> >> <sebastian.reichel@collabora.co.uk> wrote:
> >>> >> > Hi,
> >>> >> >
> >>> >> > On Tue, Aug 29, 2017 at 04:07:12PM -0700, Liam Breck wrote:
> >>> >> >> I don't see a Julia in CC list...
> >>> >> >
> >>> >> > <_< let's try that again.
> >>> >> >
> >>> >> >> On Tue, Aug 29, 2017 at 2:22 PM, Sebastian Reichel
> >>> >> >> <sebastian.reichel@collabora.co.uk> wrote:
> >>> >> >> > [adding Julia to Cc for Coccinelle question]
> >>> >> >> >
> >>> >> >> > Hi,
> >>> >> >> >
> >>> >> >> > On Tue, Aug 29, 2017 at 10:31:57AM -0500, Andrew F. Davis wrote:
> >>> >> >> >> On 08/29/2017 05:54 AM, Sebastian Reichel wrote:
> >>> >> >> >> > On Wed, Aug 23, 2017 at 08:36:12PM -0700, Liam Breck wrote:
> >>> >> >> >> >> Overview:
> >>> >> >> >> >> * Reorganizes chip data definitions
> >>> >> >> >> >> * Enables features landed in these patches:
> >>> >> >> >> >>   dt-bindings: power: supply: bq27xxx: Add monitored-battery documentation
> >>> >> >> >> >>   power: supply: bq27xxx: Add chip data memory read/write support
> >>> >> >> >> >>   power: supply: bq27xxx: Add power_supply_battery_info support
> >>> >> >> >> >> * Supports the following chips (only BQ27425 is active)
> >>> >> >> >> >>   BQ27500, 545, 425, 421, 441, 621
> >>> >> >> >> >>
> >>> >> >> >> >> Changes in v3:
> >>> >> >> >> >> * BQ27425 tested; workaround minor chip bug
> >>> >> >> >> >> * Dropped driver_version
> >>> >> >> >> >> * Fixed dbg_dupes logic for .props & .dm_regs
> >>> >> >> >> >> * Dropped two props array dupes
> >>> >> >> >> >>
> >>> >> >> >> >> Changes in v2:
> >>> >> >> >> >> * Added di->opts flags for remaining chip features
> >>> >> >> >> >> * Commented out untested bq27xxx_dm_regs parameters
> >>> >> >> >> >> * Changed dbg_dupes to run only once
> >>> >> >> >> >>
> >>> >> >> >> >> Notes on v1:
> >>> >> >> >> >> * Not fully tested (hence RFC tag)
> >>> >> >> >> >
> >>> >> >> >> > Thanks, full series queued.
> >>> >> >> >> >
> >>> >> >> >> > -- Sebastian
> >>> >> >> >>
> >>> >> >> >> Anyway, I've not got the time to fight these changes anymore, but at
> >>> >> >> >> very least could you drop 4/5, it's static analysis code made into a
> >>> >> >> >> runtime check built into a kernel driver, if not at least add my
> >>> >> >> >> nacked-by. :)
> >>> >> >> >
> >>> >> >> > Since it's not critical at all and nobody depends on it, I dropped 4/5
> >>> >> >> > for now. I agree, that checking it at runtime is not nice. On the other
> >>> >> >> > hand I do think a duplication check makes sense. Doing a static
> >>> >> >> > check should be possible, but I have no idea how to implement this
> >>> >> >> > (without much effort). I suspect Coccinelle can do it, so I added
> >>> >> >> > Julia.
> >>> >> >> >
> >>> >> >> > For reference this is the runtime check:
> >>> >> >> > https://patchwork.kernel.org/patch/9918953/
> >>> >>
> >>> >> The data structures being checked start here:
> >>> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n138
> >>> >>
> >>> >> And are aggregated here:
> >>> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n743
> >>> >
> >>> > I worked a bit on this, but unfortunately there is a major parsing
> >>> > problem, and most of the definitions are ignored.  Specifically, the
> >>> > definitions of the regs variables are interspersed with eg:
> >>> >
> >>> > #define bq27510g1_regs bq27500_regs
> >>>
> >>> You can transform the macros with sed to either of:
> >>>
> >>> static u8 *bq27510g1_regs = 0 // skip comparison if x == 0
> >>>
> >>> static u8 bq27510g1_regs[BQ27XXX_REG_MAX] = { 0xFF } // skip
> >>> comparison if x[0] == 0xff
> >>>
> >>> Does that help?
> >>
> >> Not quite, because it's really a list of variable declarations, like
> >>
> >> int a, b, c, d;
> >>
> >> The following could be fine:
> >>
> >> *bq27510g1_regs = 0,
> >
> > i forgot about the static u8 at the top of the array set. But yes,
> > just drop static u8 from either of the alternatives I gave.
>

^ permalink raw reply	[flat|nested] 63+ messages in thread

* Re: [PATCH v3 0/5] bq27xxx_battery data memory update
  2017-09-05 20:14                         ` [Cocci] " Julia Lawall
@ 2017-09-18  0:45                           ` Liam Breck
  -1 siblings, 0 replies; 63+ messages in thread
From: Liam Breck @ 2017-09-18  0:45 UTC (permalink / raw)
  To: Julia Lawall
  Cc: Sebastian Reichel, Gilles Muller, Nicolas Palix, Michal Marek,
	cocci, Andrew F. Davis, Pali Rohár, Linux PM mailing list

Hi Julia, checking back...



On Tue, Sep 5, 2017 at 1:14 PM, Julia Lawall <julia.lawall@lip6.fr> wrote:
>
>
> On Tue, 5 Sep 2017, Liam Breck wrote:
>
>> Hi Julia, any luck on this?
>
> I was trying to improve the parser, but it seems that my improvements
> don't have a sufficient effect so I will try your suggestion of just
> seding out the offending code.
>
> julia
>
>>
>> On Thu, Aug 31, 2017 at 4:43 AM, Liam Breck <liam@networkimprov.net> wrote:
>> > On Thu, Aug 31, 2017 at 4:33 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
>> >>
>> >>
>> >> On Thu, 31 Aug 2017, Liam Breck wrote:
>> >>
>> >>> On Thu, Aug 31, 2017 at 2:54 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
>> >>> >
>> >>> >
>> >>> > On Tue, 29 Aug 2017, Liam Breck wrote:
>> >>> >
>> >>> >> Coccinelle folks,
>> >>> >>
>> >>> >> On Tue, Aug 29, 2017 at 5:29 PM, Sebastian Reichel
>> >>> >> <sebastian.reichel@collabora.co.uk> wrote:
>> >>> >> > Hi,
>> >>> >> >
>> >>> >> > On Tue, Aug 29, 2017 at 04:07:12PM -0700, Liam Breck wrote:
>> >>> >> >> I don't see a Julia in CC list...
>> >>> >> >
>> >>> >> > <_< let's try that again.
>> >>> >> >
>> >>> >> >> On Tue, Aug 29, 2017 at 2:22 PM, Sebastian Reichel
>> >>> >> >> <sebastian.reichel@collabora.co.uk> wrote:
>> >>> >> >> > [adding Julia to Cc for Coccinelle question]
>> >>> >> >> >
>> >>> >> >> > Hi,
>> >>> >> >> >
>> >>> >> >> > On Tue, Aug 29, 2017 at 10:31:57AM -0500, Andrew F. Davis wrote:
>> >>> >> >> >> On 08/29/2017 05:54 AM, Sebastian Reichel wrote:
>> >>> >> >> >> > On Wed, Aug 23, 2017 at 08:36:12PM -0700, Liam Breck wrote:
>> >>> >> >> >> >> Overview:
>> >>> >> >> >> >> * Reorganizes chip data definitions
>> >>> >> >> >> >> * Enables features landed in these patches:
>> >>> >> >> >> >>   dt-bindings: power: supply: bq27xxx: Add monitored-battery documentation
>> >>> >> >> >> >>   power: supply: bq27xxx: Add chip data memory read/write support
>> >>> >> >> >> >>   power: supply: bq27xxx: Add power_supply_battery_info support
>> >>> >> >> >> >> * Supports the following chips (only BQ27425 is active)
>> >>> >> >> >> >>   BQ27500, 545, 425, 421, 441, 621
>> >>> >> >> >> >>
>> >>> >> >> >> >> Changes in v3:
>> >>> >> >> >> >> * BQ27425 tested; workaround minor chip bug
>> >>> >> >> >> >> * Dropped driver_version
>> >>> >> >> >> >> * Fixed dbg_dupes logic for .props & .dm_regs
>> >>> >> >> >> >> * Dropped two props array dupes
>> >>> >> >> >> >>
>> >>> >> >> >> >> Changes in v2:
>> >>> >> >> >> >> * Added di->opts flags for remaining chip features
>> >>> >> >> >> >> * Commented out untested bq27xxx_dm_regs parameters
>> >>> >> >> >> >> * Changed dbg_dupes to run only once
>> >>> >> >> >> >>
>> >>> >> >> >> >> Notes on v1:
>> >>> >> >> >> >> * Not fully tested (hence RFC tag)
>> >>> >> >> >> >
>> >>> >> >> >> > Thanks, full series queued.
>> >>> >> >> >> >
>> >>> >> >> >> > -- Sebastian
>> >>> >> >> >>
>> >>> >> >> >> Anyway, I've not got the time to fight these changes anymore, but at
>> >>> >> >> >> very least could you drop 4/5, it's static analysis code made into a
>> >>> >> >> >> runtime check built into a kernel driver, if not at least add my
>> >>> >> >> >> nacked-by. :)
>> >>> >> >> >
>> >>> >> >> > Since it's not critical at all and nobody depends on it, I dropped 4/5
>> >>> >> >> > for now. I agree, that checking it at runtime is not nice. On the other
>> >>> >> >> > hand I do think a duplication check makes sense. Doing a static
>> >>> >> >> > check should be possible, but I have no idea how to implement this
>> >>> >> >> > (without much effort). I suspect Coccinelle can do it, so I added
>> >>> >> >> > Julia.
>> >>> >> >> >
>> >>> >> >> > For reference this is the runtime check:
>> >>> >> >> > https://patchwork.kernel.org/patch/9918953/
>> >>> >>
>> >>> >> The data structures being checked start here:
>> >>> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n138
>> >>> >>
>> >>> >> And are aggregated here:
>> >>> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n743
>> >>> >
>> >>> > I worked a bit on this, but unfortunately there is a major parsing
>> >>> > problem, and most of the definitions are ignored.  Specifically, the
>> >>> > definitions of the regs variables are interspersed with eg:
>> >>> >
>> >>> > #define bq27510g1_regs bq27500_regs
>> >>>
>> >>> You can transform the macros with sed to either of:
>> >>>
>> >>> static u8 *bq27510g1_regs = 0 // skip comparison if x == 0
>> >>>
>> >>> static u8 bq27510g1_regs[BQ27XXX_REG_MAX] = { 0xFF } // skip
>> >>> comparison if x[0] == 0xff
>> >>>
>> >>> Does that help?
>> >>
>> >> Not quite, because it's really a list of variable declarations, like
>> >>
>> >> int a, b, c, d;
>> >>
>> >> The following could be fine:
>> >>
>> >> *bq27510g1_regs = 0,
>> >
>> > i forgot about the static u8 at the top of the array set. But yes,
>> > just drop static u8 from either of the alternatives I gave.
>>

^ permalink raw reply	[flat|nested] 63+ messages in thread

* [Cocci] [PATCH v3 0/5] bq27xxx_battery data memory update
@ 2017-09-18  0:45                           ` Liam Breck
  0 siblings, 0 replies; 63+ messages in thread
From: Liam Breck @ 2017-09-18  0:45 UTC (permalink / raw)
  To: cocci

Hi Julia, checking back...



On Tue, Sep 5, 2017 at 1:14 PM, Julia Lawall <julia.lawall@lip6.fr> wrote:
>
>
> On Tue, 5 Sep 2017, Liam Breck wrote:
>
>> Hi Julia, any luck on this?
>
> I was trying to improve the parser, but it seems that my improvements
> don't have a sufficient effect so I will try your suggestion of just
> seding out the offending code.
>
> julia
>
>>
>> On Thu, Aug 31, 2017 at 4:43 AM, Liam Breck <liam@networkimprov.net> wrote:
>> > On Thu, Aug 31, 2017 at 4:33 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
>> >>
>> >>
>> >> On Thu, 31 Aug 2017, Liam Breck wrote:
>> >>
>> >>> On Thu, Aug 31, 2017 at 2:54 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
>> >>> >
>> >>> >
>> >>> > On Tue, 29 Aug 2017, Liam Breck wrote:
>> >>> >
>> >>> >> Coccinelle folks,
>> >>> >>
>> >>> >> On Tue, Aug 29, 2017 at 5:29 PM, Sebastian Reichel
>> >>> >> <sebastian.reichel@collabora.co.uk> wrote:
>> >>> >> > Hi,
>> >>> >> >
>> >>> >> > On Tue, Aug 29, 2017 at 04:07:12PM -0700, Liam Breck wrote:
>> >>> >> >> I don't see a Julia in CC list...
>> >>> >> >
>> >>> >> > <_< let's try that again.
>> >>> >> >
>> >>> >> >> On Tue, Aug 29, 2017 at 2:22 PM, Sebastian Reichel
>> >>> >> >> <sebastian.reichel@collabora.co.uk> wrote:
>> >>> >> >> > [adding Julia to Cc for Coccinelle question]
>> >>> >> >> >
>> >>> >> >> > Hi,
>> >>> >> >> >
>> >>> >> >> > On Tue, Aug 29, 2017 at 10:31:57AM -0500, Andrew F. Davis wrote:
>> >>> >> >> >> On 08/29/2017 05:54 AM, Sebastian Reichel wrote:
>> >>> >> >> >> > On Wed, Aug 23, 2017 at 08:36:12PM -0700, Liam Breck wrote:
>> >>> >> >> >> >> Overview:
>> >>> >> >> >> >> * Reorganizes chip data definitions
>> >>> >> >> >> >> * Enables features landed in these patches:
>> >>> >> >> >> >>   dt-bindings: power: supply: bq27xxx: Add monitored-battery documentation
>> >>> >> >> >> >>   power: supply: bq27xxx: Add chip data memory read/write support
>> >>> >> >> >> >>   power: supply: bq27xxx: Add power_supply_battery_info support
>> >>> >> >> >> >> * Supports the following chips (only BQ27425 is active)
>> >>> >> >> >> >>   BQ27500, 545, 425, 421, 441, 621
>> >>> >> >> >> >>
>> >>> >> >> >> >> Changes in v3:
>> >>> >> >> >> >> * BQ27425 tested; workaround minor chip bug
>> >>> >> >> >> >> * Dropped driver_version
>> >>> >> >> >> >> * Fixed dbg_dupes logic for .props & .dm_regs
>> >>> >> >> >> >> * Dropped two props array dupes
>> >>> >> >> >> >>
>> >>> >> >> >> >> Changes in v2:
>> >>> >> >> >> >> * Added di->opts flags for remaining chip features
>> >>> >> >> >> >> * Commented out untested bq27xxx_dm_regs parameters
>> >>> >> >> >> >> * Changed dbg_dupes to run only once
>> >>> >> >> >> >>
>> >>> >> >> >> >> Notes on v1:
>> >>> >> >> >> >> * Not fully tested (hence RFC tag)
>> >>> >> >> >> >
>> >>> >> >> >> > Thanks, full series queued.
>> >>> >> >> >> >
>> >>> >> >> >> > -- Sebastian
>> >>> >> >> >>
>> >>> >> >> >> Anyway, I've not got the time to fight these changes anymore, but at
>> >>> >> >> >> very least could you drop 4/5, it's static analysis code made into a
>> >>> >> >> >> runtime check built into a kernel driver, if not at least add my
>> >>> >> >> >> nacked-by. :)
>> >>> >> >> >
>> >>> >> >> > Since it's not critical at all and nobody depends on it, I dropped 4/5
>> >>> >> >> > for now. I agree, that checking it at runtime is not nice. On the other
>> >>> >> >> > hand I do think a duplication check makes sense. Doing a static
>> >>> >> >> > check should be possible, but I have no idea how to implement this
>> >>> >> >> > (without much effort). I suspect Coccinelle can do it, so I added
>> >>> >> >> > Julia.
>> >>> >> >> >
>> >>> >> >> > For reference this is the runtime check:
>> >>> >> >> > https://patchwork.kernel.org/patch/9918953/
>> >>> >>
>> >>> >> The data structures being checked start here:
>> >>> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n138
>> >>> >>
>> >>> >> And are aggregated here:
>> >>> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n743
>> >>> >
>> >>> > I worked a bit on this, but unfortunately there is a major parsing
>> >>> > problem, and most of the definitions are ignored.  Specifically, the
>> >>> > definitions of the regs variables are interspersed with eg:
>> >>> >
>> >>> > #define bq27510g1_regs bq27500_regs
>> >>>
>> >>> You can transform the macros with sed to either of:
>> >>>
>> >>> static u8 *bq27510g1_regs = 0 // skip comparison if x == 0
>> >>>
>> >>> static u8 bq27510g1_regs[BQ27XXX_REG_MAX] = { 0xFF } // skip
>> >>> comparison if x[0] == 0xff
>> >>>
>> >>> Does that help?
>> >>
>> >> Not quite, because it's really a list of variable declarations, like
>> >>
>> >> int a, b, c, d;
>> >>
>> >> The following could be fine:
>> >>
>> >> *bq27510g1_regs = 0,
>> >
>> > i forgot about the static u8 at the top of the array set. But yes,
>> > just drop static u8 from either of the alternatives I gave.
>>

^ permalink raw reply	[flat|nested] 63+ messages in thread

* Re: [PATCH v3 0/5] bq27xxx_battery data memory update
  2017-09-18  0:45                           ` [Cocci] " Liam Breck
@ 2017-09-18  5:33                             ` Julia Lawall
  -1 siblings, 0 replies; 63+ messages in thread
From: Julia Lawall @ 2017-09-18  5:33 UTC (permalink / raw)
  To: Liam Breck
  Cc: Julia Lawall, Sebastian Reichel, Gilles Muller, Nicolas Palix,
	Michal Marek, cocci, Andrew F. Davis, Pali Rohár,
	Linux PM mailing list



On Sun, 17 Sep 2017, Liam Breck wrote:

> Hi Julia, checking back...

Hi, I have something that works in terms of the names of the macros.  Ie
if there is

#define XXX 12

and

#define YYY 12

it doesn't know that XXX and YYY are the same thing.

I haven't posted it because I needed to make a change to the parser of
Coccinelle and Coccinelle is a bit unstable at the moment.  But things
should converge soon.

julia

>
>
>
> On Tue, Sep 5, 2017 at 1:14 PM, Julia Lawall <julia.lawall@lip6.fr> wrote:
> >
> >
> > On Tue, 5 Sep 2017, Liam Breck wrote:
> >
> >> Hi Julia, any luck on this?
> >
> > I was trying to improve the parser, but it seems that my improvements
> > don't have a sufficient effect so I will try your suggestion of just
> > seding out the offending code.
> >
> > julia
> >
> >>
> >> On Thu, Aug 31, 2017 at 4:43 AM, Liam Breck <liam@networkimprov.net> wrote:
> >> > On Thu, Aug 31, 2017 at 4:33 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
> >> >>
> >> >>
> >> >> On Thu, 31 Aug 2017, Liam Breck wrote:
> >> >>
> >> >>> On Thu, Aug 31, 2017 at 2:54 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
> >> >>> >
> >> >>> >
> >> >>> > On Tue, 29 Aug 2017, Liam Breck wrote:
> >> >>> >
> >> >>> >> Coccinelle folks,
> >> >>> >>
> >> >>> >> On Tue, Aug 29, 2017 at 5:29 PM, Sebastian Reichel
> >> >>> >> <sebastian.reichel@collabora.co.uk> wrote:
> >> >>> >> > Hi,
> >> >>> >> >
> >> >>> >> > On Tue, Aug 29, 2017 at 04:07:12PM -0700, Liam Breck wrote:
> >> >>> >> >> I don't see a Julia in CC list...
> >> >>> >> >
> >> >>> >> > <_< let's try that again.
> >> >>> >> >
> >> >>> >> >> On Tue, Aug 29, 2017 at 2:22 PM, Sebastian Reichel
> >> >>> >> >> <sebastian.reichel@collabora.co.uk> wrote:
> >> >>> >> >> > [adding Julia to Cc for Coccinelle question]
> >> >>> >> >> >
> >> >>> >> >> > Hi,
> >> >>> >> >> >
> >> >>> >> >> > On Tue, Aug 29, 2017 at 10:31:57AM -0500, Andrew F. Davis wrote:
> >> >>> >> >> >> On 08/29/2017 05:54 AM, Sebastian Reichel wrote:
> >> >>> >> >> >> > On Wed, Aug 23, 2017 at 08:36:12PM -0700, Liam Breck wrote:
> >> >>> >> >> >> >> Overview:
> >> >>> >> >> >> >> * Reorganizes chip data definitions
> >> >>> >> >> >> >> * Enables features landed in these patches:
> >> >>> >> >> >> >>   dt-bindings: power: supply: bq27xxx: Add monitored-battery documentation
> >> >>> >> >> >> >>   power: supply: bq27xxx: Add chip data memory read/write support
> >> >>> >> >> >> >>   power: supply: bq27xxx: Add power_supply_battery_info support
> >> >>> >> >> >> >> * Supports the following chips (only BQ27425 is active)
> >> >>> >> >> >> >>   BQ27500, 545, 425, 421, 441, 621
> >> >>> >> >> >> >>
> >> >>> >> >> >> >> Changes in v3:
> >> >>> >> >> >> >> * BQ27425 tested; workaround minor chip bug
> >> >>> >> >> >> >> * Dropped driver_version
> >> >>> >> >> >> >> * Fixed dbg_dupes logic for .props & .dm_regs
> >> >>> >> >> >> >> * Dropped two props array dupes
> >> >>> >> >> >> >>
> >> >>> >> >> >> >> Changes in v2:
> >> >>> >> >> >> >> * Added di->opts flags for remaining chip features
> >> >>> >> >> >> >> * Commented out untested bq27xxx_dm_regs parameters
> >> >>> >> >> >> >> * Changed dbg_dupes to run only once
> >> >>> >> >> >> >>
> >> >>> >> >> >> >> Notes on v1:
> >> >>> >> >> >> >> * Not fully tested (hence RFC tag)
> >> >>> >> >> >> >
> >> >>> >> >> >> > Thanks, full series queued.
> >> >>> >> >> >> >
> >> >>> >> >> >> > -- Sebastian
> >> >>> >> >> >>
> >> >>> >> >> >> Anyway, I've not got the time to fight these changes anymore, but at
> >> >>> >> >> >> very least could you drop 4/5, it's static analysis code made into a
> >> >>> >> >> >> runtime check built into a kernel driver, if not at least add my
> >> >>> >> >> >> nacked-by. :)
> >> >>> >> >> >
> >> >>> >> >> > Since it's not critical at all and nobody depends on it, I dropped 4/5
> >> >>> >> >> > for now. I agree, that checking it at runtime is not nice. On the other
> >> >>> >> >> > hand I do think a duplication check makes sense. Doing a static
> >> >>> >> >> > check should be possible, but I have no idea how to implement this
> >> >>> >> >> > (without much effort). I suspect Coccinelle can do it, so I added
> >> >>> >> >> > Julia.
> >> >>> >> >> >
> >> >>> >> >> > For reference this is the runtime check:
> >> >>> >> >> > https://patchwork.kernel.org/patch/9918953/
> >> >>> >>
> >> >>> >> The data structures being checked start here:
> >> >>> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n138
> >> >>> >>
> >> >>> >> And are aggregated here:
> >> >>> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n743
> >> >>> >
> >> >>> > I worked a bit on this, but unfortunately there is a major parsing
> >> >>> > problem, and most of the definitions are ignored.  Specifically, the
> >> >>> > definitions of the regs variables are interspersed with eg:
> >> >>> >
> >> >>> > #define bq27510g1_regs bq27500_regs
> >> >>>
> >> >>> You can transform the macros with sed to either of:
> >> >>>
> >> >>> static u8 *bq27510g1_regs = 0 // skip comparison if x == 0
> >> >>>
> >> >>> static u8 bq27510g1_regs[BQ27XXX_REG_MAX] = { 0xFF } // skip
> >> >>> comparison if x[0] == 0xff
> >> >>>
> >> >>> Does that help?
> >> >>
> >> >> Not quite, because it's really a list of variable declarations, like
> >> >>
> >> >> int a, b, c, d;
> >> >>
> >> >> The following could be fine:
> >> >>
> >> >> *bq27510g1_regs = 0,
> >> >
> >> > i forgot about the static u8 at the top of the array set. But yes,
> >> > just drop static u8 from either of the alternatives I gave.
> >>
>

^ permalink raw reply	[flat|nested] 63+ messages in thread

* [Cocci] [PATCH v3 0/5] bq27xxx_battery data memory update
@ 2017-09-18  5:33                             ` Julia Lawall
  0 siblings, 0 replies; 63+ messages in thread
From: Julia Lawall @ 2017-09-18  5:33 UTC (permalink / raw)
  To: cocci



On Sun, 17 Sep 2017, Liam Breck wrote:

> Hi Julia, checking back...

Hi, I have something that works in terms of the names of the macros.  Ie
if there is

#define XXX 12

and

#define YYY 12

it doesn't know that XXX and YYY are the same thing.

I haven't posted it because I needed to make a change to the parser of
Coccinelle and Coccinelle is a bit unstable at the moment.  But things
should converge soon.

julia

>
>
>
> On Tue, Sep 5, 2017 at 1:14 PM, Julia Lawall <julia.lawall@lip6.fr> wrote:
> >
> >
> > On Tue, 5 Sep 2017, Liam Breck wrote:
> >
> >> Hi Julia, any luck on this?
> >
> > I was trying to improve the parser, but it seems that my improvements
> > don't have a sufficient effect so I will try your suggestion of just
> > seding out the offending code.
> >
> > julia
> >
> >>
> >> On Thu, Aug 31, 2017 at 4:43 AM, Liam Breck <liam@networkimprov.net> wrote:
> >> > On Thu, Aug 31, 2017 at 4:33 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
> >> >>
> >> >>
> >> >> On Thu, 31 Aug 2017, Liam Breck wrote:
> >> >>
> >> >>> On Thu, Aug 31, 2017 at 2:54 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
> >> >>> >
> >> >>> >
> >> >>> > On Tue, 29 Aug 2017, Liam Breck wrote:
> >> >>> >
> >> >>> >> Coccinelle folks,
> >> >>> >>
> >> >>> >> On Tue, Aug 29, 2017 at 5:29 PM, Sebastian Reichel
> >> >>> >> <sebastian.reichel@collabora.co.uk> wrote:
> >> >>> >> > Hi,
> >> >>> >> >
> >> >>> >> > On Tue, Aug 29, 2017 at 04:07:12PM -0700, Liam Breck wrote:
> >> >>> >> >> I don't see a Julia in CC list...
> >> >>> >> >
> >> >>> >> > <_< let's try that again.
> >> >>> >> >
> >> >>> >> >> On Tue, Aug 29, 2017 at 2:22 PM, Sebastian Reichel
> >> >>> >> >> <sebastian.reichel@collabora.co.uk> wrote:
> >> >>> >> >> > [adding Julia to Cc for Coccinelle question]
> >> >>> >> >> >
> >> >>> >> >> > Hi,
> >> >>> >> >> >
> >> >>> >> >> > On Tue, Aug 29, 2017 at 10:31:57AM -0500, Andrew F. Davis wrote:
> >> >>> >> >> >> On 08/29/2017 05:54 AM, Sebastian Reichel wrote:
> >> >>> >> >> >> > On Wed, Aug 23, 2017 at 08:36:12PM -0700, Liam Breck wrote:
> >> >>> >> >> >> >> Overview:
> >> >>> >> >> >> >> * Reorganizes chip data definitions
> >> >>> >> >> >> >> * Enables features landed in these patches:
> >> >>> >> >> >> >>   dt-bindings: power: supply: bq27xxx: Add monitored-battery documentation
> >> >>> >> >> >> >>   power: supply: bq27xxx: Add chip data memory read/write support
> >> >>> >> >> >> >>   power: supply: bq27xxx: Add power_supply_battery_info support
> >> >>> >> >> >> >> * Supports the following chips (only BQ27425 is active)
> >> >>> >> >> >> >>   BQ27500, 545, 425, 421, 441, 621
> >> >>> >> >> >> >>
> >> >>> >> >> >> >> Changes in v3:
> >> >>> >> >> >> >> * BQ27425 tested; workaround minor chip bug
> >> >>> >> >> >> >> * Dropped driver_version
> >> >>> >> >> >> >> * Fixed dbg_dupes logic for .props & .dm_regs
> >> >>> >> >> >> >> * Dropped two props array dupes
> >> >>> >> >> >> >>
> >> >>> >> >> >> >> Changes in v2:
> >> >>> >> >> >> >> * Added di->opts flags for remaining chip features
> >> >>> >> >> >> >> * Commented out untested bq27xxx_dm_regs parameters
> >> >>> >> >> >> >> * Changed dbg_dupes to run only once
> >> >>> >> >> >> >>
> >> >>> >> >> >> >> Notes on v1:
> >> >>> >> >> >> >> * Not fully tested (hence RFC tag)
> >> >>> >> >> >> >
> >> >>> >> >> >> > Thanks, full series queued.
> >> >>> >> >> >> >
> >> >>> >> >> >> > -- Sebastian
> >> >>> >> >> >>
> >> >>> >> >> >> Anyway, I've not got the time to fight these changes anymore, but at
> >> >>> >> >> >> very least could you drop 4/5, it's static analysis code made into a
> >> >>> >> >> >> runtime check built into a kernel driver, if not at least add my
> >> >>> >> >> >> nacked-by. :)
> >> >>> >> >> >
> >> >>> >> >> > Since it's not critical at all and nobody depends on it, I dropped 4/5
> >> >>> >> >> > for now. I agree, that checking it at runtime is not nice. On the other
> >> >>> >> >> > hand I do think a duplication check makes sense. Doing a static
> >> >>> >> >> > check should be possible, but I have no idea how to implement this
> >> >>> >> >> > (without much effort). I suspect Coccinelle can do it, so I added
> >> >>> >> >> > Julia.
> >> >>> >> >> >
> >> >>> >> >> > For reference this is the runtime check:
> >> >>> >> >> > https://patchwork.kernel.org/patch/9918953/
> >> >>> >>
> >> >>> >> The data structures being checked start here:
> >> >>> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n138
> >> >>> >>
> >> >>> >> And are aggregated here:
> >> >>> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n743
> >> >>> >
> >> >>> > I worked a bit on this, but unfortunately there is a major parsing
> >> >>> > problem, and most of the definitions are ignored.  Specifically, the
> >> >>> > definitions of the regs variables are interspersed with eg:
> >> >>> >
> >> >>> > #define bq27510g1_regs bq27500_regs
> >> >>>
> >> >>> You can transform the macros with sed to either of:
> >> >>>
> >> >>> static u8 *bq27510g1_regs = 0 // skip comparison if x == 0
> >> >>>
> >> >>> static u8 bq27510g1_regs[BQ27XXX_REG_MAX] = { 0xFF } // skip
> >> >>> comparison if x[0] == 0xff
> >> >>>
> >> >>> Does that help?
> >> >>
> >> >> Not quite, because it's really a list of variable declarations, like
> >> >>
> >> >> int a, b, c, d;
> >> >>
> >> >> The following could be fine:
> >> >>
> >> >> *bq27510g1_regs = 0,
> >> >
> >> > i forgot about the static u8 at the top of the array set. But yes,
> >> > just drop static u8 from either of the alternatives I gave.
> >>
>

^ permalink raw reply	[flat|nested] 63+ messages in thread

* Re: [PATCH v3 0/5] bq27xxx_battery data memory update
  2017-09-18  5:33                             ` [Cocci] " Julia Lawall
@ 2017-09-19 21:47                               ` Liam Breck
  -1 siblings, 0 replies; 63+ messages in thread
From: Liam Breck @ 2017-09-19 21:47 UTC (permalink / raw)
  To: Julia Lawall
  Cc: Sebastian Reichel, Gilles Muller, Nicolas Palix, Michal Marek,
	cocci, Andrew F. Davis, Pali Rohár, Linux PM mailing list

Hi Julia,

I think Sebastian referred this to you in hopes of receiving a script
that would find duplicate arrays, similarly to the way
bq27xxx_battery_dbg_dupes does in the running code. Did you interpret
his request differently?

bq27xxx_battery_dbg_dupes:
https://patchwork.kernel.org/patch/9918953/

The data structures being checked start here:
https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n138

And are aggregated here:
https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n743

The defines can be sed'd to pointers with 0 value, and array
comparisons where 1 pointer is 0 can be skipped.

Thanks


On Sun, Sep 17, 2017 at 10:33 PM, Julia Lawall <julia.lawall@lip6.fr> wrote:
>
>
> On Sun, 17 Sep 2017, Liam Breck wrote:
>
>> Hi Julia, checking back...
>
> Hi, I have something that works in terms of the names of the macros.  Ie
> if there is
>
> #define XXX 12
>
> and
>
> #define YYY 12
>
> it doesn't know that XXX and YYY are the same thing.
>
> I haven't posted it because I needed to make a change to the parser of
> Coccinelle and Coccinelle is a bit unstable at the moment.  But things
> should converge soon.
>
> julia
>
>>
>>
>>
>> On Tue, Sep 5, 2017 at 1:14 PM, Julia Lawall <julia.lawall@lip6.fr> wrote:
>> >
>> >
>> > On Tue, 5 Sep 2017, Liam Breck wrote:
>> >
>> >> Hi Julia, any luck on this?
>> >
>> > I was trying to improve the parser, but it seems that my improvements
>> > don't have a sufficient effect so I will try your suggestion of just
>> > seding out the offending code.
>> >
>> > julia
>> >
>> >>
>> >> On Thu, Aug 31, 2017 at 4:43 AM, Liam Breck <liam@networkimprov.net> wrote:
>> >> > On Thu, Aug 31, 2017 at 4:33 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
>> >> >>
>> >> >>
>> >> >> On Thu, 31 Aug 2017, Liam Breck wrote:
>> >> >>
>> >> >>> On Thu, Aug 31, 2017 at 2:54 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
>> >> >>> >
>> >> >>> >
>> >> >>> > On Tue, 29 Aug 2017, Liam Breck wrote:
>> >> >>> >
>> >> >>> >> Coccinelle folks,
>> >> >>> >>
>> >> >>> >> On Tue, Aug 29, 2017 at 5:29 PM, Sebastian Reichel
>> >> >>> >> <sebastian.reichel@collabora.co.uk> wrote:
>> >> >>> >> > Hi,
>> >> >>> >> >
>> >> >>> >> > On Tue, Aug 29, 2017 at 04:07:12PM -0700, Liam Breck wrote:
>> >> >>> >> >> I don't see a Julia in CC list...
>> >> >>> >> >
>> >> >>> >> > <_< let's try that again.
>> >> >>> >> >
>> >> >>> >> >> On Tue, Aug 29, 2017 at 2:22 PM, Sebastian Reichel
>> >> >>> >> >> <sebastian.reichel@collabora.co.uk> wrote:
>> >> >>> >> >> > [adding Julia to Cc for Coccinelle question]
>> >> >>> >> >> >
>> >> >>> >> >> > Hi,
>> >> >>> >> >> >
>> >> >>> >> >> > On Tue, Aug 29, 2017 at 10:31:57AM -0500, Andrew F. Davis wrote:
>> >> >>> >> >> >> On 08/29/2017 05:54 AM, Sebastian Reichel wrote:
>> >> >>> >> >> >> > On Wed, Aug 23, 2017 at 08:36:12PM -0700, Liam Breck wrote:
>> >> >>> >> >> >> >> Overview:
>> >> >>> >> >> >> >> * Reorganizes chip data definitions
>> >> >>> >> >> >> >> * Enables features landed in these patches:
>> >> >>> >> >> >> >>   dt-bindings: power: supply: bq27xxx: Add monitored-battery documentation
>> >> >>> >> >> >> >>   power: supply: bq27xxx: Add chip data memory read/write support
>> >> >>> >> >> >> >>   power: supply: bq27xxx: Add power_supply_battery_info support
>> >> >>> >> >> >> >> * Supports the following chips (only BQ27425 is active)
>> >> >>> >> >> >> >>   BQ27500, 545, 425, 421, 441, 621
>> >> >>> >> >> >> >>
>> >> >>> >> >> >> >> Changes in v3:
>> >> >>> >> >> >> >> * BQ27425 tested; workaround minor chip bug
>> >> >>> >> >> >> >> * Dropped driver_version
>> >> >>> >> >> >> >> * Fixed dbg_dupes logic for .props & .dm_regs
>> >> >>> >> >> >> >> * Dropped two props array dupes
>> >> >>> >> >> >> >>
>> >> >>> >> >> >> >> Changes in v2:
>> >> >>> >> >> >> >> * Added di->opts flags for remaining chip features
>> >> >>> >> >> >> >> * Commented out untested bq27xxx_dm_regs parameters
>> >> >>> >> >> >> >> * Changed dbg_dupes to run only once
>> >> >>> >> >> >> >>
>> >> >>> >> >> >> >> Notes on v1:
>> >> >>> >> >> >> >> * Not fully tested (hence RFC tag)
>> >> >>> >> >> >> >
>> >> >>> >> >> >> > Thanks, full series queued.
>> >> >>> >> >> >> >
>> >> >>> >> >> >> > -- Sebastian
>> >> >>> >> >> >>
>> >> >>> >> >> >> Anyway, I've not got the time to fight these changes anymore, but at
>> >> >>> >> >> >> very least could you drop 4/5, it's static analysis code made into a
>> >> >>> >> >> >> runtime check built into a kernel driver, if not at least add my
>> >> >>> >> >> >> nacked-by. :)
>> >> >>> >> >> >
>> >> >>> >> >> > Since it's not critical at all and nobody depends on it, I dropped 4/5
>> >> >>> >> >> > for now. I agree, that checking it at runtime is not nice. On the other
>> >> >>> >> >> > hand I do think a duplication check makes sense. Doing a static
>> >> >>> >> >> > check should be possible, but I have no idea how to implement this
>> >> >>> >> >> > (without much effort). I suspect Coccinelle can do it, so I added
>> >> >>> >> >> > Julia.
>> >> >>> >> >> >
>> >> >>> >> >> > For reference this is the runtime check:
>> >> >>> >> >> > https://patchwork.kernel.org/patch/9918953/
>> >> >>> >>
>> >> >>> >> The data structures being checked start here:
>> >> >>> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n138
>> >> >>> >>
>> >> >>> >> And are aggregated here:
>> >> >>> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n743
>> >> >>> >
>> >> >>> > I worked a bit on this, but unfortunately there is a major parsing
>> >> >>> > problem, and most of the definitions are ignored.  Specifically, the
>> >> >>> > definitions of the regs variables are interspersed with eg:
>> >> >>> >
>> >> >>> > #define bq27510g1_regs bq27500_regs
>> >> >>>
>> >> >>> You can transform the macros with sed to either of:
>> >> >>>
>> >> >>> static u8 *bq27510g1_regs = 0 // skip comparison if x == 0
>> >> >>>
>> >> >>> static u8 bq27510g1_regs[BQ27XXX_REG_MAX] = { 0xFF } // skip
>> >> >>> comparison if x[0] == 0xff
>> >> >>>
>> >> >>> Does that help?
>> >> >>
>> >> >> Not quite, because it's really a list of variable declarations, like
>> >> >>
>> >> >> int a, b, c, d;
>> >> >>
>> >> >> The following could be fine:
>> >> >>
>> >> >> *bq27510g1_regs = 0,
>> >> >
>> >> > i forgot about the static u8 at the top of the array set. But yes,
>> >> > just drop static u8 from either of the alternatives I gave.
>> >>
>>

^ permalink raw reply	[flat|nested] 63+ messages in thread

* [Cocci] [PATCH v3 0/5] bq27xxx_battery data memory update
@ 2017-09-19 21:47                               ` Liam Breck
  0 siblings, 0 replies; 63+ messages in thread
From: Liam Breck @ 2017-09-19 21:47 UTC (permalink / raw)
  To: cocci

Hi Julia,

I think Sebastian referred this to you in hopes of receiving a script
that would find duplicate arrays, similarly to the way
bq27xxx_battery_dbg_dupes does in the running code. Did you interpret
his request differently?

bq27xxx_battery_dbg_dupes:
https://patchwork.kernel.org/patch/9918953/

The data structures being checked start here:
https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n138

And are aggregated here:
https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n743

The defines can be sed'd to pointers with 0 value, and array
comparisons where 1 pointer is 0 can be skipped.

Thanks


On Sun, Sep 17, 2017 at 10:33 PM, Julia Lawall <julia.lawall@lip6.fr> wrote:
>
>
> On Sun, 17 Sep 2017, Liam Breck wrote:
>
>> Hi Julia, checking back...
>
> Hi, I have something that works in terms of the names of the macros.  Ie
> if there is
>
> #define XXX 12
>
> and
>
> #define YYY 12
>
> it doesn't know that XXX and YYY are the same thing.
>
> I haven't posted it because I needed to make a change to the parser of
> Coccinelle and Coccinelle is a bit unstable at the moment.  But things
> should converge soon.
>
> julia
>
>>
>>
>>
>> On Tue, Sep 5, 2017 at 1:14 PM, Julia Lawall <julia.lawall@lip6.fr> wrote:
>> >
>> >
>> > On Tue, 5 Sep 2017, Liam Breck wrote:
>> >
>> >> Hi Julia, any luck on this?
>> >
>> > I was trying to improve the parser, but it seems that my improvements
>> > don't have a sufficient effect so I will try your suggestion of just
>> > seding out the offending code.
>> >
>> > julia
>> >
>> >>
>> >> On Thu, Aug 31, 2017 at 4:43 AM, Liam Breck <liam@networkimprov.net> wrote:
>> >> > On Thu, Aug 31, 2017 at 4:33 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
>> >> >>
>> >> >>
>> >> >> On Thu, 31 Aug 2017, Liam Breck wrote:
>> >> >>
>> >> >>> On Thu, Aug 31, 2017 at 2:54 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
>> >> >>> >
>> >> >>> >
>> >> >>> > On Tue, 29 Aug 2017, Liam Breck wrote:
>> >> >>> >
>> >> >>> >> Coccinelle folks,
>> >> >>> >>
>> >> >>> >> On Tue, Aug 29, 2017 at 5:29 PM, Sebastian Reichel
>> >> >>> >> <sebastian.reichel@collabora.co.uk> wrote:
>> >> >>> >> > Hi,
>> >> >>> >> >
>> >> >>> >> > On Tue, Aug 29, 2017 at 04:07:12PM -0700, Liam Breck wrote:
>> >> >>> >> >> I don't see a Julia in CC list...
>> >> >>> >> >
>> >> >>> >> > <_< let's try that again.
>> >> >>> >> >
>> >> >>> >> >> On Tue, Aug 29, 2017 at 2:22 PM, Sebastian Reichel
>> >> >>> >> >> <sebastian.reichel@collabora.co.uk> wrote:
>> >> >>> >> >> > [adding Julia to Cc for Coccinelle question]
>> >> >>> >> >> >
>> >> >>> >> >> > Hi,
>> >> >>> >> >> >
>> >> >>> >> >> > On Tue, Aug 29, 2017 at 10:31:57AM -0500, Andrew F. Davis wrote:
>> >> >>> >> >> >> On 08/29/2017 05:54 AM, Sebastian Reichel wrote:
>> >> >>> >> >> >> > On Wed, Aug 23, 2017 at 08:36:12PM -0700, Liam Breck wrote:
>> >> >>> >> >> >> >> Overview:
>> >> >>> >> >> >> >> * Reorganizes chip data definitions
>> >> >>> >> >> >> >> * Enables features landed in these patches:
>> >> >>> >> >> >> >>   dt-bindings: power: supply: bq27xxx: Add monitored-battery documentation
>> >> >>> >> >> >> >>   power: supply: bq27xxx: Add chip data memory read/write support
>> >> >>> >> >> >> >>   power: supply: bq27xxx: Add power_supply_battery_info support
>> >> >>> >> >> >> >> * Supports the following chips (only BQ27425 is active)
>> >> >>> >> >> >> >>   BQ27500, 545, 425, 421, 441, 621
>> >> >>> >> >> >> >>
>> >> >>> >> >> >> >> Changes in v3:
>> >> >>> >> >> >> >> * BQ27425 tested; workaround minor chip bug
>> >> >>> >> >> >> >> * Dropped driver_version
>> >> >>> >> >> >> >> * Fixed dbg_dupes logic for .props & .dm_regs
>> >> >>> >> >> >> >> * Dropped two props array dupes
>> >> >>> >> >> >> >>
>> >> >>> >> >> >> >> Changes in v2:
>> >> >>> >> >> >> >> * Added di->opts flags for remaining chip features
>> >> >>> >> >> >> >> * Commented out untested bq27xxx_dm_regs parameters
>> >> >>> >> >> >> >> * Changed dbg_dupes to run only once
>> >> >>> >> >> >> >>
>> >> >>> >> >> >> >> Notes on v1:
>> >> >>> >> >> >> >> * Not fully tested (hence RFC tag)
>> >> >>> >> >> >> >
>> >> >>> >> >> >> > Thanks, full series queued.
>> >> >>> >> >> >> >
>> >> >>> >> >> >> > -- Sebastian
>> >> >>> >> >> >>
>> >> >>> >> >> >> Anyway, I've not got the time to fight these changes anymore, but at
>> >> >>> >> >> >> very least could you drop 4/5, it's static analysis code made into a
>> >> >>> >> >> >> runtime check built into a kernel driver, if not at least add my
>> >> >>> >> >> >> nacked-by. :)
>> >> >>> >> >> >
>> >> >>> >> >> > Since it's not critical at all and nobody depends on it, I dropped 4/5
>> >> >>> >> >> > for now. I agree, that checking it at runtime is not nice. On the other
>> >> >>> >> >> > hand I do think a duplication check makes sense. Doing a static
>> >> >>> >> >> > check should be possible, but I have no idea how to implement this
>> >> >>> >> >> > (without much effort). I suspect Coccinelle can do it, so I added
>> >> >>> >> >> > Julia.
>> >> >>> >> >> >
>> >> >>> >> >> > For reference this is the runtime check:
>> >> >>> >> >> > https://patchwork.kernel.org/patch/9918953/
>> >> >>> >>
>> >> >>> >> The data structures being checked start here:
>> >> >>> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n138
>> >> >>> >>
>> >> >>> >> And are aggregated here:
>> >> >>> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n743
>> >> >>> >
>> >> >>> > I worked a bit on this, but unfortunately there is a major parsing
>> >> >>> > problem, and most of the definitions are ignored.  Specifically, the
>> >> >>> > definitions of the regs variables are interspersed with eg:
>> >> >>> >
>> >> >>> > #define bq27510g1_regs bq27500_regs
>> >> >>>
>> >> >>> You can transform the macros with sed to either of:
>> >> >>>
>> >> >>> static u8 *bq27510g1_regs = 0 // skip comparison if x == 0
>> >> >>>
>> >> >>> static u8 bq27510g1_regs[BQ27XXX_REG_MAX] = { 0xFF } // skip
>> >> >>> comparison if x[0] == 0xff
>> >> >>>
>> >> >>> Does that help?
>> >> >>
>> >> >> Not quite, because it's really a list of variable declarations, like
>> >> >>
>> >> >> int a, b, c, d;
>> >> >>
>> >> >> The following could be fine:
>> >> >>
>> >> >> *bq27510g1_regs = 0,
>> >> >
>> >> > i forgot about the static u8 at the top of the array set. But yes,
>> >> > just drop static u8 from either of the alternatives I gave.
>> >>
>>

^ permalink raw reply	[flat|nested] 63+ messages in thread

* Re: [PATCH v3 0/5] bq27xxx_battery data memory update
  2017-09-19 21:47                               ` [Cocci] " Liam Breck
@ 2017-09-19 22:00                                 ` Julia Lawall
  -1 siblings, 0 replies; 63+ messages in thread
From: Julia Lawall @ 2017-09-19 22:00 UTC (permalink / raw)
  To: Liam Breck
  Cc: Sebastian Reichel, Gilles Muller, Nicolas Palix, Michal Marek,
	cocci, Andrew F. Davis, Pali Rohár, Linux PM mailing list



On Tue, 19 Sep 2017, Liam Breck wrote:

> Hi Julia,
>
> I think Sebastian referred this to you in hopes of receiving a script
> that would find duplicate arrays, similarly to the way
> bq27xxx_battery_dbg_dupes does in the running code. Did you interpret
> his request differently?
>
> bq27xxx_battery_dbg_dupes:
> https://patchwork.kernel.org/patch/9918953/
>
> The data structures being checked start here:
> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n138
>
> And are aggregated here:
> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n743
>
> The defines can be sed'd to pointers with 0 value, and array
> comparisons where 1 pointer is 0 can be skipped.

I followed the spirit of the runtime testing code.  But Coccinelle doesn't
normally unfold the definitions of macros.  All it can do is take the
different lists of fields and see if they are textually the same.

I've attached the script and some fake data that I made to test it.  The
fake data has some added cases where I have replaced 27 in the structure
name by 07.  For my test data I get:

bq07421_regs and bq27421_regs have the same registers
bq07000_regs and bq27000_regs have the same registers
bq07421_dm_regs and bq27421_dm_regs have the same registers
bq07421_props and bq27421_props have the same properties
bq07000_props and bq27000_props have the same properties

You won't get this currently; I needed to make some improvements to the
Coccinelle C code parser.

julia

>
> Thanks
>
>
> On Sun, Sep 17, 2017 at 10:33 PM, Julia Lawall <julia.lawall@lip6.fr> wrote:
> >
> >
> > On Sun, 17 Sep 2017, Liam Breck wrote:
> >
> >> Hi Julia, checking back...
> >
> > Hi, I have something that works in terms of the names of the macros.  Ie
> > if there is
> >
> > #define XXX 12
> >
> > and
> >
> > #define YYY 12
> >
> > it doesn't know that XXX and YYY are the same thing.
> >
> > I haven't posted it because I needed to make a change to the parser of
> > Coccinelle and Coccinelle is a bit unstable at the moment.  But things
> > should converge soon.
> >
> > julia
> >
> >>
> >>
> >>
> >> On Tue, Sep 5, 2017 at 1:14 PM, Julia Lawall <julia.lawall@lip6.fr> wrote:
> >> >
> >> >
> >> > On Tue, 5 Sep 2017, Liam Breck wrote:
> >> >
> >> >> Hi Julia, any luck on this?
> >> >
> >> > I was trying to improve the parser, but it seems that my improvements
> >> > don't have a sufficient effect so I will try your suggestion of just
> >> > seding out the offending code.
> >> >
> >> > julia
> >> >
> >> >>
> >> >> On Thu, Aug 31, 2017 at 4:43 AM, Liam Breck <liam@networkimprov.net> wrote:
> >> >> > On Thu, Aug 31, 2017 at 4:33 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
> >> >> >>
> >> >> >>
> >> >> >> On Thu, 31 Aug 2017, Liam Breck wrote:
> >> >> >>
> >> >> >>> On Thu, Aug 31, 2017 at 2:54 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
> >> >> >>> >
> >> >> >>> >
> >> >> >>> > On Tue, 29 Aug 2017, Liam Breck wrote:
> >> >> >>> >
> >> >> >>> >> Coccinelle folks,
> >> >> >>> >>
> >> >> >>> >> On Tue, Aug 29, 2017 at 5:29 PM, Sebastian Reichel
> >> >> >>> >> <sebastian.reichel@collabora.co.uk> wrote:
> >> >> >>> >> > Hi,
> >> >> >>> >> >
> >> >> >>> >> > On Tue, Aug 29, 2017 at 04:07:12PM -0700, Liam Breck wrote:
> >> >> >>> >> >> I don't see a Julia in CC list...
> >> >> >>> >> >
> >> >> >>> >> > <_< let's try that again.
> >> >> >>> >> >
> >> >> >>> >> >> On Tue, Aug 29, 2017 at 2:22 PM, Sebastian Reichel
> >> >> >>> >> >> <sebastian.reichel@collabora.co.uk> wrote:
> >> >> >>> >> >> > [adding Julia to Cc for Coccinelle question]
> >> >> >>> >> >> >
> >> >> >>> >> >> > Hi,
> >> >> >>> >> >> >
> >> >> >>> >> >> > On Tue, Aug 29, 2017 at 10:31:57AM -0500, Andrew F. Davis wrote:
> >> >> >>> >> >> >> On 08/29/2017 05:54 AM, Sebastian Reichel wrote:
> >> >> >>> >> >> >> > On Wed, Aug 23, 2017 at 08:36:12PM -0700, Liam Breck wrote:
> >> >> >>> >> >> >> >> Overview:
> >> >> >>> >> >> >> >> * Reorganizes chip data definitions
> >> >> >>> >> >> >> >> * Enables features landed in these patches:
> >> >> >>> >> >> >> >>   dt-bindings: power: supply: bq27xxx: Add monitored-battery documentation
> >> >> >>> >> >> >> >>   power: supply: bq27xxx: Add chip data memory read/write support
> >> >> >>> >> >> >> >>   power: supply: bq27xxx: Add power_supply_battery_info support
> >> >> >>> >> >> >> >> * Supports the following chips (only BQ27425 is active)
> >> >> >>> >> >> >> >>   BQ27500, 545, 425, 421, 441, 621
> >> >> >>> >> >> >> >>
> >> >> >>> >> >> >> >> Changes in v3:
> >> >> >>> >> >> >> >> * BQ27425 tested; workaround minor chip bug
> >> >> >>> >> >> >> >> * Dropped driver_version
> >> >> >>> >> >> >> >> * Fixed dbg_dupes logic for .props & .dm_regs
> >> >> >>> >> >> >> >> * Dropped two props array dupes
> >> >> >>> >> >> >> >>
> >> >> >>> >> >> >> >> Changes in v2:
> >> >> >>> >> >> >> >> * Added di->opts flags for remaining chip features
> >> >> >>> >> >> >> >> * Commented out untested bq27xxx_dm_regs parameters
> >> >> >>> >> >> >> >> * Changed dbg_dupes to run only once
> >> >> >>> >> >> >> >>
> >> >> >>> >> >> >> >> Notes on v1:
> >> >> >>> >> >> >> >> * Not fully tested (hence RFC tag)
> >> >> >>> >> >> >> >
> >> >> >>> >> >> >> > Thanks, full series queued.
> >> >> >>> >> >> >> >
> >> >> >>> >> >> >> > -- Sebastian
> >> >> >>> >> >> >>
> >> >> >>> >> >> >> Anyway, I've not got the time to fight these changes anymore, but at
> >> >> >>> >> >> >> very least could you drop 4/5, it's static analysis code made into a
> >> >> >>> >> >> >> runtime check built into a kernel driver, if not at least add my
> >> >> >>> >> >> >> nacked-by. :)
> >> >> >>> >> >> >
> >> >> >>> >> >> > Since it's not critical at all and nobody depends on it, I dropped 4/5
> >> >> >>> >> >> > for now. I agree, that checking it at runtime is not nice. On the other
> >> >> >>> >> >> > hand I do think a duplication check makes sense. Doing a static
> >> >> >>> >> >> > check should be possible, but I have no idea how to implement this
> >> >> >>> >> >> > (without much effort). I suspect Coccinelle can do it, so I added
> >> >> >>> >> >> > Julia.
> >> >> >>> >> >> >
> >> >> >>> >> >> > For reference this is the runtime check:
> >> >> >>> >> >> > https://patchwork.kernel.org/patch/9918953/
> >> >> >>> >>
> >> >> >>> >> The data structures being checked start here:
> >> >> >>> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n138
> >> >> >>> >>
> >> >> >>> >> And are aggregated here:
> >> >> >>> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n743
> >> >> >>> >
> >> >> >>> > I worked a bit on this, but unfortunately there is a major parsing
> >> >> >>> > problem, and most of the definitions are ignored.  Specifically, the
> >> >> >>> > definitions of the regs variables are interspersed with eg:
> >> >> >>> >
> >> >> >>> > #define bq27510g1_regs bq27500_regs
> >> >> >>>
> >> >> >>> You can transform the macros with sed to either of:
> >> >> >>>
> >> >> >>> static u8 *bq27510g1_regs = 0 // skip comparison if x == 0
> >> >> >>>
> >> >> >>> static u8 bq27510g1_regs[BQ27XXX_REG_MAX] = { 0xFF } // skip
> >> >> >>> comparison if x[0] == 0xff
> >> >> >>>
> >> >> >>> Does that help?
> >> >> >>
> >> >> >> Not quite, because it's really a list of variable declarations, like
> >> >> >>
> >> >> >> int a, b, c, d;
> >> >> >>
> >> >> >> The following could be fine:
> >> >> >>
> >> >> >> *bq27510g1_regs = 0,
> >> >> >
> >> >> > i forgot about the static u8 at the top of the array set. But yes,
> >> >> > just drop static u8 from either of the alternatives I gave.
> >> >>
> >>
>

^ permalink raw reply	[flat|nested] 63+ messages in thread

* [Cocci] [PATCH v3 0/5] bq27xxx_battery data memory update
@ 2017-09-19 22:00                                 ` Julia Lawall
  0 siblings, 0 replies; 63+ messages in thread
From: Julia Lawall @ 2017-09-19 22:00 UTC (permalink / raw)
  To: cocci



On Tue, 19 Sep 2017, Liam Breck wrote:

> Hi Julia,
>
> I think Sebastian referred this to you in hopes of receiving a script
> that would find duplicate arrays, similarly to the way
> bq27xxx_battery_dbg_dupes does in the running code. Did you interpret
> his request differently?
>
> bq27xxx_battery_dbg_dupes:
> https://patchwork.kernel.org/patch/9918953/
>
> The data structures being checked start here:
> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n138
>
> And are aggregated here:
> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n743
>
> The defines can be sed'd to pointers with 0 value, and array
> comparisons where 1 pointer is 0 can be skipped.

I followed the spirit of the runtime testing code.  But Coccinelle doesn't
normally unfold the definitions of macros.  All it can do is take the
different lists of fields and see if they are textually the same.

I've attached the script and some fake data that I made to test it.  The
fake data has some added cases where I have replaced 27 in the structure
name by 07.  For my test data I get:

bq07421_regs and bq27421_regs have the same registers
bq07000_regs and bq27000_regs have the same registers
bq07421_dm_regs and bq27421_dm_regs have the same registers
bq07421_props and bq27421_props have the same properties
bq07000_props and bq27000_props have the same properties

You won't get this currently; I needed to make some improvements to the
Coccinelle C code parser.

julia

>
> Thanks
>
>
> On Sun, Sep 17, 2017 at 10:33 PM, Julia Lawall <julia.lawall@lip6.fr> wrote:
> >
> >
> > On Sun, 17 Sep 2017, Liam Breck wrote:
> >
> >> Hi Julia, checking back...
> >
> > Hi, I have something that works in terms of the names of the macros.  Ie
> > if there is
> >
> > #define XXX 12
> >
> > and
> >
> > #define YYY 12
> >
> > it doesn't know that XXX and YYY are the same thing.
> >
> > I haven't posted it because I needed to make a change to the parser of
> > Coccinelle and Coccinelle is a bit unstable at the moment.  But things
> > should converge soon.
> >
> > julia
> >
> >>
> >>
> >>
> >> On Tue, Sep 5, 2017 at 1:14 PM, Julia Lawall <julia.lawall@lip6.fr> wrote:
> >> >
> >> >
> >> > On Tue, 5 Sep 2017, Liam Breck wrote:
> >> >
> >> >> Hi Julia, any luck on this?
> >> >
> >> > I was trying to improve the parser, but it seems that my improvements
> >> > don't have a sufficient effect so I will try your suggestion of just
> >> > seding out the offending code.
> >> >
> >> > julia
> >> >
> >> >>
> >> >> On Thu, Aug 31, 2017 at 4:43 AM, Liam Breck <liam@networkimprov.net> wrote:
> >> >> > On Thu, Aug 31, 2017 at 4:33 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
> >> >> >>
> >> >> >>
> >> >> >> On Thu, 31 Aug 2017, Liam Breck wrote:
> >> >> >>
> >> >> >>> On Thu, Aug 31, 2017 at 2:54 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
> >> >> >>> >
> >> >> >>> >
> >> >> >>> > On Tue, 29 Aug 2017, Liam Breck wrote:
> >> >> >>> >
> >> >> >>> >> Coccinelle folks,
> >> >> >>> >>
> >> >> >>> >> On Tue, Aug 29, 2017 at 5:29 PM, Sebastian Reichel
> >> >> >>> >> <sebastian.reichel@collabora.co.uk> wrote:
> >> >> >>> >> > Hi,
> >> >> >>> >> >
> >> >> >>> >> > On Tue, Aug 29, 2017 at 04:07:12PM -0700, Liam Breck wrote:
> >> >> >>> >> >> I don't see a Julia in CC list...
> >> >> >>> >> >
> >> >> >>> >> > <_< let's try that again.
> >> >> >>> >> >
> >> >> >>> >> >> On Tue, Aug 29, 2017 at 2:22 PM, Sebastian Reichel
> >> >> >>> >> >> <sebastian.reichel@collabora.co.uk> wrote:
> >> >> >>> >> >> > [adding Julia to Cc for Coccinelle question]
> >> >> >>> >> >> >
> >> >> >>> >> >> > Hi,
> >> >> >>> >> >> >
> >> >> >>> >> >> > On Tue, Aug 29, 2017 at 10:31:57AM -0500, Andrew F. Davis wrote:
> >> >> >>> >> >> >> On 08/29/2017 05:54 AM, Sebastian Reichel wrote:
> >> >> >>> >> >> >> > On Wed, Aug 23, 2017 at 08:36:12PM -0700, Liam Breck wrote:
> >> >> >>> >> >> >> >> Overview:
> >> >> >>> >> >> >> >> * Reorganizes chip data definitions
> >> >> >>> >> >> >> >> * Enables features landed in these patches:
> >> >> >>> >> >> >> >>   dt-bindings: power: supply: bq27xxx: Add monitored-battery documentation
> >> >> >>> >> >> >> >>   power: supply: bq27xxx: Add chip data memory read/write support
> >> >> >>> >> >> >> >>   power: supply: bq27xxx: Add power_supply_battery_info support
> >> >> >>> >> >> >> >> * Supports the following chips (only BQ27425 is active)
> >> >> >>> >> >> >> >>   BQ27500, 545, 425, 421, 441, 621
> >> >> >>> >> >> >> >>
> >> >> >>> >> >> >> >> Changes in v3:
> >> >> >>> >> >> >> >> * BQ27425 tested; workaround minor chip bug
> >> >> >>> >> >> >> >> * Dropped driver_version
> >> >> >>> >> >> >> >> * Fixed dbg_dupes logic for .props & .dm_regs
> >> >> >>> >> >> >> >> * Dropped two props array dupes
> >> >> >>> >> >> >> >>
> >> >> >>> >> >> >> >> Changes in v2:
> >> >> >>> >> >> >> >> * Added di->opts flags for remaining chip features
> >> >> >>> >> >> >> >> * Commented out untested bq27xxx_dm_regs parameters
> >> >> >>> >> >> >> >> * Changed dbg_dupes to run only once
> >> >> >>> >> >> >> >>
> >> >> >>> >> >> >> >> Notes on v1:
> >> >> >>> >> >> >> >> * Not fully tested (hence RFC tag)
> >> >> >>> >> >> >> >
> >> >> >>> >> >> >> > Thanks, full series queued.
> >> >> >>> >> >> >> >
> >> >> >>> >> >> >> > -- Sebastian
> >> >> >>> >> >> >>
> >> >> >>> >> >> >> Anyway, I've not got the time to fight these changes anymore, but at
> >> >> >>> >> >> >> very least could you drop 4/5, it's static analysis code made into a
> >> >> >>> >> >> >> runtime check built into a kernel driver, if not at least add my
> >> >> >>> >> >> >> nacked-by. :)
> >> >> >>> >> >> >
> >> >> >>> >> >> > Since it's not critical at all and nobody depends on it, I dropped 4/5
> >> >> >>> >> >> > for now. I agree, that checking it at runtime is not nice. On the other
> >> >> >>> >> >> > hand I do think a duplication check makes sense. Doing a static
> >> >> >>> >> >> > check should be possible, but I have no idea how to implement this
> >> >> >>> >> >> > (without much effort). I suspect Coccinelle can do it, so I added
> >> >> >>> >> >> > Julia.
> >> >> >>> >> >> >
> >> >> >>> >> >> > For reference this is the runtime check:
> >> >> >>> >> >> > https://patchwork.kernel.org/patch/9918953/
> >> >> >>> >>
> >> >> >>> >> The data structures being checked start here:
> >> >> >>> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n138
> >> >> >>> >>
> >> >> >>> >> And are aggregated here:
> >> >> >>> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n743
> >> >> >>> >
> >> >> >>> > I worked a bit on this, but unfortunately there is a major parsing
> >> >> >>> > problem, and most of the definitions are ignored.  Specifically, the
> >> >> >>> > definitions of the regs variables are interspersed with eg:
> >> >> >>> >
> >> >> >>> > #define bq27510g1_regs bq27500_regs
> >> >> >>>
> >> >> >>> You can transform the macros with sed to either of:
> >> >> >>>
> >> >> >>> static u8 *bq27510g1_regs = 0 // skip comparison if x == 0
> >> >> >>>
> >> >> >>> static u8 bq27510g1_regs[BQ27XXX_REG_MAX] = { 0xFF } // skip
> >> >> >>> comparison if x[0] == 0xff
> >> >> >>>
> >> >> >>> Does that help?
> >> >> >>
> >> >> >> Not quite, because it's really a list of variable declarations, like
> >> >> >>
> >> >> >> int a, b, c, d;
> >> >> >>
> >> >> >> The following could be fine:
> >> >> >>
> >> >> >> *bq27510g1_regs = 0,
> >> >> >
> >> >> > i forgot about the static u8 at the top of the array set. But yes,
> >> >> > just drop static u8 from either of the alternatives I gave.
> >> >>
> >>
>

^ permalink raw reply	[flat|nested] 63+ messages in thread

* Re: [PATCH v3 0/5] bq27xxx_battery data memory update
  2017-09-19 22:00                                 ` [Cocci] " Julia Lawall
@ 2017-09-19 22:36                                   ` Liam Breck
  -1 siblings, 0 replies; 63+ messages in thread
From: Liam Breck @ 2017-09-19 22:36 UTC (permalink / raw)
  To: Julia Lawall
  Cc: Sebastian Reichel, Gilles Muller, Nicolas Palix, Michal Marek,
	cocci, Andrew F. Davis, Pali Rohár, Linux PM mailing list

On Tue, Sep 19, 2017 at 3:00 PM, Julia Lawall <julia.lawall@lip6.fr> wrote:
>
>
> On Tue, 19 Sep 2017, Liam Breck wrote:
>
>> Hi Julia,
>>
>> I think Sebastian referred this to you in hopes of receiving a script
>> that would find duplicate arrays, similarly to the way
>> bq27xxx_battery_dbg_dupes does in the running code. Did you interpret
>> his request differently?
>>
>> bq27xxx_battery_dbg_dupes:
>> https://patchwork.kernel.org/patch/9918953/
>>
>> The data structures being checked start here:
>> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n138
>>
>> And are aggregated here:
>> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n743
>>
>> The defines can be sed'd to pointers with 0 value, and array
>> comparisons where 1 pointer is 0 can be skipped.
>
> I followed the spirit of the runtime testing code.  But Coccinelle doesn't
> normally unfold the definitions of macros.  All it can do is take the
> different lists of fields and see if they are textually the same.

There's no need to unfold macros. If you did, you would get false
positives. You do need to skip them somehow, hence the idea of sed'ing
to null pointers.

> I've attached the script and some fake data that I made to test it.  The
> fake data has some added cases where I have replaced 27 in the structure
> name by 07.  For my test data I get:
>
> bq07421_regs and bq27421_regs have the same registers
> bq07000_regs and bq27000_regs have the same registers
> bq07421_dm_regs and bq27421_dm_regs have the same registers
> bq07421_props and bq27421_props have the same properties
> bq07000_props and bq27000_props have the same properties
>
> You won't get this currently; I needed to make some improvements to the
> Coccinelle C code parser.

I didn't see anything attached, script or data.

The script should compare each object with only those objects that
follow it in sequence, so it doesn't repeat comparisons or compare to
self.

^ permalink raw reply	[flat|nested] 63+ messages in thread

* [Cocci] [PATCH v3 0/5] bq27xxx_battery data memory update
@ 2017-09-19 22:36                                   ` Liam Breck
  0 siblings, 0 replies; 63+ messages in thread
From: Liam Breck @ 2017-09-19 22:36 UTC (permalink / raw)
  To: cocci

On Tue, Sep 19, 2017 at 3:00 PM, Julia Lawall <julia.lawall@lip6.fr> wrote:
>
>
> On Tue, 19 Sep 2017, Liam Breck wrote:
>
>> Hi Julia,
>>
>> I think Sebastian referred this to you in hopes of receiving a script
>> that would find duplicate arrays, similarly to the way
>> bq27xxx_battery_dbg_dupes does in the running code. Did you interpret
>> his request differently?
>>
>> bq27xxx_battery_dbg_dupes:
>> https://patchwork.kernel.org/patch/9918953/
>>
>> The data structures being checked start here:
>> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n138
>>
>> And are aggregated here:
>> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n743
>>
>> The defines can be sed'd to pointers with 0 value, and array
>> comparisons where 1 pointer is 0 can be skipped.
>
> I followed the spirit of the runtime testing code.  But Coccinelle doesn't
> normally unfold the definitions of macros.  All it can do is take the
> different lists of fields and see if they are textually the same.

There's no need to unfold macros. If you did, you would get false
positives. You do need to skip them somehow, hence the idea of sed'ing
to null pointers.

> I've attached the script and some fake data that I made to test it.  The
> fake data has some added cases where I have replaced 27 in the structure
> name by 07.  For my test data I get:
>
> bq07421_regs and bq27421_regs have the same registers
> bq07000_regs and bq27000_regs have the same registers
> bq07421_dm_regs and bq27421_dm_regs have the same registers
> bq07421_props and bq27421_props have the same properties
> bq07000_props and bq27000_props have the same properties
>
> You won't get this currently; I needed to make some improvements to the
> Coccinelle C code parser.

I didn't see anything attached, script or data.

The script should compare each object with only those objects that
follow it in sequence, so it doesn't repeat comparisons or compare to
self.

^ permalink raw reply	[flat|nested] 63+ messages in thread

* Re: [PATCH v3 0/5] bq27xxx_battery data memory update
  2017-09-19 22:36                                   ` [Cocci] " Liam Breck
@ 2017-09-20  9:14                                     ` Julia Lawall
  -1 siblings, 0 replies; 63+ messages in thread
From: Julia Lawall @ 2017-09-20  9:14 UTC (permalink / raw)
  To: Liam Breck
  Cc: Sebastian Reichel, Gilles Muller, Nicolas Palix, Michal Marek,
	cocci, Andrew F. Davis, Pali Rohár, Linux PM mailing list

[-- Attachment #1: Type: text/plain, Size: 3346 bytes --]



On Tue, 19 Sep 2017, Liam Breck wrote:

> On Tue, Sep 19, 2017 at 3:00 PM, Julia Lawall <julia.lawall@lip6.fr> wrote:
> >
> >
> > On Tue, 19 Sep 2017, Liam Breck wrote:
> >
> >> Hi Julia,
> >>
> >> I think Sebastian referred this to you in hopes of receiving a script
> >> that would find duplicate arrays, similarly to the way
> >> bq27xxx_battery_dbg_dupes does in the running code. Did you interpret
> >> his request differently?
> >>
> >> bq27xxx_battery_dbg_dupes:
> >> https://patchwork.kernel.org/patch/9918953/
> >>
> >> The data structures being checked start here:
> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n138
> >>
> >> And are aggregated here:
> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n743
> >>
> >> The defines can be sed'd to pointers with 0 value, and array
> >> comparisons where 1 pointer is 0 can be skipped.
> >
> > I followed the spirit of the runtime testing code.  But Coccinelle doesn't
> > normally unfold the definitions of macros.  All it can do is take the
> > different lists of fields and see if they are textually the same.
>
> There's no need to unfold macros. If you did, you would get false
> positives. You do need to skip them somehow, hence the idea of sed'ing
> to null pointers.

I meant that for the properties, the values are:

static enum power_supply_property bq27000_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_TIME_TO_EMPTY_AVG,
	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,
};

Coccinelle is comparing the list of names, not the list of integers that
these names are expanding to.

Also, Coccinelle is comparing the list, but I guess you would prefer that
it compare the set, to check for the cases where the names are the same
but appear in a different order.


>
> > I've attached the script and some fake data that I made to test it.  The
> > fake data has some added cases where I have replaced 27 in the structure
> > name by 07.  For my test data I get:
> >
> > bq07421_regs and bq27421_regs have the same registers
> > bq07000_regs and bq27000_regs have the same registers
> > bq07421_dm_regs and bq27421_dm_regs have the same registers
> > bq07421_props and bq27421_props have the same properties
> > bq07000_props and bq27000_props have the same properties
> >
> > You won't get this currently; I needed to make some improvements to the
> > Coccinelle C code parser.
>
> I didn't see anything attached, script or data.

Sorry, should be there now.

> The script should compare each object with only those objects that
> follow it in sequence, so it doesn't repeat comparisons or compare to
> self.

It does this, ie it only compares xxx to yyy when xxx is alphabetically
less than yyy.

julia

[-- Attachment #2: Type: text/plain, Size: 2597 bytes --]

@str@
type t;
identifier i,i1,i2;
expression e1,e2;
@@

t i[] = {
  ...,
  [e1] = BQ27XXX_DATA(i1,...),
  ...,
  [e2] = BQ27XXX_DATA(i2,...),
  ...,
};

@script:ocaml tocheck@
i1 << str.i1;
i2 << str.i2;
i1regs; i2regs;
i1dmregs; i2dmregs;
i1props; i2props;
@@

if not(i1 = i2)
then
  begin
    i1regs := make_ident (i1 ^ "_regs");
    i2regs := make_ident (i2 ^ "_regs");
    i1dmregs := make_ident (i1 ^ "_dm_regs");
    i2dmregs := make_ident (i2 ^ "_dm_regs");
    i1props := make_ident (i1 ^ "_props");
    i2props := make_ident (i2 ^ "_props")
  end

(* ---------------------------------------------------------------- *)

@getregs1@
typedef u8;
identifier tocheck.i1regs;
initializer list i1regs_vals;
@@

u8 i1regs[...] = { i1regs_vals, };

@getregs2@
identifier tocheck.i2regs;
initializer list i2regs_vals;
@@

u8 i2regs[...] = { i2regs_vals, };

@script:ocaml@
(_,i1regs_vals) << getregs1.i1regs_vals;
(_,i2regs_vals) << getregs2.i2regs_vals;
i1regs << tocheck.i1regs;
i2regs << tocheck.i2regs;
@@

if i1regs < i2regs &&
   List.sort compare i1regs_vals = List.sort compare i2regs_vals
then Printf.printf "%s and %s have the same registers\n" i1regs i2regs

(* ---------------------------------------------------------------- *)

@getdmregs1@
identifier tocheck.i1dmregs;
initializer list i1dmregs_vals;
@@

struct bq27xxx_dm_reg i1dmregs[] = { i1dmregs_vals, };

@getdmregs2@
identifier tocheck.i2dmregs;
initializer list i2dmregs_vals;
@@

struct bq27xxx_dm_reg i2dmregs[] = { i2dmregs_vals, };

@script:ocaml@
(_,i1dmregs_vals) << getdmregs1.i1dmregs_vals;
(_,i2dmregs_vals) << getdmregs2.i2dmregs_vals;
i1dmregs << tocheck.i1dmregs;
i2dmregs << tocheck.i2dmregs;
@@

if i1dmregs < i2dmregs &&
   List.sort compare i1dmregs_vals = List.sort compare i2dmregs_vals
then Printf.printf "%s and %s have the same registers\n" i1dmregs i2dmregs

(* ---------------------------------------------------------------- *)

@getprops1@
identifier tocheck.i1props;
initializer list[n1] i1props_vals;
@@

enum power_supply_property i1props[] = { i1props_vals, };

@getprops2@
identifier tocheck.i2props;
initializer list[n2] i2props_vals;
@@

enum power_supply_property i2props[] = { i2props_vals, };

@script:ocaml@
i1props_vals << getprops1.i1props_vals;
i2props_vals << getprops2.i2props_vals;
i1props << tocheck.i1props;
i2props << tocheck.i2props;
@@

if i1props < i2props && i1props_vals = i2props_vals
then Printf.printf "%s and %s have the same properties\n" i1props i2props


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: Type: text/x-csrc; name=battery.c, Size: 57648 bytes --]

/*
 * BQ27xxx battery driver
 *
 * Copyright (C) 2008 Rodolfo Giometti <giometti@linux.it>
 * Copyright (C) 2008 Eurotech S.p.A. <info@eurotech.it>
 * Copyright (C) 2010-2011 Lars-Peter Clausen <lars@metafoo.de>
 * Copyright (C) 2011 Pali Rohár <pali.rohar@gmail.com>
 * Copyright (C) 2017 Liam Breck <kernel@networkimprov.net>
 *
 * Based on a previous work by Copyright (C) 2008 Texas Instruments, Inc.
 *
 * This package is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 *
 * Datasheets:
 * http://www.ti.com/product/bq27000
 * http://www.ti.com/product/bq27200
 * http://www.ti.com/product/bq27010
 * http://www.ti.com/product/bq27210
 * http://www.ti.com/product/bq27500
 * http://www.ti.com/product/bq27510-g1
 * http://www.ti.com/product/bq27510-g2
 * http://www.ti.com/product/bq27510-g3
 * http://www.ti.com/product/bq27520-g4
 * http://www.ti.com/product/bq27520-g1
 * http://www.ti.com/product/bq27520-g2
 * http://www.ti.com/product/bq27520-g3
 * http://www.ti.com/product/bq27520-g4
 * http://www.ti.com/product/bq27530-g1
 * http://www.ti.com/product/bq27531-g1
 * http://www.ti.com/product/bq27541-g1
 * http://www.ti.com/product/bq27542-g1
 * http://www.ti.com/product/bq27546-g1
 * http://www.ti.com/product/bq27742-g1
 * http://www.ti.com/product/bq27545-g1
 * http://www.ti.com/product/bq27421-g1
 * http://www.ti.com/product/bq27425-g1
 * http://www.ti.com/product/bq27411-g1
 * http://www.ti.com/product/bq27621-g1
 */

#include <linux/device.h>
#include <linux/module.h>
#include <linux/mutex.h>
#include <linux/param.h>
#include <linux/jiffies.h>
#include <linux/workqueue.h>
#include <linux/delay.h>
#include <linux/platform_device.h>
#include <linux/power_supply.h>
#include <linux/slab.h>
#include <linux/of.h>

#include <linux/power/bq27xxx_battery.h>

#define BQ27XXX_MANUFACTURER	"Texas Instruments"

/* BQ27XXX Flags */
#define BQ27XXX_FLAG_DSC	BIT(0)
#define BQ27XXX_FLAG_SOCF	BIT(1) /* State-of-Charge threshold final */
#define BQ27XXX_FLAG_SOC1	BIT(2) /* State-of-Charge threshold 1 */
#define BQ27XXX_FLAG_CFGUP	BIT(4)
#define BQ27XXX_FLAG_FC		BIT(9)
#define BQ27XXX_FLAG_OTD	BIT(14)
#define BQ27XXX_FLAG_OTC	BIT(15)
#define BQ27XXX_FLAG_UT		BIT(14)
#define BQ27XXX_FLAG_OT		BIT(15)

/* BQ27000 has different layout for Flags register */
#define BQ27000_FLAG_EDVF	BIT(0) /* Final End-of-Discharge-Voltage flag */
#define BQ27000_FLAG_EDV1	BIT(1) /* First End-of-Discharge-Voltage flag */
#define BQ27000_FLAG_CI		BIT(4) /* Capacity Inaccurate flag */
#define BQ27000_FLAG_FC		BIT(5)
#define BQ27000_FLAG_CHGS	BIT(7) /* Charge state flag */

/* control register params */
#define BQ27XXX_SEALED			0x20
#define BQ27XXX_SET_CFGUPDATE		0x13
#define BQ27XXX_SOFT_RESET		0x42
#define BQ27XXX_RESET			0x41

#define BQ27XXX_RS			(20) /* Resistor sense mOhm */
#define BQ27XXX_POWER_CONSTANT		(29200) /* 29.2 µV^2 * 1000 */
#define BQ27XXX_CURRENT_CONSTANT	(3570) /* 3.57 µV * 1000 */

#define INVALID_REG_ADDR	0xff

/*
 * bq27xxx_reg_index - Register names
 *
 * These are indexes into a device's register mapping array.
 */

enum bq27xxx_reg_index {
	BQ27XXX_REG_CTRL = 0,	/* Control */
	BQ27XXX_REG_TEMP,	/* Temperature */
	BQ27XXX_REG_INT_TEMP,	/* Internal Temperature */
	BQ27XXX_REG_VOLT,	/* Voltage */
	BQ27XXX_REG_AI,		/* Average Current */
	BQ27XXX_REG_FLAGS,	/* Flags */
	BQ27XXX_REG_TTE,	/* Time-to-Empty */
	BQ27XXX_REG_TTF,	/* Time-to-Full */
	BQ27XXX_REG_TTES,	/* Time-to-Empty Standby */
	BQ27XXX_REG_TTECP,	/* Time-to-Empty at Constant Power */
	BQ27XXX_REG_NAC,	/* Nominal Available Capacity */
	BQ27XXX_REG_FCC,	/* Full Charge Capacity */
	BQ27XXX_REG_CYCT,	/* Cycle Count */
	BQ27XXX_REG_AE,		/* Available Energy */
	BQ27XXX_REG_SOC,	/* State-of-Charge */
	BQ27XXX_REG_DCAP,	/* Design Capacity */
	BQ27XXX_REG_AP,		/* Average Power */
	BQ27XXX_DM_CTRL,	/* Block Data Control */
	BQ27XXX_DM_CLASS,	/* Data Class */
	BQ27XXX_DM_BLOCK,	/* Data Block */
	BQ27XXX_DM_DATA,	/* Block Data */
	BQ27XXX_DM_CKSUM,	/* Block Data Checksum */
	BQ27XXX_REG_MAX,	/* sentinel */
};

#define BQ27XXX_DM_REG_ROWS \
	[BQ27XXX_DM_CTRL] = 0x61,  \
	[BQ27XXX_DM_CLASS] = 0x3e, \
	[BQ27XXX_DM_BLOCK] = 0x3f, \
	[BQ27XXX_DM_DATA] = 0x40,  \
	[BQ27XXX_DM_CKSUM] = 0x60

/* Register mappings */
static u8
	bq27000_regs[BQ27XXX_REG_MAX] = {
		[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] = 0x0b,
		[BQ27XXX_REG_DCAP] = 0x76,
		[BQ27XXX_REG_AP] = 0x24,
		[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,
	},
	bq07000_regs[BQ27XXX_REG_MAX] = {
		[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] = 0x0b,
		[BQ27XXX_REG_DCAP] = 0x76,
		[BQ27XXX_REG_AP] = 0x24,
		[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,
	},
	bq27010_regs[BQ27XXX_REG_MAX] = {
		[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] = INVALID_REG_ADDR,
		[BQ27XXX_REG_SOC] = 0x0b,
		[BQ27XXX_REG_DCAP] = 0x76,
		[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,
	},
	bq2750x_regs[BQ27XXX_REG_MAX] = {
		[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] = 0x2a,
		[BQ27XXX_REG_AE] = INVALID_REG_ADDR,
		[BQ27XXX_REG_SOC] = 0x2c,
		[BQ27XXX_REG_DCAP] = 0x3c,
		[BQ27XXX_REG_AP] = INVALID_REG_ADDR,
		BQ27XXX_DM_REG_ROWS,
	},
#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,
		[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,
	},
#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,
		[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,
	},
	bq27520g1_regs[BQ27XXX_REG_MAX] = {
		[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] = INVALID_REG_ADDR,
		[BQ27XXX_REG_AE] = 0x22,
		[BQ27XXX_REG_SOC] = 0x2c,
		[BQ27XXX_REG_DCAP] = 0x3c,
		[BQ27XXX_REG_AP] = 0x24,
		BQ27XXX_DM_REG_ROWS,
	},
	bq27520g2_regs[BQ27XXX_REG_MAX] = {
		[BQ27XXX_REG_CTRL] = 0x00,
		[BQ27XXX_REG_TEMP] = 0x06,
		[BQ27XXX_REG_INT_TEMP] = 0x36,
		[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,
	},
	bq27520g3_regs[BQ27XXX_REG_MAX] = {
		[BQ27XXX_REG_CTRL] = 0x00,
		[BQ27XXX_REG_TEMP] = 0x06,
		[BQ27XXX_REG_INT_TEMP] = 0x36,
		[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] = 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,
	},
	bq27520g4_regs[BQ27XXX_REG_MAX] = {
		[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] = 0x1c,
		[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] = INVALID_REG_ADDR,
		[BQ27XXX_REG_AP] = INVALID_REG_ADDR,
		BQ27XXX_DM_REG_ROWS,
	},
	bq27530_regs[BQ27XXX_REG_MAX] = {
		[BQ27XXX_REG_CTRL] = 0x00,
		[BQ27XXX_REG_TEMP] = 0x06,
		[BQ27XXX_REG_INT_TEMP] = 0x32,
		[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] = INVALID_REG_ADDR,
		[BQ27XXX_REG_TTECP] = INVALID_REG_ADDR,
		[BQ27XXX_REG_NAC] = 0x0c,
		[BQ27XXX_REG_FCC] = 0x12,
		[BQ27XXX_REG_CYCT] = 0x2a,
		[BQ27XXX_REG_AE] = INVALID_REG_ADDR,
		[BQ27XXX_REG_SOC] = 0x2c,
		[BQ27XXX_REG_DCAP] = INVALID_REG_ADDR,
		[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,
		[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] = INVALID_REG_ADDR,
		[BQ27XXX_REG_TTECP] = INVALID_REG_ADDR,
		[BQ27XXX_REG_NAC] = 0x0c,
		[BQ27XXX_REG_FCC] = 0x12,
		[BQ27XXX_REG_CYCT] = 0x2a,
		[BQ27XXX_REG_AE] = INVALID_REG_ADDR,
		[BQ27XXX_REG_SOC] = 0x2c,
		[BQ27XXX_REG_DCAP] = 0x3c,
		[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,
		[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] = INVALID_REG_ADDR,
		[BQ27XXX_REG_TTECP] = INVALID_REG_ADDR,
		[BQ27XXX_REG_NAC] = 0x0c,
		[BQ27XXX_REG_FCC] = 0x12,
		[BQ27XXX_REG_CYCT] = 0x2a,
		[BQ27XXX_REG_AE] = INVALID_REG_ADDR,
		[BQ27XXX_REG_SOC] = 0x2c,
		[BQ27XXX_REG_DCAP] = INVALID_REG_ADDR,
		[BQ27XXX_REG_AP] = 0x24,
		BQ27XXX_DM_REG_ROWS,
	},
	bq27421_regs[BQ27XXX_REG_MAX] = {
		[BQ27XXX_REG_CTRL] = 0x00,
		[BQ27XXX_REG_TEMP] = 0x02,
		[BQ27XXX_REG_INT_TEMP] = 0x1e,
		[BQ27XXX_REG_VOLT] = 0x04,
		[BQ27XXX_REG_AI] = 0x10,
		[BQ27XXX_REG_FLAGS] = 0x06,
		[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] = 0x08,
		[BQ27XXX_REG_FCC] = 0x0e,
		[BQ27XXX_REG_CYCT] = INVALID_REG_ADDR,
		[BQ27XXX_REG_AE] = INVALID_REG_ADDR,
		[BQ27XXX_REG_SOC] = 0x1c,
		[BQ27XXX_REG_DCAP] = 0x3c,
		[BQ27XXX_REG_AP] = 0x18,
		BQ27XXX_DM_REG_ROWS,
	},
	bq07421_regs[BQ27XXX_REG_MAX] = {
		[BQ27XXX_REG_CTRL] = 0x00,
		[BQ27XXX_REG_TEMP] = 0x02,
		[BQ27XXX_REG_INT_TEMP] = 0x1e,
		[BQ27XXX_REG_VOLT] = 0x04,
		[BQ27XXX_REG_AI] = 0x10,
		[BQ27XXX_REG_FLAGS] = 0x06,
		[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] = 0x08,
		[BQ27XXX_REG_FCC] = 0x0e,
		[BQ27XXX_REG_CYCT] = INVALID_REG_ADDR,
		[BQ27XXX_REG_AE] = INVALID_REG_ADDR,
		[BQ27XXX_REG_SOC] = 0x1c,
		[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_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_TIME_TO_EMPTY_AVG,
	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 bq07000_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_TIME_TO_EMPTY_AVG,
	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 bq27010_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_TIME_TO_EMPTY_AVG,
	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_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 bq27500_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_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 bq27510g3_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,
};

static enum power_supply_property bq27520g1_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_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_MANUFACTURER,
};

#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,
	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_ENERGY_NOW,
	POWER_SUPPLY_PROP_POWER_AVG,
	POWER_SUPPLY_PROP_HEALTH,
	POWER_SUPPLY_PROP_MANUFACTURER,
};

static enum power_supply_property bq27520g4_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_CYCLE_COUNT,
	POWER_SUPPLY_PROP_HEALTH,
	POWER_SUPPLY_PROP_MANUFACTURER,
};

static enum power_supply_property bq27530_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,
};
#define bq27531_props bq27530_props

static enum power_supply_property bq27541_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,
};
#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,
	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,
};

static enum power_supply_property bq27421_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,
};

static enum power_supply_property bq07421_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,
};
#define bq27425_props bq27421_props
#define bq27441_props bq27421_props
#define bq27621_props bq27421_props

struct bq27xxx_dm_reg {
	u8 subclass_id;
	u8 offset;
	u8 bytes;
	u16 min, max;
};

enum bq27xxx_dm_reg_id {
	BQ27XXX_DM_DESIGN_CAPACITY = 0,
	BQ27XXX_DM_DESIGN_ENERGY,
	BQ27XXX_DM_TERMINATE_VOLTAGE,
};

#define bq27000_dm_regs 0
#define bq07000_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

/* 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

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 },
};

static struct bq27xxx_dm_reg bq07421_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 },
};

#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 props_size;
} bq27xxx_chip_data[] = {
	[BQ27000]   = BQ27XXX_DATA(bq27000,   0         , BQ27XXX_O_ZERO),
	[BQ07000]   = BQ27XXX_DATA(bq07000,   0         , BQ27XXX_O_ZERO),//dup
	[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),
	[BQ07421]   = BQ27XXX_DATA(bq07421,   0x80008000, BQ27XXX_O_UTOT | BQ27XXX_O_CFGUP | BQ27XXX_O_RAM), //dup
	[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);
static LIST_HEAD(bq27xxx_battery_devices);

#define BQ27XXX_MSLEEP(i) usleep_range((i)*1000, (i)*1000+500)

#define BQ27XXX_DM_SZ	32

/**
 * struct bq27xxx_dm_buf - chip data memory buffer
 * @class: data memory subclass_id
 * @block: data memory block number
 * @data: data from/for the block
 * @has_data: true if data has been filled by read
 * @dirty: true if data has changed since last read/write
 *
 * Encapsulates info required to manage chip data memory blocks.
 */
struct bq27xxx_dm_buf {
	u8 class;
	u8 block;
	u8 data[BQ27XXX_DM_SZ];
	bool has_data, dirty;
};

#define BQ27XXX_DM_BUF(di, i) { \
	.class = (di)->dm_regs[i].subclass_id, \
	.block = (di)->dm_regs[i].offset / BQ27XXX_DM_SZ, \
}

static inline u16 *bq27xxx_dm_reg_ptr(struct bq27xxx_dm_buf *buf,
				      struct bq27xxx_dm_reg *reg)
{
	if (buf->class == reg->subclass_id &&
	    buf->block == reg->offset / BQ27XXX_DM_SZ)
		return (u16 *) (buf->data + reg->offset % BQ27XXX_DM_SZ);

	return NULL;
}

static const char * const bq27xxx_dm_reg_name[] = {
	[BQ27XXX_DM_DESIGN_CAPACITY] = "design-capacity",
	[BQ27XXX_DM_DESIGN_ENERGY] = "design-energy",
	[BQ27XXX_DM_TERMINATE_VOLTAGE] = "terminate-voltage",
};


static bool bq27xxx_dt_to_nvm = true;
module_param_named(dt_monitored_battery_updates_nvm, bq27xxx_dt_to_nvm, bool, 0444);
MODULE_PARM_DESC(dt_monitored_battery_updates_nvm,
	"Devicetree monitored-battery config updates data memory on NVM/flash chips.\n"
	"Users must set this =0 when installing a different type of battery!\n"
	"Default is =1."
#ifndef CONFIG_BATTERY_BQ27XXX_DT_UPDATES_NVM
	"\nSetting this affects future kernel updates, not the current configuration."
#endif
);

static int poll_interval_param_set(const char *val, const struct kernel_param *kp)
{
	struct bq27xxx_device_info *di;
	unsigned int prev_val = *(unsigned int *) kp->arg;
	int ret;

	ret = param_set_uint(val, kp);
	if (ret < 0 || prev_val == *(unsigned int *) kp->arg)
		return ret;

	mutex_lock(&bq27xxx_list_lock);
	list_for_each_entry(di, &bq27xxx_battery_devices, list) {
		cancel_delayed_work_sync(&di->work);
		schedule_delayed_work(&di->work, 0);
	}
	mutex_unlock(&bq27xxx_list_lock);

	return ret;
}

static const struct kernel_param_ops param_ops_poll_interval = {
	.get = param_get_uint,
	.set = poll_interval_param_set,
};

static unsigned int poll_interval = 360;
module_param_cb(poll_interval, &param_ops_poll_interval, &poll_interval, 0644);
MODULE_PARM_DESC(poll_interval,
		 "battery poll interval in seconds - 0 disables polling");

/*
 * Common code for BQ27xxx devices
 */

static inline int bq27xxx_read(struct bq27xxx_device_info *di, int reg_index,
			       bool single)
{
	int ret;

	if (!di || di->regs[reg_index] == INVALID_REG_ADDR)
		return -EINVAL;

	ret = di->bus.read(di, di->regs[reg_index], single);
	if (ret < 0)
		dev_dbg(di->dev, "failed to read register 0x%02x (index %d)\n",
			di->regs[reg_index], reg_index);

	return ret;
}

static inline int bq27xxx_write(struct bq27xxx_device_info *di, int reg_index,
				u16 value, bool single)
{
	int ret;

	if (!di || di->regs[reg_index] == INVALID_REG_ADDR)
		return -EINVAL;

	if (!di->bus.write)
		return -EPERM;

	ret = di->bus.write(di, di->regs[reg_index], value, single);
	if (ret < 0)
		dev_dbg(di->dev, "failed to write register 0x%02x (index %d)\n",
			di->regs[reg_index], reg_index);

	return ret;
}

static inline int bq27xxx_read_block(struct bq27xxx_device_info *di, int reg_index,
				     u8 *data, int len)
{
	int ret;

	if (!di || di->regs[reg_index] == INVALID_REG_ADDR)
		return -EINVAL;

	if (!di->bus.read_bulk)
		return -EPERM;

	ret = di->bus.read_bulk(di, di->regs[reg_index], data, len);
	if (ret < 0)
		dev_dbg(di->dev, "failed to read_bulk register 0x%02x (index %d)\n",
			di->regs[reg_index], reg_index);

	return ret;
}

static inline int bq27xxx_write_block(struct bq27xxx_device_info *di, int reg_index,
				      u8 *data, int len)
{
	int ret;

	if (!di || di->regs[reg_index] == INVALID_REG_ADDR)
		return -EINVAL;

	if (!di->bus.write_bulk)
		return -EPERM;

	ret = di->bus.write_bulk(di, di->regs[reg_index], data, len);
	if (ret < 0)
		dev_dbg(di->dev, "failed to write_bulk register 0x%02x (index %d)\n",
			di->regs[reg_index], reg_index);

	return ret;
}

static int bq27xxx_battery_seal(struct bq27xxx_device_info *di)
{
	int ret;

	ret = bq27xxx_write(di, BQ27XXX_REG_CTRL, BQ27XXX_SEALED, false);
	if (ret < 0) {
		dev_err(di->dev, "bus error on seal: %d\n", ret);
		return ret;
	}

	return 0;
}

static int bq27xxx_battery_unseal(struct bq27xxx_device_info *di)
{
	int ret;

	if (di->unseal_key == 0) {
		dev_err(di->dev, "unseal failed due to missing key\n");
		return -EINVAL;
	}

	ret = bq27xxx_write(di, BQ27XXX_REG_CTRL, (u16)(di->unseal_key >> 16), false);
	if (ret < 0)
		goto out;

	ret = bq27xxx_write(di, BQ27XXX_REG_CTRL, (u16)di->unseal_key, false);
	if (ret < 0)
		goto out;

	return 0;

out:
	dev_err(di->dev, "bus error on unseal: %d\n", ret);
	return ret;
}

static u8 bq27xxx_battery_checksum_dm_block(struct bq27xxx_dm_buf *buf)
{
	u16 sum = 0;
	int i;

	for (i = 0; i < BQ27XXX_DM_SZ; i++)
		sum += buf->data[i];
	sum &= 0xff;

	return 0xff - sum;
}

static int bq27xxx_battery_read_dm_block(struct bq27xxx_device_info *di,
					 struct bq27xxx_dm_buf *buf)
{
	int ret;

	buf->has_data = false;

	ret = bq27xxx_write(di, BQ27XXX_DM_CLASS, buf->class, true);
	if (ret < 0)
		goto out;

	ret = bq27xxx_write(di, BQ27XXX_DM_BLOCK, buf->block, true);
	if (ret < 0)
		goto out;

	BQ27XXX_MSLEEP(1);

	ret = bq27xxx_read_block(di, BQ27XXX_DM_DATA, buf->data, BQ27XXX_DM_SZ);
	if (ret < 0)
		goto out;

	ret = bq27xxx_read(di, BQ27XXX_DM_CKSUM, true);
	if (ret < 0)
		goto out;

	if ((u8)ret != bq27xxx_battery_checksum_dm_block(buf)) {
		ret = -EINVAL;
		goto out;
	}

	buf->has_data = true;
	buf->dirty = false;

	return 0;

out:
	dev_err(di->dev, "bus error reading chip memory: %d\n", ret);
	return ret;
}

static void bq27xxx_battery_update_dm_block(struct bq27xxx_device_info *di,
					    struct bq27xxx_dm_buf *buf,
					    enum bq27xxx_dm_reg_id reg_id,
					    unsigned int val)
{
	struct bq27xxx_dm_reg *reg = &di->dm_regs[reg_id];
	const char *str = bq27xxx_dm_reg_name[reg_id];
	u16 *prev = bq27xxx_dm_reg_ptr(buf, reg);

	if (prev == NULL) {
		dev_warn(di->dev, "buffer does not match %s dm spec\n", str);
		return;
	}

	if (reg->bytes != 2) {
		dev_warn(di->dev, "%s dm spec has unsupported byte size\n", str);
		return;
	}

	if (!buf->has_data)
		return;

	if (be16_to_cpup(prev) == val) {
		dev_info(di->dev, "%s has %u\n", str, val);
		return;
	}

#ifdef CONFIG_BATTERY_BQ27XXX_DT_UPDATES_NVM
	if (!(di->opts & BQ27XXX_O_RAM) && !bq27xxx_dt_to_nvm) {
#else
	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 "
#ifdef CONFIG_BATTERY_BQ27XXX_DT_UPDATES_NVM
			 "by dt_monitored_battery_updates_nvm=0"
#else
			 "for flash/NVM data memory"
#endif
			 "\n", str, be16_to_cpup(prev), val);
		return;
	}

	dev_info(di->dev, "update %s to %u\n", str, val);

	*prev = cpu_to_be16(val);
	buf->dirty = true;
}

static int bq27xxx_battery_cfgupdate_priv(struct bq27xxx_device_info *di, bool active)
{
	const int limit = 100;
	u16 cmd = active ? BQ27XXX_SET_CFGUPDATE : BQ27XXX_SOFT_RESET;
	int ret, try = limit;

	ret = bq27xxx_write(di, BQ27XXX_REG_CTRL, cmd, false);
	if (ret < 0)
		return ret;

	do {
		BQ27XXX_MSLEEP(25);
		ret = bq27xxx_read(di, BQ27XXX_REG_FLAGS, false);
		if (ret < 0)
			return ret;
	} while (!!(ret & BQ27XXX_FLAG_CFGUP) != active && --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;
	}

	if (limit - try > 3)
		dev_warn(di->dev, "cfgupdate %d, retries %d\n", active, limit - try);

	return 0;
}

static inline int bq27xxx_battery_set_cfgupdate(struct bq27xxx_device_info *di)
{
	int ret = bq27xxx_battery_cfgupdate_priv(di, true);
	if (ret < 0 && ret != -EINVAL)
		dev_err(di->dev, "bus error on set_cfgupdate: %d\n", ret);

	return ret;
}

static inline int bq27xxx_battery_soft_reset(struct bq27xxx_device_info *di)
{
	int ret = bq27xxx_battery_cfgupdate_priv(di, false);
	if (ret < 0 && ret != -EINVAL)
		dev_err(di->dev, "bus error on soft_reset: %d\n", ret);

	return ret;
}

static int bq27xxx_battery_write_dm_block(struct bq27xxx_device_info *di,
					  struct bq27xxx_dm_buf *buf)
{
	bool cfgup = di->opts & BQ27XXX_O_CFGUP;
	int ret;

	if (!buf->dirty)
		return 0;

	if (cfgup) {
		ret = bq27xxx_battery_set_cfgupdate(di);
		if (ret < 0)
			return ret;
	}

	ret = bq27xxx_write(di, BQ27XXX_DM_CTRL, 0, true);
	if (ret < 0)
		goto out;

	ret = bq27xxx_write(di, BQ27XXX_DM_CLASS, buf->class, true);
	if (ret < 0)
		goto out;

	ret = bq27xxx_write(di, BQ27XXX_DM_BLOCK, buf->block, true);
	if (ret < 0)
		goto out;

	BQ27XXX_MSLEEP(1);

	ret = bq27xxx_write_block(di, BQ27XXX_DM_DATA, buf->data, BQ27XXX_DM_SZ);
	if (ret < 0)
		goto out;

	ret = bq27xxx_write(di, BQ27XXX_DM_CKSUM,
			    bq27xxx_battery_checksum_dm_block(buf), true);
	if (ret < 0)
		goto out;

	/* DO NOT read BQ27XXX_DM_CKSUM here to verify it! That may cause NVM
	 * corruption on the '425 chip (and perhaps others), which can damage
	 * the chip.
	 */

	if (cfgup) {
		BQ27XXX_MSLEEP(1);
		ret = bq27xxx_battery_soft_reset(di);
		if (ret < 0)
			return ret;
	} else {
		BQ27XXX_MSLEEP(100); /* flash DM updates in <100ms */
	}

	buf->dirty = false;

	return 0;

out:
	if (cfgup)
		bq27xxx_battery_soft_reset(di);

	dev_err(di->dev, "bus error writing chip memory: %d\n", ret);
	return ret;
}

static void bq27xxx_battery_set_config(struct bq27xxx_device_info *di,
				       struct power_supply_battery_info *info)
{
	struct bq27xxx_dm_buf bd = BQ27XXX_DM_BUF(di, BQ27XXX_DM_DESIGN_CAPACITY);
	struct bq27xxx_dm_buf bt = BQ27XXX_DM_BUF(di, BQ27XXX_DM_TERMINATE_VOLTAGE);
	bool updated;

	if (bq27xxx_battery_unseal(di) < 0)
		return;

	if (info->charge_full_design_uah != -EINVAL &&
	    info->energy_full_design_uwh != -EINVAL) {
		bq27xxx_battery_read_dm_block(di, &bd);
		/* assume design energy & capacity are in same block */
		bq27xxx_battery_update_dm_block(di, &bd,
					BQ27XXX_DM_DESIGN_CAPACITY,
					info->charge_full_design_uah / 1000);
		bq27xxx_battery_update_dm_block(di, &bd,
					BQ27XXX_DM_DESIGN_ENERGY,
					info->energy_full_design_uwh / 1000);
	}

	if (info->voltage_min_design_uv != -EINVAL) {
		bool same = bd.class == bt.class && bd.block == bt.block;
		if (!same)
			bq27xxx_battery_read_dm_block(di, &bt);
		bq27xxx_battery_update_dm_block(di, same ? &bd : &bt,
					BQ27XXX_DM_TERMINATE_VOLTAGE,
					info->voltage_min_design_uv / 1000);
	}

	updated = bd.dirty || bt.dirty;

	bq27xxx_battery_write_dm_block(di, &bd);
	bq27xxx_battery_write_dm_block(di, &bt);

	bq27xxx_battery_seal(di);

	if (updated && !(di->opts & BQ27XXX_O_CFGUP)) {
		bq27xxx_write(di, BQ27XXX_REG_CTRL, BQ27XXX_RESET, false);
		BQ27XXX_MSLEEP(300); /* reset time is not documented */
	}
	/* assume bq27xxx_battery_update() is called hereafter */
}

static void bq27xxx_battery_settings(struct bq27xxx_device_info *di)
{
	struct power_supply_battery_info info = {};
	unsigned int min, max;

	if (power_supply_get_battery_info(di->bat, &info) < 0)
		return;

	if (!di->dm_regs) {
		dev_warn(di->dev, "data memory update not supported for chip\n");
		return;
	}

	if (info.energy_full_design_uwh != info.charge_full_design_uah) {
		if (info.energy_full_design_uwh == -EINVAL)
			dev_warn(di->dev, "missing battery:energy-full-design-microwatt-hours\n");
		else if (info.charge_full_design_uah == -EINVAL)
			dev_warn(di->dev, "missing battery:charge-full-design-microamp-hours\n");
	}

	/* assume min == 0 */
	max = di->dm_regs[BQ27XXX_DM_DESIGN_ENERGY].max;
	if (info.energy_full_design_uwh > max * 1000) {
		dev_err(di->dev, "invalid battery:energy-full-design-microwatt-hours %d\n",
			info.energy_full_design_uwh);
		info.energy_full_design_uwh = -EINVAL;
	}

	/* assume min == 0 */
	max = di->dm_regs[BQ27XXX_DM_DESIGN_CAPACITY].max;
	if (info.charge_full_design_uah > max * 1000) {
		dev_err(di->dev, "invalid battery:charge-full-design-microamp-hours %d\n",
			info.charge_full_design_uah);
		info.charge_full_design_uah = -EINVAL;
	}

	min = di->dm_regs[BQ27XXX_DM_TERMINATE_VOLTAGE].min;
	max = di->dm_regs[BQ27XXX_DM_TERMINATE_VOLTAGE].max;
	if ((info.voltage_min_design_uv < min * 1000 ||
	     info.voltage_min_design_uv > max * 1000) &&
	     info.voltage_min_design_uv != -EINVAL) {
		dev_err(di->dev, "invalid battery:voltage-min-design-microvolt %d\n",
			info.voltage_min_design_uv);
		info.voltage_min_design_uv = -EINVAL;
	}

	if ((info.energy_full_design_uwh != -EINVAL &&
	     info.charge_full_design_uah != -EINVAL) ||
	     info.voltage_min_design_uv  != -EINVAL)
		bq27xxx_battery_set_config(di, &info);
}

/*
 * Return the battery State-of-Charge
 * Or < 0 if something fails.
 */
static int bq27xxx_battery_read_soc(struct bq27xxx_device_info *di)
{
	int soc;

	if (di->opts & BQ27XXX_O_ZERO)
		soc = bq27xxx_read(di, BQ27XXX_REG_SOC, true);
	else
		soc = bq27xxx_read(di, BQ27XXX_REG_SOC, false);

	if (soc < 0)
		dev_dbg(di->dev, "error reading State-of-Charge\n");

	return soc;
}

/*
 * Return a battery charge value in µAh
 * Or < 0 if something fails.
 */
static int bq27xxx_battery_read_charge(struct bq27xxx_device_info *di, u8 reg)
{
	int charge;

	charge = bq27xxx_read(di, reg, false);
	if (charge < 0) {
		dev_dbg(di->dev, "error reading charge register %02x: %d\n",
			reg, charge);
		return charge;
	}

	if (di->opts & BQ27XXX_O_ZERO)
		charge *= BQ27XXX_CURRENT_CONSTANT / BQ27XXX_RS;
	else
		charge *= 1000;

	return charge;
}

/*
 * Return the battery Nominal available capacity in µAh
 * Or < 0 if something fails.
 */
static inline int bq27xxx_battery_read_nac(struct bq27xxx_device_info *di)
{
	int flags;

	if (di->opts & BQ27XXX_O_ZERO) {
		flags = bq27xxx_read(di, BQ27XXX_REG_FLAGS, true);
		if (flags >= 0 && (flags & BQ27000_FLAG_CI))
			return -ENODATA;
	}

	return bq27xxx_battery_read_charge(di, BQ27XXX_REG_NAC);
}

/*
 * Return the battery Full Charge Capacity in µAh
 * Or < 0 if something fails.
 */
static inline int bq27xxx_battery_read_fcc(struct bq27xxx_device_info *di)
{
	return bq27xxx_battery_read_charge(di, BQ27XXX_REG_FCC);
}

/*
 * Return the Design Capacity in µAh
 * Or < 0 if something fails.
 */
static int bq27xxx_battery_read_dcap(struct bq27xxx_device_info *di)
{
	int dcap;

	if (di->opts & BQ27XXX_O_ZERO)
		dcap = bq27xxx_read(di, BQ27XXX_REG_DCAP, true);
	else
		dcap = bq27xxx_read(di, BQ27XXX_REG_DCAP, false);

	if (dcap < 0) {
		dev_dbg(di->dev, "error reading initial last measured discharge\n");
		return dcap;
	}

	if (di->opts & BQ27XXX_O_ZERO)
		dcap = (dcap << 8) * BQ27XXX_CURRENT_CONSTANT / BQ27XXX_RS;
	else
		dcap *= 1000;

	return dcap;
}

/*
 * Return the battery Available energy in µWh
 * Or < 0 if something fails.
 */
static int bq27xxx_battery_read_energy(struct bq27xxx_device_info *di)
{
	int ae;

	ae = bq27xxx_read(di, BQ27XXX_REG_AE, false);
	if (ae < 0) {
		dev_dbg(di->dev, "error reading available energy\n");
		return ae;
	}

	if (di->opts & BQ27XXX_O_ZERO)
		ae *= BQ27XXX_POWER_CONSTANT / BQ27XXX_RS;
	else
		ae *= 1000;

	return ae;
}

/*
 * Return the battery temperature in tenths of degree Kelvin
 * Or < 0 if something fails.
 */
static int bq27xxx_battery_read_temperature(struct bq27xxx_device_info *di)
{
	int temp;

	temp = bq27xxx_read(di, BQ27XXX_REG_TEMP, false);
	if (temp < 0) {
		dev_err(di->dev, "error reading temperature\n");
		return temp;
	}

	if (di->opts & BQ27XXX_O_ZERO)
		temp = 5 * temp / 2;

	return temp;
}

/*
 * Return the battery Cycle count total
 * Or < 0 if something fails.
 */
static int bq27xxx_battery_read_cyct(struct bq27xxx_device_info *di)
{
	int cyct;

	cyct = bq27xxx_read(di, BQ27XXX_REG_CYCT, false);
	if (cyct < 0)
		dev_err(di->dev, "error reading cycle count total\n");

	return cyct;
}

/*
 * Read a time register.
 * Return < 0 if something fails.
 */
static int bq27xxx_battery_read_time(struct bq27xxx_device_info *di, u8 reg)
{
	int tval;

	tval = bq27xxx_read(di, reg, false);
	if (tval < 0) {
		dev_dbg(di->dev, "error reading time register %02x: %d\n",
			reg, tval);
		return tval;
	}

	if (tval == 65535)
		return -ENODATA;

	return tval * 60;
}

/*
 * Read an average power register.
 * Return < 0 if something fails.
 */
static int bq27xxx_battery_read_pwr_avg(struct bq27xxx_device_info *di)
{
	int tval;

	tval = bq27xxx_read(di, BQ27XXX_REG_AP, false);
	if (tval < 0) {
		dev_err(di->dev, "error reading average power register  %02x: %d\n",
			BQ27XXX_REG_AP, tval);
		return tval;
	}

	if (di->opts & BQ27XXX_O_ZERO)
		return (tval * BQ27XXX_POWER_CONSTANT) / BQ27XXX_RS;
	else
		return tval;
}

/*
 * Returns true if a battery over temperature condition is detected
 */
static bool bq27xxx_battery_overtemp(struct bq27xxx_device_info *di, u16 flags)
{
	if (di->opts & BQ27XXX_O_OTDC)
		return flags & (BQ27XXX_FLAG_OTC | BQ27XXX_FLAG_OTD);
        if (di->opts & BQ27XXX_O_UTOT)
		return flags & BQ27XXX_FLAG_OT;

	return false;
}

/*
 * Returns true if a battery under temperature condition is detected
 */
static bool bq27xxx_battery_undertemp(struct bq27xxx_device_info *di, u16 flags)
{
	if (di->opts & BQ27XXX_O_UTOT)
		return flags & BQ27XXX_FLAG_UT;

	return false;
}

/*
 * Returns true if a low state of charge condition is detected
 */
static bool bq27xxx_battery_dead(struct bq27xxx_device_info *di, u16 flags)
{
	if (di->opts & BQ27XXX_O_ZERO)
		return flags & (BQ27000_FLAG_EDV1 | BQ27000_FLAG_EDVF);
	else
		return flags & (BQ27XXX_FLAG_SOC1 | BQ27XXX_FLAG_SOCF);
}

/*
 * Read flag register.
 * Return < 0 if something fails.
 */
static int bq27xxx_battery_read_health(struct bq27xxx_device_info *di)
{
	int flags;
	bool has_singe_flag = di->opts & BQ27XXX_O_ZERO;

	flags = bq27xxx_read(di, BQ27XXX_REG_FLAGS, has_singe_flag);
	if (flags < 0) {
		dev_err(di->dev, "error reading flag register:%d\n", flags);
		return flags;
	}

	/* Unlikely but important to return first */
	if (unlikely(bq27xxx_battery_overtemp(di, flags)))
		return POWER_SUPPLY_HEALTH_OVERHEAT;
	if (unlikely(bq27xxx_battery_undertemp(di, flags)))
		return POWER_SUPPLY_HEALTH_COLD;
	if (unlikely(bq27xxx_battery_dead(di, flags)))
		return POWER_SUPPLY_HEALTH_DEAD;

	return POWER_SUPPLY_HEALTH_GOOD;
}

void bq27xxx_battery_update(struct bq27xxx_device_info *di)
{
	struct bq27xxx_reg_cache cache = {0, };
	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)
		cache.flags = -1; /* read error */
	if (cache.flags >= 0) {
		cache.temperature = bq27xxx_battery_read_temperature(di);
		if (has_ci_flag && (cache.flags & BQ27000_FLAG_CI)) {
			dev_info_once(di->dev, "battery is not calibrated! ignoring capacity values\n");
			cache.capacity = -ENODATA;
			cache.energy = -ENODATA;
			cache.time_to_empty = -ENODATA;
			cache.time_to_empty_avg = -ENODATA;
			cache.time_to_full = -ENODATA;
			cache.charge_full = -ENODATA;
			cache.health = -ENODATA;
		} else {
			if (di->regs[BQ27XXX_REG_TTE] != INVALID_REG_ADDR)
				cache.time_to_empty = bq27xxx_battery_read_time(di, BQ27XXX_REG_TTE);
			if (di->regs[BQ27XXX_REG_TTECP] != INVALID_REG_ADDR)
				cache.time_to_empty_avg = bq27xxx_battery_read_time(di, BQ27XXX_REG_TTECP);
			if (di->regs[BQ27XXX_REG_TTF] != INVALID_REG_ADDR)
				cache.time_to_full = bq27xxx_battery_read_time(di, BQ27XXX_REG_TTF);
			cache.charge_full = bq27xxx_battery_read_fcc(di);
			cache.capacity = bq27xxx_battery_read_soc(di);
			if (di->regs[BQ27XXX_REG_AE] != INVALID_REG_ADDR)
				cache.energy = bq27xxx_battery_read_energy(di);
			cache.health = bq27xxx_battery_read_health(di);
		}
		if (di->regs[BQ27XXX_REG_CYCT] != INVALID_REG_ADDR)
			cache.cycle_count = bq27xxx_battery_read_cyct(di);
		if (di->regs[BQ27XXX_REG_AP] != INVALID_REG_ADDR)
			cache.power_avg = bq27xxx_battery_read_pwr_avg(di);

		/* We only have to read charge design full once */
		if (di->charge_design_full <= 0)
			di->charge_design_full = bq27xxx_battery_read_dcap(di);
	}

	if (di->cache.capacity != cache.capacity)
		power_supply_changed(di->bat);

	if (memcmp(&di->cache, &cache, sizeof(cache)) != 0)
		di->cache = cache;

	di->last_update = jiffies;
}
EXPORT_SYMBOL_GPL(bq27xxx_battery_update);

static void bq27xxx_battery_poll(struct work_struct *work)
{
	struct bq27xxx_device_info *di =
			container_of(work, struct bq27xxx_device_info,
				     work.work);

	bq27xxx_battery_update(di);

	if (poll_interval > 0)
		schedule_delayed_work(&di->work, poll_interval * HZ);
}

/*
 * Return the battery average current in µA
 * Note that current can be negative signed as well
 * Or 0 if something fails.
 */
static int bq27xxx_battery_current(struct bq27xxx_device_info *di,
				   union power_supply_propval *val)
{
	int curr;
	int flags;

	curr = bq27xxx_read(di, BQ27XXX_REG_AI, false);
	if (curr < 0) {
		dev_err(di->dev, "error reading current\n");
		return curr;
	}

	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");
			curr = -curr;
		}

		val->intval = curr * BQ27XXX_CURRENT_CONSTANT / BQ27XXX_RS;
	} else {
		/* Other gauges return signed value */
		val->intval = (int)((s16)curr) * 1000;
	}

	return 0;
}

static int bq27xxx_battery_status(struct bq27xxx_device_info *di,
				  union power_supply_propval *val)
{
	int status;

	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)
			status = POWER_SUPPLY_STATUS_CHARGING;
		else if (power_supply_am_i_supplied(di->bat))
			status = POWER_SUPPLY_STATUS_NOT_CHARGING;
		else
			status = POWER_SUPPLY_STATUS_DISCHARGING;
	} else {
		if (di->cache.flags & BQ27XXX_FLAG_FC)
			status = POWER_SUPPLY_STATUS_FULL;
		else if (di->cache.flags & BQ27XXX_FLAG_DSC)
			status = POWER_SUPPLY_STATUS_DISCHARGING;
		else
			status = POWER_SUPPLY_STATUS_CHARGING;
	}

	val->intval = status;

	return 0;
}

static int bq27xxx_battery_capacity_level(struct bq27xxx_device_info *di,
					  union power_supply_propval *val)
{
	int level;

	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)
			level = POWER_SUPPLY_CAPACITY_LEVEL_LOW;
		else if (di->cache.flags & BQ27000_FLAG_EDVF)
			level = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
		else
			level = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
	} else {
		if (di->cache.flags & BQ27XXX_FLAG_FC)
			level = POWER_SUPPLY_CAPACITY_LEVEL_FULL;
		else if (di->cache.flags & BQ27XXX_FLAG_SOC1)
			level = POWER_SUPPLY_CAPACITY_LEVEL_LOW;
		else if (di->cache.flags & BQ27XXX_FLAG_SOCF)
			level = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
		else
			level = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
	}

	val->intval = level;

	return 0;
}

/*
 * Return the battery Voltage in millivolts
 * Or < 0 if something fails.
 */
static int bq27xxx_battery_voltage(struct bq27xxx_device_info *di,
				   union power_supply_propval *val)
{
	int volt;

	volt = bq27xxx_read(di, BQ27XXX_REG_VOLT, false);
	if (volt < 0) {
		dev_err(di->dev, "error reading voltage\n");
		return volt;
	}

	val->intval = volt * 1000;

	return 0;
}

static int bq27xxx_simple_value(int value,
				union power_supply_propval *val)
{
	if (value < 0)
		return value;

	val->intval = value;

	return 0;
}

static int bq27xxx_battery_get_property(struct power_supply *psy,
					enum power_supply_property psp,
					union power_supply_propval *val)
{
	int ret = 0;
	struct bq27xxx_device_info *di = power_supply_get_drvdata(psy);

	mutex_lock(&di->lock);
	if (time_is_before_jiffies(di->last_update + 5 * HZ)) {
		cancel_delayed_work_sync(&di->work);
		bq27xxx_battery_poll(&di->work.work);
	}
	mutex_unlock(&di->lock);

	if (psp != POWER_SUPPLY_PROP_PRESENT && di->cache.flags < 0)
		return -ENODEV;

	switch (psp) {
	case POWER_SUPPLY_PROP_STATUS:
		ret = bq27xxx_battery_status(di, val);
		break;
	case POWER_SUPPLY_PROP_VOLTAGE_NOW:
		ret = bq27xxx_battery_voltage(di, val);
		break;
	case POWER_SUPPLY_PROP_PRESENT:
		val->intval = di->cache.flags < 0 ? 0 : 1;
		break;
	case POWER_SUPPLY_PROP_CURRENT_NOW:
		ret = bq27xxx_battery_current(di, val);
		break;
	case POWER_SUPPLY_PROP_CAPACITY:
		ret = bq27xxx_simple_value(di->cache.capacity, val);
		break;
	case POWER_SUPPLY_PROP_CAPACITY_LEVEL:
		ret = bq27xxx_battery_capacity_level(di, val);
		break;
	case POWER_SUPPLY_PROP_TEMP:
		ret = bq27xxx_simple_value(di->cache.temperature, val);
		if (ret == 0)
			val->intval -= 2731; /* convert decidegree k to c */
		break;
	case POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW:
		ret = bq27xxx_simple_value(di->cache.time_to_empty, val);
		break;
	case POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG:
		ret = bq27xxx_simple_value(di->cache.time_to_empty_avg, val);
		break;
	case POWER_SUPPLY_PROP_TIME_TO_FULL_NOW:
		ret = bq27xxx_simple_value(di->cache.time_to_full, val);
		break;
	case POWER_SUPPLY_PROP_TECHNOLOGY:
		val->intval = POWER_SUPPLY_TECHNOLOGY_LION;
		break;
	case POWER_SUPPLY_PROP_CHARGE_NOW:
		ret = bq27xxx_simple_value(bq27xxx_battery_read_nac(di), val);
		break;
	case POWER_SUPPLY_PROP_CHARGE_FULL:
		ret = bq27xxx_simple_value(di->cache.charge_full, val);
		break;
	case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
		ret = bq27xxx_simple_value(di->charge_design_full, val);
		break;
	/*
	 * TODO: Implement these to make registers set from
	 * power_supply_battery_info visible in sysfs.
	 */
	case POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN:
	case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
		return -EINVAL;
	case POWER_SUPPLY_PROP_CYCLE_COUNT:
		ret = bq27xxx_simple_value(di->cache.cycle_count, val);
		break;
	case POWER_SUPPLY_PROP_ENERGY_NOW:
		ret = bq27xxx_simple_value(di->cache.energy, val);
		break;
	case POWER_SUPPLY_PROP_POWER_AVG:
		ret = bq27xxx_simple_value(di->cache.power_avg, val);
		break;
	case POWER_SUPPLY_PROP_HEALTH:
		ret = bq27xxx_simple_value(di->cache.health, val);
		break;
	case POWER_SUPPLY_PROP_MANUFACTURER:
		val->strval = BQ27XXX_MANUFACTURER;
		break;
	default:
		return -EINVAL;
	}

	return ret;
}

static void bq27xxx_external_power_changed(struct power_supply *psy)
{
	struct bq27xxx_device_info *di = power_supply_get_drvdata(psy);

	cancel_delayed_work_sync(&di->work);
	schedule_delayed_work(&di->work, 0);
}

int bq27xxx_battery_setup(struct bq27xxx_device_info *di)
{
	struct power_supply_desc *psy_desc;
	struct power_supply_config psy_cfg = {
		.of_node = di->dev->of_node,
		.drv_data = di,
	};

	INIT_DELAYED_WORK(&di->work, bq27xxx_battery_poll);
	mutex_init(&di->lock);

	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)
		return -ENOMEM;

	psy_desc->name = di->name;
	psy_desc->type = POWER_SUPPLY_TYPE_BATTERY;
	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;

	di->bat = power_supply_register_no_ws(di->dev, psy_desc, &psy_cfg);
	if (IS_ERR(di->bat)) {
		dev_err(di->dev, "failed to register battery\n");
		return PTR_ERR(di->bat);
	}

	bq27xxx_battery_settings(di);
	bq27xxx_battery_update(di);

	mutex_lock(&bq27xxx_list_lock);
	list_add(&di->list, &bq27xxx_battery_devices);
	mutex_unlock(&bq27xxx_list_lock);

	return 0;
}
EXPORT_SYMBOL_GPL(bq27xxx_battery_setup);

void bq27xxx_battery_teardown(struct bq27xxx_device_info *di)
{
	/*
	 * power_supply_unregister call bq27xxx_battery_get_property which
	 * call bq27xxx_battery_poll.
	 * Make sure that bq27xxx_battery_poll will not call
	 * schedule_delayed_work again after unregister (which cause OOPS).
	 */
	poll_interval = 0;

	cancel_delayed_work_sync(&di->work);

	power_supply_unregister(di->bat);

	mutex_lock(&bq27xxx_list_lock);
	list_del(&di->list);
	mutex_unlock(&bq27xxx_list_lock);

	mutex_destroy(&di->lock);
}
EXPORT_SYMBOL_GPL(bq27xxx_battery_teardown);

MODULE_AUTHOR("Rodolfo Giometti <giometti@linux.it>");
MODULE_DESCRIPTION("BQ27xxx battery monitor driver");
MODULE_LICENSE("GPL");

^ permalink raw reply	[flat|nested] 63+ messages in thread

* [Cocci] [PATCH v3 0/5] bq27xxx_battery data memory update
@ 2017-09-20  9:14                                     ` Julia Lawall
  0 siblings, 0 replies; 63+ messages in thread
From: Julia Lawall @ 2017-09-20  9:14 UTC (permalink / raw)
  To: cocci



On Tue, 19 Sep 2017, Liam Breck wrote:

> On Tue, Sep 19, 2017 at 3:00 PM, Julia Lawall <julia.lawall@lip6.fr> wrote:
> >
> >
> > On Tue, 19 Sep 2017, Liam Breck wrote:
> >
> >> Hi Julia,
> >>
> >> I think Sebastian referred this to you in hopes of receiving a script
> >> that would find duplicate arrays, similarly to the way
> >> bq27xxx_battery_dbg_dupes does in the running code. Did you interpret
> >> his request differently?
> >>
> >> bq27xxx_battery_dbg_dupes:
> >> https://patchwork.kernel.org/patch/9918953/
> >>
> >> The data structures being checked start here:
> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n138
> >>
> >> And are aggregated here:
> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n743
> >>
> >> The defines can be sed'd to pointers with 0 value, and array
> >> comparisons where 1 pointer is 0 can be skipped.
> >
> > I followed the spirit of the runtime testing code.  But Coccinelle doesn't
> > normally unfold the definitions of macros.  All it can do is take the
> > different lists of fields and see if they are textually the same.
>
> There's no need to unfold macros. If you did, you would get false
> positives. You do need to skip them somehow, hence the idea of sed'ing
> to null pointers.

I meant that for the properties, the values are:

static enum power_supply_property bq27000_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_TIME_TO_EMPTY_AVG,
	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,
};

Coccinelle is comparing the list of names, not the list of integers that
these names are expanding to.

Also, Coccinelle is comparing the list, but I guess you would prefer that
it compare the set, to check for the cases where the names are the same
but appear in a different order.


>
> > I've attached the script and some fake data that I made to test it.  The
> > fake data has some added cases where I have replaced 27 in the structure
> > name by 07.  For my test data I get:
> >
> > bq07421_regs and bq27421_regs have the same registers
> > bq07000_regs and bq27000_regs have the same registers
> > bq07421_dm_regs and bq27421_dm_regs have the same registers
> > bq07421_props and bq27421_props have the same properties
> > bq07000_props and bq27000_props have the same properties
> >
> > You won't get this currently; I needed to make some improvements to the
> > Coccinelle C code parser.
>
> I didn't see anything attached, script or data.

Sorry, should be there now.

> The script should compare each object with only those objects that
> follow it in sequence, so it doesn't repeat comparisons or compare to
> self.

It does this, ie it only compares xxx to yyy when xxx is alphabetically
less than yyy.

julia
-------------- next part --------------
@str@
type t;
identifier i,i1,i2;
expression e1,e2;
@@

t i[] = {
  ...,
  [e1] = BQ27XXX_DATA(i1,...),
  ...,
  [e2] = BQ27XXX_DATA(i2,...),
  ...,
};

@script:ocaml tocheck@
i1 << str.i1;
i2 << str.i2;
i1regs; i2regs;
i1dmregs; i2dmregs;
i1props; i2props;
@@

if not(i1 = i2)
then
  begin
    i1regs := make_ident (i1 ^ "_regs");
    i2regs := make_ident (i2 ^ "_regs");
    i1dmregs := make_ident (i1 ^ "_dm_regs");
    i2dmregs := make_ident (i2 ^ "_dm_regs");
    i1props := make_ident (i1 ^ "_props");
    i2props := make_ident (i2 ^ "_props")
  end

(* ---------------------------------------------------------------- *)

@getregs1@
typedef u8;
identifier tocheck.i1regs;
initializer list i1regs_vals;
@@

u8 i1regs[...] = { i1regs_vals, };

@getregs2@
identifier tocheck.i2regs;
initializer list i2regs_vals;
@@

u8 i2regs[...] = { i2regs_vals, };

@script:ocaml@
(_,i1regs_vals) << getregs1.i1regs_vals;
(_,i2regs_vals) << getregs2.i2regs_vals;
i1regs << tocheck.i1regs;
i2regs << tocheck.i2regs;
@@

if i1regs < i2regs &&
   List.sort compare i1regs_vals = List.sort compare i2regs_vals
then Printf.printf "%s and %s have the same registers\n" i1regs i2regs

(* ---------------------------------------------------------------- *)

@getdmregs1@
identifier tocheck.i1dmregs;
initializer list i1dmregs_vals;
@@

struct bq27xxx_dm_reg i1dmregs[] = { i1dmregs_vals, };

@getdmregs2@
identifier tocheck.i2dmregs;
initializer list i2dmregs_vals;
@@

struct bq27xxx_dm_reg i2dmregs[] = { i2dmregs_vals, };

@script:ocaml@
(_,i1dmregs_vals) << getdmregs1.i1dmregs_vals;
(_,i2dmregs_vals) << getdmregs2.i2dmregs_vals;
i1dmregs << tocheck.i1dmregs;
i2dmregs << tocheck.i2dmregs;
@@

if i1dmregs < i2dmregs &&
   List.sort compare i1dmregs_vals = List.sort compare i2dmregs_vals
then Printf.printf "%s and %s have the same registers\n" i1dmregs i2dmregs

(* ---------------------------------------------------------------- *)

@getprops1@
identifier tocheck.i1props;
initializer list[n1] i1props_vals;
@@

enum power_supply_property i1props[] = { i1props_vals, };

@getprops2@
identifier tocheck.i2props;
initializer list[n2] i2props_vals;
@@

enum power_supply_property i2props[] = { i2props_vals, };

@script:ocaml@
i1props_vals << getprops1.i1props_vals;
i2props_vals << getprops2.i2props_vals;
i1props << tocheck.i1props;
i2props << tocheck.i2props;
@@

if i1props < i2props && i1props_vals = i2props_vals
then Printf.printf "%s and %s have the same properties\n" i1props i2props

-------------- next part --------------
A non-text attachment was scrubbed...
Name: battery.c
Type: text/x-csrc
Size: 57648 bytes
Desc: 
URL: <https://systeme.lip6.fr/pipermail/cocci/attachments/20170920/768b48e0/attachment-0001.bin>

^ permalink raw reply	[flat|nested] 63+ messages in thread

* Re: [PATCH v3 0/5] bq27xxx_battery data memory update
  2017-09-20  9:14                                     ` [Cocci] " Julia Lawall
@ 2017-09-20  9:41                                       ` Liam Breck
  -1 siblings, 0 replies; 63+ messages in thread
From: Liam Breck @ 2017-09-20  9:41 UTC (permalink / raw)
  To: Julia Lawall
  Cc: Sebastian Reichel, Gilles Muller, Nicolas Palix, Michal Marek,
	cocci, Andrew F. Davis, Pali Rohár, Linux PM mailing list

On Wed, Sep 20, 2017 at 2:14 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
>
>
> On Tue, 19 Sep 2017, Liam Breck wrote:
>
>> On Tue, Sep 19, 2017 at 3:00 PM, Julia Lawall <julia.lawall@lip6.fr> wrote:
>> >
>> >
>> > On Tue, 19 Sep 2017, Liam Breck wrote:
>> >
>> >> Hi Julia,
>> >>
>> >> I think Sebastian referred this to you in hopes of receiving a script
>> >> that would find duplicate arrays, similarly to the way
>> >> bq27xxx_battery_dbg_dupes does in the running code. Did you interpret
>> >> his request differently?
>> >>
>> >> bq27xxx_battery_dbg_dupes:
>> >> https://patchwork.kernel.org/patch/9918953/
>> >>
>> >> The data structures being checked start here:
>> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n138
>> >>
>> >> And are aggregated here:
>> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n743
>> >>
>> >> The defines can be sed'd to pointers with 0 value, and array
>> >> comparisons where 1 pointer is 0 can be skipped.
>> >
>> > I followed the spirit of the runtime testing code.  But Coccinelle doesn't
>> > normally unfold the definitions of macros.  All it can do is take the
>> > different lists of fields and see if they are textually the same.
>>
>> There's no need to unfold macros. If you did, you would get false
>> positives. You do need to skip them somehow, hence the idea of sed'ing
>> to null pointers.
>
> I meant that for the properties, the values are:
>
> static enum power_supply_property bq27000_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_TIME_TO_EMPTY_AVG,
>         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,
> };
>
> Coccinelle is comparing the list of names, not the list of integers that
> these names are expanding to.

That's perfect.

> Also, Coccinelle is comparing the list, but I guess you would prefer that
> it compare the set, to check for the cases where the names are the same
> but appear in a different order.

Yes, ideally it would sort arrays before doing compare. Is that doable?

>>
>> > I've attached the script and some fake data that I made to test it.  The
>> > fake data has some added cases where I have replaced 27 in the structure
>> > name by 07.  For my test data I get:
>> >
>> > bq07421_regs and bq27421_regs have the same registers
>> > bq07000_regs and bq27000_regs have the same registers
>> > bq07421_dm_regs and bq27421_dm_regs have the same registers
>> > bq07421_props and bq27421_props have the same properties
>> > bq07000_props and bq27000_props have the same properties

We can just write
"%s & %s are identical"

>> > You won't get this currently; I needed to make some improvements to the
>> > Coccinelle C code parser.
>>
>> I didn't see anything attached, script or data.
>
> Sorry, should be there now.
>
>> The script should compare each object with only those objects that
>> follow it in sequence, so it doesn't repeat comparisons or compare to
>> self.
>
> It does this, ie it only compares xxx to yyy when xxx is alphabetically
> less than yyy.

Ah, I had misread your results log.

Looks promising! :-)

^ permalink raw reply	[flat|nested] 63+ messages in thread

* [Cocci] [PATCH v3 0/5] bq27xxx_battery data memory update
@ 2017-09-20  9:41                                       ` Liam Breck
  0 siblings, 0 replies; 63+ messages in thread
From: Liam Breck @ 2017-09-20  9:41 UTC (permalink / raw)
  To: cocci

On Wed, Sep 20, 2017 at 2:14 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
>
>
> On Tue, 19 Sep 2017, Liam Breck wrote:
>
>> On Tue, Sep 19, 2017 at 3:00 PM, Julia Lawall <julia.lawall@lip6.fr> wrote:
>> >
>> >
>> > On Tue, 19 Sep 2017, Liam Breck wrote:
>> >
>> >> Hi Julia,
>> >>
>> >> I think Sebastian referred this to you in hopes of receiving a script
>> >> that would find duplicate arrays, similarly to the way
>> >> bq27xxx_battery_dbg_dupes does in the running code. Did you interpret
>> >> his request differently?
>> >>
>> >> bq27xxx_battery_dbg_dupes:
>> >> https://patchwork.kernel.org/patch/9918953/
>> >>
>> >> The data structures being checked start here:
>> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n138
>> >>
>> >> And are aggregated here:
>> >> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/tree/drivers/power/supply/bq27xxx_battery.c?h=for-next#n743
>> >>
>> >> The defines can be sed'd to pointers with 0 value, and array
>> >> comparisons where 1 pointer is 0 can be skipped.
>> >
>> > I followed the spirit of the runtime testing code.  But Coccinelle doesn't
>> > normally unfold the definitions of macros.  All it can do is take the
>> > different lists of fields and see if they are textually the same.
>>
>> There's no need to unfold macros. If you did, you would get false
>> positives. You do need to skip them somehow, hence the idea of sed'ing
>> to null pointers.
>
> I meant that for the properties, the values are:
>
> static enum power_supply_property bq27000_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_TIME_TO_EMPTY_AVG,
>         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,
> };
>
> Coccinelle is comparing the list of names, not the list of integers that
> these names are expanding to.

That's perfect.

> Also, Coccinelle is comparing the list, but I guess you would prefer that
> it compare the set, to check for the cases where the names are the same
> but appear in a different order.

Yes, ideally it would sort arrays before doing compare. Is that doable?

>>
>> > I've attached the script and some fake data that I made to test it.  The
>> > fake data has some added cases where I have replaced 27 in the structure
>> > name by 07.  For my test data I get:
>> >
>> > bq07421_regs and bq27421_regs have the same registers
>> > bq07000_regs and bq27000_regs have the same registers
>> > bq07421_dm_regs and bq27421_dm_regs have the same registers
>> > bq07421_props and bq27421_props have the same properties
>> > bq07000_props and bq27000_props have the same properties

We can just write
"%s & %s are identical"

>> > You won't get this currently; I needed to make some improvements to the
>> > Coccinelle C code parser.
>>
>> I didn't see anything attached, script or data.
>
> Sorry, should be there now.
>
>> The script should compare each object with only those objects that
>> follow it in sequence, so it doesn't repeat comparisons or compare to
>> self.
>
> It does this, ie it only compares xxx to yyy when xxx is alphabetically
> less than yyy.

Ah, I had misread your results log.

Looks promising! :-)

^ permalink raw reply	[flat|nested] 63+ messages in thread

* Re: [PATCH v3 0/5] bq27xxx_battery data memory update
  2017-09-20  9:41                                       ` [Cocci] " Liam Breck
@ 2017-09-20  9:45                                         ` Julia Lawall
  -1 siblings, 0 replies; 63+ messages in thread
From: Julia Lawall @ 2017-09-20  9:45 UTC (permalink / raw)
  To: Liam Breck
  Cc: Sebastian Reichel, Gilles Muller, Nicolas Palix, Michal Marek,
	cocci, Andrew F. Davis, Pali Rohár, Linux PM mailing list

> > Also, Coccinelle is comparing the list, but I guess you would prefer that
> > it compare the set, to check for the cases where the names are the same
> > but appear in a different order.
>
> Yes, ideally it would sort arrays before doing compare. Is that doable?

Yes.

>
> >>
> >> > I've attached the script and some fake data that I made to test it.  The
> >> > fake data has some added cases where I have replaced 27 in the structure
> >> > name by 07.  For my test data I get:
> >> >
> >> > bq07421_regs and bq27421_regs have the same registers
> >> > bq07000_regs and bq27000_regs have the same registers
> >> > bq07421_dm_regs and bq27421_dm_regs have the same registers
> >> > bq07421_props and bq27421_props have the same properties
> >> > bq07000_props and bq27000_props have the same properties
>
> We can just write
> "%s & %s are identical"

OK.

But just to check, there are three fields of interest: regs, dm_regs and
props.  If for two entries regs are the same but dm_regs and props are
different, you still want a warning about regs, right?  This is the
behavior that seemed to be in the C code and is what I have implemented.
Or do you want a warning only if all three are the same.

julia

^ permalink raw reply	[flat|nested] 63+ messages in thread

* [Cocci] [PATCH v3 0/5] bq27xxx_battery data memory update
@ 2017-09-20  9:45                                         ` Julia Lawall
  0 siblings, 0 replies; 63+ messages in thread
From: Julia Lawall @ 2017-09-20  9:45 UTC (permalink / raw)
  To: cocci

> > Also, Coccinelle is comparing the list, but I guess you would prefer that
> > it compare the set, to check for the cases where the names are the same
> > but appear in a different order.
>
> Yes, ideally it would sort arrays before doing compare. Is that doable?

Yes.

>
> >>
> >> > I've attached the script and some fake data that I made to test it.  The
> >> > fake data has some added cases where I have replaced 27 in the structure
> >> > name by 07.  For my test data I get:
> >> >
> >> > bq07421_regs and bq27421_regs have the same registers
> >> > bq07000_regs and bq27000_regs have the same registers
> >> > bq07421_dm_regs and bq27421_dm_regs have the same registers
> >> > bq07421_props and bq27421_props have the same properties
> >> > bq07000_props and bq27000_props have the same properties
>
> We can just write
> "%s & %s are identical"

OK.

But just to check, there are three fields of interest: regs, dm_regs and
props.  If for two entries regs are the same but dm_regs and props are
different, you still want a warning about regs, right?  This is the
behavior that seemed to be in the C code and is what I have implemented.
Or do you want a warning only if all three are the same.

julia

^ permalink raw reply	[flat|nested] 63+ messages in thread

* Re: [PATCH v3 0/5] bq27xxx_battery data memory update
  2017-09-20  9:45                                         ` [Cocci] " Julia Lawall
@ 2017-09-20  9:57                                           ` Liam Breck
  -1 siblings, 0 replies; 63+ messages in thread
From: Liam Breck @ 2017-09-20  9:57 UTC (permalink / raw)
  To: Julia Lawall
  Cc: Sebastian Reichel, Gilles Muller, Nicolas Palix, Michal Marek,
	cocci, Andrew F. Davis, Pali Rohár, Linux PM mailing list

On Wed, Sep 20, 2017 at 2:45 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
>> > Also, Coccinelle is comparing the list, but I guess you would prefer that
>> > it compare the set, to check for the cases where the names are the same
>> > but appear in a different order.
>>
>> Yes, ideally it would sort arrays before doing compare. Is that doable?
>
> Yes.
>
>>
>> >>
>> >> > I've attached the script and some fake data that I made to test it.  The
>> >> > fake data has some added cases where I have replaced 27 in the structure
>> >> > name by 07.  For my test data I get:
>> >> >
>> >> > bq07421_regs and bq27421_regs have the same registers
>> >> > bq07000_regs and bq27000_regs have the same registers
>> >> > bq07421_dm_regs and bq27421_dm_regs have the same registers
>> >> > bq07421_props and bq27421_props have the same properties
>> >> > bq07000_props and bq27000_props have the same properties
>>
>> We can just write
>> "%s & %s are identical"
>
> OK.
>
> But just to check, there are three fields of interest: regs, dm_regs and
> props.  If for two entries regs are the same but dm_regs and props are
> different, you still want a warning about regs, right?  This is the
> behavior that seemed to be in the C code and is what I have implemented.
> Or do you want a warning only if all three are the same.

Each set of arrays is independent, so what you have is correct.

^ permalink raw reply	[flat|nested] 63+ messages in thread

* [Cocci] [PATCH v3 0/5] bq27xxx_battery data memory update
@ 2017-09-20  9:57                                           ` Liam Breck
  0 siblings, 0 replies; 63+ messages in thread
From: Liam Breck @ 2017-09-20  9:57 UTC (permalink / raw)
  To: cocci

On Wed, Sep 20, 2017 at 2:45 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
>> > Also, Coccinelle is comparing the list, but I guess you would prefer that
>> > it compare the set, to check for the cases where the names are the same
>> > but appear in a different order.
>>
>> Yes, ideally it would sort arrays before doing compare. Is that doable?
>
> Yes.
>
>>
>> >>
>> >> > I've attached the script and some fake data that I made to test it.  The
>> >> > fake data has some added cases where I have replaced 27 in the structure
>> >> > name by 07.  For my test data I get:
>> >> >
>> >> > bq07421_regs and bq27421_regs have the same registers
>> >> > bq07000_regs and bq27000_regs have the same registers
>> >> > bq07421_dm_regs and bq27421_dm_regs have the same registers
>> >> > bq07421_props and bq27421_props have the same properties
>> >> > bq07000_props and bq27000_props have the same properties
>>
>> We can just write
>> "%s & %s are identical"
>
> OK.
>
> But just to check, there are three fields of interest: regs, dm_regs and
> props.  If for two entries regs are the same but dm_regs and props are
> different, you still want a warning about regs, right?  This is the
> behavior that seemed to be in the C code and is what I have implemented.
> Or do you want a warning only if all three are the same.

Each set of arrays is independent, so what you have is correct.

^ permalink raw reply	[flat|nested] 63+ messages in thread

* Re: [PATCH v3 0/5] bq27xxx_battery data memory update
  2017-09-20  9:41                                       ` [Cocci] " Liam Breck
@ 2017-09-27 10:02                                         ` Julia Lawall
  -1 siblings, 0 replies; 63+ messages in thread
From: Julia Lawall @ 2017-09-27 10:02 UTC (permalink / raw)
  To: Liam Breck
  Cc: Sebastian Reichel, Gilles Muller, Nicolas Palix, Michal Marek,
	cocci, Andrew F. Davis, Pali Rohár, Linux PM mailing list

[-- Attachment #1: Type: text/plain, Size: 543 bytes --]

The github version of Coccinelle finally supports the semantic patch for
your code.  I have attached the semantic patch.  I wonder what should be
done with this?  Do you want to use it locally with make coccicheck?  Do
you want it to be integrated into the kernel?  Everything in the semantic
patch depends on the occurrence of BQ27XXX_DATA, so if make coccicheck is
used on files that don't contain this word, they should be ignored very
efficiently.  So perhaps it is ok for scripts/coccinelle even if it is
relevant to only one file.

julia

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: Type: text/x-csrc; name=battery.c, Size: 57648 bytes --]

/*
 * BQ27xxx battery driver
 *
 * Copyright (C) 2008 Rodolfo Giometti <giometti@linux.it>
 * Copyright (C) 2008 Eurotech S.p.A. <info@eurotech.it>
 * Copyright (C) 2010-2011 Lars-Peter Clausen <lars@metafoo.de>
 * Copyright (C) 2011 Pali Rohár <pali.rohar@gmail.com>
 * Copyright (C) 2017 Liam Breck <kernel@networkimprov.net>
 *
 * Based on a previous work by Copyright (C) 2008 Texas Instruments, Inc.
 *
 * This package is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 *
 * Datasheets:
 * http://www.ti.com/product/bq27000
 * http://www.ti.com/product/bq27200
 * http://www.ti.com/product/bq27010
 * http://www.ti.com/product/bq27210
 * http://www.ti.com/product/bq27500
 * http://www.ti.com/product/bq27510-g1
 * http://www.ti.com/product/bq27510-g2
 * http://www.ti.com/product/bq27510-g3
 * http://www.ti.com/product/bq27520-g4
 * http://www.ti.com/product/bq27520-g1
 * http://www.ti.com/product/bq27520-g2
 * http://www.ti.com/product/bq27520-g3
 * http://www.ti.com/product/bq27520-g4
 * http://www.ti.com/product/bq27530-g1
 * http://www.ti.com/product/bq27531-g1
 * http://www.ti.com/product/bq27541-g1
 * http://www.ti.com/product/bq27542-g1
 * http://www.ti.com/product/bq27546-g1
 * http://www.ti.com/product/bq27742-g1
 * http://www.ti.com/product/bq27545-g1
 * http://www.ti.com/product/bq27421-g1
 * http://www.ti.com/product/bq27425-g1
 * http://www.ti.com/product/bq27411-g1
 * http://www.ti.com/product/bq27621-g1
 */

#include <linux/device.h>
#include <linux/module.h>
#include <linux/mutex.h>
#include <linux/param.h>
#include <linux/jiffies.h>
#include <linux/workqueue.h>
#include <linux/delay.h>
#include <linux/platform_device.h>
#include <linux/power_supply.h>
#include <linux/slab.h>
#include <linux/of.h>

#include <linux/power/bq27xxx_battery.h>

#define BQ27XXX_MANUFACTURER	"Texas Instruments"

/* BQ27XXX Flags */
#define BQ27XXX_FLAG_DSC	BIT(0)
#define BQ27XXX_FLAG_SOCF	BIT(1) /* State-of-Charge threshold final */
#define BQ27XXX_FLAG_SOC1	BIT(2) /* State-of-Charge threshold 1 */
#define BQ27XXX_FLAG_CFGUP	BIT(4)
#define BQ27XXX_FLAG_FC		BIT(9)
#define BQ27XXX_FLAG_OTD	BIT(14)
#define BQ27XXX_FLAG_OTC	BIT(15)
#define BQ27XXX_FLAG_UT		BIT(14)
#define BQ27XXX_FLAG_OT		BIT(15)

/* BQ27000 has different layout for Flags register */
#define BQ27000_FLAG_EDVF	BIT(0) /* Final End-of-Discharge-Voltage flag */
#define BQ27000_FLAG_EDV1	BIT(1) /* First End-of-Discharge-Voltage flag */
#define BQ27000_FLAG_CI		BIT(4) /* Capacity Inaccurate flag */
#define BQ27000_FLAG_FC		BIT(5)
#define BQ27000_FLAG_CHGS	BIT(7) /* Charge state flag */

/* control register params */
#define BQ27XXX_SEALED			0x20
#define BQ27XXX_SET_CFGUPDATE		0x13
#define BQ27XXX_SOFT_RESET		0x42
#define BQ27XXX_RESET			0x41

#define BQ27XXX_RS			(20) /* Resistor sense mOhm */
#define BQ27XXX_POWER_CONSTANT		(29200) /* 29.2 µV^2 * 1000 */
#define BQ27XXX_CURRENT_CONSTANT	(3570) /* 3.57 µV * 1000 */

#define INVALID_REG_ADDR	0xff

/*
 * bq27xxx_reg_index - Register names
 *
 * These are indexes into a device's register mapping array.
 */

enum bq27xxx_reg_index {
	BQ27XXX_REG_CTRL = 0,	/* Control */
	BQ27XXX_REG_TEMP,	/* Temperature */
	BQ27XXX_REG_INT_TEMP,	/* Internal Temperature */
	BQ27XXX_REG_VOLT,	/* Voltage */
	BQ27XXX_REG_AI,		/* Average Current */
	BQ27XXX_REG_FLAGS,	/* Flags */
	BQ27XXX_REG_TTE,	/* Time-to-Empty */
	BQ27XXX_REG_TTF,	/* Time-to-Full */
	BQ27XXX_REG_TTES,	/* Time-to-Empty Standby */
	BQ27XXX_REG_TTECP,	/* Time-to-Empty at Constant Power */
	BQ27XXX_REG_NAC,	/* Nominal Available Capacity */
	BQ27XXX_REG_FCC,	/* Full Charge Capacity */
	BQ27XXX_REG_CYCT,	/* Cycle Count */
	BQ27XXX_REG_AE,		/* Available Energy */
	BQ27XXX_REG_SOC,	/* State-of-Charge */
	BQ27XXX_REG_DCAP,	/* Design Capacity */
	BQ27XXX_REG_AP,		/* Average Power */
	BQ27XXX_DM_CTRL,	/* Block Data Control */
	BQ27XXX_DM_CLASS,	/* Data Class */
	BQ27XXX_DM_BLOCK,	/* Data Block */
	BQ27XXX_DM_DATA,	/* Block Data */
	BQ27XXX_DM_CKSUM,	/* Block Data Checksum */
	BQ27XXX_REG_MAX,	/* sentinel */
};

#define BQ27XXX_DM_REG_ROWS \
	[BQ27XXX_DM_CTRL] = 0x61,  \
	[BQ27XXX_DM_CLASS] = 0x3e, \
	[BQ27XXX_DM_BLOCK] = 0x3f, \
	[BQ27XXX_DM_DATA] = 0x40,  \
	[BQ27XXX_DM_CKSUM] = 0x60

/* Register mappings */
static u8
	bq27000_regs[BQ27XXX_REG_MAX] = {
		[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] = 0x0b,
		[BQ27XXX_REG_DCAP] = 0x76,
		[BQ27XXX_REG_AP] = 0x24,
		[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,
	},
	bq07000_regs[BQ27XXX_REG_MAX] = {
		[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] = 0x0b,
		[BQ27XXX_REG_DCAP] = 0x76,
		[BQ27XXX_REG_AP] = 0x24,
		[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,
	},
	bq27010_regs[BQ27XXX_REG_MAX] = {
		[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] = INVALID_REG_ADDR,
		[BQ27XXX_REG_SOC] = 0x0b,
		[BQ27XXX_REG_DCAP] = 0x76,
		[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,
	},
	bq2750x_regs[BQ27XXX_REG_MAX] = {
		[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] = 0x2a,
		[BQ27XXX_REG_AE] = INVALID_REG_ADDR,
		[BQ27XXX_REG_SOC] = 0x2c,
		[BQ27XXX_REG_DCAP] = 0x3c,
		[BQ27XXX_REG_AP] = INVALID_REG_ADDR,
		BQ27XXX_DM_REG_ROWS,
	},
#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,
		[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,
	},
#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,
		[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,
	},
	bq27520g1_regs[BQ27XXX_REG_MAX] = {
		[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] = INVALID_REG_ADDR,
		[BQ27XXX_REG_AE] = 0x22,
		[BQ27XXX_REG_SOC] = 0x2c,
		[BQ27XXX_REG_DCAP] = 0x3c,
		[BQ27XXX_REG_AP] = 0x24,
		BQ27XXX_DM_REG_ROWS,
	},
	bq27520g2_regs[BQ27XXX_REG_MAX] = {
		[BQ27XXX_REG_CTRL] = 0x00,
		[BQ27XXX_REG_TEMP] = 0x06,
		[BQ27XXX_REG_INT_TEMP] = 0x36,
		[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,
	},
	bq27520g3_regs[BQ27XXX_REG_MAX] = {
		[BQ27XXX_REG_CTRL] = 0x00,
		[BQ27XXX_REG_TEMP] = 0x06,
		[BQ27XXX_REG_INT_TEMP] = 0x36,
		[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] = 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,
	},
	bq27520g4_regs[BQ27XXX_REG_MAX] = {
		[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] = 0x1c,
		[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] = INVALID_REG_ADDR,
		[BQ27XXX_REG_AP] = INVALID_REG_ADDR,
		BQ27XXX_DM_REG_ROWS,
	},
	bq27530_regs[BQ27XXX_REG_MAX] = {
		[BQ27XXX_REG_CTRL] = 0x00,
		[BQ27XXX_REG_TEMP] = 0x06,
		[BQ27XXX_REG_INT_TEMP] = 0x32,
		[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] = INVALID_REG_ADDR,
		[BQ27XXX_REG_TTECP] = INVALID_REG_ADDR,
		[BQ27XXX_REG_NAC] = 0x0c,
		[BQ27XXX_REG_FCC] = 0x12,
		[BQ27XXX_REG_CYCT] = 0x2a,
		[BQ27XXX_REG_AE] = INVALID_REG_ADDR,
		[BQ27XXX_REG_SOC] = 0x2c,
		[BQ27XXX_REG_DCAP] = INVALID_REG_ADDR,
		[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,
		[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] = INVALID_REG_ADDR,
		[BQ27XXX_REG_TTECP] = INVALID_REG_ADDR,
		[BQ27XXX_REG_NAC] = 0x0c,
		[BQ27XXX_REG_FCC] = 0x12,
		[BQ27XXX_REG_CYCT] = 0x2a,
		[BQ27XXX_REG_AE] = INVALID_REG_ADDR,
		[BQ27XXX_REG_SOC] = 0x2c,
		[BQ27XXX_REG_DCAP] = 0x3c,
		[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,
		[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] = INVALID_REG_ADDR,
		[BQ27XXX_REG_TTECP] = INVALID_REG_ADDR,
		[BQ27XXX_REG_NAC] = 0x0c,
		[BQ27XXX_REG_FCC] = 0x12,
		[BQ27XXX_REG_CYCT] = 0x2a,
		[BQ27XXX_REG_AE] = INVALID_REG_ADDR,
		[BQ27XXX_REG_SOC] = 0x2c,
		[BQ27XXX_REG_DCAP] = INVALID_REG_ADDR,
		[BQ27XXX_REG_AP] = 0x24,
		BQ27XXX_DM_REG_ROWS,
	},
	bq27421_regs[BQ27XXX_REG_MAX] = {
		[BQ27XXX_REG_CTRL] = 0x00,
		[BQ27XXX_REG_TEMP] = 0x02,
		[BQ27XXX_REG_INT_TEMP] = 0x1e,
		[BQ27XXX_REG_VOLT] = 0x04,
		[BQ27XXX_REG_AI] = 0x10,
		[BQ27XXX_REG_FLAGS] = 0x06,
		[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] = 0x08,
		[BQ27XXX_REG_FCC] = 0x0e,
		[BQ27XXX_REG_CYCT] = INVALID_REG_ADDR,
		[BQ27XXX_REG_AE] = INVALID_REG_ADDR,
		[BQ27XXX_REG_SOC] = 0x1c,
		[BQ27XXX_REG_DCAP] = 0x3c,
		[BQ27XXX_REG_AP] = 0x18,
		BQ27XXX_DM_REG_ROWS,
	},
	bq07421_regs[BQ27XXX_REG_MAX] = {
		[BQ27XXX_REG_CTRL] = 0x00,
		[BQ27XXX_REG_TEMP] = 0x02,
		[BQ27XXX_REG_INT_TEMP] = 0x1e,
		[BQ27XXX_REG_VOLT] = 0x04,
		[BQ27XXX_REG_AI] = 0x10,
		[BQ27XXX_REG_FLAGS] = 0x06,
		[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] = 0x08,
		[BQ27XXX_REG_FCC] = 0x0e,
		[BQ27XXX_REG_CYCT] = INVALID_REG_ADDR,
		[BQ27XXX_REG_AE] = INVALID_REG_ADDR,
		[BQ27XXX_REG_SOC] = 0x1c,
		[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_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_TIME_TO_EMPTY_AVG,
	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 bq07000_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_TIME_TO_EMPTY_AVG,
	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 bq27010_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_TIME_TO_EMPTY_AVG,
	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_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 bq27500_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_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 bq27510g3_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,
};

static enum power_supply_property bq27520g1_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_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_MANUFACTURER,
};

#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,
	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_ENERGY_NOW,
	POWER_SUPPLY_PROP_POWER_AVG,
	POWER_SUPPLY_PROP_HEALTH,
	POWER_SUPPLY_PROP_MANUFACTURER,
};

static enum power_supply_property bq27520g4_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_CYCLE_COUNT,
	POWER_SUPPLY_PROP_HEALTH,
	POWER_SUPPLY_PROP_MANUFACTURER,
};

static enum power_supply_property bq27530_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,
};
#define bq27531_props bq27530_props

static enum power_supply_property bq27541_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,
};
#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,
	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,
};

static enum power_supply_property bq27421_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,
};

static enum power_supply_property bq07421_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,
};
#define bq27425_props bq27421_props
#define bq27441_props bq27421_props
#define bq27621_props bq27421_props

struct bq27xxx_dm_reg {
	u8 subclass_id;
	u8 offset;
	u8 bytes;
	u16 min, max;
};

enum bq27xxx_dm_reg_id {
	BQ27XXX_DM_DESIGN_CAPACITY = 0,
	BQ27XXX_DM_DESIGN_ENERGY,
	BQ27XXX_DM_TERMINATE_VOLTAGE,
};

#define bq27000_dm_regs 0
#define bq07000_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

/* 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

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 },
};

static struct bq27xxx_dm_reg bq07421_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 },
};

#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 props_size;
} bq27xxx_chip_data[] = {
	[BQ27000]   = BQ27XXX_DATA(bq27000,   0         , BQ27XXX_O_ZERO),
	[BQ07000]   = BQ27XXX_DATA(bq07000,   0         , BQ27XXX_O_ZERO),//dup
	[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),
	[BQ07421]   = BQ27XXX_DATA(bq07421,   0x80008000, BQ27XXX_O_UTOT | BQ27XXX_O_CFGUP | BQ27XXX_O_RAM), //dup
	[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);
static LIST_HEAD(bq27xxx_battery_devices);

#define BQ27XXX_MSLEEP(i) usleep_range((i)*1000, (i)*1000+500)

#define BQ27XXX_DM_SZ	32

/**
 * struct bq27xxx_dm_buf - chip data memory buffer
 * @class: data memory subclass_id
 * @block: data memory block number
 * @data: data from/for the block
 * @has_data: true if data has been filled by read
 * @dirty: true if data has changed since last read/write
 *
 * Encapsulates info required to manage chip data memory blocks.
 */
struct bq27xxx_dm_buf {
	u8 class;
	u8 block;
	u8 data[BQ27XXX_DM_SZ];
	bool has_data, dirty;
};

#define BQ27XXX_DM_BUF(di, i) { \
	.class = (di)->dm_regs[i].subclass_id, \
	.block = (di)->dm_regs[i].offset / BQ27XXX_DM_SZ, \
}

static inline u16 *bq27xxx_dm_reg_ptr(struct bq27xxx_dm_buf *buf,
				      struct bq27xxx_dm_reg *reg)
{
	if (buf->class == reg->subclass_id &&
	    buf->block == reg->offset / BQ27XXX_DM_SZ)
		return (u16 *) (buf->data + reg->offset % BQ27XXX_DM_SZ);

	return NULL;
}

static const char * const bq27xxx_dm_reg_name[] = {
	[BQ27XXX_DM_DESIGN_CAPACITY] = "design-capacity",
	[BQ27XXX_DM_DESIGN_ENERGY] = "design-energy",
	[BQ27XXX_DM_TERMINATE_VOLTAGE] = "terminate-voltage",
};


static bool bq27xxx_dt_to_nvm = true;
module_param_named(dt_monitored_battery_updates_nvm, bq27xxx_dt_to_nvm, bool, 0444);
MODULE_PARM_DESC(dt_monitored_battery_updates_nvm,
	"Devicetree monitored-battery config updates data memory on NVM/flash chips.\n"
	"Users must set this =0 when installing a different type of battery!\n"
	"Default is =1."
#ifndef CONFIG_BATTERY_BQ27XXX_DT_UPDATES_NVM
	"\nSetting this affects future kernel updates, not the current configuration."
#endif
);

static int poll_interval_param_set(const char *val, const struct kernel_param *kp)
{
	struct bq27xxx_device_info *di;
	unsigned int prev_val = *(unsigned int *) kp->arg;
	int ret;

	ret = param_set_uint(val, kp);
	if (ret < 0 || prev_val == *(unsigned int *) kp->arg)
		return ret;

	mutex_lock(&bq27xxx_list_lock);
	list_for_each_entry(di, &bq27xxx_battery_devices, list) {
		cancel_delayed_work_sync(&di->work);
		schedule_delayed_work(&di->work, 0);
	}
	mutex_unlock(&bq27xxx_list_lock);

	return ret;
}

static const struct kernel_param_ops param_ops_poll_interval = {
	.get = param_get_uint,
	.set = poll_interval_param_set,
};

static unsigned int poll_interval = 360;
module_param_cb(poll_interval, &param_ops_poll_interval, &poll_interval, 0644);
MODULE_PARM_DESC(poll_interval,
		 "battery poll interval in seconds - 0 disables polling");

/*
 * Common code for BQ27xxx devices
 */

static inline int bq27xxx_read(struct bq27xxx_device_info *di, int reg_index,
			       bool single)
{
	int ret;

	if (!di || di->regs[reg_index] == INVALID_REG_ADDR)
		return -EINVAL;

	ret = di->bus.read(di, di->regs[reg_index], single);
	if (ret < 0)
		dev_dbg(di->dev, "failed to read register 0x%02x (index %d)\n",
			di->regs[reg_index], reg_index);

	return ret;
}

static inline int bq27xxx_write(struct bq27xxx_device_info *di, int reg_index,
				u16 value, bool single)
{
	int ret;

	if (!di || di->regs[reg_index] == INVALID_REG_ADDR)
		return -EINVAL;

	if (!di->bus.write)
		return -EPERM;

	ret = di->bus.write(di, di->regs[reg_index], value, single);
	if (ret < 0)
		dev_dbg(di->dev, "failed to write register 0x%02x (index %d)\n",
			di->regs[reg_index], reg_index);

	return ret;
}

static inline int bq27xxx_read_block(struct bq27xxx_device_info *di, int reg_index,
				     u8 *data, int len)
{
	int ret;

	if (!di || di->regs[reg_index] == INVALID_REG_ADDR)
		return -EINVAL;

	if (!di->bus.read_bulk)
		return -EPERM;

	ret = di->bus.read_bulk(di, di->regs[reg_index], data, len);
	if (ret < 0)
		dev_dbg(di->dev, "failed to read_bulk register 0x%02x (index %d)\n",
			di->regs[reg_index], reg_index);

	return ret;
}

static inline int bq27xxx_write_block(struct bq27xxx_device_info *di, int reg_index,
				      u8 *data, int len)
{
	int ret;

	if (!di || di->regs[reg_index] == INVALID_REG_ADDR)
		return -EINVAL;

	if (!di->bus.write_bulk)
		return -EPERM;

	ret = di->bus.write_bulk(di, di->regs[reg_index], data, len);
	if (ret < 0)
		dev_dbg(di->dev, "failed to write_bulk register 0x%02x (index %d)\n",
			di->regs[reg_index], reg_index);

	return ret;
}

static int bq27xxx_battery_seal(struct bq27xxx_device_info *di)
{
	int ret;

	ret = bq27xxx_write(di, BQ27XXX_REG_CTRL, BQ27XXX_SEALED, false);
	if (ret < 0) {
		dev_err(di->dev, "bus error on seal: %d\n", ret);
		return ret;
	}

	return 0;
}

static int bq27xxx_battery_unseal(struct bq27xxx_device_info *di)
{
	int ret;

	if (di->unseal_key == 0) {
		dev_err(di->dev, "unseal failed due to missing key\n");
		return -EINVAL;
	}

	ret = bq27xxx_write(di, BQ27XXX_REG_CTRL, (u16)(di->unseal_key >> 16), false);
	if (ret < 0)
		goto out;

	ret = bq27xxx_write(di, BQ27XXX_REG_CTRL, (u16)di->unseal_key, false);
	if (ret < 0)
		goto out;

	return 0;

out:
	dev_err(di->dev, "bus error on unseal: %d\n", ret);
	return ret;
}

static u8 bq27xxx_battery_checksum_dm_block(struct bq27xxx_dm_buf *buf)
{
	u16 sum = 0;
	int i;

	for (i = 0; i < BQ27XXX_DM_SZ; i++)
		sum += buf->data[i];
	sum &= 0xff;

	return 0xff - sum;
}

static int bq27xxx_battery_read_dm_block(struct bq27xxx_device_info *di,
					 struct bq27xxx_dm_buf *buf)
{
	int ret;

	buf->has_data = false;

	ret = bq27xxx_write(di, BQ27XXX_DM_CLASS, buf->class, true);
	if (ret < 0)
		goto out;

	ret = bq27xxx_write(di, BQ27XXX_DM_BLOCK, buf->block, true);
	if (ret < 0)
		goto out;

	BQ27XXX_MSLEEP(1);

	ret = bq27xxx_read_block(di, BQ27XXX_DM_DATA, buf->data, BQ27XXX_DM_SZ);
	if (ret < 0)
		goto out;

	ret = bq27xxx_read(di, BQ27XXX_DM_CKSUM, true);
	if (ret < 0)
		goto out;

	if ((u8)ret != bq27xxx_battery_checksum_dm_block(buf)) {
		ret = -EINVAL;
		goto out;
	}

	buf->has_data = true;
	buf->dirty = false;

	return 0;

out:
	dev_err(di->dev, "bus error reading chip memory: %d\n", ret);
	return ret;
}

static void bq27xxx_battery_update_dm_block(struct bq27xxx_device_info *di,
					    struct bq27xxx_dm_buf *buf,
					    enum bq27xxx_dm_reg_id reg_id,
					    unsigned int val)
{
	struct bq27xxx_dm_reg *reg = &di->dm_regs[reg_id];
	const char *str = bq27xxx_dm_reg_name[reg_id];
	u16 *prev = bq27xxx_dm_reg_ptr(buf, reg);

	if (prev == NULL) {
		dev_warn(di->dev, "buffer does not match %s dm spec\n", str);
		return;
	}

	if (reg->bytes != 2) {
		dev_warn(di->dev, "%s dm spec has unsupported byte size\n", str);
		return;
	}

	if (!buf->has_data)
		return;

	if (be16_to_cpup(prev) == val) {
		dev_info(di->dev, "%s has %u\n", str, val);
		return;
	}

#ifdef CONFIG_BATTERY_BQ27XXX_DT_UPDATES_NVM
	if (!(di->opts & BQ27XXX_O_RAM) && !bq27xxx_dt_to_nvm) {
#else
	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 "
#ifdef CONFIG_BATTERY_BQ27XXX_DT_UPDATES_NVM
			 "by dt_monitored_battery_updates_nvm=0"
#else
			 "for flash/NVM data memory"
#endif
			 "\n", str, be16_to_cpup(prev), val);
		return;
	}

	dev_info(di->dev, "update %s to %u\n", str, val);

	*prev = cpu_to_be16(val);
	buf->dirty = true;
}

static int bq27xxx_battery_cfgupdate_priv(struct bq27xxx_device_info *di, bool active)
{
	const int limit = 100;
	u16 cmd = active ? BQ27XXX_SET_CFGUPDATE : BQ27XXX_SOFT_RESET;
	int ret, try = limit;

	ret = bq27xxx_write(di, BQ27XXX_REG_CTRL, cmd, false);
	if (ret < 0)
		return ret;

	do {
		BQ27XXX_MSLEEP(25);
		ret = bq27xxx_read(di, BQ27XXX_REG_FLAGS, false);
		if (ret < 0)
			return ret;
	} while (!!(ret & BQ27XXX_FLAG_CFGUP) != active && --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;
	}

	if (limit - try > 3)
		dev_warn(di->dev, "cfgupdate %d, retries %d\n", active, limit - try);

	return 0;
}

static inline int bq27xxx_battery_set_cfgupdate(struct bq27xxx_device_info *di)
{
	int ret = bq27xxx_battery_cfgupdate_priv(di, true);
	if (ret < 0 && ret != -EINVAL)
		dev_err(di->dev, "bus error on set_cfgupdate: %d\n", ret);

	return ret;
}

static inline int bq27xxx_battery_soft_reset(struct bq27xxx_device_info *di)
{
	int ret = bq27xxx_battery_cfgupdate_priv(di, false);
	if (ret < 0 && ret != -EINVAL)
		dev_err(di->dev, "bus error on soft_reset: %d\n", ret);

	return ret;
}

static int bq27xxx_battery_write_dm_block(struct bq27xxx_device_info *di,
					  struct bq27xxx_dm_buf *buf)
{
	bool cfgup = di->opts & BQ27XXX_O_CFGUP;
	int ret;

	if (!buf->dirty)
		return 0;

	if (cfgup) {
		ret = bq27xxx_battery_set_cfgupdate(di);
		if (ret < 0)
			return ret;
	}

	ret = bq27xxx_write(di, BQ27XXX_DM_CTRL, 0, true);
	if (ret < 0)
		goto out;

	ret = bq27xxx_write(di, BQ27XXX_DM_CLASS, buf->class, true);
	if (ret < 0)
		goto out;

	ret = bq27xxx_write(di, BQ27XXX_DM_BLOCK, buf->block, true);
	if (ret < 0)
		goto out;

	BQ27XXX_MSLEEP(1);

	ret = bq27xxx_write_block(di, BQ27XXX_DM_DATA, buf->data, BQ27XXX_DM_SZ);
	if (ret < 0)
		goto out;

	ret = bq27xxx_write(di, BQ27XXX_DM_CKSUM,
			    bq27xxx_battery_checksum_dm_block(buf), true);
	if (ret < 0)
		goto out;

	/* DO NOT read BQ27XXX_DM_CKSUM here to verify it! That may cause NVM
	 * corruption on the '425 chip (and perhaps others), which can damage
	 * the chip.
	 */

	if (cfgup) {
		BQ27XXX_MSLEEP(1);
		ret = bq27xxx_battery_soft_reset(di);
		if (ret < 0)
			return ret;
	} else {
		BQ27XXX_MSLEEP(100); /* flash DM updates in <100ms */
	}

	buf->dirty = false;

	return 0;

out:
	if (cfgup)
		bq27xxx_battery_soft_reset(di);

	dev_err(di->dev, "bus error writing chip memory: %d\n", ret);
	return ret;
}

static void bq27xxx_battery_set_config(struct bq27xxx_device_info *di,
				       struct power_supply_battery_info *info)
{
	struct bq27xxx_dm_buf bd = BQ27XXX_DM_BUF(di, BQ27XXX_DM_DESIGN_CAPACITY);
	struct bq27xxx_dm_buf bt = BQ27XXX_DM_BUF(di, BQ27XXX_DM_TERMINATE_VOLTAGE);
	bool updated;

	if (bq27xxx_battery_unseal(di) < 0)
		return;

	if (info->charge_full_design_uah != -EINVAL &&
	    info->energy_full_design_uwh != -EINVAL) {
		bq27xxx_battery_read_dm_block(di, &bd);
		/* assume design energy & capacity are in same block */
		bq27xxx_battery_update_dm_block(di, &bd,
					BQ27XXX_DM_DESIGN_CAPACITY,
					info->charge_full_design_uah / 1000);
		bq27xxx_battery_update_dm_block(di, &bd,
					BQ27XXX_DM_DESIGN_ENERGY,
					info->energy_full_design_uwh / 1000);
	}

	if (info->voltage_min_design_uv != -EINVAL) {
		bool same = bd.class == bt.class && bd.block == bt.block;
		if (!same)
			bq27xxx_battery_read_dm_block(di, &bt);
		bq27xxx_battery_update_dm_block(di, same ? &bd : &bt,
					BQ27XXX_DM_TERMINATE_VOLTAGE,
					info->voltage_min_design_uv / 1000);
	}

	updated = bd.dirty || bt.dirty;

	bq27xxx_battery_write_dm_block(di, &bd);
	bq27xxx_battery_write_dm_block(di, &bt);

	bq27xxx_battery_seal(di);

	if (updated && !(di->opts & BQ27XXX_O_CFGUP)) {
		bq27xxx_write(di, BQ27XXX_REG_CTRL, BQ27XXX_RESET, false);
		BQ27XXX_MSLEEP(300); /* reset time is not documented */
	}
	/* assume bq27xxx_battery_update() is called hereafter */
}

static void bq27xxx_battery_settings(struct bq27xxx_device_info *di)
{
	struct power_supply_battery_info info = {};
	unsigned int min, max;

	if (power_supply_get_battery_info(di->bat, &info) < 0)
		return;

	if (!di->dm_regs) {
		dev_warn(di->dev, "data memory update not supported for chip\n");
		return;
	}

	if (info.energy_full_design_uwh != info.charge_full_design_uah) {
		if (info.energy_full_design_uwh == -EINVAL)
			dev_warn(di->dev, "missing battery:energy-full-design-microwatt-hours\n");
		else if (info.charge_full_design_uah == -EINVAL)
			dev_warn(di->dev, "missing battery:charge-full-design-microamp-hours\n");
	}

	/* assume min == 0 */
	max = di->dm_regs[BQ27XXX_DM_DESIGN_ENERGY].max;
	if (info.energy_full_design_uwh > max * 1000) {
		dev_err(di->dev, "invalid battery:energy-full-design-microwatt-hours %d\n",
			info.energy_full_design_uwh);
		info.energy_full_design_uwh = -EINVAL;
	}

	/* assume min == 0 */
	max = di->dm_regs[BQ27XXX_DM_DESIGN_CAPACITY].max;
	if (info.charge_full_design_uah > max * 1000) {
		dev_err(di->dev, "invalid battery:charge-full-design-microamp-hours %d\n",
			info.charge_full_design_uah);
		info.charge_full_design_uah = -EINVAL;
	}

	min = di->dm_regs[BQ27XXX_DM_TERMINATE_VOLTAGE].min;
	max = di->dm_regs[BQ27XXX_DM_TERMINATE_VOLTAGE].max;
	if ((info.voltage_min_design_uv < min * 1000 ||
	     info.voltage_min_design_uv > max * 1000) &&
	     info.voltage_min_design_uv != -EINVAL) {
		dev_err(di->dev, "invalid battery:voltage-min-design-microvolt %d\n",
			info.voltage_min_design_uv);
		info.voltage_min_design_uv = -EINVAL;
	}

	if ((info.energy_full_design_uwh != -EINVAL &&
	     info.charge_full_design_uah != -EINVAL) ||
	     info.voltage_min_design_uv  != -EINVAL)
		bq27xxx_battery_set_config(di, &info);
}

/*
 * Return the battery State-of-Charge
 * Or < 0 if something fails.
 */
static int bq27xxx_battery_read_soc(struct bq27xxx_device_info *di)
{
	int soc;

	if (di->opts & BQ27XXX_O_ZERO)
		soc = bq27xxx_read(di, BQ27XXX_REG_SOC, true);
	else
		soc = bq27xxx_read(di, BQ27XXX_REG_SOC, false);

	if (soc < 0)
		dev_dbg(di->dev, "error reading State-of-Charge\n");

	return soc;
}

/*
 * Return a battery charge value in µAh
 * Or < 0 if something fails.
 */
static int bq27xxx_battery_read_charge(struct bq27xxx_device_info *di, u8 reg)
{
	int charge;

	charge = bq27xxx_read(di, reg, false);
	if (charge < 0) {
		dev_dbg(di->dev, "error reading charge register %02x: %d\n",
			reg, charge);
		return charge;
	}

	if (di->opts & BQ27XXX_O_ZERO)
		charge *= BQ27XXX_CURRENT_CONSTANT / BQ27XXX_RS;
	else
		charge *= 1000;

	return charge;
}

/*
 * Return the battery Nominal available capacity in µAh
 * Or < 0 if something fails.
 */
static inline int bq27xxx_battery_read_nac(struct bq27xxx_device_info *di)
{
	int flags;

	if (di->opts & BQ27XXX_O_ZERO) {
		flags = bq27xxx_read(di, BQ27XXX_REG_FLAGS, true);
		if (flags >= 0 && (flags & BQ27000_FLAG_CI))
			return -ENODATA;
	}

	return bq27xxx_battery_read_charge(di, BQ27XXX_REG_NAC);
}

/*
 * Return the battery Full Charge Capacity in µAh
 * Or < 0 if something fails.
 */
static inline int bq27xxx_battery_read_fcc(struct bq27xxx_device_info *di)
{
	return bq27xxx_battery_read_charge(di, BQ27XXX_REG_FCC);
}

/*
 * Return the Design Capacity in µAh
 * Or < 0 if something fails.
 */
static int bq27xxx_battery_read_dcap(struct bq27xxx_device_info *di)
{
	int dcap;

	if (di->opts & BQ27XXX_O_ZERO)
		dcap = bq27xxx_read(di, BQ27XXX_REG_DCAP, true);
	else
		dcap = bq27xxx_read(di, BQ27XXX_REG_DCAP, false);

	if (dcap < 0) {
		dev_dbg(di->dev, "error reading initial last measured discharge\n");
		return dcap;
	}

	if (di->opts & BQ27XXX_O_ZERO)
		dcap = (dcap << 8) * BQ27XXX_CURRENT_CONSTANT / BQ27XXX_RS;
	else
		dcap *= 1000;

	return dcap;
}

/*
 * Return the battery Available energy in µWh
 * Or < 0 if something fails.
 */
static int bq27xxx_battery_read_energy(struct bq27xxx_device_info *di)
{
	int ae;

	ae = bq27xxx_read(di, BQ27XXX_REG_AE, false);
	if (ae < 0) {
		dev_dbg(di->dev, "error reading available energy\n");
		return ae;
	}

	if (di->opts & BQ27XXX_O_ZERO)
		ae *= BQ27XXX_POWER_CONSTANT / BQ27XXX_RS;
	else
		ae *= 1000;

	return ae;
}

/*
 * Return the battery temperature in tenths of degree Kelvin
 * Or < 0 if something fails.
 */
static int bq27xxx_battery_read_temperature(struct bq27xxx_device_info *di)
{
	int temp;

	temp = bq27xxx_read(di, BQ27XXX_REG_TEMP, false);
	if (temp < 0) {
		dev_err(di->dev, "error reading temperature\n");
		return temp;
	}

	if (di->opts & BQ27XXX_O_ZERO)
		temp = 5 * temp / 2;

	return temp;
}

/*
 * Return the battery Cycle count total
 * Or < 0 if something fails.
 */
static int bq27xxx_battery_read_cyct(struct bq27xxx_device_info *di)
{
	int cyct;

	cyct = bq27xxx_read(di, BQ27XXX_REG_CYCT, false);
	if (cyct < 0)
		dev_err(di->dev, "error reading cycle count total\n");

	return cyct;
}

/*
 * Read a time register.
 * Return < 0 if something fails.
 */
static int bq27xxx_battery_read_time(struct bq27xxx_device_info *di, u8 reg)
{
	int tval;

	tval = bq27xxx_read(di, reg, false);
	if (tval < 0) {
		dev_dbg(di->dev, "error reading time register %02x: %d\n",
			reg, tval);
		return tval;
	}

	if (tval == 65535)
		return -ENODATA;

	return tval * 60;
}

/*
 * Read an average power register.
 * Return < 0 if something fails.
 */
static int bq27xxx_battery_read_pwr_avg(struct bq27xxx_device_info *di)
{
	int tval;

	tval = bq27xxx_read(di, BQ27XXX_REG_AP, false);
	if (tval < 0) {
		dev_err(di->dev, "error reading average power register  %02x: %d\n",
			BQ27XXX_REG_AP, tval);
		return tval;
	}

	if (di->opts & BQ27XXX_O_ZERO)
		return (tval * BQ27XXX_POWER_CONSTANT) / BQ27XXX_RS;
	else
		return tval;
}

/*
 * Returns true if a battery over temperature condition is detected
 */
static bool bq27xxx_battery_overtemp(struct bq27xxx_device_info *di, u16 flags)
{
	if (di->opts & BQ27XXX_O_OTDC)
		return flags & (BQ27XXX_FLAG_OTC | BQ27XXX_FLAG_OTD);
        if (di->opts & BQ27XXX_O_UTOT)
		return flags & BQ27XXX_FLAG_OT;

	return false;
}

/*
 * Returns true if a battery under temperature condition is detected
 */
static bool bq27xxx_battery_undertemp(struct bq27xxx_device_info *di, u16 flags)
{
	if (di->opts & BQ27XXX_O_UTOT)
		return flags & BQ27XXX_FLAG_UT;

	return false;
}

/*
 * Returns true if a low state of charge condition is detected
 */
static bool bq27xxx_battery_dead(struct bq27xxx_device_info *di, u16 flags)
{
	if (di->opts & BQ27XXX_O_ZERO)
		return flags & (BQ27000_FLAG_EDV1 | BQ27000_FLAG_EDVF);
	else
		return flags & (BQ27XXX_FLAG_SOC1 | BQ27XXX_FLAG_SOCF);
}

/*
 * Read flag register.
 * Return < 0 if something fails.
 */
static int bq27xxx_battery_read_health(struct bq27xxx_device_info *di)
{
	int flags;
	bool has_singe_flag = di->opts & BQ27XXX_O_ZERO;

	flags = bq27xxx_read(di, BQ27XXX_REG_FLAGS, has_singe_flag);
	if (flags < 0) {
		dev_err(di->dev, "error reading flag register:%d\n", flags);
		return flags;
	}

	/* Unlikely but important to return first */
	if (unlikely(bq27xxx_battery_overtemp(di, flags)))
		return POWER_SUPPLY_HEALTH_OVERHEAT;
	if (unlikely(bq27xxx_battery_undertemp(di, flags)))
		return POWER_SUPPLY_HEALTH_COLD;
	if (unlikely(bq27xxx_battery_dead(di, flags)))
		return POWER_SUPPLY_HEALTH_DEAD;

	return POWER_SUPPLY_HEALTH_GOOD;
}

void bq27xxx_battery_update(struct bq27xxx_device_info *di)
{
	struct bq27xxx_reg_cache cache = {0, };
	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)
		cache.flags = -1; /* read error */
	if (cache.flags >= 0) {
		cache.temperature = bq27xxx_battery_read_temperature(di);
		if (has_ci_flag && (cache.flags & BQ27000_FLAG_CI)) {
			dev_info_once(di->dev, "battery is not calibrated! ignoring capacity values\n");
			cache.capacity = -ENODATA;
			cache.energy = -ENODATA;
			cache.time_to_empty = -ENODATA;
			cache.time_to_empty_avg = -ENODATA;
			cache.time_to_full = -ENODATA;
			cache.charge_full = -ENODATA;
			cache.health = -ENODATA;
		} else {
			if (di->regs[BQ27XXX_REG_TTE] != INVALID_REG_ADDR)
				cache.time_to_empty = bq27xxx_battery_read_time(di, BQ27XXX_REG_TTE);
			if (di->regs[BQ27XXX_REG_TTECP] != INVALID_REG_ADDR)
				cache.time_to_empty_avg = bq27xxx_battery_read_time(di, BQ27XXX_REG_TTECP);
			if (di->regs[BQ27XXX_REG_TTF] != INVALID_REG_ADDR)
				cache.time_to_full = bq27xxx_battery_read_time(di, BQ27XXX_REG_TTF);
			cache.charge_full = bq27xxx_battery_read_fcc(di);
			cache.capacity = bq27xxx_battery_read_soc(di);
			if (di->regs[BQ27XXX_REG_AE] != INVALID_REG_ADDR)
				cache.energy = bq27xxx_battery_read_energy(di);
			cache.health = bq27xxx_battery_read_health(di);
		}
		if (di->regs[BQ27XXX_REG_CYCT] != INVALID_REG_ADDR)
			cache.cycle_count = bq27xxx_battery_read_cyct(di);
		if (di->regs[BQ27XXX_REG_AP] != INVALID_REG_ADDR)
			cache.power_avg = bq27xxx_battery_read_pwr_avg(di);

		/* We only have to read charge design full once */
		if (di->charge_design_full <= 0)
			di->charge_design_full = bq27xxx_battery_read_dcap(di);
	}

	if (di->cache.capacity != cache.capacity)
		power_supply_changed(di->bat);

	if (memcmp(&di->cache, &cache, sizeof(cache)) != 0)
		di->cache = cache;

	di->last_update = jiffies;
}
EXPORT_SYMBOL_GPL(bq27xxx_battery_update);

static void bq27xxx_battery_poll(struct work_struct *work)
{
	struct bq27xxx_device_info *di =
			container_of(work, struct bq27xxx_device_info,
				     work.work);

	bq27xxx_battery_update(di);

	if (poll_interval > 0)
		schedule_delayed_work(&di->work, poll_interval * HZ);
}

/*
 * Return the battery average current in µA
 * Note that current can be negative signed as well
 * Or 0 if something fails.
 */
static int bq27xxx_battery_current(struct bq27xxx_device_info *di,
				   union power_supply_propval *val)
{
	int curr;
	int flags;

	curr = bq27xxx_read(di, BQ27XXX_REG_AI, false);
	if (curr < 0) {
		dev_err(di->dev, "error reading current\n");
		return curr;
	}

	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");
			curr = -curr;
		}

		val->intval = curr * BQ27XXX_CURRENT_CONSTANT / BQ27XXX_RS;
	} else {
		/* Other gauges return signed value */
		val->intval = (int)((s16)curr) * 1000;
	}

	return 0;
}

static int bq27xxx_battery_status(struct bq27xxx_device_info *di,
				  union power_supply_propval *val)
{
	int status;

	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)
			status = POWER_SUPPLY_STATUS_CHARGING;
		else if (power_supply_am_i_supplied(di->bat))
			status = POWER_SUPPLY_STATUS_NOT_CHARGING;
		else
			status = POWER_SUPPLY_STATUS_DISCHARGING;
	} else {
		if (di->cache.flags & BQ27XXX_FLAG_FC)
			status = POWER_SUPPLY_STATUS_FULL;
		else if (di->cache.flags & BQ27XXX_FLAG_DSC)
			status = POWER_SUPPLY_STATUS_DISCHARGING;
		else
			status = POWER_SUPPLY_STATUS_CHARGING;
	}

	val->intval = status;

	return 0;
}

static int bq27xxx_battery_capacity_level(struct bq27xxx_device_info *di,
					  union power_supply_propval *val)
{
	int level;

	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)
			level = POWER_SUPPLY_CAPACITY_LEVEL_LOW;
		else if (di->cache.flags & BQ27000_FLAG_EDVF)
			level = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
		else
			level = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
	} else {
		if (di->cache.flags & BQ27XXX_FLAG_FC)
			level = POWER_SUPPLY_CAPACITY_LEVEL_FULL;
		else if (di->cache.flags & BQ27XXX_FLAG_SOC1)
			level = POWER_SUPPLY_CAPACITY_LEVEL_LOW;
		else if (di->cache.flags & BQ27XXX_FLAG_SOCF)
			level = POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL;
		else
			level = POWER_SUPPLY_CAPACITY_LEVEL_NORMAL;
	}

	val->intval = level;

	return 0;
}

/*
 * Return the battery Voltage in millivolts
 * Or < 0 if something fails.
 */
static int bq27xxx_battery_voltage(struct bq27xxx_device_info *di,
				   union power_supply_propval *val)
{
	int volt;

	volt = bq27xxx_read(di, BQ27XXX_REG_VOLT, false);
	if (volt < 0) {
		dev_err(di->dev, "error reading voltage\n");
		return volt;
	}

	val->intval = volt * 1000;

	return 0;
}

static int bq27xxx_simple_value(int value,
				union power_supply_propval *val)
{
	if (value < 0)
		return value;

	val->intval = value;

	return 0;
}

static int bq27xxx_battery_get_property(struct power_supply *psy,
					enum power_supply_property psp,
					union power_supply_propval *val)
{
	int ret = 0;
	struct bq27xxx_device_info *di = power_supply_get_drvdata(psy);

	mutex_lock(&di->lock);
	if (time_is_before_jiffies(di->last_update + 5 * HZ)) {
		cancel_delayed_work_sync(&di->work);
		bq27xxx_battery_poll(&di->work.work);
	}
	mutex_unlock(&di->lock);

	if (psp != POWER_SUPPLY_PROP_PRESENT && di->cache.flags < 0)
		return -ENODEV;

	switch (psp) {
	case POWER_SUPPLY_PROP_STATUS:
		ret = bq27xxx_battery_status(di, val);
		break;
	case POWER_SUPPLY_PROP_VOLTAGE_NOW:
		ret = bq27xxx_battery_voltage(di, val);
		break;
	case POWER_SUPPLY_PROP_PRESENT:
		val->intval = di->cache.flags < 0 ? 0 : 1;
		break;
	case POWER_SUPPLY_PROP_CURRENT_NOW:
		ret = bq27xxx_battery_current(di, val);
		break;
	case POWER_SUPPLY_PROP_CAPACITY:
		ret = bq27xxx_simple_value(di->cache.capacity, val);
		break;
	case POWER_SUPPLY_PROP_CAPACITY_LEVEL:
		ret = bq27xxx_battery_capacity_level(di, val);
		break;
	case POWER_SUPPLY_PROP_TEMP:
		ret = bq27xxx_simple_value(di->cache.temperature, val);
		if (ret == 0)
			val->intval -= 2731; /* convert decidegree k to c */
		break;
	case POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW:
		ret = bq27xxx_simple_value(di->cache.time_to_empty, val);
		break;
	case POWER_SUPPLY_PROP_TIME_TO_EMPTY_AVG:
		ret = bq27xxx_simple_value(di->cache.time_to_empty_avg, val);
		break;
	case POWER_SUPPLY_PROP_TIME_TO_FULL_NOW:
		ret = bq27xxx_simple_value(di->cache.time_to_full, val);
		break;
	case POWER_SUPPLY_PROP_TECHNOLOGY:
		val->intval = POWER_SUPPLY_TECHNOLOGY_LION;
		break;
	case POWER_SUPPLY_PROP_CHARGE_NOW:
		ret = bq27xxx_simple_value(bq27xxx_battery_read_nac(di), val);
		break;
	case POWER_SUPPLY_PROP_CHARGE_FULL:
		ret = bq27xxx_simple_value(di->cache.charge_full, val);
		break;
	case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
		ret = bq27xxx_simple_value(di->charge_design_full, val);
		break;
	/*
	 * TODO: Implement these to make registers set from
	 * power_supply_battery_info visible in sysfs.
	 */
	case POWER_SUPPLY_PROP_ENERGY_FULL_DESIGN:
	case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
		return -EINVAL;
	case POWER_SUPPLY_PROP_CYCLE_COUNT:
		ret = bq27xxx_simple_value(di->cache.cycle_count, val);
		break;
	case POWER_SUPPLY_PROP_ENERGY_NOW:
		ret = bq27xxx_simple_value(di->cache.energy, val);
		break;
	case POWER_SUPPLY_PROP_POWER_AVG:
		ret = bq27xxx_simple_value(di->cache.power_avg, val);
		break;
	case POWER_SUPPLY_PROP_HEALTH:
		ret = bq27xxx_simple_value(di->cache.health, val);
		break;
	case POWER_SUPPLY_PROP_MANUFACTURER:
		val->strval = BQ27XXX_MANUFACTURER;
		break;
	default:
		return -EINVAL;
	}

	return ret;
}

static void bq27xxx_external_power_changed(struct power_supply *psy)
{
	struct bq27xxx_device_info *di = power_supply_get_drvdata(psy);

	cancel_delayed_work_sync(&di->work);
	schedule_delayed_work(&di->work, 0);
}

int bq27xxx_battery_setup(struct bq27xxx_device_info *di)
{
	struct power_supply_desc *psy_desc;
	struct power_supply_config psy_cfg = {
		.of_node = di->dev->of_node,
		.drv_data = di,
	};

	INIT_DELAYED_WORK(&di->work, bq27xxx_battery_poll);
	mutex_init(&di->lock);

	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)
		return -ENOMEM;

	psy_desc->name = di->name;
	psy_desc->type = POWER_SUPPLY_TYPE_BATTERY;
	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;

	di->bat = power_supply_register_no_ws(di->dev, psy_desc, &psy_cfg);
	if (IS_ERR(di->bat)) {
		dev_err(di->dev, "failed to register battery\n");
		return PTR_ERR(di->bat);
	}

	bq27xxx_battery_settings(di);
	bq27xxx_battery_update(di);

	mutex_lock(&bq27xxx_list_lock);
	list_add(&di->list, &bq27xxx_battery_devices);
	mutex_unlock(&bq27xxx_list_lock);

	return 0;
}
EXPORT_SYMBOL_GPL(bq27xxx_battery_setup);

void bq27xxx_battery_teardown(struct bq27xxx_device_info *di)
{
	/*
	 * power_supply_unregister call bq27xxx_battery_get_property which
	 * call bq27xxx_battery_poll.
	 * Make sure that bq27xxx_battery_poll will not call
	 * schedule_delayed_work again after unregister (which cause OOPS).
	 */
	poll_interval = 0;

	cancel_delayed_work_sync(&di->work);

	power_supply_unregister(di->bat);

	mutex_lock(&bq27xxx_list_lock);
	list_del(&di->list);
	mutex_unlock(&bq27xxx_list_lock);

	mutex_destroy(&di->lock);
}
EXPORT_SYMBOL_GPL(bq27xxx_battery_teardown);

MODULE_AUTHOR("Rodolfo Giometti <giometti@linux.it>");
MODULE_DESCRIPTION("BQ27xxx battery monitor driver");
MODULE_LICENSE("GPL");

[-- Attachment #3: Type: text/plain, Size: 2645 bytes --]

@str@
type t;
identifier i,i1,i2;
expression e1,e2;
@@

t i[] = {
  ...,
  [e1] = BQ27XXX_DATA(i1,...),
  ...,
  [e2] = BQ27XXX_DATA(i2,...),
  ...,
};

@script:ocaml tocheck@
i1 << str.i1;
i2 << str.i2;
i1regs; i2regs;
i1dmregs; i2dmregs;
i1props; i2props;
@@

if not(i1 = i2)
then
  begin
    i1regs := make_ident (i1 ^ "_regs");
    i2regs := make_ident (i2 ^ "_regs");
    i1dmregs := make_ident (i1 ^ "_dm_regs");
    i2dmregs := make_ident (i2 ^ "_dm_regs");
    i1props := make_ident (i1 ^ "_props");
    i2props := make_ident (i2 ^ "_props")
  end

(* ---------------------------------------------------------------- *)

@getregs1@
typedef u8;
identifier tocheck.i1regs;
initializer list i1regs_vals;
@@

u8 i1regs[...] = { i1regs_vals, };

@getregs2@
identifier tocheck.i2regs;
initializer list i2regs_vals;
@@

u8 i2regs[...] = { i2regs_vals, };

@script:ocaml@
(_,i1regs_vals) << getregs1.i1regs_vals;
(_,i2regs_vals) << getregs2.i2regs_vals;
i1regs << tocheck.i1regs;
i2regs << tocheck.i2regs;
@@

if i1regs < i2regs &&
   List.sort compare i1regs_vals = List.sort compare i2regs_vals
then Printf.printf "%s and %s have the same registers\n" i1regs i2regs

(* ---------------------------------------------------------------- *)

@getdmregs1@
identifier tocheck.i1dmregs;
initializer list i1dmregs_vals;
@@

struct bq27xxx_dm_reg i1dmregs[] = { i1dmregs_vals, };

@getdmregs2@
identifier tocheck.i2dmregs;
initializer list i2dmregs_vals;
@@

struct bq27xxx_dm_reg i2dmregs[] = { i2dmregs_vals, };

@script:ocaml@
(_,i1dmregs_vals) << getdmregs1.i1dmregs_vals;
(_,i2dmregs_vals) << getdmregs2.i2dmregs_vals;
i1dmregs << tocheck.i1dmregs;
i2dmregs << tocheck.i2dmregs;
@@

if i1dmregs < i2dmregs &&
   List.sort compare i1dmregs_vals = List.sort compare i2dmregs_vals
then Printf.printf "%s and %s have the same registers\n" i1dmregs i2dmregs

(* ---------------------------------------------------------------- *)

@getprops1@
identifier tocheck.i1props;
initializer list[n1] i1props_vals;
@@

enum power_supply_property i1props[] = { i1props_vals, };

@getprops2@
identifier tocheck.i2props;
initializer list[n2] i2props_vals;
@@

enum power_supply_property i2props[] = { i2props_vals, };

@script:ocaml@
(_,i1props_vals) << getprops1.i1props_vals;
(_,i2props_vals) << getprops2.i2props_vals;
i1props << tocheck.i1props;
i2props << tocheck.i2props;
@@

if i1props < i2props &&
   List.sort compare i1props_vals = List.sort compare i2props_vals
then Printf.printf "%s and %s have the same properties\n" i1props i2props


^ permalink raw reply	[flat|nested] 63+ messages in thread

* [Cocci] [PATCH v3 0/5] bq27xxx_battery data memory update
@ 2017-09-27 10:02                                         ` Julia Lawall
  0 siblings, 0 replies; 63+ messages in thread
From: Julia Lawall @ 2017-09-27 10:02 UTC (permalink / raw)
  To: cocci

The github version of Coccinelle finally supports the semantic patch for
your code.  I have attached the semantic patch.  I wonder what should be
done with this?  Do you want to use it locally with make coccicheck?  Do
you want it to be integrated into the kernel?  Everything in the semantic
patch depends on the occurrence of BQ27XXX_DATA, so if make coccicheck is
used on files that don't contain this word, they should be ignored very
efficiently.  So perhaps it is ok for scripts/coccinelle even if it is
relevant to only one file.

julia
-------------- next part --------------
A non-text attachment was scrubbed...
Name: battery.c
Type: text/x-csrc
Size: 57648 bytes
Desc: 
URL: <https://systeme.lip6.fr/pipermail/cocci/attachments/20170927/c5f18b40/attachment-0001.bin>
-------------- next part --------------
@str@
type t;
identifier i,i1,i2;
expression e1,e2;
@@

t i[] = {
  ...,
  [e1] = BQ27XXX_DATA(i1,...),
  ...,
  [e2] = BQ27XXX_DATA(i2,...),
  ...,
};

@script:ocaml tocheck@
i1 << str.i1;
i2 << str.i2;
i1regs; i2regs;
i1dmregs; i2dmregs;
i1props; i2props;
@@

if not(i1 = i2)
then
  begin
    i1regs := make_ident (i1 ^ "_regs");
    i2regs := make_ident (i2 ^ "_regs");
    i1dmregs := make_ident (i1 ^ "_dm_regs");
    i2dmregs := make_ident (i2 ^ "_dm_regs");
    i1props := make_ident (i1 ^ "_props");
    i2props := make_ident (i2 ^ "_props")
  end

(* ---------------------------------------------------------------- *)

@getregs1@
typedef u8;
identifier tocheck.i1regs;
initializer list i1regs_vals;
@@

u8 i1regs[...] = { i1regs_vals, };

@getregs2@
identifier tocheck.i2regs;
initializer list i2regs_vals;
@@

u8 i2regs[...] = { i2regs_vals, };

@script:ocaml@
(_,i1regs_vals) << getregs1.i1regs_vals;
(_,i2regs_vals) << getregs2.i2regs_vals;
i1regs << tocheck.i1regs;
i2regs << tocheck.i2regs;
@@

if i1regs < i2regs &&
   List.sort compare i1regs_vals = List.sort compare i2regs_vals
then Printf.printf "%s and %s have the same registers\n" i1regs i2regs

(* ---------------------------------------------------------------- *)

@getdmregs1@
identifier tocheck.i1dmregs;
initializer list i1dmregs_vals;
@@

struct bq27xxx_dm_reg i1dmregs[] = { i1dmregs_vals, };

@getdmregs2@
identifier tocheck.i2dmregs;
initializer list i2dmregs_vals;
@@

struct bq27xxx_dm_reg i2dmregs[] = { i2dmregs_vals, };

@script:ocaml@
(_,i1dmregs_vals) << getdmregs1.i1dmregs_vals;
(_,i2dmregs_vals) << getdmregs2.i2dmregs_vals;
i1dmregs << tocheck.i1dmregs;
i2dmregs << tocheck.i2dmregs;
@@

if i1dmregs < i2dmregs &&
   List.sort compare i1dmregs_vals = List.sort compare i2dmregs_vals
then Printf.printf "%s and %s have the same registers\n" i1dmregs i2dmregs

(* ---------------------------------------------------------------- *)

@getprops1@
identifier tocheck.i1props;
initializer list[n1] i1props_vals;
@@

enum power_supply_property i1props[] = { i1props_vals, };

@getprops2@
identifier tocheck.i2props;
initializer list[n2] i2props_vals;
@@

enum power_supply_property i2props[] = { i2props_vals, };

@script:ocaml@
(_,i1props_vals) << getprops1.i1props_vals;
(_,i2props_vals) << getprops2.i2props_vals;
i1props << tocheck.i1props;
i2props << tocheck.i2props;
@@

if i1props < i2props &&
   List.sort compare i1props_vals = List.sort compare i2props_vals
then Printf.printf "%s and %s have the same properties\n" i1props i2props

^ permalink raw reply	[flat|nested] 63+ messages in thread

* Re: [PATCH v3 0/5] bq27xxx_battery data memory update
  2017-09-27 10:02                                         ` [Cocci] " Julia Lawall
@ 2017-09-27 12:02                                           ` Liam Breck
  -1 siblings, 0 replies; 63+ messages in thread
From: Liam Breck @ 2017-09-27 12:02 UTC (permalink / raw)
  To: Julia Lawall
  Cc: Sebastian Reichel, Gilles Muller, Nicolas Palix, Michal Marek,
	cocci, Andrew F. Davis, Pali Rohár, Linux PM mailing list

Hi Julia, thanks so much for your help!

On Wed, Sep 27, 2017 at 3:02 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
> The github version of Coccinelle finally supports the semantic patch for
> your code.  I have attached the semantic patch.  I wonder what should be
> done with this?  Do you want to use it locally with make coccicheck?  Do
> you want it to be integrated into the kernel?  Everything in the semantic

Yes, our intent is to push it upstream. Can you submit a patch?

Did you test with 4.13? That should show a handful of dupes...

> patch depends on the occurrence of BQ27XXX_DATA, so if make coccicheck is
> used on files that don't contain this word, they should be ignored very
> efficiently.  So perhaps it is ok for scripts/coccinelle even if it is
> relevant to only one file.
>
> julia

^ permalink raw reply	[flat|nested] 63+ messages in thread

* [Cocci] [PATCH v3 0/5] bq27xxx_battery data memory update
@ 2017-09-27 12:02                                           ` Liam Breck
  0 siblings, 0 replies; 63+ messages in thread
From: Liam Breck @ 2017-09-27 12:02 UTC (permalink / raw)
  To: cocci

Hi Julia, thanks so much for your help!

On Wed, Sep 27, 2017 at 3:02 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
> The github version of Coccinelle finally supports the semantic patch for
> your code.  I have attached the semantic patch.  I wonder what should be
> done with this?  Do you want to use it locally with make coccicheck?  Do
> you want it to be integrated into the kernel?  Everything in the semantic

Yes, our intent is to push it upstream. Can you submit a patch?

Did you test with 4.13? That should show a handful of dupes...

> patch depends on the occurrence of BQ27XXX_DATA, so if make coccicheck is
> used on files that don't contain this word, they should be ignored very
> efficiently.  So perhaps it is ok for scripts/coccinelle even if it is
> relevant to only one file.
>
> julia

^ permalink raw reply	[flat|nested] 63+ messages in thread

* Re: [PATCH v3 0/5] bq27xxx_battery data memory update
  2017-09-27 12:02                                           ` [Cocci] " Liam Breck
@ 2017-09-27 12:16                                             ` Julia Lawall
  -1 siblings, 0 replies; 63+ messages in thread
From: Julia Lawall @ 2017-09-27 12:16 UTC (permalink / raw)
  To: Liam Breck
  Cc: Sebastian Reichel, Gilles Muller, Nicolas Palix, Michal Marek,
	cocci, Andrew F. Davis, Pali Rohár, Linux PM mailing list



On Wed, 27 Sep 2017, Liam Breck wrote:

> Hi Julia, thanks so much for your help!
>
> On Wed, Sep 27, 2017 at 3:02 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
> > The github version of Coccinelle finally supports the semantic patch for
> > your code.  I have attached the semantic patch.  I wonder what should be
> > done with this?  Do you want to use it locally with make coccicheck?  Do
> > you want it to be integrated into the kernel?  Everything in the semantic
>
> Yes, our intent is to push it upstream. Can you submit a patch?
>
> Did you test with 4.13? That should show a handful of dupes...

Are you sure?  I did a git checkout v4.13 and there aren't any occurrences
of BQ27XXX_DATA.

julia

^ permalink raw reply	[flat|nested] 63+ messages in thread

* [Cocci] [PATCH v3 0/5] bq27xxx_battery data memory update
@ 2017-09-27 12:16                                             ` Julia Lawall
  0 siblings, 0 replies; 63+ messages in thread
From: Julia Lawall @ 2017-09-27 12:16 UTC (permalink / raw)
  To: cocci



On Wed, 27 Sep 2017, Liam Breck wrote:

> Hi Julia, thanks so much for your help!
>
> On Wed, Sep 27, 2017 at 3:02 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
> > The github version of Coccinelle finally supports the semantic patch for
> > your code.  I have attached the semantic patch.  I wonder what should be
> > done with this?  Do you want to use it locally with make coccicheck?  Do
> > you want it to be integrated into the kernel?  Everything in the semantic
>
> Yes, our intent is to push it upstream. Can you submit a patch?
>
> Did you test with 4.13? That should show a handful of dupes...

Are you sure?  I did a git checkout v4.13 and there aren't any occurrences
of BQ27XXX_DATA.

julia

^ permalink raw reply	[flat|nested] 63+ messages in thread

* Re: [PATCH v3 0/5] bq27xxx_battery data memory update
  2017-09-27 12:16                                             ` [Cocci] " Julia Lawall
@ 2017-09-27 12:46                                               ` Liam Breck
  -1 siblings, 0 replies; 63+ messages in thread
From: Liam Breck @ 2017-09-27 12:46 UTC (permalink / raw)
  To: Julia Lawall
  Cc: Sebastian Reichel, Gilles Muller, Nicolas Palix, Michal Marek,
	cocci, Andrew F. Davis, Pali Rohár, Linux PM mailing list

On Wed, Sep 27, 2017 at 5:16 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
>
>
> On Wed, 27 Sep 2017, Liam Breck wrote:
>
>> Hi Julia, thanks so much for your help!
>>
>> On Wed, Sep 27, 2017 at 3:02 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
>> > The github version of Coccinelle finally supports the semantic patch for
>> > your code.  I have attached the semantic patch.  I wonder what should be
>> > done with this?  Do you want to use it locally with make coccicheck?  Do
>> > you want it to be integrated into the kernel?  Everything in the semantic
>>
>> Yes, our intent is to push it upstream. Can you submit a patch?
>>
>> Did you test with 4.13? That should show a handful of dupes...
>
> Are you sure?  I did a git checkout v4.13 and there aren't any occurrences
> of BQ27XXX_DATA.

Sorry, that macro landed in 4.14. If you revert this commit, you
should see dupes:
power: supply: bq27xxx: Remove duplicate chip data arrays

^ permalink raw reply	[flat|nested] 63+ messages in thread

* [Cocci] [PATCH v3 0/5] bq27xxx_battery data memory update
@ 2017-09-27 12:46                                               ` Liam Breck
  0 siblings, 0 replies; 63+ messages in thread
From: Liam Breck @ 2017-09-27 12:46 UTC (permalink / raw)
  To: cocci

On Wed, Sep 27, 2017 at 5:16 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
>
>
> On Wed, 27 Sep 2017, Liam Breck wrote:
>
>> Hi Julia, thanks so much for your help!
>>
>> On Wed, Sep 27, 2017 at 3:02 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
>> > The github version of Coccinelle finally supports the semantic patch for
>> > your code.  I have attached the semantic patch.  I wonder what should be
>> > done with this?  Do you want to use it locally with make coccicheck?  Do
>> > you want it to be integrated into the kernel?  Everything in the semantic
>>
>> Yes, our intent is to push it upstream. Can you submit a patch?
>>
>> Did you test with 4.13? That should show a handful of dupes...
>
> Are you sure?  I did a git checkout v4.13 and there aren't any occurrences
> of BQ27XXX_DATA.

Sorry, that macro landed in 4.14. If you revert this commit, you
should see dupes:
power: supply: bq27xxx: Remove duplicate chip data arrays

^ permalink raw reply	[flat|nested] 63+ messages in thread

* Re: [PATCH v3 0/5] bq27xxx_battery data memory update
  2017-09-27 10:02                                         ` [Cocci] " Julia Lawall
@ 2017-09-27 13:12                                           ` Liam Breck
  -1 siblings, 0 replies; 63+ messages in thread
From: Liam Breck @ 2017-09-27 13:12 UTC (permalink / raw)
  To: Julia Lawall
  Cc: Sebastian Reichel, Gilles Muller, Nicolas Palix, Michal Marek,
	cocci, Andrew F. Davis, Pali Rohár, Linux PM mailing list

On Wed, Sep 27, 2017 at 3:02 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
> The github version of Coccinelle finally supports the semantic patch for

Should we add something to the script that aborts if the correct
Coccinelle version is not running?

> your code.  I have attached the semantic patch.  I wonder what should be
> done with this?  Do you want to use it locally with make coccicheck?  Do
> you want it to be integrated into the kernel?  Everything in the semantic
> patch depends on the occurrence of BQ27XXX_DATA, so if make coccicheck is
> used on files that don't contain this word, they should be ignored very
> efficiently.  So perhaps it is ok for scripts/coccinelle even if it is
> relevant to only one file.
>
> julia

^ permalink raw reply	[flat|nested] 63+ messages in thread

* [Cocci] [PATCH v3 0/5] bq27xxx_battery data memory update
@ 2017-09-27 13:12                                           ` Liam Breck
  0 siblings, 0 replies; 63+ messages in thread
From: Liam Breck @ 2017-09-27 13:12 UTC (permalink / raw)
  To: cocci

On Wed, Sep 27, 2017 at 3:02 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
> The github version of Coccinelle finally supports the semantic patch for

Should we add something to the script that aborts if the correct
Coccinelle version is not running?

> your code.  I have attached the semantic patch.  I wonder what should be
> done with this?  Do you want to use it locally with make coccicheck?  Do
> you want it to be integrated into the kernel?  Everything in the semantic
> patch depends on the occurrence of BQ27XXX_DATA, so if make coccicheck is
> used on files that don't contain this word, they should be ignored very
> efficiently.  So perhaps it is ok for scripts/coccinelle even if it is
> relevant to only one file.
>
> julia

^ permalink raw reply	[flat|nested] 63+ messages in thread

* Re: [PATCH v3 0/5] bq27xxx_battery data memory update
  2017-09-27 13:12                                           ` [Cocci] " Liam Breck
@ 2017-09-27 13:25                                             ` Julia Lawall
  -1 siblings, 0 replies; 63+ messages in thread
From: Julia Lawall @ 2017-09-27 13:25 UTC (permalink / raw)
  To: Liam Breck
  Cc: Sebastian Reichel, Gilles Muller, Nicolas Palix, Michal Marek,
	cocci, Andrew F. Davis, Pali Rohár, Linux PM mailing list



On Wed, 27 Sep 2017, Liam Breck wrote:

> On Wed, Sep 27, 2017 at 3:02 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
> > The github version of Coccinelle finally supports the semantic patch for
>
> Should we add something to the script that aborts if the correct
> Coccinelle version is not running?

Yes, I think that functionality is provided.  Otherwise, it will just not
do anything because it is not able to parse the C code.

julia

>
> > your code.  I have attached the semantic patch.  I wonder what should be
> > done with this?  Do you want to use it locally with make coccicheck?  Do
> > you want it to be integrated into the kernel?  Everything in the semantic
> > patch depends on the occurrence of BQ27XXX_DATA, so if make coccicheck is
> > used on files that don't contain this word, they should be ignored very
> > efficiently.  So perhaps it is ok for scripts/coccinelle even if it is
> > relevant to only one file.
> >
> > julia
>

^ permalink raw reply	[flat|nested] 63+ messages in thread

* [Cocci] [PATCH v3 0/5] bq27xxx_battery data memory update
@ 2017-09-27 13:25                                             ` Julia Lawall
  0 siblings, 0 replies; 63+ messages in thread
From: Julia Lawall @ 2017-09-27 13:25 UTC (permalink / raw)
  To: cocci



On Wed, 27 Sep 2017, Liam Breck wrote:

> On Wed, Sep 27, 2017 at 3:02 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
> > The github version of Coccinelle finally supports the semantic patch for
>
> Should we add something to the script that aborts if the correct
> Coccinelle version is not running?

Yes, I think that functionality is provided.  Otherwise, it will just not
do anything because it is not able to parse the C code.

julia

>
> > your code.  I have attached the semantic patch.  I wonder what should be
> > done with this?  Do you want to use it locally with make coccicheck?  Do
> > you want it to be integrated into the kernel?  Everything in the semantic
> > patch depends on the occurrence of BQ27XXX_DATA, so if make coccicheck is
> > used on files that don't contain this word, they should be ignored very
> > efficiently.  So perhaps it is ok for scripts/coccinelle even if it is
> > relevant to only one file.
> >
> > julia
>

^ permalink raw reply	[flat|nested] 63+ messages in thread

* Re: [PATCH v3 0/5] bq27xxx_battery data memory update
  2017-09-27 13:12                                           ` [Cocci] " Liam Breck
@ 2017-09-27 13:25                                             ` Julia Lawall
  -1 siblings, 0 replies; 63+ messages in thread
From: Julia Lawall @ 2017-09-27 13:25 UTC (permalink / raw)
  To: Liam Breck
  Cc: Julia Lawall, Sebastian Reichel, Gilles Muller, Nicolas Palix,
	Michal Marek, cocci, Andrew F. Davis, Pali Rohár,
	Linux PM mailing list



On Wed, 27 Sep 2017, Liam Breck wrote:

> On Wed, Sep 27, 2017 at 3:02 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
> > The github version of Coccinelle finally supports the semantic patch for
>
> Should we add something to the script that aborts if the correct
> Coccinelle version is not running?

I will prepare a version for integration in the kernel.

julia

>
> > your code.  I have attached the semantic patch.  I wonder what should be
> > done with this?  Do you want to use it locally with make coccicheck?  Do
> > you want it to be integrated into the kernel?  Everything in the semantic
> > patch depends on the occurrence of BQ27XXX_DATA, so if make coccicheck is
> > used on files that don't contain this word, they should be ignored very
> > efficiently.  So perhaps it is ok for scripts/coccinelle even if it is
> > relevant to only one file.
> >
> > julia
>

^ permalink raw reply	[flat|nested] 63+ messages in thread

* [Cocci] [PATCH v3 0/5] bq27xxx_battery data memory update
@ 2017-09-27 13:25                                             ` Julia Lawall
  0 siblings, 0 replies; 63+ messages in thread
From: Julia Lawall @ 2017-09-27 13:25 UTC (permalink / raw)
  To: cocci



On Wed, 27 Sep 2017, Liam Breck wrote:

> On Wed, Sep 27, 2017 at 3:02 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
> > The github version of Coccinelle finally supports the semantic patch for
>
> Should we add something to the script that aborts if the correct
> Coccinelle version is not running?

I will prepare a version for integration in the kernel.

julia

>
> > your code.  I have attached the semantic patch.  I wonder what should be
> > done with this?  Do you want to use it locally with make coccicheck?  Do
> > you want it to be integrated into the kernel?  Everything in the semantic
> > patch depends on the occurrence of BQ27XXX_DATA, so if make coccicheck is
> > used on files that don't contain this word, they should be ignored very
> > efficiently.  So perhaps it is ok for scripts/coccinelle even if it is
> > relevant to only one file.
> >
> > julia
>

^ permalink raw reply	[flat|nested] 63+ messages in thread

* Re: [PATCH v3 0/5] bq27xxx_battery data memory update
  2017-09-27 12:46                                               ` [Cocci] " Liam Breck
@ 2017-10-01 11:59                                                 ` Julia Lawall
  -1 siblings, 0 replies; 63+ messages in thread
From: Julia Lawall @ 2017-10-01 11:59 UTC (permalink / raw)
  To: Liam Breck
  Cc: Sebastian Reichel, Gilles Muller, Nicolas Palix, Michal Marek,
	cocci, Andrew F. Davis, Pali Rohár, Linux PM mailing list



On Wed, 27 Sep 2017, Liam Breck wrote:

> On Wed, Sep 27, 2017 at 5:16 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
> >
> >
> > On Wed, 27 Sep 2017, Liam Breck wrote:
> >
> >> Hi Julia, thanks so much for your help!
> >>
> >> On Wed, Sep 27, 2017 at 3:02 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
> >> > The github version of Coccinelle finally supports the semantic patch for
> >> > your code.  I have attached the semantic patch.  I wonder what should be
> >> > done with this?  Do you want to use it locally with make coccicheck?  Do
> >> > you want it to be integrated into the kernel?  Everything in the semantic
> >>
> >> Yes, our intent is to push it upstream. Can you submit a patch?
> >>
> >> Did you test with 4.13? That should show a handful of dupes...
> >
> > Are you sure?  I did a git checkout v4.13 and there aren't any occurrences
> > of BQ27XXX_DATA.
>
> Sorry, that macro landed in 4.14. If you revert this commit, you
> should see dupes:
> power: supply: bq27xxx: Remove duplicate chip data arrays

Thanks for the pointer to this commit.  I get the results described in the
commit log:

bq27500_regs and bq27510g1_regs have the same registers
bq27500_regs and bq27510g2_regs have the same registers
bq27510g1_regs and bq27510g2_regs have the same registers
bq27510g3_regs and bq2751x_regs have the same registers
bq2750x_props and bq27510g3_props have the same properties
bq2750x_props and bq2751x_props have the same properties
bq27510g3_props and bq2751x_props have the same properties
bq27500_props and bq27510g1_props have the same properties
bq27500_props and bq27510g2_props have the same properties
bq27500_props and bq27520g2_props have the same properties
bq27510g1_props and bq27510g2_props have the same properties
bq27510g1_props and bq27520g2_props have the same properties
bq27510g2_props and bq27520g2_props have the same properties

julia

^ permalink raw reply	[flat|nested] 63+ messages in thread

* [Cocci] [PATCH v3 0/5] bq27xxx_battery data memory update
@ 2017-10-01 11:59                                                 ` Julia Lawall
  0 siblings, 0 replies; 63+ messages in thread
From: Julia Lawall @ 2017-10-01 11:59 UTC (permalink / raw)
  To: cocci



On Wed, 27 Sep 2017, Liam Breck wrote:

> On Wed, Sep 27, 2017 at 5:16 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
> >
> >
> > On Wed, 27 Sep 2017, Liam Breck wrote:
> >
> >> Hi Julia, thanks so much for your help!
> >>
> >> On Wed, Sep 27, 2017 at 3:02 AM, Julia Lawall <julia.lawall@lip6.fr> wrote:
> >> > The github version of Coccinelle finally supports the semantic patch for
> >> > your code.  I have attached the semantic patch.  I wonder what should be
> >> > done with this?  Do you want to use it locally with make coccicheck?  Do
> >> > you want it to be integrated into the kernel?  Everything in the semantic
> >>
> >> Yes, our intent is to push it upstream. Can you submit a patch?
> >>
> >> Did you test with 4.13? That should show a handful of dupes...
> >
> > Are you sure?  I did a git checkout v4.13 and there aren't any occurrences
> > of BQ27XXX_DATA.
>
> Sorry, that macro landed in 4.14. If you revert this commit, you
> should see dupes:
> power: supply: bq27xxx: Remove duplicate chip data arrays

Thanks for the pointer to this commit.  I get the results described in the
commit log:

bq27500_regs and bq27510g1_regs have the same registers
bq27500_regs and bq27510g2_regs have the same registers
bq27510g1_regs and bq27510g2_regs have the same registers
bq27510g3_regs and bq2751x_regs have the same registers
bq2750x_props and bq27510g3_props have the same properties
bq2750x_props and bq2751x_props have the same properties
bq27510g3_props and bq2751x_props have the same properties
bq27500_props and bq27510g1_props have the same properties
bq27500_props and bq27510g2_props have the same properties
bq27500_props and bq27520g2_props have the same properties
bq27510g1_props and bq27510g2_props have the same properties
bq27510g1_props and bq27520g2_props have the same properties
bq27510g2_props and bq27520g2_props have the same properties

julia

^ permalink raw reply	[flat|nested] 63+ messages in thread

end of thread, other threads:[~2017-10-01 11:59 UTC | newest]

Thread overview: 63+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-08-24  3:36 [PATCH v3 0/5] bq27xxx_battery data memory update Liam Breck
2017-08-24  3:36 ` [PATCH v3 1/5] power: supply: bq27xxx: Create single chip data table Liam Breck
2017-08-24  3:36 ` [PATCH v3 2/5] power: supply: bq27xxx: Add chip IDs for previously shadowed chips Liam Breck
2017-08-24  3:36 ` [PATCH v3 3/5] power: supply: bq27xxx: Enable data memory update for certain chips Liam Breck
2017-08-24  3:36 ` [PATCH v3 4/5] power: supply: bq27xxx: Flag identical chip data when in debug mode Liam Breck
2017-08-24  3:36 ` [PATCH v3 5/5] power: supply: bq27xxx: Remove duplicate chip data arrays Liam Breck
2017-08-29 10:54 ` [PATCH v3 0/5] bq27xxx_battery data memory update Sebastian Reichel
2017-08-29 15:31   ` Andrew F. Davis
2017-08-29 21:22     ` Sebastian Reichel
2017-08-29 23:07       ` Liam Breck
2017-08-30  0:29         ` Sebastian Reichel
2017-08-30  0:29           ` [Cocci] " Sebastian Reichel
2017-08-30  1:14           ` Liam Breck
2017-08-30  1:14             ` [Cocci] " Liam Breck
2017-08-30  6:01             ` Julia Lawall
2017-08-30  6:01               ` [Cocci] " Julia Lawall
2017-08-31  9:54             ` Julia Lawall
2017-08-31  9:54               ` [Cocci] " Julia Lawall
2017-08-31 11:01               ` Liam Breck
2017-08-31 11:01                 ` [Cocci] " Liam Breck
2017-08-31 11:33                 ` Julia Lawall
2017-08-31 11:33                   ` [Cocci] " Julia Lawall
2017-08-31 11:43                   ` Liam Breck
2017-08-31 11:43                     ` [Cocci] " Liam Breck
2017-09-05 19:15                     ` Liam Breck
2017-09-05 19:15                       ` [Cocci] " Liam Breck
2017-09-05 20:14                       ` Julia Lawall
2017-09-05 20:14                         ` [Cocci] " Julia Lawall
2017-09-18  0:45                         ` Liam Breck
2017-09-18  0:45                           ` [Cocci] " Liam Breck
2017-09-18  5:33                           ` Julia Lawall
2017-09-18  5:33                             ` [Cocci] " Julia Lawall
2017-09-19 21:47                             ` Liam Breck
2017-09-19 21:47                               ` [Cocci] " Liam Breck
2017-09-19 22:00                               ` Julia Lawall
2017-09-19 22:00                                 ` [Cocci] " Julia Lawall
2017-09-19 22:36                                 ` Liam Breck
2017-09-19 22:36                                   ` [Cocci] " Liam Breck
2017-09-20  9:14                                   ` Julia Lawall
2017-09-20  9:14                                     ` [Cocci] " Julia Lawall
2017-09-20  9:41                                     ` Liam Breck
2017-09-20  9:41                                       ` [Cocci] " Liam Breck
2017-09-20  9:45                                       ` Julia Lawall
2017-09-20  9:45                                         ` [Cocci] " Julia Lawall
2017-09-20  9:57                                         ` Liam Breck
2017-09-20  9:57                                           ` [Cocci] " Liam Breck
2017-09-27 10:02                                       ` Julia Lawall
2017-09-27 10:02                                         ` [Cocci] " Julia Lawall
2017-09-27 12:02                                         ` Liam Breck
2017-09-27 12:02                                           ` [Cocci] " Liam Breck
2017-09-27 12:16                                           ` Julia Lawall
2017-09-27 12:16                                             ` [Cocci] " Julia Lawall
2017-09-27 12:46                                             ` Liam Breck
2017-09-27 12:46                                               ` [Cocci] " Liam Breck
2017-10-01 11:59                                               ` Julia Lawall
2017-10-01 11:59                                                 ` [Cocci] " Julia Lawall
2017-09-27 13:12                                         ` Liam Breck
2017-09-27 13:12                                           ` [Cocci] " Liam Breck
2017-09-27 13:25                                           ` Julia Lawall
2017-09-27 13:25                                             ` [Cocci] " Julia Lawall
2017-09-27 13:25                                           ` Julia Lawall
2017-09-27 13:25                                             ` [Cocci] " Julia Lawall
2017-08-29 22:29     ` Liam Breck

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.