#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ºÍ¼Ä´æÆ÷»ùµØÖ·¡£
* 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
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
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
#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);
}
.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
.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 = {
.type = "gs_mma7660",
.addr = 0x4c,
.flags = 0,
- .irq = RK2818_PIN_PE3,
+ .irq = GS_IRQ_PIN,
+ .platform_data = &rk2818_gs_platdata,
},
#endif
{},
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 */
.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
};
.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,
};
/********************************************************
#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] = {
*/
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 = {
};
#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
};
// adc ---> key
+#define PLAY_ON_PIN RK2818_PIN_PE1
+#define PLAY_ON_LEVEL 1
static ADC_keyst gAdcValueTab[] =
{
{95, AD2KEY1},///VOLUME_DOWN
};
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,
.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)
{
#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)
#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ºÍ¼Ä´æÆ÷»ùµØÖ·¡£
* -------------------------------------------------------------------- */
.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
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
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
/*****************************************************************************************
* extern gpio devices
- *author: xxx
+ * author: xxx@rock-chips.com
*****************************************************************************************/
#if defined (CONFIG_GPIO_PCA9554)
struct rk2818_gpio_expander_info extern_gpio_settinginfo[] = {
#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
.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 = {
.type = "gs_mma7660",
.addr = 0x4c,
.flags = 0,
- .irq = RK2818_PIN_PE3,
+ .irq = GS_IRQ_PIN,
+ .platform_data = &rk2818_gs_platdata,
},
#endif
{},
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__);
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;
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;
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__);
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);
}
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;
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);
#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 */
.max_speed_hz = 8 * 1000 * 1000,
.bus_num = 0,
.mode = SPI_MODE_0,
+ //.platform_data = &rk2818_spi_platdata,
},
#endif
#if defined(CONFIG_ENC28J60)
.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
};
.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
#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] = {
*/
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 = {
};
#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,
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
};
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,
.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();
#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)
.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",
.id = 0,
.num_resources = ARRAY_SIZE(resources_spim),
.resource = resources_spim,
+ .dev = {
+ .platform_data = &rk2818_spi_platdata,
+ },
};
/* rk2818 fb resource */
* 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,
.name = "rk2818-adckey",
.id = -1,
.dev.parent = &rk2818_device_adc.dev,
+ .dev.platform_data = &rk2818_adckey_platdata,
};
+
/*
*rk2818 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,
+ },
};
/*
.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,
};
#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,
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;
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;
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;
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
#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;
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 {
#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{
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;
};
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
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);
};
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];
};
struct mtd_partition *parts;
unsigned int nr_parts;
size_t num_flash;
+ int (*io_init)(void);
+ int (*io_deinit)(void);
};
*/
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))
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))
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);
#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
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 ) {
#include <mach/adc.h>
#include <mach/board.h>
-extern struct adc_key_data rk2818_adc_key;
-
#if 0
#define DBG(x...) printk(x)
#else
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++;
}
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;
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) {
//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)
{
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");
}
//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();
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;
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);
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;
}
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",
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",
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;
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
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",
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)) {
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;
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);
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);
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)
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
}
//¸ù¾ÝƬѡÇé¿ö»Ö¸´IO MUXÔʼֵ
+#if 0
chip = mtd->priv;
switch(chip->numchips)
{
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;
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);
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();
#include <mach/gpio.h>
#include <mach/adc.h>
#include <mach/iomux.h>
-
+#include <mach/board.h>
#if 0
#define DBG(x...) printk(x)
#else
#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 //²¨¶¯×´Ì¬
struct power_supply battery;
struct power_supply usb;
struct power_supply ac;
+
+ int charge_ok_pin;
int adc_bat_divider;
int bat_max;
{
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");
{
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;
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)
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;
#include <linux/platform_device.h>
#include <mach/iomux.h>
#include <mach/gpio.h>
-
+#include <mach/board.h>
#include "rk2818_serial.h"
/*
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);
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;
#include "rk2818_spim.h"
#include <linux/spi/spi.h>
+#include <mach/board.h>
#ifdef CONFIG_DEBUG_FS
#include <linux/debugfs.h>
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
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)
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)
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);
if (!chip)
return -ENOMEM;
- chip->cs_control = null_cs_control;
+ chip->cs_control = spi_cs_control;
chip->enable_dma = 1; //0;
}
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;
}
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;
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;
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 */
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;
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;
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;
}
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;
#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;
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__);
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;
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);
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",
{
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 {
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;
/*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);
}
//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);
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),
/* 鑰虫満 */
/* 钃濈墮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),
};
{
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;
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);
}
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
#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"
{
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);
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");