From: root Date: Mon, 16 Aug 2010 10:53:23 +0000 (+0800) Subject: adapt all kind of board X-Git-Tag: firefly_0821_release~11263 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=0546cd576dd6d6107ca24e5e4621448a051d3fa5;p=firefly-linux-kernel-4.4.55.git adapt all kind of board --- diff --git a/arch/arm/mach-rk2818/board-infosdk.c b/arch/arm/mach-rk2818/board-infosdk.c index 2b84a9b1ea7f..74c9a237a3cc 100755 --- a/arch/arm/mach-rk2818/board-infosdk.c +++ b/arch/arm/mach-rk2818/board-infosdk.c @@ -34,6 +34,7 @@ #include #include #include +#include #include #include @@ -41,6 +42,10 @@ #include "devices.h" +#include "../../../drivers/spi/rk2818_spim.h" +#include "../../../drivers/input/touchscreen/xpt2046_ts.h" +#include "../../../drivers/staging/android/timed_gpio.h" +#include "../../../sound/soc/codecs/wm8994.h" /* -------------------------------------------------------------------- * ÉùÃ÷ÁËrk2818_gpioBankÊý×飬²¢¶¨ÒåÁËGPIO¼Ä´æÆ÷×éIDºÍ¼Ä´æÆ÷»ùµØÖ·¡£ @@ -152,25 +157,20 @@ static struct map_desc rk2818_io_desc[] __initdata = { * SDMMC devices *author: kfx *****************************************************************************************/ - void rk2818_sdmmc0_cfg_gpio(struct platform_device *dev) +static int rk2818_sdmmc0_io_init(void) { rk2818_mux_api_set(GPIOF3_APWM1_MMC0DETN_NAME, IOMUXA_SDMMC1_DETECT_N); rk2818_mux_api_set(GPIOH_MMC0D_SEL_NAME, IOMUXA_SDMMC0_DATA123); rk2818_mux_api_set(GPIOH_MMC0_SEL_NAME, IOMUXA_SDMMC0_CMD_DATA0_CLKOUT); + return 0; } -void rk2818_sdmmc1_cfg_gpio(struct platform_device *dev) +static int rk2818_sdmmc1_io_init(void) { rk2818_mux_api_set(GPIOG_MMC1_SEL_NAME, IOMUXA_SDMMC1_CMD_DATA0_CLKOUT); rk2818_mux_api_set(GPIOG_MMC1D_SEL_NAME, IOMUXA_SDMMC1_DATA123); -#if 0 - /* wifi power up (gpio control) */ - rk2818_mux_api_set(GPIOH7_HSADCCLK_SEL_NAME,IOMUXB_GPIO1_D7); - rk2818_mux_api_set(GPIOF5_APWM3_DPWM3_NAME,IOMUXB_GPIO1_B5); - gpio_request(RK2818_PIN_PH7, "sdio"); - gpio_direction_output(RK2818_PIN_PH7,GPIO_HIGH); -#endif + return 0; } #define CONFIG_SDMMC0_USE_DMA #define CONFIG_SDMMC1_USE_DMA @@ -179,7 +179,7 @@ struct rk2818_sdmmc_platform_data default_sdmmc0_data = { MMC_VDD_30_31|MMC_VDD_31_32|MMC_VDD_32_33| MMC_VDD_33_34|MMC_VDD_34_35| MMC_VDD_35_36), .host_caps = (MMC_CAP_4_BIT_DATA|MMC_CAP_MMC_HIGHSPEED|MMC_CAP_SD_HIGHSPEED), - .cfg_gpio = rk2818_sdmmc0_cfg_gpio, + .io_init = rk2818_sdmmc0_io_init, .no_detect = 0, .dma_name = "sd_mmc", #ifdef CONFIG_SDMMC0_USE_DMA @@ -194,7 +194,7 @@ struct rk2818_sdmmc_platform_data default_sdmmc1_data = { MMC_VDD_32_33|MMC_VDD_33_34), .host_caps = (MMC_CAP_4_BIT_DATA|MMC_CAP_SDIO_IRQ| MMC_CAP_MMC_HIGHSPEED|MMC_CAP_SD_HIGHSPEED), - .cfg_gpio = rk2818_sdmmc1_cfg_gpio, + .io_init = rk2818_sdmmc1_io_init, .no_detect = 1, .dma_name = "sdio", #ifdef CONFIG_SDMMC1_USE_DMA @@ -255,15 +255,15 @@ struct pca9554_platform_data rk2818_pca9554_data={ #endif /***************************************************************************************** - * I2C devices - *author: kfx + * i2c devices + * author: kfx@rock-chips.com *****************************************************************************************/ - void rk2818_i2c0_cfg_gpio(struct platform_device *dev) +static void rk2818_i2c0_io_init(void) { rk2818_mux_api_set(GPIOE_I2C0_SEL_NAME, IOMUXA_I2C0); } -void rk2818_i2c1_cfg_gpio(struct platform_device *dev) +static void rk2818_i2c1_io_init(void) { rk2818_mux_api_set(GPIOE_U1IR_I2C1_NAME, IOMUXA_I2C1); } @@ -273,7 +273,7 @@ struct rk2818_i2c_platform_data default_i2c0_data = { .slave_addr = 0xff, .scl_rate = 400*1000, .mode = I2C_MODE_IRQ, - .cfg_gpio = rk2818_i2c0_cfg_gpio, + .io_init = rk2818_i2c0_io_init, }; struct rk2818_i2c_platform_data default_i2c1_data = { #ifdef CONFIG_I2C0_RK2818 @@ -285,7 +285,7 @@ struct rk2818_i2c_platform_data default_i2c1_data = { .slave_addr = 0xff, .scl_rate = 400*1000, .mode = I2C_MODE_IRQ, - .cfg_gpio = rk2818_i2c1_cfg_gpio, + .io_init = rk2818_i2c1_io_init, }; struct rk2818_i2c_spi_data default_i2c2_data = { @@ -369,7 +369,8 @@ static struct i2c_board_info __initdata board_i2c1_devices[] = { .type = "gs_mma7660", .addr = 0x4c, .flags = 0, - .irq = RK2818_PIN_PE3, + .irq = GS_IRQ_PIN, + .platform_data = &rk2818_gs_platdata, }, #endif {}, @@ -378,20 +379,253 @@ static struct i2c_board_info __initdata board_i2c1_devices[] = { static struct i2c_board_info __initdata board_i2c2_devices[] = { }; +/***************************************************************************************** + * wm8994 codec + * author: cjq@rock-chips.com + *****************************************************************************************/ +static struct wm8994_platform_data wm8994_data = { + .mic_input = 0, + .micBase_vcc = 0, + .bb_input = 0, + .bb_output = 0, + .frequence = 0, + .enable_pin = 0, + .headset_pin = 0, + .headset_call_vol = 0, + .speaker_call_vol = 0, + .earpiece_call_vol = 0, + .bt_call_vol = 0, +};// must initialize static struct i2c_board_info __initdata board_i2c3_devices[] = { #if defined (CONFIG_SND_SOC_WM8994) { .type = "wm8994", .addr = 0x1a, .flags = 0, + .platform_data = &wm8994_data, }, #endif }; /***************************************************************************************** - * SPI devices - *author: lhh + * battery devices + * author: lw@rock-chips.com + *****************************************************************************************/ +#define CHARGEOK_PIN RK2818_PIN_PB1 +struct rk2818_battery_platform_data rk2818_battery_platdata = { + .charge_ok_pin = CHARGEOK_PIN, +}; +/***************************************************************************************** + * serial devices + * author: lhh@rock-chips.com + *****************************************************************************************/ +static int serial_io_init(void) +{ + int ret; +#if 1 + //cz@rock-chips.com + //20100808 + //UART0µÄËĸö¹Ü½ÅÏÈIOMUX³ÉGPIO + //È»ºó·Ö±ðÉèÖÃÊäÈëÊä³ö/À­¸ßÀ­µÍ´¦Àí + //×îºóÔÙIOMUX³ÉUART + //·ÀÖ¹Ö±½ÓIOMUX³ÉUARTºóËĸö¹Ü½ÅµÄ״̬²»¶Ôʱ + //²Ù×÷UARTµ¼ÖÂUART_USR_BUSYʼÖÕΪ1Ôì³ÉÈçÏÂËÀÑ­»· + //while(rk2818_uart_read(port,UART_USR)&UART_USR_BUSY) + //UARTËĸö¹Ü½ÅÔÚδ´«ÊäʱÕý³£×´Ì¬Ó¦¸ÃΪ£º + //RX/TX£ºHIGH + //CTS/RTS£ºLOW + //×¢Ò⣺CTS/RTSΪµÍÓÐЧ£¬Ó²¼þÉϲ»Ó¦¸ÃÇ¿ÐÐ×öÉÏÀ­ + rk2818_mux_api_set(GPIOG1_UART0_MMC1WPT_NAME, IOMUXA_GPIO1_C1 /*IOMUXA_UART0_SOUT*/); + rk2818_mux_api_set(GPIOG0_UART0_MMC1DET_NAME, IOMUXA_GPIO1_C0 /*IOMUXA_UART0_SIN*/); + + ret = gpio_request(RK2818_PIN_PG0, NULL); + if(ret != 0) + { + gpio_free(RK2818_PIN_PG0); + } + gpio_direction_output(RK2818_PIN_PG0,GPIO_HIGH); + + + ret = gpio_request(RK2818_PIN_PG1, NULL); + if(ret != 0) + { + gpio_free(RK2818_PIN_PG1); + } + gpio_direction_output(RK2818_PIN_PG1,GPIO_HIGH); + + gpio_pull_updown(RK2818_PIN_PG1,GPIOPullUp); + gpio_pull_updown(RK2818_PIN_PG0,GPIOPullUp); + + rk2818_mux_api_set(GPIOG1_UART0_MMC1WPT_NAME, IOMUXA_UART0_SOUT); + rk2818_mux_api_set(GPIOG0_UART0_MMC1DET_NAME, IOMUXA_UART0_SIN); + + rk2818_mux_api_set(GPIOB2_U0CTSN_SEL_NAME, IOMUXB_GPIO0_B2/*IOMUXB_UART0_CTS_N*/); + rk2818_mux_api_set(GPIOB3_U0RTSN_SEL_NAME, IOMUXB_GPIO0_B3/*IOMUXB_UART0_RTS_N*/); + + ret = gpio_request(RK2818_PIN_PB2, NULL); + if(ret != 0) + { + gpio_free(RK2818_PIN_PB2); + } + gpio_direction_input(RK2818_PIN_PB2); + // gpio_direction_output(RK2818_PIN_PB2,GPIO_LOW); + + ret = gpio_request(RK2818_PIN_PB3, NULL); + if(ret != 0) + { + gpio_free(RK2818_PIN_PB3); + } + gpio_direction_output(RK2818_PIN_PB3,GPIO_LOW); +#endif + + rk2818_mux_api_set(GPIOB2_U0CTSN_SEL_NAME, IOMUXB_UART0_CTS_N); + rk2818_mux_api_set(GPIOB3_U0RTSN_SEL_NAME, IOMUXB_UART0_RTS_N); + + return 0; +} + +struct rk2818_serial_platform_data rk2818_serial0_platdata = { + .io_init = serial_io_init, +}; + +/***************************************************************************************** + * i2s devices + * author: lhhrock-chips.com + *****************************************************************************************/ +static int i2s_io_init(void) +{ + /* Configure the I2S pins in correct mode */ + rk2818_mux_api_set(CXGPIO_I2S_SEL_NAME,IOMUXB_I2S_INTERFACE); + return 0; +} + +struct rk2818_i2s_platform_data rk2818_i2s_platdata = { + .io_init = i2s_io_init, +}; +/***************************************************************************************** + * spi devices + * author: lhhrock-chips.com + *****************************************************************************************/ +#define SPI_CHIPSELECT_NUM 3 +static int spi_io_init(void) +{ + //cs0 + rk2818_mux_api_set(GPIOB4_SPI0CS0_MMC0D4_NAME, IOMUXA_GPIO0_B4); + //cs1 + rk2818_mux_api_set(GPIOB0_SPI0CSN1_MMC1PCA_NAME, IOMUXA_GPIO0_B0); + //clk + rk2818_mux_api_set(GPIOB_SPI0_MMC0_NAME, IOMUXA_SPI0); + //cs2 + rk2818_mux_api_set(GPIOF5_APWM3_DPWM3_NAME,IOMUXB_GPIO1_B5); + + return 0; +} +static int spi_io_deinit(void) +{ + rk2818_mux_api_mode_resume(GPIOB4_SPI0CS0_MMC0D4_NAME); + rk2818_mux_api_mode_resume(GPIOB0_SPI0CSN1_MMC1PCA_NAME); + rk2818_mux_api_mode_resume(GPIOB_SPI0_MMC0_NAME); + rk2818_mux_api_mode_resume(GPIOF5_APWM3_DPWM3_NAME); + return 0; +} + +struct spi_cs_gpio rk2818_spi_cs_gpios[SPI_CHIPSELECT_NUM] = { + { + .name = "spi cs0", + .cs_gpio = RK2818_PIN_PB4, + }, + { + .name = "spi cs1", + .cs_gpio = RK2818_PIN_PB0, + }, + { + .name = "spi cs2", + .cs_gpio = RK2818_PIN_PF5, + } +}; + +struct rk2818_spi_platform_data rk2818_spi_platdata = { + .num_chipselect = SPI_CHIPSELECT_NUM,//raho ´ó°åÐèÒªÖ§³Ö3¸öƬѡ dxj + .chipselect_gpios = rk2818_spi_cs_gpios, + .io_init = spi_io_init, + .io_deinit = spi_io_deinit, +}; +/***************************************************************************************** + * xpt2046 touch panel + * author: dxjrock-chips.com *****************************************************************************************/ +#define XPT2046_GPIO_INT RK2818_PIN_PE1 +#define DEBOUNCE_REPTIME 3 + +#if defined(CONFIG_TOUCHSCREEN_XPT2046_320X480_SPI) +static struct xpt2046_platform_data xpt2046_info = { + .model = 2046, + .keep_vref_on = 1, + .swap_xy = 0, + .x_min = 0, + .x_max = 320, + .y_min = 0, + .y_max = 480, + .debounce_max = 7, + .debounce_rep = DEBOUNCE_REPTIME, + .debounce_tol = 20, + .gpio_pendown = XPT2046_GPIO_INT, + .penirq_recheck_delay_usecs = 1, +}; +#elif defined(CONFIG_TOUCHSCREEN_XPT2046_320X480_CBN_SPI) +static struct xpt2046_platform_data xpt2046_info = { + .model = 2046, + .keep_vref_on = 1, + .swap_xy = 0, + .x_min = 0, + .x_max = 320, + .y_min = 0, + .y_max = 480, + .debounce_max = 7, + .debounce_rep = DEBOUNCE_REPTIME, + .debounce_tol = 20, + .gpio_pendown = XPT2046_GPIO_INT, + .penirq_recheck_delay_usecs = 1, +}; +#elif defined(CONFIG_TOUCHSCREEN_XPT2046_SPI) +static struct xpt2046_platform_data xpt2046_info = { + .model = 2046, + .keep_vref_on = 1, + .swap_xy = 1, + .x_min = 0, + .x_max = 800, + .y_min = 0, + .y_max = 480, + .debounce_max = 7, + .debounce_rep = DEBOUNCE_REPTIME, + .debounce_tol = 20, +#if defined(CONFIG_MACH_RAHO) + .gpio_pendown = RK2818_PIN_PE1, +#else + .gpio_pendown = RK2818_PIN_PE3, +#endif + .penirq_recheck_delay_usecs = 1, +}; +#elif defined(CONFIG_TOUCHSCREEN_XPT2046_CBN_SPI) +static struct xpt2046_platform_data xpt2046_info = { + .model = 2046, + .keep_vref_on = 1, + .swap_xy = 1, + .x_min = 0, + .x_max = 800, + .y_min = 0, + .y_max = 480, + .debounce_max = 7, + .debounce_rep = DEBOUNCE_REPTIME, + .debounce_tol = 20, +#if defined(CONFIG_MACH_RAHO) + .gpio_pendown = RK2818_PIN_PE1, +#else + .gpio_pendown = RK2818_PIN_PE3, +#endif + .penirq_recheck_delay_usecs = 1, +}; +#endif static struct spi_board_info board_spi_devices[] = { #if defined(CONFIG_SPI_FPGA) { /* fpga ice65l08xx */ @@ -411,13 +645,15 @@ static struct spi_board_info board_spi_devices[] = { .mode = SPI_MODE_0, }, #endif -#if defined(CONFIG_TOUCHSCREEN_XPT2046_SPI) || defined(CONFIG_TOUCHSCREEN_XPT2046_CBN_SPI) +#if defined(CONFIG_TOUCHSCREEN_XPT2046_320X480_SPI) || defined(CONFIG_TOUCHSCREEN_XPT2046_320X480_CBN_SPI)\ + ||defined(CONFIG_TOUCHSCREEN_XPT2046_SPI) || defined(CONFIG_TOUCHSCREEN_XPT2046_CBN_SPI) { .modalias = "xpt2046_ts", .chip_select = 0, .max_speed_hz = 125 * 1000 * 26,/* (max sample rate @ 3V) * (cmd + data + overhead) */ .bus_num = 0, - .irq = RK2818_PIN_PE3, + .irq = XPT2046_GPIO_INT, + .platform_data = &xpt2046_info, }, #endif }; @@ -444,11 +680,69 @@ struct rk2818_fb_mach_info rk2818_fb_mach_info = { .iomux = &rk2818_fb_iomux_info, }; -struct rk2818bl_info rk2818_bl_info = { - .pwm_id = 0, - .pw_pin = GPIO_HIGH | (RK2818_PIN_PF4<< 8) , - .bl_ref = 0, - .pw_iomux = GPIOF34_UART3_SEL_NAME, +/***************************************************************************************** + * backlight devices + * author: nzy@rock-chips.com + *****************************************************************************************/ + /* + GPIOF2_APWM0_SEL_NAME, IOMUXB_PWM0 + GPIOF3_APWM1_MMC0DETN_NAME, IOMUXA_PWM1 + GPIOF4_APWM2_MMC0WPT_NAME, IOMUXA_PWM2 + GPIOF5_APWM3_DPWM3_NAME, IOMUXB_PWM3 + */ + +#define PWM_ID 0 +#define PWM_MUX_NAME GPIOF2_APWM0_SEL_NAME +#define PWM_MUX_MODE IOMUXB_PWM0 +#define PWM_EFFECT_VALUE 0 + + +#define BL_EN_MUX_NAME GPIOF34_UART3_SEL_NAME +#define BL_EN_MUX_MODE IOMUXB_GPIO1_B34 + +#define BL_EN_PIN RK2818_PIN_PF3 +#define BL_EN_VALUE GPIO_HIGH + + + +static int rk2818_backlight_io_init(void) +{ + int ret = 0; + + rk2818_mux_api_set(PWM_MUX_NAME, PWM_MUX_MODE); + + rk2818_mux_api_set(BL_EN_MUX_NAME, BL_EN_MUX_MODE); + + ret = gpio_request(BL_EN_PIN, NULL); + if(ret != 0) + { + gpio_free(BL_EN_PIN); + printk(KERN_ERR ">>>>>> lcd_cs gpio_request err \n "); + } + + gpio_direction_output(BL_EN_PIN, 0); + gpio_set_value(BL_EN_PIN, BL_EN_VALUE); + + return ret; +} + +static int rk2818_backlight_io_deinit(void) +{ + int ret = 0; + + gpio_free(BL_EN_PIN); + + rk2818_mux_api_mode_resume(PWM_MUX_NAME); + + rk2818_mux_api_mode_resume(BL_EN_MUX_NAME); + + return ret; +} +struct rk2818_bl_info rk2818_bl_info = { + .pwm_id = PWM_ID, + .bl_ref = PWM_EFFECT_VALUE, + .io_init = rk2818_backlight_io_init, + .io_deinit = rk2818_backlight_io_deinit, }; /******************************************************** @@ -474,38 +768,21 @@ GPIOE_SPI1_FLASH_SEL_NAME IOMUXA_FLASH_CS67 #define DM9000_IO_ADDR (RK2818_NANDC_PHYS + 0x800 + DM9000_USE_NAND_CS*0x100 + 0x8) #define DM9000_DATA_ADDR (RK2818_NANDC_PHYS + 0x800 + DM9000_USE_NAND_CS*0x100 + 0x4) -int dm9k_gpio_set(void) +static int dm9k_gpio_set(void) { //cs rk2818_mux_api_set(DM9000_CS_IOMUX_NAME, DM9000_CS_IOMUX_MODE); - //int rk2818_mux_api_set(DM9000_INT_IOMUX_NAME, DM9000_INT_IOMUX_MODE); - - if (gpio_request(DM9000_NET_INT_PIN, "dm9000 interrupt")) { - gpio_free(DM9000_NET_INT_PIN); - rk2818_mux_api_mode_resume(DM9000_INT_IOMUX_NAME); - rk2818_mux_api_mode_resume(DM9000_CS_IOMUX_NAME); - printk("[fun:%s line:%d], request gpio for net interrupt fail\n", __func__,__LINE__); - - return -1; - } - gpio_pull_updown(DM9000_NET_INT_PIN, DM9000_INT_INIT_VALUE); - gpio_direction_input(DM9000_NET_INT_PIN); - + return 0; } -int dm9k_gpio_free(void) +static int dm9k_gpio_free(void) { - gpio_free(DM9000_NET_INT_PIN); rk2818_mux_api_mode_resume(DM9000_INT_IOMUX_NAME); rk2818_mux_api_mode_resume(DM9000_CS_IOMUX_NAME); return 0; } -int dm9k_get_gpio_irq(void) -{ - return gpio_to_irq(DM9000_NET_INT_PIN); -} static struct resource dm9k_resource[] = { [0] = { @@ -531,9 +808,10 @@ static struct resource dm9k_resource[] = { */ struct dm9000_plat_data dm9k_platdata = { .flags = DM9000_PLATF_8BITONLY, + .irq_pin = DM9000_NET_INT_PIN, + .irq_pin_value = DM9000_INT_INIT_VALUE, .io_init = dm9k_gpio_set, .io_deinit = dm9k_gpio_free, - .get_irq_num = dm9k_get_gpio_irq, }; struct platform_device rk2818_device_dm9k = { @@ -547,6 +825,57 @@ struct platform_device rk2818_device_dm9k = { }; #endif + +/***************************************************************************************** + * nand flash devices + * author: hxy@rock-chips.com + *****************************************************************************************/ +/* +GPIOA5_FLASHCS1_SEL_NAME, IOMUXB_FLASH_CS1 +GPIOA6_FLASHCS2_SEL_NAME, IOMUXB_FLASH_CS2 +GPIOA7_FLASHCS3_SEL_NAME, IOMUXB_FLASH_CS3 +GPIOE_SPI1_FLASH_SEL1_NAME, IOMUXA_FLASH_CS45 +GPIOE_SPI1_FLASH_SEL_NAME, IOMUXA_FLASH_CS67 +*/ + +#define NAND_CS_MAX_NUM 1 /*form 0 to 8, it is 0 when no nand flash */ + +int rk2818_nand_io_init(void) +{ +#if (NAND_CS_MAX_NUM == 2) + rk2818_mux_api_set(GPIOA5_FLASHCS1_SEL_NAME, IOMUXB_FLASH_CS1); +#elif (NAND_CS_MAX_NUM == 3) + rk2818_mux_api_set(GPIOA5_FLASHCS1_SEL_NAME, IOMUXB_FLASH_CS1); + rk2818_mux_api_set(GPIOA6_FLASHCS2_SEL_NAME, IOMUXB_FLASH_CS2); +#elif (NAND_CS_MAX_NUM == 4) + rk2818_mux_api_set(GPIOA5_FLASHCS1_SEL_NAME, IOMUXB_FLASH_CS1); + rk2818_mux_api_set(GPIOA6_FLASHCS2_SEL_NAME, IOMUXB_FLASH_CS2); + rk2818_mux_api_set(GPIOA7_FLASHCS3_SEL_NAME, IOMUXB_FLASH_CS3); +#elif ((NAND_CS_MAX_NUM == 5) || (NAND_CS_MAX_NUM == 6)) + rk2818_mux_api_set(GPIOA5_FLASHCS1_SEL_NAME, IOMUXB_FLASH_CS1); + rk2818_mux_api_set(GPIOA6_FLASHCS2_SEL_NAME, IOMUXB_FLASH_CS2); + rk2818_mux_api_set(GPIOA7_FLASHCS3_SEL_NAME, IOMUXB_FLASH_CS3); + rk2818_mux_api_set(GPIOE_SPI1_FLASH_SEL1_NAME, IOMUXA_FLASH_CS45); +#elif ((NAND_CS_MAX_NUM == 7) || (NAND_CS_MAX_NUM == 8)) + rk2818_mux_api_set(GPIOA5_FLASHCS1_SEL_NAME, IOMUXB_FLASH_CS1); + rk2818_mux_api_set(GPIOA6_FLASHCS2_SEL_NAME, IOMUXB_FLASH_CS2); + rk2818_mux_api_set(GPIOA7_FLASHCS3_SEL_NAME, IOMUXB_FLASH_CS3); + rk2818_mux_api_set(GPIOE_SPI1_FLASH_SEL1_NAME, IOMUXA_FLASH_CS45); + rk2818_mux_api_set(GPIOE_SPI1_FLASH_SEL_NAME, IOMUXA_FLASH_CS67); +#endif + return 0; +} + +struct rk2818_nand_platform_data rk2818_nand_data = { + .width = 1, /* data bus width in bytes */ + .hw_ecc = 1, /* hw ecc 0: soft ecc */ + .num_flash = 1, + .io_init = rk2818_nand_io_init, +}; + + +/*****************************************/ + static struct platform_device *devices[] __initdata = { &rk2818_device_uart1, #ifdef CONFIG_I2C0_RK2818 @@ -681,6 +1010,8 @@ struct lcd_td043mgea1_data lcd_td043mgea1 = { }; // adc ---> key +#define PLAY_ON_PIN RK2818_PIN_PE1 +#define PLAY_ON_LEVEL 1 static ADC_keyst gAdcValueTab[] = { {95, AD2KEY1},///VOLUME_DOWN @@ -699,8 +1030,8 @@ static unsigned char gInitKeyCode[] = }; struct adc_key_data rk2818_adc_key = { - .pin_playon = RK2818_PIN_PE1, - .playon_level = 1, + .pin_playon = PLAY_ON_PIN, + .playon_level = PLAY_ON_LEVEL, .adc_empty = 900, .adc_invalid = 20, .adc_drift = 50, @@ -709,6 +1040,14 @@ struct adc_key_data rk2818_adc_key = { .initKeyCode = gInitKeyCode, .adc_key_cnt = 7, }; +struct rk2818_adckey_platform_data rk2818_adckey_platdata = { + .adc_key = &rk2818_adc_key, +}; +#if CONFIG_ANDROID_TIMED_GPIO +struct timed_gpio_platform_data rk28_vibrator_info = { + .num_gpios = 0, +}; +#endif static void __init machine_rk2818_init_irq(void) { @@ -737,9 +1076,9 @@ static void __init machine_rk2818_board_init(void) #endif platform_add_devices(devices, ARRAY_SIZE(devices)); spi_register_board_info(board_spi_devices, ARRAY_SIZE(board_spi_devices)); - rk2818_mux_api_set(GPIOB4_SPI0CS0_MMC0D4_NAME,IOMUXA_GPIO0_B4); //IOMUXA_SPI0_CSN0);//use for gpio SPI CS0 - rk2818_mux_api_set(GPIOB0_SPI0CSN1_MMC1PCA_NAME,IOMUXA_GPIO0_B0); //IOMUXA_SPI0_CSN1);//use for gpio SPI CS1 - rk2818_mux_api_set(GPIOB_SPI0_MMC0_NAME,IOMUXA_SPI0);//use for SPI CLK SDI SDO + //rk2818_mux_api_set(GPIOB4_SPI0CS0_MMC0D4_NAME,IOMUXA_GPIO0_B4); //IOMUXA_SPI0_CSN0);//use for gpio SPI CS0 + //rk2818_mux_api_set(GPIOB0_SPI0CSN1_MMC1PCA_NAME,IOMUXA_GPIO0_B0); //IOMUXA_SPI0_CSN1);//use for gpio SPI CS1 + //rk2818_mux_api_set(GPIOB_SPI0_MMC0_NAME,IOMUXA_SPI0);//use for SPI CLK SDI SDO } static void __init machine_rk2818_mapio(void) diff --git a/arch/arm/mach-rk2818/board-raho.c b/arch/arm/mach-rk2818/board-raho.c index 660512105a62..0d7325a4b0ad 100755 --- a/arch/arm/mach-rk2818/board-raho.c +++ b/arch/arm/mach-rk2818/board-raho.c @@ -38,6 +38,7 @@ #include #include #include /* ddl@rock-chips.com : camera support */ +#include #include #include @@ -50,6 +51,10 @@ #include "../../../drivers/spi/rk2818_spim.h" #include +#include "../../../drivers/input/touchscreen/xpt2046_ts.h" +#include "../../../drivers/staging/android/timed_gpio.h" +#include "../../../sound/soc/codecs/wm8994.h" + /* -------------------------------------------------------------------- * ÉùÃ÷ÁËrk2818_gpioBankÊý×飬²¢¶¨ÒåÁËGPIO¼Ä´æÆ÷×éIDºÍ¼Ä´æÆ÷»ùµØÖ·¡£ * -------------------------------------------------------------------- */ @@ -156,31 +161,25 @@ static struct map_desc rk2818_io_desc[] __initdata = { .type = MT_DEVICE }, }; + /***************************************************************************************** - * SDMMC devices - *author: kfx + * sd/mmc devices + * author: kfx@rock-chips.com *****************************************************************************************/ - void rk2818_sdmmc0_cfg_gpio(struct platform_device *dev) +static int rk2818_sdmmc0_io_init(void) { rk2818_mux_api_set(GPIOH_MMC0D_SEL_NAME, IOMUXA_SDMMC0_DATA123); rk2818_mux_api_set(GPIOH_MMC0_SEL_NAME, IOMUXA_SDMMC0_CMD_DATA0_CLKOUT); -#if 0 - rk2818_mux_api_set(GPIOF3_APWM1_MMC0DETN_NAME, IOMUXA_SDMMC1_DETECT_N); -#endif + + return 0; } -void rk2818_sdmmc1_cfg_gpio(struct platform_device *dev) +static int rk2818_sdmmc1_io_init(void) { rk2818_mux_api_set(GPIOG_MMC1_SEL_NAME, IOMUXA_SDMMC1_CMD_DATA0_CLKOUT); rk2818_mux_api_set(GPIOG_MMC1D_SEL_NAME, IOMUXA_SDMMC1_DATA123); -#if 0 - /* wifi power up (gpio control) */ - rk2818_mux_api_set(GPIOH7_HSADCCLK_SEL_NAME,IOMUXB_GPIO1_D7); - rk2818_mux_api_set(GPIOF5_APWM3_DPWM3_NAME,IOMUXB_GPIO1_B5); - gpio_request(RK2818_PIN_PH7, "sdio"); - gpio_direction_output(RK2818_PIN_PH7,GPIO_HIGH); -#endif + return 0; } #define CONFIG_SDMMC0_USE_DMA #define CONFIG_SDMMC1_USE_DMA @@ -189,7 +188,7 @@ struct rk2818_sdmmc_platform_data default_sdmmc0_data = { MMC_VDD_30_31|MMC_VDD_31_32|MMC_VDD_32_33| MMC_VDD_33_34|MMC_VDD_34_35| MMC_VDD_35_36), .host_caps = (MMC_CAP_4_BIT_DATA|MMC_CAP_MMC_HIGHSPEED|MMC_CAP_SD_HIGHSPEED), - .cfg_gpio = rk2818_sdmmc0_cfg_gpio, + .io_init = rk2818_sdmmc0_io_init, .no_detect = 0, .dma_name = "sd_mmc", #ifdef CONFIG_SDMMC0_USE_DMA @@ -204,7 +203,7 @@ struct rk2818_sdmmc_platform_data default_sdmmc1_data = { MMC_VDD_32_33|MMC_VDD_33_34), .host_caps = (MMC_CAP_4_BIT_DATA|MMC_CAP_SDIO_IRQ| MMC_CAP_MMC_HIGHSPEED|MMC_CAP_SD_HIGHSPEED), - .cfg_gpio = rk2818_sdmmc1_cfg_gpio, + .io_init = rk2818_sdmmc1_io_init, .no_detect = 1, .dma_name = "sdio", #ifdef CONFIG_SDMMC1_USE_DMA @@ -216,7 +215,7 @@ struct rk2818_sdmmc_platform_data default_sdmmc1_data = { /***************************************************************************************** * extern gpio devices - *author: xxx + * author: xxx@rock-chips.com *****************************************************************************************/ #if defined (CONFIG_GPIO_PCA9554) struct rk2818_gpio_expander_info extern_gpio_settinginfo[] = { @@ -500,25 +499,34 @@ struct lp8725_platform_data rk2818_lp8725_data={ #endif /***************************************************************************************** - * I2C devices - *author: kfx + * gsensor devices *****************************************************************************************/ - void rk2818_i2c0_cfg_gpio(struct platform_device *dev) +#define GS_IRQ_PIN RK2818_PIN_PE3 + +struct rk2818_gs_platform_data rk2818_gs_platdata = { + .gsensor_irq_pin = GS_IRQ_PIN, +}; + +/***************************************************************************************** + * i2c devices + * author: kfx@rock-chips.com +*****************************************************************************************/ +static void rk2818_i2c0_io_init(void) { rk2818_mux_api_set(GPIOE_I2C0_SEL_NAME, IOMUXA_I2C0); } -void rk2818_i2c1_cfg_gpio(struct platform_device *dev) +static void rk2818_i2c1_io_init(void) { rk2818_mux_api_set(GPIOE_U1IR_I2C1_NAME, IOMUXA_I2C1); } + struct rk2818_i2c_platform_data default_i2c0_data = { .bus_num = 0, .flags = 0, .slave_addr = 0xff, .scl_rate = 400*1000, - .mode = I2C_MODE_IRQ, //I2C_MODE_POLL - .cfg_gpio = rk2818_i2c0_cfg_gpio, + .io_init = rk2818_i2c0_io_init, }; struct rk2818_i2c_platform_data default_i2c1_data = { #ifdef CONFIG_I2C0_RK2818 @@ -529,8 +537,7 @@ struct rk2818_i2c_platform_data default_i2c1_data = { .flags = 0, .slave_addr = 0xff, .scl_rate = 400*1000, - .mode = I2C_MODE_IRQ, //I2C_MODE_POLL - .cfg_gpio = rk2818_i2c1_cfg_gpio, + .io_init = rk2818_i2c1_io_init, }; struct rk2818_i2c_spi_data default_i2c2_data = { @@ -622,7 +629,8 @@ static struct i2c_board_info __initdata board_i2c1_devices[] = { .type = "gs_mma7660", .addr = 0x4c, .flags = 0, - .irq = RK2818_PIN_PE3, + .irq = GS_IRQ_PIN, + .platform_data = &rk2818_gs_platdata, }, #endif {}, @@ -631,63 +639,66 @@ static struct i2c_board_info __initdata board_i2c1_devices[] = { static struct i2c_board_info __initdata board_i2c2_devices[] = { }; + +/***************************************************************************************** + * wm8994 codec + * author: cjq@rock-chips.com + *****************************************************************************************/ +static struct wm8994_platform_data wm8994_data = { + .mic_input = 0, + .micBase_vcc = 0, + .bb_input = 0, + .bb_output = 0, + .frequence = 0, + .enable_pin = 0, + .headset_pin = 0, + .headset_call_vol = 0, + .speaker_call_vol = 0, + .earpiece_call_vol = 0, + .bt_call_vol = 0, +};// must initialize + static struct i2c_board_info __initdata board_i2c3_devices[] = { #if defined (CONFIG_SND_SOC_WM8994) { .type = "wm8994", .addr = 0x1a, .flags = 0, + .platform_data = &wm8994_data, }, #endif }; -static void spi_xpt2046_cs_control(u32 command) -{ - if(command == 3) - { - gpio_direction_output(RK2818_PIN_PF5, GPIO_LOW); - } - if(command == 0) - { - gpio_direction_output(RK2818_PIN_PF5, GPIO_HIGH); - } -} - -struct rk2818_spi_chip spi_xpt2046_info = { - .cs_control = spi_xpt2046_cs_control, -}; - - /***************************************************************************************** * camera devices - *author: ddl@rock-chips.com + * author: ddl@rock-chips.com *****************************************************************************************/ #define RK2818_CAM_POWER_PIN FPGA_PIO1_05//SPI_GPIO_P1_05 #define RK2818_CAM_RESET_PIN FPGA_PIO1_14//SPI_GPIO_P1_14 -static int rk28_sensor_init(void); -static int rk28_sensor_deinit(void); +static int rk28_sensor_io_init(void); +static int rk28_sensor_io_deinit(void); struct rk28camera_platform_data rk28_camera_platform_data = { - .init = rk28_sensor_init, - .deinit = rk28_sensor_deinit, + .io_init = rk28_sensor_io_init, + .io_deinit = rk28_sensor_io_deinit, .gpio_res = { { .gpio_reset = RK2818_CAM_RESET_PIN, .gpio_power = RK2818_CAM_POWER_PIN, .dev_name = "ov2655" }, { - .gpio_reset = 0xFFFFFFFF, - .gpio_power = 0xFFFFFFFF, + .gpio_reset = INVALID_GPIO, + .gpio_power = INVALID_GPIO, .dev_name = NULL } } }; -static int rk28_sensor_init(void) +static int rk28_sensor_io_init(void) { int ret = 0, i; - unsigned int camera_reset=0xffffffff,camera_power=0xffffffff; + unsigned int camera_reset = INVALID_GPIO, camera_power = INVALID_GPIO; printk("\n%s....%d ******** ddl *********\n",__FUNCTION__,__LINE__); @@ -695,7 +706,7 @@ static int rk28_sensor_init(void) camera_reset = rk28_camera_platform_data.gpio_res[i].gpio_reset; camera_power = rk28_camera_platform_data.gpio_res[i].gpio_power; - if (camera_power != 0xffffffff) { + if (camera_power != INVALID_GPIO) { ret = gpio_request(camera_power, "camera power"); if (ret) continue; @@ -704,10 +715,10 @@ static int rk28_sensor_init(void) gpio_direction_output(camera_power, 0); } - if (camera_reset != 0xffffffff) { + if (camera_reset != INVALID_GPIO) { ret = gpio_request(camera_reset, "camera reset"); if (ret) { - if (camera_power != 0xffffffff) + if (camera_power != INVALID_GPIO) gpio_free(camera_power); continue; @@ -721,10 +732,10 @@ static int rk28_sensor_init(void) return 0; } -static int rk28_sensor_deinit(void) +static int rk28_sensor_io_deinit(void) { unsigned int i; - unsigned int camera_reset=0xffffffff,camera_power=0xffffffff; + unsigned int camera_reset = INVALID_GPIO, camera_power = INVALID_GPIO; printk("\n%s....%d ******** ddl *********\n",__FUNCTION__,__LINE__); @@ -732,12 +743,12 @@ static int rk28_sensor_deinit(void) camera_reset = rk28_camera_platform_data.gpio_res[i].gpio_reset; camera_power = rk28_camera_platform_data.gpio_res[i].gpio_power; - if (camera_power != 0xffffffff){ + if (camera_power != INVALID_GPIO){ gpio_direction_input(camera_power); gpio_free(camera_power); } - if (camera_reset != 0xffffffff) { + if (camera_reset != INVALID_GPIO) { gpio_direction_input(camera_reset); gpio_free(camera_reset); } @@ -749,7 +760,7 @@ static int rk28_sensor_deinit(void) static int rk28_sensor_power(struct device *dev, int on) { - unsigned int camera_reset=0xffffffff,camera_power=0xffffffff; + unsigned int camera_reset = INVALID_GPIO, camera_power = INVALID_GPIO; if(rk28_camera_platform_data.gpio_res[0].dev_name && (strcmp(rk28_camera_platform_data.gpio_res[0].dev_name, dev_name(dev)) == 0)) { camera_reset = rk28_camera_platform_data.gpio_res[0].gpio_reset; @@ -759,15 +770,15 @@ static int rk28_sensor_power(struct device *dev, int on) camera_power = rk28_camera_platform_data.gpio_res[1].gpio_power; } - if (camera_reset != 0xffffffff) { + if (camera_reset != INVALID_GPIO) { gpio_set_value(camera_reset, !on); //printk("\n%s..%s..ResetPin=%d ..PinLevel = %x ******** ddl *********\n",__FUNCTION__,dev_name(dev),camera_reset, on); } - if (camera_power != 0xffffffff) { + if (camera_power != INVALID_GPIO) { gpio_set_value(camera_power, !on); printk("\n%s..%s..PowerPin=%d ..PinLevel = %x ******** ddl *********\n",__FUNCTION__,dev_name(dev), camera_power, !on); } - if (camera_reset != 0xffffffff) { + if (camera_reset != INVALID_GPIO) { msleep(3); /* delay 3 ms */ gpio_set_value(camera_reset,on); printk("\n%s..%s..ResetPin= %d..PinLevel = %x ******** ddl *********\n",__FUNCTION__,dev_name(dev), camera_reset, on); @@ -795,11 +806,232 @@ struct soc_camera_link rk2818_iclink = { #endif }; +/***************************************************************************************** + * battery devices + * author: lw@rock-chips.com + *****************************************************************************************/ +#define CHARGEOK_PIN RK2818_PIN_PB1 +struct rk2818_battery_platform_data rk2818_battery_platdata = { + .charge_ok_pin = CHARGEOK_PIN, +}; + + +/***************************************************************************************** + * serial devices + * author: lhh@rock-chips.com + *****************************************************************************************/ +static int serial_io_init(void) +{ + int ret; +#if 1 + //cz@rock-chips.com + //20100808 + //UART0µÄËĸö¹Ü½ÅÏÈIOMUX³ÉGPIO + //È»ºó·Ö±ðÉèÖÃÊäÈëÊä³ö/À­¸ßÀ­µÍ´¦Àí + //×îºóÔÙIOMUX³ÉUART + //·ÀÖ¹Ö±½ÓIOMUX³ÉUARTºóËĸö¹Ü½ÅµÄ״̬²»¶Ôʱ + //²Ù×÷UARTµ¼ÖÂUART_USR_BUSYʼÖÕΪ1Ôì³ÉÈçÏÂËÀÑ­»· + //while(rk2818_uart_read(port,UART_USR)&UART_USR_BUSY) + //UARTËĸö¹Ü½ÅÔÚδ´«ÊäʱÕý³£×´Ì¬Ó¦¸ÃΪ£º + //RX/TX£ºHIGH + //CTS/RTS£ºLOW + //×¢Ò⣺CTS/RTSΪµÍÓÐЧ£¬Ó²¼þÉϲ»Ó¦¸ÃÇ¿ÐÐ×öÉÏÀ­ + rk2818_mux_api_set(GPIOG1_UART0_MMC1WPT_NAME, IOMUXA_GPIO1_C1 /*IOMUXA_UART0_SOUT*/); + rk2818_mux_api_set(GPIOG0_UART0_MMC1DET_NAME, IOMUXA_GPIO1_C0 /*IOMUXA_UART0_SIN*/); + + ret = gpio_request(RK2818_PIN_PG0, NULL); + if(ret != 0) + { + gpio_free(RK2818_PIN_PG0); + } + gpio_direction_output(RK2818_PIN_PG0,GPIO_HIGH); + + + ret = gpio_request(RK2818_PIN_PG1, NULL); + if(ret != 0) + { + gpio_free(RK2818_PIN_PG1); + } + gpio_direction_output(RK2818_PIN_PG1,GPIO_HIGH); + + gpio_pull_updown(RK2818_PIN_PG1,GPIOPullUp); + gpio_pull_updown(RK2818_PIN_PG0,GPIOPullUp); + + rk2818_mux_api_set(GPIOG1_UART0_MMC1WPT_NAME, IOMUXA_UART0_SOUT); + rk2818_mux_api_set(GPIOG0_UART0_MMC1DET_NAME, IOMUXA_UART0_SIN); + + rk2818_mux_api_set(GPIOB2_U0CTSN_SEL_NAME, IOMUXB_GPIO0_B2/*IOMUXB_UART0_CTS_N*/); + rk2818_mux_api_set(GPIOB3_U0RTSN_SEL_NAME, IOMUXB_GPIO0_B3/*IOMUXB_UART0_RTS_N*/); + + ret = gpio_request(RK2818_PIN_PB2, NULL); + if(ret != 0) + { + gpio_free(RK2818_PIN_PB2); + } + gpio_direction_input(RK2818_PIN_PB2); + // gpio_direction_output(RK2818_PIN_PB2,GPIO_LOW); + + ret = gpio_request(RK2818_PIN_PB3, NULL); + if(ret != 0) + { + gpio_free(RK2818_PIN_PB3); + } + gpio_direction_output(RK2818_PIN_PB3,GPIO_LOW); +#endif + + rk2818_mux_api_set(GPIOB2_U0CTSN_SEL_NAME, IOMUXB_UART0_CTS_N); + rk2818_mux_api_set(GPIOB3_U0RTSN_SEL_NAME, IOMUXB_UART0_RTS_N); + + return 0; +} + +struct rk2818_serial_platform_data rk2818_serial0_platdata = { + .io_init = serial_io_init, +}; + +/***************************************************************************************** + * i2s devices + * author: lhhrock-chips.com + *****************************************************************************************/ +static int i2s_io_init(void) +{ + /* Configure the I2S pins in correct mode */ + rk2818_mux_api_set(CXGPIO_I2S_SEL_NAME,IOMUXB_I2S_INTERFACE); + return 0; +} + +struct rk2818_i2s_platform_data rk2818_i2s_platdata = { + .io_init = i2s_io_init, +}; + + +/***************************************************************************************** + * spi devices + * author: lhhrock-chips.com + *****************************************************************************************/ +#define SPI_CHIPSELECT_NUM 3 +static int spi_io_init(void) +{ + //cs0 + rk2818_mux_api_set(GPIOB4_SPI0CS0_MMC0D4_NAME, IOMUXA_GPIO0_B4); + //cs1 + rk2818_mux_api_set(GPIOB0_SPI0CSN1_MMC1PCA_NAME, IOMUXA_GPIO0_B0); + //clk + rk2818_mux_api_set(GPIOB_SPI0_MMC0_NAME, IOMUXA_SPI0); + //cs2 + rk2818_mux_api_set(GPIOF5_APWM3_DPWM3_NAME,IOMUXB_GPIO1_B5); + + return 0; +} +static int spi_io_deinit(void) +{ + rk2818_mux_api_mode_resume(GPIOB4_SPI0CS0_MMC0D4_NAME); + rk2818_mux_api_mode_resume(GPIOB0_SPI0CSN1_MMC1PCA_NAME); + rk2818_mux_api_mode_resume(GPIOB_SPI0_MMC0_NAME); + rk2818_mux_api_mode_resume(GPIOF5_APWM3_DPWM3_NAME); + return 0; +} + +struct spi_cs_gpio rk2818_spi_cs_gpios[SPI_CHIPSELECT_NUM] = { + { + .name = "spi cs0", + .cs_gpio = RK2818_PIN_PB4, + }, + { + .name = "spi cs1", + .cs_gpio = RK2818_PIN_PB0, + }, + { + .name = "spi cs2", + .cs_gpio = RK2818_PIN_PF5, + } +}; + +struct rk2818_spi_platform_data rk2818_spi_platdata = { + .num_chipselect = SPI_CHIPSELECT_NUM,//raho ´ó°åÐèÒªÖ§³Ö3¸öƬѡ dxj + .chipselect_gpios = rk2818_spi_cs_gpios, + .io_init = spi_io_init, + .io_deinit = spi_io_deinit, +}; + /***************************************************************************************** - * SPI devices - *author: lhh + * xpt2046 touch panel + * author: dxjrock-chips.com *****************************************************************************************/ +#define XPT2046_GPIO_INT RK2818_PIN_PE1 +#define DEBOUNCE_REPTIME 3 + +#if defined(CONFIG_TOUCHSCREEN_XPT2046_320X480_SPI) +static struct xpt2046_platform_data xpt2046_info = { + .model = 2046, + .keep_vref_on = 1, + .swap_xy = 0, + .x_min = 0, + .x_max = 320, + .y_min = 0, + .y_max = 480, + .debounce_max = 7, + .debounce_rep = DEBOUNCE_REPTIME, + .debounce_tol = 20, + .gpio_pendown = XPT2046_GPIO_INT, + .penirq_recheck_delay_usecs = 1, +}; +#elif defined(CONFIG_TOUCHSCREEN_XPT2046_320X480_CBN_SPI) +static struct xpt2046_platform_data xpt2046_info = { + .model = 2046, + .keep_vref_on = 1, + .swap_xy = 0, + .x_min = 0, + .x_max = 320, + .y_min = 0, + .y_max = 480, + .debounce_max = 7, + .debounce_rep = DEBOUNCE_REPTIME, + .debounce_tol = 20, + .gpio_pendown = XPT2046_GPIO_INT, + .penirq_recheck_delay_usecs = 1, +}; +#elif defined(CONFIG_TOUCHSCREEN_XPT2046_SPI) +static struct xpt2046_platform_data xpt2046_info = { + .model = 2046, + .keep_vref_on = 1, + .swap_xy = 1, + .x_min = 0, + .x_max = 800, + .y_min = 0, + .y_max = 480, + .debounce_max = 7, + .debounce_rep = DEBOUNCE_REPTIME, + .debounce_tol = 20, +#if defined(CONFIG_MACH_RAHO) + .gpio_pendown = RK2818_PIN_PE1, +#else + .gpio_pendown = RK2818_PIN_PE3, +#endif + .penirq_recheck_delay_usecs = 1, +}; +#elif defined(CONFIG_TOUCHSCREEN_XPT2046_CBN_SPI) +static struct xpt2046_platform_data xpt2046_info = { + .model = 2046, + .keep_vref_on = 1, + .swap_xy = 1, + .x_min = 0, + .x_max = 800, + .y_min = 0, + .y_max = 480, + .debounce_max = 7, + .debounce_rep = DEBOUNCE_REPTIME, + .debounce_tol = 20, +#if defined(CONFIG_MACH_RAHO) + .gpio_pendown = RK2818_PIN_PE1, +#else + .gpio_pendown = RK2818_PIN_PE3, +#endif + .penirq_recheck_delay_usecs = 1, +}; +#endif + static struct spi_board_info board_spi_devices[] = { #if defined(CONFIG_SPI_FPGA) { /* fpga ice65l08xx */ @@ -808,6 +1040,7 @@ static struct spi_board_info board_spi_devices[] = { .max_speed_hz = 8 * 1000 * 1000, .bus_num = 0, .mode = SPI_MODE_0, + //.platform_data = &rk2818_spi_platdata, }, #endif #if defined(CONFIG_ENC28J60) @@ -826,8 +1059,8 @@ static struct spi_board_info board_spi_devices[] = { .chip_select = 2, .max_speed_hz = 125 * 1000 * 26,/* (max sample rate @ 3V) * (cmd + data + overhead) */ .bus_num = 0, - .controller_data = &spi_xpt2046_info, - .irq = RK2818_PIN_PE1, + .irq = XPT2046_GPIO_INT, + .platform_data = &xpt2046_info, }, #endif }; @@ -854,17 +1087,134 @@ struct rk2818_fb_mach_info rk2818_fb_mach_info = { .iomux = &rk2818_fb_iomux_info, }; -struct rk2818bl_info rk2818_bl_info = { - .pwm_id = 0, - .pw_pin = GPIO_HIGH | (RK2818_PIN_PF3<< 8) , - .bl_ref = 0, - .pw_iomux = GPIOF34_UART3_SEL_NAME, +void lcd_set_iomux(u8 enable) +{ + int ret=-1; + + if(enable) + { + rk2818_mux_api_set(GPIOH6_IQ_SEL_NAME, 0); + ret = gpio_request(RK2818_PIN_PH6, NULL); + if(ret != 0) + { + gpio_free(RK2818_PIN_PH6); + printk(">>>>>> lcd cs gpio_request err \n "); + goto pin_err; + } + + rk2818_mux_api_set(GPIOE_I2C0_SEL_NAME, 1); + + ret = gpio_request(RK2818_PIN_PE4, NULL); + if(ret != 0) + { + gpio_free(RK2818_PIN_PE4); + printk(">>>>>> lcd clk gpio_request err \n "); + goto pin_err; + } + + ret = gpio_request(RK2818_PIN_PE5, NULL); + if(ret != 0) + { + gpio_free(RK2818_PIN_PE5); + printk(">>>>>> lcd txd gpio_request err \n "); + goto pin_err; + } + } + else + { + gpio_free(RK2818_PIN_PH6); + //rk2818_mux_api_set(GPIOH6_IQ_SEL_NAME, 1); + rk2818_mux_api_mode_resume(GPIOH6_IQ_SEL_NAME); + + gpio_free(RK2818_PIN_PE4); + gpio_free(RK2818_PIN_PE5); + //rk2818_mux_api_set(GPIOE_I2C0_SEL_NAME, 0); + rk2818_mux_api_mode_resume(GPIOE_I2C0_SEL_NAME); + } + return ; +pin_err: + return ; + +} + +struct lcd_td043mgea1_data lcd_td043mgea1 = { + .pin_txd = RK2818_PIN_PE4, + .pin_clk = RK2818_PIN_PE5, + .pin_cs = RK2818_PIN_PH6, + .screen_set_iomux = lcd_set_iomux, +}; + +/***************************************************************************************** + * backlight devices + * author: nzy@rock-chips.com + *****************************************************************************************/ + /* + GPIOF2_APWM0_SEL_NAME, IOMUXB_PWM0 + GPIOF3_APWM1_MMC0DETN_NAME, IOMUXA_PWM1 + GPIOF4_APWM2_MMC0WPT_NAME, IOMUXA_PWM2 + GPIOF5_APWM3_DPWM3_NAME, IOMUXB_PWM3 + */ + +#define PWM_ID 0 +#define PWM_MUX_NAME GPIOF2_APWM0_SEL_NAME +#define PWM_MUX_MODE IOMUXB_PWM0 +#define PWM_EFFECT_VALUE 0 + + +#define BL_EN_MUX_NAME GPIOF34_UART3_SEL_NAME +#define BL_EN_MUX_MODE IOMUXB_GPIO1_B34 + +#define BL_EN_PIN RK2818_PIN_PF3 +#define BL_EN_VALUE GPIO_HIGH + + + +static int rk2818_backlight_io_init(void) +{ + int ret = 0; + + rk2818_mux_api_set(PWM_MUX_NAME, PWM_MUX_MODE); + + rk2818_mux_api_set(BL_EN_MUX_NAME, BL_EN_MUX_MODE); + + ret = gpio_request(BL_EN_PIN, NULL); + if(ret != 0) + { + gpio_free(BL_EN_PIN); + printk(KERN_ERR ">>>>>> lcd_cs gpio_request err \n "); + } + + gpio_direction_output(BL_EN_PIN, 0); + gpio_set_value(BL_EN_PIN, BL_EN_VALUE); + + return ret; +} + +static int rk2818_backlight_io_deinit(void) +{ + int ret = 0; + + gpio_free(BL_EN_PIN); + + rk2818_mux_api_mode_resume(PWM_MUX_NAME); + + rk2818_mux_api_mode_resume(BL_EN_MUX_NAME); + + return ret; +} + +struct rk2818_bl_info rk2818_bl_info = { + .pwm_id = PWM_ID, + .bl_ref = PWM_EFFECT_VALUE, + .io_init = rk2818_backlight_io_init, + .io_deinit = rk2818_backlight_io_deinit, }; -/******************************************************** -* dm9000 net work devices -* author:lyx -********************************************************/ + +/***************************************************************************************** + * netcard devices + * author: lyx@rock-chips.com + *****************************************************************************************/ #ifdef CONFIG_DM9000 /* GPIOA5_FLASHCS1_SEL_NAME IOMUXB_FLASH_CS1 @@ -884,38 +1234,21 @@ GPIOE_SPI1_FLASH_SEL_NAME IOMUXA_FLASH_CS67 #define DM9000_IO_ADDR (RK2818_NANDC_PHYS + 0x800 + DM9000_USE_NAND_CS*0x100 + 0x8) #define DM9000_DATA_ADDR (RK2818_NANDC_PHYS + 0x800 + DM9000_USE_NAND_CS*0x100 + 0x4) -int dm9k_gpio_set(void) +static int dm9k_gpio_set(void) { //cs rk2818_mux_api_set(DM9000_CS_IOMUX_NAME, DM9000_CS_IOMUX_MODE); - //int rk2818_mux_api_set(DM9000_INT_IOMUX_NAME, DM9000_INT_IOMUX_MODE); - - if (gpio_request(DM9000_NET_INT_PIN, "dm9000 interrupt")) { - gpio_free(DM9000_NET_INT_PIN); - rk2818_mux_api_mode_resume(DM9000_INT_IOMUX_NAME); - rk2818_mux_api_mode_resume(DM9000_CS_IOMUX_NAME); - printk("[fun:%s line:%d], request gpio for net interrupt fail\n", __func__,__LINE__); - - return -1; - } - gpio_pull_updown(DM9000_NET_INT_PIN, DM9000_INT_INIT_VALUE); - gpio_direction_input(DM9000_NET_INT_PIN); - + return 0; } -int dm9k_gpio_free(void) +static int dm9k_gpio_free(void) { - gpio_free(DM9000_NET_INT_PIN); rk2818_mux_api_mode_resume(DM9000_INT_IOMUX_NAME); rk2818_mux_api_mode_resume(DM9000_CS_IOMUX_NAME); return 0; } -int dm9k_get_gpio_irq(void) -{ - return gpio_to_irq(DM9000_NET_INT_PIN); -} static struct resource dm9k_resource[] = { [0] = { @@ -941,9 +1274,10 @@ static struct resource dm9k_resource[] = { */ struct dm9000_plat_data dm9k_platdata = { .flags = DM9000_PLATF_8BITONLY, + .irq_pin = DM9000_NET_INT_PIN, + .irq_pin_value = DM9000_INT_INIT_VALUE, .io_init = dm9k_gpio_set, .io_deinit = dm9k_gpio_free, - .get_irq_num = dm9k_get_gpio_irq, }; struct platform_device rk2818_device_dm9k = { @@ -957,6 +1291,57 @@ struct platform_device rk2818_device_dm9k = { }; #endif + +/***************************************************************************************** + * nand flash devices + * author: hxy@rock-chips.com + *****************************************************************************************/ +/* +GPIOA5_FLASHCS1_SEL_NAME, IOMUXB_FLASH_CS1 +GPIOA6_FLASHCS2_SEL_NAME, IOMUXB_FLASH_CS2 +GPIOA7_FLASHCS3_SEL_NAME, IOMUXB_FLASH_CS3 +GPIOE_SPI1_FLASH_SEL1_NAME, IOMUXA_FLASH_CS45 +GPIOE_SPI1_FLASH_SEL_NAME, IOMUXA_FLASH_CS67 +*/ + +#define NAND_CS_MAX_NUM 1 /*form 0 to 8, it is 0 when no nand flash */ + +int rk2818_nand_io_init(void) +{ +#if (NAND_CS_MAX_NUM == 2) + rk2818_mux_api_set(GPIOA5_FLASHCS1_SEL_NAME, IOMUXB_FLASH_CS1); +#elif (NAND_CS_MAX_NUM == 3) + rk2818_mux_api_set(GPIOA5_FLASHCS1_SEL_NAME, IOMUXB_FLASH_CS1); + rk2818_mux_api_set(GPIOA6_FLASHCS2_SEL_NAME, IOMUXB_FLASH_CS2); +#elif (NAND_CS_MAX_NUM == 4) + rk2818_mux_api_set(GPIOA5_FLASHCS1_SEL_NAME, IOMUXB_FLASH_CS1); + rk2818_mux_api_set(GPIOA6_FLASHCS2_SEL_NAME, IOMUXB_FLASH_CS2); + rk2818_mux_api_set(GPIOA7_FLASHCS3_SEL_NAME, IOMUXB_FLASH_CS3); +#elif ((NAND_CS_MAX_NUM == 5) || (NAND_CS_MAX_NUM == 6)) + rk2818_mux_api_set(GPIOA5_FLASHCS1_SEL_NAME, IOMUXB_FLASH_CS1); + rk2818_mux_api_set(GPIOA6_FLASHCS2_SEL_NAME, IOMUXB_FLASH_CS2); + rk2818_mux_api_set(GPIOA7_FLASHCS3_SEL_NAME, IOMUXB_FLASH_CS3); + rk2818_mux_api_set(GPIOE_SPI1_FLASH_SEL1_NAME, IOMUXA_FLASH_CS45); +#elif ((NAND_CS_MAX_NUM == 7) || (NAND_CS_MAX_NUM == 8)) + rk2818_mux_api_set(GPIOA5_FLASHCS1_SEL_NAME, IOMUXB_FLASH_CS1); + rk2818_mux_api_set(GPIOA6_FLASHCS2_SEL_NAME, IOMUXB_FLASH_CS2); + rk2818_mux_api_set(GPIOA7_FLASHCS3_SEL_NAME, IOMUXB_FLASH_CS3); + rk2818_mux_api_set(GPIOE_SPI1_FLASH_SEL1_NAME, IOMUXA_FLASH_CS45); + rk2818_mux_api_set(GPIOE_SPI1_FLASH_SEL_NAME, IOMUXA_FLASH_CS67); +#endif + return 0; +} + +struct rk2818_nand_platform_data rk2818_nand_data = { + .width = 1, /* data bus width in bytes */ + .hw_ecc = 1, /* hw ecc 0: soft ecc */ + .num_flash = 1, + .io_init = rk2818_nand_io_init, +}; + + +/*****************************************/ + static struct platform_device *devices[] __initdata = { #ifdef CONFIG_BT &rk2818_device_rfkill, @@ -1045,64 +1430,9 @@ static void rk2818_power_off(void) gpio_set_value(POWER_PIN, 0);/*power down*/ } -void lcd_set_iomux(u8 enable) -{ - int ret=-1; - - if(enable) - { - rk2818_mux_api_set(GPIOH6_IQ_SEL_NAME, 0); - ret = gpio_request(RK2818_PIN_PH6, NULL); - if(ret != 0) - { - gpio_free(RK2818_PIN_PH6); - printk(">>>>>> lcd cs gpio_request err \n "); - goto pin_err; - } - - rk2818_mux_api_set(GPIOE_I2C0_SEL_NAME, 1); - - ret = gpio_request(RK2818_PIN_PE4, NULL); - if(ret != 0) - { - gpio_free(RK2818_PIN_PE4); - printk(">>>>>> lcd clk gpio_request err \n "); - goto pin_err; - } - - ret = gpio_request(RK2818_PIN_PE5, NULL); - if(ret != 0) - { - gpio_free(RK2818_PIN_PE5); - printk(">>>>>> lcd txd gpio_request err \n "); - goto pin_err; - } - } - else - { - gpio_free(RK2818_PIN_PH6); - //rk2818_mux_api_set(GPIOH6_IQ_SEL_NAME, 1); - rk2818_mux_api_mode_resume(GPIOH6_IQ_SEL_NAME); - - gpio_free(RK2818_PIN_PE4); - gpio_free(RK2818_PIN_PE5); - //rk2818_mux_api_set(GPIOE_I2C0_SEL_NAME, 0); - rk2818_mux_api_mode_resume(GPIOE_I2C0_SEL_NAME); - } - return ; -pin_err: - return ; - -} - -struct lcd_td043mgea1_data lcd_td043mgea1 = { - .pin_txd = RK2818_PIN_PE4, - .pin_clk = RK2818_PIN_PE5, - .pin_cs = RK2818_PIN_PH6, - .screen_set_iomux = lcd_set_iomux, -}; - // adc ---> key +#define PLAY_ON_PIN RK2818_PIN_PA3 +#define PLAY_ON_LEVEL 1 static ADC_keyst gAdcValueTab[] = { {0x5c, AD2KEY1},///VOLUME_DOWN @@ -1122,8 +1452,8 @@ static unsigned char gInitKeyCode[] = }; struct adc_key_data rk2818_adc_key = { - .pin_playon = RK2818_PIN_PA3, - .playon_level = 1, + .pin_playon = PLAY_ON_PIN, + .playon_level = PLAY_ON_LEVEL, .adc_empty = 900, .adc_invalid = 20, .adc_drift = 50, @@ -1133,6 +1463,26 @@ struct adc_key_data rk2818_adc_key = { .adc_key_cnt = 10, }; +struct rk2818_adckey_platform_data rk2818_adckey_platdata = { + .adc_key = &rk2818_adc_key, +}; + +#if CONFIG_ANDROID_TIMED_GPIO +static struct timed_gpio timed_gpios[] = { + { + .name = "vibrator", + .gpio = SPI_GPIO_P1_12, + .max_timeout = 1000, + .active_low = 1, + }, +}; + +struct timed_gpio_platform_data rk28_vibrator_info = { + .num_gpios = 1, + .gpios = timed_gpios, +}; +#endif + static void __init machine_rk2818_init_irq(void) { rk2818_init_irq(); @@ -1160,16 +1510,16 @@ static void __init machine_rk2818_board_init(void) #endif platform_add_devices(devices, ARRAY_SIZE(devices)); spi_register_board_info(board_spi_devices, ARRAY_SIZE(board_spi_devices)); - rk2818_mux_api_set(GPIOB4_SPI0CS0_MMC0D4_NAME,IOMUXA_GPIO0_B4); //IOMUXA_SPI0_CSN0);//use for gpio SPI CS0 - rk2818_mux_api_set(GPIOB0_SPI0CSN1_MMC1PCA_NAME,IOMUXA_GPIO0_B0); //IOMUXA_SPI0_CSN1);//use for gpio SPI CS1 - rk2818_mux_api_set(GPIOB_SPI0_MMC0_NAME,IOMUXA_SPI0);//use for SPI CLK SDI SDO - - rk2818_mux_api_set(GPIOF5_APWM3_DPWM3_NAME,IOMUXB_GPIO1_B5); - if(0 != gpio_request(RK2818_PIN_PF5, NULL)) - { - gpio_free(RK2818_PIN_PF5); - printk(">>>>>> RK2818_PIN_PF5 gpio_request err \n "); - } + //rk2818_mux_api_set(GPIOB4_SPI0CS0_MMC0D4_NAME,IOMUXA_GPIO0_B4); //IOMUXA_SPI0_CSN0);//use for gpio SPI CS0 + //rk2818_mux_api_set(GPIOB0_SPI0CSN1_MMC1PCA_NAME,IOMUXA_GPIO0_B0); //IOMUXA_SPI0_CSN1);//use for gpio SPI CS1 + //rk2818_mux_api_set(GPIOB_SPI0_MMC0_NAME,IOMUXA_SPI0);//use for SPI CLK SDI SDO + + //rk2818_mux_api_set(GPIOF5_APWM3_DPWM3_NAME,IOMUXB_GPIO1_B5); + //if(0 != gpio_request(RK2818_PIN_PF5, NULL)) + //{ + // gpio_free(RK2818_PIN_PF5); + // printk(">>>>>> RK2818_PIN_PF5 gpio_request err \n "); + //} } static void __init machine_rk2818_mapio(void) diff --git a/arch/arm/mach-rk2818/devices.c b/arch/arm/mach-rk2818/devices.c index b97febc98d99..25ef8e558dc3 100755 --- a/arch/arm/mach-rk2818/devices.c +++ b/arch/arm/mach-rk2818/devices.c @@ -195,6 +195,9 @@ struct platform_device rk2818_device_uart0 = { .id = 0, .num_resources = ARRAY_SIZE(resources_uart0), .resource = resources_uart0, + .dev = { + .platform_data = &rk2818_serial0_platdata, + }, }; struct platform_device rk2818_device_uart1 = { .name = "rk2818_serial", @@ -235,6 +238,9 @@ struct platform_device rk2818_device_spim = { .id = 0, .num_resources = ARRAY_SIZE(resources_spim), .resource = resources_spim, + .dev = { + .platform_data = &rk2818_spi_platdata, + }, }; /* rk2818 fb resource */ @@ -269,8 +275,6 @@ struct platform_device rk2818_device_fb = { * author :nzy zhongyw * data:2010-05-18 ***************************************************************/ -extern struct rk2818bl_info rk2818_bl_info; - struct platform_device rk2818_device_backlight = { .name = "rk2818_backlight", .id = -1, @@ -348,7 +352,9 @@ struct platform_device rk2818_device_adckey = { .name = "rk2818-adckey", .id = -1, .dev.parent = &rk2818_device_adc.dev, + .dev.platform_data = &rk2818_adckey_platdata, }; + /* *rk2818 i2s */ @@ -369,11 +375,17 @@ struct platform_device rk2818_device_i2s = { .id = 0, .num_resources = ARRAY_SIZE(resources_i2s), .resource = resources_i2s, + .dev = { + .platform_data = &rk2818_i2s_platdata, + }, }; struct platform_device rk2818_device_battery = { .name = "rk2818-battery", .id = -1, + .dev = { + .platform_data = &rk2818_battery_platdata, + }, }; /* @@ -454,11 +466,7 @@ static struct resource nand_resources[] = { .flags = IORESOURCE_MEM, } }; -static struct rk2818_nand_platform_data rk2818_nand_data = { - .width = 1, /* data bus width in bytes */ - .hw_ecc = 1, /* hw ecc 0: soft ecc */ - .num_flash = 1, -}; + struct platform_device rk2818_nand_device = { .name = "rk2818-nand", .id = -1, @@ -626,19 +634,6 @@ struct platform_device usb_mass_storage_device = { }; #if CONFIG_ANDROID_TIMED_GPIO -static struct timed_gpio timed_gpios[] = { - { - .name = "vibrator", - .gpio = SPI_GPIO_P1_12, - .max_timeout = 1000, - .active_low = 1, - }, -}; - -static struct timed_gpio_platform_data rk28_vibrator_info = { - .num_gpios = 1, - .gpios = timed_gpios, -}; struct platform_device rk28_device_vibrator ={ .name = "timed-gpio", .id = -1, diff --git a/arch/arm/mach-rk2818/devices.h b/arch/arm/mach-rk2818/devices.h index 52444d86bae1..cf52b776eee4 100755 --- a/arch/arm/mach-rk2818/devices.h +++ b/arch/arm/mach-rk2818/devices.h @@ -20,7 +20,9 @@ extern struct platform_device rk2818_device_uart0; extern struct platform_device rk2818_device_uart1; extern struct platform_device rk2818_device_uart2; extern struct platform_device rk2818_device_uart3; +extern struct rk2818_serial_platform_data rk2818_serial0_platdata; extern struct platform_device rk2818_device_spim; +extern struct rk2818_spi_platform_data rk2818_spi_platdata; extern struct platform_device rk2818_device_i2c0; extern struct platform_device rk2818_device_i2c1; extern struct platform_device rk2818_device_i2c2; @@ -29,6 +31,8 @@ extern struct rk2818_i2c_platform_data default_i2c0_data; extern struct rk2818_i2c_platform_data default_i2c1_data; extern struct rk2818_i2c_spi_data default_i2c2_data; extern struct rk2818_i2c_spi_data default_i2c3_data; +extern struct rk2818_bl_info rk2818_bl_info; +extern struct rk2818_nand_platform_data rk2818_nand_data; extern struct soc_camera_link rk2818_iclink; /* ddl@rock-chips.com : camera support */ extern struct rk28camera_platform_data rk28_camera_platform_data; @@ -38,12 +42,15 @@ extern struct platform_device rk2818_device_sdmmc1; extern struct rk2818_sdmmc_platform_data default_sdmmc0_data; extern struct rk2818_sdmmc_platform_data default_sdmmc1_data; extern struct platform_device rk2818_device_i2s; +extern struct rk2818_i2s_platform_data rk2818_i2s_platdata; extern struct platform_device rk2818_device_pmem; extern struct platform_device rk2818_device_pmem_dsp; extern struct platform_device rk2818_device_fb; extern struct platform_device rk2818_device_adc; extern struct platform_device rk2818_device_adckey; +extern struct rk2818_adckey_platform_data rk2818_adckey_platdata; extern struct platform_device rk2818_device_battery; +extern struct rk2818_battery_platform_data rk2818_battery_platdata; extern struct platform_device rk2818_device_backlight; extern struct platform_device rk2818_device_camera; /* ddl@rock-chips.com : camera support */ extern struct platform_device rk2818_soc_camera_pdrv; @@ -55,5 +62,6 @@ extern struct platform_device rk2818_device_host11; extern struct platform_device android_usb_device; extern struct platform_device usb_mass_storage_device; extern struct platform_device rk28_device_vibrator; +extern struct timed_gpio_platform_data rk28_vibrator_info; #endif diff --git a/arch/arm/mach-rk2818/include/mach/board.h b/arch/arm/mach-rk2818/include/mach/board.h old mode 100644 new mode 100755 index 398bf579bc30..cb6d44f60239 --- a/arch/arm/mach-rk2818/include/mach/board.h +++ b/arch/arm/mach-rk2818/include/mach/board.h @@ -20,6 +20,16 @@ #include #include + + +#define INVALID_GPIO -1 + + +struct rk2818_io_cfg { + int (*io_init)(void *); + int (*io_deinit)(void *); +}; + /* platform device data structures */ struct platform_device; struct i2c_client; @@ -29,7 +39,8 @@ struct rk2818_sdmmc_platform_data { unsigned int use_dma:1; unsigned int no_detect:1; char dma_name[8]; - void (*cfg_gpio)(struct platform_device *dev); + int (*io_init)(void); + int (*io_deinit)(void); }; struct rk2818_i2c_spi_data { @@ -46,7 +57,8 @@ struct rk2818_i2c_platform_data { #define I2C_MODE_IRQ 0 #define I2C_MODE_POLL 1 unsigned int mode:1; - void (*cfg_gpio)(struct platform_device *dev); + int (*io_init)(void); + int (*io_deinit)(void); }; struct rk2818_fb_gpio{ @@ -69,11 +81,11 @@ struct rk2818_fb_mach_info { struct rk2818_fb_iomux *iomux; }; -struct rk2818bl_info{ +struct rk2818_bl_info{ u32 pwm_id; - u32 pw_pin; u32 bl_ref; - char *pw_iomux; + int (*io_init)(void); + int (*io_deinit)(void); struct timer_list timer; struct notifier_block freq_transition; }; @@ -113,6 +125,45 @@ struct lcd_td043mgea1_data{ void (*screen_set_iomux)(u8 enable); }; +/*battery*/ +struct rk2818_battery_platform_data { + int (*io_init)(void); + int (*io_deinit)(void); + int charge_ok_pin; +}; + +/*g_sensor*/ +struct rk2818_gs_platform_data { + int (*io_init)(void); + int (*io_deinit)(void); + int gsensor_irq_pin; +}; + +/*serial*/ +struct rk2818_serial_platform_data { + int (*io_init)(void); + int (*io_deinit)(void); +}; + +/*i2s*/ +struct rk2818_i2s_platform_data { + int (*io_init)(void); + int (*io_deinit)(void); +}; + +/*spi*/ +struct spi_cs_gpio { + const char *name; + unsigned int cs_gpio; +}; + +struct rk2818_spi_platform_data { + int (*io_init)(void); + int (*io_deinit)(void); + struct spi_cs_gpio *chipselect_gpios; + u16 num_chipselect; +}; + //ROCKCHIP AD KEY CODE ,for demo board // key ---> EV #define AD2KEY1 114 ///VOLUME_DOWN @@ -148,6 +199,12 @@ struct adc_key_data{ u32 adc_key_cnt; }; +struct rk2818_adckey_platform_data { + int (*io_init)(void); + int (*io_deinit)(void); + struct adc_key_data *adc_key; +}; + /* common init routines for use by arch/arm/mach-msm/board-*.c */ void __init rk2818_add_devices(void); void __init rk2818_map_common_io(void); diff --git a/arch/arm/mach-rk2818/include/mach/rk2818_camera.h b/arch/arm/mach-rk2818/include/mach/rk2818_camera.h old mode 100644 new mode 100755 index 1ff39173f0d2..c9d0d4a262b6 --- a/arch/arm/mach-rk2818/include/mach/rk2818_camera.h +++ b/arch/arm/mach-rk2818/include/mach/rk2818_camera.h @@ -34,8 +34,8 @@ struct rk28camera_gpio_res { }; struct rk28camera_platform_data { - int (*init)(void); - int (*deinit)(void); + int (*io_init)(void); + int (*io_deinit)(void); struct rk28camera_gpio_res gpio_res[2]; }; diff --git a/arch/arm/mach-rk2818/include/mach/rk2818_nand.h b/arch/arm/mach-rk2818/include/mach/rk2818_nand.h old mode 100644 new mode 100755 index e61d28433323..81d824e67a4e --- a/arch/arm/mach-rk2818/include/mach/rk2818_nand.h +++ b/arch/arm/mach-rk2818/include/mach/rk2818_nand.h @@ -114,6 +114,8 @@ struct rk2818_nand_platform_data { struct mtd_partition *parts; unsigned int nr_parts; size_t num_flash; + int (*io_init)(void); + int (*io_deinit)(void); }; diff --git a/arch/arm/mach-rk2818/iomux.c b/arch/arm/mach-rk2818/iomux.c old mode 100644 new mode 100755 index e280882121a5..afc695be0497 --- a/arch/arm/mach-rk2818/iomux.c +++ b/arch/arm/mach-rk2818/iomux.c @@ -114,7 +114,10 @@ EXPORT_SYMBOL(rk2818_iomux_init); */ void rk2818_mux_api_set(char *name, unsigned int mode) { - int i; + int i; + if (!name) { + return; + } for(i=0;iadap.algo_data = i2c; i2c->adap.dev.parent = &pdev->dev; - if(pdata->cfg_gpio) - pdata->cfg_gpio(pdev); + if(pdata->io_init) + pdata->io_init(); rk2818_i2c_init_hw(i2c); diff --git a/drivers/input/gsensor/mma7660.c b/drivers/input/gsensor/mma7660.c old mode 100644 new mode 100755 index 61dceedc4798..1b4f13061f92 --- a/drivers/input/gsensor/mma7660.c +++ b/drivers/input/gsensor/mma7660.c @@ -27,6 +27,7 @@ #include #include #include +#include #ifdef CONFIG_ANDROID_POWER #include #endif @@ -507,19 +508,22 @@ static int mma7660_init_client(struct i2c_client *client) struct mma7660_data *data; int ret; data = i2c_get_clientdata(client); + struct rk2818_gs_platform_data *pdata = client->dev.platform_data; - rk28printk("gpio_to_irq(%d) is %d\n",client->irq,gpio_to_irq(client->irq)); - if ( !gpio_is_valid(client->irq)) { - rk28printk("+++++++++++gpio_is_invalid\n"); - return -EINVAL; + printk("gpio_to_irq(%d) is %d\n",pdata->gsensor_irq_pin, gpio_to_irq(pdata->gsensor_irq_pin)); + if ( !gpio_is_valid(pdata->gsensor_irq_pin)) { + printk("+++++++++++gpio_is_invalid\n"); + return -1; } - ret = gpio_request(client->irq, "mma7660_int"); - if (ret) { - rk28printk( "failed to request mma7990_trig GPIO%d\n",gpio_to_irq(client->irq)); + ret = gpio_request(pdata->gsensor_irq_pin, "mma7660_int"); + if (ret) { + gpio_free(pdata->gsensor_irq_pin); + printk( "failed to request mma7990_trig GPIO%d\n",gpio_to_irq(pdata->gsensor_irq_pin)); return ret; } + + client->irq = gpio_to_irq(pdata->gsensor_irq_pin); - client->irq = gpio_to_irq(client->irq); ret = request_irq(client->irq, mma7660_interrupt, IRQF_TRIGGER_RISING, client->dev.driver->name, data); rk28printk("request irq is %d,ret is 0x%x\n",client->irq,ret); if (ret ) { diff --git a/drivers/input/keyboard/rk2818_adckey.c b/drivers/input/keyboard/rk2818_adckey.c index 75502669d295..8c35be83040c 100755 --- a/drivers/input/keyboard/rk2818_adckey.c +++ b/drivers/input/keyboard/rk2818_adckey.c @@ -27,8 +27,6 @@ #include #include -extern struct adc_key_data rk2818_adc_key; - #if 0 #define DBG(x...) printk(x) #else @@ -59,11 +57,11 @@ struct rk28_adckey struct rk28_adckey *pRk28AdcKey; -unsigned int rk28_get_keycode(unsigned int advalue,pADC_keyst ptab) +unsigned int rk28_get_keycode(unsigned int advalue,pADC_keyst ptab,struct adc_key_data *rk2818_adckey_data) { while(ptab->adc_value != 0) { - if((advalue > ptab->adc_value - rk2818_adc_key.adc_drift) && (advalue < ptab->adc_value + rk2818_adc_key.adc_drift)) + if((advalue > ptab->adc_value - rk2818_adckey_data->adc_drift) && (advalue < ptab->adc_value + rk2818_adckey_data->adc_drift)) return ptab->adc_keycode; ptab++; } @@ -128,12 +126,13 @@ static int rk28_adckey_resume(struct platform_device *pdev) static void rk28_adkeyscan_timer(unsigned long data) { unsigned int adcvalue = -1, code; - + struct adc_key_data *rk2818_adckey_data = (struct adc_key_data *)data; + pRk28AdcKey->timer.expires = jiffies + msecs_to_jiffies(10); add_timer(&pRk28AdcKey->timer); /*handle long press of play key*/ - if(gpio_get_value(rk2818_adc_key.pin_playon) == rk2818_adc_key.playon_level) + if(gpio_get_value(rk2818_adckey_data->pin_playon) == rk2818_adckey_data->playon_level) { if(++gPlayCount > 20000) gPlayCount = 101; @@ -189,10 +188,10 @@ static void rk28_adkeyscan_timer(unsigned long data) gADSampleTimes = 0; //rk28_read_adc(pRk28AdcKey); - adcvalue = gAdcValue[rk2818_adc_key.adc_chn]; - //DBG("=========== adcvalue=0x%x ===========\n",adcvalue); + adcvalue = gAdcValue[rk2818_adckey_data->adc_chn]; + //printk("=========== adcvalue=0x%x ===========\n",adcvalue); - if((adcvalue > rk2818_adc_key.adc_empty) || (adcvalue < rk2818_adc_key.adc_invalid)) + if((adcvalue > rk2818_adckey_data->adc_empty) || (adcvalue < rk2818_adckey_data->adc_invalid)) { //DBG("adcvalue invalid !!!\n"); if(gLastCode == 0) { @@ -224,7 +223,7 @@ static void rk28_adkeyscan_timer(unsigned long data) //DBG("adcvalue=0x%x\n",adcvalue); - code=rk28_get_keycode(adcvalue,rk2818_adc_key.adc_key_table); + code=rk28_get_keycode(adcvalue,rk2818_adckey_data->adc_key_table,rk2818_adckey_data); if(code) { if(code == KEYMENU) @@ -257,8 +256,12 @@ static int __devinit rk28_adckey_probe(struct platform_device *pdev) { struct rk28_adckey *adckey; struct input_dev *input_dev; - int error,i; + int error,i,irq_num; + struct rk2818_adckey_platform_data *pdata = pdev->dev.platform_data; + if (!(pdata->adc_key)) + return -1; + adckey = kzalloc(sizeof(struct rk28_adckey), GFP_KERNEL); if (adckey == NULL) { dev_err(&pdev->dev, "failed to allocate driver data\n"); @@ -266,7 +269,7 @@ static int __devinit rk28_adckey_probe(struct platform_device *pdev) } //memcpy(adckey->keycodes, gInitKeyCode, sizeof(adckey->keycodes)); - adckey->keycodes = rk2818_adc_key.initKeyCode; + adckey->keycodes = pdata->adc_key->initKeyCode; /* Create and register the input driver. */ input_dev = input_allocate_device(); @@ -288,9 +291,9 @@ static int __devinit rk28_adckey_probe(struct platform_device *pdev) input_dev->keycode = adckey->keycodes; input_dev->keycodesize = sizeof(unsigned char); - input_dev->keycodemax = rk2818_adc_key.adc_key_cnt; - for (i = 0; i < rk2818_adc_key.adc_key_cnt; i++) - set_bit(rk2818_adc_key.initKeyCode[i], input_dev->keybit); + input_dev->keycodemax = pdata->adc_key->adc_key_cnt; + for (i = 0; i < pdata->adc_key->adc_key_cnt; i++) + set_bit(pdata->adc_key->initKeyCode[i], input_dev->keybit); clear_bit(0, input_dev->keybit); adckey->input_dev = input_dev; @@ -309,52 +312,48 @@ static int __devinit rk28_adckey_probe(struct platform_device *pdev) dev_err(&pdev->dev, "failed to register input device\n"); goto failed_free_dev; } - - error = gpio_request(rk2818_adc_key.pin_playon, "play key gpio"); + + error = gpio_request(pdata->adc_key->pin_playon, "play key gpio"); if (error) { dev_err(&pdev->dev, "failed to request play key gpio\n"); goto free_gpio; } - if(rk2818_adc_key.playon_level) + + irq_num = gpio_to_irq(pdata->adc_key->pin_playon); + + if(pdata->adc_key->playon_level) { - gpio_pull_updown(rk2818_adc_key.pin_playon,GPIOPullDown); - error = request_irq(gpio_to_irq(rk2818_adc_key.pin_playon),rk28_playkey_irq,IRQF_TRIGGER_RISING,NULL,NULL); + gpio_pull_updown(pdata->adc_key->pin_playon,GPIOPullDown); + error = request_irq(irq_num,rk28_playkey_irq,IRQF_TRIGGER_RISING,NULL,NULL); if(error) { printk("unable to request play key irq\n"); goto free_gpio_irq; - } + } } else { - gpio_pull_updown(rk2818_adc_key.pin_playon,GPIOPullUp); - error = request_irq(gpio_to_irq(rk2818_adc_key.pin_playon),rk28_playkey_irq,IRQF_TRIGGER_FALLING,NULL,NULL); + gpio_pull_updown(pdata->adc_key->pin_playon,GPIOPullUp); + error = request_irq(irq_num,rk28_playkey_irq,IRQF_TRIGGER_FALLING,NULL,NULL); if(error) { printk("unable to request play key irq\n"); goto free_gpio_irq; } } + + enable_irq_wake(irq_num); // so play/wakeup key can wake up system - enable_irq_wake(gpio_to_irq(rk2818_adc_key.pin_playon)); // so play/wakeup key can wake up system -#if 0 - error = gpio_direction_input(rk2818_adc_key.pin_playon); - if (error) - { - printk("failed to set gpio rk2818_adc_key.pin_playon input\n"); - goto free_gpio_irq; - } -#endif - setup_timer(&adckey->timer, rk28_adkeyscan_timer, (unsigned long)adckey); + setup_timer(&adckey->timer, rk28_adkeyscan_timer, (unsigned long)(pdata->adc_key)); adckey->timer.expires = jiffies+50; add_timer(&adckey->timer); printk(KERN_INFO "rk2818_adckey: driver initialized\n"); return 0; free_gpio_irq: - free_irq(gpio_to_irq(rk2818_adc_key.pin_playon),NULL); + free_irq(irq_num,NULL); free_gpio: - gpio_free(rk2818_adc_key.pin_playon); + gpio_free(pdata->adc_key->pin_playon); failed_free_dev: platform_set_drvdata(pdev, NULL); input_free_device(input_dev); @@ -366,13 +365,14 @@ failed_free: static int __devexit rk28_adckey_remove(struct platform_device *pdev) { struct rk28_adckey *adckey = platform_get_drvdata(pdev); - + struct rk2818_adckey_platform_data *pdata = pdev->dev.platform_data; + input_unregister_device(adckey->input_dev); input_free_device(adckey->input_dev); platform_set_drvdata(pdev, NULL); kfree(adckey); - free_irq(gpio_to_irq(rk2818_adc_key.pin_playon),NULL); - gpio_free(rk2818_adc_key.pin_playon); + free_irq(gpio_to_irq(pdata->adc_key->pin_playon), NULL); + gpio_free(pdata->adc_key->pin_playon); return 0; } diff --git a/drivers/input/touchscreen/xpt2046_ts.c b/drivers/input/touchscreen/xpt2046_ts.c old mode 100644 new mode 100755 index fcc74a55fc6c..69e2b3d5142b --- a/drivers/input/touchscreen/xpt2046_ts.c +++ b/drivers/input/touchscreen/xpt2046_ts.c @@ -659,7 +659,13 @@ static int __devinit setup_pendown(struct spi_device *spi, struct xpt2046 *ts) ts->get_pendown_state = pdata->get_pendown_state; return 0; } - + + if (pdata->io_init) { + err = pdata->io_init(); + if (err) + dev_err(&spi->dev, "xpt2046 io_init fail\n"); + } + err = gpio_request(pdata->gpio_pendown, "xpt2046_pendown"); if (err) { dev_err(&spi->dev, "failed to request pendown GPIO%d\n", @@ -693,11 +699,18 @@ static int __devinit xpt2046_probe(struct spi_device *spi) dev_dbg(&spi->dev, "no IRQ?\n"); } + /* if (!pdata) { spi->dev.platform_data = &xpt2046_info; pdata = spi->dev.platform_data; } - + */ + + if (!pdata) { + dev_err(&spi->dev, "empty platform_data\n"); + return -EFAULT; + } + /* don't exceed max specified sample rate */ if (spi->max_speed_hz > (125000 * SAMPLE_BITS)) { dev_dbg(&spi->dev, "f(sample) %d KHz?\n", @@ -747,8 +760,8 @@ static int __devinit xpt2046_probe(struct spi_device *spi) ts->filter_cleanup = pdata->filter_cleanup; } else if (pdata->debounce_max) { ts->debounce_max = pdata->debounce_max; - if (ts->debounce_max < DEBOUNCE_REPTIME) - ts->debounce_max = DEBOUNCE_REPTIME; + if (ts->debounce_max < pdata->debounce_rep) + ts->debounce_max = pdata->debounce_rep; ts->debounce_tol = pdata->debounce_tol; ts->debounce_rep = pdata->debounce_rep; ts->filter = xpt2046_debounce; diff --git a/drivers/input/touchscreen/xpt2046_ts.h b/drivers/input/touchscreen/xpt2046_ts.h old mode 100644 new mode 100755 index a805c82c7c9c..4ff65ba1eb69 --- a/drivers/input/touchscreen/xpt2046_ts.h +++ b/drivers/input/touchscreen/xpt2046_ts.h @@ -50,5 +50,7 @@ struct xpt2046_platform_data { int (*filter) (void *filter_data, int data_idx, int *val); void (*filter_cleanup)(void *filter_data); void (*wait_for_sync)(void); + int (* io_init)(void); + int (* io_deinit)(void); }; #endif diff --git a/drivers/input/touchscreen/xpt2046_ts_320X480.c b/drivers/input/touchscreen/xpt2046_ts_320X480.c old mode 100644 new mode 100755 index 86ce61d157ba..e15e2f415010 --- a/drivers/input/touchscreen/xpt2046_ts_320X480.c +++ b/drivers/input/touchscreen/xpt2046_ts_320X480.c @@ -729,7 +729,13 @@ static int __devinit setup_pendown(struct spi_device *spi, struct xpt2046 *ts) ts->get_pendown_state = pdata->get_pendown_state; return 0; } - + + if (pdata->io_init) { + err = pdata->io_init(); + if (err) + dev_err(&spi->dev, "xpt2046 io_init fail\n"); + } + err = gpio_request(pdata->gpio_pendown, "xpt2046_pendown"); if (err) { dev_err(&spi->dev, "failed to request pendown GPIO%d\n", @@ -763,11 +769,18 @@ static int __devinit xpt2046_probe(struct spi_device *spi) dev_dbg(&spi->dev, "no IRQ?\n"); } + /* if (!pdata) { xpt2046printk("-----------------pdata is null -------------------------\n"); spi->dev.platform_data = &xpt2046_info; pdata = spi->dev.platform_data; } + */ + + if (!pdata) { + dev_err(&spi->dev, "empty platform_data\n"); + return -EFAULT; + } /* don't exceed max specified sample rate */ if (spi->max_speed_hz > (125000 * SAMPLE_BITS)) { @@ -818,8 +831,8 @@ static int __devinit xpt2046_probe(struct spi_device *spi) ts->filter_cleanup = pdata->filter_cleanup; } else if (pdata->debounce_max) { ts->debounce_max = pdata->debounce_max; - if (ts->debounce_max < DEBOUNCE_REPTIME) - ts->debounce_max = DEBOUNCE_REPTIME; + if (ts->debounce_max < pdata->debounce_rep) + ts->debounce_max = pdata->debounce_rep; ts->debounce_tol = pdata->debounce_tol; ts->debounce_rep = pdata->debounce_rep; ts->filter = xpt2046_debounce; diff --git a/drivers/media/video/rk2818_camera.c b/drivers/media/video/rk2818_camera.c old mode 100644 new mode 100755 index f6f0273e4595..a7fb7858bc7b --- a/drivers/media/video/rk2818_camera.c +++ b/drivers/media/video/rk2818_camera.c @@ -940,8 +940,8 @@ static int rk28_camera_probe(struct platform_device *pdev) pcdev->res = res; pcdev->pdata = pdev->dev.platform_data; /* ddl@rock-chips.com : Request IO in init function */ - if (pcdev->pdata && pcdev->pdata->init) { - pcdev->pdata->init(); + if (pcdev->pdata && pcdev->pdata->io_init) { + pcdev->pdata->io_init(); } INIT_LIST_HEAD(&pcdev->capture); @@ -1016,8 +1016,8 @@ static int __devexit rk28_camera_remove(struct platform_device *pdev) res = pcdev->res; release_mem_region(res->start, res->end - res->start + 1); - if (pcdev->pdata && pcdev->pdata->deinit) { /* ddl@rock-chips.com : Free IO in deinit function */ - pcdev->pdata->deinit(); + if (pcdev->pdata && pcdev->pdata->io_deinit) { /* ddl@rock-chips.com : Free IO in deinit function */ + pcdev->pdata->io_deinit(); } kfree(pcdev); diff --git a/drivers/mmc/host/rk2818-sdmmc.c b/drivers/mmc/host/rk2818-sdmmc.c old mode 100644 new mode 100755 index 20f01fe980f1..2bf247e30be0 --- a/drivers/mmc/host/rk2818-sdmmc.c +++ b/drivers/mmc/host/rk2818-sdmmc.c @@ -1729,8 +1729,8 @@ static int rk2818_sdmmc_probe(struct platform_device *pdev) dev_err(&pdev->dev, "No platform data\n"); return -EINVAL; } - if(pdata->cfg_gpio) - pdata->cfg_gpio(pdev); + if(pdata->io_init) + pdata->io_init(); mmc = mmc_alloc_host(sizeof(struct rk2818_sdmmc_host), &pdev->dev); if (!mmc) diff --git a/drivers/mtd/nand/rk2818_nand.c b/drivers/mtd/nand/rk2818_nand.c old mode 100644 new mode 100755 index 49ec53fc39e9..683acfea1d2d --- a/drivers/mtd/nand/rk2818_nand.c +++ b/drivers/mtd/nand/rk2818_nand.c @@ -884,12 +884,10 @@ static int rk2818_nand_probe(struct platform_device *pdev) this->ecc.layout = &nand_hw_eccoob_16; } // iomux flash cs1~cs7 - rk2818_mux_api_set(GPIOA5_FLASHCS1_SEL_NAME, IOMUXB_FLASH_CS1); - rk2818_mux_api_set(GPIOA6_FLASHCS2_SEL_NAME, IOMUXB_FLASH_CS2); - rk2818_mux_api_set(GPIOA7_FLASHCS3_SEL_NAME, IOMUXB_FLASH_CS3); - rk2818_mux_api_set(GPIOE_SPI1_FLASH_SEL1_NAME, IOMUXA_FLASH_CS45); - rk2818_mux_api_set(GPIOE_SPI1_FLASH_SEL_NAME, IOMUXA_FLASH_CS67); - + if (pdata && pdata->io_init) { + pdata->io_init(); + } + /* Scan to find existence of the device */ if (nand_scan(mtd, 8)) { // rk2818 nandc support max 8 cs @@ -900,6 +898,7 @@ static int rk2818_nand_probe(struct platform_device *pdev) } //¸ù¾ÝƬѡÇé¿ö»Ö¸´IO MUXԭʼֵ +#if 0 chip = mtd->priv; switch(chip->numchips) { @@ -920,6 +919,7 @@ static int rk2818_nand_probe(struct platform_device *pdev) default: DEBUG(MTD_DEBUG_LEVEL0, "RK2818 NAND: numchips error!!!\n"); } +#endif #if 0 // rk281x dma mode bch must (1k data + 32 oob) bytes align , so cheat system writesize =1024,oobsize=32 mtd->writesize = 1024; diff --git a/drivers/net/dm9000.c b/drivers/net/dm9000.c index f011aa51d4cf..26ad04afe73e 100755 --- a/drivers/net/dm9000.c +++ b/drivers/net/dm9000.c @@ -1517,12 +1517,20 @@ dm9000_probe(struct platform_device *pdev) goto out; } } - if (pdata && pdata->get_irq_num) { - ndev->irq = pdata->get_irq_num(); - } - else { - ndev->irq = db->irq_res->start; - } + + if (gpio_request(pdata->irq_pin, "dm9000 interrupt")) { + gpio_free(pdata->irq_pin); + if (pdata->io_deinit) + pdata->io_deinit(); + printk("[fun:%s line:%d], request gpio for net interrupt fail\n", __func__,__LINE__); + ret = -EINVAL; + goto out; + } + gpio_pull_updown(pdata->irq_pin, pdata->irq_pin_value); + gpio_direction_input(pdata->irq_pin); + + ndev->irq = gpio_to_irq(pdata->irq_pin); + //ndev->irq = db->irq_res->start; /* ensure at least we have a default set of IO routines */ dm9000_set_io(db, iosize); @@ -1719,6 +1727,7 @@ dm9000_drv_remove(struct platform_device *pdev) struct dm9000_plat_data *pdata = pdev->dev.platform_data; //deinit io for dm9000 + gpio_free(pdata->irq_pin); if (pdata && pdata->io_deinit) pdata->io_deinit(); diff --git a/drivers/power/rk2818_battery.c b/drivers/power/rk2818_battery.c old mode 100644 new mode 100755 index a2589177c23d..b70850d44d2a --- a/drivers/power/rk2818_battery.c +++ b/drivers/power/rk2818_battery.c @@ -27,7 +27,7 @@ #include #include #include - +#include #if 0 #define DBG(x...) printk(x) #else @@ -56,7 +56,6 @@ #define BATT_PRESENT_TRUE 1 #define BATT_PRESENT_FALSE 0 #define BAT_1V2_VALUE 1330 -#define CHARGEOK_PIN RK2818_PIN_PB1 #define BAT_LOADER_STATUS 0 //Óõç״̬ #define BAT_CHANGE_STATUS 1 //²¨¶¯×´Ì¬ @@ -112,6 +111,8 @@ struct rk2818_battery_data { struct power_supply battery; struct power_supply usb; struct power_supply ac; + + int charge_ok_pin; int adc_bat_divider; int bat_max; @@ -155,7 +156,7 @@ static void rk2818_get_bat_status(struct rk2818_battery_data *bat) { if(rk2818_get_charge_status() == 1) { - if(gpio_get_value (CHARGEOK_PIN) == 1) //CHG_OK ==0 + if(gpio_get_value (bat->charge_ok_pin) == 1) //CHG_OK ==0 { gBatStatus = POWER_SUPPLY_STATUS_FULL; DBG("Battery is Full!\n"); @@ -543,15 +544,22 @@ static int rk2818_battery_probe(struct platform_device *pdev) { int ret; struct rk2818_battery_data *data; + struct rk2818_battery_platform_data *pdata = pdev->dev.platform_data; - ret = gpio_request(CHARGEOK_PIN, NULL); + if (pdata && pdata->io_init) { + ret = pdata->io_init(); + if (ret) + goto err_free_gpio1; + } + + ret = gpio_request(pdata->charge_ok_pin, NULL); if (ret) { printk("failed to request charge_ok gpio\n"); goto err_free_gpio1; } - gpio_pull_updown(CHARGEOK_PIN, GPIOPullUp);//important - ret = gpio_direction_input(CHARGEOK_PIN); + gpio_pull_updown(pdata->charge_ok_pin, GPIOPullUp);//important + ret = gpio_direction_input(pdata->charge_ok_pin); if (ret) { printk("failed to set gpio charge_ok input\n"); goto err_free_gpio1; @@ -587,6 +595,8 @@ static int rk2818_battery_probe(struct platform_device *pdev) data->ac.get_property = rk2818_ac_get_property; data->ac.name = "ac"; data->ac.type = POWER_SUPPLY_TYPE_MAINS; + + data->charge_ok_pin = pdata->charge_ok_pin; ret = power_supply_register(&pdev->dev, &data->ac); if (ret) @@ -629,19 +639,20 @@ err_ac_failed: err_data_alloc_failed: err_free_gpio1: - gpio_free(CHARGEOK_PIN); + gpio_free(pdata->charge_ok_pin); return ret; } static int rk2818_battery_remove(struct platform_device *pdev) { struct rk2818_battery_data *data = platform_get_drvdata(pdev); + struct rk2818_battery_platform_data *pdata = pdev->dev.platform_data; power_supply_unregister(&data->battery); power_supply_unregister(&data->usb); power_supply_unregister(&data->ac); - gpio_free(CHARGEOK_PIN); free_irq(data->irq, data); + gpio_free(pdata->charge_ok_pin); kfree(data); gBatteryData = NULL; return 0; diff --git a/drivers/serial/rk2818_serial.c b/drivers/serial/rk2818_serial.c index 8cccf00b2355..b3c4c116215e 100755 --- a/drivers/serial/rk2818_serial.c +++ b/drivers/serial/rk2818_serial.c @@ -33,7 +33,7 @@ #include #include #include - +#include #include "rk2818_serial.h" /* @@ -340,8 +340,6 @@ static void rk2818_serial_set_termios(struct uart_port *port, struct ktermios *t if(termios->c_cflag & CRTSCTS) { /*¿ªÆôuart0Ó²¼þÁ÷¿Ø*/ - rk2818_mux_api_set(GPIOB2_U0CTSN_SEL_NAME, IOMUXB_UART0_CTS_N); - rk2818_mux_api_set(GPIOB3_U0RTSN_SEL_NAME, IOMUXB_UART0_RTS_N); printk("start CRTSCTS control and baudrate is %d\n",baud); umcon=rk2818_uart_read(port,UART_MCR); printk("UART_GET_MCR umcon=0x%x\n",umcon); @@ -623,73 +621,15 @@ static int __devinit rk2818_serial_probe(struct platform_device *pdev) struct rk2818_port *rk2818_port; struct resource *resource; struct uart_port *port; - int ret = 0; - + struct rk2818_serial_platform_data *pdata = pdev->dev.platform_data; + if (unlikely(pdev->id < 0 || pdev->id >= UART_NR)) return -ENXIO; printk(KERN_INFO "rk2818_serial: detected port %d\n", pdev->id); - -#if 1 -//cz@rock-chips.com -//20100808 -//UART0µÄËĸö¹Ü½ÅÏÈIOMUX³ÉGPIO -//È»ºó·Ö±ðÉèÖÃÊäÈëÊä³ö/À­¸ßÀ­µÍ´¦Àí -//×îºóÔÙIOMUX³ÉUART -//·ÀÖ¹Ö±½ÓIOMUX³ÉUARTºóËĸö¹Ü½ÅµÄ״̬²»¶Ôʱ -//²Ù×÷UARTµ¼ÖÂUART_USR_BUSYʼÖÕΪ1Ôì³ÉÈçÏÂËÀÑ­»· -//while(rk2818_uart_read(port,UART_USR)&UART_USR_BUSY) -//UARTËĸö¹Ü½ÅÔÚδ´«ÊäʱÕý³£×´Ì¬Ó¦¸ÃΪ£º -//RX/TX£ºHIGH -//CTS/RTS£ºLOW -//×¢Ò⣺CTS/RTSΪµÍÓÐЧ£¬Ó²¼þÉϲ»Ó¦¸ÃÇ¿ÐÐ×öÉÏÀ­ - if(pdev->id == 0) - { - rk2818_mux_api_set(GPIOG1_UART0_MMC1WPT_NAME, IOMUXA_GPIO1_C1 /*IOMUXA_UART0_SOUT*/); - rk2818_mux_api_set(GPIOG0_UART0_MMC1DET_NAME, IOMUXA_GPIO1_C0 /*IOMUXA_UART0_SIN*/); - - ret = gpio_request(RK2818_PIN_PG0, NULL); - if(ret != 0) - { - gpio_free(RK2818_PIN_PG0); - } - gpio_direction_output(RK2818_PIN_PG0,GPIO_HIGH); - - - ret = gpio_request(RK2818_PIN_PG1, NULL); - if(ret != 0) - { - gpio_free(RK2818_PIN_PG1); - } - gpio_direction_output(RK2818_PIN_PG1,GPIO_HIGH); - - gpio_pull_updown(RK2818_PIN_PG1,GPIOPullUp); - gpio_pull_updown(RK2818_PIN_PG0,GPIOPullUp); - - rk2818_mux_api_set(GPIOG1_UART0_MMC1WPT_NAME, IOMUXA_UART0_SOUT); - rk2818_mux_api_set(GPIOG0_UART0_MMC1DET_NAME, IOMUXA_UART0_SIN); - - rk2818_mux_api_set(GPIOB2_U0CTSN_SEL_NAME, IOMUXB_GPIO0_B2/*IOMUXB_UART0_CTS_N*/); - rk2818_mux_api_set(GPIOB3_U0RTSN_SEL_NAME, IOMUXB_GPIO0_B3/*IOMUXB_UART0_RTS_N*/); - - ret = gpio_request(RK2818_PIN_PB2, NULL); - if(ret != 0) - { - gpio_free(RK2818_PIN_PB2); - } - gpio_direction_input(RK2818_PIN_PB2); - // gpio_direction_output(RK2818_PIN_PB2,GPIO_LOW); - - ret = gpio_request(RK2818_PIN_PB3, NULL); - if(ret != 0) - { - gpio_free(RK2818_PIN_PB3); - } - gpio_direction_output(RK2818_PIN_PB3,GPIO_LOW); - } -#endif - + if (pdata && pdata->io_init) + pdata->io_init(); port = get_port_from_line(pdev->id); port->dev = &pdev->dev; diff --git a/drivers/spi/rk2818_spim.c b/drivers/spi/rk2818_spim.c old mode 100644 new mode 100755 index 067853c05b31..0146ee12be5f --- a/drivers/spi/rk2818_spim.c +++ b/drivers/spi/rk2818_spim.c @@ -26,6 +26,7 @@ #include "rk2818_spim.h" #include +#include #ifdef CONFIG_DEBUG_FS #include @@ -62,7 +63,7 @@ struct chip_data { u32 speed_hz; /* baud rate */ int (*write)(struct rk2818_spi *dws); int (*read)(struct rk2818_spi *dws); - void (*cs_control)(u32 command); + void (*cs_control)(struct rk2818_spi *dws, u32 cs); }; #ifdef CONFIG_DEBUG_FS @@ -183,17 +184,17 @@ static void flush(struct rk2818_spi *dws) wait_till_not_busy(dws); } -static void null_cs_control(u32 command) +static void spi_cs_control(struct rk2818_spi *dws, u32 cs) { - //printk("null_cs_control [%d]\n", command); - if(command == 2) - gpio_direction_output(RK2818_PIN_PB0,GPIO_LOW); - else if(command == 1) - gpio_direction_output(RK2818_PIN_PB4,GPIO_LOW); - else{ - gpio_direction_output(RK2818_PIN_PB0,GPIO_HIGH); - gpio_direction_output(RK2818_PIN_PB4,GPIO_HIGH); - } + struct rk2818_spi_platform_data *pdata = dws->master->dev.platform_data; + struct spi_cs_gpio *cs_gpios = pdata->chipselect_gpios; + int i; + + if (cs == 0) + for (i=0; inum_chipselect; i++) + gpio_direction_output(cs_gpios[i].cs_gpio, GPIO_HIGH); + else + gpio_direction_output(cs_gpios[cs-1].cs_gpio, GPIO_LOW); } static int null_writer(struct rk2818_spi *dws) @@ -332,7 +333,7 @@ static void giveback(struct rk2818_spi *dws) transfer_list); if (!last_transfer->cs_change) - dws->cs_control(MRST_SPI_DEASSERT); + dws->cs_control(dws,MRST_SPI_DEASSERT); msg->state = NULL; if (msg->complete) @@ -435,7 +436,7 @@ static void spi_chip_sel(struct rk2818_spi *dws, u16 cs) return; if (dws->cs_control){ - dws->cs_control(cs+1); + dws->cs_control(dws, cs+1); } //rk2818_writel(dws, SPIM_SER, 1 << cs); rk2818_writel(dws, SPIM_SER, 1 << 0); @@ -719,7 +720,7 @@ static int rk2818_spi_setup(struct spi_device *spi) if (!chip) return -ENOMEM; - chip->cs_control = null_cs_control; + chip->cs_control = spi_cs_control; chip->enable_dma = 1; //0; } @@ -925,10 +926,28 @@ static int __init rk2818_spim_probe(struct platform_device *pdev) struct rk2818_spi *dws; struct spi_master *master; int irq; - int ret; - - gpio_request(RK2818_PIN_PB0, "rk2818_spim"); - gpio_request(RK2818_PIN_PB4, "rk2818_spim"); + int ret,i,j; + struct rk2818_spi_platform_data *pdata = pdev->dev.platform_data; + struct spi_cs_gpio *cs_gpios = pdata->chipselect_gpios; + + if (pdata && pdata->io_init) { + pdata->io_init(); + } + + if (cs_gpios) { + for (i=0; inum_chipselect; i++) { + ret = gpio_request(cs_gpios[i].cs_gpio, cs_gpios[i].name); + if (ret) { + for (j=0;jio_deinit) + pdata->io_deinit(); + return -1; + } + } + } + regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!regs) return -ENXIO; @@ -967,11 +986,8 @@ static int __init rk2818_spim_probe(struct platform_device *pdev) } master->mode_bits = SPI_CPOL | SPI_CPHA; master->bus_num = pdev->id; -#if defined(CONFIG_MACH_RAHO) - master->num_chipselect = 3; //raho ´ó°åÐèÒªÖ§³Ö3¸öƬѡ dxj -#else - master->num_chipselect = 2; -#endif + master->num_chipselect = pdata->num_chipselect; + master->dev.platform_data = pdata; master->cleanup = rk2818_spi_cleanup; master->setup = rk2818_spi_setup; master->transfer = rk2818_spi_transfer; diff --git a/drivers/spi/rk2818_spim.h b/drivers/spi/rk2818_spim.h old mode 100644 new mode 100755 index efc6f4c99067..66b86ffb64c8 --- a/drivers/spi/rk2818_spim.h +++ b/drivers/spi/rk2818_spim.h @@ -136,7 +136,7 @@ struct rk2818_spi { int (*write)(struct rk2818_spi *dws); int (*read)(struct rk2818_spi *dws); irqreturn_t (*transfer_handler)(struct rk2818_spi *dws); - void (*cs_control)(u32 command); + void (*cs_control)(struct rk2818_spi *dws, u32 cs); /* Dma info */ int dma_inited; @@ -206,7 +206,7 @@ struct rk2818_spi_chip { u8 poll_mode; /* 0 for contoller polling mode */ u8 type; /* SPI/SSP/Micrwire */ u8 enable_dma; - void (*cs_control)(u32 command); + void (*cs_control)(struct rk2818_spi *dws, u32 cs); }; #endif /* __DRIVERS_SPIM_RK2818_HEADER_H */ diff --git a/drivers/video/backlight/rk2818_backlight.c b/drivers/video/backlight/rk2818_backlight.c old mode 100644 new mode 100755 index d4dd7aba1d8a..3c1a12943f49 --- a/drivers/video/backlight/rk2818_backlight.c +++ b/drivers/video/backlight/rk2818_backlight.c @@ -62,7 +62,7 @@ static int suspend_flag = 0; static s32 rk2818_bl_update_status(struct backlight_device *bl) { u32 divh,div_total; - struct rk2818bl_info *rk2818_bl_info = bl->dev.parent->platform_data; + struct rk2818_bl_info *rk2818_bl_info = bl->dev.parent->platform_data; u32 id = rk2818_bl_info->pwm_id; u32 ref = rk2818_bl_info->bl_ref; @@ -87,7 +87,7 @@ static s32 rk2818_bl_update_status(struct backlight_device *bl) static s32 rk2818_bl_get_brightness(struct backlight_device *bl) { u32 divh,div_total; - struct rk2818bl_info *rk2818_bl_info = bl->dev.parent->platform_data; + struct rk2818_bl_info *rk2818_bl_info = bl->dev.parent->platform_data; u32 id = rk2818_bl_info->pwm_id; u32 ref = rk2818_bl_info->bl_ref; @@ -111,7 +111,7 @@ static struct backlight_ops rk2818_bl_ops = { static int rk2818_bl_change_clk(struct notifier_block *nb, unsigned long val, void *data) { - struct rk2818bl_info *rk2818_bl_info; + struct rk2818_bl_info *rk2818_bl_info; u32 id; u32 divl, divh, tmp; u32 div_total; @@ -160,7 +160,7 @@ static int rk2818_bl_change_clk(struct notifier_block *nb, unsigned long val, vo } static void rk2818_delaybacklight_timer(unsigned long data) { - struct rk2818bl_info *rk2818_bl_info = (struct rk2818bl_info *)data; + struct rk2818_bl_info *rk2818_bl_info = (struct rk2818_bl_info *)data; u32 id, brightness; u32 div_total, divh; id = rk2818_bl_info->pwm_id; @@ -179,7 +179,7 @@ static void rk2818_delaybacklight_timer(unsigned long data) #ifdef CONFIG_ANDROID_POWER static void rk2818_bl_suspend(android_early_suspend_t *h) { - struct rk2818bl_info *rk2818_bl_info; + struct rk2818_bl_info *rk2818_bl_info; u32 id; u32 div_total, divh; @@ -205,7 +205,7 @@ static void rk2818_bl_suspend(android_early_suspend_t *h) static void rk2818_bl_resume(android_early_suspend_t *h) { - struct rk2818bl_info *rk2818_bl_info; + struct rk2818_bl_info *rk2818_bl_info; // u32 id, brightness; //u32 div_total, divh; DBG(">>>>>> %s : %s\n", __FILE__, __FUNCTION__); @@ -235,19 +235,10 @@ static void rk2818_bl_resume(android_early_suspend_t *h) static android_early_suspend_t bl_early_suspend; #endif -static char *pwm_iomux[] = { - GPIOF2_APWM0_SEL_NAME, - GPIOF3_APWM1_MMC0DETN_NAME, - GPIOF4_APWM2_MMC0WPT_NAME, - GPIOF5_APWM3_DPWM3_NAME, -}; - static int rk2818_backlight_probe(struct platform_device *pdev) { int ret = 0; - struct rk2818bl_info *rk2818_bl_info = pdev->dev.platform_data; - u32 pin = (rk2818_bl_info->pw_pin >> 8) & 0xff; - u32 lev = rk2818_bl_info->pw_pin & 0xf; + struct rk2818_bl_info *rk2818_bl_info = pdev->dev.platform_data; u32 id = rk2818_bl_info->pwm_id; u32 divh, div_total; struct clk* arm_pclk; @@ -309,30 +300,16 @@ static int rk2818_backlight_probe(struct platform_device *pdev) android_register_early_suspend(&bl_early_suspend); #endif - rk2818_mux_api_set(pwm_iomux[id], 1); - - if(rk2818_bl_info->pw_iomux) - { - rk2818_mux_api_set(rk2818_bl_info->pw_iomux, 0); + if (rk2818_bl_info && rk2818_bl_info->io_init) { + rk2818_bl_info->io_init(); } - ret = gpio_request(pin, NULL); - if(ret != 0) - { - gpio_free(pin); - printk(KERN_ERR ">>>>>> lcd_cs gpio_request err \n "); - } - - gpio_direction_output(pin, 0); - gpio_set_value(pin, lev); - - return 0; + return ret; } static int rk2818_backlight_remove(struct platform_device *pdev) { - struct rk2818bl_info *rk2818_bl_info = pdev->dev.platform_data; - u32 pin = (rk2818_bl_info->pw_pin >> 8) & 0xff; + struct rk2818_bl_info *rk2818_bl_info = pdev->dev.platform_data; if (rk2818_bl) { backlight_device_unregister(rk2818_bl); @@ -340,7 +317,9 @@ static int rk2818_backlight_remove(struct platform_device *pdev) android_unregister_early_suspend(&bl_early_suspend); #endif cpufreq_unregister_notifier(&rk2818_bl_info->freq_transition, CPUFREQ_TRANSITION_NOTIFIER); - gpio_free(pin); + if (rk2818_bl_info && rk2818_bl_info->io_deinit) { + rk2818_bl_info->io_deinit(); + } return 0; } else { DBG(KERN_CRIT "%s: no backlight device has registered\n", @@ -352,14 +331,13 @@ static void rk2818_backlight_shutdown(struct platform_device *pdev) { u32 divh,div_total; - struct rk2818bl_info *rk2818_bl_info = pdev->dev.platform_data; + struct rk2818_bl_info *rk2818_bl_info = pdev->dev.platform_data; u32 id = rk2818_bl_info->pwm_id; - u32 pin=rk2818_bl_info->pw_pin; u32 brightness; - u8 lev; brightness = rk2818_bl->props.brightness; brightness/=2; div_total = read_pwm_reg(id, PWM_REG_LRC); + if (rk2818_bl_info->bl_ref) { divh = div_total*(brightness)/BL_STEP; } else { @@ -368,6 +346,7 @@ static void rk2818_backlight_shutdown(struct platform_device *pdev) write_pwm_reg(id, PWM_REG_HRC, divh); //printk("divh=%d\n",divh); mdelay(100); + brightness/=2; if (rk2818_bl_info->bl_ref) { divh = div_total*(brightness)/BL_STEP; @@ -380,11 +359,11 @@ static void rk2818_backlight_shutdown(struct platform_device *pdev) /*set PF1=1 PF2=1 for close backlight*/ if(rk2818_bl_info->bl_ref) { - lev = GPIO_LOW; + divh = 0; } else { - lev = GPIO_HIGH; + divh = div_total; } - gpio_set_value(pin, lev); + write_pwm_reg(id, PWM_REG_HRC, divh); } diff --git a/include/linux/dm9000.h b/include/linux/dm9000.h index 8b621fa50e3a..def04936bacf 100755 --- a/include/linux/dm9000.h +++ b/include/linux/dm9000.h @@ -32,8 +32,9 @@ struct dm9000_plat_data { //gpio init&deinit int (*io_init)(void); int (*io_deinit)(void); - int (*get_irq_num)(void); - + int irq_pin; + int irq_pin_value; + /* allow replacement IO routines */ void (*inblk)(void __iomem *reg, void *data, int len); diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c index eab18432f53e..e634e7769a09 100755 --- a/sound/soc/codecs/wm8994.c +++ b/sound/soc/codecs/wm8994.c @@ -2056,10 +2056,10 @@ static const DECLARE_TLV_DB_SCALE(bypass_tlv, -1500, 300, 0); static const struct snd_kcontrol_new wm8994_snd_controls[] = { -/* 鍠囧彮 */ +/* 鍠囧å½?*/ SOC_DOUBLE_SWITCH_WM8994CODEC("Speaker incall Switch", SPEAKER_INCALL), SOC_DOUBLE_SWITCH_WM8994CODEC("Speaker normal Switch", SPEAKER_NORMAL), -/* 鍚瓛 */ +/* 鍚ç“?*/ SOC_DOUBLE_SWITCH_WM8994CODEC("Earpiece incall Switch", EARPIECE_INCALL), SOC_DOUBLE_SWITCH_WM8994CODEC("Earpiece normal Switch", EARPIECE_NORMAL), /* 鑰虫満 */ @@ -2071,7 +2071,7 @@ SOC_DOUBLE_SWITCH_WM8994CODEC("Bluetooth normal Switch", BLUETOOTH_SCO_NORMAL), /* 钃濈墮A2DP */ SOC_DOUBLE_SWITCH_WM8994CODEC("Bluetooth-A2DP incall Switch", BLUETOOTH_A2DP_INCALL), SOC_DOUBLE_SWITCH_WM8994CODEC("Bluetooth-A2DP normal Switch", BLUETOOTH_A2DP_NORMAL), -/* 鑰抽害 */ +/* 鑰抽å®?*/ SOC_DOUBLE_SWITCH_WM8994CODEC("Capture Switch", MIC_CAPTURE), }; @@ -2718,7 +2718,9 @@ static int wm8994_i2c_probe(struct i2c_client *i2c, { struct wm8994_priv *wm8994; struct snd_soc_codec *codec; + struct wm8994_platform_data *wm8994_data = i2c->dev.platform_data; wm8994_client=i2c; + wm8994 = kzalloc(sizeof(struct wm8994_priv), GFP_KERNEL); if (wm8994 == NULL) return -ENOMEM; @@ -2729,6 +2731,12 @@ static int wm8994_i2c_probe(struct i2c_client *i2c, codec->control_data = i2c; codec->dev = &i2c->dev; + + if (!wm8994_data) { + dev_err(codec->dev, "empty wm8994 platform_data\n"); + kfree(wm8994); + return -EFAULT; + } return wm8994_register(wm8994, SND_SOC_I2C); } diff --git a/sound/soc/codecs/wm8994.h b/sound/soc/codecs/wm8994.h old mode 100644 new mode 100755 index 208845aa66cd..ff9051e28674 --- a/sound/soc/codecs/wm8994.h +++ b/sound/soc/codecs/wm8994.h @@ -58,4 +58,18 @@ extern struct snd_soc_dai wm8994_dai; extern struct snd_soc_codec_device soc_codec_dev_wm8994; void wm8994_codec_set_volume(unsigned char mode,unsigned char volume); +struct wm8994_platform_data { + unsigned int mic_input; + unsigned int micBase_vcc; + unsigned int bb_input; + unsigned int bb_output; + unsigned int frequence; + unsigned int enable_pin; + unsigned int headset_pin; + unsigned int headset_call_vol; + unsigned int speaker_call_vol; + unsigned int earpiece_call_vol; + unsigned int bt_call_vol; +}; + #endif diff --git a/sound/soc/rk2818/rk2818_i2s.c b/sound/soc/rk2818/rk2818_i2s.c index 3d456955b294..05804af27657 100755 --- a/sound/soc/rk2818/rk2818_i2s.c +++ b/sound/soc/rk2818/rk2818_i2s.c @@ -31,6 +31,7 @@ #include #include #include +#include #include "rk2818_pcm.h" #include "rk2818_i2s.h" @@ -314,9 +315,6 @@ static int rockchip_i2s_dai_probe(struct platform_device *pdev, struct snd_soc_d { DBG("Enter::%s----%d\n",__FUNCTION__,__LINE__); - /* Configure the I2S pins in correct mode */ - rk2818_mux_api_set(CXGPIO_I2S_SEL_NAME,IOMUXB_I2S_INTERFACE); - rockchip_snd_txctrl(0); rockchip_snd_rxctrl(0); @@ -377,8 +375,12 @@ EXPORT_SYMBOL_GPL(rk2818_i2s_dai); static int __devinit rockchip_i2s_probe(struct platform_device *pdev) { struct resource *regs; + struct rk2818_i2s_platform_data *pdata = pdev->dev.platform_data; DBG("Enter::%s----%d\n",__FUNCTION__,__LINE__); + + if (pdata && pdata->io_init) + pdata->io_init(); rk2818_i2s_dai.dev = &pdev->dev; rockchip_i2s.iis_clk = clk_get(&pdev->dev, "i2s");