add gpio expander pca9554 driver
author谢修鑫 <xxx@rock-chips.com>
Tue, 25 May 2010 14:23:26 +0000 (14:23 +0000)
committer黄涛 <huangtao@rock-chips.com>
Mon, 21 Jun 2010 05:35:16 +0000 (13:35 +0800)
arch/arm/mach-rk2818/board-midsdk.c
arch/arm/mach-rk2818/include/mach/gpio.h
arch/arm/mach-rk2818/include/mach/irqs.h

index 7e25a0f049466320b8ade4a06ab0337af03194dc..5b80511051a2a1fed112911e50e0be3c5cae8b60 100644 (file)
@@ -193,6 +193,55 @@ struct rk2818_sdmmc_platform_data default_sdmmc1_data __initdata = {
 #endif
 };
 
+/*****************************************************************************************
+ * extern gpio devices
+ *author: xxx
+ *****************************************************************************************/
+#if defined (CONFIG_GPIO_PCA9554)
+struct rk2818_gpio_expander_info  extern_gpio_settinginfo[] = {
+       {
+               .gpio_num               =RK2818_PIN_PI0,
+               .pin_type           = GPIO_IN,
+               //.pin_value                    =GPIO_HIGH,
+        },
+
+       {
+               .gpio_num               =RK2818_PIN_PI4,// tp3
+               .pin_type           = GPIO_IN,
+               //.pin_value                    =GPIO_HIGH,
+        },
+        
+        {
+               .gpio_num               =RK2818_PIN_PI5,//tp4
+               .pin_type           = GPIO_IN,
+               //.pin_value                    =GPIO_HIGH,
+        },
+        {
+               .gpio_num               =RK2818_PIN_PI6,//tp2
+               .pin_type           = GPIO_OUT,
+               //.pin_value                    =GPIO_HIGH,
+        },
+        {
+               .gpio_num               =RK2818_PIN_PI7,//tp1
+               .pin_type           = GPIO_OUT,
+               .pin_value                      =GPIO_HIGH,
+        },
+
+
+               
+};
+
+struct pca9554_platform_data rk2818_pca9554_data={
+       .gpio_base=GPIOS_EXPANDER_BASE,
+       .gpio_pin_num=CONFIG_EXPANDED_GPIO_NUM,
+       .gpio_irq_start=NR_AIC_IRQS + 2*NUM_GROUP,
+       .irq_pin_num=CONFIG_EXPANDED_GPIO_IRQ_NUM,
+       .pca9954_irq_pin=RK2818_PIN_PE2,
+       .settinginfo=extern_gpio_settinginfo,
+       .settinginfolen=ARRAY_SIZE(extern_gpio_settinginfo),
+       .names="pca9554",
+};
+#endif
 
 /*****************************************************************************************
  * I2C devices
@@ -265,6 +314,14 @@ static struct i2c_board_info __initdata board_i2c1_devices[] = {
                .addr           = 0x2b, 
                .flags                  = 0,
        },
+#endif
+#if defined (CONFIG_GPIO_PCA9554)
+       {
+               .type                   = "extend_gpio_pca9554",
+               .addr           = 0x3c, 
+               .flags                  = 0,
+               .platform_data=&rk2818_pca9554_data.gpio_base,
+       },
 #endif
        {}
 };
index 864274db46c2945af7cc2a1a1c87f63ea78bd256..d0cb33059949cefc21791c71251375ea8c7731da 100755 (executable)
@@ -23,8 +23,9 @@
 #define PIN_BASE                       0//¶¨ÒåRK2818ÄÚ²¿GPIOµÄµÚÒ»¸öPIN¿Ú(¼´GPIO0_A0)ÔÚgpio_descÊý×éµÄµØÖ·
 #define NUM_GROUP                      8// ¶¨ÒåRK2818ÄÚ²¿GPIOÿһ×é×î´óµÄPINÊýÄ¿£¬ÏÖÔÚ¶¨Îª8¸ö£¬¼´GPIOX_Y0~ GPIOX_Y7(ÆäÖÐX=0/1;Y=A/B/C/D)
 #define MAX_GPIO_BANKS         8//¶¨ÒåRK2818ÄÚ²¿GPIO×ܹ²Óм¸×飬ÏÖÔÚ¶¨Îª8×飬¼´GPIO0_A~ GPIO0_D£¬GPIO1_A~ GPIO1_D¡£
+#define GPIOS_EXPANDER_BASE    (PIN_BASE+NUM_GROUP*MAX_GPIO_BANKS)
 //¶¨ÒåGPIOµÄPIN¿Ú×î´óÊýÄ¿¡£(NUM_GROUP*MAX_GPIO_BANKS)±íʾRK2818µÄÄÚ²¿GPIOµÄPIN¿Ú×î´óÊýÄ¿£»CONFIG_ARCH_EXTEND_GPIOS±íʾÀ©Õ¹IOµÄ×î´óÊýÄ¿¡£
-#define ARCH_NR_GPIOS  (NUM_GROUP*MAX_GPIO_BANKS) + CONFIG_ARCH_EXTEND_GPIOS
+#define ARCH_NR_GPIOS  (NUM_GROUP*MAX_GPIO_BANKS) + CONFIG_EXPANDED_GPIO_NUM
 typedef enum eGPIOPinLevel
 {
        GPIO_LOW=0,
@@ -166,7 +167,15 @@ struct rk2818_gpio_bank {
 #define        RK2818_PIN_PH5  (PIN_BASE + 7*NUM_GROUP + 5)
 #define        RK2818_PIN_PH6  (PIN_BASE + 7*NUM_GROUP + 6)
 #define        RK2818_PIN_PH7  (PIN_BASE + 7*NUM_GROUP + 7)
-
+/***********************define extern gpio pin num******************************/
+#define        RK2818_PIN_PI0 (GPIOS_EXPANDER_BASE + 0)
+#define        RK2818_PIN_PI1 (GPIOS_EXPANDER_BASE +1)
+#define        RK2818_PIN_PI2 (GPIOS_EXPANDER_BASE +2)
+#define        RK2818_PIN_PI3 (GPIOS_EXPANDER_BASE +3)
+#define        RK2818_PIN_PI4 (GPIOS_EXPANDER_BASE +4)
+#define        RK2818_PIN_PI5 (GPIOS_EXPANDER_BASE +5)
+#define        RK2818_PIN_PI6 (GPIOS_EXPANDER_BASE +6)
+#define        RK2818_PIN_PI7 (GPIOS_EXPANDER_BASE +7)
 #ifndef __ASSEMBLY__
 extern void __init rk2818_gpio_init(struct rk2818_gpio_bank *data, int nr_banks);
 extern void __init rk2818_gpio_irq_setup(void);
