rk2928 add phonepad support
[firefly-linux-kernel-4.4.55.git] / arch / arm / mach-rk2928 / board-rk2928-phonepad-sdmmc.c
1 /* arch/arm/mach-rk30/board-rk30-sdk-sdmmc.c
2  *
3  * Copyright (C) 2012 ROCKCHIP, Inc.
4  *
5  * This software is licensed under the terms of the GNU General Public
6  * License version 2, as published by the Free Software Foundation, and
7  * may be copied, distributed, and modified under those terms.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * *
15  * History:
16  * ver1.0 add combo-wifi operateions. such as commit e049351a09c78db8a08aa5c49ce8eba0a3d6824e, at 2012-09-16
17  * ver2.0 Unify all the file versions of board_xxxx_sdmmc.c, at 2012-11-05
18  *
19  * Content:
20  * Part 1: define the gpio for SD-MMC-SDIO-Wifi functions according to your own projects.
21          ***********************************************************************************
22         * Please set the value according to your own project.
23         ***********************************************************************************
24  *
25  * Part 2: define the gpio for the SDMMC controller. Based on the chip datasheet.
26         ***********************************************************************************
27         * Please do not change, each platform has a fixed set.  !!!!!!!!!!!!!!!!!!
28         *  The system personnel will set the value depending on the specific arch datasheet,
29         *  such as RK29XX, RK30XX.
30         * If you have any doubt, please consult BangWang Xie.
31         ***********************************************************************************
32  *
33  *.Part 3: The various operations of the SDMMC-SDIO module
34         ***********************************************************************************
35         * Please do not change, each platform has a fixed set.  !!!!!!!!!!!!!!!!!!
36         * define the varaious operations for SDMMC module
37         * Generally only the author of SDMMC module will modify this section.
38         * If you have any doubt, please consult BangWang Xie.
39         ***********************************************************************************
40  *
41  *.Part 4: The various operations of the Wifi-BT module
42         ***********************************************************************************
43         * Please do not change, each module has a fixed set.  !!!!!!!!!!!!!!!!!!
44         * define the varaious operations for Wifi module
45         * Generally only the author of Wifi module will modify this section.
46         * If you have any doubt, please consult BangWang Xie, Weiguo Hu, and Weilong Gao.
47         ***********************************************************************************
48  *
49  */
50
51 //1.Part 1: define the gpio for SD-MMC-SDIO-Wifi functions  according to your own projects.
52
53 /*************************************************************************
54 * define the gpio for sd-sdio-wifi module
55 *************************************************************************/
56 #if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT)
57 #define SDMMC0_WRITE_PROTECT_PIN                 RK30_PIN3_PB2  //According to your own project to set the value of write-protect-pin.
58 #define SDMMC0_WRITE_PROTECT_ENABLE_VALUE    GPIO_HIGH
59 #endif 
60
61 #if defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT)
62 #define SDMMC1_WRITE_PROTECT_PIN        RK30_PIN3_PB3   //According to your own project to set the value of write-protect-pin.
63 #define SDMMC1_WRITE_PROTECT_ENABLE_VALUE    GPIO_HIGH
64 #endif
65     
66 #if defined(CONFIG_RK29_SDIO_IRQ_FROM_GPIO)
67 #define RK29SDK_WIFI_SDIO_CARD_INT         RK30_PIN3_PD2
68 #endif
69
70 //define the card-detect-pin.
71 #if defined(CONFIG_ARCH_RK29)
72 //refer to file /arch/arm/mach-rk29/include/mach/Iomux.h
73 //define reset-pin
74 #define RK29SDK_SD_CARD_DETECT_N                RK29_PIN2_PA2  //According to your own project to set the value of card-detect-pin.
75 #define RK29SDK_SD_CARD_INSERT_LEVEL            GPIO_LOW         // set the voltage of insert-card. Please pay attention to the default setting.
76 #define RK29SDK_SD_CARD_DETECT_PIN_NAME         GPIO2A2_SDMMC0DETECTN_NAME
77 #define RK29SDK_SD_CARD_DETECT_IOMUX_FGPIO      GPIO2L_GPIO2A2
78 #define RK29SDK_SD_CARD_DETECT_IOMUX_FMUX       GPIO2L_SDMMC0_DETECT_N
79 //define PowerEn-pin
80 #define RK29SDK_SD_CARD_PWR_EN                  RK29_PIN5_PD5  
81 #define RK29SDK_SD_CARD_PWR_EN_LEVEL            GPIO_LOW   
82 #define RK29SDK_SD_CARD_PWR_EN_PIN_NAME         GPIO5D5_SDMMC0PWREN_NAME
83 #define RK29SDK_SD_CARD_PWR_EN_IOMUX_FGPIO      GPIO5H_GPIO5D5
84 #define RK29SDK_SD_CARD_PWR_EN_IOMUX_FMUX       GPIO5H_SDMMC0_PWR_EN
85
86 #elif defined(CONFIG_ARCH_RK3066B)
87 //refer to file /arch/arm/mach-rk30/include/mach/iomux-rk3066b.h
88 //define reset-pin
89 #define RK29SDK_SD_CARD_DETECT_N                RK30_PIN3_PB0  //According to your own project to set the value of card-detect-pin.
90 #define RK29SDK_SD_CARD_INSERT_LEVEL            GPIO_LOW         // set the voltage of insert-card. Please pay attention to the default setting.
91 #define RK29SDK_SD_CARD_DETECT_PIN_NAME         GPIO3B0_SDMMC0DETECTN_NAME
92 #define RK29SDK_SD_CARD_DETECT_IOMUX_FGPIO      GPIO3B_GPIO3B0
93 #define RK29SDK_SD_CARD_DETECT_IOMUX_FMUX       GPIO3B_SDMMC0_DETECT_N
94 //define PowerEn-pin
95 #define RK29SDK_SD_CARD_PWR_EN                  RK30_PIN3_PA1
96 #define RK29SDK_SD_CARD_PWR_EN_LEVEL            GPIO_LOW 
97 #define RK29SDK_SD_CARD_PWR_EN_PIN_NAME         GPIO3A1_SDMMC0PWREN_NAME
98 #define RK29SDK_SD_CARD_PWR_EN_IOMUX_FGPIO      GPIO3A_GPIO3A1
99 #define RK29SDK_SD_CARD_PWR_EN_IOMUX_FMUX       GPIO3A_SDMMC0PWREN
100
101 #elif defined(CONFIG_ARCH_RK30)&& !defined(CONFIG_ARCH_RK3066B) //for RK30,RK3066 SDK
102 //refer to file /arch/arm/mach-rk30/include/mach/Iomux.h
103 //define reset-pin
104 #define RK29SDK_SD_CARD_DETECT_N                RK30_PIN3_PB6  //According to your own project to set the value of card-detect-pin.
105 #define RK29SDK_SD_CARD_INSERT_LEVEL            GPIO_LOW         // set the voltage of insert-card. Please pay attention to the default setting.
106 #define RK29SDK_SD_CARD_DETECT_PIN_NAME         GPIO3B6_SDMMC0DETECTN_NAME
107 #define RK29SDK_SD_CARD_DETECT_IOMUX_FGPIO      GPIO3B_GPIO3B6
108 #define RK29SDK_SD_CARD_DETECT_IOMUX_FMUX       GPIO3B_SDMMC0_DETECT_N
109 //define PowerEn-pin
110 #define RK29SDK_SD_CARD_PWR_EN                  RK30_PIN3_PA7 
111 #define RK29SDK_SD_CARD_PWR_EN_LEVEL            GPIO_LOW
112 #define RK29SDK_SD_CARD_PWR_EN_PIN_NAME         GPIO3A7_SDMMC0PWREN_NAME
113 #define RK29SDK_SD_CARD_PWR_EN_IOMUX_FGPIO      GPIO3A_GPIO3A7
114 #define RK29SDK_SD_CARD_PWR_EN_IOMUX_FMUX       GPIO3A_SDMMC0_PWR_EN
115
116 #elif defined(CONFIG_ARCH_RK2928)
117 //refer to file ./arch/arm/mach-rk2928/include/mach/iomux.h
118 //define reset-pin
119     #if defined(CONFIG_SDMMC0_RK29_SDCARD_DET_FROM_GPIO) && defined(CONFIG_MACH_RK2928_PHONEPAD)                           //for i30 no detect pin
120     //use gpio-interupt to dectec card in RK2926. Please pay attention to modify the default setting.
121     #define RK29SDK_SD_CARD_DETECT_N                INVALID_GPIO  //According to your own project to set the value of card-detect-pin.
122     #define RK29SDK_SD_CARD_INSERT_LEVEL            GPIO_LOW         // set the voltage of insert-card. Please pay attention to the default setting.
123     #define RK29SDK_SD_CARD_DETECT_PIN_NAME         GPIO2A7_NAND_DPS_EMMC_CLKOUT_NAME
124     #define RK29SDK_SD_CARD_DETECT_IOMUX_FGPIO      GPIO2A_GPIO2A7
125     #define RK29SDK_SD_CARD_DETECT_IOMUX_FMUX       GPIO2A_EMMC_CLKOUT
126     #else
127         #define RK29SDK_SD_CARD_DETECT_N                RK2928_PIN1_PC1  //According to your own project to set the value of card-detect-pin.
128     #define RK29SDK_SD_CARD_INSERT_LEVEL            GPIO_LOW         // set the voltage of insert-card. Please pay attention to the default setting.
129     #define RK29SDK_SD_CARD_DETECT_PIN_NAME         GPIO1C1_MMC0_DETN_NAME
130     #define RK29SDK_SD_CARD_DETECT_IOMUX_FGPIO      GPIO1C_GPIO1C1
131     #define RK29SDK_SD_CARD_DETECT_IOMUX_FMUX       GPIO1C_MMC0_DETN
132     #endif
133 //define PowerEn-pin
134     #define RK29SDK_SD_CARD_PWR_EN                  INVALID_GPIO
135     //#define RK29SDK_SD_CARD_PWR_EN                  RK2928_PIN1_PB6
136     #define RK29SDK_SD_CARD_PWR_EN_LEVEL            GPIO_LOW 
137     //#define RK29SDK_SD_CARD_PWR_EN_PIN_NAME         GPIO1B6_MMC0_PWREN_NAME
138     //#define RK29SDK_SD_CARD_PWR_EN_IOMUX_FGPIO      GPIO1B_GPIO1B6
139     //#define RK29SDK_SD_CARD_PWR_EN_IOMUX_FMUX       GPIO1B_MMC0_PWREN
140     #endif
141
142 static void rk29_sdmmc_board_setpower(struct device *dev, char *regulator_supply_name)
143 {
144 #if !defined(RK29SDK_SD_CARD_PWR_EN) || (INVALID_GPIO == RK29SDK_SD_CARD_PWR_EN)
145         memset(regulator_supply_name, 0,4);
146 #else
147     //set the PMU-LDO-supply name to NULL, if you use gpio to control power on-off.
148     memset(regulator_supply_name, 0,4);
149 #endif
150 }
151
152 //
153 // Define wifi module's power and reset gpio, and gpio sensitive level.
154 // Please set the value according to your own project.
155 //
156 #if defined(CONFIG_ARCH_RK30) && !defined(CONFIG_ARCH_RK3066B) //for RK30,RK3066 SDK
157     #define WIFI_HOST_WAKE RK30_PIN3_PD2
158
159     #if defined(CONFIG_RK903) || defined(CONFIG_RK901) || defined(CONFIG_RTL8192CU) || defined(CONFIG_RTL8188EU)
160     //power
161     #define RK30SDK_WIFI_GPIO_POWER_N               RK30_PIN3_PD0            
162     #define RK30SDK_WIFI_GPIO_POWER_ENABLE_VALUE    GPIO_HIGH        
163     //reset
164     #define RK30SDK_WIFI_GPIO_POWER_PIN_NAME        GPIO3D0_SDMMC1PWREN_NAME
165     #define RK30SDK_WIFI_GPIO_POWER_IOMUX_FGPIO     GPIO3D_GPIO3D0
166     
167     #elif defined(CONFIG_BCM4329) || defined(CONFIG_BCM4319) 
168     //power
169     #define RK30SDK_WIFI_GPIO_POWER_N               RK30_PIN3_PD0                 
170     #define RK30SDK_WIFI_GPIO_POWER_ENABLE_VALUE    GPIO_HIGH                   
171     #define RK30SDK_WIFI_GPIO_POWER_PIN_NAME        GPIO3D0_SDMMC1PWREN_NAME
172     #define RK30SDK_WIFI_GPIO_POWER_IOMUX_FGPIO     GPIO3D_GPIO3D0
173     //reset
174     #define RK30SDK_WIFI_GPIO_RESET_N               RK30_PIN3_PD1
175     #define RK30SDK_WIFI_GPIO_RESET_ENABLE_VALUE    GPIO_HIGH 
176     #define RK30SDK_WIFI_GPIO_RESET_PIN_NAME        GPIO3D1_SDMMC1BACKENDPWR_NAME
177     #define RK30SDK_WIFI_GPIO_RESET_IOMUX_FGPIO     GPIO3D_GPIO3D1
178
179     #elif defined(CONFIG_MT6620)
180         #if !defined(CONFIG_USE_SDMMC0_FOR_WIFI_DEVELOP_BOARD)
181             #define USE_SDMMC_CONTROLLER_FOR_WIFI 1
182         
183             #if defined(CONFIG_MACH_RK30_PHONE_PAD)     // define the gpio for MT6620 in RK30_PHONE_PAD project.
184                 #define COMBO_MODULE_MT6620_CDT    0  //- 1--use Cdtech chip; 0--unuse CDT chip
185                 //power, PMU_EN
186                 #define RK30SDK_WIFI_GPIO_POWER_N                   RK30_PIN3_PC7            
187                 #define RK30SDK_WIFI_GPIO_POWER_ENABLE_VALUE        GPIO_HIGH        
188                 #define RK30SDK_WIFI_GPIO_POWER_PIN_NAME            GPIO3C7_SDMMC1WRITEPRT_NAME
189                 #define RK30SDK_WIFI_GPIO_POWER_IOMUX_FGPIO         GPIO3C_GPIO3C7
190                 #define RK30SDK_WIFI_GPIO_POWER_IOMUX_FMUX          GPIO3C_SDMMC1_WRITE_PRT
191                 //reset, DAIRST,SYSRST_B
192                 #define RK30SDK_WIFI_GPIO_RESET_N                   RK30_PIN3_PD1
193                 #define RK30SDK_WIFI_GPIO_RESET_ENABLE_VALUE        GPIO_HIGH 
194                 #define RK30SDK_WIFI_GPIO_RESET_PIN_NAME            GPIO3D1_SDMMC1BACKENDPWR_NAME
195                 #define RK30SDK_WIFI_GPIO_RESET_IOMUX_FGPIO         GPIO3D_GPIO3D1
196                 #define RK30SDK_WIFI_GPIO_RESET_IOMUX_FMUX          GPIO3D_SDMMC1_BACKEND_PWR
197                 //VDDIO
198                 //#define RK30SDK_WIFI_GPIO_VCCIO_WL                 RK30_PIN6_PB4
199                 //#define RK30SDK_WIFI_GPIO_VCCIO_WL_ENABLE_VALUE    GPIO_HIGH       
200                 //WIFI_INT_B
201                 #define RK30SDK_WIFI_GPIO_WIFI_INT_B                RK30_PIN4_PD2
202                 #define RK30SDK_WIFI_GPIO_WIFI_INT_B_ENABLE_VALUE   GPIO_HIGH 
203                 #define RK30SDK_WIFI_GPIO_WIFI_INT_B_PIN_NAME       GPIO4D2_SMCDATA10_TRACEDATA10_NAME
204                 #define RK30SDK_WIFI_GPIO_WIFI_INT_B_IOMUX_FGPIO    GPIO4D_GPIO4D2
205                 #define RK30SDK_WIFI_GPIO_WIFI_INT_B_IOMUX_FMUX     GPIO4D_SMC_DATA10
206                 //BGF_INT_B
207                 #define RK30SDK_WIFI_GPIO_BGF_INT_B                 RK30_PIN6_PA7
208                 #define RK30SDK_WIFI_GPIO_BGF_INT_B_ENABLE_VALUE    GPIO_HIGH 
209                 //#define RK30SDK_WIFI_GPIO_BGF_INT_B_PIN_NAME            GPIO3C6_SDMMC1DETECTN_NAME
210                 //#define RK30SDK_WIFI_GPIO_BGF_INT_B_IOMUX_FGPIO         GPIO3C_GPIO3C6
211                 //#define RK30SDK_WIFI_GPIO_BGF_INT_B_IOMUX_FMUX          GPIO3C_SDMMC1_DETECT_N
212                 //GPS_SYNC
213                 #define RK30SDK_WIFI_GPIO_GPS_SYNC                  RK30_PIN3_PD0
214                 #define RK30SDK_WIFI_GPIO_GPS_SYNC_ENABLE_VALUE     GPIO_HIGH 
215                 #define RK30SDK_WIFI_GPIO_GPS_SYNC_PIN_NAME         GPIO3D0_SDMMC1PWREN_NAME
216                 #define RK30SDK_WIFI_GPIO_GPS_SYNC_IOMUX_FGPIO      GPIO3D_GPIO3D0
217                 #define RK30SDK_WIFI_GPIO_GPS_SYNC_IOMUX_FMUX       GPIO3D_SDMMC1_PWR_EN
218                 
219             #elif defined(CONFIG_MACH_RK3066_M8000R)     // define the gpio for MT6620 in CONFIG_MACH_RK3066_M8000R project.
220                 #define COMBO_MODULE_MT6620_CDT    1  //- 1--use Cdtech chip; 0--unuse CDT chip
221                 //power, PMU_EN
222                 #define RK30SDK_WIFI_GPIO_POWER_N                   RK30_PIN3_PC7            
223                 #define RK30SDK_WIFI_GPIO_POWER_ENABLE_VALUE        GPIO_HIGH        
224                 #define RK30SDK_WIFI_GPIO_POWER_PIN_NAME            GPIO3C7_SDMMC1WRITEPRT_NAME
225                 #define RK30SDK_WIFI_GPIO_POWER_IOMUX_FGPIO         GPIO3C_GPIO3C7
226                 #define RK30SDK_WIFI_GPIO_POWER_IOMUX_FMUX          GPIO3C_SDMMC1_WRITE_PRT
227                 //reset, DAIRST,SYSRST_B
228                 #define RK30SDK_WIFI_GPIO_RESET_N                   RK30_PIN3_PD1
229                 #define RK30SDK_WIFI_GPIO_RESET_ENABLE_VALUE        GPIO_HIGH 
230                 #define RK30SDK_WIFI_GPIO_RESET_PIN_NAME            GPIO3D1_SDMMC1BACKENDPWR_NAME
231                 #define RK30SDK_WIFI_GPIO_RESET_IOMUX_FGPIO         GPIO3D_GPIO3D1
232                 #define RK30SDK_WIFI_GPIO_RESET_IOMUX_FMUX          GPIO3D_SDMMC1_BACKEND_PWR
233                 //VDDIO
234                 #define RK30SDK_WIFI_GPIO_VCCIO_WL                  RK30_PIN0_PD2
235                 #define RK30SDK_WIFI_GPIO_VCCIO_WL_ENABLE_VALUE     GPIO_HIGH
236                 #define RK30SDK_WIFI_GPIO_VCCIO_WL_PIN_NAME         GPIO0D2_I2S22CHLRCKRX_SMCOEN_NAME
237                 #define RK30SDK_WIFI_GPIO_VCCIO_WL_IOMUX_FGPIO      GPIO0D_GPIO0D2
238                 #define RK30SDK_WIFI_GPIO_VCCIO_WL_IOMUX_FMUX       GPIO0D_I2S2_2CH_LRCK_RX
239                 //WIFI_INT_B
240                 #define RK30SDK_WIFI_GPIO_WIFI_INT_B                RK30_PIN3_PD2
241                 #define RK30SDK_WIFI_GPIO_WIFI_INT_B_ENABLE_VALUE   GPIO_HIGH 
242                 #define RK30SDK_WIFI_GPIO_WIFI_INT_B_PIN_NAME       GPIO3D2_SDMMC1INTN_NAME
243                 #define RK30SDK_WIFI_GPIO_WIFI_INT_B_IOMUX_FGPIO    GPIO3D_GPIO3D2
244                 #define RK30SDK_WIFI_GPIO_WIFI_INT_B_IOMUX_FMUX     GPIO3D_SDMMC1_INT_N
245                 //BGF_INT_B
246                 #define RK30SDK_WIFI_GPIO_BGF_INT_B                 RK30_PIN6_PA7
247                 #define RK30SDK_WIFI_GPIO_BGF_INT_B_ENABLE_VALUE    GPIO_HIGH 
248                 //#define RK30SDK_WIFI_GPIO_BGF_INT_B_PIN_NAME        GPIO3C6_SDMMC1DETECTN_NAME
249                 //#define RK30SDK_WIFI_GPIO_BGF_INT_B_IOMUX_FGPIO     GPIO3C_GPIO3C6
250                // #define RK30SDK_WIFI_GPIO_BGF_INT_B_IOMUX_FMUX      GPIO3C_SDMMC1_DETECT_N
251                 //GPS_SYNC
252                 #define RK30SDK_WIFI_GPIO_GPS_SYNC                  RK30_PIN3_PD0
253                 #define RK30SDK_WIFI_GPIO_GPS_SYNC_ENABLE_VALUE     GPIO_HIGH 
254                 #define RK30SDK_WIFI_GPIO_GPS_SYNC_PIN_NAME         GPIO3D0_SDMMC1PWREN_NAME
255                 #define RK30SDK_WIFI_GPIO_GPS_SYNC_IOMUX_FGPIO      GPIO3D_GPIO3D0
256                 #define RK30SDK_WIFI_GPIO_GPS_SYNC_IOMUX_FMUX       GPIO3D_SDMMC1_PWR_EN
257
258                 #if COMBO_MODULE_MT6620_CDT
259                 //ANTSEL2
260                 //#define RK30SDK_WIFI_GPIO_ANTSEL2                   RK30_PIN4_PD4
261                 //#define RK30SDK_WIFI_GPIO_ANTSEL2_ENABLE_VALUE      GPIO_LOW    //use 6620 in CDT chip, LOW--work; High--no work.
262                 //#define RK30SDK_WIFI_GPIO_ANTSEL2_PIN_NAME          GPIO4D4_SMCDATA12_TRACEDATA12_NAME
263                 //#define RK30SDK_WIFI_GPIO_ANTSEL2_IOMUX_FGPIO       GPIO4D_GPIO4D4
264                 //#define RK30SDK_WIFI_GPIO_ANTSEL2_IOMUX_FMUX        GPIO4D_TRACE_DATA12
265                 //ANTSEL3
266                 //#define RK30SDK_WIFI_GPIO_ANTSEL3                   RK30_PIN4_PD3
267                 //#define RK30SDK_WIFI_GPIO_ANTSEL3_ENABLE_VALUE      GPIO_HIGH    //use 6620 in CDT chip, High--work; Low--no work..
268                 //#define RK30SDK_WIFI_GPIO_ANTSEL3_PIN_NAME          GPIO4D3_SMCDATA11_TRACEDATA11_NAME
269                 //#define RK30SDK_WIFI_GPIO_ANTSEL3_IOMUX_FGPIO       GPIO4D_GPIO4D3
270                 //#define RK30SDK_WIFI_GPIO_ANTSEL3_IOMUX_FMUX        GPIO4D_TRACE_DATA11
271                 //GPS_LAN
272                 //#define RK30SDK_WIFI_GPIO_GPS_LAN                   RK30_PIN4_PD6
273                 //#define RK30SDK_WIFI_GPIO_GPS_LAN_ENABLE_VALUE      GPIO_HIGH    //use 6620 in CDT chip, High--work; Low--no work..
274                 //#define RK30SDK_WIFI_GPIO_GPS_LAN_PIN_NAME          GPIO4D6_SMCDATA14_TRACEDATA14_NAME
275                 //#define RK30SDK_WIFI_GPIO_GPS_LAN_IOMUX_FGPIO       GPIO4D_GPIO4D6
276                 //#define RK30SDK_WIFI_GPIO_GPS_LAN_IOMUX_FMUX        GPIO4D_TRACE_DATA14
277                 #endif // #if COMBO_MODULE_MT6620_CDT--#endif
278                 
279             #elif defined(CONFIG_MACH_SKYWORTH_T10_SDK)     // define the gpio for MT6620 in KYWORTH_T10 project.
280                 #define COMBO_MODULE_MT6620_CDT    0  //- 1--use Cdtech chip; 0--unuse CDT chip
281                 //power, PMU_EN
282                 #define RK30SDK_WIFI_GPIO_POWER_N                   RK30_PIN3_PD0            
283                 #define RK30SDK_WIFI_GPIO_POWER_ENABLE_VALUE        GPIO_HIGH        
284                 #define RK30SDK_WIFI_GPIO_POWER_PIN_NAME            GPIO3D0_SDMMC1PWREN_NAME
285                 #define RK30SDK_WIFI_GPIO_POWER_IOMUX_FGPIO         GPIO3D_GPIO3D0
286                 #define RK30SDK_WIFI_GPIO_POWER_IOMUX_FMUX          GPIO3D_SDMMC1_PWR_EN
287                 //reset, DAIRST,SYSRST_B
288                 #define RK30SDK_WIFI_GPIO_RESET_N                   RK30_PIN3_PD1
289                 #define RK30SDK_WIFI_GPIO_RESET_ENABLE_VALUE        GPIO_HIGH 
290                 #define RK30SDK_WIFI_GPIO_RESET_PIN_NAME            GPIO3D1_SDMMC1BACKENDPWR_NAME
291                 #define RK30SDK_WIFI_GPIO_RESET_IOMUX_FGPIO         GPIO3D_GPIO3D1
292                 #define RK30SDK_WIFI_GPIO_RESET_IOMUX_FMUX          GPIO3D_SDMMC1_BACKEND_PWR
293                 //VDDIO
294                 //#define RK30SDK_WIFI_GPIO_VCCIO_WL                 RK30_PIN6_PB4
295                 //#define RK30SDK_WIFI_GPIO_VCCIO_WL_ENABLE_VALUE    GPIO_HIGH       
296                 //WIFI_INT_B
297                 #define RK30SDK_WIFI_GPIO_WIFI_INT_B                RK30_PIN3_PD2
298                 #define RK30SDK_WIFI_GPIO_WIFI_INT_B_ENABLE_VALUE   GPIO_HIGH 
299                 #define RK30SDK_WIFI_GPIO_WIFI_INT_B_PIN_NAME       GPIO3D2_SDMMC1INTN_NAME
300                 #define RK30SDK_WIFI_GPIO_WIFI_INT_B_IOMUX_FGPIO    GPIO3D_GPIO3D2
301                 #define RK30SDK_WIFI_GPIO_WIFI_INT_B_IOMUX_FMUX     GPIO3D_SDMMC1_INT_N
302                 //BGF_INT_B
303                 #define RK30SDK_WIFI_GPIO_BGF_INT_B                 RK30_PIN3_PC6
304                 #define RK30SDK_WIFI_GPIO_BGF_INT_B_ENABLE_VALUE    GPIO_HIGH 
305                 #define RK30SDK_WIFI_GPIO_BGF_INT_B_PIN_NAME        GPIO3C6_SDMMC1DETECTN_NAME
306                 #define RK30SDK_WIFI_GPIO_BGF_INT_B_IOMUX_FGPIO     GPIO3C_GPIO3C6
307                 #define RK30SDK_WIFI_GPIO_BGF_INT_B_IOMUX_FMUX      GPIO3C_SDMMC1_DETECT_N
308                 //GPS_SYNC
309                 #define RK30SDK_WIFI_GPIO_GPS_SYNC                  RK30_PIN3_PC7
310                 #define RK30SDK_WIFI_GPIO_GPS_SYNC_ENABLE_VALUE     GPIO_HIGH 
311                 #define RK30SDK_WIFI_GPIO_GPS_SYNC_PIN_NAME         GPIO3C7_SDMMC1WRITEPRT_NAME
312                 #define RK30SDK_WIFI_GPIO_GPS_SYNC_IOMUX_FGPIO      GPIO3C_GPIO3C7
313                 #define RK30SDK_WIFI_GPIO_GPS_SYNC_IOMUX_FMUX       GPIO3C_SDMMC1_WRITE_PRT    
314             
315             #else //For exmpale, to define the gpio for MT6620 in RK30SDK project.
316                 #define COMBO_MODULE_MT6620_CDT    1  //- 1--use Cdtech chip; 0--unuse CDT chip
317                 //power
318                 #define RK30SDK_WIFI_GPIO_POWER_N                   RK30_PIN3_PD0            
319                 #define RK30SDK_WIFI_GPIO_POWER_ENABLE_VALUE        GPIO_HIGH        
320                 #define RK30SDK_WIFI_GPIO_POWER_PIN_NAME            GPIO3D0_SDMMC1PWREN_NAME
321                 #define RK30SDK_WIFI_GPIO_POWER_IOMUX_FGPIO         GPIO3D_GPIO3D0
322                 #define RK30SDK_WIFI_GPIO_POWER_IOMUX_FMUX          GPIO3D_SDMMC1_PWR_EN
323                 //reset
324                 #define RK30SDK_WIFI_GPIO_RESET_N                   RK30_PIN3_PD1
325                 #define RK30SDK_WIFI_GPIO_RESET_ENABLE_VALUE        GPIO_HIGH 
326                 #define RK30SDK_WIFI_GPIO_RESET_PIN_NAME            GPIO3D1_SDMMC1BACKENDPWR_NAME
327                 #define RK30SDK_WIFI_GPIO_RESET_IOMUX_FGPIO         GPIO3D_GPIO3D1
328                 #define RK30SDK_WIFI_GPIO_RESET_IOMUX_FMUX          GPIO3D_SDMMC1_BACKEND_PWR
329                 //VDDIO
330                 //#define RK30SDK_WIFI_GPIO_VCCIO_WL                  RK30_PIN0_PD2
331                 //#define RK30SDK_WIFI_GPIO_VCCIO_WL_ENABLE_VALUE     GPIO_HIGH
332                 //#define RK30SDK_WIFI_GPIO_VCCIO_WL_PIN_NAME         GPIO0D2_I2S22CHLRCKRX_SMCOEN_NAME
333                 //#define RK30SDK_WIFI_GPIO_VCCIO_WL_IOMUX_FGPIO      GPIO0D_GPIO0D2
334                 //#define RK30SDK_WIFI_GPIO_VCCIO_WL_IOMUX_FMUX       GPIO0D_I2S2_2CH_LRCK_RX       
335                 //WIFI_INT_B
336                 #define RK30SDK_WIFI_GPIO_WIFI_INT_B                RK30_PIN3_PD2
337                 #define RK30SDK_WIFI_GPIO_WIFI_INT_B_ENABLE_VALUE   GPIO_HIGH 
338                 #define RK30SDK_WIFI_GPIO_WIFI_INT_B_PIN_NAME       GPIO3D2_SDMMC1INTN_NAME
339                 #define RK30SDK_WIFI_GPIO_WIFI_INT_B_IOMUX_FGPIO    GPIO3D_GPIO3D2
340                 #define RK30SDK_WIFI_GPIO_WIFI_INT_B_IOMUX_FMUX     GPIO3D_SDMMC1_INT_N
341                 //BGF_INT_B
342                 #define RK30SDK_WIFI_GPIO_BGF_INT_B                 RK30_PIN3_PC6
343                 #define RK30SDK_WIFI_GPIO_BGF_INT_B_ENABLE_VALUE    GPIO_HIGH 
344                 #define RK30SDK_WIFI_GPIO_BGF_INT_B_PIN_NAME        GPIO3C6_SDMMC1DETECTN_NAME
345                 #define RK30SDK_WIFI_GPIO_BGF_INT_B_IOMUX_FGPIO     GPIO3C_GPIO3C6
346                 #define RK30SDK_WIFI_GPIO_BGF_INT_B_IOMUX_FMUX      GPIO3C_SDMMC1_DETECT_N
347                 //GPS_SYNC
348                 #define RK30SDK_WIFI_GPIO_GPS_SYNC                  RK30_PIN3_PC7
349                 #define RK30SDK_WIFI_GPIO_GPS_SYNC_ENABLE_VALUE     GPIO_HIGH 
350                 #define RK30SDK_WIFI_GPIO_GPS_SYNC_PIN_NAME         GPIO3C7_SDMMC1WRITEPRT_NAME
351                 #define RK30SDK_WIFI_GPIO_GPS_SYNC_IOMUX_FGPIO      GPIO3C_GPIO3C7
352                 #define RK30SDK_WIFI_GPIO_GPS_SYNC_IOMUX_FMUX       GPIO3C_SDMMC1_WRITE_PRT
353
354                 #if COMBO_MODULE_MT6620_CDT
355                 //ANTSEL2
356                 #define RK30SDK_WIFI_GPIO_ANTSEL2                   RK30_PIN4_PD4
357                 #define RK30SDK_WIFI_GPIO_ANTSEL2_ENABLE_VALUE      GPIO_LOW    //use 6620 in CDT chip, LOW--work; High--no work.
358                 #define RK30SDK_WIFI_GPIO_ANTSEL2_PIN_NAME          GPIO4D4_SMCDATA12_TRACEDATA12_NAME
359                 #define RK30SDK_WIFI_GPIO_ANTSEL2_IOMUX_FGPIO       GPIO4D_GPIO4D4
360                 #define RK30SDK_WIFI_GPIO_ANTSEL2_IOMUX_FMUX        GPIO4D_TRACE_DATA12
361                 //ANTSEL3
362                 #define RK30SDK_WIFI_GPIO_ANTSEL3                   RK30_PIN4_PD3
363                 #define RK30SDK_WIFI_GPIO_ANTSEL3_ENABLE_VALUE      GPIO_HIGH    //use 6620 in CDT chip, High--work; Low--no work..
364                 #define RK30SDK_WIFI_GPIO_ANTSEL3_PIN_NAME          GPIO4D3_SMCDATA11_TRACEDATA11_NAME
365                 #define RK30SDK_WIFI_GPIO_ANTSEL3_IOMUX_FGPIO       GPIO4D_GPIO4D3
366                 #define RK30SDK_WIFI_GPIO_ANTSEL3_IOMUX_FMUX        GPIO4D_TRACE_DATA11
367                 //GPS_LAN
368                 #define RK30SDK_WIFI_GPIO_GPS_LAN                   RK30_PIN4_PD6
369                 #define RK30SDK_WIFI_GPIO_GPS_LAN_ENABLE_VALUE      GPIO_HIGH    //use 6620 in CDT chip, High--work; Low--no work..
370                 #define RK30SDK_WIFI_GPIO_GPS_LAN_PIN_NAME          GPIO4D6_SMCDATA14_TRACEDATA14_NAME
371                 #define RK30SDK_WIFI_GPIO_GPS_LAN_IOMUX_FGPIO       GPIO4D_GPIO4D6
372                 //#define RK30SDK_WIFI_GPIO_GPS_LAN_IOMUX_FMUX        GPIO4D_TRACE_DATA14
373                 #endif // #if COMBO_MODULE_MT6620_CDT--#endif
374             #endif
375         #endif// #endif --#if !defined(CONFIG_USE_SDMMC0_FOR_WIFI_DEVELOP_BOARD)
376     #endif 
377 #elif defined(CONFIG_ARCH_RK3066B)//refer to file /arch/arm/mach-rk30/include/mach/iomux-rk3066b.h
378     #define WIFI_HOST_WAKE RK30_PIN3_PD2
379      
380     #if defined(CONFIG_RTL8192CU) || defined(CONFIG_RTL8188EU) 
381         #define RK30SDK_WIFI_GPIO_POWER_N               RK30_PIN3_PD0            
382         #define RK30SDK_WIFI_GPIO_POWER_ENABLE_VALUE    GPIO_HIGH        
383         #define RK30SDK_WIFI_GPIO_POWER_PIN_NAME        GPIO3D0_SDMMC1PWREN_MIIMD_NAME
384         #define RK30SDK_WIFI_GPIO_POWER_IOMUX_FGPIO     GPIO3D_GPIO3D0
385         
386     #elif defined(CONFIG_BCM4329) || defined(CONFIG_BCM4319) || defined(CONFIG_RK903) || defined(CONFIG_RK901)
387         #define RK30SDK_WIFI_GPIO_POWER_N               RK30_PIN3_PD0                 
388         #define RK30SDK_WIFI_GPIO_POWER_ENABLE_VALUE    GPIO_HIGH                   
389         #define RK30SDK_WIFI_GPIO_POWER_PIN_NAME        GPIO3D0_SDMMC1PWREN_MIIMD_NAME
390         #define RK30SDK_WIFI_GPIO_POWER_IOMUX_FGPIO     GPIO3D_GPIO3D0
391
392         #define RK30SDK_WIFI_GPIO_RESET_N               RK30_PIN2_PA7
393         #define RK30SDK_WIFI_GPIO_RESET_ENABLE_VALUE    GPIO_HIGH 
394         #define RK30SDK_WIFI_GPIO_RESET_PIN_NAME        GPIO2A7_LCDC1DATA7_SMCDATA7_TRACEDATA7_NAME
395         #define RK30SDK_WIFI_GPIO_RESET_IOMUX_FGPIO     GPIO2A_GPIO2A7
396     #endif   
397 #elif defined(CONFIG_ARCH_RK2928) //refer to file ./arch/arm/mach-rk2928/include/mach/iomux.h
398 #define WIFI_HOST_WAKE RK2928_PIN3_PC0 
399
400         #if defined(CONFIG_RK903) || defined(CONFIG_RK901) || defined(CONFIG_BCM4329) || defined(CONFIG_BCM4319)
401         #define RK30SDK_WIFI_GPIO_POWER_N               RK2928_PIN0_PD6
402         #define RK30SDK_WIFI_GPIO_POWER_ENABLE_VALUE    GPIO_HIGH
403         #define RK30SDK_WIFI_GPIO_POWER_PIN_NAME        GPIO0D6_MMC1_PWREN_NAME
404         #define RK30SDK_WIFI_GPIO_POWER_IOMUX_FGPIO     GPIO0D_GPIO0D6
405
406         #define RK30SDK_WIFI_GPIO_RESET_N               RK2928_PIN3_PC2
407         #define RK30SDK_WIFI_GPIO_RESET_ENABLE_VALUE    GPIO_HIGH
408         #define RK30SDK_WIFI_GPIO_RESET_PIN_NAME        GPIO3C2_SDMMC1DATA1_NAME
409         #define RK30SDK_WIFI_GPIO_RESET_IOMUX_FGPIO     GPIO3C_GPIO3C2
410         
411     #elif  defined(CONFIG_RDA5990)
412         #define RK30SDK_WIFI_GPIO_POWER_N               INVALID_GPIO
413         #define RK30SDK_WIFI_GPIO_POWER_ENABLE_VALUE    GPIO_HIGH
414         //#define RK30SDK_WIFI_GPIO_POWER_PIN_NAME        GPIO0B6_MMC1_PWREN_NAME
415         //#define RK30SDK_WIFI_GPIO_POWER_IOMUX_FGPIO     GPIO0B_GPIO0B6
416         
417         #define RK30SDK_WIFI_GPIO_RESET_N               INVALID_GPIO
418         #define RK30SDK_WIFI_GPIO_RESET_ENABLE_VALUE    GPIO_HIGH
419         //#define RK30SDK_WIFI_GPIO_RESET_PIN_NAME        GPIO3C2_SDMMC1DATA1_NAME
420         //#define RK30SDK_WIFI_GPIO_RESET_IOMUX_FGPIO     GPIO3C_GPIO3C2
421
422
423     #elif defined(CONFIG_RTL8192CU) || defined(CONFIG_RTL8188EU) || defined(CONFIG_RT5370)
424       #if defined(CONFIG_MACH_RK2926_V86)
425         #define CONFIG_USB_WIFI_POWER_CONTROLED_BY_GPIO
426         #define RK30SDK_WIFI_GPIO_POWER_N               RK2928_PIN0_PD3
427         #define RK30SDK_WIFI_GPIO_POWER_ENABLE_VALUE    GPIO_LOW 
428       #elif defined(CONFIG_MACH_RK2928_TR726)
429         #define CONFIG_USB_WIFI_POWER_CONTROLED_BY_GPIO
430         #define RK30SDK_WIFI_GPIO_POWER_N               RK2928_PIN3_PD3
431         #define RK30SDK_WIFI_GPIO_POWER_ENABLE_VALUE    GPIO_LOW 
432       #else
433         #define RK30SDK_WIFI_GPIO_POWER_N               RK2928_PIN0_PD6
434         #define RK30SDK_WIFI_GPIO_POWER_ENABLE_VALUE    GPIO_LOW 
435       #endif
436         
437     #elif defined(CONFIG_MT5931) || defined(CONFIG_MT5931_MT6622)
438         #define RK30SDK_WIFI_GPIO_POWER_N               RK2928_PIN3_PD2
439         #define RK30SDK_WIFI_GPIO_POWER_ENABLE_VALUE    GPIO_HIGH 
440         
441         #define RK30SDK_WIFI_GPIO_RESET_N               RK2928_PIN3_PD5
442         #define RK30SDK_WIFI_GPIO_RESET_ENABLE_VALUE    GPIO_HIGH 
443
444     #endif
445 #endif
446
447     
448 //1. Part 2: to define the gpio for the SDMMC controller. Based on the chip datasheet.
449 /*************************************************************************
450 * define the gpio for SDMMC module on various platforms
451 * Generally only system personnel will modify this part
452 *************************************************************************/
453
454 #if defined(CONFIG_ARCH_RK30)&& !defined(CONFIG_ARCH_RK3066B)//for RK30,RK3066 SDK
455 /*
456 * define the gpio for sdmmc0
457 */
458 struct rksdmmc_gpio_board rksdmmc0_gpio_init = {
459
460      .clk_gpio       = {
461         .io             = RK30_PIN3_PB0,
462         .enable         = GPIO_HIGH,
463         .iomux          = {
464             .name       = GPIO3B0_SDMMC0CLKOUT_NAME,
465             .fgpio      = GPIO3B_GPIO3B0,
466             .fmux       = GPIO3B_SDMMC0_CLKOUT,
467         },
468     },   
469
470     .cmd_gpio           = {
471         .io             = RK30_PIN3_PB1,
472         .enable         = GPIO_HIGH,
473         .iomux          = {
474             .name       = GPIO3B1_SDMMC0CMD_NAME,
475             .fgpio      = GPIO3B_GPIO3B1,
476             .fmux       = GPIO3B_SDMMC0_CMD,
477         },
478     },      
479
480    .data0_gpio       = {
481         .io             = RK30_PIN3_PB2,
482         .enable         = GPIO_HIGH,
483         .iomux          = {
484             .name       = GPIO3B2_SDMMC0DATA0_NAME,
485             .fgpio      = GPIO3B_GPIO3B2,
486             .fmux       = GPIO3B_SDMMC0_DATA0,
487         },
488     },      
489
490     .data1_gpio       = {
491         .io             = RK30_PIN3_PB3,
492         .enable         = GPIO_HIGH,
493         .iomux          = {
494             .name       = GPIO3B3_SDMMC0DATA1_NAME,
495             .fgpio      = GPIO3B_GPIO3B3,
496             .fmux       = GPIO3B_SDMMC0_DATA1,
497         },
498     },      
499
500     .data2_gpio       = {
501         .io             = RK30_PIN3_PB4,
502         .enable         = GPIO_HIGH,
503         .iomux          = {
504             .name       = GPIO3B4_SDMMC0DATA2_NAME,
505             .fgpio      = GPIO3B_GPIO3B4,
506             .fmux       = GPIO3B_SDMMC0_DATA2,
507         },
508     }, 
509
510     .data3_gpio       = {
511         .io             = RK30_PIN3_PB5,
512         .enable         = GPIO_HIGH,
513         .iomux          = {
514             .name       = GPIO3B5_SDMMC0DATA3_NAME,
515             .fgpio      = GPIO3B_GPIO3B5,
516             .fmux       = GPIO3B_SDMMC0_DATA3,
517         },
518     }, 
519     
520     .power_en_gpio      = {   
521 #if defined(RK29SDK_SD_CARD_PWR_EN) || (INVALID_GPIO != RK29SDK_SD_CARD_PWR_EN)
522         .io             = RK29SDK_SD_CARD_PWR_EN,
523         .enable         = RK29SDK_SD_CARD_PWR_EN_LEVEL,
524         #ifdef RK29SDK_SD_CARD_PWR_EN_PIN_NAME
525         .iomux          = {
526             .name       = RK29SDK_SD_CARD_PWR_EN_PIN_NAME,
527             #ifdef RK29SDK_SD_CARD_PWR_EN_IOMUX_FGPIO
528             .fgpio      = RK29SDK_SD_CARD_PWR_EN_IOMUX_FGPIO,
529             #endif
530             #ifdef RK29SDK_SD_CARD_PWR_EN_IOMUX_FMUX
531             .fmux       = RK29SDK_SD_CARD_PWR_EN_IOMUX_FMUX,
532             #endif
533         },
534         #endif
535 #else
536         .io             = INVALID_GPIO,
537         .enable         = GPIO_LOW,
538 #endif
539     }, 
540
541     .detect_irq       = {
542 #if defined(RK29SDK_SD_CARD_DETECT_N) || (INVALID_GPIO != RK29SDK_SD_CARD_DETECT_N)  
543         .io             = RK29SDK_SD_CARD_DETECT_N,
544         .enable         = RK29SDK_SD_CARD_INSERT_LEVEL,
545         #ifdef RK29SDK_SD_CARD_DETECT_PIN_NAME
546         .iomux          = {
547             .name       = RK29SDK_SD_CARD_DETECT_PIN_NAME,
548             #ifdef RK29SDK_SD_CARD_DETECT_IOMUX_FGPIO
549             .fgpio      = RK29SDK_SD_CARD_DETECT_IOMUX_FGPIO,
550             #endif
551             #ifdef RK29SDK_SD_CARD_DETECT_IOMUX_FMUX
552             .fmux       = RK29SDK_SD_CARD_DETECT_IOMUX_FMUX,
553             #endif
554         },
555         #endif
556 #else
557         .io             = INVALID_GPIO,
558         .enable         = GPIO_LOW,
559 #endif            
560     },
561 };
562
563
564 /*
565 * define the gpio for sdmmc1
566 */
567 static struct rksdmmc_gpio_board rksdmmc1_gpio_init = {
568
569      .clk_gpio       = {
570         .io             = RK30_PIN3_PC5,
571         .enable         = GPIO_HIGH,
572         .iomux          = {
573             .name       = GPIO3C5_SDMMC1CLKOUT_NAME,
574             .fgpio      = GPIO3C_GPIO3C5,
575             .fmux       = GPIO3B_SDMMC0_CLKOUT,
576         },
577     },   
578
579     .cmd_gpio           = {
580         .io             = RK30_PIN3_PC0,
581         .enable         = GPIO_HIGH,
582         .iomux          = {
583             .name       = GPIO3C0_SMMC1CMD_NAME,
584             .fgpio      = GPIO3C_GPIO3C0,
585             .fmux       = GPIO3B_SDMMC0_CMD,
586         },
587     },      
588
589    .data0_gpio       = {
590         .io             = RK30_PIN3_PC1,
591         .enable         = GPIO_HIGH,
592         .iomux          = {
593             .name       = GPIO3C1_SDMMC1DATA0_NAME,
594             .fgpio      = GPIO3C_GPIO3C1,
595             .fmux       = GPIO3B_SDMMC0_DATA0,
596         },
597     },      
598
599     .data1_gpio       = {
600         .io             = RK30_PIN3_PC2,
601         .enable         = GPIO_HIGH,
602         .iomux          = {
603             .name       = GPIO3C2_SDMMC1DATA1_NAME,
604             .fgpio      = GPIO3C_GPIO3C2,
605             .fmux       = GPIO3B_SDMMC0_DATA1,
606         },
607     },      
608
609     .data2_gpio       = {
610         .io             = RK30_PIN3_PC3,
611         .enable         = GPIO_HIGH,
612         .iomux          = {
613             .name       = GPIO3C3_SDMMC1DATA2_NAME,
614             .fgpio      = GPIO3C_GPIO3C3,
615             .fmux       = GPIO3B_SDMMC0_DATA2,
616         },
617     }, 
618
619     .data3_gpio       = {
620         .io             = RK30_PIN3_PC4,
621         .enable         = GPIO_HIGH,
622         .iomux          = {
623             .name       = GPIO3C4_SDMMC1DATA3_NAME,
624             .fgpio      = GPIO3C_GPIO3C4,
625             .fmux       = GPIO3B_SDMMC0_DATA3,
626         },
627     }, 
628 };
629  // ---end -#if defined(CONFIG_ARCH_RK30)
630
631 #elif defined(CONFIG_ARCH_RK3066B)
632
633 /*
634 * define the gpio for sdmmc0
635 */
636 static struct rksdmmc_gpio_board rksdmmc0_gpio_init = {
637
638      .clk_gpio       = {
639         .io             = RK30_PIN3_PB0,
640         .enable         = GPIO_HIGH,
641         .iomux          = {
642             .name       = GPIO3A2_SDMMC0CLKOUT_NAME,
643             .fgpio      = GPIO3A_GPIO3A2,
644             .fmux       = GPIO3A_SDMMC0CLKOUT,
645         },
646     },   
647
648     .cmd_gpio           = {
649         .io             = RK30_PIN3_PB1,
650         .enable         = GPIO_HIGH,
651         .iomux          = {
652             .name       = GPIO3A3_SDMMC0CMD_NAME,
653             .fgpio      = GPIO3A_GPIO3A3,
654             .fmux       = GPIO3A_SDMMC0CMD,
655         },
656     },      
657
658    .data0_gpio       = {
659         .io             = RK30_PIN3_PB2,
660         .enable         = GPIO_HIGH,
661         .iomux          = {
662             .name       = GPIO3A4_SDMMC0DATA0_NAME,
663             .fgpio      = GPIO3A_GPIO3A4,
664             .fmux       = GPIO3A_SDMMC0DATA0,
665         },
666     },      
667
668     .data1_gpio       = {
669         .io             = RK30_PIN3_PB3,
670         .enable         = GPIO_HIGH,
671         .iomux          = {
672             .name       = GPIO3A5_SDMMC0DATA1_NAME,
673             .fgpio      = GPIO3A_GPIO3A5,
674             .fmux       = GPIO3A_SDMMC0DATA1,
675         },
676     },      
677
678     .data2_gpio       = {
679         .io             = RK30_PIN3_PB4,
680         .enable         = GPIO_HIGH,
681         .iomux          = {
682             .name       = GPIO3A6_SDMMC0DATA2_NAME,
683             .fgpio      = GPIO3A_GPIO3A6,
684             .fmux       = GPIO3A_SDMMC0DATA2,
685         },
686     }, 
687
688     .data3_gpio       = {
689         .io             = RK30_PIN3_PB5,
690         .enable         = GPIO_HIGH,
691         .iomux          = {
692             .name       = GPIO3A7_SDMMC0DATA3_NAME,
693             .fgpio      = GPIO3A_GPIO3A7,
694             .fmux       = GPIO3A_SDMMC0DATA3,
695         },
696     }, 
697
698                
699     .power_en_gpio      = {   
700 #if defined(RK29SDK_SD_CARD_PWR_EN) || (INVALID_GPIO != RK29SDK_SD_CARD_PWR_EN)
701                     .io             = RK29SDK_SD_CARD_PWR_EN,
702                     .enable         = RK29SDK_SD_CARD_PWR_EN_LEVEL,
703         #ifdef RK29SDK_SD_CARD_PWR_EN_PIN_NAME
704                     .iomux          = {
705                         .name       = RK29SDK_SD_CARD_PWR_EN_PIN_NAME,
706             #ifdef RK29SDK_SD_CARD_PWR_EN_IOMUX_FGPIO
707                         .fgpio      = RK29SDK_SD_CARD_PWR_EN_IOMUX_FGPIO,
708             #endif
709             #ifdef RK29SDK_SD_CARD_PWR_EN_IOMUX_FMUX
710                         .fmux       = RK29SDK_SD_CARD_PWR_EN_IOMUX_FMUX,
711             #endif
712                     },
713         #endif
714 #else
715                     .io             = INVALID_GPIO,
716                     .enable         = GPIO_LOW,
717 #endif
718                 }, 
719             
720         .detect_irq       = {
721 #if defined(RK29SDK_SD_CARD_DETECT_N) || (INVALID_GPIO != RK29SDK_SD_CARD_DETECT_N)  
722                     .io             = RK29SDK_SD_CARD_DETECT_N,
723                     .enable         = RK29SDK_SD_CARD_INSERT_LEVEL,
724         #ifdef RK29SDK_SD_CARD_DETECT_PIN_NAME
725                     .iomux          = {
726                         .name       = RK29SDK_SD_CARD_DETECT_PIN_NAME,
727             #ifdef RK29SDK_SD_CARD_DETECT_IOMUX_FGPIO
728                         .fgpio      = RK29SDK_SD_CARD_DETECT_IOMUX_FGPIO,
729             #endif
730             #ifdef RK29SDK_SD_CARD_DETECT_IOMUX_FMUX
731                         .fmux       = RK29SDK_SD_CARD_DETECT_IOMUX_FMUX,
732             #endif
733                     },
734         #endif
735 #else
736                     .io             = INVALID_GPIO,
737                     .enable         = GPIO_LOW,
738 #endif            
739     },
740
741 };
742
743
744 /*
745 * define the gpio for sdmmc1
746 */
747 static struct rksdmmc_gpio_board rksdmmc1_gpio_init = {
748
749      .clk_gpio       = {
750         .io             = RK30_PIN3_PC5,
751         .enable         = GPIO_HIGH,
752         .iomux          = {
753             .name       = GPIO3C5_SDMMC1CLKOUT_RMIICLKOUT_RMIICLKIN_NAME,
754             .fgpio      = GPIO3C_GPIO3C5,
755             .fmux       = GPIO3C_SDMMC1CLKOUT,
756         },
757     },   
758
759     .cmd_gpio           = {
760         .io             = RK30_PIN3_PC0,
761         .enable         = GPIO_HIGH,
762         .iomux          = {
763             .name       = GPIO3C0_SDMMC1CMD_RMIITXEN_NAME,
764             .fgpio      = GPIO3C_GPIO3C0,
765             .fmux       = GPIO3C_SDMMC1CMD,
766         },
767     },      
768
769    .data0_gpio       = {
770         .io             = RK30_PIN3_PC1,
771         .enable         = GPIO_HIGH,
772         .iomux          = {
773             .name       = GPIO3C1_SDMMC1DATA0_RMIITXD1_NAME,
774             .fgpio      = GPIO3C_GPIO3C1,
775             .fmux       = GPIO3C_SDMMC1DATA0,
776         },
777     },      
778
779     .data1_gpio       = {
780         .io             = RK30_PIN3_PC2,
781         .enable         = GPIO_HIGH,
782         .iomux          = {
783             .name       = GPIO3C2_SDMMC1DATA1_RMIITXD0_NAME,
784             .fgpio      = GPIO3C_GPIO3C2,
785             .fmux       = GPIO3C_SDMMC1DATA1,
786         },
787     },      
788
789     .data2_gpio       = {
790         .io             = RK30_PIN3_PC3,
791         .enable         = GPIO_HIGH,
792         .iomux          = {
793             .name       = GPIO3C3_SDMMC1DATA2_RMIIRXD0_NAME,
794             .fgpio      = GPIO3C_GPIO3C3,
795             .fmux       = GPIO3C_SDMMC1DATA2,
796         },
797     }, 
798
799     .data3_gpio       = {
800         .io             = RK30_PIN3_PC4,
801         .enable         = GPIO_HIGH,
802         .iomux          = {
803             .name       = GPIO3C4_SDMMC1DATA3_RMIIRXD1_NAME,
804             .fgpio      = GPIO3C_GPIO3C4,
805             .fmux       = GPIO3C_SDMMC1DATA3,
806         },
807     }, 
808 };
809 // ---end -#if defined(CONFIG_ARCH_RK3066B)
810
811 #elif defined(CONFIG_ARCH_RK2928)
812 /*
813 * define the gpio for sdmmc0
814 */
815 static struct rksdmmc_gpio_board rksdmmc0_gpio_init = {
816
817      .clk_gpio       = {
818         .io             = RK2928_PIN1_PC0,
819         .enable         = GPIO_HIGH,
820         .iomux          = {
821             .name       = GPIO1C0_MMC0_CLKOUT_NAME,
822             .fgpio      = GPIO1C_GPIO1C0,
823             .fmux       = GPIO1C_MMC0_CLKOUT,
824         },
825     },   
826
827     .cmd_gpio           = {
828         .io             = RK2928_PIN1_PC7,
829         .enable         = GPIO_HIGH,
830         .iomux          = {
831             .name       = GPIO1B7_MMC0_CMD_NAME,
832             .fgpio      = GPIO1B_GPIO1B7,
833             .fmux       = GPIO1B_MMC0_CMD,
834         },
835     },      
836
837    .data0_gpio       = {
838         .io             = RK2928_PIN1_PC2,
839         .enable         = GPIO_HIGH,
840         .iomux          = {
841             .name       = GPIO1C2_MMC0_D0_NAME,
842             .fgpio      = GPIO1C_GPIO1C2,
843             .fmux       = GPIO1C_MMC0_D0,
844         },
845     },      
846
847     .data1_gpio       = {
848         .io             = RK2928_PIN1_PC3,
849         .enable         = GPIO_HIGH,
850         .iomux          = {
851             .name       = GPIO1C3_MMC0_D1_NAME,
852             .fgpio      = GPIO1C_GPIO1C3,
853             .fmux       = GPIO1C_MMC0_D1,
854         },
855     },      
856
857     .data2_gpio       = {
858         .io             = RK2928_PIN1_PC4,
859         .enable         = GPIO_HIGH,
860         .iomux          = {
861             .name       = GPIO1C4_MMC0_D2_NAME,
862             .fgpio      = GPIO1C_GPIO1C4,
863             .fmux       = GPIO1C_MMC0_D2,
864         },
865     }, 
866
867     .data3_gpio       = {
868         .io             = RK2928_PIN1_PC5,
869         .enable         = GPIO_HIGH,
870         .iomux          = {
871             .name       = GPIO1C5_MMC0_D3_NAME,
872             .fgpio      = GPIO1C_GPIO1C5,
873             .fmux       = GPIO1C_MMC0_D3,
874         },
875     }, 
876
877    
878     .power_en_gpio      = {   
879 #if defined(RK29SDK_SD_CARD_PWR_EN) || (INVALID_GPIO != RK29SDK_SD_CARD_PWR_EN)
880         .io             = RK29SDK_SD_CARD_PWR_EN,
881         .enable         = RK29SDK_SD_CARD_PWR_EN_LEVEL,
882         #ifdef RK29SDK_SD_CARD_PWR_EN_PIN_NAME
883         .iomux          = {
884             .name       = RK29SDK_SD_CARD_PWR_EN_PIN_NAME,
885             #ifdef RK29SDK_SD_CARD_PWR_EN_IOMUX_FGPIO
886             .fgpio      = RK29SDK_SD_CARD_PWR_EN_IOMUX_FGPIO,
887             #endif
888             #ifdef RK29SDK_SD_CARD_PWR_EN_IOMUX_FMUX
889             .fmux       = RK29SDK_SD_CARD_PWR_EN_IOMUX_FMUX,
890             #endif
891         },
892         #endif
893 #else
894         .io             = INVALID_GPIO,
895         .enable         = GPIO_LOW,
896 #endif
897     }, 
898
899     .detect_irq       = {
900 #if defined(RK29SDK_SD_CARD_DETECT_N) || (INVALID_GPIO != RK29SDK_SD_CARD_DETECT_N)  
901         .io             = RK29SDK_SD_CARD_DETECT_N,
902         .enable         = RK29SDK_SD_CARD_INSERT_LEVEL,
903         #ifdef RK29SDK_SD_CARD_DETECT_PIN_NAME
904         .iomux          = {
905             .name       = RK29SDK_SD_CARD_DETECT_PIN_NAME,
906             #ifdef RK29SDK_SD_CARD_DETECT_IOMUX_FGPIO
907             .fgpio      = RK29SDK_SD_CARD_DETECT_IOMUX_FGPIO,
908             #endif
909             #ifdef RK29SDK_SD_CARD_DETECT_IOMUX_FMUX
910             .fmux       = RK29SDK_SD_CARD_DETECT_IOMUX_FMUX,
911             #endif
912         },
913         #endif
914 #else
915         .io             = INVALID_GPIO,
916         .enable         = GPIO_LOW,
917 #endif            
918     }, 
919 };
920
921
922 /*
923 * define the gpio for sdmmc1
924 */
925 static struct rksdmmc_gpio_board rksdmmc1_gpio_init = {
926
927      .clk_gpio       = {
928         .io             = RK2928_PIN0_PB1,
929         .enable         = GPIO_HIGH,
930         .iomux          = {
931             .name       = GPIO0B1_MMC1_CLKOUT_NAME,
932             .fgpio      = GPIO0B_GPIO0B1,
933             .fmux       = GPIO0B_MMC1_CLKOUT,
934         },
935     },   
936
937     .cmd_gpio           = {
938         .io             = RK2928_PIN0_PB0,
939         .enable         = GPIO_HIGH,
940         .iomux          = {
941             .name       = GPIO0B0_MMC1_CMD_NAME,
942             .fgpio      = GPIO0B_GPIO0B0,
943             .fmux       = GPIO0B_MMC1_CMD,
944         },
945     },      
946
947    .data0_gpio       = {
948         .io             = RK2928_PIN0_PB3,
949         .enable         = GPIO_HIGH,
950         .iomux          = {
951             .name       = GPIO0B3_MMC1_D0_NAME,
952             .fgpio      = GPIO0B_GPIO0B3,
953             .fmux       = GPIO0B_MMC1_D0,
954         },
955     },      
956
957     .data1_gpio       = {
958         .io             = RK2928_PIN0_PB4,
959         .enable         = GPIO_HIGH,
960         .iomux          = {
961             .name       = GPIO0B4_MMC1_D1_NAME,
962             .fgpio      = GPIO0B_GPIO0B4,
963             .fmux       = GPIO0B_MMC1_D1,
964         },
965     },      
966
967     .data2_gpio       = {
968         .io             = RK2928_PIN0_PB5,
969         .enable         = GPIO_HIGH,
970         .iomux          = {
971             .name       = GPIO0B5_MMC1_D2_NAME,
972             .fgpio      = GPIO0B_GPIO0B5,
973             .fmux       = GPIO0B_MMC1_D2,
974         },
975     }, 
976
977     .data3_gpio       = {
978         .io             = RK2928_PIN0_PB6,
979         .enable         = GPIO_HIGH,
980         .iomux          = {
981             .name       = GPIO0B6_MMC1_D3_NAME,
982             .fgpio      = GPIO0B_GPIO0B6,
983             .fmux       = GPIO0B_MMC1_D3,
984         },
985     }, 
986
987
988 };
989 // ---end -#if defined(CONFIG_ARCH_RK2928)
990 #endif
991
992
993
994 //1.Part 3: The various operations of the SDMMC-SDIO module
995 /*************************************************************************
996 * define the varaious operations for SDMMC module
997 * Generally only the author of SDMMC module will modify this section.
998 *************************************************************************/
999
1000 #if !defined(CONFIG_SDMMC_RK29_OLD)     
1001 static void rk29_sdmmc_gpio_open(int device_id, int on)
1002 {
1003     switch(device_id)
1004     {
1005         case 0://mmc0
1006         {
1007             #ifdef CONFIG_SDMMC0_RK29
1008             if(on)
1009             {
1010                 gpio_direction_output(rksdmmc0_gpio_init.clk_gpio.io, GPIO_HIGH);//set mmc0-clk to high
1011                 gpio_direction_output(rksdmmc0_gpio_init.cmd_gpio.io, GPIO_HIGH);// set mmc0-cmd to high.
1012                 gpio_direction_output(rksdmmc0_gpio_init.data0_gpio.io,GPIO_HIGH);//set mmc0-data0 to high.
1013                 gpio_direction_output(rksdmmc0_gpio_init.data1_gpio.io,GPIO_HIGH);//set mmc0-data1 to high.
1014                 gpio_direction_output(rksdmmc0_gpio_init.data2_gpio.io,GPIO_HIGH);//set mmc0-data2 to high.
1015                 gpio_direction_output(rksdmmc0_gpio_init.data3_gpio.io,GPIO_HIGH);//set mmc0-data3 to high.
1016
1017                 mdelay(30);
1018             }
1019             else
1020             {
1021                 rk30_mux_api_set(rksdmmc0_gpio_init.clk_gpio.iomux.name, rksdmmc0_gpio_init.clk_gpio.iomux.fgpio);
1022                 gpio_request(rksdmmc0_gpio_init.clk_gpio.io, "mmc0-clk");
1023                 gpio_direction_output(rksdmmc0_gpio_init.clk_gpio.io,GPIO_LOW);//set mmc0-clk to low.
1024
1025                 rk30_mux_api_set(rksdmmc0_gpio_init.cmd_gpio.iomux.name, rksdmmc0_gpio_init.cmd_gpio.iomux.fgpio);
1026                 gpio_request(rksdmmc0_gpio_init.cmd_gpio.io, "mmc0-cmd");
1027                 gpio_direction_output(rksdmmc0_gpio_init.cmd_gpio.io,GPIO_LOW);//set mmc0-cmd to low.
1028
1029                 rk30_mux_api_set(rksdmmc0_gpio_init.data0_gpio.iomux.name, rksdmmc0_gpio_init.data0_gpio.iomux.fgpio);
1030                 gpio_request(rksdmmc0_gpio_init.data0_gpio.io, "mmc0-data0");
1031                 gpio_direction_output(rksdmmc0_gpio_init.data0_gpio.io,GPIO_LOW);//set mmc0-data0 to low.
1032
1033                 rk30_mux_api_set(rksdmmc0_gpio_init.data1_gpio.iomux.name, rksdmmc0_gpio_init.data1_gpio.iomux.fgpio);
1034                 gpio_request(rksdmmc0_gpio_init.data1_gpio.io, "mmc0-data1");
1035                 gpio_direction_output(rksdmmc0_gpio_init.data1_gpio.io,GPIO_LOW);//set mmc0-data1 to low.
1036
1037                 rk30_mux_api_set(rksdmmc0_gpio_init.data2_gpio.iomux.name, rksdmmc0_gpio_init.data2_gpio.iomux.fgpio);
1038                 gpio_request(rksdmmc0_gpio_init.data2_gpio.io, "mmc0-data2");
1039                 gpio_direction_output(rksdmmc0_gpio_init.data2_gpio.io,GPIO_LOW);//set mmc0-data2 to low.
1040
1041                 rk30_mux_api_set(rksdmmc0_gpio_init.data3_gpio.iomux.name, rksdmmc0_gpio_init.data3_gpio.iomux.fgpio);
1042                 gpio_request(rksdmmc0_gpio_init.data3_gpio.io, "mmc0-data3");
1043                 gpio_direction_output(rksdmmc0_gpio_init.data3_gpio.io,GPIO_LOW);//set mmc0-data3 to low.
1044
1045                 mdelay(30);
1046             }
1047             #endif
1048         }
1049         break;
1050         
1051         case 1://mmc1
1052         {
1053             #ifdef CONFIG_SDMMC1_RK29
1054             if(on)
1055             {
1056                 gpio_direction_output(rksdmmc1_gpio_init.clk_gpio.io,GPIO_HIGH);//set mmc1-clk to high
1057                 gpio_direction_output(rksdmmc1_gpio_init.cmd_gpio.io,GPIO_HIGH);//set mmc1-cmd to high.
1058                 gpio_direction_output(rksdmmc1_gpio_init.data0_gpio.io,GPIO_HIGH);//set mmc1-data0 to high.
1059                 gpio_direction_output(rksdmmc1_gpio_init.data1_gpio.io,GPIO_HIGH);//set mmc1-data1 to high.
1060                 gpio_direction_output(rksdmmc1_gpio_init.data2_gpio.io,GPIO_HIGH);//set mmc1-data2 to high.
1061                 gpio_direction_output(rksdmmc1_gpio_init.data3_gpio.io,GPIO_HIGH);//set mmc1-data3 to high.
1062                 mdelay(100);
1063             }
1064             else
1065             {
1066                 rk30_mux_api_set(rksdmmc1_gpio_init.clk_gpio.iomux.name, rksdmmc1_gpio_init.clk_gpio.iomux.fgpio);
1067                 gpio_request(rksdmmc1_gpio_init.clk_gpio.io, "mmc1-clk");
1068                 gpio_direction_output(rksdmmc1_gpio_init.clk_gpio.io,GPIO_LOW);//set mmc1-clk to low.
1069
1070                 rk30_mux_api_set(rksdmmc1_gpio_init.cmd_gpio.iomux.name, rksdmmc1_gpio_init.cmd_gpio.iomux.fgpio);
1071                 gpio_request(rksdmmc1_gpio_init.cmd_gpio.io, "mmc1-cmd");
1072                 gpio_direction_output(rksdmmc1_gpio_init.cmd_gpio.io,GPIO_LOW);//set mmc1-cmd to low.
1073
1074                 rk30_mux_api_set(rksdmmc1_gpio_init.data0_gpio.iomux.name, rksdmmc1_gpio_init.data0_gpio.iomux.fgpio);
1075                 gpio_request(rksdmmc1_gpio_init.data0_gpio.io, "mmc1-data0");
1076                 gpio_direction_output(rksdmmc1_gpio_init.data0_gpio.io,GPIO_LOW);//set mmc1-data0 to low.
1077                 
1078                 rk29_mux_api_set(rksdmmc1_gpio_init.data1_gpio.iomux.name, rksdmmc1_gpio_init.data1_gpio.iomux.fgpio);
1079                 gpio_request(rksdmmc1_gpio_init.data1_gpio.io, "mmc1-data1");
1080                 gpio_direction_output(rksdmmc1_gpio_init.data1_gpio.io,GPIO_LOW);//set mmc1-data1 to low.
1081
1082                 rk29_mux_api_set(rksdmmc1_gpio_init.data2_gpio.iomux.name, rksdmmc1_gpio_init.data2_gpio.iomux.fgpio);
1083                 gpio_request(rksdmmc1_gpio_init.data2_gpio.io, "mmc1-data2");
1084                 gpio_direction_output(rksdmmc1_gpio_init.data2_gpio.io,GPIO_LOW);//set mmc1-data2 to low.
1085
1086                 rk29_mux_api_set(rksdmmc1_gpio_init.data3_gpio.iomux.name, rksdmmc1_gpio_init.data3_gpio.iomux.fgpio);
1087                 gpio_request(rksdmmc1_gpio_init.data3_gpio.io, "mmc1-data3");
1088                 gpio_direction_output(rksdmmc1_gpio_init.data3_gpio.io,GPIO_LOW);//set mmc1-data3 to low.
1089
1090                 mdelay(100);
1091             }
1092             #endif
1093         }
1094         break; 
1095         
1096         case 2: //mmc2
1097         break;
1098         
1099         default:
1100         break;
1101     }
1102 }
1103
1104 static void rk29_sdmmc_set_iomux_mmc0(unsigned int bus_width)
1105 {
1106     switch (bus_width)
1107     {
1108         
1109         case 1://SDMMC_CTYPE_4BIT:
1110         {
1111                 rk30_mux_api_set(rksdmmc0_gpio_init.data1_gpio.iomux.name, rksdmmc0_gpio_init.data1_gpio.iomux.fmux);
1112                 rk30_mux_api_set(rksdmmc0_gpio_init.data2_gpio.iomux.name, rksdmmc0_gpio_init.data2_gpio.iomux.fmux);
1113                 rk30_mux_api_set(rksdmmc0_gpio_init.data3_gpio.iomux.name, rksdmmc0_gpio_init.data3_gpio.iomux.fmux);
1114         }
1115         break;
1116
1117         case 0x10000://SDMMC_CTYPE_8BIT:
1118             break;
1119         case 0xFFFF: //gpio_reset
1120         {
1121             if (rksdmmc0_gpio_init.power_en_gpio.io == INVALID_GPIO)
1122                 break;
1123             rk30_mux_api_set(rksdmmc0_gpio_init.power_en_gpio.iomux.name, rksdmmc0_gpio_init.power_en_gpio.iomux.fgpio);
1124             gpio_request(rksdmmc0_gpio_init.power_en_gpio.io,"sdmmc-power");
1125             gpio_direction_output(rksdmmc0_gpio_init.power_en_gpio.io, !(rksdmmc0_gpio_init.power_en_gpio.enable)); //power-off
1126
1127         #if 0 //replace the power control into rk29_sdmmc_set_ios(); modifyed by xbw at 2012-08-12
1128             rk29_sdmmc_gpio_open(0, 0);
1129
1130             gpio_direction_output(rksdmmc0_gpio_init.power_en_gpio.io, rksdmmc0_gpio_init.power_en_gpio.enable); //power-on
1131
1132             rk29_sdmmc_gpio_open(0, 1);
1133           #endif  
1134         }
1135         break;
1136
1137         default: //case 0://SDMMC_CTYPE_1BIT:
1138         {
1139                 rk30_mux_api_set(rksdmmc0_gpio_init.cmd_gpio.iomux.name, rksdmmc0_gpio_init.cmd_gpio.iomux.fmux);
1140                 rk30_mux_api_set(rksdmmc0_gpio_init.clk_gpio.iomux.name, rksdmmc0_gpio_init.clk_gpio.iomux.fmux);
1141                 rk30_mux_api_set(rksdmmc0_gpio_init.data0_gpio.iomux.name, rksdmmc0_gpio_init.data0_gpio.iomux.fmux);
1142
1143             rk30_mux_api_set(rksdmmc0_gpio_init.data1_gpio.iomux.name, rksdmmc0_gpio_init.data1_gpio.iomux.fgpio);
1144             gpio_request(rksdmmc0_gpio_init.data1_gpio.io, "mmc0-data1");
1145             gpio_direction_output(rksdmmc0_gpio_init.data1_gpio.io,GPIO_HIGH);//set mmc0-data1 to high.
1146
1147             rk30_mux_api_set(rksdmmc0_gpio_init.data2_gpio.iomux.name, rksdmmc0_gpio_init.data2_gpio.iomux.fgpio);
1148             gpio_request(rksdmmc0_gpio_init.data2_gpio.io, "mmc0-data2");
1149             gpio_direction_output(rksdmmc0_gpio_init.data2_gpio.io,GPIO_HIGH);//set mmc0-data2 to high.
1150
1151             rk30_mux_api_set(rksdmmc0_gpio_init.data3_gpio.iomux.name, rksdmmc0_gpio_init.data3_gpio.iomux.fgpio);
1152             gpio_request(rksdmmc0_gpio_init.data3_gpio.io, "mmc0-data3");
1153             gpio_direction_output(rksdmmc0_gpio_init.data3_gpio.io,GPIO_HIGH);//set mmc0-data3 to high.
1154         }
1155         break;
1156         }
1157 }
1158
1159 static void rk29_sdmmc_set_iomux_mmc1(unsigned int bus_width)
1160 {
1161     rk30_mux_api_set(rksdmmc1_gpio_init.cmd_gpio.iomux.name, rksdmmc1_gpio_init.cmd_gpio.iomux.fmux);
1162     rk30_mux_api_set(rksdmmc1_gpio_init.clk_gpio.iomux.name, rksdmmc1_gpio_init.clk_gpio.iomux.fmux);
1163     rk30_mux_api_set(rksdmmc1_gpio_init.data0_gpio.iomux.name, rksdmmc1_gpio_init.data0_gpio.iomux.fmux);
1164     rk30_mux_api_set(rksdmmc1_gpio_init.data1_gpio.iomux.name, rksdmmc1_gpio_init.data1_gpio.iomux.fmux);
1165     rk30_mux_api_set(rksdmmc1_gpio_init.data2_gpio.iomux.name, rksdmmc1_gpio_init.data2_gpio.iomux.fmux);
1166     rk30_mux_api_set(rksdmmc1_gpio_init.data3_gpio.iomux.name, rksdmmc1_gpio_init.data3_gpio.iomux.fmux);
1167 }
1168
1169 static void rk29_sdmmc_set_iomux_mmc2(unsigned int bus_width)
1170 {
1171     ;//
1172 }
1173
1174 static void rk29_sdmmc_set_iomux(int device_id, unsigned int bus_width)
1175 {
1176     switch(device_id)
1177     {
1178         case 0:
1179             #ifdef CONFIG_SDMMC0_RK29
1180             rk29_sdmmc_set_iomux_mmc0(bus_width);
1181             #endif
1182             break;
1183         case 1:
1184             #ifdef CONFIG_SDMMC1_RK29
1185             rk29_sdmmc_set_iomux_mmc1(bus_width);
1186             #endif
1187             break;
1188         case 2:
1189             rk29_sdmmc_set_iomux_mmc2(bus_width);
1190             break;
1191         default:
1192             break;
1193     }    
1194 }
1195
1196 #endif
1197
1198
1199
1200 //1.Part 4: The various operations of the Wifi-BT module
1201 /*************************************************************************
1202 * define the varaious operations for Wifi module
1203 * Generally only the author of Wifi module will modify this section.
1204 *************************************************************************/
1205
1206 static int rk29sdk_wifi_status(struct device *dev);
1207 static int rk29sdk_wifi_status_register(void (*callback)(int card_presend, void *dev_id), void *dev_id);
1208
1209 #if defined(CONFIG_WIFI_COMBO_MODULE_CONTROL_FUNC)
1210 static int rk29sdk_wifi_mmc0_status(struct device *dev);
1211 static int rk29sdk_wifi_mmc0_status_register(void (*callback)(int card_presend, void *dev_id), void *dev_id);
1212 static int rk29sdk_wifi_mmc0_cd = 0;   /* wifi virtual 'card detect' status */
1213 static void (*wifi_mmc0_status_cb)(int card_present, void *dev_id);
1214 static void *wifi_mmc0_status_cb_devid;
1215
1216 int rk29sdk_wifi_power_state = 0;
1217 int rk29sdk_bt_power_state = 0;
1218
1219     #if defined(CONFIG_USE_SDMMC0_FOR_WIFI_DEVELOP_BOARD)
1220         /////////////////////////////////////////////////////////////////////////////////////
1221             // set the gpio to develop wifi EVB if you select the macro of CONFIG_USE_SDMMC0_FOR_WIFI_DEVELOP_BOARD
1222             #define USE_SDMMC_CONTROLLER_FOR_WIFI   0
1223                 #define COMBO_MODULE_MT6620_CDT         0  //- 1--use Cdtech chip; 0--unuse CDT chip
1224         //power
1225         #define RK30SDK_WIFI_GPIO_POWER_N                   RK30_PIN3_PD0            
1226         #define RK30SDK_WIFI_GPIO_POWER_ENABLE_VALUE        GPIO_HIGH        
1227         #define RK30SDK_WIFI_GPIO_POWER_PIN_NAME            GPIO3D0_SDMMC1PWREN_NAME
1228         #define RK30SDK_WIFI_GPIO_POWER_IOMUX_FGPIO         GPIO3D_GPIO3D0
1229         #define RK30SDK_WIFI_GPIO_POWER_IOMUX_FMUX          GPIO3D_SDMMC1_PWR_EN
1230         //reset
1231         #define RK30SDK_WIFI_GPIO_RESET_N                   RK30_PIN3_PD1
1232         #define RK30SDK_WIFI_GPIO_RESET_ENABLE_VALUE        GPIO_HIGH 
1233         #define RK30SDK_WIFI_GPIO_RESET_PIN_NAME            GPIO3D1_SDMMC1BACKENDPWR_NAME
1234         #define RK30SDK_WIFI_GPIO_RESET_IOMUX_FGPIO         GPIO3D_GPIO3D1
1235         #define RK30SDK_WIFI_GPIO_RESET_IOMUX_FMUX          GPIO3D_SDMMC1_BACKEND_PWR
1236         //VDDIO
1237         //#define RK30SDK_WIFI_GPIO_VCCIO_WL                 RK30_PIN2_PC5
1238         //#define RK30SDK_WIFI_GPIO_VCCIO_WL_ENABLE_VALUE    GPIO_HIGH       
1239         //WIFI_INT_B
1240         #define RK30SDK_WIFI_GPIO_WIFI_INT_B                RK30_PIN3_PD2
1241         #define RK30SDK_WIFI_GPIO_WIFI_INT_B_ENABLE_VALUE   GPIO_HIGH 
1242         #define RK30SDK_WIFI_GPIO_WIFI_INT_B_PIN_NAME       GPIO3D2_SDMMC1INTN_NAME
1243         #define RK30SDK_WIFI_GPIO_WIFI_INT_B_IOMUX_FGPIO    GPIO3D_GPIO3D2
1244         #define RK30SDK_WIFI_GPIO_WIFI_INT_B_IOMUX_FMUX     GPIO3D_SDMMC1_INT_N
1245         //BGF_INT_B
1246         #define RK30SDK_WIFI_GPIO_BGF_INT_B                 RK30_PIN3_PC6
1247         #define RK30SDK_WIFI_GPIO_BGF_INT_B_ENABLE_VALUE    GPIO_HIGH 
1248         #define RK30SDK_WIFI_GPIO_BGF_INT_B_PIN_NAME        GPIO3C6_SDMMC1DETECTN_NAME
1249         #define RK30SDK_WIFI_GPIO_BGF_INT_B_IOMUX_FGPIO     GPIO3C_GPIO3C6
1250         #define RK30SDK_WIFI_GPIO_BGF_INT_B_IOMUX_FMUX      GPIO3C_SDMMC1_DETECT_N
1251         //GPS_SYNC
1252         #define RK30SDK_WIFI_GPIO_GPS_SYNC                  RK30_PIN3_PC7
1253         #define RK30SDK_WIFI_GPIO_GPS_SYNC_ENABLE_VALUE     GPIO_HIGH 
1254         #define RK30SDK_WIFI_GPIO_GPS_SYNC_PIN_NAME         GPIO3C7_SDMMC1WRITEPRT_NAME
1255         #define RK30SDK_WIFI_GPIO_GPS_SYNC_IOMUX_FGPIO      GPIO3C_GPIO3C7
1256         #define RK30SDK_WIFI_GPIO_GPS_SYNC_IOMUX_FMUX       GPIO3C_SDMMC1_WRITE_PRT
1257
1258         #if COMBO_MODULE_MT6620_CDT
1259         //ANTSEL2
1260         #define RK30SDK_WIFI_GPIO_ANTSEL2                   RK30_PIN4_PD4
1261         #define RK30SDK_WIFI_GPIO_ANTSEL2_ENABLE_VALUE      GPIO_LOW    //use 6620 in CDT chip, LOW--work; High--no work.
1262         #define RK30SDK_WIFI_GPIO_ANTSEL2_PIN_NAME          GPIO4D4_SMCDATA12_TRACEDATA12_NAME
1263         #define RK30SDK_WIFI_GPIO_ANTSEL2_IOMUX_FGPIO       GPIO4D_GPIO4D4
1264         #define RK30SDK_WIFI_GPIO_ANTSEL2_IOMUX_FMUX        GPIO4D_TRACE_DATA12
1265         //ANTSEL3
1266         #define RK30SDK_WIFI_GPIO_ANTSEL3                   RK30_PIN4_PD3
1267         #define RK30SDK_WIFI_GPIO_ANTSEL3_ENABLE_VALUE      GPIO_HIGH    //use 6620 in CDT chip, High--work; Low--no work..
1268         #define RK30SDK_WIFI_GPIO_ANTSEL3_PIN_NAME          GPIO4D3_SMCDATA11_TRACEDATA11_NAME
1269         #define RK30SDK_WIFI_GPIO_ANTSEL3_IOMUX_FGPIO       GPIO4D_GPIO4D3
1270         #define RK30SDK_WIFI_GPIO_ANTSEL3_IOMUX_FMUX        GPIO4D_TRACE_DATA11
1271         //GPS_LAN
1272         #define RK30SDK_WIFI_GPIO_GPS_LAN                   RK30_PIN4_PD6
1273         #define RK30SDK_WIFI_GPIO_GPS_LAN_ENABLE_VALUE      GPIO_HIGH    //use 6620 in CDT chip, High--work; Low--no work..
1274         #define RK30SDK_WIFI_GPIO_GPS_LAN_PIN_NAME          GPIO4D6_SMCDATA14_TRACEDATA14_NAME
1275         #define RK30SDK_WIFI_GPIO_GPS_LAN_IOMUX_FGPIO       GPIO4D_GPIO4D6
1276         #define RK30SDK_WIFI_GPIO_GPS_LAN_IOMUX_FMUX        GPIO4D_TRACE_DATA14
1277         #endif // #if COMBO_MODULE_MT6620_CDT--#endif
1278         
1279     #endif // #if defined(CONFIG_USE_SDMMC0_FOR_WIFI_DEVELOP_BOARD)---#endif
1280 #endif // #if defined(CONFIG_WIFI_COMBO_MODULE_CONTROL_FUNC) ---#endif
1281
1282 static int rk29sdk_wifi_cd = 0;   /* wifi virtual 'card detect' status */
1283 static void (*wifi_status_cb)(int card_present, void *dev_id);
1284 static void *wifi_status_cb_devid;
1285
1286 #if defined(CONFIG_RK29_SDIO_IRQ_FROM_GPIO)
1287 #define RK29SDK_WIFI_SDIO_CARD_INT         RK30SDK_WIFI_GPIO_WIFI_INT_B
1288 #endif
1289
1290 struct rksdmmc_gpio_wifi_moudle  rk_platform_wifi_gpio = {
1291     .power_n = {
1292             .io             = RK30SDK_WIFI_GPIO_POWER_N, 
1293             .enable         = RK30SDK_WIFI_GPIO_POWER_ENABLE_VALUE,
1294             #ifdef RK30SDK_WIFI_GPIO_POWER_PIN_NAME
1295             .iomux          = {
1296                 .name       = RK30SDK_WIFI_GPIO_POWER_PIN_NAME,
1297                 .fgpio      = RK30SDK_WIFI_GPIO_POWER_IOMUX_FGPIO,
1298                 #ifdef RK30SDK_WIFI_GPIO_POWER_IOMUX_FMUX
1299                 .fmux       = RK30SDK_WIFI_GPIO_POWER_IOMUX_FMUX,
1300                 #endif
1301             },
1302             #endif
1303      },
1304      
1305     #ifdef RK30SDK_WIFI_GPIO_RESET_N
1306     .reset_n = {
1307             .io             = RK30SDK_WIFI_GPIO_RESET_N,
1308             .enable         = RK30SDK_WIFI_GPIO_RESET_ENABLE_VALUE,
1309             #ifdef RK30SDK_WIFI_GPIO_RESET_PIN_NAME
1310             .iomux          = {
1311                 .name       = RK30SDK_WIFI_GPIO_RESET_PIN_NAME,
1312                 .fgpio      = RK30SDK_WIFI_GPIO_RESET_IOMUX_FGPIO,
1313                 #ifdef RK30SDK_WIFI_GPIO_RESET_IOMUX_FMUX
1314                 .fmux       = RK30SDK_WIFI_GPIO_RESET_IOMUX_FMUX,
1315                 #endif
1316             },
1317             #endif
1318     },
1319     #endif
1320     
1321     #ifdef RK30SDK_WIFI_GPIO_WIFI_INT_B
1322     .wifi_int_b = {
1323             .io             = RK30SDK_WIFI_GPIO_WIFI_INT_B,
1324             .enable         = RK30SDK_WIFI_GPIO_WIFI_INT_B_ENABLE_VALUE,
1325             #ifdef RK30SDK_WIFI_GPIO_WIFI_INT_B_PIN_NAME
1326             .iomux          = {
1327                 .name       = RK30SDK_WIFI_GPIO_WIFI_INT_B_PIN_NAME,
1328                 .fgpio      = RK30SDK_WIFI_GPIO_WIFI_INT_B_IOMUX_FGPIO,
1329                 #ifdef RK30SDK_WIFI_GPIO_WIFI_INT_B_IOMUX_FMUX
1330                 .fmux       = RK30SDK_WIFI_GPIO_WIFI_INT_B_IOMUX_FMUX,
1331                 #endif
1332             },
1333             #endif
1334      },
1335      #endif
1336
1337     #ifdef RK30SDK_WIFI_GPIO_VCCIO_WL 
1338     .vddio = {
1339             .io             = RK30SDK_WIFI_GPIO_VCCIO_WL,
1340             .enable         = RK30SDK_WIFI_GPIO_VCCIO_WL_ENABLE_VALUE,
1341             #ifdef RK30SDK_WIFI_GPIO_VCCIO_WL_PIN_NAME
1342             .iomux          = {
1343                 .name       = RK30SDK_WIFI_GPIO_VCCIO_WL_PIN_NAME,
1344                 .fgpio      = RK30SDK_WIFI_GPIO_VCCIO_WL_IOMUX_FGPIO,
1345                 #ifdef RK30SDK_WIFI_GPIO_VCCIO_WL_IOMUX_FMUX
1346                 .fmux       = RK30SDK_WIFI_GPIO_VCCIO_WL_IOMUX_FMUX,
1347                 #endif
1348             },
1349             #endif
1350      },
1351      #endif
1352      
1353      #ifdef RK30SDK_WIFI_GPIO_BGF_INT_B
1354     .bgf_int_b = {
1355             .io             = RK30SDK_WIFI_GPIO_BGF_INT_B,
1356             .enable         = RK30SDK_WIFI_GPIO_BGF_INT_B_ENABLE_VALUE,
1357             #ifdef RK30SDK_WIFI_GPIO_BGF_INT_B_PIN_NAME
1358             .iomux          = {
1359                 .name       = RK30SDK_WIFI_GPIO_BGF_INT_B_PIN_NAME,
1360                 .fgpio      = RK30SDK_WIFI_GPIO_BGF_INT_B_IOMUX_FGPIO,
1361                 #ifdef RK30SDK_WIFI_GPIO_BGF_INT_B_IOMUX_FMUX
1362                 .fmux       = RK30SDK_WIFI_GPIO_BGF_INT_B_IOMUX_FMUX,
1363                 #endif
1364             },
1365             #endif
1366         },       
1367     #endif
1368     
1369     #ifdef RK30SDK_WIFI_GPIO_GPS_SYNC
1370     .gps_sync = {
1371             .io             = RK30SDK_WIFI_GPIO_GPS_SYNC,
1372             .enable         = RK30SDK_WIFI_GPIO_GPS_SYNC_ENABLE_VALUE,
1373             #ifdef RK30SDK_WIFI_GPIO_GPS_SYNC_PIN_NAME
1374             .iomux          = {
1375                 .name       = RK30SDK_WIFI_GPIO_GPS_SYNC_PIN_NAME,
1376                 .fgpio      = RK30SDK_WIFI_GPIO_GPS_SYNC_IOMUX_FGPIO,
1377                 #ifdef RK30SDK_WIFI_GPIO_GPS_SYNC_IOMUX_FMUX
1378                 .fmux       = RK30SDK_WIFI_GPIO_GPS_SYNC_IOMUX_FMUX,
1379                 #endif
1380             },
1381             #endif
1382     },
1383     #endif
1384     
1385 #if COMBO_MODULE_MT6620_CDT
1386     #ifdef RK30SDK_WIFI_GPIO_ANTSEL2
1387     .ANTSEL2 = {
1388             .io             = RK30SDK_WIFI_GPIO_ANTSEL2,
1389             .enable         = RK30SDK_WIFI_GPIO_ANTSEL2_ENABLE_VALUE,
1390             #ifdef RK30SDK_WIFI_GPIO_ANTSEL2_PIN_NAME
1391             .iomux          = {
1392                 .name       = RK30SDK_WIFI_GPIO_ANTSEL2_PIN_NAME,
1393                 .fgpio      = RK30SDK_WIFI_GPIO_ANTSEL2_IOMUX_FGPIO,
1394                 #ifdef RK30SDK_WIFI_GPIO_ANTSEL2_IOMUX_FMUX
1395                 .fmux       = RK30SDK_WIFI_GPIO_ANTSEL2_IOMUX_FMUX,
1396                 #endif
1397             },
1398             #endif
1399     },
1400     #endif
1401
1402     #ifdef RK30SDK_WIFI_GPIO_ANTSEL3
1403     .ANTSEL3 = {
1404             .io             = RK30SDK_WIFI_GPIO_ANTSEL3,
1405             .enable         = RK30SDK_WIFI_GPIO_ANTSEL3_ENABLE_VALUE,
1406             #ifdef RK30SDK_WIFI_GPIO_ANTSEL3_PIN_NAME
1407             .iomux          = {
1408                 .name       = RK30SDK_WIFI_GPIO_ANTSEL3_PIN_NAME,
1409                 .fgpio      = RK30SDK_WIFI_GPIO_ANTSEL3_IOMUX_FGPIO,
1410                 #ifdef RK30SDK_WIFI_GPIO_ANTSEL3_IOMUX_FMUX
1411                 .fmux       = RK30SDK_WIFI_GPIO_ANTSEL3_IOMUX_FMUX,
1412                 #endif
1413             },
1414             #endif
1415     },
1416     #endif
1417
1418     #ifdef RK30SDK_WIFI_GPIO_GPS_LAN
1419     .GPS_LAN = {
1420             .io             = RK30SDK_WIFI_GPIO_GPS_LAN,
1421             .enable         = RK30SDK_WIFI_GPIO_GPS_LAN_ENABLE_VALUE,
1422             #ifdef RK30SDK_WIFI_GPIO_GPS_LAN_PIN_NAME
1423             .iomux          = {
1424                 .name       = RK30SDK_WIFI_GPIO_GPS_LAN_PIN_NAME,
1425                 .fgpio      = RK30SDK_WIFI_GPIO_GPS_LAN_IOMUX_FGPIO,
1426                 #ifdef RK30SDK_WIFI_GPIO_GPS_LAN_IOMUX_FMUX
1427                 .fmux       = RK30SDK_WIFI_GPIO_GPS_LAN_IOMUX_FMUX,
1428                 #endif
1429             },
1430             #endif
1431     },
1432     #endif
1433 #endif // #if COMBO_MODULE_MT6620_CDT--#endif   
1434 };
1435
1436
1437
1438 #ifdef CONFIG_WIFI_CONTROL_FUNC
1439 #define PREALLOC_WLAN_SEC_NUM           4
1440 #define PREALLOC_WLAN_BUF_NUM           160
1441 #define PREALLOC_WLAN_SECTION_HEADER    24
1442
1443 #define WLAN_SECTION_SIZE_0     (PREALLOC_WLAN_BUF_NUM * 128)
1444 #define WLAN_SECTION_SIZE_1     (PREALLOC_WLAN_BUF_NUM * 128)
1445 #define WLAN_SECTION_SIZE_2     (PREALLOC_WLAN_BUF_NUM * 512)
1446 #define WLAN_SECTION_SIZE_3     (PREALLOC_WLAN_BUF_NUM * 1024)
1447
1448 #define WLAN_SKB_BUF_NUM        16
1449
1450 static struct sk_buff *wlan_static_skb[WLAN_SKB_BUF_NUM];
1451
1452 struct wifi_mem_prealloc {
1453         void *mem_ptr;
1454         unsigned long size;
1455 };
1456
1457 static struct wifi_mem_prealloc wifi_mem_array[PREALLOC_WLAN_SEC_NUM] = {
1458         {NULL, (WLAN_SECTION_SIZE_0 + PREALLOC_WLAN_SECTION_HEADER)},
1459         {NULL, (WLAN_SECTION_SIZE_1 + PREALLOC_WLAN_SECTION_HEADER)},
1460         {NULL, (WLAN_SECTION_SIZE_2 + PREALLOC_WLAN_SECTION_HEADER)},
1461         {NULL, (WLAN_SECTION_SIZE_3 + PREALLOC_WLAN_SECTION_HEADER)}
1462 };
1463
1464 static void *rk29sdk_mem_prealloc(int section, unsigned long size)
1465 {
1466         if (section == PREALLOC_WLAN_SEC_NUM)
1467                 return wlan_static_skb;
1468
1469         if ((section < 0) || (section > PREALLOC_WLAN_SEC_NUM))
1470                 return NULL;
1471
1472         if (wifi_mem_array[section].size < size)
1473                 return NULL;
1474
1475         return wifi_mem_array[section].mem_ptr;
1476 }
1477
1478 static int __init rk29sdk_init_wifi_mem(void)
1479 {
1480         int i;
1481         int j;
1482
1483         for (i = 0 ; i < WLAN_SKB_BUF_NUM ; i++) {
1484                 wlan_static_skb[i] = dev_alloc_skb(
1485                                 ((i < (WLAN_SKB_BUF_NUM / 2)) ? 4096 : 8192));
1486
1487                 if (!wlan_static_skb[i])
1488                         goto err_skb_alloc;
1489         }
1490
1491         for (i = 0 ; i < PREALLOC_WLAN_SEC_NUM ; i++) {
1492                 wifi_mem_array[i].mem_ptr =
1493                                 kmalloc(wifi_mem_array[i].size, GFP_KERNEL);
1494
1495                 if (!wifi_mem_array[i].mem_ptr)
1496                         goto err_mem_alloc;
1497         }
1498         return 0;
1499
1500 err_mem_alloc:
1501         pr_err("Failed to mem_alloc for WLAN\n");
1502         for (j = 0 ; j < i ; j++)
1503                kfree(wifi_mem_array[j].mem_ptr);
1504
1505         i = WLAN_SKB_BUF_NUM;
1506
1507 err_skb_alloc:
1508         pr_err("Failed to skb_alloc for WLAN\n");
1509         for (j = 0 ; j < i ; j++)
1510                 dev_kfree_skb(wlan_static_skb[j]);
1511
1512         return -ENOMEM;
1513 }
1514
1515 static int rk29sdk_wifi_status(struct device *dev)
1516 {
1517         return rk29sdk_wifi_cd;
1518 }
1519
1520 static int rk29sdk_wifi_status_register(void (*callback)(int card_present, void *dev_id), void *dev_id)
1521 {
1522         if(wifi_status_cb)
1523                 return -EAGAIN;
1524         wifi_status_cb = callback;
1525         wifi_status_cb_devid = dev_id;
1526         return 0;
1527 }
1528
1529 #if defined(CONFIG_RTL8192CU) || defined(CONFIG_RTL8188EU) || defined(CONFIG_RT5370)
1530 static int __init rk29sdk_wifi_bt_gpio_control_init(void)
1531 {
1532 #if defined(CONFIG_USB_WIFI_POWER_CONTROLED_BY_GPIO)
1533     if (gpio_request(rk_platform_wifi_gpio.power_n.io, "wifi_power")) {
1534            pr_info("%s: request wifi power gpio failed\n", __func__);
1535            return -1;
1536     }
1537     gpio_direction_output(rk_platform_wifi_gpio.power_n.io, !(rk_platform_wifi_gpio.power_n.enable) );
1538 #endif
1539     pr_info("%s: init finished\n",__func__);
1540     return 0;
1541 }
1542 #elif defined(CONFIG_RDA5990)
1543 static int __init rk29sdk_wifi_bt_gpio_control_init(void)
1544 {
1545     #if defined(CONFIG_SDMMC1_RK29) && !defined(CONFIG_SDMMC_RK29_OLD)
1546     rk29_sdmmc_gpio_open(1, 0); //added by xbw at 2011-10-13
1547     #endif
1548     pr_info("%s: init finished\n",__func__);
1549
1550     return 0;
1551 }
1552 #else
1553 static int __init rk29sdk_wifi_bt_gpio_control_init(void)
1554 {
1555     rk29sdk_init_wifi_mem();    
1556     rk29_mux_api_set(rk_platform_wifi_gpio.power_n.iomux.name, rk_platform_wifi_gpio.power_n.iomux.fgpio);
1557     
1558     if (gpio_request(rk_platform_wifi_gpio.power_n.io, "wifi_power")) {
1559            pr_info("%s: request wifi power gpio failed\n", __func__);
1560            return -1;
1561     }
1562
1563 #ifdef RK30SDK_WIFI_GPIO_RESET_N
1564     if (gpio_request(rk_platform_wifi_gpio.reset_n.io, "wifi reset")) {
1565            pr_info("%s: request wifi reset gpio failed\n", __func__);
1566            gpio_free(rk_platform_wifi_gpio.reset_n.io);
1567            return -1;
1568     }
1569 #endif    
1570
1571     gpio_direction_output(rk_platform_wifi_gpio.power_n.io, !(rk_platform_wifi_gpio.power_n.enable) );
1572
1573 #ifdef RK30SDK_WIFI_GPIO_RESET_N 
1574     gpio_direction_output(rk_platform_wifi_gpio.reset_n.io, !(rk_platform_wifi_gpio.reset_n.enable) );
1575 #endif    
1576
1577     #if defined(CONFIG_SDMMC1_RK29) && !defined(CONFIG_SDMMC_RK29_OLD)
1578     rk29_sdmmc_gpio_open(1, 0); //added by xbw at 2011-10-13
1579     #endif    
1580     pr_info("%s: init finished\n",__func__);
1581
1582     return 0;
1583 }
1584 #endif
1585
1586 #if defined(CONFIG_RTL8192CU) || defined(CONFIG_RTL8188EU) || defined(CONFIG_RT5370)
1587 static int usbwifi_power_status = 1;
1588 int rk29sdk_wifi_power(int on)
1589 {
1590         pr_info("%s: %d\n", __func__, on);
1591          if (on){
1592                 #if defined(CONFIG_USB_WIFI_POWER_CONTROLED_BY_GPIO) 
1593                 gpio_set_value(rk_platform_wifi_gpio.power_n.io, rk_platform_wifi_gpio.power_n.enable);
1594                 mdelay(100);            
1595                 #else           
1596                 if(usbwifi_power_status == 1) {
1597                     rkusb_wifi_power(0);
1598                     mdelay(50);
1599                 }
1600                 rkusb_wifi_power(1);
1601                 #endif
1602                 usbwifi_power_status = 1;
1603                  pr_info("wifi turn on power\n");       
1604         }else{
1605                 #if defined(CONFIG_USB_WIFI_POWER_CONTROLED_BY_GPIO) 
1606                 gpio_set_value(rk_platform_wifi_gpio.power_n.io, !(rk_platform_wifi_gpio.power_n.enable));
1607                 mdelay(100);            
1608                 #else
1609                 rkusb_wifi_power(0);
1610                 #endif
1611                 usbwifi_power_status = 0;       
1612                  pr_info("wifi shut off power\n");
1613         }
1614         return 0;
1615 }
1616 #elif  defined(CONFIG_RDA5990)
1617 int rk29sdk_wifi_power(int on)
1618 {
1619         pr_info("%s: %d\n", __func__, on);
1620         if (on){
1621            mdelay(50);
1622
1623                 #if defined(CONFIG_SDMMC1_RK29) && !defined(CONFIG_SDMMC_RK29_OLD)      
1624                 rk29_sdmmc_gpio_open(1, 1); //added by xbw at 2011-10-13
1625                 #endif
1626
1627                 mdelay(100);
1628                 pr_info("wifi turn on power\n");
1629         }else{
1630                         #if defined(CONFIG_SDMMC1_RK29) && !defined(CONFIG_SDMMC_RK29_OLD)      
1631                         rk29_sdmmc_gpio_open(1, 0); //added by xbw at 2011-10-13
1632                         #endif
1633
1634                         mdelay(100);
1635                         pr_info("wifi shut off power\n");
1636         }
1637
1638         return 0;
1639 }
1640
1641 #else
1642 int rk29sdk_wifi_power(int on)
1643 {
1644         pr_info("%s: %d\n", __func__, on);
1645         if (on){
1646                 gpio_set_value(rk_platform_wifi_gpio.power_n.io, rk_platform_wifi_gpio.power_n.enable);
1647            mdelay(50);
1648
1649                 #if defined(CONFIG_SDMMC1_RK29) && !defined(CONFIG_SDMMC_RK29_OLD)      
1650                 rk29_sdmmc_gpio_open(1, 1); //added by xbw at 2011-10-13
1651                 #endif
1652
1653             #ifdef RK30SDK_WIFI_GPIO_RESET_N
1654                 gpio_set_value(rk_platform_wifi_gpio.reset_n.io, rk_platform_wifi_gpio.reset_n.enable);
1655             #endif                
1656                 mdelay(100);
1657                 pr_info("wifi turn on power\n");
1658         }else{
1659 //                if (!rk29sdk_bt_power_state){
1660                         gpio_set_value(rk_platform_wifi_gpio.power_n.io, !(rk_platform_wifi_gpio.power_n.enable));
1661                         #if defined(CONFIG_SDMMC1_RK29) && !defined(CONFIG_SDMMC_RK29_OLD)      
1662                         rk29_sdmmc_gpio_open(1, 0); //added by xbw at 2011-10-13
1663                         #endif
1664                         
1665                         mdelay(100);
1666                         pr_info("wifi shut off power\n");
1667 //                }else
1668 //                {
1669 //                        pr_info("wifi shouldn't shut off power, bt is using it!\n");
1670 //                }
1671 #ifdef RK30SDK_WIFI_GPIO_RESET_N
1672                 gpio_set_value(rk_platform_wifi_gpio.reset_n.io, !(rk_platform_wifi_gpio.reset_n.enable));
1673 #endif 
1674         }
1675
1676 //        rk29sdk_wifi_power_state = on;
1677         return 0;
1678 }
1679 #endif
1680 EXPORT_SYMBOL(rk29sdk_wifi_power);
1681
1682 static int rk29sdk_wifi_reset_state;
1683 static int rk29sdk_wifi_reset(int on)
1684 {
1685         pr_info("%s: %d\n", __func__, on);
1686         //mdelay(100);
1687         rk29sdk_wifi_reset_state = on;
1688         return 0;
1689 }
1690
1691 int rk29sdk_wifi_set_carddetect(int val)
1692 {
1693         pr_info("%s:%d\n", __func__, val);
1694         rk29sdk_wifi_cd = val;
1695         if (wifi_status_cb){
1696                 wifi_status_cb(val, wifi_status_cb_devid);
1697         }else {
1698                 pr_warning("%s, nobody to notify\n", __func__);
1699         }
1700         return 0;
1701 }
1702 EXPORT_SYMBOL(rk29sdk_wifi_set_carddetect);
1703
1704
1705 static struct resource resources[] = {
1706         {
1707                 .start = WIFI_HOST_WAKE,
1708                 .flags = IORESOURCE_IRQ,
1709                 .name = "bcmdhd_wlan_irq",
1710         },
1711 };
1712  //#if defined(CONFIG_WIFI_CONTROL_FUNC)----#elif
1713
1714 ///////////////////////////////////////////////////////////////////////////////////
1715 #elif defined(CONFIG_WIFI_COMBO_MODULE_CONTROL_FUNC)
1716
1717 #define debug_combo_system 0
1718
1719 int rk29sdk_wifi_combo_get_BGFgpio(void)
1720 {
1721     return rk_platform_wifi_gpio.bgf_int_b.io;
1722 }
1723 EXPORT_SYMBOL(rk29sdk_wifi_combo_get_BGFgpio);
1724
1725
1726 int rk29sdk_wifi_combo_get_GPS_SYNC_gpio(void)
1727 {
1728     return rk_platform_wifi_gpio.gps_sync.io;
1729 }
1730 EXPORT_SYMBOL(rk29sdk_wifi_combo_get_GPS_SYNC_gpio);
1731
1732
1733 static int rk29sdk_wifi_combo_module_gpio_init(void)
1734 {
1735     //VDDIO
1736     #ifdef RK30SDK_WIFI_GPIO_VCCIO_WL
1737         #ifdef RK30SDK_WIFI_GPIO_VCCIO_WL_PIN_NAME
1738         rk30_mux_api_set(rk_platform_wifi_gpio.vddio.iomux.name, rk_platform_wifi_gpio.vddio.iomux.fgpio);
1739         #endif
1740         gpio_request(rk_platform_wifi_gpio.vddio.io, "combo-VDDIO");    
1741             gpio_direction_output(rk_platform_wifi_gpio.vddio.io, !(rk_platform_wifi_gpio.power_n.enable));
1742     #endif
1743     
1744     //BGF_INT_B
1745     #ifdef RK30SDK_WIFI_GPIO_BGF_INT_B_PIN_NAME
1746     rk30_mux_api_set(rk_platform_wifi_gpio.bgf_int_b.iomux.name, rk_platform_wifi_gpio.bgf_int_b.iomux.fgpio);
1747     #endif
1748     gpio_request(rk_platform_wifi_gpio.bgf_int_b.io, "combo-BGFINT");
1749     gpio_pull_updown(rk_platform_wifi_gpio.bgf_int_b.io, GPIOPullUp);
1750     gpio_direction_input(rk_platform_wifi_gpio.bgf_int_b.io);
1751     
1752     //WIFI_INT_B
1753     #ifdef RK30SDK_WIFI_GPIO_WIFI_INT_B_PIN_NAME
1754     rk30_mux_api_set(rk_platform_wifi_gpio.bgf_int_b.iomux.name, rk_platform_wifi_gpio.bgf_int_b.iomux.fgpio);
1755     #endif
1756     gpio_request(rk_platform_wifi_gpio.wifi_int_b.io, "combo-WIFIINT");
1757     gpio_pull_updown(rk_platform_wifi_gpio.wifi_int_b.io, GPIOPullUp);
1758     gpio_direction_input(rk_platform_wifi_gpio.wifi_int_b.io); 
1759     
1760     //reset
1761     #ifdef RK30SDK_WIFI_GPIO_RESET_PIN_NAME
1762     rk30_mux_api_set(rk_platform_wifi_gpio.reset_n.iomux.name, rk_platform_wifi_gpio.reset_n.iomux.fgpio);
1763     #endif
1764     gpio_request(rk_platform_wifi_gpio.reset_n.io, "combo-RST");
1765     gpio_direction_output(rk_platform_wifi_gpio.reset_n.io, !(rk_platform_wifi_gpio.reset_n.enable));
1766
1767     //power
1768     #ifdef RK30SDK_WIFI_GPIO_POWER_PIN_NAME
1769     rk30_mux_api_set(rk_platform_wifi_gpio.power_n.iomux.name, rk_platform_wifi_gpio.power_n.iomux.fgpio);
1770     #endif
1771     gpio_request(rk_platform_wifi_gpio.power_n.io, "combo-PMUEN");      
1772         gpio_direction_output(rk_platform_wifi_gpio.power_n.io, !(rk_platform_wifi_gpio.power_n.enable));
1773
1774         #if COMBO_MODULE_MT6620_CDT
1775         //ANTSEL2
1776         #ifdef RK30SDK_WIFI_GPIO_ANTSEL2
1777             #ifdef RK30SDK_WIFI_GPIO_ANTSEL2_PIN_NAME
1778         rk30_mux_api_set(rk_platform_wifi_gpio.ANTSEL2.iomux.name, rk_platform_wifi_gpio.ANTSEL2.iomux.fgpio);
1779         #endif
1780     gpio_request(rk_platform_wifi_gpio.ANTSEL2.io, "combo-ANTSEL2");
1781     gpio_direction_output(rk_platform_wifi_gpio.reset_n.io, rk_platform_wifi_gpio.ANTSEL2.enable);
1782     #endif
1783
1784     //ANTSEL3
1785     #ifdef RK30SDK_WIFI_GPIO_ANTSEL3
1786         #ifdef RK30SDK_WIFI_GPIO_ANTSEL3_PIN_NAME
1787         rk30_mux_api_set(rk_platform_wifi_gpio.ANTSEL3.iomux.name, rk_platform_wifi_gpio.ANTSEL3.iomux.fgpio);
1788         #endif
1789     gpio_request(rk_platform_wifi_gpio.ANTSEL3.io, "combo-ANTSEL3");
1790     gpio_direction_output(rk_platform_wifi_gpio.ANTSEL3.io, rk_platform_wifi_gpio.ANTSEL3.enable);
1791     #endif
1792
1793     //GPS_LAN
1794     #ifdef RK30SDK_WIFI_GPIO_GPS_LAN
1795         #ifdef RK30SDK_WIFI_GPIO_GPS_LAN_PIN_NAME
1796         rk30_mux_api_set(rk_platform_wifi_gpio.GPS_LAN.iomux.name, rk_platform_wifi_gpio.GPS_LAN.iomux.fgpio);
1797         #endif
1798     gpio_request(rk_platform_wifi_gpio.GPS_LAN.io, "combo-GPSLAN");
1799     gpio_direction_output(rk_platform_wifi_gpio.GPS_LAN.io, rk_platform_wifi_gpio.GPS_LAN.enable);
1800         #endif
1801
1802         #endif//#if COMBO_MODULE_MT6620_CDT ---#endif 
1803
1804     return 0;
1805 }
1806
1807
1808 int rk29sdk_wifi_combo_module_power(int on)
1809 {
1810      if(on)
1811     {
1812     #ifdef RK30SDK_WIFI_GPIO_VCCIO_WL
1813         gpio_set_value(rk_platform_wifi_gpio.vddio.io, rk_platform_wifi_gpio.vddio.enable);
1814         mdelay(10);
1815     #endif
1816         
1817         gpio_set_value(rk_platform_wifi_gpio.power_n.io, rk_platform_wifi_gpio.power_n.enable);     
1818         mdelay(10);
1819         pr_info("combo-module turn on power\n");
1820     }
1821     else
1822     {
1823         gpio_set_value(rk_platform_wifi_gpio.power_n.io, !(rk_platform_wifi_gpio.power_n.enable) );        
1824         mdelay(10);
1825
1826          #ifdef RK30SDK_WIFI_GPIO_VCCIO_WL      
1827         gpio_set_value(rk_platform_wifi_gpio.vddio.io, !(rk_platform_wifi_gpio.vddio.enable));
1828          #endif
1829          
1830         pr_info("combo-module turn off power\n");
1831     }
1832      return 0;
1833     
1834 }
1835 EXPORT_SYMBOL(rk29sdk_wifi_combo_module_power);
1836
1837
1838 int rk29sdk_wifi_combo_module_reset(int on)
1839 {
1840     if(on)
1841     {
1842         gpio_set_value(rk_platform_wifi_gpio.reset_n.io, rk_platform_wifi_gpio.reset_n.enable);     
1843         pr_info("combo-module reset out 1\n");
1844     }
1845     else
1846     {
1847         gpio_set_value(rk_platform_wifi_gpio.reset_n.io, !(rk_platform_wifi_gpio.reset_n.enable) );        
1848         pr_info("combo-module  reset out 0\n");
1849     }
1850
1851     return 0;   
1852 }
1853 EXPORT_SYMBOL(rk29sdk_wifi_combo_module_reset);
1854
1855
1856 static int rk29sdk_wifi_mmc0_status(struct device *dev)
1857 {
1858         return rk29sdk_wifi_mmc0_cd;
1859 }
1860
1861 static int rk29sdk_wifi_mmc0_status_register(void (*callback)(int card_present, void *dev_id), void *dev_id)
1862 {
1863         if(wifi_mmc0_status_cb)
1864                 return -EAGAIN;
1865         wifi_mmc0_status_cb = callback;
1866         wifi_mmc0_status_cb_devid = dev_id;
1867         return 0;
1868 }
1869
1870
1871 static int rk29sdk_wifi_status(struct device *dev)
1872 {
1873         return rk29sdk_wifi_cd;
1874 }
1875
1876 static int rk29sdk_wifi_status_register(void (*callback)(int card_present, void *dev_id), void *dev_id)
1877 {
1878         if(wifi_status_cb)
1879                 return -EAGAIN;
1880         wifi_status_cb = callback;
1881         wifi_status_cb_devid = dev_id;
1882         return 0;
1883 }
1884
1885 int rk29sdk_wifi_power(int on)
1886 {
1887     pr_info("%s: %d\n", __func__, on);
1888     if (on){
1889     
1890         #if defined(CONFIG_SDMMC1_RK29) && !defined(CONFIG_SDMMC_RK29_OLD)  
1891             
1892           #if defined(CONFIG_USE_SDMMC0_FOR_WIFI_DEVELOP_BOARD)
1893              rk29_sdmmc_gpio_open(0, 1); 
1894           #else
1895             rk29_sdmmc_gpio_open(1, 0);                
1896             mdelay(10);
1897             rk29_sdmmc_gpio_open(1, 1); 
1898           #endif 
1899         #endif
1900     
1901             mdelay(100);
1902             pr_info("wifi turn on power\n");
1903     }
1904     else
1905     {    
1906 #if defined(CONFIG_SDMMC1_RK29) && !defined(CONFIG_SDMMC_RK29_OLD)
1907         #if defined(CONFIG_USE_SDMMC0_FOR_WIFI_DEVELOP_BOARD)
1908         rk29_sdmmc_gpio_open(0, 0);
1909         #else
1910         rk29_sdmmc_gpio_open(1, 0);
1911         #endif
1912 #endif      
1913         mdelay(100);
1914         pr_info("wifi shut off power\n");
1915          
1916     }
1917     
1918     rk29sdk_wifi_power_state = on;
1919     return 0;
1920
1921 }
1922 EXPORT_SYMBOL(rk29sdk_wifi_power);
1923
1924
1925 int rk29sdk_wifi_reset(int on)
1926 {    
1927     return 0;
1928 }
1929 EXPORT_SYMBOL(rk29sdk_wifi_reset);
1930
1931
1932 #if defined(CONFIG_USE_SDMMC0_FOR_WIFI_DEVELOP_BOARD)
1933 int rk29sdk_wifi_set_carddetect(int val)
1934 {
1935     pr_info("%s:%d\n", __func__, val);
1936     rk29sdk_wifi_mmc0_cd = val;
1937     if (wifi_mmc0_status_cb){
1938             wifi_mmc0_status_cb(val, wifi_mmc0_status_cb_devid);
1939     }else {
1940             pr_warning("%s,in mmc0 nobody to notify\n", __func__);
1941     }
1942     return 0; 
1943 }
1944
1945 #else
1946 int rk29sdk_wifi_set_carddetect(int val)
1947 {
1948     pr_info("%s:%d\n", __func__, val);
1949     rk29sdk_wifi_cd = val;
1950     if (wifi_status_cb){
1951             wifi_status_cb(val, wifi_status_cb_devid);
1952     }else {
1953             pr_warning("%s,in mmc1 nobody to notify\n", __func__);
1954     }
1955     return 0; 
1956 }
1957 #endif
1958
1959 EXPORT_SYMBOL(rk29sdk_wifi_set_carddetect);
1960
1961 ///////////////////////////////////////////////////////////////////////////////////
1962 #endif  //#if defined(CONFIG_WIFI_CONTROL_FUNC)---#elif defined(CONFIG_WIFI_COMBO_MODULE_CONTROL_FUNC) --#endif
1963
1964
1965
1966 #if defined(CONFIG_WIFI_CONTROL_FUNC)
1967 static struct wifi_platform_data rk29sdk_wifi_control = {
1968         .set_power = rk29sdk_wifi_power,
1969         .set_reset = rk29sdk_wifi_reset,
1970         .set_carddetect = rk29sdk_wifi_set_carddetect,
1971         .mem_prealloc   = rk29sdk_mem_prealloc,
1972 };
1973
1974 static struct platform_device rk29sdk_wifi_device = {
1975         .name = "bcmdhd_wlan",
1976         .id = 1,
1977         .num_resources = ARRAY_SIZE(resources),
1978         .resource = resources,
1979         .dev = {
1980                 .platform_data = &rk29sdk_wifi_control,
1981          },
1982 };
1983
1984 #elif defined(CONFIG_WIFI_COMBO_MODULE_CONTROL_FUNC)
1985
1986     #if debug_combo_system
1987         static struct combo_module_platform_data rk29sdk_combo_module_control = {
1988             .set_power = rk29sdk_wifi_combo_module_power,
1989             .set_reset = rk29sdk_wifi_combo_module_reset,  
1990         };
1991
1992         static struct platform_device  rk29sdk_combo_module_device = {
1993                 .name = "combo-system",
1994                 .id = 1,
1995                 .dev = {
1996                         .platform_data = &rk29sdk_combo_module_control,
1997                  },
1998         };
1999     #endif
2000
2001 static struct wifi_platform_data rk29sdk_wifi_control = {
2002         .set_power = rk29sdk_wifi_power,
2003         .set_reset = rk29sdk_wifi_reset,
2004         .set_carddetect = rk29sdk_wifi_set_carddetect,
2005 };
2006
2007 static struct platform_device rk29sdk_wifi_device = {
2008         .name = "combo-wifi",
2009         .id = 1,
2010         .dev = {
2011                 .platform_data = &rk29sdk_wifi_control,
2012          },
2013 };
2014
2015 #endif
2016
2017