* [PATCH v5 0/8] Devicetree battery support and client bq27xxx_battery
@ 2017-02-04 9:15 Liam Breck
2017-02-04 9:15 ` [PATCH v5 1/8] devicetree: power: Add battery.txt Liam Breck
` (7 more replies)
0 siblings, 8 replies; 20+ messages in thread
From: Liam Breck @ 2017-02-04 9:15 UTC (permalink / raw)
To: Sebastian Reichel; +Cc: Andrew F. Davis, Matt Ranostay, linux-pm
Overview:
* new devicetree battery node specifies static battery data
* fuel gauge and charger nodes shall use monitored-battery=<&battery_node>
* new power_supply_get_battery_info() reads battery data from devicetree
* new struct power_supply_battery_info provides battery data to drivers
* drivers surface battery data in sysfs via related power_supply_prop_* fields
* bq27xxx driver calls the above and writes battery data to NVRAM
Changes in v5:
* incorporate feedback into Documentation/devicetree/.../battery.txt
* use power_supply_prop_* names in devicetree and power_supply_battery_info
* add battery:voltage-max-design-microvolt
* default fields to -EINVAL in power_supply_battery_info
* power_supply_get_battery_info() always looks for "monitored-battery"
* power_supply_get_battery_info() emits a warning if !psy->of_node
* squash patches for power_supply_battery_info
* bq27xxx_battery: check power_supply_battery_info values
* bq27xxx_battery: note missing power_supply_prop_* features
* bq27xxx_battery: new patch for access methods
Changes in v4:
* add "fixed-battery" compatible field to be be more consistant with devicetree
Changes in v3:
* split i2c changes into respective patches
* add documentation for battery information for fuel gauge
* rebased documentation patches on change on the list
* abstracted the battery configuration for the state machine
to an generic struct and platform data access function
Changes in v2:
* add documentation for uWh and uAh property units
* change devicetree entries to match new property units
Matt Ranostay (8):
devicetree: power: Add battery.txt
devicetree: property-units: Add uWh and uAh units
devicetree: power: bq27xxx: Add monitored-battery documentation
power: power_supply: Add power_supply_battery_info and API
power: bq27xxx_battery: Add power_supply_battery_info support
power: bq27xxx_battery_i2c: Add I2C bulk read/write functions
power: bq27xxx_battery: Define access methods to write chip registers
power: bq27xxx_battery: Add BQ27425 chip id
.../devicetree/bindings/power/supply/battery.txt | 39 +++
.../devicetree/bindings/power/supply/bq27xxx.txt | 9 +
.../devicetree/bindings/property-units.txt | 2 +
drivers/power/supply/bq27xxx_battery.c | 326 ++++++++++++++++++++-
drivers/power/supply/bq27xxx_battery_i2c.c | 64 +++-
drivers/power/supply/power_supply_core.c | 43 +++
include/linux/power/bq27xxx_battery.h | 7 +-
include/linux/power_supply.h | 19 ++
8 files changed, 505 insertions(+), 4 deletions(-)
create mode 100644 Documentation/devicetree/bindings/power/supply/battery.txt
--
2.9.3
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH v5 1/8] devicetree: power: Add battery.txt
2017-02-04 9:15 [PATCH v5 0/8] Devicetree battery support and client bq27xxx_battery Liam Breck
@ 2017-02-04 9:15 ` Liam Breck
[not found] ` <20170204091603.32242-2-liam-RYWXG+zxWwBdeoIcmNTgJF6hYfS7NtTn@public.gmane.org>
2017-02-04 9:15 ` Liam Breck
` (6 subsequent siblings)
7 siblings, 1 reply; 20+ messages in thread
From: Liam Breck @ 2017-02-04 9:15 UTC (permalink / raw)
To: Sebastian Reichel
Cc: Andrew F. Davis, Matt Ranostay, linux-pm, Rob Herring,
devicetree, Liam Breck
From: Matt Ranostay <matt@ranostay.consulting>
From: Matt Ranostay <matt@ranostay.consulting>
Documentation of static battery characteristics that can be defined
for batteries which cannot self-identify. This information is required
by fuel-gauge and charger chips for proper handling of the battery.
Cc: Rob Herring <robh@kernel.org>
Cc: devicetree@vger.kernel.org
Signed-off-by: Matt Ranostay <matt@ranostay.consulting>
Signed-off-by: Liam Breck <kernel@networkimprov.net>
---
.../devicetree/bindings/power/supply/battery.txt | 39 ++++++++++++++++++++++
1 file changed, 39 insertions(+)
create mode 100644 Documentation/devicetree/bindings/power/supply/battery.txt
diff --git a/Documentation/devicetree/bindings/power/supply/battery.txt b/Documentation/devicetree/bindings/power/supply/battery.txt
new file mode 100644
index 0000000..d663c48
--- /dev/null
+++ b/Documentation/devicetree/bindings/power/supply/battery.txt
@@ -0,0 +1,39 @@
+Battery Characteristics
+
+Required Properties:
+ - compatible: Must be "fixed-battery"
+
+Optional Properties:
+ - voltage-min-design-microvolt: drained battery voltage
+ - voltage-max-design-microvolt: charged battery voltage
+ - energy-full-design-microwatt-hours: battery design energy
+ - charge-full-design-microamp-hours: battery design capacity
+
+Future Properties must be named for the corresponding elements in
+enum power_supply_property, defined in include/linux/power_supply.h.
+
+Batteries must be referenced by chargers and/or fuel-gauges
+using a phandle. The phandle's property should be named
+"monitored-battery".
+
+Example:
+
+ bat: battery {
+ compatible = "fixed-battery";
+ voltage-min-design-microvolt = <3200000>;
+ voltage-max-design-microvolt = <4200000>;
+ energy-full-design-microwatt-hours = <5290000>;
+ charge-full-design-microamp-hours = <1430000>;
+ };
+
+ charger: charger@0 {
+ ....
+ monitored-battery = <&bat>;
+ ...
+ };
+
+ fuel_gauge: fuel_gauge@0 {
+ ....
+ monitored-battery = <&bat>;
+ ...
+ };
--
2.9.3
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v5 2/8] devicetree: property-units: Add uWh and uAh units
[not found] ` <20170204091603.32242-1-liam-RYWXG+zxWwBdeoIcmNTgJF6hYfS7NtTn@public.gmane.org>
@ 2017-02-04 9:15 ` Liam Breck
0 siblings, 0 replies; 20+ messages in thread
From: Liam Breck @ 2017-02-04 9:15 UTC (permalink / raw)
To: Sebastian Reichel
Cc: Andrew F. Davis, Matt Ranostay, linux-pm, Rob Herring,
Mark Rutland, devicetree, linux-kernel, Liam Breck
From: Matt Ranostay <matt@ranostay.consulting>
From: Matt Ranostay <matt@ranostay.consulting>
Add entries for microwatt-hours and microamp-hours.
Cc: Rob Herring <robh@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: devicetree@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Matt Ranostay <matt@ranostay.consulting>
Signed-off-by: Liam Breck <kernel@networkimprov.net>
Acked-by: Sebastian Reichel <sre@kernel.org>
Acked-by: Rob Herring <robh@kernel.org>
---
Documentation/devicetree/bindings/property-units.txt | 2 ++
1 file changed, 2 insertions(+)
diff --git a/Documentation/devicetree/bindings/property-units.txt b/Documentation/devicetree/bindings/property-units.txt
index 12278d7..0849618 100644
--- a/Documentation/devicetree/bindings/property-units.txt
+++ b/Documentation/devicetree/bindings/property-units.txt
@@ -25,8 +25,10 @@ Distance
Electricity
----------------------------------------
-microamp : micro amps
+-microamp-hours : micro amp-hours
-ohms : Ohms
-micro-ohms : micro Ohms
+-microwatt-hours: micro Watt-hours
-microvolt : micro volts
Temperature
--
2.9.3
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v5 2/8] devicetree: property-units: Add uWh and uAh units
@ 2017-02-04 9:15 ` Liam Breck
0 siblings, 0 replies; 20+ messages in thread
From: Liam Breck @ 2017-02-04 9:15 UTC (permalink / raw)
To: Sebastian Reichel
Cc: Andrew F. Davis, Matt Ranostay, linux-pm-u79uwXL29TY76Z2rM5mHXA,
Rob Herring, Mark Rutland, devicetree-u79uwXL29TY76Z2rM5mHXA,
linux-kernel-u79uwXL29TY76Z2rM5mHXA, Liam Breck
From: Matt Ranostay <matt-sk+viVC6FLCDq+mSdOJa79kegs52MxvZ@public.gmane.org>
From: Matt Ranostay <matt-sk+viVC6FLCDq+mSdOJa79kegs52MxvZ@public.gmane.org>
Add entries for microwatt-hours and microamp-hours.
Cc: Rob Herring <robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
Cc: Mark Rutland <mark.rutland-5wv7dgnIgG8@public.gmane.org>
Cc: devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Cc: linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Signed-off-by: Matt Ranostay <matt-sk+viVC6FLCDq+mSdOJa79kegs52MxvZ@public.gmane.org>
Signed-off-by: Liam Breck <kernel-RYWXG+zxWwBdeoIcmNTgJF6hYfS7NtTn@public.gmane.org>
Acked-by: Sebastian Reichel <sre-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
Acked-by: Rob Herring <robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
---
Documentation/devicetree/bindings/property-units.txt | 2 ++
1 file changed, 2 insertions(+)
diff --git a/Documentation/devicetree/bindings/property-units.txt b/Documentation/devicetree/bindings/property-units.txt
index 12278d7..0849618 100644
--- a/Documentation/devicetree/bindings/property-units.txt
+++ b/Documentation/devicetree/bindings/property-units.txt
@@ -25,8 +25,10 @@ Distance
Electricity
----------------------------------------
-microamp : micro amps
+-microamp-hours : micro amp-hours
-ohms : Ohms
-micro-ohms : micro Ohms
+-microwatt-hours: micro Watt-hours
-microvolt : micro volts
Temperature
--
2.9.3
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v5 3/8] devicetree: power: bq27xxx: Add monitored-battery documentation
[not found] ` <20170204091603.32242-1-liam-RYWXG+zxWwBdeoIcmNTgJF6hYfS7NtTn@public.gmane.org>
@ 2017-02-04 9:15 ` Liam Breck
[not found] ` <20170204091603.32242-4-liam-RYWXG+zxWwBdeoIcmNTgJF6hYfS7NtTn@public.gmane.org>
0 siblings, 1 reply; 20+ messages in thread
From: Liam Breck @ 2017-02-04 9:15 UTC (permalink / raw)
To: Sebastian Reichel
Cc: Andrew F. Davis, Matt Ranostay, linux-pm-u79uwXL29TY76Z2rM5mHXA,
Rob Herring, devicetree-u79uwXL29TY76Z2rM5mHXA, Liam Breck
From: Matt Ranostay <matt-sk+viVC6FLCDq+mSdOJa79kegs52MxvZ@public.gmane.org>
From: Matt Ranostay <matt-sk+viVC6FLCDq+mSdOJa79kegs52MxvZ@public.gmane.org>
Document monitored-battery = <&battery_node>
Cc: Rob Herring <robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
Cc: devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Signed-off-by: Matt Ranostay <matt-sk+viVC6FLCDq+mSdOJa79kegs52MxvZ@public.gmane.org>
Signed-off-by: Liam Breck <kernel-RYWXG+zxWwBdeoIcmNTgJF6hYfS7NtTn@public.gmane.org>
---
Documentation/devicetree/bindings/power/supply/bq27xxx.txt | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/Documentation/devicetree/bindings/power/supply/bq27xxx.txt b/Documentation/devicetree/bindings/power/supply/bq27xxx.txt
index b0c95ef..f799181 100644
--- a/Documentation/devicetree/bindings/power/supply/bq27xxx.txt
+++ b/Documentation/devicetree/bindings/power/supply/bq27xxx.txt
@@ -28,9 +28,18 @@ Required properties:
* "ti,bq27621" - BQ27621
- reg: integer, i2c address of the device.
+Optional properties:
+- monitored-battery: phandle of battery information devicetree node
+
+ See Documentation/devicetree/bindings/power/supply/battery.txt
+ If either of the referenced battery's *-full-design-*-hours properties are set,
+ then both must be.
+
Example:
bq27510g3 {
compatible = "ti,bq27510g3";
reg = <0x55>;
+
+ monitored-battery = <&bat>;
};
--
2.9.3
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v5 4/8] power: power_supply: Add power_supply_battery_info and API
2017-02-04 9:15 [PATCH v5 0/8] Devicetree battery support and client bq27xxx_battery Liam Breck
` (2 preceding siblings ...)
[not found] ` <20170204091603.32242-1-liam-RYWXG+zxWwBdeoIcmNTgJF6hYfS7NtTn@public.gmane.org>
@ 2017-02-04 9:15 ` Liam Breck
2017-02-04 9:16 ` [PATCH v5 5/8] power: bq27xxx_battery: Add power_supply_battery_info support Liam Breck
` (3 subsequent siblings)
7 siblings, 0 replies; 20+ messages in thread
From: Liam Breck @ 2017-02-04 9:15 UTC (permalink / raw)
To: Sebastian Reichel; +Cc: Andrew F. Davis, Matt Ranostay, linux-pm, Liam Breck
From: Matt Ranostay <matt@ranostay.consulting>
From: Matt Ranostay <matt@ranostay.consulting>
power_supply_get_battery_info() reads battery data from devicetree.
struct power_supply_battery_info provides battery data to drivers.
Drivers may surface battery data in sysfs via corresponding
POWER_SUPPLY_PROP_* fields.
Signed-off-by: Matt Ranostay <matt@ranostay.consulting>
Signed-off-by: Liam Breck <kernel@networkimprov.net>
---
drivers/power/supply/power_supply_core.c | 43 ++++++++++++++++++++++++++++++++
include/linux/power_supply.h | 19 ++++++++++++++
2 files changed, 62 insertions(+)
diff --git a/drivers/power/supply/power_supply_core.c b/drivers/power/supply/power_supply_core.c
index a74d8ca..2d564a5 100644
--- a/drivers/power/supply/power_supply_core.c
+++ b/drivers/power/supply/power_supply_core.c
@@ -17,6 +17,7 @@
#include <linux/device.h>
#include <linux/notifier.h>
#include <linux/err.h>
+#include <linux/of.h>
#include <linux/power_supply.h>
#include <linux/thermal.h>
#include "power_supply.h"
@@ -487,6 +488,48 @@ struct power_supply *devm_power_supply_get_by_phandle(struct device *dev,
EXPORT_SYMBOL_GPL(devm_power_supply_get_by_phandle);
#endif /* CONFIG_OF */
+int power_supply_get_battery_info(struct power_supply *psy,
+ struct power_supply_battery_info *info)
+{
+ struct device_node *battery_np;
+ const char *value;
+ int err;
+
+ info->energy_full_design_uwh = -EINVAL;
+ info->charge_full_design_uah = -EINVAL;
+ info->voltage_min_design_uv = -EINVAL;
+ info->voltage_max_design_uv = -EINVAL;
+
+ if (!psy->of_node) {
+ dev_warn(&psy->dev, "%s currently only supports devicetree\n",
+ __func__);
+ return -ENXIO;
+ }
+
+ battery_np = of_parse_phandle(psy->of_node, "monitored-battery", 0);
+ if (!battery_np)
+ return -ENODEV;
+
+ err = of_property_read_string(battery_np, "compatible", &value);
+ if (err)
+ return err;
+
+ if (strcmp("fixed-battery", value))
+ return -ENODEV;
+
+ of_property_read_u32(battery_np, "energy-full-design-microwatt-hours",
+ &info->energy_full_design_uwh);
+ of_property_read_u32(battery_np, "charge-full-design-microamp-hours",
+ &info->charge_full_design_uah);
+ of_property_read_u32(battery_np, "voltage-min-design-microvolt",
+ &info->voltage_min_design_uv);
+ of_property_read_u32(battery_np, "voltage-max-design-microvolt",
+ &info->voltage_max_design_uv);
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(power_supply_get_battery_info);
+
int power_supply_get_property(struct power_supply *psy,
enum power_supply_property psp,
union power_supply_propval *val)
diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h
index 3965503..3f3fea5 100644
--- a/include/linux/power_supply.h
+++ b/include/linux/power_supply.h
@@ -288,6 +288,22 @@ struct power_supply_info {
int use_for_apm;
};
+/*
+ * This is the recommended struct to manage static battery parameters,
+ * populated by power_supply_get_battery_info(). Most platform drivers should
+ * use these for consistency.
+ * Its field names must correspond to elements in enum power_supply_property.
+ * The default field value is -EINVAL.
+ * Power supply class itself doesn't use this.
+ */
+
+struct power_supply_battery_info {
+ int energy_full_design_uwh; /* microWatt-hours */
+ int charge_full_design_uah; /* microAmp-hours */
+ int voltage_min_design_uv; /* microVolts */
+ int voltage_max_design_uv; /* microVolts */
+};
+
extern struct atomic_notifier_head power_supply_notifier;
extern int power_supply_reg_notifier(struct notifier_block *nb);
extern void power_supply_unreg_notifier(struct notifier_block *nb);
@@ -306,6 +322,9 @@ static inline struct power_supply *
devm_power_supply_get_by_phandle(struct device *dev, const char *property)
{ return NULL; }
#endif /* CONFIG_OF */
+
+extern int power_supply_get_battery_info(struct power_supply *psy,
+ struct power_supply_battery_info *info);
extern void power_supply_changed(struct power_supply *psy);
extern int power_supply_am_i_supplied(struct power_supply *psy);
extern int power_supply_set_battery_charged(struct power_supply *psy);
--
2.9.3
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v5 5/8] power: bq27xxx_battery: Add power_supply_battery_info support
2017-02-04 9:15 [PATCH v5 0/8] Devicetree battery support and client bq27xxx_battery Liam Breck
` (3 preceding siblings ...)
2017-02-04 9:15 ` [PATCH v5 4/8] power: power_supply: Add power_supply_battery_info and API Liam Breck
@ 2017-02-04 9:16 ` Liam Breck
2017-02-04 9:42 ` kbuild test robot
2017-02-06 23:29 ` Andrew F. Davis
2017-02-04 9:16 ` [PATCH v5 6/8] power: bq27xxx_battery_i2c: Add I2C bulk read/write functions Liam Breck
` (2 subsequent siblings)
7 siblings, 2 replies; 20+ messages in thread
From: Liam Breck @ 2017-02-04 9:16 UTC (permalink / raw)
To: Sebastian Reichel; +Cc: Andrew F. Davis, Matt Ranostay, linux-pm, Liam Breck
From: Matt Ranostay <matt@ranostay.consulting>
From: Matt Ranostay <matt@ranostay.consulting>
Previously there was no way to set chip registers in the event that the
defaults didn't match the battery in question.
BQ27xxx driver now calls power_supply_get_battery_info, checks the inputs,
and writes battery data to NVRAM.
Signed-off-by: Matt Ranostay <matt@ranostay.consulting>
Signed-off-by: Liam Breck <kernel@networkimprov.net>
---
drivers/power/supply/bq27xxx_battery.c | 303 ++++++++++++++++++++++++++++++++-
include/linux/power/bq27xxx_battery.h | 1 +
2 files changed, 303 insertions(+), 1 deletion(-)
diff --git a/drivers/power/supply/bq27xxx_battery.c b/drivers/power/supply/bq27xxx_battery.c
index 7272d1e..54ef18a 100644
--- a/drivers/power/supply/bq27xxx_battery.c
+++ b/drivers/power/supply/bq27xxx_battery.c
@@ -37,6 +37,7 @@
* http://www.ti.com/product/bq27621-g1
*/
+#include <linux/delay.h>
#include <linux/device.h>
#include <linux/module.h>
#include <linux/mutex.h>
@@ -432,6 +433,54 @@ static struct {
static DEFINE_MUTEX(bq27xxx_list_lock);
static LIST_HEAD(bq27xxx_battery_devices);
+#define BQ27XXX_MIN_V_MIN 2800
+#define BQ27XXX_MIN_V_MAX 3700
+#define BQ27XXX_MAX_V_MIN 0
+#define BQ27XXX_MAX_V_MAX 5000
+
+#define BQ27XXX_BLOCK_DATA_CLASS 0x3E
+#define BQ27XXX_DATA_BLOCK 0x3F
+#define BQ27XXX_BLOCK_DATA 0x40
+#define BQ27XXX_BLOCK_DATA_CHECKSUM 0x60
+#define BQ27XXX_BLOCK_DATA_CONTROL 0x61
+#define BQ27XXX_SET_CFGUPDATE 0x13
+#define BQ27XXX_SOFT_RESET 0x42
+
+enum bq27xxx_dm_subclass_index {
+ BQ27XXX_DM_DESIGN_CAPACITY = 0,
+ BQ27XXX_DM_DESIGN_ENERGY,
+ BQ27XXX_DM_TERMINATE_VOLTAGE,
+ BQ27XXX_DM_V_AT_CHARGE_TERM,
+ BQ27XXX_DM_END,
+};
+
+struct bq27xxx_dm_regs {
+ unsigned int subclass_id;
+ unsigned int offset;
+ char *name;
+};
+
+#define BQ27XXX_GAS_GAUGING_STATE_SUBCLASS 82
+
+static struct bq27xxx_dm_regs bq27425_dm_subclass_regs[] = {
+ [BQ27XXX_DM_DESIGN_CAPACITY] =
+ { BQ27XXX_GAS_GAUGING_STATE_SUBCLASS, 12, "design-capacity" },
+ [BQ27XXX_DM_DESIGN_ENERGY] =
+ { BQ27XXX_GAS_GAUGING_STATE_SUBCLASS, 14, "design-energy" },
+ [BQ27XXX_DM_TERMINATE_VOLTAGE] =
+ { BQ27XXX_GAS_GAUGING_STATE_SUBCLASS, 18, "terminate-voltage" },
+ [BQ27XXX_DM_V_AT_CHARGE_TERM] =
+ { BQ27XXX_GAS_GAUGING_STATE_SUBCLASS, 36, "v-at-charge-termination" },
+};
+
+static struct bq27xxx_dm_regs *bq27xxx_dm_subclass_regs[] = {
+ [BQ27425] = bq27425_dm_subclass_regs,
+};
+
+static unsigned int bq27xxx_unseal_keys[] = {
+ [BQ27425] = 0x04143672,
+};
+
static int poll_interval_param_set(const char *val, const struct kernel_param *kp)
{
struct bq27xxx_device_info *di;
@@ -476,6 +525,179 @@ static inline int bq27xxx_read(struct bq27xxx_device_info *di, int reg_index,
return di->bus.read(di, di->regs[reg_index], single);
}
+static int bq27xxx_battery_set_seal_state(struct bq27xxx_device_info *di,
+ bool state)
+{
+ unsigned int key = bq27xxx_unseal_keys[di->chip];
+ int ret;
+
+ if (state)
+ return di->bus.write(di, BQ27XXX_REG_CTRL, 0x20, false);
+
+ ret = di->bus.write(di, BQ27XXX_REG_CTRL, (key >> 16) & 0xffff, false);
+ if (ret < 0)
+ return ret;
+
+ return di->bus.write(di, BQ27XXX_REG_CTRL, key & 0xffff, false);
+}
+
+static int bq27xxx_battery_read_dm_block(struct bq27xxx_device_info *di,
+ int subclass)
+{
+ int ret = di->bus.write(di, BQ27XXX_REG_CTRL, 0, false);
+
+ if (ret < 0)
+ return ret;
+
+ ret = di->bus.write(di, BQ27XXX_BLOCK_DATA_CONTROL, 0, true);
+ if (ret < 0)
+ return ret;
+
+ ret = di->bus.write(di, BQ27XXX_BLOCK_DATA_CLASS, subclass, true);
+ if (ret < 0)
+ return ret;
+
+ ret = di->bus.write(di, BQ27XXX_DATA_BLOCK, 0, true);
+ if (ret < 0)
+ return ret;
+
+ usleep_range(1000, 1500);
+
+ return di->bus.read_bulk(di, BQ27XXX_BLOCK_DATA,
+ (u8 *) &di->buffer, sizeof(di->buffer));
+}
+
+static int bq27xxx_battery_print_config(struct bq27xxx_device_info *di)
+{
+ struct bq27xxx_dm_regs *reg = bq27xxx_dm_subclass_regs[di->chip];
+ int ret, i;
+
+ ret = bq27xxx_battery_read_dm_block(di,
+ BQ27XXX_GAS_GAUGING_STATE_SUBCLASS);
+ if (ret < 0)
+ return ret;
+
+ for (i = 0; i < BQ27XXX_DM_END; i++) {
+ int val;
+
+ if (reg->subclass_id != BQ27XXX_GAS_GAUGING_STATE_SUBCLASS)
+ continue;
+
+ val = be16_to_cpup((u16 *) &di->buffer[reg->offset]);
+
+ dev_info(di->dev, "settings for %s set at %d\n", reg->name, val);
+
+ reg++;
+ }
+
+ return 0;
+}
+
+static bool bq27xxx_battery_update_dm_setting(struct bq27xxx_device_info *di,
+ unsigned int reg, unsigned int val)
+{
+ struct bq27xxx_dm_regs *dm_reg = &bq27xxx_dm_subclass_regs[di->chip][reg];
+ u16 *prev = (u16 *) &di->buffer[dm_reg->offset];
+
+ if (be16_to_cpup(prev) == val)
+ return false;
+
+ *prev = cpu_to_be16(val);
+
+ return true;
+}
+
+static u8 bq27xxx_battery_checksum(struct bq27xxx_device_info *di)
+{
+ u8 *data = (u8 *) &di->buffer;
+ u16 sum = 0;
+ int i;
+
+ for (i = 0; i < sizeof(di->buffer); i++) {
+ sum += data[i];
+ sum &= 0xff;
+ }
+
+ return 0xff - sum;
+}
+
+static int bq27xxx_battery_write_nvram(struct bq27xxx_device_info *di,
+ unsigned int subclass)
+{
+ int ret;
+
+ ret = di->bus.write(di, BQ27XXX_REG_CTRL, BQ27XXX_SET_CFGUPDATE, false);
+ if (ret)
+ return ret;
+
+ ret = di->bus.write(di, BQ27XXX_BLOCK_DATA_CONTROL, 0, true);
+ if (ret)
+ return ret;
+
+ ret = di->bus.write(di, BQ27XXX_BLOCK_DATA_CLASS, subclass, true);
+ if (ret)
+ return ret;
+
+ ret = di->bus.write(di, BQ27XXX_DATA_BLOCK, 0, true);
+ if (ret)
+ return ret;
+
+ ret = di->bus.write_bulk(di, BQ27XXX_BLOCK_DATA,
+ (u8 *) &di->buffer, sizeof(di->buffer));
+ if (ret < 0)
+ return ret;
+
+ usleep_range(1000, 1500);
+
+ di->bus.write(di, BQ27XXX_BLOCK_DATA_CHECKSUM,
+ bq27xxx_battery_checksum(di), true);
+
+ usleep_range(1000, 1500);
+
+ di->bus.write(di, BQ27XXX_REG_CTRL, BQ27XXX_SOFT_RESET, false);
+
+ return 0;
+}
+
+static int bq27xxx_battery_set_config(struct bq27xxx_device_info *di,
+ struct power_supply_battery_info *info)
+{
+ int ret;
+
+ ret = bq27xxx_battery_read_dm_block(di,
+ BQ27XXX_GAS_GAUGING_STATE_SUBCLASS);
+ if (ret < 0)
+ return ret;
+
+ if (info->charge_full_design_uah != -EINVAL
+ && info->energy_full_design_uwh != -EINVAL) {
+ ret |= bq27xxx_battery_update_dm_setting(di,
+ BQ27XXX_DM_DESIGN_CAPACITY,
+ info->charge_full_design_uah / 1000);
+ ret |= bq27xxx_battery_update_dm_setting(di,
+ BQ27XXX_DM_DESIGN_ENERGY,
+ info->energy_full_design_uwh / 1000);
+ }
+
+ if (info->voltage_min_design_uv != -EINVAL)
+ ret |= bq27xxx_battery_update_dm_setting(di,
+ BQ27XXX_DM_TERMINATE_VOLTAGE,
+ info->voltage_min_design_uv / 1000);
+
+ if (info->voltage_max_design_uv != -EINVAL)
+ ret |= bq27xxx_battery_update_dm_setting(di,
+ BQ27XXX_DM_V_AT_CHARGE_TERM,
+ info->voltage_max_design_uv / 1000);
+
+ if (ret) {
+ dev_info(di->dev, "updating NVM settings\n");
+ return bq27xxx_battery_write_nvram(di,
+ BQ27XXX_GAS_GAUGING_STATE_SUBCLASS);
+ }
+
+ return 0;
+}
+
/*
* Return the battery State-of-Charge
* Or < 0 if something fails.
@@ -736,6 +958,73 @@ static int bq27xxx_battery_read_health(struct bq27xxx_device_info *di)
return POWER_SUPPLY_HEALTH_GOOD;
}
+void bq27xxx_battery_settings(struct bq27xxx_device_info *di)
+{
+ struct power_supply_battery_info info = {};
+
+ /* functions don't exist for writing data so abort */
+ if (!di->bus.write || !di->bus.write_bulk)
+ return;
+
+ /* no settings to be set for this chipset so abort */
+ if (!bq27xxx_dm_subclass_regs[di->chip])
+ return;
+
+ bq27xxx_battery_set_seal_state(di, false);
+
+ if (power_supply_get_battery_info(di->bat, &info) < 0)
+ goto out;
+
+ 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");
+ }
+
+ if (info.energy_full_design_uwh > 0x7fff * 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;
+ }
+
+ if (info.charge_full_design_uah > 0x7fff * 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;
+ }
+
+ if ((info.voltage_min_design_uv < BQ27XXX_MIN_V_MIN * 1000
+ || info.voltage_min_design_uv > BQ27XXX_MIN_V_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.voltage_max_design_uv < BQ27XXX_MAX_V_MIN * 1000
+ || info.voltage_max_design_uv > BQ27XXX_MAX_V_MAX * 1000)
+ && info.voltage_max_design_uv != -EINVAL) {
+ dev_err(di->dev, "invalid battery:voltage-max-design-microvolt %d\n",
+ info.voltage_max_design_uv);
+ info.voltage_max_design_uv = -EINVAL;
+ }
+
+ if ((info.energy_full_design_uwh == -EINVAL
+ || info.charge_full_design_uah == -EINVAL)
+ && info.voltage_min_design_uv == -EINVAL
+ && info.voltage_max_design_uv == -EINVAL)
+ goto out;
+
+ bq27xxx_battery_set_config(di, &info);
+
+out:
+ bq27xxx_battery_print_config(di);
+ bq27xxx_battery_set_seal_state(di, true);
+}
+
void bq27xxx_battery_update(struct bq27xxx_device_info *di)
{
struct bq27xxx_reg_cache cache = {0, };
@@ -985,6 +1274,14 @@ static int bq27xxx_battery_get_property(struct power_supply *psy,
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:
+ case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
+ return -EINVAL;
case POWER_SUPPLY_PROP_CYCLE_COUNT:
ret = bq27xxx_simple_value(di->cache.cycle_count, val);
break;
@@ -1018,7 +1315,10 @@ static void bq27xxx_external_power_changed(struct power_supply *psy)
int bq27xxx_battery_setup(struct bq27xxx_device_info *di)
{
struct power_supply_desc *psy_desc;
- struct power_supply_config psy_cfg = { .drv_data = di, };
+ 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);
@@ -1043,6 +1343,7 @@ int bq27xxx_battery_setup(struct bq27xxx_device_info *di)
dev_info(di->dev, "support ver. %s enabled\n", DRIVER_VERSION);
+ bq27xxx_battery_settings(di);
bq27xxx_battery_update(di);
mutex_lock(&bq27xxx_list_lock);
diff --git a/include/linux/power/bq27xxx_battery.h b/include/linux/power/bq27xxx_battery.h
index bed9557..c433815 100644
--- a/include/linux/power/bq27xxx_battery.h
+++ b/include/linux/power/bq27xxx_battery.h
@@ -62,6 +62,7 @@ struct bq27xxx_device_info {
struct list_head list;
struct mutex lock;
u8 *regs;
+ u8 buffer[32];
};
void bq27xxx_battery_update(struct bq27xxx_device_info *di);
--
2.9.3
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v5 6/8] power: bq27xxx_battery_i2c: Add I2C bulk read/write functions
2017-02-04 9:15 [PATCH v5 0/8] Devicetree battery support and client bq27xxx_battery Liam Breck
` (4 preceding siblings ...)
2017-02-04 9:16 ` [PATCH v5 5/8] power: bq27xxx_battery: Add power_supply_battery_info support Liam Breck
@ 2017-02-04 9:16 ` Liam Breck
2017-02-04 9:16 ` [PATCH v5 7/8] power: bq27xxx_battery: Define access methods to write chip registers Liam Breck
2017-02-04 9:16 ` [PATCH v5 8/8] power: bq27xxx_battery: Add BQ27425 chip id Liam Breck
7 siblings, 0 replies; 20+ messages in thread
From: Liam Breck @ 2017-02-04 9:16 UTC (permalink / raw)
To: Sebastian Reichel; +Cc: Andrew F. Davis, Matt Ranostay, linux-pm, Liam Breck
From: Matt Ranostay <matt@ranostay.consulting>
From: Matt Ranostay <matt@ranostay.consulting>
write(), read_bulk(), write_bulk() are required by bq27xxx_battery
devicetree code.
Signed-off-by: Matt Ranostay <matt@ranostay.consulting>
Signed-off-by: Liam Breck <kernel@networkimprov.net>
---
drivers/power/supply/bq27xxx_battery_i2c.c | 62 ++++++++++++++++++++++++++++++
1 file changed, 62 insertions(+)
diff --git a/drivers/power/supply/bq27xxx_battery_i2c.c b/drivers/power/supply/bq27xxx_battery_i2c.c
index 5c5c3a6..9bf59a7 100644
--- a/drivers/power/supply/bq27xxx_battery_i2c.c
+++ b/drivers/power/supply/bq27xxx_battery_i2c.c
@@ -68,6 +68,64 @@ static int bq27xxx_battery_i2c_read(struct bq27xxx_device_info *di, u8 reg,
return ret;
}
+static int bq27xxx_battery_i2c_write(struct bq27xxx_device_info *di, u8 reg,
+ int value, bool single)
+{
+ struct i2c_client *client = to_i2c_client(di->dev);
+ struct i2c_msg msg;
+ unsigned char data[4];
+
+ if (!client->adapter)
+ return -ENODEV;
+
+ data[0] = reg;
+ if (single) {
+ data[1] = (unsigned char) value;
+ msg.len = 2;
+ } else {
+ put_unaligned_le16(value, &data[1]);
+ msg.len = 3;
+ }
+
+ msg.buf = data;
+ msg.addr = client->addr;
+ msg.flags = 0;
+
+ return i2c_transfer(client->adapter, &msg, 1) == 1 ? 0 : -EINVAL;
+}
+
+static int bq27xxx_battery_i2c_bulk_read(struct bq27xxx_device_info *di, u8 reg,
+ u8 *data, int len)
+{
+ struct i2c_client *client = to_i2c_client(di->dev);
+
+ if (!client->adapter)
+ return -ENODEV;
+
+ return i2c_smbus_read_i2c_block_data(client, reg, len, data);
+}
+
+static int bq27xxx_battery_i2c_bulk_write(struct bq27xxx_device_info *di,
+ u8 reg, u8 *data, int len)
+{
+ struct i2c_client *client = to_i2c_client(di->dev);
+ struct i2c_msg msg;
+ u8 buf[33];
+
+ if (!client->adapter)
+ return -ENODEV;
+
+ buf[0] = reg;
+ memcpy(&buf[1], data, len);
+
+ msg.buf = buf;
+ msg.addr = client->addr;
+ msg.flags = 0;
+ msg.len = len + 1;
+
+ return i2c_transfer(client->adapter, &msg, 1) == 1 ? 0 : -EINVAL;
+}
+
static int bq27xxx_battery_i2c_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
@@ -95,7 +153,11 @@ static int bq27xxx_battery_i2c_probe(struct i2c_client *client,
di->dev = &client->dev;
di->chip = id->driver_data;
di->name = name;
+
di->bus.read = bq27xxx_battery_i2c_read;
+ di->bus.write = bq27xxx_battery_i2c_write;
+ di->bus.read_bulk = bq27xxx_battery_i2c_bulk_read;
+ di->bus.write_bulk = bq27xxx_battery_i2c_bulk_write;
ret = bq27xxx_battery_setup(di);
if (ret)
--
2.9.3
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v5 7/8] power: bq27xxx_battery: Define access methods to write chip registers
2017-02-04 9:15 [PATCH v5 0/8] Devicetree battery support and client bq27xxx_battery Liam Breck
` (5 preceding siblings ...)
2017-02-04 9:16 ` [PATCH v5 6/8] power: bq27xxx_battery_i2c: Add I2C bulk read/write functions Liam Breck
@ 2017-02-04 9:16 ` Liam Breck
2017-02-04 9:35 ` Liam Breck
2017-02-06 23:32 ` Andrew F. Davis
2017-02-04 9:16 ` [PATCH v5 8/8] power: bq27xxx_battery: Add BQ27425 chip id Liam Breck
7 siblings, 2 replies; 20+ messages in thread
From: Liam Breck @ 2017-02-04 9:16 UTC (permalink / raw)
To: Sebastian Reichel
Cc: Andrew F. Davis, Matt Ranostay, linux-pm, Liam, Liam Breck
From: Liam <github@networkimprov.net>
From: Matt Ranostay <matt@ranostay.consulting>
write(), read_bulk(), write_bulk() support setting chip registers,
e.g. with data obtained from power_supply_battery_info.
Signed-off-by: Matt Ranostay <matt@ranostay.consulting>
Signed-off-by: Liam Breck <kernel@networkimprov.net>
---
include/linux/power/bq27xxx_battery.h | 3 +++
1 file changed, 3 insertions(+)
diff --git a/include/linux/power/bq27xxx_battery.h b/include/linux/power/bq27xxx_battery.h
index c433815..1a78512 100644
--- a/include/linux/power/bq27xxx_battery.h
+++ b/include/linux/power/bq27xxx_battery.h
@@ -32,6 +32,9 @@ struct bq27xxx_platform_data {
struct bq27xxx_device_info;
struct bq27xxx_access_methods {
int (*read)(struct bq27xxx_device_info *di, u8 reg, bool single);
+ int (*write)(struct bq27xxx_device_info *di, u8 reg, int value, bool single);
+ int (*read_bulk)(struct bq27xxx_device_info *di, u8 reg, u8 *data, int len);
+ int (*write_bulk)(struct bq27xxx_device_info *di, u8 reg, u8 *data, int len);
};
struct bq27xxx_reg_cache {
--
2.9.3
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [PATCH v5 8/8] power: bq27xxx_battery: Add BQ27425 chip id
2017-02-04 9:15 [PATCH v5 0/8] Devicetree battery support and client bq27xxx_battery Liam Breck
` (6 preceding siblings ...)
2017-02-04 9:16 ` [PATCH v5 7/8] power: bq27xxx_battery: Define access methods to write chip registers Liam Breck
@ 2017-02-04 9:16 ` Liam Breck
2017-02-04 9:32 ` Liam Breck
7 siblings, 1 reply; 20+ messages in thread
From: Liam Breck @ 2017-02-04 9:16 UTC (permalink / raw)
To: Sebastian Reichel
Cc: Andrew F. Davis, Matt Ranostay, linux-pm, networkimprov, Liam Breck
From: networkimprov <github@networkimprov.net>
From: Matt Ranostay <matt@ranostay.consulting>
This patch does not alter the function of the driver.
This chip ID is referenced in the devicetree code.
Signed-off-by: Matt Ranostay <matt@ranostay.consulting>
Signed-off-by: Liam Breck <kernel@networkimprov.net>
---
drivers/power/supply/bq27xxx_battery.c | 23 ++++++++++++++++++++++-
drivers/power/supply/bq27xxx_battery_i2c.c | 2 +-
include/linux/power/bq27xxx_battery.h | 3 ++-
3 files changed, 25 insertions(+), 3 deletions(-)
diff --git a/drivers/power/supply/bq27xxx_battery.c b/drivers/power/supply/bq27xxx_battery.c
index 54ef18a..5dc09c8 100644
--- a/drivers/power/supply/bq27xxx_battery.c
+++ b/drivers/power/supply/bq27xxx_battery.c
@@ -260,6 +260,25 @@ static u8 bq27xxx_regs[][BQ27XXX_REG_MAX] = {
[BQ27XXX_REG_DCAP] = 0x3c,
[BQ27XXX_REG_AP] = 0x18,
},
+ [BQ27425] = {
+ [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,
+ },
};
static enum power_supply_property bq27000_battery_props[] = {
@@ -428,6 +447,7 @@ static struct {
BQ27XXX_PROP(BQ27541, bq27541_battery_props),
BQ27XXX_PROP(BQ27545, bq27545_battery_props),
BQ27XXX_PROP(BQ27421, bq27421_battery_props),
+ BQ27XXX_PROP(BQ27425, bq27421_battery_props),
};
static DEFINE_MUTEX(bq27xxx_list_lock);
@@ -904,6 +924,7 @@ static bool bq27xxx_battery_overtemp(struct bq27xxx_device_info *di, u16 flags)
return flags & (BQ27XXX_FLAG_OTC | BQ27XXX_FLAG_OTD);
case BQ27530:
case BQ27421:
+ case BQ27425:
return flags & BQ27XXX_FLAG_OT;
default:
return false;
@@ -915,7 +936,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->chip == BQ27530 || di->chip == BQ27421 || di->chip == BQ27425)
return flags & BQ27XXX_FLAG_UT;
return false;
diff --git a/drivers/power/supply/bq27xxx_battery_i2c.c b/drivers/power/supply/bq27xxx_battery_i2c.c
index 9bf59a7..f7e061a 100644
--- a/drivers/power/supply/bq27xxx_battery_i2c.c
+++ b/drivers/power/supply/bq27xxx_battery_i2c.c
@@ -221,7 +221,7 @@ static const struct i2c_device_id bq27xxx_i2c_id_table[] = {
{ "bq27742", BQ27541 },
{ "bq27545", BQ27545 },
{ "bq27421", BQ27421 },
- { "bq27425", BQ27421 },
+ { "bq27425", BQ27425 },
{ "bq27441", BQ27421 },
{ "bq27621", BQ27421 },
{},
diff --git a/include/linux/power/bq27xxx_battery.h b/include/linux/power/bq27xxx_battery.h
index 1a78512..a4c2dfb 100644
--- a/include/linux/power/bq27xxx_battery.h
+++ b/include/linux/power/bq27xxx_battery.h
@@ -9,7 +9,8 @@ enum bq27xxx_chip {
BQ27530, /* bq27530, bq27531 */
BQ27541, /* bq27541, bq27542, bq27546, bq27742 */
BQ27545, /* bq27545 */
- BQ27421, /* bq27421, bq27425, bq27441, bq27621 */
+ BQ27421, /* bq27421, bq27441, bq27621 */
+ BQ27425, /* bq27425 */
};
/**
--
2.9.3
^ permalink raw reply related [flat|nested] 20+ messages in thread
* Re: [PATCH v5 8/8] power: bq27xxx_battery: Add BQ27425 chip id
2017-02-04 9:16 ` [PATCH v5 8/8] power: bq27xxx_battery: Add BQ27425 chip id Liam Breck
@ 2017-02-04 9:32 ` Liam Breck
0 siblings, 0 replies; 20+ messages in thread
From: Liam Breck @ 2017-02-04 9:32 UTC (permalink / raw)
To: Sebastian Reichel; +Cc: Andrew F. Davis, Matt Ranostay, linux-pm
On Sat, Feb 4, 2017 at 1:16 AM, Liam Breck <liam@networkimprov.net> wrote:
> From: networkimprov <github@networkimprov.net>
>
> From: Matt Ranostay <matt@ranostay.consulting>
>
> This patch does not alter the function of the driver.
> This chip ID is referenced in the devicetree code.
>
> Signed-off-by: Matt Ranostay <matt@ranostay.consulting>
> Signed-off-by: Liam Breck <kernel@networkimprov.net>
Pls drop the first From line; Matt's is the correct one.
git-send-email doesn't check for an extant From line :-/
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v5 7/8] power: bq27xxx_battery: Define access methods to write chip registers
2017-02-04 9:16 ` [PATCH v5 7/8] power: bq27xxx_battery: Define access methods to write chip registers Liam Breck
@ 2017-02-04 9:35 ` Liam Breck
2017-02-06 23:32 ` Andrew F. Davis
1 sibling, 0 replies; 20+ messages in thread
From: Liam Breck @ 2017-02-04 9:35 UTC (permalink / raw)
To: Sebastian Reichel; +Cc: Andrew F. Davis, Matt Ranostay, linux-pm
On Sat, Feb 4, 2017 at 1:16 AM, Liam Breck <liam@networkimprov.net> wrote:
> From: Liam <github@networkimprov.net>
>
> From: Matt Ranostay <matt@ranostay.consulting>
>
> write(), read_bulk(), write_bulk() support setting chip registers,
> e.g. with data obtained from power_supply_battery_info.
>
> Signed-off-by: Matt Ranostay <matt@ranostay.consulting>
> Signed-off-by: Liam Breck <kernel@networkimprov.net>
Pls drop the first From line; Matt's is the correct one.
git-send-email doesn't check for an extant From line :-/
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v5 5/8] power: bq27xxx_battery: Add power_supply_battery_info support
2017-02-04 9:16 ` [PATCH v5 5/8] power: bq27xxx_battery: Add power_supply_battery_info support Liam Breck
@ 2017-02-04 9:42 ` kbuild test robot
2017-02-06 23:29 ` Andrew F. Davis
1 sibling, 0 replies; 20+ messages in thread
From: kbuild test robot @ 2017-02-04 9:42 UTC (permalink / raw)
To: Liam Breck
Cc: kbuild-all, Sebastian Reichel, Andrew F. Davis, Matt Ranostay,
linux-pm, Liam Breck
[-- Attachment #1: Type: text/plain, Size: 14180 bytes --]
Hi Matt,
[auto build test ERROR on next-20170203]
[cannot apply to battery/master linus/master linux/master v4.9-rc8 v4.9-rc7 v4.9-rc6 v4.10-rc6]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Liam-Breck/Devicetree-battery-support-and-client-bq27xxx_battery/20170204-172332
config: i386-randconfig-x004-201705 (attached as .config)
compiler: gcc-6 (Debian 6.2.0-3) 6.2.0 20160901
reproduce:
# save the attached .config to linux build tree
make ARCH=i386
Note: the linux-review/Liam-Breck/Devicetree-battery-support-and-client-bq27xxx_battery/20170204-172332 HEAD 26caaa850a9e06e4d96ba05e9bff37ca03531973 builds fine.
It only hurts bisectibility.
All error/warnings (new ones prefixed by >>):
>> drivers/power/supply/bq27xxx_battery.c:802:3: error: 'BQ27425' undeclared here (not in a function)
[BQ27425] = bq27425_dm_subclass_regs,
^~~~~~~
>> drivers/power/supply/bq27xxx_battery.c:802:3: error: array index in initializer not of integer type
drivers/power/supply/bq27xxx_battery.c:802:3: note: (near initialization for 'bq27xxx_dm_subclass_regs')
drivers/power/supply/bq27xxx_battery.c:806:3: error: array index in initializer not of integer type
[BQ27425] = 0x04143672,
^~~~~~~
drivers/power/supply/bq27xxx_battery.c:806:3: note: (near initialization for 'bq27xxx_unseal_keys')
drivers/power/supply/bq27xxx_battery.c: In function 'bq27xxx_battery_set_seal_state':
>> drivers/power/supply/bq27xxx_battery.c:860:17: error: 'struct bq27xxx_access_methods' has no member named 'write'
return di->bus.write(di, BQ27XXX_REG_CTRL, 0x20, false);
^
drivers/power/supply/bq27xxx_battery.c:862:15: error: 'struct bq27xxx_access_methods' has no member named 'write'
ret = di->bus.write(di, BQ27XXX_REG_CTRL, (key >> 16) & 0xffff, false);
^
drivers/power/supply/bq27xxx_battery.c:866:16: error: 'struct bq27xxx_access_methods' has no member named 'write'
return di->bus.write(di, BQ27XXX_REG_CTRL, key & 0xffff, false);
^
drivers/power/supply/bq27xxx_battery.c: In function 'bq27xxx_battery_read_dm_block':
drivers/power/supply/bq27xxx_battery.c:872:19: error: 'struct bq27xxx_access_methods' has no member named 'write'
int ret = di->bus.write(di, BQ27XXX_REG_CTRL, 0, false);
^
drivers/power/supply/bq27xxx_battery.c:877:15: error: 'struct bq27xxx_access_methods' has no member named 'write'
ret = di->bus.write(di, BQ27XXX_BLOCK_DATA_CONTROL, 0, true);
^
drivers/power/supply/bq27xxx_battery.c:881:15: error: 'struct bq27xxx_access_methods' has no member named 'write'
ret = di->bus.write(di, BQ27XXX_BLOCK_DATA_CLASS, subclass, true);
^
drivers/power/supply/bq27xxx_battery.c:885:15: error: 'struct bq27xxx_access_methods' has no member named 'write'
ret = di->bus.write(di, BQ27XXX_DATA_BLOCK, 0, true);
^
>> drivers/power/supply/bq27xxx_battery.c:891:16: error: 'struct bq27xxx_access_methods' has no member named 'read_bulk'
return di->bus.read_bulk(di, BQ27XXX_BLOCK_DATA,
^
drivers/power/supply/bq27xxx_battery.c: In function 'bq27xxx_battery_write_nvram':
drivers/power/supply/bq27xxx_battery.c:954:15: error: 'struct bq27xxx_access_methods' has no member named 'write'
ret = di->bus.write(di, BQ27XXX_REG_CTRL, BQ27XXX_SET_CFGUPDATE, false);
^
drivers/power/supply/bq27xxx_battery.c:958:15: error: 'struct bq27xxx_access_methods' has no member named 'write'
ret = di->bus.write(di, BQ27XXX_BLOCK_DATA_CONTROL, 0, true);
^
drivers/power/supply/bq27xxx_battery.c:962:15: error: 'struct bq27xxx_access_methods' has no member named 'write'
ret = di->bus.write(di, BQ27XXX_BLOCK_DATA_CLASS, subclass, true);
^
drivers/power/supply/bq27xxx_battery.c:966:15: error: 'struct bq27xxx_access_methods' has no member named 'write'
ret = di->bus.write(di, BQ27XXX_DATA_BLOCK, 0, true);
^
>> drivers/power/supply/bq27xxx_battery.c:970:15: error: 'struct bq27xxx_access_methods' has no member named 'write_bulk'
ret = di->bus.write_bulk(di, BQ27XXX_BLOCK_DATA,
^
drivers/power/supply/bq27xxx_battery.c:977:9: error: 'struct bq27xxx_access_methods' has no member named 'write'
di->bus.write(di, BQ27XXX_BLOCK_DATA_CHECKSUM,
^
drivers/power/supply/bq27xxx_battery.c:982:9: error: 'struct bq27xxx_access_methods' has no member named 'write'
di->bus.write(di, BQ27XXX_REG_CTRL, BQ27XXX_SOFT_RESET, false);
^
In file included from include/linux/linkage.h:4:0,
from include/linux/kernel.h:6,
from include/linux/delay.h:21,
from drivers/power/supply/bq27xxx_battery.c:46:
drivers/power/supply/bq27xxx_battery.c: In function 'bq27xxx_battery_settings':
drivers/power/supply/bq27xxx_battery.c:1299:14: error: 'struct bq27xxx_access_methods' has no member named 'write'
if (!di->bus.write || !di->bus.write_bulk)
^
include/linux/compiler.h:160:30: note: in definition of macro '__trace_if'
if (__builtin_constant_p(!!(cond)) ? !!(cond) : \
^~~~
>> drivers/power/supply/bq27xxx_battery.c:1299:2: note: in expansion of macro 'if'
if (!di->bus.write || !di->bus.write_bulk)
^~
drivers/power/supply/bq27xxx_battery.c:1299:32: error: 'struct bq27xxx_access_methods' has no member named 'write_bulk'
if (!di->bus.write || !di->bus.write_bulk)
^
include/linux/compiler.h:160:30: note: in definition of macro '__trace_if'
if (__builtin_constant_p(!!(cond)) ? !!(cond) : \
^~~~
>> drivers/power/supply/bq27xxx_battery.c:1299:2: note: in expansion of macro 'if'
if (!di->bus.write || !di->bus.write_bulk)
^~
drivers/power/supply/bq27xxx_battery.c:1299:14: error: 'struct bq27xxx_access_methods' has no member named 'write'
if (!di->bus.write || !di->bus.write_bulk)
^
include/linux/compiler.h:160:42: note: in definition of macro '__trace_if'
if (__builtin_constant_p(!!(cond)) ? !!(cond) : \
^~~~
>> drivers/power/supply/bq27xxx_battery.c:1299:2: note: in expansion of macro 'if'
if (!di->bus.write || !di->bus.write_bulk)
^~
drivers/power/supply/bq27xxx_battery.c:1299:32: error: 'struct bq27xxx_access_methods' has no member named 'write_bulk'
if (!di->bus.write || !di->bus.write_bulk)
^
include/linux/compiler.h:160:42: note: in definition of macro '__trace_if'
if (__builtin_constant_p(!!(cond)) ? !!(cond) : \
^~~~
>> drivers/power/supply/bq27xxx_battery.c:1299:2: note: in expansion of macro 'if'
if (!di->bus.write || !di->bus.write_bulk)
^~
drivers/power/supply/bq27xxx_battery.c:1299:14: error: 'struct bq27xxx_access_methods' has no member named 'write'
if (!di->bus.write || !di->bus.write_bulk)
^
include/linux/compiler.h:171:16: note: in definition of macro '__trace_if'
______r = !!(cond); \
^~~~
>> drivers/power/supply/bq27xxx_battery.c:1299:2: note: in expansion of macro 'if'
if (!di->bus.write || !di->bus.write_bulk)
^~
drivers/power/supply/bq27xxx_battery.c:1299:32: error: 'struct bq27xxx_access_methods' has no member named 'write_bulk'
if (!di->bus.write || !di->bus.write_bulk)
^
include/linux/compiler.h:171:16: note: in definition of macro '__trace_if'
______r = !!(cond); \
^~~~
>> drivers/power/supply/bq27xxx_battery.c:1299:2: note: in expansion of macro 'if'
if (!di->bus.write || !di->bus.write_bulk)
^~
drivers/power/supply/bq27xxx_battery.c: In function 'bq27xxx_battery_read_dm_block':
>> drivers/power/supply/bq27xxx_battery.c:893:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
drivers/power/supply/bq27xxx_battery.c: In function 'bq27xxx_battery_set_seal_state':
drivers/power/supply/bq27xxx_battery.c:867:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
vim +/BQ27425 +802 drivers/power/supply/bq27xxx_battery.c
796 { BQ27XXX_GAS_GAUGING_STATE_SUBCLASS, 18, "terminate-voltage" },
797 [BQ27XXX_DM_V_AT_CHARGE_TERM] =
798 { BQ27XXX_GAS_GAUGING_STATE_SUBCLASS, 36, "v-at-charge-termination" },
799 };
800
801 static struct bq27xxx_dm_regs *bq27xxx_dm_subclass_regs[] = {
> 802 [BQ27425] = bq27425_dm_subclass_regs,
803 };
804
805 static unsigned int bq27xxx_unseal_keys[] = {
806 [BQ27425] = 0x04143672,
807 };
808
809 static int poll_interval_param_set(const char *val, const struct kernel_param *kp)
810 {
811 struct bq27xxx_device_info *di;
812 unsigned int prev_val = *(unsigned int *) kp->arg;
813 int ret;
814
815 ret = param_set_uint(val, kp);
816 if (ret < 0 || prev_val == *(unsigned int *) kp->arg)
817 return ret;
818
819 mutex_lock(&bq27xxx_list_lock);
820 list_for_each_entry(di, &bq27xxx_battery_devices, list) {
821 cancel_delayed_work_sync(&di->work);
822 schedule_delayed_work(&di->work, 0);
823 }
824 mutex_unlock(&bq27xxx_list_lock);
825
826 return ret;
827 }
828
829 static const struct kernel_param_ops param_ops_poll_interval = {
830 .get = param_get_uint,
831 .set = poll_interval_param_set,
832 };
833
834 static unsigned int poll_interval = 360;
835 module_param_cb(poll_interval, ¶m_ops_poll_interval, &poll_interval, 0644);
836 MODULE_PARM_DESC(poll_interval,
837 "battery poll interval in seconds - 0 disables polling");
838
839 /*
840 * Common code for BQ27xxx devices
841 */
842
843 static inline int bq27xxx_read(struct bq27xxx_device_info *di, int reg_index,
844 bool single)
845 {
846 /* Reports EINVAL for invalid/missing registers */
847 if (!di || di->regs[reg_index] == INVALID_REG_ADDR)
848 return -EINVAL;
849
850 return di->bus.read(di, di->regs[reg_index], single);
851 }
852
853 static int bq27xxx_battery_set_seal_state(struct bq27xxx_device_info *di,
854 bool state)
855 {
856 unsigned int key = bq27xxx_unseal_keys[di->chip];
857 int ret;
858
859 if (state)
> 860 return di->bus.write(di, BQ27XXX_REG_CTRL, 0x20, false);
861
862 ret = di->bus.write(di, BQ27XXX_REG_CTRL, (key >> 16) & 0xffff, false);
863 if (ret < 0)
864 return ret;
865
866 return di->bus.write(di, BQ27XXX_REG_CTRL, key & 0xffff, false);
867 }
868
869 static int bq27xxx_battery_read_dm_block(struct bq27xxx_device_info *di,
870 int subclass)
871 {
872 int ret = di->bus.write(di, BQ27XXX_REG_CTRL, 0, false);
873
874 if (ret < 0)
875 return ret;
876
> 877 ret = di->bus.write(di, BQ27XXX_BLOCK_DATA_CONTROL, 0, true);
878 if (ret < 0)
879 return ret;
880
881 ret = di->bus.write(di, BQ27XXX_BLOCK_DATA_CLASS, subclass, true);
882 if (ret < 0)
883 return ret;
884
885 ret = di->bus.write(di, BQ27XXX_DATA_BLOCK, 0, true);
886 if (ret < 0)
887 return ret;
888
889 usleep_range(1000, 1500);
890
> 891 return di->bus.read_bulk(di, BQ27XXX_BLOCK_DATA,
892 (u8 *) &di->buffer, sizeof(di->buffer));
> 893 }
894
895 static int bq27xxx_battery_print_config(struct bq27xxx_device_info *di)
896 {
897 struct bq27xxx_dm_regs *reg = bq27xxx_dm_subclass_regs[di->chip];
898 int ret, i;
899
900 ret = bq27xxx_battery_read_dm_block(di,
901 BQ27XXX_GAS_GAUGING_STATE_SUBCLASS);
902 if (ret < 0)
903 return ret;
904
905 for (i = 0; i < BQ27XXX_DM_END; i++) {
906 int val;
907
908 if (reg->subclass_id != BQ27XXX_GAS_GAUGING_STATE_SUBCLASS)
909 continue;
910
911 val = be16_to_cpup((u16 *) &di->buffer[reg->offset]);
912
913 dev_info(di->dev, "settings for %s set at %d\n", reg->name, val);
914
915 reg++;
916 }
917
918 return 0;
919 }
920
921 static bool bq27xxx_battery_update_dm_setting(struct bq27xxx_device_info *di,
922 unsigned int reg, unsigned int val)
923 {
924 struct bq27xxx_dm_regs *dm_reg = &bq27xxx_dm_subclass_regs[di->chip][reg];
925 u16 *prev = (u16 *) &di->buffer[dm_reg->offset];
926
927 if (be16_to_cpup(prev) == val)
928 return false;
929
930 *prev = cpu_to_be16(val);
931
932 return true;
933 }
934
935 static u8 bq27xxx_battery_checksum(struct bq27xxx_device_info *di)
936 {
937 u8 *data = (u8 *) &di->buffer;
938 u16 sum = 0;
939 int i;
940
941 for (i = 0; i < sizeof(di->buffer); i++) {
942 sum += data[i];
943 sum &= 0xff;
944 }
945
946 return 0xff - sum;
947 }
948
949 static int bq27xxx_battery_write_nvram(struct bq27xxx_device_info *di,
950 unsigned int subclass)
951 {
952 int ret;
953
954 ret = di->bus.write(di, BQ27XXX_REG_CTRL, BQ27XXX_SET_CFGUPDATE, false);
955 if (ret)
956 return ret;
957
> 958 ret = di->bus.write(di, BQ27XXX_BLOCK_DATA_CONTROL, 0, true);
959 if (ret)
960 return ret;
961
962 ret = di->bus.write(di, BQ27XXX_BLOCK_DATA_CLASS, subclass, true);
963 if (ret)
964 return ret;
965
966 ret = di->bus.write(di, BQ27XXX_DATA_BLOCK, 0, true);
967 if (ret)
968 return ret;
969
> 970 ret = di->bus.write_bulk(di, BQ27XXX_BLOCK_DATA,
971 (u8 *) &di->buffer, sizeof(di->buffer));
972 if (ret < 0)
973 return ret;
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 31240 bytes --]
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v5 1/8] devicetree: power: Add battery.txt
[not found] ` <20170204091603.32242-2-liam-RYWXG+zxWwBdeoIcmNTgJF6hYfS7NtTn@public.gmane.org>
@ 2017-02-04 10:03 ` Matt Ranostay
2017-02-08 21:58 ` Rob Herring
1 sibling, 0 replies; 20+ messages in thread
From: Matt Ranostay @ 2017-02-04 10:03 UTC (permalink / raw)
To: Liam Breck
Cc: Sebastian Reichel, Andrew F. Davis,
linux-pm-u79uwXL29TY76Z2rM5mHXA, Rob Herring,
devicetree-u79uwXL29TY76Z2rM5mHXA, Liam Breck
On Sat, Feb 4, 2017 at 1:15 AM, Liam Breck <liam-RYWXG+zxWwBdeoIcmNTgJF6hYfS7NtTn@public.gmane.org> wrote:
> From: Matt Ranostay <matt-sk+viVC6FLCDq+mSdOJa79kegs52MxvZ@public.gmane.org>
>
> From: Matt Ranostay <matt-sk+viVC6FLCDq+mSdOJa79kegs52MxvZ@public.gmane.org>
How are the double from me happening? :) Seems odds
>
> Documentation of static battery characteristics that can be defined
> for batteries which cannot self-identify. This information is required
> by fuel-gauge and charger chips for proper handling of the battery.
>
> Cc: Rob Herring <robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
> Cc: devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
> Signed-off-by: Matt Ranostay <matt-sk+viVC6FLCDq+mSdOJa79kegs52MxvZ@public.gmane.org>
> Signed-off-by: Liam Breck <kernel-RYWXG+zxWwBdeoIcmNTgJF6hYfS7NtTn@public.gmane.org>
> ---
> .../devicetree/bindings/power/supply/battery.txt | 39 ++++++++++++++++++++++
> 1 file changed, 39 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/power/supply/battery.txt
>
> diff --git a/Documentation/devicetree/bindings/power/supply/battery.txt b/Documentation/devicetree/bindings/power/supply/battery.txt
> new file mode 100644
> index 0000000..d663c48
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/power/supply/battery.txt
> @@ -0,0 +1,39 @@
> +Battery Characteristics
> +
> +Required Properties:
> + - compatible: Must be "fixed-battery"
> +
> +Optional Properties:
> + - voltage-min-design-microvolt: drained battery voltage
> + - voltage-max-design-microvolt: charged battery voltage
> + - energy-full-design-microwatt-hours: battery design energy
> + - charge-full-design-microamp-hours: battery design capacity
> +
> +Future Properties must be named for the corresponding elements in
> +enum power_supply_property, defined in include/linux/power_supply.h.
> +
> +Batteries must be referenced by chargers and/or fuel-gauges
> +using a phandle. The phandle's property should be named
> +"monitored-battery".
> +
> +Example:
> +
> + bat: battery {
> + compatible = "fixed-battery";
> + voltage-min-design-microvolt = <3200000>;
> + voltage-max-design-microvolt = <4200000>;
> + energy-full-design-microwatt-hours = <5290000>;
> + charge-full-design-microamp-hours = <1430000>;
> + };
> +
> + charger: charger@0 {
> + ....
> + monitored-battery = <&bat>;
> + ...
> + };
> +
> + fuel_gauge: fuel_gauge@0 {
> + ....
> + monitored-battery = <&bat>;
> + ...
> + };
> --
> 2.9.3
>
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v5 5/8] power: bq27xxx_battery: Add power_supply_battery_info support
2017-02-04 9:16 ` [PATCH v5 5/8] power: bq27xxx_battery: Add power_supply_battery_info support Liam Breck
2017-02-04 9:42 ` kbuild test robot
@ 2017-02-06 23:29 ` Andrew F. Davis
2017-02-07 0:15 ` Liam Breck
1 sibling, 1 reply; 20+ messages in thread
From: Andrew F. Davis @ 2017-02-06 23:29 UTC (permalink / raw)
To: Liam Breck, Sebastian Reichel; +Cc: Matt Ranostay, linux-pm, Liam Breck
On 02/04/2017 03:16 AM, Liam Breck wrote:
> From: Matt Ranostay <matt@ranostay.consulting>
>
> From: Matt Ranostay <matt@ranostay.consulting>
>
> Previously there was no way to set chip registers in the event that the
> defaults didn't match the battery in question.
>
> BQ27xxx driver now calls power_supply_get_battery_info, checks the inputs,
> and writes battery data to NVRAM.
>
I haven't had much time to review this, but have you seen our old
internal version of this driver?:
http://git.ti.com/bms-linux/bms-kernel/blobs/master/drivers/power/bq27x00_battery.c
I would like that most of the NVRAM checks and sets are kept in userspace:
http://git.ti.com/bms-linux/bqtool/trees/master
In kernel don't really have a good way to know when the battery has been
swapped and the DT info might not be valid for this new battery. I guess
there is really no good way, but I imagine this is why we never
upstreamed the rest of this driver before.
Andrew
> Signed-off-by: Matt Ranostay <matt@ranostay.consulting>
> Signed-off-by: Liam Breck <kernel@networkimprov.net>
> ---
> drivers/power/supply/bq27xxx_battery.c | 303 ++++++++++++++++++++++++++++++++-
> include/linux/power/bq27xxx_battery.h | 1 +
> 2 files changed, 303 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/power/supply/bq27xxx_battery.c b/drivers/power/supply/bq27xxx_battery.c
> index 7272d1e..54ef18a 100644
> --- a/drivers/power/supply/bq27xxx_battery.c
> +++ b/drivers/power/supply/bq27xxx_battery.c
> @@ -37,6 +37,7 @@
> * http://www.ti.com/product/bq27621-g1
> */
>
> +#include <linux/delay.h>
> #include <linux/device.h>
> #include <linux/module.h>
> #include <linux/mutex.h>
> @@ -432,6 +433,54 @@ static struct {
> static DEFINE_MUTEX(bq27xxx_list_lock);
> static LIST_HEAD(bq27xxx_battery_devices);
>
> +#define BQ27XXX_MIN_V_MIN 2800
> +#define BQ27XXX_MIN_V_MAX 3700
> +#define BQ27XXX_MAX_V_MIN 0
> +#define BQ27XXX_MAX_V_MAX 5000
> +
> +#define BQ27XXX_BLOCK_DATA_CLASS 0x3E
> +#define BQ27XXX_DATA_BLOCK 0x3F
> +#define BQ27XXX_BLOCK_DATA 0x40
> +#define BQ27XXX_BLOCK_DATA_CHECKSUM 0x60
> +#define BQ27XXX_BLOCK_DATA_CONTROL 0x61
> +#define BQ27XXX_SET_CFGUPDATE 0x13
> +#define BQ27XXX_SOFT_RESET 0x42
> +
> +enum bq27xxx_dm_subclass_index {
> + BQ27XXX_DM_DESIGN_CAPACITY = 0,
> + BQ27XXX_DM_DESIGN_ENERGY,
> + BQ27XXX_DM_TERMINATE_VOLTAGE,
> + BQ27XXX_DM_V_AT_CHARGE_TERM,
> + BQ27XXX_DM_END,
> +};
> +
> +struct bq27xxx_dm_regs {
> + unsigned int subclass_id;
> + unsigned int offset;
> + char *name;
> +};
> +
> +#define BQ27XXX_GAS_GAUGING_STATE_SUBCLASS 82
> +
> +static struct bq27xxx_dm_regs bq27425_dm_subclass_regs[] = {
> + [BQ27XXX_DM_DESIGN_CAPACITY] =
> + { BQ27XXX_GAS_GAUGING_STATE_SUBCLASS, 12, "design-capacity" },
> + [BQ27XXX_DM_DESIGN_ENERGY] =
> + { BQ27XXX_GAS_GAUGING_STATE_SUBCLASS, 14, "design-energy" },
> + [BQ27XXX_DM_TERMINATE_VOLTAGE] =
> + { BQ27XXX_GAS_GAUGING_STATE_SUBCLASS, 18, "terminate-voltage" },
> + [BQ27XXX_DM_V_AT_CHARGE_TERM] =
> + { BQ27XXX_GAS_GAUGING_STATE_SUBCLASS, 36, "v-at-charge-termination" },
> +};
> +
> +static struct bq27xxx_dm_regs *bq27xxx_dm_subclass_regs[] = {
> + [BQ27425] = bq27425_dm_subclass_regs,
> +};
> +
> +static unsigned int bq27xxx_unseal_keys[] = {
> + [BQ27425] = 0x04143672,
> +};
> +
> static int poll_interval_param_set(const char *val, const struct kernel_param *kp)
> {
> struct bq27xxx_device_info *di;
> @@ -476,6 +525,179 @@ static inline int bq27xxx_read(struct bq27xxx_device_info *di, int reg_index,
> return di->bus.read(di, di->regs[reg_index], single);
> }
>
> +static int bq27xxx_battery_set_seal_state(struct bq27xxx_device_info *di,
> + bool state)
> +{
> + unsigned int key = bq27xxx_unseal_keys[di->chip];
> + int ret;
> +
> + if (state)
> + return di->bus.write(di, BQ27XXX_REG_CTRL, 0x20, false);
> +
> + ret = di->bus.write(di, BQ27XXX_REG_CTRL, (key >> 16) & 0xffff, false);
> + if (ret < 0)
> + return ret;
> +
> + return di->bus.write(di, BQ27XXX_REG_CTRL, key & 0xffff, false);
> +}
> +
> +static int bq27xxx_battery_read_dm_block(struct bq27xxx_device_info *di,
> + int subclass)
> +{
> + int ret = di->bus.write(di, BQ27XXX_REG_CTRL, 0, false);
> +
> + if (ret < 0)
> + return ret;
> +
> + ret = di->bus.write(di, BQ27XXX_BLOCK_DATA_CONTROL, 0, true);
> + if (ret < 0)
> + return ret;
> +
> + ret = di->bus.write(di, BQ27XXX_BLOCK_DATA_CLASS, subclass, true);
> + if (ret < 0)
> + return ret;
> +
> + ret = di->bus.write(di, BQ27XXX_DATA_BLOCK, 0, true);
> + if (ret < 0)
> + return ret;
> +
> + usleep_range(1000, 1500);
> +
> + return di->bus.read_bulk(di, BQ27XXX_BLOCK_DATA,
> + (u8 *) &di->buffer, sizeof(di->buffer));
> +}
> +
> +static int bq27xxx_battery_print_config(struct bq27xxx_device_info *di)
> +{
> + struct bq27xxx_dm_regs *reg = bq27xxx_dm_subclass_regs[di->chip];
> + int ret, i;
> +
> + ret = bq27xxx_battery_read_dm_block(di,
> + BQ27XXX_GAS_GAUGING_STATE_SUBCLASS);
> + if (ret < 0)
> + return ret;
> +
> + for (i = 0; i < BQ27XXX_DM_END; i++) {
> + int val;
> +
> + if (reg->subclass_id != BQ27XXX_GAS_GAUGING_STATE_SUBCLASS)
> + continue;
> +
> + val = be16_to_cpup((u16 *) &di->buffer[reg->offset]);
> +
> + dev_info(di->dev, "settings for %s set at %d\n", reg->name, val);
> +
> + reg++;
> + }
> +
> + return 0;
> +}
> +
> +static bool bq27xxx_battery_update_dm_setting(struct bq27xxx_device_info *di,
> + unsigned int reg, unsigned int val)
> +{
> + struct bq27xxx_dm_regs *dm_reg = &bq27xxx_dm_subclass_regs[di->chip][reg];
> + u16 *prev = (u16 *) &di->buffer[dm_reg->offset];
> +
> + if (be16_to_cpup(prev) == val)
> + return false;
> +
> + *prev = cpu_to_be16(val);
> +
> + return true;
> +}
> +
> +static u8 bq27xxx_battery_checksum(struct bq27xxx_device_info *di)
> +{
> + u8 *data = (u8 *) &di->buffer;
> + u16 sum = 0;
> + int i;
> +
> + for (i = 0; i < sizeof(di->buffer); i++) {
> + sum += data[i];
> + sum &= 0xff;
> + }
> +
> + return 0xff - sum;
> +}
> +
> +static int bq27xxx_battery_write_nvram(struct bq27xxx_device_info *di,
> + unsigned int subclass)
> +{
> + int ret;
> +
> + ret = di->bus.write(di, BQ27XXX_REG_CTRL, BQ27XXX_SET_CFGUPDATE, false);
> + if (ret)
> + return ret;
> +
> + ret = di->bus.write(di, BQ27XXX_BLOCK_DATA_CONTROL, 0, true);
> + if (ret)
> + return ret;
> +
> + ret = di->bus.write(di, BQ27XXX_BLOCK_DATA_CLASS, subclass, true);
> + if (ret)
> + return ret;
> +
> + ret = di->bus.write(di, BQ27XXX_DATA_BLOCK, 0, true);
> + if (ret)
> + return ret;
> +
> + ret = di->bus.write_bulk(di, BQ27XXX_BLOCK_DATA,
> + (u8 *) &di->buffer, sizeof(di->buffer));
> + if (ret < 0)
> + return ret;
> +
> + usleep_range(1000, 1500);
> +
> + di->bus.write(di, BQ27XXX_BLOCK_DATA_CHECKSUM,
> + bq27xxx_battery_checksum(di), true);
> +
> + usleep_range(1000, 1500);
> +
> + di->bus.write(di, BQ27XXX_REG_CTRL, BQ27XXX_SOFT_RESET, false);
> +
> + return 0;
> +}
> +
> +static int bq27xxx_battery_set_config(struct bq27xxx_device_info *di,
> + struct power_supply_battery_info *info)
> +{
> + int ret;
> +
> + ret = bq27xxx_battery_read_dm_block(di,
> + BQ27XXX_GAS_GAUGING_STATE_SUBCLASS);
> + if (ret < 0)
> + return ret;
> +
> + if (info->charge_full_design_uah != -EINVAL
> + && info->energy_full_design_uwh != -EINVAL) {
> + ret |= bq27xxx_battery_update_dm_setting(di,
> + BQ27XXX_DM_DESIGN_CAPACITY,
> + info->charge_full_design_uah / 1000);
> + ret |= bq27xxx_battery_update_dm_setting(di,
> + BQ27XXX_DM_DESIGN_ENERGY,
> + info->energy_full_design_uwh / 1000);
> + }
> +
> + if (info->voltage_min_design_uv != -EINVAL)
> + ret |= bq27xxx_battery_update_dm_setting(di,
> + BQ27XXX_DM_TERMINATE_VOLTAGE,
> + info->voltage_min_design_uv / 1000);
> +
> + if (info->voltage_max_design_uv != -EINVAL)
> + ret |= bq27xxx_battery_update_dm_setting(di,
> + BQ27XXX_DM_V_AT_CHARGE_TERM,
> + info->voltage_max_design_uv / 1000);
> +
> + if (ret) {
> + dev_info(di->dev, "updating NVM settings\n");
> + return bq27xxx_battery_write_nvram(di,
> + BQ27XXX_GAS_GAUGING_STATE_SUBCLASS);
> + }
> +
> + return 0;
> +}
> +
> /*
> * Return the battery State-of-Charge
> * Or < 0 if something fails.
> @@ -736,6 +958,73 @@ static int bq27xxx_battery_read_health(struct bq27xxx_device_info *di)
> return POWER_SUPPLY_HEALTH_GOOD;
> }
>
> +void bq27xxx_battery_settings(struct bq27xxx_device_info *di)
> +{
> + struct power_supply_battery_info info = {};
> +
> + /* functions don't exist for writing data so abort */
> + if (!di->bus.write || !di->bus.write_bulk)
> + return;
> +
> + /* no settings to be set for this chipset so abort */
> + if (!bq27xxx_dm_subclass_regs[di->chip])
> + return;
> +
> + bq27xxx_battery_set_seal_state(di, false);
> +
> + if (power_supply_get_battery_info(di->bat, &info) < 0)
> + goto out;
> +
> + 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");
> + }
> +
> + if (info.energy_full_design_uwh > 0x7fff * 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;
> + }
> +
> + if (info.charge_full_design_uah > 0x7fff * 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;
> + }
> +
> + if ((info.voltage_min_design_uv < BQ27XXX_MIN_V_MIN * 1000
> + || info.voltage_min_design_uv > BQ27XXX_MIN_V_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.voltage_max_design_uv < BQ27XXX_MAX_V_MIN * 1000
> + || info.voltage_max_design_uv > BQ27XXX_MAX_V_MAX * 1000)
> + && info.voltage_max_design_uv != -EINVAL) {
> + dev_err(di->dev, "invalid battery:voltage-max-design-microvolt %d\n",
> + info.voltage_max_design_uv);
> + info.voltage_max_design_uv = -EINVAL;
> + }
> +
> + if ((info.energy_full_design_uwh == -EINVAL
> + || info.charge_full_design_uah == -EINVAL)
> + && info.voltage_min_design_uv == -EINVAL
> + && info.voltage_max_design_uv == -EINVAL)
> + goto out;
> +
> + bq27xxx_battery_set_config(di, &info);
> +
> +out:
> + bq27xxx_battery_print_config(di);
> + bq27xxx_battery_set_seal_state(di, true);
> +}
> +
> void bq27xxx_battery_update(struct bq27xxx_device_info *di)
> {
> struct bq27xxx_reg_cache cache = {0, };
> @@ -985,6 +1274,14 @@ static int bq27xxx_battery_get_property(struct power_supply *psy,
> 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:
> + case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
> + return -EINVAL;
> case POWER_SUPPLY_PROP_CYCLE_COUNT:
> ret = bq27xxx_simple_value(di->cache.cycle_count, val);
> break;
> @@ -1018,7 +1315,10 @@ static void bq27xxx_external_power_changed(struct power_supply *psy)
> int bq27xxx_battery_setup(struct bq27xxx_device_info *di)
> {
> struct power_supply_desc *psy_desc;
> - struct power_supply_config psy_cfg = { .drv_data = di, };
> + 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);
> @@ -1043,6 +1343,7 @@ int bq27xxx_battery_setup(struct bq27xxx_device_info *di)
>
> dev_info(di->dev, "support ver. %s enabled\n", DRIVER_VERSION);
>
> + bq27xxx_battery_settings(di);
> bq27xxx_battery_update(di);
>
> mutex_lock(&bq27xxx_list_lock);
> diff --git a/include/linux/power/bq27xxx_battery.h b/include/linux/power/bq27xxx_battery.h
> index bed9557..c433815 100644
> --- a/include/linux/power/bq27xxx_battery.h
> +++ b/include/linux/power/bq27xxx_battery.h
> @@ -62,6 +62,7 @@ struct bq27xxx_device_info {
> struct list_head list;
> struct mutex lock;
> u8 *regs;
> + u8 buffer[32];
> };
>
> void bq27xxx_battery_update(struct bq27xxx_device_info *di);
>
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v5 7/8] power: bq27xxx_battery: Define access methods to write chip registers
2017-02-04 9:16 ` [PATCH v5 7/8] power: bq27xxx_battery: Define access methods to write chip registers Liam Breck
2017-02-04 9:35 ` Liam Breck
@ 2017-02-06 23:32 ` Andrew F. Davis
1 sibling, 0 replies; 20+ messages in thread
From: Andrew F. Davis @ 2017-02-06 23:32 UTC (permalink / raw)
To: Liam Breck, Sebastian Reichel; +Cc: Matt Ranostay, linux-pm, Liam, Liam Breck
On 02/04/2017 03:16 AM, Liam Breck wrote:
> From: Liam <github@networkimprov.net>
>
> From: Matt Ranostay <matt@ranostay.consulting>
>
> write(), read_bulk(), write_bulk() support setting chip registers,
> e.g. with data obtained from power_supply_battery_info.
>
> Signed-off-by: Matt Ranostay <matt@ranostay.consulting>
> Signed-off-by: Liam Breck <kernel@networkimprov.net>
> ---
> include/linux/power/bq27xxx_battery.h | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/include/linux/power/bq27xxx_battery.h b/include/linux/power/bq27xxx_battery.h
> index c433815..1a78512 100644
> --- a/include/linux/power/bq27xxx_battery.h
> +++ b/include/linux/power/bq27xxx_battery.h
> @@ -32,6 +32,9 @@ struct bq27xxx_platform_data {
> struct bq27xxx_device_info;
> struct bq27xxx_access_methods {
> int (*read)(struct bq27xxx_device_info *di, u8 reg, bool single);
> + int (*write)(struct bq27xxx_device_info *di, u8 reg, int value, bool single);
> + int (*read_bulk)(struct bq27xxx_device_info *di, u8 reg, u8 *data, int len);
> + int (*write_bulk)(struct bq27xxx_device_info *di, u8 reg, u8 *data, int len);
These should have been defined way earlier in the series, this will
break bisectability.
Andrew
> };
>
> struct bq27xxx_reg_cache {
>
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v5 5/8] power: bq27xxx_battery: Add power_supply_battery_info support
2017-02-06 23:29 ` Andrew F. Davis
@ 2017-02-07 0:15 ` Liam Breck
0 siblings, 0 replies; 20+ messages in thread
From: Liam Breck @ 2017-02-07 0:15 UTC (permalink / raw)
To: Andrew F. Davis; +Cc: Sebastian Reichel, Matt Ranostay, linux-pm
On Mon, Feb 6, 2017 at 3:29 PM, Andrew F. Davis <afd@ti.com> wrote:
> On 02/04/2017 03:16 AM, Liam Breck wrote:
>> From: Matt Ranostay <matt@ranostay.consulting>
>>
>> From: Matt Ranostay <matt@ranostay.consulting>
>>
>> Previously there was no way to set chip registers in the event that the
>> defaults didn't match the battery in question.
>>
>> BQ27xxx driver now calls power_supply_get_battery_info, checks the inputs,
>> and writes battery data to NVRAM.
>>
>
> I haven't had much time to review this, but have you seen our old
> internal version of this driver?:
>
> http://git.ti.com/bms-linux/bms-kernel/blobs/master/drivers/power/bq27x00_battery.c
>
> I would like that most of the NVRAM checks and sets are kept in userspace:
>
> http://git.ti.com/bms-linux/bqtool/trees/master
>
> In kernel don't really have a good way to know when the battery has been
> swapped and the DT info might not be valid for this new battery. I guess
> there is really no good way, but I imagine this is why we never
> upstreamed the rest of this driver before.
But for a huge variety of devices, changing the type of battery is not
an option.
DT battery characteristics are entirely optional in this patchset; no
'monitored-battery' means no NVRAM update.
This patchset also allows field-upgrade of the NVRAM in a
linux-generic way, by releasing a kernel or dtb package update.
Also I suspect fuel-gauge and charger drivers will be encouraged to
support monitored-battery since it's a core feature :-)
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v5 1/8] devicetree: power: Add battery.txt
[not found] ` <20170204091603.32242-2-liam-RYWXG+zxWwBdeoIcmNTgJF6hYfS7NtTn@public.gmane.org>
2017-02-04 10:03 ` Matt Ranostay
@ 2017-02-08 21:58 ` Rob Herring
2017-02-11 2:03 ` Liam Breck
1 sibling, 1 reply; 20+ messages in thread
From: Rob Herring @ 2017-02-08 21:58 UTC (permalink / raw)
To: Liam Breck
Cc: Sebastian Reichel, Andrew F. Davis, Matt Ranostay,
linux-pm-u79uwXL29TY76Z2rM5mHXA,
devicetree-u79uwXL29TY76Z2rM5mHXA, Liam Breck
On Sat, Feb 04, 2017 at 01:15:56AM -0800, Liam Breck wrote:
> From: Matt Ranostay <matt-sk+viVC6FLCDq+mSdOJa79kegs52MxvZ@public.gmane.org>
>
> From: Matt Ranostay <matt-sk+viVC6FLCDq+mSdOJa79kegs52MxvZ@public.gmane.org>
>
> Documentation of static battery characteristics that can be defined
> for batteries which cannot self-identify. This information is required
> by fuel-gauge and charger chips for proper handling of the battery.
I hope this is a common binding and not yet another battery binding.
>
> Cc: Rob Herring <robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
> Cc: devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
> Signed-off-by: Matt Ranostay <matt-sk+viVC6FLCDq+mSdOJa79kegs52MxvZ@public.gmane.org>
> Signed-off-by: Liam Breck <kernel-RYWXG+zxWwBdeoIcmNTgJF6hYfS7NtTn@public.gmane.org>
> ---
> .../devicetree/bindings/power/supply/battery.txt | 39 ++++++++++++++++++++++
> 1 file changed, 39 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/power/supply/battery.txt
>
> diff --git a/Documentation/devicetree/bindings/power/supply/battery.txt b/Documentation/devicetree/bindings/power/supply/battery.txt
> new file mode 100644
> index 0000000..d663c48
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/power/supply/battery.txt
> @@ -0,0 +1,39 @@
> +Battery Characteristics
> +
> +Required Properties:
> + - compatible: Must be "fixed-battery"
The "fixed" part seems a bit pointless. Just "battery" would be a
bit generic. Don't you need to know the battery chemistry typically? Or
number of cells?
> +
> +Optional Properties:
> + - voltage-min-design-microvolt: drained battery voltage
> + - voltage-max-design-microvolt: charged battery voltage
> + - energy-full-design-microwatt-hours: battery design energy
> + - charge-full-design-microamp-hours: battery design capacity
> +
> +Future Properties must be named for the corresponding elements in
> +enum power_supply_property, defined in include/linux/power_supply.h.
> +
> +Batteries must be referenced by chargers and/or fuel-gauges
> +using a phandle. The phandle's property should be named
> +"monitored-battery".
> +
> +Example:
> +
> + bat: battery {
> + compatible = "fixed-battery";
> + voltage-min-design-microvolt = <3200000>;
> + voltage-max-design-microvolt = <4200000>;
> + energy-full-design-microwatt-hours = <5290000>;
> + charge-full-design-microamp-hours = <1430000>;
> + };
> +
> + charger: charger@0 {
> + ....
> + monitored-battery = <&bat>;
> + ...
> + };
> +
> + fuel_gauge: fuel_gauge@0 {
fuel-gauge@...
> + ....
> + monitored-battery = <&bat>;
> + ...
> + };
> --
> 2.9.3
>
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v5 3/8] devicetree: power: bq27xxx: Add monitored-battery documentation
[not found] ` <20170204091603.32242-4-liam-RYWXG+zxWwBdeoIcmNTgJF6hYfS7NtTn@public.gmane.org>
@ 2017-02-08 22:00 ` Rob Herring
0 siblings, 0 replies; 20+ messages in thread
From: Rob Herring @ 2017-02-08 22:00 UTC (permalink / raw)
To: Liam Breck
Cc: Sebastian Reichel, Andrew F. Davis, Matt Ranostay,
linux-pm-u79uwXL29TY76Z2rM5mHXA,
devicetree-u79uwXL29TY76Z2rM5mHXA, Liam Breck
On Sat, Feb 04, 2017 at 01:15:58AM -0800, Liam Breck wrote:
> From: Matt Ranostay <matt-sk+viVC6FLCDq+mSdOJa79kegs52MxvZ@public.gmane.org>
>
> From: Matt Ranostay <matt-sk+viVC6FLCDq+mSdOJa79kegs52MxvZ@public.gmane.org>
>
> Document monitored-battery = <&battery_node>
>
> Cc: Rob Herring <robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
> Cc: devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
> Signed-off-by: Matt Ranostay <matt-sk+viVC6FLCDq+mSdOJa79kegs52MxvZ@public.gmane.org>
> Signed-off-by: Liam Breck <kernel-RYWXG+zxWwBdeoIcmNTgJF6hYfS7NtTn@public.gmane.org>
> ---
> Documentation/devicetree/bindings/power/supply/bq27xxx.txt | 9 +++++++++
> 1 file changed, 9 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/power/supply/bq27xxx.txt b/Documentation/devicetree/bindings/power/supply/bq27xxx.txt
> index b0c95ef..f799181 100644
> --- a/Documentation/devicetree/bindings/power/supply/bq27xxx.txt
> +++ b/Documentation/devicetree/bindings/power/supply/bq27xxx.txt
> @@ -28,9 +28,18 @@ Required properties:
> * "ti,bq27621" - BQ27621
> - reg: integer, i2c address of the device.
>
> +Optional properties:
> +- monitored-battery: phandle of battery information devicetree node
> +
> + See Documentation/devicetree/bindings/power/supply/battery.txt
> + If either of the referenced battery's *-full-design-*-hours properties are set,
> + then both must be.
> +
> Example:
>
> bq27510g3 {
charger@55
Or fuel-gauge@..., I can't tell.
> compatible = "ti,bq27510g3";
> reg = <0x55>;
> +
> + monitored-battery = <&bat>;
> };
> --
> 2.9.3
>
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH v5 1/8] devicetree: power: Add battery.txt
2017-02-08 21:58 ` Rob Herring
@ 2017-02-11 2:03 ` Liam Breck
0 siblings, 0 replies; 20+ messages in thread
From: Liam Breck @ 2017-02-11 2:03 UTC (permalink / raw)
To: Rob Herring
Cc: Sebastian Reichel, Andrew F. Davis, Matt Ranostay, linux-pm,
devicetree, Liam Breck
On Wed, Feb 8, 2017 at 1:58 PM, Rob Herring <robh@kernel.org> wrote:
> On Sat, Feb 04, 2017 at 01:15:56AM -0800, Liam Breck wrote:
>> From: Matt Ranostay <matt@ranostay.consulting>
>>
>> From: Matt Ranostay <matt@ranostay.consulting>
>>
>> Documentation of static battery characteristics that can be defined
>> for batteries which cannot self-identify. This information is required
>> by fuel-gauge and charger chips for proper handling of the battery.
>
> I hope this is a common binding and not yet another battery binding.
Yes, Sebastian had us add support for this in power_supply_core with
int power_supply_get_battery_info(
struct power_supply *psy,
struct power_suppy_battery_info *info)
>> Cc: Rob Herring <robh@kernel.org>
>> Cc: devicetree@vger.kernel.org
>> Signed-off-by: Matt Ranostay <matt@ranostay.consulting>
>> Signed-off-by: Liam Breck <kernel@networkimprov.net>
>> ---
>> .../devicetree/bindings/power/supply/battery.txt | 39 ++++++++++++++++++++++
>> 1 file changed, 39 insertions(+)
>> create mode 100644 Documentation/devicetree/bindings/power/supply/battery.txt
>>
>> diff --git a/Documentation/devicetree/bindings/power/supply/battery.txt b/Documentation/devicetree/bindings/power/supply/battery.txt
>> new file mode 100644
>> index 0000000..d663c48
>> --- /dev/null
>> +++ b/Documentation/devicetree/bindings/power/supply/battery.txt
>> @@ -0,0 +1,39 @@
>> +Battery Characteristics
>> +
>> +Required Properties:
>> + - compatible: Must be "fixed-battery"
>
> The "fixed" part seems a bit pointless. Just "battery" would be a
> bit generic. Don't you need to know the battery chemistry typically? Or
> number of cells?
Sebastian suggested fixed-battery to indicate a non-smart battery,
i.e. a pack without self-awareness besides a protection circuit.
I don't know what compatible would have for a smart battery. That
might be useful to establish now...
I'll be posting v6 shortly, with no change re compatible.
~.~
^ permalink raw reply [flat|nested] 20+ messages in thread
end of thread, other threads:[~2017-02-11 2:03 UTC | newest]
Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-02-04 9:15 [PATCH v5 0/8] Devicetree battery support and client bq27xxx_battery Liam Breck
2017-02-04 9:15 ` [PATCH v5 1/8] devicetree: power: Add battery.txt Liam Breck
[not found] ` <20170204091603.32242-2-liam-RYWXG+zxWwBdeoIcmNTgJF6hYfS7NtTn@public.gmane.org>
2017-02-04 10:03 ` Matt Ranostay
2017-02-08 21:58 ` Rob Herring
2017-02-11 2:03 ` Liam Breck
2017-02-04 9:15 ` [PATCH v5 2/8] devicetree: property-units: Add uWh and uAh units Liam Breck
2017-02-04 9:15 ` Liam Breck
[not found] ` <20170204091603.32242-1-liam-RYWXG+zxWwBdeoIcmNTgJF6hYfS7NtTn@public.gmane.org>
2017-02-04 9:15 ` [PATCH v5 3/8] devicetree: power: bq27xxx: Add monitored-battery documentation Liam Breck
[not found] ` <20170204091603.32242-4-liam-RYWXG+zxWwBdeoIcmNTgJF6hYfS7NtTn@public.gmane.org>
2017-02-08 22:00 ` Rob Herring
2017-02-04 9:15 ` [PATCH v5 4/8] power: power_supply: Add power_supply_battery_info and API Liam Breck
2017-02-04 9:16 ` [PATCH v5 5/8] power: bq27xxx_battery: Add power_supply_battery_info support Liam Breck
2017-02-04 9:42 ` kbuild test robot
2017-02-06 23:29 ` Andrew F. Davis
2017-02-07 0:15 ` Liam Breck
2017-02-04 9:16 ` [PATCH v5 6/8] power: bq27xxx_battery_i2c: Add I2C bulk read/write functions Liam Breck
2017-02-04 9:16 ` [PATCH v5 7/8] power: bq27xxx_battery: Define access methods to write chip registers Liam Breck
2017-02-04 9:35 ` Liam Breck
2017-02-06 23:32 ` Andrew F. Davis
2017-02-04 9:16 ` [PATCH v5 8/8] power: bq27xxx_battery: Add BQ27425 chip id Liam Breck
2017-02-04 9:32 ` 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.