add spi & touch screen driver
authorcmc-ubuntu <cmc@ubuntu.(none)>
Thu, 11 Nov 2010 14:02:39 +0000 (22:02 +0800)
committercmc-ubuntu <cmc@ubuntu.(none)>
Thu, 11 Nov 2010 14:02:39 +0000 (22:02 +0800)
1  2 
Makefile
arch/arm/mach-rk29/board-rk29sdk.c
arch/arm/mach-rk29/clock.c
arch/arm/mach-rk29/devices.c
arch/arm/mach-rk29/devices.h
arch/arm/mach-rk29/gpio.c
arch/arm/mach-rk29/include/mach/board.h
arch/arm/mach-rk29/include/mach/gpio.h
drivers/input/touchscreen/xpt2046_cbn_ts.c

diff --cc Makefile
index d7cf5448ee7b178015d736bb40a54578f5d1191b,d7cf5448ee7b178015d736bb40a54578f5d1191b..a6ff97dec8d4cbde94c0b80764e3f550e827b140
+++ b/Makefile
@@@ -184,7 -184,7 +184,7 @@@ export KBUILD_BUILDHOST := $(SUBARCH
  #CROSS_COMPILE        ?=
  ARCH          ?= arm
  #CROSS_COMPILE        :=/opt/android0320/mydroid/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/bin/arm-eabi-
--CROSS_COMPILE ?=../toolchain/arm-eabi-4.4.0/bin/arm-eabi-
++CROSS_COMPILE ?=../../google/myandroid/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-
  
  # Architecture as present in compile.h
  UTS_MACHINE   := $(ARCH)
index 816156cd16f7dc68d240939563880242d2ed3f1a,26201e6ab342511dac8dc39f6e4b971ab908280a..5dd72399ac5f87dbf092258110be5d1fa560787e
  #include <linux/mtd/partitions.h>\r
  \r
  #include "devices.h"\r
 +#include "../../../drivers/input/touchscreen/xpt2046_cbn_ts.h"\r
 +\r
  \r
+ /* Set memory size of pmem */\r
+ #define SDRAM_SIZE          SZ_128M\r
+ #define PMEM_GPU_SIZE       (12 * SZ_1M)\r
+ #define PMEM_UI_SIZE        SZ_16M\r
+ #define PMEM_VPU_SIZE       SZ_32M\r
\r
+ #define PMEM_GPU_BASE       (RK29_SDRAM_PHYS + SDRAM_SIZE - PMEM_GPU_SIZE)\r
+ #define PMEM_UI_BASE        (PMEM_GPU_BASE - PMEM_UI_SIZE)\r
+ #define PMEM_VPU_BASE       (PMEM_UI_BASE - PMEM_VPU_SIZE)\r
+ #define LINUX_SIZE          (PMEM_VPU_BASE - RK29_SDRAM_PHYS)\r
\r
  extern struct sys_timer rk29_timer;\r
  \r
+ int rk29_nand_io_init(void)\r
+ {\r
+     return 0;\r
+ }\r
\r
+ struct rk29_nand_platform_data rk29_nand_data = {\r
+     .width      = 1,     /* data bus width in bytes */\r
+     .hw_ecc     = 1,     /* hw ecc 0: soft ecc */\r
+     .num_flash    = 1,\r
+     .io_init   = rk29_nand_io_init,\r
+ };\r
  \r
  static struct rk29_gpio_bank rk29_gpiobankinit[] = {\r
        {\r
        },      \r
  };\r
  \r
 -#ifdef CONFIG_VIVANTE
 -static struct resource resources_gpu[] = {
 -    [0] = {
 -              .name   = "gpu_irq",
 -        .start        = IRQ_GPU,
 -        .end    = IRQ_GPU,
 -        .flags  = IORESOURCE_IRQ,
 -    },
 -    [1] = {
 -              .name = "gpu_base",
 -        .start  = RK29_GPU_PHYS,
 -        .end    = RK29_GPU_PHYS + (256 << 10),
 -        .flags  = IORESOURCE_MEM,
 -    },
 -    [2] = {
 -              .name = "gpu_mem",
+ /*****************************************************************************************\r
+  * lcd  devices\r
+  * author: zyw@rock-chips.com\r
+  *****************************************************************************************/\r
+ //#ifdef  CONFIG_LCD_TD043MGEA1\r
+ #define LCD_TXD_PIN          RK29_PIN0_PA6   // ÂÒÌî,µÃÐÞ¸Ä\r
+ #define LCD_CLK_PIN          RK29_PIN0_PA7   // ÂÒÌî,µÃÐÞ¸Ä\r
+ #define LCD_CS_PIN           RK29_PIN0_PB6   // ÂÒÌî,µÃÐÞ¸Ä\r
+ #define LCD_TXD_MUX_NAME     GPIOE_U1IR_I2C1_NAME\r
+ #define LCD_CLK_MUX_NAME     NULL\r
+ #define LCD_CS_MUX_NAME      GPIOH6_IQ_SEL_NAME\r
+ #define LCD_TXD_MUX_MODE     0\r
+ #define LCD_CLK_MUX_MODE     0\r
+ #define LCD_CS_MUX_MODE      0\r
+ //#endif\r
+ static int rk29_lcd_io_init(void)\r
+ {\r
+     int ret = 0;\r
\r
+ #if 0\r
+     rk29_mux_api_set(LCD_CS_MUX_NAME, LCD_CS_MUX_MODE);\r
+     if (LCD_CS_PIN != INVALID_GPIO) {\r
+         ret = gpio_request(LCD_CS_PIN, NULL);\r
+         if(ret != 0)\r
+         {\r
+             goto err1;\r
+             printk(">>>>>> lcd cs gpio_request err \n ");\r
+         }\r
+     }\r
\r
+     rk29_mux_api_set(LCD_CLK_MUX_NAME, LCD_CLK_MUX_MODE);\r
+     if (LCD_CLK_PIN != INVALID_GPIO) {\r
+         ret = gpio_request(LCD_CLK_PIN, NULL);\r
+         if(ret != 0)\r
+         {\r
+             goto err2;\r
+             printk(">>>>>> lcd clk gpio_request err \n ");\r
+         }\r
+     }\r
\r
+     rk29_mux_api_set(LCD_TXD_MUX_NAME, LCD_TXD_MUX_MODE);\r
+     if (LCD_TXD_PIN != INVALID_GPIO) {\r
+         ret = gpio_request(LCD_TXD_PIN, NULL);\r
+         if(ret != 0)\r
+         {\r
+             goto err3;\r
+             printk(">>>>>> lcd txd gpio_request err \n ");\r
+         }\r
+     }\r
\r
+     return 0;\r
\r
+ err3:\r
+     if (LCD_CLK_PIN != INVALID_GPIO) {\r
+         gpio_free(LCD_CLK_PIN);\r
+     }\r
+ err2:\r
+     if (LCD_CS_PIN != INVALID_GPIO) {\r
+         gpio_free(LCD_CS_PIN);\r
+     }\r
+ err1:\r
+ #endif\r
+     return ret;\r
+ }\r
\r
+ static int rk29_lcd_io_deinit(void)\r
+ {\r
+     int ret = 0;\r
+ #if 0\r
+     gpio_direction_output(LCD_CLK_PIN, 0);\r
+     gpio_set_value(LCD_CLK_PIN, GPIO_HIGH);\r
+     gpio_direction_output(LCD_TXD_PIN, 0);\r
+     gpio_set_value(LCD_TXD_PIN, GPIO_HIGH);\r
\r
+     gpio_free(LCD_CS_PIN);\r
+     rk29_mux_api_mode_resume(LCD_CS_MUX_NAME);\r
+     gpio_free(LCD_CLK_PIN);\r
+     gpio_free(LCD_TXD_PIN);\r
+     rk29_mux_api_mode_resume(LCD_TXD_MUX_NAME);\r
+     rk29_mux_api_mode_resume(LCD_CLK_MUX_NAME);\r
+ #endif\r
+     return ret;\r
+ }\r
\r
+ struct rk29lcd_info rk29_lcd_info = {\r
+     //.txd_pin  = LCD_TXD_PIN,\r
+     //.clk_pin = LCD_CLK_PIN,\r
+     //.cs_pin = LCD_CS_PIN,\r
+     .io_init   = rk29_lcd_io_init,\r
+     .io_deinit = rk29_lcd_io_deinit,\r
+ };\r
\r
\r
+ /*****************************************************************************************\r
+  * frame buffe  devices\r
+  * author: zyw@rock-chips.com\r
+  *****************************************************************************************/\r
\r
+ #define FB_ID                       0\r
+ #define FB_DISPLAY_ON_PIN           RK29_PIN0_PB1   // ÂÒÌî,µÃÐÞ¸Ä\r
+ #define FB_LCD_STANDBY_PIN          INVALID_GPIO\r
+ #define FB_MCU_FMK_PIN              INVALID_GPIO\r
\r
+ #if 0\r
+ #define FB_DISPLAY_ON_VALUE         GPIO_LOW\r
+ #define FB_LCD_STANDBY_VALUE        0\r
\r
+ #define FB_DISPLAY_ON_MUX_NAME      GPIOB1_SMCS1_MMC0PCA_NAME\r
+ #define FB_DISPLAY_ON_MUX_MODE      IOMUXA_GPIO0_B1\r
\r
+ #define FB_LCD_STANDBY_MUX_NAME     NULL\r
+ #define FB_LCD_STANDBY_MUX_MODE     1\r
\r
+ #define FB_MCU_FMK_PIN_MUX_NAME     NULL\r
+ #define FB_MCU_FMK_MUX_MODE         0\r
\r
+ #define FB_DATA0_16_MUX_NAME       GPIOC_LCDC16BIT_SEL_NAME\r
+ #define FB_DATA0_16_MUX_MODE        1\r
\r
+ #define FB_DATA17_18_MUX_NAME      GPIOC_LCDC18BIT_SEL_NAME\r
+ #define FB_DATA17_18_MUX_MODE       1\r
\r
+ #define FB_DATA19_24_MUX_NAME      GPIOC_LCDC24BIT_SEL_NAME\r
+ #define FB_DATA19_24_MUX_MODE       1\r
\r
+ #define FB_DEN_MUX_NAME            CXGPIO_LCDDEN_SEL_NAME\r
+ #define FB_DEN_MUX_MODE             1\r
\r
+ #define FB_VSYNC_MUX_NAME          CXGPIO_LCDVSYNC_SEL_NAME\r
+ #define FB_VSYNC_MUX_MODE           1\r
\r
+ #define FB_MCU_FMK_MUX_NAME        NULL\r
+ #define FB_MCU_FMK_MUX_MODE         0\r
+ #endif\r
+ static int rk29_fb_io_init(struct rk29_fb_setting_info *fb_setting)\r
+ {\r
+     int ret = 0;\r
+ #if 0\r
+     if(fb_setting->data_num <=16)\r
+         rk29_mux_api_set(FB_DATA0_16_MUX_NAME, FB_DATA0_16_MUX_MODE);\r
+     if(fb_setting->data_num >16 && fb_setting->data_num<=18)\r
+         rk29_mux_api_set(FB_DATA17_18_MUX_NAME, FB_DATA17_18_MUX_MODE);\r
+     if(fb_setting->data_num >18)\r
+         rk29_mux_api_set(FB_DATA19_24_MUX_NAME, FB_DATA19_24_MUX_MODE);\r
\r
+     if(fb_setting->vsync_en)\r
+         rk29_mux_api_set(FB_VSYNC_MUX_NAME, FB_VSYNC_MUX_MODE);\r
\r
+     if(fb_setting->den_en)\r
+         rk29_mux_api_set(FB_DEN_MUX_NAME, FB_DEN_MUX_MODE);\r
\r
+     if(fb_setting->mcu_fmk_en && FB_MCU_FMK_MUX_NAME && (FB_MCU_FMK_PIN != INVALID_GPIO))\r
+     {\r
+         rk29_mux_api_set(FB_MCU_FMK_MUX_NAME, FB_MCU_FMK_MUX_MODE);\r
+         ret = gpio_request(FB_MCU_FMK_PIN, NULL);\r
+         if(ret != 0)\r
+         {\r
+             gpio_free(FB_MCU_FMK_PIN);\r
+             printk(">>>>>> FB_MCU_FMK_PIN gpio_request err \n ");\r
+         }\r
+         gpio_direction_input(FB_MCU_FMK_PIN);\r
+     }\r
\r
+     if(fb_setting->disp_on_en && FB_DISPLAY_ON_MUX_NAME && (FB_DISPLAY_ON_PIN != INVALID_GPIO))\r
+     {\r
+         rk29_mux_api_set(FB_DISPLAY_ON_MUX_NAME, FB_DISPLAY_ON_MUX_MODE);\r
+         ret = gpio_request(FB_DISPLAY_ON_PIN, NULL);\r
+         if(ret != 0)\r
+         {\r
+             gpio_free(FB_DISPLAY_ON_PIN);\r
+             printk(">>>>>> FB_DISPLAY_ON_PIN gpio_request err \n ");\r
+         }\r
+     }\r
\r
+     if(fb_setting->disp_on_en && FB_LCD_STANDBY_MUX_NAME && (FB_LCD_STANDBY_PIN != INVALID_GPIO))\r
+     {\r
+         rk29_mux_api_set(FB_LCD_STANDBY_MUX_NAME, FB_LCD_STANDBY_MUX_MODE);\r
+         ret = gpio_request(FB_LCD_STANDBY_PIN, NULL);\r
+         if(ret != 0)\r
+         {\r
+             gpio_free(FB_LCD_STANDBY_PIN);\r
+             printk(">>>>>> FB_LCD_STANDBY_PIN gpio_request err \n ");\r
+         }\r
+     }\r
+ #endif\r
+     return ret;\r
+ }\r
\r
+ struct rk29fb_info rk29_fb_info = {\r
+     .fb_id   = FB_ID,\r
+     //.disp_on_pin = FB_DISPLAY_ON_PIN,\r
+     //.disp_on_value = FB_DISPLAY_ON_VALUE,\r
+     //.standby_pin = FB_LCD_STANDBY_PIN,\r
+     //.standby_value = FB_LCD_STANDBY_VALUE,\r
+     //.mcu_fmk_pin = FB_MCU_FMK_PIN,\r
+     .lcd_info = &rk29_lcd_info,\r
+     .io_init   = rk29_fb_io_init,\r
+ };\r
\r
+ static struct android_pmem_platform_data android_pmem_pdata = {\r
+       .name           = "pmem",\r
+       .start          = PMEM_UI_BASE,\r
+       .size           = PMEM_UI_SIZE,\r
+       .no_allocator   = 0,\r
+       .cached         = 1,\r
+ };\r
\r
+ static struct platform_device android_pmem_device = {\r
+       .name           = "android_pmem",\r
+       .id             = 0,\r
+       .dev            = {\r
+               .platform_data = &android_pmem_pdata,\r
+       },\r
+ };\r
\r
\r
+ static struct android_pmem_platform_data android_pmem_vpu_pdata = {\r
+       .name           = "pmem_vpu",\r
+       .start          = PMEM_VPU_BASE,\r
+       .size           = PMEM_VPU_SIZE,\r
+       .no_allocator   = 0,\r
+       .cached         = 1,\r
+ };\r
\r
+ static struct platform_device android_pmem_vpu_device = {\r
+       .name           = "android_pmem",\r
+       .id             = 2,\r
+       .dev            = {\r
+               .platform_data = &android_pmem_vpu_pdata,\r
+       },\r
+ };\r
\r
+ /*****************************************************************************************\r
+  * SDMMC devices\r
+ *****************************************************************************************/\r
+ #ifdef CONFIG_SDMMC0_RK29\r
+ void rk29_sdmmc0_cfg_gpio(struct platform_device *dev)\r
+ {\r
+       rk29_mux_api_set(GPIO1D1_SDMMC0CMD_NAME, GPIO1H_SDMMC0_CMD);\r
+       rk29_mux_api_set(GPIO1D0_SDMMC0CLKOUT_NAME, GPIO1H_SDMMC0_CLKOUT);\r
+       rk29_mux_api_set(GPIO1D2_SDMMC0DATA0_NAME, GPIO1H_SDMMC0_DATA0);\r
+       rk29_mux_api_set(GPIO1D3_SDMMC0DATA1_NAME, GPIO1H_SDMMC0_DATA1);\r
+       rk29_mux_api_set(GPIO1D4_SDMMC0DATA2_NAME, GPIO1H_SDMMC0_DATA2);\r
+       rk29_mux_api_set(GPIO1D5_SDMMC0DATA3_NAME, GPIO1H_SDMMC0_DATA3);\r
+       rk29_mux_api_set(GPIO2A2_SDMMC0DETECTN_NAME, GPIO2L_SDMMC0_DETECT_N);\r
+ }\r
\r
+ #define CONFIG_SDMMC0_USE_DMA\r
+ struct rk29_sdmmc_platform_data default_sdmmc0_data = {\r
+       .num_slots              = 1,\r
+       .host_ocr_avail = (MMC_VDD_27_28|MMC_VDD_28_29|MMC_VDD_29_30|\r
+                                          MMC_VDD_30_31|MMC_VDD_31_32|MMC_VDD_32_33| \r
+                                          MMC_VDD_33_34|MMC_VDD_34_35| MMC_VDD_35_36),\r
+       .host_caps      = (MMC_CAP_4_BIT_DATA|MMC_CAP_MMC_HIGHSPEED|MMC_CAP_SD_HIGHSPEED),\r
+       .io_init = rk29_sdmmc0_cfg_gpio,\r
+       .dma_name = "sd_mmc",\r
+ #ifdef CONFIG_SDMMC0_USE_DMA\r
+       .use_dma  = 1,\r
+ #else\r
+       .use_dma = 0,\r
+ #endif\r
+ };\r
+ #endif\r
+ #ifdef CONFIG_SDMMC1_RK29\r
+ #define CONFIG_SDMMC1_USE_DMA\r
+ void rk29_sdmmc1_cfg_gpio(struct platform_device *dev)\r
+ {\r
+       rk29_mux_api_set(GPIO1C2_SDMMC1CMD_NAME, GPIO1H_SDMMC1_CMD);\r
+       rk29_mux_api_set(GPIO1C7_SDMMC1CLKOUT_NAME, GPIO1H_SDMMC1_CLKOUT);\r
+       rk29_mux_api_set(GPIO1C3_SDMMC1DATA0_NAME, GPIO1H_SDMMC1_DATA0);\r
+       rk29_mux_api_set(GPIO1C4_SDMMC1DATA1_NAME, GPIO1H_SDMMC1_DATA1);\r
+       rk29_mux_api_set(GPIO1C5_SDMMC1DATA2_NAME, GPIO1H_SDMMC1_DATA2);\r
+       rk29_mux_api_set(GPIO1C6_SDMMC1DATA3_NAME, GPIO1H_SDMMC1_DATA3);\r
+ }\r
\r
+ struct rk29_sdmmc_platform_data default_sdmmc1_data = {\r
+       .num_slots              = 1,\r
+       .host_ocr_avail = (MMC_VDD_26_27|MMC_VDD_27_28|MMC_VDD_28_29|\r
+                                          MMC_VDD_29_30|MMC_VDD_30_31|MMC_VDD_31_32|\r
+                                          MMC_VDD_32_33|MMC_VDD_33_34),\r
+       .host_caps      = (MMC_CAP_4_BIT_DATA|MMC_CAP_SDIO_IRQ|\r
+                                  MMC_CAP_MMC_HIGHSPEED|MMC_CAP_SD_HIGHSPEED),\r
+       .io_init = rk29_sdmmc1_cfg_gpio,\r
+       .dma_name = "sdio",\r
+ #ifdef CONFIG_SDMMC1_USE_DMA\r
+       .use_dma  = 1,\r
+ #else\r
+       .use_dma = 0,\r
+ #endif\r
+ };\r
+ #endif\r
\r
 -        .flags  = IORESOURCE_MEM,
 -    },
 -};
 -struct platform_device rk29_device_gpu = {
 -    .name             = "galcore",
 -    .id               = 0,
 -    .num_resources    = ARRAY_SIZE(resources_gpu),
 -    .resource         = resources_gpu,
 -};
++#ifdef CONFIG_VIVANTE\r
++static struct resource resources_gpu[] = {\r
++    [0] = {\r
++              .name   = "gpu_irq",\r
++        .start        = IRQ_GPU,\r
++        .end    = IRQ_GPU,\r
++        .flags  = IORESOURCE_IRQ,\r
++    },\r
++    [1] = {\r
++              .name = "gpu_base",\r
++        .start  = RK29_GPU_PHYS,\r
++        .end    = RK29_GPU_PHYS + (256 << 10),\r
++        .flags  = IORESOURCE_MEM,\r
++    },\r
++    [2] = {\r
++              .name = "gpu_mem",\r
+         .start  = PMEM_GPU_BASE,\r
+         .end    = PMEM_GPU_BASE + PMEM_GPU_SIZE,\r
++        .flags  = IORESOURCE_MEM,\r
++    },\r
++};\r
++struct platform_device rk29_device_gpu = {\r
++    .name             = "galcore",\r
++    .id               = 0,\r
++    .num_resources    = ARRAY_SIZE(resources_gpu),\r
++    .resource         = resources_gpu,\r
++};\r
+ #endif\r
\r
+ static void __init rk29_board_iomux_init(void)\r
+ {\r
+       #ifdef CONFIG_UART0_RK29        \r
+       rk29_mux_api_set(GPIO1B7_UART0SOUT_NAME, GPIO1L_UART0_SOUT);\r
+       rk29_mux_api_set(GPIO1B6_UART0SIN_NAME, GPIO1L_UART0_SIN);\r
+       #ifdef CONFIG_UART0_CTS_RTS_RK29\r
+       rk29_mux_api_set(GPIO1C1_UART0RTSN_SDMMC1WRITEPRT_NAME, GPIO1H_UART0_RTS_N);\r
+       rk29_mux_api_set(GPIO1C0_UART0CTSN_SDMMC1DETECTN_NAME, GPIO1H_UART0_CTS_N);\r
+       #endif\r
+       #endif\r
+       #ifdef CONFIG_UART1_RK29        \r
+       rk29_mux_api_set(GPIO2A5_UART1SOUT_NAME, GPIO2L_UART1_SOUT);\r
+       rk29_mux_api_set(GPIO2A4_UART1SIN_NAME, GPIO2L_UART1_SIN);\r
+       #endif\r
+       #ifdef CONFIG_UART2_RK29        \r
+       rk29_mux_api_set(GPIO2B1_UART2SOUT_NAME, GPIO2L_UART2_SOUT);\r
+       rk29_mux_api_set(GPIO2B0_UART2SIN_NAME, GPIO2L_UART2_SIN);\r
+       #ifdef CONFIG_UART2_CTS_RTS_RK29\r
+       rk29_mux_api_set(GPIO2A7_UART2RTSN_NAME, GPIO2L_UART2_RTS_N);\r
+       rk29_mux_api_set(GPIO2A6_UART2CTSN_NAME, GPIO2L_UART2_CTS_N);\r
+       #endif\r
+       #endif\r
+       #ifdef CONFIG_UART3_RK29        \r
+       rk29_mux_api_set(GPIO2B3_UART3SOUT_NAME, GPIO2L_UART3_SOUT);\r
+       rk29_mux_api_set(GPIO2B2_UART3SIN_NAME, GPIO2L_UART3_SIN);\r
+       #ifdef CONFIG_UART3_CTS_RTS_RK29\r
+       rk29_mux_api_set(GPIO2B5_UART3RTSN_I2C3SCL_NAME, GPIO2L_UART3_RTS_N);\r
+       rk29_mux_api_set(GPIO2B4_UART3CTSN_I2C3SDA_NAME, GPIO2L_UART3_CTS_N);\r
+       #endif\r
+       #endif\r
+ }\r
\r
  static struct platform_device *devices[] __initdata = {\r
- #ifdef CONFIG_UART1_RK29      \r
+ #ifdef CONFIG_UART1_RK29\r
        &rk29_device_uart1,\r
  #endif        \r
 +#ifdef CONFIG_SPIM_RK29XX\r
 +    &rk29xx_device_spi0m,\r
 +    &rk29xx_device_spi1m,\r
 +#endif\r
+ #ifdef CONFIG_SDMMC0_RK29     \r
+       &rk29_device_sdmmc0,\r
+ #endif\r
+ #ifdef CONFIG_SDMMC1_RK29\r
+       &rk29_device_sdmmc1,\r
+ #endif\r
+ #ifdef CONFIG_MTD_NAND_RK29\r
+       &rk29_device_nand,\r
+ #endif\r
\r
+ #ifdef CONFIG_FB_RK29\r
+       &rk29_device_fb,\r
+ #endif\r
+ #ifdef CONFIG_VIVANTE\r
+       &rk29_device_gpu,\r
+ #endif\r
+       &android_pmem_device,\r
+       &android_pmem_vpu_device,\r
  };\r
  \r
 +/*****************************************************************************************\r
 + * spi devices\r
 + * author: cmc@rock-chips.com\r
 + *****************************************************************************************/\r
 +#define SPI_CHIPSELECT_NUM 2\r
 +struct spi_cs_gpio rk29xx_spi0_cs_gpios[SPI_CHIPSELECT_NUM] = {\r
 +    {\r
 +              .name = "spi0 cs0",\r
 +              .cs_gpio = RK29_PIN2_PC1,\r
 +              .cs_iomux_name = NULL,\r
 +      },\r
 +      {\r
 +              .name = "spi0 cs1",\r
 +              .cs_gpio = RK29_PIN1_PA4,\r
 +              .cs_iomux_name = GPIO1A4_EMMCWRITEPRT_SPI0CS1_NAME,//if no iomux,set it NULL\r
 +              .cs_iomux_mode = GPIO1L_SPI0_CSN1,\r
 +      }\r
 +};\r
 +\r
 +struct spi_cs_gpio rk29xx_spi1_cs_gpios[SPI_CHIPSELECT_NUM] = {\r
 +    {\r
 +              .name = "spi1 cs0",\r
 +              .cs_gpio = RK29_PIN2_PC5,\r
 +              .cs_iomux_name = NULL,\r
 +      },\r
 +      {\r
 +              .name = "spi1 cs1",\r
 +              .cs_gpio = RK29_PIN1_PA3,\r
 +              .cs_iomux_name = GPIO1A3_EMMCDETECTN_SPI1CS1_NAME,//if no iomux,set it NULL\r
 +              .cs_iomux_mode = GPIO1L_SPI0_CSN1,\r
 +      }\r
 +};\r
 +\r
 +static int spi_io_init(struct spi_cs_gpio *cs_gpios, int cs_num)\r
 +{     \r
 +      int i,j,ret;\r
 +      \r
 +      //cs\r
 +      if (cs_gpios) {\r
 +              for (i=0; i<cs_num; i++) {\r
 +                      rk29_mux_api_set(cs_gpios[i].cs_iomux_name, cs_gpios[i].cs_iomux_mode);\r
 +                      ret = gpio_request(cs_gpios[i].cs_gpio, cs_gpios[i].name);\r
 +                      if (ret) {\r
 +                              for (j=0;j<i;j++) {\r
 +                                      gpio_free(cs_gpios[j].cs_gpio);\r
 +                                      //rk29_mux_api_mode_resume(cs_gpios[j].cs_iomux_name);\r
 +                              }\r
 +                              printk("[fun:%s, line:%d], gpio request err\n", __func__, __LINE__);\r
 +                              return -1;\r
 +                      }                       \r
 +                      gpio_direction_output(cs_gpios[i].cs_gpio, GPIO_HIGH);\r
 +              }\r
 +      }\r
 +      return 0;\r
 +}\r
 +\r
 +static int spi_io_deinit(struct spi_cs_gpio *cs_gpios, int cs_num)\r
 +{\r
 +      int i;\r
 +      \r
 +      if (cs_gpios) {\r
 +              for (i=0; i<cs_num; i++) {\r
 +                      gpio_free(cs_gpios[i].cs_gpio);\r
 +                      //rk29_mux_api_mode_resume(cs_gpios[i].cs_iomux_name);\r
 +              }\r
 +      }\r
 +      \r
 +      return 0;\r
 +}\r
 +\r
 +static int spi_io_fix_leakage_bug(void)\r
 +{\r
 +      gpio_direction_output(RK29_PIN2_PC1, GPIO_LOW); \r
 +      return 0;\r
 +}\r
 +\r
 +static int spi_io_resume_leakage_bug(void)\r
 +{\r
 +      gpio_direction_output(RK29_PIN2_PC1, GPIO_HIGH);\r
 +      return 0;\r
 +}\r
 +\r
 +struct rk29xx_spi_platform_data rk29xx_spi0_platdata = {\r
 +      .num_chipselect = SPI_CHIPSELECT_NUM,\r
 +      .chipselect_gpios = rk29xx_spi0_cs_gpios,\r
 +      .io_init = spi_io_init,\r
 +      .io_deinit = spi_io_deinit,\r
 +      .io_fix_leakage_bug = spi_io_fix_leakage_bug,\r
 +      .io_resume_leakage_bug = spi_io_resume_leakage_bug,\r
 +};\r
 +\r
 +struct rk29xx_spi_platform_data rk29xx_spi1_platdata = {\r
 +      .num_chipselect = SPI_CHIPSELECT_NUM,\r
 +      .chipselect_gpios = rk29xx_spi1_cs_gpios,\r
 +      .io_init = spi_io_init,\r
 +      .io_deinit = spi_io_deinit,\r
 +      .io_fix_leakage_bug = spi_io_fix_leakage_bug,\r
 +      .io_resume_leakage_bug = spi_io_resume_leakage_bug,\r
 +};\r
 +\r
 +/*****************************************************************************************\r
 + * xpt2046 touch panel\r
 + * author: cmc@rock-chips.com\r
 + *****************************************************************************************/\r
 +#define XPT2046_GPIO_INT           RK29_PIN0_PA3\r
 +#define DEBOUNCE_REPTIME  3\r
 +\r
 +#if defined(CONFIG_TOUCHSCREEN_XPT2046_320X480_SPI) \r
 +static struct xpt2046_platform_data xpt2046_info = {\r
 +      .model                  = 2046,\r
 +      .keep_vref_on   = 1,\r
 +      .swap_xy                = 0,\r
 +      .x_min                  = 0,\r
 +      .x_max                  = 320,\r
 +      .y_min                  = 0,\r
 +      .y_max                  = 480,\r
 +      .debounce_max           = 7,\r
 +      .debounce_rep           = DEBOUNCE_REPTIME,\r
 +      .debounce_tol           = 20,\r
 +      .gpio_pendown           = XPT2046_GPIO_INT,\r
 +      .penirq_recheck_delay_usecs = 1,\r
 +};\r
 +#elif defined(CONFIG_TOUCHSCREEN_XPT2046_320X480_CBN_SPI)\r
 +static struct xpt2046_platform_data xpt2046_info = {\r
 +      .model                  = 2046,\r
 +      .keep_vref_on   = 1,\r
 +      .swap_xy                = 0,\r
 +      .x_min                  = 0,\r
 +      .x_max                  = 320,\r
 +      .y_min                  = 0,\r
 +      .y_max                  = 480,\r
 +      .debounce_max           = 7,\r
 +      .debounce_rep           = DEBOUNCE_REPTIME,\r
 +      .debounce_tol           = 20,\r
 +      .gpio_pendown           = XPT2046_GPIO_INT,\r
 +      .penirq_recheck_delay_usecs = 1,\r
 +};\r
 +#elif defined(CONFIG_TOUCHSCREEN_XPT2046_SPI) \r
 +static struct xpt2046_platform_data xpt2046_info = {\r
 +      .model                  = 2046,\r
 +      .keep_vref_on   = 1,\r
 +      .swap_xy                = 1,\r
 +      .x_min                  = 0,\r
 +      .x_max                  = 800,\r
 +      .y_min                  = 0,\r
 +      .y_max                  = 480,\r
 +      .debounce_max           = 7,\r
 +      .debounce_rep           = DEBOUNCE_REPTIME,\r
 +      .debounce_tol           = 20,\r
 +      .gpio_pendown           = XPT2046_GPIO_INT,\r
 +      \r
 +      .penirq_recheck_delay_usecs = 1,\r
 +};\r
 +#elif defined(CONFIG_TOUCHSCREEN_XPT2046_CBN_SPI)\r
 +static struct xpt2046_platform_data xpt2046_info = {\r
 +      .model                  = 2046,\r
 +      .keep_vref_on   = 1,\r
 +      .swap_xy                = 1,\r
 +      .x_min                  = 0,\r
 +      .x_max                  = 800,\r
 +      .y_min                  = 0,\r
 +      .y_max                  = 480,\r
 +      .debounce_max           = 7,\r
 +      .debounce_rep           = DEBOUNCE_REPTIME,\r
 +      .debounce_tol           = 20,\r
 +      .gpio_pendown           = XPT2046_GPIO_INT,\r
 +      \r
 +      .penirq_recheck_delay_usecs = 1,\r
 +};\r
 +#endif\r
 +\r
 +static struct spi_board_info board_spi_devices[] = {\r
 +#if defined(CONFIG_TOUCHSCREEN_XPT2046_320X480_SPI) || defined(CONFIG_TOUCHSCREEN_XPT2046_320X480_CBN_SPI)\\r
 +    ||defined(CONFIG_TOUCHSCREEN_XPT2046_SPI) || defined(CONFIG_TOUCHSCREEN_XPT2046_CBN_SPI)\r
 +      {\r
 +              .modalias       = "xpt2046_ts",\r
 +              .chip_select    = 0,\r
 +              .max_speed_hz   = 125 * 1000 * 26,/* (max sample rate @ 3V) * (cmd + data + overhead) */\r
 +              .bus_num        = 0,\r
 +              .irq = XPT2046_GPIO_INT,\r
 +              .platform_data = &xpt2046_info,\r
 +      },\r
 +#endif\r
 +}; \r
 +\r
 +\r
  static void __init rk29_gic_init_irq(void)\r
  {\r
        gic_dist_init(0, (void __iomem *)RK29_GICPERI_BASE, 32);\r
@@@ -286,12 -490,22 +682,23 @@@ static void __init machine_rk29_init_ir
        rk29_gpio_init(rk29_gpiobankinit, MAX_BANK);\r
        rk29_gpio_irq_setup();\r
  }\r
\r
  static void __init machine_rk29_board_init(void)\r
  { \r
++        rk29_board_iomux_init();\r
        platform_add_devices(devices, ARRAY_SIZE(devices));     \r
 -      rk29_board_iomux_init();\r
 +      spi_register_board_info(board_spi_devices, ARRAY_SIZE(board_spi_devices));\r
  }\r
  \r
+ static void __init machine_rk29_fixup(struct machine_desc *desc, struct tag *tags,\r
+                                       char **cmdline, struct meminfo *mi)\r
+ {\r
+       mi->nr_banks = 1;\r
+       mi->bank[0].start = RK29_SDRAM_PHYS;\r
+       mi->bank[0].node = PHYS_TO_NID(RK29_SDRAM_PHYS);\r
+       mi->bank[0].size = LINUX_SIZE;\r
+ }\r
\r
  static void __init machine_rk29_mapio(void)\r
  {\r
        rk29_map_common_io();\r
index f0d2cb47fdb775835062708c04a610f482f838c1,53c46c70745271205c73ee5b210e32354a9c1349..6ba71e9602c57f79dbce35b914fa3597e9ac851d
mode 100755,100644..100755
index a950e87f2f1511e7e1d3e91185355f0c3621946c,492fc69ea47125136c7e4899a923a48bff6f9684..6f9b03927938af293ddccaa7e23ed811b504542a
  #include <linux/delay.h>
  #include <mach/irqs.h>
  #include <mach/rk29_iomap.h>
 +#include <mach/rk29-dma-pl330.h> 
  #include "devices.h"
-  
++
+ #ifdef CONFIG_SDMMC0_RK29 
+ static struct resource resources_sdmmc0[] = {
+       {
+               .start  = IRQ_SDMMC,
+               .end    = IRQ_SDMMC,
+               .flags  = IORESOURCE_IRQ,
+       },
+       {
+               .start  = RK29_SDMMC0_PHYS,
+               .end    = RK29_SDMMC0_PHYS + RK29_SDMMC0_SIZE -1,
+               .flags  = IORESOURCE_MEM,
+       }
+ };
+ #endif
+ #ifdef CONFIG_SDMMC1_RK29
+ static struct resource resources_sdmmc1[] = {
+       {
+               .start  = IRQ_SDIO,
+               .end    = IRQ_SDIO,
+               .flags  = IORESOURCE_IRQ,
+       },
+       {
+               .start  = RK29_SDMMC1_PHYS,
+               .end    = RK29_SDMMC1_PHYS + RK29_SDMMC1_SIZE -1,
+               .flags  = IORESOURCE_MEM,
+       }
+ }; 
+ #endif
+ /* sdmmc */
+ #ifdef CONFIG_SDMMC0_RK29
+ struct platform_device rk29_device_sdmmc0 = {
+       .name                   = "rk29_sdmmc",
+       .id                             = 0,
+       .num_resources  = ARRAY_SIZE(resources_sdmmc0),
+       .resource               = resources_sdmmc0,
+       .dev                    = {
+               .platform_data = &default_sdmmc0_data,
+       },
+ };
+ #endif
+ #ifdef CONFIG_SDMMC1_RK29
+ struct platform_device rk29_device_sdmmc1 = {
+       .name                   = "rk29_sdmmc",
+       .id                             = 1,
+       .num_resources  = ARRAY_SIZE(resources_sdmmc1),
+       .resource               = resources_sdmmc1,
+       .dev                    = {
+               .platform_data = &default_sdmmc1_data,
+       },
+ };
+ #endif
  /*
   * rk29 4 uarts device
   */
@@@ -117,73 -167,51 +169,120 @@@ struct platform_device rk29_device_uart
  };
  #endif
  
 +/*
 + * rk29xx spi master device
 + */
 +static struct resource rk29_spi0_resources[] = {
 +      {
 +              .start  = IRQ_SPI0,
 +              .end    = IRQ_SPI0,
 +              .flags  = IORESOURCE_IRQ,
 +      },
 +      {
 +              .start  = RK29_SPI0_PHYS,
 +              .end    = RK29_SPI0_PHYS + RK29_SPI0_SIZE - 1,
 +              .flags  = IORESOURCE_MEM,
 +      },
 +      {
 +              .start  = DMACH_SPI0_TX,
 +              .end    = DMACH_SPI0_TX,
 +              .flags  = IORESOURCE_DMA,
 +      },
 +      {
 +              .start  = DMACH_SPI0_RX,
 +              .end    = DMACH_SPI0_RX,
 +              .flags  = IORESOURCE_DMA,
 +      },
 +};
 +
 +struct platform_device rk29xx_device_spi0m = {
 +      .name   = "rk29xx_spim",
 +      .id     = 0,
 +      .num_resources  = ARRAY_SIZE(rk29_spi0_resources),
 +      .resource       = rk29_spi0_resources,
 +      .dev                    = {
 +              .platform_data  = &rk29xx_spi0_platdata,
 +      },
 +};
 +
 +static struct resource rk29_spi1_resources[] = {
 +      {
 +              .start  = IRQ_SPI1,
 +              .end    = IRQ_SPI1,
 +              .flags  = IORESOURCE_IRQ,
 +      },
 +      {
 +              .start  = RK29_SPI1_PHYS,
 +              .end    = RK29_SPI1_PHYS + RK29_SPI1_SIZE - 1,
 +              .flags  = IORESOURCE_MEM,
 +      },
 +      {
 +              .start  = DMACH_SPI1_TX,
 +              .end    = DMACH_SPI1_TX,
 +              .flags  = IORESOURCE_DMA,
 +      },
 +      {
 +              .start  = DMACH_SPI1_RX,
 +              .end    = DMACH_SPI1_RX,
 +              .flags  = IORESOURCE_DMA,
 +      },
 +};
 +
 +struct platform_device rk29xx_device_spi1m = {
 +      .name   = "rk29xx_spim",
 +      .id     = 1,
 +      .num_resources  = ARRAY_SIZE(rk29_spi1_resources),
 +      .resource       = rk29_spi1_resources,
 +      .dev                    = {
 +              .platform_data  = &rk29xx_spi1_platdata,
 +      },
 +};
 +
+ #ifdef CONFIG_FB_RK29
+ /* rk29 fb resource */
+ static struct resource rk29_fb_resource[] = {
+       [0] = {
+               .start = RK29_LCDC_PHYS,
+               .end   = RK29_LCDC_PHYS + RK29_LCDC_SIZE - 1,
+               .flags = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start = IRQ_LCDC,
+               .end   = IRQ_LCDC,
+               .flags = IORESOURCE_IRQ,
+       },
+ };
+ /*platform_device*/
+ extern struct rk29fb_info rk29_fb_info;
+ struct platform_device rk29_device_fb = {
+       .name             = "rk29-fb",
+       .id               = 4,
+       .num_resources    = ARRAY_SIZE(rk29_fb_resource),
+       .resource         = rk29_fb_resource,
+       .dev            = {
+               .platform_data  = &rk29_fb_info,
+       }
+ };
+ #endif
+ #if defined(CONFIG_MTD_NAND_RK29)  
+ static struct resource nand_resources[] = {
+       {
+               .start  = RK29_NANDC_PHYS,
+               .end    =       RK29_NANDC_PHYS+RK29_NANDC_SIZE -1,
+               .flags  = IORESOURCE_MEM,
+       }
+ };
+ struct platform_device rk29_device_nand = {
+       .name   = "rk29-nand",
+       .id             =  -1, 
+       .resource       = nand_resources,
+       .num_resources= ARRAY_SIZE(nand_resources),
+       .dev    = {
+               .platform_data= &rk29_nand_data,
+       },
+       
+ };
+ #endif
  
index 8911ba3ab457572c9252d55dddae9b3bd395936c,fd1fe6e5d97bd8ca3bcd761406ede1bcff5fc7f4..0d8291020843d12993a127d0cc191030173684c9
@@@ -21,9 -22,11 +22,15 @@@ extern struct platform_device rk29_devi
  extern struct platform_device rk29_device_uart1;
  extern struct platform_device rk29_device_uart2;
  extern struct platform_device rk29_device_uart3;
 +extern struct platform_device rk29xx_device_spi0m;
 +extern struct platform_device rk29xx_device_spi1m;
 +extern struct rk29xx_spi_platform_data rk29xx_spi0_platdata;
 +extern struct rk29xx_spi_platform_data rk29xx_spi1_platdata;
+ extern struct platform_device rk29_device_fb;
+ extern struct platform_device rk29_device_nand;
+ extern struct rk29_sdmmc_platform_data default_sdmmc0_data;
+ extern struct rk29_sdmmc_platform_data default_sdmmc1_data;
+ extern struct platform_device rk29_device_sdmmc0;
+ extern struct platform_device rk29_device_sdmmc1;
  
--#endif
++#endif
index a5acb1b99d90f47564fd22c6709c60f520d8c6c5,b38b8fe37a7b0e364cf7cd56cb2ad5b22a62bb37..c1842835fedfb74c8611c6984d0f74777d0e729c
mode 100755,100644..100755
@@@ -606,7 -602,7 +606,8 @@@ void __init rk29_gpio_irq_setup(void
                                irq = IRQ_GPIO6;
                                break;          
                }
-               set_irq_chip_data(irq+14, this);
++
+               set_irq_chip_data(NR_AIC_IRQS+this->bank->id,this);
                set_irq_chained_handler(irq, gpio_irq_handler);
                this += 1; 
                pin += 32;
@@@ -630,4 -626,4 +631,4 @@@ void __init rk29_gpio_init(struct rk29_
                gpiochip_add(&rk29_gpio->chip);
        }
        printk("rk29_gpio_init:nr_banks=%d\n",nr_banks);
--}
++}
index 682786c5145881143298a200b64b5fe6b3f85299,bb575a0e2311241d177eaf311a1e124ffdb5ecc1..52b7c1bb1d5048d99714d5426b3b491981f1f226
  
  #include <linux/types.h>
  
 +/*spi*/
 +struct spi_cs_gpio {
 +      const char *name;
 +      unsigned int cs_gpio;
 +      char *cs_iomux_name;
 +      unsigned int cs_iomux_mode;
 +};
 +
 +struct rk29xx_spi_platform_data {
 +      int (*io_init)(struct spi_cs_gpio*, int);
 +      int (*io_deinit)(struct spi_cs_gpio*, int);
 +      int (*io_fix_leakage_bug)(void);
 +      int (*io_resume_leakage_bug)(void);
 +      struct spi_cs_gpio *chipselect_gpios;   
 +      u16 num_chipselect;
 +};
 +
