2018-10-08 18:22:49

by Oskari Lemmelä

[permalink] [raw]
Subject: [PATCH v3 0/7] AXP8x3 AC and battery power supply support

AXP813 AC power supply support with input current and
voltage limiting support.

AXP803 AC and battery power supply support.

Changes in v3:
* Reorder ac_power_supply DT node
* Rename axp20x_ac_power_set_property function
* Split mfd commit

Changes in v2:
* Reuse axp813 compatibles for axp803
* Refactor axp20x_ac_power.c

Oskari Lemmela (7):
dt-bindings: power: supply: axp20x: add AXP813 AC power DT binding
ARM: dts: axp81x: add AC power supply subnode
arm64: dts: allwinner: axp803: add AC and battery power supplies
arm64: dts: allwinner: a64: sopine: enable power supplies
power: supply: add AC power supply driver for AXP813
mfd: axp20x: Add AC power supply cell for AXP813
mfd: axp20x: Add supported cells for AXP803

.../bindings/power/supply/axp20x_ac_power.txt | 3 +
arch/arm/boot/dts/axp81x.dtsi | 5 +
arch/arm64/boot/dts/allwinner/axp803.dtsi | 31 +++++++
.../allwinner/sun50i-a64-sopine-baseboard.dts | 8 ++
drivers/mfd/axp20x.c | 22 ++++-
drivers/power/supply/axp20x_ac_power.c | 92 +++++++++++++++++++
include/linux/mfd/axp20x.h | 1 +
7 files changed, 161 insertions(+), 1 deletion(-)

--
2.17.1



2018-10-08 18:20:32

by Oskari Lemmelä

[permalink] [raw]
Subject: [PATCH v3 7/7] mfd: axp20x: Add supported cells for AXP803

AXP803 is compatible with AXP813.
Adding cells for GPIO, ADC, AC and battery power supplies.

Signed-off-by: Oskari Lemmela <[email protected]>
---
drivers/mfd/axp20x.c | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)

diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
index 1508d9113126..4befe474b165 100644
--- a/drivers/mfd/axp20x.c
+++ b/drivers/mfd/axp20x.c
@@ -731,8 +731,23 @@ static const struct mfd_cell axp803_cells[] = {
.name = "axp221-pek",
.num_resources = ARRAY_SIZE(axp803_pek_resources),
.resources = axp803_pek_resources,
+ }, {
+ .name = "axp20x-regulator",
+ }, {
+ .name = "axp20x-gpio",
+ .of_compatible = "x-powers,axp813-gpio",
+ }, {
+ .name = "axp813-adc",
+ .of_compatible = "x-powers,axp813-adc",
+ }, {
+ .name = "axp20x-battery-power-supply",
+ .of_compatible = "x-powers,axp813-battery-power-supply",
+ }, {
+ .name = "axp20x-ac-power-supply",
+ .of_compatible = "x-powers,axp813-ac-power-supply",
+ .num_resources = ARRAY_SIZE(axp20x_ac_power_supply_resources),
+ .resources = axp20x_ac_power_supply_resources,
},
- { .name = "axp20x-regulator" },
};

static const struct mfd_cell axp806_self_working_cells[] = {
--
2.17.1


2018-10-08 18:20:41

by Oskari Lemmelä

[permalink] [raw]
Subject: [PATCH v3 6/7] mfd: axp20x: Add AC power supply cell for AXP813

As axp20x-ac-power-supply now supports AXP813, add a cell for it.

Signed-off-by: Oskari Lemmela <[email protected]>
---
drivers/mfd/axp20x.c | 5 +++++
1 file changed, 5 insertions(+)

diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
index 0be511dd93d0..1508d9113126 100644
--- a/drivers/mfd/axp20x.c
+++ b/drivers/mfd/axp20x.c
@@ -778,6 +778,11 @@ static const struct mfd_cell axp813_cells[] = {
}, {
.name = "axp20x-battery-power-supply",
.of_compatible = "x-powers,axp813-battery-power-supply",
+ }, {
+ .name = "axp20x-ac-power-supply",
+ .of_compatible = "x-powers,axp813-ac-power-supply",
+ .num_resources = ARRAY_SIZE(axp20x_ac_power_supply_resources),
+ .resources = axp20x_ac_power_supply_resources,
},
};

--
2.17.1


2018-10-08 18:20:48

by Oskari Lemmelä

[permalink] [raw]
Subject: [PATCH v3 5/7] power: supply: add AC power supply driver for AXP813

