* [PATCH 1/5] dt-bindings: mfd: x-powers,axp152: Document AXP323
2024-10-03 11:14 [PATCH 0/5] regulator: add X-Powers AXP323 support Andre Przywara
@ 2024-10-03 11:14 ` Andre Przywara
2024-10-03 15:12 ` Chen-Yu Tsai
2024-10-03 15:49 ` Rob Herring (Arm)
2024-10-03 11:14 ` [PATCH 2/5] mfd: axp20x: ensure relationship between IDs and model names Andre Przywara
` (3 subsequent siblings)
4 siblings, 2 replies; 16+ messages in thread
From: Andre Przywara @ 2024-10-03 11:14 UTC (permalink / raw)
To: Lee Jones, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Chen-Yu Tsai, Liam Girdwood, Mark Brown
Cc: devicetree, linux-sunxi, linux-kernel, Martin Botka, Chris Morgan
The X-Powers AXP323 is a PMIC used on some newer Allwinner devices.
It is almost the same as the AXP313, but supports dual-phasing the first
two DC/DC converters. A pure AXP313 driver wouldn't know about this, and
might turn the linked DCDC2 regulator off, as it does not seem to be
used. This makes the AXP323 incompatible to the AXP313a.
Add the new compatible string, and treat it like the AXP313a.
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
---
Documentation/devicetree/bindings/mfd/x-powers,axp152.yaml | 3 +++
1 file changed, 3 insertions(+)
diff --git a/Documentation/devicetree/bindings/mfd/x-powers,axp152.yaml b/Documentation/devicetree/bindings/mfd/x-powers,axp152.yaml
index 14ab367fc887..3f7661bdd202 100644
--- a/Documentation/devicetree/bindings/mfd/x-powers,axp152.yaml
+++ b/Documentation/devicetree/bindings/mfd/x-powers,axp152.yaml
@@ -71,6 +71,7 @@ allOf:
- x-powers,axp15060
- x-powers,axp305
- x-powers,axp313a
+ - x-powers,axp323
then:
required:
@@ -82,6 +83,7 @@ allOf:
contains:
enum:
- x-powers,axp313a
+ - x-powers,axp323
- x-powers,axp15060
- x-powers,axp717
@@ -100,6 +102,7 @@ properties:
- x-powers,axp221
- x-powers,axp223
- x-powers,axp313a
+ - x-powers,axp323
- x-powers,axp717
- x-powers,axp803
- x-powers,axp806
--
2.25.1
^ permalink raw reply related [flat|nested] 16+ messages in thread* Re: [PATCH 1/5] dt-bindings: mfd: x-powers,axp152: Document AXP323
2024-10-03 11:14 ` [PATCH 1/5] dt-bindings: mfd: x-powers,axp152: Document AXP323 Andre Przywara
@ 2024-10-03 15:12 ` Chen-Yu Tsai
2024-10-03 15:49 ` Rob Herring (Arm)
1 sibling, 0 replies; 16+ messages in thread
From: Chen-Yu Tsai @ 2024-10-03 15:12 UTC (permalink / raw)
To: Andre Przywara
Cc: Lee Jones, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Liam Girdwood, Mark Brown, devicetree, linux-sunxi, linux-kernel,
Martin Botka, Chris Morgan
On Thu, Oct 3, 2024 at 7:15 PM Andre Przywara <andre.przywara@arm.com> wrote:
>
> The X-Powers AXP323 is a PMIC used on some newer Allwinner devices.
> It is almost the same as the AXP313, but supports dual-phasing the first
> two DC/DC converters. A pure AXP313 driver wouldn't know about this, and
> might turn the linked DCDC2 regulator off, as it does not seem to be
> used. This makes the AXP323 incompatible to the AXP313a.
>
> Add the new compatible string, and treat it like the AXP313a.
>
> Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Reviewed-by: Chen-Yu Tsai <wens@csie.org>
> ---
> Documentation/devicetree/bindings/mfd/x-powers,axp152.yaml | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/Documentation/devicetree/bindings/mfd/x-powers,axp152.yaml b/Documentation/devicetree/bindings/mfd/x-powers,axp152.yaml
> index 14ab367fc887..3f7661bdd202 100644
> --- a/Documentation/devicetree/bindings/mfd/x-powers,axp152.yaml
> +++ b/Documentation/devicetree/bindings/mfd/x-powers,axp152.yaml
> @@ -71,6 +71,7 @@ allOf:
> - x-powers,axp15060
> - x-powers,axp305
> - x-powers,axp313a
> + - x-powers,axp323
>
> then:
> required:
> @@ -82,6 +83,7 @@ allOf:
> contains:
> enum:
> - x-powers,axp313a
> + - x-powers,axp323
> - x-powers,axp15060
> - x-powers,axp717
>
> @@ -100,6 +102,7 @@ properties:
> - x-powers,axp221
> - x-powers,axp223
> - x-powers,axp313a
> + - x-powers,axp323
> - x-powers,axp717
> - x-powers,axp803
> - x-powers,axp806
> --
> 2.25.1
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 1/5] dt-bindings: mfd: x-powers,axp152: Document AXP323
2024-10-03 11:14 ` [PATCH 1/5] dt-bindings: mfd: x-powers,axp152: Document AXP323 Andre Przywara
2024-10-03 15:12 ` Chen-Yu Tsai
@ 2024-10-03 15:49 ` Rob Herring (Arm)
1 sibling, 0 replies; 16+ messages in thread
From: Rob Herring (Arm) @ 2024-10-03 15:49 UTC (permalink / raw)
To: Andre Przywara
Cc: Lee Jones, Conor Dooley, linux-sunxi, Chen-Yu Tsai, Liam Girdwood,
Mark Brown, devicetree, Martin Botka, Chris Morgan, linux-kernel,
Krzysztof Kozlowski
On Thu, 03 Oct 2024 12:14:40 +0100, Andre Przywara wrote:
> The X-Powers AXP323 is a PMIC used on some newer Allwinner devices.
> It is almost the same as the AXP313, but supports dual-phasing the first
> two DC/DC converters. A pure AXP313 driver wouldn't know about this, and
> might turn the linked DCDC2 regulator off, as it does not seem to be
> used. This makes the AXP323 incompatible to the AXP313a.
>
> Add the new compatible string, and treat it like the AXP313a.
>
> Signed-off-by: Andre Przywara <andre.przywara@arm.com>
> ---
> Documentation/devicetree/bindings/mfd/x-powers,axp152.yaml | 3 +++
> 1 file changed, 3 insertions(+)
>
Acked-by: Rob Herring (Arm) <robh@kernel.org>
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 2/5] mfd: axp20x: ensure relationship between IDs and model names
2024-10-03 11:14 [PATCH 0/5] regulator: add X-Powers AXP323 support Andre Przywara
2024-10-03 11:14 ` [PATCH 1/5] dt-bindings: mfd: x-powers,axp152: Document AXP323 Andre Przywara
@ 2024-10-03 11:14 ` Andre Przywara
2024-10-03 15:12 ` Chen-Yu Tsai
2024-10-03 11:14 ` [PATCH 3/5] mfd: axp20x: Allow multiple regulators Andre Przywara
` (2 subsequent siblings)
4 siblings, 1 reply; 16+ messages in thread
From: Andre Przywara @ 2024-10-03 11:14 UTC (permalink / raw)
To: Lee Jones, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Chen-Yu Tsai, Liam Girdwood, Mark Brown
Cc: devicetree, linux-sunxi, linux-kernel, Martin Botka, Chris Morgan
At the moment there is an implicit relationship between the AXP model
IDs and the order of the strings in the axp20x_model_names[] array.
This is fragile, and makes adding IDs in the middle error prone.
Make this relationship official by changing the ID type to the actual
enum used, and using indexed initialisers for the string list.
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
---
drivers/mfd/axp20x.c | 30 ++++++++++++++--------------
drivers/regulator/axp20x-regulator.c | 2 +-
include/linux/mfd/axp20x.h | 2 +-
3 files changed, 17 insertions(+), 17 deletions(-)
diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
index 4051551757f2..5ceea359289f 100644
--- a/drivers/mfd/axp20x.c
+++ b/drivers/mfd/axp20x.c
@@ -34,20 +34,20 @@
#define AXP806_REG_ADDR_EXT_ADDR_SLAVE_MODE BIT(4)
static const char * const axp20x_model_names[] = {
- "AXP152",
- "AXP192",
- "AXP202",
- "AXP209",
- "AXP221",
- "AXP223",
- "AXP288",
- "AXP313a",
- "AXP717",
- "AXP803",
- "AXP806",
- "AXP809",
- "AXP813",
- "AXP15060",
+ [AXP152_ID] = "AXP152",
+ [AXP192_ID] = "AXP192",
+ [AXP202_ID] = "AXP202",
+ [AXP209_ID] = "AXP209",
+ [AXP221_ID] = "AXP221",
+ [AXP223_ID] = "AXP223",
+ [AXP288_ID] = "AXP288",
+ [AXP313A_ID] = "AXP313a",
+ [AXP717_ID] = "AXP717",
+ [AXP803_ID] = "AXP803",
+ [AXP806_ID] = "AXP806",
+ [AXP809_ID] = "AXP809",
+ [AXP813_ID] = "AXP813",
+ [AXP15060_ID] = "AXP15060",
};
static const struct regmap_range axp152_writeable_ranges[] = {
@@ -1345,7 +1345,7 @@ int axp20x_match_device(struct axp20x_dev *axp20x)
axp20x->regmap_irq_chip = &axp15060_regmap_irq_chip;
break;
default:
- dev_err(dev, "unsupported AXP20X ID %lu\n", axp20x->variant);
+ dev_err(dev, "unsupported AXP20X ID %u\n", axp20x->variant);
return -EINVAL;
}
diff --git a/drivers/regulator/axp20x-regulator.c b/drivers/regulator/axp20x-regulator.c
index a8e91d9d028b..3ba76dbd0fb9 100644
--- a/drivers/regulator/axp20x-regulator.c
+++ b/drivers/regulator/axp20x-regulator.c
@@ -1597,7 +1597,7 @@ static int axp20x_regulator_probe(struct platform_device *pdev)
nregulators = AXP15060_REG_ID_MAX;
break;
default:
- dev_err(&pdev->dev, "Unsupported AXP variant: %ld\n",
+ dev_err(&pdev->dev, "Unsupported AXP variant: %d\n",
axp20x->variant);
return -EINVAL;
}
diff --git a/include/linux/mfd/axp20x.h b/include/linux/mfd/axp20x.h
index f4dfc1871a95..79ecaaaa2070 100644
--- a/include/linux/mfd/axp20x.h
+++ b/include/linux/mfd/axp20x.h
@@ -959,7 +959,7 @@ struct axp20x_dev {
unsigned long irq_flags;
struct regmap *regmap;
struct regmap_irq_chip_data *regmap_irqc;
- long variant;
+ enum axp20x_variants variant;
int nr_cells;
const struct mfd_cell *cells;
const struct regmap_config *regmap_cfg;
--
2.25.1
^ permalink raw reply related [flat|nested] 16+ messages in thread* Re: [PATCH 2/5] mfd: axp20x: ensure relationship between IDs and model names
2024-10-03 11:14 ` [PATCH 2/5] mfd: axp20x: ensure relationship between IDs and model names Andre Przywara
@ 2024-10-03 15:12 ` Chen-Yu Tsai
0 siblings, 0 replies; 16+ messages in thread
From: Chen-Yu Tsai @ 2024-10-03 15:12 UTC (permalink / raw)
To: Andre Przywara
Cc: Lee Jones, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Liam Girdwood, Mark Brown, devicetree, linux-sunxi, linux-kernel,
Martin Botka, Chris Morgan
On Thu, Oct 3, 2024 at 7:15 PM Andre Przywara <andre.przywara@arm.com> wrote:
>
> At the moment there is an implicit relationship between the AXP model
> IDs and the order of the strings in the axp20x_model_names[] array.
> This is fragile, and makes adding IDs in the middle error prone.
>
> Make this relationship official by changing the ID type to the actual
> enum used, and using indexed initialisers for the string list.
>
> Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Reviewed-by: Chen-Yu Tsai <wens@csie.org>
> ---
> drivers/mfd/axp20x.c | 30 ++++++++++++++--------------
> drivers/regulator/axp20x-regulator.c | 2 +-
> include/linux/mfd/axp20x.h | 2 +-
> 3 files changed, 17 insertions(+), 17 deletions(-)
>
> diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
> index 4051551757f2..5ceea359289f 100644
> --- a/drivers/mfd/axp20x.c
> +++ b/drivers/mfd/axp20x.c
> @@ -34,20 +34,20 @@
> #define AXP806_REG_ADDR_EXT_ADDR_SLAVE_MODE BIT(4)
>
> static const char * const axp20x_model_names[] = {
> - "AXP152",
> - "AXP192",
> - "AXP202",
> - "AXP209",
> - "AXP221",
> - "AXP223",
> - "AXP288",
> - "AXP313a",
> - "AXP717",
> - "AXP803",
> - "AXP806",
> - "AXP809",
> - "AXP813",
> - "AXP15060",
> + [AXP152_ID] = "AXP152",
> + [AXP192_ID] = "AXP192",
> + [AXP202_ID] = "AXP202",
> + [AXP209_ID] = "AXP209",
> + [AXP221_ID] = "AXP221",
> + [AXP223_ID] = "AXP223",
> + [AXP288_ID] = "AXP288",
> + [AXP313A_ID] = "AXP313a",
> + [AXP717_ID] = "AXP717",
> + [AXP803_ID] = "AXP803",
> + [AXP806_ID] = "AXP806",
> + [AXP809_ID] = "AXP809",
> + [AXP813_ID] = "AXP813",
> + [AXP15060_ID] = "AXP15060",
> };
>
> static const struct regmap_range axp152_writeable_ranges[] = {
> @@ -1345,7 +1345,7 @@ int axp20x_match_device(struct axp20x_dev *axp20x)
> axp20x->regmap_irq_chip = &axp15060_regmap_irq_chip;
> break;
> default:
> - dev_err(dev, "unsupported AXP20X ID %lu\n", axp20x->variant);
> + dev_err(dev, "unsupported AXP20X ID %u\n", axp20x->variant);
> return -EINVAL;
> }
>
> diff --git a/drivers/regulator/axp20x-regulator.c b/drivers/regulator/axp20x-regulator.c
> index a8e91d9d028b..3ba76dbd0fb9 100644
> --- a/drivers/regulator/axp20x-regulator.c
> +++ b/drivers/regulator/axp20x-regulator.c
> @@ -1597,7 +1597,7 @@ static int axp20x_regulator_probe(struct platform_device *pdev)
> nregulators = AXP15060_REG_ID_MAX;
> break;
> default:
> - dev_err(&pdev->dev, "Unsupported AXP variant: %ld\n",
> + dev_err(&pdev->dev, "Unsupported AXP variant: %d\n",
> axp20x->variant);
> return -EINVAL;
> }
> diff --git a/include/linux/mfd/axp20x.h b/include/linux/mfd/axp20x.h
> index f4dfc1871a95..79ecaaaa2070 100644
> --- a/include/linux/mfd/axp20x.h
> +++ b/include/linux/mfd/axp20x.h
> @@ -959,7 +959,7 @@ struct axp20x_dev {
> unsigned long irq_flags;
> struct regmap *regmap;
> struct regmap_irq_chip_data *regmap_irqc;
> - long variant;
> + enum axp20x_variants variant;
> int nr_cells;
> const struct mfd_cell *cells;
> const struct regmap_config *regmap_cfg;
> --
> 2.25.1
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 3/5] mfd: axp20x: Allow multiple regulators
2024-10-03 11:14 [PATCH 0/5] regulator: add X-Powers AXP323 support Andre Przywara
2024-10-03 11:14 ` [PATCH 1/5] dt-bindings: mfd: x-powers,axp152: Document AXP323 Andre Przywara
2024-10-03 11:14 ` [PATCH 2/5] mfd: axp20x: ensure relationship between IDs and model names Andre Przywara
@ 2024-10-03 11:14 ` Andre Przywara
2024-10-03 15:19 ` Chen-Yu Tsai
2024-10-03 11:14 ` [PATCH 4/5] mfd: axp20x: Add support for AXP323 Andre Przywara
2024-10-03 11:14 ` [PATCH 5/5] regulator: axp20x: add support for the AXP323 Andre Przywara
4 siblings, 1 reply; 16+ messages in thread
From: Andre Przywara @ 2024-10-03 11:14 UTC (permalink / raw)
To: Lee Jones, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Chen-Yu Tsai, Liam Girdwood, Mark Brown
Cc: devicetree, linux-sunxi, linux-kernel, Martin Botka, Chris Morgan
At the moment trying to register a second AXP chip makes the probe fail,
as some sysfs registration fails due to a duplicate name:
...
[ 3.688215] axp20x-i2c 0-0035: AXP20X driver loaded
[ 3.695610] axp20x-i2c 0-0036: AXP20x variant AXP323 found
[ 3.706151] sysfs: cannot create duplicate filename '/bus/platform/devices/axp20x-regulator'
[ 3.714718] CPU: 0 UID: 0 PID: 1 Comm: swapper/0 Not tainted 6.12.0-rc1-00026-g50bf2e2c079d-dirty #192
[ 3.724020] Hardware name: Avaota A1 (DT)
[ 3.728029] Call trace:
[ 3.730477] dump_backtrace+0x94/0xec
[ 3.734146] show_stack+0x18/0x24
[ 3.737462] dump_stack_lvl+0x80/0xf4
[ 3.741128] dump_stack+0x18/0x24
[ 3.744444] sysfs_warn_dup+0x64/0x80
[ 3.748109] sysfs_do_create_link_sd+0xf0/0xf8
[ 3.752553] sysfs_create_link+0x20/0x40
[ 3.756476] bus_add_device+0x64/0x104
[ 3.760229] device_add+0x310/0x760
[ 3.763717] platform_device_add+0x10c/0x238
[ 3.767990] mfd_add_device+0x4ec/0x5c8
[ 3.771829] mfd_add_devices+0x88/0x11c
[ 3.775666] axp20x_device_probe+0x70/0x184
[ 3.779851] axp20x_i2c_probe+0x9c/0xd8
...
This is because we use PLATFORM_DEVID_NONE for the mfd_add_devices()
call, which would number the child devices in the same 0-based way, even
for the second (or any other) instance.
Use PLATFORM_DEVID_AUTO instead, which automatically assigns
non-conflicting device numbers.
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
---
drivers/mfd/axp20x.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
index 5ceea359289f..bc08ae433260 100644
--- a/drivers/mfd/axp20x.c
+++ b/drivers/mfd/axp20x.c
@@ -1419,7 +1419,7 @@ int axp20x_device_probe(struct axp20x_dev *axp20x)
}
}
- ret = mfd_add_devices(axp20x->dev, -1, axp20x->cells,
+ ret = mfd_add_devices(axp20x->dev, PLATFORM_DEVID_AUTO, axp20x->cells,
axp20x->nr_cells, NULL, 0, NULL);
if (ret) {
--
2.25.1
^ permalink raw reply related [flat|nested] 16+ messages in thread* Re: [PATCH 3/5] mfd: axp20x: Allow multiple regulators
2024-10-03 11:14 ` [PATCH 3/5] mfd: axp20x: Allow multiple regulators Andre Przywara
@ 2024-10-03 15:19 ` Chen-Yu Tsai
2024-10-04 9:41 ` Andre Przywara
2024-10-06 22:48 ` Andre Przywara
0 siblings, 2 replies; 16+ messages in thread
From: Chen-Yu Tsai @ 2024-10-03 15:19 UTC (permalink / raw)
To: Andre Przywara
Cc: Lee Jones, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Liam Girdwood, Mark Brown, devicetree, linux-sunxi, linux-kernel,
Martin Botka, Chris Morgan
On Thu, Oct 3, 2024 at 7:15 PM Andre Przywara <andre.przywara@arm.com> wrote:
>
> At the moment trying to register a second AXP chip makes the probe fail,
> as some sysfs registration fails due to a duplicate name:
>
> ...
> [ 3.688215] axp20x-i2c 0-0035: AXP20X driver loaded
> [ 3.695610] axp20x-i2c 0-0036: AXP20x variant AXP323 found
> [ 3.706151] sysfs: cannot create duplicate filename '/bus/platform/devices/axp20x-regulator'
> [ 3.714718] CPU: 0 UID: 0 PID: 1 Comm: swapper/0 Not tainted 6.12.0-rc1-00026-g50bf2e2c079d-dirty #192
> [ 3.724020] Hardware name: Avaota A1 (DT)
> [ 3.728029] Call trace:
> [ 3.730477] dump_backtrace+0x94/0xec
> [ 3.734146] show_stack+0x18/0x24
> [ 3.737462] dump_stack_lvl+0x80/0xf4
> [ 3.741128] dump_stack+0x18/0x24
> [ 3.744444] sysfs_warn_dup+0x64/0x80
> [ 3.748109] sysfs_do_create_link_sd+0xf0/0xf8
> [ 3.752553] sysfs_create_link+0x20/0x40
> [ 3.756476] bus_add_device+0x64/0x104
> [ 3.760229] device_add+0x310/0x760
> [ 3.763717] platform_device_add+0x10c/0x238
> [ 3.767990] mfd_add_device+0x4ec/0x5c8
> [ 3.771829] mfd_add_devices+0x88/0x11c
> [ 3.775666] axp20x_device_probe+0x70/0x184
> [ 3.779851] axp20x_i2c_probe+0x9c/0xd8
> ...
>
> This is because we use PLATFORM_DEVID_NONE for the mfd_add_devices()
> call, which would number the child devices in the same 0-based way, even
> for the second (or any other) instance.
>
> Use PLATFORM_DEVID_AUTO instead, which automatically assigns
> non-conflicting device numbers.
That's weird... I don't remember running into this when working on the A80,
which had two albeit different AXP chips. That was a long time ago though.
> Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Reviewed-by: Chen-Yu Tsai <wens@csie.org>
> ---
> drivers/mfd/axp20x.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
> index 5ceea359289f..bc08ae433260 100644
> --- a/drivers/mfd/axp20x.c
> +++ b/drivers/mfd/axp20x.c
> @@ -1419,7 +1419,7 @@ int axp20x_device_probe(struct axp20x_dev *axp20x)
> }
> }
>
> - ret = mfd_add_devices(axp20x->dev, -1, axp20x->cells,
> + ret = mfd_add_devices(axp20x->dev, PLATFORM_DEVID_AUTO, axp20x->cells,
> axp20x->nr_cells, NULL, 0, NULL);
>
> if (ret) {
> --
> 2.25.1
>
^ permalink raw reply [flat|nested] 16+ messages in thread* Re: [PATCH 3/5] mfd: axp20x: Allow multiple regulators
2024-10-03 15:19 ` Chen-Yu Tsai
@ 2024-10-04 9:41 ` Andre Przywara
2024-10-06 22:48 ` Andre Przywara
1 sibling, 0 replies; 16+ messages in thread
From: Andre Przywara @ 2024-10-04 9:41 UTC (permalink / raw)
To: Chen-Yu Tsai
Cc: Lee Jones, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Liam Girdwood, Mark Brown, devicetree, linux-sunxi, linux-kernel,
Martin Botka, Chris Morgan
On Thu, 3 Oct 2024 23:19:16 +0800
Chen-Yu Tsai <wens@csie.org> wrote:
Hi Chen-Yu,
thanks for having a look!
> On Thu, Oct 3, 2024 at 7:15 PM Andre Przywara <andre.przywara@arm.com> wrote:
> >
> > At the moment trying to register a second AXP chip makes the probe fail,
> > as some sysfs registration fails due to a duplicate name:
> >
> > ...
> > [ 3.688215] axp20x-i2c 0-0035: AXP20X driver loaded
> > [ 3.695610] axp20x-i2c 0-0036: AXP20x variant AXP323 found
> > [ 3.706151] sysfs: cannot create duplicate filename '/bus/platform/devices/axp20x-regulator'
> > [ 3.714718] CPU: 0 UID: 0 PID: 1 Comm: swapper/0 Not tainted 6.12.0-rc1-00026-g50bf2e2c079d-dirty #192
> > [ 3.724020] Hardware name: Avaota A1 (DT)
> > [ 3.728029] Call trace:
> > [ 3.730477] dump_backtrace+0x94/0xec
> > [ 3.734146] show_stack+0x18/0x24
> > [ 3.737462] dump_stack_lvl+0x80/0xf4
> > [ 3.741128] dump_stack+0x18/0x24
> > [ 3.744444] sysfs_warn_dup+0x64/0x80
> > [ 3.748109] sysfs_do_create_link_sd+0xf0/0xf8
> > [ 3.752553] sysfs_create_link+0x20/0x40
> > [ 3.756476] bus_add_device+0x64/0x104
> > [ 3.760229] device_add+0x310/0x760
> > [ 3.763717] platform_device_add+0x10c/0x238
> > [ 3.767990] mfd_add_device+0x4ec/0x5c8
> > [ 3.771829] mfd_add_devices+0x88/0x11c
> > [ 3.775666] axp20x_device_probe+0x70/0x184
> > [ 3.779851] axp20x_i2c_probe+0x9c/0xd8
> > ...
> >
> > This is because we use PLATFORM_DEVID_NONE for the mfd_add_devices()
> > call, which would number the child devices in the same 0-based way, even
> > for the second (or any other) instance.
> >
> > Use PLATFORM_DEVID_AUTO instead, which automatically assigns
> > non-conflicting device numbers.
>
> That's weird... I don't remember running into this when working on the A80,
> which had two albeit different AXP chips. That was a long time ago though.
Yeah, I was wondering about this as well. And it's two different PMICs here
as well: most A523/T527 system seem to come with an AXP717/AXP323 combo.
Though there are not linked together in any way, like in this master/slave
mode of the AXP806.
I will test on (your old) A80 board, and will add a Fixes: tag in v2,
should it also fail there.
> > Signed-off-by: Andre Przywara <andre.przywara@arm.com>
>
> Reviewed-by: Chen-Yu Tsai <wens@csie.org>
Thanks,
Andre
>
> > ---
> > drivers/mfd/axp20x.c | 2 +-
> > 1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
> > index 5ceea359289f..bc08ae433260 100644
> > --- a/drivers/mfd/axp20x.c
> > +++ b/drivers/mfd/axp20x.c
> > @@ -1419,7 +1419,7 @@ int axp20x_device_probe(struct axp20x_dev *axp20x)
> > }
> > }
> >
> > - ret = mfd_add_devices(axp20x->dev, -1, axp20x->cells,
> > + ret = mfd_add_devices(axp20x->dev, PLATFORM_DEVID_AUTO, axp20x->cells,
> > axp20x->nr_cells, NULL, 0, NULL);
> >
> > if (ret) {
> > --
> > 2.25.1
> >
^ permalink raw reply [flat|nested] 16+ messages in thread* Re: [PATCH 3/5] mfd: axp20x: Allow multiple regulators
2024-10-03 15:19 ` Chen-Yu Tsai
2024-10-04 9:41 ` Andre Przywara
@ 2024-10-06 22:48 ` Andre Przywara
1 sibling, 0 replies; 16+ messages in thread
From: Andre Przywara @ 2024-10-06 22:48 UTC (permalink / raw)
To: Chen-Yu Tsai
Cc: Lee Jones, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Liam Girdwood, Mark Brown, devicetree, linux-sunxi, linux-kernel,
Martin Botka, Chris Morgan
On Thu, 3 Oct 2024 23:19:16 +0800
Chen-Yu Tsai <wens@csie.org> wrote:
> On Thu, Oct 3, 2024 at 7:15 PM Andre Przywara <andre.przywara@arm.com> wrote:
> >
> > At the moment trying to register a second AXP chip makes the probe fail,
> > as some sysfs registration fails due to a duplicate name:
> >
> > ...
> > [ 3.688215] axp20x-i2c 0-0035: AXP20X driver loaded
> > [ 3.695610] axp20x-i2c 0-0036: AXP20x variant AXP323 found
> > [ 3.706151] sysfs: cannot create duplicate filename '/bus/platform/devices/axp20x-regulator'
> > [ 3.714718] CPU: 0 UID: 0 PID: 1 Comm: swapper/0 Not tainted 6.12.0-rc1-00026-g50bf2e2c079d-dirty #192
> > [ 3.724020] Hardware name: Avaota A1 (DT)
> > [ 3.728029] Call trace:
> > [ 3.730477] dump_backtrace+0x94/0xec
> > [ 3.734146] show_stack+0x18/0x24
> > [ 3.737462] dump_stack_lvl+0x80/0xf4
> > [ 3.741128] dump_stack+0x18/0x24
> > [ 3.744444] sysfs_warn_dup+0x64/0x80
> > [ 3.748109] sysfs_do_create_link_sd+0xf0/0xf8
> > [ 3.752553] sysfs_create_link+0x20/0x40
> > [ 3.756476] bus_add_device+0x64/0x104
> > [ 3.760229] device_add+0x310/0x760
> > [ 3.763717] platform_device_add+0x10c/0x238
> > [ 3.767990] mfd_add_device+0x4ec/0x5c8
> > [ 3.771829] mfd_add_devices+0x88/0x11c
> > [ 3.775666] axp20x_device_probe+0x70/0x184
> > [ 3.779851] axp20x_i2c_probe+0x9c/0xd8
> > ...
> >
> > This is because we use PLATFORM_DEVID_NONE for the mfd_add_devices()
> > call, which would number the child devices in the same 0-based way, even
> > for the second (or any other) instance.
> >
> > Use PLATFORM_DEVID_AUTO instead, which automatically assigns
> > non-conflicting device numbers.
>
> That's weird... I don't remember running into this when working on the A80,
> which had two albeit different AXP chips. That was a long time ago though.
So I tested this on a Cubieboard 4, and it works there either way,
with or without this patch. That's RSB instead of I2C, which honestly
shouldn't make much of a difference, but maybe the call path differs?
But since it still works, I think this patch is correct regardless.
Thanks,
Andre
> > Signed-off-by: Andre Przywara <andre.przywara@arm.com>
>
> Reviewed-by: Chen-Yu Tsai <wens@csie.org>
>
> > ---
> > drivers/mfd/axp20x.c | 2 +-
> > 1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
> > index 5ceea359289f..bc08ae433260 100644
> > --- a/drivers/mfd/axp20x.c
> > +++ b/drivers/mfd/axp20x.c
> > @@ -1419,7 +1419,7 @@ int axp20x_device_probe(struct axp20x_dev *axp20x)
> > }
> > }
> >
> > - ret = mfd_add_devices(axp20x->dev, -1, axp20x->cells,
> > + ret = mfd_add_devices(axp20x->dev, PLATFORM_DEVID_AUTO, axp20x->cells,
> > axp20x->nr_cells, NULL, 0, NULL);
> >
> > if (ret) {
> > --
> > 2.25.1
> >
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 4/5] mfd: axp20x: Add support for AXP323
2024-10-03 11:14 [PATCH 0/5] regulator: add X-Powers AXP323 support Andre Przywara
` (2 preceding siblings ...)
2024-10-03 11:14 ` [PATCH 3/5] mfd: axp20x: Allow multiple regulators Andre Przywara
@ 2024-10-03 11:14 ` Andre Przywara
2024-10-03 15:20 ` Chen-Yu Tsai
2024-10-03 11:14 ` [PATCH 5/5] regulator: axp20x: add support for the AXP323 Andre Przywara
4 siblings, 1 reply; 16+ messages in thread
From: Andre Przywara @ 2024-10-03 11:14 UTC (permalink / raw)
To: Lee Jones, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Chen-Yu Tsai, Liam Girdwood, Mark Brown
Cc: devicetree, linux-sunxi, linux-kernel, Martin Botka, Chris Morgan
The X-Powers AXP323 is a very close sibling of the AXP313A. The only
difference seems to be the ability to dual-phase the first two DC/DC
converter, which adds another register.
Add the required boilerplate to introduce a new PMIC to the AXP MFD
driver. Where possible, this just maps into the existing structs defined
for the AXP313A, only deviating where needed.
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
---
drivers/mfd/axp20x-i2c.c | 1 +
drivers/mfd/axp20x.c | 26 ++++++++++++++++++++++++++
include/linux/mfd/axp20x.h | 2 ++
3 files changed, 29 insertions(+)
diff --git a/drivers/mfd/axp20x-i2c.c b/drivers/mfd/axp20x-i2c.c
index 791a0b4cb64b..5c93136f977e 100644
--- a/drivers/mfd/axp20x-i2c.c
+++ b/drivers/mfd/axp20x-i2c.c
@@ -65,6 +65,7 @@ static const struct of_device_id axp20x_i2c_of_match[] = {
{ .compatible = "x-powers,axp221", .data = (void *)AXP221_ID },
{ .compatible = "x-powers,axp223", .data = (void *)AXP223_ID },
{ .compatible = "x-powers,axp313a", .data = (void *)AXP313A_ID },
+ { .compatible = "x-powers,axp323", .data = (void *)AXP323_ID },
{ .compatible = "x-powers,axp717", .data = (void *)AXP717_ID },
{ .compatible = "x-powers,axp803", .data = (void *)AXP803_ID },
{ .compatible = "x-powers,axp806", .data = (void *)AXP806_ID },
diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
index bc08ae433260..8d90962b56d9 100644
--- a/drivers/mfd/axp20x.c
+++ b/drivers/mfd/axp20x.c
@@ -42,6 +42,7 @@ static const char * const axp20x_model_names[] = {
[AXP223_ID] = "AXP223",
[AXP288_ID] = "AXP288",
[AXP313A_ID] = "AXP313a",
+ [AXP323_ID] = "AXP323",
[AXP717_ID] = "AXP717",
[AXP803_ID] = "AXP803",
[AXP806_ID] = "AXP806",
@@ -193,6 +194,10 @@ static const struct regmap_range axp313a_writeable_ranges[] = {
regmap_reg_range(AXP313A_ON_INDICATE, AXP313A_IRQ_STATE),
};
+static const struct regmap_range axp323_writeable_ranges[] = {
+ regmap_reg_range(AXP313A_ON_INDICATE, AXP323_DCDC_MODE_CTRL2),
+};
+
static const struct regmap_range axp313a_volatile_ranges[] = {
regmap_reg_range(AXP313A_SHUTDOWN_CTRL, AXP313A_SHUTDOWN_CTRL),
regmap_reg_range(AXP313A_IRQ_STATE, AXP313A_IRQ_STATE),
@@ -203,6 +208,11 @@ static const struct regmap_access_table axp313a_writeable_table = {
.n_yes_ranges = ARRAY_SIZE(axp313a_writeable_ranges),
};
+static const struct regmap_access_table axp323_writeable_table = {
+ .yes_ranges = axp323_writeable_ranges,
+ .n_yes_ranges = ARRAY_SIZE(axp323_writeable_ranges),
+};
+
static const struct regmap_access_table axp313a_volatile_table = {
.yes_ranges = axp313a_volatile_ranges,
.n_yes_ranges = ARRAY_SIZE(axp313a_volatile_ranges),
@@ -433,6 +443,15 @@ static const struct regmap_config axp313a_regmap_config = {
.cache_type = REGCACHE_MAPLE,
};
+static const struct regmap_config axp323_regmap_config = {
+ .reg_bits = 8,
+ .val_bits = 8,
+ .wr_table = &axp323_writeable_table,
+ .volatile_table = &axp313a_volatile_table,
+ .max_register = AXP323_DCDC_MODE_CTRL2,
+ .cache_type = REGCACHE_RBTREE,
+};
+
static const struct regmap_config axp717_regmap_config = {
.reg_bits = 8,
.val_bits = 8,
@@ -1221,6 +1240,7 @@ static int axp20x_power_off(struct sys_off_data *data)
unsigned int shutdown_reg;
switch (axp20x->variant) {
+ case AXP323_ID:
case AXP313A_ID:
shutdown_reg = AXP313A_SHUTDOWN_CTRL;
break;
@@ -1289,6 +1309,12 @@ int axp20x_match_device(struct axp20x_dev *axp20x)
axp20x->regmap_cfg = &axp313a_regmap_config;
axp20x->regmap_irq_chip = &axp313a_regmap_irq_chip;
break;
+ case AXP323_ID:
+ axp20x->nr_cells = ARRAY_SIZE(axp313a_cells);
+ axp20x->cells = axp313a_cells;
+ axp20x->regmap_cfg = &axp323_regmap_config;
+ axp20x->regmap_irq_chip = &axp313a_regmap_irq_chip;
+ break;
case AXP717_ID:
axp20x->nr_cells = ARRAY_SIZE(axp717_cells);
axp20x->cells = axp717_cells;
diff --git a/include/linux/mfd/axp20x.h b/include/linux/mfd/axp20x.h
index 79ecaaaa2070..c3df0e615fbf 100644
--- a/include/linux/mfd/axp20x.h
+++ b/include/linux/mfd/axp20x.h
@@ -19,6 +19,7 @@ enum axp20x_variants {
AXP223_ID,
AXP288_ID,
AXP313A_ID,
+ AXP323_ID,
AXP717_ID,
AXP803_ID,
AXP806_ID,
@@ -113,6 +114,7 @@ enum axp20x_variants {
#define AXP313A_SHUTDOWN_CTRL 0x1a
#define AXP313A_IRQ_EN 0x20
#define AXP313A_IRQ_STATE 0x21
+#define AXP323_DCDC_MODE_CTRL2 0x22
#define AXP717_ON_INDICATE 0x00
#define AXP717_PMU_STATUS_2 0x01
--
2.25.1
^ permalink raw reply related [flat|nested] 16+ messages in thread* Re: [PATCH 4/5] mfd: axp20x: Add support for AXP323
2024-10-03 11:14 ` [PATCH 4/5] mfd: axp20x: Add support for AXP323 Andre Przywara
@ 2024-10-03 15:20 ` Chen-Yu Tsai
2024-10-04 9:42 ` Andre Przywara
0 siblings, 1 reply; 16+ messages in thread
From: Chen-Yu Tsai @ 2024-10-03 15:20 UTC (permalink / raw)
To: Andre Przywara
Cc: Lee Jones, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Liam Girdwood, Mark Brown, devicetree, linux-sunxi, linux-kernel,
Martin Botka, Chris Morgan
On Thu, Oct 3, 2024 at 7:15 PM Andre Przywara <andre.przywara@arm.com> wrote:
>
> The X-Powers AXP323 is a very close sibling of the AXP313A. The only
> difference seems to be the ability to dual-phase the first two DC/DC
> converter, which adds another register.
>
> Add the required boilerplate to introduce a new PMIC to the AXP MFD
> driver. Where possible, this just maps into the existing structs defined
> for the AXP313A, only deviating where needed.
>
> Signed-off-by: Andre Przywara <andre.przywara@arm.com>
> ---
> drivers/mfd/axp20x-i2c.c | 1 +
> drivers/mfd/axp20x.c | 26 ++++++++++++++++++++++++++
> include/linux/mfd/axp20x.h | 2 ++
> 3 files changed, 29 insertions(+)
>
> diff --git a/drivers/mfd/axp20x-i2c.c b/drivers/mfd/axp20x-i2c.c
> index 791a0b4cb64b..5c93136f977e 100644
> --- a/drivers/mfd/axp20x-i2c.c
> +++ b/drivers/mfd/axp20x-i2c.c
> @@ -65,6 +65,7 @@ static const struct of_device_id axp20x_i2c_of_match[] = {
> { .compatible = "x-powers,axp221", .data = (void *)AXP221_ID },
> { .compatible = "x-powers,axp223", .data = (void *)AXP223_ID },
> { .compatible = "x-powers,axp313a", .data = (void *)AXP313A_ID },
> + { .compatible = "x-powers,axp323", .data = (void *)AXP323_ID },
> { .compatible = "x-powers,axp717", .data = (void *)AXP717_ID },
> { .compatible = "x-powers,axp803", .data = (void *)AXP803_ID },
> { .compatible = "x-powers,axp806", .data = (void *)AXP806_ID },
> diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
> index bc08ae433260..8d90962b56d9 100644
> --- a/drivers/mfd/axp20x.c
> +++ b/drivers/mfd/axp20x.c
> @@ -42,6 +42,7 @@ static const char * const axp20x_model_names[] = {
> [AXP223_ID] = "AXP223",
> [AXP288_ID] = "AXP288",
> [AXP313A_ID] = "AXP313a",
> + [AXP323_ID] = "AXP323",
> [AXP717_ID] = "AXP717",
> [AXP803_ID] = "AXP803",
> [AXP806_ID] = "AXP806",
> @@ -193,6 +194,10 @@ static const struct regmap_range axp313a_writeable_ranges[] = {
> regmap_reg_range(AXP313A_ON_INDICATE, AXP313A_IRQ_STATE),
> };
>
> +static const struct regmap_range axp323_writeable_ranges[] = {
> + regmap_reg_range(AXP313A_ON_INDICATE, AXP323_DCDC_MODE_CTRL2),
> +};
> +
> static const struct regmap_range axp313a_volatile_ranges[] = {
> regmap_reg_range(AXP313A_SHUTDOWN_CTRL, AXP313A_SHUTDOWN_CTRL),
> regmap_reg_range(AXP313A_IRQ_STATE, AXP313A_IRQ_STATE),
> @@ -203,6 +208,11 @@ static const struct regmap_access_table axp313a_writeable_table = {
> .n_yes_ranges = ARRAY_SIZE(axp313a_writeable_ranges),
> };
>
> +static const struct regmap_access_table axp323_writeable_table = {
> + .yes_ranges = axp323_writeable_ranges,
> + .n_yes_ranges = ARRAY_SIZE(axp323_writeable_ranges),
> +};
> +
> static const struct regmap_access_table axp313a_volatile_table = {
> .yes_ranges = axp313a_volatile_ranges,
> .n_yes_ranges = ARRAY_SIZE(axp313a_volatile_ranges),
> @@ -433,6 +443,15 @@ static const struct regmap_config axp313a_regmap_config = {
> .cache_type = REGCACHE_MAPLE,
> };
>
> +static const struct regmap_config axp323_regmap_config = {
> + .reg_bits = 8,
> + .val_bits = 8,
> + .wr_table = &axp323_writeable_table,
> + .volatile_table = &axp313a_volatile_table,
> + .max_register = AXP323_DCDC_MODE_CTRL2,
> + .cache_type = REGCACHE_RBTREE,
Maple tree instead?
The rest looks fine, so once fixed,
Reviewed-by: Chen-Yu Tsai <wens@csie.org>
> +};
> +
> static const struct regmap_config axp717_regmap_config = {
> .reg_bits = 8,
> .val_bits = 8,
> @@ -1221,6 +1240,7 @@ static int axp20x_power_off(struct sys_off_data *data)
> unsigned int shutdown_reg;
>
> switch (axp20x->variant) {
> + case AXP323_ID:
> case AXP313A_ID:
> shutdown_reg = AXP313A_SHUTDOWN_CTRL;
> break;
> @@ -1289,6 +1309,12 @@ int axp20x_match_device(struct axp20x_dev *axp20x)
> axp20x->regmap_cfg = &axp313a_regmap_config;
> axp20x->regmap_irq_chip = &axp313a_regmap_irq_chip;
> break;
> + case AXP323_ID:
> + axp20x->nr_cells = ARRAY_SIZE(axp313a_cells);
> + axp20x->cells = axp313a_cells;
> + axp20x->regmap_cfg = &axp323_regmap_config;
> + axp20x->regmap_irq_chip = &axp313a_regmap_irq_chip;
> + break;
> case AXP717_ID:
> axp20x->nr_cells = ARRAY_SIZE(axp717_cells);
> axp20x->cells = axp717_cells;
> diff --git a/include/linux/mfd/axp20x.h b/include/linux/mfd/axp20x.h
> index 79ecaaaa2070..c3df0e615fbf 100644
> --- a/include/linux/mfd/axp20x.h
> +++ b/include/linux/mfd/axp20x.h
> @@ -19,6 +19,7 @@ enum axp20x_variants {
> AXP223_ID,
> AXP288_ID,
> AXP313A_ID,
> + AXP323_ID,
> AXP717_ID,
> AXP803_ID,
> AXP806_ID,
> @@ -113,6 +114,7 @@ enum axp20x_variants {
> #define AXP313A_SHUTDOWN_CTRL 0x1a
> #define AXP313A_IRQ_EN 0x20
> #define AXP313A_IRQ_STATE 0x21
> +#define AXP323_DCDC_MODE_CTRL2 0x22
>
> #define AXP717_ON_INDICATE 0x00
> #define AXP717_PMU_STATUS_2 0x01
> --
> 2.25.1
>
^ permalink raw reply [flat|nested] 16+ messages in thread* Re: [PATCH 4/5] mfd: axp20x: Add support for AXP323
2024-10-03 15:20 ` Chen-Yu Tsai
@ 2024-10-04 9:42 ` Andre Przywara
0 siblings, 0 replies; 16+ messages in thread
From: Andre Przywara @ 2024-10-04 9:42 UTC (permalink / raw)
To: Chen-Yu Tsai
Cc: Lee Jones, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Liam Girdwood, Mark Brown, devicetree, linux-sunxi, linux-kernel,
Martin Botka, Chris Morgan
On Thu, 3 Oct 2024 23:20:58 +0800
Chen-Yu Tsai <wens@csie.org> wrote:
> On Thu, Oct 3, 2024 at 7:15 PM Andre Przywara <andre.przywara@arm.com> wrote:
> >
> > The X-Powers AXP323 is a very close sibling of the AXP313A. The only
> > difference seems to be the ability to dual-phase the first two DC/DC
> > converter, which adds another register.
> >
> > Add the required boilerplate to introduce a new PMIC to the AXP MFD
> > driver. Where possible, this just maps into the existing structs defined
> > for the AXP313A, only deviating where needed.
> >
> > Signed-off-by: Andre Przywara <andre.przywara@arm.com>
> > ---
> > drivers/mfd/axp20x-i2c.c | 1 +
> > drivers/mfd/axp20x.c | 26 ++++++++++++++++++++++++++
> > include/linux/mfd/axp20x.h | 2 ++
> > 3 files changed, 29 insertions(+)
> >
> > diff --git a/drivers/mfd/axp20x-i2c.c b/drivers/mfd/axp20x-i2c.c
> > index 791a0b4cb64b..5c93136f977e 100644
> > --- a/drivers/mfd/axp20x-i2c.c
> > +++ b/drivers/mfd/axp20x-i2c.c
> > @@ -65,6 +65,7 @@ static const struct of_device_id axp20x_i2c_of_match[] = {
> > { .compatible = "x-powers,axp221", .data = (void *)AXP221_ID },
> > { .compatible = "x-powers,axp223", .data = (void *)AXP223_ID },
> > { .compatible = "x-powers,axp313a", .data = (void *)AXP313A_ID },
> > + { .compatible = "x-powers,axp323", .data = (void *)AXP323_ID },
> > { .compatible = "x-powers,axp717", .data = (void *)AXP717_ID },
> > { .compatible = "x-powers,axp803", .data = (void *)AXP803_ID },
> > { .compatible = "x-powers,axp806", .data = (void *)AXP806_ID },
> > diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
> > index bc08ae433260..8d90962b56d9 100644
> > --- a/drivers/mfd/axp20x.c
> > +++ b/drivers/mfd/axp20x.c
> > @@ -42,6 +42,7 @@ static const char * const axp20x_model_names[] = {
> > [AXP223_ID] = "AXP223",
> > [AXP288_ID] = "AXP288",
> > [AXP313A_ID] = "AXP313a",
> > + [AXP323_ID] = "AXP323",
> > [AXP717_ID] = "AXP717",
> > [AXP803_ID] = "AXP803",
> > [AXP806_ID] = "AXP806",
> > @@ -193,6 +194,10 @@ static const struct regmap_range axp313a_writeable_ranges[] = {
> > regmap_reg_range(AXP313A_ON_INDICATE, AXP313A_IRQ_STATE),
> > };
> >
> > +static const struct regmap_range axp323_writeable_ranges[] = {
> > + regmap_reg_range(AXP313A_ON_INDICATE, AXP323_DCDC_MODE_CTRL2),
> > +};
> > +
> > static const struct regmap_range axp313a_volatile_ranges[] = {
> > regmap_reg_range(AXP313A_SHUTDOWN_CTRL, AXP313A_SHUTDOWN_CTRL),
> > regmap_reg_range(AXP313A_IRQ_STATE, AXP313A_IRQ_STATE),
> > @@ -203,6 +208,11 @@ static const struct regmap_access_table axp313a_writeable_table = {
> > .n_yes_ranges = ARRAY_SIZE(axp313a_writeable_ranges),
> > };
> >
> > +static const struct regmap_access_table axp323_writeable_table = {
> > + .yes_ranges = axp323_writeable_ranges,
> > + .n_yes_ranges = ARRAY_SIZE(axp323_writeable_ranges),
> > +};
> > +
> > static const struct regmap_access_table axp313a_volatile_table = {
> > .yes_ranges = axp313a_volatile_ranges,
> > .n_yes_ranges = ARRAY_SIZE(axp313a_volatile_ranges),
> > @@ -433,6 +443,15 @@ static const struct regmap_config axp313a_regmap_config = {
> > .cache_type = REGCACHE_MAPLE,
> > };
> >
> > +static const struct regmap_config axp323_regmap_config = {
> > + .reg_bits = 8,
> > + .val_bits = 8,
> > + .wr_table = &axp323_writeable_table,
> > + .volatile_table = &axp313a_volatile_table,
> > + .max_register = AXP323_DCDC_MODE_CTRL2,
> > + .cache_type = REGCACHE_RBTREE,
>
> Maple tree instead?
Ah yes, you are right, this was lost over a rebase. Will fix in v2.
> The rest looks fine, so once fixed,
>
> Reviewed-by: Chen-Yu Tsai <wens@csie.org>
Thanks!
Andre
>
> > +};
> > +
> > static const struct regmap_config axp717_regmap_config = {
> > .reg_bits = 8,
> > .val_bits = 8,
> > @@ -1221,6 +1240,7 @@ static int axp20x_power_off(struct sys_off_data *data)
> > unsigned int shutdown_reg;
> >
> > switch (axp20x->variant) {
> > + case AXP323_ID:
> > case AXP313A_ID:
> > shutdown_reg = AXP313A_SHUTDOWN_CTRL;
> > break;
> > @@ -1289,6 +1309,12 @@ int axp20x_match_device(struct axp20x_dev *axp20x)
> > axp20x->regmap_cfg = &axp313a_regmap_config;
> > axp20x->regmap_irq_chip = &axp313a_regmap_irq_chip;
> > break;
> > + case AXP323_ID:
> > + axp20x->nr_cells = ARRAY_SIZE(axp313a_cells);
> > + axp20x->cells = axp313a_cells;
> > + axp20x->regmap_cfg = &axp323_regmap_config;
> > + axp20x->regmap_irq_chip = &axp313a_regmap_irq_chip;
> > + break;
> > case AXP717_ID:
> > axp20x->nr_cells = ARRAY_SIZE(axp717_cells);
> > axp20x->cells = axp717_cells;
> > diff --git a/include/linux/mfd/axp20x.h b/include/linux/mfd/axp20x.h
> > index 79ecaaaa2070..c3df0e615fbf 100644
> > --- a/include/linux/mfd/axp20x.h
> > +++ b/include/linux/mfd/axp20x.h
> > @@ -19,6 +19,7 @@ enum axp20x_variants {
> > AXP223_ID,
> > AXP288_ID,
> > AXP313A_ID,
> > + AXP323_ID,
> > AXP717_ID,
> > AXP803_ID,
> > AXP806_ID,
> > @@ -113,6 +114,7 @@ enum axp20x_variants {
> > #define AXP313A_SHUTDOWN_CTRL 0x1a
> > #define AXP313A_IRQ_EN 0x20
> > #define AXP313A_IRQ_STATE 0x21
> > +#define AXP323_DCDC_MODE_CTRL2 0x22
> >
> > #define AXP717_ON_INDICATE 0x00
> > #define AXP717_PMU_STATUS_2 0x01
> > --
> > 2.25.1
> >
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH 5/5] regulator: axp20x: add support for the AXP323
2024-10-03 11:14 [PATCH 0/5] regulator: add X-Powers AXP323 support Andre Przywara
` (3 preceding siblings ...)
2024-10-03 11:14 ` [PATCH 4/5] mfd: axp20x: Add support for AXP323 Andre Przywara
@ 2024-10-03 11:14 ` Andre Przywara
2024-10-03 14:52 ` Mark Brown
2024-10-03 15:21 ` Chen-Yu Tsai
4 siblings, 2 replies; 16+ messages in thread
From: Andre Przywara @ 2024-10-03 11:14 UTC (permalink / raw)
To: Lee Jones, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Chen-Yu Tsai, Liam Girdwood, Mark Brown
Cc: devicetree, linux-sunxi, linux-kernel, Martin Botka, Chris Morgan
The X-Powers AXP323 is a very close sibling of the AXP313A. The only
difference seems to be the ability to dual-phase the first two DC/DC
converters.
Place the new AXP323 ID next to the existing AXP313A checks, to let
them share most code.
The only difference is the poly-phase detection code, which gets
extended to check the respective bit in a newly used register.
Signed-off-by: Andre Przywara <andre.przywara@arm.com>
---
drivers/regulator/axp20x-regulator.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/drivers/regulator/axp20x-regulator.c b/drivers/regulator/axp20x-regulator.c
index 3ba76dbd0fb9..e3cc59b82ea6 100644
--- a/drivers/regulator/axp20x-regulator.c
+++ b/drivers/regulator/axp20x-regulator.c
@@ -1341,6 +1341,7 @@ static int axp20x_set_dcdc_freq(struct platform_device *pdev, u32 dcdcfreq)
step = 150;
break;
case AXP313A_ID:
+ case AXP323_ID:
case AXP717_ID:
case AXP15060_ID:
/* The DCDC PWM frequency seems to be fixed to 3 MHz. */
@@ -1527,6 +1528,15 @@ static bool axp20x_is_polyphase_slave(struct axp20x_dev *axp20x, int id)
}
break;
+ case AXP323_ID:
+ regmap_read(axp20x->regmap, AXP323_DCDC_MODE_CTRL2, ®);
+
+ switch (id) {
+ case AXP313A_DCDC2:
+ return !!(reg & BIT(1));
+ }
+ break;
+
default:
return false;
}
@@ -1565,6 +1575,7 @@ static int axp20x_regulator_probe(struct platform_device *pdev)
"x-powers,drive-vbus-en");
break;
case AXP313A_ID:
+ case AXP323_ID:
regulators = axp313a_regulators;
nregulators = AXP313A_REG_ID_MAX;
break;
--
2.25.1
^ permalink raw reply related [flat|nested] 16+ messages in thread* Re: [PATCH 5/5] regulator: axp20x: add support for the AXP323
2024-10-03 11:14 ` [PATCH 5/5] regulator: axp20x: add support for the AXP323 Andre Przywara
@ 2024-10-03 14:52 ` Mark Brown
2024-10-03 15:21 ` Chen-Yu Tsai
1 sibling, 0 replies; 16+ messages in thread
From: Mark Brown @ 2024-10-03 14:52 UTC (permalink / raw)
To: Andre Przywara
Cc: Lee Jones, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Chen-Yu Tsai, Liam Girdwood, devicetree, linux-sunxi,
linux-kernel, Martin Botka, Chris Morgan
[-- Attachment #1: Type: text/plain, Size: 266 bytes --]
On Thu, Oct 03, 2024 at 12:14:44PM +0100, Andre Przywara wrote:
> The X-Powers AXP323 is a very close sibling of the AXP313A. The only
> difference seems to be the ability to dual-phase the first two DC/DC
> converters.
Reviewed-by: Mark Brown <broonie@kernel.org>
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 5/5] regulator: axp20x: add support for the AXP323
2024-10-03 11:14 ` [PATCH 5/5] regulator: axp20x: add support for the AXP323 Andre Przywara
2024-10-03 14:52 ` Mark Brown
@ 2024-10-03 15:21 ` Chen-Yu Tsai
1 sibling, 0 replies; 16+ messages in thread
From: Chen-Yu Tsai @ 2024-10-03 15:21 UTC (permalink / raw)
To: Andre Przywara
Cc: Lee Jones, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Liam Girdwood, Mark Brown, devicetree, linux-sunxi, linux-kernel,
Martin Botka, Chris Morgan
On Thu, Oct 3, 2024 at 7:15 PM Andre Przywara <andre.przywara@arm.com> wrote:
>
> The X-Powers AXP323 is a very close sibling of the AXP313A. The only
> difference seems to be the ability to dual-phase the first two DC/DC
> converters.
>
> Place the new AXP323 ID next to the existing AXP313A checks, to let
> them share most code.
> The only difference is the poly-phase detection code, which gets
> extended to check the respective bit in a newly used register.
>
> Signed-off-by: Andre Przywara <andre.przywara@arm.com>
Reviewed-by: Chen-Yu Tsai <wens@csie.org>
> ---
> drivers/regulator/axp20x-regulator.c | 11 +++++++++++
> 1 file changed, 11 insertions(+)
>
> diff --git a/drivers/regulator/axp20x-regulator.c b/drivers/regulator/axp20x-regulator.c
> index 3ba76dbd0fb9..e3cc59b82ea6 100644
> --- a/drivers/regulator/axp20x-regulator.c
> +++ b/drivers/regulator/axp20x-regulator.c
> @@ -1341,6 +1341,7 @@ static int axp20x_set_dcdc_freq(struct platform_device *pdev, u32 dcdcfreq)
> step = 150;
> break;
> case AXP313A_ID:
> + case AXP323_ID:
> case AXP717_ID:
> case AXP15060_ID:
> /* The DCDC PWM frequency seems to be fixed to 3 MHz. */
> @@ -1527,6 +1528,15 @@ static bool axp20x_is_polyphase_slave(struct axp20x_dev *axp20x, int id)
> }
> break;
>
> + case AXP323_ID:
> + regmap_read(axp20x->regmap, AXP323_DCDC_MODE_CTRL2, ®);
> +
> + switch (id) {
> + case AXP313A_DCDC2:
> + return !!(reg & BIT(1));
> + }
> + break;
> +
> default:
> return false;
> }
> @@ -1565,6 +1575,7 @@ static int axp20x_regulator_probe(struct platform_device *pdev)
> "x-powers,drive-vbus-en");
> break;
> case AXP313A_ID:
> + case AXP323_ID:
> regulators = axp313a_regulators;
> nregulators = AXP313A_REG_ID_MAX;
> break;
> --
> 2.25.1
>
^ permalink raw reply [flat|nested] 16+ messages in thread