X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=drivers%2Fmmc%2Fpic32_sdhci.c;h=029e0fbc2bb92f08a682fd68593417006640958a;hb=f541796af929fa28a78dc3162a0ba09d4fa3ce90;hp=28da55d2db5e1aa8546ee6e0e7d710f06eb6b61b;hpb=161b1fe745394f34c4aa506edc964089785919f6;p=oweals%2Fu-boot.git diff --git a/drivers/mmc/pic32_sdhci.c b/drivers/mmc/pic32_sdhci.c index 28da55d2db..029e0fbc2b 100644 --- a/drivers/mmc/pic32_sdhci.c +++ b/drivers/mmc/pic32_sdhci.c @@ -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 - * - * SPDX-License-Identifier: GPL-2.0+ */ -#include #include +#include #include -#include +#include #include 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[] = {