This patch series compose of 3 patches.
First patch, fixes platform data retrieval issue in max8998 charger
driver, which could cause NULL pointer dereference.
Second patch, updates max8998 charger driver, so it's possible to parse
devicetree for configuration.
Third patch, updates max8998 documentation, so it includes new node
and properties, needed for charger.
All patches has been tested on, Samsung Galaxy S (i9000) phone.
Changes from v1:
- Removed unneeded Fixes tag
- Correct description of all charger values
- Added missing property unit for charger properties
- Removed already applied patch
Paweł Chmiel (2):
power: supply: max8998-charger: Parse device tree for required data.
dt-bindings: mfd: max8998: Add charger subnode binding
Tomasz Figa (1):
power: supply: max8998-charger: Fix platform data retrieval
Documentation/devicetree/bindings/mfd/max8998.txt | 24 +++++++++++
drivers/power/supply/max8998_charger.c | 52 ++++++++++++++++++++++-
2 files changed, 75 insertions(+), 1 deletion(-)
--
2.7.4
This patch adds missing code for reading charger configuration
from devicetree.
Signed-off-by: Paweł Chmiel <[email protected]>
---
Changes from v1:
- Removed unneeded Fixes tag
- Use new property names
---
drivers/power/supply/max8998_charger.c | 50 ++++++++++++++++++++++++++++++++++
1 file changed, 50 insertions(+)
diff --git a/drivers/power/supply/max8998_charger.c b/drivers/power/supply/max8998_charger.c
index 66438029bdd0..0a03d3e05c3b 100644
--- a/drivers/power/supply/max8998_charger.c
+++ b/drivers/power/supply/max8998_charger.c
@@ -21,6 +21,7 @@
#include <linux/err.h>
#include <linux/module.h>
+#include <linux/of.h>
#include <linux/slab.h>
#include <linux/platform_device.h>
#include <linux/power_supply.h>
@@ -82,6 +83,49 @@ static const struct power_supply_desc max8998_battery_desc = {
.num_properties = ARRAY_SIZE(max8998_battery_props),
};
+static int max8998_pmic_dt_parse_pdata(struct max8998_dev *iodev,
+ struct max8998_platform_data *pdata)
+{
+ struct device_node *pmic_np = iodev->dev->of_node;
+ struct device_node *charger_np;
+ int ret;
+
+ charger_np = of_get_child_by_name(pmic_np, "charger");
+ if (!charger_np) {
+ dev_err(iodev->dev, "could not find charger sub-node\n");
+ return -EINVAL;
+ }
+
+ ret = of_property_read_u32(charger_np,
+ "max8998,charge-eoc-percent",
+ &pdata->eoc);
+ if (ret < 0) {
+ dev_err(iodev->dev,
+ "Could not find max8998,charge-eoc-percent in devicetree\n");
+ return ret;
+ }
+
+ ret = of_property_read_u32(charger_np,
+ "max8998,charge-restart-level-microvolt",
+ &pdata->restart);
+ if (ret < 0) {
+ dev_err(iodev->dev,
+ "Could not find max8998,charge-restart-level-microvolt in devicetree\n");
+ return ret;
+ }
+
+ ret = of_property_read_u32(charger_np,
+ "max8998,charge-timeout-hours",
+ &pdata->timeout);
+ if (ret < 0) {
+ dev_err(iodev->dev,
+ "Could not find max8998,charge-timeout-hours in devicetree\n");
+ return ret;
+ }
+
+ return 0;
+}
+
static int max8998_battery_probe(struct platform_device *pdev)
{
struct max8998_dev *iodev = dev_get_drvdata(pdev->dev.parent);
@@ -96,6 +140,12 @@ static int max8998_battery_probe(struct platform_device *pdev)
return -ENODEV;
}
+ if (IS_ENABLED(CONFIG_OF) && iodev->dev->of_node) {
+ ret = max8998_pmic_dt_parse_pdata(iodev, pdata);
+ if (ret)
+ return ret;
+ }
+
max8998 = devm_kzalloc(&pdev->dev, sizeof(struct max8998_battery_data),
GFP_KERNEL);
if (!max8998)
--
2.7.4
This patch adds devicetree bindings documentation for
battery charging controller as the subnode of MAX8998 PMIC.
Signed-off-by: Paweł Chmiel <[email protected]>
---
Changes from v1:
- Removed unneeded Fixes tag
- Correct description of all charger values
- Added missing property unit
---
Documentation/devicetree/bindings/mfd/max8998.txt | 24 +++++++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/Documentation/devicetree/bindings/mfd/max8998.txt b/Documentation/devicetree/bindings/mfd/max8998.txt
index 23a3650ff2a2..196e50097a36 100644
--- a/Documentation/devicetree/bindings/mfd/max8998.txt
+++ b/Documentation/devicetree/bindings/mfd/max8998.txt
@@ -50,6 +50,23 @@ Additional properties required if max8998,pmic-buck2-dvs-gpio is defined:
- max8998,pmic-buck2-dvs-voltage: An array of 2 voltage values in microvolts
for buck2 regulator that can be selected using dvs gpio.
+Charger: Configuration for battery charging controller should be added
+inside a child node named 'charger'.
+ Required properties:
+ - max8998,charge-eoc-percent: Setup End of Charge Level.
+ If value equals 0, leave it unchanged.
+ Otherwise it should be value from 10 to 45 by 5 step.
+
+ - max8998,charge-restart-level-microvolt: Setup Charge Restart Level.
+ If value equals 0, leave it unchanged.
+ If value equals -1, it will be disabled.
+ Otherwise it should be one of following values: 100, 150, 200.
+
+ - max8998,charge-timeout-hours: Setup Charge Full Timeout.
+ If value equals 0, leave it unchanged.
+ If value equals -1, it will be disabled.
+ Otherwise it should be one of following values: 5, 6, 7.
+
Regulators: All the regulators of MAX8998 to be instantiated shall be
listed in a child node named 'regulators'. Each regulator is represented
by a child node of the 'regulators' node.
@@ -99,6 +116,13 @@ Example:
max8998,pmic-buck2-dvs-gpio = <&gpx0 0 3 0 0>; /* SET3 */
max8998,pmic-buck2-dvs-voltage = <1350000>, <1300000>;
+ /* Charger configuration */
+ charger {
+ max8998,charge-eoc-percent = <0>;
+ max8998,charge-restart-level-microvolt = <(-1)>;
+ max8998,charge-timeout-hours = <7>;
+ };
+
/* Regulators to instantiate */
regulators {
ldo2_reg: LDO2 {
--
2.7.4
From: Tomasz Figa <[email protected]>
Since the max8998 MFD driver supports instantiation by DT, platform data
retrieval is handled in MFD probe and cell drivers should get use
the pdata field of max8998_dev struct to obtain them.
Fixes: ee999fb3f17f ("mfd: max8998: Add support for Device Tree")
Signed-off-by: Tomasz Figa <[email protected]>
Signed-off-by: Paweł Chmiel <[email protected]>
---
drivers/power/supply/max8998_charger.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/power/supply/max8998_charger.c b/drivers/power/supply/max8998_charger.c
index b64cf0f14142..66438029bdd0 100644
--- a/drivers/power/supply/max8998_charger.c
+++ b/drivers/power/supply/max8998_charger.c
@@ -85,7 +85,7 @@ static const struct power_supply_desc max8998_battery_desc = {
static int max8998_battery_probe(struct platform_device *pdev)
{
struct max8998_dev *iodev = dev_get_drvdata(pdev->dev.parent);
- struct max8998_platform_data *pdata = dev_get_platdata(iodev->dev);
+ struct max8998_platform_data *pdata = iodev->pdata;
struct power_supply_config psy_cfg = {};
struct max8998_battery_data *max8998;
struct i2c_client *i2c;
--
2.7.4
On Sat, Jul 14, 2018 at 02:26:53PM +0200, Paweł Chmiel wrote:
> This patch adds devicetree bindings documentation for
> battery charging controller as the subnode of MAX8998 PMIC.
>
> Signed-off-by: Paweł Chmiel <[email protected]>
> ---
> Changes from v1:
> - Removed unneeded Fixes tag
> - Correct description of all charger values
> - Added missing property unit
> ---
> Documentation/devicetree/bindings/mfd/max8998.txt | 24 +++++++++++++++++++++++
> 1 file changed, 24 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/mfd/max8998.txt b/Documentation/devicetree/bindings/mfd/max8998.txt
> index 23a3650ff2a2..196e50097a36 100644
> --- a/Documentation/devicetree/bindings/mfd/max8998.txt
> +++ b/Documentation/devicetree/bindings/mfd/max8998.txt
> @@ -50,6 +50,23 @@ Additional properties required if max8998,pmic-buck2-dvs-gpio is defined:
> - max8998,pmic-buck2-dvs-voltage: An array of 2 voltage values in microvolts
> for buck2 regulator that can be selected using dvs gpio.
>
> +Charger: Configuration for battery charging controller should be added
> +inside a child node named 'charger'.
> + Required properties:
> + - max8998,charge-eoc-percent: Setup End of Charge Level.
> + If value equals 0, leave it unchanged.
> + Otherwise it should be value from 10 to 45 by 5 step.
> +
> + - max8998,charge-restart-level-microvolt: Setup Charge Restart Level.
> + If value equals 0, leave it unchanged.
> + If value equals -1, it will be disabled.
-1 is a bit strange. Why not 'not present' is disabled?
> + Otherwise it should be one of following values: 100, 150, 200.
> +
> + - max8998,charge-timeout-hours: Setup Charge Full Timeout.
> + If value equals 0, leave it unchanged.
> + If value equals -1, it will be disabled.
> + Otherwise it should be one of following values: 5, 6, 7.
> +
> Regulators: All the regulators of MAX8998 to be instantiated shall be
> listed in a child node named 'regulators'. Each regulator is represented
> by a child node of the 'regulators' node.
> @@ -99,6 +116,13 @@ Example:
> max8998,pmic-buck2-dvs-gpio = <&gpx0 0 3 0 0>; /* SET3 */
> max8998,pmic-buck2-dvs-voltage = <1350000>, <1300000>;
>
> + /* Charger configuration */
> + charger {
> + max8998,charge-eoc-percent = <0>;
> + max8998,charge-restart-level-microvolt = <(-1)>;
> + max8998,charge-timeout-hours = <7>;
> + };
> +
> /* Regulators to instantiate */
> regulators {
> ldo2_reg: LDO2 {
> --
> 2.7.4
>
On Monday, July 16, 2018 12:00:03 PM CEST Rob Herring wrote:
> On Sat, Jul 14, 2018 at 02:26:53PM +0200, Paweł Chmiel wrote:
> > This patch adds devicetree bindings documentation for
> > battery charging controller as the subnode of MAX8998 PMIC.
> >
> > Signed-off-by: Paweł Chmiel <[email protected]>
> > ---
> > Changes from v1:
> > - Removed unneeded Fixes tag
> > - Correct description of all charger values
> > - Added missing property unit
> > ---
> > Documentation/devicetree/bindings/mfd/max8998.txt | 24 +++++++++++++++++++++++
> > 1 file changed, 24 insertions(+)
> >
> > diff --git a/Documentation/devicetree/bindings/mfd/max8998.txt b/Documentation/devicetree/bindings/mfd/max8998.txt
> > index 23a3650ff2a2..196e50097a36 100644
> > --- a/Documentation/devicetree/bindings/mfd/max8998.txt
> > +++ b/Documentation/devicetree/bindings/mfd/max8998.txt
> > @@ -50,6 +50,23 @@ Additional properties required if max8998,pmic-buck2-dvs-gpio is defined:
> > - max8998,pmic-buck2-dvs-voltage: An array of 2 voltage values in microvolts
> > for buck2 regulator that can be selected using dvs gpio.
> >
> > +Charger: Configuration for battery charging controller should be added
> > +inside a child node named 'charger'.
> > + Required properties:
> > + - max8998,charge-eoc-percent: Setup End of Charge Level.
> > + If value equals 0, leave it unchanged.
> > + Otherwise it should be value from 10 to 45 by 5 step.
> > +
> > + - max8998,charge-restart-level-microvolt: Setup Charge Restart Level.
> > + If value equals 0, leave it unchanged.
> > + If value equals -1, it will be disabled.
>
> -1 is a bit strange. Why not 'not present' is disabled?
I wanted to make it work the same way, as it was in case of using it from platform_data.
But this is good idea, to change it a bit.
So we would have:
- 0 -> leave unchanged
- property not present in devicetree -> disabled (and set to -1 - driver is expecting it)
- value from 10-45 or (5,6,7 in case of second property)
I'll update both documentation and driver parsing code (for both properties - restart level and full timeout) and send v3 version.
Thanks for suggestion.
>
> > + Otherwise it should be one of following values: 100, 150, 200.
> > +
> > + - max8998,charge-timeout-hours: Setup Charge Full Timeout.
> > + If value equals 0, leave it unchanged.
> > + If value equals -1, it will be disabled.
> > + Otherwise it should be one of following values: 5, 6, 7.
> > +
> > Regulators: All the regulators of MAX8998 to be instantiated shall be
> > listed in a child node named 'regulators'. Each regulator is represented
> > by a child node of the 'regulators' node.
> > @@ -99,6 +116,13 @@ Example:
> > max8998,pmic-buck2-dvs-gpio = <&gpx0 0 3 0 0>; /* SET3 */
> > max8998,pmic-buck2-dvs-voltage = <1350000>, <1300000>;
> >
> > + /* Charger configuration */
> > + charger {
> > + max8998,charge-eoc-percent = <0>;
> > + max8998,charge-restart-level-microvolt = <(-1)>;
> > + max8998,charge-timeout-hours = <7>;
> > + };
> > +
> > /* Regulators to instantiate */
> > regulators {
> > ldo2_reg: LDO2 {
>