]> git.sur5r.net Git - u-boot/blobdiff - drivers/mmc/pic32_sdhci.c
Merge branch 'master' of git://git.denx.de/u-boot-sunxi
[u-boot] / drivers / mmc / pic32_sdhci.c
index 28da55d2db5e1aa8546ee6e0e7d710f06eb6b61b..029e0fbc2bb92f08a682fd68593417006640958a 100644 (file)
@@ -1,20 +1,33 @@
+// SPDX-License-Identifier: GPL-2.0+
 /*
  * Support of SDHCI for Microchip PIC32 SoC.
  *
  * Copyright (C) 2015 Microchip Technology Inc.
  * Andrei Pistirica <andrei.pistirica@microchip.com>
- *
- * SPDX-License-Identifier:    GPL-2.0+
  */
 
-#include <dm.h>
 #include <common.h>
+#include <dm.h>
 #include <sdhci.h>
-#include <asm/errno.h>
+#include <linux/errno.h>
 #include <mach/pic32.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
+static int pic32_sdhci_get_cd(struct sdhci_host *host)
+{
+       /* PIC32 SDHCI CD errata:
+        * - set CD_TEST and clear CD_TEST_INS bit
+        */
+       sdhci_writeb(host, SDHCI_CTRL_CD_TEST, SDHCI_HOST_CONTROL);
+
+       return 0;
+}
+
+static const struct sdhci_ops pic32_sdhci_ops = {
+       .get_cd = pic32_sdhci_get_cd,
+};
+
 static int pic32_sdhci_probe(struct udevice *dev)
 {
        struct sdhci_host *host = dev_get_priv(dev);
@@ -24,24 +37,32 @@ static int pic32_sdhci_probe(struct udevice *dev)
        fdt_size_t size;
        int ret;
 
-       addr = fdtdec_get_addr_size(fdt, dev->of_offset, "reg", &size);
+       addr = fdtdec_get_addr_size(fdt, dev_of_offset(dev), "reg", &size);
        if (addr == FDT_ADDR_T_NONE)
                return -EINVAL;
 
        host->ioaddr    = ioremap(addr, size);
-       host->name      = (char *)dev->name;
-       host->quirks    = SDHCI_QUIRK_NO_HISPD_BIT | SDHCI_QUIRK_NO_CD;
-       host->bus_width = fdtdec_get_int(gd->fdt_blob, dev->of_offset,
+       host->name      = dev->name;
+       host->quirks    = SDHCI_QUIRK_NO_HISPD_BIT;
+       host->bus_width = fdtdec_get_int(gd->fdt_blob, dev_of_offset(dev),
                                        "bus-width", 4);
+       host->ops = &pic32_sdhci_ops;
 
-       ret = fdtdec_get_int_array(gd->fdt_blob, dev->of_offset,
+       ret = fdtdec_get_int_array(gd->fdt_blob, dev_of_offset(dev),
                                   "clock-freq-min-max", f_min_max, 2);
        if (ret) {
                printf("sdhci: clock-freq-min-max not found\n");
                return ret;
        }
 
-       return add_sdhci(host, f_min_max[1], f_min_max[0]);
+       host->max_clk   = f_min_max[1];
+
+       ret = add_sdhci(host, 0, f_min_max[0]);
+       if (ret)
+               return ret;
+       host->mmc->dev = dev;
+
+       return 0;
 }
 
 static const struct udevice_id pic32_sdhci_ids[] = {