From f9916174e0bf8489349947c1479739400940f9cb Mon Sep 17 00:00:00 2001 From: Aaro Koskinen Date: Fri, 20 Feb 2009 14:13:55 +0000 Subject: [PATCH] twl4030-madc: Let the operation complete faster No need to wait before the first read, as the operation is likely completed already. For timeout 50 milliseconds is an overkill, poll the register for the duration of 5 milliseconds at maximum. Also, clear the active flag in case of timeout. Signed-off-by: Aaro Koskinen Signed-off-by: Tony Lindgren --- drivers/i2c/chips/twl4030-madc.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/drivers/i2c/chips/twl4030-madc.c b/drivers/i2c/chips/twl4030-madc.c index 89973819b61..d3e0a7fd7ef 100644 --- a/drivers/i2c/chips/twl4030-madc.c +++ b/drivers/i2c/chips/twl4030-madc.c @@ -246,24 +246,28 @@ static inline void twl4030_madc_start_conversion(struct twl4030_madc_data *madc, } } -static void twl4030_madc_wait_conversion_ready_ms( +static int twl4030_madc_wait_conversion_ready( struct twl4030_madc_data *madc, - u8 *time, u8 status_reg) + unsigned int timeout_ms, u8 status_reg) { - u8 reg = 0; + unsigned long timeout; + timeout = jiffies + msecs_to_jiffies(timeout_ms); do { - msleep(1); - (*time)--; + u8 reg; + reg = twl4030_madc_read(madc, status_reg); - } while (((reg & TWL4030_MADC_BUSY) && !(reg & TWL4030_MADC_EOC_SW)) && - (*time != 0)); + if (!(reg & TWL4030_MADC_BUSY) && (reg & TWL4030_MADC_EOC_SW)) + return 0; + } while (!time_after(jiffies, timeout)); + + return -EAGAIN; } int twl4030_madc_conversion(struct twl4030_madc_request *req) { const struct twl4030_madc_conversion_method *method; - u8 wait_time, ch_msb, ch_lsb; + u8 ch_msb, ch_lsb; int ret; if (unlikely(!req)) @@ -310,12 +314,10 @@ int twl4030_madc_conversion(struct twl4030_madc_request *req) the_madc->requests[req->method].active = 1; /* Wait until conversion is ready (ctrl register returns EOC) */ - wait_time = 50; - twl4030_madc_wait_conversion_ready_ms(the_madc, - &wait_time, method->ctrl); - if (wait_time == 0) { + ret = twl4030_madc_wait_conversion_ready(the_madc, 5, method->ctrl); + if (ret) { dev_dbg(the_madc->dev, "conversion timeout!\n"); - ret = -EAGAIN; + the_madc->requests[req->method].active = 0; goto out; } -- 2.41.0