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>
This commit is contained in:
Martin Blumenstingl
2025-11-09 00:12:53 +01:00
committed by Ulf Hansson
parent 38fffa9510
commit 1bed7f9548

View 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;
/*
* 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);
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;
}
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) {