rk30:add ion support
[firefly-linux-kernel-4.4.55.git] / arch / arm / mach-rk30 / board-rk30-sdk.c
1 /* arch/arm/mach-rk30/board-rk30-sdk.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
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
28 #include <asm/setup.h>
29 #include <asm/mach-types.h>
30 #include <asm/mach/arch.h>
31 #include <asm/mach/map.h>
32 #include <asm/mach/flash.h>
33 #include <asm/hardware/gic.h>
34
35 #include <mach/board.h>
36 #include <mach/hardware.h>
37 #include <mach/io.h>
38 #include <mach/gpio.h>
39 #include <mach/iomux.h>
40 /*set touchscreen different type header*/
41 #if defined(CONFIG_TOUCHSCREEN_XPT2046_NORMAL_SPI)
42 #include "../../../drivers/input/touchscreen/xpt2046_ts.h"
43 #elif defined(CONFIG_TOUCHSCREEN_XPT2046_TSLIB_SPI)
44 #include "../../../drivers/input/touchscreen/xpt2046_tslib_ts.h"
45 #elif defined(CONFIG_TOUCHSCREEN_XPT2046_CBN_SPI)
46 #include "../../../drivers/input/touchscreen/xpt2046_cbn_ts.h"
47 #endif
48 #if defined(CONFIG_SPIM_RK29)
49 #include "../../../drivers/spi/rk29_spim.h"
50 #endif
51 #if defined(CONFIG_ANDROID_TIMED_GPIO)
52 #include "../../../drivers/staging/android/timed_gpio.h"
53 #endif
54
55 #define RK30_FB0_MEM_SIZE 8*SZ_1M
56
57 #ifdef CONFIG_VIDEO_RK29
58 /*---------------- Camera Sensor Macro Define Begin  ------------------------*/
59 /*---------------- Camera Sensor Configuration Macro Begin ------------------------*/
60 #define CONFIG_SENSOR_0 RK29_CAM_SENSOR_OV2659//RK_CAM_SENSOR_OV5642                                            /* back camera sensor */
61 #define CONFIG_SENSOR_IIC_ADDR_0                0x60//0x78
62 #define CONFIG_SENSOR_IIC_ADAPTER_ID_0    1
63 #define CONFIG_SENSOR_CIF_INDEX_0                    0
64 #define CONFIG_SENSOR_ORIENTATION_0       90
65 #define CONFIG_SENSOR_POWER_PIN_0                 INVALID_GPIO
66 #define CONFIG_SENSOR_RESET_PIN_0                 INVALID_GPIO
67 #define CONFIG_SENSOR_POWERDN_PIN_0       INVALID_GPIO
68 #define CONFIG_SENSOR_FALSH_PIN_0                 INVALID_GPIO
69 #define CONFIG_SENSOR_POWERACTIVE_LEVEL_0 RK29_CAM_POWERACTIVE_L
70 #define CONFIG_SENSOR_RESETACTIVE_LEVEL_0 RK29_CAM_RESETACTIVE_L
71 #define CONFIG_SENSOR_POWERDNACTIVE_LEVEL_0 RK29_CAM_POWERDNACTIVE_H
72 #define CONFIG_SENSOR_FLASHACTIVE_LEVEL_0 RK29_CAM_FLASHACTIVE_L
73
74 #define CONFIG_SENSOR_QCIF_FPS_FIXED_0          15000
75 #define CONFIG_SENSOR_QVGA_FPS_FIXED_0          15000
76 #define CONFIG_SENSOR_CIF_FPS_FIXED_0           15000
77 #define CONFIG_SENSOR_VGA_FPS_FIXED_0           15000
78 #define CONFIG_SENSOR_480P_FPS_FIXED_0          15000
79 #define CONFIG_SENSOR_SVGA_FPS_FIXED_0          15000
80 #define CONFIG_SENSOR_720P_FPS_FIXED_0          30000
81
82 #define CONFIG_SENSOR_1 RK29_CAM_SENSOR_OV2659                                          /* front camera sensor */
83 #define CONFIG_SENSOR_IIC_ADDR_1                0x60
84 #define CONFIG_SENSOR_IIC_ADAPTER_ID_1    1
85 #define CONFIG_SENSOR_CIF_INDEX_1                                 1
86 #define CONFIG_SENSOR_ORIENTATION_1       270
87 #define CONFIG_SENSOR_POWER_PIN_1                 INVALID_GPIO
88 #define CONFIG_SENSOR_RESET_PIN_1                 INVALID_GPIO
89 #define CONFIG_SENSOR_POWERDN_PIN_1       INVALID_GPIO
90 #define CONFIG_SENSOR_FALSH_PIN_1                 INVALID_GPIO
91 #define CONFIG_SENSOR_POWERACTIVE_LEVEL_1 RK29_CAM_POWERACTIVE_L
92 #define CONFIG_SENSOR_RESETACTIVE_LEVEL_1 RK29_CAM_RESETACTIVE_L
93 #define CONFIG_SENSOR_POWERDNACTIVE_LEVEL_1 RK29_CAM_POWERDNACTIVE_H
94 #define CONFIG_SENSOR_FLASHACTIVE_LEVEL_1 RK29_CAM_FLASHACTIVE_L
95
96 #define CONFIG_SENSOR_QCIF_FPS_FIXED_1          15000
97 #define CONFIG_SENSOR_QVGA_FPS_FIXED_1          15000
98 #define CONFIG_SENSOR_CIF_FPS_FIXED_1           15000
99 #define CONFIG_SENSOR_VGA_FPS_FIXED_1           15000
100 #define CONFIG_SENSOR_480P_FPS_FIXED_1          15000
101 #define CONFIG_SENSOR_SVGA_FPS_FIXED_1          15000
102 #define CONFIG_SENSOR_720P_FPS_FIXED_1          30000
103
104 #define CONFIG_USE_CIF_0        1
105 #define CONFIG_USE_CIF_1      0
106 #endif  //#ifdef CONFIG_VIDEO_RK29
107 /*---------------- Camera Sensor Configuration Macro End------------------------*/
108 #include "../../../drivers/media/video/rk30_camera.c"
109 /*---------------- Camera Sensor Macro Define End  ---------*/
110
111 #define PMEM_CAM_SIZE           PMEM_CAM_NECESSARY
112 #ifdef CONFIG_VIDEO_RK29_WORK_IPP
113 #define MEM_CAMIPP_SIZE         PMEM_CAMIPP_NECESSARY
114 #else
115 #define MEM_CAMIPP_SIZE         0
116 #endif
117 /*****************************************************************************************
118  * camera  devices
119  * author: ddl@rock-chips.com
120  *****************************************************************************************/
121 #ifdef CONFIG_VIDEO_RK29
122 #define CONFIG_SENSOR_POWER_IOCTL_USR      0
123 #define CONFIG_SENSOR_RESET_IOCTL_USR      0
124 #define CONFIG_SENSOR_POWERDOWN_IOCTL_USR          0
125 #define CONFIG_SENSOR_FLASH_IOCTL_USR      0
126
127 #if CONFIG_SENSOR_POWER_IOCTL_USR
128 static int sensor_power_usr_cb (struct rk29camera_gpio_res *res,int on)
129 {
130         #error "CONFIG_SENSOR_POWER_IOCTL_USR is 1, sensor_power_usr_cb function must be writed!!";
131 }
132 #endif
133
134 #if CONFIG_SENSOR_RESET_IOCTL_USR
135 static int sensor_reset_usr_cb (struct rk29camera_gpio_res *res,int on)
136 {
137         #error "CONFIG_SENSOR_RESET_IOCTL_USR is 1, sensor_reset_usr_cb function must be writed!!";
138 }
139 #endif
140
141 #if CONFIG_SENSOR_POWERDOWN_IOCTL_USR
142 static int sensor_powerdown_usr_cb (struct rk29camera_gpio_res *res,int on)
143 {
144         #error "CONFIG_SENSOR_POWERDOWN_IOCTL_USR is 1, sensor_powerdown_usr_cb function must be writed!!";
145 }
146 #endif
147
148 #if CONFIG_SENSOR_FLASH_IOCTL_USR
149 static int sensor_flash_usr_cb (struct rk29camera_gpio_res *res,int on)
150 {
151         #error "CONFIG_SENSOR_FLASH_IOCTL_USR is 1, sensor_flash_usr_cb function must be writed!!";
152 }
153 #endif
154
155 static struct rk29camera_platform_ioctl_cb      sensor_ioctl_cb = {
156         #if CONFIG_SENSOR_POWER_IOCTL_USR
157         .sensor_power_cb = sensor_power_usr_cb,
158         #else
159         .sensor_power_cb = NULL,
160         #endif
161
162         #if CONFIG_SENSOR_RESET_IOCTL_USR
163         .sensor_reset_cb = sensor_reset_usr_cb,
164         #else
165         .sensor_reset_cb = NULL,
166         #endif
167
168         #if CONFIG_SENSOR_POWERDOWN_IOCTL_USR
169         .sensor_powerdown_cb = sensor_powerdown_usr_cb,
170         #else
171         .sensor_powerdown_cb = NULL,
172         #endif
173
174         #if CONFIG_SENSOR_FLASH_IOCTL_USR
175         .sensor_flash_cb = sensor_flash_usr_cb,
176         #else
177         .sensor_flash_cb = NULL,
178         #endif
179 };
180 static struct reginfo_t rk_init_data_sensor_reg_0[] =
181 {
182                 {0x0000, 0x00,0,0}
183         };
184 static struct reginfo_t rk_init_data_sensor_winseqreg_0[] ={
185         {0x0000, 0x00,0,0}
186         };
187 static rk_sensor_user_init_data_s rk_init_data_sensor_0 = 
188 {       
189         .rk_sensor_init_width = INVALID_VALUE,
190         .rk_sensor_init_height = INVALID_VALUE,
191         .rk_sensor_init_bus_param = INVALID_VALUE,
192         .rk_sensor_init_pixelcode = INVALID_VALUE,
193         .rk_sensor_init_data = rk_init_data_sensor_reg_0,
194         .rk_sensor_init_winseq = NULL,//rk_init_data_sensor_winseqreg_0,
195         .rk_sensor_winseq_size = sizeof(rk_init_data_sensor_winseqreg_0) / sizeof(struct reginfo_t),
196         
197 };
198 static rk_sensor_user_init_data_s* rk_init_data_sensor_0_p = &rk_init_data_sensor_0;
199 static rk_sensor_user_init_data_s* rk_init_data_sensor_1_p = NULL;
200 #include "../../../drivers/media/video/rk30_camera.c"
201
202 #endif
203
204 #if defined(CONFIG_TOUCHSCREEN_GT8XX)
205 #define TOUCH_RESET_PIN  RK30_PIN4_PD0
206 #define TOUCH_PWR_PIN    INVALID_GPIO
207 int goodix_init_platform_hw(void)
208 {
209         int ret;
210         printk("goodix_init_platform_hw\n");
211         if(TOUCH_PWR_PIN != INVALID_GPIO)
212         {
213                 ret = gpio_request(TOUCH_PWR_PIN, "goodix power pin");
214                 if(ret != 0){
215                         gpio_free(TOUCH_PWR_PIN);
216                         printk("goodix power error\n");
217                         return -EIO;
218                 }
219                 gpio_direction_output(TOUCH_PWR_PIN, 0);
220                 gpio_set_value(TOUCH_PWR_PIN,GPIO_LOW);
221                 msleep(100);
222         }
223         
224         if(TOUCH_RESET_PIN != INVALID_GPIO)
225         {
226                 ret = gpio_request(TOUCH_RESET_PIN, "goodix reset pin");
227                 if(ret != 0){
228                         gpio_free(TOUCH_RESET_PIN);
229                         printk("goodix gpio_request error\n");
230                         return -EIO;
231                 }
232                 gpio_direction_output(TOUCH_RESET_PIN, 0);
233                 gpio_set_value(TOUCH_RESET_PIN,GPIO_LOW);
234                 msleep(10);
235                 gpio_set_value(TOUCH_RESET_PIN,GPIO_HIGH);
236                 msleep(500);
237         }
238         return 0;
239 }
240
241 struct goodix_platform_data goodix_info = {
242           .model= 8105,
243           .irq_pin = RK30_PIN4_PC2,
244           .rest_pin  = TOUCH_RESET_PIN,
245           .init_platform_hw = goodix_init_platform_hw,
246 };
247 #endif
248
249
250 /*****************************************************************************************
251  * xpt2046 touch panel
252  * author: hhb@rock-chips.com
253  *****************************************************************************************/
254 #if defined(CONFIG_TOUCHSCREEN_XPT2046_NORMAL_SPI) || defined(CONFIG_TOUCHSCREEN_XPT2046_TSLIB_SPI)
255 #define XPT2046_GPIO_INT        RK30_PIN4_PC2 
256 #define DEBOUNCE_REPTIME        3
257
258
259 static struct xpt2046_platform_data xpt2046_info = {
260         .model                  = 2046,
261         .keep_vref_on           = 1,
262         .swap_xy                = 0,
263         .debounce_max           = 7,
264         .debounce_rep           = DEBOUNCE_REPTIME,
265         .debounce_tol           = 20,
266         .gpio_pendown           = XPT2046_GPIO_INT,
267         .pendown_iomux_name = GPIO4C2_SMCDATA2_TRACEDATA2_NAME, 
268         .pendown_iomux_mode = GPIO4C_GPIO4C2,   
269         .touch_virtualkey_length = 60,
270         .penirq_recheck_delay_usecs = 1,
271 #if defined(CONFIG_TOUCHSCREEN_480X800)
272         .x_min                  = 0,
273         .x_max                  = 480,
274         .y_min                  = 0,
275         .y_max                  = 800,
276         .touch_ad_top = 3940,
277         .touch_ad_bottom = 310,
278         .touch_ad_left = 3772,
279         .touch_ad_right = 340,
280 #elif defined(CONFIG_TOUCHSCREEN_800X480)
281         .x_min                  = 0,
282         .x_max                  = 800,
283         .y_min                  = 0,
284         .y_max                  = 480,
285         .touch_ad_top = 2447,
286         .touch_ad_bottom = 207,
287         .touch_ad_left = 5938,
288         .touch_ad_right = 153,
289 #elif defined(CONFIG_TOUCHSCREEN_320X480)
290         .x_min                  = 0,
291         .x_max                  = 320,
292         .y_min                  = 0,
293         .y_max                  = 480,
294         .touch_ad_top = 3166,
295         .touch_ad_bottom = 256,
296         .touch_ad_left = 3658,
297         .touch_ad_right = 380,
298 #endif  
299 };
300 #elif defined(CONFIG_TOUCHSCREEN_XPT2046_CBN_SPI)
301 static struct xpt2046_platform_data xpt2046_info = {
302         .model                  = 2046,
303         .keep_vref_on   = 1,
304         .swap_xy                = 0,
305         .debounce_max           = 7,
306         .debounce_rep           = DEBOUNCE_REPTIME,
307         .debounce_tol           = 20,
308         .gpio_pendown           = XPT2046_GPIO_INT,
309         .pendown_iomux_name = GPIO4C2_SMCDATA2_TRACEDATA2_NAME, 
310         .pendown_iomux_mode = GPIO4C_GPIO4C2,   
311         .touch_virtualkey_length = 60,
312         .penirq_recheck_delay_usecs = 1,
313         
314 #if defined(CONFIG_TOUCHSCREEN_480X800)
315         .x_min                  = 0,
316         .x_max                  = 480,
317         .y_min                  = 0,
318         .y_max                  = 800,
319         .screen_x = { 70,  410, 70, 410, 240},
320         .screen_y = { 50, 50,  740, 740, 400},
321         .uncali_x_default = {  3267,  831, 3139, 715, 1845 },
322         .uncali_y_default = { 3638,  3664, 564,  591, 2087 },
323 #elif defined(CONFIG_TOUCHSCREEN_800X480)
324         .x_min                  = 0,
325         .x_max                  = 800,
326         .y_min                  = 0,
327         .y_max                  = 480,
328         .screen_x[5] = { 50, 750,  50, 750, 400};
329         .screen_y[5] = { 40,  40, 440, 440, 240};
330         .uncali_x_default[5] = { 438,  565, 3507,  3631, 2105 };
331         .uncali_y_default[5] = {  3756,  489, 3792, 534, 2159 };
332 #elif defined(CONFIG_TOUCHSCREEN_320X480)
333         .x_min                  = 0,
334         .x_max                  = 320,
335         .y_min                  = 0,
336         .y_max                  = 480,
337         .screen_x[5] = { 50, 270,  50, 270, 160}; 
338         .screen_y[5] = { 40,  40, 440, 440, 240}; 
339         .uncali_x_default[5] = { 812,  3341, 851,  3371, 2183 };
340         .uncali_y_default[5] = {  442,  435, 3193, 3195, 2004 };
341 #endif  
342 };
343 #endif
344 #if defined(CONFIG_TOUCHSCREEN_XPT2046_SPI)
345 static struct rk29xx_spi_chip xpt2046_chip = {
346         //.poll_mode = 1,
347         .enable_dma = 1,
348 };
349 #endif
350 static struct spi_board_info board_spi_devices[] = {
351 #if defined(CONFIG_TOUCHSCREEN_XPT2046_SPI)
352         {
353                 .modalias       = "xpt2046_ts",
354                 .chip_select    = 1,// 2,
355                 .max_speed_hz   = 1 * 1000 * 800,/* (max sample rate @ 3V) * (cmd + data + overhead) */
356                 .bus_num        = 0,
357                 .irq            = XPT2046_GPIO_INT,
358                 .platform_data = &xpt2046_info,
359                 .controller_data = &xpt2046_chip,
360         },
361 #endif
362
363 };
364
365
366 /***********************************************************
367 *       rk30  backlight
368 ************************************************************/
369 #ifdef CONFIG_BACKLIGHT_RK29_BL
370 #define PWM_ID            0
371 #define PWM_MUX_NAME      GPIO0A3_PWM0_NAME
372 #define PWM_MUX_MODE      GPIO0A_PWM0
373 #define PWM_MUX_MODE_GPIO GPIO0A_GPIO0A3
374 #define PWM_GPIO          RK30_PIN0_PA3
375 #define PWM_EFFECT_VALUE  1
376
377 #define LCD_DISP_ON_PIN
378
379 #ifdef  LCD_DISP_ON_PIN
380 //#define BL_EN_MUX_NAME    GPIOF34_UART3_SEL_NAME
381 //#define BL_EN_MUX_MODE    IOMUXB_GPIO1_B34
382
383 #define BL_EN_PIN         RK30_PIN6_PB3
384 #define BL_EN_VALUE       GPIO_HIGH
385 #endif
386 static int rk29_backlight_io_init(void)
387 {
388         int ret = 0;
389         rk30_mux_api_set(PWM_MUX_NAME, PWM_MUX_MODE);
390 #ifdef  LCD_DISP_ON_PIN
391         // rk30_mux_api_set(BL_EN_MUX_NAME, BL_EN_MUX_MODE);
392
393         ret = gpio_request(BL_EN_PIN, NULL);
394         if(ret != 0)
395         {
396                 gpio_free(BL_EN_PIN);
397         }
398
399         gpio_direction_output(BL_EN_PIN, 0);
400         gpio_set_value(BL_EN_PIN, BL_EN_VALUE);
401 #endif
402     return ret;
403 }
404
405 static int rk29_backlight_io_deinit(void)
406 {
407         int ret = 0;
408 #ifdef  LCD_DISP_ON_PIN
409         gpio_free(BL_EN_PIN);
410 #endif
411         rk30_mux_api_set(PWM_MUX_NAME, PWM_MUX_MODE_GPIO);   
412     return ret;
413 }
414
415 static int rk29_backlight_pwm_suspend(void)
416 {
417         int ret = 0;
418         rk30_mux_api_set(PWM_MUX_NAME, PWM_MUX_MODE_GPIO);
419         if (gpio_request(PWM_GPIO, NULL)) {
420                 printk("func %s, line %d: request gpio fail\n", __FUNCTION__, __LINE__);
421                 return -1;
422         }
423         gpio_direction_output(PWM_GPIO, GPIO_LOW);
424 #ifdef  LCD_DISP_ON_PIN
425         gpio_direction_output(BL_EN_PIN, 0);
426         gpio_set_value(BL_EN_PIN, !BL_EN_VALUE);
427 #endif
428         return ret;
429 }
430
431 static int rk29_backlight_pwm_resume(void)
432 {
433         gpio_free(PWM_GPIO);
434         rk30_mux_api_set(PWM_MUX_NAME, PWM_MUX_MODE);
435 #ifdef  LCD_DISP_ON_PIN
436         msleep(30);
437         gpio_direction_output(BL_EN_PIN, 1);
438         gpio_set_value(BL_EN_PIN, BL_EN_VALUE);
439 #endif
440         return 0;
441 }
442
443 static struct rk29_bl_info rk29_bl_info = {
444     .pwm_id   = PWM_ID,
445     .bl_ref   = PWM_EFFECT_VALUE,
446     .io_init   = rk29_backlight_io_init,
447     .io_deinit = rk29_backlight_io_deinit,
448     .pwm_suspend = rk29_backlight_pwm_suspend,
449     .pwm_resume = rk29_backlight_pwm_resume,
450 };
451
452
453 static struct platform_device rk29_device_backlight = {
454         .name   = "rk29_backlight",
455         .id     = -1,
456         .dev    = {
457            .platform_data  = &rk29_bl_info,
458         }
459 };
460
461 #endif
462
463 /*MMA8452 gsensor*/
464 #if defined (CONFIG_GS_MMA8452)
465 #define MMA8452_INT_PIN   RK30_PIN4_PC0
466
467 static int mma8452_init_platform_hw(void)
468 {
469         rk30_mux_api_set(GPIO4C0_SMCDATA0_TRACEDATA0_NAME, GPIO4C_GPIO4C0);
470
471         if(gpio_request(MMA8452_INT_PIN,NULL) != 0){
472                 gpio_free(MMA8452_INT_PIN);
473                 printk("mma8452_init_platform_hw gpio_request error\n");
474                 return -EIO;
475         }
476         gpio_pull_updown(MMA8452_INT_PIN, 1);
477         return 0;
478 }
479
480
481 static struct mma8452_platform_data mma8452_info = {
482         .model= 8452,
483         .swap_xy = 0,
484         .swap_xyz = 1,
485         .init_platform_hw= mma8452_init_platform_hw,
486         .orientation = { -1, 0, 0, 0, 0, 1, 0, -1, 0},
487 };
488 #endif
489 #if defined (CONFIG_COMPASS_AK8975)
490 static struct akm8975_platform_data akm8975_info =
491 {
492         .m_layout = 
493         {
494                 {
495                         {1, 0, 0 },
496                         {0, -1, 0 },
497                         {0,     0, -1 },
498                 },
499
500                 {
501                         {1, 0, 0 },
502                         {0, 1, 0 },
503                         {0,     0, 1 },
504                 },
505
506                 {
507                         {1, 0, 0 },
508                         {0, 1, 0 },
509                         {0,     0, 1 },
510                 },
511
512                 {
513                         {1, 0, 0 },
514                         {0, 1, 0 },
515                         {0,     0, 1 },
516                 },
517         }
518
519 };
520
521 #endif
522
523 #if defined(CONFIG_GYRO_L3G4200D)
524
525 #include <linux/l3g4200d.h>
526 #define L3G4200D_INT_PIN  RK30_PIN4_PC3
527
528 static int l3g4200d_init_platform_hw(void)
529 {
530         if (gpio_request(L3G4200D_INT_PIN, NULL) != 0) {
531                 gpio_free(L3G4200D_INT_PIN);
532                 printk("%s: request l3g4200d int pin error\n", __func__);
533                 return -EIO;
534         }
535         gpio_pull_updown(L3G4200D_INT_PIN, 1);
536         return 0;
537 }
538
539 static struct l3g4200d_platform_data l3g4200d_info = {
540         .fs_range = 1,
541
542         .axis_map_x = 0,
543         .axis_map_y = 1,
544         .axis_map_z = 2,
545
546         .negate_x = 1,
547         .negate_y = 1,
548         .negate_z = 0,
549
550         .init = l3g4200d_init_platform_hw,
551 };
552
553 #endif
554
555 #ifdef CONFIG_LS_CM3217
556
557 #define CM3217_POWER_PIN        INVALID_GPIO
558 #define CM3217_IRQ_PIN          INVALID_GPIO
559 static int cm3217_init_hw(void)
560 {
561 #if 0
562         if (gpio_request(CM3217_POWER_PIN, NULL) != 0) {
563         gpio_free(CM3217_POWER_PIN);
564         printk("%s: request cm3217 power pin error\n", __func__);
565         return -EIO;
566         }
567         gpio_pull_updown(CM3217_POWER_PIN, PullDisable);
568
569         if (gpio_request(CM3217_IRQ_PIN, NULL) != 0) {
570         gpio_free(CM3217_IRQ_PIN);
571         printk("%s: request cm3217 int pin error\n", __func__);
572         return -EIO;
573         }
574         gpio_pull_updown(CM3217_IRQ_PIN, PullDisable);
575 #endif
576         return 0;
577 }
578
579 static void cm3217_exit_hw(void)
580 {
581 #if 0
582         gpio_free(CM3217_POWER_PIN);
583         gpio_free(CM3217_IRQ_PIN);
584 #endif
585         return;
586 }
587
588 struct cm3217_platform_data cm3217_info = {
589         .irq_pin = CM3217_IRQ_PIN,
590         .power_pin = CM3217_POWER_PIN,
591         .init_platform_hw = cm3217_init_hw,
592         .exit_platform_hw = cm3217_exit_hw,
593 };
594 #endif
595
596
597
598 #ifdef CONFIG_FB_ROCKCHIP
599 static struct resource resource_fb[] = {
600         [0] = {
601                 .name  = "fb0 buf",
602                 .start = 0,
603                 .end   = 0,//RK30_FB0_MEM_SIZE - 1,
604                 .flags = IORESOURCE_MEM,
605         },
606         [1] = {
607                 .name  = "ipp buf",  //for rotate
608                 .start = 0,
609                 .end   = 0,//RK30_FB0_MEM_SIZE - 1,
610                 .flags = IORESOURCE_MEM,
611         },
612         [2] = {
613                 .name  = "fb2 buf",
614                 .start = 0,
615                 .end   = 0,//RK30_FB0_MEM_SIZE - 1,
616                 .flags = IORESOURCE_MEM,
617         },
618 };
619
620 static struct platform_device device_fb = {
621         .name             = "rk-fb",
622         .id               = -1,
623         .num_resources    = ARRAY_SIZE(resource_fb),
624         .resource         = resource_fb,
625 };
626 #endif
627
628 #ifdef CONFIG_ANDROID_TIMED_GPIO
629 static struct timed_gpio timed_gpios[] = {
630         {
631                 .name = "vibrator",
632                 .gpio = RK30_PIN0_PA4,
633                 .max_timeout = 1000,
634                 .active_low = 0,
635                 .adjust_time =20,      //adjust for diff product
636         },
637 };
638
639 struct timed_gpio_platform_data rk29_vibrator_info = {
640         .num_gpios = 1,
641         .gpios = timed_gpios,
642 };
643
644 struct platform_device rk29_device_vibrator ={
645         .name = "timed-gpio",
646         .id = -1,
647         .dev = {
648                 .platform_data = &rk29_vibrator_info,
649                 },
650
651 };
652 #endif 
653
654 #ifdef CONFIG_LEDS_GPIO_PLATFORM
655 struct gpio_led rk29_leds[] = {
656                 {
657                         .name = "button-backlight",
658                         .gpio = RK30_PIN4_PD7,
659                         .default_trigger = "timer",
660                         .active_low = 0,
661                         .retain_state_suspended = 0,
662                         .default_state = LEDS_GPIO_DEFSTATE_OFF,
663                 },
664 };
665
666 struct gpio_led_platform_data rk29_leds_pdata = {
667         .leds = &rk29_leds,
668         .num_leds       = ARRAY_SIZE(rk29_leds),
669 };
670
671 struct platform_device rk29_device_gpio_leds = {
672         .name   = "leds-gpio",
673         .id     = -1,
674         .dev    = {
675            .platform_data  = &rk29_leds_pdata,
676         },
677 };
678 #endif
679
680 #ifdef CONFIG_RK_IRDA
681 #define IRDA_IRQ_PIN           RK30_PIN6_PA1
682
683 int irda_iomux_init(void)
684 {
685         int ret = 0;
686
687         //irda irq pin
688         ret = gpio_request(IRDA_IRQ_PIN, NULL);
689         if(ret != 0)
690         {
691         gpio_free(IRDA_IRQ_PIN);
692         printk(">>>>>> IRDA_IRQ_PIN gpio_request err \n ");
693         }
694         gpio_pull_updown(IRDA_IRQ_PIN, PullDisable);
695         gpio_direction_input(IRDA_IRQ_PIN);
696
697         return 0;
698 }
699
700 int irda_iomux_deinit(void)
701 {
702         gpio_free(IRDA_IRQ_PIN);
703         return 0;
704 }
705
706 static struct irda_info rk29_irda_info = {
707         .intr_pin = IRDA_IRQ_PIN,
708         .iomux_init = irda_iomux_init,
709         .iomux_deinit = irda_iomux_deinit,
710         //.irda_pwr_ctl = bu92747guw_power_ctl,
711 };
712
713 static struct platform_device irda_device = {
714 #ifdef CONFIG_RK_IRDA_NET
715                         .name   = "rk_irda",
716 #else
717                         .name = "bu92747_irda",
718 #endif
719     .id           = -1,
720         .dev            = {
721                 .platform_data  = &rk29_irda_info,
722         }
723 };
724 #endif
725
726 #ifdef CONFIG_ION
727 #define ION_RESERVE_SIZE        (80 * SZ_1M)
728 static struct ion_platform_data rk30_ion_pdata = {
729         .nr = 1,
730         .heaps = {
731                 {
732                         .type = ION_HEAP_TYPE_CARVEOUT,
733                         .id = ION_NOR_HEAP_ID,
734                         .name = "norheap",
735                         .size = ION_RESERVE_SIZE,
736                 }
737         },
738 };
739
740 static struct platform_device device_ion = {
741         .name = "ion-rockchip",
742         .id = 0,
743         .dev = {
744                 .platform_data = &rk30_ion_pdata,
745         },
746 };
747 #endif
748
749 static struct platform_device *devices[] __initdata = {
750 #ifdef CONFIG_BACKLIGHT_RK29_BL
751         &rk29_device_backlight,
752 #endif  
753 #ifdef CONFIG_FB_ROCKCHIP
754         &device_fb,
755 #endif
756 #ifdef CONFIG_ION
757         &device_ion,
758 #endif
759 #ifdef CONFIG_ANDROID_TIMED_GPIO
760         &rk29_device_vibrator,
761 #endif
762 #ifdef CONFIG_LEDS_GPIO_PLATFORM
763         &rk29_device_gpio_leds,
764 #endif
765 #ifdef CONFIG_RK_IRDA
766         &irda_device,
767 #endif
768 };
769
770 // i2c
771 #ifdef CONFIG_I2C0_RK30
772 static struct i2c_board_info __initdata i2c0_info[] = {
773 #if defined (CONFIG_GS_MMA8452)
774             {
775               .type           = "gs_mma8452",
776               .addr           = 0x1c,
777               .flags          = 0,
778               .irq            = MMA8452_INT_PIN,
779               .platform_data  = &mma8452_info,
780             },
781 #endif
782 #if defined (CONFIG_COMPASS_AK8975)
783         {
784                 .type           = "ak8975",
785                 .addr           = 0x0d,
786                 .flags          = 0,
787                 .irq            = RK30_PIN4_PC1,
788                 .platform_data  = &akm8975_info,
789         },
790 #endif
791 #if defined (CONFIG_GYRO_L3G4200D)
792         {
793                 .type           = "l3g4200d_gryo",
794                 .addr           = 0x69,
795                 .flags          = 0,
796                 .irq            = L3G4200D_INT_PIN,
797                 .platform_data  = &l3g4200d_info,
798         },
799 #endif
800
801 #if defined (CONFIG_SND_SOC_RK1000)
802         {
803                 .type                   = "rk1000_i2c_codec",
804                 .addr           = 0x60,
805                 .flags                  = 0,
806         },
807         {
808                 .type                   = "rk1000_control",
809                 .addr                   = 0x40,
810                 .flags                  = 0,
811         },      
812 #endif
813 };
814 #endif
815
816 #ifdef CONFIG_I2C1_RK30
817 static struct i2c_board_info __initdata i2c1_info[] = {
818 };
819 #endif
820
821 #ifdef CONFIG_I2C2_RK30
822 static struct i2c_board_info __initdata i2c2_info[] = {
823 #if defined (CONFIG_TOUCHSCREEN_GT8XX)
824                     {
825                                 .type   = "Goodix-TS",
826                                 .addr   = 0x55,
827                                 .flags      =0,
828                                 .irq            =RK30_PIN4_PC2,
829                                 .platform_data = &goodix_info,
830                     },
831 #endif
832 #if defined (CONFIG_LS_CM3217)
833         {
834                 .type           = "lightsensor",
835                 .addr           = 0x20,
836                 .flags          = 0,
837                 .irq            = CM3217_IRQ_PIN,
838                 .platform_data  = &cm3217_info,
839         },
840 #endif
841
842 };
843 #endif
844
845 #ifdef CONFIG_I2C3_RK30
846 static struct i2c_board_info __initdata i2c3_info[] = {
847 };
848 #endif
849
850 #ifdef CONFIG_I2C4_RK30
851 static struct i2c_board_info __initdata i2c4_info[] = {
852 };
853 #endif
854
855 static void __init rk30_i2c_register_board_info(void)
856 {
857 #ifdef CONFIG_I2C0_RK30
858         i2c_register_board_info(0, i2c0_info, ARRAY_SIZE(i2c0_info));
859 #endif
860 #ifdef CONFIG_I2C1_RK30
861         i2c_register_board_info(1, i2c1_info, ARRAY_SIZE(i2c1_info));
862 #endif
863 #ifdef CONFIG_I2C2_RK30
864         i2c_register_board_info(2, i2c2_info, ARRAY_SIZE(i2c2_info));
865 #endif
866 #ifdef CONFIG_I2C3_RK30
867         i2c_register_board_info(3, i2c3_info, ARRAY_SIZE(i2c3_info));
868 #endif
869 #ifdef CONFIG_I2C4_RK30
870         i2c_register_board_info(4, i2c4_info, ARRAY_SIZE(i2c4_info));
871 #endif
872 }
873 //end of i2c
874
875 static void __init machine_rk30_board_init(void)
876 {
877         rk30_i2c_register_board_info();
878         spi_register_board_info(board_spi_devices, ARRAY_SIZE(board_spi_devices));
879         platform_add_devices(devices, ARRAY_SIZE(devices));
880 }
881
882 static void __init rk30_reserve(void)
883 {
884 #ifdef CONFIG_ION
885         rk30_ion_pdata.heaps[0].base = board_mem_reserve_add("ion",ION_RESERVE_SIZE);
886 #endif
887 #ifdef CONFIG_FB_ROCKCHIP
888         resource_fb[0].start = board_mem_reserve_add("fb0",RK30_FB0_MEM_SIZE);
889         resource_fb[0].end = resource_fb[0].start + RK30_FB0_MEM_SIZE - 1;
890         resource_fb[1].start = board_mem_reserve_add("ipp buf",RK30_FB0_MEM_SIZE);
891         resource_fb[1].end = resource_fb[1].start + RK30_FB0_MEM_SIZE - 1;
892         resource_fb[2].start = board_mem_reserve_add("fb2",RK30_FB0_MEM_SIZE);
893         resource_fb[2].end = resource_fb[2].start + RK30_FB0_MEM_SIZE - 1;      
894 #endif
895
896 #if (MEM_CAMIPP_SIZE != 0)
897         #if CONFIG_USE_CIF_0
898         rk_camera_platform_data.meminfo.name = "camera_ipp_mem_0";
899         rk_camera_platform_data.meminfo.start = board_mem_reserve_add("camera_ipp_mem_0",MEM_CAMIPP_SIZE);
900         rk_camera_platform_data.meminfo.size= MEM_CAMIPP_SIZE;
901         #endif
902         #if CONFIG_USE_CIF_1
903         rk_camera_platform_data.meminfo_cif1.name = "camera_ipp_mem_1";
904         rk_camera_platform_data.meminfo_cif1.start =board_mem_reserve_add("camera_ipp_mem_1",MEM_CAMIPP_SIZE);
905         rk_camera_platform_data.meminfo_cif1.size= MEM_CAMIPP_SIZE;
906         #endif
907 #endif
908
909 #if (PMEM_CAM_SIZE != 0)
910         android_pmem_cam_pdata.start = board_mem_reserve_add("camera_pmem",PMEM_CAM_SIZE);
911         android_pmem_cam_pdata.size = PMEM_CAM_SIZE;
912 #endif
913
914         board_mem_reserved();
915 }
916
917 MACHINE_START(RK30, "RK30board")
918         .boot_params    = PLAT_PHYS_OFFSET + 0x800,
919         .fixup          = rk30_fixup,
920         .reserve        = &rk30_reserve,
921         .map_io         = rk30_map_io,
922         .init_irq       = rk30_init_irq,
923         .timer          = &rk30_timer,
924         .init_machine   = machine_rk30_board_init,
925 MACHINE_END