adapt all kind of board
authorroot <root@nzy.(none)>
Mon, 16 Aug 2010 10:53:23 +0000 (18:53 +0800)
committerroot <root@nzy.(none)>
Mon, 16 Aug 2010 10:53:23 +0000 (18:53 +0800)
27 files changed:
arch/arm/mach-rk2818/board-infosdk.c
arch/arm/mach-rk2818/board-raho.c
arch/arm/mach-rk2818/devices.c
arch/arm/mach-rk2818/devices.h
arch/arm/mach-rk2818/include/mach/board.h [changed mode: 0644->0755]
arch/arm/mach-rk2818/include/mach/rk2818_camera.h [changed mode: 0644->0755]
arch/arm/mach-rk2818/include/mach/rk2818_nand.h [changed mode: 0644->0755]
arch/arm/mach-rk2818/iomux.c [changed mode: 0644->0755]
drivers/i2c/busses/i2c-rk2818.c
drivers/input/gsensor/mma7660.c [changed mode: 0644->0755]
drivers/input/keyboard/rk2818_adckey.c
drivers/input/touchscreen/xpt2046_ts.c [changed mode: 0644->0755]
drivers/input/touchscreen/xpt2046_ts.h [changed mode: 0644->0755]
drivers/input/touchscreen/xpt2046_ts_320X480.c [changed mode: 0644->0755]
drivers/media/video/rk2818_camera.c [changed mode: 0644->0755]
drivers/mmc/host/rk2818-sdmmc.c [changed mode: 0644->0755]
drivers/mtd/nand/rk2818_nand.c [changed mode: 0644->0755]
drivers/net/dm9000.c
drivers/power/rk2818_battery.c [changed mode: 0644->0755]
drivers/serial/rk2818_serial.c
drivers/spi/rk2818_spim.c [changed mode: 0644->0755]
drivers/spi/rk2818_spim.h [changed mode: 0644->0755]
drivers/video/backlight/rk2818_backlight.c [changed mode: 0644->0755]
include/linux/dm9000.h
sound/soc/codecs/wm8994.c
sound/soc/codecs/wm8994.h [changed mode: 0644->0755]
sound/soc/rk2818/rk2818_i2s.c

index 2b84a9b1ea7f6318865961a6efd430f2d8b20a6d..74c9a237a3cc2d9af75ff0989e9c2fd0c0fc79a9 100755 (executable)
@@ -34,6 +34,7 @@
 #include <mach/rk2818_iomap.h>
 #include <mach/iomux.h>
 #include <mach/gpio.h>
+#include <mach/rk2818_nand.h>
 
 #include <linux/mtd/nand.h>
 #include <linux/mtd/partitions.h>
 
 #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)
index 660512105a62b8c2271ba1dab30c3c80d7ea0c53..0d7325a4b0add9146d87338b91dcc0a9193f353d 100755 (executable)
@@ -38,6 +38,7 @@
 #include <mach/gpio.h>
 #include <mach/spi_fpga.h>
 #include <mach/rk2818_camera.h>                          /* ddl@rock-chips.com : camera support */
+#include <mach/rk2818_nand.h>
 
 #include <linux/mtd/nand.h>
 #include <linux/mtd/partitions.h>
 
 #include "../../../drivers/spi/rk2818_spim.h"
 #include <linux/regulator/rk2818_lp8725.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ºÍ¼Ä´æÆ÷»ùµØÖ·¡£
  * -------------------------------------------------------------------- */
@@ -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)
index b97febc98d99644a324caeca230c182110869cac..25ef8e558dc3813d7f8830d0a1ba746697e9202c 100755 (executable)
@@ -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,
index 52444d86bae1662d77a9ab51648a400538a907fd..cf52b776eee4bedaf879ce7479d3a136956f1b87 100755 (executable)
@@ -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
old mode 100644 (file)
new mode 100755 (executable)
index 398bf57..cb6d44f
 #include <linux/timer.h>
 #include <linux/notifier.h>
 
+
+
+#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);
old mode 100644 (file)
new mode 100755 (executable)
index 1ff3917..c9d0d4a
@@ -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];
 };
 
old mode 100644 (file)
new mode 100755 (executable)
index e61d284..81d824e
@@ -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);
 };
 
 
