1*91785f70SSimon Glass /* 2*91785f70SSimon Glass * Copyright (C) 2015, Google, Inc 3*91785f70SSimon Glass * Copyright (C) 2014, Bin Meng <bmeng.cn@gmail.com> 4*91785f70SSimon Glass * 5*91785f70SSimon Glass * SPDX-License-Identifier: GPL-2.0+ 6*91785f70SSimon Glass */ 7*91785f70SSimon Glass 8*91785f70SSimon Glass #include <common.h> 9*91785f70SSimon Glass #include <errno.h> 10*91785f70SSimon Glass #include <malloc.h> 11*91785f70SSimon Glass #include <sdhci.h> 12*91785f70SSimon Glass #include <asm/pci.h> 13*91785f70SSimon Glass 14*91785f70SSimon Glass int pci_mmc_init(const char *name, struct pci_device_id *mmc_supported, 15*91785f70SSimon Glass int num_ids) 16*91785f70SSimon Glass { 17*91785f70SSimon Glass struct sdhci_host *mmc_host; 18*91785f70SSimon Glass pci_dev_t devbusfn; 19*91785f70SSimon Glass u32 iobase; 20*91785f70SSimon Glass int ret; 21*91785f70SSimon Glass int i; 22*91785f70SSimon Glass 23*91785f70SSimon Glass for (i = 0; i < num_ids; i++) { 24*91785f70SSimon Glass devbusfn = pci_find_devices(mmc_supported, i); 25*91785f70SSimon Glass if (devbusfn == -1) 26*91785f70SSimon Glass return -ENODEV; 27*91785f70SSimon Glass 28*91785f70SSimon Glass mmc_host = malloc(sizeof(struct sdhci_host)); 29*91785f70SSimon Glass if (!mmc_host) 30*91785f70SSimon Glass return -ENOMEM; 31*91785f70SSimon Glass 32*91785f70SSimon Glass mmc_host->name = (char *)name; 33*91785f70SSimon Glass pci_read_config_dword(devbusfn, PCI_BASE_ADDRESS_0, &iobase); 34*91785f70SSimon Glass mmc_host->ioaddr = (void *)iobase; 35*91785f70SSimon Glass mmc_host->quirks = 0; 36*91785f70SSimon Glass ret = add_sdhci(mmc_host, 0, 0); 37*91785f70SSimon Glass if (ret) 38*91785f70SSimon Glass return ret; 39*91785f70SSimon Glass } 40*91785f70SSimon Glass 41*91785f70SSimon Glass return 0; 42*91785f70SSimon Glass } 43