diff options
author | Brian Wood <brian.j.wood@intel.com> | 2015-09-22 12:22:37 -0700 |
---|---|---|
committer | Brian Wood <brian.j.wood@intel.com> | 2015-09-22 12:22:37 -0700 |
commit | aeeba7a2f1a6a4018d8ee95a8bb8fa930cafe3e3 (patch) | |
tree | ed794aad86a1095488246ed69c54cee43b405917 /drivers/iio | |
parent | c2cfa513c405298280794a946fa70141ee7fc28f (diff) | |
parent | f5af56b478111455ce9041d958b83f13bc742af6 (diff) | |
download | edison-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.c | 12 |
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); } |