old mode 100644 (file)
new mode 100755 (executable)
index e280882..afc695b
@@ -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;i<ARRAY_SIZE(rk2818_muxs);i++)
        {
                if (!strcmp(rk2818_muxs[i].name, name))
@@ -131,6 +134,9 @@ EXPORT_SYMBOL(rk2818_mux_api_set);
 void rk2818_mux_api_mode_resume(char *name)
 {
     int i; 
+        if (!name) {
+                return;
+        }
        for(i=0;i<ARRAY_SIZE(rk2818_muxs);i++)
        {
                if (!strcmp(rk2818_muxs[i].name, name))
index 3ce6116ed740609f08102f2fa848d3bd6b214ed1..24e6a20bb0bce0557cd02cbb64dc501639f8cfc2 100755 (executable)
@@ -648,8 +648,8 @@ static int rk2818_i2c_probe(struct platform_device *pdev)
        i2c->adap.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);
 
old mode 100644 (file)
new mode 100755 (executable)
index 61dceed..1b4f130
@@ -27,6 +27,7 @@
 #include <linux/freezer.h>
 #include <linux/mma7660.h>
 #include <mach/gpio.h>
+#include <mach/board.h>
 #ifdef CONFIG_ANDROID_POWER
 #include <linux/android_power.h>
 #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 ) {
index 75502669d295db977cdfe46a0c0e8069c7f4a236..8c35be83040cfebf84154ce50068cfffdc9db41b 100755 (executable)
@@ -27,8 +27,6 @@
 #include <mach/adc.h>
 #include <mach/board.h>
 
-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;
 }
 
old mode 100644 (file)
new mode 100755 (executable)
index fcc74a5..69e2b3d
@@ -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;
old mode 100644 (file)
new mode 100755 (executable)
index a805c82..4ff65ba
@@ -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
old mode 100644 (file)
new mode 100755 (executable)
index 86ce61d..e15e2f4
@@ -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;
old mode 100644 (file)
new mode 100755 (executable)
index f6f0273..a7fb785
@@ -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);
old mode 100644 (file)
new mode 100755 (executable)
index 20f01fe..2bf247e
@@ -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)
old mode 100644 (file)
new mode 100755 (executable)
index 49ec53f..683acfe
@@ -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;
index f011aa51d4cfccba86ea1758278febb79993c2c1..26ad04afe73eca558218ea3b502f59cd431787f8 100755 (executable)
@@ -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();
 
old mode 100644 (file)
new mode 100755 (executable)
index a258917..b70850d
@@ -27,7 +27,7 @@
 #include <mach/gpio.h>
 #include <mach/adc.h>
 #include <mach/iomux.h>
-
+#include <mach/board.h>
 #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;
index 8cccf00b2355353a4bd3a1fb0cadbed47d373a6f..b3c4c116215eadc0fc8d9968b40f47d2dd5e7bd2 100755 (executable)
@@ -33,7 +33,7 @@
 #include <linux/platform_device.h>
 #include <mach/iomux.h>
 #include <mach/gpio.h>
-
+#include <mach/board.h>
 #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;
old mode 100644 (file)
new mode 100755 (executable)
index 067853c..0146ee1
@@ -26,6 +26,7 @@
 
 #include "rk2818_spim.h"
 #include <linux/spi/spi.h>
+#include <mach/board.h>
 
 #ifdef CONFIG_DEBUG_FS
 #include <linux/debugfs.h>
@@ -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; i<pdata->num_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; i<pdata->num_chipselect; i++) {
+                       ret = gpio_request(cs_gpios[i].cs_gpio, cs_gpios[i].name);
+                       if (ret) {
+                               for (j=0;j<i;j++)
+                                       gpio_free(cs_gpios[j].cs_gpio);
+                               printk("[fun:%s, line:%d], gpio request err\n", __func__, __LINE__);
+                               if (pdata->io_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;
old mode 100644 (file)
new mode 100755 (executable)
index efc6f4c..66b86ff
@@ -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 */
old mode 100644 (file)
new mode 100755 (executable)
index d4dd7ab..3c1a129
@@ -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);
   
 }
 
index 8b621fa50e3a95d962e8f2649216df988c13a3ca..def04936bacf1fed13a55e8768f6d9c7d57f6262 100755 (executable)
@@ -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);
index eab18432f53e2b853fa023de0bcece41d787bdaa..e634e7769a09e40540a874807a749d5182a5fd7b 100755 (executable)
@@ -2056,10 +2056,10 @@ static const DECLARE_TLV_DB_SCALE(bypass_tlv, -1500, 300, 0);
 
 static const struct snd_kcontrol_new wm8994_snd_controls[] = {
 
-/* é\8d å\9b§å½® */
+/* é\8d å\9b§å½?*/
 SOC_DOUBLE_SWITCH_WM8994CODEC("Speaker incall Switch", SPEAKER_INCALL),        
 SOC_DOUBLE_SWITCH_WM8994CODEC("Speaker normal Switch", SPEAKER_NORMAL),
-/* é\8d\9aî\84\82ç\93\9b */
+/* é\8d\9aî\84\82ç\93?*/
 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),
-/* é\91°æ\8a½å®³ */
+/* é\91°æ\8a½å®?*/
 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);
 }
old mode 100644 (file)
new mode 100755 (executable)
index 208845a..ff9051e
@@ -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
index 3d456955b294495fa45a27ffcc31ab3c513e4f23..05804af27657fdb5adff6a701e87f11f450a5f34 100755 (executable)
@@ -31,6 +31,7 @@
 #include <mach/rk2818_iomap.h>
 #include <mach/iomux.h>
 #include <mach/scu.h> 
+#include <mach/board.h>
 
 #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");