A3720 - Disable slot when eMMC is not present

Jaehoon Chung jh80.chung at samsung.com
Wed Dec 9 11:01:19 CET 2020


Hi,

On 12/8/20 7:08 PM, Pali Rohár wrote:
> Hello! I looked at what is initialized and enabled for sd/emmc slots and
> I found out that comphy mmc needs to be enabled if at least one slot is
> used (e.g. SD card) and then remaining part is slot initialization in
> xenon driver.
> 
> I wrote quick patch to disable slot when unregistering mmc device from
> U-Boot and also unregister emmc on A3720 from U-Boot when it is not
> present. But I have not tested it yet.
> > What do you think about it?

Logically, it's possible to disable slot. But i'm not sure because of not having its board.
Just minor question.. Does it support multi slot per one IP?

Best Regards,
Jaehoon Chung

> 
> diff --git a/board/Marvell/mvebu_armada-37xx/board.c b/board/Marvell/mvebu_armada-37xx/board.c
> index f67b04b78c..1b9e7520cc 100644
> --- a/board/Marvell/mvebu_armada-37xx/board.c
> +++ b/board/Marvell/mvebu_armada-37xx/board.c
> @@ -5,6 +5,7 @@
>  
>  #include <common.h>
>  #include <dm.h>
> +#include <dm/device-internal.h>
>  #include <env.h>
>  #include <i2c.h>
>  #include <init.h>
> @@ -84,12 +85,10 @@ int board_init(void)
>  #ifdef CONFIG_BOARD_LATE_INIT
>  int board_late_init(void)
>  {
> +	struct udevice *dev;
>  	struct mmc *mmc_dev;
>  	bool ddr4, emmc;
>  
> -	if (env_get("fdtfile"))
> -		return 0;
> -
>  	if (!of_machine_is_compatible("globalscale,espressobin"))
>  		return 0;
>  
> @@ -101,6 +100,16 @@ int board_late_init(void)
>  	mmc_dev = find_mmc_device(1);
>  	emmc = (mmc_dev && mmc_init(mmc_dev) == 0);
>  
> +	/* if eMMC is not present then remove it from DM */
> +	if (!emmc && mmc_dev) {
> +		dev = mmc_dev->dev;
> +		device_remove(dev, DM_REMOVE_NORMAL);
> +		device_unbind(dev);
> +	}
> +
> +	if (env_get("fdtfile"))
> +		return 0;
> +
>  	if (ddr4 && emmc)
>  		env_set("fdtfile", "marvell/armada-3720-espressobin-v7-emmc.dtb");
>  	else if (ddr4)
> diff --git a/drivers/mmc/xenon_sdhci.c b/drivers/mmc/xenon_sdhci.c
> index 6ce9d00d0a..da9882cbf6 100644
> --- a/drivers/mmc/xenon_sdhci.c
> +++ b/drivers/mmc/xenon_sdhci.c
> @@ -350,6 +350,16 @@ static void xenon_mmc_enable_slot(struct sdhci_host *host, u8 slot)
>  	sdhci_writel(host, var, SDHC_SYS_OP_CTRL);
>  }
>  
> +/* Disable specific slot */
> +static void xenon_mmc_disable_slot(struct sdhci_host *host, u8 slot)
> +{
> +	u32 var;
> +
> +	var = sdhci_readl(host, SDHC_SYS_OP_CTRL);
> +	var &= ~(SLOT_MASK(slot) << SLOT_ENABLE_SHIFT);
> +	sdhci_writel(host, var, SDHC_SYS_OP_CTRL);
> +}
> +
>  /* Enable Parallel Transfer Mode */
>  static void xenon_mmc_enable_parallel_tran(struct sdhci_host *host, u8 slot)
>  {
> @@ -515,6 +525,14 @@ static int xenon_sdhci_probe(struct udevice *dev)
>  	return ret;
>  }
>  
> +static int xenon_sdhci_remove(struct udevice *dev)
> +{
> +	struct sdhci_host *host = dev_get_priv(dev);
> +
> +	xenon_mmc_disable_slot(host, XENON_MMC_SLOT_ID_HYPERION);
> +	return 0;
> +}
> +
>  static int xenon_sdhci_ofdata_to_platdata(struct udevice *dev)
>  {
>  	struct sdhci_host *host = dev_get_priv(dev);
> @@ -564,6 +582,7 @@ U_BOOT_DRIVER(xenon_sdhci_drv) = {
>  	.ops		= &sdhci_ops,
>  	.bind		= xenon_sdhci_bind,
>  	.probe		= xenon_sdhci_probe,
> +	.remove		= xenon_sdhci_remove,
>  	.priv_auto_alloc_size = sizeof(struct xenon_sdhci_priv),
>  	.platdata_auto_alloc_size = sizeof(struct xenon_sdhci_plat),
>  };
> 
> 



More information about the U-Boot mailing list