+ #define INVALID_GPIO        -1
+ struct rk29lcd_info{
+     u32 lcd_id;
+     u32 txd_pin;
+     u32 clk_pin;
+     u32 cs_pin;
+     int (*io_init)(void);
+     int (*io_deinit)(void);
+ };
+ struct rk29_fb_setting_info{
+     u8 data_num;
+     u8 vsync_en;
+     u8 den_en;
+     u8 mcu_fmk_en;
+     u8 disp_on_en;
+     u8 standby_en;
+ };
+ struct rk29fb_info{
+     u32 fb_id;
+     u32 disp_on_pin;
+     u8 disp_on_value;
+     u32 standby_pin;
+     u8 standby_value;
+     u32 mcu_fmk_pin;
+     struct rk29lcd_info *lcd_info;
+     int (*io_init)(struct rk29_fb_setting_info *fb_setting);
+     int (*io_deinit)(void);
+ };
+ struct rk29_sdmmc_platform_data {
+       unsigned int num_slots;
+       unsigned int host_caps;
+       unsigned int host_ocr_avail;
+       unsigned int use_dma:1;
+       char dma_name[8];
+       int (*io_init)(void);
+       int (*io_deinit)(void);
+       int (*status)(struct device *);
+       int (*register_status_notify)(void (*callback)(int card_present, void *dev_id), void *dev_id);
+ };
  void __init rk29_map_common_io(void);
  void __init rk29_clock_init(void);
  
