add cs select for dm9000 and move io set function to board-XXXX.c file
[firefly-linux-kernel-4.4.55.git] / arch / arm / mach-rk2818 / board-midsdk.c
1 /* linux/arch/arm/mach-rk2818/board-midsdk.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
26 #include <mach/hardware.h>
27 #include <asm/mach-types.h>
28 #include <asm/mach/arch.h>
29 #include <asm/mach/map.h>
30 #include <asm/mach/flash.h>
31
32 #include <mach/irqs.h>
33 #include <mach/board.h>
34 #include <mach/rk2818_iomap.h>
35 #include <mach/iomux.h>
36 #include <mach/gpio.h>
37
38 #include <linux/mtd/nand.h>
39 #include <linux/mtd/partitions.h>
40 #include <linux/dm9000.h>
41
42 #include "devices.h"
43
44
45 /* --------------------------------------------------------------------
46  *  ÉùÃ÷ÁËrk2818_gpioBankÊý×飬²¢¶¨ÒåÁËGPIO¼Ä´æÆ÷×éIDºÍ¼Ä´æÆ÷»ùµØÖ·¡£
47  * -------------------------------------------------------------------- */
48
49 static struct rk2818_gpio_bank rk2818_gpioBank[] = {
50                 {
51                 .id             = RK2818_ID_PIOA,
52                 .offset         = RK2818_GPIO0_BASE,
53                 .clock          = NULL,
54         }, 
55                 {
56                 .id             = RK2818_ID_PIOB,
57                 .offset         = RK2818_GPIO0_BASE,
58                 .clock          = NULL,
59         }, 
60                 {
61                 .id             = RK2818_ID_PIOC,
62                 .offset         = RK2818_GPIO0_BASE,
63                 .clock          = NULL,
64         }, 
65                 {
66                 .id             = RK2818_ID_PIOD,
67                 .offset         = RK2818_GPIO0_BASE,
68                 .clock          = NULL,
69         },
70                 {
71                 .id             = RK2818_ID_PIOE,
72                 .offset         = RK2818_GPIO1_BASE,
73                 .clock          = NULL,
74         },
75                 {
76                 .id             = RK2818_ID_PIOF,
77                 .offset         = RK2818_GPIO1_BASE,
78                 .clock          = NULL,
79         },
80                 {
81                 .id             = RK2818_ID_PIOG,
82                 .offset         = RK2818_GPIO1_BASE,
83                 .clock          = NULL,
84         },
85                 {
86                 .id             = RK2818_ID_PIOH,
87                 .offset         = RK2818_GPIO1_BASE,
88                 .clock          = NULL,
89         }
90 };
91
92 //IOÓ³É䷽ʽÃèÊö £¬Ã¿¸öΪһ¶ÎÏßÐÔÁ¬ÐøÓ³Éä
93 static struct map_desc rk2818_io_desc[] __initdata = {
94
95         {
96                 .virtual        = RK2818_MCDMA_BASE,                                    //ÐéÄâµØÖ·
97                 .pfn            = __phys_to_pfn(RK2818_MCDMA_PHYS),    //ÎïÀíµØÖ·£¬ÐëÓëÒ³±í¶ÔÆë
98                 .length         = RK2818_MCDMA_SIZE,                                                    //³¤¶È
99                 .type           = MT_DEVICE                                                     //Ó³É䷽ʽ
100         },
101         
102         {
103                 .virtual        = RK2818_DWDMA_BASE,                                    
104                 .pfn            = __phys_to_pfn(RK2818_DWDMA_PHYS),    
105                 .length         = RK2818_DWDMA_SIZE,                                            
106                 .type           = MT_DEVICE                                                     
107         },
108         
109         {
110                 .virtual        = RK2818_INTC_BASE,                                     
111                 .pfn            = __phys_to_pfn(RK2818_INTC_PHYS),   
112                 .length         = RK2818_INTC_SIZE,                                     
113                 .type           = MT_DEVICE                                             
114         },
115
116         {
117                 .virtual        = RK2818_NANDC_BASE,                            
118                 .pfn            = __phys_to_pfn(RK2818_NANDC_PHYS),      
119                 .length         = RK2818_NANDC_SIZE,                            
120                 .type           = MT_DEVICE                                     
121         },
122
123         {
124                 .virtual        = RK2818_SDRAMC_BASE,
125                 .pfn            = __phys_to_pfn(RK2818_SDRAMC_PHYS),
126                 .length         = RK2818_SDRAMC_SIZE,
127                 .type           = MT_DEVICE
128         },
129
130         {
131                 .virtual        = RK2818_ARMDARBITER_BASE,                                      
132                 .pfn            = __phys_to_pfn(RK2818_ARMDARBITER_PHYS),    
133                 .length         = RK2818_ARMDARBITER_SIZE,                                              
134                 .type           = MT_DEVICE                                                     
135         },
136         
137         {
138                 .virtual        = RK2818_APB_BASE,
139                 .pfn            = __phys_to_pfn(RK2818_APB_PHYS),
140                 .length         = 0xa0000,                     
141                 .type           = MT_DEVICE
142         },
143         
144         {
145                 .virtual        = RK2818_WDT_BASE,
146                 .pfn            = __phys_to_pfn(RK2818_WDT_PHYS),
147                 .length         = 0xa0000,                      ///apb bus i2s i2c spi no map in this
148                 .type           = MT_DEVICE
149         },
150 };
151 /*****************************************************************************************
152  * SDMMC devices
153  *author: kfx
154 *****************************************************************************************/
155  void rk2818_sdmmc0_cfg_gpio(struct platform_device *dev)
156 {
157         rk2818_mux_api_set(GPIOF3_APWM1_MMC0DETN_NAME, IOMUXA_SDMMC1_DETECT_N);
158         rk2818_mux_api_set(GPIOH_MMC0D_SEL_NAME, IOMUXA_SDMMC0_DATA123);
159         rk2818_mux_api_set(GPIOH_MMC0_SEL_NAME, IOMUXA_SDMMC0_CMD_DATA0_CLKOUT);
160 }
161
162 void rk2818_sdmmc1_cfg_gpio(struct platform_device *dev)
163 {
164         rk2818_mux_api_set(GPIOG_MMC1_SEL_NAME, IOMUXA_SDMMC1_CMD_DATA0_CLKOUT);
165         rk2818_mux_api_set(GPIOG_MMC1D_SEL_NAME, IOMUXA_SDMMC1_DATA123);
166 #if 0
167         /* wifi power up (gpio control) */
168         rk2818_mux_api_set(GPIOH7_HSADCCLK_SEL_NAME,IOMUXB_GPIO1_D7);
169         rk2818_mux_api_set(GPIOF5_APWM3_DPWM3_NAME,IOMUXB_GPIO1_B5);
170         gpio_request(RK2818_PIN_PH7, "sdio");
171         gpio_direction_output(RK2818_PIN_PH7,GPIO_HIGH);
172 #endif
173
174 }
175 #define CONFIG_SDMMC0_USE_DMA
176 #define CONFIG_SDMMC1_USE_DMA
177 struct rk2818_sdmmc_platform_data default_sdmmc0_data = {
178         .host_ocr_avail = (MMC_VDD_27_28|MMC_VDD_28_29|MMC_VDD_29_30|
179                                            MMC_VDD_30_31|MMC_VDD_31_32|MMC_VDD_32_33| 
180                                            MMC_VDD_33_34|MMC_VDD_34_35| MMC_VDD_35_36),
181         .host_caps      = (MMC_CAP_4_BIT_DATA|MMC_CAP_MMC_HIGHSPEED|MMC_CAP_SD_HIGHSPEED),
182         .cfg_gpio = rk2818_sdmmc0_cfg_gpio,
183         .no_detect = 0,
184         .dma_name = "sd_mmc",
185 #ifdef CONFIG_SDMMC0_USE_DMA
186         .use_dma  = 1,
187 #else
188         .use_dma = 0,
189 #endif
190 };
191 struct rk2818_sdmmc_platform_data default_sdmmc1_data = {
192         .host_ocr_avail = (MMC_VDD_26_27|MMC_VDD_27_28|MMC_VDD_28_29|
193                                            MMC_VDD_29_30|MMC_VDD_30_31|MMC_VDD_31_32|
194                                            MMC_VDD_32_33|MMC_VDD_33_34),
195         .host_caps      = (MMC_CAP_4_BIT_DATA|MMC_CAP_SDIO_IRQ|
196                                    MMC_CAP_MMC_HIGHSPEED|MMC_CAP_SD_HIGHSPEED),
197         .cfg_gpio = rk2818_sdmmc1_cfg_gpio,
198         .no_detect = 1,
199         .dma_name = "sdio",
200 #ifdef CONFIG_SDMMC1_USE_DMA
201         .use_dma  = 1,
202 #else
203         .use_dma = 0,
204 #endif
205 };
206
207 /*****************************************************************************************
208  * extern gpio devices
209  *author: xxx
210  *****************************************************************************************/
211 #if defined (CONFIG_GPIO_PCA9554)
212 struct rk2818_gpio_expander_info  extern_gpio_settinginfo[] = {
213         {
214                 .gpio_num               =RK2818_PIN_PI0,
215                 .pin_type           = GPIO_IN,
216                 //.pin_value                    =GPIO_HIGH,
217          },
218
219         {
220                 .gpio_num               =RK2818_PIN_PI4,// tp3
221                 .pin_type           = GPIO_IN,
222                 //.pin_value                    =GPIO_HIGH,
223          },
224          
225          {
226                 .gpio_num               =RK2818_PIN_PI5,//tp4
227                 .pin_type           = GPIO_IN,
228                 //.pin_value                    =GPIO_HIGH,
229          },
230          {
231                 .gpio_num               =RK2818_PIN_PI6,//tp2
232                 .pin_type           = GPIO_OUT,
233                 //.pin_value                    =GPIO_HIGH,
234          },
235          {
236                 .gpio_num               =RK2818_PIN_PI7,//tp1
237                 .pin_type           = GPIO_OUT,
238                 .pin_value                      =GPIO_HIGH,
239          },
240
241
242                 
243 };
244
245 struct pca9554_platform_data rk2818_pca9554_data={
246         .gpio_base=GPIOS_EXPANDER_BASE,
247         .gpio_pin_num=CONFIG_EXPANDED_GPIO_NUM,
248         .gpio_irq_start=NR_AIC_IRQS + 2*NUM_GROUP,
249         .irq_pin_num=CONFIG_EXPANDED_GPIO_IRQ_NUM,
250         .pca9954_irq_pin=RK2818_PIN_PE2,
251         .settinginfo=extern_gpio_settinginfo,
252         .settinginfolen=ARRAY_SIZE(extern_gpio_settinginfo),
253         .names="pca9554",
254 };
255 #endif
256
257 /*****************************************************************************************
258  * I2C devices
259  *author: kfx
260 *****************************************************************************************/
261  void rk2818_i2c0_cfg_gpio(struct platform_device *dev)
262 {
263         rk2818_mux_api_set(GPIOE_I2C0_SEL_NAME, IOMUXA_I2C0);
264 }
265
266 void rk2818_i2c1_cfg_gpio(struct platform_device *dev)
267 {
268         rk2818_mux_api_set(GPIOE_U1IR_I2C1_NAME, IOMUXA_I2C1);
269 }
270 struct rk2818_i2c_platform_data default_i2c0_data = { 
271         .bus_num    = 0,
272         .flags      = 0,
273         .slave_addr = 0xff,
274         .scl_rate  = 400*1000,
275         .mode       = I2C_MODE_IRQ, //I2C_MODE_POLL
276         .cfg_gpio = rk2818_i2c0_cfg_gpio,
277 };
278 struct rk2818_i2c_platform_data default_i2c1_data = { 
279 #ifdef CONFIG_I2C0_RK2818
280         .bus_num    = 1,
281 #else
282         .bus_num        = 0,
283 #endif
284         .flags      = 0,
285         .slave_addr = 0xff,
286         .scl_rate  = 400*1000,
287         .mode       = I2C_MODE_IRQ, //I2C_MODE_POLL
288         .cfg_gpio = rk2818_i2c1_cfg_gpio,
289 };
290
291 struct rk2818_i2c_spi_data default_i2c2_data = { 
292         .bus_num    = 2,
293         .flags      = 0,
294         .slave_addr = 0xff,
295         .scl_rate  = 400*1000,
296         
297 };
298 struct rk2818_i2c_spi_data default_i2c3_data = { 
299
300         .bus_num    = 3,
301         .flags      = 0,
302         .slave_addr = 0xff,
303         .scl_rate  = 400*1000,
304         
305 };
306 static struct i2c_board_info __initdata board_i2c0_devices[] = {
307 #if defined (CONFIG_RK1000_CONTROL)
308         {
309                 .type                   = "rk1000_control",
310                 .addr           = 0x40,
311                 .flags                  = 0,
312         },
313 #endif
314
315 #if defined (CONFIG_RK1000_TVOUT)
316         {
317                 .type                   = "rk1000_tvout",
318                 .addr           = 0x42,
319                 .flags                  = 0,
320         },
321 #endif
322 #if defined (CONFIG_SND_SOC_RK1000)
323         {
324                 .type                   = "rk1000_i2c_codec",
325                 .addr           = 0x60,
326                 .flags                  = 0,
327         },
328 #endif
329 #if defined (CONFIG_SND_SOC_WM8988)
330         {
331                 .type                   = "wm8988",
332                 .addr           = 0x1a,
333                 .flags                  = 0,
334         }
335 #endif  
336 };
337 static struct i2c_board_info __initdata board_i2c1_devices[] = {
338 #if defined (CONFIG_RTC_HYM8563)
339         {
340                 .type                   = "rtc_hym8563",
341                 .addr           = 0x51,
342                 .flags                  = 0,
343         },
344 #endif
345 #if defined (CONFIG_FM_QN8006)
346         {
347                 .type                   = "fm_qn8006",
348                 .addr           = 0x2b, 
349                 .flags                  = 0,
350         },
351 #endif
352 #if defined (CONFIG_GPIO_PCA9554)
353         {
354                 .type                   = "extend_gpio_pca9554",
355                 .addr           = 0x3c, 
356                 .flags                  = 0,
357                 .platform_data=&rk2818_pca9554_data.gpio_base,
358         },
359 #endif
360 #if defined (CONFIG_PMIC_LP8725)
361         {
362                 .type                   = "lp8725",
363                 .addr           = 0x79, 
364                 .flags                  = 0,
365         },
366 #endif
367         {},
368 };
369
370 static struct i2c_board_info __initdata board_i2c2_devices[] = {
371
372 };
373 static struct i2c_board_info __initdata board_i2c3_devices[] = {
374 #if defined (CONFIG_SND_SOC_WM8994)
375         {
376                 .type                   = "wm8994",
377                 .addr           = 0x1a,
378                 .flags                  = 0,
379         },
380 #endif
381 };      
382
383 /*****************************************************************************************
384  * SPI devices
385  *author: lhh
386  *****************************************************************************************/
387 static struct spi_board_info board_spi_devices[] = {
388 #if defined(CONFIG_SPI_FPGA)
389         {       /* fpga ice65l08xx */
390                 .modalias       = "spi_fpga",
391                 .chip_select    = 1,
392                 .max_speed_hz   = 8 * 1000 * 1000,
393                 .bus_num        = 0,
394                 .mode   = SPI_MODE_0,
395         },
396 #endif
397 #if defined(CONFIG_ENC28J60)    
398         {       /* net chip */
399                 .modalias       = "enc28j60",
400                 .chip_select    = 1,
401                 .max_speed_hz   = 12 * 1000 * 1000,
402                 .bus_num        = 0,
403                 .mode   = SPI_MODE_0,
404         },
405 #endif  
406 #if defined(CONFIG_TOUCHSCREEN_XPT2046_SPI) || defined(CONFIG_TOUCHSCREEN_XPT2046_CBN_SPI)
407         {
408                 .modalias       = "xpt2046_ts",
409                 .chip_select    = 0,
410                 .max_speed_hz   = 125 * 1000 * 26,/* (max sample rate @ 3V) * (cmd + data + overhead) */
411                 .bus_num        = 0,
412                 .irq            = RK2818_PIN_PE3,
413         },
414 #endif
415 }; 
416
417 /*rk2818_fb gpio information*/
418 static struct rk2818_fb_gpio rk2818_fb_gpio_info = {
419     .display_on = (GPIO_LOW<<16)|RK2818_PIN_PA2,
420     .lcd_standby = 0,
421     .mcu_fmk_pin = 0,
422 };
423
424 /*rk2818_fb iomux information*/
425 static struct rk2818_fb_iomux rk2818_fb_iomux_info = {
426     .data16     = GPIOC_LCDC16BIT_SEL_NAME,
427     .data18     = GPIOC_LCDC18BIT_SEL_NAME,
428     .data24     = GPIOC_LCDC24BIT_SEL_NAME,
429     .den        = CXGPIO_LCDDEN_SEL_NAME,
430     .vsync      = CXGPIO_LCDVSYNC_SEL_NAME,
431     .mcu_fmk    = 0,
432 };
433 /*rk2818_fb*/
434 struct rk2818_fb_mach_info rk2818_fb_mach_info = {
435     .gpio = &rk2818_fb_gpio_info,
436     .iomux = &rk2818_fb_iomux_info,
437 };
438
439 struct rk2818bl_info rk2818_bl_info = {
440         .pwm_id   = 0,
441         .pw_pin   = GPIO_HIGH | (RK2818_PIN_PA3<< 8) ,
442         .bl_ref   = 0,
443         .pw_iomux = GPIOA23_UART2_SEL_NAME,
444 };
445
446 #ifdef CONFIG_DM9000
447 #define NET_INT_PIN RK2818_PIN_PE2
448 /*dm9000 gpio set*/
449 int dm9k_gpio_set(void)
450 {
451         //cs
452 #ifdef CONFIG_DM9000_CHIP_SELECT
453                 switch (CONFIG_DM9000_CHIP_SELECT) {
454                 case 1:
455                         rk2818_mux_api_set(GPIOA5_FLASHCS1_SEL_NAME, IOMUXB_FLASH_CS1);
456                         break;
457                 case 2:
458                         rk2818_mux_api_set(GPIOA6_FLASHCS2_SEL_NAME, IOMUXB_FLASH_CS2);
459                         break;
460                 case 3:
461                         rk2818_mux_api_set(GPIOA7_FLASHCS3_SEL_NAME, IOMUXB_FLASH_CS3);
462                         break;
463                 case 4:
464                 case 5:
465                         rk2818_mux_api_set(GPIOE_SPI1_FLASH_SEL1_NAME, IOMUXA_FLASH_CS45);      
466                         break;
467                 case 6:
468                 case 7:
469                         rk2818_mux_api_set(GPIOE_SPI1_FLASH_SEL_NAME, IOMUXA_FLASH_CS67);  
470                         break;
471                 default:
472                         break;
473                 }
474 #endif
475
476         //int
477         rk2818_mux_api_set(GPIOE_SPI1_FLASH_SEL1_NAME, IOMUXA_GPIO1_A12);       
478         if (gpio_request(NET_INT_PIN, "dm9000 interrupt")) {
479                 gpio_free(NET_INT_PIN);
480                 rk2818_mux_api_mode_resume(GPIOA1_HOSTDATA17_SEL_NAME);
481                 printk("[fun:%s line:%d], request gpio for net interrupt fail\n", __func__,__LINE__);
482                 goto err;
483                 return -1;
484         }       
485         gpio_pull_updown(NET_INT_PIN, GPIOPullDown);
486         gpio_direction_input(NET_INT_PIN);
487         return 0;
488 err:
489         
490 #ifdef CONFIG_DM9000_CHIP_SELECT
491                 switch (CONFIG_DM9000_CHIP_SELECT) {
492                 case 1:
493                         rk2818_mux_api_mode_resume(GPIOA5_FLASHCS1_SEL_NAME);
494                         break;
495                 case 2:
496                         rk2818_mux_api_mode_resume(GPIOA6_FLASHCS2_SEL_NAME);
497                         break;
498                 case 3:
499                         rk2818_mux_api_mode_resume(GPIOA7_FLASHCS3_SEL_NAME);
500                         break;
501                 case 4:
502                 case 5:
503                         rk2818_mux_api_mode_resume(GPIOE_SPI1_FLASH_SEL1_NAME); 
504                         break;
505                 case 6:
506                 case 7:
507                         rk2818_mux_api_mode_resume(GPIOE_SPI1_FLASH_SEL_NAME);  
508                         break;
509                 default:
510                         break;
511                 }
512 #endif
513         return -1;
514 }
515 void dm9k_gpio_free(void)
516 {
517         gpio_free(NET_INT_PIN);
518         rk2818_mux_api_mode_resume(GPIOE_SPI1_FLASH_SEL1_NAME);
519 #ifdef CONFIG_DM9000_CHIP_SELECT
520                 switch (CONFIG_DM9000_CHIP_SELECT) {
521                 case 1:
522                         rk2818_mux_api_mode_resume(GPIOA5_FLASHCS1_SEL_NAME);
523                         break;
524                 case 2:
525                         rk2818_mux_api_mode_resume(GPIOA6_FLASHCS2_SEL_NAME);
526                         break;
527                 case 3:
528                         rk2818_mux_api_mode_resume(GPIOA7_FLASHCS3_SEL_NAME);
529                         break;
530                 case 4:
531                 case 5:
532                         rk2818_mux_api_mode_resume(GPIOE_SPI1_FLASH_SEL1_NAME); 
533                         break;
534                 case 6:
535                 case 7:
536                         rk2818_mux_api_mode_resume(GPIOE_SPI1_FLASH_SEL_NAME);  
537                         break;
538                 default:
539                         break;
540                 }
541 #endif
542 }
543
544 struct dm9000_plat_data dm9k_platdata = {
545         .flags = DM9000_PLATF_8BITONLY,
546         .pin_int = NET_INT_PIN,
547         .net_gpio_set = dm9k_gpio_set,
548         .net_gpio_free = dm9k_gpio_free,
549 };
550 #endif
551
552 static struct platform_device *devices[] __initdata = {
553         &rk2818_device_uart1,
554 #ifdef CONFIG_I2C0_RK2818
555         &rk2818_device_i2c0,
556 #endif
557 #ifdef CONFIG_I2C1_RK2818
558         &rk2818_device_i2c1,
559 #endif
560 #ifdef CONFIG_SDMMC0_RK2818     
561         &rk2818_device_sdmmc0,
562 #endif
563 #ifdef CONFIG_SDMMC1_RK2818
564         &rk2818_device_sdmmc1,
565 #endif
566         &rk2818_device_spim,
567         &rk2818_device_i2s,
568 #if defined(CONFIG_ANDROID_PMEM)
569         &rk2818_device_pmem,
570         &rk2818_device_pmem_dsp,
571 #endif
572         &rk2818_device_adc,
573         &rk2818_device_adckey,
574         &rk2818_device_battery,
575     &rk2818_device_fb,    
576     &rk2818_device_backlight,
577         &rk2818_device_dsp,
578 #ifdef CONFIG_MTD_NAND_RK2818
579         &rk2818_nand_device,
580 #endif
581 #ifdef CONFIG_DM9000
582         &rk2818_device_dm9k,
583 #endif
584
585 #ifdef CONFIG_DWC_OTG
586         &rk2818_device_dwc_otg,
587 #endif
588 #ifdef CONFIG_RK2818_HOST11
589         &rk2818_device_host11,
590 #endif
591 #ifdef CONFIG_USB_ANDROID
592         &android_usb_device,
593         &usb_mass_storage_device,
594 #endif
595
596 };
597
598 extern struct sys_timer rk2818_timer;
599 #define POWER_PIN       RK2818_PIN_PA3
600 static void rk2818_power_on(void)
601 {
602         int ret;
603         ret = gpio_request(POWER_PIN, NULL);
604         if (ret) {
605                 printk("failed to request power_off gpio\n");
606                 goto err_free_gpio;
607         }
608
609         gpio_pull_updown(POWER_PIN, GPIOPullUp);
610         ret = gpio_direction_output(POWER_PIN, GPIO_HIGH);
611         if (ret) {
612                 printk("failed to set power_off gpio output\n");
613                 goto err_free_gpio;
614         }
615
616         gpio_set_value(POWER_PIN, 1);/*power on*/
617         
618 err_free_gpio:
619         gpio_free(POWER_PIN);
620 }
621
622 static void rk2818_power_off(void)
623 {
624         printk("shut down system now ...\n");
625         gpio_set_value(POWER_PIN, 0);/*power down*/
626 }
627
628 void lcd_set_iomux(u8 enable)
629 {
630     int ret=-1;
631     
632     if(enable)
633     {
634         rk2818_mux_api_set(CXGPIO_HSADC_SEL_NAME, 0);
635         ret = gpio_request(RK2818_PIN_PA4, NULL); 
636         if(0)//(ret != 0)
637         {
638             gpio_free(RK2818_PIN_PA4);
639             printk(">>>>>> lcd cs gpio_request err \n ");           
640             goto pin_err;
641         }  
642         
643         rk2818_mux_api_set(GPIOE_U1IR_I2C1_NAME, 0);    
644
645         ret = gpio_request(RK2818_PIN_PE7, NULL); 
646         if(0)//(ret != 0)
647         {
648             gpio_free(RK2818_PIN_PE7);
649             printk(">>>>>> lcd clk gpio_request err \n "); 
650             goto pin_err;
651         }  
652         
653         ret = gpio_request(RK2818_PIN_PE6, NULL); 
654         if(0)//(ret != 0)
655         {
656             gpio_free(RK2818_PIN_PE6);
657             printk(">>>>>> lcd txd gpio_request err \n "); 
658             goto pin_err;
659         }        
660     }
661     else
662     {
663          gpio_free(RK2818_PIN_PA4); 
664          //rk2818_mux_api_set(CXGPIO_HSADC_SEL_NAME, 1);
665          rk2818_mux_api_mode_resume(CXGPIO_HSADC_SEL_NAME);
666
667          gpio_free(RK2818_PIN_PE7);   
668          gpio_free(RK2818_PIN_PE6); 
669          //rk2818_mux_api_set(GPIOE_U1IR_I2C1_NAME, 2);
670          rk2818_mux_api_mode_resume(GPIOE_U1IR_I2C1_NAME);
671     }
672     return ;
673 pin_err:
674     return ;
675
676 }
677
678 struct lcd_td043mgea1_data lcd_td043mgea1 = {
679     .pin_txd    = RK2818_PIN_PE6,
680     .pin_clk    = RK2818_PIN_PE7,
681     .pin_cs     = RK2818_PIN_PA4,
682     .screen_set_iomux = lcd_set_iomux,
683 };
684
685 //      adc      ---> key       
686 static  ADC_keyst gAdcValueTab[] = 
687 {
688         {95,  AD2KEY1},///VOLUME_DOWN
689         {192, AD2KEY2},///VOLUME_UP
690         {280, AD2KEY3},///MENU
691         {376, AD2KEY4},///HOME
692         {467, AD2KEY5},///BACK
693         {560, AD2KEY6},///CALL
694         {0,0}
695 };
696
697 static unsigned char gInitKeyCode[] = 
698 {
699         AD2KEY1,AD2KEY2,AD2KEY3,AD2KEY4,AD2KEY5,AD2KEY6,
700         ENDCALL,KEYSTART,KEY_WAKEUP,
701 };
702
703 struct adc_key_data rk2818_adc_key = {
704     .pin_playon     = RK2818_PIN_PA3,
705     .playon_level   = 1,
706     .adc_empty      = 900,
707     .adc_invalid    = 20,
708     .adc_drift      = 50,
709     .adc_chn        = 1,
710     .adc_key_table  = gAdcValueTab,
711     .initKeyCode    = gInitKeyCode,
712     .adc_key_cnt    = 9,
713 };
714
715 static void __init machine_rk2818_init_irq(void)
716 {
717         rk2818_init_irq();
718         rk2818_gpio_init(rk2818_gpioBank, 8);
719         rk2818_gpio_irq_setup();
720 }
721
722 static void __init machine_rk2818_board_init(void)
723 {       
724         rk2818_power_on();
725         pm_power_off = rk2818_power_off;
726 #ifdef CONFIG_I2C0_RK2818
727         i2c_register_board_info(default_i2c0_data.bus_num, board_i2c0_devices,
728                         ARRAY_SIZE(board_i2c0_devices));
729 #endif
730 #ifdef CONFIG_I2C1_RK2818
731         i2c_register_board_info(default_i2c1_data.bus_num, board_i2c1_devices,
732                         ARRAY_SIZE(board_i2c1_devices));
733 #endif
734 #ifdef CONFIG_SPI_I2C
735         i2c_register_board_info(default_i2c2_data.bus_num, board_i2c2_devices,
736                         ARRAY_SIZE(board_i2c2_devices));
737         i2c_register_board_info(default_i2c3_data.bus_num, board_i2c3_devices,
738                         ARRAY_SIZE(board_i2c3_devices));
739 #endif
740         platform_add_devices(devices, ARRAY_SIZE(devices));     
741         spi_register_board_info(board_spi_devices, ARRAY_SIZE(board_spi_devices));
742         rk2818_mux_api_set(GPIOB4_SPI0CS0_MMC0D4_NAME,IOMUXA_GPIO0_B4); //IOMUXA_SPI0_CSN0);//use for gpio SPI CS0
743         rk2818_mux_api_set(GPIOB0_SPI0CSN1_MMC1PCA_NAME,IOMUXA_GPIO0_B0); //IOMUXA_SPI0_CSN1);//use for gpio SPI CS1
744         rk2818_mux_api_set(GPIOB_SPI0_MMC0_NAME,IOMUXA_SPI0);//use for SPI CLK SDI SDO
745 }
746
747 static void __init machine_rk2818_mapio(void)
748 {
749         iotable_init(rk2818_io_desc, ARRAY_SIZE(rk2818_io_desc));
750         rk2818_clock_init();
751         rk2818_iomux_init();    
752 }
753
754 MACHINE_START(RK2818, "RK28board")
755
756 /* UART for LL DEBUG */
757         .phys_io        = 0x18002000,
758         .io_pg_offst    = ((0xFF100000) >> 18) & 0xfffc,
759         .boot_params    = RK2818_SDRAM_PHYS + 0xf8000,
760         .map_io         = machine_rk2818_mapio,
761         .init_irq       = machine_rk2818_init_irq,
762         .init_machine   = machine_rk2818_board_init,
763         .timer          = &rk2818_timer,
764 MACHINE_END