@@ -193,7 +202,10 @@ static inline int gpio_to_irq(unsigned gpio)
 
 static inline int irq_to_gpio(unsigned irq)
 {
-       if((irq - __gpio_to_irq(RK2818_PIN_PA0)) < NUM_GROUP)
+       if(irq<NR_AIC_IRQS)
+       return -ENXIO;
+
+    if((irq - __gpio_to_irq(RK2818_PIN_PA0)) < NUM_GROUP)
     {
         return (RK2818_PIN_PA0 + (irq - __gpio_to_irq(RK2818_PIN_PA0)));
     } 
@@ -201,6 +213,10 @@ static inline int irq_to_gpio(unsigned irq)
     {
         return (RK2818_PIN_PE0 + (irq - __gpio_to_irq(RK2818_PIN_PE0)));
     }
+   else if((irq - __gpio_to_irq(RK2818_PIN_PA0)) <3*NUM_GROUP)
+   {
+       return (RK2818_PIN_PI0 + (irq - __gpio_to_irq(RK2818_PIN_PI0)));
+    }
     else
     {
         return -ENXIO;
index 096bd203f7e15c2c7403f68379b569523ca6f173..f2f80a29bf10d5c5686158007f9d098d1c95f835 100644 (file)
@@ -46,7 +46,7 @@
 CONFIG_RK28_GPIO_IRQ±íʾRK2818µÄGPIO¸´ÓõÄ×î´óÖжÏÊýÄ¿£¬CONFIG_EXTEND_GPIO_IRQ±íʾRK2818µÄ
 À©Õ¹IO¸´ÓõÄ×î´óÖжÏÊýÄ¿¡£*/
 #define NR_AIC_IRQS    48
-#define        NR_IRQS         (NR_AIC_IRQS + CONFIG_RK28_GPIO_IRQ + CONFIG_EXTEND_GPIO_IRQ)                                   
+#define        NR_IRQS         (NR_AIC_IRQS + CONFIG_RK28_GPIO_IRQ + CONFIG_EXPANDED_GPIO_IRQ_NUM)                                   
                                    
                                    
 /*irq number*/