From: 黄涛 Date: Mon, 24 Jan 2011 09:47:31 +0000 (+0800) Subject: i2c: rk29: add idle lock for i2c0 X-Git-Tag: firefly_0821_release~10785^2~12^2~3 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=35ff449e4d551da7179a2b1de22ca38641097794;p=firefly-linux-kernel-4.4.55.git i2c: rk29: add idle lock for i2c0 --- diff --git a/drivers/i2c/busses/i2c-rk29.c b/drivers/i2c/busses/i2c-rk29.c index 215d0a801f69..a8cba27ef59b 100755 --- a/drivers/i2c/busses/i2c-rk29.c +++ b/drivers/i2c/busses/i2c-rk29.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include @@ -108,6 +109,8 @@ struct rk29_i2c_data { #endif }; +static struct wake_lock idlelock; /* only for i2c0 */ + static void rk29_set_ack(struct rk29_i2c_data *i2c) { unsigned long conr = readl(i2c->regs + I2C_CONR); @@ -506,6 +509,7 @@ static int rk29_i2c_xfer(struct i2c_adapter *adap, int ret = -1; int i; struct rk29_i2c_data *i2c = (struct rk29_i2c_data *)adap->algo_data; + //int retry = i2c->retry; /* if(i2c->suspended ==1) @@ -519,6 +523,10 @@ static int rk29_i2c_xfer(struct i2c_adapter *adap, i2c->udelay_time = RK29_UDELAY_TIME(i2c->scl_rate); i2c->ack_timeout = RK29_I2C_ACK_TIMEOUT_COUNT * i2c->udelay_time; + + if (adap->nr == 0) + wake_lock(&idlelock); + for (i = 0; i < num; i++) { ret = rk29_xfer_msg(adap, &msgs[i], (i == 0), (i == (num - 1))); @@ -529,6 +537,10 @@ static int rk29_i2c_xfer(struct i2c_adapter *adap, break; } } + + if (adap->nr == 0) + wake_unlock(&idlelock); + /* if( --retry && num < 0) { @@ -834,6 +846,7 @@ static struct platform_driver rk29_i2c_driver = { static int __init rk29_i2c_adap_init(void) { + wake_lock_init(&idlelock, WAKE_LOCK_IDLE, "i2c0"); return platform_driver_register(&rk29_i2c_driver); }