diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/mmc/pci_mmc.c | 86 |
1 files changed, 26 insertions, 60 deletions
diff --git a/drivers/mmc/pci_mmc.c b/drivers/mmc/pci_mmc.c index 6db8977..e39b476 100644 --- a/drivers/mmc/pci_mmc.c +++ b/drivers/mmc/pci_mmc.c @@ -6,71 +6,37 @@ */ #include <common.h> -#include <dm.h> #include <errno.h> #include <malloc.h> -#include <mapmem.h> #include <sdhci.h> #include <asm/pci.h> -struct pci_mmc_plat { - struct mmc_config cfg; - struct mmc mmc; -}; - -struct pci_mmc_priv { - struct sdhci_host host; - void *base; -}; - -static int pci_mmc_probe(struct udevice *dev) +int pci_mmc_init(const char *name, struct pci_device_id *mmc_supported) { - struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev); - struct pci_mmc_plat *plat = dev_get_platdata(dev); - struct pci_mmc_priv *priv = dev_get_priv(dev); - struct sdhci_host *host = &priv->host; - u32 ioaddr; + struct sdhci_host *mmc_host; + u32 iobase; int ret; - - dm_pci_read_config32(dev, PCI_BASE_ADDRESS_0, &ioaddr); - host->ioaddr = map_sysmem(ioaddr, 0); - host->name = dev->name; - ret = sdhci_setup_cfg(&plat->cfg, host, 0, 0); - if (ret) - return ret; - host->mmc = &plat->mmc; - host->mmc->priv = &priv->host; - host->mmc->dev = dev; - upriv->mmc = host->mmc; - - return sdhci_probe(dev); + int i; + + for (i = 0; ; i++) { + struct udevice *dev; + + ret = pci_find_device_id(mmc_supported, i, &dev); + if (ret) + return ret; + mmc_host = malloc(sizeof(struct sdhci_host)); + if (!mmc_host) + return -ENOMEM; + + mmc_host->name = name; + dm_pci_read_config32(dev, PCI_BASE_ADDRESS_0, &iobase); + mmc_host->ioaddr = (void *)(ulong)iobase; + mmc_host->quirks = 0; + mmc_host->max_clk = 0; + ret = add_sdhci(mmc_host, 0, 0); + if (ret) + return ret; + } + + return 0; } - -static int pci_mmc_bind(struct udevice *dev) -{ - struct pci_mmc_plat *plat = dev_get_platdata(dev); - - return sdhci_bind(dev, &plat->mmc, &plat->cfg); -} - -U_BOOT_DRIVER(pci_mmc) = { - .name = "pci_mmc", - .id = UCLASS_MMC, - .bind = pci_mmc_bind, - .probe = pci_mmc_probe, - .ops = &sdhci_ops, - .priv_auto_alloc_size = sizeof(struct pci_mmc_priv), - .platdata_auto_alloc_size = sizeof(struct pci_mmc_plat), -}; - -static struct pci_device_id mmc_supported[] = { - { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BYT_SDIO) }, - { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BYT_SD) }, - { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BYT_EMMC2) }, - { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_QRK_SDIO) }, - { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_TCF_SDIO_0) }, - { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_TCF_SDIO_1) }, - {}, -}; - -U_BOOT_PCI_DEVICE(pci_mmc, mmc_supported); |