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>
25 #include <linux/circ_buf.h>
26 #include <linux/miscdevice.h>
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>
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 */
42 #include <linux/mtd/nand.h>
43 #include <linux/mtd/partitions.h>
44 #include <linux/dm9000.h>
46 #include <media/soc_camera.h> /* ddl@rock-chips.com : camera support */
51 #include "../../../drivers/spi/rk2818_spim.h"
52 #include <linux/regulator/rk2818_lp8725.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 void rk2818_sdmmc0_cfg_gpio(struct platform_device *dev)
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);
168 rk2818_mux_api_set(GPIOF3_APWM1_MMC0DETN_NAME, IOMUXA_SDMMC1_DETECT_N);
172 void rk2818_sdmmc1_cfg_gpio(struct platform_device *dev)
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);
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);
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,
194 .dma_name = "sd_mmc",
195 #ifdef CONFIG_SDMMC0_USE_DMA
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,
210 #ifdef CONFIG_SDMMC1_USE_DMA
217 /*****************************************************************************************
218 * extern gpio devices
220 *****************************************************************************************/
221 #if defined (CONFIG_GPIO_PCA9554)
222 struct rk2818_gpio_expander_info extern_gpio_settinginfo[] = {
224 .gpio_num =RK2818_PIN_PI0,
226 //.pin_value =GPIO_HIGH,
230 .gpio_num =RK2818_PIN_PI4,// tp3
232 //.pin_value =GPIO_HIGH,
236 .gpio_num =RK2818_PIN_PI5,//tp4
238 //.pin_value =GPIO_HIGH,
241 .gpio_num =RK2818_PIN_PI6,//tp2
242 .pin_type = GPIO_OUT,
243 //.pin_value =GPIO_HIGH,
246 .gpio_num =RK2818_PIN_PI7,//tp1
247 .pin_type = GPIO_OUT,
248 .pin_value =GPIO_HIGH,
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),
267 /*****************************************************************************************
268 *regulator devices drivers/regulator/rk2818_lp8725.c linux/regulator/rk2818_lp8725.h
270 *****************************************************************************************/
271 #if defined (CONFIG_RK2818_REGULATOR_LP8725)
272 /*ldo1 2V8OUT USB2.5V LCD_VCC*/
273 static struct regulator_consumer_supply ldo1_consumers[] = {
279 static struct regulator_init_data rk2818_lp8725_ldo1_data = {
285 .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE,
287 .num_consumer_supplies = ARRAY_SIZE(ldo1_consumers),
288 .consumer_supplies = ldo1_consumers,
291 /*ldo2 CAMERA_1V8 SD_CARD*/
292 static struct regulator_consumer_supply ldo2_consumers[] = {
298 static struct regulator_init_data rk2818_lp8725_ldo2_data = {
304 .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE,
306 .num_consumer_supplies = ARRAY_SIZE(ldo2_consumers),
307 .consumer_supplies = ldo2_consumers,
310 /*ldo3 VCC_NAND WIFI/BT/FM_BCM4325*/
311 static struct regulator_consumer_supply ldo3_consumers[] = {
317 static struct regulator_init_data rk2818_lp8725_ldo3_data = {
323 .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE,
325 .num_consumer_supplies = ARRAY_SIZE(ldo3_consumers),
326 .consumer_supplies = ldo3_consumers,
329 /*ldo4 VCCA CODEC_WM8994*/
330 static struct regulator_consumer_supply ldo4_consumers[] = {
336 static struct regulator_init_data rk2818_lp8725_ldo4_data = {
342 .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE,
344 .num_consumer_supplies = ARRAY_SIZE(ldo4_consumers),
345 .consumer_supplies = ldo4_consumers,
348 /*ldo5 AVDD18 CODEC_WM8994*/
349 static struct regulator_consumer_supply ldo5_consumers[] = {
355 static struct regulator_init_data rk2818_lp8725_ldo5_data = {
361 .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE,
363 .num_consumer_supplies = ARRAY_SIZE(ldo5_consumers),
364 .consumer_supplies = ldo5_consumers,
367 /*lilo1 VCCIO Sensor£¨3M£©*/
368 static struct regulator_consumer_supply lilo1_consumers[] = {
374 static struct regulator_init_data rk2818_lp8725_lilo1_data = {
380 .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE,
382 .num_consumer_supplies = ARRAY_SIZE(lilo1_consumers),
383 .consumer_supplies = lilo1_consumers
386 /*lilo2 VCC33_SD Sensor£¨3M£©*/
387 static struct regulator_consumer_supply lilo2_consumers[] = {
393 static struct regulator_init_data rk2818_lp8725_lilo2_data = {
399 .valid_ops_mask = REGULATOR_CHANGE_STATUS | REGULATOR_CHANGE_VOLTAGE,
401 .num_consumer_supplies = ARRAY_SIZE(lilo2_consumers),
402 .consumer_supplies = lilo2_consumers
406 static struct regulator_consumer_supply buck1_consumers[] = {
412 static struct regulator_init_data rk2818_lp8725_buck1_data = {
419 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
421 .num_consumer_supplies = ARRAY_SIZE(buck1_consumers),
422 .consumer_supplies = buck1_consumers
425 /*buck2 VDDDR MobileDDR VCC*/
426 static struct regulator_consumer_supply buck2_consumers[] = {
432 static struct regulator_init_data rk2818_lp8725_buck2_data = {
439 .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
441 .num_consumer_supplies = ARRAY_SIZE(buck2_consumers),
442 .consumer_supplies = buck2_consumers
448 struct lp8725_regulator_subdev rk2818_lp8725_regulator_subdev[] = {
451 .initdata=&rk2818_lp8725_ldo1_data,
456 .initdata=&rk2818_lp8725_ldo2_data,
461 .initdata=&rk2818_lp8725_ldo3_data,
466 .initdata=&rk2818_lp8725_ldo4_data,
471 .initdata=&rk2818_lp8725_ldo5_data,
476 .initdata=&rk2818_lp8725_lilo1_data,
481 .initdata=&rk2818_lp8725_lilo2_data,
486 .initdata=&rk2818_lp8725_buck1_data,
491 .initdata=&rk2818_lp8725_buck2_data,
496 struct lp8725_platform_data rk2818_lp8725_data={
497 .num_regulators=LP8725_NUM_REGULATORS,
498 .regulators=rk2818_lp8725_regulator_subdev,
502 /*****************************************************************************************
505 *****************************************************************************************/
506 void rk2818_i2c0_cfg_gpio(struct platform_device *dev)
508 rk2818_mux_api_set(GPIOE_I2C0_SEL_NAME, IOMUXA_I2C0);
511 void rk2818_i2c1_cfg_gpio(struct platform_device *dev)
513 rk2818_mux_api_set(GPIOE_U1IR_I2C1_NAME, IOMUXA_I2C1);
515 struct rk2818_i2c_platform_data default_i2c0_data = {
519 .scl_rate = 400*1000,
520 .mode = I2C_MODE_IRQ, //I2C_MODE_POLL
521 .cfg_gpio = rk2818_i2c0_cfg_gpio,
523 struct rk2818_i2c_platform_data default_i2c1_data = {
524 #ifdef CONFIG_I2C0_RK2818
531 .scl_rate = 400*1000,
532 .mode = I2C_MODE_IRQ, //I2C_MODE_POLL
533 .cfg_gpio = rk2818_i2c1_cfg_gpio,
536 struct rk2818_i2c_spi_data default_i2c2_data = {
540 .scl_rate = 400*1000,
543 struct rk2818_i2c_spi_data default_i2c3_data = {
548 .scl_rate = 400*1000,
551 static struct i2c_board_info __initdata board_i2c0_devices[] = {
552 #if defined (CONFIG_RK1000_CONTROL)
554 .type = "rk1000_control",
560 #if defined (CONFIG_RK1000_TVOUT)
562 .type = "rk1000_tvout",
567 #if defined (CONFIG_SND_SOC_RK1000)
569 .type = "rk1000_i2c_codec",
574 #if defined (CONFIG_SND_SOC_WM8988)
582 static struct i2c_board_info __initdata board_i2c1_devices[] = {
583 #if defined (CONFIG_RTC_HYM8563)
585 .type = "rtc_hym8563",
590 #if defined (CONFIG_RTC_DRV_S35392A)
592 .type = "rtc-s35392a",
597 #if defined (CONFIG_FM_QN8006)
604 #if defined (CONFIG_GPIO_PCA9554)
606 .type = "extend_gpio_pca9554",
609 .platform_data=&rk2818_pca9554_data.gpio_base,
612 #if defined (CONFIG_RK2818_REGULATOR_LP8725)
617 .platform_data=&rk2818_lp8725_data,
620 #if defined (CONFIG_GS_MMA7660)
622 .type = "gs_mma7660",
625 .irq = RK2818_PIN_PE3,
631 static struct i2c_board_info __initdata board_i2c2_devices[] = {
634 static struct i2c_board_info __initdata board_i2c3_devices[] = {
635 #if defined (CONFIG_SND_SOC_WM8994)
644 static void spi_xpt2046_cs_control(u32 command)
648 gpio_direction_output(RK2818_PIN_PF5, GPIO_LOW);
652 gpio_direction_output(RK2818_PIN_PF5, GPIO_HIGH);
656 struct rk2818_spi_chip spi_xpt2046_info = {
657 .cs_control = spi_xpt2046_cs_control,
661 /*****************************************************************************************
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
668 static int rk28_sensor_init(void);
669 static int rk28_sensor_deinit(void);
671 struct rk28camera_platform_data rk28_camera_platform_data = {
672 .init = rk28_sensor_init,
673 .deinit = rk28_sensor_deinit,
676 .gpio_reset = RK2818_CAM_RESET_PIN,
677 .gpio_power = RK2818_CAM_POWER_PIN,
680 .gpio_reset = 0xFFFFFFFF,
681 .gpio_power = 0xFFFFFFFF,
687 static int rk28_sensor_init(void)
690 unsigned int camera_reset=0xffffffff,camera_power=0xffffffff;
692 printk("\n%s....%d ******** ddl *********\n",__FUNCTION__,__LINE__);
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;
698 if (camera_power != 0xffffffff) {
699 ret = gpio_request(camera_power, "camera power");
703 gpio_set_value(camera_reset, 1);
704 gpio_direction_output(camera_power, 0);
707 if (camera_reset != 0xffffffff) {
708 ret = gpio_request(camera_reset, "camera reset");
710 if (camera_power != 0xffffffff)
711 gpio_free(camera_power);
716 gpio_set_value(camera_reset, 0);
717 gpio_direction_output(camera_reset, 0);
724 static int rk28_sensor_deinit(void)
727 unsigned int camera_reset=0xffffffff,camera_power=0xffffffff;
729 printk("\n%s....%d ******** ddl *********\n",__FUNCTION__,__LINE__);
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;
735 if (camera_power != 0xffffffff){
736 gpio_direction_input(camera_power);
737 gpio_free(camera_power);
740 if (camera_reset != 0xffffffff) {
741 gpio_direction_input(camera_reset);
742 gpio_free(camera_reset);
750 static int rk28_sensor_power(struct device *dev, int on)
752 unsigned int camera_reset=0xffffffff,camera_power=0xffffffff;
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;
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);
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);
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);
779 #define OV2655_IIC_ADDR 0x60
780 static struct i2c_board_info rk2818_i2c_cam_info[] = {
781 #ifdef CONFIG_SOC_CAMERA_OV2655
783 I2C_BOARD_INFO("ov2655", OV2655_IIC_ADDR>>1)
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],
793 #ifdef CONFIG_SOC_CAMERA_OV2655
794 .module_name = "ov2655",
799 /*****************************************************************************************
802 *****************************************************************************************/
803 static struct spi_board_info board_spi_devices[] = {
804 #if defined(CONFIG_SPI_FPGA)
805 { /* fpga ice65l08xx */
806 .modalias = "spi_fpga",
808 .max_speed_hz = 8 * 1000 * 1000,
813 #if defined(CONFIG_ENC28J60)
815 .modalias = "enc28j60",
817 .max_speed_hz = 12 * 1000 * 1000,
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)
825 .modalias = "xpt2046_ts",
827 .max_speed_hz = 125 * 1000 * 26,/* (max sample rate @ 3V) * (cmd + data + overhead) */
829 .controller_data = &spi_xpt2046_info,
830 .irq = RK2818_PIN_PE1,
835 /*rk2818_fb gpio information*/
836 static struct rk2818_fb_gpio rk2818_fb_gpio_info = {
837 .display_on = (GPIO_LOW<<16)|RK2818_PIN_PA2,
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,
852 struct rk2818_fb_mach_info rk2818_fb_mach_info = {
853 .gpio = &rk2818_fb_gpio_info,
854 .iomux = &rk2818_fb_iomux_info,
857 struct rk2818bl_info rk2818_bl_info = {
859 .pw_pin = GPIO_HIGH | (RK2818_PIN_PF3<< 8) ,
861 .pw_iomux = GPIOF34_UART3_SEL_NAME,
864 /********************************************************
865 * dm9000 net work devices
867 ********************************************************/
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
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)
887 int dm9k_gpio_set(void)
890 rk2818_mux_api_set(DM9000_CS_IOMUX_NAME, DM9000_CS_IOMUX_MODE);
893 rk2818_mux_api_set(DM9000_INT_IOMUX_NAME, DM9000_INT_IOMUX_MODE);
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__);
903 gpio_pull_updown(DM9000_NET_INT_PIN, DM9000_INT_INIT_VALUE);
904 gpio_direction_input(DM9000_NET_INT_PIN);
908 int dm9k_gpio_free(void)
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);
915 int dm9k_get_gpio_irq(void)
917 return gpio_to_irq(DM9000_NET_INT_PIN);
920 static struct resource dm9k_resource[] = {
922 .start = DM9000_IO_ADDR,
923 .end = DM9000_IO_ADDR + 3,
924 .flags = IORESOURCE_MEM,
927 .start = DM9000_DATA_ADDR,
928 .end = DM9000_DATA_ADDR + 3,
929 .flags = IORESOURCE_MEM,
932 .start = DM9000_NET_INT_PIN,
933 .end = DM9000_NET_INT_PIN,
934 .flags = IORESOURCE_IRQ | DM9000_IRQ,
939 /* for the moment we limit ourselves to 8bit IO until some
940 * better IO routines can be written and tested
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,
949 struct platform_device rk2818_device_dm9k = {
952 .num_resources = ARRAY_SIZE(dm9k_resource),
953 .resource = dm9k_resource,
955 .platform_data = &dm9k_platdata,
960 static struct platform_device *devices[] __initdata = {
962 &rk2818_device_rfkill,
964 &rk2818_device_uart0,
965 &rk2818_device_uart1,
966 #ifdef CONFIG_I2C0_RK2818
969 #ifdef CONFIG_I2C1_RK2818
972 #ifdef CONFIG_SDMMC0_RK2818
973 &rk2818_device_sdmmc0,
975 #ifdef CONFIG_SDMMC1_RK2818
976 &rk2818_device_sdmmc1,
980 #if defined(CONFIG_ANDROID_PMEM)
982 &rk2818_device_pmem_dsp,
985 &rk2818_device_adckey,
986 &rk2818_device_battery,
988 &rk2818_device_backlight,
991 #ifdef CONFIG_VIDEO_RK2818
992 &rk2818_device_camera, /* ddl@rock-chips.com : camera support */
993 &rk2818_soc_camera_pdrv,
996 #ifdef CONFIG_MTD_NAND_RK2818
1000 &rk2818_device_dm9k,
1003 #ifdef CONFIG_DWC_OTG
1004 &rk2818_device_dwc_otg,
1006 #ifdef CONFIG_RK2818_HOST11
1007 &rk2818_device_host11,
1009 #ifdef CONFIG_USB_ANDROID
1010 &android_usb_device,
1011 &usb_mass_storage_device,
1013 #ifdef CONFIG_ANDROID_TIMED_GPIO
1014 &rk28_device_vibrator,
1018 extern struct sys_timer rk2818_timer;
1019 #define POWER_PIN RK2818_PIN_PB1
1020 static void rk2818_power_on(void)
1023 ret = gpio_request(POWER_PIN, NULL);
1025 printk("failed to request power_off gpio\n");
1029 gpio_pull_updown(POWER_PIN, GPIOPullUp);
1030 ret = gpio_direction_output(POWER_PIN, GPIO_HIGH);
1032 printk("failed to set power_off gpio output\n");
1036 gpio_set_value(POWER_PIN, 1);/*power on*/
1039 gpio_free(POWER_PIN);
1042 static void rk2818_power_off(void)
1044 printk("shut down system now ...\n");
1045 gpio_set_value(POWER_PIN, 0);/*power down*/
1048 void lcd_set_iomux(u8 enable)
1054 rk2818_mux_api_set(GPIOH6_IQ_SEL_NAME, 0);
1055 ret = gpio_request(RK2818_PIN_PH6, NULL);
1058 gpio_free(RK2818_PIN_PH6);
1059 printk(">>>>>> lcd cs gpio_request err \n ");
1063 rk2818_mux_api_set(GPIOE_I2C0_SEL_NAME, 1);
1065 ret = gpio_request(RK2818_PIN_PE4, NULL);
1068 gpio_free(RK2818_PIN_PE4);
1069 printk(">>>>>> lcd clk gpio_request err \n ");
1073 ret = gpio_request(RK2818_PIN_PE5, NULL);
1076 gpio_free(RK2818_PIN_PE5);
1077 printk(">>>>>> lcd txd gpio_request err \n ");
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);
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);
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,
1106 static ADC_keyst gAdcValueTab[] =
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
1118 static unsigned char gInitKeyCode[] =
1120 AD2KEY1,AD2KEY2,AD2KEY3,AD2KEY4,AD2KEY5,AD2KEY6,AD2KEY7,
1121 ENDCALL,KEYSTART,KEY_WAKEUP,
1124 struct adc_key_data rk2818_adc_key = {
1125 .pin_playon = RK2818_PIN_PA3,
1131 .adc_key_table = gAdcValueTab,
1132 .initKeyCode = gInitKeyCode,
1136 static void __init machine_rk2818_init_irq(void)
1139 rk2818_gpio_init(rk2818_gpioBank, 8);
1140 rk2818_gpio_irq_setup();
1143 static void __init machine_rk2818_board_init(void)
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));
1151 #ifdef CONFIG_I2C1_RK2818
1152 i2c_register_board_info(default_i2c1_data.bus_num, board_i2c1_devices,
1153 ARRAY_SIZE(board_i2c1_devices));
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));
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
1167 rk2818_mux_api_set(GPIOF5_APWM3_DPWM3_NAME,IOMUXB_GPIO1_B5);
1168 if(0 != gpio_request(RK2818_PIN_PF5, NULL))
1170 gpio_free(RK2818_PIN_PF5);
1171 printk(">>>>>> RK2818_PIN_PF5 gpio_request err \n ");
1175 static void __init machine_rk2818_mapio(void)
1177 iotable_init(rk2818_io_desc, ARRAY_SIZE(rk2818_io_desc));
1178 rk2818_clock_init();
1179 rk2818_iomux_init();
1182 MACHINE_START(RK2818, "RK28board")
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,