[U-Boot] [PATCH v2 1/2] mmc: pci: Add CONFIG_MMC_PCI

From: Felipe Balbi felipe.balbi@linux.intel.com
We don't want pci_mmc to compile every time x86 compiles, only when there's a platform that needs it. For that reason, we're adding a new CONFIG_MMC_PCI which platforms can choose to enable.
Suggested-by: Jaehoon Chung jh80.chung@samsung.com Signed-off-by: Felipe Balbi felipe.balbi@linux.intel.com Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com --- configs/bayleybay_defconfig | 1 + configs/conga-qeval20-qa3-e3845-internal-uart_defconfig | 1 + configs/conga-qeval20-qa3-e3845_defconfig | 1 + configs/crownbay_defconfig | 1 + configs/dfi-bt700-q7x-151_defconfig | 1 + configs/galileo_defconfig | 1 + configs/minnowmax_defconfig | 1 + configs/theadorable-x86-dfi-bt700_defconfig | 1 + drivers/mmc/Kconfig | 8 ++++++++ drivers/mmc/Makefile | 2 +- 10 files changed, 17 insertions(+), 1 deletion(-)
diff --git a/configs/bayleybay_defconfig b/configs/bayleybay_defconfig index c6aa24f9be..d2f9f24a19 100644 --- a/configs/bayleybay_defconfig +++ b/configs/bayleybay_defconfig @@ -48,6 +48,7 @@ CONFIG_REGMAP=y CONFIG_SYSCON=y CONFIG_CPU=y CONFIG_MMC=y +CONFIG_MMC_PCI=y CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI_SDMA=y CONFIG_SPI_FLASH=y diff --git a/configs/conga-qeval20-qa3-e3845-internal-uart_defconfig b/configs/conga-qeval20-qa3-e3845-internal-uart_defconfig index 890d28ce69..d96bfcbe14 100644 --- a/configs/conga-qeval20-qa3-e3845-internal-uart_defconfig +++ b/configs/conga-qeval20-qa3-e3845-internal-uart_defconfig @@ -50,6 +50,7 @@ CONFIG_DM_I2C=y CONFIG_SYS_I2C_INTEL=y CONFIG_WINBOND_W83627=y CONFIG_MMC=y +CONFIG_MMC_PCI=y CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI_SDMA=y CONFIG_SPI_FLASH=y diff --git a/configs/conga-qeval20-qa3-e3845_defconfig b/configs/conga-qeval20-qa3-e3845_defconfig index 6e4cd843d9..1642bf2926 100644 --- a/configs/conga-qeval20-qa3-e3845_defconfig +++ b/configs/conga-qeval20-qa3-e3845_defconfig @@ -49,6 +49,7 @@ CONFIG_DM_I2C=y CONFIG_SYS_I2C_INTEL=y CONFIG_WINBOND_W83627=y CONFIG_MMC=y +CONFIG_MMC_PCI=y CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI_SDMA=y CONFIG_SPI_FLASH=y diff --git a/configs/crownbay_defconfig b/configs/crownbay_defconfig index 13a00c2a17..4a88f5f3c5 100644 --- a/configs/crownbay_defconfig +++ b/configs/crownbay_defconfig @@ -37,6 +37,7 @@ CONFIG_REGMAP=y CONFIG_SYSCON=y CONFIG_CPU=y CONFIG_MMC=y +CONFIG_MMC_PCI=y CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI_SDMA=y CONFIG_SPI_FLASH=y diff --git a/configs/dfi-bt700-q7x-151_defconfig b/configs/dfi-bt700-q7x-151_defconfig index ce447f540a..d5bd66f83c 100644 --- a/configs/dfi-bt700-q7x-151_defconfig +++ b/configs/dfi-bt700-q7x-151_defconfig @@ -47,6 +47,7 @@ CONFIG_CPU=y CONFIG_DM_I2C=y CONFIG_NUVOTON_NCT6102D=y CONFIG_MMC=y +CONFIG_MMC_PCI=y CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI_SDMA=y CONFIG_SPI_FLASH=y diff --git a/configs/galileo_defconfig b/configs/galileo_defconfig index 570f9ea810..f60abc3422 100644 --- a/configs/galileo_defconfig +++ b/configs/galileo_defconfig @@ -42,6 +42,7 @@ CONFIG_REGMAP=y CONFIG_SYSCON=y CONFIG_CPU=y CONFIG_MMC=y +CONFIG_MMC_PCI=y CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI_SDMA=y CONFIG_SPI_FLASH=y diff --git a/configs/minnowmax_defconfig b/configs/minnowmax_defconfig index 5f61f2a19c..8dac1d72fb 100644 --- a/configs/minnowmax_defconfig +++ b/configs/minnowmax_defconfig @@ -47,6 +47,7 @@ CONFIG_REGMAP=y CONFIG_SYSCON=y CONFIG_CPU=y CONFIG_MMC=y +CONFIG_MMC_PCI=y CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI_SDMA=y CONFIG_SPI_FLASH=y diff --git a/configs/theadorable-x86-dfi-bt700_defconfig b/configs/theadorable-x86-dfi-bt700_defconfig index cde33bbfe1..1703cee841 100644 --- a/configs/theadorable-x86-dfi-bt700_defconfig +++ b/configs/theadorable-x86-dfi-bt700_defconfig @@ -47,6 +47,7 @@ CONFIG_CPU=y CONFIG_DM_I2C=y CONFIG_NUVOTON_NCT6102D=y CONFIG_MMC=y +CONFIG_MMC_PCI=y CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI_SDMA=y CONFIG_SPI_FLASH=y diff --git a/drivers/mmc/Kconfig b/drivers/mmc/Kconfig index 01d1dbfb1b..af8436f337 100644 --- a/drivers/mmc/Kconfig +++ b/drivers/mmc/Kconfig @@ -122,6 +122,14 @@ config MMC_MXS
If unsure, say N.
+config MMC_PCI + bool "Support for MMC controllers on PCI" + help + This selects PCI-based MMC controllers. + If you have an MMC controller on a PCI bus, say Y here. + + If unsure, say N. + config MMC_OMAP_HS bool "TI OMAP High Speed Multimedia Card Interface support" help diff --git a/drivers/mmc/Makefile b/drivers/mmc/Makefile index 8e922db3f1..9fccac8ead 100644 --- a/drivers/mmc/Makefile +++ b/drivers/mmc/Makefile @@ -34,7 +34,7 @@ obj-$(CONFIG_MVEBU_MMC) += mvebu_mmc.o obj-$(CONFIG_MMC_OMAP_HS) += omap_hsmmc.o obj-$(CONFIG_MMC_MXC) += mxcmmc.o obj-$(CONFIG_MMC_MXS) += mxsmmc.o -obj-$(CONFIG_X86) += pci_mmc.o +obj-$(CONFIG_MMC_PCI) += pci_mmc.o obj-$(CONFIG_PXA_MMC_GENERIC) += pxa_mmc_gen.o obj-$(CONFIG_SUPPORT_EMMC_RPMB) += rpmb.o obj-$(CONFIG_S3C_SDI) += s3c_sdi.o

