Re: [PATCH 04/11] mmc: fsl_esdhc_imx: clean up bus width configuration code

2021-11-09 Thread Jaehoon Chung
On 11/10/21 7:47 AM, Sean Anderson wrote:
> 
> 
> On 11/9/21 5:41 PM, Jaehoon Chung wrote:
>> Hi Sean,
>>
>> On 11/9/21 11:42 PM, Sean Anderson wrote:
>>>
>>>
>>> On 11/9/21 2:19 AM, Jaehoon Chung wrote:
 On 11/6/21 2:39 AM, Sean Anderson wrote:
> [ fsl_esdhc commit 07bae1de382723b94244096953b05225572728cd ]
>
> This patch is to clean up bus width setting code.
>
> - For DM_MMC, remove getting "bus-width" from device tree.
>   This has been done in mmc_of_parse().
>
> - For non-DM_MMC, move bus width configuration from fsl_esdhc_init()
>   to fsl_esdhc_initialize() which is non-DM_MMC specific.
>   And fix up bus width configuration to support only 1-bit, 4-bit,
>   or 8-bit. Keep using 8-bit if it's not set because many platforms
>   use driver without providing max bus width.
>
> - Remove bus_width member from fsl_esdhc_priv structure.
>
> Signed-off-by: Yangbo Lu 
> Signed-off-by: Sean Anderson 
> ---
>
>  drivers/mmc/fsl_esdhc_imx.c | 80 +++--
>  1 file changed, 23 insertions(+), 57 deletions(-)
>
> diff --git a/drivers/mmc/fsl_esdhc_imx.c b/drivers/mmc/fsl_esdhc_imx.c
> index b91dda27f9..d3daf4db59 100644
> --- a/drivers/mmc/fsl_esdhc_imx.c
> +++ b/drivers/mmc/fsl_esdhc_imx.c
> @@ -126,7 +126,6 @@ struct esdhc_soc_data {
>   *
>   * @esdhc_regs: registers of the sdhc controller
>   * @sdhc_clk: Current clk of the sdhc controller
> - * @bus_width: bus width, 1bit, 4bit or 8bit
>   * @cfg: mmc config
>   * @mmc: mmc
>   * Following is used when Driver Model is enabled for MMC
> @@ -151,7 +150,6 @@ struct fsl_esdhc_priv {
>  struct clk per_clk;
>  unsigned int clock;
>  unsigned int mode;
> -    unsigned int bus_width;
>  #if !CONFIG_IS_ENABLED(DM_MMC)
>  struct mmc *mmc;
>  #endif
> @@ -1232,31 +1230,13 @@ static int fsl_esdhc_init(struct fsl_esdhc_priv 
> *priv,
>  #if !CONFIG_IS_ENABLED(DM_MMC)
>  cfg->ops = _ops;
>  #endif
> -    if (priv->bus_width == 8)
> -    cfg->host_caps = MMC_MODE_4BIT | MMC_MODE_8BIT;
> -    else if (priv->bus_width == 4)
> -    cfg->host_caps = MMC_MODE_4BIT;
> -
> -    cfg->host_caps = MMC_MODE_4BIT | MMC_MODE_8BIT;
>  #ifdef CONFIG_SYS_FSL_ESDHC_HAS_DDR_MODE
>  cfg->host_caps |= MMC_MODE_DDR_52MHz;
>  #endif
>
> -    if (priv->bus_width > 0) {
> -    if (priv->bus_width < 8)
> -    cfg->host_caps &= ~MMC_MODE_8BIT;
> -    if (priv->bus_width < 4)
> -    cfg->host_caps &= ~MMC_MODE_4BIT;
> -    }
> -
>  if (caps & HOSTCAPBLT_HSS)
>  cfg->host_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
>
> -#ifdef CONFIG_ESDHC_DETECT_8_BIT_QUIRK
> -    if (CONFIG_ESDHC_DETECT_8_BIT_QUIRK)
> -    cfg->host_caps &= ~MMC_MODE_8BIT;
> -#endif
> -
>  cfg->host_caps |= priv->caps;
>
>  cfg->f_min = 40;
> @@ -1294,25 +1274,11 @@ static int fsl_esdhc_init(struct fsl_esdhc_priv 
> *priv,
>  }
>
>  #if !CONFIG_IS_ENABLED(DM_MMC)
> -static int fsl_esdhc_cfg_to_priv(struct fsl_esdhc_cfg *cfg,
> - struct fsl_esdhc_priv *priv)
> -{
> -    if (!cfg || !priv)
> -    return -EINVAL;
> -
> -    priv->esdhc_regs = (struct fsl_esdhc *)(unsigned 
> long)(cfg->esdhc_base);
> -    priv->bus_width = cfg->max_bus_width;
> -    priv->sdhc_clk = cfg->sdhc_clk;
> -    priv->wp_enable  = cfg->wp_enable;
> -    priv->vs18_enable  = cfg->vs18_enable;
> -
> -    return 0;
> -};
> -
>  int fsl_esdhc_initialize(struct bd_info *bis, struct fsl_esdhc_cfg *cfg)
>  {
>  struct fsl_esdhc_plat *plat;
>  struct fsl_esdhc_priv *priv;
> +    struct mmc_config *mmc_cfg;
>  struct mmc *mmc;
>  int ret;
>
> @@ -1328,14 +1294,30 @@ int fsl_esdhc_initialize(struct bd_info *bis, 
> struct fsl_esdhc_cfg *cfg)
>  return -ENOMEM;
>  }
>
> -    ret = fsl_esdhc_cfg_to_priv(cfg, priv);
> -    if (ret) {
> -    debug("%s xlate failure\n", __func__);
> -    free(plat);
> -    free(priv);
> -    return ret;
> +    priv->esdhc_regs = (struct fsl_esdhc *)(unsigned 
> long)(cfg->esdhc_base);
> +    priv->sdhc_clk = cfg->sdhc_clk;
> +    priv->wp_enable  = cfg->wp_enable;
> +
> +    mmc_cfg = >cfg;
> +
> +    if (cfg->max_bus_width == 8) {
> +    mmc_cfg->host_caps |= MMC_MODE_1BIT | MMC_MODE_4BIT |
> +  MMC_MODE_8BIT;
> +    } else if (cfg->max_bus_width == 4) {
> +    mmc_cfg->host_caps |= MMC_MODE_1BIT | MMC_MODE_4BIT;
> +    } else if (cfg->max_bus_width == 1) {
> +    mmc_cfg->host_caps |= MMC_MODE_1BIT;
> +    } else {
> 

Re: [PATCH 04/11] mmc: fsl_esdhc_imx: clean up bus width configuration code

2021-11-09 Thread Jaehoon Chung
On 11/10/21 1:13 AM, Adam Ford wrote:
> On Fri, Nov 5, 2021 at 12:41 PM Sean Anderson  wrote:
>>
>> [ fsl_esdhc commit 07bae1de382723b94244096953b05225572728cd ]
>>
>> This patch is to clean up bus width setting code.
>>
>> - For DM_MMC, remove getting "bus-width" from device tree.
>>   This has been done in mmc_of_parse().
>>
>> - For non-DM_MMC, move bus width configuration from fsl_esdhc_init()
>>   to fsl_esdhc_initialize() which is non-DM_MMC specific.
>>   And fix up bus width configuration to support only 1-bit, 4-bit,
>>   or 8-bit. Keep using 8-bit if it's not set because many platforms
>>   use driver without providing max bus width.
>>
>> - Remove bus_width member from fsl_esdhc_priv structure.
>>
>> Signed-off-by: Yangbo Lu 
>> Signed-off-by: Sean Anderson 
>> ---
>>
>>  drivers/mmc/fsl_esdhc_imx.c | 80 +++--
>>  1 file changed, 23 insertions(+), 57 deletions(-)
>>
>> diff --git a/drivers/mmc/fsl_esdhc_imx.c b/drivers/mmc/fsl_esdhc_imx.c
>> index b91dda27f9..d3daf4db59 100644
>> --- a/drivers/mmc/fsl_esdhc_imx.c
>> +++ b/drivers/mmc/fsl_esdhc_imx.c
>> @@ -126,7 +126,6 @@ struct esdhc_soc_data {
>>   *
>>   * @esdhc_regs: registers of the sdhc controller
>>   * @sdhc_clk: Current clk of the sdhc controller
>> - * @bus_width: bus width, 1bit, 4bit or 8bit
>>   * @cfg: mmc config
>>   * @mmc: mmc
>>   * Following is used when Driver Model is enabled for MMC
>> @@ -151,7 +150,6 @@ struct fsl_esdhc_priv {
>> struct clk per_clk;
>> unsigned int clock;
>> unsigned int mode;
>> -   unsigned int bus_width;
>>  #if !CONFIG_IS_ENABLED(DM_MMC)
>> struct mmc *mmc;
>>  #endif
>> @@ -1232,31 +1230,13 @@ static int fsl_esdhc_init(struct fsl_esdhc_priv 
>> *priv,
>>  #if !CONFIG_IS_ENABLED(DM_MMC)
>> cfg->ops = _ops;
>>  #endif
>> -   if (priv->bus_width == 8)
>> -   cfg->host_caps = MMC_MODE_4BIT | MMC_MODE_8BIT;
>> -   else if (priv->bus_width == 4)
>> -   cfg->host_caps = MMC_MODE_4BIT;
>> -
>> -   cfg->host_caps = MMC_MODE_4BIT | MMC_MODE_8BIT;
>>  #ifdef CONFIG_SYS_FSL_ESDHC_HAS_DDR_MODE
>> cfg->host_caps |= MMC_MODE_DDR_52MHz;
>>  #endif
>>
>> -   if (priv->bus_width > 0) {
>> -   if (priv->bus_width < 8)
>> -   cfg->host_caps &= ~MMC_MODE_8BIT;
>> -   if (priv->bus_width < 4)
>> -   cfg->host_caps &= ~MMC_MODE_4BIT;
>> -   }
>> -
>> if (caps & HOSTCAPBLT_HSS)
>> cfg->host_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
>>
>> -#ifdef CONFIG_ESDHC_DETECT_8_BIT_QUIRK
>> -   if (CONFIG_ESDHC_DETECT_8_BIT_QUIRK)
>> -   cfg->host_caps &= ~MMC_MODE_8BIT;
>> -#endif
>> -
>> cfg->host_caps |= priv->caps;
>>
>> cfg->f_min = 40;
>> @@ -1294,25 +1274,11 @@ static int fsl_esdhc_init(struct fsl_esdhc_priv 
>> *priv,
>>  }
>>
>>  #if !CONFIG_IS_ENABLED(DM_MMC)
>> -static int fsl_esdhc_cfg_to_priv(struct fsl_esdhc_cfg *cfg,
>> -struct fsl_esdhc_priv *priv)
>> -{
>> -   if (!cfg || !priv)
>> -   return -EINVAL;
>> -
>> -   priv->esdhc_regs = (struct fsl_esdhc *)(unsigned 
>> long)(cfg->esdhc_base);
>> -   priv->bus_width = cfg->max_bus_width;
>> -   priv->sdhc_clk = cfg->sdhc_clk;
>> -   priv->wp_enable  = cfg->wp_enable;
>> -   priv->vs18_enable  = cfg->vs18_enable;
>> -
>> -   return 0;
>> -};
>> -
>>  int fsl_esdhc_initialize(struct bd_info *bis, struct fsl_esdhc_cfg *cfg)
>>  {
>> struct fsl_esdhc_plat *plat;
>> struct fsl_esdhc_priv *priv;
>> +   struct mmc_config *mmc_cfg;
>> struct mmc *mmc;
>> int ret;
>>
>> @@ -1328,14 +1294,30 @@ int fsl_esdhc_initialize(struct bd_info *bis, struct 
>> fsl_esdhc_cfg *cfg)
>> return -ENOMEM;
>> }
>>
>> -   ret = fsl_esdhc_cfg_to_priv(cfg, priv);
>> -   if (ret) {
>> -   debug("%s xlate failure\n", __func__);
>> -   free(plat);
>> -   free(priv);
>> -   return ret;
>> +   priv->esdhc_regs = (struct fsl_esdhc *)(unsigned 
>> long)(cfg->esdhc_base);
>> +   priv->sdhc_clk = cfg->sdhc_clk;
>> +   priv->wp_enable  = cfg->wp_enable;
>> +
>> +   mmc_cfg = >cfg;
>> +
>> +   if (cfg->max_bus_width == 8) {
>> +   mmc_cfg->host_caps |= MMC_MODE_1BIT | MMC_MODE_4BIT |
>> + MMC_MODE_8BIT;
>> +   } else if (cfg->max_bus_width == 4) {
>> +   mmc_cfg->host_caps |= MMC_MODE_1BIT | MMC_MODE_4BIT;
>> +   } else if (cfg->max_bus_width == 1) {
>> +   mmc_cfg->host_caps |= MMC_MODE_1BIT;
>> +   } else {
>> +   mmc_cfg->host_caps |= MMC_MODE_1BIT | MMC_MODE_4BIT |
>> + MMC_MODE_8BIT;
>> +   printf("No max bus width provided. Assume 8-bit 
>> supported.\n");
> 
> I wonder if a switch statement would be cleaner 

Re: [PATCH 04/11] mmc: fsl_esdhc_imx: clean up bus width configuration code

2021-11-09 Thread Sean Anderson




On 11/9/21 5:41 PM, Jaehoon Chung wrote:

Hi Sean,

On 11/9/21 11:42 PM, Sean Anderson wrote:



On 11/9/21 2:19 AM, Jaehoon Chung wrote:

On 11/6/21 2:39 AM, Sean Anderson wrote:

[ fsl_esdhc commit 07bae1de382723b94244096953b05225572728cd ]

This patch is to clean up bus width setting code.

- For DM_MMC, remove getting "bus-width" from device tree.
  This has been done in mmc_of_parse().

- For non-DM_MMC, move bus width configuration from fsl_esdhc_init()
  to fsl_esdhc_initialize() which is non-DM_MMC specific.
  And fix up bus width configuration to support only 1-bit, 4-bit,
  or 8-bit. Keep using 8-bit if it's not set because many platforms
  use driver without providing max bus width.

- Remove bus_width member from fsl_esdhc_priv structure.

Signed-off-by: Yangbo Lu 
Signed-off-by: Sean Anderson 
---

 drivers/mmc/fsl_esdhc_imx.c | 80 +++--
 1 file changed, 23 insertions(+), 57 deletions(-)

diff --git a/drivers/mmc/fsl_esdhc_imx.c b/drivers/mmc/fsl_esdhc_imx.c
index b91dda27f9..d3daf4db59 100644
--- a/drivers/mmc/fsl_esdhc_imx.c
+++ b/drivers/mmc/fsl_esdhc_imx.c
@@ -126,7 +126,6 @@ struct esdhc_soc_data {
  *
  * @esdhc_regs: registers of the sdhc controller
  * @sdhc_clk: Current clk of the sdhc controller
- * @bus_width: bus width, 1bit, 4bit or 8bit
  * @cfg: mmc config
  * @mmc: mmc
  * Following is used when Driver Model is enabled for MMC
@@ -151,7 +150,6 @@ struct fsl_esdhc_priv {
 struct clk per_clk;
 unsigned int clock;
 unsigned int mode;
-unsigned int bus_width;
 #if !CONFIG_IS_ENABLED(DM_MMC)
 struct mmc *mmc;
 #endif
@@ -1232,31 +1230,13 @@ static int fsl_esdhc_init(struct fsl_esdhc_priv *priv,
 #if !CONFIG_IS_ENABLED(DM_MMC)
 cfg->ops = _ops;
 #endif
-if (priv->bus_width == 8)
-cfg->host_caps = MMC_MODE_4BIT | MMC_MODE_8BIT;
-else if (priv->bus_width == 4)
-cfg->host_caps = MMC_MODE_4BIT;
-
-cfg->host_caps = MMC_MODE_4BIT | MMC_MODE_8BIT;
 #ifdef CONFIG_SYS_FSL_ESDHC_HAS_DDR_MODE
 cfg->host_caps |= MMC_MODE_DDR_52MHz;
 #endif

-if (priv->bus_width > 0) {
-if (priv->bus_width < 8)
-cfg->host_caps &= ~MMC_MODE_8BIT;
-if (priv->bus_width < 4)
-cfg->host_caps &= ~MMC_MODE_4BIT;
-}
-
 if (caps & HOSTCAPBLT_HSS)
 cfg->host_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;

-#ifdef CONFIG_ESDHC_DETECT_8_BIT_QUIRK
-if (CONFIG_ESDHC_DETECT_8_BIT_QUIRK)
-cfg->host_caps &= ~MMC_MODE_8BIT;
-#endif
-
 cfg->host_caps |= priv->caps;

 cfg->f_min = 40;
@@ -1294,25 +1274,11 @@ static int fsl_esdhc_init(struct fsl_esdhc_priv *priv,
 }

 #if !CONFIG_IS_ENABLED(DM_MMC)
-static int fsl_esdhc_cfg_to_priv(struct fsl_esdhc_cfg *cfg,
- struct fsl_esdhc_priv *priv)
-{
-if (!cfg || !priv)
-return -EINVAL;
-
-priv->esdhc_regs = (struct fsl_esdhc *)(unsigned long)(cfg->esdhc_base);
-priv->bus_width = cfg->max_bus_width;
-priv->sdhc_clk = cfg->sdhc_clk;
-priv->wp_enable  = cfg->wp_enable;
-priv->vs18_enable  = cfg->vs18_enable;
-
-return 0;
-};
-
 int fsl_esdhc_initialize(struct bd_info *bis, struct fsl_esdhc_cfg *cfg)
 {
 struct fsl_esdhc_plat *plat;
 struct fsl_esdhc_priv *priv;
+struct mmc_config *mmc_cfg;
 struct mmc *mmc;
 int ret;

@@ -1328,14 +1294,30 @@ int fsl_esdhc_initialize(struct bd_info *bis, struct 
fsl_esdhc_cfg *cfg)
 return -ENOMEM;
 }

-ret = fsl_esdhc_cfg_to_priv(cfg, priv);
-if (ret) {
-debug("%s xlate failure\n", __func__);
-free(plat);
-free(priv);
-return ret;
+priv->esdhc_regs = (struct fsl_esdhc *)(unsigned long)(cfg->esdhc_base);
+priv->sdhc_clk = cfg->sdhc_clk;
+priv->wp_enable  = cfg->wp_enable;
+
+mmc_cfg = >cfg;
+
+if (cfg->max_bus_width == 8) {
+mmc_cfg->host_caps |= MMC_MODE_1BIT | MMC_MODE_4BIT |
+  MMC_MODE_8BIT;
+} else if (cfg->max_bus_width == 4) {
+mmc_cfg->host_caps |= MMC_MODE_1BIT | MMC_MODE_4BIT;
+} else if (cfg->max_bus_width == 1) {
+mmc_cfg->host_caps |= MMC_MODE_1BIT;
+} else {
+mmc_cfg->host_caps |= MMC_MODE_1BIT | MMC_MODE_4BIT |
+  MMC_MODE_8BIT;
+printf("No max bus width provided. Assume 8-bit supported.\n");


Why assume that 8-bit buswidth is supported? It needs to display an invalid 
max_bus_width value.
And set to 1-Bit mode by default.


This is just setting the capabilities of the host. The actual bus width
selected depends on the card which is plugged in. See e.g.
mmc_select_mode_and_width where the card caps are limited by the host
caps. Many users of this driver don't set max_bus_width, so changing
this default would likely cause a performance regression. Note that
fsl_esdhc also shares this logic.


Thanks for kindly explanation.

I didn't know that fsl_esdhc is sharing this logic.
If max_bus_width is set to wrong value, then user needs to know that it's 

Re: [PATCH 04/11] mmc: fsl_esdhc_imx: clean up bus width configuration code

2021-11-09 Thread Jaehoon Chung
Hi Sean,

On 11/9/21 11:42 PM, Sean Anderson wrote:
> 
> 
> On 11/9/21 2:19 AM, Jaehoon Chung wrote:
>> On 11/6/21 2:39 AM, Sean Anderson wrote:
>>> [ fsl_esdhc commit 07bae1de382723b94244096953b05225572728cd ]
>>>
>>> This patch is to clean up bus width setting code.
>>>
>>> - For DM_MMC, remove getting "bus-width" from device tree.
>>>   This has been done in mmc_of_parse().
>>>
>>> - For non-DM_MMC, move bus width configuration from fsl_esdhc_init()
>>>   to fsl_esdhc_initialize() which is non-DM_MMC specific.
>>>   And fix up bus width configuration to support only 1-bit, 4-bit,
>>>   or 8-bit. Keep using 8-bit if it's not set because many platforms
>>>   use driver without providing max bus width.
>>>
>>> - Remove bus_width member from fsl_esdhc_priv structure.
>>>
>>> Signed-off-by: Yangbo Lu 
>>> Signed-off-by: Sean Anderson 
>>> ---
>>>
>>>  drivers/mmc/fsl_esdhc_imx.c | 80 +++--
>>>  1 file changed, 23 insertions(+), 57 deletions(-)
>>>
>>> diff --git a/drivers/mmc/fsl_esdhc_imx.c b/drivers/mmc/fsl_esdhc_imx.c
>>> index b91dda27f9..d3daf4db59 100644
>>> --- a/drivers/mmc/fsl_esdhc_imx.c
>>> +++ b/drivers/mmc/fsl_esdhc_imx.c
>>> @@ -126,7 +126,6 @@ struct esdhc_soc_data {
>>>   *
>>>   * @esdhc_regs: registers of the sdhc controller
>>>   * @sdhc_clk: Current clk of the sdhc controller
>>> - * @bus_width: bus width, 1bit, 4bit or 8bit
>>>   * @cfg: mmc config
>>>   * @mmc: mmc
>>>   * Following is used when Driver Model is enabled for MMC
>>> @@ -151,7 +150,6 @@ struct fsl_esdhc_priv {
>>>  struct clk per_clk;
>>>  unsigned int clock;
>>>  unsigned int mode;
>>> -    unsigned int bus_width;
>>>  #if !CONFIG_IS_ENABLED(DM_MMC)
>>>  struct mmc *mmc;
>>>  #endif
>>> @@ -1232,31 +1230,13 @@ static int fsl_esdhc_init(struct fsl_esdhc_priv 
>>> *priv,
>>>  #if !CONFIG_IS_ENABLED(DM_MMC)
>>>  cfg->ops = _ops;
>>>  #endif
>>> -    if (priv->bus_width == 8)
>>> -    cfg->host_caps = MMC_MODE_4BIT | MMC_MODE_8BIT;
>>> -    else if (priv->bus_width == 4)
>>> -    cfg->host_caps = MMC_MODE_4BIT;
>>> -
>>> -    cfg->host_caps = MMC_MODE_4BIT | MMC_MODE_8BIT;
>>>  #ifdef CONFIG_SYS_FSL_ESDHC_HAS_DDR_MODE
>>>  cfg->host_caps |= MMC_MODE_DDR_52MHz;
>>>  #endif
>>>
>>> -    if (priv->bus_width > 0) {
>>> -    if (priv->bus_width < 8)
>>> -    cfg->host_caps &= ~MMC_MODE_8BIT;
>>> -    if (priv->bus_width < 4)
>>> -    cfg->host_caps &= ~MMC_MODE_4BIT;
>>> -    }
>>> -
>>>  if (caps & HOSTCAPBLT_HSS)
>>>  cfg->host_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
>>>
>>> -#ifdef CONFIG_ESDHC_DETECT_8_BIT_QUIRK
>>> -    if (CONFIG_ESDHC_DETECT_8_BIT_QUIRK)
>>> -    cfg->host_caps &= ~MMC_MODE_8BIT;
>>> -#endif
>>> -
>>>  cfg->host_caps |= priv->caps;
>>>
>>>  cfg->f_min = 40;
>>> @@ -1294,25 +1274,11 @@ static int fsl_esdhc_init(struct fsl_esdhc_priv 
>>> *priv,
>>>  }
>>>
>>>  #if !CONFIG_IS_ENABLED(DM_MMC)
>>> -static int fsl_esdhc_cfg_to_priv(struct fsl_esdhc_cfg *cfg,
>>> - struct fsl_esdhc_priv *priv)
>>> -{
>>> -    if (!cfg || !priv)
>>> -    return -EINVAL;
>>> -
>>> -    priv->esdhc_regs = (struct fsl_esdhc *)(unsigned 
>>> long)(cfg->esdhc_base);
>>> -    priv->bus_width = cfg->max_bus_width;
>>> -    priv->sdhc_clk = cfg->sdhc_clk;
>>> -    priv->wp_enable  = cfg->wp_enable;
>>> -    priv->vs18_enable  = cfg->vs18_enable;
>>> -
>>> -    return 0;
>>> -};
>>> -
>>>  int fsl_esdhc_initialize(struct bd_info *bis, struct fsl_esdhc_cfg *cfg)
>>>  {
>>>  struct fsl_esdhc_plat *plat;
>>>  struct fsl_esdhc_priv *priv;
>>> +    struct mmc_config *mmc_cfg;
>>>  struct mmc *mmc;
>>>  int ret;
>>>
>>> @@ -1328,14 +1294,30 @@ int fsl_esdhc_initialize(struct bd_info *bis, 
>>> struct fsl_esdhc_cfg *cfg)
>>>  return -ENOMEM;
>>>  }
>>>
>>> -    ret = fsl_esdhc_cfg_to_priv(cfg, priv);
>>> -    if (ret) {
>>> -    debug("%s xlate failure\n", __func__);
>>> -    free(plat);
>>> -    free(priv);
>>> -    return ret;
>>> +    priv->esdhc_regs = (struct fsl_esdhc *)(unsigned 
>>> long)(cfg->esdhc_base);
>>> +    priv->sdhc_clk = cfg->sdhc_clk;
>>> +    priv->wp_enable  = cfg->wp_enable;
>>> +
>>> +    mmc_cfg = >cfg;
>>> +
>>> +    if (cfg->max_bus_width == 8) {
>>> +    mmc_cfg->host_caps |= MMC_MODE_1BIT | MMC_MODE_4BIT |
>>> +  MMC_MODE_8BIT;
>>> +    } else if (cfg->max_bus_width == 4) {
>>> +    mmc_cfg->host_caps |= MMC_MODE_1BIT | MMC_MODE_4BIT;
>>> +    } else if (cfg->max_bus_width == 1) {
>>> +    mmc_cfg->host_caps |= MMC_MODE_1BIT;
>>> +    } else {
>>> +    mmc_cfg->host_caps |= MMC_MODE_1BIT | MMC_MODE_4BIT |
>>> +  MMC_MODE_8BIT;
>>> +    printf("No max bus width provided. Assume 8-bit supported.\n");
>>
>> Why assume that 8-bit buswidth is supported? It needs to display an invalid 
>> max_bus_width value.
>> And set to 1-Bit mode by default.
> 
> This is just setting the 

Re: [PATCH 04/11] mmc: fsl_esdhc_imx: clean up bus width configuration code

2021-11-09 Thread Adam Ford
On Fri, Nov 5, 2021 at 12:41 PM Sean Anderson  wrote:
>
> [ fsl_esdhc commit 07bae1de382723b94244096953b05225572728cd ]
>
> This patch is to clean up bus width setting code.
>
> - For DM_MMC, remove getting "bus-width" from device tree.
>   This has been done in mmc_of_parse().
>
> - For non-DM_MMC, move bus width configuration from fsl_esdhc_init()
>   to fsl_esdhc_initialize() which is non-DM_MMC specific.
>   And fix up bus width configuration to support only 1-bit, 4-bit,
>   or 8-bit. Keep using 8-bit if it's not set because many platforms
>   use driver without providing max bus width.
>
> - Remove bus_width member from fsl_esdhc_priv structure.
>
> Signed-off-by: Yangbo Lu 
> Signed-off-by: Sean Anderson 
> ---
>
>  drivers/mmc/fsl_esdhc_imx.c | 80 +++--
>  1 file changed, 23 insertions(+), 57 deletions(-)
>
> diff --git a/drivers/mmc/fsl_esdhc_imx.c b/drivers/mmc/fsl_esdhc_imx.c
> index b91dda27f9..d3daf4db59 100644
> --- a/drivers/mmc/fsl_esdhc_imx.c
> +++ b/drivers/mmc/fsl_esdhc_imx.c
> @@ -126,7 +126,6 @@ struct esdhc_soc_data {
>   *
>   * @esdhc_regs: registers of the sdhc controller
>   * @sdhc_clk: Current clk of the sdhc controller
> - * @bus_width: bus width, 1bit, 4bit or 8bit
>   * @cfg: mmc config
>   * @mmc: mmc
>   * Following is used when Driver Model is enabled for MMC
> @@ -151,7 +150,6 @@ struct fsl_esdhc_priv {
> struct clk per_clk;
> unsigned int clock;
> unsigned int mode;
> -   unsigned int bus_width;
>  #if !CONFIG_IS_ENABLED(DM_MMC)
> struct mmc *mmc;
>  #endif
> @@ -1232,31 +1230,13 @@ static int fsl_esdhc_init(struct fsl_esdhc_priv *priv,
>  #if !CONFIG_IS_ENABLED(DM_MMC)
> cfg->ops = _ops;
>  #endif
> -   if (priv->bus_width == 8)
> -   cfg->host_caps = MMC_MODE_4BIT | MMC_MODE_8BIT;
> -   else if (priv->bus_width == 4)
> -   cfg->host_caps = MMC_MODE_4BIT;
> -
> -   cfg->host_caps = MMC_MODE_4BIT | MMC_MODE_8BIT;
>  #ifdef CONFIG_SYS_FSL_ESDHC_HAS_DDR_MODE
> cfg->host_caps |= MMC_MODE_DDR_52MHz;
>  #endif
>
> -   if (priv->bus_width > 0) {
> -   if (priv->bus_width < 8)
> -   cfg->host_caps &= ~MMC_MODE_8BIT;
> -   if (priv->bus_width < 4)
> -   cfg->host_caps &= ~MMC_MODE_4BIT;
> -   }
> -
> if (caps & HOSTCAPBLT_HSS)
> cfg->host_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
>
> -#ifdef CONFIG_ESDHC_DETECT_8_BIT_QUIRK
> -   if (CONFIG_ESDHC_DETECT_8_BIT_QUIRK)
> -   cfg->host_caps &= ~MMC_MODE_8BIT;
> -#endif
> -
> cfg->host_caps |= priv->caps;
>
> cfg->f_min = 40;
> @@ -1294,25 +1274,11 @@ static int fsl_esdhc_init(struct fsl_esdhc_priv *priv,
>  }
>
>  #if !CONFIG_IS_ENABLED(DM_MMC)
> -static int fsl_esdhc_cfg_to_priv(struct fsl_esdhc_cfg *cfg,
> -struct fsl_esdhc_priv *priv)
> -{
> -   if (!cfg || !priv)
> -   return -EINVAL;
> -
> -   priv->esdhc_regs = (struct fsl_esdhc *)(unsigned 
> long)(cfg->esdhc_base);
> -   priv->bus_width = cfg->max_bus_width;
> -   priv->sdhc_clk = cfg->sdhc_clk;
> -   priv->wp_enable  = cfg->wp_enable;
> -   priv->vs18_enable  = cfg->vs18_enable;
> -
> -   return 0;
> -};
> -
>  int fsl_esdhc_initialize(struct bd_info *bis, struct fsl_esdhc_cfg *cfg)
>  {
> struct fsl_esdhc_plat *plat;
> struct fsl_esdhc_priv *priv;
> +   struct mmc_config *mmc_cfg;
> struct mmc *mmc;
> int ret;
>
> @@ -1328,14 +1294,30 @@ int fsl_esdhc_initialize(struct bd_info *bis, struct 
> fsl_esdhc_cfg *cfg)
> return -ENOMEM;
> }
>
> -   ret = fsl_esdhc_cfg_to_priv(cfg, priv);
> -   if (ret) {
> -   debug("%s xlate failure\n", __func__);
> -   free(plat);
> -   free(priv);
> -   return ret;
> +   priv->esdhc_regs = (struct fsl_esdhc *)(unsigned 
> long)(cfg->esdhc_base);
> +   priv->sdhc_clk = cfg->sdhc_clk;
> +   priv->wp_enable  = cfg->wp_enable;
> +
> +   mmc_cfg = >cfg;
> +
> +   if (cfg->max_bus_width == 8) {
> +   mmc_cfg->host_caps |= MMC_MODE_1BIT | MMC_MODE_4BIT |
> + MMC_MODE_8BIT;
> +   } else if (cfg->max_bus_width == 4) {
> +   mmc_cfg->host_caps |= MMC_MODE_1BIT | MMC_MODE_4BIT;
> +   } else if (cfg->max_bus_width == 1) {
> +   mmc_cfg->host_caps |= MMC_MODE_1BIT;
> +   } else {
> +   mmc_cfg->host_caps |= MMC_MODE_1BIT | MMC_MODE_4BIT |
> + MMC_MODE_8BIT;
> +   printf("No max bus width provided. Assume 8-bit 
> supported.\n");

I wonder if a switch statement would be cleaner looking, and the 8-bit
quirk can be integrated into the case 8 statement to something like:

switch (cfg->max_bus_width)

   case 8:
 if (!CONFIG_IS_ENABLED(ESDHC_DETECT_8_BIT_QUIRK)
 

Re: [PATCH 04/11] mmc: fsl_esdhc_imx: clean up bus width configuration code

2021-11-09 Thread Sean Anderson




On 11/9/21 2:19 AM, Jaehoon Chung wrote:

On 11/6/21 2:39 AM, Sean Anderson wrote:

[ fsl_esdhc commit 07bae1de382723b94244096953b05225572728cd ]

This patch is to clean up bus width setting code.

- For DM_MMC, remove getting "bus-width" from device tree.
  This has been done in mmc_of_parse().

- For non-DM_MMC, move bus width configuration from fsl_esdhc_init()
  to fsl_esdhc_initialize() which is non-DM_MMC specific.
  And fix up bus width configuration to support only 1-bit, 4-bit,
  or 8-bit. Keep using 8-bit if it's not set because many platforms
  use driver without providing max bus width.

- Remove bus_width member from fsl_esdhc_priv structure.

Signed-off-by: Yangbo Lu 
Signed-off-by: Sean Anderson 
---

 drivers/mmc/fsl_esdhc_imx.c | 80 +++--
 1 file changed, 23 insertions(+), 57 deletions(-)

diff --git a/drivers/mmc/fsl_esdhc_imx.c b/drivers/mmc/fsl_esdhc_imx.c
index b91dda27f9..d3daf4db59 100644
--- a/drivers/mmc/fsl_esdhc_imx.c
+++ b/drivers/mmc/fsl_esdhc_imx.c
@@ -126,7 +126,6 @@ struct esdhc_soc_data {
  *
  * @esdhc_regs: registers of the sdhc controller
  * @sdhc_clk: Current clk of the sdhc controller
- * @bus_width: bus width, 1bit, 4bit or 8bit
  * @cfg: mmc config
  * @mmc: mmc
  * Following is used when Driver Model is enabled for MMC
@@ -151,7 +150,6 @@ struct fsl_esdhc_priv {
struct clk per_clk;
unsigned int clock;
unsigned int mode;
-   unsigned int bus_width;
 #if !CONFIG_IS_ENABLED(DM_MMC)
struct mmc *mmc;
 #endif
@@ -1232,31 +1230,13 @@ static int fsl_esdhc_init(struct fsl_esdhc_priv *priv,
 #if !CONFIG_IS_ENABLED(DM_MMC)
cfg->ops = _ops;
 #endif
-   if (priv->bus_width == 8)
-   cfg->host_caps = MMC_MODE_4BIT | MMC_MODE_8BIT;
-   else if (priv->bus_width == 4)
-   cfg->host_caps = MMC_MODE_4BIT;
-
-   cfg->host_caps = MMC_MODE_4BIT | MMC_MODE_8BIT;
 #ifdef CONFIG_SYS_FSL_ESDHC_HAS_DDR_MODE
cfg->host_caps |= MMC_MODE_DDR_52MHz;
 #endif

-   if (priv->bus_width > 0) {
-   if (priv->bus_width < 8)
-   cfg->host_caps &= ~MMC_MODE_8BIT;
-   if (priv->bus_width < 4)
-   cfg->host_caps &= ~MMC_MODE_4BIT;
-   }
-
if (caps & HOSTCAPBLT_HSS)
cfg->host_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;

-#ifdef CONFIG_ESDHC_DETECT_8_BIT_QUIRK
-   if (CONFIG_ESDHC_DETECT_8_BIT_QUIRK)
-   cfg->host_caps &= ~MMC_MODE_8BIT;
-#endif
-
cfg->host_caps |= priv->caps;

cfg->f_min = 40;
@@ -1294,25 +1274,11 @@ static int fsl_esdhc_init(struct fsl_esdhc_priv *priv,
 }

 #if !CONFIG_IS_ENABLED(DM_MMC)
-static int fsl_esdhc_cfg_to_priv(struct fsl_esdhc_cfg *cfg,
-struct fsl_esdhc_priv *priv)
-{
-   if (!cfg || !priv)
-   return -EINVAL;
-
-   priv->esdhc_regs = (struct fsl_esdhc *)(unsigned long)(cfg->esdhc_base);
-   priv->bus_width = cfg->max_bus_width;
-   priv->sdhc_clk = cfg->sdhc_clk;
-   priv->wp_enable  = cfg->wp_enable;
-   priv->vs18_enable  = cfg->vs18_enable;
-
-   return 0;
-};
-
 int fsl_esdhc_initialize(struct bd_info *bis, struct fsl_esdhc_cfg *cfg)
 {
struct fsl_esdhc_plat *plat;
struct fsl_esdhc_priv *priv;
+   struct mmc_config *mmc_cfg;
struct mmc *mmc;
int ret;

@@ -1328,14 +1294,30 @@ int fsl_esdhc_initialize(struct bd_info *bis, struct 
fsl_esdhc_cfg *cfg)
return -ENOMEM;
}

-   ret = fsl_esdhc_cfg_to_priv(cfg, priv);
-   if (ret) {
-   debug("%s xlate failure\n", __func__);
-   free(plat);
-   free(priv);
-   return ret;
+   priv->esdhc_regs = (struct fsl_esdhc *)(unsigned long)(cfg->esdhc_base);
+   priv->sdhc_clk = cfg->sdhc_clk;
+   priv->wp_enable  = cfg->wp_enable;
+
+   mmc_cfg = >cfg;
+
+   if (cfg->max_bus_width == 8) {
+   mmc_cfg->host_caps |= MMC_MODE_1BIT | MMC_MODE_4BIT |
+ MMC_MODE_8BIT;
+   } else if (cfg->max_bus_width == 4) {
+   mmc_cfg->host_caps |= MMC_MODE_1BIT | MMC_MODE_4BIT;
+   } else if (cfg->max_bus_width == 1) {
+   mmc_cfg->host_caps |= MMC_MODE_1BIT;
+   } else {
+   mmc_cfg->host_caps |= MMC_MODE_1BIT | MMC_MODE_4BIT |
+ MMC_MODE_8BIT;
+   printf("No max bus width provided. Assume 8-bit supported.\n");


Why assume that 8-bit buswidth is supported? It needs to display an invalid 
max_bus_width value.
And set to 1-Bit mode by default.


This is just setting the capabilities of the host. The actual bus width
selected depends on the card which is plugged in. See e.g.
mmc_select_mode_and_width where the card caps are limited by the host
caps. Many users of this driver don't set max_bus_width, so changing
this default would likely cause a performance 

Re: [PATCH 04/11] mmc: fsl_esdhc_imx: clean up bus width configuration code

2021-11-08 Thread Jaehoon Chung
On 11/6/21 2:39 AM, Sean Anderson wrote:
> [ fsl_esdhc commit 07bae1de382723b94244096953b05225572728cd ]
> 
> This patch is to clean up bus width setting code.
> 
> - For DM_MMC, remove getting "bus-width" from device tree.
>   This has been done in mmc_of_parse().
> 
> - For non-DM_MMC, move bus width configuration from fsl_esdhc_init()
>   to fsl_esdhc_initialize() which is non-DM_MMC specific.
>   And fix up bus width configuration to support only 1-bit, 4-bit,
>   or 8-bit. Keep using 8-bit if it's not set because many platforms
>   use driver without providing max bus width.
> 
> - Remove bus_width member from fsl_esdhc_priv structure.
> 
> Signed-off-by: Yangbo Lu 
> Signed-off-by: Sean Anderson 
> ---
> 
>  drivers/mmc/fsl_esdhc_imx.c | 80 +++--
>  1 file changed, 23 insertions(+), 57 deletions(-)
> 
> diff --git a/drivers/mmc/fsl_esdhc_imx.c b/drivers/mmc/fsl_esdhc_imx.c
> index b91dda27f9..d3daf4db59 100644
> --- a/drivers/mmc/fsl_esdhc_imx.c
> +++ b/drivers/mmc/fsl_esdhc_imx.c
> @@ -126,7 +126,6 @@ struct esdhc_soc_data {
>   *
>   * @esdhc_regs: registers of the sdhc controller
>   * @sdhc_clk: Current clk of the sdhc controller
> - * @bus_width: bus width, 1bit, 4bit or 8bit
>   * @cfg: mmc config
>   * @mmc: mmc
>   * Following is used when Driver Model is enabled for MMC
> @@ -151,7 +150,6 @@ struct fsl_esdhc_priv {
>   struct clk per_clk;
>   unsigned int clock;
>   unsigned int mode;
> - unsigned int bus_width;
>  #if !CONFIG_IS_ENABLED(DM_MMC)
>   struct mmc *mmc;
>  #endif
> @@ -1232,31 +1230,13 @@ static int fsl_esdhc_init(struct fsl_esdhc_priv *priv,
>  #if !CONFIG_IS_ENABLED(DM_MMC)
>   cfg->ops = _ops;
>  #endif
> - if (priv->bus_width == 8)
> - cfg->host_caps = MMC_MODE_4BIT | MMC_MODE_8BIT;
> - else if (priv->bus_width == 4)
> - cfg->host_caps = MMC_MODE_4BIT;
> -
> - cfg->host_caps = MMC_MODE_4BIT | MMC_MODE_8BIT;
>  #ifdef CONFIG_SYS_FSL_ESDHC_HAS_DDR_MODE
>   cfg->host_caps |= MMC_MODE_DDR_52MHz;
>  #endif
>  
> - if (priv->bus_width > 0) {
> - if (priv->bus_width < 8)
> - cfg->host_caps &= ~MMC_MODE_8BIT;
> - if (priv->bus_width < 4)
> - cfg->host_caps &= ~MMC_MODE_4BIT;
> - }
> -
>   if (caps & HOSTCAPBLT_HSS)
>   cfg->host_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
>  
> -#ifdef CONFIG_ESDHC_DETECT_8_BIT_QUIRK
> - if (CONFIG_ESDHC_DETECT_8_BIT_QUIRK)
> - cfg->host_caps &= ~MMC_MODE_8BIT;
> -#endif
> -
>   cfg->host_caps |= priv->caps;
>  
>   cfg->f_min = 40;
> @@ -1294,25 +1274,11 @@ static int fsl_esdhc_init(struct fsl_esdhc_priv *priv,
>  }
>  
>  #if !CONFIG_IS_ENABLED(DM_MMC)
> -static int fsl_esdhc_cfg_to_priv(struct fsl_esdhc_cfg *cfg,
> -  struct fsl_esdhc_priv *priv)
> -{
> - if (!cfg || !priv)
> - return -EINVAL;
> -
> - priv->esdhc_regs = (struct fsl_esdhc *)(unsigned long)(cfg->esdhc_base);
> - priv->bus_width = cfg->max_bus_width;
> - priv->sdhc_clk = cfg->sdhc_clk;
> - priv->wp_enable  = cfg->wp_enable;
> - priv->vs18_enable  = cfg->vs18_enable;
> -
> - return 0;
> -};
> -
>  int fsl_esdhc_initialize(struct bd_info *bis, struct fsl_esdhc_cfg *cfg)
>  {
>   struct fsl_esdhc_plat *plat;
>   struct fsl_esdhc_priv *priv;
> + struct mmc_config *mmc_cfg;
>   struct mmc *mmc;
>   int ret;
>  
> @@ -1328,14 +1294,30 @@ int fsl_esdhc_initialize(struct bd_info *bis, struct 
> fsl_esdhc_cfg *cfg)
>   return -ENOMEM;
>   }
>  
> - ret = fsl_esdhc_cfg_to_priv(cfg, priv);
> - if (ret) {
> - debug("%s xlate failure\n", __func__);
> - free(plat);
> - free(priv);
> - return ret;
> + priv->esdhc_regs = (struct fsl_esdhc *)(unsigned long)(cfg->esdhc_base);
> + priv->sdhc_clk = cfg->sdhc_clk;
> + priv->wp_enable  = cfg->wp_enable;
> +
> + mmc_cfg = >cfg;
> +
> + if (cfg->max_bus_width == 8) {
> + mmc_cfg->host_caps |= MMC_MODE_1BIT | MMC_MODE_4BIT |
> +   MMC_MODE_8BIT;
> + } else if (cfg->max_bus_width == 4) {
> + mmc_cfg->host_caps |= MMC_MODE_1BIT | MMC_MODE_4BIT;
> + } else if (cfg->max_bus_width == 1) {
> + mmc_cfg->host_caps |= MMC_MODE_1BIT;
> + } else {
> + mmc_cfg->host_caps |= MMC_MODE_1BIT | MMC_MODE_4BIT |
> +   MMC_MODE_8BIT;
> + printf("No max bus width provided. Assume 8-bit supported.\n");

Why assume that 8-bit buswidth is supported? It needs to display an invalid 
max_bus_width value.
And set to 1-Bit mode by default. 

>   }
>  
> +#ifdef CONFIG_ESDHC_DETECT_8_BIT_QUIRK
> + if (CONFIG_ESDHC_DETECT_8_BIT_QUIRK)

How about also changing this at this time?

if (IS_ENABLED(CONFIG_ESDCH..))? 

Best Regards,
Jaehoon Chung

> + 

[PATCH 04/11] mmc: fsl_esdhc_imx: clean up bus width configuration code

2021-11-05 Thread Sean Anderson
[ fsl_esdhc commit 07bae1de382723b94244096953b05225572728cd ]

This patch is to clean up bus width setting code.

- For DM_MMC, remove getting "bus-width" from device tree.
  This has been done in mmc_of_parse().

- For non-DM_MMC, move bus width configuration from fsl_esdhc_init()
  to fsl_esdhc_initialize() which is non-DM_MMC specific.
  And fix up bus width configuration to support only 1-bit, 4-bit,
  or 8-bit. Keep using 8-bit if it's not set because many platforms
  use driver without providing max bus width.

- Remove bus_width member from fsl_esdhc_priv structure.

Signed-off-by: Yangbo Lu 
Signed-off-by: Sean Anderson 
---

 drivers/mmc/fsl_esdhc_imx.c | 80 +++--
 1 file changed, 23 insertions(+), 57 deletions(-)

diff --git a/drivers/mmc/fsl_esdhc_imx.c b/drivers/mmc/fsl_esdhc_imx.c
index b91dda27f9..d3daf4db59 100644
--- a/drivers/mmc/fsl_esdhc_imx.c
+++ b/drivers/mmc/fsl_esdhc_imx.c
@@ -126,7 +126,6 @@ struct esdhc_soc_data {
  *
  * @esdhc_regs: registers of the sdhc controller
  * @sdhc_clk: Current clk of the sdhc controller
- * @bus_width: bus width, 1bit, 4bit or 8bit
  * @cfg: mmc config
  * @mmc: mmc
  * Following is used when Driver Model is enabled for MMC
@@ -151,7 +150,6 @@ struct fsl_esdhc_priv {
struct clk per_clk;
unsigned int clock;
unsigned int mode;
-   unsigned int bus_width;
 #if !CONFIG_IS_ENABLED(DM_MMC)
struct mmc *mmc;
 #endif
@@ -1232,31 +1230,13 @@ static int fsl_esdhc_init(struct fsl_esdhc_priv *priv,
 #if !CONFIG_IS_ENABLED(DM_MMC)
cfg->ops = _ops;
 #endif
-   if (priv->bus_width == 8)
-   cfg->host_caps = MMC_MODE_4BIT | MMC_MODE_8BIT;
-   else if (priv->bus_width == 4)
-   cfg->host_caps = MMC_MODE_4BIT;
-
-   cfg->host_caps = MMC_MODE_4BIT | MMC_MODE_8BIT;
 #ifdef CONFIG_SYS_FSL_ESDHC_HAS_DDR_MODE
cfg->host_caps |= MMC_MODE_DDR_52MHz;
 #endif
 
-   if (priv->bus_width > 0) {
-   if (priv->bus_width < 8)
-   cfg->host_caps &= ~MMC_MODE_8BIT;
-   if (priv->bus_width < 4)
-   cfg->host_caps &= ~MMC_MODE_4BIT;
-   }
-
if (caps & HOSTCAPBLT_HSS)
cfg->host_caps |= MMC_MODE_HS_52MHz | MMC_MODE_HS;
 
-#ifdef CONFIG_ESDHC_DETECT_8_BIT_QUIRK
-   if (CONFIG_ESDHC_DETECT_8_BIT_QUIRK)
-   cfg->host_caps &= ~MMC_MODE_8BIT;
-#endif
-
cfg->host_caps |= priv->caps;
 
cfg->f_min = 40;
@@ -1294,25 +1274,11 @@ static int fsl_esdhc_init(struct fsl_esdhc_priv *priv,
 }
 
 #if !CONFIG_IS_ENABLED(DM_MMC)
-static int fsl_esdhc_cfg_to_priv(struct fsl_esdhc_cfg *cfg,
-struct fsl_esdhc_priv *priv)
-{
-   if (!cfg || !priv)
-   return -EINVAL;
-
-   priv->esdhc_regs = (struct fsl_esdhc *)(unsigned long)(cfg->esdhc_base);
-   priv->bus_width = cfg->max_bus_width;
-   priv->sdhc_clk = cfg->sdhc_clk;
-   priv->wp_enable  = cfg->wp_enable;
-   priv->vs18_enable  = cfg->vs18_enable;
-
-   return 0;
-};
-
 int fsl_esdhc_initialize(struct bd_info *bis, struct fsl_esdhc_cfg *cfg)
 {
struct fsl_esdhc_plat *plat;
struct fsl_esdhc_priv *priv;
+   struct mmc_config *mmc_cfg;
struct mmc *mmc;
int ret;
 
@@ -1328,14 +1294,30 @@ int fsl_esdhc_initialize(struct bd_info *bis, struct 
fsl_esdhc_cfg *cfg)
return -ENOMEM;
}
 
-   ret = fsl_esdhc_cfg_to_priv(cfg, priv);
-   if (ret) {
-   debug("%s xlate failure\n", __func__);
-   free(plat);
-   free(priv);
-   return ret;
+   priv->esdhc_regs = (struct fsl_esdhc *)(unsigned long)(cfg->esdhc_base);
+   priv->sdhc_clk = cfg->sdhc_clk;
+   priv->wp_enable  = cfg->wp_enable;
+
+   mmc_cfg = >cfg;
+
+   if (cfg->max_bus_width == 8) {
+   mmc_cfg->host_caps |= MMC_MODE_1BIT | MMC_MODE_4BIT |
+ MMC_MODE_8BIT;
+   } else if (cfg->max_bus_width == 4) {
+   mmc_cfg->host_caps |= MMC_MODE_1BIT | MMC_MODE_4BIT;
+   } else if (cfg->max_bus_width == 1) {
+   mmc_cfg->host_caps |= MMC_MODE_1BIT;
+   } else {
+   mmc_cfg->host_caps |= MMC_MODE_1BIT | MMC_MODE_4BIT |
+ MMC_MODE_8BIT;
+   printf("No max bus width provided. Assume 8-bit supported.\n");
}
 
+#ifdef CONFIG_ESDHC_DETECT_8_BIT_QUIRK
+   if (CONFIG_ESDHC_DETECT_8_BIT_QUIRK)
+   mmc_cfg->host_caps &= ~MMC_MODE_8BIT;
+#endif
+
ret = fsl_esdhc_init(priv, plat);
if (ret) {
debug("%s init failure\n", __func__);
@@ -1416,14 +1398,6 @@ static int fsl_esdhc_of_to_plat(struct udevice *dev)
priv->dev = dev;
priv->mode = -1;
 
-   val = dev_read_u32_default(dev, "bus-width", -1);
-   if (val == 8)
-   priv->bus_width = 8;
-   else if (val ==