AXP813 and AXP803 PMICs can control input current and
minimum voltage.

Both of these values are configurable.

Signed-off-by: Oskari Lemmela <[email protected]>
Reviewed-by: Quentin Schulz <[email protected]>
---
drivers/power/supply/axp20x_ac_power.c | 92 ++++++++++++++++++++++++++
include/linux/mfd/axp20x.h | 1 +
2 files changed, 93 insertions(+)

diff --git a/drivers/power/supply/axp20x_ac_power.c b/drivers/power/supply/axp20x_ac_power.c
index 0771f951b11f..059a97d6e14c 100644
--- a/drivers/power/supply/axp20x_ac_power.c
+++ b/drivers/power/supply/axp20x_ac_power.c
@@ -27,6 +27,16 @@
#define AXP20X_PWR_STATUS_ACIN_PRESENT BIT(7)
#define AXP20X_PWR_STATUS_ACIN_AVAIL BIT(6)

+#define AXP813_VHOLD_MASK GENMASK(5, 3)
+#define AXP813_VHOLD_UV_TO_BIT(x) ((((x) / 100000) - 40) << 3)
+#define AXP813_VHOLD_REG_TO_UV(x) \
+ (((((x) & AXP813_VHOLD_MASK) >> 3) + 40) * 100000)
+
+#define AXP813_CURR_LIMIT_MASK GENMASK(2, 0)
+#define AXP813_CURR_LIMIT_UA_TO_BIT(x) (((x) / 500000) - 3)
+#define AXP813_CURR_LIMIT_REG_TO_UA(x) \
+ ((((x) & AXP813_CURR_LIMIT_MASK) + 3) * 500000)
+
#define DRVNAME "axp20x-ac-power-supply"