index 155aad3e04047b4015a6dbef3571c6059e32e863,575f48f8594ff966a79099982ea4e757d6d2a4dd..7953ceb039cec6577223d8d484cd7d36a17de619
mode 100755,100644..100755
index 50353c20eba4e0dbbc6a6201e178516112f31fa0,d0c4eccc985f5f8ccc17871e07e002541eb3dd96..98d3bec833035d55b6121e4e6ea5b39c27226263
mode 100755,100644..100755
@@@ -382,7 -380,7 +382,7 @@@ static int xpt2046_debounce(void *xpt, 
        static int average_val[2];
        
  
--      xpt2046printk("***>%s:%d,%d,%d,%d,%d,%d,%d,%d\n",__FUNCTION__,
++      xpt2046printk("***>%s:%d,%d,%d,%d,%ld,%d,%d,%d\n",__FUNCTION__,
                data_idx,ts->last_read,
          ts->read_cnt,ts->debounce_max,
                abs(ts->last_read - *val),ts->debounce_tol,
@@@ -700,9 -695,9 +700,7 @@@ static int __devinit xpt2046_probe(stru
        struct spi_transfer             *x;
        int                             vref;
        int                             err;
-       int             i;
        
 -
 -      
        if (!spi->irq) {
                dev_dbg(&spi->dev, "no IRQ?\n");
                return -ENODEV;
@@@ -955,12 -949,12 +953,14 @@@ static struct spi_driver xpt2046_drive
  
  static int __init xpt2046_init(void)
  {
++      int ret;
++      
        xpt2046printk("Touch panel drive XPT2046 driver init...\n");
        
        gADPoint.x = 0;
        gADPoint.y = 0;
        
--      int ret = spi_register_driver(&xpt2046_driver);
++      ret = spi_register_driver(&xpt2046_driver);
      if (ret)
      {
                printk("Register XPT2046 driver failed.\n");