[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <20251108231253.1641927-8-martin.blumenstingl@googlemail.com>
Date: Sun, 9 Nov 2025 00:12:53 +0100
From: Martin Blumenstingl <martin.blumenstingl@...glemail.com>
To: linux-amlogic@...ts.infradead.org,
linux-mmc@...r.kernel.org
Cc: linux-arm-kernel@...ts.infradead.org,
linux-kernel@...r.kernel.org,
ulf.hansson@...aro.org,
Martin Blumenstingl <martin.blumenstingl@...glemail.com>
Subject: [PATCH v1 7/7] 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@...glemail.com>
---
drivers/mmc/host/meson-mx-sdio.c | 37 ++++++++++++++++++--------------
1 file 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) {
--
2.51.2
Powered by blists - more mailing lists