struct axp20x_ac_power {
@@ -102,6 +112,55 @@ static int axp20x_ac_power_get_property(struct power_supply *psy,

return 0;

+ case POWER_SUPPLY_PROP_VOLTAGE_MIN:
+ ret = regmap_read(power->regmap, AXP813_ACIN_PATH_CTRL, &reg);
+ if (ret)
+ return ret;
+
+ val->intval = AXP813_VHOLD_REG_TO_UV(reg);
+
+ return 0;
+
+ case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
+ ret = regmap_read(power->regmap, AXP813_ACIN_PATH_CTRL, &reg);
+ if (ret)
+ return ret;
+
+ val->intval = AXP813_CURR_LIMIT_REG_TO_UA(reg);
+
+ return 0;
+
+ default:
+ return -EINVAL;
+ }
+
+ return -EINVAL;
+}
+
+static int axp813_ac_power_set_property(struct power_supply *psy,
+ enum power_supply_property psp,
+ const union power_supply_propval *val)
+{
+ struct axp20x_ac_power *power = power_supply_get_drvdata(psy);
+
+ switch (psp) {
+ case POWER_SUPPLY_PROP_VOLTAGE_MIN:
+ if (val->intval < 4000000 || val->intval > 4700000)
+ return -EINVAL;
+
+ return regmap_update_bits(power->regmap, AXP813_ACIN_PATH_CTRL,
+ AXP813_VHOLD_MASK,
+ AXP813_VHOLD_UV_TO_BIT(val->intval));
+
+ case POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT:
+ if (val->intval < 1500000 || val->intval > 4000000)
+ return -EINVAL;
+
+ return regmap_update_bits(power->regmap, AXP813_ACIN_PATH_CTRL,
+ AXP813_CURR_LIMIT_MASK,
+ AXP813_CURR_LIMIT_UA_TO_BIT
+ (val->intval));
+
default:
return -EINVAL;
}
@@ -109,6 +168,13 @@ static int axp20x_ac_power_get_property(struct power_supply *psy,
return -EINVAL;
}

+static int axp813_ac_power_prop_writeable(struct power_supply *psy,
+ enum power_supply_property psp)
+{
+ return psp == POWER_SUPPLY_PROP_VOLTAGE_MIN ||
+ psp == POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT;
+}
+
static enum power_supply_property axp20x_ac_power_properties[] = {
POWER_SUPPLY_PROP_HEALTH,
POWER_SUPPLY_PROP_PRESENT,
@@ -123,6 +189,14 @@ static enum power_supply_property axp22x_ac_power_properties[] = {
POWER_SUPPLY_PROP_ONLINE,
};

+static enum power_supply_property axp813_ac_power_properties[] = {
+ POWER_SUPPLY_PROP_HEALTH,
+ POWER_SUPPLY_PROP_PRESENT,
+ POWER_SUPPLY_PROP_ONLINE,
+ POWER_SUPPLY_PROP_VOLTAGE_MIN,
+ POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT,
+};
+
static const struct power_supply_desc axp20x_ac_power_desc = {
.name = "axp20x-ac",
.type = POWER_SUPPLY_TYPE_MAINS,
@@ -139,6 +213,16 @@ static const struct power_supply_desc axp22x_ac_power_desc = {
.get_property = axp20x_ac_power_get_property,
};

+static const struct power_supply_desc axp813_ac_power_desc = {
+ .name = "axp813-ac",
+ .type = POWER_SUPPLY_TYPE_MAINS,
+ .properties = axp813_ac_power_properties,
+ .num_properties = ARRAY_SIZE(axp813_ac_power_properties),
+ .property_is_writeable = axp813_ac_power_prop_writeable,
+ .get_property = axp20x_ac_power_get_property,
+ .set_property = axp813_ac_power_set_property,
+};
+
struct axp_data {
const struct power_supply_desc *power_desc;
bool acin_adc;
@@ -154,6 +238,11 @@ static const struct axp_data axp22x_data = {
.acin_adc = false,
};

+static const struct axp_data axp813_data = {
+ .power_desc = &axp813_ac_power_desc,
+ .acin_adc = false,
+};
+
static int axp20x_ac_power_probe(struct platform_device *pdev)
{
struct axp20x_dev *axp20x = dev_get_drvdata(pdev->dev.parent);
@@ -234,6 +323,9 @@ static const struct of_device_id axp20x_ac_power_match[] = {
}, {
.compatible = "x-powers,axp221-ac-power-supply",
.data = &axp22x_data,
+ }, {
+ .compatible = "x-powers,axp813-ac-power-supply",
+ .data = &axp813_data,
}, { /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, axp20x_ac_power_match);
diff --git a/include/linux/mfd/axp20x.h b/include/linux/mfd/axp20x.h
index 517e60eecbcb..2302b620d238 100644
--- a/include/linux/mfd/axp20x.h
+++ b/include/linux/mfd/axp20x.h
@@ -266,6 +266,7 @@ enum axp20x_variants {
#define AXP288_RT_BATT_V_H 0xa0
#define AXP288_RT_BATT_V_L 0xa1

+#define AXP813_ACIN_PATH_CTRL 0x3a
#define AXP813_ADC_RATE 0x85

/* Fuel Gauge */
--
2.17.1


2018-10-08 18:21:02

by Oskari Lemmelä

[permalink] [raw]
Subject: [PATCH v3 4/7] arm64: dts: allwinner: a64: sopine: enable power supplies

Sopine baseboard have ACIN and battery connectors.

Signed-off-by: Oskari Lemmela <[email protected]>
---
.../boot/dts/allwinner/sun50i-a64-sopine-baseboard.dts | 8 ++++++++
1 file changed, 8 insertions(+)

diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-sopine-baseboard.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-sopine-baseboard.dts
index c21f2331add6..335cf2263d19 100644
--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-sopine-baseboard.dts
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-sopine-baseboard.dts
@@ -69,6 +69,14 @@
};
};

+&ac_power_supply {
+ status = "okay";
+};
+
+&battery_power_supply {
+ status = "okay";
+};
+
&ehci0 {
status = "okay";
};
--
2.17.1


2018-10-08 18:21:26

by Oskari Lemmelä

[permalink] [raw]
Subject: [PATCH v3 3/7] arm64: dts: allwinner: axp803: add AC and battery power supplies

AXP803 is compatible with AXP813. Add DT nodes ADC, GPIO,
AC and battery power supplies.

Signed-off-by: Oskari Lemmela <[email protected]>
---
arch/arm64/boot/dts/allwinner/axp803.dtsi | 31 +++++++++++++++++++++++
1 file changed, 31 insertions(+)

diff --git a/arch/arm64/boot/dts/allwinner/axp803.dtsi b/arch/arm64/boot/dts/allwinner/axp803.dtsi
index e5eae8bafc42..128177178615 100644
--- a/arch/arm64/boot/dts/allwinner/axp803.dtsi
+++ b/arch/arm64/boot/dts/allwinner/axp803.dtsi
@@ -49,6 +49,37 @@
interrupt-controller;
#interrupt-cells = <1>;

+ ac_power_supply: ac-power-supply {
+ compatible = "x-powers,axp813-ac-power-supply";
+ status = "disabled";
+ };
+
+ axp_adc: adc {
+ compatible = "x-powers,axp813-adc";
+ #io-channel-cells = <1>;
+ };
+
+ axp_gpio: gpio {
+ compatible = "x-powers,axp813-gpio";
+ gpio-controller;
+ #gpio-cells = <2>;
+
+ gpio0_ldo: gpio0-ldo {
+ pins = "GPIO0";
+ function = "ldo";
+ };
+
+ gpio1_ldo: gpio1-ldo {
+ pins = "GPIO1";
+ function = "ldo";
+ };
+ };
+
+ battery_power_supply: battery-power-supply {
+ compatible = "x-powers,axp813-battery-power-supply";
+ status = "disabled";
+ };
+
regulators {
/* Default work frequency for buck regulators */
x-powers,dcdc-freq = <3000>;
--
2.17.1


2018-10-08 18:21:50

by Oskari Lemmelä

[permalink] [raw]
Subject: [PATCH v3 2/7] ARM: dts: axp81x: add AC power supply subnode

Add AC power supply subnode for AXP81X PMIC.

Signed-off-by: Oskari Lemmela <[email protected]>
---
arch/arm/boot/dts/axp81x.dtsi | 5 +++++
1 file changed, 5 insertions(+)

diff --git a/arch/arm/boot/dts/axp81x.dtsi b/arch/arm/boot/dts/axp81x.dtsi
index 043c717dcef1..bd83962d3627 100644
--- a/arch/arm/boot/dts/axp81x.dtsi
+++ b/arch/arm/boot/dts/axp81x.dtsi
@@ -48,6 +48,11 @@
interrupt-controller;
#interrupt-cells = <1>;

+ ac_power_supply: ac-power-supply {
+ compatible = "x-powers,axp813-ac-power-supply";
+ status = "disabled";
+ };
+
axp_adc: adc {
compatible = "x-powers,axp813-adc";
#io-channel-cells = <1>;
--
2.17.1


2018-10-08 18:22:19

by Oskari Lemmelä

[permalink] [raw]
Subject: [PATCH v3 1/7] dt-bindings: power: supply: axp20x: add AXP813 AC power DT binding

The AXP803/AXP813 AC power supply can limit input current and voltage.

Signed-off-by: Oskari Lemmela <[email protected]>
---
.../devicetree/bindings/power/supply/axp20x_ac_power.txt | 3 +++
1 file changed, 3 insertions(+)

diff --git a/Documentation/devicetree/bindings/power/supply/axp20x_ac_power.txt b/Documentation/devicetree/bindings/power/supply/axp20x_ac_power.txt
index 826e8a879121..7a1fb532abe5 100644
--- a/Documentation/devicetree/bindings/power/supply/axp20x_ac_power.txt
+++ b/Documentation/devicetree/bindings/power/supply/axp20x_ac_power.txt
@@ -4,6 +4,7 @@ Required Properties:
- compatible: One of:
"x-powers,axp202-ac-power-supply"
"x-powers,axp221-ac-power-supply"
+ "x-powers,axp813-ac-power-supply"

This node is a subnode of the axp20x PMIC.

@@ -13,6 +14,8 @@ reading ADC channels from the AXP20X ADC.
The AXP22X is only able to tell if an AC power supply is present and
usable.

+AXP813/AXP803 are able to limit current and supply voltage
+
Example:

&axp209 {
--
2.17.1


2018-10-11 08:21:17

by Chen-Yu Tsai

[permalink] [raw]
Subject: Re: [PATCH v3 7/7] mfd: axp20x: Add supported cells for AXP803

On Tue, Oct 9, 2018 at 2:20 AM Oskari Lemmela <[email protected]> wrote:
>
> AXP803 is compatible with AXP813.
> Adding cells for GPIO, ADC, AC and battery power supplies.
>
> Signed-off-by: Oskari Lemmela <[email protected]>
> ---
> drivers/mfd/axp20x.c | 17 ++++++++++++++++-
> 1 file changed, 16 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
> index 1508d9113126..4befe474b165 100644
> --- a/drivers/mfd/axp20x.c
> +++ b/drivers/mfd/axp20x.c
> @@ -731,8 +731,23 @@ static const struct mfd_cell axp803_cells[] = {
> .name = "axp221-pek",
> .num_resources = ARRAY_SIZE(axp803_pek_resources),
> .resources = axp803_pek_resources,
> + }, {
> + .name = "axp20x-regulator",

Please keep this as one line as before. This was requested by the MFD
maintainer.

> + }, {
> + .name = "axp20x-gpio",
> + .of_compatible = "x-powers,axp813-gpio",

You might want to put the GPIO cell near the top of the list, so any other
users, such as the ADC and regulator cells, will probe after it.

> + }, {
> + .name = "axp813-adc",
> + .of_compatible = "x-powers,axp813-adc",
> + }, {
> + .name = "axp20x-battery-power-supply",
> + .of_compatible = "x-powers,axp813-battery-power-supply",
> + }, {
> + .name = "axp20x-ac-power-supply",
> + .of_compatible = "x-powers,axp813-ac-power-supply",
> + .num_resources = ARRAY_SIZE(axp20x_ac_power_supply_resources),
> + .resources = axp20x_ac_power_supply_resources,

Please use the same indentation.

Regards
ChenYu

> },
> - { .name = "axp20x-regulator" },
> };
>
> static const struct mfd_cell axp806_self_working_cells[] = {
> --
> 2.17.1
>

2018-10-12 15:47:10

by Rob Herring (Arm)

[permalink] [raw]
Subject: Re: [PATCH v3 1/7] dt-bindings: power: supply: axp20x: add AXP813 AC power DT binding

On Mon, 8 Oct 2018 21:19:02 +0300, Oskari Lemmela wrote:
> The AXP803/AXP813 AC power supply can limit input current and voltage.
>
> Signed-off-by: Oskari Lemmela <[email protected]>
> ---
> .../devicetree/bindings/power/supply/axp20x_ac_power.txt | 3 +++
> 1 file changed, 3 insertions(+)
>

Reviewed-by: Rob Herring <[email protected]>

2018-10-12 19:33:07

by Quentin Schulz

[permalink] [raw]
Subject: Re: [PATCH v3 1/7] dt-bindings: power: supply: axp20x: add AXP813 AC power DT binding

Hi Oskari,

On Mon, Oct 08, 2018 at 09:19:02PM +0300, Oskari Lemmela wrote:
> The AXP803/AXP813 AC power supply can limit input current and voltage.
>

Reviewed-by: Quentin Schulz <[email protected]>

Thanks,
Quentin


Attachments:
(No filename) (237.00 B)
signature.asc (849.00 B)
Download all attachments

2018-10-12 19:34:34

by Quentin Schulz

[permalink] [raw]
Subject: Re: [PATCH v3 3/7] arm64: dts: allwinner: axp803: add AC and battery power supplies

Hi Oskari,

On Mon, Oct 08, 2018 at 09:19:04PM +0300, Oskari Lemmela wrote:
> AXP803 is compatible with AXP813. Add DT nodes ADC, GPIO,
> AC and battery power supplies.
>

Reviewed-by: Quentin Schulz <[email protected]>

Thanks,
Quentin


Attachments:
(No filename) (258.00 B)
signature.asc (849.00 B)
Download all attachments

2018-10-12 19:34:48

by Quentin Schulz

[permalink] [raw]
Subject: Re: [PATCH v3 2/7] ARM: dts: axp81x: add AC power supply subnode

Hi Oskari,

On Mon, Oct 08, 2018 at 09:19:03PM +0300, Oskari Lemmela wrote:
> Add AC power supply subnode for AXP81X PMIC.
>

Reviewed-by: Quentin Schulz <[email protected]>

Thanks,
Quentin


Attachments:
(No filename) (211.00 B)
signature.asc (849.00 B)
Download all attachments

2018-10-12 19:36:19

by Quentin Schulz

[permalink] [raw]
Subject: Re: [PATCH v3 4/7] arm64: dts: allwinner: a64: sopine: enable power supplies

Hi Oskari,

On Mon, Oct 08, 2018 at 09:19:05PM +0300, Oskari Lemmela wrote:
> Sopine baseboard have ACIN and battery connectors.
>

Reviewed-by: Quentin Schulz <[email protected]>

Thanks,
Quentin


Attachments:
(No filename) (217.00 B)
signature.asc (849.00 B)
Download all attachments

2018-10-12 19:37:55

by Quentin Schulz

[permalink] [raw]
Subject: Re: [PATCH v3 6/7] mfd: axp20x: Add AC power supply cell for AXP813

Hi Oskari,

On Mon, Oct 08, 2018 at 09:19:07PM +0300, Oskari Lemmela wrote:
> As axp20x-ac-power-supply now supports AXP813, add a cell for it.
>

Reviewed-by: Quentin Schulz <[email protected]>

Thanks,
Quentin


Attachments:
(No filename) (232.00 B)
signature.asc (849.00 B)
Download all attachments