Re: [PATCH] mmc: sdhci-esdhc-imx: correct the tuning start tap and step setting

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 7/12/22 13:23, haibo.chen@xxxxxxx wrote:
> From: Haibo Chen <haibo.chen@xxxxxxx>
> 
> Current code logic may be impacted by the setting of ROM/Bootloader,
> so unmask these bits first, then setting these bits accordingly.
> 
> Fixes: 2b16cf326b70 ("mmc: sdhci-esdhc-imx: move tuning static configuration into hwinit function")
> Signed-off-by: Haibo Chen <haibo.chen@xxxxxxx>

Acked-by: Adrian Hunter <adrian.hunter@xxxxxxxxx>

> ---
>  drivers/mmc/host/sdhci-esdhc-imx.c | 22 +++++++++++++++-------
>  1 file changed, 15 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/mmc/host/sdhci-esdhc-imx.c b/drivers/mmc/host/sdhci-esdhc-imx.c
> index 89ef0c80ac37..9e73c34b6401 100644
> --- a/drivers/mmc/host/sdhci-esdhc-imx.c
> +++ b/drivers/mmc/host/sdhci-esdhc-imx.c
> @@ -107,6 +107,7 @@
>  #define ESDHC_TUNING_START_TAP_DEFAULT	0x1
>  #define ESDHC_TUNING_START_TAP_MASK	0x7f
>  #define ESDHC_TUNING_CMD_CRC_CHECK_DISABLE	(1 << 7)
> +#define ESDHC_TUNING_STEP_DEFAULT	0x1
>  #define ESDHC_TUNING_STEP_MASK		0x00070000
>  #define ESDHC_TUNING_STEP_SHIFT		16
>  
> @@ -1368,7 +1369,7 @@ static void sdhci_esdhc_imx_hwinit(struct sdhci_host *host)
>  	struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
>  	struct pltfm_imx_data *imx_data = sdhci_pltfm_priv(pltfm_host);
>  	struct cqhci_host *cq_host = host->mmc->cqe_private;
> -	int tmp;
> +	u32 tmp;
>  
>  	if (esdhc_is_usdhc(imx_data)) {
>  		/*
> @@ -1423,17 +1424,24 @@ static void sdhci_esdhc_imx_hwinit(struct sdhci_host *host)
>  
>  		if (imx_data->socdata->flags & ESDHC_FLAG_STD_TUNING) {
>  			tmp = readl(host->ioaddr + ESDHC_TUNING_CTRL);
> -			tmp |= ESDHC_STD_TUNING_EN |
> -				ESDHC_TUNING_START_TAP_DEFAULT;
> -			if (imx_data->boarddata.tuning_start_tap) {
> -				tmp &= ~ESDHC_TUNING_START_TAP_MASK;
> +			tmp |= ESDHC_STD_TUNING_EN;
> +
> +			/*
> +			 * ROM code or bootloader may config the start tap
> +			 * and step, unmask them first.
> +			 */
> +			tmp &= ~(ESDHC_TUNING_START_TAP_MASK | ESDHC_TUNING_STEP_MASK);
> +			if (imx_data->boarddata.tuning_start_tap)
>  				tmp |= imx_data->boarddata.tuning_start_tap;
> -			}
> +			else
> +				tmp |= ESDHC_TUNING_START_TAP_DEFAULT;
>  
>  			if (imx_data->boarddata.tuning_step) {
> -				tmp &= ~ESDHC_TUNING_STEP_MASK;
>  				tmp |= imx_data->boarddata.tuning_step
>  					<< ESDHC_TUNING_STEP_SHIFT;
> +			} else {
> +				tmp |= ESDHC_TUNING_STEP_DEFAULT
> +					<< ESDHC_TUNING_STEP_SHIFT;
>  			}
>  
>  			/* Disable the CMD CRC check for tuning, if not, need to




[Index of Archives]     [Linux Memonry Technology]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux