Re: [PATCH 2/2] mfd: mfd-core: Honour Device Tree's request to disable a child-device

From: Robin Murphy
Date: Fri Oct 18 2019 - 12:22:06 EST


On 18/10/2019 13:26, Lee Jones wrote:
Until now, MFD has assumed all child devices passed to it (via
mfd_cells) are to be registered. It does not take into account
requests from Device Tree and the like to disable child devices
on a per-platform basis.

Well now it does.

Reported-by: Barry Song <Baohua.Song@xxxxxxx>
Reported-by: Stephan Gerhold <stephan@xxxxxxxxxxx>
Signed-off-by: Lee Jones <lee.jones@xxxxxxxxxx>
---
drivers/mfd/mfd-core.c | 5 +++++
1 file changed, 5 insertions(+)

diff --git a/drivers/mfd/mfd-core.c b/drivers/mfd/mfd-core.c
index eafdadd58e8b..24c139633524 100644
--- a/drivers/mfd/mfd-core.c
+++ b/drivers/mfd/mfd-core.c
@@ -182,6 +182,11 @@ static int mfd_add_device(struct device *parent, int id,
if (parent->of_node && cell->of_compatible) {
for_each_child_of_node(parent->of_node, np) {
if (of_device_is_compatible(np, cell->of_compatible)) {
+ if (!of_device_is_available(np)) {
+ /* Ignore disabled devices error free */
+ ret = 0;
+ goto fail_alias;
+ }

Is it possible for a device to have multiple children of the same type? If so, it seems like this might not work as desired if, say, the first child was disabled but subsequent ones weren't.

It might make sense to use for_each_available_child_of_node() for the outer loop, then check afterwards if anything was found.

Robin.

pdev->dev.of_node = np;
pdev->dev.fwnode = &np->fwnode;
break;