This adds support for OF_PLATDATA to the socfpga_dw_mmc driver.

To do that, also the name of the driver has to be changed to match the
compatible string in the platdata generated from dts.

Signed-off-by: Simon Goldschmidt <simon.k.r.goldschm...@gmail.com>

---

 drivers/mmc/socfpga_dw_mmc.c | 28 +++++++++++++++++++++++++---
 1 file changed, 25 insertions(+), 3 deletions(-)

diff --git a/drivers/mmc/socfpga_dw_mmc.c b/drivers/mmc/socfpga_dw_mmc.c
index 739c1629a2..8503dff932 100644
--- a/drivers/mmc/socfpga_dw_mmc.c
+++ b/drivers/mmc/socfpga_dw_mmc.c
@@ -8,6 +8,7 @@
 #include <asm/arch/system_manager.h>
 #include <clk.h>
 #include <dm.h>
+#include <dt-structs.h>
 #include <dwmmc.h>
 #include <errno.h>
 #include <fdtdec.h>
@@ -24,6 +25,9 @@ static const struct socfpga_system_manager 
*system_manager_base =
                (void *)SOCFPGA_SYSMGR_ADDRESS;
 
 struct socfpga_dwmci_plat {
+#if CONFIG_IS_ENABLED(OF_PLATDATA)
+       struct dtd_altr_socfpga_dw_mshc dtplat;
+#endif
        struct mmc_config cfg;
        struct mmc mmc;
 };
@@ -100,6 +104,7 @@ static int socfpga_dwmmc_get_clk_rate(struct udevice *dev)
 
 static int socfpga_dwmmc_ofdata_to_platdata(struct udevice *dev)
 {
+#if !CONFIG_IS_ENABLED(OF_PLATDATA)
        struct dwmci_socfpga_priv_data *priv = dev_get_priv(dev);
        struct dwmci_host *host = &priv->host;
        int fifo_depth;
@@ -129,13 +134,13 @@ static int socfpga_dwmmc_ofdata_to_platdata(struct 
udevice *dev)
        priv->smplsel = fdtdec_get_uint(gd->fdt_blob, dev_of_offset(dev),
                                        "smplsel", 0);
        host->priv = priv;
-
+#endif
        return 0;
 }
 
 static int socfpga_dwmmc_probe(struct udevice *dev)
 {
-#ifdef CONFIG_BLK
+#if defined(CONFIG_BLK) || CONFIG_IS_ENABLED(OF_PLATDATA)
        struct socfpga_dwmci_plat *plat = dev_get_platdata(dev);
 #endif
        struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
@@ -143,6 +148,23 @@ static int socfpga_dwmmc_probe(struct udevice *dev)
        struct dwmci_host *host = &priv->host;
        int ret;
 
+#if CONFIG_IS_ENABLED(OF_PLATDATA)
+       struct dtd_altr_socfpga_dw_mshc *dtplat = &plat->dtplat;
+
+       host->name = dev->name;
+       host->ioaddr = (void *)dtplat->reg[0];
+       host->buswidth = dtplat->bus_width;
+       host->clksel = socfpga_dwmci_clksel;
+       host->dev_index = 0;
+       host->fifoth_val = MSIZE(0x2) |
+               RX_WMARK(dtplat->fifo_depth / 2 - 1) |
+               TX_WMARK(dtplat->fifo_depth / 2);
+       host->priv = priv;
+       /* TODO: these are optional, of-platdata does not support this. */
+       priv->drvsel = 3;
+       priv->smplsel = 0;
+#endif
+
        ret = socfpga_dwmmc_get_clk_rate(dev);
        if (ret)
                return ret;
@@ -185,7 +207,7 @@ static const struct udevice_id socfpga_dwmmc_ids[] = {
 };
 
 U_BOOT_DRIVER(socfpga_dwmmc_drv) = {
-       .name           = "socfpga_dwmmc",
+       .name           = "altr_socfpga_dw_mshc",
        .id             = UCLASS_MMC,
        .of_match       = socfpga_dwmmc_ids,
        .ofdata_to_platdata = socfpga_dwmmc_ofdata_to_platdata,
-- 
2.17.1

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot

Reply via email to