From: Aaro Koskinen Date: Fri, 20 Feb 2009 14:13:54 +0000 (+0000) Subject: twl4030-madc: Convert ioctl to unlocked X-Git-Url: http://www.pilppa.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=172195de53c497b4650a24d13d285b9c1c3bcb3f;p=linux-2.6-omap-h63xx.git twl4030-madc: Convert ioctl to unlocked 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 Signed-off-by: Tony Lindgren --- diff --git a/drivers/i2c/chips/twl4030-madc.c b/drivers/i2c/chips/twl4030-madc.c index 19dacf5f706..89973819b61 100644 --- a/drivers/i2c/chips/twl4030-madc.c +++ b/drivers/i2c/chips/twl4030-madc.c @@ -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 = {