diff options
author | Thomas Fitzsimmons <fitzsim@fitzsim.org> | 2019-05-17 08:17:07 -0400 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2019-05-28 13:58:06 -0400 |
commit | 77934fdedfdd8a87d3b96c45b7bd540be60445d6 (patch) | |
tree | 1c9ed21bdf329e6eb0827dcfef9738f2c2abc1ee /drivers/mmc/bcmstb_sdhci.c | |
parent | d7cc0e4d7999b0b696ec4047420abf34a821ba29 (diff) |
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 <fitzsim@fitzsim.org>
Reviewed-by: Stefan Roese <sr@denx.de>
Diffstat (limited to 'drivers/mmc/bcmstb_sdhci.c')
-rw-r--r-- | drivers/mmc/bcmstb_sdhci.c | 73 |
1 files changed, 55 insertions, 18 deletions
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 <fitzsim@fitzsim.org> */ #include <common.h> +#include <dm.h> #include <mach/sdhci.h> #include <malloc.h> #include <sdhci.h> @@ -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), +}; |