2 * Copyright (C) 2010 ROCKCHIP, Inc.
4 * This software is licensed under the terms of the GNU General Public
5 * License version 2, as published by the Free Software Foundation, and
6 * may be copied, distributed, and modified under those terms.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 /*******************************************************************/
14 /* COPYRIGHT (C) ROCK-CHIPS FUZHOU . ALL RIGHTS RESERVED.*/
15 /*******************************************************************
20 ********************************************************************/
21 #include <asm/mach/time.h>
22 #include <linux/clk.h>
23 #include <linux/errno.h>
24 #include <linux/interrupt.h>
25 #include <asm/mach-types.h>
26 #include <linux/irq.h>
27 #include <linux/debugfs.h>
28 #include <linux/seq_file.h>
29 #include <linux/kernel.h>
30 #include <linux/list.h>
31 #include <linux/module.h>
33 #include <mach/hardware.h>
34 #include <mach/gpio.h>
35 #include <mach/rk2818_iomap.h>
36 #include <mach/iomux.h>
37 #include <linux/device.h>
38 #include <mach/gpio.h>
40 #include <linux/i2c.h>
41 #include <linux/workqueue.h>
42 #include <mach/board.h>
43 #include <linux/delay.h>
44 #include <linux/i2c/tca6424.h>
45 #include <linux/ktime.h>
46 #include "../drivers/gpio/soft_interrupt.h"
50 #define DBG(x...) printk(KERN_INFO x)
56 #define DBGERR(x...) printk(KERN_INFO x)
63 unsigned int gpio_start;
64 unsigned int gpio_pin_num;
66 #ifdef TCA6424_OUTREGLOCK
67 struct mutex outreglock;
69 #ifdef TCA6424_INPUTREGLOCK
70 struct mutex inputreglock;
72 #ifdef TCA6424_CONFIGREGLOCK
73 struct mutex configreglock;
76 struct i2c_client *client;
77 struct expand_gpio_soft_int *expand;
78 struct expand_gpio_global_variable gtca6424_struct;
79 struct gpio_chip gpio_chip;
83 static const struct i2c_device_id tca6424_id[] =
85 {"extend_gpio_tca6424",8,},
88 MODULE_DEVICE_TABLE(i2c, tca6424_id);
90 static short int portnum[TCA6424_PortNum]={ TCA6424_Port0PinNum,
91 TCA6424_Port1PinNum,TCA6424_Port2PinNum};
93 extern inline struct gpio_chip *gpio_to_chip(unsigned gpio);
95 int tca6424_irq_read_inputreg(void *data,char *buf)
98 struct tca6424_chip *tca6424data=(struct tca6424_chip *)data;
100 ret = i2c_master_reg8_recv(tca6424data->client, TCA6424_Auto_InputLevel_Reg, buf, 3, TCA6424_I2C_RATE);
101 return (ret>0)?0:ret;
104 static int tca6424_write_reg(struct i2c_client *client, uint8_t reg, uint8_t val)
107 struct i2c_adapter *adap;
112 adap = client->adapter;
116 msg.addr = client->addr;
119 msg.flags = client->flags;
120 msg.scl_rate = TCA6424_I2C_RATE;
121 ret = i2c_transfer(adap, &msg, 1);
125 static int tca6424_read_reg(struct i2c_client *client, uint8_t reg, uint8_t *val)
128 struct i2c_adapter *adap;
129 struct i2c_msg msgs[2];
133 adap = client->adapter;
135 msgs[0].addr = client->addr;
137 msgs[0].flags = client->flags;
139 msgs[0].scl_rate = TCA6424_I2C_RATE;
142 msgs[1].addr = client->addr;
143 msgs[1].flags = client->flags | I2C_M_RD;
145 msgs[1].scl_rate = TCA6424_I2C_RATE;
147 ret = i2c_transfer(adap, msgs, 2);
152 static int tca6424_write_three_reg(struct i2c_client *client, const char reg, const char *buf, int count, int rate)
155 ret = i2c_master_reg8_send(client, reg, buf, count, rate);
156 return (ret>0)?0:ret;
159 static int tca6424_read_three_reg(struct i2c_client *client, const char reg, char *buf, int count, int rate)
162 ret = i2c_master_reg8_recv(client, reg, buf, count, rate);
163 return (ret>0)?0:ret;
166 static int tca6424_gpio_direction_input(struct gpio_chip *gc, unsigned pin_num)
168 struct tca6424_chip *chip;
170 uint8_t gpioPortPinNum;
175 chip = container_of(gc, struct tca6424_chip, gpio_chip);
176 gpioPortNum = pin_num/8;
177 gpioPortPinNum= pin_num%8;
178 if((gpioPortNum>=TCA6424_PortNum)||(gpioPortPinNum>=portnum[gpioPortNum]))
180 Regaddr = TCA6424_Config_Reg+gpioPortNum;
182 #ifdef TCA6424_CONFIGREGLOCK
183 if (!mutex_trylock(&chip->configreglock))
185 DBGERR("**%s[%d]Did not get the configreglock**\n",__FUNCTION__,__LINE__);
190 if(((chip->gtca6424_struct.reg_direction[gpioPortNum]>>gpioPortPinNum)& 0x01)==EXTGPIO_OUTPUT)
192 reg_val = tca6424setbit(chip->gtca6424_struct.reg_direction[gpioPortNum], gpioPortPinNum);
193 ret = tca6424_write_reg(chip->client, Regaddr, reg_val);
196 chip->gtca6424_struct.reg_direction[gpioPortNum] = reg_val;
197 //DBG("**%s[%d],set config address[0x%2x]=%2x,ret=%d**\n",__FUNCTION__,__LINE__,Regaddr,reg_val,ret);
200 #ifdef TCA6424_CONFIGREGLOCK
201 mutex_unlock(&chip->configreglock);
206 static int tca6424_gpio_direction_output(struct gpio_chip *gc, unsigned pin_num, int val)
208 struct tca6424_chip *chip;
210 uint8_t gpioPortPinNum;
215 chip = container_of(gc, struct tca6424_chip, gpio_chip);
216 gpioPortNum = pin_num/8;
217 gpioPortPinNum = pin_num%8;
218 if((gpioPortNum>=TCA6424_PortNum)||(gpioPortPinNum>=portnum[gpioPortNum]))
220 Regaddr = TCA6424_Config_Reg+gpioPortNum;
222 #ifdef TCA6424_CONFIGREGLOCK
223 if (!mutex_trylock(&chip->configreglock))
225 DBGERR("**%s[%d]Did not get the configreglock**\n",__FUNCTION__,__LINE__);
230 if(((chip->gtca6424_struct.reg_direction[gpioPortNum]>>gpioPortPinNum)& 0x01)==EXTGPIO_INPUT)
232 reg_val = tca6424clearbit(chip->gtca6424_struct.reg_direction[gpioPortNum], gpioPortPinNum);
233 //DBG("**%s[%d],set config address[0x%2x]=%2x,**\n",__FUNCTION__,__LINE__,Regaddr,reg_val);
234 ret = tca6424_write_reg(chip->client, Regaddr, reg_val);
237 #ifdef TCA6424_CONFIGREGLOCK
238 mutex_unlock(&chip->configreglock);
240 DBGERR("**%s[%d] set direction reg is error,reg_val=%x,ret=%d**\n",__FUNCTION__,__LINE__,reg_val,ret);
243 chip->gtca6424_struct.reg_direction[gpioPortNum] = reg_val;
246 #ifdef TCA6424_CONFIGREGLOCK
247 mutex_unlock(&chip->configreglock);
251 #ifdef TCA6424_OUTREGLOCK
252 if (!mutex_trylock(&chip->outreglock))
254 DBGERR("**%s[%d] Did not get the outreglock**\n",__FUNCTION__,__LINE__);
259 if(((chip->gtca6424_struct.reg_output[gpioPortNum]>>gpioPortPinNum)& 0x01) != val)
262 reg_val = tca6424setbit(chip->gtca6424_struct.reg_output[gpioPortNum], gpioPortPinNum);
264 reg_val = tca6424clearbit(chip->gtca6424_struct.reg_output[gpioPortNum], gpioPortPinNum);
266 Regaddr = TCA6424_OutputLevel_Reg+gpioPortNum;
267 ret = tca6424_write_reg(chip->client, Regaddr, reg_val);
270 #ifdef TCA6424_OUTREGLOCK
271 mutex_unlock(&chip->outreglock);
273 DBGERR("**%s[%d] set out reg is error,reg_val=%x,ret=%d**\n",__FUNCTION__,__LINE__,reg_val,ret);
276 chip->gtca6424_struct.reg_output[gpioPortNum] = reg_val;
279 #ifdef TCA6424_OUTREGLOCK
280 mutex_unlock(&chip->outreglock);
282 //DBG("**%s[%d],set output address[0x%2x]=%2x,ret=%d**\n",__FUNCTION__,__LINE__,Regaddr,reg_val,ret);
286 static int tca6424_gpio_get_value(struct gpio_chip *gc, unsigned pin_num)
288 struct tca6424_chip *chip;
290 uint8_t gpioPortPinNum;
294 chip = container_of(gc, struct tca6424_chip, gpio_chip);
296 #ifdef CONFIG_SOFT_INTERRUPT
297 ret = wait_untill_input_reg_flash( );
302 gpioPortNum = pin_num/8;
303 gpioPortPinNum= pin_num%8;
304 Regaddr = TCA6424_OutputLevel_Reg+gpioPortNum;
306 if((gpioPortNum>=TCA6424_PortNum)||(gpioPortPinNum>=portnum[gpioPortNum]))
309 #ifndef CONFIG_SOFT_INTERRUPT
311 ret = tca6424_read_reg(chip->client, Regaddr, ®_val);
314 chip->gtca6424_struct.reg_input[gpioPortNum] = reg_val;
317 //DBG("**%s[%d] read input address[0x%2x]=%2x**\n",__FUNCTION__,__LINE__,Regaddr,chip->reg_input[gpioPortNum]);
318 return ((chip->gtca6424_struct.reg_input[gpioPortNum] >> gpioPortPinNum) & 0x01);
321 static void tca6424_gpio_set_value(struct gpio_chip *gc, unsigned pin_num, int val)
323 struct tca6424_chip *chip;
325 uint8_t gpioPortPinNum;
330 chip = container_of(gc, struct tca6424_chip, gpio_chip);
331 gpioPortNum = pin_num/8;
332 gpioPortPinNum= pin_num%8;
333 if((gpioPortNum>=TCA6424_PortNum)||(gpioPortPinNum>=portnum[gpioPortNum]))
335 Regaddr = TCA6424_OutputLevel_Reg+gpioPortNum;
336 if(tca6424getbit(chip->gtca6424_struct.reg_direction[gpioPortNum],gpioPortPinNum)) // input state
341 #ifdef TCA6424_OUTREGLOCK
342 if (!mutex_trylock(&chip->outreglock))
344 DBGERR("**%s[%d] Did not get the outreglock**\n",__FUNCTION__,__LINE__);
348 if(((chip->gtca6424_struct.reg_output[gpioPortNum]>>gpioPortPinNum)& 0x01) != val)
351 reg_val = tca6424setbit(chip->gtca6424_struct.reg_output[gpioPortNum], gpioPortPinNum);
353 reg_val = tca6424clearbit(chip->gtca6424_struct.reg_output[gpioPortNum], gpioPortPinNum);
355 ret = tca6424_write_reg(chip->client, Regaddr, reg_val);
358 chip->gtca6424_struct.reg_output[gpioPortNum] = reg_val;
359 //DBG("**%s[%d],set output address[0x%2x]=%2x,ret=%d**\n",__FUNCTION__,__LINE__,Regaddr,reg_val,ret);
362 #ifdef TCA6424_OUTREGLOCK
363 mutex_unlock(&chip->outreglock);
368 int tca6424_checkrange(int start,int num,int val)
370 if((val<(start+num))&&(val>=start))
376 static int tca6424_gpio_to_irq(struct gpio_chip *chip,unsigned offset)
378 struct tca6424_chip *pchip = container_of(chip, struct tca6424_chip, gpio_chip);
379 if(((pchip->gpio_start+offset)>=chip->base)&&((pchip->gpio_start+offset)<(chip->base+chip->ngpio)))
381 //DBG("**%s,offset=%d,gpio_irq_start=%d,base=%d,ngpio=%d,gpio_irq_start=%d**\n",
382 // __FUNCTION__,offset,pchip->expand->gpio_irq_start,chip->base,chip->ngpio,pchip->expand->gpio_irq_start);
383 return (offset+pchip->expand->gpio_irq_start);
391 static void tca6424_setup_gpio(struct tca6424_chip *chip, int gpios)
393 struct gpio_chip *gc;
394 gc = &chip->gpio_chip;
395 gc->direction_input = tca6424_gpio_direction_input;
396 gc->direction_output = tca6424_gpio_direction_output;
397 gc->get = tca6424_gpio_get_value;
398 gc->set = tca6424_gpio_set_value;
399 gc->to_irq = tca6424_gpio_to_irq;
401 gc->base = chip->gpio_start;
402 gc->ngpio = chip->gpio_pin_num;
403 gc->label = chip->client->name;
404 gc->dev = &chip->client->dev;
405 gc->owner = THIS_MODULE;
406 gc->names = chip->names;
409 int tca6424_init_pintype(struct tca6424_chip *chip,struct i2c_client *client)
411 struct tca6424_platform_data *platform_data=(struct tca6424_platform_data *)client->dev.platform_data;
412 struct rk2818_gpio_expander_info *tca6424_gpio_settinginfo;
413 uint8_t reg_output[TCA6424_PortNum]={0,0,0};
414 uint8_t reg_direction[TCA6424_PortNum]={0,0,0};
415 uint8_t reg_invert[TCA6424_PortNum]={0,0,0};
416 uint8_t tca6424_pin_num;
418 uint8_t gpioPortPinNum,tca6424_settingpin_num=0;
422 tca6424_gpio_settinginfo=platform_data->settinginfo;
423 if(tca6424_gpio_settinginfo)
425 tca6424_settingpin_num=platform_data->settinginfolen;
426 for(i=0;i<tca6424_settingpin_num;i++)
428 if(!tca6424_checkrange(chip->gpio_start,chip->gpio_pin_num,tca6424_gpio_settinginfo[i].gpio_num))
430 tca6424_pin_num=tca6424_gpio_settinginfo[i].gpio_num-chip->gpio_start;
431 gpioPortNum = tca6424_pin_num/ TCA6424_PortPinNum;
432 gpioPortPinNum= tca6424_pin_num% TCA6424_PortPinNum;
433 //DBG("gpioPortNum=%d,gpioPortNum=%d,tca6424_pin_num=%d,reg_direction=%x,reg_output=%x,reg_input=%x\n",gpioPortNum,gpioPortPinNum,tca6424_pin_num,reg_direction[i],reg_output[i]);
434 if((gpioPortNum>=TCA6424_PortNum)||(gpioPortPinNum>=portnum[gpioPortNum]))
436 if(tca6424_gpio_settinginfo[i].pin_type==GPIO_IN)
438 reg_direction[gpioPortNum]=tca6424setbit(reg_direction[gpioPortNum],gpioPortPinNum);
442 if(tca6424_gpio_settinginfo[i].pin_value==GPIO_HIGH)
444 reg_output[gpioPortNum]=tca6424setbit(reg_output[gpioPortNum],gpioPortPinNum);
452 #ifdef TCA6424_OUTREGLOCK
453 mutex_init(&chip->outreglock);
455 #ifdef TCA6424_INPUTREGLOCK
456 mutex_init(&chip->inputreglock);
458 #ifdef TCA6424_OUTREGLOCK
459 mutex_init(&chip->configreglock);
462 if(tca6424_write_three_reg(client, TCA6424_Auto_Config_Reg , ®_direction[0], 3, TCA6424_I2C_RATE)<0)
464 DBGERR("*%s %d* write reg err\n",__FUNCTION__,__LINE__);
467 if (tca6424_write_three_reg(client, TCA6424_Auto_OutputLevel_Reg, ®_output[0], 3, TCA6424_I2C_RATE)<0)
469 DBGERR("*%s %d* write reg err\n",__FUNCTION__,__LINE__);
472 if (tca6424_write_three_reg(client, TCA6424_Auto_Invert_Reg, ®_invert[0], 3, TCA6424_I2C_RATE)<0) //make sure this reg be 0
474 DBGERR("*%s %d* write reg err\n",__FUNCTION__,__LINE__);
477 if(tca6424_read_three_reg(client, TCA6424_Auto_InputLevel_Reg, &chip->gtca6424_struct.reg_input[0], 3, TCA6424_I2C_RATE)<0)
479 DBGERR("*%s %d read reg err*\n",__FUNCTION__,__LINE__);
482 for(i=0; i<TCA6424_PortNum; i++)
484 chip->gtca6424_struct.reg_direction[i]=reg_direction[i];
485 chip->gtca6424_struct.reg_output[i]=reg_output[i];
486 DBG("reg_direction=%x,reg_output=%x,reg_input=%x\n",chip->gtca6424_struct.reg_direction[i],chip->gtca6424_struct.reg_output[i],chip->gtca6424_struct.reg_input[i]);
491 static int __devinit tca6424_probe(struct i2c_client *client,const struct i2c_device_id *id)
493 struct tca6424_chip *chip;
494 struct tca6424_platform_data *pdata;
496 DBG(KERN_ALERT"*******gpio %s in %d line,dev adr is %x**\n",__FUNCTION__,__LINE__,client->addr);
497 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
500 chip = kzalloc(sizeof(struct tca6424_chip), GFP_KERNEL);
503 pdata = client->dev.platform_data;
505 DBGERR(" %s no platform data\n",__FUNCTION__);
509 //used by old tca6424,it will remove later
510 client->adapter->dev.platform_data = pdata;
512 chip->gpio_start = pdata->gpio_base;
513 chip->gpio_pin_num=pdata->gpio_pin_num;
514 chip->client = client;
515 chip->names = pdata->names;
517 #ifdef CONFIG_SOFT_INTERRUPT
518 chip->expand = &expand_irq_data;
519 chip->expand->gpio_irq_start =pdata->gpio_irq_start;
520 chip->expand->irq_pin_num = pdata->irq_pin_num;
521 chip->expand->irq_gpiopin=pdata->tca6424_irq_pin;
522 chip->expand->irq_chain = gpio_to_irq(pdata->tca6424_irq_pin);
523 chip->expand->expand_port_group = pdata->expand_port_group;
\r
524 chip->expand->expand_port_pinnum = pdata->expand_port_pinnum;
\r
525 chip->expand->rk_irq_mode = pdata->rk_irq_mode;
\r
526 chip->expand->rk_irq_gpio_pull_up_down = pdata->rk_irq_gpio_pull_up_down;
529 /* initialize cached registers from their original values.
530 * we can't share this chip with another i2c master.
532 tca6424_setup_gpio(chip, id->driver_data);
533 ret = gpiochip_add(&chip->gpio_chip);
536 if(tca6424_init_pintype(chip,client))
539 ret = pdata->setup(client, chip->gpio_chip.base,
540 chip->gpio_chip.ngpio, pdata->context);
542 DBGERR(" %s setup failed, %d\n",__FUNCTION__,ret);
544 i2c_set_clientdata(client, chip);
546 #ifdef CONFIG_SOFT_INTERRUPT
547 expand_irq_init(chip,&chip->gtca6424_struct,tca6424_irq_read_inputreg);
555 static int tca6424_remove(struct i2c_client *client)
557 struct tca6424_platform_data *pdata = client->dev.platform_data;
558 struct tca6424_chip *chip = i2c_get_clientdata(client);
561 if (pdata->teardown) {
562 ret = pdata->teardown(client, chip->gpio_chip.base,
563 chip->gpio_chip.ngpio, pdata->context);
565 DBGERR(" %s failed, %d\n",__FUNCTION__,ret);
570 ret = gpiochip_remove(&chip->gpio_chip);
572 dev_err(&client->dev, "%s failed, %d\n",
573 "gpiochip_remove()", ret);
580 static int tca6424_suspend(struct i2c_client *client, pm_message_t mesg)
582 DBG("*****************tca6424 suspend*******************");
586 static int tca6424_resume(struct i2c_client *client)
588 DBG("*****************tca6424 resume*******************");
592 static struct i2c_driver tca6424_driver = {
594 .owner = THIS_MODULE,
595 .name = "extend_gpio_tca6424",
597 .probe = tca6424_probe,
598 .remove = tca6424_remove,
599 .id_table = tca6424_id,
600 .resume = tca6424_resume,
601 .suspend = tca6424_suspend,
603 static int __init tca6424_init(void)
606 DBG(KERN_ALERT"**********tca6424_init**********\n");
607 tmp=i2c_add_driver(&tca6424_driver);
610 subsys_initcall(tca6424_init);
612 static void __exit tca6424_exit(void)
614 DBG(KERN_ALERT"**********tca6424_exit**********\n");
615 i2c_del_driver(&tca6424_driver);
617 module_exit(tca6424_exit);
619 MODULE_AUTHOR(" XXX XXX@rock-chips.com");
620 MODULE_DESCRIPTION("Driver for rk2818 tca6424 device");
621 MODULE_LICENSE("GPL");