Commit f0566c0c authored by Lars-Peter Clausen's avatar Lars-Peter Clausen Committed by Jonathan Cameron

iio: Set device watermark based on watermark of all attached buffers

Currently the watermark of the device is only set based on the watermark
that is set for the user space buffer. This doesn't consider the watermarks
set on any attached in-kernel buffers.

Change this so that the watermark of the device should be the minimum of
the watermarks over all attached buffers.
Signed-off-by: default avatarLars-Peter Clausen <lars@metafoo.de>
Signed-off-by: default avatarJonathan Cameron <jic23@kernel.org>
parent 0d0e5384
...@@ -610,6 +610,7 @@ static void iio_free_scan_mask(struct iio_dev *indio_dev, ...@@ -610,6 +610,7 @@ static void iio_free_scan_mask(struct iio_dev *indio_dev,
struct iio_device_config { struct iio_device_config {
unsigned int mode; unsigned int mode;
unsigned int watermark;
const unsigned long *scan_mask; const unsigned long *scan_mask;
unsigned int scan_bytes; unsigned int scan_bytes;
bool scan_timestamp; bool scan_timestamp;
...@@ -642,10 +643,14 @@ static int iio_verify_update(struct iio_dev *indio_dev, ...@@ -642,10 +643,14 @@ static int iio_verify_update(struct iio_dev *indio_dev,
if (buffer == remove_buffer) if (buffer == remove_buffer)
continue; continue;
modes &= buffer->access->modes; modes &= buffer->access->modes;
config->watermark = min(config->watermark, buffer->watermark);
} }
if (insert_buffer) if (insert_buffer) {
modes &= insert_buffer->access->modes; modes &= insert_buffer->access->modes;
config->watermark = min(config->watermark,
insert_buffer->watermark);
}
/* Definitely possible for devices to support both of these. */ /* Definitely possible for devices to support both of these. */
if ((modes & INDIO_BUFFER_TRIGGERED) && indio_dev->trig) { if ((modes & INDIO_BUFFER_TRIGGERED) && indio_dev->trig) {
...@@ -743,6 +748,10 @@ static int iio_enable_buffers(struct iio_dev *indio_dev, ...@@ -743,6 +748,10 @@ static int iio_enable_buffers(struct iio_dev *indio_dev,
} }
} }
if (indio_dev->info->hwfifo_set_watermark)
indio_dev->info->hwfifo_set_watermark(indio_dev,
config->watermark);
indio_dev->currentmode = config->mode; indio_dev->currentmode = config->mode;
if (indio_dev->setup_ops->postenable) { if (indio_dev->setup_ops->postenable) {
...@@ -974,9 +983,6 @@ static ssize_t iio_buffer_store_watermark(struct device *dev, ...@@ -974,9 +983,6 @@ static ssize_t iio_buffer_store_watermark(struct device *dev,
} }
buffer->watermark = val; buffer->watermark = val;
if (indio_dev->info->hwfifo_set_watermark)
indio_dev->info->hwfifo_set_watermark(indio_dev, val);
out: out:
mutex_unlock(&indio_dev->mlock); mutex_unlock(&indio_dev->mlock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment