[U-Boot] [PATCH v4 10/17] dm: mmc: rpi: Convert Raspberry Pi to driver model for MMC

Jaehoon Chung jh80.chung at samsung.com
Tue Jan 24 07:51:28 CET 2017


On 01/20/2017 11:07 PM, Simon Glass wrote:
> Convert the bcm2835 SDHCI driver over to support CONFIG_DM_MMC and move
> all boards over. There is no need to keep the old code since there are no
> other users.
> 
> Signed-off-by: Simon Glass <sjg at chromium.org>

Reviewed-by: Jaehoon Chung <jh80.chung at samsung.com>

Best Regards,
Jaehoon Chung

> ---
> 
> Changes in v4: None
> Changes in v3: None
> 
>  board/raspberrypi/rpi/rpi.c | 13 --------
>  configs/rpi_2_defconfig     |  1 +
>  configs/rpi_3_32b_defconfig |  1 +
>  configs/rpi_3_defconfig     |  1 +
>  configs/rpi_defconfig       |  1 +
>  drivers/mmc/bcm2835_sdhci.c | 81 ++++++++++++++++++++++++++++++++++++---------
>  6 files changed, 69 insertions(+), 29 deletions(-)
> 
> diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c
> index dd318df72b2..3d44cd4e55d 100644
> --- a/board/raspberrypi/rpi/rpi.c
> +++ b/board/raspberrypi/rpi/rpi.c
> @@ -454,19 +454,6 @@ int board_init(void)
>  	return bcm2835_power_on_module(BCM2835_MBOX_POWER_DEVID_USB_HCD);
>  }
>  
> -int board_mmc_init(bd_t *bis)
> -{
> -	int ret;
> -
> -	bcm2835_power_on_module(BCM2835_MBOX_POWER_DEVID_SDHCI);
> -
> -	ret = bcm2835_get_mmc_clock();
> -	if (ret)
> -		return ret;
> -
> -	return bcm2835_sdhci_init(BCM2835_SDHCI_BASE, ret);
> -}
> -
>  int ft_board_setup(void *blob, bd_t *bd)
>  {
>  	/*
> diff --git a/configs/rpi_2_defconfig b/configs/rpi_2_defconfig
> index 090a0b07140..3d6f2a33377 100644
> --- a/configs/rpi_2_defconfig
> +++ b/configs/rpi_2_defconfig
> @@ -14,6 +14,7 @@ CONFIG_CMD_USB=y
>  # CONFIG_CMD_FPGA is not set
>  CONFIG_CMD_GPIO=y
>  CONFIG_OF_EMBED=y
> +CONFIG_DM_MMC=y
>  CONFIG_MMC_SDHCI=y
>  CONFIG_MMC_SDHCI_BCM2835=y
>  CONFIG_DM_ETH=y
> diff --git a/configs/rpi_3_32b_defconfig b/configs/rpi_3_32b_defconfig
> index 785bf21e9a3..ca0ef7afe74 100644
> --- a/configs/rpi_3_32b_defconfig
> +++ b/configs/rpi_3_32b_defconfig
> @@ -15,6 +15,7 @@ CONFIG_CMD_USB=y
>  # CONFIG_CMD_FPGA is not set
>  CONFIG_CMD_GPIO=y
>  CONFIG_OF_EMBED=y
> +CONFIG_DM_MMC=y
>  CONFIG_MMC_SDHCI=y
>  CONFIG_MMC_SDHCI_BCM2835=y
>  CONFIG_DM_ETH=y
> diff --git a/configs/rpi_3_defconfig b/configs/rpi_3_defconfig
> index 5ff8ed1cf2b..185a56c2807 100644
> --- a/configs/rpi_3_defconfig
> +++ b/configs/rpi_3_defconfig
> @@ -15,6 +15,7 @@ CONFIG_CMD_USB=y
>  # CONFIG_CMD_FPGA is not set
>  CONFIG_CMD_GPIO=y
>  CONFIG_OF_EMBED=y
> +CONFIG_DM_MMC=y
>  CONFIG_MMC_SDHCI=y
>  CONFIG_MMC_SDHCI_BCM2835=y
>  CONFIG_DM_ETH=y
> diff --git a/configs/rpi_defconfig b/configs/rpi_defconfig
> index 5d44f297267..89ecef8994e 100644
> --- a/configs/rpi_defconfig
> +++ b/configs/rpi_defconfig
> @@ -14,6 +14,7 @@ CONFIG_CMD_USB=y
>  # CONFIG_CMD_FPGA is not set
>  CONFIG_CMD_GPIO=y
>  CONFIG_OF_EMBED=y
> +CONFIG_DM_MMC=y
>  CONFIG_MMC_SDHCI=y
>  CONFIG_MMC_SDHCI_BCM2835=y
>  CONFIG_DM_ETH=y
> diff --git a/drivers/mmc/bcm2835_sdhci.c b/drivers/mmc/bcm2835_sdhci.c
> index cb2bd40c65e..c96c35a9da4 100644
> --- a/drivers/mmc/bcm2835_sdhci.c
> +++ b/drivers/mmc/bcm2835_sdhci.c
> @@ -37,14 +37,23 @@
>   */
>  
>  #include <common.h>
> +#include <dm.h>
>  #include <malloc.h>
> +#include <memalign.h>
>  #include <sdhci.h>
> -#include <mach/timer.h>
> +#include <asm/arch/msg.h>
> +#include <asm/arch/mbox.h>
>  #include <mach/sdhci.h>
> +#include <mach/timer.h>
>  
>  /* 400KHz is max freq for card ID etc. Use that as min */
>  #define MIN_FREQ 400000
>  
> +struct bcm2835_sdhci_plat {
> +	struct mmc_config cfg;
> +	struct mmc mmc;
> +};
> +
>  struct bcm2835_sdhci_host {
>  	struct sdhci_host host;
>  	uint twoticks_delay;
> @@ -57,7 +66,7 @@ static inline struct bcm2835_sdhci_host *to_bcm(struct sdhci_host *host)
>  }
>  
>  static inline void bcm2835_sdhci_raw_writel(struct sdhci_host *host, u32 val,
> -						int reg)
> +					    int reg)
>  {
>  	struct bcm2835_sdhci_host *bcm_host = to_bcm(host);
>  
> @@ -149,16 +158,33 @@ static const struct sdhci_ops bcm2835_ops = {
>  	.read_b = bcm2835_sdhci_readb,
>  };
>  
> -int bcm2835_sdhci_init(u32 regbase, u32 emmc_freq)
> +static int bcm2835_sdhci_bind(struct udevice *dev)
>  {
> -	struct bcm2835_sdhci_host *bcm_host;
> -	struct sdhci_host *host;
> +	struct bcm2835_sdhci_plat *plat = dev_get_platdata(dev);
>  
> -	bcm_host = calloc(1, sizeof(*bcm_host));
> -	if (!bcm_host) {
> -		printf("sdhci_host calloc fail!\n");
> -		return -ENOMEM;
> +	return sdhci_bind(dev, &plat->mmc, &plat->cfg);
> +}
> +
> +static int bcm2835_sdhci_probe(struct udevice *dev)
> +{
> +	struct mmc_uclass_priv *upriv = dev_get_uclass_priv(dev);
> +	struct bcm2835_sdhci_plat *plat = dev_get_platdata(dev);
> +	struct bcm2835_sdhci_host *priv = dev_get_priv(dev);
> +	struct sdhci_host *host = &priv->host;
> +	fdt_addr_t base;
> +	int emmc_freq;
> +	int ret;
> +
> +	base = dev_get_addr(dev);
> +	if (base == FDT_ADDR_T_NONE)
> +		return -EINVAL;
> +
> +	ret = bcm2835_get_mmc_clock();
> +	if (ret < 0) {
> +		debug("%s: Failed to set MMC clock (err=%d)\n", __func__, ret);
> +		return ret;
>  	}
> +	emmc_freq = ret;
>  
>  	/*
>  	 * See the comments in bcm2835_sdhci_raw_writel().
> @@ -173,18 +199,41 @@ int bcm2835_sdhci_init(u32 regbase, u32 emmc_freq)
>  	 * Multiply by 1000000 to get uS per two ticks.
>  	 * +1 for hack rounding.
>  	 */
> -	bcm_host->twoticks_delay = ((2 * 1000000) / MIN_FREQ) + 1;
> -	bcm_host->last_write = 0;
> +	priv->twoticks_delay = ((2 * 1000000) / MIN_FREQ) + 1;
> +	priv->last_write = 0;
>  
> -	host = &bcm_host->host;
> -	host->name = "bcm2835_sdhci";
> -	host->ioaddr = (void *)(unsigned long)regbase;
> +	host->name = dev->name;
> +	host->ioaddr = (void *)base;
>  	host->quirks = SDHCI_QUIRK_BROKEN_VOLTAGE | SDHCI_QUIRK_BROKEN_R1B |
>  		SDHCI_QUIRK_WAIT_SEND_CMD | SDHCI_QUIRK_NO_HISPD_BIT;
>  	host->voltages = MMC_VDD_32_33 | MMC_VDD_33_34 | MMC_VDD_165_195;
>  	host->ops = &bcm2835_ops;
>  
> -	add_sdhci(host, emmc_freq, MIN_FREQ);
> +	ret = sdhci_setup_cfg(&plat->cfg, host, emmc_freq, MIN_FREQ);
> +	if (ret) {
> +		debug("%s: Failed to setup SDHCI (err=%d)\n", __func__, ret);
> +		return ret;
> +	}
> +
> +	upriv->mmc = &plat->mmc;
> +	host->mmc = &plat->mmc;
> +	host->mmc->priv = host;
>  
> -	return 0;
> +	return sdhci_probe(dev);
>  }
> +
> +static const struct udevice_id bcm2835_sdhci_match[] = {
> +	{ .compatible = "brcm,bcm2835-sdhci" },
> +	{ /* sentinel */ }
> +};
> +
> +U_BOOT_DRIVER(sdhci_cdns) = {
> +	.name = "sdhci-bcm2835",
> +	.id = UCLASS_MMC,
> +	.of_match = bcm2835_sdhci_match,
> +	.bind = bcm2835_sdhci_bind,
> +	.probe = bcm2835_sdhci_probe,
> +	.priv_auto_alloc_size = sizeof(struct bcm2835_sdhci_host),
> +	.platdata_auto_alloc_size = sizeof(struct bcm2835_sdhci_plat),
> +	.ops = &sdhci_ops,
> +};
> 



More information about the U-Boot mailing list