From: 宋秀杰 Date: Wed, 8 Sep 2010 13:04:29 +0000 (-0700) Subject: add expand gpio soft interrupt in kconfig, so modify raho defconfig, amended some... X-Git-Tag: firefly_0821_release~11173 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=f4f4a5b8a89949446c6df3154de8008aaa38d4d0;p=firefly-linux-kernel-4.4.55.git add expand gpio soft interrupt in kconfig, so modify raho defconfig, amended some places which is not standard --- diff --git a/arch/arm/configs/rk2818_raho_defconfig b/arch/arm/configs/rk2818_raho_defconfig old mode 100644 new mode 100755 index 4029e5015bc0..c37aa0a3fba7 --- a/arch/arm/configs/rk2818_raho_defconfig +++ b/arch/arm/configs/rk2818_raho_defconfig @@ -885,6 +885,7 @@ CONFIG_GPIOLIB=y # CONFIG_IOEXTEND_TCA6424 is not set CONFIG_EXPANDED_GPIO_NUM=96 CONFIG_EXPANDED_GPIO_IRQ_NUM=16 +# CONFIG_EXPAND_GPIO_SOFT_INTERRUPT is not set CONFIG_SPI_FPGA_GPIO_NUM=96 CONFIG_SPI_FPGA_GPIO_IRQ_NUM=16 # CONFIG_W1 is not set diff --git a/arch/arm/mach-rk2818/board-infosdk.c b/arch/arm/mach-rk2818/board-infosdk.c index c84a3fb19554..f7385d5c3aca 100755 --- a/arch/arm/mach-rk2818/board-infosdk.c +++ b/arch/arm/mach-rk2818/board-infosdk.c @@ -1388,7 +1388,6 @@ struct platform_device rk2818_device_dm9k = { /* * InfoPhone Matrix Keyboard Device */ - #define KEYOUT0 TCA6424_P01 #define KEYOUT1 TCA6424_P02 #define KEYOUT2 TCA6424_P03 @@ -1400,31 +1399,7 @@ struct platform_device rk2818_device_dm9k = { #define KEYIN2 TCA6424_P14 #define KEYIN3 TCA6424_P15 - -#if 1 static const uint32_t rk2818matrix_keymap[] = { -#if 0 - KEY(0, 0, KEY_1), - KEY(0, 1, KEY_3), - KEY(0, 2, KEY_5), - KEY(0, 3, KEY_6), - KEY(0, 4, KEY_7), - KEY(1, 0, KEY_2), - KEY(1, 1, KEY_4), - KEY(1, 2, KEY_R), - KEY(1, 3, KEY_Y), - KEY(1, 4, KEY_8), - KEY(2, 0, KEY_TAB), - KEY(2, 1, KEY_Q), - KEY(2, 2, KEY_E), - KEY(2, 3, KEY_T), - KEY(2, 4, KEY_G), - KEY(3, 0, KEY_LEFTCTRL), - KEY(3, 1, KEY_W), - KEY(3, 2, KEY_S), - KEY(3, 3, KEY_F), - KEY(3, 4, KEY_V), -#else KEY(0, 0, KEY_1), KEY(1, 0, KEY_2), KEY(2, 0, KEY_3), @@ -1445,33 +1420,7 @@ static const uint32_t rk2818matrix_keymap[] = { KEY(1, 4, KEY_S), KEY(2, 4, KEY_F), KEY(3, 4, KEY_V), -#endif }; -#else -static const uint32_t rk2818matrix_keymap[] = { - KEY(0, 0, KEY_1), - KEY(0, 1, KEY_2), - KEY(0, 2, KEY_3), - KEY(0, 3, KEY_TAB), - KEY(1, 0, KEY_4), - KEY(1, 1, KEY_5), - KEY(1, 2, KEY_6), - KEY(1, 3, KEY_R), - KEY(2, 0, KEY_7), - KEY(2, 1, KEY_8), - KEY(2, 2, KEY_9), - KEY(2, 3, KEY_LEFTCTRL), - KEY(3, 0, KEY_SWITCHVIDEOMODE), - KEY(3, 1, KEY_0), - KEY(3, 2, KEY_S), - KEY(3, 3, KEY_F), - KEY(4, 0, KEY_G), - KEY(4, 1, KEY_W), - KEY(4, 2, KEY_S), - KEY(4, 3, KEY_F), -}; - -#endif static struct matrix_keymap_data rk2818matrix_keymap_data = { .keymap = rk2818matrix_keymap, diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index 604fa05d470f..27553305bab0 100755 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig @@ -252,7 +252,7 @@ config EXPANDED_GPIO_IRQ_NUM int "setting the amount of expanded gpio irqs" help for tca6424, set 24 -config SOFT_INTERRUPT +config EXPAND_GPIO_SOFT_INTERRUPT bool "soft interrupt for expand gpio use" help if you want expand gpio support interrupt,choose it diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile index 27efb0654627..dd031a14d055 100755 --- a/drivers/gpio/Makefile +++ b/drivers/gpio/Makefile @@ -21,4 +21,4 @@ obj-$(CONFIG_GPIO_VR41XX) += vr41xx_giu.o obj-$(CONFIG_GPIO_WM831X) += wm831x-gpio.o obj-$(CONFIG_GPIO_PCA9554) += pca9554.o obj-$(CONFIG_IOEXTEND_TCA6424) += tca6424.o -obj-$(CONFIG_SOFT_INTERRUPT) += soft_interrupt.o +obj-$(CONFIG_EXPAND_GPIO_SOFT_INTERRUPT) += expand_gpio_soft_interrupt.o diff --git a/drivers/gpio/expand_gpio_soft_interrupt.c b/drivers/gpio/expand_gpio_soft_interrupt.c new file mode 100755 index 000000000000..79c4fd06cfe3 --- /dev/null +++ b/drivers/gpio/expand_gpio_soft_interrupt.c @@ -0,0 +1,449 @@ +/* + * Copyright (C) 2010 ROCKCHIP, Inc. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/*******************************************************************/ +/* COPYRIGHT (C) ROCK-CHIPS FUZHOU . ALL RIGHTS RESERVED.*/ +/******************************************************************* +FILE : Soft_interrupt.c +MODIFY : sxj +DATE : 2010-9-2 +NOTES : +********************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../drivers/gpio/expand_gpio_soft_interrupt.h" + +#if 0 +#define DBG(x...) printk(KERN_INFO x) +#else +#define DBG(x...) +#endif + +#if 0 +#define DBGERR(x...) printk(KERN_INFO x) +#else +#define DBGERR(x...) +#endif + +#define EXTPAND_GPIO_GET_BIT(a,num) (((a)>>(num))&0x01) +#define EXTPAND_GPIO_SET_BIT(a,num) ((a)|(0x01<<(num))) +#define EXTPAND_GPIO_CLEAR_BIT(a,num) ((a)&(~(0x01<<(num)))) +#define MIN(x,y) (((x)<(y))?(x):(y)) + + +static int expand_gpio_irq_en = -1; +static int expand_gpio_irq_ctrflag = -1; +static unsigned int expand_gpio_irq_num = 0; + +static struct workqueue_struct *irqworkqueue; +static struct lock_class_key gpio_lock_class; + +struct expand_gpio_soft_int expand_irq_data; + +void expand_gpio_irq_ctr_dis(int irq,int ctrflag) +{ + expand_gpio_irq_ctrflag=0; + if(expand_gpio_irq_en) + { + expand_gpio_irq_en=0; + disable_irq_nosync(irq); + DBG("***********%s %d***********\n",__FUNCTION__,__LINE__); + } + if(ctrflag) + { + expand_gpio_irq_ctrflag=-1; + } +} + +void expand_gpio_irq_ctr_en(int irq) +{ + if(!expand_gpio_irq_en) + { + DBG("***********%s %d***********\n",__FUNCTION__,__LINE__); + expand_gpio_irq_en = -1; + enable_irq(irq); + } +} + +static int expand_checkrange(int start,int num,int val) +{ + + if((val<(start+num))&&(val>=start)) + { + return 0; + } + else + { + return -1; + } + +} + +static void expand_gpio_irq_enable(unsigned irq) +{ + struct irq_desc *desc = irq_to_desc(irq); + struct expand_gpio_soft_int *pchip=(struct expand_gpio_soft_int *)desc->chip_data; + uint8_t gpioPortNum; + uint8_t gpioPortPinNum; + uint8_t expandpinnum; + + if(!expand_checkrange(pchip->gpio_irq_start,pchip->irq_pin_num,irq)) + { + expandpinnum = irq - pchip->gpio_irq_start;//irq_to_gpio(irq) + } + else + { + return; + } + gpioPortNum = expandpinnum/(pchip->expand_port_pinnum); + gpioPortPinNum= expandpinnum%(pchip->expand_port_pinnum); + + if((gpioPortNum>=(pchip->expand_port_group))||(gpioPortPinNum>=(pchip->expand_port_pinnum))) + return; + //DBG("**%s**\n",__FUNCTION__); + pchip->interrupt_en[gpioPortNum]=EXTPAND_GPIO_SET_BIT(pchip->interrupt_en[gpioPortNum],gpioPortPinNum); +} +static void expand_gpio_irq_disable(unsigned irq) +{ + struct irq_desc *desc = irq_to_desc(irq); + struct expand_gpio_soft_int *pchip=(struct expand_gpio_soft_int *)desc->chip_data; + uint8_t gpioPortNum; + uint8_t gpioPortPinNum; + uint8_t expandpinnum; + + if(!expand_checkrange(pchip->gpio_irq_start,pchip->irq_pin_num,irq)) + { + expandpinnum=irq - pchip->gpio_irq_start;//irq_to_gpio(irq) + } + else + { + return; + } + gpioPortNum = expandpinnum/(pchip->expand_port_pinnum); + gpioPortPinNum= expandpinnum%(pchip->expand_port_pinnum); + + if((gpioPortNum>=(pchip->expand_port_group))||(gpioPortPinNum>=(pchip->expand_port_pinnum))) + return; + //DBG("**%s**\n",__FUNCTION__); + pchip->interrupt_en[gpioPortNum]=EXTPAND_GPIO_CLEAR_BIT(pchip->interrupt_en[gpioPortNum],gpioPortPinNum); + +} + +static void expand_gpio_irq_mask(unsigned irq) +{ + struct irq_desc *desc = irq_to_desc(irq); + struct expand_gpio_soft_int *pchip=(struct expand_gpio_soft_int *)desc->chip_data; + uint8_t gpioPortNum; + uint8_t gpioPortPinNum; + uint8_t expandpinnum; + + if(!expand_checkrange(pchip->gpio_irq_start,pchip->irq_pin_num,irq)) + { + expandpinnum=irq-pchip->gpio_irq_start;//irq_to_gpio(irq) + } + else + { + return; + } + gpioPortNum = expandpinnum/(pchip->expand_port_pinnum); + gpioPortPinNum= expandpinnum%(pchip->expand_port_pinnum); + if((gpioPortNum>=(pchip->expand_port_group))||(gpioPortPinNum>=(pchip->expand_port_pinnum))) + return; + //DBG("**%s**\n",__FUNCTION__); + pchip->interrupt_mask[gpioPortNum]=EXTPAND_GPIO_SET_BIT(pchip->interrupt_mask[gpioPortNum],gpioPortPinNum); +} + +static void expand_gpio_irq_unmask(unsigned irq) +{ + struct irq_desc *desc = irq_to_desc(irq); + struct expand_gpio_soft_int *pchip=(struct expand_gpio_soft_int *)desc->chip_data; + uint8_t gpioPortNum; + uint8_t gpioPortPinNum; + uint8_t expandpinnum; + + if(!expand_checkrange(pchip->gpio_irq_start,pchip->irq_pin_num,irq)) + { + expandpinnum=irq-pchip->gpio_irq_start;//irq_to_gpio(irq) + } + else + { + return; + } + gpioPortNum = expandpinnum/(pchip->expand_port_pinnum); + gpioPortPinNum= expandpinnum%(pchip->expand_port_pinnum); + if((gpioPortNum>=(pchip->expand_port_group))||(gpioPortPinNum>=(pchip->expand_port_pinnum))) + return; + //DBG("**%s**\n",__FUNCTION__); + pchip->interrupt_mask[gpioPortNum]=EXTPAND_GPIO_CLEAR_BIT(pchip->interrupt_mask[gpioPortNum],gpioPortPinNum); +} + +static int expand_gpio_irq_type(unsigned int irq, unsigned int type) +{ + struct irq_desc *desc_irq=irq_to_desc(irq); + struct expand_gpio_soft_int *pchip=(struct expand_gpio_soft_int *)desc_irq->chip_data; + uint8_t gpioPortNum; + uint8_t gpioPortPinNum; + uint8_t expandpinnum; + if(!expand_checkrange(pchip->gpio_irq_start,pchip->irq_pin_num,irq)) + { + expandpinnum = irq - pchip->gpio_irq_start;//irq_to_gpio(irq) + } + else + { + return -1; + } + + gpioPortNum = expandpinnum/(pchip->expand_port_pinnum); + gpioPortPinNum= expandpinnum%(pchip->expand_port_pinnum); + if((gpioPortNum>=(pchip->expand_port_group))||(gpioPortPinNum>=(pchip->expand_port_pinnum))) + return -1; + DBG("**%s %d PortNum=%d,PortPinNum=%d**\n",__FUNCTION__,__LINE__,gpioPortNum,gpioPortPinNum); + switch (type) { + case IRQ_TYPE_NONE: + pchip->inttype_set[gpioPortNum]=EXTPAND_GPIO_CLEAR_BIT(pchip->inttype_set[gpioPortNum],gpioPortPinNum); + DBG("**%s IRQ_TYPE_NONE**\n",__FUNCTION__); + break; + case IRQ_TYPE_EDGE_RISING: + pchip->inttype_set[gpioPortNum]=EXTPAND_GPIO_SET_BIT(pchip->inttype_set[gpioPortNum],gpioPortPinNum); + pchip->inttype[gpioPortNum]=EXTPAND_GPIO_SET_BIT(pchip->inttype[gpioPortNum],gpioPortPinNum); + pchip->inttype1[gpioPortNum]=EXTPAND_GPIO_CLEAR_BIT(pchip->inttype1[gpioPortNum],gpioPortPinNum); + DBG("**%s IRQ_TYPE_EDGE_RISING,inttype=%x,inttype1=%x**\n",__FUNCTION__,pchip->inttype[gpioPortNum],pchip->inttype1[gpioPortNum]); + break; + case IRQ_TYPE_EDGE_FALLING: + pchip->inttype_set[gpioPortNum]=EXTPAND_GPIO_SET_BIT(pchip->inttype_set[gpioPortNum],gpioPortPinNum); + pchip->inttype[gpioPortNum]=EXTPAND_GPIO_CLEAR_BIT(pchip->inttype[gpioPortNum],gpioPortPinNum); + pchip->inttype1[gpioPortNum]=EXTPAND_GPIO_CLEAR_BIT(pchip->inttype1[gpioPortNum],gpioPortPinNum); + DBG("**%s IRQ_TYPE_EDGE_RISING,inttype=%x,inttype1=%x**\n",__FUNCTION__,pchip->inttype[gpioPortNum],pchip->inttype1[gpioPortNum]); + break; + case IRQ_TYPE_EDGE_BOTH: + pchip->inttype_set[gpioPortNum]=EXTPAND_GPIO_SET_BIT(pchip->inttype_set[gpioPortNum],gpioPortPinNum); + pchip->inttype1[gpioPortNum]=EXTPAND_GPIO_SET_BIT(pchip->inttype1[gpioPortNum],gpioPortPinNum); + DBG("**%s IRQ_TYPE_EDGE_RISING,inttype=%x,inttype1=%x**\n",__FUNCTION__,pchip->inttype[gpioPortNum],pchip->inttype1[gpioPortNum]); + break; + case IRQ_TYPE_LEVEL_HIGH: + pchip->inttype_set[gpioPortNum]=EXTPAND_GPIO_CLEAR_BIT(pchip->inttype_set[gpioPortNum],gpioPortPinNum); + DBG("extern gpios does not support IRQ_TYPE_LEVEL_HIGH irq typ"); + break; + case IRQ_TYPE_LEVEL_LOW: + pchip->inttype_set[gpioPortNum]=EXTPAND_GPIO_CLEAR_BIT(pchip->inttype_set[gpioPortNum],gpioPortPinNum); + DBG("extern gpios does not support IRQ_TYPE_LEVEL_LOW irq typ"); + break; + default: + return -EINVAL; + } + return 0; +} + +static int expand_gpio_irq_set_wake(unsigned irq, unsigned state) +{ + //no irq wake + return 0; +} +static struct irq_chip expand_gpio_irqchip = { + .name = "expand_gpio_expand ", + .enable = expand_gpio_irq_enable, + .disable = expand_gpio_irq_disable, + .mask = expand_gpio_irq_mask, + .unmask = expand_gpio_irq_unmask, + .set_type = expand_gpio_irq_type, + .set_wake = expand_gpio_irq_set_wake, +}; + +static irqreturn_t expand_gpio_irq_handler(int irq, void * dev_id) +{ + struct irq_desc *gpio_irq_desc = irq_to_desc(irq); + struct expand_gpio_soft_int *pchip=(struct expand_gpio_soft_int *)gpio_irq_desc->chip_data; + u8 oldintputreg[MAX_SUPPORT_PORT_GROUP]={0,0,0,0,0}; + u8 tempintputreg[MAX_SUPPORT_PORT_GROUP]={0,0,0,0,0}; + u8 tempallowint=0; + u8 levelchg=0; + u8 intbit[MAX_SUPPORT_PORT_GROUP]={0,0,0,0,0}; + u8 tempinttype=0; + u8 int_en_flag=0; + int i,j; + + DBG("******************%s*******************\n",__FUNCTION__); + expand_gpio_irq_ctr_dis(pchip->irq_chain,0); + memcpy(&oldintputreg[0],&pchip->gvar->reg_input[0],pchip->expand_port_pinnum); + if(pchip->irq_data.read_allinputreg(pchip->irq_data.data,&tempintputreg[0])) + { + expand_gpio_irq_ctr_dis(pchip->irq_chain,-1); + DBG("**%s[%d] reading reg is error\n",__FUNCTION__,__LINE__); + queue_work(irqworkqueue,&pchip->irq_work); + return IRQ_HANDLED; + } + + memcpy(&pchip->gvar->reg_input[0],&tempintputreg[0],pchip->expand_port_pinnum); + //DBG("**has run at %s**,input[0] = %x,input[1] = %x,input[2] = %x\n",__FUNCTION__,pchip->gvar.reg_input[0],pchip->gvar.reg_input[1],pchip->gvar.reg_input[2]); + + //Handle for different expand_port_group + for(i=0,int_en_flag=0;iexpand_port_group,MAX_SUPPORT_PORT_GROUP);i++) + { + int_en_flag|=pchip->interrupt_en[i]; + } + + if(!int_en_flag) + { + if(expand_gpio_irq_num<0xFFFFFFFF) + { + expand_gpio_irq_num++; + } + else + { + expand_gpio_irq_num=0; + } + DBGERR("there are no pin reg irq\n"); + expand_gpio_irq_ctr_en(pchip->irq_chain); + return IRQ_HANDLED; + } + + for(i=0;iexpand_port_group;i++) + { + tempallowint=pchip->interrupt_en[i]&pchip->gvar->reg_direction[i]&(~pchip->interrupt_mask[i]);// Âú×ãÖжÏÌõ¼þ + levelchg=oldintputreg[i]^tempintputreg[i];// ÕÒ³öǰºó״̬²»Ò»ÑùµÄpin + tempinttype=~(tempintputreg[i]^pchip->inttype[i]);// ÕÒ³ö´¥·¢×´Ì¬ºÍµ±Ç°pin״̬һÑùµÄpin£¬×¢ÒâÖ»Ö§³Ölow highÁ½ÖÖpin´¥·¢ + + tempinttype=(~pchip->inttype1[i])&tempinttype;// inttype1 ÎªÕæµÄλ¶ÔÓ¦µÄtempinttypeλÇåÁ㣬ÒòΪ¸ÃλֻÊÜinttype1¿ØÖÆ + tempinttype|=pchip->inttype1[i];//µçƽֻҪÊDZ仯¾Í²úÉúÖÐ¶Ï + tempinttype&=pchip->inttype_set[i];//ÒѾ­ÉèÖÃÁËtypeÀàÐÍ + + intbit[i]=tempallowint&levelchg&tempinttype; + //DBG(" tempallowint=%x,levelchg=%x,tempinttype=%x,intbit=%d\n",tempallowint,levelchg,tempinttype,intbit[i]); + } + if(expand_gpio_irq_num<0xFFFFFFFF) + { + expand_gpio_irq_num++; + } + else + { + expand_gpio_irq_num=0; + } + for(i=0;iexpand_port_group;i++) + { + if(intbit[i]) + { + for(j=0;jexpand_port_pinnum;j++) + { + if(EXTPAND_GPIO_GET_BIT(intbit[i],j)) + { + irq=pchip->gpio_irq_start+pchip->expand_port_pinnum*i+j; + gpio_irq_desc = irq_to_desc(irq); + gpio_irq_desc->chip->mask(irq); + generic_handle_irq(irq); + gpio_irq_desc->chip->unmask(irq); + //DBG("expand_i2c_irq_handler port=%d,pin=%d,pinlevel=%d\n",i,j,EXTPAND_GPIO_GET_BIT(tempintputreg[i],j)); + } + } + } + } + expand_gpio_irq_ctr_en(pchip->irq_chain); + return IRQ_HANDLED; +} + +static void irq_call_back_handler(struct work_struct *work) +{ + struct expand_gpio_soft_int *pchip = container_of(work, struct expand_gpio_soft_int,irq_work); + //printk("irq_call_back_handle\n"); + expand_gpio_irq_handler(pchip->irq_chain,NULL); +} + +void expand_gpio_irq_setup(struct expand_gpio_soft_int *pchip) +{ + unsigned int pioc, irq_num; + int ret; + struct irq_desc *desc; + irq_num = pchip->gpio_irq_start; //ÖжϺţ¬À©Õ¹ioµÄÖжϺÅÓ¦¸Ã½ô¸úÔÚÄÚ²¿ioÖжϺŵĺóÃæ¡£ÈçrkÄÚ²¿ÖжÏ48¸ö£¬¼ÓÉÏÄÚ²¿gpio 16¸öÐéÄâÖжϣ¬ÕâÀïpinÓ¦¸Ã´Ó48+16¿ªÊ¼ + + DBG("**%s**\n",__FUNCTION__); + for (pioc = 0; pioc < pchip->irq_pin_num; pioc++,irq_num++) + { + lockdep_set_class(&irq_desc[irq_num].lock, &gpio_lock_class); + /* + * Can use the "simple" and not "edge" handler since it's + * shorter, and the AIC handles interrupts sanely. + */ + set_irq_chip(irq_num, &expand_gpio_irqchip); + set_irq_handler(irq_num, handle_simple_irq); + set_irq_chip_data(irq_num,(void *)pchip); + desc = irq_to_desc(irq_num); + DBG("**%s line=%d,irq_num=%d**\n",__FUNCTION__,__LINE__,irq_num); + set_irq_flags(irq_num, IRQF_VALID); + } + ret = gpio_request(pchip->irq_gpiopin,NULL); + if(ret!=0) + { + gpio_free(pchip->irq_gpiopin); + DBG("expand_gpio_irq_setup request gpio is err\n"); + } + gpio_pull_updown(pchip->irq_gpiopin, pchip->rk_irq_gpio_pull_up_down); //gpio ÐèÒªÀ­¸ßirq_to_gpio(pchip->irq_chain) + irqworkqueue=create_rt_workqueue("irq workqueue"); + INIT_WORK(&pchip->irq_work,irq_call_back_handler); + set_irq_chip_data(pchip->irq_chain, pchip); + if(request_irq(pchip->irq_chain,expand_gpio_irq_handler,pchip->rk_irq_mode, "expand", pchip)!=0) + { + DBG("**%s line=%d is err**\n",__FUNCTION__,__LINE__); + } +} + +int wait_untill_input_reg_flash(void) +{ + unsigned int num = 0; + unsigned int tempnum = expand_gpio_irq_num; + + while(expand_gpio_irq_ctrflag&&(expand_gpio_irq_num==tempnum)) + { + mdelay(1); + num++; + if(num>5) + return -1; + } + return 0; +} + +void expand_irq_init(void *data,struct expand_gpio_global_variable *var,irq_read_inputreg handler) +{ + expand_irq_data.irq_data.data = data; + expand_irq_data.irq_data.read_allinputreg = handler; + expand_irq_data.gvar = var; + expand_gpio_irq_setup(&expand_irq_data); +} + + + + + + + diff --git a/drivers/gpio/expand_gpio_soft_interrupt.h b/drivers/gpio/expand_gpio_soft_interrupt.h new file mode 100755 index 000000000000..f04f6885b610 --- /dev/null +++ b/drivers/gpio/expand_gpio_soft_interrupt.h @@ -0,0 +1,47 @@ +#ifndef _SOFT_INTERRUPT_H +#define _SOFT_INTERRUPT_H + +#define MAX_SUPPORT_PORT_GROUP 5 + +typedef int (*irq_read_inputreg)(void *,char *); +struct expand_gpio_irq_data +{ + void *data; + irq_read_inputreg read_allinputreg; +}; + +struct expand_gpio_global_variable +{ + uint8_t reg_input[MAX_SUPPORT_PORT_GROUP]; + uint8_t reg_output[MAX_SUPPORT_PORT_GROUP]; + uint8_t reg_direction[MAX_SUPPORT_PORT_GROUP]; +}; +struct expand_gpio_soft_int +{ + unsigned int gpio_irq_start; + unsigned int irq_pin_num; //ÖжϵĸöÊý + unsigned int irq_gpiopin; //¸¸ÖжϵÄÖÐ¶Ï ½Å + unsigned int irq_chain; //¸¸ÖжϵÄÖжϺŠ+ + unsigned int expand_port_group; + unsigned int expand_port_pinnum; + unsigned int rk_irq_mode; + unsigned int rk_irq_gpio_pull_up_down; + + uint8_t interrupt_en[MAX_SUPPORT_PORT_GROUP]; // 0 dis + uint8_t interrupt_mask[MAX_SUPPORT_PORT_GROUP]; // 0 unmask + uint8_t inttype_set[MAX_SUPPORT_PORT_GROUP]; // Inttype enable + uint8_t inttype[MAX_SUPPORT_PORT_GROUP]; + uint8_t inttype1[MAX_SUPPORT_PORT_GROUP]; + + struct expand_gpio_irq_data irq_data; + struct work_struct irq_work; + struct expand_gpio_global_variable *gvar; +}; + +extern struct expand_gpio_soft_int expand_irq_data; +extern int wait_untill_input_reg_flash(void); +extern void expand_irq_init(void *data,struct expand_gpio_global_variable *var,irq_read_inputreg handler); + +#endif + diff --git a/drivers/gpio/soft_interrupt.c b/drivers/gpio/soft_interrupt.c deleted file mode 100755 index 6868d549d75c..000000000000 --- a/drivers/gpio/soft_interrupt.c +++ /dev/null @@ -1,448 +0,0 @@ -/* - * Copyright (C) 2010 ROCKCHIP, Inc. - * - * This software is licensed under the terms of the GNU General Public - * License version 2, as published by the Free Software Foundation, and - * may be copied, distributed, and modified under those terms. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/*******************************************************************/ -/* COPYRIGHT (C) ROCK-CHIPS FUZHOU . ALL RIGHTS RESERVED.*/ -/******************************************************************* -FILE : Soft_interrupt.c -MODIFY : sxj -DATE : 2010-9-2 -NOTES : -********************************************************************/ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "../drivers/gpio/soft_interrupt.h" - -#if 0 -#define DBG(x...) printk(KERN_INFO x) -#else -#define DBG(x...) -#endif - -#if 0 -#define DBGERR(x...) printk(KERN_INFO x) -#else -#define DBGERR(x...) -#endif - -#define EXTPAND_GPIO_GET_BIT(a,num) (((a)>>(num))&0x01) -#define EXTPAND_GPIO_SET_BIT(a,num) ((a)|(0x01<<(num))) -#define EXTPAND_GPIO_CLEAR_BIT(a,num) ((a)&(~(0x01<<(num)))) -#define MIN(x,y) (((x)<(y))?(x):(y)) - - -int expand_gpio_irq_en = -1; -int expand_gpio_irq_ctrflag = -1; -unsigned int expand_gpio_irq_num = 0; - -struct workqueue_struct *irqworkqueue; -extern struct lock_class_key gpio_lock_class; -struct expand_gpio_soft_int expand_irq_data; - -void expand_gpio_irq_ctr_dis(int irq,int ctrflag) -{ - expand_gpio_irq_ctrflag=0; - if(expand_gpio_irq_en) - { - expand_gpio_irq_en=0; - disable_irq_nosync(irq); - DBG("***********%s %d***********\n",__FUNCTION__,__LINE__); - } - if(ctrflag) - { - expand_gpio_irq_ctrflag=-1; - } -} - -void expand_gpio_irq_ctr_en(int irq) -{ - if(!expand_gpio_irq_en) - { - DBG("***********%s %d***********\n",__FUNCTION__,__LINE__); - expand_gpio_irq_en = -1; - enable_irq(irq); - } -} - -static int expand_checkrange(int start,int num,int val) -{ - - if((val<(start+num))&&(val>=start)) - { - return 0; - } - else - { - return -1; - } - -} - -static void expand_gpio_irq_enable(unsigned irq) -{ - struct irq_desc *desc = irq_to_desc(irq); - struct expand_gpio_soft_int *pchip=(struct expand_gpio_soft_int *)desc->chip_data; - uint8_t gpioPortNum; - uint8_t gpioPortPinNum; - uint8_t expandpinnum; - - if(!expand_checkrange(pchip->gpio_irq_start,pchip->irq_pin_num,irq)) - { - expandpinnum = irq - pchip->gpio_irq_start;//irq_to_gpio(irq) - } - else - { - return; - } - gpioPortNum = expandpinnum/(pchip->expand_port_pinnum); - gpioPortPinNum= expandpinnum%(pchip->expand_port_pinnum); - - if((gpioPortNum>=(pchip->expand_port_group))||(gpioPortPinNum>=(pchip->expand_port_pinnum))) - return; - //DBG("**%s**\n",__FUNCTION__); - pchip->interrupt_en[gpioPortNum]=EXTPAND_GPIO_SET_BIT(pchip->interrupt_en[gpioPortNum],gpioPortPinNum); -} -static void expand_gpio_irq_disable(unsigned irq) -{ - struct irq_desc *desc = irq_to_desc(irq); - struct expand_gpio_soft_int *pchip=(struct expand_gpio_soft_int *)desc->chip_data; - uint8_t gpioPortNum; - uint8_t gpioPortPinNum; - uint8_t expandpinnum; - - if(!expand_checkrange(pchip->gpio_irq_start,pchip->irq_pin_num,irq)) - { - expandpinnum=irq - pchip->gpio_irq_start;//irq_to_gpio(irq) - } - else - { - return; - } - gpioPortNum = expandpinnum/(pchip->expand_port_pinnum); - gpioPortPinNum= expandpinnum%(pchip->expand_port_pinnum); - - if((gpioPortNum>=(pchip->expand_port_group))||(gpioPortPinNum>=(pchip->expand_port_pinnum))) - return; - //DBG("**%s**\n",__FUNCTION__); - pchip->interrupt_en[gpioPortNum]=EXTPAND_GPIO_CLEAR_BIT(pchip->interrupt_en[gpioPortNum],gpioPortPinNum); - -} - -static void expand_gpio_irq_mask(unsigned irq) -{ - struct irq_desc *desc = irq_to_desc(irq); - struct expand_gpio_soft_int *pchip=(struct expand_gpio_soft_int *)desc->chip_data; - uint8_t gpioPortNum; - uint8_t gpioPortPinNum; - uint8_t expandpinnum; - - if(!expand_checkrange(pchip->gpio_irq_start,pchip->irq_pin_num,irq)) - { - expandpinnum=irq-pchip->gpio_irq_start;//irq_to_gpio(irq) - } - else - { - return; - } - gpioPortNum = expandpinnum/(pchip->expand_port_pinnum); - gpioPortPinNum= expandpinnum%(pchip->expand_port_pinnum); - if((gpioPortNum>=(pchip->expand_port_group))||(gpioPortPinNum>=(pchip->expand_port_pinnum))) - return; - //DBG("**%s**\n",__FUNCTION__); - pchip->interrupt_mask[gpioPortNum]=EXTPAND_GPIO_SET_BIT(pchip->interrupt_mask[gpioPortNum],gpioPortPinNum); -} - -static void expand_gpio_irq_unmask(unsigned irq) -{ - struct irq_desc *desc = irq_to_desc(irq); - struct expand_gpio_soft_int *pchip=(struct expand_gpio_soft_int *)desc->chip_data; - uint8_t gpioPortNum; - uint8_t gpioPortPinNum; - uint8_t expandpinnum; - - if(!expand_checkrange(pchip->gpio_irq_start,pchip->irq_pin_num,irq)) - { - expandpinnum=irq-pchip->gpio_irq_start;//irq_to_gpio(irq) - } - else - { - return; - } - gpioPortNum = expandpinnum/(pchip->expand_port_pinnum); - gpioPortPinNum= expandpinnum%(pchip->expand_port_pinnum); - if((gpioPortNum>=(pchip->expand_port_group))||(gpioPortPinNum>=(pchip->expand_port_pinnum))) - return; - //DBG("**%s**\n",__FUNCTION__); - pchip->interrupt_mask[gpioPortNum]=EXTPAND_GPIO_CLEAR_BIT(pchip->interrupt_mask[gpioPortNum],gpioPortPinNum); -} - -static int expand_gpio_irq_type(unsigned int irq, unsigned int type) -{ - struct irq_desc *desc_irq=irq_to_desc(irq); - struct expand_gpio_soft_int *pchip=(struct expand_gpio_soft_int *)desc_irq->chip_data; - uint8_t gpioPortNum; - uint8_t gpioPortPinNum; - uint8_t expandpinnum; - if(!expand_checkrange(pchip->gpio_irq_start,pchip->irq_pin_num,irq)) - { - expandpinnum = irq - pchip->gpio_irq_start;//irq_to_gpio(irq) - } - else - { - return -1; - } - - gpioPortNum = expandpinnum/(pchip->expand_port_pinnum); - gpioPortPinNum= expandpinnum%(pchip->expand_port_pinnum); - if((gpioPortNum>=(pchip->expand_port_group))||(gpioPortPinNum>=(pchip->expand_port_pinnum))) - return -1; - DBG("**%s %d PortNum=%d,PortPinNum=%d**\n",__FUNCTION__,__LINE__,gpioPortNum,gpioPortPinNum); - switch (type) { - case IRQ_TYPE_NONE: - pchip->inttype_set[gpioPortNum]=EXTPAND_GPIO_CLEAR_BIT(pchip->inttype_set[gpioPortNum],gpioPortPinNum); - DBG("**%s IRQ_TYPE_NONE**\n",__FUNCTION__); - break; - case IRQ_TYPE_EDGE_RISING: - pchip->inttype_set[gpioPortNum]=EXTPAND_GPIO_SET_BIT(pchip->inttype_set[gpioPortNum],gpioPortPinNum); - pchip->inttype[gpioPortNum]=EXTPAND_GPIO_SET_BIT(pchip->inttype[gpioPortNum],gpioPortPinNum); - pchip->inttype1[gpioPortNum]=EXTPAND_GPIO_CLEAR_BIT(pchip->inttype1[gpioPortNum],gpioPortPinNum); - DBG("**%s IRQ_TYPE_EDGE_RISING,inttype=%x,inttype1=%x**\n",__FUNCTION__,pchip->inttype[gpioPortNum],pchip->inttype1[gpioPortNum]); - break; - case IRQ_TYPE_EDGE_FALLING: - pchip->inttype_set[gpioPortNum]=EXTPAND_GPIO_SET_BIT(pchip->inttype_set[gpioPortNum],gpioPortPinNum); - pchip->inttype[gpioPortNum]=EXTPAND_GPIO_CLEAR_BIT(pchip->inttype[gpioPortNum],gpioPortPinNum); - pchip->inttype1[gpioPortNum]=EXTPAND_GPIO_CLEAR_BIT(pchip->inttype1[gpioPortNum],gpioPortPinNum); - DBG("**%s IRQ_TYPE_EDGE_RISING,inttype=%x,inttype1=%x**\n",__FUNCTION__,pchip->inttype[gpioPortNum],pchip->inttype1[gpioPortNum]); - break; - case IRQ_TYPE_EDGE_BOTH: - pchip->inttype_set[gpioPortNum]=EXTPAND_GPIO_SET_BIT(pchip->inttype_set[gpioPortNum],gpioPortPinNum); - pchip->inttype1[gpioPortNum]=EXTPAND_GPIO_SET_BIT(pchip->inttype1[gpioPortNum],gpioPortPinNum); - DBG("**%s IRQ_TYPE_EDGE_RISING,inttype=%x,inttype1=%x**\n",__FUNCTION__,pchip->inttype[gpioPortNum],pchip->inttype1[gpioPortNum]); - break; - case IRQ_TYPE_LEVEL_HIGH: - pchip->inttype_set[gpioPortNum]=EXTPAND_GPIO_CLEAR_BIT(pchip->inttype_set[gpioPortNum],gpioPortPinNum); - DBG("extern gpios does not support IRQ_TYPE_LEVEL_HIGH irq typ"); - break; - case IRQ_TYPE_LEVEL_LOW: - pchip->inttype_set[gpioPortNum]=EXTPAND_GPIO_CLEAR_BIT(pchip->inttype_set[gpioPortNum],gpioPortPinNum); - DBG("extern gpios does not support IRQ_TYPE_LEVEL_LOW irq typ"); - break; - default: - return -EINVAL; - } - return 0; -} - -static int expand_gpio_irq_set_wake(unsigned irq, unsigned state) -{ - //no irq wake - return 0; -} -static struct irq_chip expand_gpio_irqchip = { - .name = "expand_gpio_expand ", - .enable = expand_gpio_irq_enable, - .disable = expand_gpio_irq_disable, - .mask = expand_gpio_irq_mask, - .unmask = expand_gpio_irq_unmask, - .set_type = expand_gpio_irq_type, - .set_wake = expand_gpio_irq_set_wake, -}; - -static irqreturn_t expand_gpio_irq_handler(int irq, void * dev_id) -{ - struct irq_desc *gpio_irq_desc = irq_to_desc(irq); - struct expand_gpio_soft_int *pchip=(struct expand_gpio_soft_int *)gpio_irq_desc->chip_data; - u8 oldintputreg[MAX_SUPPORT_PORT_GROUP]={0,0,0,0,0}; - u8 tempintputreg[MAX_SUPPORT_PORT_GROUP]={0,0,0,0,0}; - u8 tempallowint=0; - u8 levelchg=0; - u8 intbit[MAX_SUPPORT_PORT_GROUP]={0,0,0,0,0}; - u8 tempinttype=0; - u8 int_en_flag=0; - int i,j; - - DBG("******************%s*******************\n",__FUNCTION__); - expand_gpio_irq_ctr_dis(pchip->irq_chain,0); - memcpy(&oldintputreg[0],&pchip->gvar->reg_input[0],pchip->expand_port_pinnum); - if(pchip->irq_data.read_allinputreg(pchip->irq_data.data,&tempintputreg[0])) - { - expand_gpio_irq_ctr_dis(pchip->irq_chain,-1); - DBG("**%s[%d] reading reg is error\n",__FUNCTION__,__LINE__); - queue_work(irqworkqueue,&pchip->irq_work); - return IRQ_HANDLED; - } - - memcpy(&pchip->gvar->reg_input[0],&tempintputreg[0],pchip->expand_port_pinnum); - //DBG("**has run at %s**,input[0] = %x,input[1] = %x,input[2] = %x\n",__FUNCTION__,pchip->gvar.reg_input[0],pchip->gvar.reg_input[1],pchip->gvar.reg_input[2]); - - //Handle for different expand_port_group - for(i=0,int_en_flag=0;iexpand_port_group,MAX_SUPPORT_PORT_GROUP);i++) - { - int_en_flag|=pchip->interrupt_en[i]; - } - - if(!int_en_flag) - { - if(expand_gpio_irq_num<0xFFFFFFFF) - { - expand_gpio_irq_num++; - } - else - { - expand_gpio_irq_num=0; - } - DBGERR("there are no pin reg irq\n"); - expand_gpio_irq_ctr_en(pchip->irq_chain); - return IRQ_HANDLED; - } - - for(i=0;iexpand_port_group;i++) - { - tempallowint=pchip->interrupt_en[i]&pchip->gvar->reg_direction[i]&(~pchip->interrupt_mask[i]);// Âú×ãÖжÏÌõ¼þ - levelchg=oldintputreg[i]^tempintputreg[i];// ÕÒ³öǰºó״̬²»Ò»ÑùµÄpin - tempinttype=~(tempintputreg[i]^pchip->inttype[i]);// ÕÒ³ö´¥·¢×´Ì¬ºÍµ±Ç°pin״̬һÑùµÄpin£¬×¢ÒâÖ»Ö§³Ölow highÁ½ÖÖpin´¥·¢ - - tempinttype=(~pchip->inttype1[i])&tempinttype;// inttype1 ÎªÕæµÄλ¶ÔÓ¦µÄtempinttypeλÇåÁ㣬ÒòΪ¸ÃλֻÊÜinttype1¿ØÖÆ - tempinttype|=pchip->inttype1[i];//µçƽֻҪÊDZ仯¾Í²úÉúÖÐ¶Ï - tempinttype&=pchip->inttype_set[i];//ÒѾ­ÉèÖÃÁËtypeÀàÐÍ - - intbit[i]=tempallowint&levelchg&tempinttype; - //DBG(" tempallowint=%x,levelchg=%x,tempinttype=%x,intbit=%d\n",tempallowint,levelchg,tempinttype,intbit[i]); - } - if(expand_gpio_irq_num<0xFFFFFFFF) - { - expand_gpio_irq_num++; - } - else - { - expand_gpio_irq_num=0; - } - for(i=0;iexpand_port_group;i++) - { - if(intbit[i]) - { - for(j=0;jexpand_port_pinnum;j++) - { - if(EXTPAND_GPIO_GET_BIT(intbit[i],j)) - { - irq=pchip->gpio_irq_start+pchip->expand_port_pinnum*i+j; - gpio_irq_desc = irq_to_desc(irq); - gpio_irq_desc->chip->mask(irq); - generic_handle_irq(irq); - gpio_irq_desc->chip->unmask(irq); - //DBG("expand_i2c_irq_handler port=%d,pin=%d,pinlevel=%d\n",i,j,EXTPAND_GPIO_GET_BIT(tempintputreg[i],j)); - } - } - } - } - expand_gpio_irq_ctr_en(pchip->irq_chain); - return IRQ_HANDLED; -} - -static void irq_call_back_handler(struct work_struct *work) -{ - struct expand_gpio_soft_int *pchip = container_of(work, struct expand_gpio_soft_int,irq_work); - //printk("irq_call_back_handle\n"); - expand_gpio_irq_handler(pchip->irq_chain,NULL); -} - -void expand_gpio_irq_setup(struct expand_gpio_soft_int *pchip) -{ - unsigned int pioc, irq_num; - int ret; - struct irq_desc *desc; - irq_num = pchip->gpio_irq_start; //ÖжϺţ¬À©Õ¹ioµÄÖжϺÅÓ¦¸Ã½ô¸úÔÚÄÚ²¿ioÖжϺŵĺóÃæ¡£ÈçrkÄÚ²¿ÖжÏ48¸ö£¬¼ÓÉÏÄÚ²¿gpio 16¸öÐéÄâÖжϣ¬ÕâÀïpinÓ¦¸Ã´Ó48+16¿ªÊ¼ - - DBG("**%s**\n",__FUNCTION__); - for (pioc = 0; pioc < pchip->irq_pin_num; pioc++,irq_num++) - { - lockdep_set_class(&irq_desc[irq_num].lock, &gpio_lock_class); - /* - * Can use the "simple" and not "edge" handler since it's - * shorter, and the AIC handles interrupts sanely. - */ - set_irq_chip(irq_num, &expand_gpio_irqchip); - set_irq_handler(irq_num, handle_simple_irq); - set_irq_chip_data(irq_num,(void *)pchip); - desc = irq_to_desc(irq_num); - DBG("**%s line=%d,irq_num=%d**\n",__FUNCTION__,__LINE__,irq_num); - set_irq_flags(irq_num, IRQF_VALID); - } - ret = gpio_request(pchip->irq_gpiopin,NULL); - if(ret!=0) - { - gpio_free(pchip->irq_gpiopin); - DBG("expand_gpio_irq_setup request gpio is err\n"); - } - gpio_pull_updown(pchip->irq_gpiopin, pchip->rk_irq_gpio_pull_up_down); //gpio ÐèÒªÀ­¸ßirq_to_gpio(pchip->irq_chain) - irqworkqueue=create_rt_workqueue("irq workqueue"); - INIT_WORK(&pchip->irq_work,irq_call_back_handler); - set_irq_chip_data(pchip->irq_chain, pchip); - if(request_irq(pchip->irq_chain,expand_gpio_irq_handler,pchip->rk_irq_mode, "expand", pchip)!=0) - { - DBG("**%s line=%d is err**\n",__FUNCTION__,__LINE__); - } -} - -int wait_untill_input_reg_flash(void) -{ - unsigned int num = 0; - unsigned int tempnum = expand_gpio_irq_num; - - while(expand_gpio_irq_ctrflag&&(expand_gpio_irq_num==tempnum)) - { - mdelay(1); - num++; - if(num>5) - return -1; - } - return 0; -} - -void expand_irq_init(void *data,struct expand_gpio_global_variable *var,irq_read_inputreg handler) -{ - expand_irq_data.irq_data.data = data; - expand_irq_data.irq_data.read_allinputreg = handler; - expand_irq_data.gvar = var; - expand_gpio_irq_setup(&expand_irq_data); -} - - - - - - - diff --git a/drivers/gpio/soft_interrupt.h b/drivers/gpio/soft_interrupt.h deleted file mode 100755 index f04f6885b610..000000000000 --- a/drivers/gpio/soft_interrupt.h +++ /dev/null @@ -1,47 +0,0 @@ -#ifndef _SOFT_INTERRUPT_H -#define _SOFT_INTERRUPT_H - -#define MAX_SUPPORT_PORT_GROUP 5 - -typedef int (*irq_read_inputreg)(void *,char *); -struct expand_gpio_irq_data -{ - void *data; - irq_read_inputreg read_allinputreg; -}; - -struct expand_gpio_global_variable -{ - uint8_t reg_input[MAX_SUPPORT_PORT_GROUP]; - uint8_t reg_output[MAX_SUPPORT_PORT_GROUP]; - uint8_t reg_direction[MAX_SUPPORT_PORT_GROUP]; -}; -struct expand_gpio_soft_int -{ - unsigned int gpio_irq_start; - unsigned int irq_pin_num; //ÖжϵĸöÊý - unsigned int irq_gpiopin; //¸¸ÖжϵÄÖÐ¶Ï ½Å - unsigned int irq_chain; //¸¸ÖжϵÄÖжϺŠ- - unsigned int expand_port_group; - unsigned int expand_port_pinnum; - unsigned int rk_irq_mode; - unsigned int rk_irq_gpio_pull_up_down; - - uint8_t interrupt_en[MAX_SUPPORT_PORT_GROUP]; // 0 dis - uint8_t interrupt_mask[MAX_SUPPORT_PORT_GROUP]; // 0 unmask - uint8_t inttype_set[MAX_SUPPORT_PORT_GROUP]; // Inttype enable - uint8_t inttype[MAX_SUPPORT_PORT_GROUP]; - uint8_t inttype1[MAX_SUPPORT_PORT_GROUP]; - - struct expand_gpio_irq_data irq_data; - struct work_struct irq_work; - struct expand_gpio_global_variable *gvar; -}; - -extern struct expand_gpio_soft_int expand_irq_data; -extern int wait_untill_input_reg_flash(void); -extern void expand_irq_init(void *data,struct expand_gpio_global_variable *var,irq_read_inputreg handler); - -#endif - diff --git a/drivers/gpio/tca6424.c b/drivers/gpio/tca6424.c index 4969a49bdf0c..e3edd35f1f3b 100755 --- a/drivers/gpio/tca6424.c +++ b/drivers/gpio/tca6424.c @@ -43,7 +43,7 @@ NOTES : #include #include #include -#include "../drivers/gpio/soft_interrupt.h" +#include "../drivers/gpio/expand_gpio_soft_interrupt.h" #if 0 #define TCA6424DEB @@ -293,7 +293,7 @@ static int tca6424_gpio_get_value(struct gpio_chip *gc, unsigned pin_num) chip = container_of(gc, struct tca6424_chip, gpio_chip); - #ifdef CONFIG_SOFT_INTERRUPT + #ifdef CONFIG_EXPAND_GPIO_SOFT_INTERRUPT ret = wait_untill_input_reg_flash( ); if(ret<0) return -1; @@ -306,7 +306,7 @@ static int tca6424_gpio_get_value(struct gpio_chip *gc, unsigned pin_num) if((gpioPortNum>=TCA6424_PortNum)||(gpioPortPinNum>=portnum[gpioPortNum])) return -1; - #ifndef CONFIG_SOFT_INTERRUPT + #ifndef CONFIG_EXPAND_GPIO_SOFT_INTERRUPT uint8_t reg_val; ret = tca6424_read_reg(chip->client, Regaddr, ®_val); if (ret < 0) @@ -514,7 +514,7 @@ static int __devinit tca6424_probe(struct i2c_client *client,const struct i2c_de chip->client = client; chip->names = pdata->names; - #ifdef CONFIG_SOFT_INTERRUPT + #ifdef CONFIG_EXPAND_GPIO_SOFT_INTERRUPT chip->expand = &expand_irq_data; chip->expand->gpio_irq_start =pdata->gpio_irq_start; chip->expand->irq_pin_num = pdata->irq_pin_num; @@ -543,7 +543,7 @@ static int __devinit tca6424_probe(struct i2c_client *client,const struct i2c_de } i2c_set_clientdata(client, chip); - #ifdef CONFIG_SOFT_INTERRUPT + #ifdef CONFIG_EXPAND_GPIO_SOFT_INTERRUPT expand_irq_init(chip,&chip->gtca6424_struct,tca6424_irq_read_inputreg); #endif return 0;