summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Blumenstingl <martin.blumenstingl@googlemail.com>2025-11-09 00:12:53 +0100
committerUlf Hansson <ulf.hansson@linaro.org>2025-11-18 16:21:36 +0100
commit1bed7f954865ceab45c8949017517c02e3f5cae3 (patch)
tree24d73a4ec3369814e6a4476f1c6dbcc89a4779e3
parent38fffa9510827e1861ad0a5f0392148bc2aec5e6 (diff)
mmc: meson-mx-sdio: Ignore disabled "mmc-slot" child-nodes
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>
-rw-r--r--drivers/mmc/host/meson-mx-sdio.c37
1 files changed, 21 insertions, 16 deletions
diff --git a/drivers/mmc/host/meson-mx-sdio.c b/drivers/mmc/host/meson-mx-sdio.c
index e8b63dc45dd8..5921e2cb2180 100644
--- a/drivers/mmc/host/meson-mx-sdio.c
+++ b/drivers/mmc/host/meson-mx-sdio.c
@@ -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) {