From: Felipe Balbi felipe.balbi@linux.intel.com
This patch adds Intel Tangier eMMC/SDHCI driver.
Signed-off-by: Vincent Tinelli vincent.tinelli@intel.com Signed-off-by: Felipe Balbi felipe.balbi@linux.intel.com Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com --- drivers/mmc/Kconfig | 5 ++++ drivers/mmc/Makefile | 1 + drivers/mmc/tangier_sdhci.c | 72 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 drivers/mmc/tangier_sdhci.c
diff --git a/drivers/mmc/Kconfig b/drivers/mmc/Kconfig index af8436f337..e060547b1d 100644 --- a/drivers/mmc/Kconfig +++ b/drivers/mmc/Kconfig @@ -318,6 +318,11 @@ config MMC_SDHCI_XENON
If unsure, say N.
+config MMC_SDHCI_TANGIER + bool "Tangier SDHCI controller support" + depends on DM_MMC && BLK + depends on MMC_SDHCI + config MMC_SDHCI_TEGRA bool "SDHCI platform support for the Tegra SD/MMC Controller" depends on TEGRA diff --git a/drivers/mmc/Makefile b/drivers/mmc/Makefile index 9fccac8ead..b210d2c3b3 100644 --- a/drivers/mmc/Makefile +++ b/drivers/mmc/Makefile @@ -61,6 +61,7 @@ obj-$(CONFIG_MMC_SDHCI_PIC32) += pic32_sdhci.o obj-$(CONFIG_MMC_SDHCI_ROCKCHIP) += rockchip_sdhci.o obj-$(CONFIG_MMC_SDHCI_S5P) += s5p_sdhci.o obj-$(CONFIG_MMC_SDHCI_SPEAR) += spear_sdhci.o +obj-$(CONFIG_MMC_SDHCI_TANGIER) += tangier_sdhci.o obj-$(CONFIG_MMC_SDHCI_TEGRA) += tegra_mmc.o obj-$(CONFIG_MMC_SDHCI_XENON) += xenon_sdhci.o obj-$(CONFIG_MMC_SDHCI_ZYNQ) += zynq_sdhci.o diff --git a/drivers/mmc/tangier_sdhci.c b/drivers/mmc/tangier_sdhci.c new file mode 100644 index 0000000000..5ab2afa8b5 --- /dev/null +++ b/drivers/mmc/tangier_sdhci.c @@ -0,0 +1,72 @@ +#include <common.h> +#include <dm.h> +#include <dm/device.h> +#include <linux/io.h> +#include <linux/sizes.h> +#include <malloc.h> +#include <mmc.h> +#include <sdhci.h> + +struct sdhci_tangier_plat { + struct mmc_config cfg; + struct mmc mmc; + void __iomem *ioaddr; +}; + +static int sdhci_tangier_bind(struct udevice *dev) +{ + struct sdhci_tangier_plat *plat = dev_get_platdata(dev); + + return sdhci_bind(dev, &plat->mmc, &plat->cfg); +} + +static int sdhci_tangier_probe(struct udevice *dev) +{ + struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev); + struct sdhci_tangier_plat *plat = dev_get_platdata(dev); + struct sdhci_host *host = dev_get_priv(dev); + fdt_addr_t base; + int ret; + + base = dev_get_addr(dev); + if (base == FDT_ADDR_T_NONE) + return -EINVAL; + + plat->ioaddr = devm_ioremap(dev, base, SZ_1K); + if (!plat->ioaddr) + return -ENOMEM; + + host->name = dev->name; + host->ioaddr = plat->ioaddr; + host->quirks = SDHCI_QUIRK_NO_HISPD_BIT | SDHCI_QUIRK_BROKEN_VOLTAGE | + SDHCI_QUIRK_32BIT_DMA_ADDR | SDHCI_QUIRK_WAIT_SEND_CMD; + + /* MMC_VDD_32_33 | MMC_VDD_33_34 | MMC_VDD_165_195 */ + host->voltages = MMC_VDD_165_195; + + ret = sdhci_setup_cfg(&plat->cfg, host, 200000000, 400000); + if (ret) + return ret; + + upriv->mmc = &plat->mmc; + host->mmc = &plat->mmc; + host->mmc->priv = host; + + return sdhci_probe(dev); +} + +static const struct udevice_id sdhci_tangier_match[] = { + { .compatible = "intel,sdhci-tangier" }, + { /* sentinel */ } +}; + +U_BOOT_DRIVER(sdhci_tangier) = { + .name = "sdhci-tangier", + .id = UCLASS_MMC, + .of_match = sdhci_tangier_match, + .bind = sdhci_tangier_bind, + .probe = sdhci_tangier_probe, + .ops = &sdhci_ops, + .priv_auto_alloc_size = sizeof(struct sdhci_host), + .platdata_auto_alloc_size = sizeof(struct sdhci_tangier_plat), +};

Hi Andy,
On Fri, Feb 17, 2017 at 9:02 PM, Andy Shevchenko andriy.shevchenko@linux.intel.com wrote:
From: Felipe Balbi felipe.balbi@linux.intel.com
This patch adds Intel Tangier eMMC/SDHCI driver.
So this eMMC/SDHC controller is not on PCI bus, correct? If so, can you add more comments to the commit message?
Signed-off-by: Vincent Tinelli vincent.tinelli@intel.com Signed-off-by: Felipe Balbi felipe.balbi@linux.intel.com Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com
drivers/mmc/Kconfig | 5 ++++ drivers/mmc/Makefile | 1 + drivers/mmc/tangier_sdhci.c | 72 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 drivers/mmc/tangier_sdhci.c
diff --git a/drivers/mmc/Kconfig b/drivers/mmc/Kconfig index af8436f337..e060547b1d 100644 --- a/drivers/mmc/Kconfig +++ b/drivers/mmc/Kconfig @@ -318,6 +318,11 @@ config MMC_SDHCI_XENON
If unsure, say N.
+config MMC_SDHCI_TANGIER
bool "Tangier SDHCI controller support"
depends on DM_MMC && BLK
depends on MMC_SDHCI
Please add a "help" here, like mentioning it's not on PCI bus (if I am correct)?
config MMC_SDHCI_TEGRA bool "SDHCI platform support for the Tegra SD/MMC Controller" depends on TEGRA diff --git a/drivers/mmc/Makefile b/drivers/mmc/Makefile index 9fccac8ead..b210d2c3b3 100644 --- a/drivers/mmc/Makefile +++ b/drivers/mmc/Makefile @@ -61,6 +61,7 @@ obj-$(CONFIG_MMC_SDHCI_PIC32) += pic32_sdhci.o obj-$(CONFIG_MMC_SDHCI_ROCKCHIP) += rockchip_sdhci.o obj-$(CONFIG_MMC_SDHCI_S5P) += s5p_sdhci.o obj-$(CONFIG_MMC_SDHCI_SPEAR) += spear_sdhci.o +obj-$(CONFIG_MMC_SDHCI_TANGIER) += tangier_sdhci.o obj-$(CONFIG_MMC_SDHCI_TEGRA) += tegra_mmc.o obj-$(CONFIG_MMC_SDHCI_XENON) += xenon_sdhci.o obj-$(CONFIG_MMC_SDHCI_ZYNQ) += zynq_sdhci.o diff --git a/drivers/mmc/tangier_sdhci.c b/drivers/mmc/tangier_sdhci.c new file mode 100644 index 0000000000..5ab2afa8b5 --- /dev/null +++ b/drivers/mmc/tangier_sdhci.c @@ -0,0 +1,72 @@
Please add a file header with author and license information here.
+#include <common.h> +#include <dm.h> +#include <dm/device.h> +#include <linux/io.h> +#include <linux/sizes.h> +#include <malloc.h> +#include <mmc.h> +#include <sdhci.h>
+struct sdhci_tangier_plat {
struct mmc_config cfg;
struct mmc mmc;
void __iomem *ioaddr;
+};
+static int sdhci_tangier_bind(struct udevice *dev) +{
struct sdhci_tangier_plat *plat = dev_get_platdata(dev);
return sdhci_bind(dev, &plat->mmc, &plat->cfg);
+}
+static int sdhci_tangier_probe(struct udevice *dev) +{
struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
struct sdhci_tangier_plat *plat = dev_get_platdata(dev);
struct sdhci_host *host = dev_get_priv(dev);
fdt_addr_t base;
int ret;
base = dev_get_addr(dev);
if (base == FDT_ADDR_T_NONE)
return -EINVAL;
plat->ioaddr = devm_ioremap(dev, base, SZ_1K);
if (!plat->ioaddr)
return -ENOMEM;
host->name = dev->name;
host->ioaddr = plat->ioaddr;
host->quirks = SDHCI_QUIRK_NO_HISPD_BIT | SDHCI_QUIRK_BROKEN_VOLTAGE |
SDHCI_QUIRK_32BIT_DMA_ADDR | SDHCI_QUIRK_WAIT_SEND_CMD;
/* MMC_VDD_32_33 | MMC_VDD_33_34 | MMC_VDD_165_195 */
host->voltages = MMC_VDD_165_195;
ret = sdhci_setup_cfg(&plat->cfg, host, 200000000, 400000);
Can we use some defines for 200000000 and 400000?
if (ret)
return ret;
upriv->mmc = &plat->mmc;
host->mmc = &plat->mmc;
host->mmc->priv = host;
return sdhci_probe(dev);
+}
+static const struct udevice_id sdhci_tangier_match[] = {
{ .compatible = "intel,sdhci-tangier" },
{ /* sentinel */ }
+};
+U_BOOT_DRIVER(sdhci_tangier) = {
.name = "sdhci-tangier",
.id = UCLASS_MMC,
.of_match = sdhci_tangier_match,
.bind = sdhci_tangier_bind,
.probe = sdhci_tangier_probe,
.ops = &sdhci_ops,
.priv_auto_alloc_size = sizeof(struct sdhci_host),
.platdata_auto_alloc_size = sizeof(struct sdhci_tangier_plat),
+};
Regards, Bin

