660512105a62b8c2271ba1dab30c3c80d7ea0c53
[firefly-linux-kernel-4.4.55.git] / arch / arm / mach-rk2818 / board-raho.c
1 /* linux/arch/arm/mach-rk2818/board-phonesdk.c
2  *
3  * Copyright (C) 2010 ROCKCHIP, Inc.
4  *
5  * This software is licensed under the terms of the GNU General Public
6  * License version 2, as published by the Free Software Foundation, and
7  * may be copied, distributed, and modified under those terms.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  */
15
16 #include <linux/kernel.h>
17 #include <linux/init.h>
18 #include <linux/platform_device.h>
19 #include <linux/input.h>
20 #include <linux/io.h>
21 #include <linux/delay.h>
22 #include <linux/i2c.h>
23 #include <linux/spi/spi.h>
24 #include <linux/mmc/host.h>
25 #include <linux/circ_buf.h>
26 #include <linux/miscdevice.h>
27
28 #include <mach/hardware.h>
29 #include <asm/mach-types.h>
30 #include <asm/mach/arch.h>
31 #include <asm/mach/map.h>
32 #include <asm/mach/flash.h>
33
34 #include <mach/irqs.h>
35 #include <mach/board.h>
36 #include <mach/rk2818_iomap.h>
37 #include <mach/iomux.h>
38 #include <mach/gpio.h>
39 #include <mach/spi_fpga.h>
40 #include <mach/rk2818_camera.h>                          /* ddl@rock-chips.com : camera support */
41
42 #include <linux/mtd/nand.h>
43 #include <linux/mtd/partitions.h>
44 #include <linux/dm9000.h>
45
46 #include <media/soc_camera.h>                               /* ddl@rock-chips.com : camera support */
47
48
49 #include "devices.h"
50
51 #include "../../../drivers/spi/rk2818_spim.h"
52 #include <linux/regulator/rk2818_lp8725.h>
53 /* --------------------------------------------------------------------
54  *  ÉùÃ÷ÁËrk2818_gpioBankÊý×飬²¢¶¨ÒåÁËGPIO¼Ä´æÆ÷×éIDºÍ¼Ä´æÆ÷»ùµØÖ·¡£
55  * -------------------------------------------------------------------- */
56
57 static struct rk2818_gpio_bank rk2818_gpioBank[] = {
58                 {
59                 .id             = RK2818_ID_PIOA,
60                 .offset         = RK2818_GPIO0_BASE,
61                 .clock          = NULL,
62         }, 
63                 {
64                 .id             = RK2818_ID_PIOB,
65                 .offset         = RK2818_GPIO0_BASE,
66                 .clock          = NULL,
67         }, 
68                 {
69                 .id             = RK2818_ID_PIOC,
70                 .offset         = RK2818_GPIO0_BASE,
71                 .clock          = NULL,
72         }, 
73                 {
74                 .id             = RK2818_ID_PIOD,
75                 .offset         = RK2818_GPIO0_BASE,
76                 .clock          = NULL,
77         },
78                 {
79                 .id             = RK2818_ID_PIOE,
80                 .offset         = RK2818_GPIO1_BASE,
81                 .clock          = NULL,
82         },
83                 {
84                 .id             = RK2818_ID_PIOF,
85                 .offset         = RK2818_GPIO1_BASE,
86                 .clock          = NULL,
87         },
88                 {
89                 .id             = RK2818_ID_PIOG,
90                 .offset         = RK2818_GPIO1_BASE,
91                 .clock          = NULL,
92         },
93                 {
94                 .id             = RK2818_ID_PIOH,
95                 .offset         = RK2818_GPIO1_BASE,
96                 .clock          = NULL,
97         }
98 };
99
100 //IOÓ³É䷽ʽÃèÊö £¬Ã¿¸öΪһ¶ÎÏßÐÔÁ¬ÐøÓ³Éä
101 static struct map_desc rk2818_io_desc[] __initdata = {
102
103         {
104                 .virtual        = RK2818_MCDMA_BASE,                                    //ÐéÄâµØÖ·
105                 .pfn            = __phys_to_pfn(RK2818_MCDMA_PHYS),    //ÎïÀíµØÖ·£¬ÐëÓëÒ³±í¶ÔÆë
106                 .length         = RK2818_MCDMA_SIZE,                                                    //³¤¶È
107                 .type           = MT_DEVICE                                                     //Ó³É䷽ʽ
108         },
109         
110         {
111                 .virtual        = RK2818_DWDMA_BASE,                                    
112                 .pfn            = __phys_to_pfn(RK2818_DWDMA_PHYS),    
113                 .length         = RK2818_DWDMA_SIZE,                                            
114                 .type           = MT_DEVICE                                                     
115         },
116         
117         {
118                 .virtual        = RK2818_INTC_BASE,                                     
119                 .pfn            = __phys_to_pfn(RK2818_INTC_PHYS),   
120                 .length         = RK2818_INTC_SIZE,                                     
121                 .type           = MT_DEVICE                                             
122         },
123
124         {
125                 .virtual        = RK2818_NANDC_BASE,                            
126                 .pfn            = __phys_to_pfn(RK2818_NANDC_PHYS),      
127                 .length         = RK2818_NANDC_SIZE,                            
128                 .type           = MT_DEVICE                                     
129         },
130
131         {
132                 .virtual        = RK2818_SDRAMC_BASE,
133                 .pfn            = __phys_to_pfn(RK2818_SDRAMC_PHYS),
134                 .length         = RK2818_SDRAMC_SIZE,
135                 .type           = MT_DEVICE
136         },
137
138         {
139                 .virtual        = RK2818_ARMDARBITER_BASE,                                      
140                 .pfn            = __phys_to_pfn(RK2818_ARMDARBITER_PHYS),    
141                 .length         = RK2818_ARMDARBITER_SIZE,                                              
142                 .type           = MT_DEVICE                                                     
143         },
144         
145         {
146                 .virtual        = RK2818_APB_BASE,
147                 .pfn            = __phys_to_pfn(RK2818_APB_PHYS),
148                 .length         = 0xa0000,                     
149                 .type           = MT_DEVICE
150         },
151         
152         {
153                 .virtual        = RK2818_WDT_BASE,
154                 .pfn            = __phys_to_pfn(RK2818_WDT_PHYS),
155                 .length         = 0xa0000,                      ///apb bus i2s i2c spi no map in this
156                 .type           = MT_DEVICE
157         },
158 };
159 /*****************************************************************************************
160  * SDMMC devices
161  *author: kfx
162 *****************************************************************************************/
163  void rk2818_sdmmc0_cfg_gpio(struct platform_device *dev)
164 {
165     rk2818_mux_api_set(GPIOH_MMC0D_SEL_NAME, IOMUXA_SDMMC0_DATA123);
166         rk2818_mux_api_set(GPIOH_MMC0_SEL_NAME, IOMUXA_SDMMC0_CMD_DATA0_CLKOUT);
167 #if 0
168         rk2818_mux_api_set(GPIOF3_APWM1_MMC0DETN_NAME, IOMUXA_SDMMC1_DETECT_N);
169 #endif  
170 }
171
172 void rk2818_sdmmc1_cfg_gpio(struct platform_device *dev)
173 {
174         rk2818_mux_api_set(GPIOG_MMC1_SEL_NAME, IOMUXA_SDMMC1_CMD_DATA0_CLKOUT);
175         rk2818_mux_api_set(GPIOG_MMC1D_SEL_NAME, IOMUXA_SDMMC1_DATA123);
176 #if 0
177         /* wifi power up (gpio control) */
178         rk2818_mux_api_set(GPIOH7_HSADCCLK_SEL_NAME,IOMUXB_GPIO1_D7);
179         rk2818_mux_api_set(GPIOF5_APWM3_DPWM3_NAME,IOMUXB_GPIO1_B5);
180         gpio_request(RK2818_PIN_PH7, "sdio");
181         gpio_direction_output(RK2818_PIN_PH7,GPIO_HIGH);
182 #endif
183
184 }
185 #define CONFIG_SDMMC0_USE_DMA
186 #define CONFIG_SDMMC1_USE_DMA
187 struct rk2818_sdmmc_platform_data default_sdmmc0_data = {
188         .host_ocr_avail = (MMC_VDD_27_28|MMC_VDD_28_29|MMC_VDD_29_30|
189                                            MMC_VDD_30_31|MMC_VDD_31_32|MMC_VDD_32_33| 
190                                            MMC_VDD_33_34|MMC_VDD_34_35| MMC_VDD_35_36),
191         .host_caps      = (MMC_CAP_4_BIT_DATA|MMC_CAP_MMC_HIGHSPEED|MMC_CAP_SD_HIGHSPEED),
192         .cfg_gpio = rk2818_sdmmc0_cfg_gpio,
193         .no_detect = 0,
194         .dma_name = "sd_mmc",
195 #ifdef CONFIG_SDMMC0_USE_DMA
196         .use_dma  = 1,
197 #else
198         .use_dma = 0,
199 #endif
200 };
201 struct rk2818_sdmmc_platform_data default_sdmmc1_data = {
202         .host_ocr_avail = (MMC_VDD_26_27|MMC_VDD_27_28|MMC_VDD_28_29|
203                                            MMC_VDD_29_30|MMC_VDD_30_31|MMC_VDD_31_32|
204                                            MMC_VDD_32_33|MMC_VDD_33_34),
205         .host_caps      = (MMC_CAP_4_BIT_DATA|MMC_CAP_SDIO_IRQ|
206                                    MMC_CAP_MMC_HIGHSPEED|MMC_CAP_SD_HIGHSPEED),
207         .cfg_gpio = rk2818_sdmmc1_cfg_gpio,
208         .no_detect = 1,
209         .dma_name = "sdio",
210 #ifdef CONFIG_SDMMC1_USE_DMA
211         .use_dma  = 1,
212 #else
213         .use_dma = 0,
214 #endif
215 };
216
217 /*****************************************************************************************
218  * extern gpio devices
219  *author: xxx
220  *****************************************************************************************/
221 #if defined (CONFIG_GPIO_PCA9554)
222 struct rk2818_gpio_expander_info  extern_gpio_settinginfo[] = {
223         {
224                 .gpio_num               =RK2818_PIN_PI0,
225                 .pin_type           = GPIO_IN,
226                 //.pin_value                    =GPIO_HIGH,
227          },
228
229         {
230                 .gpio_num               =RK2818_PIN_PI4,// tp3
231                 .pin_type           = GPIO_IN,
232                 //.pin_value                    =GPIO_HIGH,
233          },
234          
235          {
236                 .gpio_num               =RK2818_PIN_PI5,//tp4
237                 .pin_type           = GPIO_IN,
238                 //.pin_value                    =GPIO_HIGH,
239          },
240          {
241                 .gpio_num               =RK2818_PIN_PI6,//tp2
242                 .pin_type           = GPIO_OUT,
243                 //.pin_value                    =GPIO_HIGH,
244          },
245          {
246                 .gpio_num               =RK2818_PIN_PI7,//tp1
247                 .pin_type           = GPIO_OUT,
248                 .pin_value                      =GPIO_HIGH,
249          },
250
251
252                 
253 };
254
255 struct pca9554_platform_data rk2818_pca9554_data={
256         .gpio_base=GPIOS_EXPANDER_BASE,
257         .gpio_pin_num=CONFIG_EXPANDED_GPIO_NUM,
258         .gpio_irq_start=NR_AIC_IRQS + 2*NUM_GROUP,
259         .irq_pin_num=CONFIG_EXPANDED_GPIO_IRQ_NUM,
260         .pca9954_irq_pin=RK2818_PIN_PE2,
261         .settinginfo=extern_gpio_settinginfo,
262         .settinginfolen=ARRAY_SIZE(extern_gpio_settinginfo),
263         .names="pca9554",
264 };
265 #endif
266
267 /*****************************************************************************************
268  *regulator devices  drivers/regulator/rk2818_lp8725.c  linux/regulator/rk2818_lp8725.h
269  *author: cym
270 *****************************************************************************************/
271 #if defined (CONFIG_RK2818_REGULATOR_LP8725)
272 /*ldo1 2V8OUT USB2.5V LCD_VCC*/
273 static struct regulator_consumer_supply ldo1_consumers[] = {
274         {
275                 .supply = "ldo1",
276         }
277 };
278
279 static struct regulator_init_data rk2818_lp8725_ldo1_data = {
280         .constraints = {
281                 .name = "LDO1",
282                 .min_uV = 1200000,
283                 .max_uV = 3300000,
284                 .apply_uV = 1,          
285                 .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE,           
286         },
287         .num_consumer_supplies = ARRAY_SIZE(ldo1_consumers),
288         .consumer_supplies = ldo1_consumers,
289 };
290
291 /*ldo2 CAMERA_1V8 SD_CARD*/
292 static struct regulator_consumer_supply ldo2_consumers[] = {
293         {
294                 .supply = "ldo2",
295         }
296 };
297
298 static struct regulator_init_data rk2818_lp8725_ldo2_data = {
299         .constraints = {
300                 .name = "LDO2",
301                 .min_uV = 1200000,
302                 .max_uV = 3300000,
303                 .apply_uV = 1,
304                 .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE,           
305         },
306         .num_consumer_supplies = ARRAY_SIZE(ldo2_consumers),
307         .consumer_supplies = ldo2_consumers,
308 };
309
310 /*ldo3 VCC_NAND WIFI/BT/FM_BCM4325*/
311 static struct regulator_consumer_supply ldo3_consumers[] = {
312         {
313                 .supply = "ldo3",
314         }
315 };
316
317 static struct regulator_init_data rk2818_lp8725_ldo3_data = {
318         .constraints = {
319                 .name = "LDO3",
320                 .min_uV = 1200000,
321                 .max_uV = 3300000,
322                 .apply_uV = 1,
323                 .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE,
324         },
325         .num_consumer_supplies = ARRAY_SIZE(ldo3_consumers),
326         .consumer_supplies = ldo3_consumers,
327 };
328
329 /*ldo4 VCCA CODEC_WM8994*/
330 static struct regulator_consumer_supply ldo4_consumers[] = {
331         {
332                 .supply = "ldo4",
333         }
334 };
335
336 static struct regulator_init_data rk2818_lp8725_ldo4_data = {
337         .constraints = {
338                 .name = "LDO4",
339                 .min_uV = 1200000,
340                 .max_uV = 3300000,
341                 .apply_uV = 1,
342                 .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE,
343         },
344         .num_consumer_supplies = ARRAY_SIZE(ldo4_consumers),
345         .consumer_supplies = ldo4_consumers,
346 };
347
348 /*ldo5 AVDD18 CODEC_WM8994*/
349 static struct regulator_consumer_supply ldo5_consumers[] = {
350         {
351                 .supply = "ldo5",
352         }
353 };
354
355 static struct regulator_init_data rk2818_lp8725_ldo5_data = {
356         .constraints = {
357                 .name = "LDO5",
358                 .min_uV = 1200000,
359                 .max_uV = 3300000,
360                 .apply_uV = 1,
361                 .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE,
362         },
363         .num_consumer_supplies = ARRAY_SIZE(ldo5_consumers),
364         .consumer_supplies = ldo5_consumers,
365 };
366
367 /*lilo1 VCCIO Sensor£¨3M£©*/
368 static struct regulator_consumer_supply lilo1_consumers[] = {
369         {
370                 .supply = "lilo1",
371         }
372 };
373
374 static struct regulator_init_data rk2818_lp8725_lilo1_data = {
375         .constraints = {
376                 .name = "LILO1",
377                 .min_uV = 800000,
378                 .max_uV = 3300000,
379                 .apply_uV = 1,
380                 .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE,
381         },
382         .num_consumer_supplies = ARRAY_SIZE(lilo1_consumers),
383         .consumer_supplies = lilo1_consumers
384 };
385
386 /*lilo2 VCC33_SD Sensor£¨3M£©*/
387 static struct regulator_consumer_supply lilo2_consumers[] = {
388         {
389                 .supply = "lilo2",
390         }
391 };
392
393 static struct regulator_init_data rk2818_lp8725_lilo2_data = {
394         .constraints = {
395                 .name = "LILO2",
396                 .min_uV = 800000,
397                 .max_uV = 3300000,
398                 .apply_uV = 1,
399                 .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE,
400         },
401         .num_consumer_supplies = ARRAY_SIZE(lilo2_consumers),
402         .consumer_supplies = lilo2_consumers
403 };
404
405 /*buck1 VDD12 Core*/
406 static struct regulator_consumer_supply buck1_consumers[] = {
407         {
408                 .supply = "vdd12",
409         }
410 };
411
412 static struct regulator_init_data rk2818_lp8725_buck1_data = {
413         .constraints = {
414                 .name = "VDD12",
415                 .min_uV = 800000,
416                 .max_uV = 1500000,
417                 .apply_uV = 1,
418                 .always_on = 1,
419                 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
420         },
421         .num_consumer_supplies = ARRAY_SIZE(buck1_consumers),
422         .consumer_supplies = buck1_consumers
423 };
424
425 /*buck2 VDDDR MobileDDR VCC*/
426 static struct regulator_consumer_supply buck2_consumers[] = {
427         {
428                 .supply = "vccdr",
429         }
430 };
431
432 static struct regulator_init_data rk2818_lp8725_buck2_data = {
433         .constraints = {
434                 .name = "VCCDR",
435                 .min_uV = 1800000,
436                 .max_uV = 1800000,
437                 .apply_uV = 1,
438                 .always_on = 1,
439                 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
440         },
441         .num_consumer_supplies = ARRAY_SIZE(buck2_consumers),
442         .consumer_supplies = buck2_consumers
443 };
444
445
446
447
448 struct lp8725_regulator_subdev rk2818_lp8725_regulator_subdev[] = {
449         {
450                 .id=LP8725_LDO1,
451                 .initdata=&rk2818_lp8725_ldo1_data,             
452          },
453
454         {
455                 .id=LP8725_LDO2,
456                 .initdata=&rk2818_lp8725_ldo2_data,             
457          },
458
459         {
460                 .id=LP8725_LDO3,
461                 .initdata=&rk2818_lp8725_ldo3_data,             
462          },
463
464         {
465                 .id=LP8725_LDO4,
466                 .initdata=&rk2818_lp8725_ldo4_data,             
467          },
468
469         {
470                 .id=LP8725_LDO5,
471                 .initdata=&rk2818_lp8725_ldo5_data,             
472          },
473
474         {
475                 .id=LP8725_LILO1,
476                 .initdata=&rk2818_lp8725_lilo1_data,            
477          },
478
479         {
480                 .id=LP8725_LILO2,
481                 .initdata=&rk2818_lp8725_lilo2_data,            
482          },
483
484         {
485                 .id=LP8725_DCDC1,
486                 .initdata=&rk2818_lp8725_buck1_data,            
487          },
488
489         {
490                 .id=LP8725_DCDC2,
491                 .initdata=&rk2818_lp8725_buck2_data,            
492          },
493         
494 };
495
496 struct lp8725_platform_data rk2818_lp8725_data={
497         .num_regulators=LP8725_NUM_REGULATORS,
498         .regulators=rk2818_lp8725_regulator_subdev,
499 };
500 #endif
501
502 /*****************************************************************************************
503  * I2C devices
504  *author: kfx
505 *****************************************************************************************/
506  void rk2818_i2c0_cfg_gpio(struct platform_device *dev)
507 {
508         rk2818_mux_api_set(GPIOE_I2C0_SEL_NAME, IOMUXA_I2C0);
509 }
510
511 void rk2818_i2c1_cfg_gpio(struct platform_device *dev)
512 {
513         rk2818_mux_api_set(GPIOE_U1IR_I2C1_NAME, IOMUXA_I2C1);
514 }
515 struct rk2818_i2c_platform_data default_i2c0_data = { 
516         .bus_num    = 0,
517         .flags      = 0,
518         .slave_addr = 0xff,
519         .scl_rate  = 400*1000,
520         .mode       = I2C_MODE_IRQ, //I2C_MODE_POLL
521         .cfg_gpio = rk2818_i2c0_cfg_gpio,
522 };
523 struct rk2818_i2c_platform_data default_i2c1_data = { 
524 #ifdef CONFIG_I2C0_RK2818
525         .bus_num    = 1,
526 #else
527         .bus_num        = 0,
528 #endif
529         .flags      = 0,
530         .slave_addr = 0xff,
531         .scl_rate  = 400*1000,
532         .mode       = I2C_MODE_IRQ, //I2C_MODE_POLL
533         .cfg_gpio = rk2818_i2c1_cfg_gpio,
534 };
535
536 struct rk2818_i2c_spi_data default_i2c2_data = { 
537         .bus_num    = 2,
538         .flags      = 0,
539         .slave_addr = 0xff,
540         .scl_rate  = 400*1000,
541         
542 };
543 struct rk2818_i2c_spi_data default_i2c3_data = { 
544
545         .bus_num    = 3,
546         .flags      = 0,
547         .slave_addr = 0xff,
548         .scl_rate  = 400*1000,
549         
550 };
551 static struct i2c_board_info __initdata board_i2c0_devices[] = {
552 #if defined (CONFIG_RK1000_CONTROL)
553         {
554                 .type                   = "rk1000_control",
555                 .addr           = 0x40,
556                 .flags                  = 0,
557         },
558 #endif
559
560 #if defined (CONFIG_RK1000_TVOUT)
561         {
562                 .type                   = "rk1000_tvout",
563                 .addr           = 0x42,
564                 .flags                  = 0,
565         },
566 #endif
567 #if defined (CONFIG_SND_SOC_RK1000)
568         {
569                 .type                   = "rk1000_i2c_codec",
570                 .addr           = 0x60,
571                 .flags                  = 0,
572         },
573 #endif
574 #if defined (CONFIG_SND_SOC_WM8988)
575         {
576                 .type                   = "wm8988",
577                 .addr           = 0x1a,
578                 .flags                  = 0,
579         }
580 #endif  
581 };
582 static struct i2c_board_info __initdata board_i2c1_devices[] = {
583 #if defined (CONFIG_RTC_HYM8563)
584         {
585                 .type                   = "rtc_hym8563",
586                 .addr           = 0x51,
587                 .flags                  = 0,
588         },
589 #endif
590 #if defined (CONFIG_RTC_DRV_S35392A)
591         {
592                 .type                   = "rtc-s35392a",
593                 .addr           = 0x30,
594                 .flags                  = 0,
595         },
596 #endif
597 #if defined (CONFIG_FM_QN8006)
598         {
599                 .type                   = "fm_qn8006",
600                 .addr           = 0x2b, 
601                 .flags                  = 0,
602         },
603 #endif
604 #if defined (CONFIG_GPIO_PCA9554)
605         {
606                 .type                   = "extend_gpio_pca9554",
607                 .addr           = 0x3c, 
608                 .flags                  = 0,
609                 .platform_data=&rk2818_pca9554_data.gpio_base,
610         },
611 #endif
612 #if defined (CONFIG_RK2818_REGULATOR_LP8725)
613         {
614                 .type                   = "lp8725",
615                 .addr           = 0x79, 
616                 .flags                  = 0,
617                 .platform_data=&rk2818_lp8725_data,
618         },
619 #endif
620 #if defined (CONFIG_GS_MMA7660)
621     {
622         .type           = "gs_mma7660",
623         .addr           = 0x4c,
624         .flags          = 0,
625         .irq            = RK2818_PIN_PE3,
626     },
627 #endif
628         {},
629 };
630
631 static struct i2c_board_info __initdata board_i2c2_devices[] = {
632
633 };
634 static struct i2c_board_info __initdata board_i2c3_devices[] = {
635 #if defined (CONFIG_SND_SOC_WM8994)
636         {
637                 .type                   = "wm8994",
638                 .addr           = 0x1a,
639                 .flags                  = 0,
640         },
641 #endif
642 };      
643
644 static void spi_xpt2046_cs_control(u32 command)
645 {
646         if(command == 3)        
647             {
648             gpio_direction_output(RK2818_PIN_PF5, GPIO_LOW);
649             }
650         if(command == 0)
651             {
652             gpio_direction_output(RK2818_PIN_PF5, GPIO_HIGH);
653             }
654 }
655
656 struct rk2818_spi_chip spi_xpt2046_info = {
657         .cs_control = spi_xpt2046_cs_control,
658 };
659
660
661 /*****************************************************************************************
662  * camera  devices
663  *author: ddl@rock-chips.com
664  *****************************************************************************************/ 
665 #define RK2818_CAM_POWER_PIN    FPGA_PIO1_05//SPI_GPIO_P1_05
666 #define RK2818_CAM_RESET_PIN    FPGA_PIO1_14//SPI_GPIO_P1_14    
667
668 static int rk28_sensor_init(void);
669 static int rk28_sensor_deinit(void);
670
671 struct rk28camera_platform_data rk28_camera_platform_data = {
672     .init = rk28_sensor_init,
673     .deinit = rk28_sensor_deinit,
674     .gpio_res = {
675         {
676             .gpio_reset = RK2818_CAM_RESET_PIN,
677             .gpio_power = RK2818_CAM_POWER_PIN,
678             .dev_name = "ov2655"
679         }, {
680             .gpio_reset = 0xFFFFFFFF,
681             .gpio_power = 0xFFFFFFFF,
682             .dev_name = NULL
683         }
684     }
685 };
686
687 static int rk28_sensor_init(void)
688 {
689     int ret = 0, i;
690     unsigned int camera_reset=0xffffffff,camera_power=0xffffffff;
691
692     printk("\n%s....%d    ******** ddl *********\n",__FUNCTION__,__LINE__);
693     
694     for (i=0; i<2; i++) { 
695         camera_reset = rk28_camera_platform_data.gpio_res[i].gpio_reset;
696         camera_power = rk28_camera_platform_data.gpio_res[i].gpio_power; 
697         
698         if (camera_power != 0xffffffff) {            
699             ret = gpio_request(camera_power, "camera power");
700             if (ret)
701                 continue;
702                 
703             gpio_set_value(camera_reset, 1);
704             gpio_direction_output(camera_power, 0);   
705         }
706         
707         if (camera_reset != 0xffffffff) {
708             ret = gpio_request(camera_reset, "camera reset");
709             if (ret) {
710                 if (camera_power != 0xffffffff) 
711                     gpio_free(camera_power);    
712
713                 continue;
714             }
715
716             gpio_set_value(camera_reset, 0);
717             gpio_direction_output(camera_reset, 0);            
718         }
719     }
720     
721     return 0;
722 }
723
724 static int rk28_sensor_deinit(void)
725 {
726     unsigned int i;
727     unsigned int camera_reset=0xffffffff,camera_power=0xffffffff;
728
729     printk("\n%s....%d    ******** ddl *********\n",__FUNCTION__,__LINE__); 
730    
731     for (i=0; i<2; i++) { 
732         camera_reset = rk28_camera_platform_data.gpio_res[i].gpio_reset;
733         camera_power = rk28_camera_platform_data.gpio_res[i].gpio_power; 
734         
735         if (camera_power != 0xffffffff){
736             gpio_direction_input(camera_power);
737             gpio_free(camera_power);    
738         }
739         
740         if (camera_reset != 0xffffffff)  {
741             gpio_direction_input(camera_reset);
742             gpio_free(camera_reset);    
743         }
744     }
745
746     return 0;
747 }
748
749
750 static int rk28_sensor_power(struct device *dev, int on)
751 {
752     unsigned int camera_reset=0xffffffff,camera_power=0xffffffff;
753     
754     if(rk28_camera_platform_data.gpio_res[0].dev_name &&  (strcmp(rk28_camera_platform_data.gpio_res[0].dev_name, dev_name(dev)) == 0)) {
755         camera_reset = rk28_camera_platform_data.gpio_res[0].gpio_reset;
756         camera_power = rk28_camera_platform_data.gpio_res[0].gpio_power;
757     } else if (rk28_camera_platform_data.gpio_res[1].dev_name && (strcmp(rk28_camera_platform_data.gpio_res[1].dev_name, dev_name(dev)) == 0)) {
758         camera_reset = rk28_camera_platform_data.gpio_res[1].gpio_reset;
759         camera_power = rk28_camera_platform_data.gpio_res[1].gpio_power;
760     }
761
762     if (camera_reset != 0xffffffff) {
763         gpio_set_value(camera_reset, !on);
764         //printk("\n%s..%s..ResetPin=%d ..PinLevel = %x   ******** ddl *********\n",__FUNCTION__,dev_name(dev),camera_reset, on);
765     }
766     if (camera_power != 0xffffffff)  {       
767         gpio_set_value(camera_power, !on);
768         printk("\n%s..%s..PowerPin=%d ..PinLevel = %x   ******** ddl *********\n",__FUNCTION__,dev_name(dev), camera_power, !on);
769     }
770     if (camera_reset != 0xffffffff) {
771         msleep(3);          /* delay 3 ms */
772         gpio_set_value(camera_reset,on);
773         printk("\n%s..%s..ResetPin= %d..PinLevel = %x   ******** ddl *********\n",__FUNCTION__,dev_name(dev), camera_reset, on);
774     }      
775     return 0;
776 }
777
778  
779 #define OV2655_IIC_ADDR             0x60
780 static struct i2c_board_info rk2818_i2c_cam_info[] = {
781 #ifdef CONFIG_SOC_CAMERA_OV2655
782         {
783                 I2C_BOARD_INFO("ov2655", OV2655_IIC_ADDR>>1)
784         },
785 #endif  
786 };
787
788 struct soc_camera_link rk2818_iclink = {
789         .bus_id         = RK28_CAM_PLATFORM_DEV_ID,
790         .power          = rk28_sensor_power,
791         .board_info     = &rk2818_i2c_cam_info[0],
792         .i2c_adapter_id = 2,
793 #ifdef CONFIG_SOC_CAMERA_OV2655 
794         .module_name    = "ov2655",
795 #endif  
796 };
797
798
799 /*****************************************************************************************
800  * SPI devices
801  *author: lhh
802  *****************************************************************************************/
803 static struct spi_board_info board_spi_devices[] = {
804 #if defined(CONFIG_SPI_FPGA)
805         {       /* fpga ice65l08xx */
806                 .modalias       = "spi_fpga",
807                 .chip_select    = 1,
808                 .max_speed_hz   = 8 * 1000 * 1000,
809                 .bus_num        = 0,
810                 .mode   = SPI_MODE_0,
811         },
812 #endif
813 #if defined(CONFIG_ENC28J60)    
814         {       /* net chip */
815                 .modalias       = "enc28j60",
816                 .chip_select    = 1,
817                 .max_speed_hz   = 12 * 1000 * 1000,
818                 .bus_num        = 0,
819                 .mode   = SPI_MODE_0,
820         },
821 #endif  
822 #if defined(CONFIG_TOUCHSCREEN_XPT2046_320X480_SPI) || defined(CONFIG_TOUCHSCREEN_XPT2046_320X480_CBN_SPI)\
823     ||defined(CONFIG_TOUCHSCREEN_XPT2046_SPI) || defined(CONFIG_TOUCHSCREEN_XPT2046_CBN_SPI)
824         {
825                 .modalias       = "xpt2046_ts",
826                 .chip_select    = 2,
827                 .max_speed_hz   = 125 * 1000 * 26,/* (max sample rate @ 3V) * (cmd + data + overhead) */
828                 .bus_num        = 0,
829                 .controller_data = &spi_xpt2046_info,
830                 .irq = RK2818_PIN_PE1,
831         },
832 #endif
833 }; 
834
835 /*rk2818_fb gpio information*/
836 static struct rk2818_fb_gpio rk2818_fb_gpio_info = {
837     .display_on = (GPIO_LOW<<16)|RK2818_PIN_PA2,
838     .lcd_standby = 0,
839     .mcu_fmk_pin = 0,
840 };
841
842 /*rk2818_fb iomux information*/
843 static struct rk2818_fb_iomux rk2818_fb_iomux_info = {
844     .data16     = GPIOC_LCDC16BIT_SEL_NAME,
845     .data18     = GPIOC_LCDC18BIT_SEL_NAME,
846     .data24     = GPIOC_LCDC24BIT_SEL_NAME,
847     .den        = CXGPIO_LCDDEN_SEL_NAME,
848     .vsync      = CXGPIO_LCDVSYNC_SEL_NAME,
849     .mcu_fmk    = 0,
850 };
851 /*rk2818_fb*/
852 struct rk2818_fb_mach_info rk2818_fb_mach_info = {
853     .gpio = &rk2818_fb_gpio_info,
854     .iomux = &rk2818_fb_iomux_info,
855 };
856
857 struct rk2818bl_info rk2818_bl_info = {
858         .pwm_id   = 0,
859         .pw_pin   = GPIO_HIGH | (RK2818_PIN_PF3<< 8) ,
860         .bl_ref   = 0,
861         .pw_iomux = GPIOF34_UART3_SEL_NAME,
862 };
863
864 /********************************************************
865 *                               dm9000 net work devices
866 *                               author:lyx
867 ********************************************************/
868 #ifdef CONFIG_DM9000
869 /*
870 GPIOA5_FLASHCS1_SEL_NAME     IOMUXB_FLASH_CS1
871 GPIOA6_FLASHCS2_SEL_NAME     IOMUXB_FLASH_CS2
872 GPIOA7_FLASHCS3_SEL_NAME     IOMUXB_FLASH_CS3
873 GPIOE_SPI1_FLASH_SEL1_NAME   IOMUXA_FLASH_CS45
874 GPIOE_SPI1_FLASH_SEL_NAME    IOMUXA_FLASH_CS67
875 */
876 #define DM9000_USE_NAND_CS 1     //cs can be 1,2,3,4,5,6 or 7
877 #define DM9000_CS_IOMUX_NAME GPIOA5_FLASHCS1_SEL_NAME
878 #define DM9000_CS_IOMUX_MODE IOMUXB_FLASH_CS1
879 #define DM9000_NET_INT_PIN RK2818_PIN_PA1
880 #define DM9000_INT_IOMUX_NAME GPIOA1_HOSTDATA17_SEL_NAME
881 #define DM9000_INT_IOMUX_MODE IOMUXB_GPIO0_A1
882 #define DM9000_INT_INIT_VALUE GPIOPullDown
883 #define DM9000_IRQ IRQF_TRIGGER_HIGH
884 #define DM9000_IO_ADDR (RK2818_NANDC_PHYS + 0x800 + DM9000_USE_NAND_CS*0x100 + 0x8)
885 #define DM9000_DATA_ADDR (RK2818_NANDC_PHYS + 0x800 + DM9000_USE_NAND_CS*0x100 + 0x4)
886
887 int dm9k_gpio_set(void)
888 {
889         //cs
890         rk2818_mux_api_set(DM9000_CS_IOMUX_NAME, DM9000_CS_IOMUX_MODE);
891
892         //int
893         rk2818_mux_api_set(DM9000_INT_IOMUX_NAME, DM9000_INT_IOMUX_MODE);
894         
895         if (gpio_request(DM9000_NET_INT_PIN, "dm9000 interrupt")) {
896                 gpio_free(DM9000_NET_INT_PIN);
897                 rk2818_mux_api_mode_resume(DM9000_INT_IOMUX_NAME);
898                 rk2818_mux_api_mode_resume(DM9000_CS_IOMUX_NAME);
899                 printk("[fun:%s line:%d], request gpio for net interrupt fail\n", __func__,__LINE__);
900
901                 return -1;
902         }       
903         gpio_pull_updown(DM9000_NET_INT_PIN, DM9000_INT_INIT_VALUE);
904         gpio_direction_input(DM9000_NET_INT_PIN);
905         
906         return 0;
907 }
908 int dm9k_gpio_free(void)
909 {
910         gpio_free(DM9000_NET_INT_PIN);
911         rk2818_mux_api_mode_resume(DM9000_INT_IOMUX_NAME);
912         rk2818_mux_api_mode_resume(DM9000_CS_IOMUX_NAME);
913         return 0;
914 }
915 int dm9k_get_gpio_irq(void)
916 {
917         return gpio_to_irq(DM9000_NET_INT_PIN);
918 }
919
920 static struct resource dm9k_resource[] = {
921         [0] = {
922                 .start = DM9000_IO_ADDR,    
923                 .end   = DM9000_IO_ADDR + 3,
924                 .flags = IORESOURCE_MEM,
925         },
926         [1] = {
927                 .start = DM9000_DATA_ADDR,      
928                 .end   = DM9000_DATA_ADDR + 3,
929                 .flags = IORESOURCE_MEM,
930         },
931         [2] = {
932                 .start = DM9000_NET_INT_PIN,
933                 .end   = DM9000_NET_INT_PIN,
934                 .flags = IORESOURCE_IRQ | DM9000_IRQ,
935         }
936
937 };
938
939 /* for the moment we limit ourselves to 8bit IO until some
940  * better IO routines can be written and tested
941 */
942 struct dm9000_plat_data dm9k_platdata = {       
943         .flags = DM9000_PLATF_8BITONLY,
944         .io_init = dm9k_gpio_set,
945         .io_deinit = dm9k_gpio_free,
946         .get_irq_num = dm9k_get_gpio_irq,
947 };
948
949 struct platform_device rk2818_device_dm9k = {
950         .name           = "dm9000",
951         .id             = 0,
952         .num_resources  = ARRAY_SIZE(dm9k_resource),
953         .resource       = dm9k_resource,
954         .dev            = {
955                 .platform_data = &dm9k_platdata,
956         }
957 };
958 #endif
959
960 static struct platform_device *devices[] __initdata = {
961 #ifdef CONFIG_BT
962     &rk2818_device_rfkill,
963 #endif
964         &rk2818_device_uart0,
965         &rk2818_device_uart1,
966 #ifdef CONFIG_I2C0_RK2818
967         &rk2818_device_i2c0,
968 #endif
969 #ifdef CONFIG_I2C1_RK2818
970         &rk2818_device_i2c1,
971 #endif
972 #ifdef CONFIG_SDMMC0_RK2818     
973         &rk2818_device_sdmmc0,
974 #endif
975 #ifdef CONFIG_SDMMC1_RK2818
976         &rk2818_device_sdmmc1,
977 #endif
978         &rk2818_device_spim,
979         &rk2818_device_i2s,
980 #if defined(CONFIG_ANDROID_PMEM)
981         &rk2818_device_pmem,
982         &rk2818_device_pmem_dsp,
983 #endif
984         &rk2818_device_adc,
985         &rk2818_device_adckey,
986         &rk2818_device_battery,
987     &rk2818_device_fb,    
988     &rk2818_device_backlight,
989         &rk2818_device_dsp,
990
991 #ifdef CONFIG_VIDEO_RK2818
992         &rk2818_device_camera,      /* ddl@rock-chips.com : camera support  */
993         &rk2818_soc_camera_pdrv,
994  #endif
995  
996 #ifdef CONFIG_MTD_NAND_RK2818
997         &rk2818_nand_device,
998 #endif
999 #ifdef CONFIG_DM9000
1000         &rk2818_device_dm9k,
1001 #endif
1002
1003 #ifdef CONFIG_DWC_OTG
1004         &rk2818_device_dwc_otg,
1005 #endif
1006 #ifdef CONFIG_RK2818_HOST11
1007         &rk2818_device_host11,
1008 #endif
1009 #ifdef CONFIG_USB_ANDROID
1010         &android_usb_device,
1011         &usb_mass_storage_device,
1012 #endif
1013 #ifdef CONFIG_ANDROID_TIMED_GPIO
1014         &rk28_device_vibrator,
1015 #endif
1016 };
1017
1018 extern struct sys_timer rk2818_timer;
1019 #define POWER_PIN       RK2818_PIN_PB1
1020 static void rk2818_power_on(void)
1021 {
1022         int ret;
1023         ret = gpio_request(POWER_PIN, NULL);
1024         if (ret) {
1025                 printk("failed to request power_off gpio\n");
1026                 goto err_free_gpio;
1027         }
1028
1029         gpio_pull_updown(POWER_PIN, GPIOPullUp);
1030         ret = gpio_direction_output(POWER_PIN, GPIO_HIGH);
1031         if (ret) {
1032                 printk("failed to set power_off gpio output\n");
1033                 goto err_free_gpio;
1034         }
1035
1036         gpio_set_value(POWER_PIN, 1);/*power on*/
1037         
1038 err_free_gpio:
1039         gpio_free(POWER_PIN);
1040 }
1041
1042 static void rk2818_power_off(void)
1043 {
1044         printk("shut down system now ...\n");
1045         gpio_set_value(POWER_PIN, 0);/*power down*/
1046 }
1047
1048 void lcd_set_iomux(u8 enable)
1049 {
1050     int ret=-1;
1051
1052     if(enable)
1053     {
1054         rk2818_mux_api_set(GPIOH6_IQ_SEL_NAME, 0);
1055         ret = gpio_request(RK2818_PIN_PH6, NULL); 
1056         if(ret != 0)
1057         {
1058             gpio_free(RK2818_PIN_PH6);
1059             printk(">>>>>> lcd cs gpio_request err \n ");           
1060             goto pin_err;
1061         }  
1062         
1063         rk2818_mux_api_set(GPIOE_I2C0_SEL_NAME, 1);    
1064
1065         ret = gpio_request(RK2818_PIN_PE4, NULL); 
1066         if(ret != 0)
1067         {
1068             gpio_free(RK2818_PIN_PE4);
1069             printk(">>>>>> lcd clk gpio_request err \n "); 
1070             goto pin_err;
1071         }  
1072         
1073         ret = gpio_request(RK2818_PIN_PE5, NULL); 
1074         if(ret != 0)
1075         {
1076             gpio_free(RK2818_PIN_PE5);
1077             printk(">>>>>> lcd txd gpio_request err \n "); 
1078             goto pin_err;
1079         }        
1080     }
1081     else
1082     {
1083          gpio_free(RK2818_PIN_PH6); 
1084          //rk2818_mux_api_set(GPIOH6_IQ_SEL_NAME, 1);
1085          rk2818_mux_api_mode_resume(GPIOH6_IQ_SEL_NAME);
1086
1087          gpio_free(RK2818_PIN_PE4);   
1088          gpio_free(RK2818_PIN_PE5); 
1089          //rk2818_mux_api_set(GPIOE_I2C0_SEL_NAME, 0);
1090          rk2818_mux_api_mode_resume(GPIOE_I2C0_SEL_NAME);
1091     }
1092     return ;
1093 pin_err:
1094     return ;
1095
1096 }
1097
1098 struct lcd_td043mgea1_data lcd_td043mgea1 = {
1099     .pin_txd    = RK2818_PIN_PE4,
1100     .pin_clk    = RK2818_PIN_PE5,
1101     .pin_cs     = RK2818_PIN_PH6,
1102     .screen_set_iomux = lcd_set_iomux,
1103 };
1104
1105 //      adc      ---> key       
1106 static  ADC_keyst gAdcValueTab[] = 
1107 {
1108         {0x5c,  AD2KEY1},///VOLUME_DOWN
1109         {0xbf,  AD2KEY2},///VOLUME_UP
1110         {0x115, AD2KEY3},///MENU
1111         {0x177, AD2KEY4},///HOME
1112         {0x1d3, AD2KEY5},///BACK
1113         {0x290, AD2KEY6},///CALL
1114         {0x230, AD2KEY7},///SEARCH
1115         {0,     0}///table end
1116 };
1117
1118 static unsigned char gInitKeyCode[] = 
1119 {
1120         AD2KEY1,AD2KEY2,AD2KEY3,AD2KEY4,AD2KEY5,AD2KEY6,AD2KEY7,
1121         ENDCALL,KEYSTART,KEY_WAKEUP,
1122 };
1123
1124 struct adc_key_data rk2818_adc_key = {
1125     .pin_playon     = RK2818_PIN_PA3,
1126     .playon_level   = 1,
1127     .adc_empty      = 900,
1128     .adc_invalid    = 20,
1129     .adc_drift      = 50,
1130     .adc_chn        = 1,
1131     .adc_key_table  = gAdcValueTab,
1132     .initKeyCode    = gInitKeyCode,
1133     .adc_key_cnt    = 10,
1134 };
1135
1136 static void __init machine_rk2818_init_irq(void)
1137 {
1138         rk2818_init_irq();
1139         rk2818_gpio_init(rk2818_gpioBank, 8);
1140         rk2818_gpio_irq_setup();
1141 }
1142
1143 static void __init machine_rk2818_board_init(void)
1144 {       
1145         rk2818_power_on();
1146         pm_power_off = rk2818_power_off;
1147 #ifdef CONFIG_I2C0_RK2818
1148         i2c_register_board_info(default_i2c0_data.bus_num, board_i2c0_devices,
1149                         ARRAY_SIZE(board_i2c0_devices));
1150 #endif
1151 #ifdef CONFIG_I2C1_RK2818
1152         i2c_register_board_info(default_i2c1_data.bus_num, board_i2c1_devices,
1153                         ARRAY_SIZE(board_i2c1_devices));
1154 #endif
1155 #ifdef CONFIG_SPI_I2C
1156         i2c_register_board_info(default_i2c2_data.bus_num, board_i2c2_devices,
1157                         ARRAY_SIZE(board_i2c2_devices));
1158         i2c_register_board_info(default_i2c3_data.bus_num, board_i2c3_devices,
1159                         ARRAY_SIZE(board_i2c3_devices));
1160 #endif
1161         platform_add_devices(devices, ARRAY_SIZE(devices));     
1162         spi_register_board_info(board_spi_devices, ARRAY_SIZE(board_spi_devices));
1163         rk2818_mux_api_set(GPIOB4_SPI0CS0_MMC0D4_NAME,IOMUXA_GPIO0_B4); //IOMUXA_SPI0_CSN0);//use for gpio SPI CS0
1164         rk2818_mux_api_set(GPIOB0_SPI0CSN1_MMC1PCA_NAME,IOMUXA_GPIO0_B0); //IOMUXA_SPI0_CSN1);//use for gpio SPI CS1
1165         rk2818_mux_api_set(GPIOB_SPI0_MMC0_NAME,IOMUXA_SPI0);//use for SPI CLK SDI SDO
1166
1167         rk2818_mux_api_set(GPIOF5_APWM3_DPWM3_NAME,IOMUXB_GPIO1_B5);
1168         if(0 != gpio_request(RK2818_PIN_PF5, NULL))
1169     {
1170         gpio_free(RK2818_PIN_PF5);
1171         printk(">>>>>> RK2818_PIN_PF5 gpio_request err \n "); 
1172     } 
1173 }
1174
1175 static void __init machine_rk2818_mapio(void)
1176 {
1177         iotable_init(rk2818_io_desc, ARRAY_SIZE(rk2818_io_desc));
1178         rk2818_clock_init();
1179         rk2818_iomux_init();    
1180 }
1181
1182 MACHINE_START(RK2818, "RK28board")
1183
1184 /* UART for LL DEBUG */
1185         .phys_io        = 0x18002000,
1186         .io_pg_offst    = ((0xFF100000) >> 18) & 0xfffc,
1187         .boot_params    = RK2818_SDRAM_PHYS + 0xf8000,
1188         .map_io         = machine_rk2818_mapio,
1189         .init_irq       = machine_rk2818_init_irq,
1190         .init_machine   = machine_rk2818_board_init,
1191         .timer          = &rk2818_timer,
1192 MACHINE_END
1193