[PATCH v3 4/6] mmc: zynq_sdhci: Split set_tapdelay function to in and out

Jaehoon Chung jh80.chung at samsung.com
Mon Jul 12 00:24:30 CEST 2021


On 7/9/21 8:53 PM, Ashok Reddy Soma wrote:
> Split arasan_zynqmp_set_tapdelay() to handle input and output tapdelays
> separately. This is required to handle zero values for ITAP and OTAP
> values. If we dont split, we will have to remove the if() in the
> function, which makes ITAP values to be overwritten when OTAP values are
> called to set and vice-versa.
> 
> Restrict tap_delay value calculated to max allowed 8 bits for ITAP and 6
> bits for OTAP for ZynqMP.
> 
> Signed-off-by: Ashok Reddy Soma <ashok.reddy.soma at xilinx.com>


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

Best Regards,
Jaehoon Chung

> ---
> 
> (no changes since v1)
> 
>  board/xilinx/zynqmp/tap_delays.c | 73 +++++++++++++++++---------------
>  drivers/mmc/zynq_sdhci.c         | 10 ++++-
>  include/zynqmp_tap_delay.h       |  7 +--
>  3 files changed, 50 insertions(+), 40 deletions(-)
> 
> diff --git a/board/xilinx/zynqmp/tap_delays.c b/board/xilinx/zynqmp/tap_delays.c
> index 1cab25f00a..d16bbb8eff 100644
> --- a/board/xilinx/zynqmp/tap_delays.c
> +++ b/board/xilinx/zynqmp/tap_delays.c
> @@ -50,48 +50,51 @@ void zynqmp_dll_reset(u8 deviceid)
>  		zynqmp_mmio_write(SD_DLL_CTRL, SD1_DLL_RST_MASK, 0x0);
>  }
>  
> -void arasan_zynqmp_set_tapdelay(u8 deviceid, u32 itap_delay, u32 otap_delay)
> +void arasan_zynqmp_set_in_tapdelay(u8 deviceid, u32 itap_delay)
>  {
>  	if (deviceid == 0) {
> -		zynqmp_mmio_write(SD_DLL_CTRL, SD0_DLL_RST_MASK,
> -				  SD0_DLL_RST);
> -		/* Program ITAP */
> -		if (itap_delay) {
> -			zynqmp_mmio_write(SD_ITAP_DLY, SD0_ITAPCHGWIN_MASK,
> -					  SD0_ITAPCHGWIN);
> -			zynqmp_mmio_write(SD_ITAP_DLY, SD0_ITAPDLYENA_MASK,
> -					  SD0_ITAPDLYENA);
> -			zynqmp_mmio_write(SD_ITAP_DLY, SD0_ITAPDLYSEL_MASK,
> -					  itap_delay);
> -			zynqmp_mmio_write(SD_ITAP_DLY, SD0_ITAPCHGWIN_MASK,
> -					  0x0);
> -		}
> +		zynqmp_mmio_write(SD_DLL_CTRL, SD0_DLL_RST_MASK, SD0_DLL_RST);
>  
> -		/* Program OTAP */
> -		if (otap_delay)
> -			zynqmp_mmio_write(SD_OTAP_DLY, SD0_OTAPDLYSEL_MASK,
> -					  otap_delay);
> +		/* Program ITAP delay */
> +		zynqmp_mmio_write(SD_ITAP_DLY, SD0_ITAPCHGWIN_MASK,
> +				  SD0_ITAPCHGWIN);
> +		zynqmp_mmio_write(SD_ITAP_DLY, SD0_ITAPDLYENA_MASK,
> +				  SD0_ITAPDLYENA);
> +		zynqmp_mmio_write(SD_ITAP_DLY, SD0_ITAPDLYSEL_MASK, itap_delay);
> +		zynqmp_mmio_write(SD_ITAP_DLY, SD0_ITAPCHGWIN_MASK, 0x0);
>  
>  		zynqmp_mmio_write(SD_DLL_CTRL, SD0_DLL_RST_MASK, 0x0);
>  	} else {
> -		zynqmp_mmio_write(SD_DLL_CTRL, SD1_DLL_RST_MASK,
> -				  SD1_DLL_RST);
> -		/* Program ITAP */
> -		if (itap_delay) {
> -			zynqmp_mmio_write(SD_ITAP_DLY, SD1_ITAPCHGWIN_MASK,
> -					  SD1_ITAPCHGWIN);
> -			zynqmp_mmio_write(SD_ITAP_DLY, SD1_ITAPDLYENA_MASK,
> -					  SD1_ITAPDLYENA);
> -			zynqmp_mmio_write(SD_ITAP_DLY, SD1_ITAPDLYSEL_MASK,
> -					  (itap_delay << 16));
> -			zynqmp_mmio_write(SD_ITAP_DLY, SD1_ITAPCHGWIN_MASK,
> -					  0x0);
> -		}
> +		zynqmp_mmio_write(SD_DLL_CTRL, SD1_DLL_RST_MASK, SD1_DLL_RST);
> +
> +		/* Program ITAP delay */
> +		zynqmp_mmio_write(SD_ITAP_DLY, SD1_ITAPCHGWIN_MASK,
> +				  SD1_ITAPCHGWIN);
> +		zynqmp_mmio_write(SD_ITAP_DLY, SD1_ITAPDLYENA_MASK,
> +				  SD1_ITAPDLYENA);
> +		zynqmp_mmio_write(SD_ITAP_DLY, SD1_ITAPDLYSEL_MASK,
> +				  (itap_delay << 16));
> +		zynqmp_mmio_write(SD_ITAP_DLY, SD1_ITAPCHGWIN_MASK, 0x0);
> +
> +		zynqmp_mmio_write(SD_DLL_CTRL, SD1_DLL_RST_MASK, 0x0);
> +	}
> +}
> +
> +void arasan_zynqmp_set_out_tapdelay(u8 deviceid, u32 otap_delay)
> +{
> +	if (deviceid == 0) {
> +		zynqmp_mmio_write(SD_DLL_CTRL, SD0_DLL_RST_MASK, SD0_DLL_RST);
> +
> +		/* Program OTAP delay */
> +		zynqmp_mmio_write(SD_OTAP_DLY, SD0_OTAPDLYSEL_MASK, otap_delay);
> +
> +		zynqmp_mmio_write(SD_DLL_CTRL, SD0_DLL_RST_MASK, 0x0);
> +	} else {
> +		zynqmp_mmio_write(SD_DLL_CTRL, SD1_DLL_RST_MASK, SD1_DLL_RST);
>  
> -		/* Program OTAP */
> -		if (otap_delay)
> -			zynqmp_mmio_write(SD_OTAP_DLY, SD1_OTAPDLYSEL_MASK,
> -					  (otap_delay << 16));
> +		/* Program OTAP delay */
> +		zynqmp_mmio_write(SD_OTAP_DLY, SD1_OTAPDLYSEL_MASK,
> +				  (otap_delay << 16));
>  
>  		zynqmp_mmio_write(SD_DLL_CTRL, SD1_DLL_RST_MASK, 0x0);
>  	}
> diff --git a/drivers/mmc/zynq_sdhci.c b/drivers/mmc/zynq_sdhci.c
> index bf638e9675..95d42ccef4 100644
> --- a/drivers/mmc/zynq_sdhci.c
> +++ b/drivers/mmc/zynq_sdhci.c
> @@ -226,7 +226,10 @@ static int sdhci_zynqmp_sdcardclk_set_phase(struct sdhci_host *host,
>  
>  	tap_delay = (degrees * tap_max) / 360;
>  
> -	arasan_zynqmp_set_tapdelay(priv->deviceid, 0, tap_delay);
> +	/* Limit output tap_delay value to 6 bits */
> +	tap_delay &= SDHCI_ARASAN_OTAPDLY_SEL_MASK;
> +
> +	arasan_zynqmp_set_out_tapdelay(priv->deviceid, tap_delay);
>  
>  	return 0;
>  }
> @@ -279,7 +282,10 @@ static int sdhci_zynqmp_sampleclk_set_phase(struct sdhci_host *host,
>  
>  	tap_delay = (degrees * tap_max) / 360;
>  
> -	arasan_zynqmp_set_tapdelay(priv->deviceid, tap_delay, 0);
> +	/* Limit input tap_delay value to 8 bits */
> +	tap_delay &= SDHCI_ARASAN_ITAPDLY_SEL_MASK;
> +
> +	arasan_zynqmp_set_in_tapdelay(priv->deviceid, tap_delay);
>  
>  	return 0;
>  }
> diff --git a/include/zynqmp_tap_delay.h b/include/zynqmp_tap_delay.h
> index 7b713438f7..1c1e3e7dee 100644
> --- a/include/zynqmp_tap_delay.h
> +++ b/include/zynqmp_tap_delay.h
> @@ -10,11 +10,12 @@
>  
>  #ifdef CONFIG_ARCH_ZYNQMP
>  void zynqmp_dll_reset(u8 deviceid);
> -void arasan_zynqmp_set_tapdelay(u8 device_id, u32 itap_delay, u32 otap_delay);
> +void arasan_zynqmp_set_in_tapdelay(u8 device_id, u32 itap_delay);
> +void arasan_zynqmp_set_out_tapdelay(u8 device_id, u32 otap_delay);
>  #else
>  inline void zynqmp_dll_reset(u8 deviceid) {}
> -inline void arasan_zynqmp_set_tapdelay(u8 device_id, u32 itap_delay,
> -				       u32 otap_delay) {}
> +inline void arasan_zynqmp_set_in_tapdelay(u8 device_id, u32 itap_delay) {}
> +inline void arasan_zynqmp_set_out_tapdelay(u8 device_id, u32 otap_delay) {}
>  #endif
>  
>  #endif
> 



More information about the U-Boot mailing list