On Sat, Feb 18, 2017 at 6:34 AM, Bin Meng bmeng.cn@gmail.com wrote:
Hi Andy,
On Fri, Feb 17, 2017 at 9:02 PM, Andy Shevchenko andriy.shevchenko@linux.intel.com wrote:
From: Felipe Balbi felipe.balbi@linux.intel.com
This patch adds Intel Tangier eMMC/SDHCI driver.
So this eMMC/SDHC controller is not on PCI bus, correct?
Yes and no.
It's so called "fake PCI". Intel MID have couple of real PCI devices and many "fake" ones. They have (semi-)complaint programming interface, but do not fully follow PCI spec.
To implement it as a PCI controller we need a PCI bus quirk. I dunno if on this stage it makes sense for U-Boot.
Our goal is to have minimum support of Intel Edison board in U-Boot upstream from which we (or anybody else) might continue to enhance.
If so, can you add more comments to the commit message?
I would add something as per this discussion.
Signed-off-by: Vincent Tinelli vincent.tinelli@intel.com Signed-off-by: Felipe Balbi felipe.balbi@linux.intel.com Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com
drivers/mmc/Kconfig | 5 ++++ drivers/mmc/Makefile | 1 + drivers/mmc/tangier_sdhci.c | 72 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 drivers/mmc/tangier_sdhci.c
diff --git a/drivers/mmc/Kconfig b/drivers/mmc/Kconfig index af8436f337..e060547b1d 100644 --- a/drivers/mmc/Kconfig +++ b/drivers/mmc/Kconfig @@ -318,6 +318,11 @@ config MMC_SDHCI_XENON
If unsure, say N.
+config MMC_SDHCI_TANGIER
bool "Tangier SDHCI controller support"
depends on DM_MMC && BLK
depends on MMC_SDHCI
Please add a "help" here, like mentioning it's not on PCI bus (if I am correct)?
config MMC_SDHCI_TEGRA bool "SDHCI platform support for the Tegra SD/MMC Controller" depends on TEGRA diff --git a/drivers/mmc/Makefile b/drivers/mmc/Makefile index 9fccac8ead..b210d2c3b3 100644 --- a/drivers/mmc/Makefile +++ b/drivers/mmc/Makefile @@ -61,6 +61,7 @@ obj-$(CONFIG_MMC_SDHCI_PIC32) += pic32_sdhci.o obj-$(CONFIG_MMC_SDHCI_ROCKCHIP) += rockchip_sdhci.o obj-$(CONFIG_MMC_SDHCI_S5P) += s5p_sdhci.o obj-$(CONFIG_MMC_SDHCI_SPEAR) += spear_sdhci.o +obj-$(CONFIG_MMC_SDHCI_TANGIER) += tangier_sdhci.o obj-$(CONFIG_MMC_SDHCI_TEGRA) += tegra_mmc.o obj-$(CONFIG_MMC_SDHCI_XENON) += xenon_sdhci.o obj-$(CONFIG_MMC_SDHCI_ZYNQ) += zynq_sdhci.o diff --git a/drivers/mmc/tangier_sdhci.c b/drivers/mmc/tangier_sdhci.c new file mode 100644 index 0000000000..5ab2afa8b5 --- /dev/null +++ b/drivers/mmc/tangier_sdhci.c @@ -0,0 +1,72 @@
Please add a file header with author and license information here.
I will ask Felipe.
ret = sdhci_setup_cfg(&plat->cfg, host, 200000000, 400000);
Can we use some defines for 200000000 and 400000?
Ditto.

