dm: Convert PCI MMC over to use DM PCI API

At present pci_mmc_init() does not correctly use the PCI function since the
list it passes is not terminated. The array size passed to pci_mmc_init() is
actually not used correctly. Fix this and adjust the pci_mmc_init() to scan
all available MMC devices.

Adjust this code to use the new driver model PCI API.

This should move over to the new MMC uclass at some point.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
Simon Glass 2015-11-29 13:18:08 -07:00
parent 09c5c16455
commit 4abe8e40a7
5 changed files with 15 additions and 18 deletions

View File

@ -14,12 +14,12 @@
static struct pci_device_id mmc_supported[] = { static struct pci_device_id mmc_supported[] = {
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_VALLEYVIEW_SDIO }, { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_VALLEYVIEW_SDIO },
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_VALLEYVIEW_SDCARD }, { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_VALLEYVIEW_SDCARD },
{},
}; };
int cpu_mmc_init(bd_t *bis) int cpu_mmc_init(bd_t *bis)
{ {
return pci_mmc_init("ValleyView SDHCI", mmc_supported, return pci_mmc_init("ValleyView SDHCI", mmc_supported);
ARRAY_SIZE(mmc_supported));
} }
#ifndef CONFIG_EFI_APP #ifndef CONFIG_EFI_APP

View File

@ -19,6 +19,7 @@
static struct pci_device_id mmc_supported[] = { static struct pci_device_id mmc_supported[] = {
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_QRK_SDIO }, { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_QRK_SDIO },
{},
}; };
/* /*
@ -337,8 +338,7 @@ int arch_early_init_r(void)
int cpu_mmc_init(bd_t *bis) int cpu_mmc_init(bd_t *bis)
{ {
return pci_mmc_init("Quark SDHCI", mmc_supported, return pci_mmc_init("Quark SDHCI", mmc_supported);
ARRAY_SIZE(mmc_supported));
} }
void cpu_irq_init(void) void cpu_irq_init(void)

View File

@ -11,10 +11,10 @@
static struct pci_device_id mmc_supported[] = { static struct pci_device_id mmc_supported[] = {
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_TCF_SDIO_0 }, { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_TCF_SDIO_0 },
{ PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_TCF_SDIO_1 }, { PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_TCF_SDIO_1 },
{},
}; };
int cpu_mmc_init(bd_t *bis) int cpu_mmc_init(bd_t *bis)
{ {
return pci_mmc_init("Topcliff SDHCI", mmc_supported, return pci_mmc_init("Topcliff SDHCI", mmc_supported);
ARRAY_SIZE(mmc_supported));
} }

View File

@ -11,26 +11,25 @@
#include <sdhci.h> #include <sdhci.h>
#include <asm/pci.h> #include <asm/pci.h>
int pci_mmc_init(const char *name, struct pci_device_id *mmc_supported, int pci_mmc_init(const char *name, struct pci_device_id *mmc_supported)
int num_ids)
{ {
struct sdhci_host *mmc_host; struct sdhci_host *mmc_host;
pci_dev_t devbusfn;
u32 iobase; u32 iobase;
int ret; int ret;
int i; int i;
for (i = 0; i < num_ids; i++) { for (i = 0; ; i++) {
devbusfn = pci_find_devices(mmc_supported, i); struct udevice *dev;
if (devbusfn == -1)
return -ENODEV;
ret = pci_find_device_id(mmc_supported, i, &dev);
if (ret)
return ret;
mmc_host = malloc(sizeof(struct sdhci_host)); mmc_host = malloc(sizeof(struct sdhci_host));
if (!mmc_host) if (!mmc_host)
return -ENOMEM; return -ENOMEM;
mmc_host->name = (char *)name; mmc_host->name = (char *)name;
pci_read_config_dword(devbusfn, PCI_BASE_ADDRESS_0, &iobase); dm_pci_read_config32(dev, PCI_BASE_ADDRESS_0, &iobase);
mmc_host->ioaddr = (void *)iobase; mmc_host->ioaddr = (void *)iobase;
mmc_host->quirks = 0; mmc_host->quirks = 0;
ret = add_sdhci(mmc_host, 0, 0); ret = add_sdhci(mmc_host, 0, 0);

View File

@ -489,11 +489,9 @@ struct pci_device_id;
* This finds all the matching PCI IDs and sets them up as MMC devices. * This finds all the matching PCI IDs and sets them up as MMC devices.
* *
* @name: Name to use for devices * @name: Name to use for devices
* @mmc_supported: PCI IDs to search for * @mmc_supported: PCI IDs to search for, terminated by {0, 0}
* @num_ids: Number of elements in @mmc_supported
*/ */
int pci_mmc_init(const char *name, struct pci_device_id *mmc_supported, int pci_mmc_init(const char *name, struct pci_device_id *mmc_supported);
int num_ids);
/* Set block count limit because of 16 bit register limit on some hardware*/ /* Set block count limit because of 16 bit register limit on some hardware*/
#ifndef CONFIG_SYS_MMC_MAX_BLK_COUNT #ifndef CONFIG_SYS_MMC_MAX_BLK_COUNT