androidComputer: changed for display
[firefly-linux-kernel-4.4.55.git] / arch / arm / plat-rk / rk-sdmmc-ops.c
1 /***************************************************************************************************
2  * arch/arm/palt-rk/rk-sdmmc-ops.c
3  *
4  * Copyright (C) 2013 ROCKCHIP, Inc.
5  *
6  * Description: define the gpio for SDMMC module on various platforms
7  *
8  * Author: Michael Xie
9  * E-mail: xbw@rock-chips.com
10  *
11  * History:
12  *     ver1.0 Unified function interface for new imoux-API, created at 2013-01-15
13  *     ver1.1 add drive strength control and the setting of IO-voltage, created at 2013-01-29
14  *
15  **************************************************************************************************/
16
17 //use the new iomux-API
18 #if 1//defined(CONFIG_ARCH_RK3066B)||defined(CONFIG_ARCH_RK3168)||defined(CONFIG_ARCH_RK3188)
19 #define SDMMC_USE_NEW_IOMUX_API 1
20 #else
21 #define SDMMC_USE_NEW_IOMUX_API 0
22 #endif
23
24 //define IO volatga
25 #if defined(CONFIG_ARCH_RK3066B)||defined(CONFIG_ARCH_RK3168)||defined(CONFIG_ARCH_RK3188)
26 #define SDMMC_SET_IO_VOLTAGE    1
27 #else
28 #define SDMMC_SET_IO_VOLTAGE    0
29 #endif
30
31 #if SDMMC_SET_IO_VOLTAGE
32 //GRF_IO_CON2                        0x0FC
33 #define SDMMC0_DRIVER_STRENGTH_2MA            (0x00 << 6)
34 #define SDMMC0_DRIVER_STRENGTH_4MA            (0x01 << 6)
35 #define SDMMC0_DRIVER_STRENGTH_8MA            (0x02 << 6)
36 #define SDMMC0_DRIVER_STRENGTH_12MA           (0x03 << 6)
37 #define SDMMC0_DRIVER_STRENGTH_MASK           (0x03 << 22)
38
39 //GRF_IO_CON3                        0x100
40 #define SDMMC1_DRIVER_STRENGTH_2MA            (0x00 << 2)
41 #define SDMMC1_DRIVER_STRENGTH_4MA            (0x01 << 2)
42 #define SDMMC1_DRIVER_STRENGTH_8MA            (0x02 << 2)
43 #define SDMMC1_DRIVER_STRENGTH_12MA           (0x03 << 2)
44 #define SDMMC1_DRIVER_STRENGTH_MASK           (0x03 << 18)
45
46 //GRF_IO_CON4       0x104
47 #define SDMMC0_IO_VOLTAGE_33            (0x00 << 12)
48 #define SDMMC0_IO_VOLTAGE_18            (0x01 << 12)
49 #define SDMMC0_IO_VOLTAGE_MASK          (0x01 << 28)
50
51 #define SDMMC1_IO_VOLTAGE_33            (0x00 << 8)
52 #define SDMMC1_IO_VOLTAGE_18            (0x01 << 8)
53 #define SDMMC1_IO_VOLTAGE_MASK          (0x01 << 24)
54
55 #define SDMMC_write_grf_reg(addr, val)  __raw_writel(val, addr+RK30_GRF_BASE)
56 #define SDMMC_read_grf_reg(addr) __raw_readl(addr+RK30_GRF_BASE)
57 #define SDMMC_mask_grf_reg(addr, msk, val)      write_grf_reg(addr,(val)|((~(msk))&read_grf_reg(addr)))
58 #else
59 #define SDMMC_write_grf_reg(addr, val)  
60 #define SDMMC_read_grf_reg(addr)
61 #define SDMMC_mask_grf_reg(addr, msk, val)      
62 #endif
63
64 int rk31sdk_wifi_voltage_select(void)
65 {
66     int voltage;
67     int voltage_flag = 0;
68
69     voltage = rk31sdk_get_sdio_wifi_voltage();
70    
71      if(voltage >= 2700)
72         voltage_flag = 0;
73      else if(voltage <= 2000)
74         voltage_flag = 1;
75      else
76         voltage_flag = 1;
77
78     return voltage_flag;
79 }
80
81
82 #if defined(CONFIG_ARCH_RK3066B) || defined(CONFIG_ARCH_RK3188)
83 /*
84 * define the gpio for sdmmc0
85 */
86 static struct rksdmmc_gpio_board rksdmmc0_gpio_init = {
87
88      .clk_gpio       = {
89         .io             = RK30_PIN3_PA2,
90         .enable         = GPIO_HIGH,
91         .iomux          = {
92             .name       = "mmc0_clkout",
93             .fgpio      = GPIO3_A2,
94             .fmux       = MMC0_CLKOUT,
95         },
96     },   
97
98     .cmd_gpio           = {
99         .io             = RK30_PIN3_PA3,
100         .enable         = GPIO_HIGH,
101         .iomux          = {
102             .name       = "mmc0_cmd",
103             .fgpio      = GPIO3_A3,
104             .fmux       = MMC0_CMD,
105         },
106     },      
107
108    .data0_gpio       = {
109         .io             = RK30_PIN3_PA4,
110         .enable         = GPIO_HIGH,
111         .iomux          = {
112             .name       = "mmc0_d0",
113             .fgpio      = GPIO3_A4,
114             .fmux       = MMC0_D0,
115         },
116     },      
117
118     .data1_gpio       = {
119         .io             = RK30_PIN3_PA5,
120         .enable         = GPIO_HIGH,
121         .iomux          = {
122             .name       = "mmc0_d1",
123             .fgpio      = GPIO3_A5,
124             .fmux       = MMC0_D1,
125         },
126     },      
127
128     .data2_gpio       = {
129         .io             = RK30_PIN3_PA6,
130         .enable         = GPIO_HIGH,
131         .iomux          = {
132             .name       = "mmc0_d2",
133             .fgpio      = GPIO3_A6,
134             .fmux       = MMC0_D2,
135         },
136     }, 
137
138     .data3_gpio       = {
139         .io             = RK30_PIN3_PA7,
140         .enable         = GPIO_HIGH,
141         .iomux          = {
142             .name       = "mmc0_d3",
143             .fgpio      = GPIO3_A7,
144             .fmux       = MMC0_D3,
145         },
146     }, 
147
148                
149     .power_en_gpio      = {   
150 #if defined(RK29SDK_SD_CARD_PWR_EN) || (INVALID_GPIO != RK29SDK_SD_CARD_PWR_EN)
151                     .io             = RK29SDK_SD_CARD_PWR_EN,
152                     .enable         = RK29SDK_SD_CARD_PWR_EN_LEVEL,
153         #ifdef RK29SDK_SD_CARD_PWR_EN_PIN_NAME
154                     .iomux          = {
155                         .name       = RK29SDK_SD_CARD_PWR_EN_PIN_NAME,
156             #ifdef RK29SDK_SD_CARD_PWR_EN_IOMUX_FGPIO
157                         .fgpio      = RK29SDK_SD_CARD_PWR_EN_IOMUX_FGPIO,
158             #endif
159             #ifdef RK29SDK_SD_CARD_PWR_EN_IOMUX_FMUX
160                         .fmux       = RK29SDK_SD_CARD_PWR_EN_IOMUX_FMUX,
161             #endif
162                     },
163         #endif
164 #else
165                     .io             = INVALID_GPIO,
166                     .enable         = GPIO_LOW,
167 #endif
168                 }, 
169             
170         .detect_irq       = {
171 #if defined(RK29SDK_SD_CARD_DETECT_N) || (INVALID_GPIO != RK29SDK_SD_CARD_DETECT_N)  
172                     .io             = RK29SDK_SD_CARD_DETECT_N,
173                     .enable         = RK29SDK_SD_CARD_INSERT_LEVEL,
174         #ifdef RK29SDK_SD_CARD_DETECT_PIN_NAME
175                     .iomux          = {
176                         .name       = RK29SDK_SD_CARD_DETECT_PIN_NAME,
177             #ifdef RK29SDK_SD_CARD_DETECT_IOMUX_FGPIO
178                         .fgpio      = RK29SDK_SD_CARD_DETECT_IOMUX_FGPIO,
179             #endif
180             #ifdef RK29SDK_SD_CARD_DETECT_IOMUX_FMUX
181                         .fmux       = RK29SDK_SD_CARD_DETECT_IOMUX_FMUX,
182             #endif
183                     },
184         #endif
185 #else
186                     .io             = INVALID_GPIO,
187                     .enable         = GPIO_LOW,
188 #endif            
189     },
190
191 };
192
193
194 /*
195 * define the gpio for sdmmc1
196 */
197 static struct rksdmmc_gpio_board rksdmmc1_gpio_init = {
198
199      .clk_gpio       = {
200         .io             = RK30_PIN3_PC5,
201         .enable         = GPIO_HIGH,
202         .iomux          = {
203             .name       = "mmc1_clkout",
204             .fgpio      = GPIO3_C5,
205             .fmux       = MMC1_CLKOUT,
206         },
207     },   
208
209     .cmd_gpio           = {
210         .io             = RK30_PIN3_PC0,
211         .enable         = GPIO_HIGH,
212         .iomux          = {
213             .name       = "mmc1_cmd",
214             .fgpio      = GPIO3_C0,
215             .fmux       = MMC1_CMD,
216         },
217     },      
218
219    .data0_gpio       = {
220         .io             = RK30_PIN3_PC1,
221         .enable         = GPIO_HIGH,
222         .iomux          = {
223             .name       = "mmc1_d0",
224             .fgpio      = GPIO3_C1,
225             .fmux       = MMC1_D0,
226         },
227     },      
228
229     .data1_gpio       = {
230         .io             = RK30_PIN3_PC2,
231         .enable         = GPIO_HIGH,
232         .iomux          = {
233             .name       = "mmc1_d1",
234             .fgpio      = GPIO3_C2,
235             .fmux       = MMC1_D1,
236         },
237     },      
238
239     .data2_gpio       = {
240         .io             = RK30_PIN3_PC3,
241         .enable         = GPIO_HIGH,
242         .iomux          = {
243             .name       = "mmc1_d2",
244             .fgpio      = GPIO3_C3,
245             .fmux       = MMC1_D2,
246         },
247     }, 
248
249     .data3_gpio       = {
250         .io             = RK30_PIN3_PC4,
251         .enable         = GPIO_HIGH,
252         .iomux          = {
253             .name       = "mmc1_d3",
254             .fgpio      = GPIO3_C4,
255             .fmux       = MMC1_D3,
256         },
257     }, 
258 };
259 // ---end -#if defined(CONFIG_ARCH_RK3066B)
260
261 #elif defined(CONFIG_ARCH_RK2928)
262 /*
263 * define the gpio for sdmmc0
264 */
265 static struct rksdmmc_gpio_board rksdmmc0_gpio_init = {
266
267      .clk_gpio       = {
268         .io             = RK2928_PIN1_PC0,
269         .enable         = GPIO_HIGH,
270         .iomux          = {
271             #if !(!!SDMMC_USE_NEW_IOMUX_API)
272             .name       = GPIO1C0_MMC0_CLKOUT_NAME,
273             .fgpio      = GPIO1C_GPIO1C0,
274             .fmux       = GPIO1C_MMC0_CLKOUT,
275             #endif
276         },
277     },   
278
279     .cmd_gpio           = {
280         .io             = RK2928_PIN1_PC7,
281         .enable         = GPIO_HIGH,
282         .iomux          = {
283             #if !(!!SDMMC_USE_NEW_IOMUX_API)
284             .name       = GPIO1B7_MMC0_CMD_NAME,
285             .fgpio      = GPIO1B_GPIO1B7,
286             .fmux       = GPIO1B_MMC0_CMD,
287             #endif
288         },
289     },      
290
291    .data0_gpio       = {
292         .io             = RK2928_PIN1_PC2,
293         .enable         = GPIO_HIGH,
294         .iomux          = {
295             #if !(!!SDMMC_USE_NEW_IOMUX_API)
296             .name       = GPIO1C2_MMC0_D0_NAME,
297             .fgpio      = GPIO1C_GPIO1C2,
298             .fmux       = GPIO1C_MMC0_D0,
299             #endif
300         },
301     },      
302
303     .data1_gpio       = {
304         .io             = RK2928_PIN1_PC3,
305         .enable         = GPIO_HIGH,
306         .iomux          = {
307             #if !(!!SDMMC_USE_NEW_IOMUX_API)
308             .name       = GPIO1C3_MMC0_D1_NAME,
309             .fgpio      = GPIO1C_GPIO1C3,
310             .fmux       = GPIO1C_MMC0_D1,
311             #endif
312         },
313     },      
314
315     .data2_gpio       = {
316         .io             = RK2928_PIN1_PC4,
317         .enable         = GPIO_HIGH,
318         .iomux          = {
319             #if !(!!SDMMC_USE_NEW_IOMUX_API)
320             .name       = GPIO1C4_MMC0_D2_NAME,
321             .fgpio      = GPIO1C_GPIO1C4,
322             .fmux       = GPIO1C_MMC0_D2,
323             #endif
324         },
325     }, 
326
327     .data3_gpio       = {
328         .io             = RK2928_PIN1_PC5,
329         .enable         = GPIO_HIGH,
330         .iomux          = {
331             #if !(!!SDMMC_USE_NEW_IOMUX_API)
332             .name       = GPIO1C5_MMC0_D3_NAME,
333             .fgpio      = GPIO1C_GPIO1C5,
334             .fmux       = GPIO1C_MMC0_D3,
335             #endif
336         },
337     }, 
338
339    
340     .power_en_gpio      = {   
341 #if defined(RK29SDK_SD_CARD_PWR_EN) || (INVALID_GPIO != RK29SDK_SD_CARD_PWR_EN)
342         .io             = RK29SDK_SD_CARD_PWR_EN,
343         .enable         = RK29SDK_SD_CARD_PWR_EN_LEVEL,
344         #ifdef RK29SDK_SD_CARD_PWR_EN_PIN_NAME
345         .iomux          = {
346             .name       = RK29SDK_SD_CARD_PWR_EN_PIN_NAME,
347             #ifdef RK29SDK_SD_CARD_PWR_EN_IOMUX_FGPIO
348             .fgpio      = RK29SDK_SD_CARD_PWR_EN_IOMUX_FGPIO,
349             #endif
350             #ifdef RK29SDK_SD_CARD_PWR_EN_IOMUX_FMUX
351             .fmux       = RK29SDK_SD_CARD_PWR_EN_IOMUX_FMUX,
352             #endif
353         },
354         #endif
355 #else
356         .io             = INVALID_GPIO,
357         .enable         = GPIO_LOW,
358 #endif
359     }, 
360
361     .detect_irq       = {
362 #if defined(RK29SDK_SD_CARD_DETECT_N) || (INVALID_GPIO != RK29SDK_SD_CARD_DETECT_N)  
363         .io             = RK29SDK_SD_CARD_DETECT_N,
364         .enable         = RK29SDK_SD_CARD_INSERT_LEVEL,
365         #ifdef RK29SDK_SD_CARD_DETECT_PIN_NAME
366         .iomux          = {
367             .name       = RK29SDK_SD_CARD_DETECT_PIN_NAME,
368             #ifdef RK29SDK_SD_CARD_DETECT_IOMUX_FGPIO
369             .fgpio      = RK29SDK_SD_CARD_DETECT_IOMUX_FGPIO,
370             #endif
371             #ifdef RK29SDK_SD_CARD_DETECT_IOMUX_FMUX
372             .fmux       = RK29SDK_SD_CARD_DETECT_IOMUX_FMUX,
373             #endif
374         },
375         #endif
376 #else
377         .io             = INVALID_GPIO,
378         .enable         = GPIO_LOW,
379 #endif            
380     }, 
381 };
382
383
384 /*
385 * define the gpio for sdmmc1
386 */
387 static struct rksdmmc_gpio_board rksdmmc1_gpio_init = {
388
389      .clk_gpio       = {
390         .io             = RK2928_PIN0_PB1,
391         .enable         = GPIO_HIGH,
392         .iomux          = {
393             #if !(!!SDMMC_USE_NEW_IOMUX_API)
394             .name       = GPIO0B1_MMC1_CLKOUT_NAME,
395             .fgpio      = GPIO0B_GPIO0B1,
396             .fmux       = GPIO0B_MMC1_CLKOUT,
397             #endif
398         },
399     },   
400
401     .cmd_gpio           = {
402         .io             = RK2928_PIN0_PB0,
403         .enable         = GPIO_HIGH,
404         .iomux          = {
405             #if !(!!SDMMC_USE_NEW_IOMUX_API)
406             .name       = GPIO0B0_MMC1_CMD_NAME,
407             .fgpio      = GPIO0B_GPIO0B0,
408             .fmux       = GPIO0B_MMC1_CMD,
409             #endif
410         },
411     },      
412
413    .data0_gpio       = {
414         .io             = RK2928_PIN0_PB3,
415         .enable         = GPIO_HIGH,
416         .iomux          = {
417             #if !(!!SDMMC_USE_NEW_IOMUX_API)
418             .name       = GPIO0B3_MMC1_D0_NAME,
419             .fgpio      = GPIO0B_GPIO0B3,
420             .fmux       = GPIO0B_MMC1_D0,
421             #endif
422         },
423     },      
424
425     .data1_gpio       = {
426         .io             = RK2928_PIN0_PB4,
427         .enable         = GPIO_HIGH,
428         .iomux          = {
429             #if !(!!SDMMC_USE_NEW_IOMUX_API)
430             .name       = GPIO0B4_MMC1_D1_NAME,
431             .fgpio      = GPIO0B_GPIO0B4,
432             .fmux       = GPIO0B_MMC1_D1,
433             #endif
434         },
435     },      
436
437     .data2_gpio       = {
438         .io             = RK2928_PIN0_PB5,
439         .enable         = GPIO_HIGH,
440         .iomux          = {
441             #if !(!!SDMMC_USE_NEW_IOMUX_API)
442             .name       = GPIO0B5_MMC1_D2_NAME,
443             .fgpio      = GPIO0B_GPIO0B5,
444             .fmux       = GPIO0B_MMC1_D2,
445             #endif
446         },
447     }, 
448
449     .data3_gpio       = {
450         .io             = RK2928_PIN0_PB6,
451         .enable         = GPIO_HIGH,
452         .iomux          = {
453             #if !(!!SDMMC_USE_NEW_IOMUX_API)
454             .name       = GPIO0B6_MMC1_D3_NAME,
455             .fgpio      = GPIO0B_GPIO0B6,
456             .fmux       = GPIO0B_MMC1_D3,
457             #endif
458         },
459     }, 
460
461
462 };
463 // ---end -#if defined(CONFIG_ARCH_RK2928)
464 #elif defined(CONFIG_ARCH_RK3026)
465 /*
466 * define the gpio for sdmmc0
467 */
468 static struct rksdmmc_gpio_board rksdmmc0_gpio_init = {
469
470      .clk_gpio       = {
471         .io             = RK30_PIN1_PC0,
472         .enable         = GPIO_HIGH,
473         .iomux          = {
474             .name       = "mmc0_clk",
475             .fgpio      = GPIO1_C0,
476             .fmux       = MMC0_CLKOUT,
477         },
478     },   
479
480     .cmd_gpio           = {
481         .io             = RK30_PIN1_PB7,
482         .enable         = GPIO_HIGH,
483         .iomux          = {
484             .name       = "mmc0_cmd",
485             .fgpio      = GPIO1_B7,
486             .fmux       = MMC0_CMD,
487         },
488     },      
489
490    .data0_gpio       = {
491         .io             = RK30_PIN1_PC2,
492         .enable         = GPIO_HIGH,
493         .iomux          = {
494             .name       = "mmc0_d0",
495             .fgpio      = GPIO1_C2,
496             .fmux       = MMC0_D0,
497         },
498     },      
499
500     .data1_gpio       = {
501         .io             = RK30_PIN1_PC3,
502         .enable         = GPIO_HIGH,
503         .iomux          = {
504             .name       = "mmc0_d1",
505             .fgpio      = GPIO1_C3,
506             .fmux       = MMC0_D1,
507         },
508     },      
509
510     .data2_gpio       = {
511         .io             = RK30_PIN1_PC4,
512         .enable         = GPIO_HIGH,
513         .iomux          = {
514             .name       = "mmc0_d2",
515             .fgpio      = GPIO1_C4,
516             .fmux       = MMC0_D2,
517         },
518     }, 
519
520     .data3_gpio       = {
521         .io             = RK30_PIN1_PC5,
522         .enable         = GPIO_HIGH,
523         .iomux          = {
524             .name       = "mmc0_d3",
525             .fgpio      = GPIO1_C5,
526             .fmux       = MMC0_D3,
527         },
528     }, 
529
530    
531     .power_en_gpio      = {   
532 #if defined(RK29SDK_SD_CARD_PWR_EN) || (INVALID_GPIO != RK29SDK_SD_CARD_PWR_EN)
533         .io             = RK29SDK_SD_CARD_PWR_EN,
534         .enable         = RK29SDK_SD_CARD_PWR_EN_LEVEL,
535         #ifdef RK29SDK_SD_CARD_PWR_EN_PIN_NAME
536         .iomux          = {
537             .name       = RK29SDK_SD_CARD_PWR_EN_PIN_NAME,
538             #ifdef RK29SDK_SD_CARD_PWR_EN_IOMUX_FGPIO
539             .fgpio      = RK29SDK_SD_CARD_PWR_EN_IOMUX_FGPIO,
540             #endif
541             #ifdef RK29SDK_SD_CARD_PWR_EN_IOMUX_FMUX
542             .fmux       = RK29SDK_SD_CARD_PWR_EN_IOMUX_FMUX,
543             #endif
544         },
545         #endif
546 #else
547         .io             = INVALID_GPIO,
548         .enable         = GPIO_LOW,
549 #endif
550     }, 
551
552     .detect_irq       = {
553 #if defined(RK29SDK_SD_CARD_DETECT_N) || (INVALID_GPIO != RK29SDK_SD_CARD_DETECT_N)  
554         .io             = RK29SDK_SD_CARD_DETECT_N,
555         .enable         = RK29SDK_SD_CARD_INSERT_LEVEL,
556         #ifdef RK29SDK_SD_CARD_DETECT_PIN_NAME
557         .iomux          = {
558             .name       = RK29SDK_SD_CARD_DETECT_PIN_NAME,
559             #ifdef RK29SDK_SD_CARD_DETECT_IOMUX_FGPIO
560             .fgpio      = RK29SDK_SD_CARD_DETECT_IOMUX_FGPIO,
561             #endif
562             #ifdef RK29SDK_SD_CARD_DETECT_IOMUX_FMUX
563             .fmux       = RK29SDK_SD_CARD_DETECT_IOMUX_FMUX,
564             #endif
565         },
566         #endif
567 #else
568         .io             = INVALID_GPIO,
569         .enable         = GPIO_LOW,
570 #endif            
571     }, 
572 };
573
574
575 /*
576 * define the gpio for sdmmc1
577 */
578 static struct rksdmmc_gpio_board rksdmmc1_gpio_init = {
579
580      .clk_gpio       = {
581         .io             = RK30_PIN0_PB1,
582         .enable         = GPIO_HIGH,
583         .iomux          = {
584             .name       = "mmc1_clk",
585             .fgpio      = GPIO0_B1,
586             .fmux       = MMC1_CLKOUT,
587         },
588     },   
589
590     .cmd_gpio           = {
591         .io             = RK30_PIN0_PB0,
592         .enable         = GPIO_HIGH,
593         .iomux          = {
594             .name       = "mmc1_cmd",
595             .fgpio      = GPIO0_B0,
596             .fmux       = MMC1_CMD,
597         },
598     },      
599
600    .data0_gpio       = {
601         .io             = RK30_PIN0_PB3,
602         .enable         = GPIO_HIGH,
603         .iomux          = {
604             .name       = "mmc1_d0",
605             .fgpio      = GPIO0_B3,
606             .fmux       = MMC1_D0,
607         },
608     },      
609
610     .data1_gpio       = {
611         .io             = RK30_PIN0_PB4,
612         .enable         = GPIO_HIGH,
613         .iomux          = {
614             .name       = "mmc1_d1",
615             .fgpio      = GPIO0_B4,
616             .fmux       = MMC1_D1,
617         },
618     },      
619
620     .data2_gpio       = {
621         .io             = RK30_PIN0_PB5,
622         .enable         = GPIO_HIGH,
623         .iomux          = {
624             .name       = "mmc1_d2",
625             .fgpio      = GPIO0_B5,
626             .fmux       = MMC1_D2,
627         },
628     }, 
629
630     .data3_gpio       = {
631         .io             = RK30_PIN0_PB6,
632         .enable         = GPIO_HIGH,
633         .iomux          = {
634             .name       = "mmc1_d3",
635             .fgpio      = GPIO0_B6,
636             .fmux       = MMC1_D3,
637         },
638     }, 
639
640
641 };
642 // ---end -#if defined(CONFIG_ARCH_RK3026)
643
644 #else //default for RK30,RK3066 SDK
645 /*
646 * define the gpio for sdmmc0
647 */
648 struct rksdmmc_gpio_board rksdmmc0_gpio_init = {
649
650      .clk_gpio       = {
651         .io             = RK30_PIN3_PB0,
652         .enable         = GPIO_HIGH,
653         .iomux          = {
654             #if !(!!SDMMC_USE_NEW_IOMUX_API)
655             .name       = GPIO3B0_SDMMC0CLKOUT_NAME,
656             .fgpio      = GPIO3B_GPIO3B0,
657             .fmux       = GPIO3B_SDMMC0_CLKOUT,
658             #endif
659         },
660     },   
661
662     .cmd_gpio           = {
663         .io             = RK30_PIN3_PB1,
664         .enable         = GPIO_HIGH,
665         .iomux          = {
666             #if !(!!SDMMC_USE_NEW_IOMUX_API)
667             .name       = GPIO3B1_SDMMC0CMD_NAME,
668             .fgpio      = GPIO3B_GPIO3B1,
669             .fmux       = GPIO3B_SDMMC0_CMD,
670             #endif
671         },
672     },      
673
674    .data0_gpio       = {
675         .io             = RK30_PIN3_PB2,
676         .enable         = GPIO_HIGH,
677         .iomux          = {
678             #if !(!!SDMMC_USE_NEW_IOMUX_API)
679             .name       = GPIO3B2_SDMMC0DATA0_NAME,
680             .fgpio      = GPIO3B_GPIO3B2,
681             .fmux       = GPIO3B_SDMMC0_DATA0,
682             #endif
683         },
684     },      
685
686     .data1_gpio       = {
687         .io             = RK30_PIN3_PB3,
688         .enable         = GPIO_HIGH,
689         .iomux          = {
690             #if !(!!SDMMC_USE_NEW_IOMUX_API)
691             .name       = GPIO3B3_SDMMC0DATA1_NAME,
692             .fgpio      = GPIO3B_GPIO3B3,
693             .fmux       = GPIO3B_SDMMC0_DATA1,
694             #endif
695         },
696     },      
697
698     .data2_gpio       = {
699         .io             = RK30_PIN3_PB4,
700         .enable         = GPIO_HIGH,
701         .iomux          = {
702             #if !(!!SDMMC_USE_NEW_IOMUX_API)
703             .name       = GPIO3B4_SDMMC0DATA2_NAME,
704             .fgpio      = GPIO3B_GPIO3B4,
705             .fmux       = GPIO3B_SDMMC0_DATA2,
706             #endif
707         },
708     }, 
709
710     .data3_gpio       = {
711         .io             = RK30_PIN3_PB5,
712         .enable         = GPIO_HIGH,
713         .iomux          = {
714             #if !(!!SDMMC_USE_NEW_IOMUX_API)
715             .name       = GPIO3B5_SDMMC0DATA3_NAME,
716             .fgpio      = GPIO3B_GPIO3B5,
717             .fmux       = GPIO3B_SDMMC0_DATA3,
718             #endif
719         },
720     }, 
721     
722     .power_en_gpio      = {   
723 #if defined(RK29SDK_SD_CARD_PWR_EN) || (INVALID_GPIO != RK29SDK_SD_CARD_PWR_EN)
724         .io             = RK29SDK_SD_CARD_PWR_EN,
725         .enable         = RK29SDK_SD_CARD_PWR_EN_LEVEL,
726         #ifdef RK29SDK_SD_CARD_PWR_EN_PIN_NAME
727         .iomux          = {
728             .name       = RK29SDK_SD_CARD_PWR_EN_PIN_NAME,
729             #ifdef RK29SDK_SD_CARD_PWR_EN_IOMUX_FGPIO
730             .fgpio      = RK29SDK_SD_CARD_PWR_EN_IOMUX_FGPIO,
731             #endif
732             #ifdef RK29SDK_SD_CARD_PWR_EN_IOMUX_FMUX
733             .fmux       = RK29SDK_SD_CARD_PWR_EN_IOMUX_FMUX,
734             #endif
735         },
736         #endif
737 #else
738         .io             = INVALID_GPIO,
739         .enable         = GPIO_LOW,
740 #endif
741     }, 
742
743     .detect_irq       = {
744 #if defined(RK29SDK_SD_CARD_DETECT_N) || (INVALID_GPIO != RK29SDK_SD_CARD_DETECT_N)  
745         .io             = RK29SDK_SD_CARD_DETECT_N,
746         .enable         = RK29SDK_SD_CARD_INSERT_LEVEL,
747         #ifdef RK29SDK_SD_CARD_DETECT_PIN_NAME
748         .iomux          = {
749             .name       = RK29SDK_SD_CARD_DETECT_PIN_NAME,
750             #ifdef RK29SDK_SD_CARD_DETECT_IOMUX_FGPIO
751             .fgpio      = RK29SDK_SD_CARD_DETECT_IOMUX_FGPIO,
752             #endif
753             #ifdef RK29SDK_SD_CARD_DETECT_IOMUX_FMUX
754             .fmux       = RK29SDK_SD_CARD_DETECT_IOMUX_FMUX,
755             #endif
756         },
757         #endif
758 #else
759         .io             = INVALID_GPIO,
760         .enable         = GPIO_LOW,
761 #endif            
762     },
763 };
764
765
766 /*
767 * define the gpio for sdmmc1
768 */
769 static struct rksdmmc_gpio_board rksdmmc1_gpio_init = {
770
771      .clk_gpio       = {
772         .io             = RK30_PIN3_PC5,
773         .enable         = GPIO_HIGH,
774         .iomux          = {
775             #if !(!!SDMMC_USE_NEW_IOMUX_API)
776             .name       = GPIO3C5_SDMMC1CLKOUT_NAME,
777             .fgpio      = GPIO3C_GPIO3C5,
778             .fmux       = GPIO3B_SDMMC0_CLKOUT,
779             #endif
780         },
781     },   
782
783     .cmd_gpio           = {
784         .io             = RK30_PIN3_PC0,
785         .enable         = GPIO_HIGH,
786         .iomux          = {
787             #if !(!!SDMMC_USE_NEW_IOMUX_API)
788             .name       = GPIO3C0_SMMC1CMD_NAME,
789             .fgpio      = GPIO3C_GPIO3C0,
790             .fmux       = GPIO3B_SDMMC0_CMD,
791             #endif
792         },
793     },      
794
795    .data0_gpio       = {
796         .io             = RK30_PIN3_PC1,
797         .enable         = GPIO_HIGH,
798         .iomux          = {
799             #if !(!!SDMMC_USE_NEW_IOMUX_API)
800             .name       = GPIO3C1_SDMMC1DATA0_NAME,
801             .fgpio      = GPIO3C_GPIO3C1,
802             .fmux       = GPIO3B_SDMMC0_DATA0,
803             #endif
804         },
805     },      
806
807     .data1_gpio       = {
808         .io             = RK30_PIN3_PC2,
809         .enable         = GPIO_HIGH,
810         .iomux          = {
811             #if !(!!SDMMC_USE_NEW_IOMUX_API)
812             .name       = GPIO3C2_SDMMC1DATA1_NAME,
813             .fgpio      = GPIO3C_GPIO3C2,
814             .fmux       = GPIO3B_SDMMC0_DATA1,
815             #endif
816         },
817     },      
818
819     .data2_gpio       = {
820         .io             = RK30_PIN3_PC3,
821         .enable         = GPIO_HIGH,
822         .iomux          = {
823             #if !(!!SDMMC_USE_NEW_IOMUX_API)
824             .name       = GPIO3C3_SDMMC1DATA2_NAME,
825             .fgpio      = GPIO3C_GPIO3C3,
826             .fmux       = GPIO3B_SDMMC0_DATA2,
827             #endif
828         },
829     }, 
830
831     .data3_gpio       = {
832         .io             = RK30_PIN3_PC4,
833         .enable         = GPIO_HIGH,
834         .iomux          = {
835             #if !(!!SDMMC_USE_NEW_IOMUX_API)
836             .name       = GPIO3C4_SDMMC1DATA3_NAME,
837             .fgpio      = GPIO3C_GPIO3C4,
838             .fmux       = GPIO3B_SDMMC0_DATA3,
839             #endif
840         },
841     }, 
842 };
843  // ---end -defualt rk30sdk,rk3066sdk
844
845 #endif
846
847
848
849 //1.Part 3: The various operations of the SDMMC-SDIO module
850 /*************************************************************************
851 * define the varaious operations for SDMMC module
852 * Generally only the author of SDMMC module will modify this section.
853 *************************************************************************/
854 #if !defined(CONFIG_SDMMC_RK29_OLD)     
855 //static void rk29_sdmmc_gpio_open(int device_id, int on)
856 void rk29_sdmmc_gpio_open(int device_id, int on)
857 {
858     switch(device_id)
859     {
860         case 0://mmc0
861         {
862             #ifdef CONFIG_SDMMC0_RK29
863             if(on)
864             {
865                 gpio_direction_output(rksdmmc0_gpio_init.clk_gpio.io, GPIO_HIGH);//set mmc0-clk to high
866                 gpio_direction_output(rksdmmc0_gpio_init.cmd_gpio.io, GPIO_HIGH);// set mmc0-cmd to high.
867                 gpio_direction_output(rksdmmc0_gpio_init.data0_gpio.io,GPIO_HIGH);//set mmc0-data0 to high.
868                 gpio_direction_output(rksdmmc0_gpio_init.data1_gpio.io,GPIO_HIGH);//set mmc0-data1 to high.
869                 gpio_direction_output(rksdmmc0_gpio_init.data2_gpio.io,GPIO_HIGH);//set mmc0-data2 to high.
870                 gpio_direction_output(rksdmmc0_gpio_init.data3_gpio.io,GPIO_HIGH);//set mmc0-data3 to high.
871
872                 mdelay(30);
873             }
874             else
875             {
876                 #if !(!!SDMMC_USE_NEW_IOMUX_API)
877                 rk30_mux_api_set(rksdmmc0_gpio_init.clk_gpio.iomux.name, rksdmmc0_gpio_init.clk_gpio.iomux.fgpio);
878                 #endif
879                 gpio_request(rksdmmc0_gpio_init.clk_gpio.io, "mmc0-clk");
880                 gpio_direction_output(rksdmmc0_gpio_init.clk_gpio.io,GPIO_LOW);//set mmc0-clk to low.
881
882                 #if !(!!SDMMC_USE_NEW_IOMUX_API)
883                 rk30_mux_api_set(rksdmmc0_gpio_init.cmd_gpio.iomux.name, rksdmmc0_gpio_init.cmd_gpio.iomux.fgpio);
884                 #endif
885                 gpio_request(rksdmmc0_gpio_init.cmd_gpio.io, "mmc0-cmd");
886                 gpio_direction_output(rksdmmc0_gpio_init.cmd_gpio.io,GPIO_LOW);//set mmc0-cmd to low.
887
888                 #if !(!!SDMMC_USE_NEW_IOMUX_API)
889                 rk30_mux_api_set(rksdmmc0_gpio_init.data0_gpio.iomux.name, rksdmmc0_gpio_init.data0_gpio.iomux.fgpio);
890                 #endif
891                 gpio_request(rksdmmc0_gpio_init.data0_gpio.io, "mmc0-data0");
892                 gpio_direction_output(rksdmmc0_gpio_init.data0_gpio.io,GPIO_LOW);//set mmc0-data0 to low.
893
894                 #if !(!!SDMMC_USE_NEW_IOMUX_API)
895                 rk30_mux_api_set(rksdmmc0_gpio_init.data1_gpio.iomux.name, rksdmmc0_gpio_init.data1_gpio.iomux.fgpio);
896                 #endif
897                 gpio_request(rksdmmc0_gpio_init.data1_gpio.io, "mmc0-data1");
898                 gpio_direction_output(rksdmmc0_gpio_init.data1_gpio.io,GPIO_LOW);//set mmc0-data1 to low.
899
900                 #if !(!!SDMMC_USE_NEW_IOMUX_API)
901                 rk30_mux_api_set(rksdmmc0_gpio_init.data2_gpio.iomux.name, rksdmmc0_gpio_init.data2_gpio.iomux.fgpio);
902                 #endif
903                 gpio_request(rksdmmc0_gpio_init.data2_gpio.io, "mmc0-data2");
904                 gpio_direction_output(rksdmmc0_gpio_init.data2_gpio.io,GPIO_LOW);//set mmc0-data2 to low.
905
906                 #if !(!!SDMMC_USE_NEW_IOMUX_API)
907                 rk30_mux_api_set(rksdmmc0_gpio_init.data3_gpio.iomux.name, rksdmmc0_gpio_init.data3_gpio.iomux.fgpio);
908                 #endif
909                 gpio_request(rksdmmc0_gpio_init.data3_gpio.io, "mmc0-data3");
910                 gpio_direction_output(rksdmmc0_gpio_init.data3_gpio.io,GPIO_LOW);//set mmc0-data3 to low.
911
912                 mdelay(30);
913             }
914             #endif
915         }
916         break;
917         
918         case 1://mmc1
919         {
920             #ifdef CONFIG_SDMMC1_RK29
921             if(on)
922             {
923                 gpio_direction_output(rksdmmc1_gpio_init.clk_gpio.io,GPIO_HIGH);//set mmc1-clk to high
924                 gpio_direction_output(rksdmmc1_gpio_init.cmd_gpio.io,GPIO_HIGH);//set mmc1-cmd to high.
925                 gpio_direction_output(rksdmmc1_gpio_init.data0_gpio.io,GPIO_HIGH);//set mmc1-data0 to high.
926                 gpio_direction_output(rksdmmc1_gpio_init.data1_gpio.io,GPIO_HIGH);//set mmc1-data1 to high.
927                 gpio_direction_output(rksdmmc1_gpio_init.data2_gpio.io,GPIO_HIGH);//set mmc1-data2 to high.
928                 gpio_direction_output(rksdmmc1_gpio_init.data3_gpio.io,GPIO_HIGH);//set mmc1-data3 to high.
929                 mdelay(100);
930             }
931             else
932             {
933                 #if !(!!SDMMC_USE_NEW_IOMUX_API)
934                 rk30_mux_api_set(rksdmmc1_gpio_init.clk_gpio.iomux.name, rksdmmc1_gpio_init.clk_gpio.iomux.fgpio);
935                 #endif
936                 gpio_request(rksdmmc1_gpio_init.clk_gpio.io, "mmc1-clk");
937                 gpio_direction_output(rksdmmc1_gpio_init.clk_gpio.io,GPIO_LOW);//set mmc1-clk to low.
938
939                 #if !(!!SDMMC_USE_NEW_IOMUX_API)
940                 rk30_mux_api_set(rksdmmc1_gpio_init.cmd_gpio.iomux.name, rksdmmc1_gpio_init.cmd_gpio.iomux.fgpio);
941                 #endif
942                 gpio_request(rksdmmc1_gpio_init.cmd_gpio.io, "mmc1-cmd");
943                 gpio_direction_output(rksdmmc1_gpio_init.cmd_gpio.io,GPIO_LOW);//set mmc1-cmd to low.
944
945                 #if !(!!SDMMC_USE_NEW_IOMUX_API)
946                 rk30_mux_api_set(rksdmmc1_gpio_init.data0_gpio.iomux.name, rksdmmc1_gpio_init.data0_gpio.iomux.fgpio);
947                 #endif
948                 gpio_request(rksdmmc1_gpio_init.data0_gpio.io, "mmc1-data0");
949                 gpio_direction_output(rksdmmc1_gpio_init.data0_gpio.io,GPIO_LOW);//set mmc1-data0 to low.
950                 
951             #if defined(CONFIG_WIFI_COMBO_MODULE_CONTROL_FUNC) || defined(CONFIG_MT5931) || defined(CONFIG_MT5931_MT6622)
952                 #if !(!!SDMMC_USE_NEW_IOMUX_API)
953                 rk29_mux_api_set(rksdmmc1_gpio_init.data1_gpio.iomux.name, rksdmmc1_gpio_init.data1_gpio.iomux.fgpio);
954                 #endif
955                 gpio_request(rksdmmc1_gpio_init.data1_gpio.io, "mmc1-data1");
956                 gpio_direction_output(rksdmmc1_gpio_init.data1_gpio.io,GPIO_LOW);//set mmc1-data1 to low.
957
958                 #if !(!!SDMMC_USE_NEW_IOMUX_API)
959                 rk29_mux_api_set(rksdmmc1_gpio_init.data2_gpio.iomux.name, rksdmmc1_gpio_init.data2_gpio.iomux.fgpio);
960                 #endif
961                 gpio_request(rksdmmc1_gpio_init.data2_gpio.io, "mmc1-data2");
962                 gpio_direction_output(rksdmmc1_gpio_init.data2_gpio.io,GPIO_LOW);//set mmc1-data2 to low.
963
964                 #if !(!!SDMMC_USE_NEW_IOMUX_API)
965                 rk29_mux_api_set(rksdmmc1_gpio_init.data3_gpio.iomux.name, rksdmmc1_gpio_init.data3_gpio.iomux.fgpio);
966                 #endif
967                 gpio_request(rksdmmc1_gpio_init.data3_gpio.io, "mmc1-data3");
968                 gpio_direction_output(rksdmmc1_gpio_init.data3_gpio.io,GPIO_LOW);//set mmc1-data3 to low.
969            #endif
970                 mdelay(100);
971             }
972             #endif
973         }
974         break; 
975         
976         case 2: //mmc2
977         break;
978         
979         default:
980         break;
981     }
982 }
983
984 static void rk29_sdmmc_set_iomux_mmc0(unsigned int bus_width)
985 {
986     switch (bus_width)
987     {
988         
989         case 1://SDMMC_CTYPE_4BIT:
990         {
991             #if SDMMC_USE_NEW_IOMUX_API
992             iomux_set(rksdmmc0_gpio_init.data1_gpio.iomux.fmux);
993             iomux_set(rksdmmc0_gpio_init.data2_gpio.iomux.fmux);
994             iomux_set(rksdmmc0_gpio_init.data3_gpio.iomux.fmux);
995             #else
996                 rk30_mux_api_set(rksdmmc0_gpio_init.data1_gpio.iomux.name, rksdmmc0_gpio_init.data1_gpio.iomux.fmux);
997                 rk30_mux_api_set(rksdmmc0_gpio_init.data2_gpio.iomux.name, rksdmmc0_gpio_init.data2_gpio.iomux.fmux);
998                 rk30_mux_api_set(rksdmmc0_gpio_init.data3_gpio.iomux.name, rksdmmc0_gpio_init.data3_gpio.iomux.fmux);
999                 #endif
1000         }
1001         break;
1002
1003         case 0x10000://SDMMC_CTYPE_8BIT:
1004             break;
1005         case 0xFFFF: //gpio_reset
1006         {
1007             #if (!!SDMMC_USE_NEW_IOMUX_API) && !defined(CONFIG_SDMMC0_RK29_SDCARD_DET_FROM_GPIO)
1008             iomux_set(MMC0_DETN);
1009             #endif
1010             
1011             #if !(!!SDMMC_USE_NEW_IOMUX_API)
1012             rk30_mux_api_set(rksdmmc0_gpio_init.power_en_gpio.iomux.name, rksdmmc0_gpio_init.power_en_gpio.iomux.fgpio);
1013             #endif
1014             gpio_request(rksdmmc0_gpio_init.power_en_gpio.io,"sdmmc-power");
1015             gpio_direction_output(rksdmmc0_gpio_init.power_en_gpio.io, !(rksdmmc0_gpio_init.power_en_gpio.enable)); //power-off
1016
1017         #if 0 //replace the power control into rk29_sdmmc_set_ios(); modifyed by xbw at 2012-08-12
1018             rk29_sdmmc_gpio_open(0, 0);
1019
1020             gpio_direction_output(rksdmmc0_gpio_init.power_en_gpio.io, rksdmmc0_gpio_init.power_en_gpio.enable); //power-on
1021
1022             rk29_sdmmc_gpio_open(0, 1);
1023           #endif  
1024         }
1025         break;
1026
1027         default: //case 0://SDMMC_CTYPE_1BIT:
1028         {
1029             #if SDMMC_USE_NEW_IOMUX_API
1030                 iomux_set(rksdmmc0_gpio_init.cmd_gpio.iomux.fmux);
1031                 iomux_set(rksdmmc0_gpio_init.clk_gpio.iomux.fmux);
1032                 iomux_set(rksdmmc0_gpio_init.data0_gpio.iomux.fmux);
1033             #else
1034                 rk30_mux_api_set(rksdmmc0_gpio_init.cmd_gpio.iomux.name, rksdmmc0_gpio_init.cmd_gpio.iomux.fmux);
1035                 rk30_mux_api_set(rksdmmc0_gpio_init.clk_gpio.iomux.name, rksdmmc0_gpio_init.clk_gpio.iomux.fmux);
1036                 rk30_mux_api_set(rksdmmc0_gpio_init.data0_gpio.iomux.name, rksdmmc0_gpio_init.data0_gpio.iomux.fmux);
1037                 #endif
1038
1039             //IO voltage(vccio);
1040             #ifdef RK31SDK_SET_SDMMC0_PIN_VOLTAGE
1041                 if(rk31sdk_get_sdmmc0_pin_io_voltage() > 2700)
1042                     SDMMC_write_grf_reg(GRF_IO_CON4, (SDMMC0_IO_VOLTAGE_MASK |SDMMC0_IO_VOLTAGE_33)); //set SDMMC0 pin to 3.3v
1043                 else
1044                     SDMMC_write_grf_reg(GRF_IO_CON4, (SDMMC0_IO_VOLTAGE_MASK |SDMMC0_IO_VOLTAGE_18));//set SDMMC0 pin to 1.8v
1045             #else
1046             //default set the voltage of SDMMC0 to 3.3V
1047             SDMMC_write_grf_reg(GRF_IO_CON4, (SDMMC0_IO_VOLTAGE_MASK |SDMMC0_IO_VOLTAGE_33));
1048             #endif
1049     
1050             //sdmmc drive strength control
1051             SDMMC_write_grf_reg(GRF_IO_CON2, (SDMMC0_DRIVER_STRENGTH_MASK |SDMMC0_DRIVER_STRENGTH_8MA));
1052             
1053             #if !(!!SDMMC_USE_NEW_IOMUX_API)
1054             rk30_mux_api_set(rksdmmc0_gpio_init.data1_gpio.iomux.name, rksdmmc0_gpio_init.data1_gpio.iomux.fgpio);
1055             #endif
1056             gpio_request(rksdmmc0_gpio_init.data1_gpio.io, "mmc0-data1");
1057             gpio_direction_output(rksdmmc0_gpio_init.data1_gpio.io,GPIO_HIGH);//set mmc0-data1 to high.
1058
1059             #if !(!!SDMMC_USE_NEW_IOMUX_API)
1060             rk30_mux_api_set(rksdmmc0_gpio_init.data2_gpio.iomux.name, rksdmmc0_gpio_init.data2_gpio.iomux.fgpio);
1061             #endif
1062             gpio_request(rksdmmc0_gpio_init.data2_gpio.io, "mmc0-data2");
1063             gpio_direction_output(rksdmmc0_gpio_init.data2_gpio.io,GPIO_HIGH);//set mmc0-data2 to high.
1064
1065             #if !(!!SDMMC_USE_NEW_IOMUX_API)
1066             rk30_mux_api_set(rksdmmc0_gpio_init.data3_gpio.iomux.name, rksdmmc0_gpio_init.data3_gpio.iomux.fgpio);
1067             #endif
1068             gpio_request(rksdmmc0_gpio_init.data3_gpio.io, "mmc0-data3");
1069             gpio_direction_output(rksdmmc0_gpio_init.data3_gpio.io,GPIO_HIGH);//set mmc0-data3 to high.
1070         }
1071         break;
1072         }
1073 }
1074
1075 static void rk29_sdmmc_set_iomux_mmc1(unsigned int bus_width)
1076 {
1077     #if SDMMC_USE_NEW_IOMUX_API
1078     iomux_set(rksdmmc1_gpio_init.cmd_gpio.iomux.fmux);
1079     iomux_set(rksdmmc1_gpio_init.clk_gpio.iomux.fmux);
1080     iomux_set(rksdmmc1_gpio_init.data0_gpio.iomux.fmux);
1081     iomux_set(rksdmmc1_gpio_init.data1_gpio.iomux.fmux);
1082     iomux_set(rksdmmc1_gpio_init.data2_gpio.iomux.fmux);
1083     iomux_set(rksdmmc1_gpio_init.data3_gpio.iomux.fmux);
1084     #else
1085     rk30_mux_api_set(rksdmmc1_gpio_init.cmd_gpio.iomux.name, rksdmmc1_gpio_init.cmd_gpio.iomux.fmux);
1086     rk30_mux_api_set(rksdmmc1_gpio_init.clk_gpio.iomux.name, rksdmmc1_gpio_init.clk_gpio.iomux.fmux);
1087     rk30_mux_api_set(rksdmmc1_gpio_init.data0_gpio.iomux.name, rksdmmc1_gpio_init.data0_gpio.iomux.fmux);
1088     rk30_mux_api_set(rksdmmc1_gpio_init.data1_gpio.iomux.name, rksdmmc1_gpio_init.data1_gpio.iomux.fmux);
1089     rk30_mux_api_set(rksdmmc1_gpio_init.data2_gpio.iomux.name, rksdmmc1_gpio_init.data2_gpio.iomux.fmux);
1090     rk30_mux_api_set(rksdmmc1_gpio_init.data3_gpio.iomux.name, rksdmmc1_gpio_init.data3_gpio.iomux.fmux);
1091     #endif
1092
1093      //IO voltage(vcc-ap0)
1094     if(rk31sdk_wifi_voltage_select())
1095         SDMMC_write_grf_reg(GRF_IO_CON4, (SDMMC1_IO_VOLTAGE_MASK|SDMMC1_IO_VOLTAGE_18));       
1096     else
1097         SDMMC_write_grf_reg(GRF_IO_CON4, (SDMMC1_IO_VOLTAGE_MASK|SDMMC1_IO_VOLTAGE_33));
1098
1099     //sdmmc1 drive strength control
1100     SDMMC_write_grf_reg(GRF_IO_CON3, (SDMMC1_DRIVER_STRENGTH_MASK|SDMMC1_DRIVER_STRENGTH_12MA));
1101     
1102 }
1103
1104 static void rk29_sdmmc_set_iomux_mmc2(unsigned int bus_width)
1105 {
1106     ;//
1107 }
1108
1109 static void rk29_sdmmc_set_iomux(int device_id, unsigned int bus_width)
1110 {
1111     switch(device_id)
1112     {
1113         case 0:
1114             #ifdef CONFIG_SDMMC0_RK29
1115             rk29_sdmmc_set_iomux_mmc0(bus_width);
1116             #endif
1117             break;
1118         case 1:
1119             #ifdef CONFIG_SDMMC1_RK29
1120             rk29_sdmmc_set_iomux_mmc1(bus_width);
1121             #endif
1122             break;
1123         case 2:
1124             rk29_sdmmc_set_iomux_mmc2(bus_width);
1125             break;
1126         default:
1127             break;
1128     }    
1129 }
1130
1131 #endif
1132
1133