staging:iio: core. Allow for event chrdev obtaining ioctl if no buffer present.
authorJonathan Cameron <jic23@cam.ac.uk>
Wed, 26 Oct 2011 16:27:45 +0000 (17:27 +0100)
committerGreg Kroah-Hartman <gregkh@suse.de>
Sun, 27 Nov 2011 00:30:31 +0000 (16:30 -0800)
Logic bug meant the chrdev would fail to open if there was no buffer support
in a driver or in the core. This meant the ioctl to get the event chrdev
would fail and hence events were not available.

V2: change error to -EINVAL to mark as unsuitable for reading rather than
not there.  Both are true depending on how you look at it.

Signed-off-by: Jonathan Cameron <jic23@cam.ac.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/iio/iio_core.h
drivers/staging/iio/industrialio-buffer.c

index 36159e0dbfc38cc7ae762dca9b88a2a3da9f9d6e..ff27f1360d9242171c3f52d3626549c3ed38fbef 100644 (file)
@@ -49,7 +49,7 @@ ssize_t iio_buffer_read_first_n_outer(struct file *filp, char __user *buf,
 
 static inline int iio_chrdev_buffer_open(struct iio_dev *indio_dev)
 {
-       return -EINVAL;
+       return 0;
 }
 
 static inline void iio_chrdev_buffer_release(struct iio_dev *indio_dev)
index 9df0ce81dadebce8d13f2e159669550637deab88..ecf1e2f6d2dc280e4b29749d8251710a18c91144 100644 (file)
@@ -43,7 +43,7 @@ ssize_t iio_buffer_read_first_n_outer(struct file *filp, char __user *buf,
        struct iio_dev *indio_dev = filp->private_data;
        struct iio_buffer *rb = indio_dev->buffer;
 
-       if (!rb->access->read_first_n)
+       if (!rb || !rb->access->read_first_n)
                return -EINVAL;
        return rb->access->read_first_n(rb, n, buf);
 }
@@ -68,7 +68,7 @@ int iio_chrdev_buffer_open(struct iio_dev *indio_dev)
 {
        struct iio_buffer *rb = indio_dev->buffer;
        if (!rb)
-               return -EINVAL;
+               return 0;
        if (rb->access->mark_in_use)
                rb->access->mark_in_use(rb);
        return 0;
@@ -78,6 +78,8 @@ void iio_chrdev_buffer_release(struct iio_dev *indio_dev)
 {
        struct iio_buffer *rb = indio_dev->buffer;
 
+       if (!rb)
+               return;
        clear_bit(IIO_BUSY_BIT_POS, &rb->flags);
        if (rb->access->unmark_in_use)
                rb->access->unmark_in_use(rb);