diff options
author | Manish Pandey <manish.pandey2@arm.com> | 2021-01-06 12:23:10 +0000 |
---|---|---|
committer | TrustedFirmware Code Review <review@review.trustedfirmware.org> | 2021-01-06 12:23:10 +0000 |
commit | 24ca0fa6ac4afa509a92e3a79bc855761619b6e5 (patch) | |
tree | 5fe6d0396393cf63aac21d425cc933654dd595c3 /plat | |
parent | 4811168aafc8bdb5869d26744fa8636752b5ca32 (diff) | |
parent | fe1fa205fca4d1dd4a1b1755942956dbca65d573 (diff) | |
download | trusted-firmware-a-24ca0fa6ac4afa509a92e3a79bc855761619b6e5.tar.gz |
Merge changes from topic "xilinx-sd-tap-delay" into integration
* changes:
plat: zynqmp: Disable ITAPDLYENA bit for zero ITAP delay
plat: zynqmp: Check for DLL status before doing reset
Diffstat (limited to 'plat')
-rw-r--r-- | plat/xilinx/zynqmp/pm_service/pm_api_ioctl.c | 42 |
1 files changed, 31 insertions, 11 deletions
diff --git a/plat/xilinx/zynqmp/pm_service/pm_api_ioctl.c b/plat/xilinx/zynqmp/pm_service/pm_api_ioctl.c index 9da904eb5e..f165fb0226 100644 --- a/plat/xilinx/zynqmp/pm_service/pm_api_ioctl.c +++ b/plat/xilinx/zynqmp/pm_service/pm_api_ioctl.c @@ -282,17 +282,29 @@ static enum pm_ret_status pm_ioctl_sd_set_tapdelay(enum pm_node_id nid, { unsigned int shift; enum pm_ret_status ret; + unsigned int val, mask; - if (nid == NODE_SD_0) + if (nid == NODE_SD_0) { shift = 0; - else if (nid == NODE_SD_1) + mask = ZYNQMP_SD0_DLL_RST_MASK; + } else if (nid == NODE_SD_1) { shift = ZYNQMP_SD_TAP_OFFSET; - else + mask = ZYNQMP_SD1_DLL_RST_MASK; + } else { return PM_RET_ERROR_ARGS; + } - ret = pm_ioctl_sd_dll_reset(nid, PM_DLL_RESET_ASSERT); - if (ret != PM_RET_SUCCESS) + ret = pm_mmio_read(ZYNQMP_SD_DLL_CTRL, &val); + if (ret != PM_RET_SUCCESS) { return ret; + } + + if ((val & mask) == 0) { + ret = pm_ioctl_sd_dll_reset(nid, PM_DLL_RESET_ASSERT); + if (ret != PM_RET_SUCCESS) { + return ret; + } + } if (type == PM_TAPDELAY_INPUT) { ret = pm_mmio_write(ZYNQMP_SD_ITAP_DLY, @@ -300,9 +312,15 @@ static enum pm_ret_status pm_ioctl_sd_set_tapdelay(enum pm_node_id nid, (ZYNQMP_SD_ITAPCHGWIN << shift)); if (ret != PM_RET_SUCCESS) goto reset_release; - ret = pm_mmio_write(ZYNQMP_SD_ITAP_DLY, - (ZYNQMP_SD_ITAPDLYENA_MASK << shift), - (ZYNQMP_SD_ITAPDLYENA << shift)); + if (value == 0) + ret = pm_mmio_write(ZYNQMP_SD_ITAP_DLY, + (ZYNQMP_SD_ITAPDLYENA_MASK << + shift), 0); + else + ret = pm_mmio_write(ZYNQMP_SD_ITAP_DLY, + (ZYNQMP_SD_ITAPDLYENA_MASK << + shift), (ZYNQMP_SD_ITAPDLYENA << + shift)); if (ret != PM_RET_SUCCESS) goto reset_release; ret = pm_mmio_write(ZYNQMP_SD_ITAP_DLY, @@ -314,8 +332,7 @@ static enum pm_ret_status pm_ioctl_sd_set_tapdelay(enum pm_node_id nid, (ZYNQMP_SD_ITAPCHGWIN_MASK << shift), 0); } else if (type == PM_TAPDELAY_OUTPUT) { ret = pm_mmio_write(ZYNQMP_SD_OTAP_DLY, - (ZYNQMP_SD_OTAPDLYENA_MASK << shift), - (ZYNQMP_SD_OTAPDLYENA << shift)); + (ZYNQMP_SD_OTAPDLYENA_MASK << shift), 0); if (ret != PM_RET_SUCCESS) goto reset_release; ret = pm_mmio_write(ZYNQMP_SD_OTAP_DLY, @@ -326,7 +343,10 @@ static enum pm_ret_status pm_ioctl_sd_set_tapdelay(enum pm_node_id nid, } reset_release: - pm_ioctl_sd_dll_reset(nid, PM_DLL_RESET_RELEASE); + if ((val & mask) == 0) { + (void)pm_ioctl_sd_dll_reset(nid, PM_DLL_RESET_RELEASE); + } + return ret; } |