aboutsummaryrefslogtreecommitdiff
path: root/drivers/iio
diff options
context:
space:
mode:
authorBrian Wood <brian.j.wood@intel.com>2015-09-22 12:22:37 -0700
committerBrian Wood <brian.j.wood@intel.com>2015-09-22 12:22:37 -0700
commitaeeba7a2f1a6a4018d8ee95a8bb8fa930cafe3e3 (patch)
treeed794aad86a1095488246ed69c54cee43b405917 /drivers/iio
parentc2cfa513c405298280794a946fa70141ee7fc28f (diff)
parentf5af56b478111455ce9041d958b83f13bc742af6 (diff)
downloadedison-v3.10-aeeba7a2f1a6a4018d8ee95a8bb8fa930cafe3e3.tar.gz
Merge branch 'google_source_common' into edison-3.10.17
Conflicts: arch/arm/mm/mmu.c crypto/Makefile drivers/misc/Kconfig drivers/misc/Makefile drivers/mmc/core/core.c drivers/net/wireless/Kconfig drivers/power/power_supply_core.c drivers/staging/android/logger.c fs/ext4/ext4_jbd2.c fs/ext4/inode.c fs/ext4/super.c fs/ext4/xattr.c include/linux/mmc/host.h include/linux/wlan_plat.h kernel/futex.c kernel/power/process.c net/bluetooth/l2cap_core.c net/ipv4/raw.c net/wireless/nl80211.c
Diffstat (limited to 'drivers/iio')
-rw-r--r--drivers/iio/industrialio-event.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/drivers/iio/industrialio-event.c b/drivers/iio/industrialio-event.c
index 10aa9ef86ce..145c9861793 100644
--- a/drivers/iio/industrialio-event.c
+++ b/drivers/iio/industrialio-event.c
@@ -35,6 +35,7 @@
*/
struct iio_event_interface {
wait_queue_head_t wait;
+ struct mutex read_lock;
DECLARE_KFIFO(det_events, struct iio_event_data, 16);
struct list_head dev_attr_list;
@@ -97,14 +98,16 @@ static ssize_t iio_event_chrdev_read(struct file *filep,
if (count < sizeof(struct iio_event_data))
return -EINVAL;
- spin_lock_irq(&ev_int->wait.lock);
+ if (mutex_lock_interruptible(&ev_int->read_lock))
+ return -ERESTARTSYS;
+
if (kfifo_is_empty(&ev_int->det_events)) {
if (filep->f_flags & O_NONBLOCK) {
ret = -EAGAIN;
goto error_unlock;
}
/* Blocking on device; waiting for something to be there */
- ret = wait_event_interruptible_locked_irq(ev_int->wait,
+ ret = wait_event_interruptible(ev_int->wait,
!kfifo_is_empty(&ev_int->det_events));
if (ret)
goto error_unlock;
@@ -114,7 +117,7 @@ static ssize_t iio_event_chrdev_read(struct file *filep,
ret = kfifo_to_user(&ev_int->det_events, buf, count, &copied);
error_unlock:
- spin_unlock_irq(&ev_int->wait.lock);
+ mutex_unlock(&ev_int->read_lock);
return ret ? ret : copied;
}
@@ -371,6 +374,7 @@ static void iio_setup_ev_int(struct iio_event_interface *ev_int)
{
INIT_KFIFO(ev_int->det_events);
init_waitqueue_head(&ev_int->wait);
+ mutex_init(&ev_int->read_lock);
}
static const char *iio_event_group_name = "events";
@@ -434,6 +438,7 @@ int iio_device_register_eventset(struct iio_dev *indio_dev)
error_free_setup_event_lines:
__iio_remove_event_config_attrs(indio_dev);
+ mutex_destroy(&indio_dev->event_interface->read_lock);
kfree(indio_dev->event_interface);
error_ret:
@@ -446,5 +451,6 @@ void iio_device_unregister_eventset(struct iio_dev *indio_dev)
return;
__iio_remove_event_config_attrs(indio_dev);
kfree(indio_dev->event_interface->group.attrs);
+ mutex_destroy(&indio_dev->event_interface->read_lock);
kfree(indio_dev->event_interface);
}