1 /* linux/arch/arm/mach-rk2818/board-phonesdk.c
3 * Copyright (C) 2010 ROCKCHIP, Inc.
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.
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.
16 #include <linux/kernel.h>
17 #include <linux/init.h>
18 #include <linux/platform_device.h>
19 #include <linux/input.h>
21 #include <linux/delay.h>
22 #include <linux/i2c.h>
23 #include <linux/spi/spi.h>
24 #include <linux/mmc/host.h>
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>
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 #include <mach/rk2818_camera.h> /* ddl@rock-chips.com : camera support */
38 #include <mach/rk2818_nand.h>
40 #include <linux/mtd/nand.h>
41 #include <linux/mtd/partitions.h>
42 #include <linux/dm9000.h>
44 #include <media/soc_camera.h> /* ddl@rock-chips.com : camera support */
48 #include "../../../drivers/spi/rk2818_spim.h"
49 #include "../../../drivers/input/touchscreen/xpt2046_ts.h"
50 #include "../../../drivers/staging/android/timed_gpio.h"
51 #include "../../../sound/soc/codecs/wm8994.h"
53 /* --------------------------------------------------------------------
54 * ÉùÃ÷ÁËrk2818_gpioBankÊý×飬²¢¶¨ÒåÁËGPIO¼Ä´æÆ÷×éIDºÍ¼Ä´æÆ÷»ùµØÖ·¡£
55 * -------------------------------------------------------------------- */
57 static struct rk2818_gpio_bank rk2818_gpioBank[] = {
60 .offset = RK2818_GPIO0_BASE,
65 .offset = RK2818_GPIO0_BASE,
70 .offset = RK2818_GPIO0_BASE,
75 .offset = RK2818_GPIO0_BASE,
80 .offset = RK2818_GPIO1_BASE,
85 .offset = RK2818_GPIO1_BASE,
90 .offset = RK2818_GPIO1_BASE,
95 .offset = RK2818_GPIO1_BASE,
100 //IOÓ³É䷽ʽÃèÊö £¬Ã¿¸öΪһ¶ÎÏßÐÔÁ¬ÐøÓ³Éä
101 static struct map_desc rk2818_io_desc[] __initdata = {
104 .virtual = RK2818_MCDMA_BASE, //ÐéÄâµØÖ·
105 .pfn = __phys_to_pfn(RK2818_MCDMA_PHYS), //ÎïÀíµØÖ·£¬ÐëÓëÒ³±í¶ÔÆë
106 .length = RK2818_MCDMA_SIZE, //³¤¶È
107 .type = MT_DEVICE //Ó³É䷽ʽ
111 .virtual = RK2818_DWDMA_BASE,
112 .pfn = __phys_to_pfn(RK2818_DWDMA_PHYS),
113 .length = RK2818_DWDMA_SIZE,
118 .virtual = RK2818_INTC_BASE,
119 .pfn = __phys_to_pfn(RK2818_INTC_PHYS),
120 .length = RK2818_INTC_SIZE,
125 .virtual = RK2818_NANDC_BASE,
126 .pfn = __phys_to_pfn(RK2818_NANDC_PHYS),
127 .length = RK2818_NANDC_SIZE,
132 .virtual = RK2818_SDRAMC_BASE,
133 .pfn = __phys_to_pfn(RK2818_SDRAMC_PHYS),
134 .length = RK2818_SDRAMC_SIZE,
139 .virtual = RK2818_ARMDARBITER_BASE,
140 .pfn = __phys_to_pfn(RK2818_ARMDARBITER_PHYS),
141 .length = RK2818_ARMDARBITER_SIZE,
146 .virtual = RK2818_APB_BASE,
147 .pfn = __phys_to_pfn(RK2818_APB_PHYS),
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
159 /*****************************************************************************************
162 *****************************************************************************************/
163 static int rk2818_sdmmc0_io_init(void)
165 rk2818_mux_api_set(GPIOF3_APWM1_MMC0DETN_NAME, IOMUXA_SDMMC1_DETECT_N);
166 rk2818_mux_api_set(GPIOH_MMC0D_SEL_NAME, IOMUXA_SDMMC0_DATA123);
167 rk2818_mux_api_set(GPIOH_MMC0_SEL_NAME, IOMUXA_SDMMC0_CMD_DATA0_CLKOUT);
171 static int rk2818_sdmmc1_io_init(void)
173 rk2818_mux_api_set(GPIOG_MMC1_SEL_NAME, IOMUXA_SDMMC1_CMD_DATA0_CLKOUT);
174 rk2818_mux_api_set(GPIOG_MMC1D_SEL_NAME, IOMUXA_SDMMC1_DATA123);
178 #define CONFIG_SDMMC0_USE_DMA
179 #define CONFIG_SDMMC1_USE_DMA
180 struct rk2818_sdmmc_platform_data default_sdmmc0_data = {
181 .host_ocr_avail = (MMC_VDD_27_28|MMC_VDD_28_29|MMC_VDD_29_30|
182 MMC_VDD_30_31|MMC_VDD_31_32|MMC_VDD_32_33|
183 MMC_VDD_33_34|MMC_VDD_34_35| MMC_VDD_35_36),
184 .host_caps = (MMC_CAP_4_BIT_DATA|MMC_CAP_MMC_HIGHSPEED|MMC_CAP_SD_HIGHSPEED),
185 .io_init = rk2818_sdmmc0_io_init,
187 .dma_name = "sd_mmc",
188 #ifdef CONFIG_SDMMC0_USE_DMA
194 struct rk2818_sdmmc_platform_data default_sdmmc1_data = {
195 .host_ocr_avail = (MMC_VDD_26_27|MMC_VDD_27_28|MMC_VDD_28_29|
196 MMC_VDD_29_30|MMC_VDD_30_31|MMC_VDD_31_32|
197 MMC_VDD_32_33|MMC_VDD_33_34),
198 .host_caps = (MMC_CAP_4_BIT_DATA|MMC_CAP_SDIO_IRQ|
199 MMC_CAP_MMC_HIGHSPEED|MMC_CAP_SD_HIGHSPEED),
200 .io_init = rk2818_sdmmc1_io_init,
203 #ifdef CONFIG_SDMMC1_USE_DMA
210 /*****************************************************************************************
211 * extern gpio devices
213 *****************************************************************************************/
214 #if defined (CONFIG_GPIO_PCA9554)
215 struct rk2818_gpio_expander_info extern_gpio_settinginfo[] = {
217 .gpio_num =RK2818_PIN_PI0,
219 //.pin_value =GPIO_HIGH,
223 .gpio_num =RK2818_PIN_PI4,// tp3
225 //.pin_value =GPIO_HIGH,
229 .gpio_num =RK2818_PIN_PI5,//tp4
231 //.pin_value =GPIO_HIGH,
234 .gpio_num =RK2818_PIN_PI6,//tp2
235 .pin_type = GPIO_OUT,
236 //.pin_value =GPIO_HIGH,
239 .gpio_num =RK2818_PIN_PI7,//tp1
240 .pin_type = GPIO_OUT,
241 .pin_value =GPIO_HIGH,
248 struct pca9554_platform_data rk2818_pca9554_data={
249 .gpio_base=GPIO_EXPANDER_BASE,
250 .gpio_pin_num=CONFIG_EXPANDED_GPIO_NUM,
251 .gpio_irq_start=NR_AIC_IRQS + 2*NUM_GROUP,
252 .irq_pin_num=CONFIG_EXPANDED_GPIO_IRQ_NUM,
253 .pca9954_irq_pin=RK2818_PIN_PE2,
254 .settinginfo=extern_gpio_settinginfo,
255 .settinginfolen=ARRAY_SIZE(extern_gpio_settinginfo),
260 #if defined (CONFIG_IOEXTEND_TCA6424)
261 struct rk2818_gpio_expander_info extgpio_tca6424_settinginfo[] = {
264 .gpio_num = TCA6424_P01,
265 .pin_type = GPIO_OUT,
266 .pin_value = GPIO_LOW,
270 .gpio_num = TCA6424_P02,// tp3
271 .pin_type = GPIO_OUT,
272 .pin_value = GPIO_LOW,
275 .gpio_num = TCA6424_P03,
276 .pin_type = GPIO_OUT,
277 .pin_value = GPIO_LOW,
281 .gpio_num = TCA6424_P04,// tp3
282 .pin_type = GPIO_OUT,
283 .pin_value = GPIO_LOW,
286 .gpio_num = TCA6424_P05,
287 .pin_type = GPIO_OUT,
288 .pin_value = GPIO_LOW,
291 .gpio_num = TCA6424_P12,
293 //.pin_value =GPIO_HIGH,
297 .gpio_num = TCA6424_P13,// tp3
299 //.pin_value =GPIO_HIGH,
302 .gpio_num = TCA6424_P14,
304 //.pin_value =GPIO_HIGH,
308 .gpio_num = TCA6424_P15,// tp3
310 //.pin_value =GPIO_HIGH,
313 .gpio_num = TCA6424_P17,// 3G PowerOn
314 .pin_type = GPIO_OUT,
315 .pin_value =GPIO_HIGH,
319 void tca6424_reset_itr(void)
321 rk2818_mux_api_set(GPIOE_U1IR_I2C1_NAME, IOMUXA_GPIO1_A67);
322 gpio_request(RK2818_PIN_PE6,NULL);
323 gpio_request(RK2818_PIN_PE7,NULL);
325 gpio_direction_output(RK2818_PIN_PE6,GPIO_HIGH);
326 gpio_direction_output(RK2818_PIN_PE7,GPIO_LOW);
328 gpio_set_value(RK2818_PIN_PE7,GPIO_HIGH);
331 gpio_free(RK2818_PIN_PE6);
332 gpio_free(RK2818_PIN_PE7);
333 rk2818_mux_api_set(GPIOE_U1IR_I2C1_NAME, IOMUXA_I2C1);
336 struct tca6424_platform_data rk2818_tca6424_data={
337 .gpio_base=GPIO_EXPANDER_BASE,
338 .gpio_pin_num=CONFIG_EXPANDED_GPIO_NUM,
339 .gpio_irq_start=NR_AIC_IRQS + 2*NUM_GROUP + CONFIG_SPI_FPGA_GPIO_IRQ_NUM,
340 .irq_pin_num=CONFIG_EXPANDED_GPIO_IRQ_NUM,
341 .tca6424_irq_pin=RK2818_PIN_PA1,
342 .settinginfo=extgpio_tca6424_settinginfo,
343 .settinginfolen=ARRAY_SIZE(extgpio_tca6424_settinginfo),
344 .names="extend_gpio_tca6424",
345 .reseti2cpin = tca6424_reset_itr,
349 /*****************************************************************************************
351 *****************************************************************************************/
352 #define GS_IRQ_PIN RK2818_PIN_PE0
354 struct rk2818_gs_platform_data rk2818_gs_platdata = {
355 .gsensor_irq_pin = GS_IRQ_PIN,
358 /*****************************************************************************************
360 * author: cjq@rock-chips.com
361 *****************************************************************************************/
362 static struct wm8994_platform_data wm8994_data = {
370 .headset_call_vol = 0,
371 .speaker_call_vol = 0,
372 .earpiece_call_vol = 0,
376 /*****************************************************************************************
378 * author: kfx@rock-chips.com
379 *****************************************************************************************/
380 static void rk2818_i2c0_io_init(void)
382 rk2818_mux_api_set(GPIOE_I2C0_SEL_NAME, IOMUXA_I2C0);
385 static void rk2818_i2c1_io_init(void)
387 rk2818_mux_api_set(GPIOE_U1IR_I2C1_NAME, IOMUXA_I2C1);
389 struct rk2818_i2c_platform_data default_i2c0_data = {
393 .scl_rate = 400*1000,
394 .mode = I2C_MODE_IRQ,
395 .io_init = rk2818_i2c0_io_init,
397 struct rk2818_i2c_platform_data default_i2c1_data = {
398 #ifdef CONFIG_I2C0_RK2818
405 .scl_rate = 400*1000,
406 .mode = I2C_MODE_IRQ,
407 .io_init = rk2818_i2c1_io_init,
410 struct rk2818_i2c_spi_data default_i2c2_data = {
414 .scl_rate = 400*1000,
417 struct rk2818_i2c_spi_data default_i2c3_data = {
422 .scl_rate = 400*1000,
425 static struct i2c_board_info __initdata board_i2c0_devices[] = {
426 #if defined (CONFIG_RK1000_CONTROL)
428 .type = "rk1000_control",
434 #if defined (CONFIG_RK1000_TVOUT)
436 .type = "rk1000_tvout",
441 #if defined (CONFIG_SND_SOC_RK1000)
443 .type = "rk1000_i2c_codec",
448 #if defined (CONFIG_SND_SOC_WM8988)
455 #if defined (CONFIG_SND_SOC_WM8994)
460 .platform_data = &wm8994_data,
464 static struct i2c_board_info __initdata board_i2c1_devices[] = {
465 #if defined (CONFIG_RTC_HYM8563)
467 .type = "rtc_hym8563",
472 #if defined (CONFIG_FM_QN8006)
479 #if defined (CONFIG_GPIO_PCA9554)
481 .type = "extend_gpio_pca9554",
484 .platform_data=&rk2818_pca9554_data.gpio_base,
487 #if defined (CONFIG_IOEXTEND_TCA6424)
489 .type = "extend_gpio_tca6424",
492 .platform_data=&rk2818_tca6424_data.gpio_base,
496 #if defined (CONFIG_RK2818_REGULATOR_LP8725)
501 .platform_data=&rk2818_lp8725_data,
504 #if defined (CONFIG_GS_MMA7660)
506 .type = "gs_mma7660",
510 .platform_data = &rk2818_gs_platdata,
516 static struct i2c_board_info __initdata board_i2c2_devices[] = {
519 static struct i2c_board_info __initdata board_i2c3_devices[] = {
523 /*****************************************************************************************
525 * author: ddl@rock-chips.com
526 *****************************************************************************************/
527 #ifdef CONFIG_VIDEO_RK2818
529 #define RK2818_CAM_POWER_PIN TCA6424_P16
530 #define RK2818_CAM_RESET_PIN INVALID_GPIO
532 static int rk28_sensor_io_init(void);
533 static int rk28_sensor_io_deinit(void);
535 struct rk28camera_platform_data rk28_camera_platform_data = {
536 .io_init = rk28_sensor_io_init,
537 .io_deinit = rk28_sensor_io_deinit,
540 .gpio_reset = RK2818_CAM_RESET_PIN,
541 .gpio_power = RK2818_CAM_POWER_PIN,
544 .gpio_reset = INVALID_GPIO,
545 .gpio_power = INVALID_GPIO,
551 static int rk28_sensor_io_init(void)
554 unsigned int camera_reset = INVALID_GPIO, camera_power = INVALID_GPIO;
556 printk("\n%s....%d ******** ddl *********\n",__FUNCTION__,__LINE__);
558 for (i=0; i<2; i++) {
559 camera_reset = rk28_camera_platform_data.gpio_res[i].gpio_reset;
560 camera_power = rk28_camera_platform_data.gpio_res[i].gpio_power;
562 if (camera_power != INVALID_GPIO) {
563 ret = gpio_request(camera_power, "camera power");
567 gpio_set_value(camera_reset, 1);
568 gpio_direction_output(camera_power, 0);
571 if (camera_reset != INVALID_GPIO) {
572 ret = gpio_request(camera_reset, "camera reset");
574 if (camera_power != INVALID_GPIO)
575 gpio_free(camera_power);
580 gpio_set_value(camera_reset, 0);
581 gpio_direction_output(camera_reset, 0);
588 static int rk28_sensor_io_deinit(void)
591 unsigned int camera_reset = INVALID_GPIO, camera_power = INVALID_GPIO;
593 printk("\n%s....%d ******** ddl *********\n",__FUNCTION__,__LINE__);
595 for (i=0; i<2; i++) {
596 camera_reset = rk28_camera_platform_data.gpio_res[i].gpio_reset;
597 camera_power = rk28_camera_platform_data.gpio_res[i].gpio_power;
599 if (camera_power != INVALID_GPIO){
600 gpio_direction_input(camera_power);
601 gpio_free(camera_power);
604 if (camera_reset != INVALID_GPIO) {
605 gpio_direction_input(camera_reset);
606 gpio_free(camera_reset);
614 static int rk28_sensor_power(struct device *dev, int on)
616 unsigned int camera_reset = INVALID_GPIO, camera_power = INVALID_GPIO;
618 if(rk28_camera_platform_data.gpio_res[0].dev_name && (strcmp(rk28_camera_platform_data.gpio_res[0].dev_name, dev_name(dev)) == 0)) {
619 camera_reset = rk28_camera_platform_data.gpio_res[0].gpio_reset;
620 camera_power = rk28_camera_platform_data.gpio_res[0].gpio_power;
621 } 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)) {
622 camera_reset = rk28_camera_platform_data.gpio_res[1].gpio_reset;
623 camera_power = rk28_camera_platform_data.gpio_res[1].gpio_power;
626 if (camera_reset != INVALID_GPIO) {
627 gpio_set_value(camera_reset, !on);
628 //printk("\n%s..%s..ResetPin=%d ..PinLevel = %x ******** ddl *********\n",__FUNCTION__,dev_name(dev),camera_reset, on);
630 if (camera_power != INVALID_GPIO) {
631 gpio_set_value(camera_power, !on);
632 printk("\n%s..%s..PowerPin=%d ..PinLevel = %x ******** ddl *********\n",__FUNCTION__,dev_name(dev), camera_power, !on);
634 if (camera_reset != INVALID_GPIO) {
635 msleep(3); /* delay 3 ms */
636 gpio_set_value(camera_reset,on);
637 printk("\n%s..%s..ResetPin= %d..PinLevel = %x ******** ddl *********\n",__FUNCTION__,dev_name(dev), camera_reset, on);
643 #define OV2655_IIC_ADDR 0x60
644 static struct i2c_board_info rk2818_i2c_cam_info[] = {
645 #ifdef CONFIG_SOC_CAMERA_OV2655
647 I2C_BOARD_INFO("ov2655", OV2655_IIC_ADDR>>1)
652 struct soc_camera_link rk2818_iclink = {
653 .bus_id = RK28_CAM_PLATFORM_DEV_ID,
654 .power = rk28_sensor_power,
655 .board_info = &rk2818_i2c_cam_info[0],
657 #ifdef CONFIG_SOC_CAMERA_OV2655
658 .module_name = "ov2655",
663 /*****************************************************************************************
665 * author: lw@rock-chips.com
666 *****************************************************************************************/
667 #define CHARGEOK_PIN RK2818_PIN_PA4
668 struct rk2818_battery_platform_data rk2818_battery_platdata = {
669 .charge_ok_pin = CHARGEOK_PIN,
671 /*****************************************************************************************
673 * author: lhh@rock-chips.com
674 *****************************************************************************************/
675 static int serial_io_init(void)
681 //UART0µÄËĸö¹Ü½ÅÏÈIOMUX³ÉGPIO
682 //È»ºó·Ö±ðÉèÖÃÊäÈëÊä³ö/À¸ßÀµÍ´¦Àí
684 //·ÀÖ¹Ö±½ÓIOMUX³ÉUARTºóËĸö¹Ü½ÅµÄ״̬²»¶Ôʱ
685 //²Ù×÷UARTµ¼ÖÂUART_USR_BUSYʼÖÕΪ1Ôì³ÉÈçÏÂËÀÑ»·
686 //while(rk2818_uart_read(port,UART_USR)&UART_USR_BUSY)
687 //UARTËĸö¹Ü½ÅÔÚδ´«ÊäʱÕý³£×´Ì¬Ó¦¸ÃΪ£º
690 //×¢Ò⣺CTS/RTSΪµÍÓÐЧ£¬Ó²¼þÉϲ»Ó¦¸ÃÇ¿ÐÐ×öÉÏÀ
691 rk2818_mux_api_set(GPIOG1_UART0_MMC1WPT_NAME, IOMUXA_GPIO1_C1 /*IOMUXA_UART0_SOUT*/);
692 rk2818_mux_api_set(GPIOG0_UART0_MMC1DET_NAME, IOMUXA_GPIO1_C0 /*IOMUXA_UART0_SIN*/);
694 ret = gpio_request(RK2818_PIN_PG0, NULL);
697 gpio_free(RK2818_PIN_PG0);
699 gpio_direction_output(RK2818_PIN_PG0,GPIO_HIGH);
702 ret = gpio_request(RK2818_PIN_PG1, NULL);
705 gpio_free(RK2818_PIN_PG1);
707 gpio_direction_output(RK2818_PIN_PG1,GPIO_HIGH);
709 gpio_pull_updown(RK2818_PIN_PG1,GPIOPullUp);
710 gpio_pull_updown(RK2818_PIN_PG0,GPIOPullUp);
712 rk2818_mux_api_set(GPIOG1_UART0_MMC1WPT_NAME, IOMUXA_UART0_SOUT);
713 rk2818_mux_api_set(GPIOG0_UART0_MMC1DET_NAME, IOMUXA_UART0_SIN);
715 rk2818_mux_api_set(GPIOB2_U0CTSN_SEL_NAME, IOMUXB_GPIO0_B2/*IOMUXB_UART0_CTS_N*/);
716 rk2818_mux_api_set(GPIOB3_U0RTSN_SEL_NAME, IOMUXB_GPIO0_B3/*IOMUXB_UART0_RTS_N*/);
718 ret = gpio_request(RK2818_PIN_PB2, NULL);
721 gpio_free(RK2818_PIN_PB2);
723 gpio_direction_input(RK2818_PIN_PB2);
724 // gpio_direction_output(RK2818_PIN_PB2,GPIO_LOW);
726 ret = gpio_request(RK2818_PIN_PB3, NULL);
729 gpio_free(RK2818_PIN_PB3);
731 gpio_direction_output(RK2818_PIN_PB3,GPIO_LOW);
734 rk2818_mux_api_set(GPIOB2_U0CTSN_SEL_NAME, IOMUXB_UART0_CTS_N);
735 rk2818_mux_api_set(GPIOB3_U0RTSN_SEL_NAME, IOMUXB_UART0_RTS_N);
740 struct rk2818_serial_platform_data rk2818_serial0_platdata = {
741 .io_init = serial_io_init,
744 /*****************************************************************************************
746 * author: lhhrock-chips.com
747 *****************************************************************************************/
748 static int i2s_io_init(void)
750 /* Configure the I2S pins in correct mode */
751 rk2818_mux_api_set(CXGPIO_I2S_SEL_NAME,IOMUXB_I2S_INTERFACE);
755 struct rk2818_i2s_platform_data rk2818_i2s_platdata = {
756 .io_init = i2s_io_init,
758 /*****************************************************************************************
760 * author: lhhrock-chips.com
761 *****************************************************************************************/
762 #define SPI_CHIPSELECT_NUM 2
763 struct spi_cs_gpio rk2818_spi_cs_gpios[SPI_CHIPSELECT_NUM] = {
766 .cs_gpio = RK2818_PIN_PB4,
767 .cs_iomux_name = GPIOB4_SPI0CS0_MMC0D4_NAME,//if no iomux,set it NULL
768 .cs_iomux_mode = IOMUXA_GPIO0_B4,
772 .cs_gpio = RK2818_PIN_PB0,
773 .cs_iomux_name = GPIOB0_SPI0CSN1_MMC1PCA_NAME,
774 .cs_iomux_mode = IOMUXA_GPIO0_B0,
779 static int spi_io_init(struct spi_cs_gpio *cs_gpios, int cs_num)
783 rk2818_mux_api_set(GPIOB_SPI0_MMC0_NAME, IOMUXA_SPI0);
786 for (i=0; i<cs_num; i++) {
787 rk2818_mux_api_set(cs_gpios[i].cs_iomux_name, cs_gpios[i].cs_iomux_mode);
788 ret = gpio_request(cs_gpios[i].cs_gpio, cs_gpios[i].name);
791 gpio_free(cs_gpios[j].cs_gpio);
792 rk2818_mux_api_mode_resume(cs_gpios[j].cs_iomux_name);
794 printk("[fun:%s, line:%d], gpio request err\n", __func__, __LINE__);
802 static int spi_io_deinit(struct spi_cs_gpio *cs_gpios, int cs_num)
805 rk2818_mux_api_mode_resume(GPIOB_SPI0_MMC0_NAME);
808 for (i=0; i<cs_num; i++) {
809 gpio_free(cs_gpios[i].cs_gpio);
810 rk2818_mux_api_mode_resume(cs_gpios[i].cs_iomux_name);
817 struct rk2818_spi_platform_data rk2818_spi_platdata = {
818 .num_chipselect = SPI_CHIPSELECT_NUM,//raho ´ó°åÐèÒªÖ§³Ö3¸öƬѡ dxj
819 .chipselect_gpios = rk2818_spi_cs_gpios,
820 .io_init = spi_io_init,
821 .io_deinit = spi_io_deinit,
823 /*****************************************************************************************
824 * xpt2046 touch panel
825 * author: dxjrock-chips.com
826 *****************************************************************************************/
827 #define XPT2046_GPIO_INT RK2818_PIN_PE3
828 #define DEBOUNCE_REPTIME 3
830 #if defined(CONFIG_TOUCHSCREEN_XPT2046_320X480_SPI)
831 static struct xpt2046_platform_data xpt2046_info = {
840 .debounce_rep = DEBOUNCE_REPTIME,
842 .gpio_pendown = XPT2046_GPIO_INT,
843 .penirq_recheck_delay_usecs = 1,
845 #elif defined(CONFIG_TOUCHSCREEN_XPT2046_320X480_CBN_SPI)
846 static struct xpt2046_platform_data xpt2046_info = {
855 .debounce_rep = DEBOUNCE_REPTIME,
857 .gpio_pendown = XPT2046_GPIO_INT,
858 .penirq_recheck_delay_usecs = 1,
860 #elif defined(CONFIG_TOUCHSCREEN_XPT2046_SPI)
861 static struct xpt2046_platform_data xpt2046_info = {
870 .debounce_rep = DEBOUNCE_REPTIME,
872 .gpio_pendown = XPT2046_GPIO_INT,
874 .penirq_recheck_delay_usecs = 1,
876 #elif defined(CONFIG_TOUCHSCREEN_XPT2046_CBN_SPI)
877 static struct xpt2046_platform_data xpt2046_info = {
886 .debounce_rep = DEBOUNCE_REPTIME,
888 .gpio_pendown = XPT2046_GPIO_INT,
890 .penirq_recheck_delay_usecs = 1,
893 static struct spi_board_info board_spi_devices[] = {
894 #if defined(CONFIG_SPI_FPGA)
895 { /* fpga ice65l08xx */
896 .modalias = "spi_fpga",
898 .max_speed_hz = 8 * 1000 * 1000,
903 #if defined(CONFIG_ENC28J60)
905 .modalias = "enc28j60",
907 .max_speed_hz = 12 * 1000 * 1000,
912 #if defined(CONFIG_TOUCHSCREEN_XPT2046_320X480_SPI) || defined(CONFIG_TOUCHSCREEN_XPT2046_320X480_CBN_SPI)\
913 ||defined(CONFIG_TOUCHSCREEN_XPT2046_SPI) || defined(CONFIG_TOUCHSCREEN_XPT2046_CBN_SPI)
915 .modalias = "xpt2046_ts",
917 .max_speed_hz = 125 * 1000 * 26,/* (max sample rate @ 3V) * (cmd + data + overhead) */
919 .irq = XPT2046_GPIO_INT,
920 .platform_data = &xpt2046_info,
925 /*rk2818_fb gpio information*/
926 static struct rk2818_fb_gpio rk2818_fb_gpio_info = {
927 .display_on = (GPIO_LOW<<16)|RK2818_PIN_PB1,
932 /*rk2818_fb iomux information*/
933 static struct rk2818_fb_iomux rk2818_fb_iomux_info = {
934 .data16 = GPIOC_LCDC16BIT_SEL_NAME,
935 .data18 = GPIOC_LCDC18BIT_SEL_NAME,
936 .data24 = GPIOC_LCDC24BIT_SEL_NAME,
937 .den = CXGPIO_LCDDEN_SEL_NAME,
938 .vsync = CXGPIO_LCDVSYNC_SEL_NAME,
942 struct rk2818_fb_mach_info rk2818_fb_mach_info = {
943 .gpio = &rk2818_fb_gpio_info,
944 .iomux = &rk2818_fb_iomux_info,
947 /*****************************************************************************************
949 * author: nzy@rock-chips.com
950 *****************************************************************************************/
952 GPIOF2_APWM0_SEL_NAME, IOMUXB_PWM0
953 GPIOF3_APWM1_MMC0DETN_NAME, IOMUXA_PWM1
954 GPIOF4_APWM2_MMC0WPT_NAME, IOMUXA_PWM2
955 GPIOF5_APWM3_DPWM3_NAME, IOMUXB_PWM3
959 #define PWM_MUX_NAME GPIOF2_APWM0_SEL_NAME
960 #define PWM_MUX_MODE IOMUXB_PWM0
961 #define PWM_EFFECT_VALUE 0
964 #define BL_EN_MUX_NAME GPIOF34_UART3_SEL_NAME
965 #define BL_EN_MUX_MODE IOMUXB_GPIO1_B34
967 #define BL_EN_PIN RK2818_PIN_PF3
968 #define BL_EN_VALUE GPIO_HIGH
972 static int rk2818_backlight_io_init(void)
976 rk2818_mux_api_set(PWM_MUX_NAME, PWM_MUX_MODE);
978 rk2818_mux_api_set(BL_EN_MUX_NAME, BL_EN_MUX_MODE);
980 ret = gpio_request(BL_EN_PIN, NULL);
983 gpio_free(BL_EN_PIN);
984 printk(KERN_ERR ">>>>>> lcd_cs gpio_request err \n ");
987 gpio_direction_output(BL_EN_PIN, 0);
988 gpio_set_value(BL_EN_PIN, BL_EN_VALUE);
993 static int rk2818_backlight_io_deinit(void)
997 gpio_free(BL_EN_PIN);
999 rk2818_mux_api_mode_resume(PWM_MUX_NAME);
1001 rk2818_mux_api_mode_resume(BL_EN_MUX_NAME);
1005 struct rk2818_bl_info rk2818_bl_info = {
1007 .bl_ref = PWM_EFFECT_VALUE,
1008 .io_init = rk2818_backlight_io_init,
1009 .io_deinit = rk2818_backlight_io_deinit,
1012 /********************************************************
1013 * dm9000 net work devices
1015 ********************************************************/
1016 #ifdef CONFIG_DM9000
1018 GPIOA5_FLASHCS1_SEL_NAME IOMUXB_FLASH_CS1
1019 GPIOA6_FLASHCS2_SEL_NAME IOMUXB_FLASH_CS2
1020 GPIOA7_FLASHCS3_SEL_NAME IOMUXB_FLASH_CS3
1021 GPIOE_SPI1_FLASH_SEL1_NAME IOMUXA_FLASH_CS45
1022 GPIOE_SPI1_FLASH_SEL_NAME IOMUXA_FLASH_CS67
1024 #define DM9000_USE_NAND_CS 1 //cs can be 1,2,3,4,5,6 or 7
1025 #define DM9000_CS_IOMUX_NAME GPIOA5_FLASHCS1_SEL_NAME
1026 #define DM9000_CS_IOMUX_MODE IOMUXB_FLASH_CS1
1027 #define DM9000_NET_INT_PIN RK2818_PIN_PA3
1028 #define DM9000_INT_IOMUX_NAME GPIOA23_UART2_SEL_NAME
1029 #define DM9000_INT_IOMUX_MODE IOMUXB_GPIO0_A23
1030 #define DM9000_INT_INIT_VALUE GPIOPullDown
1031 #define DM9000_IRQ IRQF_TRIGGER_HIGH
1032 #define DM9000_IO_ADDR (RK2818_NANDC_PHYS + 0x800 + DM9000_USE_NAND_CS*0x100 + 0x8)
1033 #define DM9000_DATA_ADDR (RK2818_NANDC_PHYS + 0x800 + DM9000_USE_NAND_CS*0x100 + 0x4)
1035 static int dm9k_gpio_set(void)
1038 rk2818_mux_api_set(DM9000_CS_IOMUX_NAME, DM9000_CS_IOMUX_MODE);
1040 rk2818_mux_api_set(DM9000_INT_IOMUX_NAME, DM9000_INT_IOMUX_MODE);
1044 static int dm9k_gpio_free(void)
1046 rk2818_mux_api_mode_resume(DM9000_INT_IOMUX_NAME);
1047 rk2818_mux_api_mode_resume(DM9000_CS_IOMUX_NAME);
1051 static struct resource dm9k_resource[] = {
1053 .start = DM9000_IO_ADDR,
1054 .end = DM9000_IO_ADDR + 3,
1055 .flags = IORESOURCE_MEM,
1058 .start = DM9000_DATA_ADDR,
1059 .end = DM9000_DATA_ADDR + 3,
1060 .flags = IORESOURCE_MEM,
1063 .start = DM9000_NET_INT_PIN,
1064 .end = DM9000_NET_INT_PIN,
1065 .flags = IORESOURCE_IRQ | DM9000_IRQ,
1070 /* for the moment we limit ourselves to 8bit IO until some
1071 * better IO routines can be written and tested
1073 struct dm9000_plat_data dm9k_platdata = {
1074 .flags = DM9000_PLATF_8BITONLY,
1075 .irq_pin = DM9000_NET_INT_PIN,
1076 .irq_pin_value = DM9000_INT_INIT_VALUE,
1077 .io_init = dm9k_gpio_set,
1078 .io_deinit = dm9k_gpio_free,
1081 struct platform_device rk2818_device_dm9k = {
1084 .num_resources = ARRAY_SIZE(dm9k_resource),
1085 .resource = dm9k_resource,
1087 .platform_data = &dm9k_platdata,
1093 /*****************************************************************************************
1094 * nand flash devices
1095 * author: hxy@rock-chips.com
1096 *****************************************************************************************/
1098 GPIOA5_FLASHCS1_SEL_NAME, IOMUXB_FLASH_CS1
1099 GPIOA6_FLASHCS2_SEL_NAME, IOMUXB_FLASH_CS2
1100 GPIOA7_FLASHCS3_SEL_NAME, IOMUXB_FLASH_CS3
1101 GPIOE_SPI1_FLASH_SEL1_NAME, IOMUXA_FLASH_CS45
1102 GPIOE_SPI1_FLASH_SEL_NAME, IOMUXA_FLASH_CS67
1105 #define NAND_CS_MAX_NUM 1 /*form 0 to 8, it is 0 when no nand flash */
1107 int rk2818_nand_io_init(void)
1109 #if (NAND_CS_MAX_NUM == 2)
1110 rk2818_mux_api_set(GPIOA5_FLASHCS1_SEL_NAME, IOMUXB_FLASH_CS1);
1111 #elif (NAND_CS_MAX_NUM == 3)
1112 rk2818_mux_api_set(GPIOA5_FLASHCS1_SEL_NAME, IOMUXB_FLASH_CS1);
1113 rk2818_mux_api_set(GPIOA6_FLASHCS2_SEL_NAME, IOMUXB_FLASH_CS2);
1114 #elif (NAND_CS_MAX_NUM == 4)
1115 rk2818_mux_api_set(GPIOA5_FLASHCS1_SEL_NAME, IOMUXB_FLASH_CS1);
1116 rk2818_mux_api_set(GPIOA6_FLASHCS2_SEL_NAME, IOMUXB_FLASH_CS2);
1117 rk2818_mux_api_set(GPIOA7_FLASHCS3_SEL_NAME, IOMUXB_FLASH_CS3);
1118 #elif ((NAND_CS_MAX_NUM == 5) || (NAND_CS_MAX_NUM == 6))
1119 rk2818_mux_api_set(GPIOA5_FLASHCS1_SEL_NAME, IOMUXB_FLASH_CS1);
1120 rk2818_mux_api_set(GPIOA6_FLASHCS2_SEL_NAME, IOMUXB_FLASH_CS2);
1121 rk2818_mux_api_set(GPIOA7_FLASHCS3_SEL_NAME, IOMUXB_FLASH_CS3);
1122 rk2818_mux_api_set(GPIOE_SPI1_FLASH_SEL1_NAME, IOMUXA_FLASH_CS45);
1123 #elif ((NAND_CS_MAX_NUM == 7) || (NAND_CS_MAX_NUM == 8))
1124 rk2818_mux_api_set(GPIOA5_FLASHCS1_SEL_NAME, IOMUXB_FLASH_CS1);
1125 rk2818_mux_api_set(GPIOA6_FLASHCS2_SEL_NAME, IOMUXB_FLASH_CS2);
1126 rk2818_mux_api_set(GPIOA7_FLASHCS3_SEL_NAME, IOMUXB_FLASH_CS3);
1127 rk2818_mux_api_set(GPIOE_SPI1_FLASH_SEL1_NAME, IOMUXA_FLASH_CS45);
1128 rk2818_mux_api_set(GPIOE_SPI1_FLASH_SEL_NAME, IOMUXA_FLASH_CS67);
1133 struct rk2818_nand_platform_data rk2818_nand_data = {
1134 .width = 1, /* data bus width in bytes */
1135 .hw_ecc = 1, /* hw ecc 0: soft ecc */
1137 .io_init = rk2818_nand_io_init,
1141 /*****************************************/
1143 static struct platform_device *devices[] __initdata = {
1144 &rk2818_device_uart1,
1145 #ifdef CONFIG_I2C0_RK2818
1146 &rk2818_device_i2c0,
1148 #ifdef CONFIG_I2C1_RK2818
1149 &rk2818_device_i2c1,
1151 #ifdef CONFIG_SDMMC0_RK2818
1152 &rk2818_device_sdmmc0,
1154 #ifdef CONFIG_SDMMC1_RK2818
1155 &rk2818_device_sdmmc1,
1157 &rk2818_device_spim,
1159 #if defined(CONFIG_ANDROID_PMEM)
1160 &rk2818_device_pmem,
1161 &rk2818_device_pmem_dsp,
1164 &rk2818_device_adckey,
1165 &rk2818_device_battery,
1167 &rk2818_device_backlight,
1169 #ifdef CONFIG_VIDEO_RK2818
1170 &rk2818_device_camera, /* ddl@rock-chips.com : camera support */
1171 &rk2818_soc_camera_pdrv,
1173 #ifdef CONFIG_MTD_NAND_RK2818
1174 &rk2818_nand_device,
1176 #ifdef CONFIG_DM9000
1177 &rk2818_device_dm9k,
1180 #ifdef CONFIG_DWC_OTG
1181 &rk2818_device_dwc_otg,
1183 #ifdef CONFIG_RK2818_HOST11
1184 &rk2818_device_host11,
1186 #ifdef CONFIG_USB_ANDROID
1187 &android_usb_device,
1188 &usb_mass_storage_device,
1193 extern struct sys_timer rk2818_timer;
1194 #define POWER_PIN RK2818_PIN_PH7
1195 static void rk2818_power_on(void)
1198 ret = gpio_request(POWER_PIN, NULL);
1200 printk("failed to request power_off gpio\n");
1204 gpio_pull_updown(POWER_PIN, GPIOPullUp);
1205 ret = gpio_direction_output(POWER_PIN, GPIO_HIGH);
1207 printk("failed to set power_off gpio output\n");
1211 gpio_set_value(POWER_PIN, 1);/*power on*/
1214 gpio_free(POWER_PIN);
1217 static void rk2818_power_off(void)
1219 printk("shut down system now ...\n");
1220 gpio_set_value(POWER_PIN, 0);/*power down*/
1223 void lcd_set_iomux(u8 enable)
1229 rk2818_mux_api_set(GPIOH6_IQ_SEL_NAME, 0);
1230 ret = gpio_request(RK2818_PIN_PH6, NULL);
1233 gpio_free(RK2818_PIN_PH6);
1234 printk(">>>>>> lcd cs gpio_request err \n ");
1238 rk2818_mux_api_set(GPIOE_U1IR_I2C1_NAME, 0);
1240 ret = gpio_request(RK2818_PIN_PE7, NULL);
1243 gpio_free(RK2818_PIN_PE7);
1244 printk(">>>>>> lcd clk gpio_request err \n ");
1248 ret = gpio_request(RK2818_PIN_PE6, NULL);
1251 gpio_free(RK2818_PIN_PE6);
1252 printk(">>>>>> lcd txd gpio_request err \n ");
1258 gpio_free(RK2818_PIN_PH6);
1259 rk2818_mux_api_mode_resume(GPIOH6_IQ_SEL_NAME);
1261 gpio_free(RK2818_PIN_PE7);
1262 gpio_free(RK2818_PIN_PE6);
1263 rk2818_mux_api_mode_resume(GPIOE_U1IR_I2C1_NAME);
1271 struct lcd_td043mgea1_data lcd_td043mgea1 = {
1272 .pin_txd = RK2818_PIN_PE6,
1273 .pin_clk = RK2818_PIN_PE7,
1274 .pin_cs = RK2818_PIN_PH6,
1275 .screen_set_iomux = lcd_set_iomux,
1279 #define PLAY_ON_PIN RK2818_PIN_PE1
1280 #define PLAY_ON_LEVEL 1
1281 static ADC_keyst gAdcValueTab[] =
1283 {95, AD2KEY1},///VOLUME_DOWN
1284 {249, AD2KEY2},///VOLUME_UP
1285 {408, AD2KEY3},///MENU
1286 {560, AD2KEY4},///HOME
1287 {725, AD2KEY5},///BACK
1288 {816, AD2KEY6},///CALL
1292 static unsigned char gInitKeyCode[] =
1294 AD2KEY1,AD2KEY2,AD2KEY3,AD2KEY4,AD2KEY5,AD2KEY6,
1295 ENDCALL,KEYSTART,KEY_WAKEUP,
1298 struct adc_key_data rk2818_adc_key = {
1299 .pin_playon = PLAY_ON_PIN,
1300 .playon_level = PLAY_ON_LEVEL,
1305 .adc_key_table = gAdcValueTab,
1306 .initKeyCode = gInitKeyCode,
1309 struct rk2818_adckey_platform_data rk2818_adckey_platdata = {
1310 .adc_key = &rk2818_adc_key,
1312 #if CONFIG_ANDROID_TIMED_GPIO
1313 struct timed_gpio_platform_data rk28_vibrator_info = {
1318 static void __init machine_rk2818_init_irq(void)
1321 rk2818_gpio_init(rk2818_gpioBank, 8);
1322 rk2818_gpio_irq_setup();
1325 static void __init machine_rk2818_board_init(void)
1328 pm_power_off = rk2818_power_off;
1329 #ifdef CONFIG_I2C0_RK2818
1330 i2c_register_board_info(default_i2c0_data.bus_num, board_i2c0_devices,
1331 ARRAY_SIZE(board_i2c0_devices));
1333 #ifdef CONFIG_I2C1_RK2818
1334 i2c_register_board_info(default_i2c1_data.bus_num, board_i2c1_devices,
1335 ARRAY_SIZE(board_i2c1_devices));
1337 #ifdef CONFIG_SPI_FPGA_I2C
1338 i2c_register_board_info(default_i2c2_data.bus_num, board_i2c2_devices,
1339 ARRAY_SIZE(board_i2c2_devices));
1340 i2c_register_board_info(default_i2c3_data.bus_num, board_i2c3_devices,
1341 ARRAY_SIZE(board_i2c3_devices));
1343 platform_add_devices(devices, ARRAY_SIZE(devices));
1344 spi_register_board_info(board_spi_devices, ARRAY_SIZE(board_spi_devices));
1345 //rk2818_mux_api_set(GPIOB4_SPI0CS0_MMC0D4_NAME,IOMUXA_GPIO0_B4); //IOMUXA_SPI0_CSN0);//use for gpio SPI CS0
1346 //rk2818_mux_api_set(GPIOB0_SPI0CSN1_MMC1PCA_NAME,IOMUXA_GPIO0_B0); //IOMUXA_SPI0_CSN1);//use for gpio SPI CS1
1347 //rk2818_mux_api_set(GPIOB_SPI0_MMC0_NAME,IOMUXA_SPI0);//use for SPI CLK SDI SDO
1350 static void __init machine_rk2818_mapio(void)
1352 iotable_init(rk2818_io_desc, ARRAY_SIZE(rk2818_io_desc));
1353 rk2818_clock_init();
1354 rk2818_iomux_init();
1357 MACHINE_START(RK2818, "RK28board")
1359 /* UART for LL DEBUG */
1360 .phys_io = 0x18002000,
1361 .io_pg_offst = ((0xFF100000) >> 18) & 0xfffc,
1362 .boot_params = RK2818_SDRAM_PHYS + 0x88000,
1363 .map_io = machine_rk2818_mapio,
1364 .init_irq = machine_rk2818_init_irq,
1365 .init_machine = machine_rk2818_board_init,
1366 .timer = &rk2818_timer,