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.s...@xilinx.com>
Reviewed-by: Jaehoon Chung <jh80.ch...@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 >