* [PATCH v5 1/6] mfd: axp20x: make AXP209/22x cells probe their ADC via DT
2018-02-28 10:35 [PATCH v5 0/6] add support for AXP813 ADC and battery power supply Quentin Schulz
@ 2018-02-28 10:35 ` Quentin Schulz
2018-03-07 16:11 ` Lee Jones
2018-02-28 10:35 ` [PATCH v5 2/6] mfd: axp20x: probe axp20x_adc driver for AXP813 Quentin Schulz
` (4 subsequent siblings)
5 siblings, 1 reply; 14+ messages in thread
From: Quentin Schulz @ 2018-02-28 10:35 UTC (permalink / raw)
To: sre, robh+dt, mark.rutland, wens
Cc: maxime.ripard, lee.jones, linux-pm, devicetree, linux-kernel,
thomas.petazzoni, linux-sunxi, Quentin Schulz
This makes AXP209 and AXP22x ADCs probe first via DT and then by
fallback via platform.
Signed-off-by: Quentin Schulz <quentin.schulz@bootlin.com>
Acked-for-MFD-by: Lee Jones <lee.jones@linaro.org>
Acked-by: Chen-Yu Tsai <wens@csie.org>
---
drivers/mfd/axp20x.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
index e94c72c..1977a03 100644
--- a/drivers/mfd/axp20x.c
+++ b/drivers/mfd/axp20x.c
@@ -660,6 +660,7 @@ static struct mfd_cell axp20x_cells[] = {
.name = "axp20x-regulator",
}, {
.name = "axp20x-adc",
+ .of_compatible = "x-powers,axp209-adc",
}, {
.name = "axp20x-battery-power-supply",
.of_compatible = "x-powers,axp209-battery-power-supply",
@@ -684,7 +685,8 @@ static struct mfd_cell axp221_cells[] = {
}, {
.name = "axp20x-regulator",
}, {
- .name = "axp22x-adc"
+ .name = "axp22x-adc",
+ .of_compatible = "x-powers,axp221-adc",
}, {
.name = "axp20x-ac-power-supply",
.of_compatible = "x-powers,axp221-ac-power-supply",
@@ -708,6 +710,7 @@ static struct mfd_cell axp223_cells[] = {
.resources = axp22x_pek_resources,
}, {
.name = "axp22x-adc",
+ .of_compatible = "x-powers,axp221-adc",
}, {
.name = "axp20x-battery-power-supply",
.of_compatible = "x-powers,axp221-battery-power-supply",
--
git-series 0.9.1
^ permalink raw reply [flat|nested] 14+ messages in thread* Re: [PATCH v5 1/6] mfd: axp20x: make AXP209/22x cells probe their ADC via DT
2018-02-28 10:35 ` [PATCH v5 1/6] mfd: axp20x: make AXP209/22x cells probe their ADC via DT Quentin Schulz
@ 2018-03-07 16:11 ` Lee Jones
0 siblings, 0 replies; 14+ messages in thread
From: Lee Jones @ 2018-03-07 16:11 UTC (permalink / raw)
To: Quentin Schulz
Cc: sre, robh+dt, mark.rutland, wens, maxime.ripard, linux-pm,
devicetree, linux-kernel, thomas.petazzoni, linux-sunxi
On Wed, 28 Feb 2018, Quentin Schulz wrote:
> This makes AXP209 and AXP22x ADCs probe first via DT and then by
> fallback via platform.
>
> Signed-off-by: Quentin Schulz <quentin.schulz@bootlin.com>
> Acked-for-MFD-by: Lee Jones <lee.jones@linaro.org>
> Acked-by: Chen-Yu Tsai <wens@csie.org>
> ---
> drivers/mfd/axp20x.c | 5 ++++-
> 1 file changed, 4 insertions(+), 1 deletion(-)
Applied, thanks.
--
Lee Jones
Linaro Services Technical Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v5 2/6] mfd: axp20x: probe axp20x_adc driver for AXP813
2018-02-28 10:35 [PATCH v5 0/6] add support for AXP813 ADC and battery power supply Quentin Schulz
2018-02-28 10:35 ` [PATCH v5 1/6] mfd: axp20x: make AXP209/22x cells probe their ADC via DT Quentin Schulz
@ 2018-02-28 10:35 ` Quentin Schulz
2018-03-07 16:12 ` Lee Jones
2018-02-28 10:35 ` [PATCH v5 3/6] power: supply: axp20x_battery: use data struct for variant specific code Quentin Schulz
` (3 subsequent siblings)
5 siblings, 1 reply; 14+ messages in thread
From: Quentin Schulz @ 2018-02-28 10:35 UTC (permalink / raw)
To: sre, robh+dt, mark.rutland, wens
Cc: maxime.ripard, lee.jones, linux-pm, devicetree, linux-kernel,
thomas.petazzoni, linux-sunxi, Quentin Schulz
This makes the axp20x_adc driver probe with platform device id
"axp813-adc".
Signed-off-by: Quentin Schulz <quentin.schulz@bootlin.com>
Acked-for-MFD-by: Lee Jones <lee.jones@linaro.org>
Acked-by: Chen-Yu Tsai <wens@csie.org>
---
drivers/mfd/axp20x.c | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
index 1977a03..e5516aa 100644
--- a/drivers/mfd/axp20x.c
+++ b/drivers/mfd/axp20x.c
@@ -885,7 +885,10 @@ static struct mfd_cell axp813_cells[] = {
}, {
.name = "axp20x-gpio",
.of_compatible = "x-powers,axp813-gpio",
- }
+ }, {
+ .name = "axp813-adc",
+ .of_compatible = "x-powers,axp813-adc",
+ },
};
static struct axp20x_dev *axp20x_pm_power_off;
--
git-series 0.9.1
^ permalink raw reply [flat|nested] 14+ messages in thread* Re: [PATCH v5 2/6] mfd: axp20x: probe axp20x_adc driver for AXP813
2018-02-28 10:35 ` [PATCH v5 2/6] mfd: axp20x: probe axp20x_adc driver for AXP813 Quentin Schulz
@ 2018-03-07 16:12 ` Lee Jones
0 siblings, 0 replies; 14+ messages in thread
From: Lee Jones @ 2018-03-07 16:12 UTC (permalink / raw)
To: Quentin Schulz
Cc: sre, robh+dt, mark.rutland, wens, maxime.ripard, linux-pm,
devicetree, linux-kernel, thomas.petazzoni, linux-sunxi
On Wed, 28 Feb 2018, Quentin Schulz wrote:
> This makes the axp20x_adc driver probe with platform device id
> "axp813-adc".
>
> Signed-off-by: Quentin Schulz <quentin.schulz@bootlin.com>
> Acked-for-MFD-by: Lee Jones <lee.jones@linaro.org>
> Acked-by: Chen-Yu Tsai <wens@csie.org>
> ---
> drivers/mfd/axp20x.c | 5 ++++-
> 1 file changed, 4 insertions(+), 1 deletion(-)
Applied, thanks.
--
Lee Jones
Linaro Services Technical Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v5 3/6] power: supply: axp20x_battery: use data struct for variant specific code
2018-02-28 10:35 [PATCH v5 0/6] add support for AXP813 ADC and battery power supply Quentin Schulz
2018-02-28 10:35 ` [PATCH v5 1/6] mfd: axp20x: make AXP209/22x cells probe their ADC via DT Quentin Schulz
2018-02-28 10:35 ` [PATCH v5 2/6] mfd: axp20x: probe axp20x_adc driver for AXP813 Quentin Schulz
@ 2018-02-28 10:35 ` Quentin Schulz
2018-03-09 16:08 ` Sebastian Reichel
2018-02-28 10:35 ` [PATCH v5 4/6] dt-bindings: power: supply: axp20x: add AXP813 battery DT binding Quentin Schulz
` (2 subsequent siblings)
5 siblings, 1 reply; 14+ messages in thread
From: Quentin Schulz @ 2018-02-28 10:35 UTC (permalink / raw)
To: sre, robh+dt, mark.rutland, wens
Cc: maxime.ripard, lee.jones, linux-pm, devicetree, linux-kernel,
thomas.petazzoni, linux-sunxi, Quentin Schulz
We used to use IDs to select a function or a feature depending on the
variant. It's easier to maintain the code by adding data structure
storing the few differences between variants so that we don't add a pile
of if conditions.
Let's use this data structure and update the code to use it.
Signed-off-by: Quentin Schulz <quentin.schulz@bootlin.com>
Reviewed-by: Chen-Yu Tsai <wens@csie.org>
---
drivers/power/supply/axp20x_battery.c | 100 +++++++++++++++++----------
1 file changed, 66 insertions(+), 34 deletions(-)
diff --git a/drivers/power/supply/axp20x_battery.c b/drivers/power/supply/axp20x_battery.c
index 7494f0f..04a0d91 100644
--- a/drivers/power/supply/axp20x_battery.c
+++ b/drivers/power/supply/axp20x_battery.c
@@ -53,6 +53,16 @@
#define AXP20X_V_OFF_MASK GENMASK(2, 0)
+struct axp20x_batt_ps;
+
+struct axp_data {
+ int ccc_scale;
+ int ccc_offset;
+ bool has_fg_valid;
+ int (*get_max_voltage)(struct axp20x_batt_ps *batt, int *val);
+ int (*set_max_voltage)(struct axp20x_batt_ps *batt, int val);
+};
+
struct axp20x_batt_ps {
struct regmap *regmap;
struct power_supply *batt;
@@ -62,7 +72,7 @@ struct axp20x_batt_ps {
struct iio_channel *batt_v;
/* Maximum constant charge current */
unsigned int max_ccc;
- u8 axp_id;
+ const struct axp_data *data;
};
static int axp20x_battery_get_max_voltage(struct axp20x_batt_ps *axp20x_batt,
@@ -123,22 +133,6 @@ static int axp22x_battery_get_max_voltage(struct axp20x_batt_ps *axp20x_batt,
return 0;
}
-static void raw_to_constant_charge_current(struct axp20x_batt_ps *axp, int *val)
-{
- if (axp->axp_id == AXP209_ID)
- *val = *val * 100000 + 300000;
- else
- *val = *val * 150000 + 300000;
-}
-
-static void constant_charge_current_to_raw(struct axp20x_batt_ps *axp, int *val)
-{
- if (axp->axp_id == AXP209_ID)
- *val = (*val - 300000) / 100000;
- else
- *val = (*val - 300000) / 150000;
-}
-
static int axp20x_get_constant_charge_current(struct axp20x_batt_ps *axp,
int *val)
{
@@ -150,7 +144,7 @@ static int axp20x_get_constant_charge_current(struct axp20x_batt_ps *axp,
*val &= AXP20X_CHRG_CTRL1_TGT_CURR;
- raw_to_constant_charge_current(axp, val);
+ *val = *val * axp->data->ccc_scale + axp->data->ccc_offset;
return 0;
}
@@ -269,8 +263,7 @@ static int axp20x_battery_get_prop(struct power_supply *psy,
if (ret)
return ret;
- if (axp20x_batt->axp_id == AXP221_ID &&
- !(reg & AXP22X_FG_VALID))
+ if (axp20x_batt->data->has_fg_valid && !(reg & AXP22X_FG_VALID))
return -EINVAL;
/*
@@ -281,11 +274,8 @@ static int axp20x_battery_get_prop(struct power_supply *psy,
break;
case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
- if (axp20x_batt->axp_id == AXP209_ID)
- return axp20x_battery_get_max_voltage(axp20x_batt,
- &val->intval);
- return axp22x_battery_get_max_voltage(axp20x_batt,
- &val->intval);
+ return axp20x_batt->data->get_max_voltage(axp20x_batt,
+ &val->intval);
case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
ret = regmap_read(axp20x_batt->regmap, AXP20X_V_OFF, ®);
@@ -312,6 +302,32 @@ static int axp20x_battery_get_prop(struct power_supply *psy,
return 0;
}
+static int axp22x_battery_set_max_voltage(struct axp20x_batt_ps *axp20x_batt,
+ int val)
+{
+ switch (val) {
+ case 4100000:
+ val = AXP20X_CHRG_CTRL1_TGT_4_1V;
+ break;
+
+ case 4200000:
+ val = AXP20X_CHRG_CTRL1_TGT_4_2V;
+ break;
+
+ default:
+ /*
+ * AXP20x max voltage can be set to 4.36V and AXP22X max voltage
+ * can be set to 4.22V and 4.24V, but these voltages are too
+ * high for Lithium based batteries (AXP PMICs are supposed to
+ * be used with these kinds of battery).
+ */
+ return -EINVAL;
+ }
+
+ return regmap_update_bits(axp20x_batt->regmap, AXP20X_CHRG_CTRL1,
+ AXP20X_CHRG_CTRL1_TGT_VOLT, val);
+}
+
static int axp20x_battery_set_max_voltage(struct axp20x_batt_ps *axp20x_batt,
int val)
{
@@ -321,9 +337,6 @@ static int axp20x_battery_set_max_voltage(struct axp20x_batt_ps *axp20x_batt,
break;
case 4150000:
- if (axp20x_batt->axp_id == AXP221_ID)
- return -EINVAL;
-
val = AXP20X_CHRG_CTRL1_TGT_4_15V;
break;
@@ -351,7 +364,8 @@ static int axp20x_set_constant_charge_current(struct axp20x_batt_ps *axp_batt,
if (charge_current > axp_batt->max_ccc)
return -EINVAL;
- constant_charge_current_to_raw(axp_batt, &charge_current);
+ charge_current = (charge_current - axp_batt->data->ccc_offset) /
+ axp_batt->data->ccc_scale;
if (charge_current > AXP20X_CHRG_CTRL1_TGT_CURR || charge_current < 0)
return -EINVAL;
@@ -365,12 +379,14 @@ static int axp20x_set_max_constant_charge_current(struct axp20x_batt_ps *axp,
{
bool lower_max = false;
- constant_charge_current_to_raw(axp, &charge_current);
+ charge_current = (charge_current - axp->data->ccc_offset) /
+ axp->data->ccc_scale;
if (charge_current > AXP20X_CHRG_CTRL1_TGT_CURR || charge_current < 0)
return -EINVAL;
- raw_to_constant_charge_current(axp, &charge_current);
+ charge_current = charge_current * axp->data->ccc_scale +
+ axp->data->ccc_offset;
if (charge_current > axp->max_ccc)
dev_warn(axp->dev,
@@ -460,13 +476,28 @@ static const struct power_supply_desc axp20x_batt_ps_desc = {
.set_property = axp20x_battery_set_prop,
};
+static const struct axp_data axp209_data = {
+ .ccc_scale = 100000,
+ .ccc_offset = 300000,
+ .get_max_voltage = axp20x_battery_get_max_voltage,
+ .set_max_voltage = axp20x_battery_set_max_voltage,
+};
+
+static const struct axp_data axp221_data = {
+ .ccc_scale = 150000,
+ .ccc_offset = 300000,
+ .has_fg_valid = true,
+ .get_max_voltage = axp22x_battery_get_max_voltage,
+ .set_max_voltage = axp22x_battery_set_max_voltage,
+};
+
static const struct of_device_id axp20x_battery_ps_id[] = {
{
.compatible = "x-powers,axp209-battery-power-supply",
- .data = (void *)AXP209_ID,
+ .data = (void *)&axp209_data,
}, {
.compatible = "x-powers,axp221-battery-power-supply",
- .data = (void *)AXP221_ID,
+ .data = (void *)&axp221_data,
}, { /* sentinel */ },
};
MODULE_DEVICE_TABLE(of, axp20x_battery_ps_id);
@@ -476,6 +507,7 @@ static int axp20x_power_probe(struct platform_device *pdev)
struct axp20x_batt_ps *axp20x_batt;
struct power_supply_config psy_cfg = {};
struct power_supply_battery_info info;
+ struct device *dev = &pdev->dev;
if (!of_device_is_available(pdev->dev.of_node))
return -ENODEV;
@@ -516,7 +548,7 @@ static int axp20x_power_probe(struct platform_device *pdev)
psy_cfg.drv_data = axp20x_batt;
psy_cfg.of_node = pdev->dev.of_node;
- axp20x_batt->axp_id = (uintptr_t)of_device_get_match_data(&pdev->dev);
+ axp20x_batt->data = (struct axp_data *)of_device_get_match_data(dev);
axp20x_batt->batt = devm_power_supply_register(&pdev->dev,
&axp20x_batt_ps_desc,
--
git-series 0.9.1
^ permalink raw reply [flat|nested] 14+ messages in thread* Re: [PATCH v5 3/6] power: supply: axp20x_battery: use data struct for variant specific code
2018-02-28 10:35 ` [PATCH v5 3/6] power: supply: axp20x_battery: use data struct for variant specific code Quentin Schulz
@ 2018-03-09 16:08 ` Sebastian Reichel
2018-03-09 17:04 ` Quentin Schulz
0 siblings, 1 reply; 14+ messages in thread
From: Sebastian Reichel @ 2018-03-09 16:08 UTC (permalink / raw)
To: Quentin Schulz
Cc: robh+dt, mark.rutland, wens, maxime.ripard, lee.jones, linux-pm,
devicetree, linux-kernel, thomas.petazzoni, linux-sunxi
[-- Attachment #1: Type: text/plain, Size: 7929 bytes --]
Hi Quentin,
On Wed, Feb 28, 2018 at 11:35:58AM +0100, Quentin Schulz wrote:
> We used to use IDs to select a function or a feature depending on the
> variant. It's easier to maintain the code by adding data structure
> storing the few differences between variants so that we don't add a pile
> of if conditions.
>
> Let's use this data structure and update the code to use it.
>
> Signed-off-by: Quentin Schulz <quentin.schulz@bootlin.com>
> Reviewed-by: Chen-Yu Tsai <wens@csie.org>
> ---
I applied this, but modified the patch slightly, so that
it actually calls your new set_max_voltage() callback in
axp20x_battery_set_prop(). Please check that the resulting
patch looks correct to you:
https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/commit/?h=for-next&id=648badd797c762a713b48afc3b67d56abdd0073b
-- Sebastian
> drivers/power/supply/axp20x_battery.c | 100 +++++++++++++++++----------
> 1 file changed, 66 insertions(+), 34 deletions(-)
>
> diff --git a/drivers/power/supply/axp20x_battery.c b/drivers/power/supply/axp20x_battery.c
> index 7494f0f..04a0d91 100644
> --- a/drivers/power/supply/axp20x_battery.c
> +++ b/drivers/power/supply/axp20x_battery.c
> @@ -53,6 +53,16 @@
>
> #define AXP20X_V_OFF_MASK GENMASK(2, 0)
>
> +struct axp20x_batt_ps;
> +
> +struct axp_data {
> + int ccc_scale;
> + int ccc_offset;
> + bool has_fg_valid;
> + int (*get_max_voltage)(struct axp20x_batt_ps *batt, int *val);
> + int (*set_max_voltage)(struct axp20x_batt_ps *batt, int val);
> +};
> +
> struct axp20x_batt_ps {
> struct regmap *regmap;
> struct power_supply *batt;
> @@ -62,7 +72,7 @@ struct axp20x_batt_ps {
> struct iio_channel *batt_v;
> /* Maximum constant charge current */
> unsigned int max_ccc;
> - u8 axp_id;
> + const struct axp_data *data;
> };
>
> static int axp20x_battery_get_max_voltage(struct axp20x_batt_ps *axp20x_batt,
> @@ -123,22 +133,6 @@ static int axp22x_battery_get_max_voltage(struct axp20x_batt_ps *axp20x_batt,
> return 0;
> }
>
> -static void raw_to_constant_charge_current(struct axp20x_batt_ps *axp, int *val)
> -{
> - if (axp->axp_id == AXP209_ID)
> - *val = *val * 100000 + 300000;
> - else
> - *val = *val * 150000 + 300000;
> -}
> -
> -static void constant_charge_current_to_raw(struct axp20x_batt_ps *axp, int *val)
> -{
> - if (axp->axp_id == AXP209_ID)
> - *val = (*val - 300000) / 100000;
> - else
> - *val = (*val - 300000) / 150000;
> -}
> -
> static int axp20x_get_constant_charge_current(struct axp20x_batt_ps *axp,
> int *val)
> {
> @@ -150,7 +144,7 @@ static int axp20x_get_constant_charge_current(struct axp20x_batt_ps *axp,
>
> *val &= AXP20X_CHRG_CTRL1_TGT_CURR;
>
> - raw_to_constant_charge_current(axp, val);
> + *val = *val * axp->data->ccc_scale + axp->data->ccc_offset;
>
> return 0;
> }
> @@ -269,8 +263,7 @@ static int axp20x_battery_get_prop(struct power_supply *psy,
> if (ret)
> return ret;
>
> - if (axp20x_batt->axp_id == AXP221_ID &&
> - !(reg & AXP22X_FG_VALID))
> + if (axp20x_batt->data->has_fg_valid && !(reg & AXP22X_FG_VALID))
> return -EINVAL;
>
> /*
> @@ -281,11 +274,8 @@ static int axp20x_battery_get_prop(struct power_supply *psy,
> break;
>
> case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
> - if (axp20x_batt->axp_id == AXP209_ID)
> - return axp20x_battery_get_max_voltage(axp20x_batt,
> - &val->intval);
> - return axp22x_battery_get_max_voltage(axp20x_batt,
> - &val->intval);
> + return axp20x_batt->data->get_max_voltage(axp20x_batt,
> + &val->intval);
>
> case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
> ret = regmap_read(axp20x_batt->regmap, AXP20X_V_OFF, ®);
> @@ -312,6 +302,32 @@ static int axp20x_battery_get_prop(struct power_supply *psy,
> return 0;
> }
>
> +static int axp22x_battery_set_max_voltage(struct axp20x_batt_ps *axp20x_batt,
> + int val)
> +{
> + switch (val) {
> + case 4100000:
> + val = AXP20X_CHRG_CTRL1_TGT_4_1V;
> + break;
> +
> + case 4200000:
> + val = AXP20X_CHRG_CTRL1_TGT_4_2V;
> + break;
> +
> + default:
> + /*
> + * AXP20x max voltage can be set to 4.36V and AXP22X max voltage
> + * can be set to 4.22V and 4.24V, but these voltages are too
> + * high for Lithium based batteries (AXP PMICs are supposed to
> + * be used with these kinds of battery).
> + */
> + return -EINVAL;
> + }
> +
> + return regmap_update_bits(axp20x_batt->regmap, AXP20X_CHRG_CTRL1,
> + AXP20X_CHRG_CTRL1_TGT_VOLT, val);
> +}
> +
> static int axp20x_battery_set_max_voltage(struct axp20x_batt_ps *axp20x_batt,
> int val)
> {
> @@ -321,9 +337,6 @@ static int axp20x_battery_set_max_voltage(struct axp20x_batt_ps *axp20x_batt,
> break;
>
> case 4150000:
> - if (axp20x_batt->axp_id == AXP221_ID)
> - return -EINVAL;
> -
> val = AXP20X_CHRG_CTRL1_TGT_4_15V;
> break;
>
> @@ -351,7 +364,8 @@ static int axp20x_set_constant_charge_current(struct axp20x_batt_ps *axp_batt,
> if (charge_current > axp_batt->max_ccc)
> return -EINVAL;
>
> - constant_charge_current_to_raw(axp_batt, &charge_current);
> + charge_current = (charge_current - axp_batt->data->ccc_offset) /
> + axp_batt->data->ccc_scale;
>
> if (charge_current > AXP20X_CHRG_CTRL1_TGT_CURR || charge_current < 0)
> return -EINVAL;
> @@ -365,12 +379,14 @@ static int axp20x_set_max_constant_charge_current(struct axp20x_batt_ps *axp,
> {
> bool lower_max = false;
>
> - constant_charge_current_to_raw(axp, &charge_current);
> + charge_current = (charge_current - axp->data->ccc_offset) /
> + axp->data->ccc_scale;
>
> if (charge_current > AXP20X_CHRG_CTRL1_TGT_CURR || charge_current < 0)
> return -EINVAL;
>
> - raw_to_constant_charge_current(axp, &charge_current);
> + charge_current = charge_current * axp->data->ccc_scale +
> + axp->data->ccc_offset;
>
> if (charge_current > axp->max_ccc)
> dev_warn(axp->dev,
> @@ -460,13 +476,28 @@ static const struct power_supply_desc axp20x_batt_ps_desc = {
> .set_property = axp20x_battery_set_prop,
> };
>
> +static const struct axp_data axp209_data = {
> + .ccc_scale = 100000,
> + .ccc_offset = 300000,
> + .get_max_voltage = axp20x_battery_get_max_voltage,
> + .set_max_voltage = axp20x_battery_set_max_voltage,
> +};
> +
> +static const struct axp_data axp221_data = {
> + .ccc_scale = 150000,
> + .ccc_offset = 300000,
> + .has_fg_valid = true,
> + .get_max_voltage = axp22x_battery_get_max_voltage,
> + .set_max_voltage = axp22x_battery_set_max_voltage,
> +};
> +
> static const struct of_device_id axp20x_battery_ps_id[] = {
> {
> .compatible = "x-powers,axp209-battery-power-supply",
> - .data = (void *)AXP209_ID,
> + .data = (void *)&axp209_data,
> }, {
> .compatible = "x-powers,axp221-battery-power-supply",
> - .data = (void *)AXP221_ID,
> + .data = (void *)&axp221_data,
> }, { /* sentinel */ },
> };
> MODULE_DEVICE_TABLE(of, axp20x_battery_ps_id);
> @@ -476,6 +507,7 @@ static int axp20x_power_probe(struct platform_device *pdev)
> struct axp20x_batt_ps *axp20x_batt;
> struct power_supply_config psy_cfg = {};
> struct power_supply_battery_info info;
> + struct device *dev = &pdev->dev;
>
> if (!of_device_is_available(pdev->dev.of_node))
> return -ENODEV;
> @@ -516,7 +548,7 @@ static int axp20x_power_probe(struct platform_device *pdev)
> psy_cfg.drv_data = axp20x_batt;
> psy_cfg.of_node = pdev->dev.of_node;
>
> - axp20x_batt->axp_id = (uintptr_t)of_device_get_match_data(&pdev->dev);
> + axp20x_batt->data = (struct axp_data *)of_device_get_match_data(dev);
>
> axp20x_batt->batt = devm_power_supply_register(&pdev->dev,
> &axp20x_batt_ps_desc,
> --
> git-series 0.9.1
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 14+ messages in thread* Re: [PATCH v5 3/6] power: supply: axp20x_battery: use data struct for variant specific code
2018-03-09 16:08 ` Sebastian Reichel
@ 2018-03-09 17:04 ` Quentin Schulz
0 siblings, 0 replies; 14+ messages in thread
From: Quentin Schulz @ 2018-03-09 17:04 UTC (permalink / raw)
To: Sebastian Reichel
Cc: robh+dt, mark.rutland, wens, maxime.ripard, lee.jones, linux-pm,
devicetree, linux-kernel, thomas.petazzoni, linux-sunxi
[-- Attachment #1: Type: text/plain, Size: 1092 bytes --]
Hi Sebastian,
On Fri, Mar 09, 2018 at 05:08:25PM +0100, Sebastian Reichel wrote:
> Hi Quentin,
>
> On Wed, Feb 28, 2018 at 11:35:58AM +0100, Quentin Schulz wrote:
> > We used to use IDs to select a function or a feature depending on the
> > variant. It's easier to maintain the code by adding data structure
> > storing the few differences between variants so that we don't add a pile
> > of if conditions.
> >
> > Let's use this data structure and update the code to use it.
> >
> > Signed-off-by: Quentin Schulz <quentin.schulz@bootlin.com>
> > Reviewed-by: Chen-Yu Tsai <wens@csie.org>
> > ---
>
> I applied this, but modified the patch slightly, so that
> it actually calls your new set_max_voltage() callback in
> axp20x_battery_set_prop(). Please check that the resulting
> patch looks correct to you:
>
> https://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git/commit/?h=for-next&id=648badd797c762a713b48afc3b67d56abdd0073b
>
You actually fixed an error in this patch while doing so, so thank you :)
Looks good to me.
Quentin
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 801 bytes --]
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v5 4/6] dt-bindings: power: supply: axp20x: add AXP813 battery DT binding
2018-02-28 10:35 [PATCH v5 0/6] add support for AXP813 ADC and battery power supply Quentin Schulz
` (2 preceding siblings ...)
2018-02-28 10:35 ` [PATCH v5 3/6] power: supply: axp20x_battery: use data struct for variant specific code Quentin Schulz
@ 2018-02-28 10:35 ` Quentin Schulz
2018-03-09 16:08 ` Sebastian Reichel
2018-02-28 10:36 ` [PATCH v5 5/6] power: supply: axp20x_battery: add support for AXP813 Quentin Schulz
2018-02-28 10:36 ` [PATCH v5 6/6] mfd: axp20x: add battery power supply cell " Quentin Schulz
5 siblings, 1 reply; 14+ messages in thread
From: Quentin Schulz @ 2018-02-28 10:35 UTC (permalink / raw)
To: sre, robh+dt, mark.rutland, wens
Cc: maxime.ripard, lee.jones, linux-pm, devicetree, linux-kernel,
thomas.petazzoni, linux-sunxi, Quentin Schulz
The AXP813 can have a battery as power supply, so let's add it to the
list of compatibles.
Signed-off-by: Quentin Schulz <quentin.schulz@bootlin.com>
Reviewed-by: Rob Herring <robh@kernel.org>
Acked-by: Chen-Yu Tsai <wens@csie.org>
---
Documentation/devicetree/bindings/power/supply/axp20x_battery.txt | 8 +++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/Documentation/devicetree/bindings/power/supply/axp20x_battery.txt b/Documentation/devicetree/bindings/power/supply/axp20x_battery.txt
index c248866..41916f6 100644
--- a/Documentation/devicetree/bindings/power/supply/axp20x_battery.txt
+++ b/Documentation/devicetree/bindings/power/supply/axp20x_battery.txt
@@ -4,12 +4,12 @@ Required Properties:
- compatible, one of:
"x-powers,axp209-battery-power-supply"
"x-powers,axp221-battery-power-supply"
+ "x-powers,axp813-battery-power-supply"
-This node is a subnode of the axp20x/axp22x PMIC.
+This node is a subnode of its respective PMIC DT node.
-The AXP20X and AXP22X can read the battery voltage, charge and discharge
-currents of the battery by reading ADC channels from the AXP20X/AXP22X
-ADC.
+The supported devices can read the battery voltage, charge and discharge
+currents of the battery by reading ADC channels from the ADC.
Example:
--
git-series 0.9.1
^ permalink raw reply [flat|nested] 14+ messages in thread* Re: [PATCH v5 4/6] dt-bindings: power: supply: axp20x: add AXP813 battery DT binding
2018-02-28 10:35 ` [PATCH v5 4/6] dt-bindings: power: supply: axp20x: add AXP813 battery DT binding Quentin Schulz
@ 2018-03-09 16:08 ` Sebastian Reichel
0 siblings, 0 replies; 14+ messages in thread
From: Sebastian Reichel @ 2018-03-09 16:08 UTC (permalink / raw)
To: Quentin Schulz
Cc: robh+dt, mark.rutland, wens, maxime.ripard, lee.jones, linux-pm,
devicetree, linux-kernel, thomas.petazzoni, linux-sunxi
[-- Attachment #1: Type: text/plain, Size: 1522 bytes --]
Hi,
On Wed, Feb 28, 2018 at 11:35:59AM +0100, Quentin Schulz wrote:
> The AXP813 can have a battery as power supply, so let's add it to the
> list of compatibles.
>
> Signed-off-by: Quentin Schulz <quentin.schulz@bootlin.com>
> Reviewed-by: Rob Herring <robh@kernel.org>
> Acked-by: Chen-Yu Tsai <wens@csie.org>
> ---
Thanks, queued.
-- Sebastian
> Documentation/devicetree/bindings/power/supply/axp20x_battery.txt | 8 +++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/power/supply/axp20x_battery.txt b/Documentation/devicetree/bindings/power/supply/axp20x_battery.txt
> index c248866..41916f6 100644
> --- a/Documentation/devicetree/bindings/power/supply/axp20x_battery.txt
> +++ b/Documentation/devicetree/bindings/power/supply/axp20x_battery.txt
> @@ -4,12 +4,12 @@ Required Properties:
> - compatible, one of:
> "x-powers,axp209-battery-power-supply"
> "x-powers,axp221-battery-power-supply"
> + "x-powers,axp813-battery-power-supply"
>
> -This node is a subnode of the axp20x/axp22x PMIC.
> +This node is a subnode of its respective PMIC DT node.
>
> -The AXP20X and AXP22X can read the battery voltage, charge and discharge
> -currents of the battery by reading ADC channels from the AXP20X/AXP22X
> -ADC.
> +The supported devices can read the battery voltage, charge and discharge
> +currents of the battery by reading ADC channels from the ADC.
>
> Example:
>
> --
> git-series 0.9.1
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v5 5/6] power: supply: axp20x_battery: add support for AXP813
2018-02-28 10:35 [PATCH v5 0/6] add support for AXP813 ADC and battery power supply Quentin Schulz
` (3 preceding siblings ...)
2018-02-28 10:35 ` [PATCH v5 4/6] dt-bindings: power: supply: axp20x: add AXP813 battery DT binding Quentin Schulz
@ 2018-02-28 10:36 ` Quentin Schulz
2018-03-09 16:09 ` Sebastian Reichel
2018-02-28 10:36 ` [PATCH v5 6/6] mfd: axp20x: add battery power supply cell " Quentin Schulz
5 siblings, 1 reply; 14+ messages in thread
From: Quentin Schulz @ 2018-02-28 10:36 UTC (permalink / raw)
To: sre, robh+dt, mark.rutland, wens
Cc: maxime.ripard, lee.jones, linux-pm, devicetree, linux-kernel,
thomas.petazzoni, linux-sunxi, Quentin Schulz
The X-Powers AXP813 PMIC has got some slight differences from
AXP20X/AXP22X PMICs:
- the maximum voltage supplied by the PMIC is 4.35 instead of 4.36/4.24
for AXP20X/AXP22X,
- the constant charge current formula is different,
It also has a bit to tell whether the battery percentage returned by the
PMIC is valid.
Signed-off-by: Quentin Schulz <quentin.schulz@bootlin.com>
Reviewed-by: Chen-Yu Tsai <wens@csie.org>
---
drivers/power/supply/axp20x_battery.c | 42 ++++++++++++++++++++++++++++-
1 file changed, 42 insertions(+)
diff --git a/drivers/power/supply/axp20x_battery.c b/drivers/power/supply/axp20x_battery.c
index 04a0d91..4f69c0e 100644
--- a/drivers/power/supply/axp20x_battery.c
+++ b/drivers/power/supply/axp20x_battery.c
@@ -49,6 +49,8 @@
#define AXP22X_CHRG_CTRL1_TGT_4_22V (1 << 5)
#define AXP22X_CHRG_CTRL1_TGT_4_24V (3 << 5)
+#define AXP813_CHRG_CTRL1_TGT_4_35V (3 << 5)
+
#define AXP20X_CHRG_CTRL1_TGT_CURR GENMASK(3, 0)
#define AXP20X_V_OFF_MASK GENMASK(2, 0)
@@ -133,6 +135,35 @@ static int axp22x_battery_get_max_voltage(struct axp20x_batt_ps *axp20x_batt,
return 0;
}
+static int axp813_battery_get_max_voltage(struct axp20x_batt_ps *axp20x_batt,
+ int *val)
+{
+ int ret, reg;
+
+ ret = regmap_read(axp20x_batt->regmap, AXP20X_CHRG_CTRL1, ®);
+ if (ret)
+ return ret;
+
+ switch (reg & AXP20X_CHRG_CTRL1_TGT_VOLT) {
+ case AXP20X_CHRG_CTRL1_TGT_4_1V:
+ *val = 4100000;
+ break;
+ case AXP20X_CHRG_CTRL1_TGT_4_15V:
+ *val = 4150000;
+ break;
+ case AXP20X_CHRG_CTRL1_TGT_4_2V:
+ *val = 4200000;
+ break;
+ case AXP813_CHRG_CTRL1_TGT_4_35V:
+ *val = 4350000;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
static int axp20x_get_constant_charge_current(struct axp20x_batt_ps *axp,
int *val)
{
@@ -491,6 +522,14 @@ static const struct axp_data axp221_data = {
.set_max_voltage = axp22x_battery_set_max_voltage,
};
+static const struct axp_data axp813_data = {
+ .ccc_scale = 200000,
+ .ccc_offset = 200000,
+ .has_fg_valid = true,
+ .get_max_voltage = axp813_battery_get_max_voltage,
+ .set_max_voltage = axp20x_battery_set_max_voltage,
+};
+
static const struct of_device_id axp20x_battery_ps_id[] = {
{
.compatible = "x-powers,axp209-battery-power-supply",
@@ -498,6 +537,9 @@ static const struct of_device_id axp20x_battery_ps_id[] = {
}, {
.compatible = "x-powers,axp221-battery-power-supply",
.data = (void *)&axp221_data,
+ }, {
+ .compatible = "x-powers,axp813-battery-power-supply",
+ .data = (void *)&axp813_data,
}, { /* sentinel */ },
};
MODULE_DEVICE_TABLE(of, axp20x_battery_ps_id);
--
git-series 0.9.1
^ permalink raw reply [flat|nested] 14+ messages in thread* Re: [PATCH v5 5/6] power: supply: axp20x_battery: add support for AXP813
2018-02-28 10:36 ` [PATCH v5 5/6] power: supply: axp20x_battery: add support for AXP813 Quentin Schulz
@ 2018-03-09 16:09 ` Sebastian Reichel
0 siblings, 0 replies; 14+ messages in thread
From: Sebastian Reichel @ 2018-03-09 16:09 UTC (permalink / raw)
To: Quentin Schulz
Cc: robh+dt, mark.rutland, wens, maxime.ripard, lee.jones, linux-pm,
devicetree, linux-kernel, thomas.petazzoni, linux-sunxi
[-- Attachment #1: Type: text/plain, Size: 3012 bytes --]
Hi,
On Wed, Feb 28, 2018 at 11:36:00AM +0100, Quentin Schulz wrote:
> The X-Powers AXP813 PMIC has got some slight differences from
> AXP20X/AXP22X PMICs:
> - the maximum voltage supplied by the PMIC is 4.35 instead of 4.36/4.24
> for AXP20X/AXP22X,
> - the constant charge current formula is different,
>
> It also has a bit to tell whether the battery percentage returned by the
> PMIC is valid.
>
> Signed-off-by: Quentin Schulz <quentin.schulz@bootlin.com>
> Reviewed-by: Chen-Yu Tsai <wens@csie.org>
> ---
Thanks, queued.
-- Sebastian
> drivers/power/supply/axp20x_battery.c | 42 ++++++++++++++++++++++++++++-
> 1 file changed, 42 insertions(+)
>
> diff --git a/drivers/power/supply/axp20x_battery.c b/drivers/power/supply/axp20x_battery.c
> index 04a0d91..4f69c0e 100644
> --- a/drivers/power/supply/axp20x_battery.c
> +++ b/drivers/power/supply/axp20x_battery.c
> @@ -49,6 +49,8 @@
> #define AXP22X_CHRG_CTRL1_TGT_4_22V (1 << 5)
> #define AXP22X_CHRG_CTRL1_TGT_4_24V (3 << 5)
>
> +#define AXP813_CHRG_CTRL1_TGT_4_35V (3 << 5)
> +
> #define AXP20X_CHRG_CTRL1_TGT_CURR GENMASK(3, 0)
>
> #define AXP20X_V_OFF_MASK GENMASK(2, 0)
> @@ -133,6 +135,35 @@ static int axp22x_battery_get_max_voltage(struct axp20x_batt_ps *axp20x_batt,
> return 0;
> }
>
> +static int axp813_battery_get_max_voltage(struct axp20x_batt_ps *axp20x_batt,
> + int *val)
> +{
> + int ret, reg;
> +
> + ret = regmap_read(axp20x_batt->regmap, AXP20X_CHRG_CTRL1, ®);
> + if (ret)
> + return ret;
> +
> + switch (reg & AXP20X_CHRG_CTRL1_TGT_VOLT) {
> + case AXP20X_CHRG_CTRL1_TGT_4_1V:
> + *val = 4100000;
> + break;
> + case AXP20X_CHRG_CTRL1_TGT_4_15V:
> + *val = 4150000;
> + break;
> + case AXP20X_CHRG_CTRL1_TGT_4_2V:
> + *val = 4200000;
> + break;
> + case AXP813_CHRG_CTRL1_TGT_4_35V:
> + *val = 4350000;
> + break;
> + default:
> + return -EINVAL;
> + }
> +
> + return 0;
> +}
> +
> static int axp20x_get_constant_charge_current(struct axp20x_batt_ps *axp,
> int *val)
> {
> @@ -491,6 +522,14 @@ static const struct axp_data axp221_data = {
> .set_max_voltage = axp22x_battery_set_max_voltage,
> };
>
> +static const struct axp_data axp813_data = {
> + .ccc_scale = 200000,
> + .ccc_offset = 200000,
> + .has_fg_valid = true,
> + .get_max_voltage = axp813_battery_get_max_voltage,
> + .set_max_voltage = axp20x_battery_set_max_voltage,
> +};
> +
> static const struct of_device_id axp20x_battery_ps_id[] = {
> {
> .compatible = "x-powers,axp209-battery-power-supply",
> @@ -498,6 +537,9 @@ static const struct of_device_id axp20x_battery_ps_id[] = {
> }, {
> .compatible = "x-powers,axp221-battery-power-supply",
> .data = (void *)&axp221_data,
> + }, {
> + .compatible = "x-powers,axp813-battery-power-supply",
> + .data = (void *)&axp813_data,
> }, { /* sentinel */ },
> };
> MODULE_DEVICE_TABLE(of, axp20x_battery_ps_id);
> --
> git-series 0.9.1
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v5 6/6] mfd: axp20x: add battery power supply cell for AXP813
2018-02-28 10:35 [PATCH v5 0/6] add support for AXP813 ADC and battery power supply Quentin Schulz
` (4 preceding siblings ...)
2018-02-28 10:36 ` [PATCH v5 5/6] power: supply: axp20x_battery: add support for AXP813 Quentin Schulz
@ 2018-02-28 10:36 ` Quentin Schulz
2018-03-07 16:12 ` Lee Jones
5 siblings, 1 reply; 14+ messages in thread
From: Quentin Schulz @ 2018-02-28 10:36 UTC (permalink / raw)
To: sre, robh+dt, mark.rutland, wens
Cc: maxime.ripard, lee.jones, linux-pm, devicetree, linux-kernel,
thomas.petazzoni, linux-sunxi, Quentin Schulz
As axp20x-battery-power-supply now supports AXP813, add a cell for it.
Signed-off-by: Quentin Schulz <quentin.schulz@bootlin.com>
Acked-for-MFD-by: Lee Jones <lee.jones@linaro.org>
Reviewed-by: Chen-Yu Tsai <wens@csie.org>
---
drivers/mfd/axp20x.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
index e5516aa..aaf2acb 100644
--- a/drivers/mfd/axp20x.c
+++ b/drivers/mfd/axp20x.c
@@ -888,6 +888,9 @@ static struct mfd_cell axp813_cells[] = {
}, {
.name = "axp813-adc",
.of_compatible = "x-powers,axp813-adc",
+ }, {
+ .name = "axp20x-battery-power-supply",
+ .of_compatible = "x-powers,axp813-battery-power-supply",
},
};
--
git-series 0.9.1
^ permalink raw reply [flat|nested] 14+ messages in thread* Re: [PATCH v5 6/6] mfd: axp20x: add battery power supply cell for AXP813
2018-02-28 10:36 ` [PATCH v5 6/6] mfd: axp20x: add battery power supply cell " Quentin Schulz
@ 2018-03-07 16:12 ` Lee Jones
0 siblings, 0 replies; 14+ messages in thread
From: Lee Jones @ 2018-03-07 16:12 UTC (permalink / raw)
To: Quentin Schulz
Cc: sre, robh+dt, mark.rutland, wens, maxime.ripard, linux-pm,
devicetree, linux-kernel, thomas.petazzoni, linux-sunxi
On Wed, 28 Feb 2018, Quentin Schulz wrote:
> As axp20x-battery-power-supply now supports AXP813, add a cell for it.
>
> Signed-off-by: Quentin Schulz <quentin.schulz@bootlin.com>
> Acked-for-MFD-by: Lee Jones <lee.jones@linaro.org>
> Reviewed-by: Chen-Yu Tsai <wens@csie.org>
> ---
> drivers/mfd/axp20x.c | 3 +++
> 1 file changed, 3 insertions(+)
Applied, thanks.
--
Lee Jones
Linaro Services Technical Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog
^ permalink raw reply [flat|nested] 14+ messages in thread