diff options
-rw-r--r-- | Documentation/ABI/testing/sysfs-bus-iio | 69 | ||||
-rw-r--r-- | drivers/iio/industrialio-buffer.c | 58 | ||||
-rw-r--r-- | include/linux/iio/iio.h | 13 |
3 files changed, 127 insertions, 13 deletions
diff --git a/Documentation/ABI/testing/sysfs-bus-iio b/Documentation/ABI/testing/sysfs-bus-iio index 0b6f0abf3370..6bf79072179f 100644 --- a/Documentation/ABI/testing/sysfs-bus-iio +++ b/Documentation/ABI/testing/sysfs-bus-iio | |||
@@ -1295,3 +1295,72 @@ Description: | |||
1295 | allows the application to block on poll with a timeout and read | 1295 | allows the application to block on poll with a timeout and read |
1296 | the available samples after the timeout expires and thus have a | 1296 | the available samples after the timeout expires and thus have a |
1297 | maximum delay guarantee. | 1297 | maximum delay guarantee. |
1298 | |||
1299 | What: /sys/bus/iio/devices/iio:deviceX/buffer/hwfifo_enabled | ||
1300 | KernelVersion: 4.2 | ||
1301 | Contact: linux-iio@vger.kernel.org | ||
1302 | Description: | ||
1303 | A read-only boolean value that indicates if the hardware fifo is | ||
1304 | currently enabled or disabled. If the device does not have a | ||
1305 | hardware fifo this entry is not present. | ||
1306 | The hardware fifo is enabled when the buffer is enabled if the | ||
1307 | current hardware fifo watermark level is set and other current | ||
1308 | device settings allows it (e.g. if a trigger is set that samples | ||
1309 | data differently that the hardware fifo does then hardware fifo | ||
1310 | will not enabled). | ||
1311 | If the hardware fifo is enabled and the level of the hardware | ||
1312 | fifo reaches the hardware fifo watermark level the device will | ||
1313 | flush its hardware fifo to the device buffer. Doing a non | ||
1314 | blocking read on the device when no samples are present in the | ||
1315 | device buffer will also force a flush. | ||
1316 | When the hardware fifo is enabled there is no need to use a | ||
1317 | trigger to use buffer mode since the watermark settings | ||
1318 | guarantees that the hardware fifo is flushed to the device | ||
1319 | buffer. | ||
1320 | |||
1321 | What: /sys/bus/iio/devices/iio:deviceX/buffer/hwfifo_watermark | ||
1322 | KernelVersion: 4.2 | ||
1323 | Contact: linux-iio@vger.kernel.org | ||
1324 | Description: | ||
1325 | Read-only entry that contains a single integer specifying the | ||
1326 | current watermark level for the hardware fifo. If the device | ||
1327 | does not have a hardware fifo this entry is not present. | ||
1328 | The watermark level for the hardware fifo is set by the driver | ||
1329 | based on the value set by the user in buffer/watermark but | ||
1330 | taking into account hardware limitations (e.g. most hardware | ||
1331 | buffers are limited to 32-64 samples, some hardware buffers | ||
1332 | watermarks are fixed or have minimum levels). A value of 0 | ||
1333 | means that the hardware watermark is unset. | ||
1334 | |||
1335 | What: /sys/bus/iio/devices/iio:deviceX/buffer/hwfifo_watermark_min | ||
1336 | KernelVersion: 4.2 | ||
1337 | Contact: linux-iio@vger.kernel.org | ||
1338 | Description: | ||
1339 | A single positive integer specifying the minimum watermark level | ||
1340 | for the hardware fifo of this device. If the device does not | ||
1341 | have a hardware fifo this entry is not present. | ||
1342 | If the user sets buffer/watermark to a value less than this one, | ||
1343 | then the hardware watermark will remain unset. | ||
1344 | |||
1345 | What: /sys/bus/iio/devices/iio:deviceX/buffer/hwfifo_watermark_max | ||
1346 | KernelVersion: 4.2 | ||
1347 | Contact: linux-iio@vger.kernel.org | ||
1348 | Description: | ||
1349 | A single positive integer specifying the maximum watermark level | ||
1350 | for the hardware fifo of this device. If the device does not | ||
1351 | have a hardware fifo this entry is not present. | ||
1352 | If the user sets buffer/watermark to a value greater than this | ||
1353 | one, then the hardware watermark will be capped at this value. | ||
1354 | |||
1355 | What: /sys/bus/iio/devices/iio:deviceX/buffer/hwfifo_watermark_available | ||
1356 | KernelVersion: 4.2 | ||
1357 | Contact: linux-iio@vger.kernel.org | ||
1358 | Description: | ||
1359 | A list of positive integers specifying the available watermark | ||
1360 | levels for the hardware fifo. This entry is optional and if it | ||
1361 | is not present it means that all the values between | ||
1362 | hwfifo_watermark_min and hwfifo_watermark_max are supported. | ||
1363 | If the user sets buffer/watermark to a value greater than | ||
1364 | hwfifo_watermak_min but not equal to any of the values in this | ||
1365 | list, the driver will chose an appropriate value for the | ||
1366 | hardware fifo watermark level. | ||
diff --git a/drivers/iio/industrialio-buffer.c b/drivers/iio/industrialio-buffer.c index a24b2e005eb3..df919f44d513 100644 --- a/drivers/iio/industrialio-buffer.c +++ b/drivers/iio/industrialio-buffer.c | |||
@@ -42,18 +42,47 @@ static size_t iio_buffer_data_available(struct iio_buffer *buf) | |||
42 | return buf->access->data_available(buf); | 42 | return buf->access->data_available(buf); |
43 | } | 43 | } |
44 | 44 | ||
45 | static int iio_buffer_flush_hwfifo(struct iio_dev *indio_dev, | ||
46 | struct iio_buffer *buf, size_t required) | ||
47 | { | ||
48 | if (!indio_dev->info->hwfifo_flush_to_buffer) | ||
49 | return -ENODEV; | ||
50 | |||
51 | return indio_dev->info->hwfifo_flush_to_buffer(indio_dev, required); | ||
52 | } | ||
53 | |||
45 | static bool iio_buffer_ready(struct iio_dev *indio_dev, struct iio_buffer *buf, | 54 | static bool iio_buffer_ready(struct iio_dev *indio_dev, struct iio_buffer *buf, |
46 | size_t to_wait) | 55 | size_t to_wait, int to_flush) |
47 | { | 56 | { |
57 | size_t avail; | ||
58 | int flushed = 0; | ||
59 | |||
48 | /* wakeup if the device was unregistered */ | 60 | /* wakeup if the device was unregistered */ |
49 | if (!indio_dev->info) | 61 | if (!indio_dev->info) |
50 | return true; | 62 | return true; |
51 | 63 | ||
52 | /* drain the buffer if it was disabled */ | 64 | /* drain the buffer if it was disabled */ |
53 | if (!iio_buffer_is_active(buf)) | 65 | if (!iio_buffer_is_active(buf)) { |
54 | to_wait = min_t(size_t, to_wait, 1); | 66 | to_wait = min_t(size_t, to_wait, 1); |
67 | to_flush = 0; | ||
68 | } | ||
69 | |||
70 | avail = iio_buffer_data_available(buf); | ||
55 | 71 | ||
56 | if (iio_buffer_data_available(buf) >= to_wait) | 72 | if (avail >= to_wait) { |
73 | /* force a flush for non-blocking reads */ | ||
74 | if (!to_wait && !avail && to_flush) | ||
75 | iio_buffer_flush_hwfifo(indio_dev, buf, to_flush); | ||
76 | return true; | ||
77 | } | ||
78 | |||
79 | if (to_flush) | ||
80 | flushed = iio_buffer_flush_hwfifo(indio_dev, buf, | ||
81 | to_wait - avail); | ||
82 | if (flushed <= 0) | ||
83 | return false; | ||
84 | |||
85 | if (avail + flushed >= to_wait) | ||
57 | return true; | 86 | return true; |
58 | 87 | ||
59 | return false; | 88 | return false; |
@@ -72,6 +101,7 @@ ssize_t iio_buffer_read_first_n_outer(struct file *filp, char __user *buf, | |||
72 | struct iio_buffer *rb = indio_dev->buffer; | 101 | struct iio_buffer *rb = indio_dev->buffer; |
73 | size_t datum_size; | 102 | size_t datum_size; |
74 | size_t to_wait = 0; | 103 | size_t to_wait = 0; |
104 | size_t to_read; | ||
75 | int ret; | 105 | int ret; |
76 | 106 | ||
77 | if (!indio_dev->info) | 107 | if (!indio_dev->info) |
@@ -89,12 +119,14 @@ ssize_t iio_buffer_read_first_n_outer(struct file *filp, char __user *buf, | |||
89 | if (!datum_size) | 119 | if (!datum_size) |
90 | return 0; | 120 | return 0; |
91 | 121 | ||
122 | to_read = min_t(size_t, n / datum_size, rb->watermark); | ||
123 | |||
92 | if (!(filp->f_flags & O_NONBLOCK)) | 124 | if (!(filp->f_flags & O_NONBLOCK)) |
93 | to_wait = min_t(size_t, n / datum_size, rb->watermark); | 125 | to_wait = to_read; |
94 | 126 | ||
95 | do { | 127 | do { |
96 | ret = wait_event_interruptible(rb->pollq, | 128 | ret = wait_event_interruptible(rb->pollq, |
97 | iio_buffer_ready(indio_dev, rb, to_wait)); | 129 | iio_buffer_ready(indio_dev, rb, to_wait, to_read)); |
98 | if (ret) | 130 | if (ret) |
99 | return ret; | 131 | return ret; |
100 | 132 | ||
@@ -122,7 +154,7 @@ unsigned int iio_buffer_poll(struct file *filp, | |||
122 | return -ENODEV; | 154 | return -ENODEV; |
123 | 155 | ||
124 | poll_wait(filp, &rb->pollq, wait); | 156 | poll_wait(filp, &rb->pollq, wait); |
125 | if (iio_buffer_ready(indio_dev, rb, rb->watermark)) | 157 | if (iio_buffer_ready(indio_dev, rb, rb->watermark, 0)) |
126 | return POLLIN | POLLRDNORM; | 158 | return POLLIN | POLLRDNORM; |
127 | return 0; | 159 | return 0; |
128 | } | 160 | } |
@@ -661,19 +693,16 @@ static int __iio_update_buffers(struct iio_dev *indio_dev, | |||
661 | } | 693 | } |
662 | } | 694 | } |
663 | /* Definitely possible for devices to support both of these. */ | 695 | /* Definitely possible for devices to support both of these. */ |
664 | if (indio_dev->modes & INDIO_BUFFER_TRIGGERED) { | 696 | if ((indio_dev->modes & INDIO_BUFFER_TRIGGERED) && indio_dev->trig) { |
665 | if (!indio_dev->trig) { | ||
666 | printk(KERN_INFO "Buffer not started: no trigger\n"); | ||
667 | ret = -EINVAL; | ||
668 | /* Can only occur on first buffer */ | ||
669 | goto error_run_postdisable; | ||
670 | } | ||
671 | indio_dev->currentmode = INDIO_BUFFER_TRIGGERED; | 697 | indio_dev->currentmode = INDIO_BUFFER_TRIGGERED; |
672 | } else if (indio_dev->modes & INDIO_BUFFER_HARDWARE) { | 698 | } else if (indio_dev->modes & INDIO_BUFFER_HARDWARE) { |
673 | indio_dev->currentmode = INDIO_BUFFER_HARDWARE; | 699 | indio_dev->currentmode = INDIO_BUFFER_HARDWARE; |
674 | } else if (indio_dev->modes & INDIO_BUFFER_SOFTWARE) { | 700 | } else if (indio_dev->modes & INDIO_BUFFER_SOFTWARE) { |
675 | indio_dev->currentmode = INDIO_BUFFER_SOFTWARE; | 701 | indio_dev->currentmode = INDIO_BUFFER_SOFTWARE; |
676 | } else { /* Should never be reached */ | 702 | } else { /* Should never be reached */ |
703 | /* Can only occur on first buffer */ | ||
704 | if (indio_dev->modes & INDIO_BUFFER_TRIGGERED) | ||
705 | pr_info("Buffer not started: no trigger\n"); | ||
677 | ret = -EINVAL; | 706 | ret = -EINVAL; |
678 | goto error_run_postdisable; | 707 | goto error_run_postdisable; |
679 | } | 708 | } |
@@ -825,6 +854,9 @@ static ssize_t iio_buffer_store_watermark(struct device *dev, | |||
825 | } | 854 | } |
826 | 855 | ||
827 | buffer->watermark = val; | 856 | buffer->watermark = val; |
857 | |||
858 | if (indio_dev->info->hwfifo_set_watermark) | ||
859 | indio_dev->info->hwfifo_set_watermark(indio_dev, val); | ||
828 | out: | 860 | out: |
829 | mutex_unlock(&indio_dev->mlock); | 861 | mutex_unlock(&indio_dev->mlock); |
830 | 862 | ||
diff --git a/include/linux/iio/iio.h b/include/linux/iio/iio.h index 80d855061064..d86b753e9b30 100644 --- a/include/linux/iio/iio.h +++ b/include/linux/iio/iio.h | |||
@@ -338,6 +338,16 @@ struct iio_dev; | |||
338 | * provide a custom of_xlate function that reads the | 338 | * provide a custom of_xlate function that reads the |
339 | * *args* and returns the appropriate index in registered | 339 | * *args* and returns the appropriate index in registered |
340 | * IIO channels array. | 340 | * IIO channels array. |
341 | * @hwfifo_set_watermark: function pointer to set the current hardware | ||
342 | * fifo watermark level; see hwfifo_* entries in | ||
343 | * Documentation/ABI/testing/sysfs-bus-iio for details on | ||
344 | * how the hardware fifo operates | ||
345 | * @hwfifo_flush_to_buffer: function pointer to flush the samples stored | ||
346 | * in the hardware fifo to the device buffer. The driver | ||
347 | * should not flush more than count samples. The function | ||
348 | * must return the number of samples flushed, 0 if no | ||
349 | * samples were flushed or a negative integer if no samples | ||
350 | * were flushed and there was an error. | ||
341 | **/ | 351 | **/ |
342 | struct iio_info { | 352 | struct iio_info { |
343 | struct module *driver_module; | 353 | struct module *driver_module; |
@@ -399,6 +409,9 @@ struct iio_info { | |||
399 | unsigned *readval); | 409 | unsigned *readval); |
400 | int (*of_xlate)(struct iio_dev *indio_dev, | 410 | int (*of_xlate)(struct iio_dev *indio_dev, |
401 | const struct of_phandle_args *iiospec); | 411 | const struct of_phandle_args *iiospec); |
412 | int (*hwfifo_set_watermark)(struct iio_dev *indio_dev, unsigned val); | ||
413 | int (*hwfifo_flush_to_buffer)(struct iio_dev *indio_dev, | ||
414 | unsigned count); | ||
402 | }; | 415 | }; |
403 | 416 | ||
404 | /** | 417 | /** |