From fdd38da677d0c70efe101bbd8fde29aa62e67360 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E5=AE=8B=E7=A7=80=E6=9D=B0?= Date: Wed, 18 Aug 2010 05:57:42 -0700 Subject: [PATCH] move tca6424_reset_itr from tca6424.c to board-infosdk.c,this is used in i2c-rk2818 for extgpio interrupt --- arch/arm/mach-rk2818/board-infosdk.c | 18 ++++++++++++++++++ arch/arm/mach-rk2818/include/mach/board.h | 1 + drivers/gpio/tca6424.c | 19 ++----------------- drivers/i2c/busses/i2c-rk2818.c | 13 +++++++------ 4 files changed, 28 insertions(+), 23 deletions(-) diff --git a/arch/arm/mach-rk2818/board-infosdk.c b/arch/arm/mach-rk2818/board-infosdk.c index f15807a4dfd1..ed4b5668f129 100755 --- a/arch/arm/mach-rk2818/board-infosdk.c +++ b/arch/arm/mach-rk2818/board-infosdk.c @@ -316,6 +316,23 @@ struct rk2818_gpio_expander_info extgpio_tca6424_settinginfo[] = { }, }; +void tca6424_reset_itr(void) +{ + rk2818_mux_api_set(GPIOE_U1IR_I2C1_NAME, IOMUXA_GPIO1_A67); + gpio_request(RK2818_PIN_PE6,NULL); + gpio_request(RK2818_PIN_PE7,NULL); + + gpio_direction_output(RK2818_PIN_PE6,GPIO_HIGH); + gpio_direction_output(RK2818_PIN_PE7,GPIO_LOW); + udelay(3); + gpio_set_value(RK2818_PIN_PE7,GPIO_HIGH); + udelay(1); + + gpio_free(RK2818_PIN_PE6); + gpio_free(RK2818_PIN_PE7); + rk2818_mux_api_set(GPIOE_U1IR_I2C1_NAME, IOMUXA_I2C1); +} + struct tca6424_platform_data rk2818_tca6424_data={ .gpio_base=GPIO_EXPANDER_BASE, .gpio_pin_num=CONFIG_EXPANDED_GPIO_NUM, @@ -325,6 +342,7 @@ struct tca6424_platform_data rk2818_tca6424_data={ .settinginfo=extgpio_tca6424_settinginfo, .settinginfolen=ARRAY_SIZE(extgpio_tca6424_settinginfo), .names="extend_gpio_tca6424", + .reseti2cpin = tca6424_reset_itr, }; #endif diff --git a/arch/arm/mach-rk2818/include/mach/board.h b/arch/arm/mach-rk2818/include/mach/board.h index 2cb4ecd64f62..0d360449aa8d 100755 --- a/arch/arm/mach-rk2818/include/mach/board.h +++ b/arch/arm/mach-rk2818/include/mach/board.h @@ -135,6 +135,7 @@ struct tca6424_platform_data { int (*setup)(struct i2c_client *client,unsigned gpio, unsigned ngpio,void *context); int (*teardown)(struct i2c_client *client,unsigned gpio, unsigned ngpio,void *context); char **names; + void (*reseti2cpin)(void); }; diff --git a/drivers/gpio/tca6424.c b/drivers/gpio/tca6424.c index ba7d185076da..11ce469035e3 100755 --- a/drivers/gpio/tca6424.c +++ b/drivers/gpio/tca6424.c @@ -834,22 +834,6 @@ int tca6424_init_pintype(struct tca6424_chip *chip,struct i2c_client *client) return 0; } -void tca6424_reset_itr(void) -{ - rk2818_mux_api_set(GPIOE_U1IR_I2C1_NAME, IOMUXA_GPIO1_A67); - gpio_request(RK2818_PIN_PE6,NULL); - gpio_request(RK2818_PIN_PE7,NULL); - - gpio_direction_output(RK2818_PIN_PE6,GPIO_HIGH); - gpio_direction_output(RK2818_PIN_PE7,GPIO_LOW); - udelay(3); - gpio_set_value(RK2818_PIN_PE7,GPIO_HIGH); - udelay(1); - rk2818_mux_api_set(GPIOE_U1IR_I2C1_NAME, IOMUXA_I2C1); - - gpio_free(RK2818_PIN_PE6); - gpio_free(RK2818_PIN_PE7); -} static int __devinit tca6424_probe(struct i2c_client *client,const struct i2c_device_id *id) { @@ -871,6 +855,8 @@ static int __devinit tca6424_probe(struct i2c_client *client,const struct i2c_de ret = -EINVAL; goto out_failed; } + + client->adapter->dev.platform_data = pdata; chip->gpio_start = pdata->gpio_base; chip->gpio_irq_start =pdata->gpio_irq_start; @@ -905,7 +891,6 @@ static int __devinit tca6424_probe(struct i2c_client *client,const struct i2c_de tca6424_gpio_irq_setup(chip); i2c_set_clientdata(client, chip); chip->client = client; - return 0; out_failed: diff --git a/drivers/i2c/busses/i2c-rk2818.c b/drivers/i2c/busses/i2c-rk2818.c index fde5cbe1ade0..54dacbb14f93 100755 --- a/drivers/i2c/busses/i2c-rk2818.c +++ b/drivers/i2c/busses/i2c-rk2818.c @@ -35,10 +35,6 @@ #define RK2818_I2C_TIMEOUT (msecs_to_jiffies(500)) #define RK2818_DELAY_TIME 2 -#if defined (CONFIG_IOEXTEND_TCA6424) - void tca6424_reset_itr(void); -#endif - #if 0 #define i2c_dbg(dev, format, arg...) \ dev_printk(KERN_INFO , dev , format , ## arg) @@ -421,7 +417,10 @@ static int rk2818_xfer_msg(struct i2c_adapter *adap, struct rk2818_i2c_data *i2c = (struct rk2818_i2c_data *)adap->algo_data; unsigned long conr = readl(i2c->regs + I2C_CONR); int ret = 0; - + + #if defined (CONFIG_IOEXTEND_TCA6424) + struct tca6424_platform_data *pdata = adap->dev.platform_data; + #endif if(msg->len == 0) { @@ -467,7 +466,9 @@ exit: if(msg->flags & I2C_M_RD) { #if defined (CONFIG_IOEXTEND_TCA6424) - tca6424_reset_itr( ); + if (pdata && pdata->reseti2cpin) { + pdata->reseti2cpin(); + } #endif } -- 2.34.1