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