From 77934fdedfdd8a87d3b96c45b7bd540be60445d6 Mon Sep 17 00:00:00 2001 From: Thomas Fitzsimmons Date: Fri, 17 May 2019 08:17:07 -0400 Subject: [PATCH] dm: arm: bcmstb: Enable driver model MMC support For bcm7445 and bcm7260, this patch enables CONFIG_DM_MMC and updates the bcmstb SDHCI driver to use the new driver model. This allows removal of SDHCI configuration handling from bcmstb.c, and eliminates a board removal compile warning. Signed-off-by: Thomas Fitzsimmons Reviewed-by: Stefan Roese --- board/broadcom/bcmstb/bcmstb.c | 65 +----------------------------- configs/bcm7260_defconfig | 1 + configs/bcm7445_defconfig | 1 + drivers/mmc/bcmstb_sdhci.c | 73 +++++++++++++++++++++++++--------- include/configs/bcm7260.h | 1 - include/configs/bcm7445.h | 1 - 6 files changed, 58 insertions(+), 84 deletions(-) diff --git a/board/broadcom/bcmstb/bcmstb.c b/board/broadcom/bcmstb/bcmstb.c index 56328463ae..7f8e0f951d 100644 --- a/board/broadcom/bcmstb/bcmstb.c +++ b/board/broadcom/bcmstb/bcmstb.c @@ -1,6 +1,7 @@ // SPDX-License-Identifier: GPL-2.0+ /* * (C) Copyright 2018 Cisco Systems, Inc. + * (C) Copyright 2019 Synamedia * * Author: Thomas Fitzsimmons */ @@ -9,7 +10,6 @@ #include #include #include -#include #include #include #include @@ -80,69 +80,6 @@ void enable_caches(void) */ } -static const phys_addr_t bcmstb_sdhci_address(u32 alias_index) -{ - int node = 0; - int ret = 0; - char sdhci[16] = { 0 }; - const void *fdt = gd->fdt_blob; - const char *path = NULL; - struct fdt_resource resource = { 0 }; - - if (!fdt) { - printf("%s: Invalid gd->fdt_blob\n", __func__); - return 0; - } - - node = fdt_path_offset(fdt, "/aliases"); - if (node < 0) { - printf("%s: Failed to find /aliases node\n", __func__); - return 0; - } - - sprintf(sdhci, "sdhci%d", alias_index); - path = fdt_getprop(fdt, node, sdhci, NULL); - if (!path) { - printf("%s: Failed to find alias for %s\n", __func__, sdhci); - return 0; - } - - node = fdt_path_offset(fdt, path); - if (node < 0) { - printf("%s: Failed to resolve BCMSTB SDHCI alias\n", __func__); - return 0; - } - - ret = fdt_get_named_resource(fdt, node, "reg", "reg-names", - "host", &resource); - if (ret) { - printf("%s: Failed to read BCMSTB SDHCI host resource\n", - __func__); - return 0; - } - - return resource.start; -} - -int board_mmc_init(bd_t *bis) -{ - phys_addr_t sdhci_base_address = 0; - - sdhci_base_address = bcmstb_sdhci_address(CONFIG_BCMSTB_SDHCI_INDEX); - - if (!sdhci_base_address) { - sdhci_base_address = BCMSTB_SDHCI_BASE; - printf("%s: Assuming BCMSTB SDHCI address: 0x%p\n", - __func__, (void *)sdhci_base_address); - } - - debug("BCMSTB SDHCI base address: 0x%p\n", (void *)sdhci_base_address); - - bcmstb_sdhci_init(sdhci_base_address); - - return 0; -} - int timer_init(void) { gd->arch.timer_rate_hz = readl(BCMSTB_TIMER_FREQUENCY); diff --git a/configs/bcm7260_defconfig b/configs/bcm7260_defconfig index 263694c58f..6e0266be45 100644 --- a/configs/bcm7260_defconfig +++ b/configs/bcm7260_defconfig @@ -11,6 +11,7 @@ CONFIG_SYS_PROMPT="U-Boot>" CONFIG_EFI_PARTITION=y CONFIG_OF_PRIOR_STAGE=y CONFIG_ENV_IS_IN_MMC=y +CONFIG_DM_MMC=y CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI_BCMSTB=y # CONFIG_EFI_LOADER is not set diff --git a/configs/bcm7445_defconfig b/configs/bcm7445_defconfig index 97098bf7e2..f22b06e9ce 100644 --- a/configs/bcm7445_defconfig +++ b/configs/bcm7445_defconfig @@ -13,6 +13,7 @@ CONFIG_CMD_SF_TEST=y CONFIG_CMD_SPI=y CONFIG_OF_PRIOR_STAGE=y CONFIG_ENV_IS_IN_SPI_FLASH=y +CONFIG_DM_MMC=y CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI_BCMSTB=y CONFIG_DM_SPI_FLASH=y diff --git a/drivers/mmc/bcmstb_sdhci.c b/drivers/mmc/bcmstb_sdhci.c index 443ae8d481..eef46f3af1 100644 --- a/drivers/mmc/bcmstb_sdhci.c +++ b/drivers/mmc/bcmstb_sdhci.c @@ -1,11 +1,13 @@ // SPDX-License-Identifier: GPL-2.0+ /* * (C) Copyright 2018 Cisco Systems, Inc. + * (C) Copyright 2019 Synamedia * * Author: Thomas Fitzsimmons */ #include +#include #include #include #include @@ -36,32 +38,67 @@ */ #define BCMSTB_SDHCI_MINIMUM_CLOCK_FREQUENCY 400000 -static char *BCMSTB_SDHCI_NAME = "bcmstb-sdhci"; - /* * This driver has only been tested with eMMC devices; SD devices may * not work. */ -int bcmstb_sdhci_init(phys_addr_t regbase) +struct sdhci_bcmstb_plat { + struct mmc_config cfg; + struct mmc mmc; +}; + +static int sdhci_bcmstb_bind(struct udevice *dev) { - struct sdhci_host *host = NULL; + struct sdhci_bcmstb_plat *plat = dev_get_platdata(dev); - host = (struct sdhci_host *)malloc(sizeof(struct sdhci_host)); - if (!host) { - printf("%s: Failed to allocate memory\n", __func__); - return 1; - } - memset(host, 0, sizeof(*host)); + return sdhci_bind(dev, &plat->mmc, &plat->cfg); +} + +static int sdhci_bcmstb_probe(struct udevice *dev) +{ + struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev); + struct sdhci_bcmstb_plat *plat = dev_get_platdata(dev); + struct sdhci_host *host = dev_get_priv(dev); + fdt_addr_t base; + int ret; - host->name = BCMSTB_SDHCI_NAME; - host->ioaddr = (void *)regbase; - host->quirks = 0; + base = devfdt_get_addr(dev); + if (base == FDT_ADDR_T_NONE) + return -EINVAL; - host->cfg.part_type = PART_TYPE_DOS; + host->name = dev->name; + host->ioaddr = (void *)base; - host->version = sdhci_readw(host, SDHCI_HOST_VERSION); + ret = mmc_of_parse(dev, &plat->cfg); + if (ret) + return ret; - return add_sdhci(host, - BCMSTB_SDHCI_MAXIMUM_CLOCK_FREQUENCY, - BCMSTB_SDHCI_MINIMUM_CLOCK_FREQUENCY); + ret = sdhci_setup_cfg(&plat->cfg, host, + BCMSTB_SDHCI_MAXIMUM_CLOCK_FREQUENCY, + BCMSTB_SDHCI_MINIMUM_CLOCK_FREQUENCY); + 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_bcmstb_match[] = { + { .compatible = "brcm,bcm7425-sdhci" }, + { .compatible = "brcm,sdhci-brcmstb" }, + { } +}; + +U_BOOT_DRIVER(sdhci_bcmstb) = { + .name = "sdhci-bcmstb", + .id = UCLASS_MMC, + .of_match = sdhci_bcmstb_match, + .ops = &sdhci_ops, + .bind = sdhci_bcmstb_bind, + .probe = sdhci_bcmstb_probe, + .priv_auto_alloc_size = sizeof(struct sdhci_host), + .platdata_auto_alloc_size = sizeof(struct sdhci_bcmstb_plat), +}; diff --git a/include/configs/bcm7260.h b/include/configs/bcm7260.h index a2d7f614ce..967bde54c8 100644 --- a/include/configs/bcm7260.h +++ b/include/configs/bcm7260.h @@ -19,7 +19,6 @@ #include "bcmstb.h" -#define BCMSTB_SDHCI_BASE 0xf0200300 #define BCMSTB_TIMER_LOW 0xf0412008 #define BCMSTB_TIMER_HIGH 0xf041200c #define BCMSTB_TIMER_FREQUENCY 0xf0412020 diff --git a/include/configs/bcm7445.h b/include/configs/bcm7445.h index 6984edde18..3ff4677f0a 100644 --- a/include/configs/bcm7445.h +++ b/include/configs/bcm7445.h @@ -19,7 +19,6 @@ #include "bcmstb.h" -#define BCMSTB_SDHCI_BASE 0xf03e0200 #define BCMSTB_TIMER_LOW 0xf0412008 #define BCMSTB_TIMER_HIGH 0xf041200c #define BCMSTB_TIMER_FREQUENCY 0xf0412020 -- 2.25.1