rk3066b m701:change screen stb timing
[firefly-linux-kernel-4.4.55.git] / arch / arm / mach-rk30 / board-rk3066b-m701.c
1 /*
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
16 #include <linux/kernel.h>
17 #include <linux/init.h>
18 #include <linux/platform_device.h>
19 #include <linux/input.h>
20 #include <linux/io.h>
21 #include <linux/delay.h>
22 #include <linux/i2c.h>
23 #include <linux/skbuff.h>
24 #include <linux/spi/spi.h>
25 #include <linux/mmc/host.h>
26 #include <linux/ion.h>
27 #include <linux/cpufreq.h>
28 #include <linux/clk.h>
29 #include <mach/dvfs.h>
30
31 #include <asm/setup.h>
32 #include <asm/mach-types.h>
33 #include <asm/mach/arch.h>
34 #include <asm/mach/map.h>
35 #include <asm/mach/flash.h>
36 #include <asm/hardware/gic.h>
37
38 #include <mach/board.h>
39 #include <mach/hardware.h>
40 #include <mach/io.h>
41 #include <mach/gpio.h>
42 #include <mach/iomux.h>
43 #include <linux/fb.h>
44 #include <linux/regulator/machine.h>
45 #include <linux/rfkill-rk.h>
46 #include <linux/sensor-dev.h>
47 #include <linux/mfd/tps65910.h>
48 #include <linux/regulator/rk29-pwm-regulator.h>
49
50 #if defined(CONFIG_MFD_RK610)
51 #include <linux/mfd/rk610_core.h>
52 #endif
53
54 #if defined(CONFIG_HDMI_RK30)
55         #include "../../../drivers/video/rockchip/hdmi/rk_hdmi.h"
56 #endif
57
58 #if defined(CONFIG_SPIM_RK29)
59 #include "../../../drivers/spi/rk29_spim.h"
60 #endif
61 #if defined(CONFIG_MU509)
62 #include <linux/mu509.h>
63 #endif
64 #if defined(CONFIG_MW100)
65 #include <linux/mw100.h>
66 #endif
67 #if defined(CONFIG_MT6229)
68 #include <linux/mt6229.h>
69 #endif
70 #if defined(CONFIG_SEW868)
71 #include <linux/sew868.h>
72 #endif
73 #if defined(CONFIG_ANDROID_TIMED_GPIO)
74 #include "../../../drivers/staging/android/timed_gpio.h"
75 #endif
76
77 #ifdef  CONFIG_THREE_FB_BUFFER
78 #define RK30_FB0_MEM_SIZE 12*SZ_1M
79 #else
80 #define RK30_FB0_MEM_SIZE 8*SZ_1M
81 #endif
82
83 #include "board-rk3066b-m701-camera.c"
84 #include "board-rk3066b-m701-key.c"
85
86 #if defined(CONFIG_TOUCHSCREEN_GT8XX)
87 #define TOUCH_RESET_PIN  RK30_PIN2_PC0
88 #define TOUCH_PWR_PIN    RK30_PIN2_PB4
89 static int goodix_init_platform_hw(void)
90 {
91         int ret;
92         
93         rk30_mux_api_set(GPIO2C0_LCDC1DATA16_SMCADDR0_TRACECLK_NAME, GPIO2C_GPIO2C0);
94         rk30_mux_api_set(GPIO2B4_LCDC1DATA12_SMCDATA12_TRACEDATA12_NAME, GPIO2B_GPIO2B4);
95         printk("%s:0x%x,0x%x\n",__func__,rk30_mux_api_get(GPIO2C0_LCDC1DATA16_SMCADDR0_TRACECLK_NAME),rk30_mux_api_get(GPIO2B4_LCDC1DATA12_SMCDATA12_TRACEDATA12_NAME));
96
97         if (TOUCH_PWR_PIN != INVALID_GPIO) {
98                 ret = gpio_request(TOUCH_PWR_PIN, "goodix power pin");
99                 if (ret != 0) {
100                         gpio_free(TOUCH_PWR_PIN);
101                         printk("goodix power error\n");
102                         return -EIO;
103                 }
104                 gpio_direction_output(TOUCH_PWR_PIN, 0);
105                 gpio_set_value(TOUCH_PWR_PIN, GPIO_LOW);
106                 msleep(100);
107         }
108
109         if (TOUCH_RESET_PIN != INVALID_GPIO) {
110                 ret = gpio_request(TOUCH_RESET_PIN, "goodix reset pin");
111                 if (ret != 0) {
112                         gpio_free(TOUCH_RESET_PIN);
113                         printk("goodix gpio_request error\n");
114                         return -EIO;
115                 }
116                 gpio_direction_output(TOUCH_RESET_PIN, 1);
117                 msleep(100);
118                 //gpio_set_value(TOUCH_RESET_PIN, GPIO_LOW);
119                 //msleep(100);
120                 //gpio_set_value(TOUCH_RESET_PIN, GPIO_HIGH);
121                 //msleep(500);
122         }
123         return 0;
124 }
125
126 struct goodix_platform_data goodix_info = {
127         .model = 8105,
128         .irq_pin = RK30_PIN0_PD4,
129         .rest_pin = TOUCH_RESET_PIN,
130         .init_platform_hw = goodix_init_platform_hw,
131 };
132 #endif
133
134 #if defined (CONFIG_TOUCHSCREEN_FT5306_AV)
135
136 #define TOUCH_RESET_PIN  RK30_PIN2_PC0
137 #define TOUCH_INT_PIN    RK30_PIN0_PD4
138 #define TOUCH_PWR_PIN    RK30_PIN2_PB4
139
140 static int ft5306_init_platform_hw(void)
141 {
142
143         rk30_mux_api_set(GPIO2C0_LCDC1DATA16_SMCADDR0_TRACECLK_NAME, GPIO2C_GPIO2C0);
144         rk30_mux_api_set(GPIO0D4_SPI1RXD_NAME, GPIO0D_GPIO0D4);
145         rk30_mux_api_set(GPIO2B4_LCDC1DATA12_SMCDATA12_TRACEDATA12_NAME, GPIO2B_GPIO2B4);
146        //printk("%s:0x%x,0x%x\n",__func__,rk30_mux_api_get(GPIO2C0_LCDC1DATA16_SMCADDR0_TRACECLK_NAME),rk30_mux_api_get(GPIO2B4_LCDC1DATA12_SMCDATA12_TRACEDATA12_NAME));
147
148         printk("ft5306_init_platform_hw \n");
149         if(gpio_request(TOUCH_RESET_PIN,NULL) != 0){
150           gpio_free(TOUCH_RESET_PIN);
151           printk("ft5306_init_platform_hw gpio_request error\n");
152           return -EIO;
153         }
154
155         if(gpio_request(TOUCH_INT_PIN,NULL) != 0){
156           gpio_free(TOUCH_INT_PIN);
157           printk("ift5306_init_platform_hw gpio_request error\n");
158           return -EIO;
159         }
160
161         gpio_direction_output(TOUCH_RESET_PIN, 0);
162         gpio_set_value(TOUCH_RESET_PIN,GPIO_LOW);
163         mdelay(50);
164         gpio_direction_input(TOUCH_INT_PIN);
165         mdelay(10);
166         gpio_set_value(TOUCH_RESET_PIN,GPIO_HIGH);
167         msleep(300);
168         return 0;
169 }
170
171 void ft5306_exit_platform_hw(void)
172 {
173         printk("ft5606_exit_platform_hw\n");
174         gpio_free(TOUCH_RESET_PIN);
175         gpio_free(TOUCH_INT_PIN);
176 }
177
178 int ft5306_platform_sleep(void)
179 {
180         printk("ft5606_platform_sleep\n");
181         gpio_set_value(TOUCH_RESET_PIN,GPIO_LOW);
182         return 0;
183 }
184
185 int ft5306_platform_wakeup(void)
186 {
187         printk("ft5606_platform_wakeup\n");
188         gpio_set_value(TOUCH_RESET_PIN,GPIO_HIGH);
189         msleep(300);
190         return 0;
191 }
192
193 struct ft5606_platform_data ft5306_info = {
194
195   .init_platform_hw= ft5306_init_platform_hw,
196   .exit_platform_hw= ft5306_exit_platform_hw,
197   .platform_sleep= ft5306_platform_sleep,
198   .platform_wakeup= ft5306_platform_wakeup,
199 };
200 #endif
201
202
203 static struct spi_board_info board_spi_devices[] = {
204 };
205
206 /***********************************************************
207 *       rk30  backlight
208 ************************************************************/
209 #ifdef CONFIG_BACKLIGHT_RK29_BL
210 #define PWM_ID            2
211 #define PWM_MUX_NAME      GPIO3D5_PWM2_JTAGTCK_OTGDRVVBUS_NAME
212 #define PWM_MUX_MODE      GPIO3D_PWM2
213 #define PWM_MUX_MODE_GPIO GPIO3D_GPIO3D5
214 #define PWM_GPIO          RK30_PIN3_PD5
215 #define PWM_EFFECT_VALUE  0
216
217 #define LCD_DISP_ON_PIN
218
219 #ifdef  LCD_DISP_ON_PIN
220 #define BL_EN_PIN         RK30_PIN0_PA2
221 #define BL_EN_VALUE       GPIO_HIGH
222 #endif
223 static int rk29_backlight_io_init(void)
224 {
225         int ret = 0;
226         rk30_mux_api_set(PWM_MUX_NAME, PWM_MUX_MODE);
227 #ifdef  LCD_DISP_ON_PIN
228         // rk30_mux_api_set(BL_EN_MUX_NAME, BL_EN_MUX_MODE);
229
230         ret = gpio_request(BL_EN_PIN, NULL);
231         if (ret != 0) {
232                 gpio_free(BL_EN_PIN);
233         }
234
235         gpio_direction_output(BL_EN_PIN, 0);
236         gpio_set_value(BL_EN_PIN, BL_EN_VALUE);
237 #endif
238         return ret;
239 }
240
241 static int rk29_backlight_io_deinit(void)
242 {
243         int ret = 0;
244 #ifdef  LCD_DISP_ON_PIN
245         gpio_direction_output(BL_EN_PIN, 0);
246         gpio_set_value(BL_EN_PIN, !BL_EN_VALUE);
247         gpio_free(BL_EN_PIN);
248 #endif
249         rk30_mux_api_set(PWM_MUX_NAME, PWM_MUX_MODE_GPIO);
250         gpio_request(PWM_GPIO, NULL);
251         gpio_direction_output(PWM_GPIO, GPIO_LOW);
252         return ret;
253 }
254
255 static int rk29_backlight_pwm_suspend(void)
256 {
257         int ret = 0;
258         rk30_mux_api_set(PWM_MUX_NAME, PWM_MUX_MODE_GPIO);
259         if (gpio_request(PWM_GPIO, NULL)) {
260                 printk("func %s, line %d: request gpio fail\n", __FUNCTION__, __LINE__);
261                 return -1;
262         }
263         gpio_direction_output(PWM_GPIO, GPIO_LOW);
264 #ifdef  LCD_DISP_ON_PIN
265         gpio_direction_output(BL_EN_PIN, 0);
266         gpio_set_value(BL_EN_PIN, !BL_EN_VALUE);
267 #endif
268         return ret;
269 }
270
271 static int rk29_backlight_pwm_resume(void)
272 {
273         gpio_free(PWM_GPIO);
274         rk30_mux_api_set(PWM_MUX_NAME, PWM_MUX_MODE);
275 #ifdef  LCD_DISP_ON_PIN
276         msleep(30);
277         gpio_direction_output(BL_EN_PIN, 1);
278         gpio_set_value(BL_EN_PIN, BL_EN_VALUE);
279 #endif
280         return 0;
281 }
282
283 static struct rk29_bl_info rk29_bl_info = {
284         .pwm_id = PWM_ID,
285         .bl_ref = PWM_EFFECT_VALUE,
286         .io_init = rk29_backlight_io_init,
287         .io_deinit = rk29_backlight_io_deinit,
288         .min_brightness = 48,
289         .pwm_suspend = rk29_backlight_pwm_suspend,
290         .pwm_resume = rk29_backlight_pwm_resume,
291 };
292
293 static struct platform_device rk29_device_backlight = {
294         .name   = "rk29_backlight",
295         .id     = -1,
296         .dev    = {
297                 .platform_data  = &rk29_bl_info,
298         }
299 };
300
301 #endif
302
303 #ifdef CONFIG_RK29_SUPPORT_MODEM
304
305 #define RK30_MODEM_POWER        RK30_PIN2_PB0
306 #define RK30_MODEM_POWER_IOMUX  rk29_mux_api_set(GPIO2B0_LCDC1DATA8_SMCDATA8_TRACEDATA8_NAME, GPIO2B_GPIO2B0)
307
308 static int rk30_modem_io_init(void)
309 {
310     printk("%s\n", __FUNCTION__);
311     RK30_MODEM_POWER_IOMUX;
312
313         return 0;
314 }
315
316 static struct rk29_io_t rk30_modem_io = {
317     .io_addr    = RK30_MODEM_POWER,
318     .enable     = GPIO_HIGH,
319     .disable    = GPIO_LOW,
320     .io_init    = rk30_modem_io_init,
321 };
322
323 static struct platform_device rk30_device_modem = {
324         .name   = "rk30_modem",
325         .id     = -1,
326         .dev    = {
327                 .platform_data  = &rk30_modem_io,
328         }
329 };
330 #endif
331 #if defined(CONFIG_MU509)
332 static int mu509_io_init(void)
333 {
334
335         rk30_mux_api_set(GPIO2B0_LCDC1DATA8_SMCDATA8_TRACEDATA8_NAME, GPIO2B_GPIO2B0);
336        rk30_mux_api_set(GPIO2D1_LCDC1DEN_SMCWEN_NAME, GPIO2D_GPIO2D1);
337         rk30_mux_api_set(GPIO2B7_LCDC1DATA15_SMCADDR19_HSADCDATA7_NAME, GPIO2B_GPIO2B7);
338         rk30_mux_api_set(GPIO2C0_LCDCDATA16_GPSCLK_HSADCCLKOUT_NAME, GPIO2C_GPIO2C0);
339         return 0;
340 }
341
342 static int mu509_io_deinit(void)
343 {
344         
345         return 0;
346 }
347  
348 struct rk29_mu509_data rk29_mu509_info = {
349         .io_init = mu509_io_init,
350         .io_deinit = mu509_io_deinit,
351         .modem_power_en = RK30_PIN2_PB0,
352         .bp_power = RK30_PIN2_PB0,
353         .bp_reset = RK30_PIN2_PD1,
354         .ap_wakeup_bp = RK30_PIN2_PB7,
355         .bp_wakeup_ap = RK30_PIN6_PA0, 
356 };
357 struct platform_device rk29_device_mu509 = {    
358         .name = "mu509",        
359         .id = -1,       
360         .dev            = {
361                 .platform_data = &rk29_mu509_info,
362         }       
363     };
364 #endif
365 #if defined(CONFIG_MW100)
366 static int mw100_io_init(void)
367 {
368          rk30_mux_api_set(GPIO2B0_LCDC1DATA8_SMCDATA8_TRACEDATA8_NAME, GPIO2B_GPIO2B0);
369          rk30_mux_api_set(GPIO2D1_LCDC1DEN_SMCWEN_NAME, GPIO2D_GPIO2D1);
370          rk30_mux_api_set(GPIO2B7_LCDC1DATA15_SMCADDR19_HSADCDATA7_NAME, GPIO2B_GPIO2B7);
371          rk30_mux_api_set(GPIO2C0_LCDCDATA16_GPSCLK_HSADCCLKOUT_NAME, GPIO2C_GPIO2C0);
372         return 0;
373 }
374
375 static int mw100_io_deinit(void)
376 {
377         
378         return 0;
379 }
380  
381 struct rk29_mw100_data rk29_mw100_info = {
382         .io_init = mw100_io_init,
383         .io_deinit = mw100_io_deinit,
384         .modem_power_en = RK30_PIN6_PB0,
385         .bp_power = RK30_PIN2_PB0,
386         .bp_reset = RK30_PIN2_PD1,
387         .ap_wakeup_bp = RK30_PIN2_PB7,
388         .bp_wakeup_ap = RK30_PIN6_PA0,
389 };
390 struct platform_device rk29_device_mw100 = {    
391         .name = "mw100",        
392         .id = -1,       
393         .dev            = {
394                 .platform_data = &rk29_mw100_info,
395         }       
396     };
397 #endif
398 #if defined(CONFIG_MT6229)
399 static int mt6229_io_init(void)
400 {
401          rk30_mux_api_set(GPIO2B0_LCDC1DATA8_SMCDATA8_TRACEDATA8_NAME, GPIO2B_GPIO2B0);
402          rk30_mux_api_set(GPIO2D1_LCDC1DEN_SMCWEN_NAME, GPIO2D_GPIO2D1);
403          rk30_mux_api_set(GPIO2B7_LCDC1DATA15_SMCADDR19_HSADCDATA7_NAME, GPIO2B_GPIO2B7);
404          rk30_mux_api_set(GPIO2C0_LCDCDATA16_GPSCLK_HSADCCLKOUT_NAME, GPIO2C_GPIO2C0);
405         return 0;
406 }
407
408 static int mt6229_io_deinit(void)
409 {
410         
411         return 0;
412 }
413  
414 struct rk29_mt6229_data rk29_mt6229_info = {
415         .io_init = mt6229_io_init,
416         .io_deinit = mt6229_io_deinit,
417         .modem_power_en = RK30_PIN2_PB0,
418         .bp_power = RK30_PIN2_PB0,//RK30_PIN2_PB6,
419         .bp_reset = RK30_PIN2_PD1,
420         .ap_wakeup_bp = RK30_PIN2_PC0,
421         .bp_wakeup_ap = RK30_PIN6_PA0,
422 };
423 struct platform_device rk29_device_mt6229 = {   
424         .name = "mt6229",       
425         .id = -1,       
426         .dev            = {
427                 .platform_data = &rk29_mt6229_info,
428         }       
429     };
430 #endif
431 #if defined(CONFIG_SEW868)
432 static int sew868_io_init(void)
433 {
434         rk30_mux_api_set(GPIO2B6_LCDC1DATA14_SMCADDR18_TSSYNC_NAME, GPIO2B_GPIO2B6);
435     rk30_mux_api_set(GPIO4D2_SMCDATA10_TRACEDATA10_NAME, GPIO4D_GPIO4D2);
436         rk30_mux_api_set(GPIO4D4_SMCDATA12_TRACEDATA12_NAME, GPIO4D_GPIO4D4);
437         return 0;
438 }
439 static int sew868_io_deinit(void)
440 {
441         return 0;
442 }
443 struct rk30_sew868_data rk30_sew868_info = {
444         .io_init = sew868_io_init,
445         .io_deinit = sew868_io_deinit,
446         .bp_power = RK30_PIN6_PB2, 
447         .bp_power_active_low = 1,
448         .bp_sys = RK30_PIN2_PB6, 
449         .bp_reset = RK30_PIN4_PD2, 
450         .bp_reset_active_low = 1,
451         .bp_wakeup_ap = RK30_PIN4_PD4, 
452         .ap_wakeup_bp = NULL,
453 };
454
455 struct platform_device rk30_device_sew868 = {   
456         .name = "sew868",       
457         .id = -1,       
458         .dev            = {
459                 .platform_data = &rk30_sew868_info,
460         }       
461     };
462 #endif
463
464
465 /*MMA7660 gsensor*/
466 #if defined (CONFIG_GS_MMA7660)
467 #define MMA7660_INT_PIN   RK30_PIN3_PD7
468
469 static int mma7660_init_platform_hw(void)
470 {
471       if(gpio_request(MMA7660_INT_PIN, NULL) != 0){
472       gpio_free(MMA7660_INT_PIN);
473       printk("gsensor gpio_request error\n");
474       return -EIO;
475     }
476       //gpio_direction_input(MMA7660_INT_PIN);
477       return 0;
478 }
479
480 static struct sensor_platform_data mma7660_info = {
481         .type = SENSOR_TYPE_ACCEL,
482         .irq_enable = 1,
483         .poll_delay_ms = 30,
484         .init_platform_hw = mma7660_init_platform_hw,
485         .orientation = {0, 1, 0, 0, 0, -1, 1, 0, 0},
486 };
487 #endif
488
489
490 /*MMA8452 gsensor*/
491 #if defined (CONFIG_GS_MMA8452)
492 #define MMA8452_INT_PIN   RK30_PIN3_PD7
493
494 static int mma8452_init_platform_hw(void)
495 {
496         return 0;
497 }
498
499 static struct sensor_platform_data mma8452_info = {
500         .type = SENSOR_TYPE_ACCEL,
501         .irq_enable = 1,
502         .poll_delay_ms = 30,
503         .init_platform_hw = mma8452_init_platform_hw,
504         .orientation = {-1, 0, 0, 0, 0, 1, 0, -1, 0},
505 };
506 #endif
507 #if defined (CONFIG_GS_LIS3DH)
508 #define LIS3DH_INT_PIN   RK30_PIN3_PD7
509
510 static int lis3dh_init_platform_hw(void)
511 {
512
513         return 0;
514 }
515
516 static struct sensor_platform_data lis3dh_info = {
517         .type = SENSOR_TYPE_ACCEL,
518         .irq_enable = 1,
519         .poll_delay_ms = 30,
520         .init_platform_hw = lis3dh_init_platform_hw,
521         .orientation = {-1, 0, 0, 0, 0, 1, 0, -1, 0},
522 };
523 #endif
524 #if defined (CONFIG_COMPASS_AK8975)
525 static struct sensor_platform_data akm8975_info =
526 {
527         .type = SENSOR_TYPE_COMPASS,
528         .irq_enable = 1,
529         .poll_delay_ms = 30,
530         .m_layout = 
531         {
532                 {
533                         {1, 0, 0},
534                         {0, 1, 0},
535                         {0, 0, 1},
536                 },
537
538                 {
539                         {1, 0, 0},
540                         {0, 1, 0},
541                         {0, 0, 1},
542                 },
543
544                 {
545                         {1, 0, 0},
546                         {0, 1, 0},
547                         {0, 0, 1},
548                 },
549
550                 {
551                         {1, 0, 0},
552                         {0, 1, 0},
553                         {0, 0, 1},
554                 },
555         }
556 };
557
558 #endif
559
560 #if defined(CONFIG_GYRO_L3G4200D)
561
562 #include <linux/l3g4200d.h>
563 #define L3G4200D_INT_PIN  RK30_PIN0_PB4
564
565 static int l3g4200d_init_platform_hw(void)
566 {
567         return 0;
568 }
569
570 static struct sensor_platform_data l3g4200d_info = {
571         .type = SENSOR_TYPE_GYROSCOPE,
572         .irq_enable = 1,
573         .poll_delay_ms = 30,
574         .orientation = {0, 1, 0, -1, 0, 0, 0, 0, 1},
575         .init_platform_hw = l3g4200d_init_platform_hw,
576         .x_min = 40,//x_min,y_min,z_min = (0-100) according to hardware
577         .y_min = 40,
578         .z_min = 20,
579 };
580
581 #endif
582
583 #ifdef CONFIG_LS_CM3217
584 static struct sensor_platform_data cm3217_info = {
585         .type = SENSOR_TYPE_LIGHT,
586         .irq_enable = 0,
587         .poll_delay_ms = 500,
588 };
589
590 #endif
591
592 #ifdef CONFIG_FB_ROCKCHIP
593
594 #define LCD_CS_PIN         RK30_PIN2_PB6
595 #define LCD_CS_VALUE       GPIO_HIGH
596
597 #define LCD_EN_PIN         RK30_PIN0_PB0
598 #define LCD_EN_VALUE       GPIO_LOW
599
600 #define LCD_STB_PIN        RK30_PIN2_PB3
601 #define LCD_STB_VALUE      GPIO_HIGH
602
603 static int rk_fb_io_init(struct rk29_fb_setting_info *fb_setting)
604 {
605         int ret = 0;
606
607         if(LCD_STB_PIN !=INVALID_GPIO)
608         {
609                 ret = gpio_request(LCD_STB_PIN, NULL);
610                 if (ret != 0)
611                 {
612                         gpio_free(LCD_STB_PIN);
613                         printk(KERN_ERR "request lcd en pin fail!\n");
614                         return -1;
615                 }
616                 else
617                 {
618                         gpio_direction_output(LCD_STB_PIN, LCD_STB_VALUE);
619                 }
620         }
621
622         msleep(100);
623         if(LCD_CS_PIN !=INVALID_GPIO)
624         {
625                 ret = gpio_request(LCD_CS_PIN, NULL);
626                 if (ret != 0)
627                 {
628                         gpio_free(LCD_CS_PIN);
629                         printk(KERN_ERR "request lcd cs pin fail!\n");
630                         return -1;
631                 }
632                 else
633                 {
634                         gpio_direction_output(LCD_CS_PIN, LCD_CS_VALUE);
635                 }
636         }
637
638         if(LCD_EN_PIN !=INVALID_GPIO)
639         {
640                 ret = gpio_request(LCD_EN_PIN, NULL);
641                 if (ret != 0)
642                 {
643                         gpio_free(LCD_EN_PIN);
644                         printk(KERN_ERR "request lcd en pin fail!\n");
645                         return -1;
646                 }
647                 else
648                 {
649                         gpio_direction_output(LCD_EN_PIN, LCD_EN_VALUE);
650                 }
651         }
652
653
654         return 0;
655 }
656 static int rk_fb_io_disable(void)
657 {
658         if(LCD_STB_PIN !=INVALID_GPIO)
659         {
660                 gpio_set_value(LCD_STB_PIN, !LCD_STB_VALUE);
661         }
662         msleep(50);
663         if(LCD_CS_PIN !=INVALID_GPIO)
664         {
665                 gpio_set_value(LCD_CS_PIN, !LCD_CS_VALUE);
666         }
667         if(LCD_EN_PIN !=INVALID_GPIO)
668         {
669                 gpio_set_value(LCD_EN_PIN, !LCD_EN_VALUE);
670         }
671
672         return 0;
673 }
674 static int rk_fb_io_enable(void)
675 {
676         if(LCD_STB_PIN !=INVALID_GPIO)
677         {
678                 gpio_set_value(LCD_STB_PIN, LCD_STB_VALUE);
679         }
680         msleep(50);
681         if(LCD_CS_PIN !=INVALID_GPIO)
682         {
683                 gpio_set_value(LCD_CS_PIN, LCD_CS_VALUE);
684         }
685         if(LCD_EN_PIN !=INVALID_GPIO)
686         {
687                 gpio_set_value(LCD_EN_PIN, LCD_EN_VALUE);
688         }
689         return 0;
690 }
691
692 #if defined(CONFIG_LCDC0_RK3066B)
693 struct rk29fb_info lcdc0_screen_info = {
694         .prop      = PRMRY,             //primary display device
695         .io_init   = rk_fb_io_init,
696         .io_disable = rk_fb_io_disable,
697         .io_enable = rk_fb_io_enable,
698         .set_screen_info = set_lcd_info,
699 };
700 #endif
701
702 #if defined(CONFIG_LCDC1_RK3066B)
703 struct rk29fb_info lcdc1_screen_info = {
704         #if defined(CONFIG_HDMI_RK30)
705         .prop           = EXTEND,       //extend display device
706         .lcd_info  = NULL,
707         .set_screen_info = hdmi_init_lcdc,
708         #endif
709 };
710 #endif
711
712 static struct resource resource_fb[] = {
713         [0] = {
714                 .name  = "fb0 buf",
715                 .start = 0,
716                 .end   = 0,//RK30_FB0_MEM_SIZE - 1,
717                 .flags = IORESOURCE_MEM,
718         },
719         [1] = {
720                 .name  = "ipp buf",  //for rotate
721                 .start = 0,
722                 .end   = 0,//RK30_FB0_MEM_SIZE - 1,
723                 .flags = IORESOURCE_MEM,
724         },
725         [2] = {
726                 .name  = "fb2 buf",
727                 .start = 0,
728                 .end   = 0,//RK30_FB0_MEM_SIZE - 1,
729                 .flags = IORESOURCE_MEM,
730         },
731 };
732
733 static struct platform_device device_fb = {
734         .name           = "rk-fb",
735         .id             = -1,
736         .num_resources  = ARRAY_SIZE(resource_fb),
737         .resource       = resource_fb,
738 };
739 #endif
740
741 #if defined(CONFIG_LCDC0_RK3066B)
742 static struct resource resource_lcdc0[] = {
743         [0] = {
744                 .name  = "lcdc0 reg",
745                 .start = RK30_LCDC0_PHYS,
746                 .end   = RK30_LCDC0_PHYS + RK30_LCDC0_SIZE - 1,
747                 .flags = IORESOURCE_MEM,
748         },
749         
750         [1] = {
751                 .name  = "lcdc0 irq",
752                 .start = IRQ_LCDC0,
753                 .end   = IRQ_LCDC0,
754                 .flags = IORESOURCE_IRQ,
755         },
756 };
757
758 static struct platform_device device_lcdc0 = {
759         .name             = "rk30-lcdc",
760         .id               = 0,
761         .num_resources    = ARRAY_SIZE(resource_lcdc0),
762         .resource         = resource_lcdc0,
763         .dev            = {
764                 .platform_data = &lcdc0_screen_info,
765         },
766 };
767 #endif
768 #if defined(CONFIG_LCDC1_RK3066B) 
769 static struct resource resource_lcdc1[] = {
770         [0] = {
771                 .name  = "lcdc1 reg",
772                 .start = RK30_LCDC1_PHYS,
773                 .end   = RK30_LCDC1_PHYS + RK30_LCDC1_SIZE - 1,
774                 .flags = IORESOURCE_MEM,
775         },
776         [1] = {
777                 .name  = "lcdc1 irq",
778                 .start = IRQ_LCDC1,
779                 .end   = IRQ_LCDC1,
780                 .flags = IORESOURCE_IRQ,
781         },
782 };
783
784 static struct platform_device device_lcdc1 = {
785         .name             = "rk30-lcdc",
786         .id               = 1,
787         .num_resources    = ARRAY_SIZE(resource_lcdc1),
788         .resource         = resource_lcdc1,
789         .dev            = {
790                 .platform_data = &lcdc1_screen_info,
791         },
792 };
793 #endif
794
795 #if defined(CONFIG_MFD_RK610)
796 #define RK610_RST_PIN_MUX_NAME          GPIO2C5_LCDC1DATA21_SMCADDR5_NAME 
797 #define RK610_RST_PIN_MUX_MODE          GPIO2C_GPIO2C5
798 #define RK610_RST_PIN                   RK30_PIN2_PC5
799 static int rk610_power_on_init(void)
800 {
801         int ret;
802         if(RK610_RST_PIN != INVALID_GPIO)
803         {
804                 rk30_mux_api_set(RK610_RST_PIN_MUX_NAME,RK610_RST_PIN_MUX_MODE);
805                 ret = gpio_request(RK610_RST_PIN, "rk610 reset");
806                 if (ret)
807                 {
808                         printk(KERN_ERR "rk610_control_probe request gpio fail\n");
809                 }
810                 else 
811                 {
812                         gpio_direction_output(RK610_RST_PIN, GPIO_HIGH);
813                         msleep(100);
814                         gpio_direction_output(RK610_RST_PIN, GPIO_LOW);
815                         msleep(100);
816                         gpio_set_value(RK610_RST_PIN, GPIO_HIGH);
817                 }
818         }
819
820         return 0;
821         
822 }
823
824
825 static struct rk610_ctl_platform_data rk610_ctl_pdata = {
826         .rk610_power_on_init = rk610_power_on_init,
827 };
828 #endif
829
830 #ifdef CONFIG_ANDROID_TIMED_GPIO
831 static struct timed_gpio timed_gpios[] = {
832         {
833                 .name = "vibrator",
834                 .gpio = RK30_PIN3_PD3,
835                 .max_timeout = 1000,
836                 .active_low = 0,
837                 .adjust_time =20,      //adjust for diff product
838         },
839 };
840
841 static struct timed_gpio_platform_data rk29_vibrator_info = {
842         .num_gpios = 1,
843         .gpios = timed_gpios,
844 };
845
846 static struct platform_device rk29_device_vibrator = {
847         .name = "timed-gpio",
848         .id = -1,
849         .dev = {
850                 .platform_data = &rk29_vibrator_info,
851         },
852
853 };
854 #endif
855
856 #ifdef CONFIG_LEDS_GPIO_PLATFORM
857 static struct gpio_led rk29_leds[] = {
858         {
859                 .name = "button-backlight",
860                 .gpio = RK30_PIN2_PB3,
861                 .default_trigger = "timer",
862                 .active_low = 0,
863                 .retain_state_suspended = 0,
864                 .default_state = LEDS_GPIO_DEFSTATE_OFF,
865         },
866 };
867
868 static struct gpio_led_platform_data rk29_leds_pdata = {
869         .leds = rk29_leds,
870         .num_leds = ARRAY_SIZE(rk29_leds),
871 };
872
873 static struct platform_device rk29_device_gpio_leds = {
874         .name   = "leds-gpio",
875         .id     = -1,
876         .dev    = {
877                 .platform_data  = &rk29_leds_pdata,
878         },
879 };
880 #endif
881
882 #ifdef CONFIG_RK_IRDA
883 #define IRDA_IRQ_PIN           RK30_PIN0_PA3
884
885 static int irda_iomux_init(void)
886 {
887         int ret = 0;
888
889         //irda irq pin
890         ret = gpio_request(IRDA_IRQ_PIN, NULL);
891         if (ret != 0) {
892                 gpio_free(IRDA_IRQ_PIN);
893                 printk(">>>>>> IRDA_IRQ_PIN gpio_request err \n ");
894         }
895         gpio_pull_updown(IRDA_IRQ_PIN, PullDisable);
896         gpio_direction_input(IRDA_IRQ_PIN);
897
898         return 0;
899 }
900
901 static int irda_iomux_deinit(void)
902 {
903         gpio_free(IRDA_IRQ_PIN);
904         return 0;
905 }
906
907 static struct irda_info rk29_irda_info = {
908         .intr_pin = IRDA_IRQ_PIN,
909         .iomux_init = irda_iomux_init,
910         .iomux_deinit = irda_iomux_deinit,
911         //.irda_pwr_ctl = bu92747guw_power_ctl,
912 };
913
914 static struct platform_device irda_device = {
915 #ifdef CONFIG_RK_IRDA_NET
916         .name = "rk_irda",
917 #else
918         .name = "bu92747_irda",
919 #endif
920         .id = -1,
921         .dev = {
922                 .platform_data = &rk29_irda_info,
923         }
924 };
925 #endif
926
927 #ifdef CONFIG_ION
928 #define ION_RESERVE_SIZE        (80 * SZ_1M)
929 static struct ion_platform_data rk30_ion_pdata = {
930         .nr = 1,
931         .heaps = {
932                 {
933                         .type = ION_HEAP_TYPE_CARVEOUT,
934                         .id = ION_NOR_HEAP_ID,
935                         .name = "norheap",
936                         .size = ION_RESERVE_SIZE,
937                 }
938         },
939 };
940
941 static struct platform_device device_ion = {
942         .name = "ion-rockchip",
943         .id = 0,
944         .dev = {
945                 .platform_data = &rk30_ion_pdata,
946         },
947 };
948 #endif
949
950 /**************************************************************************************************
951  * SDMMC devices,  include the module of SD,MMC,and sdio.noted by xbw at 2012-03-05
952 **************************************************************************************************/
953 #ifdef CONFIG_SDMMC_RK29
954 #include "board-rk3066b-sdk-sdmmc.c"
955
956 #if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT)
957 #define SDMMC0_WRITE_PROTECT_PIN        RK30_PIN3_PB7   //According to your own project to set the value of write-protect-pin.
958 #endif
959
960 #if defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT)
961 #define SDMMC1_WRITE_PROTECT_PIN        RK30_PIN3_PC7   //According to your own project to set the value of write-protect-pin.
962 #endif
963
964 #define RK29SDK_WIFI_SDIO_CARD_DETECT_N    RK30_PIN6_PB2
965
966 #endif //endif ---#ifdef CONFIG_SDMMC_RK29
967
968 #ifdef CONFIG_SDMMC0_RK29
969 static int rk29_sdmmc0_cfg_gpio(void)
970 {
971 #ifdef CONFIG_SDMMC_RK29_OLD
972         rk30_mux_api_set(GPIO3B1_SDMMC0CMD_NAME, GPIO3B_SDMMC0_CMD);
973         rk30_mux_api_set(GPIO3B0_SDMMC0CLKOUT_NAME, GPIO3B_SDMMC0_CLKOUT);
974         rk30_mux_api_set(GPIO3B2_SDMMC0DATA0_NAME, GPIO3B_SDMMC0_DATA0);
975         rk30_mux_api_set(GPIO3B3_SDMMC0DATA1_NAME, GPIO3B_SDMMC0_DATA1);
976         rk30_mux_api_set(GPIO3B4_SDMMC0DATA2_NAME, GPIO3B_SDMMC0_DATA2);
977         rk30_mux_api_set(GPIO3B5_SDMMC0DATA3_NAME, GPIO3B_SDMMC0_DATA3);
978
979         rk30_mux_api_set(GPIO3B6_SDMMC0DETECTN_NAME, GPIO3B_GPIO3B6);
980
981         rk30_mux_api_set(GPIO3A7_SDMMC0PWREN_NAME, GPIO3A_GPIO3A7);
982         gpio_request(RK30_PIN3_PA7, "sdmmc-power");
983         gpio_direction_output(RK30_PIN3_PA7, GPIO_LOW);
984
985 #else
986         rk29_sdmmc_set_iomux(0, 0xFFFF);
987
988         rk30_mux_api_set(GPIO3B0_SDMMC0DETECTN_NAME, GPIO3B_SDMMC0DETECTN);
989
990 #if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT)
991         gpio_request(SDMMC0_WRITE_PROTECT_PIN, "sdmmc-wp");
992         gpio_direction_input(SDMMC0_WRITE_PROTECT_PIN);
993 #endif
994
995 #endif
996
997         return 0;
998 }
999
1000 #define CONFIG_SDMMC0_USE_DMA
1001 struct rk29_sdmmc_platform_data default_sdmmc0_data = {
1002         .host_ocr_avail =
1003             (MMC_VDD_25_26 | MMC_VDD_26_27 | MMC_VDD_27_28 | MMC_VDD_28_29 |
1004              MMC_VDD_29_30 | MMC_VDD_30_31 | MMC_VDD_31_32 | MMC_VDD_32_33 |
1005              MMC_VDD_33_34 | MMC_VDD_34_35 | MMC_VDD_35_36),
1006         .host_caps =
1007             (MMC_CAP_4_BIT_DATA | MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED),
1008         .io_init = rk29_sdmmc0_cfg_gpio,
1009
1010 #if !defined(CONFIG_SDMMC_RK29_OLD)
1011         .set_iomux = rk29_sdmmc_set_iomux,
1012 #endif
1013
1014         .dma_name = "sd_mmc",
1015 #ifdef CONFIG_SDMMC0_USE_DMA
1016         .use_dma = 1,
1017 #else
1018         .use_dma = 0,
1019 #endif
1020         .detect_irq = RK30_PIN3_PB6,    // INVALID_GPIO
1021         .enable_sd_wakeup = 0,
1022
1023 #if defined(CONFIG_SDMMC0_RK29_WRITE_PROTECT)
1024         .write_prt = SDMMC0_WRITE_PROTECT_PIN,
1025 #else
1026         .write_prt = INVALID_GPIO,
1027 #endif
1028 };
1029 #endif // CONFIG_SDMMC0_RK29
1030
1031 #ifdef CONFIG_SDMMC1_RK29
1032 #define CONFIG_SDMMC1_USE_DMA
1033 static int rk29_sdmmc1_cfg_gpio(void)
1034 {
1035 #if defined(CONFIG_SDMMC_RK29_OLD)
1036         rk30_mux_api_set(GPIO3C0_SMMC1CMD_NAME, GPIO3C_SMMC1_CMD);
1037         rk30_mux_api_set(GPIO3C5_SDMMC1CLKOUT_NAME, GPIO3C_SDMMC1_CLKOUT);
1038         rk30_mux_api_set(GPIO3C1_SDMMC1DATA0_NAME, GPIO3C_SDMMC1_DATA0);
1039         rk30_mux_api_set(GPIO3C2_SDMMC1DATA1_NAME, GPIO3C_SDMMC1_DATA1);
1040         rk30_mux_api_set(GPIO3C3_SDMMC1DATA2_NAME, GPIO3C_SDMMC1_DATA2);
1041         rk30_mux_api_set(GPIO3C4_SDMMC1DATA3_NAME, GPIO3C_SDMMC1_DATA3);
1042         //rk30_mux_api_set(GPIO3C6_SDMMC1DETECTN_NAME, GPIO3C_SDMMC1_DETECT_N);
1043
1044 #else
1045
1046 #if defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT)
1047         gpio_request(SDMMC1_WRITE_PROTECT_PIN, "sdio-wp");
1048         gpio_direction_input(SDMMC1_WRITE_PROTECT_PIN);
1049 #endif
1050
1051 #endif
1052
1053         return 0;
1054 }
1055
1056 struct rk29_sdmmc_platform_data default_sdmmc1_data = {
1057         .host_ocr_avail =
1058             (MMC_VDD_25_26 | MMC_VDD_26_27 | MMC_VDD_27_28 | MMC_VDD_28_29 |
1059              MMC_VDD_29_30 | MMC_VDD_30_31 | MMC_VDD_31_32 | MMC_VDD_32_33 |
1060              MMC_VDD_33_34),
1061
1062 #if !defined(CONFIG_USE_SDMMC1_FOR_WIFI_DEVELOP_BOARD)
1063         .host_caps = (MMC_CAP_4_BIT_DATA | MMC_CAP_SDIO_IRQ |
1064                       MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED),
1065 #else
1066         .host_caps =
1067             (MMC_CAP_4_BIT_DATA | MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED),
1068 #endif
1069
1070         .io_init = rk29_sdmmc1_cfg_gpio,
1071
1072 #if !defined(CONFIG_SDMMC_RK29_OLD)
1073         .set_iomux = rk29_sdmmc_set_iomux,
1074 #endif
1075
1076         .dma_name = "sdio",
1077 #ifdef CONFIG_SDMMC1_USE_DMA
1078         .use_dma = 1,
1079 #else
1080         .use_dma = 0,
1081 #endif
1082
1083 #if !defined(CONFIG_USE_SDMMC1_FOR_WIFI_DEVELOP_BOARD)
1084 #ifdef CONFIG_WIFI_CONTROL_FUNC
1085         .status = rk29sdk_wifi_status,
1086         .register_status_notify = rk29sdk_wifi_status_register,
1087 #endif
1088 #if 0
1089         .detect_irq = RK29SDK_WIFI_SDIO_CARD_DETECT_N,
1090 #endif
1091
1092 #if defined(CONFIG_SDMMC1_RK29_WRITE_PROTECT)
1093         .write_prt = SDMMC1_WRITE_PROTECT_PIN,
1094 #else
1095         .write_prt = INVALID_GPIO,
1096 #endif
1097
1098 #else
1099         .detect_irq = INVALID_GPIO,
1100         .enable_sd_wakeup = 0,
1101 #endif
1102
1103 };
1104 #endif //endif--#ifdef CONFIG_SDMMC1_RK29
1105
1106 /**************************************************************************************************
1107  * the end of setting for SDMMC devices
1108 **************************************************************************************************/
1109
1110 #ifdef CONFIG_BATTERY_RK30_ADC
1111 static struct rk30_adc_battery_platform_data rk30_adc_battery_platdata = {
1112         .dc_det_pin      = RK30_PIN0_PB2,
1113         .batt_low_pin    = RK30_PIN0_PB1, 
1114         .charge_set_pin  = INVALID_GPIO,
1115         .charge_ok_pin   = RK30_PIN0_PA6,
1116         .dc_det_level    = GPIO_LOW,
1117         .charge_ok_level = GPIO_HIGH,
1118 };
1119
1120 static struct platform_device rk30_device_adc_battery = {
1121         .name   = "rk30-battery",
1122         .id     = -1,
1123         .dev = {
1124                 .platform_data = &rk30_adc_battery_platdata,
1125         },
1126 };
1127 #endif
1128 #ifdef CONFIG_RK30_PWM_REGULATOR
1129 const static int pwm_voltage_map[] = {
1130         1000000, 1025000, 1050000, 1075000, 1100000, 1125000, 1150000, 1175000, 1200000, 1225000, 1250000, 1275000, 1300000, 1325000, 1350000, 1375000, 1400000
1131 };
1132
1133 static struct regulator_consumer_supply pwm_dcdc1_consumers[] = {
1134         {
1135                 .supply = "vdd_core",
1136         }
1137 };
1138
1139 struct regulator_init_data pwm_regulator_init_dcdc[1] =
1140 {
1141         {
1142                 .constraints = {
1143                         .name = "PWM_DCDC1",
1144                         .min_uV = 600000,
1145                         .max_uV = 1800000,      //0.6-1.8V
1146                         .apply_uV = true,
1147                         .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE,
1148                 },
1149                 .num_consumer_supplies = ARRAY_SIZE(pwm_dcdc1_consumers),
1150                 .consumer_supplies = pwm_dcdc1_consumers,
1151         },
1152 };
1153
1154 static struct pwm_platform_data pwm_regulator_info[1] = {
1155         {
1156                 .pwm_id = 3,
1157                 .pwm_gpio = RK30_PIN3_PD6,
1158                 .pwm_iomux_name = GPIO3D6_PWM3_JTAGTMS_HOSTDRVVBUS_NAME,
1159                 .pwm_iomux_pwm = GPIO3D_PWM3,
1160                 .pwm_iomux_gpio = GPIO3D_GPIO3D6,
1161                 .pwm_voltage = 1000000,
1162                 .suspend_voltage = 1050000,
1163                 .min_uV = 1000000,
1164                 .max_uV = 1400000,
1165                 .coefficient = 455,     //45.5%
1166                 .pwm_voltage_map = pwm_voltage_map,
1167                 .init_data      = &pwm_regulator_init_dcdc[0],
1168         },
1169 };
1170
1171 struct platform_device pwm_regulator_device[1] = {
1172         {
1173                 .name = "pwm-voltage-regulator",
1174                 .id = 0,
1175                 .dev            = {
1176                         .platform_data = &pwm_regulator_info[0],
1177                 }
1178         },
1179 };
1180 #endif
1181
1182 #ifdef CONFIG_RK29_VMAC
1183 #define PHY_PWR_EN_GPIO RK30_PIN1_PD6
1184 #include "board-rk30-sdk-vmac.c"
1185 #endif
1186
1187 #ifdef CONFIG_RFKILL_RK
1188 // bluetooth rfkill device, its driver in net/rfkill/rfkill-rk.c
1189 static struct rfkill_rk_platform_data rfkill_rk_platdata = {
1190     .type               = RFKILL_TYPE_BLUETOOTH,
1191
1192     .poweron_gpio       = { // BT_REG_ON
1193         .io             = RK30_PIN3_PC7,
1194         .enable         = GPIO_HIGH,
1195         .iomux          = {
1196             .name       = GPIO3C7_SDMMC1WRITEPRT_RMIICRS_NAME,
1197             .fgpio      = GPIO3C_GPIO3C7,
1198         },
1199     },
1200
1201     .reset_gpio         = { // BT_RST
1202         .io             = RK30_PIN3_PD1, // set io to INVALID_GPIO for disable it
1203         .enable         = GPIO_LOW,
1204         .iomux          = {
1205             .name       = GPIO3D1_SDMMC1BACKENDPWR_MIIMDCLK_NAME,
1206             .fgpio      = GPIO3D_GPIO3D1,
1207        },
1208    }, 
1209
1210     .wake_gpio          = { // BT_WAKE, use to control bt's sleep and wakeup
1211         .io             = RK30_PIN3_PC6, // set io to INVALID_GPIO for disable it
1212         .enable         = GPIO_HIGH,
1213         .iomux          = {
1214             .name       = GPIO3C6_SDMMC1DETECTN_RMIIRXERR_NAME,
1215             .fgpio      = GPIO3C_GPIO3C6,
1216         },
1217     },
1218
1219     .wake_host_irq      = { // BT_HOST_WAKE, for bt wakeup host when it is in deep sleep
1220         .gpio           = {
1221             .io         = RK30_PIN0_PA5, // set io to INVALID_GPIO for disable it
1222             .enable     = GPIO_LOW,      // set GPIO_LOW for falling, set 0 for rising
1223             .iomux      = {
1224                 .name   = NULL,
1225             },
1226         },
1227     },
1228
1229     .rts_gpio           = { // UART_RTS, enable or disable BT's data coming
1230         .io             = RK30_PIN1_PA3, // set io to INVALID_GPIO for disable it
1231         .enable         = GPIO_LOW,
1232         .iomux          = {
1233             .name       = GPIO1A3_UART0RTSN_NAME,
1234             .fgpio      = GPIO1A_GPIO1A3,
1235             .fmux       = GPIO1A_UART0RTSN,
1236         },
1237     },
1238 };
1239
1240 static struct platform_device device_rfkill_rk = {
1241     .name   = "rfkill_rk",
1242     .id     = -1,
1243     .dev    = {
1244         .platform_data = &rfkill_rk_platdata,
1245     },
1246 };
1247 #endif
1248
1249 static struct platform_device *devices[] __initdata = {
1250 #ifdef CONFIG_FB_ROCKCHIP
1251         &device_fb,
1252 #endif
1253 #if defined(CONFIG_LCDC0_RK3066B)
1254         &device_lcdc0,
1255 #endif
1256 #if defined(CONFIG_LCDC1_RK3066B)
1257         &device_lcdc1,
1258 #endif
1259                 
1260 #ifdef CONFIG_BACKLIGHT_RK29_BL
1261         &rk29_device_backlight,
1262 #endif
1263
1264 #ifdef CONFIG_ION
1265         &device_ion,
1266 #endif
1267 #ifdef CONFIG_ANDROID_TIMED_GPIO
1268         &rk29_device_vibrator,
1269 #endif
1270 #ifdef CONFIG_LEDS_GPIO_PLATFORM
1271         &rk29_device_gpio_leds,
1272 #endif
1273 #ifdef CONFIG_RK_IRDA
1274         &irda_device,
1275 #endif
1276 #ifdef CONFIG_WIFI_CONTROL_FUNC
1277         &rk29sdk_wifi_device,
1278 #endif
1279 #ifdef CONFIG_RK29_SUPPORT_MODEM
1280         &rk30_device_modem,
1281 #endif
1282 #if defined(CONFIG_MU509)
1283         &rk29_device_mu509,
1284 #endif
1285 #if defined(CONFIG_MW100)
1286         &rk29_device_mw100,
1287 #endif
1288 #if defined(CONFIG_MT6229)
1289         &rk29_device_mt6229,
1290 #endif
1291 #if defined(CONFIG_SEW868)
1292         &rk30_device_sew868,
1293 #endif
1294 #ifdef CONFIG_BATTERY_RK30_ADC
1295         &rk30_device_adc_battery,
1296 #endif
1297 #ifdef CONFIG_RFKILL_RK
1298         &device_rfkill_rk,
1299 #endif
1300 };
1301
1302 // i2c
1303 #ifdef CONFIG_I2C0_RK30
1304 static struct i2c_board_info __initdata i2c0_info[] = {
1305 #if defined (CONFIG_GS_MMA7660)
1306         {
1307           .type                   = "gs_mma7660",
1308           .addr                   = 0x4c,
1309           .flags                  = 0,
1310           .irq                    = MMA7660_INT_PIN,
1311           .platform_data  = &mma7660_info,
1312         },
1313 #endif
1314 #if defined (CONFIG_GS_MMA8452)
1315         {
1316                 .type           = "gs_mma8452",
1317                 .addr           = 0x1d,
1318                 .flags          = 0,
1319                 .irq            = MMA8452_INT_PIN,
1320                 .platform_data = &mma8452_info,
1321         },
1322 #endif
1323 #if defined (CONFIG_GS_LIS3DH)
1324         {
1325                 .type           = "gs_lis3dh",
1326                 .addr           = 0x19,   //0x19(SA0-->VCC), 0x18(SA0-->GND)
1327                 .flags          = 0,
1328                 .irq            = LIS3DH_INT_PIN,
1329                 .platform_data = &lis3dh_info,
1330         },
1331 #endif
1332 #if defined (CONFIG_COMPASS_AK8975)
1333         {
1334                 .type          = "ak8975",
1335                 .addr          = 0x0d,
1336                 .flags         = 0,
1337                 .irq           = RK30_PIN0_PD5,
1338                 .platform_data = &akm8975_info,
1339         },
1340 #endif
1341 #if defined (CONFIG_GYRO_L3G4200D)
1342         {
1343                 .type          = "l3g4200d_gryo",
1344                 .addr          = 0x69,
1345                 .flags         = 0,
1346                 .irq           = L3G4200D_INT_PIN,
1347                 .platform_data = &l3g4200d_info,
1348         },
1349 #endif
1350 #if defined (CONFIG_SND_SOC_RK1000)
1351         {
1352                 .type          = "rk1000_i2c_codec",
1353                 .addr          = 0x60,
1354                 .flags         = 0,
1355         },
1356         {
1357                 .type          = "rk1000_control",
1358                 .addr          = 0x40,
1359                 .flags         = 0,
1360         },
1361 #endif
1362 #if defined (CONFIG_SND_SOC_RT5631)
1363         {
1364                 .type                   = "rt5631",
1365                 .addr                   = 0x1a,
1366                 .flags                  = 0,
1367         },
1368 #endif
1369 #if defined (CONFIG_SND_SOC_ES8323)
1370         {
1371                 .type                   = "es8323",
1372                 .addr                   = 0x10,
1373                 .flags                  = 0,
1374         },
1375 #endif
1376 #ifdef CONFIG_MFD_RK610
1377                 {
1378                         .type                   = "rk610_ctl",
1379                         .addr                   = 0x40,
1380                         .flags                  = 0,
1381                         .platform_data          = &rk610_ctl_pdata,
1382                 },
1383 #ifdef CONFIG_RK610_TVOUT
1384                 {
1385                         .type                   = "rk610_tvout",
1386                         .addr                   = 0x42,
1387                         .flags                  = 0,
1388                 },
1389 #endif
1390 #ifdef CONFIG_HDMI_RK610
1391                 {
1392                         .type                   = "rk610_hdmi",
1393                         .addr                   = 0x46,
1394                         .flags                  = 0,
1395                         .irq                    = RK30_PIN0_PB6,
1396                 },
1397 #endif
1398 #ifdef CONFIG_SND_SOC_RK610
1399                 {//RK610_CODEC addr  from 0x60 to 0x80 (0x60~0x80)
1400                         .type                   = "rk610_i2c_codec",
1401                         .addr                   = 0x60,
1402                         .flags                  = 0,
1403                 },
1404 #endif
1405 #endif
1406
1407 };
1408 #endif
1409
1410 #define PMIC_TYPE_WM8326        1
1411 #define PMIC_TYPE_TPS65910      2
1412 int __sramdata g_pmic_type =  0;
1413 #ifdef CONFIG_I2C1_RK30
1414 #ifdef CONFIG_MFD_WM831X_I2C
1415 #include "board-rk3066b-sdk-wm8326.c"
1416 #endif
1417 #ifdef CONFIG_MFD_TPS65910
1418 #define TPS65910_HOST_IRQ        RK30_PIN0_PB3
1419 #include "board-rk3066b-sdk-tps65910.c"
1420 #endif
1421
1422 static struct i2c_board_info __initdata i2c1_info[] = {
1423 #if defined (CONFIG_MFD_WM831X_I2C)
1424         {
1425                 .type          = "wm8326",
1426                 .addr          = 0x34,
1427                 .flags         = 0,
1428                 .irq           = RK30_PIN0_PB3,
1429                 .platform_data = &wm831x_platdata,
1430         },
1431 #endif
1432 #if defined (CONFIG_MFD_TPS65910)
1433         {
1434         .type           = "tps65910",
1435         .addr           = TPS65910_I2C_ID0,
1436         .flags          = 0,
1437         .irq            = TPS65910_HOST_IRQ,
1438         .platform_data = &tps65910_data,
1439         },
1440 #endif
1441 };
1442 #endif
1443
1444 void __sramfunc board_pmu_suspend(void)
1445 {      
1446         #if defined (CONFIG_MFD_WM831X_I2C)
1447        if(g_pmic_type == PMIC_TYPE_WM8326)
1448        board_pmu_wm8326_suspend();
1449         #endif
1450         #if defined (CONFIG_MFD_TPS65910)
1451        if(g_pmic_type == PMIC_TYPE_TPS65910)
1452        board_pmu_tps65910_suspend(); 
1453     #endif   
1454 }
1455
1456 void __sramfunc board_pmu_resume(void)
1457 {      
1458         #if defined (CONFIG_MFD_WM831X_I2C)
1459        if(g_pmic_type == PMIC_TYPE_WM8326)
1460        board_pmu_wm8326_resume();
1461         #endif
1462         #if defined (CONFIG_MFD_TPS65910)
1463        if(g_pmic_type == PMIC_TYPE_TPS65910)
1464        board_pmu_tps65910_resume(); 
1465         #endif
1466 }
1467
1468  int __sramdata gpio0d7_iomux,gpio0d7_do,gpio0d7_dir,gpio0d7_en;
1469
1470 void __sramfunc rk30_pwm_logic_suspend_voltage(void)
1471 {
1472 #ifdef CONFIG_RK30_PWM_REGULATOR
1473
1474 //      int gpio0d7_iomux,gpio0d7_do,gpio0d7_dir,gpio0d7_en;
1475         sram_udelay(10000);
1476         gpio0d7_iomux = readl_relaxed(GRF_GPIO0D_IOMUX);
1477         gpio0d7_do = grf_readl(GRF_GPIO0H_DO);
1478         gpio0d7_dir = grf_readl(GRF_GPIO0H_DIR);
1479         gpio0d7_en = grf_readl(GRF_GPIO0H_EN);
1480
1481         writel_relaxed((1<<30), GRF_GPIO0D_IOMUX);
1482         grf_writel((1<<31)|(1<<15), GRF_GPIO0H_DIR);
1483         grf_writel((1<<31)|(1<<15), GRF_GPIO0H_DO);
1484         grf_writel((1<<31)|(1<<15), GRF_GPIO0H_EN);
1485 #endif 
1486 }
1487 void __sramfunc rk30_pwm_logic_resume_voltage(void)
1488 {
1489 #ifdef CONFIG_RK30_PWM_REGULATOR
1490         writel_relaxed((1<<30)|gpio0d7_iomux, GRF_GPIO0D_IOMUX);
1491         grf_writel((1<<31)|gpio0d7_en, GRF_GPIO0H_EN);
1492         grf_writel((1<<31)|gpio0d7_dir, GRF_GPIO0H_DIR);
1493         grf_writel((1<<31)|gpio0d7_do, GRF_GPIO0H_DO);
1494         sram_udelay(10000);
1495
1496 #endif
1497
1498 }
1499 extern void pwm_suspend_voltage(void);
1500 extern void pwm_resume_voltage(void);
1501 void  rk30_pwm_suspend_voltage_set(void)
1502 {
1503 #ifdef CONFIG_RK30_PWM_REGULATOR
1504         pwm_suspend_voltage();
1505 #endif
1506 }
1507 void  rk30_pwm_resume_voltage_set(void)
1508 {
1509 #ifdef CONFIG_RK30_PWM_REGULATOR
1510         pwm_resume_voltage();
1511 #endif
1512 }
1513
1514
1515 #ifdef CONFIG_I2C2_RK30
1516 static struct i2c_board_info __initdata i2c2_info[] = {
1517 #if defined (CONFIG_TOUCHSCREEN_GT8XX)
1518         {
1519                 .type          = "Goodix-TS",
1520                 .addr          = 0x55,
1521                 .flags         = 0,
1522                 .irq           = RK30_PIN0_PD4,
1523                 .platform_data = &goodix_info,
1524         },
1525 #endif
1526 #if defined (CONFIG_TOUCHSCREEN_FT5306_AV)
1527                 {
1528                         .type                   = "ft5x0x_ts",
1529                         .addr                   = 0x38,
1530                         .flags                  = 0,
1531                         .irq                    = RK30_PIN0_PD4,
1532                         .platform_data  = &ft5306_info,
1533                 },
1534 #endif
1535 #if defined (CONFIG_LS_CM3217)
1536         {
1537                 .type          = "lightsensor",
1538                 .addr          = 0x10,
1539                 .flags         = 0,
1540                 .platform_data = &cm3217_info,
1541         },
1542 #endif
1543 };
1544 #endif
1545
1546 #ifdef CONFIG_I2C3_RK30
1547 static struct i2c_board_info __initdata i2c3_info[] = {
1548 };
1549 #endif
1550
1551 #ifdef CONFIG_I2C4_RK30
1552 static struct i2c_board_info __initdata i2c4_info[] = {
1553 };
1554 #endif
1555
1556 #ifdef CONFIG_I2C_GPIO_RK30
1557 #define I2C_SDA_PIN     INVALID_GPIO// RK30_PIN2_PD6   //set sda_pin here
1558 #define I2C_SCL_PIN     INVALID_GPIO//RK30_PIN2_PD7   //set scl_pin here
1559 static int rk30_i2c_io_init(void)
1560 {
1561         //set iomux (gpio) here
1562         //rk30_mux_api_set(GPIO2D7_I2C1SCL_NAME, GPIO2D_GPIO2D7);
1563         //rk30_mux_api_set(GPIO2D6_I2C1SDA_NAME, GPIO2D_GPIO2D6);
1564
1565         return 0;
1566 }
1567 struct i2c_gpio_platform_data default_i2c_gpio_data = {
1568        .sda_pin = I2C_SDA_PIN,
1569        .scl_pin = I2C_SCL_PIN,
1570        .udelay = 5, // clk = 500/udelay = 100Khz
1571        .timeout = 100,//msecs_to_jiffies(100),
1572        .bus_num    = 5,
1573        .io_init = rk30_i2c_io_init,
1574 };
1575 static struct i2c_board_info __initdata i2c_gpio_info[] = {
1576 };
1577 #endif
1578
1579 static void __init rk30_i2c_register_board_info(void)
1580 {
1581 #ifdef CONFIG_I2C0_RK30
1582         i2c_register_board_info(0, i2c0_info, ARRAY_SIZE(i2c0_info));
1583 #endif
1584 #ifdef CONFIG_I2C1_RK30
1585         i2c_register_board_info(1, i2c1_info, ARRAY_SIZE(i2c1_info));
1586 #endif
1587 #ifdef CONFIG_I2C2_RK30
1588         i2c_register_board_info(2, i2c2_info, ARRAY_SIZE(i2c2_info));
1589 #endif
1590 #ifdef CONFIG_I2C3_RK30
1591         i2c_register_board_info(3, i2c3_info, ARRAY_SIZE(i2c3_info));
1592 #endif
1593 #ifdef CONFIG_I2C4_RK30
1594         i2c_register_board_info(4, i2c4_info, ARRAY_SIZE(i2c4_info));
1595 #endif
1596 #ifdef CONFIG_I2C_GPIO_RK30
1597         i2c_register_board_info(5, i2c_gpio_info, ARRAY_SIZE(i2c_gpio_info));
1598 #endif
1599 }
1600 //end of i2c
1601
1602 #define POWER_ON_PIN RK30_PIN0_PA0   //power_hold
1603 static void rk30_pm_power_off(void)
1604 {
1605         printk(KERN_ERR "rk30_pm_power_off start...\n");
1606         gpio_direction_output(POWER_ON_PIN, GPIO_LOW);
1607 #if defined(CONFIG_MFD_WM831X)
1608         wm831x_set_bits(Wm831x,WM831X_GPIO_LEVEL,0x0001,0x0000);  //set sys_pwr 0
1609         wm831x_device_shutdown(Wm831x);//wm8326 shutdown
1610 #endif
1611         while (1);
1612 }
1613
1614 static void __init machine_rk30_board_init(void)
1615 {
1616         //avs_init();
1617         gpio_request(POWER_ON_PIN, "poweronpin");
1618         gpio_direction_output(POWER_ON_PIN, GPIO_HIGH);
1619         
1620         pm_power_off = rk30_pm_power_off;
1621         
1622         rk30_i2c_register_board_info();
1623         spi_register_board_info(board_spi_devices, ARRAY_SIZE(board_spi_devices));
1624         platform_add_devices(devices, ARRAY_SIZE(devices));
1625         board_usb_detect_init(RK30_PIN0_PA7);
1626
1627 #ifdef CONFIG_WIFI_CONTROL_FUNC
1628         rk29sdk_wifi_bt_gpio_control_init();
1629 #endif
1630
1631         // spk and ear switch
1632         gpio_request(RK30_PIN2_PB1, NULL);
1633         gpio_direction_output(RK30_PIN2_PB1, GPIO_HIGH);
1634 }
1635
1636 static void __init rk30_reserve(void)
1637 {
1638 #ifdef CONFIG_ION
1639         rk30_ion_pdata.heaps[0].base = board_mem_reserve_add("ion", ION_RESERVE_SIZE);
1640 #endif
1641 #ifdef CONFIG_FB_ROCKCHIP
1642         resource_fb[0].start = board_mem_reserve_add("fb0", RK30_FB0_MEM_SIZE);
1643         resource_fb[0].end = resource_fb[0].start + RK30_FB0_MEM_SIZE - 1;
1644         #if 0
1645         resource_fb[1].start = board_mem_reserve_add("ipp buf", RK30_FB0_MEM_SIZE);
1646         resource_fb[1].end = resource_fb[1].start + RK30_FB0_MEM_SIZE - 1;
1647         resource_fb[2].start = board_mem_reserve_add("fb2", RK30_FB0_MEM_SIZE);
1648         resource_fb[2].end = resource_fb[2].start + RK30_FB0_MEM_SIZE - 1;
1649         #endif
1650 #endif
1651 #ifdef CONFIG_VIDEO_RK29
1652         rk30_camera_request_reserve_mem();
1653 #endif
1654         board_mem_reserved();
1655 }
1656
1657 /**
1658  * dvfs_cpu_logic_table: table for arm and logic dvfs 
1659  * @frequency   : arm frequency
1660  * @cpu_volt    : arm voltage depend on frequency
1661  * @logic_volt  : logic voltage arm requests depend on frequency
1662  * comments     : min arm/logic voltage
1663  */
1664 static struct dvfs_arm_table dvfs_cpu_logic_table[] = {
1665 #if 0
1666         {.frequency = 252 * 1000,       .cpu_volt = 1075 * 1000,        .logic_volt = 1125 * 1000},//0.975V/1.000V
1667 #endif
1668         {.frequency = 504 * 1000,       .cpu_volt = 1100 * 1000,                .logic_volt = 1100 * 1000},//0.975V/1.000V
1669         {.frequency = 816 * 1000,       .cpu_volt = 1100 * 1000,        .logic_volt = 1100 * 1000},//1.000V/1.025V
1670         {.frequency = 1200 * 1000,      .cpu_volt = 1100 * 1000,        .logic_volt = 1100 * 1000},//1.100V/1.050V
1671 #if 0
1672         {.frequency = 1008 * 1000,      .cpu_volt = 1125 * 1000,        .logic_volt = 1150 * 1000},//1.025V/1.050V
1673         {.frequency = 1272 * 1000,      .cpu_volt = 1225 * 1000,        .logic_volt = 1200 * 1000},//1.150V/1.100V
1674         {.frequency = 1416 * 1000,      .cpu_volt = 1300 * 1000,        .logic_volt = 1200 * 1000},//1.225V/1.100V
1675         {.frequency = 1512 * 1000,      .cpu_volt = 1350 * 1000,        .logic_volt = 1250 * 1000},//1.300V/1.150V
1676         {.frequency = 1608 * 1000,      .cpu_volt = 1425 * 1000,        .logic_volt = 1300 * 1000},//1.325V/1.175V
1677 #endif
1678         {.frequency = CPUFREQ_TABLE_END},
1679 };
1680
1681 static struct cpufreq_frequency_table dvfs_gpu_table[] = {
1682         {.frequency = 266 * 1000,       .index = 1000 * 1000},
1683         {.frequency = 400 * 1000,       .index = 1000 * 1000},
1684         {.frequency = CPUFREQ_TABLE_END},
1685 };
1686
1687 static struct cpufreq_frequency_table dvfs_ddr_table[] = {
1688         {.frequency = 300 * 1000,       .index = 1000 * 1000},
1689         {.frequency = 400 * 1000,       .index = 1000 * 1000},
1690         {.frequency = CPUFREQ_TABLE_END},
1691 };
1692
1693 #define DVFS_CPU_TABLE_SIZE     (ARRAY_SIZE(dvfs_cpu_logic_table))
1694 static struct cpufreq_frequency_table cpu_dvfs_table[DVFS_CPU_TABLE_SIZE];
1695 static struct cpufreq_frequency_table dep_cpu2core_table[DVFS_CPU_TABLE_SIZE];
1696
1697 void __init board_clock_init(void)
1698 {
1699         rk30_clock_data_init(periph_pll_default, codec_pll_default, RK30_CLOCKS_DEFAULT_FLAGS);
1700         dvfs_set_arm_logic_volt(dvfs_cpu_logic_table, cpu_dvfs_table, dep_cpu2core_table);
1701         dvfs_set_freq_volt_table(clk_get(NULL, "gpu"), dvfs_gpu_table);
1702         dvfs_set_freq_volt_table(clk_get(NULL, "ddr"), dvfs_ddr_table);
1703 }
1704
1705 MACHINE_START(RK30, "RK30board")
1706         .boot_params    = PLAT_PHYS_OFFSET + 0x800,
1707         .fixup          = rk30_fixup,
1708         .reserve        = &rk30_reserve,
1709         .map_io         = rk30_map_io,
1710         .init_irq       = rk30_init_irq,
1711         .timer          = &rk30_timer,
1712         .init_machine   = machine_rk30_board_init,
1713 MACHINE_END