1 /******************************************************************************
3 * (c) Copyright 2013-2014 Xilinx, Inc. All rights reserved.
5 * This file contains confidential and proprietary information of Xilinx, Inc.
6 * and is protected under U.S. and international copyright and other
7 * intellectual property laws.
10 * This disclaimer is not a license and does not grant any rights to the
11 * materials distributed herewith. Except as otherwise provided in a valid
12 * license issued to you by Xilinx, and to the maximum extent permitted by
13 * applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL
14 * FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS,
15 * IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
16 * MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE;
17 * and (2) Xilinx shall not be liable (whether in contract or tort, including
18 * negligence, or under any other theory of liability) for any loss or damage
19 * of any kind or nature related to, arising under or in connection with these
20 * materials, including for any direct, or any indirect, special, incidental,
21 * or consequential loss or damage (including loss of data, profits, goodwill,
22 * or any type of loss or damage suffered as a result of any action brought by
23 * a third party) even if such damage or loss was reasonably foreseeable or
24 * Xilinx had been advised of the possibility of the same.
26 * CRITICAL APPLICATIONS
27 * Xilinx products are not designed or intended to be fail-safe, or for use in
28 * any application requiring fail-safe performance, such as life-support or
29 * safety devices or systems, Class III medical devices, nuclear facilities,
30 * applications related to the deployment of airbags, or any other applications
31 * that could lead to death, personal injury, or severe property or
32 * environmental damage (individually and collectively, "Critical
33 * Applications"). Customer assumes the sole risk and liability of any use of
34 * Xilinx products in Critical Applications, subject only to applicable laws
35 * and regulations governing limitations on product liability.
37 * THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE
40 ******************************************************************************/
41 /*****************************************************************************/
44 * @file xsdps_options.c
46 * Contains API's for changing the various options in host and card.
47 * See xsdps.h for a detailed description of the device and driver.
50 * MODIFICATION HISTORY:
52 * Ver Who Date Changes
53 * ----- --- -------- -----------------------------------------------
54 * 1.00a hk/sg 10/17/13 Initial release
55 * 2.1 hk 04/18/14 Increase sleep for eMMC switch command.
56 * Add sleep for microblaze designs. CR# 781117.
60 ******************************************************************************/
62 /***************************** Include Files *********************************/
65 * The header sleep.h and API usleep() can only be used with an arm design.
66 * MB_Sleep() is used for microblaze design.
76 #include "microblaze_sleep.h"
80 /************************** Constant Definitions *****************************/
81 #define XSDPS_SCR_BLKCNT 1
82 #define XSDPS_SCR_BLKSIZE 8
83 #define XSDPS_4_BIT_WIDTH 0x2
84 #define XSDPS_SWITCH_CMD_BLKCNT 1
85 #define XSDPS_SWITCH_CMD_BLKSIZE 64
86 #define XSDPS_SWITCH_CMD_HS_GET 0x00FFFFF0
87 #define XSDPS_SWITCH_CMD_HS_SET 0x80FFFFF1
88 #define XSDPS_EXT_CSD_CMD_BLKCNT 1
89 #define XSDPS_EXT_CSD_CMD_BLKSIZE 512
90 #define XSDPS_CLK_52_MHZ 52000000
91 #define XSDPS_MMC_HIGH_SPEED_ARG 0x03B90100
92 #define XSDPS_MMC_4_BIT_BUS_ARG 0x03B70100
93 #define XSDPS_MMC_DELAY_FOR_SWITCH 2000
95 /**************************** Type Definitions *******************************/
97 /***************** Macros (Inline Functions) Definitions *********************/
99 /************************** Function Prototypes ******************************/
100 int XSdPs_CmdTransfer(XSdPs *InstancePtr, u32 Cmd, u32 Arg, u32 BlkCnt);
101 void XSdPs_SetupADMA2DescTbl(XSdPs *InstancePtr, u32 BlkCnt, const u8 *Buff);
103 /*****************************************************************************/
105 * Update Block size for read/write operations.
107 * @param InstancePtr is a pointer to the instance to be worked on.
108 * @param BlkSize - Block size passed by the user.
112 ******************************************************************************/
113 int XSdPs_SetBlkSize(XSdPs *InstancePtr, u16 BlkSize)
116 u32 PresentStateReg = 0;
118 Xil_AssertNonvoid(InstancePtr != NULL);
119 Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
121 PresentStateReg = XSdPs_ReadReg(InstancePtr->Config.BaseAddress,
122 XSDPS_PRES_STATE_OFFSET);
124 if (PresentStateReg & (XSDPS_PSR_INHIBIT_CMD_MASK |
125 XSDPS_PSR_INHIBIT_DAT_MASK |
126 XSDPS_PSR_WR_ACTIVE_MASK | XSDPS_PSR_RD_ACTIVE_MASK)) {
127 Status = XST_FAILURE;
133 * Send block write command
135 Status = XSdPs_CmdTransfer(InstancePtr, CMD16, BlkSize, 0);
136 if (Status != XST_SUCCESS) {
137 Status = XST_FAILURE;
141 Status = XSdPs_ReadReg(InstancePtr->Config.BaseAddress,
145 * Set block size to the value passed
147 BlkSize &= XSDPS_BLK_SIZE_MASK;
148 XSdPs_WriteReg16(InstancePtr->Config.BaseAddress, XSDPS_BLK_SIZE_OFFSET,
151 Status = XST_SUCCESS;
158 /*****************************************************************************/
161 * API to get bus width support by card.
164 * @param InstancePtr is a pointer to the XSdPs instance.
165 * @param SCR - buffer to store SCR register returned by card.
168 * - XST_SUCCESS if successful.
169 * - XST_FAILURE if fail.
173 ******************************************************************************/
174 int XSdPs_Get_BusWidth(XSdPs *InstancePtr, u8 *SCR)
182 Xil_AssertNonvoid(InstancePtr != NULL);
183 Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
185 for (LoopCnt = 0; LoopCnt < 8; LoopCnt++) {
190 * Send block write command
192 Status = XSdPs_CmdTransfer(InstancePtr, CMD55,
193 InstancePtr->RelCardAddr, 0);
194 if (Status != XST_SUCCESS) {
195 Status = XST_FAILURE;
199 BlkCnt = XSDPS_SCR_BLKCNT;
200 BlkSize = XSDPS_SCR_BLKSIZE;
203 * Set block size to the value passed
205 BlkSize &= XSDPS_BLK_SIZE_MASK;
206 XSdPs_WriteReg16(InstancePtr->Config.BaseAddress,
207 XSDPS_BLK_SIZE_OFFSET, BlkSize);
209 XSdPs_SetupADMA2DescTbl(InstancePtr, BlkCnt, SCR);
211 XSdPs_WriteReg16(InstancePtr->Config.BaseAddress,
212 XSDPS_XFER_MODE_OFFSET,
213 XSDPS_TM_DAT_DIR_SEL_MASK | XSDPS_TM_DMA_EN_MASK);
215 Status = XSdPs_CmdTransfer(InstancePtr, ACMD51, 0, BlkCnt);
216 if (Status != XST_SUCCESS) {
217 Status = XST_FAILURE;
222 * Check for transfer complete
223 * Polling for response for now
226 StatusReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress,
227 XSDPS_NORM_INTR_STS_OFFSET);
228 if (StatusReg & XSDPS_INTR_ERR_MASK) {
230 * Write to clear error bits
232 XSdPs_WriteReg16(InstancePtr->Config.BaseAddress,
233 XSDPS_ERR_INTR_STS_OFFSET,
234 XSDPS_ERROR_INTR_ALL_MASK);
235 Status = XST_FAILURE;
238 } while ((StatusReg & XSDPS_INTR_TC_MASK) == 0);
243 XSdPs_WriteReg16(InstancePtr->Config.BaseAddress,
244 XSDPS_NORM_INTR_STS_OFFSET, XSDPS_INTR_TC_MASK);
246 Status = XSdPs_ReadReg(InstancePtr->Config.BaseAddress,
249 Status = XST_SUCCESS;
256 /*****************************************************************************/
259 * API to set bus width to 4-bit in card and host
262 * @param InstancePtr is a pointer to the XSdPs instance.
265 * - XST_SUCCESS if successful.
266 * - XST_FAILURE if fail.
270 ******************************************************************************/
271 int XSdPs_Change_BusWidth(XSdPs *InstancePtr)
277 Xil_AssertNonvoid(InstancePtr != NULL);
278 Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
282 Status = XSdPs_CmdTransfer(InstancePtr, CMD55,
283 InstancePtr->RelCardAddr, 0);
284 if (Status != XST_SUCCESS) {
285 Status = XST_FAILURE;
289 Arg = XSDPS_4_BIT_WIDTH;
290 Status = XSdPs_CmdTransfer(InstancePtr, ACMD6, Arg, 0);
291 if (Status != XST_SUCCESS) {
292 Status = XST_FAILURE;
296 StatusReg = XSdPs_ReadReg8(InstancePtr->Config.BaseAddress,
297 XSDPS_HOST_CTRL1_OFFSET);
298 StatusReg |= XSDPS_HC_WIDTH_MASK;
299 XSdPs_WriteReg8(InstancePtr->Config.BaseAddress,
300 XSDPS_HOST_CTRL1_OFFSET,StatusReg);
302 Status = XSdPs_ReadReg(InstancePtr->Config.BaseAddress,
307 Arg = XSDPS_MMC_4_BIT_BUS_ARG;
308 Status = XSdPs_CmdTransfer(InstancePtr, ACMD6, Arg, 0);
309 if (Status != XST_SUCCESS) {
310 Status = XST_FAILURE;
316 usleep(XSDPS_MMC_DELAY_FOR_SWITCH);
320 #ifdef __MICROBLAZE__
327 StatusReg = XSdPs_ReadReg8(InstancePtr->Config.BaseAddress,
328 XSDPS_HOST_CTRL1_OFFSET);
329 StatusReg |= XSDPS_HC_WIDTH_MASK;
330 XSdPs_WriteReg8(InstancePtr->Config.BaseAddress,
331 XSDPS_HOST_CTRL1_OFFSET,StatusReg);
333 Status = XSdPs_ReadReg(InstancePtr->Config.BaseAddress,
338 Status = XST_SUCCESS;
345 /*****************************************************************************/
348 * API to get bus speed supported by card.
351 * @param InstancePtr is a pointer to the XSdPs instance.
352 * @param ReadBuff - buffer to store function group support data
356 * - XST_SUCCESS if successful.
357 * - XST_FAILURE if fail.
361 ******************************************************************************/
362 int XSdPs_Get_BusSpeed(XSdPs *InstancePtr, u8 *ReadBuff)
371 Xil_AssertNonvoid(InstancePtr != NULL);
372 Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
374 for (LoopCnt = 0; LoopCnt < 64; LoopCnt++) {
375 ReadBuff[LoopCnt] = 0;
378 BlkCnt = XSDPS_SWITCH_CMD_BLKCNT;
379 BlkSize = XSDPS_SWITCH_CMD_BLKSIZE;
380 BlkSize &= XSDPS_BLK_SIZE_MASK;
381 XSdPs_WriteReg16(InstancePtr->Config.BaseAddress,
382 XSDPS_BLK_SIZE_OFFSET, BlkSize);
384 XSdPs_SetupADMA2DescTbl(InstancePtr, BlkCnt, ReadBuff);
386 XSdPs_WriteReg16(InstancePtr->Config.BaseAddress,
387 XSDPS_XFER_MODE_OFFSET,
388 XSDPS_TM_DAT_DIR_SEL_MASK | XSDPS_TM_DMA_EN_MASK);
390 Arg = XSDPS_SWITCH_CMD_HS_GET;
392 Status = XSdPs_CmdTransfer(InstancePtr, CMD6, Arg, 1);
393 if (Status != XST_SUCCESS) {
394 Status = XST_FAILURE;
399 * Check for transfer complete
400 * Polling for response for now
403 StatusReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress,
404 XSDPS_NORM_INTR_STS_OFFSET);
405 if (StatusReg & XSDPS_INTR_ERR_MASK) {
407 * Write to clear error bits
409 XSdPs_WriteReg16(InstancePtr->Config.BaseAddress,
410 XSDPS_ERR_INTR_STS_OFFSET,
411 XSDPS_ERROR_INTR_ALL_MASK);
412 Status = XST_FAILURE;
415 } while ((StatusReg & XSDPS_INTR_TC_MASK) == 0);
420 XSdPs_WriteReg16(InstancePtr->Config.BaseAddress,
421 XSDPS_NORM_INTR_STS_OFFSET, XSDPS_INTR_TC_MASK);
423 Status = XSdPs_ReadReg(InstancePtr->Config.BaseAddress,
426 Status = XST_SUCCESS;
433 /*****************************************************************************/
436 * API to set high speed in card and host. Changes clock in host accordingly.
439 * @param InstancePtr is a pointer to the XSdPs instance.
442 * - XST_SUCCESS if successful.
443 * - XST_FAILURE if fail.
447 ******************************************************************************/
448 int XSdPs_Change_BusSpeed(XSdPs *InstancePtr)
461 Xil_AssertNonvoid(InstancePtr != NULL);
462 Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
466 BlkCnt = XSDPS_SWITCH_CMD_BLKCNT;
467 BlkSize = XSDPS_SWITCH_CMD_BLKSIZE;
468 BlkSize &= XSDPS_BLK_SIZE_MASK;
469 XSdPs_WriteReg16(InstancePtr->Config.BaseAddress,
470 XSDPS_BLK_SIZE_OFFSET, BlkSize);
472 XSdPs_SetupADMA2DescTbl(InstancePtr, BlkCnt, ReadBuff);
474 XSdPs_WriteReg16(InstancePtr->Config.BaseAddress,
475 XSDPS_XFER_MODE_OFFSET,
476 XSDPS_TM_DAT_DIR_SEL_MASK | XSDPS_TM_DMA_EN_MASK);
478 Arg = XSDPS_SWITCH_CMD_HS_SET;
479 Status = XSdPs_CmdTransfer(InstancePtr, CMD6, Arg, 1);
480 if (Status != XST_SUCCESS) {
481 Status = XST_FAILURE;
486 * Check for transfer complete
487 * Polling for response for now
490 StatusReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress,
491 XSDPS_NORM_INTR_STS_OFFSET);
492 if (StatusReg & XSDPS_INTR_ERR_MASK) {
494 * Write to clear error bits
496 XSdPs_WriteReg16(InstancePtr->Config.BaseAddress,
497 XSDPS_ERR_INTR_STS_OFFSET,
498 XSDPS_ERROR_INTR_ALL_MASK);
499 Status = XST_FAILURE;
502 } while ((StatusReg & XSDPS_INTR_TC_MASK) == 0);
507 XSdPs_WriteReg16(InstancePtr->Config.BaseAddress,
508 XSDPS_NORM_INTR_STS_OFFSET, XSDPS_INTR_TC_MASK);
510 ClockReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress,
511 XSDPS_CLK_CTRL_OFFSET);
512 ClockReg &= ~(XSDPS_CC_INT_CLK_EN_MASK | XSDPS_CC_SD_CLK_EN_MASK);
514 XSdPs_WriteReg16(InstancePtr->Config.BaseAddress,
515 XSDPS_CLK_CTRL_OFFSET, ClockReg);
517 ClockReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress,
518 XSDPS_CLK_CTRL_OFFSET);
519 ClockReg &= (~XSDPS_CC_SDCLK_FREQ_SEL_MASK);
520 ClockReg |= XSDPS_CC_SDCLK_FREQ_BASE_MASK | XSDPS_CC_INT_CLK_EN_MASK;
521 XSdPs_WriteReg16(InstancePtr->Config.BaseAddress,
522 XSDPS_CLK_CTRL_OFFSET, ClockReg);
525 * Wait for internal clock to stabilize
527 while((XSdPs_ReadReg16(InstancePtr->Config.BaseAddress,
528 XSDPS_CLK_CTRL_OFFSET) & XSDPS_CC_INT_CLK_STABLE_MASK) == 0);
533 ClockReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress,
534 XSDPS_CLK_CTRL_OFFSET);
535 XSdPs_WriteReg16(InstancePtr->Config.BaseAddress,
536 XSDPS_CLK_CTRL_OFFSET,
537 ClockReg | XSDPS_CC_SD_CLK_EN_MASK);
540 StatusReg = XSdPs_ReadReg8(InstancePtr->Config.BaseAddress,
541 XSDPS_HOST_CTRL1_OFFSET);
542 StatusReg |= XSDPS_HC_SPEED_MASK;
543 XSdPs_WriteReg8(InstancePtr->Config.BaseAddress,
544 XSDPS_HOST_CTRL1_OFFSET,StatusReg);
546 Status = XSdPs_ReadReg(InstancePtr->Config.BaseAddress,
551 Arg = XSDPS_MMC_HIGH_SPEED_ARG;
552 Status = XSdPs_CmdTransfer(InstancePtr, CMD6, Arg, 0);
553 if (Status != XST_SUCCESS) {
554 Status = XST_FAILURE;
560 usleep(XSDPS_MMC_DELAY_FOR_SWITCH);
564 #ifdef __MICROBLAZE__
571 XSdPs_Change_ClkFreq(InstancePtr, XSDPS_CLK_52_MHZ);
573 StatusReg = XSdPs_ReadReg8(InstancePtr->Config.BaseAddress,
574 XSDPS_HOST_CTRL1_OFFSET);
575 StatusReg |= XSDPS_HC_SPEED_MASK;
576 XSdPs_WriteReg8(InstancePtr->Config.BaseAddress,
577 XSDPS_HOST_CTRL1_OFFSET,StatusReg);
579 Status = XSdPs_ReadReg(InstancePtr->Config.BaseAddress,
583 Status = XST_SUCCESS;
590 /*****************************************************************************/
593 * API to change clock freq to given value.
596 * @param InstancePtr is a pointer to the XSdPs instance.
597 * @param SelFreq - Clock frequency in Hz.
601 * @note This API will change clock frequency to the value less than
602 * or equal to the given value using the permissible dividors.
604 ******************************************************************************/
605 int XSdPs_Change_ClkFreq(XSdPs *InstancePtr, u32 SelFreq)
613 Xil_AssertNonvoid(InstancePtr != NULL);
614 Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
619 ClockReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress,
620 XSDPS_CLK_CTRL_OFFSET);
621 ClockReg &= ~(XSDPS_CC_INT_CLK_EN_MASK | XSDPS_CC_SD_CLK_EN_MASK);
623 XSdPs_WriteReg16(InstancePtr->Config.BaseAddress,
624 XSDPS_CLK_CTRL_OFFSET, ClockReg);
630 for(ClkLoopCnt = 0; ClkLoopCnt < XSDPS_CC_MAX_NUM_OF_DIV;
632 if( ((InstancePtr->Config.InputClockHz)/DivCnt) <= SelFreq) {
634 Divisor = Divisor << XSDPS_CC_DIV_SHIFT;
637 DivCnt = DivCnt << 1;
640 if(ClkLoopCnt == 9) {
643 * No valid divisor found for given frequency
645 Status = XST_FAILURE;
652 ClockReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress,
653 XSDPS_CLK_CTRL_OFFSET);
654 ClockReg &= (~XSDPS_CC_SDCLK_FREQ_SEL_MASK);
656 ClockReg |= Divisor | XSDPS_CC_INT_CLK_EN_MASK;
657 XSdPs_WriteReg16(InstancePtr->Config.BaseAddress,
658 XSDPS_CLK_CTRL_OFFSET, ClockReg);
661 * Wait for internal clock to stabilize
663 while((XSdPs_ReadReg16(InstancePtr->Config.BaseAddress,
664 XSDPS_CLK_CTRL_OFFSET) & XSDPS_CC_INT_CLK_STABLE_MASK) == 0);
669 ClockReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress,
670 XSDPS_CLK_CTRL_OFFSET);
671 XSdPs_WriteReg16(InstancePtr->Config.BaseAddress,
672 XSDPS_CLK_CTRL_OFFSET,
673 ClockReg | XSDPS_CC_SD_CLK_EN_MASK);
675 Status = XST_SUCCESS;
682 /*****************************************************************************/
685 * API to send pullup command to card before using DAT line 3(using 4-bit bus)
688 * @param InstancePtr is a pointer to the XSdPs instance.
691 * - XST_SUCCESS if successful.
692 * - XST_FAILURE if fail.
696 ******************************************************************************/
697 int XSdPs_Pullup(XSdPs *InstancePtr)
701 Xil_AssertNonvoid(InstancePtr != NULL);
702 Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
704 Status = XSdPs_CmdTransfer(InstancePtr, CMD55,
705 InstancePtr->RelCardAddr, 0);
706 if (Status != XST_SUCCESS) {
707 Status = XST_FAILURE;
711 Status = XSdPs_CmdTransfer(InstancePtr, ACMD42, 0, 0);
712 if (Status != XST_SUCCESS) {
713 Status = XST_FAILURE;
717 Status = XST_SUCCESS;
724 /*****************************************************************************/
727 * API to get EXT_CSD register of eMMC.
730 * @param InstancePtr is a pointer to the XSdPs instance.
731 * @param ReadBuff - buffer to store EXT_CSD
734 * - XST_SUCCESS if successful.
735 * - XST_FAILURE if fail.
739 ******************************************************************************/
740 int XSdPs_Get_Mmc_ExtCsd(XSdPs *InstancePtr, u8 *ReadBuff)
749 Xil_AssertNonvoid(InstancePtr != NULL);
750 Xil_AssertNonvoid(InstancePtr->IsReady == XIL_COMPONENT_IS_READY);
752 for (LoopCnt = 0; LoopCnt < 512; LoopCnt++) {
753 ReadBuff[LoopCnt] = 0;
756 BlkCnt = XSDPS_EXT_CSD_CMD_BLKCNT;
757 BlkSize = XSDPS_EXT_CSD_CMD_BLKSIZE;
758 BlkSize &= XSDPS_BLK_SIZE_MASK;
759 XSdPs_WriteReg16(InstancePtr->Config.BaseAddress,
760 XSDPS_BLK_SIZE_OFFSET, BlkSize);
762 XSdPs_SetupADMA2DescTbl(InstancePtr, BlkCnt, ReadBuff);
764 XSdPs_WriteReg16(InstancePtr->Config.BaseAddress,
765 XSDPS_XFER_MODE_OFFSET,
766 XSDPS_TM_DAT_DIR_SEL_MASK | XSDPS_TM_DMA_EN_MASK);
771 * Send SEND_EXT_CSD command
773 Status = XSdPs_CmdTransfer(InstancePtr, CMD8, Arg, 1);
774 if (Status != XST_SUCCESS) {
775 Status = XST_FAILURE;
780 * Check for transfer complete
781 * Polling for response for now
784 StatusReg = XSdPs_ReadReg16(InstancePtr->Config.BaseAddress,
785 XSDPS_NORM_INTR_STS_OFFSET);
786 if (StatusReg & XSDPS_INTR_ERR_MASK) {
788 * Write to clear error bits
790 XSdPs_WriteReg16(InstancePtr->Config.BaseAddress,
791 XSDPS_ERR_INTR_STS_OFFSET,
792 XSDPS_ERROR_INTR_ALL_MASK);
793 Status = XST_FAILURE;
796 } while ((StatusReg & XSDPS_INTR_TC_MASK) == 0);
801 XSdPs_WriteReg16(InstancePtr->Config.BaseAddress,
802 XSDPS_NORM_INTR_STS_OFFSET, XSDPS_INTR_TC_MASK);
804 Status = XSdPs_ReadReg(InstancePtr->Config.BaseAddress,
807 Status = XST_SUCCESS;