]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
mmc: meson-mx-sdio: Ignore disabled "mmc-slot" child-nodes
authorMartin Blumenstingl <martin.blumenstingl@googlemail.com>
Sat, 8 Nov 2025 23:12:53 +0000 (00:12 +0100)
committerUlf Hansson <ulf.hansson@linaro.org>
Tue, 18 Nov 2025 15:21:36 +0000 (16:21 +0100)
The meson-mx-sdio (and mmc core) only support one MMC/SD/SDIO slot
(device) per host. Thus having multiple mmc-slot nodes (one for the up
to three supported slots with one device each on the meson-mx-sdio
hardware) can be problematic.

Allow specifying all slots (with their respective device) connected to
the meson-mx-sdio hardware in device-tree, while making sure that only
the enabled one(s) are actually considered by the driver.

Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
drivers/mmc/host/meson-mx-sdio.c

index e8b63dc45dd87e55576926f24e80f83d9d46e4a6..5921e2cb2180e58c30a6f2798eae8bee63f5c0bc 100644 (file)
@@ -493,23 +493,30 @@ static struct mmc_host_ops meson_mx_mmc_ops = {
 
 static struct platform_device *meson_mx_mmc_slot_pdev(struct device *parent)
 {
-       struct device_node *slot_node;
-       struct platform_device *pdev;
+       struct platform_device *pdev = NULL;
+
+       for_each_available_child_of_node_scoped(parent->of_node, slot_node) {
+               if (!of_device_is_compatible(slot_node, "mmc-slot"))
+                       continue;
+
+               /*
+                * TODO: the MMC core framework currently does not support
+                * controllers with multiple slots properly. So we only
+                * register the first slot for now.
+                */
+               if (pdev) {
+                       dev_warn(parent,
+                                "more than one 'mmc-slot' compatible child found - using the first one and ignoring all subsequent ones\n");
+                       break;
+               }
 
-       /*
-        * TODO: the MMC core framework currently does not support
-        * controllers with multiple slots properly. So we only register
-        * the first slot for now
-        */
-       slot_node = of_get_compatible_child(parent->of_node, "mmc-slot");
-       if (!slot_node) {
-               dev_warn(parent, "no 'mmc-slot' sub-node found\n");
-               return ERR_PTR(-ENOENT);
+               pdev = of_platform_device_create(slot_node, NULL, parent);
+               if (!pdev)
+                       dev_err(parent,
+                               "Failed to create platform device for mmc-slot node '%pOF'\n",
+                               slot_node);
        }
 
-       pdev = of_platform_device_create(slot_node, NULL, parent);
-       of_node_put(slot_node);
-
        return pdev;
 }
 
@@ -642,8 +649,6 @@ static int meson_mx_mmc_probe(struct platform_device *pdev)
        slot_pdev = meson_mx_mmc_slot_pdev(&pdev->dev);
        if (!slot_pdev)
                return -ENODEV;
-       else if (IS_ERR(slot_pdev))
-               return PTR_ERR(slot_pdev);
 
        mmc = devm_mmc_alloc_host(&slot_pdev->dev, sizeof(*host));
        if (!mmc) {