1 /* arch/arm/mach-rk2818/example.c
3 * Copyright (C) 2010 ROCKCHIP, Inc.
5 * This software is licensed under the terms of the GNU General Public
6 * License version 2, as published by the Free Software Foundation, and
7 * may be copied, distributed, and modified under those terms.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
15 /*******************************************************************/
16 /* COPYRIGHT (C) ROCK-CHIPS FUZHOU . ALL RIGHTS RESERVED. */
17 /*******************************************************************
19 DESC : À©Õ¹GPIO µÄÇý¶¯Ïà¹Ø³ÌÐò
25 ********************************************************************/
26 #include <linux/clk.h>
27 #include <linux/errno.h>
28 #include <linux/interrupt.h>
29 #include <asm/mach-types.h>
30 #include <linux/irq.h>
31 #include <linux/debugfs.h>
32 #include <linux/seq_file.h>
33 #include <linux/kernel.h>
34 #include <linux/list.h>
35 #include <linux/module.h>
37 #include <mach/hardware.h>
38 #include <mach/gpio.h>
39 #include <mach/rk2818_iomap.h>
40 #include <mach/iomux.h>
41 #include <linux/device.h>
42 #include <mach/gpio.h>
44 #include <linux/i2c.h>
45 #include <linux/workqueue.h>
46 #include <mach/board.h>
47 #define PCA9554_GPIO_IRQNum 8
48 #define PCA9554_PortNum 1
49 #define PCA9554_PortPinNum 8
50 #define PCA9554_TotalPortPinNum (PCA9554_PortNum*PCA9554_PortPinNum)
52 #define PCA9554_InputLevel_Reg 0x0 //r only
53 #define PCA9554_OutputLevel_Reg 0x1 // r/w default ffff
54 #define PCA9554_Invert_Reg 0x2 // r/w default 0
55 #define PCA9554_Config_Reg 0x3 // r/w default ffff
57 //#define PCA9554_INPUT_REG_IRQ_PIN RK2818_PIN_PE2
59 #define PCA9554_OUTREGLOCK
60 #define PCA9554_INPUTREGLOCK
61 #define PCA9554_CONFIGREGLOCK
64 /* the first extern gpio number in all of gpio groups */
66 unsigned gpio_pin_num;
67 /* the first gpio irq number in all of irq source */
69 unsigned gpio_irq_start;
70 unsigned irq_pin_num; //ÖжϵĸöÊý
71 unsigned irq_gpiopin; //¸¸ÖжϵÄÖжϺÅ
72 unsigned irq_chain; //¸¸ÖжϵÄÖжϺÅ
73 uint8_t reg_input[PCA9554_PortNum];
74 uint8_t reg_output[PCA9554_PortNum];
75 uint8_t reg_direction[PCA9554_PortNum];
76 uint8_t interrupt_en[PCA9554_PortNum];// 0 dis
77 uint8_t interrupt_mask[PCA9554_PortNum];// 0 unmask
78 uint8_t inttype_set[PCA9554_PortNum]; // Inttype enable
79 uint8_t inttype[PCA9554_PortNum]; //
80 uint8_t inttype1[PCA9554_PortNum];
83 #ifdef PCA9554_OUTREGLOCK
84 struct mutex outreglock;
86 #ifdef PCA9554_INPUTREGLOCK
87 struct mutex inputreglock;
89 #ifdef PCA9554_CONFIGREGLOCK
90 struct mutex configreglock;
93 struct i2c_client *client;
94 struct pca9554_platform_data *dyn_pdata;
95 struct work_struct pca9554_work;
97 struct gpio_chip gpio_chip;
104 #define DBG(x...) printk(KERN_INFO x)
110 #define DBGERR(x...) printk(KERN_INFO x)
116 struct i2c_client *pca9554_client;
117 #define pca9554getbit(a,num) (((a)>>(num))&0x01)
118 #define pca9554setbit(a,num) ((a)|(0x01<<(num)))
119 #define pca9554clearbit(a,num) ((a)&(~(0x01<<(num))))
121 static short int portnum[PCA9554_PortNum]={PCA9554_PortPinNum};
122 extern inline struct gpio_chip *gpio_to_chip(unsigned gpio);
123 extern struct lock_class_key gpio_lock_class;
124 extern struct lock_class_key gpio_lock_class;
125 struct workqueue_struct *pca9554workqueue;
127 static const struct i2c_device_id pca9554_id[] =
129 { "extend_gpio_pca9554", 8, },
133 MODULE_DEVICE_TABLE(i2c, pca9554_id);
136 static int pca9554_write_reg(struct i2c_client *client, uint8_t reg, uint8_t val)
140 struct i2c_adapter *adap;
145 adap = client->adapter;
149 msg.addr = client->addr;
150 msg.buf = &tx_buf[0];
152 msg.flags = client->flags;
153 msg.scl_rate = 200*1000;
155 ret = i2c_transfer(adap, &msg, 1);
159 static int pca9554_read_reg(struct i2c_client *client, uint8_t reg, uint8_t *val)
163 struct i2c_adapter *adap;
164 struct i2c_msg msgs[2];
167 adap = client->adapter;
169 msgs[0].addr = client->addr;
171 msgs[0].flags = client->flags;
173 msgs[0].scl_rate = 200*1000;
176 msgs[1].addr = client->addr;
177 msgs[1].flags = client->flags | I2C_M_RD;
179 msgs[1].scl_rate = 200*1000;
181 ret = i2c_transfer(adap, msgs, 2);
182 //DBG("**has run at %s %d ret=%d**\n",__FUNCTION__,__LINE__,ret);
187 static int pca9554_gpio_direction_input(struct gpio_chip *gc, unsigned off)
189 struct pca9554_chip *chip;
192 uint8_t gpioPortPinNum;
195 DBG("**run in the %s**\n",__FUNCTION__);
196 chip = container_of(gc, struct pca9554_chip, gpio_chip);
199 gpioPortPinNum= off%8;
200 if((gpioPortNum>=PCA9554_PortNum)||(gpioPortPinNum>=portnum[gpioPortNum]))
203 #ifdef PCA9554_CONFIGREGLOCK
204 if (!mutex_trylock(&chip->configreglock))
206 DBGERR("**%s[%d]Did not get the configreglock**\n",__FUNCTION__,__LINE__);
211 reg_val = pca9554setbit(chip->reg_direction[gpioPortNum], gpioPortPinNum);
212 ret = pca9554_write_reg(chip->client, PCA9554_Config_Reg, reg_val);
216 chip->reg_direction[gpioPortNum] = reg_val;
219 DBG("**%s[%d],reg_val=%x,ret=%d**\n",__FUNCTION__,__LINE__,reg_val,ret);
221 #ifdef PCA9554_CONFIGREGLOCK
222 mutex_unlock(&chip->configreglock);
228 static int pca9554_gpio_direction_output(struct gpio_chip *gc,unsigned off, int val)
230 struct pca9554_chip *chip;
232 uint8_t gpioPortPinNum;
235 DBG("**run in the %s**\n",__FUNCTION__);
237 chip = container_of(gc, struct pca9554_chip, gpio_chip);
240 gpioPortPinNum= off%8;
241 if((gpioPortNum>=PCA9554_PortNum)||(gpioPortPinNum>=portnum[gpioPortNum]))
244 #ifdef PCA9554_CONFIGREGLOCK
245 if (!mutex_trylock(&chip->configreglock))
247 DBGERR("**%s[%d]Did not get the configreglock**\n",__FUNCTION__,__LINE__);
252 reg_val = pca9554clearbit(chip->reg_direction[gpioPortNum], gpioPortPinNum);
253 ret = pca9554_write_reg(chip->client, PCA9554_Config_Reg, reg_val);
256 #ifdef PCA9554_CONFIGREGLOCK
257 mutex_unlock(&chip->configreglock);
259 DBGERR("**%s[%d] set direction reg is error,reg_val=%x,ret=%d**\n",__FUNCTION__,__LINE__,reg_val,ret);
262 chip->reg_direction[gpioPortNum] = reg_val;
263 #ifdef PCA9554_CONFIGREGLOCK
264 mutex_unlock(&chip->configreglock);
267 #ifdef PCA9554_OUTREGLOCK
268 if (!mutex_trylock(&chip->outreglock))
270 DBGERR("**%s[%d] Did not get the outreglock**\n",__FUNCTION__,__LINE__);
274 /* set output level */
276 reg_val = pca9554setbit(chip->reg_output[gpioPortNum], gpioPortPinNum);
278 reg_val = pca9554clearbit(chip->reg_output[gpioPortNum], gpioPortPinNum);
280 ret = pca9554_write_reg(chip->client, PCA9554_OutputLevel_Reg, reg_val);
283 #ifdef PCA9554_OUTREGLOCK
284 mutex_unlock(&chip->outreglock);
286 DBGERR("**%s[%d] set out reg is error,reg_val=%x,ret=%d**\n",__FUNCTION__,__LINE__,reg_val,ret);
289 chip->reg_output[gpioPortNum] = reg_val;
291 #ifdef PCA9554_OUTREGLOCK
292 mutex_unlock(&chip->outreglock);
297 static int pca9554_gpio_get_value(struct gpio_chip *gc, unsigned off)
299 struct pca9554_chip *chip;
301 uint8_t gpioPortPinNum;
304 DBG("**run in the %s**\n",__FUNCTION__);
306 chip = container_of(gc, struct pca9554_chip, gpio_chip);
308 gpioPortPinNum= off%8;
310 if((gpioPortNum>=PCA9554_PortNum)||(gpioPortPinNum>=portnum[gpioPortNum]))
313 if(!pca9554getbit(chip->reg_direction[gpioPortNum],gpioPortPinNum)) //ÅжϸÃpinÊÇ·ñÉèÖóÉinput
315 #ifdef PCA9554_INPUTREGLOCK
316 if (!mutex_trylock(&chip->inputreglock))
318 DBGERR("**%s[%d]Did not get the inputreglock**\n",__FUNCTION__,__LINE__);
323 ret = pca9554_read_reg(chip->client, PCA9554_InputLevel_Reg, ®_val);
326 chip->reg_input[gpioPortNum] = reg_val;
328 #ifdef PCA9554_CONFIGREGLOCK
329 mutex_unlock(&chip->inputreglock);
331 DBGERR("**%s[%d]reg_val=%x,ret=%d**\n",__FUNCTION__,__LINE__,reg_val,ret);
333 return (ret < 0)?-1:((chip->reg_input[gpioPortNum] >> gpioPortPinNum) & 0x01);
336 static void pca9554_gpio_set_value(struct gpio_chip *gc, unsigned off, int val)
338 struct pca9554_chip *chip;
340 uint8_t gpioPortPinNum;
343 DBG("**run in the %s**\n",__FUNCTION__);
345 chip = container_of(gc, struct pca9554_chip, gpio_chip);
348 gpioPortPinNum= off%8;
350 if((gpioPortNum>=PCA9554_PortNum)||(gpioPortPinNum>=portnum[gpioPortNum]))
353 if(pca9554getbit(chip->reg_direction[gpioPortNum],gpioPortPinNum)) // input state
356 #ifdef PCA9554_OUTREGLOCK
357 if (!mutex_trylock(&chip->outreglock))
359 DBGERR("**%s[%d] Did not get the outreglock**\n",__FUNCTION__,__LINE__);
364 reg_val = pca9554setbit(chip->reg_output[gpioPortNum], gpioPortPinNum);
366 reg_val = pca9554clearbit(chip->reg_output[gpioPortNum], gpioPortPinNum);
368 ret = pca9554_write_reg(chip->client, PCA9554_OutputLevel_Reg, reg_val);
371 chip->reg_output[gpioPortNum] = reg_val;
373 #ifdef PCA9554_OUTREGLOCK
374 mutex_unlock(&chip->outreglock);
377 DBG("**%s[%d],reg_val=%x,ret=%d**\n",__FUNCTION__,__LINE__,reg_val,ret);
379 return;// (ret<0)?-1:0;
382 static int pca9554_gpio_to_irq(struct gpio_chip *chip,unsigned offset)
384 struct pca9554_chip *pca_chip = container_of(chip, struct pca9554_chip, gpio_chip);
385 if(((pca_chip->gpio_start+offset)>=chip->base)&&((pca_chip->gpio_start+offset)<(chip->base+chip->ngpio)))
387 //DBG("**%s,offset=%d,gpio_irq_start=%d,base=%d,ngpio=%d,gpio_irq_start=%d**\n",
388 // __FUNCTION__,offset,pca_chip->gpio_irq_start,chip->base,chip->ngpio,pca_chip->gpio_irq_start);
389 return (offset+pca_chip->gpio_irq_start);
394 static void pca9554_setup_gpio(struct pca9554_chip *chip, int gpios)
396 struct gpio_chip *gc;
398 gc = &chip->gpio_chip;
400 gc->direction_input = pca9554_gpio_direction_input;
401 gc->direction_output = pca9554_gpio_direction_output;
402 gc->get = pca9554_gpio_get_value;
403 gc->set = pca9554_gpio_set_value;
404 gc->to_irq =pca9554_gpio_to_irq;
408 gc->base = chip->gpio_start;
409 gc->ngpio = chip->gpio_pin_num;
410 gc->label = chip->client->name;
411 gc->dev = &chip->client->dev;
412 gc->owner = THIS_MODULE;
413 gc->names = chip->names;
416 int pca9554_checkrange(int start,int num,int val)
419 if((val<(start+num))&&(val>=start))
424 static void pca9554_gpio_irq_enable(unsigned irq)
426 struct irq_desc *desc = irq_to_desc(irq);
428 struct pca9554_chip *pchip=(struct pca9554_chip *)desc->chip_data;
429 //struct gpio_chip *chip_gpio;
433 uint8_t gpioPortPinNum;
434 uint8_t pca9554pinnum;
437 if(!pca9554_checkrange(pchip->gpio_irq_start,pchip->irq_pin_num,irq))
439 pca9554pinnum=irq-pchip->gpio_irq_start;
442 gpioPortNum = pca9554pinnum/8;
443 gpioPortPinNum= pca9554pinnum%8;
444 gpio_num=pchip->gpio_start+pca9554pinnum;
445 if((gpioPortNum>=PCA9554_PortNum)||(gpioPortPinNum>=portnum[gpioPortNum]))
447 DBG("**%s**\n",__FUNCTION__);
448 pchip->interrupt_en[gpioPortNum]=pca9554setbit(pchip->interrupt_en[gpioPortNum],gpioPortPinNum);
450 static void pca9554_gpio_irq_disable(unsigned irq)
452 struct irq_desc *desc = irq_to_desc(irq);
453 struct pca9554_chip *pchip=(struct pca9554_chip *)desc->chip_data;
455 uint8_t gpioPortPinNum;
456 uint8_t pca9554pinnum;
459 if(!pca9554_checkrange(pchip->gpio_irq_start,pchip->irq_pin_num,irq))
461 pca9554pinnum=irq-pchip->gpio_irq_start;//irq_to_gpio(irq)
464 gpioPortNum = pca9554pinnum/8;
465 gpioPortPinNum= pca9554pinnum%8;
467 if((gpioPortNum>=PCA9554_PortNum)||(gpioPortPinNum>=portnum[gpioPortNum]))
469 DBG("**%s**\n",__FUNCTION__);
471 pchip->interrupt_en[gpioPortNum]=pca9554clearbit(pchip->interrupt_en[gpioPortNum],gpioPortPinNum);
476 static void pca9554_gpio_irq_mask(unsigned irq)
478 struct irq_desc *desc = irq_to_desc(irq);
479 struct pca9554_chip *pchip=(struct pca9554_chip *)desc->chip_data;
481 uint8_t gpioPortPinNum;
482 uint8_t pca9554pinnum;
485 if(!pca9554_checkrange(pchip->gpio_irq_start,pchip->irq_pin_num,irq))
487 pca9554pinnum=irq-pchip->gpio_irq_start;//irq_to_gpio(irq)
490 gpioPortNum = pca9554pinnum/8;
491 gpioPortPinNum= pca9554pinnum%8;
493 if((gpioPortNum>=PCA9554_PortNum)||(gpioPortPinNum>=portnum[gpioPortNum]))
496 DBG("**%s**\n",__FUNCTION__);
498 pchip->interrupt_mask[gpioPortNum]=pca9554setbit(pchip->interrupt_mask[gpioPortNum],gpioPortPinNum);
502 static void pca9554_gpio_irq_unmask(unsigned irq)
504 struct irq_desc *desc = irq_to_desc(irq);
505 //int gpiopinnum;//=irq_to_gpio(irq);
506 struct pca9554_chip *pchip=(struct pca9554_chip *)desc->chip_data;
508 uint8_t gpioPortPinNum;
509 uint8_t pca9554pinnum;
511 DBG("**%s**\n",__FUNCTION__);
513 if(!pca9554_checkrange(pchip->gpio_irq_start,pchip->irq_pin_num,irq))
515 pca9554pinnum=irq-pchip->gpio_irq_start;//irq_to_gpio(irq)
518 gpioPortNum = pca9554pinnum/8;
519 gpioPortPinNum= pca9554pinnum%8;
521 if((gpioPortNum>=PCA9554_PortNum)||(gpioPortPinNum>=portnum[gpioPortNum]))
525 pchip->interrupt_mask[gpioPortNum]=pca9554clearbit(pchip->interrupt_mask[gpioPortNum],gpioPortPinNum);
528 static int pca9554_gpio_irq_type(unsigned int irq, unsigned int type)
530 struct irq_desc *desc_irq=irq_to_desc(irq);
531 struct pca9554_chip *pchip=(struct pca9554_chip *)desc_irq->chip_data;
532 //struct gpio_chip *chip_gpio;
535 uint8_t gpioPortPinNum;
536 uint8_t pca9554pinnum;
537 if(!pca9554_checkrange(pchip->gpio_irq_start,pchip->irq_pin_num,irq))
539 pca9554pinnum=irq-pchip->gpio_irq_start;//irq_to_gpio(irq)
540 gpio_num=pchip->gpio_start+pca9554pinnum;
545 gpioPortNum = pca9554pinnum/8;
546 gpioPortPinNum= pca9554pinnum%8;
547 //DBG("**%s %d gpio_num=%d,PortNum=%d,PortPinNum=%d**\n",__FUNCTION__,__LINE__,gpio_num,gpioPortNum,gpioPortPinNum);
550 pchip->inttype_set[gpioPortNum]=pca9554clearbit(pchip->inttype_set[gpioPortNum],gpioPortPinNum);
551 DBG("**%s IRQ_TYPE_NONE**\n",__FUNCTION__);
553 case IRQ_TYPE_EDGE_RISING:
554 pchip->inttype_set[gpioPortNum]=pca9554setbit(pchip->inttype_set[gpioPortNum],gpioPortPinNum);
555 pchip->inttype[gpioPortNum]=pca9554setbit(pchip->inttype[gpioPortNum],gpioPortPinNum);
556 pchip->inttype1[gpioPortNum]=pca9554clearbit(pchip->inttype1[gpioPortNum],gpioPortPinNum);
557 DBG("**%s IRQ_TYPE_EDGE_RISING,inttype=%x,inttype1=%x**\n",__FUNCTION__,pchip->inttype[gpioPortNum],pchip->inttype1[gpioPortNum]);
560 case IRQ_TYPE_EDGE_FALLING:
561 pchip->inttype_set[gpioPortNum]=pca9554setbit(pchip->inttype_set[gpioPortNum],gpioPortPinNum);
562 pchip->inttype[gpioPortNum]=pca9554clearbit(pchip->inttype[gpioPortNum],gpioPortPinNum);
563 pchip->inttype1[gpioPortNum]=pca9554clearbit(pchip->inttype1[gpioPortNum],gpioPortPinNum);
564 DBG("**%s IRQ_TYPE_EDGE_RISING,inttype=%x,inttype1=%x**\n",__FUNCTION__,pchip->inttype[gpioPortNum],pchip->inttype1[gpioPortNum]);
567 case IRQ_TYPE_EDGE_BOTH:
568 pchip->inttype_set[gpioPortNum]=pca9554setbit(pchip->inttype_set[gpioPortNum],gpioPortPinNum);
569 pchip->inttype1[gpioPortNum]=pca9554setbit(pchip->inttype1[gpioPortNum],gpioPortPinNum);
570 DBG("**%s IRQ_TYPE_EDGE_RISING,inttype=%x,inttype1=%x**\n",__FUNCTION__,pchip->inttype[gpioPortNum],pchip->inttype1[gpioPortNum]);
572 case IRQ_TYPE_LEVEL_HIGH:
573 pchip->inttype_set[gpioPortNum]=pca9554clearbit(pchip->inttype_set[gpioPortNum],gpioPortPinNum);
574 DBG("extern gpios does not support IRQ_TYPE_LEVEL_HIGH irq typ");
576 case IRQ_TYPE_LEVEL_LOW:
577 pchip->inttype_set[gpioPortNum]=pca9554clearbit(pchip->inttype_set[gpioPortNum],gpioPortPinNum);
578 DBG("extern gpios does not support IRQ_TYPE_LEVEL_LOW irq typ");
586 static int pca9554_gpio_irq_set_wake(unsigned irq, unsigned state)
592 static struct irq_chip pca9554_gpio_irqchip = {
594 .enable = pca9554_gpio_irq_enable,
595 .disable = pca9554_gpio_irq_disable,
596 .mask = pca9554_gpio_irq_mask,
597 .unmask = pca9554_gpio_irq_unmask,
598 .set_type = pca9554_gpio_irq_type,
599 .set_wake = pca9554_gpio_irq_set_wake,
602 static void pca9554_extend_gpio_irq_handler(struct work_struct *work)
604 struct pca9554_chip *pchip=container_of(work, struct pca9554_chip,pca9554_work);
605 u8 tempintputreg[PCA9554_PortNum]={0};
611 struct irq_desc *gpio_irq_desc;
613 if(pca9554_read_reg(pchip->client,PCA9554_InputLevel_Reg,&tempintputreg[0])<0)
616 DBG("**%s[%d] reading reg is error\n",__FUNCTION__,__LINE__);
617 enable_irq(pchip->irq_chain);
621 DBG("**has run at %s,intputreg=%x**\n",__FUNCTION__,tempintputreg[0]);
622 if((pchip->interrupt_en[0]==0))
624 memcpy(&pchip->reg_input[0],&tempintputreg[0],sizeof(tempintputreg));
625 DBGERR("there are no pin reg irq\n");
626 enable_irq(pchip->irq_chain);
630 for(i=0;i<PCA9554_PortNum;i++)
632 tempallowint=pchip->interrupt_en[i]&pchip->reg_direction[i]&(~pchip->interrupt_mask[i]);// Âú×ãÖжÏÌõ¼þ
633 levelchg=pchip->reg_input[i]^tempintputreg[i];// ÕÒ³öÇ°ºó״̬²»Ò»ÑùµÄpin
634 tempinttype=~(tempintputreg[i]^pchip->inttype[i]);// ÕÒ³ö´¥·¢×´Ì¬ºÍµ±Ç°pin״̬һÑùµÄpin£¬×¢ÒâÖ»Ö§³Ölow highÁ½ÖÖpin´¥·¢
636 tempinttype=(~pchip->inttype1[i])&tempinttype;// inttype1 ΪÕæµÄλ¶ÔÓ¦µÄtempinttypeλÇåÁ㣬ÒòΪ¸ÃλֻÊÜinttype1¿ØÖÆ
637 tempinttype|=pchip->inttype1[i];//µçƽֻҪÊDZ仯¾Í²úÉúÖжÏ
638 tempinttype&=pchip->inttype_set[i];//ÒѾÉèÖÃÁËtypeÀàÐÍ
640 intbit=tempallowint&levelchg&tempinttype;
641 //DBG(" tempallowint=%x,levelchg=%x,tempinttype=%x,intbit=%d\n",tempallowint,levelchg,tempinttype,intbit);
644 for(j=0;j<portnum[i];j++)
646 if(pca9554getbit(intbit,j))
648 irq=pchip->gpio_irq_start+PCA9554_PortPinNum*i+j;
649 gpio_irq_desc = irq_to_desc(irq);
650 gpio_irq_desc->chip->mask(irq);
651 generic_handle_irq(irq);
652 gpio_irq_desc->chip->unmask(irq);
657 pchip->reg_input[i]=tempintputreg[i];
660 enable_irq(pchip->irq_chain);
664 static irqreturn_t pca9554_gpio_irq_handler(int irq, void * dev_id)
667 struct irq_desc *gpio_irq_desc = irq_to_desc(irq);
668 struct pca9554_chip *pchip=(struct pca9554_chip *)gpio_irq_desc->chip_data;
670 //DBG("**%s**\n",__FUNCTION__);
671 disable_irq_nosync(pchip->irq_chain);
672 queue_work(pca9554workqueue,&pchip->pca9554_work);
675 static void pca9554_gpio_irq_setup(struct pca9554_chip *pchip)
677 unsigned pioc, irq_num;
679 struct irq_desc *desc;
680 irq_num = pchip->gpio_irq_start; //ÖжϺţ¬À©Õ¹ioµÄÖжϺÅÓ¦¸Ã½ô¸úÔÚÄÚ²¿ioÖжϺŵĺóÃæ¡£ÈçrkÄÚ²¿ÖжÏ48¸ö£¬¼ÓÉÏÄÚ²¿gpio 16¸öÐéÄâÖжϣ¬ÕâÀïpinÓ¦¸Ã´Ó48+16¿ªÊ¼
682 for (pioc = 0; pioc < pchip->irq_pin_num; pioc++,irq_num++)
684 lockdep_set_class(&irq_desc[irq_num].lock, &gpio_lock_class);
686 * Can use the "simple" and not "edge" handler since it's
687 * shorter, and the AIC handles interrupts sanely.
689 set_irq_chip(irq_num, &pca9554_gpio_irqchip);
690 set_irq_handler(irq_num, handle_simple_irq);
691 set_irq_chip_data(irq_num,(void *)pchip);
692 desc = irq_to_desc(irq_num);
693 //DBG("**%s line=%d,desc=%x,chipdate=%x,pchip=%x,irq_num=%d**\n",__FUNCTION__,__LINE__,desc,desc->chip_data,pchip,irq_num);
695 set_irq_flags(irq_num, IRQF_VALID);
697 ret=gpio_request(pchip->irq_gpiopin,NULL);
700 gpio_free(pchip->irq_gpiopin);
701 DBG("pca9554_gpio_irq_setup request gpio is err\n");
704 gpio_pull_updown(pchip->irq_gpiopin, GPIOPullUp); //gpio ÐèÒªÀ¸ßirq_to_gpio(pchip->irq_chain)
708 set_irq_chip_data(pchip->irq_chain, pchip);
709 set_irq_chained_handler(pchip->irq_chain, gpio_irq_handlerxxx);
710 set_irq_type(pchip->irq_chain,IRQ_TYPE_LEVEL_LOW);
711 enable_irq(pchip->irq_chain);
714 pca9554workqueue=create_workqueue("pca9554 workqueue");
715 INIT_WORK(&pchip->pca9554_work,pca9554_extend_gpio_irq_handler);
717 set_irq_chip_data(pchip->irq_chain, pchip);
718 if(request_irq(pchip->irq_chain,pca9554_gpio_irq_handler, IRQF_TRIGGER_LOW, "pca6424", pchip)!=0)
720 DBG("**%s line=%d is err**\n",__FUNCTION__,__LINE__);
725 static irqreturn_t pca9554_gpio_irq_handler_test1(int irq, void * dev_id)
728 DBG("***************************%s irq=%d***\n",__FUNCTION__,irq);
731 static irqreturn_t pca9554_gpio_irq_handler_test2(int irq, void * dev_id)
733 DBG("**************************%s irq=%d***\n",__FUNCTION__,irq);
737 void pca9554_test(struct pca9554_chip *chip)
739 struct i2c_client *client=chip->client;
746 ret=gpio_request(RK2818_PIN_PI4,NULL);
748 DBG("*gpio_request in %d ret=%d*\n",__LINE__,ret);
750 ret=gpio_request(RK2818_PIN_PI5,NULL);
752 DBG("*gpio_request in %d ret=%d*\n",__LINE__,ret);
753 ret=gpio_request(RK2818_PIN_PI6,NULL);
755 DBG("*gpio_request in %d ret=%d*\n",__LINE__,ret);
756 ret=gpio_request(RK2818_PIN_PI7,NULL);
758 DBG("*gpio_request in %d ret=%d*\n",__LINE__,ret);
760 irq1=gpio_to_irq(RK2818_PIN_PI4);
761 request_irq(irq1, pca9554_gpio_irq_handler_test1, IRQF_TRIGGER_LOW,"xxx1", chip);
763 irq2=gpio_to_irq(RK2818_PIN_PI5);
764 request_irq(irq2, pca9554_gpio_irq_handler_test2, IRQF_TRIGGER_HIGH, "xxx2", chip);
766 ret=gpio_direction_output(RK2818_PIN_PI6,GPIO_HIGH);
767 ret=gpio_direction_output(RK2818_PIN_PI7,GPIO_LOW);
772 int pca9554_init_pintype(struct pca9554_chip *chip,struct i2c_client *client)
775 struct pca9554_platform_data *platform_data=(struct pca9554_platform_data *)client->dev.platform_data;
776 struct rk2818_gpio_expander_info *pca9554_gpio_settinginfo;
777 uint8_t reg_output[PCA9554_PortNum]={0};
778 uint8_t reg_direction[PCA9554_PortNum]={0};
779 uint8_t pca9554_pin_num;
781 uint8_t gpioPortPinNum,pca9554_settingpin_num=0;
785 pca9554_gpio_settinginfo=platform_data->settinginfo;
786 if(pca9554_gpio_settinginfo)
788 pca9554_settingpin_num=platform_data->settinginfolen;
789 for(i=0;i<pca9554_settingpin_num;i++)
791 if(!pca9554_checkrange(chip->gpio_start,chip->gpio_pin_num,pca9554_gpio_settinginfo[i].gpio_num))
793 pca9554_pin_num=pca9554_gpio_settinginfo[i].gpio_num-chip->gpio_start;
794 gpioPortNum = pca9554_pin_num/PCA9554_PortPinNum;
795 gpioPortPinNum= pca9554_pin_num%PCA9554_PortPinNum;
796 //DBG("gpioPortNum=%d,gpioPortNum=%d,pca9554_pin_num=%d,reg_direction=%x,reg_output=%x,reg_input=%x\n",gpioPortNum,gpioPortPinNum,pca9554_pin_num,reg_direction[i],reg_output[i]);
797 if((gpioPortNum>=PCA9554_PortNum)||(gpioPortPinNum>=portnum[gpioPortNum]))
799 if(pca9554_gpio_settinginfo[i].pin_type==GPIO_IN)
800 reg_direction[gpioPortNum]=pca9554setbit(reg_direction[gpioPortNum],gpioPortPinNum);
803 if(pca9554_gpio_settinginfo[i].pin_value==GPIO_HIGH)
804 reg_output[gpioPortNum]=pca9554setbit(reg_output[gpioPortNum],gpioPortPinNum);
812 #ifdef PCA9554_OUTREGLOCK
813 mutex_init(&chip->outreglock);
815 #ifdef PCA9554_INPUTREGLOCK
816 mutex_init(&chip->inputreglock);
818 #ifdef PCA9554_OUTREGLOCK
819 mutex_init(&chip->configreglock);
822 for(i=0; i<PCA9554_PortNum; i++)
825 if (pca9554_write_reg(client, PCA9554_Config_Reg, reg_direction[i])<0)
827 DBGERR("*%s %d* write reg err\n",__FUNCTION__,__LINE__);
830 chip->reg_direction[i]=reg_direction[i];
831 if (pca9554_write_reg(client, PCA9554_OutputLevel_Reg, reg_output[i])<0)
833 DBGERR("*%s %d write reg err*\n",__FUNCTION__,__LINE__);
836 chip->reg_output[i]=reg_output[i];
838 if(pca9554_read_reg(client, PCA9554_InputLevel_Reg, &chip->reg_input[i])<0)
840 DBGERR("*%s %d read reg err*\n",__FUNCTION__,__LINE__);
843 //DBG("reg_direction=%x,reg_output=%x,reg_input=%x\n",chip->reg_direction[i],chip->reg_output[i],chip->reg_input[i]);
849 static int __devinit pca9554_probe(struct i2c_client *client,const struct i2c_device_id *id)
851 struct pca9554_chip *chip;
852 struct pca9554_platform_data *pdata;
855 DBG("**gpio %s in %d line,dev adr is %x**\n",__FUNCTION__,__LINE__,client->addr);
856 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
859 chip = kzalloc(sizeof(struct pca9554_chip), GFP_KERNEL);
862 pdata = client->dev.platform_data;
864 DBGERR(" %s no platform data\n",__FUNCTION__);
869 chip->gpio_start = pdata->gpio_base;
870 chip->gpio_irq_start =pdata->gpio_irq_start;
871 chip->gpio_pin_num=pdata->gpio_pin_num;
872 chip->irq_pin_num = pdata->irq_pin_num;
873 chip->irq_gpiopin=pdata->pca9954_irq_pin;
874 chip->irq_chain = gpio_to_irq(pdata->pca9954_irq_pin);
875 chip->names =pdata->names;
877 //DBG("**%s in %d start=%d,irq_start=%d,pin_num=%d,irq_pin_num=%d,irq_gpiopin=%d,irq_chain=%d,**\n",
878 // __FUNCTION__,__LINE__,chip->gpio_start,chip->gpio_irq_start,chip->gpio_pin_num,chip->irq_pin_num,chip->irq_gpiopin
879 // ,chip->irq_chain);
881 /* initialize cached registers from their original values.
882 * we can't share this chip with another i2c master.
884 pca9554_setup_gpio(chip, id->driver_data);
886 ret = gpiochip_add(&chip->gpio_chip);
890 if(pca9554_init_pintype(chip,client))
894 ret = pdata->setup(client, chip->gpio_chip.base,
895 chip->gpio_chip.ngpio, pdata->context);
897 DBGERR(" %s setup failed, %d\n",__FUNCTION__,ret);
901 pca9554_gpio_irq_setup(chip);
903 i2c_set_clientdata(client, chip);
907 chip->client = client;
909 //pca9554_test(chip);
919 static int pca9554_remove(struct i2c_client *client)
921 struct pca9554_platform_data *pdata = client->dev.platform_data;
922 struct pca9554_chip *chip = i2c_get_clientdata(client);
925 if (pdata->teardown) {
926 ret = pdata->teardown(client, chip->gpio_chip.base,
927 chip->gpio_chip.ngpio, pdata->context);
929 DBGERR(" %s failed, %d\n",__FUNCTION__,ret);
934 ret = gpiochip_remove(&chip->gpio_chip);
936 dev_err(&client->dev, "%s failed, %d\n",
937 "gpiochip_remove()", ret);
944 static struct i2c_driver pca9554_driver = {
946 .owner = THIS_MODULE,
947 .name = "extend_gpio_pca9554",
949 .probe = pca9554_probe,
950 .remove = pca9554_remove,
951 .id_table = pca9554_id,
954 static int __init pca9554_init(void)
956 DBG("**pca9554_init**\n");
957 return i2c_add_driver(&pca9554_driver);
959 static void __exit pca9554_exit(void)
961 i2c_del_driver(&pca9554_driver);
964 module_init(pca9554_init);
965 module_exit(pca9554_exit);
966 MODULE_AUTHOR(" XXX XXX@rock-chips.com");
967 MODULE_DESCRIPTION("Driver for rk2818 extend gpio device");
968 MODULE_LICENSE("GPL");