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