regulator: core: Allow use of "status = disabled" in regulator dts nodes
Subsystems (3)
PATCH 1/3 regulator: core: Allow use of "status = disabled" in regulator dts nodes
The axp20x and axp22x pmics have ldo regulators which are muxed to the outside via gpio pins. Unfortunately regulator enable / disable is implemented in the hardware via selecting a specific pin-mux option.
So if we want to use these pins as gpio pins we must not register a regulator for these pins at all, otherwise any gpio use (switching to input, or writing a value) gets undone when the regulator subsys disables unused regulators at the end of kernel-init.
This commits allows the use of "status = disabled" in regulator dts nodes and makes regulator_register return ENODEV when this is set.
Note that this commit changes the loop to find the of-node in regulator_of_get_init_data from using for_each_available_child_of_node to using for_each_child_of_node. regulator_register is the only user of regulator_of_get_init_data and the use of for_each_available_child... makes little sense there since this will only cause the constraints from regulator dts nodes marked as disabled to not be used, the actual registration of the regulator would still continue.
So in a way this patch could be seen as a bugfix as it actually makes regulators with an of_node which is marked as not available not register, but this behavior change may cause some issues in some places.
Note that individual regulator drivers / callers of regulator_register which may encounter disabled regulator (child) nodes need to be patched to handle ENODEV (to not make it fail their probe method).
--- drivers/regulator/core.c | 6 ++++++ drivers/regulator/of_regulator.c | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-)
drivers/regulator/core.c +6 -0
@@ -3894,6 +3894,12 @@ regulator_register(const struct regulator_desc *regulator_desc, rdev->dev.of_node =of_node_get (config->of_node); } +if (rdev->dev.of_node && !of_device_is_available (rdev->dev.of_node)) { +kfree (config); +kfree (rdev); +return ERR_PTR (-ENODEV ); + } +mutex_lock (®ulator_list_mutex);mutex_init (&rdev->mutex);
drivers/regulator/of_regulator.c +1 -1
@@ -310,7 +310,7 @@ struct regulator_init_data *regulator_of_get_init_data(struct device *dev,return NULL ; } -for_each_available_child_of_node (search, child) { +for_each_child_of_node (search, child) { name =of_get_property (child,"regulator-compatible" ,NULL );if (!name) name = child->name;
Signature · 1 line
2.7.2
PATCH 2/3 regulator: axp20x: Handle regulator_register returning ENODEV
Handle regulator_register returning ENODEV, this may happen when the dts node for the regulator contains "status = disabled" which is useful for the ldo_io regulators, to avoid the regulator code getting in the way of gpio use of these pins.
--- drivers/regulator/axp20x-regulator.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/regulator/axp20x-regulator.c +3 -0
@@ -421,6 +421,9 @@ static int axp20x_regulator_probe(struct platform_device *pdev) rdev =devm_regulator_register (&pdev->dev, desc, &config);if (IS_ERR (rdev)) { +if (PTR_ERR (rdev) == -ENODEV ) +continue ; +dev_err (&pdev->dev,"Failed to register %s\n" , regulators[i].name);
Signature · 1 line
2.7.2
PATCH 3/3 ARM: dts: sunxi: Disable axp22x ldo_io# regulators by default
In reply to Hans de GoedeUse of these as regulators conflicts with use of the gpio pins as gpios, so disabled the ldo_io# regulators by default.
--- arch/arm/boot/dts/axp22x.dtsi | 2 ++ 1 file changed, 2 insertions(+)
arch/arm/boot/dts/axp22x.dtsi +2 -0
@@ -126,10 +126,12 @@ reg_ldo_io0: ldo_io0 { regulator-name = "ldo_io0"; + status = "disabled"; }; reg_ldo_io1: ldo_io1 { regulator-name = "ldo_io1"; + status = "disabled"; }; reg_rtc_ldo: rtc_ldo {
Signature · 1 line
2.7.2
PATCH 1/3 regulator: core: Allow use of "status = disabled" in regulator dts nodes
In reply to Hans de GoedeHi Mark,
Quoted 24 lines · Hans de Goede
The axp20x and axp22x pmics have ldo regulators which are muxed to the outside via gpio pins. Unfortunately regulator enable / disable is implemented in the hardware via selecting a specific pin-mux option.
So if we want to use these pins as gpio pins we must not register a regulator for these pins at all, otherwise any gpio use (switching to input, or writing a value) gets undone when the regulator subsys disables unused regulators at the end of kernel-init.
This commits allows the use of "status = disabled" in regulator dts nodes and makes
regulator_registerreturn ENODEV when this is set.Note that this commit changes the loop to find the of-node in
regulator_of_get_init_datafrom usingfor_each_available_child_of_nodeto usingfor_each_child_of_node.regulator_registeris the only user ofregulator_of_get_init_dataand the use offor_each_available_child... makes little sense there since this will only cause the constraints from regulator dts nodes marked as disabled to not be used, the actual registration of the regulator would still continue.So in a way this patch could be seen as a bugfix as it actually makes regulators with an
of_nodewhich is marked as not available not register, but this behavior change may cause some issues in some places.
Quoted 5 lines
Note that individual regulator drivers / callers of
regulator_registerwhich may encounter disabled regulator (child) nodes need to be patched to handle ENODEV (to not make it fail their probe method).Signed-off-by Hans de Goede <[email protected]>
Any comments on this one?
Thanks,
Maxime
Signature · 10 lines
Maxime Ripard, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 819 bytes Desc: Digital signature URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20160329/b78cb4eb/attachment.sig>