From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Juan Sanchez Date: Sun, 6 Jul 2025 00:31:46 -0400 Subject: From: iuncuim Date: Mon, 7 Apr 2025 03:28:37 +0300 Subject: [PATCH] regulator: axp20x: force polyphase setup for axp323 Signed-off-by: Juan Sanchez --- arch/arm64/boot/dts/allwinner/sun55i-a527-cubie-a5e.dts | 3 ++ arch/arm64/boot/dts/allwinner/sun55i-h728-x96qpro+.dts | 3 ++ arch/arm64/boot/dts/allwinner/sun55i-t527-avaota-a1.dts | 3 ++ arch/arm64/boot/dts/allwinner/sun55i-t527-orangepi-4a.dts | 3 ++ drivers/regulator/axp20x-regulator.c | 19 ++++++++++ 5 files changed, 31 insertions(+) diff --git a/arch/arm64/boot/dts/allwinner/sun55i-a527-cubie-a5e.dts b/arch/arm64/boot/dts/allwinner/sun55i-a527-cubie-a5e.dts index f7a6221d02c2..369bde1556ff 100644 --- a/arch/arm64/boot/dts/allwinner/sun55i-a527-cubie-a5e.dts +++ b/arch/arm64/boot/dts/allwinner/sun55i-a527-cubie-a5e.dts @@ -330,10 +330,13 @@ reg_dcdc1_323: dcdc1 { regulator-max-microvolt = <1160000>; regulator-name = "vdd-cpub"; }; /* DCDC2 is polyphased with DCDC1 */ + reg_dcdc2_323: dcdc2 { + x-powers,polyphased; + }; /* RISC-V management core supply */ reg_dcdc3_323: dcdc3 { regulator-always-on; regulator-min-microvolt = <900000>; diff --git a/arch/arm64/boot/dts/allwinner/sun55i-h728-x96qpro+.dts b/arch/arm64/boot/dts/allwinner/sun55i-h728-x96qpro+.dts index 0d7fb419c9b4..5732088add32 100644 --- a/arch/arm64/boot/dts/allwinner/sun55i-h728-x96qpro+.dts +++ b/arch/arm64/boot/dts/allwinner/sun55i-h728-x96qpro+.dts @@ -253,10 +253,13 @@ reg_dcdc1_323: dcdc1 { regulator-max-microvolt = <1160000>; regulator-name = "vdd-cpub"; }; /* DCDC2 is polyphased with DCDC1 */ + reg_dcdc2_323: dcdc2 { + x-powers,polyphased; + }; reg_dcdc3_323: dcdc3 { regulator-always-on; regulator-min-microvolt = <1050000>; regulator-max-microvolt = <1050000>; diff --git a/arch/arm64/boot/dts/allwinner/sun55i-t527-avaota-a1.dts b/arch/arm64/boot/dts/allwinner/sun55i-t527-avaota-a1.dts index 4f2366b3624a..bd1ebb15bb3e 100644 --- a/arch/arm64/boot/dts/allwinner/sun55i-t527-avaota-a1.dts +++ b/arch/arm64/boot/dts/allwinner/sun55i-t527-avaota-a1.dts @@ -283,10 +283,13 @@ reg_dcdc1_323: dcdc1 { regulator-max-microvolt = <1160000>; regulator-name = "vdd-cpub"; }; /* DCDC2 is polyphased with DCDC1 */ + reg_dcdc2_323: dcdc2 { + x-powers,polyphased; + }; /* Some RISC-V management core related voltage */ reg_dcdc3_323: dcdc3 { regulator-always-on; regulator-min-microvolt = <900000>; diff --git a/arch/arm64/boot/dts/allwinner/sun55i-t527-orangepi-4a.dts b/arch/arm64/boot/dts/allwinner/sun55i-t527-orangepi-4a.dts index d1ffc9faec80..fb7933091edf 100644 --- a/arch/arm64/boot/dts/allwinner/sun55i-t527-orangepi-4a.dts +++ b/arch/arm64/boot/dts/allwinner/sun55i-t527-orangepi-4a.dts @@ -321,10 +321,13 @@ reg_dcdc1_323: dcdc1 { regulator-max-microvolt = <1150000>; regulator-name = "vdd-cpub"; }; /* DCDC2 is polyphased with DCDC1 */ + reg_dcdc2_323: dcdc2 { + x-powers,polyphased; + }; /* Some RISC-V management core related voltage */ reg_dcdc3_323: dcdc3 { regulator-always-on; regulator-min-microvolt = <900000>; diff --git a/drivers/regulator/axp20x-regulator.c b/drivers/regulator/axp20x-regulator.c index da891415efc0..2e2d35d31ce6 100644 --- a/drivers/regulator/axp20x-regulator.c +++ b/drivers/regulator/axp20x-regulator.c @@ -1479,10 +1479,23 @@ static int axp20x_set_dcdc_workmode(struct regulator_dev *rdev, int id, u32 work } return regmap_update_bits(rdev->regmap, reg, mask, workmode); } +static void axp20x_set_polyphased(struct axp20x_dev *axp20x, int id) +{ + switch (axp20x->variant) { + case AXP323_ID: + switch (id) { + case AXP313A_DCDC2: + regmap_write(axp20x->regmap, AXP323_DCDC_MODE_CTRL2, BIT(1)); + } + break; + + default: + } +} /* * This function checks whether a regulator is part of a poly-phase * output setup based on the registers settings. Returns true if it is. */ static bool axp20x_is_polyphase_slave(struct axp20x_dev *axp20x, int id) @@ -1702,10 +1715,16 @@ static int axp20x_regulator_probe(struct platform_device *pdev) if (axp20x_set_dcdc_workmode(rdev, i, workmode)) dev_err(&pdev->dev, "Failed to set workmode on %s\n", rdev->desc->name); } + /* + * Currently only the AXP323 needs to force dual phase setup. + */ + if (of_property_read_bool(rdev->dev.of_node,"x-powers,polyphased")) + axp20x_set_polyphased(axp20x, i); + /* * Save AXP22X DCDC1 / DCDC5 / AXP15060 ALDO1 regulator names for later. */ if ((regulators == axp22x_regulators && i == AXP22X_DCDC1) || (regulators == axp809_regulators && i == AXP809_DCDC1) || -- Created with Armbian build tools https://github.com/armbian/build