]> git.baikalelectronics.ru Git - uboot.git/commitdiff
mmc/aspeed: Probe from controller
authorJoel Stanley <joel@jms.id.au>
Thu, 23 Jun 2022 09:05:34 +0000 (18:35 +0930)
committerTom Rini <trini@konsulko.com>
Wed, 6 Jul 2022 18:31:29 +0000 (14:31 -0400)
The Aspeed SDHCI controller is arranged with some shared control
registers, followed by one or two sets of actual SDHCI registers.

Adjust the driver to probe this controller device first. The driver then
wants to iterate over the child nodes to probe the SDHCI proper:

    ofnode node;

    dev_for_each_subnode(node, parent) {
     struct udevice *dev;
     int ret;

     ret = device_bind_driver_to_node(parent, "aspeed_sdhci",
      ofnode_get_name(node),
      node, &dev);
     if (ret)
     return ret;
    }

However if we did this the sdhci driver would probe twice; once
"naturally" from the device tree and a second time due to this code.

Instead of doing this we can rely on the probe order, where the
controller will be set up before the sdhci devices. A better solution is
preferred.

Select MISC as the controller driver is implemented as a misc device.

Signed-off-by: Joel Stanley <joel@jms.id.au>
drivers/mmc/Kconfig
drivers/mmc/aspeed_sdhci.c

index 53a6b0093d10b2d167e77a33eb6af10d5f3335ef..b44cd98150f199c24e7c21cda1b6935a073d38b6 100644 (file)
@@ -502,6 +502,7 @@ config MMC_SDHCI_ASPEED
        depends on ARCH_ASPEED
        depends on DM_MMC
        depends on MMC_SDHCI
+       select MISC
        help
          Enables support for the Aspeed SDHCI 2.0 controller present on Aspeed
          SoCs. This device is compatible with SD 3.0 and/or MMC 4.3
index c71daae97584598f249a8a9ab54343a5d6be2fca..5591fa2b08910d25841f4b07d132a5d49a125daa 100644 (file)
@@ -10,6 +10,7 @@
 #include <malloc.h>
 #include <sdhci.h>
 #include <linux/err.h>
+#include <dm/lists.h>
 
 struct aspeed_sdhci_plat {
        struct mmc_config cfg;
@@ -94,3 +95,23 @@ U_BOOT_DRIVER(aspeed_sdhci_drv) = {
        .priv_auto      = sizeof(struct sdhci_host),
        .plat_auto      = sizeof(struct aspeed_sdhci_plat),
 };
+
+
+static int aspeed_sdc_probe(struct udevice *parent)
+{
+       return 0;
+}
+
+static const struct udevice_id aspeed_sdc_ids[] = {
+       { .compatible = "aspeed,ast2400-sd-controller" },
+       { .compatible = "aspeed,ast2500-sd-controller" },
+       { .compatible = "aspeed,ast2600-sd-controller" },
+       { }
+};
+
+U_BOOT_DRIVER(aspeed_sdc_drv) = {
+       .name           = "aspeed_sdc",
+       .id             = UCLASS_MISC,
+       .of_match       = aspeed_sdc_ids,
+       .probe          = aspeed_sdc_probe,
+};