Merge branch 'develop' of xjh@10.10.10.29:/home/rockchip/kernel into develop
[firefly-linux-kernel-4.4.55.git] / arch / arm / mach-rk29 / board-rk29sdk.c
1 /* arch/arm/mach-rk29/board-rk29.c\r
2  *\r
3  * Copyright (C) 2010 ROCKCHIP, Inc.\r
4  *\r
5  * This software is licensed under the terms of the GNU General Public\r
6  * License version 2, as published by the Free Software Foundation, and\r
7  * may be copied, distributed, and modified under those terms.\r
8  *\r
9  * This program is distributed in the hope that it will be useful,\r
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
12  * GNU General Public License for more details.\r
13  *\r
14  */\r
15 \r
16 #include <linux/kernel.h>\r
17 #include <linux/init.h>\r
18 #include <linux/platform_device.h>\r
19 #include <linux/input.h>\r
20 #include <linux/io.h>\r
21 #include <linux/delay.h>\r
22 #include <linux/i2c.h>\r
23 #include <linux/spi/spi.h>\r
24 #include <linux/mmc/host.h>\r
25 #include <linux/android_pmem.h>\r
26 #include <linux/usb/android_composite.h>\r
27 \r
28 #include <mach/hardware.h>\r
29 #include <asm/setup.h>\r
30 #include <asm/mach-types.h>\r
31 #include <asm/mach/arch.h>\r
32 #include <asm/mach/map.h>\r
33 #include <asm/mach/flash.h>\r
34 #include <asm/hardware/gic.h>\r
35 \r
36 #include <mach/iomux.h>\r
37 #include <mach/gpio.h>\r
38 #include <mach/irqs.h>\r
39 #include <mach/rk29_iomap.h>\r
40 #include <mach/board.h>\r
41 #include <mach/rk29_nand.h>\r
42 #include <mach/rk29_camera.h>                          /* ddl@rock-chips.com : camera support */\r
43 #include <media/soc_camera.h>                               /* ddl@rock-chips.com : camera support */\r
44 #include <mach/vpu_mem.h>\r
45 \r
46 \r
47 #include <linux/mtd/nand.h>\r
48 #include <linux/mtd/partitions.h>\r
49 \r
50 #include "devices.h"\r
51 #include "../../../drivers/input/touchscreen/xpt2046_cbn_ts.h"\r
52 \r
53 \r
54 /* Set memory size of pmem */\r
55 #ifdef CONFIG_MACH_RK29SDK_MEM_SIZE_M
56 #define SDRAM_SIZE          (CONFIG_MACH_RK29SDK_MEM_SIZE_M * SZ_1M)
57 #else
58 #define SDRAM_SIZE          SZ_512M
59 #endif
60 #define PMEM_GPU_SIZE       SZ_64M\r
61 #define PMEM_UI_SIZE        SZ_32M\r
62 #define PMEM_VPU_SIZE       SZ_32M\r
63 #define PMEM_CAM_SIZE       0x00c00000\r
64 #ifdef CONFIG_VIDEO_RK29_WORK_IPP\r
65 #define MEM_CAMIPP_SIZE     SZ_4M\r
66 #else\r
67 #define MEM_CAMIPP_SIZE     0\r
68 #endif\r
69 #define MEM_FB_SIZE         (3*SZ_2M)\r
70 \r
71 #define PMEM_GPU_BASE       ((u32)RK29_SDRAM_PHYS + SDRAM_SIZE - PMEM_GPU_SIZE)\r
72 #define PMEM_UI_BASE        (PMEM_GPU_BASE - PMEM_UI_SIZE)\r
73 #define PMEM_VPU_BASE       (PMEM_UI_BASE - PMEM_VPU_SIZE)\r
74 #define PMEM_CAM_BASE       (PMEM_VPU_BASE - PMEM_CAM_SIZE)\r
75 #define MEM_CAMIPP_BASE     (PMEM_CAM_BASE - MEM_CAMIPP_SIZE)\r
76 #define MEM_FB_BASE         (MEM_CAMIPP_BASE - MEM_FB_SIZE)\r
77 #define LINUX_SIZE          (MEM_FB_BASE - RK29_SDRAM_PHYS)\r
78 \r
79 extern struct sys_timer rk29_timer;\r
80 \r
81 int rk29_nand_io_init(void)\r
82 {\r
83     return 0;\r
84 }\r
85 \r
86 struct rk29_nand_platform_data rk29_nand_data = {\r
87     .width      = 1,     /* data bus width in bytes */\r
88     .hw_ecc     = 1,     /* hw ecc 0: soft ecc */\r
89     .num_flash    = 1,\r
90     .io_init   = rk29_nand_io_init,\r
91 };\r
92 \r
93 static struct rk29_gpio_bank rk29_gpiobankinit[] = {\r
94         {\r
95                 .id             = RK29_ID_GPIO0,\r
96                 .offset = RK29_GPIO0_BASE,\r
97         },\r
98         {\r
99                 .id             = RK29_ID_GPIO1,\r
100                 .offset = RK29_GPIO1_BASE,\r
101         },\r
102         {\r
103                 .id             = RK29_ID_GPIO2,\r
104                 .offset = RK29_GPIO2_BASE,\r
105         },\r
106         {\r
107                 .id             = RK29_ID_GPIO3,\r
108                 .offset = RK29_GPIO3_BASE,\r
109         },\r
110         {\r
111                 .id             = RK29_ID_GPIO4,\r
112                 .offset = RK29_GPIO4_BASE,\r
113         },\r
114         {\r
115                 .id             = RK29_ID_GPIO5,\r
116                 .offset = RK29_GPIO5_BASE,\r
117         },\r
118         {\r
119                 .id             = RK29_ID_GPIO6,\r
120                 .offset = RK29_GPIO6_BASE,\r
121         },\r
122 };\r
123 \r
124 #ifdef CONFIG_FB_RK29\r
125 /*****************************************************************************************\r
126  * lcd  devices\r
127  * author: zyw@rock-chips.com\r
128  *****************************************************************************************/\r
129 //#ifdef  CONFIG_LCD_TD043MGEA1\r
130 #define LCD_TXD_PIN          INVALID_GPIO\r
131 #define LCD_CLK_PIN          INVALID_GPIO\r
132 #define LCD_CS_PIN           INVALID_GPIO\r
133 /*****************************************************************************************\r
134 * frame buffe  devices\r
135 * author: zyw@rock-chips.com\r
136 *****************************************************************************************/\r
137 #define FB_ID                       0\r
138 #define FB_DISPLAY_ON_PIN           RK29_PIN6_PD0\r
139 #define FB_LCD_STANDBY_PIN          RK29_PIN6_PD1\r
140 #define FB_LCD_CABC_EN_PIN          RK29_PIN6_PD2\r
141 #define FB_MCU_FMK_PIN              INVALID_GPIO\r
142 \r
143 #define FB_DISPLAY_ON_VALUE         GPIO_HIGH\r
144 #define FB_LCD_STANDBY_VALUE        GPIO_HIGH\r
145 \r
146 //#endif\r
147 static int rk29_lcd_io_init(void)\r
148 {\r
149     int ret = 0;\r
150     return ret;\r
151 }\r
152 \r
153 static int rk29_lcd_io_deinit(void)\r
154 {\r
155     int ret = 0;\r
156     return ret;\r
157 }\r
158 \r
159 struct rk29lcd_info rk29_lcd_info = {\r
160     .txd_pin  = LCD_TXD_PIN,\r
161     .clk_pin = LCD_CLK_PIN,\r
162     .cs_pin = LCD_CS_PIN,\r
163     .io_init   = rk29_lcd_io_init,\r
164     .io_deinit = rk29_lcd_io_deinit,\r
165 };\r
166 \r
167 \r
168 static int rk29_fb_io_init(struct rk29_fb_setting_info *fb_setting)\r
169 {\r
170     int ret = 0;\r
171     if(fb_setting->mcu_fmk_en && (FB_MCU_FMK_PIN != INVALID_GPIO))\r
172     {\r
173         ret = gpio_request(FB_MCU_FMK_PIN, NULL);\r
174         if(ret != 0)\r
175         {\r
176             gpio_free(FB_MCU_FMK_PIN);\r
177             printk(">>>>>> FB_MCU_FMK_PIN gpio_request err \n ");\r
178         }\r
179         gpio_direction_input(FB_MCU_FMK_PIN);\r
180     }\r
181     if(fb_setting->disp_on_en && (FB_DISPLAY_ON_PIN != INVALID_GPIO))\r
182     {\r
183         ret = gpio_request(FB_DISPLAY_ON_PIN, NULL);\r
184         if(ret != 0)\r
185         {\r
186             gpio_free(FB_DISPLAY_ON_PIN);\r
187             printk(">>>>>> FB_DISPLAY_ON_PIN gpio_request err \n ");\r
188         }\r
189     }\r
190 \r
191     if(fb_setting->disp_on_en && (FB_LCD_STANDBY_PIN != INVALID_GPIO))\r
192     {\r
193         ret = gpio_request(FB_LCD_STANDBY_PIN, NULL);\r
194         if(ret != 0)\r
195         {\r
196             gpio_free(FB_LCD_STANDBY_PIN);\r
197             printk(">>>>>> FB_LCD_STANDBY_PIN gpio_request err \n ");\r
198         }\r
199     }\r
200 \r
201     if(FB_LCD_CABC_EN_PIN != INVALID_GPIO)\r
202     {\r
203         ret = gpio_request(FB_LCD_CABC_EN_PIN, NULL);\r
204         if(ret != 0)\r
205         {\r
206             gpio_free(FB_LCD_CABC_EN_PIN);\r
207             printk(">>>>>> FB_LCD_CABC_EN_PIN gpio_request err \n ");\r
208         }\r
209         gpio_direction_output(FB_LCD_CABC_EN_PIN, 0);\r
210         gpio_set_value(FB_LCD_CABC_EN_PIN, GPIO_LOW);\r
211     }\r
212     \r
213     return ret;\r
214 }\r
215 \r
216 struct rk29fb_info rk29_fb_info = {\r
217     .fb_id   = FB_ID,\r
218     .disp_on_pin = FB_DISPLAY_ON_PIN,\r
219     .disp_on_value = FB_DISPLAY_ON_VALUE,\r
220     .standby_pin = FB_LCD_STANDBY_PIN,\r
221     .standby_value = FB_LCD_STANDBY_VALUE,\r
222     .mcu_fmk_pin = FB_MCU_FMK_PIN,\r
223     .lcd_info = &rk29_lcd_info,\r
224     .io_init   = rk29_fb_io_init,\r
225 };\r
226 \r
227 /* rk29 fb resource */\r
228 struct resource rk29_fb_resource[] = {\r
229         [0] = {\r
230         .name  = "lcdc reg",\r
231                 .start = RK29_LCDC_PHYS,\r
232                 .end   = RK29_LCDC_PHYS + RK29_LCDC_SIZE - 1,\r
233                 .flags = IORESOURCE_MEM,\r
234         },\r
235         [1] = {\r
236             .name  = "lcdc irq",\r
237                 .start = IRQ_LCDC,\r
238                 .end   = IRQ_LCDC,\r
239                 .flags = IORESOURCE_IRQ,\r
240         },\r
241         [2] = {\r
242             .name   = "win1 buf",\r
243         .start  = MEM_FB_BASE,\r
244         .end    = MEM_FB_BASE + MEM_FB_SIZE,\r
245         .flags  = IORESOURCE_MEM,\r
246     },\r
247 };\r
248 \r
249 /*platform_device*/\r
250 struct platform_device rk29_device_fb = {\r
251         .name             = "rk29-fb",\r
252         .id               = 4,\r
253         .num_resources    = ARRAY_SIZE(rk29_fb_resource),\r
254         .resource         = rk29_fb_resource,\r
255         .dev            = {\r
256                 .platform_data  = &rk29_fb_info,\r
257         }\r
258 };\r
259 #endif\r
260 \r
261 static struct android_pmem_platform_data android_pmem_pdata = {\r
262         .name           = "pmem",\r
263         .start          = PMEM_UI_BASE,\r
264         .size           = PMEM_UI_SIZE,\r
265         .no_allocator   = 0,\r
266         .cached         = 1,\r
267 };\r
268 \r
269 static struct platform_device android_pmem_device = {\r
270         .name           = "android_pmem",\r
271         .id             = 0,\r
272         .dev            = {\r
273                 .platform_data = &android_pmem_pdata,\r
274         },\r
275 };\r
276 \r
277 \r
278 static struct android_pmem_platform_data android_pmem_cam_pdata = {\r
279         .name           = "pmem_cam",\r
280         .start          = PMEM_CAM_BASE,\r
281         .size           = PMEM_CAM_SIZE,\r
282         .no_allocator   = 0,\r
283         .cached         = 1,\r
284 };\r
285 \r
286 static struct platform_device android_pmem_cam_device = {\r
287         .name           = "android_pmem",\r
288         .id             = 1,\r
289         .dev            = {\r
290                 .platform_data = &android_pmem_cam_pdata,\r
291         },\r
292 };\r
293 \r
294 \r
295 static struct vpu_mem_platform_data vpu_mem_pdata = {\r
296         .name           = "vpu_mem",\r
297         .start          = PMEM_VPU_BASE,\r
298         .size           = PMEM_VPU_SIZE,\r
299         .cached         = 1,\r
300 };\r
301 \r
302 static struct platform_device rk29_vpu_mem_device = {\r
303         .name           = "vpu_mem",\r
304         .id                 = 2,\r
305         .dev            = {\r
306         .platform_data = &vpu_mem_pdata,\r
307         },\r
308 };\r
309 \r
310 \r
311 /*HANNSTAR_P1003 touch*/\r
312 #if defined (CONFIG_HANNSTAR_P1003)\r
313 #define TOUCH_RESET_PIN RK29_PIN6_PC3\r
314 #define TOUCH_INT_PIN   RK29_PIN0_PA2\r
315 \r
316 int p1003_init_platform_hw(void)\r
317 {\r
318     if(gpio_request(TOUCH_RESET_PIN,NULL) != 0){\r
319       gpio_free(TOUCH_RESET_PIN);\r
320       printk("p1003_init_platform_hw gpio_request error\n");\r
321       return -EIO;\r
322     }\r
323 \r
324     if(gpio_request(TOUCH_INT_PIN,NULL) != 0){\r
325       gpio_free(TOUCH_INT_PIN);\r
326       printk("p1003_init_platform_hw gpio_request error\n");\r
327       return -EIO;\r
328     }\r
329     gpio_pull_updown(TOUCH_INT_PIN, 1);\r
330     gpio_direction_output(TOUCH_RESET_PIN, 0);\r
331     mdelay(500);\r
332     gpio_set_value(TOUCH_RESET_PIN,GPIO_LOW);\r
333     mdelay(500);\r
334     gpio_set_value(TOUCH_RESET_PIN,GPIO_HIGH);\r
335 \r
336     return 0;\r
337 }\r
338 \r
339 \r
340 struct p1003_platform_data p1003_info = {\r
341   .model= 1003,\r
342   .init_platform_hw= p1003_init_platform_hw,\r
343 \r
344 };\r
345 #endif\r
346 \r
347 /*MMA8452 gsensor*/\r
348 #if defined (CONFIG_GS_MMA8452)\r
349 #define MMA8452_INT_PIN   RK29_PIN0_PA3\r
350 \r
351 int mma8452_init_platform_hw(void)\r
352 {\r
353 \r
354     if(gpio_request(MMA8452_INT_PIN,NULL) != 0){\r
355       gpio_free(MMA8452_INT_PIN);\r
356       printk("mma8452_init_platform_hw gpio_request error\n");\r
357       return -EIO;\r
358     }\r
359     gpio_pull_updown(MMA8452_INT_PIN, 1);\r
360     return 0;\r
361 }\r
362 \r
363 \r
364 struct mma8452_platform_data mma8452_info = {\r
365   .model= 8452,\r
366   .swap_xy = 0,\r
367   .init_platform_hw= mma8452_init_platform_hw,\r
368 \r
369 };\r
370 #endif\r
371 \r
372 \r
373 \r
374 /*****************************************************************************************\r
375  * i2c devices\r
376  * author: kfx@rock-chips.com\r
377 *****************************************************************************************/\r
378 static int rk29_i2c0_io_init(void)\r
379 {\r
380         rk29_mux_api_set(GPIO2B7_I2C0SCL_NAME, GPIO2L_I2C0_SCL);\r
381         rk29_mux_api_set(GPIO2B6_I2C0SDA_NAME, GPIO2L_I2C0_SDA);\r
382         return 0;\r
383 }\r
384 \r
385 static int rk29_i2c1_io_init(void)\r
386 {\r
387         rk29_mux_api_set(GPIO1A7_I2C1SCL_NAME, GPIO1L_I2C1_SCL);\r
388         rk29_mux_api_set(GPIO1A6_I2C1SDA_NAME, GPIO1L_I2C1_SDA);\r
389         return 0;\r
390 }\r
391 static int rk29_i2c2_io_init(void)\r
392 {\r
393         rk29_mux_api_set(GPIO5D4_I2C2SCL_NAME, GPIO5H_I2C2_SCL);\r
394         rk29_mux_api_set(GPIO5D3_I2C2SDA_NAME, GPIO5H_I2C2_SDA);\r
395         return 0;\r
396 }\r
397 \r
398 static int rk29_i2c3_io_init(void)\r
399 {\r
400         rk29_mux_api_set(GPIO2B5_UART3RTSN_I2C3SCL_NAME, GPIO2L_I2C3_SCL);\r
401         rk29_mux_api_set(GPIO2B4_UART3CTSN_I2C3SDA_NAME, GPIO2L_I2C3_SDA);\r
402         return 0;\r
403 }\r
404 \r
405 struct rk29_i2c_platform_data default_i2c0_data = {\r
406         .bus_num    = 0,\r
407         .flags      = 0,\r
408         .slave_addr = 0xff,\r
409         .scl_rate  = 400*1000,\r
410         .mode           = I2C_MODE_IRQ,\r
411         .io_init = rk29_i2c0_io_init,\r
412 };\r
413 \r
414 struct rk29_i2c_platform_data default_i2c1_data = {\r
415         .bus_num    = 1,\r
416         .flags      = 0,\r
417         .slave_addr = 0xff,\r
418         .scl_rate  = 400*1000,\r
419         .mode           = I2C_MODE_POLL,\r
420         .io_init = rk29_i2c1_io_init,\r
421 };\r
422 \r
423 struct rk29_i2c_platform_data default_i2c2_data = {\r
424         .bus_num    = 2,\r
425         .flags      = 0,\r
426         .slave_addr = 0xff,\r
427         .scl_rate  = 400*1000,\r
428         .mode           = I2C_MODE_IRQ,\r
429         .io_init = rk29_i2c2_io_init,\r
430 };\r
431 \r
432 struct rk29_i2c_platform_data default_i2c3_data = {\r
433         .bus_num    = 3,\r
434         .flags      = 0,\r
435         .slave_addr = 0xff,\r
436         .scl_rate  = 400*1000,\r
437         .mode           = I2C_MODE_POLL,\r
438         .io_init = rk29_i2c3_io_init,\r
439 };\r
440 \r
441 #ifdef CONFIG_I2C0_RK29\r
442 static struct i2c_board_info __initdata board_i2c0_devices[] = {\r
443 #if defined (CONFIG_RK1000_CONTROL)\r
444         {\r
445                 .type                   = "rk1000_control",\r
446                 .addr           = 0x40,\r
447                 .flags                  = 0,\r
448         },\r
449 #endif\r
450 #if defined (CONFIG_SND_SOC_RK1000)\r
451         {\r
452                 .type                   = "rk1000_i2c_codec",\r
453                 .addr           = 0x60,\r
454                 .flags                  = 0,\r
455         },\r
456 #endif\r
457 #if defined (CONFIG_SND_SOC_WM8900)\r
458         {\r
459                 .type                   = "wm8900",\r
460                 .addr           = 0x1A,\r
461                 .flags                  = 0,\r
462         },\r
463 #endif\r
464 #if defined (CONFIG_BATTERY_STC3100)\r
465         {\r
466                 .type                   = "stc3100",\r
467                 .addr           = 0x70,\r
468                 .flags                  = 0,\r
469         }, \r
470 #endif\r
471 #if defined (CONFIG_BATTERY_BQ27510)\r
472         {\r
473                 .type                   = "bq27510",\r
474                 .addr           = 0x55,\r
475                 .flags                  = 0,\r
476         },\r
477 #endif\r
478 #if defined (CONFIG_RTC_HYM8563)\r
479         {\r
480                 .type                   = "rtc_hym8563",\r
481                 .addr           = 0x51,\r
482                 .flags                  = 0,\r
483                 ///.irq            = RK2818_PIN_PA4,\r
484         },\r
485 #endif\r
486 #if defined (CONFIG_GS_MMA8452)\r
487     {\r
488       .type           = "gs_mma8452",\r
489       .addr           = 0x1c,\r
490       .flags          = 0,\r
491       .irq            = MMA8452_INT_PIN,\r
492       .platform_data  = &mma8452_info,\r
493     },\r
494 #endif\r
495 \r
496 };\r
497 #endif\r
498 \r
499 #ifdef CONFIG_I2C1_RK29\r
500 static struct i2c_board_info __initdata board_i2c1_devices[] = {\r
501 #if defined (CONFIG_RK1000_CONTROL1)\r
502         {\r
503                 .type                   = "rk1000_control",\r
504                 .addr                   = 0x40,\r
505                 .flags                  = 0,\r
506         },\r
507 #endif\r
508 #if defined (CONFIG_SENSORS_AK8973)\r
509         {\r
510                 .type                   = "ak8973",\r
511                 .addr           = 0x1c,\r
512                 .flags                  = 0,\r
513                 .irq                    = RK29_PIN4_PA1,\r
514         },\r
515 #endif\r
516 #if defined (CONFIG_SENSORS_AK8975)\r
517         {\r
518                 .type                   = "ak8975",\r
519                 .addr           = 0x1c,\r
520                 .flags                  = 0,\r
521                 .irq                    = RK29_PIN4_PA1,\r
522         },\r
523 #endif\r
524 };\r
525 #endif\r
526 \r
527 #ifdef CONFIG_I2C2_RK29\r
528 static struct i2c_board_info __initdata board_i2c2_devices[] = {\r
529 #if defined (CONFIG_HANNSTAR_P1003)\r
530     {\r
531       .type           = "p1003_touch",\r
532       .addr           = 0x04,\r
533       .flags          = 0,\r
534       .irq            = RK29_PIN0_PA2,\r
535       .platform_data  = &p1003_info,\r
536     },\r
537 #endif\r
538 };\r
539 #endif\r
540 \r
541 #ifdef CONFIG_I2C3_RK29\r
542 static struct i2c_board_info __initdata board_i2c3_devices[] = {\r
543 };\r
544 #endif\r
545 \r
546 /*****************************************************************************************\r
547  * camera  devices\r
548  * author: ddl@rock-chips.com\r
549  *****************************************************************************************/\r
550 #ifdef CONFIG_VIDEO_RK29\r
551 #define SENSOR_NAME_0 RK29_CAM_SENSOR_NAME_OV5642                       /* back camera sensor */\r
552 #define SENSOR_IIC_ADDR_0           0x78\r
553 #define SENSOR_IIC_ADAPTER_ID_0    1\r
554 #define SENSOR_POWER_PIN_0         RK29_PIN6_PB7\r
555 #define SENSOR_RESET_PIN_0         INVALID_GPIO\r
556 #define SENSOR_POWERACTIVE_LEVEL_0 RK29_CAM_POWERACTIVE_L\r
557 #define SENSOR_RESETACTIVE_LEVEL_0 RK29_CAM_RESETACTIVE_L\r
558 \r
559 \r
560 #define SENSOR_NAME_1 RK29_CAM_SENSOR_NAME_OV2659                       /* front camera sensor */\r
561 #define SENSOR_IIC_ADDR_1           0x60\r
562 #define SENSOR_IIC_ADAPTER_ID_1    1\r
563 #define SENSOR_POWER_PIN_1         RK29_PIN5_PD7\r
564 #define SENSOR_RESET_PIN_1         INVALID_GPIO\r
565 #define SENSOR_POWERACTIVE_LEVEL_1 RK29_CAM_POWERACTIVE_L\r
566 #define SENSOR_RESETACTIVE_LEVEL_1 RK29_CAM_RESETACTIVE_L\r
567 \r
568 static int rk29_sensor_io_init(void);\r
569 static int rk29_sensor_io_deinit(void);\r
570 \r
571 struct rk29camera_platform_data rk29_camera_platform_data = {\r
572     .io_init = rk29_sensor_io_init,\r
573     .io_deinit = rk29_sensor_io_deinit,\r
574     .gpio_res = {\r
575         {\r
576             .gpio_reset = SENSOR_RESET_PIN_0,\r
577             .gpio_power = SENSOR_POWER_PIN_0,\r
578             .gpio_flag = (SENSOR_POWERACTIVE_LEVEL_0|SENSOR_RESETACTIVE_LEVEL_0),\r
579             .dev_name = SENSOR_NAME_0,\r
580         }, {\r
581             .gpio_reset = SENSOR_RESET_PIN_1,\r
582             .gpio_power = SENSOR_POWER_PIN_1,\r
583             .gpio_flag = (SENSOR_POWERACTIVE_LEVEL_1|SENSOR_RESETACTIVE_LEVEL_1),\r
584             .dev_name = SENSOR_NAME_1,\r
585         }\r
586     },\r
587         #ifdef CONFIG_VIDEO_RK29_WORK_IPP\r
588         .meminfo = {\r
589             .name  = "camera_ipp_mem",\r
590                 .start = MEM_CAMIPP_BASE,\r
591                 .size   = MEM_CAMIPP_SIZE,\r
592         }\r
593         #endif\r
594 };\r
595 \r
596 static int rk29_sensor_io_init(void)\r
597 {\r
598     int ret = 0, i;\r
599     unsigned int camera_reset = INVALID_GPIO, camera_power = INVALID_GPIO;\r
600         unsigned int camera_ioflag;\r
601 \r
602     for (i=0; i<2; i++) {\r
603         camera_reset = rk29_camera_platform_data.gpio_res[i].gpio_reset;\r
604         camera_power = rk29_camera_platform_data.gpio_res[i].gpio_power;\r
605                 camera_ioflag = rk29_camera_platform_data.gpio_res[i].gpio_flag;\r
606 \r
607         if (camera_power != INVALID_GPIO) {\r
608             ret = gpio_request(camera_power, "camera power");\r
609             if (ret)\r
610                 continue;\r
611 \r
612             gpio_set_value(camera_reset, (((~camera_ioflag)&RK29_CAM_POWERACTIVE_MASK)>>RK29_CAM_POWERACTIVE_BITPOS));\r
613             gpio_direction_output(camera_power, (((~camera_ioflag)&RK29_CAM_POWERACTIVE_MASK)>>RK29_CAM_POWERACTIVE_BITPOS));\r
614 \r
615                         //printk("\n%s....%d  %x   \n",__FUNCTION__,__LINE__,(((~camera_ioflag)&RK29_CAM_POWERACTIVE_MASK)>>RK29_CAM_POWERACTIVE_BITPOS));\r
616 \r
617         }\r
618 \r
619         if (camera_reset != INVALID_GPIO) {\r
620             ret = gpio_request(camera_reset, "camera reset");\r
621             if (ret) {\r
622                 if (camera_power != INVALID_GPIO)\r
623                     gpio_free(camera_power);\r
624 \r
625                 continue;\r
626             }\r
627 \r
628             gpio_set_value(camera_reset, ((camera_ioflag&RK29_CAM_RESETACTIVE_MASK)>>RK29_CAM_RESETACTIVE_BITPOS));\r
629             gpio_direction_output(camera_reset, ((camera_ioflag&RK29_CAM_RESETACTIVE_MASK)>>RK29_CAM_RESETACTIVE_BITPOS));\r
630 \r
631                         //printk("\n%s....%d  %x \n",__FUNCTION__,__LINE__,((camera_ioflag&RK29_CAM_RESETACTIVE_MASK)>>RK29_CAM_RESETACTIVE_BITPOS));\r
632 \r
633         }\r
634     }\r
635 \r
636     return 0;\r
637 }\r
638 \r
639 static int rk29_sensor_io_deinit(void)\r
640 {\r
641     unsigned int i;\r
642     unsigned int camera_reset = INVALID_GPIO, camera_power = INVALID_GPIO;\r
643 \r
644     //printk("\n%s....%d    ******** ddl *********\n",__FUNCTION__,__LINE__);\r
645 \r
646     for (i=0; i<2; i++) {\r
647         camera_reset = rk29_camera_platform_data.gpio_res[i].gpio_reset;\r
648         camera_power = rk29_camera_platform_data.gpio_res[i].gpio_power;\r
649 \r
650         if (camera_power != INVALID_GPIO){\r
651             gpio_direction_input(camera_power);\r
652             gpio_free(camera_power);\r
653         }\r
654 \r
655         if (camera_reset != INVALID_GPIO)  {\r
656             gpio_direction_input(camera_reset);\r
657             gpio_free(camera_reset);\r
658         }\r
659     }\r
660 \r
661     return 0;\r
662 }\r
663 \r
664 \r
665 static int rk29_sensor_power(struct device *dev, int on)\r
666 {\r
667     unsigned int camera_reset = INVALID_GPIO, camera_power = INVALID_GPIO;\r
668         unsigned int camera_ioflag;\r
669 \r
670     if(rk29_camera_platform_data.gpio_res[0].dev_name &&  (strcmp(rk29_camera_platform_data.gpio_res[0].dev_name, dev_name(dev)) == 0)) {\r
671         camera_reset = rk29_camera_platform_data.gpio_res[0].gpio_reset;\r
672         camera_power = rk29_camera_platform_data.gpio_res[0].gpio_power;\r
673                 camera_ioflag = rk29_camera_platform_data.gpio_res[0].gpio_flag;\r
674     } else if (rk29_camera_platform_data.gpio_res[1].dev_name && (strcmp(rk29_camera_platform_data.gpio_res[1].dev_name, dev_name(dev)) == 0)) {\r
675         camera_reset = rk29_camera_platform_data.gpio_res[1].gpio_reset;\r
676         camera_power = rk29_camera_platform_data.gpio_res[1].gpio_power;\r
677                 camera_ioflag = rk29_camera_platform_data.gpio_res[1].gpio_flag;\r
678     }\r
679 \r
680     if (camera_reset != INVALID_GPIO) {\r
681         gpio_set_value(camera_reset, ((camera_ioflag&RK29_CAM_RESETACTIVE_MASK)>>RK29_CAM_RESETACTIVE_BITPOS));\r
682         //printk("\n%s..%s..ResetPin=%d ..PinLevel = %x \n",__FUNCTION__,dev_name(dev),camera_reset, ((camera_ioflag&RK29_CAM_RESETACTIVE_MASK)>>RK29_CAM_RESETACTIVE_BITPOS));\r
683     }\r
684     if (camera_power != INVALID_GPIO)  {\r
685         if (on) {\r
686                 gpio_set_value(camera_power, ((camera_ioflag&RK29_CAM_POWERACTIVE_MASK)>>RK29_CAM_POWERACTIVE_BITPOS));\r
687                         //printk("\n%s..%s..PowerPin=%d ..PinLevel = %x   \n",__FUNCTION__,dev_name(dev), camera_power, ((camera_ioflag&RK29_CAM_POWERACTIVE_MASK)>>RK29_CAM_POWERACTIVE_BITPOS));\r
688                 } else {\r
689                         gpio_set_value(camera_power, (((~camera_ioflag)&RK29_CAM_POWERACTIVE_MASK)>>RK29_CAM_POWERACTIVE_BITPOS));\r
690                         //printk("\n%s..%s..PowerPin=%d ..PinLevel = %x   \n",__FUNCTION__,dev_name(dev), camera_power, (((~camera_ioflag)&RK29_CAM_POWERACTIVE_MASK)>>RK29_CAM_POWERACTIVE_BITPOS));\r
691                 }\r
692         }\r
693 \r
694     if (camera_reset != INVALID_GPIO)  {\r
695                 if (on) {\r
696                 msleep(3);          /* delay 3 ms */\r
697                 gpio_set_value(camera_reset,(((~camera_ioflag)&RK29_CAM_RESETACTIVE_MASK)>>RK29_CAM_RESETACTIVE_BITPOS));\r
698                 //printk("\n%s..%s..ResetPin= %d..PinLevel = %x   \n",__FUNCTION__,dev_name(dev), camera_reset, (((~camera_ioflag)&RK29_CAM_RESETACTIVE_MASK)>>RK29_CAM_RESETACTIVE_BITPOS));\r
699                 }\r
700     }\r
701     return 0;\r
702 }\r
703 \r
704 static struct i2c_board_info rk29_i2c_cam_info_0[] = {\r
705         {\r
706                 I2C_BOARD_INFO(SENSOR_NAME_0, SENSOR_IIC_ADDR_0>>1)\r
707         },\r
708 };\r
709 \r
710 struct soc_camera_link rk29_iclink_0 = {\r
711         .bus_id         = RK29_CAM_PLATFORM_DEV_ID,\r
712         .power          = rk29_sensor_power,\r
713         .board_info     = &rk29_i2c_cam_info_0[0],\r
714         .i2c_adapter_id = SENSOR_IIC_ADAPTER_ID_0,\r
715         .module_name    = SENSOR_NAME_0,\r
716 };\r
717 \r
718 /*platform_device : soc-camera need  */\r
719 struct platform_device rk29_soc_camera_pdrv_0 = {\r
720         .name   = "soc-camera-pdrv",\r
721         .id     = 0,\r
722         .dev    = {\r
723                 .init_name = SENSOR_NAME_0,\r
724                 .platform_data = &rk29_iclink_0,\r
725         },\r
726 };\r
727 \r
728 static struct i2c_board_info rk29_i2c_cam_info_1[] = {\r
729         {\r
730                 I2C_BOARD_INFO(SENSOR_NAME_1, SENSOR_IIC_ADDR_1>>1)\r
731         },\r
732 };\r
733 \r
734 struct soc_camera_link rk29_iclink_1 = {\r
735         .bus_id         = RK29_CAM_PLATFORM_DEV_ID,\r
736         .power          = rk29_sensor_power,\r
737         .board_info     = &rk29_i2c_cam_info_1[0],\r
738         .i2c_adapter_id = SENSOR_IIC_ADAPTER_ID_1,\r
739         .module_name    = SENSOR_NAME_1,\r
740 };\r
741 \r
742 /*platform_device : soc-camera need  */\r
743 struct platform_device rk29_soc_camera_pdrv_1 = {\r
744         .name   = "soc-camera-pdrv",\r
745         .id     = 1,\r
746         .dev    = {\r
747                 .init_name = SENSOR_NAME_1,\r
748                 .platform_data = &rk29_iclink_1,\r
749         },\r
750 };\r
751 \r
752 \r
753 static u64 rockchip_device_camera_dmamask = 0xffffffffUL;\r
754 struct resource rk29_camera_resource[] = {\r
755         [0] = {\r
756                 .start = RK29_VIP_PHYS,\r
757                 .end   = RK29_VIP_PHYS + RK29_VIP_SIZE - 1,\r
758                 .flags = IORESOURCE_MEM,\r
759         },\r
760         [1] = {\r
761                 .start = IRQ_VIP,\r
762                 .end   = IRQ_VIP,\r
763                 .flags = IORESOURCE_IRQ,\r
764         }\r
765 };\r
766 \r
767 /*platform_device : */\r
768 struct platform_device rk29_device_camera = {\r
769         .name             = RK29_CAM_DRV_NAME,\r
770         .id               = RK29_CAM_PLATFORM_DEV_ID,               /* This is used to put cameras on this interface */\r
771         .num_resources    = ARRAY_SIZE(rk29_camera_resource),\r
772         .resource         = rk29_camera_resource,\r
773         .dev            = {\r
774                 .dma_mask = &rockchip_device_camera_dmamask,\r
775                 .coherent_dma_mask = 0xffffffffUL,\r
776                 .platform_data  = &rk29_camera_platform_data,\r
777         }\r
778 };\r
779 #endif\r
780 /*****************************************************************************************\r
781  * backlight  devices\r
782  * author: nzy@rock-chips.com\r
783  *****************************************************************************************/\r
784 #ifdef CONFIG_BACKLIGHT_RK29_BL\r
785  /*\r
786  GPIO1B5_PWM0_NAME,       GPIO1L_PWM0\r
787  GPIO5D2_PWM1_UART1SIRIN_NAME,  GPIO5H_PWM1\r
788  GPIO2A3_SDMMC0WRITEPRT_PWM2_NAME,   GPIO2L_PWM2\r
789  GPIO1A5_EMMCPWREN_PWM3_NAME,     GPIO1L_PWM3\r
790  */\r
791 \r
792 #define PWM_ID            0\r
793 #define PWM_MUX_NAME      GPIO1B5_PWM0_NAME\r
794 #define PWM_MUX_MODE      GPIO1L_PWM0\r
795 #define PWM_MUX_MODE_GPIO GPIO1L_GPIO1B5\r
796 #define PWM_EFFECT_VALUE  1\r
797 \r
798 //#define LCD_DISP_ON_PIN\r
799 \r
800 #ifdef  LCD_DISP_ON_PIN\r
801 #define BL_EN_MUX_NAME    GPIOF34_UART3_SEL_NAME\r
802 #define BL_EN_MUX_MODE    IOMUXB_GPIO1_B34\r
803 \r
804 #define BL_EN_PIN         GPIO0L_GPIO0A5\r
805 #define BL_EN_VALUE       GPIO_HIGH\r
806 #endif\r
807 static int rk29_backlight_io_init(void)\r
808 {\r
809     int ret = 0;\r
810 \r
811     rk29_mux_api_set(PWM_MUX_NAME, PWM_MUX_MODE);\r
812         #ifdef  LCD_DISP_ON_PIN\r
813     rk29_mux_api_set(BL_EN_MUX_NAME, BL_EN_MUX_MODE);\r
814 \r
815     ret = gpio_request(BL_EN_PIN, NULL);\r
816     if(ret != 0)\r
817     {\r
818         gpio_free(BL_EN_PIN);\r
819     }\r
820 \r
821     gpio_direction_output(BL_EN_PIN, 0);\r
822     gpio_set_value(BL_EN_PIN, BL_EN_VALUE);\r
823         #endif\r
824     return ret;\r
825 }\r
826 \r
827 static int rk29_backlight_io_deinit(void)\r
828 {\r
829     int ret = 0;\r
830     #ifdef  LCD_DISP_ON_PIN\r
831     gpio_free(BL_EN_PIN);\r
832     #endif\r
833     rk29_mux_api_set(PWM_MUX_NAME, PWM_MUX_MODE_GPIO);\r
834     return ret;\r
835 }\r
836 struct rk29_bl_info rk29_bl_info = {\r
837     .pwm_id   = PWM_ID,\r
838     .bl_ref   = PWM_EFFECT_VALUE,\r
839     .io_init   = rk29_backlight_io_init,\r
840     .io_deinit = rk29_backlight_io_deinit,\r
841 };\r
842 #endif\r
843 /*****************************************************************************************\r
844  * SDMMC devices\r
845 *****************************************************************************************/\r
846 #ifdef CONFIG_SDMMC0_RK29\r
847 static int rk29_sdmmc0_cfg_gpio(void)\r
848 {\r
849         rk29_mux_api_set(GPIO1D1_SDMMC0CMD_NAME, GPIO1H_SDMMC0_CMD);\r
850         rk29_mux_api_set(GPIO1D0_SDMMC0CLKOUT_NAME, GPIO1H_SDMMC0_CLKOUT);\r
851         rk29_mux_api_set(GPIO1D2_SDMMC0DATA0_NAME, GPIO1H_SDMMC0_DATA0);\r
852         rk29_mux_api_set(GPIO1D3_SDMMC0DATA1_NAME, GPIO1H_SDMMC0_DATA1);\r
853         rk29_mux_api_set(GPIO1D4_SDMMC0DATA2_NAME, GPIO1H_SDMMC0_DATA2);\r
854         rk29_mux_api_set(GPIO1D5_SDMMC0DATA3_NAME, GPIO1H_SDMMC0_DATA3);\r
855         rk29_mux_api_set(GPIO2A2_SDMMC0DETECTN_NAME, GPIO2L_SDMMC0_DETECT_N);   \r
856         rk29_mux_api_set(GPIO5D5_SDMMC0PWREN_NAME, GPIO5H_GPIO5D5);   ///GPIO5H_SDMMC0_PWR_EN);  ///GPIO5H_GPIO5D5);\r
857         gpio_request(RK29_PIN5_PD5,"sdmmc");\r
858         gpio_set_value(RK29_PIN5_PD5,GPIO_HIGH);\r
859         mdelay(100);\r
860         gpio_set_value(RK29_PIN5_PD5,GPIO_LOW);\r
861         return 0;\r
862 }\r
863 \r
864 #define CONFIG_SDMMC0_USE_DMA\r
865 struct rk29_sdmmc_platform_data default_sdmmc0_data = {\r
866         .host_ocr_avail = (MMC_VDD_25_26|MMC_VDD_26_27|MMC_VDD_27_28|MMC_VDD_28_29|MMC_VDD_29_30|\r
867                                            MMC_VDD_30_31|MMC_VDD_31_32|MMC_VDD_32_33|\r
868                                            MMC_VDD_33_34|MMC_VDD_34_35| MMC_VDD_35_36),\r
869         .host_caps      = (MMC_CAP_4_BIT_DATA|MMC_CAP_MMC_HIGHSPEED|MMC_CAP_SD_HIGHSPEED),\r
870         .io_init = rk29_sdmmc0_cfg_gpio,\r
871         .dma_name = "sd_mmc",\r
872 #ifdef CONFIG_SDMMC0_USE_DMA\r
873         .use_dma  = 1,\r
874 #else\r
875         .use_dma = 0,\r
876 #endif\r
877 };\r
878 #endif\r
879 #ifdef CONFIG_SDMMC1_RK29\r
880 #define CONFIG_SDMMC1_USE_DMA\r
881 static int rk29_sdmmc1_cfg_gpio(void)\r
882 {\r
883         rk29_mux_api_set(GPIO1C2_SDMMC1CMD_NAME, GPIO1H_SDMMC1_CMD);\r
884         rk29_mux_api_set(GPIO1C7_SDMMC1CLKOUT_NAME, GPIO1H_SDMMC1_CLKOUT);\r
885         rk29_mux_api_set(GPIO1C3_SDMMC1DATA0_NAME, GPIO1H_SDMMC1_DATA0);\r
886         rk29_mux_api_set(GPIO1C4_SDMMC1DATA1_NAME, GPIO1H_SDMMC1_DATA1);\r
887         rk29_mux_api_set(GPIO1C5_SDMMC1DATA2_NAME, GPIO1H_SDMMC1_DATA2);\r
888         rk29_mux_api_set(GPIO1C6_SDMMC1DATA3_NAME, GPIO1H_SDMMC1_DATA3);\r
889         //rk29_mux_api_set(GPIO1C0_UART0CTSN_SDMMC1DETECTN_NAME, GPIO1H_SDMMC1_DETECT_N);\r
890         return 0;\r
891 }\r
892
893 #ifdef CONFIG_WIFI_CONTROL_FUNC 
894 static int rk29sdk_wifi_status(struct device *dev);
895 static int rk29sdk_wifi_status_register(void (*callback)(int card_presend, void *dev_id), void *dev_id);\r
896 #endif
897
898 #define RK29SDK_WIFI_SDIO_CARD_DETECT_N    RK29_PIN1_PD6
899
900 struct rk29_sdmmc_platform_data default_sdmmc1_data = {\r
901         .host_ocr_avail = (MMC_VDD_25_26|MMC_VDD_26_27|MMC_VDD_27_28|MMC_VDD_28_29|\r
902                                            MMC_VDD_29_30|MMC_VDD_30_31|MMC_VDD_31_32|\r
903                                            MMC_VDD_32_33|MMC_VDD_33_34),\r
904         .host_caps      = (MMC_CAP_4_BIT_DATA|MMC_CAP_SDIO_IRQ|\r
905                                    MMC_CAP_MMC_HIGHSPEED|MMC_CAP_SD_HIGHSPEED),\r
906         .io_init = rk29_sdmmc1_cfg_gpio,\r
907         .dma_name = "sdio",\r
908 #ifdef CONFIG_SDMMC1_USE_DMA\r
909         .use_dma  = 1,\r
910 #else\r
911         .use_dma = 0,\r
912 #endif\r
913 #ifdef CONFIG_WIFI_CONTROL_FUNC
914         .status = rk29sdk_wifi_status,
915         .register_status_notify = rk29sdk_wifi_status_register,
916 #endif
917 #if 0
918         .detect_irq = RK29SDK_WIFI_SDIO_CARD_DETECT_N,
919 #endif
920 };\r
921 #endif\r
922
923 #ifdef CONFIG_WIFI_CONTROL_FUNC
924 #define RK29SDK_WIFI_BT_GPIO_POWER_N       RK29_PIN5_PD6
925 #define RK29SDK_WIFI_GPIO_RESET_N          RK29_PIN6_PC0
926 #define RK29SDK_BT_GPIO_RESET_N            RK29_PIN6_PC4
927
928 static int rk29sdk_wifi_cd = 0;   /* wifi virtual 'card detect' status */
929 static void (*wifi_status_cb)(int card_present, void *dev_id);
930 static void *wifi_status_cb_devid;
931 int rk29sdk_wifi_power_state = 0;
932 int rk29sdk_bt_power_state = 0;
933
934 static int rk29sdk_wifi_status(struct device *dev)
935 {
936         return rk29sdk_wifi_cd;
937 }
938
939 static int rk29sdk_wifi_status_register(void (*callback)(int card_present, void *dev_id), void *dev_id)
940 {
941         if(wifi_status_cb)
942                 return -EAGAIN;
943         wifi_status_cb = callback;
944         wifi_status_cb_devid = dev_id;
945         return 0;
946 }
947
948 static int rk29sdk_wifi_bt_gpio_control_init(void)
949 {
950     if (gpio_request(RK29SDK_WIFI_BT_GPIO_POWER_N, "wifi_bt_power")) {
951            pr_info("%s: request wifi_bt power gpio failed\n", __func__);
952            return -1; 
953     }
954    
955     if (gpio_request(RK29SDK_WIFI_GPIO_RESET_N, "wifi reset")) {
956            pr_info("%s: request wifi reset gpio failed\n", __func__);
957            gpio_free(RK29SDK_WIFI_BT_GPIO_POWER_N);
958            return -1;
959     }
960    
961     if (gpio_request(RK29SDK_BT_GPIO_RESET_N, "bt reset")) {
962           pr_info("%s: request bt reset gpio failed\n", __func__);
963           gpio_free(RK29SDK_WIFI_GPIO_RESET_N);
964           return -1;
965     }
966    
967     gpio_direction_output(RK29SDK_WIFI_BT_GPIO_POWER_N, GPIO_LOW);
968     gpio_direction_output(RK29SDK_WIFI_GPIO_RESET_N,    GPIO_LOW);
969     gpio_direction_output(RK29SDK_BT_GPIO_RESET_N,      GPIO_LOW); 
970     
971     pr_info("%s: init finished\n",__func__);
972    
973     return 0;
974 }
975
976 static int rk29sdk_wifi_power(int on)
977 {
978         pr_info("%s: %d\n", __func__, on);
979         if (on){
980                 gpio_set_value(RK29SDK_WIFI_BT_GPIO_POWER_N, on);
981                 mdelay(100);
982                 pr_info("wifi turn on power\n");
983         }else{
984                 if (!rk29sdk_bt_power_state){
985                         gpio_set_value(RK29SDK_WIFI_BT_GPIO_POWER_N, on);
986                         mdelay(100);
987                         pr_info("wifi shut off power\n");
988                 }else
989                 {
990                         pr_info("wifi shouldn't shut off power, bt is using it!\n");
991                 }
992
993         }
994
995         rk29sdk_wifi_power_state = on;
996         return 0;
997 }
998
999 static int rk29sdk_wifi_reset_state;
1000 static int rk29sdk_wifi_reset(int on)
1001 {
1002         pr_info("%s: %d\n", __func__, on);
1003         gpio_set_value(RK29SDK_WIFI_GPIO_RESET_N, on);
1004         mdelay(100);
1005         rk29sdk_wifi_reset_state = on;
1006         return 0;
1007 }
1008
1009 static int rk29sdk_wifi_set_carddetect(int val)
1010 {
1011         pr_info("%s:%d\n", __func__, val);
1012         rk29sdk_wifi_cd = val;
1013         if (wifi_status_cb){
1014                 wifi_status_cb(val, wifi_status_cb_devid);
1015         }else {
1016                 pr_warning("%s, nobody to notify\n", __func__);
1017         }
1018         return 0;
1019 }
1020
1021 static struct wifi_platform_data rk29sdk_wifi_control = {
1022         .set_power = rk29sdk_wifi_power,
1023         .set_reset = rk29sdk_wifi_reset,
1024         .set_carddetect = rk29sdk_wifi_set_carddetect,
1025 };
1026 static struct platform_device rk29sdk_wifi_device = {
1027         .name = "bcm4329_wlan",
1028         .id = 1,
1029         .dev = {
1030                 .platform_data = &rk29sdk_wifi_control,
1031          },
1032 };
1033 #endif
1034
1035 #ifdef CONFIG_VIVANTE\r
1036 static struct resource resources_gpu[] = {\r
1037     [0] = {\r
1038                 .name   = "gpu_irq",\r
1039         .start  = IRQ_GPU,\r
1040         .end    = IRQ_GPU,\r
1041         .flags  = IORESOURCE_IRQ,\r
1042     },\r
1043     [1] = {\r
1044                 .name = "gpu_base",\r
1045         .start  = RK29_GPU_PHYS,\r
1046         .end    = RK29_GPU_PHYS + RK29_GPU_PHYS_SIZE,\r
1047         .flags  = IORESOURCE_MEM,\r
1048     },\r
1049     [2] = {\r
1050                 .name = "gpu_mem",\r
1051         .start  = PMEM_GPU_BASE,\r
1052         .end    = PMEM_GPU_BASE + PMEM_GPU_SIZE,\r
1053         .flags  = IORESOURCE_MEM,\r
1054     },\r
1055 };\r
1056 struct platform_device rk29_device_gpu = {\r
1057     .name             = "galcore",\r
1058     .id               = 0,\r
1059     .num_resources    = ARRAY_SIZE(resources_gpu),\r
1060     .resource         = resources_gpu,\r
1061 };\r
1062 #endif\r
1063 #ifdef CONFIG_KEYS_RK29\r
1064 extern struct rk29_keys_platform_data rk29_keys_pdata;\r
1065 static struct platform_device rk29_device_keys = {\r
1066         .name           = "rk29-keypad",\r
1067         .id             = -1,\r
1068         .dev            = {\r
1069                 .platform_data  = &rk29_keys_pdata,\r
1070         },\r
1071 };\r
1072 #endif\r
1073 \r
1074 static void __init rk29_board_iomux_init(void)\r
1075 {\r
1076         #ifdef CONFIG_UART0_RK29\r
1077         rk29_mux_api_set(GPIO1B7_UART0SOUT_NAME, GPIO1L_UART0_SOUT);\r
1078         rk29_mux_api_set(GPIO1B6_UART0SIN_NAME, GPIO1L_UART0_SIN);\r
1079         #ifdef CONFIG_UART0_CTS_RTS_RK29\r
1080         rk29_mux_api_set(GPIO1C1_UART0RTSN_SDMMC1WRITEPRT_NAME, GPIO1H_UART0_RTS_N);\r
1081         rk29_mux_api_set(GPIO1C0_UART0CTSN_SDMMC1DETECTN_NAME, GPIO1H_UART0_CTS_N);\r
1082         #endif\r
1083         #endif\r
1084         #ifdef CONFIG_UART1_RK29\r
1085         rk29_mux_api_set(GPIO2A5_UART1SOUT_NAME, GPIO2L_UART1_SOUT);\r
1086         rk29_mux_api_set(GPIO2A4_UART1SIN_NAME, GPIO2L_UART1_SIN);\r
1087         #endif\r
1088         #ifdef CONFIG_UART2_RK29\r
1089         rk29_mux_api_set(GPIO2B1_UART2SOUT_NAME, GPIO2L_UART2_SOUT);\r
1090         rk29_mux_api_set(GPIO2B0_UART2SIN_NAME, GPIO2L_UART2_SIN);\r
1091         #ifdef CONFIG_UART2_CTS_RTS_RK29\r
1092         rk29_mux_api_set(GPIO2A7_UART2RTSN_NAME, GPIO2L_UART2_RTS_N);\r
1093         rk29_mux_api_set(GPIO2A6_UART2CTSN_NAME, GPIO2L_UART2_CTS_N);\r
1094         #endif\r
1095         #endif\r
1096         #ifdef CONFIG_UART3_RK29\r
1097         rk29_mux_api_set(GPIO2B3_UART3SOUT_NAME, GPIO2L_UART3_SOUT);\r
1098         rk29_mux_api_set(GPIO2B2_UART3SIN_NAME, GPIO2L_UART3_SIN);\r
1099         #ifdef CONFIG_UART3_CTS_RTS_RK29\r
1100         rk29_mux_api_set(GPIO2B5_UART3RTSN_I2C3SCL_NAME, GPIO2L_UART3_RTS_N);\r
1101         rk29_mux_api_set(GPIO2B4_UART3CTSN_I2C3SDA_NAME, GPIO2L_UART3_CTS_N);\r
1102         #endif\r
1103         #endif\r
1104         #ifdef CONFIG_SPIM0_RK29\r
1105     rk29_mux_api_set(GPIO2C0_SPI0CLK_NAME, GPIO2H_SPI0_CLK);\r
1106         rk29_mux_api_set(GPIO2C1_SPI0CSN0_NAME, GPIO2H_SPI0_CSN0);\r
1107         rk29_mux_api_set(GPIO2C2_SPI0TXD_NAME, GPIO2H_SPI0_TXD);\r
1108         rk29_mux_api_set(GPIO2C3_SPI0RXD_NAME, GPIO2H_SPI0_RXD);\r
1109     #endif\r
1110     #ifdef CONFIG_SPIM1_RK29\r
1111     rk29_mux_api_set(GPIO2C4_SPI1CLK_NAME, GPIO2H_SPI1_CLK);\r
1112         rk29_mux_api_set(GPIO2C5_SPI1CSN0_NAME, GPIO2H_SPI1_CSN0);\r
1113         rk29_mux_api_set(GPIO2C6_SPI1TXD_NAME, GPIO2H_SPI1_TXD);\r
1114         rk29_mux_api_set(GPIO2C7_SPI1RXD_NAME, GPIO2H_SPI1_RXD);\r
1115     #endif\r
1116         #ifdef CONFIG_RK29_VMAC\r
1117     rk29_mux_api_set(GPIO4C0_RMIICLKOUT_RMIICLKIN_NAME, GPIO4H_RMII_CLKOUT);\r
1118     rk29_mux_api_set(GPIO4C1_RMIITXEN_MIITXEN_NAME, GPIO4H_RMII_TX_EN);\r
1119     rk29_mux_api_set(GPIO4C2_RMIITXD1_MIITXD1_NAME, GPIO4H_RMII_TXD1);\r
1120     rk29_mux_api_set(GPIO4C3_RMIITXD0_MIITXD0_NAME, GPIO4H_RMII_TXD0);\r
1121     rk29_mux_api_set(GPIO4C4_RMIIRXERR_MIIRXERR_NAME, GPIO4H_RMII_RX_ERR);\r
1122     rk29_mux_api_set(GPIO4C5_RMIICSRDVALID_MIIRXDVALID_NAME, GPIO4H_RMII_CSR_DVALID);\r
1123     rk29_mux_api_set(GPIO4C6_RMIIRXD1_MIIRXD1_NAME, GPIO4H_RMII_RXD1);\r
1124     rk29_mux_api_set(GPIO4C7_RMIIRXD0_MIIRXD0_NAME, GPIO4H_RMII_RXD0);\r
1125 \r
1126         rk29_mux_api_set(GPIO0A7_MIIMDCLK_NAME, GPIO0L_MII_MDCLK);\r
1127         rk29_mux_api_set(GPIO0A6_MIIMD_NAME, GPIO0L_MII_MD);\r
1128         #endif\r
1129 }\r
1130 \r
1131 static struct platform_device *devices[] __initdata = {\r
1132 #ifdef CONFIG_UART1_RK29\r
1133         &rk29_device_uart1,\r
1134 #endif\r
1135 #ifdef CONFIG_SPIM0_RK29\r
1136     &rk29xx_device_spi0m,\r
1137 #endif\r
1138 #ifdef CONFIG_SPIM1_RK29\r
1139     &rk29xx_device_spi1m,\r
1140 #endif\r
1141 #ifdef CONFIG_ADC_RK29\r
1142         &rk29_device_adc,\r
1143 #endif\r
1144 #ifdef CONFIG_I2C0_RK29\r
1145         &rk29_device_i2c0,\r
1146 #endif\r
1147 #ifdef CONFIG_I2C1_RK29\r
1148         &rk29_device_i2c1,\r
1149 #endif\r
1150 #ifdef CONFIG_I2C2_RK29\r
1151         &rk29_device_i2c2,\r
1152 #endif\r
1153 #ifdef CONFIG_I2C3_RK29\r
1154         &rk29_device_i2c3,\r
1155 #endif\r
1156 \r
1157 #ifdef CONFIG_SND_RK29_SOC_I2S_2CH\r
1158         &rk29_device_iis_2ch,\r
1159 #endif\r
1160 #ifdef CONFIG_SND_RK29_SOC_I2S_8CH\r
1161         &rk29_device_iis_8ch,\r
1162 #endif\r
1163 \r
1164 #ifdef CONFIG_KEYS_RK29\r
1165         &rk29_device_keys,\r
1166 #endif\r
1167 #ifdef CONFIG_SDMMC0_RK29\r
1168         &rk29_device_sdmmc0,\r
1169 #endif\r
1170 #ifdef CONFIG_SDMMC1_RK29\r
1171         &rk29_device_sdmmc1,\r
1172 #endif\r
1173 \r
1174 #ifdef CONFIG_MTD_NAND_RK29XX\r
1175         &rk29xx_device_nand,\r
1176 #endif\r
1177 \r
1178 #ifdef CONFIG_WIFI_CONTROL_FUNC
1179         &rk29sdk_wifi_device,
1180 #endif
1181 #ifdef CONFIG_MTD_NAND_RK29\r
1182         &rk29_device_nand,\r
1183 #endif\r
1184 \r
1185 #ifdef CONFIG_FB_RK29\r
1186         &rk29_device_fb,\r
1187 #endif\r
1188 #ifdef CONFIG_BACKLIGHT_RK29_BL\r
1189         &rk29_device_backlight,\r
1190 #endif\r
1191 #ifdef CONFIG_RK29_VMAC\r
1192         &rk29_device_vmac,\r
1193 #endif\r
1194 #ifdef CONFIG_VIVANTE\r
1195         &rk29_device_gpu,\r
1196 #endif\r
1197 #ifdef CONFIG_VIDEO_RK29\r
1198         &rk29_device_camera,      /* ddl@rock-chips.com : camera support  */\r
1199         &rk29_soc_camera_pdrv_0,\r
1200         &rk29_soc_camera_pdrv_1,\r
1201         &android_pmem_cam_device,\r
1202 #endif\r
1203         &android_pmem_device,\r
1204         &rk29_vpu_mem_device,\r
1205 #ifdef CONFIG_USB20_OTG\r
1206         &rk29_device_usb20_otg,\r
1207 #endif\r
1208 #ifdef CONFIG_USB20_HOST\r
1209         &rk29_device_usb20_host,\r
1210 #endif\r
1211 #ifdef CONFIG_USB11_HOST\r
1212         &rk29_device_usb11_host,\r
1213 #endif\r
1214 #ifdef CONFIG_USB_ANDROID\r
1215         &android_usb_device,\r
1216         &usb_mass_storage_device,\r
1217 #endif\r
1218 #ifdef CONFIG_RK29_IPP\r
1219         &rk29_device_ipp,\r
1220 #endif\r
1221 };\r
1222 \r
1223 /*****************************************************************************************\r
1224  * spi devices\r
1225  * author: cmc@rock-chips.com\r
1226  *****************************************************************************************/\r
1227 static int rk29_vmac_register_set(void)\r
1228 {\r
1229         //config rk29 vmac as rmii, 100MHz \r
1230         u32 value= readl(RK29_GRF_BASE + 0xbc);\r
1231         value = (value & 0xfff7ff) | (0x400);\r
1232         writel(value, RK29_GRF_BASE + 0xbc);\r
1233         return 0;\r
1234 }\r
1235 \r
1236 static int rk29_rmii_io_init(void)\r
1237 {\r
1238         int err;\r
1239 \r
1240         //set dm9161 rmii\r
1241         rk29_mux_api_set(GPIO2D3_I2S0SDI_MIICOL_NAME, GPIO2H_GPIO2D3);\r
1242         err = gpio_request(RK29_PIN2_PD3, "rmii");\r
1243         if (err) {\r
1244                 gpio_free(RK29_PIN2_PD3);\r
1245                 printk("-------request RK29_PIN2_PD3 fail--------\n");\r
1246                 return -1;\r
1247         }\r
1248         gpio_direction_output(RK29_PIN2_PD3, GPIO_HIGH);\r
1249         gpio_set_value(RK29_PIN2_PD3, GPIO_HIGH);\r
1250 \r
1251         //rmii power on\r
1252         err = gpio_request(RK29_PIN6_PB0, "rmii_power_en");\r
1253         if (err) {\r
1254                 gpio_free(RK29_PIN6_PB0);\r
1255                 gpio_free(RK29_PIN2_PD3);\r
1256                 printk("-------request RK29_PIN6_PB0 fail--------\n");\r
1257                 return -1;\r
1258         }       \r
1259         gpio_direction_output(RK29_PIN6_PB0, GPIO_HIGH);\r
1260         gpio_set_value(RK29_PIN6_PB0, GPIO_HIGH);\r
1261         \r
1262         return 0;\r
1263 }\r
1264 \r
1265 static int rk29_rmii_power_control(int enable)\r
1266 {\r
1267         if (enable) {\r
1268                 //set dm9161 as rmii\r
1269                 gpio_direction_output(RK29_PIN2_PD3, GPIO_HIGH);\r
1270                 gpio_set_value(RK29_PIN2_PD3, GPIO_HIGH);\r
1271 \r
1272                 //enable rmii power\r
1273                 gpio_direction_output(RK29_PIN6_PB0, GPIO_HIGH);\r
1274                 gpio_set_value(RK29_PIN6_PB0, GPIO_HIGH);\r
1275                 \r
1276         }\r
1277         else {\r
1278                 gpio_direction_output(RK29_PIN6_PB0, GPIO_LOW);\r
1279                 gpio_set_value(RK29_PIN6_PB0, GPIO_LOW);\r
1280         }\r
1281 \r
1282         return 0;\r
1283 }\r
1284 \r
1285 struct rk29_vmac_platform_data rk29_vmac_pdata = {\r
1286         .vmac_register_set = rk29_vmac_register_set,\r
1287         .rmii_io_init = rk29_rmii_io_init,\r
1288         .rmii_power_control = rk29_rmii_power_control,\r
1289 };\r
1290 \r
1291 /*****************************************************************************************\r
1292  * spi devices\r
1293  * author: cmc@rock-chips.com\r
1294  *****************************************************************************************/\r
1295 #define SPI_CHIPSELECT_NUM 2\r
1296 struct spi_cs_gpio rk29xx_spi0_cs_gpios[SPI_CHIPSELECT_NUM] = {\r
1297     {\r
1298                 .name = "spi0 cs0",\r
1299                 .cs_gpio = RK29_PIN2_PC1,\r
1300                 .cs_iomux_name = NULL,\r
1301         },\r
1302         {\r
1303                 .name = "spi0 cs1",\r
1304                 .cs_gpio = RK29_PIN1_PA4,\r
1305                 .cs_iomux_name = GPIO1A4_EMMCWRITEPRT_SPI0CS1_NAME,//if no iomux,set it NULL\r
1306                 .cs_iomux_mode = GPIO1L_SPI0_CSN1,\r
1307         }\r
1308 };\r
1309 \r
1310 struct spi_cs_gpio rk29xx_spi1_cs_gpios[SPI_CHIPSELECT_NUM] = {\r
1311     {\r
1312                 .name = "spi1 cs0",\r
1313                 .cs_gpio = RK29_PIN2_PC5,\r
1314                 .cs_iomux_name = NULL,\r
1315         },\r
1316         {\r
1317                 .name = "spi1 cs1",\r
1318                 .cs_gpio = RK29_PIN1_PA3,\r
1319                 .cs_iomux_name = GPIO1A3_EMMCDETECTN_SPI1CS1_NAME,//if no iomux,set it NULL\r
1320                 .cs_iomux_mode = GPIO1L_SPI1_CSN1,\r
1321         }\r
1322 };\r
1323 \r
1324 static int spi_io_init(struct spi_cs_gpio *cs_gpios, int cs_num)\r
1325 {\r
1326 #if 1\r
1327         int i,j,ret;\r
1328 \r
1329         //cs\r
1330         if (cs_gpios) {\r
1331                 for (i=0; i<cs_num; i++) {\r
1332                         rk29_mux_api_set(cs_gpios[i].cs_iomux_name, cs_gpios[i].cs_iomux_mode);\r
1333                         ret = gpio_request(cs_gpios[i].cs_gpio, cs_gpios[i].name);\r
1334                         if (ret) {\r
1335                                 for (j=0;j<i;j++) {\r
1336                                         gpio_free(cs_gpios[j].cs_gpio);\r
1337                                         //rk29_mux_api_mode_resume(cs_gpios[j].cs_iomux_name);\r
1338                                 }\r
1339                                 printk("[fun:%s, line:%d], gpio request err\n", __func__, __LINE__);\r
1340                                 return -1;\r
1341                         }\r
1342                         gpio_direction_output(cs_gpios[i].cs_gpio, GPIO_HIGH);\r
1343                 }\r
1344         }\r
1345 #endif\r
1346         return 0;\r
1347 }\r
1348 \r
1349 static int spi_io_deinit(struct spi_cs_gpio *cs_gpios, int cs_num)\r
1350 {\r
1351 #if 1\r
1352         int i;\r
1353 \r
1354         if (cs_gpios) {\r
1355                 for (i=0; i<cs_num; i++) {\r
1356                         gpio_free(cs_gpios[i].cs_gpio);\r
1357                         //rk29_mux_api_mode_resume(cs_gpios[i].cs_iomux_name);\r
1358                 }\r
1359         }\r
1360 #endif\r
1361         return 0;\r
1362 }\r
1363 \r
1364 static int spi_io_fix_leakage_bug(void)\r
1365 {\r
1366 #if 0\r
1367         gpio_direction_output(RK29_PIN2_PC1, GPIO_LOW);\r
1368 #endif\r
1369         return 0;\r
1370 }\r
1371 \r
1372 static int spi_io_resume_leakage_bug(void)\r
1373 {\r
1374 #if 0\r
1375         gpio_direction_output(RK29_PIN2_PC1, GPIO_HIGH);\r
1376 #endif\r
1377         return 0;\r
1378 }\r
1379 \r
1380 struct rk29xx_spi_platform_data rk29xx_spi0_platdata = {\r
1381         .num_chipselect = SPI_CHIPSELECT_NUM,\r
1382         .chipselect_gpios = rk29xx_spi0_cs_gpios,\r
1383         .io_init = spi_io_init,\r
1384         .io_deinit = spi_io_deinit,\r
1385         .io_fix_leakage_bug = spi_io_fix_leakage_bug,\r
1386         .io_resume_leakage_bug = spi_io_resume_leakage_bug,\r
1387 };\r
1388 \r
1389 struct rk29xx_spi_platform_data rk29xx_spi1_platdata = {\r
1390         .num_chipselect = SPI_CHIPSELECT_NUM,\r
1391         .chipselect_gpios = rk29xx_spi1_cs_gpios,\r
1392         .io_init = spi_io_init,\r
1393         .io_deinit = spi_io_deinit,\r
1394         .io_fix_leakage_bug = spi_io_fix_leakage_bug,\r
1395         .io_resume_leakage_bug = spi_io_resume_leakage_bug,\r
1396 };\r
1397 \r
1398 /*****************************************************************************************\r
1399  * xpt2046 touch panel\r
1400  * author: cmc@rock-chips.com\r
1401  *****************************************************************************************/\r
1402 #define XPT2046_GPIO_INT           RK29_PIN0_PA3\r
1403 #define DEBOUNCE_REPTIME  3\r
1404 \r
1405 #if defined(CONFIG_TOUCHSCREEN_XPT2046_320X480_SPI)\r
1406 static struct xpt2046_platform_data xpt2046_info = {\r
1407         .model                  = 2046,\r
1408         .keep_vref_on   = 1,\r
1409         .swap_xy                = 0,\r
1410         .x_min                  = 0,\r
1411         .x_max                  = 320,\r
1412         .y_min                  = 0,\r
1413         .y_max                  = 480,\r
1414         .debounce_max           = 7,\r
1415         .debounce_rep           = DEBOUNCE_REPTIME,\r
1416         .debounce_tol           = 20,\r
1417         .gpio_pendown           = XPT2046_GPIO_INT,\r
1418         .penirq_recheck_delay_usecs = 1,\r
1419 };\r
1420 #elif defined(CONFIG_TOUCHSCREEN_XPT2046_320X480_CBN_SPI)\r
1421 static struct xpt2046_platform_data xpt2046_info = {\r
1422         .model                  = 2046,\r
1423         .keep_vref_on   = 1,\r
1424         .swap_xy                = 0,\r
1425         .x_min                  = 0,\r
1426         .x_max                  = 320,\r
1427         .y_min                  = 0,\r
1428         .y_max                  = 480,\r
1429         .debounce_max           = 7,\r
1430         .debounce_rep           = DEBOUNCE_REPTIME,\r
1431         .debounce_tol           = 20,\r
1432         .gpio_pendown           = XPT2046_GPIO_INT,\r
1433         .penirq_recheck_delay_usecs = 1,\r
1434 };\r
1435 #elif defined(CONFIG_TOUCHSCREEN_XPT2046_SPI)\r
1436 static struct xpt2046_platform_data xpt2046_info = {\r
1437         .model                  = 2046,\r
1438         .keep_vref_on   = 1,\r
1439         .swap_xy                = 1,\r
1440         .x_min                  = 0,\r
1441         .x_max                  = 800,\r
1442         .y_min                  = 0,\r
1443         .y_max                  = 480,\r
1444         .debounce_max           = 7,\r
1445         .debounce_rep           = DEBOUNCE_REPTIME,\r
1446         .debounce_tol           = 20,\r
1447         .gpio_pendown           = XPT2046_GPIO_INT,\r
1448 \r
1449         .penirq_recheck_delay_usecs = 1,\r
1450 };\r
1451 #elif defined(CONFIG_TOUCHSCREEN_XPT2046_CBN_SPI)\r
1452 static struct xpt2046_platform_data xpt2046_info = {\r
1453         .model                  = 2046,\r
1454         .keep_vref_on   = 1,\r
1455         .swap_xy                = 1,\r
1456         .x_min                  = 0,\r
1457         .x_max                  = 800,\r
1458         .y_min                  = 0,\r
1459         .y_max                  = 480,\r
1460         .debounce_max           = 7,\r
1461         .debounce_rep           = DEBOUNCE_REPTIME,\r
1462         .debounce_tol           = 20,\r
1463         .gpio_pendown           = XPT2046_GPIO_INT,\r
1464 \r
1465         .penirq_recheck_delay_usecs = 1,\r
1466 };\r
1467 #endif\r
1468 \r
1469 static struct spi_board_info board_spi_devices[] = {\r
1470 #if defined(CONFIG_TOUCHSCREEN_XPT2046_320X480_SPI) || defined(CONFIG_TOUCHSCREEN_XPT2046_320X480_CBN_SPI)\\r
1471     ||defined(CONFIG_TOUCHSCREEN_XPT2046_SPI) || defined(CONFIG_TOUCHSCREEN_XPT2046_CBN_SPI)\r
1472         {\r
1473                 .modalias       = "xpt2046_ts",\r
1474                 .chip_select    = 0,\r
1475                 .max_speed_hz   = 125 * 1000 * 26,/* (max sample rate @ 3V) * (cmd + data + overhead) */\r
1476                 .bus_num        = 0,\r
1477                 .irq = XPT2046_GPIO_INT,\r
1478                 .platform_data = &xpt2046_info,\r
1479         },\r
1480 #endif\r
1481 };\r
1482 \r
1483 \r
1484 static void __init rk29_gic_init_irq(void)\r
1485 {\r
1486         gic_dist_init(0, (void __iomem *)RK29_GICPERI_BASE, 32);\r
1487         gic_cpu_init(0, (void __iomem *)RK29_GICCPU_BASE);\r
1488 }\r
1489 \r
1490 static void __init machine_rk29_init_irq(void)\r
1491 {\r
1492         rk29_gic_init_irq();\r
1493         rk29_gpio_init(rk29_gpiobankinit, MAX_BANK);\r
1494         rk29_gpio_irq_setup();\r
1495 }\r
1496 #define POWER_ON_PIN RK29_PIN4_PA4\r
1497 static void __init machine_rk29_board_init(void)\r
1498 {\r
1499         rk29_board_iomux_init();\r
1500         gpio_request(POWER_ON_PIN,"poweronpin");        \r
1501                 gpio_set_value(POWER_ON_PIN, 1);\r
1502                 gpio_direction_output(POWER_ON_PIN, 1);\r
1503
1504 #ifdef CONFIG_WIFI_CONTROL_FUNC
1505                 rk29sdk_wifi_bt_gpio_control_init();
1506 #endif
1507 \r
1508                 platform_add_devices(devices, ARRAY_SIZE(devices));\r
1509 #ifdef CONFIG_I2C0_RK29\r
1510         i2c_register_board_info(default_i2c0_data.bus_num, board_i2c0_devices,\r
1511                         ARRAY_SIZE(board_i2c0_devices));\r
1512 #endif\r
1513 #ifdef CONFIG_I2C1_RK29\r
1514         i2c_register_board_info(default_i2c1_data.bus_num, board_i2c1_devices,\r
1515                         ARRAY_SIZE(board_i2c1_devices));\r
1516 #endif\r
1517 #ifdef CONFIG_I2C2_RK29\r
1518         i2c_register_board_info(default_i2c2_data.bus_num, board_i2c2_devices,\r
1519                         ARRAY_SIZE(board_i2c2_devices));\r
1520 #endif\r
1521 #ifdef CONFIG_I2C3_RK29\r
1522         i2c_register_board_info(default_i2c3_data.bus_num, board_i2c3_devices,\r
1523                         ARRAY_SIZE(board_i2c3_devices));\r
1524 #endif\r
1525 \r
1526         spi_register_board_info(board_spi_devices, ARRAY_SIZE(board_spi_devices));\r
1527 }\r
1528 \r
1529 static void __init machine_rk29_fixup(struct machine_desc *desc, struct tag *tags,\r
1530                                         char **cmdline, struct meminfo *mi)\r
1531 {\r
1532         mi->nr_banks = 1;\r
1533         mi->bank[0].start = RK29_SDRAM_PHYS;\r
1534         mi->bank[0].node = PHYS_TO_NID(RK29_SDRAM_PHYS);\r
1535         mi->bank[0].size = LINUX_SIZE;\r
1536 }\r
1537 \r
1538 static void __init machine_rk29_mapio(void)\r
1539 {\r
1540         rk29_map_common_io();\r
1541         rk29_clock_init();\r
1542         rk29_iomux_init();\r
1543 }\r
1544 \r
1545 MACHINE_START(RK29, "RK29board")\r
1546         /* UART for LL DEBUG */\r
1547         .phys_io        = RK29_UART1_PHYS,\r
1548         .io_pg_offst    = ((RK29_UART1_BASE) >> 18) & 0xfffc,\r
1549         .boot_params    = RK29_SDRAM_PHYS + 0x88000,\r
1550         .fixup          = machine_rk29_fixup,\r
1551         .map_io         = machine_rk29_mapio,\r
1552         .init_irq       = machine_rk29_init_irq,\r
1553         .init_machine   = machine_rk29_board_init,\r
1554         .timer          = &rk29_timer,\r
1555 MACHINE_END\r