tizen 2.4 release
[kernel/u-boot-tm1.git] / drivers / sdio / sdio_master_pal.c
1 #include <common.h>\r
2 #include <asm/arch/bits.h>\r
3 #include "asm/arch/sci_types.h"\r
4 #include "sdio_card_pal.h"\r
5 \r
6 /*-----------------------------------------*/\r
7 //    Debug Function\r
8 /*-----------------------------------------*/\r
9 #define SDIO_CARD_PRINT(x) printf x\r
10 /*-----------------------------------------*/\r
11 //    IRQ Function\r
12 /*-----------------------------------------*/\r
13 #if defined(OS_SELF_SIMULATOR)\r
14 #define SDIO_CARD_PAL_IRQ_DECLARE OS_CPU_SR  cpu_sr\r
15 #define SDIO_CARD_PAL_DISABLE_IRQ OS_ENTER_CRITICAL\r
16 #define SDIO_CARD_PAL_ENABLE_IRQ OS_EXIT_CRITICAL\r
17 #else\r
18 #define SDIO_CARD_PAL_IRQ_DECLARE\r
19 #define SDIO_CARD_PAL_DISABLE_IRQ SCI_DisableIRQ\r
20 #define SDIO_CARD_PAL_ENABLE_IRQ SCI_RestoreIRQ\r
21 #endif\r
22 \r
23 #define SDIO_CLK_24M        (24000000)\r
24 \r
25 /*-----------------------------------------*/\r
26 #define SDIO_CARD_PAL_ASSERT(x)         \\r
27 {                               \\r
28         if(!(x)){               \\r
29                 SDIO_CARD_PRINT(("assert in function %s line %d",__func__, __LINE__));  \\r
30                 while(1);                               \\r
31         }                       \\r
32 }\r
33 #define mdelay(x)       udelay(1000*x)\r
34 \r
35 typedef struct\r
36 {\r
37     SDIO_MASTER_PAL_CMD_E cmd;\r
38     unsigned int cmdIndex;\r
39     unsigned int intFilter;\r
40     CMD_RSP_TYPE_E Response;\r
41     unsigned int errFilter;\r
42     unsigned int transmode;\r
43     unsigned int cmdTyte;\r
44 }CMD_CTL_FLG;\r
45 \r
46 \r
47 //        response Name        cmd int filter                                                        ,rsp            ,cmd error filter\r
48 #define SDIO_MASTER_R4        SIG_CMD_CMP    ,CMD_RSP_R4        ,ERR_RSP|ERR_CMD_INDEX|    ERR_CMD_END|    ERR_CMD_CRC|    ERR_CMD_TIMEOUT\r
49 #define SDIO_MASTER_R5        SIG_CMD_CMP    ,CMD_RSP_R5        ,ERR_RSP|ERR_CMD_INDEX|    ERR_CMD_END|    ERR_CMD_CRC|    ERR_CMD_TIMEOUT\r
50 #define SDIO_MASTER_R6        SIG_CMD_CMP    ,CMD_RSP_R6        ,ERR_RSP|ERR_CMD_INDEX|    ERR_CMD_END|    ERR_CMD_CRC|    ERR_CMD_TIMEOUT\r
51 #define SDIO_MASTER_R1B       SIG_CMD_CMP    ,CMD_RSP_R1B       ,ERR_RSP|ERR_CMD_INDEX|    ERR_CMD_END|    ERR_CMD_CRC|    ERR_CMD_TIMEOUT\r
52 \r
53 static CMD_CTL_FLG s_cmdDetail[] = \r
54 {\r
55 // cmdindex,rsp,transmode\r
56 //#define CMDname                        cmdindex    ,data int filter    +    (cmd int filter+)rsp(+cmd error filter)    +    ,data error filter                        ,transmode\r
57 {SDIO_CMD3_SEND_RELATIVE_ADDR,  3  ,SDIO_MASTER_R6,0,CMD_TYPE_NORMAL },\r
58 {SDIO_CMD5_SEND_OP_COND,        5  ,SDIO_MASTER_R4,0,CMD_TYPE_NORMAL },\r
59 {SDIO_CMD7_SELECT_DESELECT_CARD,7  ,SDIO_MASTER_R1B,0,CMD_TYPE_NORMAL },\r
60 {SDIO_CMD52_IO_RW_DIRECT,       52 ,SDIO_MASTER_R5,0,CMD_TYPE_NORMAL },\r
61 {SDIO_CMD53_READ_BYTES,         53 ,SIG_TRANS_CMP|SDIO_MASTER_R5|ERR_DATA_END|ERR_DATA_CRC|ERR_DATA_TIMEOUT,\r
62      TRANS_MODE_READ|TRANS_MODE_DMA_EN|  CMD_HAVE_DATA   ,CMD_TYPE_NORMAL },\r
63 {SDIO_CMD53_READ_BLOCKS,        53 ,SIG_TRANS_CMP|SDIO_MASTER_R5|ERR_DATA_END|ERR_DATA_CRC|ERR_DATA_TIMEOUT,\r
64      TRANS_MODE_MULTI_BLOCK|TRANS_MODE_READ|TRANS_MODE_BLOCK_COUNT_EN|TRANS_MODE_DMA_EN|CMD_HAVE_DATA,CMD_TYPE_NORMAL },\r
65 {SDIO_CMD53_WRITE_BYTES,        53 ,SIG_TRANS_CMP|SDIO_MASTER_R5 | ERR_DATA_CRC|ERR_DATA_TIMEOUT, TRANS_MODE_DMA_EN|CMD_HAVE_DATA,CMD_TYPE_NORMAL },\r
66 {SDIO_CMD53_WRITE_BLOCKS ,      53 ,SIG_TRANS_CMP|SDIO_MASTER_R5|ERR_DATA_CRC|ERR_DATA_TIMEOUT,\r
67      TRANS_MODE_MULTI_BLOCK|TRANS_MODE_BLOCK_COUNT_EN|TRANS_MODE_DMA_EN|  CMD_HAVE_DATA   ,CMD_TYPE_NORMAL },\r
68 };\r
69 \r
70 #define SDIO_CARD_PAL_MAGICNUM 0x5344494F\r
71 \r
72 extern void _SDHOST_IrqHandle(unsigned int isrnum);\r
73 static SDIO_CARD_PAL_Struct_T s_sdioCardPalHd[SDHOST_SLOT_MAX_NUM] = {{FALSE,0,0,0}};\r
74 static volatile unsigned int s_CardErrCode = 0;\r
75 \r
76 //-----------------------------------------------------------------------------------\r
77 //    Clear all event  happened before ,and prepare next transmission\r
78 //-----------------------------------------------------------------------------------\r
79 void _InitCardEvent(SDIO_CARD_PAL_HANDLE handle)\r
80 {\r
81     s_CardErrCode = 0;\r
82     handle->s_CardEvent = 0;\r
83 }\r
84 \r
85 //-----------------------------------------------------------------------------------\r
86 //    After the transmission begin , wait event during the transmission\r
87 //-----------------------------------------------------------------------------------\r
88 int _WaitCardEvent(SDIO_CARD_PAL_HANDLE handle,unsigned int EventId)\r
89 {\r
90     if(EventId != (handle->s_CardEvent&EventId)){\r
91         return 0;\r
92     }\r
93     return 1;\r
94 }\r
95 \r
96 //-----------------------------------------------------------------------------------\r
97 //    After the transmission begin , this funtion used to give event\r
98 //-----------------------------------------------------------------------------------\r
99 static void _SetCardEvent(SDIO_CARD_PAL_HANDLE handle,unsigned int EventId)\r
100 {\r
101     handle->s_CardEvent |= EventId;\r
102 }\r
103 \r
104 unsigned int GetCardEvent(SDIO_CARD_PAL_HANDLE handle)\r
105 {\r
106     return handle->s_CardEvent;\r
107 }\r
108 \r
109 //-----------------------------------------------------------------------------------\r
110 //    during the transmission ,all the event is given out by the interrupt,this function is called by the interrupt service to give the event to application\r
111 //-----------------------------------------------------------------------------------\r
112 static void  _irqCardProc(unsigned int msg, unsigned int errCode, SDHOST_SLOT_NO slotNum)\r
113 {\r
114     SDIO_CARD_PAL_HANDLE handle;\r
115 \r
116     if(slotNum >=SDHOST_SLOT_MAX_NUM ) slotNum = SDHOST_SLOT_MAX_NUM - 1;\r
117     handle = &s_sdioCardPalHd[slotNum];\r
118     if(errCode!=0)\r
119         SDIO_CARD_PRINT(("slot0  msg = 0x%08x err = 0x%08x\n",msg,errCode));\r
120     if(0 != (SIG_CARD_IN&msg)){    // card interrupt happened , may be some operation error happened\r
121         _SetCardEvent(handle,SIG_CARD_IN);\r
122     }\r
123     if(0 != (SIG_CARD_INSERT&msg)){    // card is inserted in slot\r
124         _SetCardEvent(handle,SIG_CARD_INSERT);\r
125     }\r
126     else if(0 != (SIG_CARD_REMOVE&msg)){    // card is plug out from slot\r
127         _SetCardEvent(handle,SIG_CARD_REMOVE);\r
128     }\r
129     else if(0 != (SIG_ERR&msg)){    // some error happened during the transmission\r
130         if(ERR_DATA_TIMEOUT == errCode && (0 != (SIG_TRANS_CMP&msg)))\r
131             errCode &= ~ERR_DATA_TIMEOUT;\r
132         \r
133         if(0!= errCode){\r
134             s_CardErrCode |= errCode;    // get the error detail \r
135             _SetCardEvent(handle,SIG_ALL);\r
136             return;\r
137         }\r
138     }\r
139     if(0 != (SIG_BLK_CAP&msg))\r
140         _SetCardEvent(handle,SIG_BLK_CAP);\r
141     if(0 != (SIG_TRANS_CMP&msg))        // transmission complete\r
142         _SetCardEvent(handle,SIG_TRANS_CMP);\r
143     else if(0 != (SIG_DMA_INT&msg)){    // during the transmission ,the dma buffer is out of used ,we must set new dma buffer to continue the transmission\r
144         volatile unsigned int nextAdd;\r
145         nextAdd = SDHOST_GetDmaAddr(handle->sdio_port);\r
146         SDHOST_SetDmaAddr(handle->sdio_port, nextAdd);\r
147         SDHOST_NML_IntStatus_En(handle->sdio_port, SIG_DMA_INT);\r
148         SDHOST_NML_IntSig_En(handle->sdio_port, SIG_DMA_INT);\r
149     }\r
150     \r
151     //test code-----------------------------------------\r
152     else if(0 != (SIG_BUF_RD_RDY&msg)){\r
153         SDHOST_NML_IntStatus_En(handle->sdio_port, SIG_BUF_RD_RDY);\r
154         SDHOST_NML_IntSig_En(handle->sdio_port, SIG_BUF_RD_RDY);\r
155         _SetCardEvent(handle,SIG_BUF_RD_RDY);\r
156     }else if(0 != (SIG_BUF_WD_RDY&msg)){\r
157         SDHOST_NML_IntStatus_En(handle->sdio_port, SIG_BUF_WD_RDY);\r
158         SDHOST_NML_IntSig_En(handle->sdio_port, SIG_BUF_WD_RDY);\r
159         _SetCardEvent(handle,SIG_BUF_WD_RDY);\r
160     }\r
161     //test end--------------------------------------------\r
162     \r
163     if(0 != (SIG_CMD_CMP&msg)){        // during the transmission ,the command has be confirmed by card\r
164         _SetCardEvent(handle,SIG_CMD_CMP);\r
165     }\r
166 }\r
167 \r
168 SDIO_CARD_PAL_SLOT_E Handle2SlotNo(SDIO_CARD_PAL_HANDLE handle)\r
169 {\r
170         SDIO_CARD_PAL_SLOT_E slotNo;\r
171         for(slotNo=SDIO_CARD_PAL_SLOT_0;SDHOST_SLOT_MAX_NUM > slotNo;slotNo++)\r
172                 if(handle == &s_sdioCardPalHd[slotNo])\r
173                         return slotNo;\r
174         return SDIO_CARD_PAL_SLOT_MAX;\r
175 }\r
176 \r
177 SDIO_CARD_PAL_HANDLE SPRD_SDSlave_Pal_Open(SDIO_CARD_PAL_SLOT_E slotNo)\r
178 {\r
179 \r
180     SDIO_CARD_PAL_ASSERT(SDHOST_SLOT_MAX_NUM > slotNo);\r
181     \r
182     if(TRUE == s_sdioCardPalHd[slotNo].flag)\r
183         return NULL;\r
184 \r
185     s_sdioCardPalHd[slotNo].flag = TRUE;\r
186 \r
187     s_sdioCardPalHd[slotNo].MagicNum = SDIO_CARD_PAL_MAGICNUM;\r
188     s_sdioCardPalHd[slotNo].s_CardEvent = 0;\r
189     //s_sdioCardPalHd[slotNo].sdio_port = (SDHOST_HANDLE)SDHOST_Register((SDHOST_SLOT_NO)slotNo,_irqCardProc);\r
190 #if defined(CONFIG_SP7702)    \r
191     s_sdioCardPalHd[slotNo].sdio_port = (SDHOST_HANDLE)SDHOST_Register((SDHOST_SLOT_NO)1,_irqCardProc);\r
192 #elif defined(CONFIG_SC7710G2)\r
193     s_sdioCardPalHd[slotNo].sdio_port = (SDHOST_HANDLE)SDHOST_Register((SDHOST_SLOT_NO)slotNo,_irqCardProc);\r
194 #else\r
195         s_sdioCardPalHd[slotNo].sdio_port = (SDHOST_HANDLE)SDHOST_Register((SDHOST_SLOT_NO)0,_irqCardProc);\r
196 #endif\r
197     if(s_sdioCardPalHd[slotNo].sdio_port == NULL){\r
198         return NULL;\r
199     }\r
200     SDHOST_NML_IntStatus_En(s_sdioCardPalHd[slotNo].sdio_port, SIG_ALL|ERR_ALL);\r
201     SDHOST_NML_IntSig_En(s_sdioCardPalHd[slotNo].sdio_port, SIG_ALL|ERR_ALL);\r
202     return &s_sdioCardPalHd[slotNo];\r
203 \r
204 }\r
205 \r
206 int SPRD_SDSlave_Pal_Pwr(SDIO_CARD_PAL_HANDLE handle,SDIO_CARD_PAL_PWR_E onOrOff)\r
207 {\r
208     SDIO_CARD_PAL_ASSERT(\r
209         (SDIO_CARD_PAL_MAGICNUM == handle->MagicNum)\r
210         &&(TRUE == handle->flag)\r
211     );\r
212 \r
213     switch(onOrOff)\r
214     {\r
215         case SDIO_CARD_PAL_ON:\r
216         {\r
217             SDHOST_Cfg_BusWidth(handle->sdio_port,SDIO_1BIT_WIDTH);\r
218             SDHOST_Cfg_SpeedMode(handle->sdio_port,SDIO_LOWSPEED);\r
219             SDHOST_Cfg_Voltage(handle->sdio_port,VOL_3_0);\r
220 \r
221             SDHOST_SD_POWER(handle->sdio_port,POWR_ON);\r
222             SDHOST_SD_Clk_Freq_Set(handle->sdio_port,200*1000);\r
223             SDHOST_internalClk_OnOff(handle->sdio_port,CLK_ON);\r
224             SDHOST_SD_clk_OnOff(handle->sdio_port,CLK_ON);\r
225 \r
226             mdelay(2);\r
227     //        OSTimeDlyHMSM (0, 0, 2, 0);\r
228         }\r
229         break;\r
230 \r
231         case SDIO_CARD_PAL_OFF:\r
232         {\r
233             SDHOST_SD_POWER(handle->sdio_port,POWR_OFF);\r
234             SDHOST_RST(handle->sdio_port,RST_ALL);\r
235             SDHOST_SD_clk_OnOff(handle->sdio_port,CLK_OFF);\r
236             SDHOST_internalClk_OnOff(handle->sdio_port,CLK_OFF);\r
237     //        OSTimeDlyHMSM (0, 0, 0, 200);\r
238         }\r
239         break;\r
240 \r
241         default:\r
242         {\r
243             SDIO_CARD_PAL_ASSERT(0);\r
244         }\r
245         break;\r
246     }\r
247 \r
248     return TRUE;\r
249 }\r
250 \r
251 int SPRD_SDSlave_Pal_SetClk(SDIO_CARD_PAL_HANDLE handle,SDIO_CARD_PAL_CLKTYPE_E clkType)\r
252 {\r
253     SDIO_CARD_PAL_ASSERT(\r
254         (SDIO_CARD_PAL_MAGICNUM == handle->MagicNum)\r
255         &&(TRUE == handle->flag)\r
256     );\r
257 \r
258     SDHOST_SD_clk_OnOff(handle->sdio_port,CLK_OFF);\r
259     switch(clkType)\r
260     {\r
261         case SDIO_CARD_PAL_400KHz:\r
262         {\r
263             SDHOST_SD_Clk_Freq_Set(handle->sdio_port,400000);\r
264         }\r
265         break;\r
266 \r
267         case SDIO_CARD_PAL_20MHz:\r
268         {\r
269             SDHOST_SD_Clk_Freq_Set(handle->sdio_port,20000000);\r
270         }\r
271         break;\r
272 \r
273         case SDIO_CARD_PAL_25MHz:\r
274         {\r
275             SDHOST_SD_Clk_Freq_Set(handle->sdio_port,25000000);\r
276         }\r
277         break;\r
278 \r
279         case SDIO_CARD_PAL_50MHz:\r
280         {\r
281             SDHOST_SD_Clk_Freq_Set(handle->sdio_port,50000000);\r
282         }\r
283         break;\r
284 \r
285         default:\r
286         {\r
287             SDIO_CARD_PAL_ASSERT(0);\r
288         }\r
289         break;\r
290 \r
291     }\r
292     SDHOST_SD_clk_OnOff(handle->sdio_port,CLK_ON);\r
293 \r
294     return TRUE;\r
295 \r
296 }\r
297 \r
298 int SPRD_SDSlave_Pal_SetBusWidth(SDIO_CARD_PAL_HANDLE handle,SDIO_CARD_PAL_BUFWIDTH_E widthType)\r
299 {\r
300     SDIO_CARD_PAL_ASSERT(\r
301         (SDIO_CARD_PAL_MAGICNUM == handle->MagicNum)\r
302         &&(TRUE == handle->flag)\r
303     );\r
304 \r
305     switch(widthType)\r
306     {\r
307         case SDIO_CARD_PAL_1_BIT:\r
308         {\r
309             SDHOST_Cfg_BusWidth(handle->sdio_port,SDIO_1BIT_WIDTH);\r
310         }\r
311         break;\r
312 \r
313         case SDIO_CARD_PAL_4_BIT:\r
314         {\r
315             SDHOST_Cfg_BusWidth(handle->sdio_port,SDIO_4BIT_WIDTH);\r
316         }\r
317         break;\r
318 \r
319         case SDIO_CARD_PAL_8_BIT:\r
320         {\r
321             SDHOST_Cfg_BusWidth(handle->sdio_port,SDIO_8BIT_WIDTH);\r
322         }\r
323         break;\r
324 \r
325         default:\r
326         {\r
327             SDIO_CARD_PAL_ASSERT(0);\r
328         }\r
329         break;\r
330 \r
331     }\r
332 \r
333     return TRUE;\r
334 }\r
335 \r
336 int SPRD_SDSlave_Pal_SetSpeedMode(SDIO_CARD_PAL_HANDLE handle,SDIO_CARD_PAL_SPEEDMODE_E speedMode)\r
337 {\r
338     SDIO_CARD_PAL_ASSERT(\r
339         (SDIO_CARD_PAL_MAGICNUM == handle->MagicNum)\r
340         &&(TRUE == handle->flag)\r
341     );\r
342     return TRUE;\r
343 }\r
344 \r
345 \r
346 \r
347 //-----------------------------------------------------------------------------------\r
348 //    Send command to card\r
349 //-----------------------------------------------------------------------------------\r
350 SDIO_CARD_PAL_ERROR_E SPRD_SDSlave_Pal_SendCmd(\r
351     /*IN*/SDIO_CARD_PAL_HANDLE handle,\r
352     /*IN*/SDIO_MASTER_PAL_CMD_E cmd,\r
353     /*IN*/unsigned int argument,\r
354     /*IN*/CARD_DATA_PARAM_T* dataParam,\r
355     /*OUT*/unsigned char* rspBuf\r
356 )\r
357 {\r
358     unsigned int tmpIntFilter;\r
359 \r
360     SDIO_CARD_PAL_ASSERT(\r
361         (SDIO_CARD_PAL_MAGICNUM == handle->MagicNum)\r
362         &&(TRUE == handle->flag)\r
363     );\r
364     SDIO_CARD_PAL_ASSERT(cmd == s_cmdDetail[cmd].cmd);\r
365     SDHOST_SetDataTimeOutValue(handle->sdio_port,0xE);\r
366     SDHOST_SetErrCodeFilter(handle->sdio_port, s_cmdDetail[cmd].errFilter);\r
367 \r
368     tmpIntFilter = s_cmdDetail[cmd].intFilter;\r
369     if(0 != s_cmdDetail[cmd].errFilter)\r
370     {\r
371         tmpIntFilter |= SIG_ERR;\r
372     }\r
373     if(NULL != dataParam)\r
374     {\r
375         tmpIntFilter |= SIG_DMA_INT;\r
376     }\r
377     SDHOST_NML_IntStatus_En(handle->sdio_port, tmpIntFilter);\r
378     SDHOST_NML_IntSig_En(handle->sdio_port, tmpIntFilter);\r
379     \r
380     \r
381     _InitCardEvent(handle);\r
382 \r
383     if(NULL != dataParam)\r
384     {\r
385         //MMU_InvalideDCACHE();\r
386         SDHOST_SetDmaAddr(handle->sdio_port, (unsigned int)(dataParam->databuf));\r
387         SDHOST_SetDataParam(handle->sdio_port, dataParam->blkLen, dataParam->blkNum, SDIO_DMA_512K);\r
388     }\r
389     if(NULL != dataParam)\r
390             ;//SDIO_CARD_PRINT(("\ncmd%d:(0x%08x,0x%x,0x%x)\n",cmd,argument,tmpIntFilter,s_cmdDetail[cmd].transmode));\r
391     SDHOST_SetCmdArg(handle->sdio_port,argument);\r
392     SDHOST_SetCmd(handle->sdio_port,s_cmdDetail[cmd].cmdIndex,s_cmdDetail[cmd].transmode,s_cmdDetail[cmd].cmdTyte, s_cmdDetail[cmd].Response);\r
393 #if 0\r
394     if(NULL == dataParam){\r
395         SDIO_CARD_PRINT(("\ncmd%d:(0x%08x 0x%x 0x%x)\n",cmd,argument,tmpIntFilter,s_cmdDetail[cmd].transmode));\r
396     } else {\r
397          extern int req_clk_status(void);\r
398          int status;\r
399          do{\r
400            status = req_clk_status();\r
401            if(status == 0)\r
402                ;//printf("(C) = %d \n",status);\r
403          }while(status);\r
404     }\r
405 #else\r
406     do{\r
407         //_SDHOST_IrqHandle(Handle2SlotNo(handle));\r
408         _SDHOST_IrqHandle(SDIO_APCP_HOST_SLOT_NUM);\r
409     }while(_WaitCardEvent(handle,s_cmdDetail[cmd].intFilter)==0);\r
410 #endif    \r
411     \r
412     if(0 != s_CardErrCode){\r
413         SDIO_CARD_PRINT(("SDIO_Card error = 0x%x",s_CardErrCode));\r
414         SDHOST_RST(handle->sdio_port,RST_CMD_DAT_LINE);\r
415 //        SDHOST_Dump_SDIO_Registers(1);\r
416         return s_CardErrCode;\r
417     }\r
418 \r
419     SDHOST_GetRspFromBuf(handle->sdio_port, s_cmdDetail[cmd].Response, rspBuf);\r
420 \r
421     return SDIO_CARD_PAL_ERR_NONE;\r
422 }\r
423 \r
424 void SPRD_SDSlave_Pal_Close(SDIO_CARD_PAL_HANDLE handle)\r
425 {\r
426 \r
427     SDIO_CARD_PAL_ASSERT(\r
428         (SDIO_CARD_PAL_MAGICNUM == handle->MagicNum)\r
429         &&(TRUE == handle->flag)\r
430     );\r
431 \r
432     handle->flag = FALSE;\r
433 \r
434     SDHOST_UnRegister(handle->sdio_port);\r
435 \r
436     handle->s_CardEvent = 0;\r
437 \r
438 }\r
439 \r
440 void SDIO_Card_Pal_SlotSelect(SDIO_CARD_PAL_SLOT_E slotNo)\r
441 {\r
442     SDIO_CARD_PAL_SLOT_E i;\r
443     SDIO_CARD_PAL_HANDLE handle;\r
444     \r
445     SDIO_CARD_PAL_ASSERT(SDHOST_SLOT_MAX_NUM > slotNo);\r
446     SDHOST_Slot_select(slotNo);\r
447     for(i = 0; i < SDHOST_SLOT_MAX_NUM; i ++)\r
448     {\r
449         handle = &s_sdioCardPalHd[i];\r
450         if(NULL == handle->sdio_port)\r
451         {\r
452             continue;\r
453         }\r
454         SDHOST_SD_clk_OnOff(handle->sdio_port,CLK_ON);\r
455     }\r
456 }\r
457 \r