On Fri, Feb 17, 2017 at 9:02 PM, Andy Shevchenko andriy.shevchenko@linux.intel.com wrote:
From: Felipe Balbi felipe.balbi@linux.intel.com
We don't want pci_mmc to compile every time x86 compiles, only when there's a platform that needs it. For that reason, we're adding a new CONFIG_MMC_PCI which platforms can choose to enable.
Suggested-by: Jaehoon Chung jh80.chung@samsung.com Signed-off-by: Felipe Balbi felipe.balbi@linux.intel.com Signed-off-by: Andy Shevchenko andriy.shevchenko@linux.intel.com
configs/bayleybay_defconfig | 1 + configs/conga-qeval20-qa3-e3845-internal-uart_defconfig | 1 + configs/conga-qeval20-qa3-e3845_defconfig | 1 + configs/crownbay_defconfig | 1 + configs/dfi-bt700-q7x-151_defconfig | 1 + configs/galileo_defconfig | 1 + configs/minnowmax_defconfig | 1 + configs/theadorable-x86-dfi-bt700_defconfig | 1 + drivers/mmc/Kconfig | 8 ++++++++ drivers/mmc/Makefile | 2 +- 10 files changed, 17 insertions(+), 1 deletion(-)
Reviewed-by: Bin Meng bmeng.cn@gmail.com
participants (3)
-
Andy Shevchenko
-
Andy Shevchenko
-
Bin Meng