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