aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatt Ranostay <mranostay@gmail.com>2016-08-19 23:17:02 -0400
committerJonathan Cameron <jic23@kernel.org>2016-08-21 06:47:19 -0400
commitadca058b56108eb3458165c6a9e5d78558be8b52 (patch)
tree979cca3ed01fb1ea688b170d34e0d7bfdc5d30a4
parenta4fa6509dda47e51c3582409e8630b24702970c5 (diff)
iio: buffer-callback: allow getting underlying iio_dev
Add iio_channel_cb_get_iio_dev function to allow getting the underlying iio_dev. This is useful for setting the trigger of the consumer ADC device. Signed-off-by: Matt Ranostay <mranostay@gmail.com> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
-rw-r--r--drivers/iio/buffer/industrialio-buffer-cb.c24
-rw-r--r--include/linux/iio/consumer.h12
2 files changed, 26 insertions, 10 deletions
diff --git a/drivers/iio/buffer/industrialio-buffer-cb.c b/drivers/iio/buffer/industrialio-buffer-cb.c
index 323079c3ccce..b8f550e47d3d 100644
--- a/drivers/iio/buffer/industrialio-buffer-cb.c
+++ b/drivers/iio/buffer/industrialio-buffer-cb.c
@@ -18,6 +18,7 @@ struct iio_cb_buffer {
18 int (*cb)(const void *data, void *private); 18 int (*cb)(const void *data, void *private);
19 void *private; 19 void *private;
20 struct iio_channel *channels; 20 struct iio_channel *channels;
21 struct iio_dev *indio_dev;
21}; 22};
22 23
23static struct iio_cb_buffer *buffer_to_cb_buffer(struct iio_buffer *buffer) 24static struct iio_cb_buffer *buffer_to_cb_buffer(struct iio_buffer *buffer)
@@ -52,7 +53,6 @@ struct iio_cb_buffer *iio_channel_get_all_cb(struct device *dev,
52{ 53{
53 int ret; 54 int ret;
54 struct iio_cb_buffer *cb_buff; 55 struct iio_cb_buffer *cb_buff;
55 struct iio_dev *indio_dev;
56 struct iio_channel *chan; 56 struct iio_channel *chan;
57 57
58 cb_buff = kzalloc(sizeof(*cb_buff), GFP_KERNEL); 58 cb_buff = kzalloc(sizeof(*cb_buff), GFP_KERNEL);
@@ -72,17 +72,17 @@ struct iio_cb_buffer *iio_channel_get_all_cb(struct device *dev,
72 goto error_free_cb_buff; 72 goto error_free_cb_buff;
73 } 73 }
74 74
75 indio_dev = cb_buff->channels[0].indio_dev; 75 cb_buff->indio_dev = cb_buff->channels[0].indio_dev;
76 cb_buff->buffer.scan_mask 76 cb_buff->buffer.scan_mask
77 = kcalloc(BITS_TO_LONGS(indio_dev->masklength), sizeof(long), 77 = kcalloc(BITS_TO_LONGS(cb_buff->indio_dev->masklength),
78 GFP_KERNEL); 78 sizeof(long), GFP_KERNEL);
79 if (cb_buff->buffer.scan_mask == NULL) { 79 if (cb_buff->buffer.scan_mask == NULL) {
80 ret = -ENOMEM; 80 ret = -ENOMEM;
81 goto error_release_channels; 81 goto error_release_channels;
82 } 82 }
83 chan = &cb_buff->channels[0]; 83 chan = &cb_buff->channels[0];
84 while (chan->indio_dev) { 84 while (chan->indio_dev) {
85 if (chan->indio_dev != indio_dev) { 85 if (chan->indio_dev != cb_buff->indio_dev) {
86 ret = -EINVAL; 86 ret = -EINVAL;
87 goto error_free_scan_mask; 87 goto error_free_scan_mask;
88 } 88 }
@@ -105,17 +105,14 @@ EXPORT_SYMBOL_GPL(iio_channel_get_all_cb);
105 105
106int iio_channel_start_all_cb(struct iio_cb_buffer *cb_buff) 106int iio_channel_start_all_cb(struct iio_cb_buffer *cb_buff)
107{ 107{
108 return iio_update_buffers(cb_buff->channels[0].indio_dev, 108 return iio_update_buffers(cb_buff->indio_dev, &cb_buff->buffer,
109 &cb_buff->buffer,
110 NULL); 109 NULL);
111} 110}
112EXPORT_SYMBOL_GPL(iio_channel_start_all_cb); 111EXPORT_SYMBOL_GPL(iio_channel_start_all_cb);
113 112
114void iio_channel_stop_all_cb(struct iio_cb_buffer *cb_buff) 113void iio_channel_stop_all_cb(struct iio_cb_buffer *cb_buff)
115{ 114{
116 iio_update_buffers(cb_buff->channels[0].indio_dev, 115 iio_update_buffers(cb_buff->indio_dev, NULL, &cb_buff->buffer);
117 NULL,
118 &cb_buff->buffer);
119} 116}
120EXPORT_SYMBOL_GPL(iio_channel_stop_all_cb); 117EXPORT_SYMBOL_GPL(iio_channel_stop_all_cb);
121 118
@@ -133,6 +130,13 @@ struct iio_channel
133} 130}
134EXPORT_SYMBOL_GPL(iio_channel_cb_get_channels); 131EXPORT_SYMBOL_GPL(iio_channel_cb_get_channels);
135 132
133struct iio_dev
134*iio_channel_cb_get_iio_dev(const struct iio_cb_buffer *cb_buffer)
135{
136 return cb_buffer->indio_dev;
137}
138EXPORT_SYMBOL_GPL(iio_channel_cb_get_iio_dev);
139
136MODULE_AUTHOR("Jonathan Cameron <jic23@kernel.org>"); 140MODULE_AUTHOR("Jonathan Cameron <jic23@kernel.org>");
137MODULE_DESCRIPTION("Industrial I/O callback buffer"); 141MODULE_DESCRIPTION("Industrial I/O callback buffer");
138MODULE_LICENSE("GPL"); 142MODULE_LICENSE("GPL");
diff --git a/include/linux/iio/consumer.h b/include/linux/iio/consumer.h
index 3d672f72e7ec..9edccfba1ffb 100644
--- a/include/linux/iio/consumer.h
+++ b/include/linux/iio/consumer.h
@@ -165,6 +165,18 @@ struct iio_channel
165*iio_channel_cb_get_channels(const struct iio_cb_buffer *cb_buffer); 165*iio_channel_cb_get_channels(const struct iio_cb_buffer *cb_buffer);
166 166
167/** 167/**
168 * iio_channel_cb_get_iio_dev() - get access to the underlying device.
169 * @cb_buffer: The callback buffer from whom we want the device
170 * information.
171 *
172 * This function allows one to obtain information about the device.
173 * The primary aim is to allow drivers that are consuming a device to query
174 * things like current trigger.
175 */
176struct iio_dev
177*iio_channel_cb_get_iio_dev(const struct iio_cb_buffer *cb_buffer);
178
179/**
168 * iio_read_channel_raw() - read from a given channel 180 * iio_read_channel_raw() - read from a given channel
169 * @chan: The channel being queried. 181 * @chan: The channel being queried.
170 * @val: Value read back. 182 * @val: Value read back.