xref: /rk3399_rockchip-uboot/drivers/mmc/pci_mmc.c (revision b7c6baef2891ce8978cbfddb66e944943473ac21)
191785f70SSimon Glass /*
291785f70SSimon Glass  * Copyright (C) 2015, Google, Inc
391785f70SSimon Glass  * Copyright (C) 2014, Bin Meng <bmeng.cn@gmail.com>
491785f70SSimon Glass  *
591785f70SSimon Glass  * SPDX-License-Identifier:	GPL-2.0+
691785f70SSimon Glass  */
791785f70SSimon Glass 
891785f70SSimon Glass #include <common.h>
9*b7c6baefSSimon Glass #include <dm.h>
1091785f70SSimon Glass #include <errno.h>
1191785f70SSimon Glass #include <malloc.h>
12*b7c6baefSSimon Glass #include <mapmem.h>
1391785f70SSimon Glass #include <sdhci.h>
1491785f70SSimon Glass #include <asm/pci.h>
1591785f70SSimon Glass 
16*b7c6baefSSimon Glass struct pci_mmc_plat {
17*b7c6baefSSimon Glass 	struct mmc_config cfg;
18*b7c6baefSSimon Glass 	struct mmc mmc;
19*b7c6baefSSimon Glass };
20*b7c6baefSSimon Glass 
21*b7c6baefSSimon Glass struct pci_mmc_priv {
22*b7c6baefSSimon Glass 	struct sdhci_host host;
23*b7c6baefSSimon Glass 	void *base;
24*b7c6baefSSimon Glass };
25*b7c6baefSSimon Glass 
26*b7c6baefSSimon Glass static int pci_mmc_probe(struct udevice *dev)
2791785f70SSimon Glass {
28*b7c6baefSSimon Glass 	struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
29*b7c6baefSSimon Glass 	struct pci_mmc_plat *plat = dev_get_platdata(dev);
30*b7c6baefSSimon Glass 	struct pci_mmc_priv *priv = dev_get_priv(dev);
31*b7c6baefSSimon Glass 	struct sdhci_host *host = &priv->host;
32*b7c6baefSSimon Glass 	u32 ioaddr;
3391785f70SSimon Glass 	int ret;
3491785f70SSimon Glass 
35*b7c6baefSSimon Glass 	dm_pci_read_config32(dev, PCI_BASE_ADDRESS_0, &ioaddr);
36*b7c6baefSSimon Glass 	host->ioaddr = map_sysmem(ioaddr, 0);
37*b7c6baefSSimon Glass 	host->name = dev->name;
38*b7c6baefSSimon Glass 	ret = sdhci_setup_cfg(&plat->cfg, host, 0, 0);
394abe8e40SSimon Glass 	if (ret)
404abe8e40SSimon Glass 		return ret;
41*b7c6baefSSimon Glass 	host->mmc = &plat->mmc;
42*b7c6baefSSimon Glass 	host->mmc->priv = &priv->host;
43*b7c6baefSSimon Glass 	host->mmc->dev = dev;
44*b7c6baefSSimon Glass 	upriv->mmc = host->mmc;
4591785f70SSimon Glass 
46*b7c6baefSSimon Glass 	return sdhci_probe(dev);
4791785f70SSimon Glass }
4891785f70SSimon Glass 
49*b7c6baefSSimon Glass static int pci_mmc_bind(struct udevice *dev)
50*b7c6baefSSimon Glass {
51*b7c6baefSSimon Glass 	struct pci_mmc_plat *plat = dev_get_platdata(dev);
52*b7c6baefSSimon Glass 
53*b7c6baefSSimon Glass 	return sdhci_bind(dev, &plat->mmc, &plat->cfg);
5491785f70SSimon Glass }
55*b7c6baefSSimon Glass 
56*b7c6baefSSimon Glass U_BOOT_DRIVER(pci_mmc) = {
57*b7c6baefSSimon Glass 	.name	= "pci_mmc",
58*b7c6baefSSimon Glass 	.id	= UCLASS_MMC,
59*b7c6baefSSimon Glass 	.bind	= pci_mmc_bind,
60*b7c6baefSSimon Glass 	.probe	= pci_mmc_probe,
61*b7c6baefSSimon Glass 	.ops	= &sdhci_ops,
62*b7c6baefSSimon Glass 	.priv_auto_alloc_size = sizeof(struct pci_mmc_priv),
63*b7c6baefSSimon Glass 	.platdata_auto_alloc_size = sizeof(struct pci_mmc_plat),
64*b7c6baefSSimon Glass };
65*b7c6baefSSimon Glass 
66*b7c6baefSSimon Glass static struct pci_device_id mmc_supported[] = {
67*b7c6baefSSimon Glass 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BYT_SDIO) },
68*b7c6baefSSimon Glass 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BYT_SD) },
69*b7c6baefSSimon Glass 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BYT_EMMC2) },
70*b7c6baefSSimon Glass 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_QRK_SDIO) },
71*b7c6baefSSimon Glass 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_TCF_SDIO_0) },
72*b7c6baefSSimon Glass 	{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_TCF_SDIO_1) },
73*b7c6baefSSimon Glass 	{},
74*b7c6baefSSimon Glass };
75*b7c6baefSSimon Glass 
76*b7c6baefSSimon Glass U_BOOT_PCI_DEVICE(pci_mmc, mmc_supported);
77