]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
twl4030-madc: Convert ioctl to unlocked
authorAaro Koskinen <Aaro.Koskinen@nokia.com>
Fri, 20 Feb 2009 14:13:54 +0000 (14:13 +0000)
committerTony Lindgren <tony@atomide.com>
Fri, 27 Feb 2009 18:09:51 +0000 (10:09 -0800)
Use unlocked ioctl instead of taking the BKL for an operation that can
take some milliseconds. The driver mutex is now taken before the active
status check, so that the concurrent users of this ioctl won't start
seeing EBUSY (previously guaranteed by the BKL).

Signed-off-by: Aaro Koskinen <Aaro.Koskinen@nokia.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
drivers/i2c/chips/twl4030-madc.c

index 19dacf5f7060eb4b5ae0be99c19b90ca1f43c416..89973819b61e81d88a19fe55e038ca33736b65fb 100644 (file)
@@ -269,17 +269,19 @@ int twl4030_madc_conversion(struct twl4030_madc_request *req)
        if (unlikely(!req))
                return -EINVAL;
 
+       mutex_lock(&the_madc->lock);
+
        /* Do we have a conversion request ongoing */
-       if (the_madc->requests[req->method].active)
-               return -EBUSY;
+       if (the_madc->requests[req->method].active) {
+               ret = -EBUSY;
+               goto out;
+       }
 
        ch_msb = (req->channels >> 8) & 0xff;
        ch_lsb = req->channels & 0xff;
 
        method = &twl4030_conversion_methods[req->method];
 
-       mutex_lock(&the_madc->lock);
-
        /* Select channels to be converted */
        twl4030_madc_write(the_madc, method->sel + 1, ch_msb);
        twl4030_madc_write(the_madc, method->sel, ch_lsb);
@@ -366,8 +368,8 @@ static int twl4030_madc_set_power(struct twl4030_madc_data *madc, int on)
        return 0;
 }
 
-static int twl4030_madc_ioctl(struct inode *inode, struct file *filp,
-                             unsigned int cmd, unsigned long arg)
+static long twl4030_madc_ioctl(struct file *filp, unsigned int cmd,
+                              unsigned long arg)
 {
        struct twl4030_madc_user_parms par;
        int val, ret;
@@ -413,7 +415,7 @@ static int twl4030_madc_ioctl(struct inode *inode, struct file *filp,
 
 static struct file_operations twl4030_madc_fileops = {
        .owner = THIS_MODULE,
-       .ioctl = twl4030_madc_ioctl
+       .unlocked_ioctl = twl4030_madc_ioctl
 };
 
 static struct miscdevice twl4030_madc_device = {