1*a980e046SJonathan Cameron /* The industrial I/O core 2*a980e046SJonathan Cameron * 3*a980e046SJonathan Cameron * Copyright (c) 2008 Jonathan Cameron 4*a980e046SJonathan Cameron * 5*a980e046SJonathan Cameron * This program is free software; you can redistribute it and/or modify it 6*a980e046SJonathan Cameron * under the terms of the GNU General Public License version 2 as published by 7*a980e046SJonathan Cameron * the Free Software Foundation. 8*a980e046SJonathan Cameron * 9*a980e046SJonathan Cameron * Handling of buffer allocation / resizing. 10*a980e046SJonathan Cameron * 11*a980e046SJonathan Cameron * 12*a980e046SJonathan Cameron * Things to look at here. 13*a980e046SJonathan Cameron * - Better memory allocation techniques? 14*a980e046SJonathan Cameron * - Alternative access techniques? 15*a980e046SJonathan Cameron */ 16*a980e046SJonathan Cameron #include <linux/kernel.h> 17*a980e046SJonathan Cameron #include <linux/export.h> 18*a980e046SJonathan Cameron #include <linux/device.h> 19*a980e046SJonathan Cameron #include <linux/fs.h> 20*a980e046SJonathan Cameron #include <linux/cdev.h> 21*a980e046SJonathan Cameron #include <linux/slab.h> 22*a980e046SJonathan Cameron #include <linux/poll.h> 23*a980e046SJonathan Cameron 24*a980e046SJonathan Cameron #include <linux/iio/iio.h> 25*a980e046SJonathan Cameron #include "iio_core.h" 26*a980e046SJonathan Cameron #include <linux/iio/sysfs.h> 27*a980e046SJonathan Cameron #include <linux/iio/buffer.h> 28*a980e046SJonathan Cameron 29*a980e046SJonathan Cameron static const char * const iio_endian_prefix[] = { 30*a980e046SJonathan Cameron [IIO_BE] = "be", 31*a980e046SJonathan Cameron [IIO_LE] = "le", 32*a980e046SJonathan Cameron }; 33*a980e046SJonathan Cameron 34*a980e046SJonathan Cameron /** 35*a980e046SJonathan Cameron * iio_buffer_read_first_n_outer() - chrdev read for buffer access 36*a980e046SJonathan Cameron * 37*a980e046SJonathan Cameron * This function relies on all buffer implementations having an 38*a980e046SJonathan Cameron * iio_buffer as their first element. 39*a980e046SJonathan Cameron **/ 40*a980e046SJonathan Cameron ssize_t iio_buffer_read_first_n_outer(struct file *filp, char __user *buf, 41*a980e046SJonathan Cameron size_t n, loff_t *f_ps) 42*a980e046SJonathan Cameron { 43*a980e046SJonathan Cameron struct iio_dev *indio_dev = filp->private_data; 44*a980e046SJonathan Cameron struct iio_buffer *rb = indio_dev->buffer; 45*a980e046SJonathan Cameron 46*a980e046SJonathan Cameron if (!rb || !rb->access->read_first_n) 47*a980e046SJonathan Cameron return -EINVAL; 48*a980e046SJonathan Cameron return rb->access->read_first_n(rb, n, buf); 49*a980e046SJonathan Cameron } 50*a980e046SJonathan Cameron 51*a980e046SJonathan Cameron /** 52*a980e046SJonathan Cameron * iio_buffer_poll() - poll the buffer to find out if it has data 53*a980e046SJonathan Cameron */ 54*a980e046SJonathan Cameron unsigned int iio_buffer_poll(struct file *filp, 55*a980e046SJonathan Cameron struct poll_table_struct *wait) 56*a980e046SJonathan Cameron { 57*a980e046SJonathan Cameron struct iio_dev *indio_dev = filp->private_data; 58*a980e046SJonathan Cameron struct iio_buffer *rb = indio_dev->buffer; 59*a980e046SJonathan Cameron 60*a980e046SJonathan Cameron poll_wait(filp, &rb->pollq, wait); 61*a980e046SJonathan Cameron if (rb->stufftoread) 62*a980e046SJonathan Cameron return POLLIN | POLLRDNORM; 63*a980e046SJonathan Cameron /* need a way of knowing if there may be enough data... */ 64*a980e046SJonathan Cameron return 0; 65*a980e046SJonathan Cameron } 66*a980e046SJonathan Cameron 67*a980e046SJonathan Cameron void iio_buffer_init(struct iio_buffer *buffer) 68*a980e046SJonathan Cameron { 69*a980e046SJonathan Cameron INIT_LIST_HEAD(&buffer->demux_list); 70*a980e046SJonathan Cameron init_waitqueue_head(&buffer->pollq); 71*a980e046SJonathan Cameron } 72*a980e046SJonathan Cameron EXPORT_SYMBOL(iio_buffer_init); 73*a980e046SJonathan Cameron 74*a980e046SJonathan Cameron static ssize_t iio_show_scan_index(struct device *dev, 75*a980e046SJonathan Cameron struct device_attribute *attr, 76*a980e046SJonathan Cameron char *buf) 77*a980e046SJonathan Cameron { 78*a980e046SJonathan Cameron return sprintf(buf, "%u\n", to_iio_dev_attr(attr)->c->scan_index); 79*a980e046SJonathan Cameron } 80*a980e046SJonathan Cameron 81*a980e046SJonathan Cameron static ssize_t iio_show_fixed_type(struct device *dev, 82*a980e046SJonathan Cameron struct device_attribute *attr, 83*a980e046SJonathan Cameron char *buf) 84*a980e046SJonathan Cameron { 85*a980e046SJonathan Cameron struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); 86*a980e046SJonathan Cameron u8 type = this_attr->c->scan_type.endianness; 87*a980e046SJonathan Cameron 88*a980e046SJonathan Cameron if (type == IIO_CPU) { 89*a980e046SJonathan Cameron #ifdef __LITTLE_ENDIAN 90*a980e046SJonathan Cameron type = IIO_LE; 91*a980e046SJonathan Cameron #else 92*a980e046SJonathan Cameron type = IIO_BE; 93*a980e046SJonathan Cameron #endif 94*a980e046SJonathan Cameron } 95*a980e046SJonathan Cameron return sprintf(buf, "%s:%c%d/%d>>%u\n", 96*a980e046SJonathan Cameron iio_endian_prefix[type], 97*a980e046SJonathan Cameron this_attr->c->scan_type.sign, 98*a980e046SJonathan Cameron this_attr->c->scan_type.realbits, 99*a980e046SJonathan Cameron this_attr->c->scan_type.storagebits, 100*a980e046SJonathan Cameron this_attr->c->scan_type.shift); 101*a980e046SJonathan Cameron } 102*a980e046SJonathan Cameron 103*a980e046SJonathan Cameron static ssize_t iio_scan_el_show(struct device *dev, 104*a980e046SJonathan Cameron struct device_attribute *attr, 105*a980e046SJonathan Cameron char *buf) 106*a980e046SJonathan Cameron { 107*a980e046SJonathan Cameron int ret; 108*a980e046SJonathan Cameron struct iio_dev *indio_dev = dev_get_drvdata(dev); 109*a980e046SJonathan Cameron 110*a980e046SJonathan Cameron ret = test_bit(to_iio_dev_attr(attr)->address, 111*a980e046SJonathan Cameron indio_dev->buffer->scan_mask); 112*a980e046SJonathan Cameron 113*a980e046SJonathan Cameron return sprintf(buf, "%d\n", ret); 114*a980e046SJonathan Cameron } 115*a980e046SJonathan Cameron 116*a980e046SJonathan Cameron static int iio_scan_mask_clear(struct iio_buffer *buffer, int bit) 117*a980e046SJonathan Cameron { 118*a980e046SJonathan Cameron clear_bit(bit, buffer->scan_mask); 119*a980e046SJonathan Cameron return 0; 120*a980e046SJonathan Cameron } 121*a980e046SJonathan Cameron 122*a980e046SJonathan Cameron static ssize_t iio_scan_el_store(struct device *dev, 123*a980e046SJonathan Cameron struct device_attribute *attr, 124*a980e046SJonathan Cameron const char *buf, 125*a980e046SJonathan Cameron size_t len) 126*a980e046SJonathan Cameron { 127*a980e046SJonathan Cameron int ret; 128*a980e046SJonathan Cameron bool state; 129*a980e046SJonathan Cameron struct iio_dev *indio_dev = dev_get_drvdata(dev); 130*a980e046SJonathan Cameron struct iio_buffer *buffer = indio_dev->buffer; 131*a980e046SJonathan Cameron struct iio_dev_attr *this_attr = to_iio_dev_attr(attr); 132*a980e046SJonathan Cameron 133*a980e046SJonathan Cameron ret = strtobool(buf, &state); 134*a980e046SJonathan Cameron if (ret < 0) 135*a980e046SJonathan Cameron return ret; 136*a980e046SJonathan Cameron mutex_lock(&indio_dev->mlock); 137*a980e046SJonathan Cameron if (iio_buffer_enabled(indio_dev)) { 138*a980e046SJonathan Cameron ret = -EBUSY; 139*a980e046SJonathan Cameron goto error_ret; 140*a980e046SJonathan Cameron } 141*a980e046SJonathan Cameron ret = iio_scan_mask_query(indio_dev, buffer, this_attr->address); 142*a980e046SJonathan Cameron if (ret < 0) 143*a980e046SJonathan Cameron goto error_ret; 144*a980e046SJonathan Cameron if (!state && ret) { 145*a980e046SJonathan Cameron ret = iio_scan_mask_clear(buffer, this_attr->address); 146*a980e046SJonathan Cameron if (ret) 147*a980e046SJonathan Cameron goto error_ret; 148*a980e046SJonathan Cameron } else if (state && !ret) { 149*a980e046SJonathan Cameron ret = iio_scan_mask_set(indio_dev, buffer, this_attr->address); 150*a980e046SJonathan Cameron if (ret) 151*a980e046SJonathan Cameron goto error_ret; 152*a980e046SJonathan Cameron } 153*a980e046SJonathan Cameron 154*a980e046SJonathan Cameron error_ret: 155*a980e046SJonathan Cameron mutex_unlock(&indio_dev->mlock); 156*a980e046SJonathan Cameron 157*a980e046SJonathan Cameron return ret < 0 ? ret : len; 158*a980e046SJonathan Cameron 159*a980e046SJonathan Cameron } 160*a980e046SJonathan Cameron 161*a980e046SJonathan Cameron static ssize_t iio_scan_el_ts_show(struct device *dev, 162*a980e046SJonathan Cameron struct device_attribute *attr, 163*a980e046SJonathan Cameron char *buf) 164*a980e046SJonathan Cameron { 165*a980e046SJonathan Cameron struct iio_dev *indio_dev = dev_get_drvdata(dev); 166*a980e046SJonathan Cameron return sprintf(buf, "%d\n", indio_dev->buffer->scan_timestamp); 167*a980e046SJonathan Cameron } 168*a980e046SJonathan Cameron 169*a980e046SJonathan Cameron static ssize_t iio_scan_el_ts_store(struct device *dev, 170*a980e046SJonathan Cameron struct device_attribute *attr, 171*a980e046SJonathan Cameron const char *buf, 172*a980e046SJonathan Cameron size_t len) 173*a980e046SJonathan Cameron { 174*a980e046SJonathan Cameron int ret; 175*a980e046SJonathan Cameron struct iio_dev *indio_dev = dev_get_drvdata(dev); 176*a980e046SJonathan Cameron bool state; 177*a980e046SJonathan Cameron 178*a980e046SJonathan Cameron ret = strtobool(buf, &state); 179*a980e046SJonathan Cameron if (ret < 0) 180*a980e046SJonathan Cameron return ret; 181*a980e046SJonathan Cameron 182*a980e046SJonathan Cameron mutex_lock(&indio_dev->mlock); 183*a980e046SJonathan Cameron if (iio_buffer_enabled(indio_dev)) { 184*a980e046SJonathan Cameron ret = -EBUSY; 185*a980e046SJonathan Cameron goto error_ret; 186*a980e046SJonathan Cameron } 187*a980e046SJonathan Cameron indio_dev->buffer->scan_timestamp = state; 188*a980e046SJonathan Cameron indio_dev->scan_timestamp = state; 189*a980e046SJonathan Cameron error_ret: 190*a980e046SJonathan Cameron mutex_unlock(&indio_dev->mlock); 191*a980e046SJonathan Cameron 192*a980e046SJonathan Cameron return ret ? ret : len; 193*a980e046SJonathan Cameron } 194*a980e046SJonathan Cameron 195*a980e046SJonathan Cameron static int iio_buffer_add_channel_sysfs(struct iio_dev *indio_dev, 196*a980e046SJonathan Cameron const struct iio_chan_spec *chan) 197*a980e046SJonathan Cameron { 198*a980e046SJonathan Cameron int ret, attrcount = 0; 199*a980e046SJonathan Cameron struct iio_buffer *buffer = indio_dev->buffer; 200*a980e046SJonathan Cameron 201*a980e046SJonathan Cameron ret = __iio_add_chan_devattr("index", 202*a980e046SJonathan Cameron chan, 203*a980e046SJonathan Cameron &iio_show_scan_index, 204*a980e046SJonathan Cameron NULL, 205*a980e046SJonathan Cameron 0, 206*a980e046SJonathan Cameron 0, 207*a980e046SJonathan Cameron &indio_dev->dev, 208*a980e046SJonathan Cameron &buffer->scan_el_dev_attr_list); 209*a980e046SJonathan Cameron if (ret) 210*a980e046SJonathan Cameron goto error_ret; 211*a980e046SJonathan Cameron attrcount++; 212*a980e046SJonathan Cameron ret = __iio_add_chan_devattr("type", 213*a980e046SJonathan Cameron chan, 214*a980e046SJonathan Cameron &iio_show_fixed_type, 215*a980e046SJonathan Cameron NULL, 216*a980e046SJonathan Cameron 0, 217*a980e046SJonathan Cameron 0, 218*a980e046SJonathan Cameron &indio_dev->dev, 219*a980e046SJonathan Cameron &buffer->scan_el_dev_attr_list); 220*a980e046SJonathan Cameron if (ret) 221*a980e046SJonathan Cameron goto error_ret; 222*a980e046SJonathan Cameron attrcount++; 223*a980e046SJonathan Cameron if (chan->type != IIO_TIMESTAMP) 224*a980e046SJonathan Cameron ret = __iio_add_chan_devattr("en", 225*a980e046SJonathan Cameron chan, 226*a980e046SJonathan Cameron &iio_scan_el_show, 227*a980e046SJonathan Cameron &iio_scan_el_store, 228*a980e046SJonathan Cameron chan->scan_index, 229*a980e046SJonathan Cameron 0, 230*a980e046SJonathan Cameron &indio_dev->dev, 231*a980e046SJonathan Cameron &buffer->scan_el_dev_attr_list); 232*a980e046SJonathan Cameron else 233*a980e046SJonathan Cameron ret = __iio_add_chan_devattr("en", 234*a980e046SJonathan Cameron chan, 235*a980e046SJonathan Cameron &iio_scan_el_ts_show, 236*a980e046SJonathan Cameron &iio_scan_el_ts_store, 237*a980e046SJonathan Cameron chan->scan_index, 238*a980e046SJonathan Cameron 0, 239*a980e046SJonathan Cameron &indio_dev->dev, 240*a980e046SJonathan Cameron &buffer->scan_el_dev_attr_list); 241*a980e046SJonathan Cameron attrcount++; 242*a980e046SJonathan Cameron ret = attrcount; 243*a980e046SJonathan Cameron error_ret: 244*a980e046SJonathan Cameron return ret; 245*a980e046SJonathan Cameron } 246*a980e046SJonathan Cameron 247*a980e046SJonathan Cameron static void iio_buffer_remove_and_free_scan_dev_attr(struct iio_dev *indio_dev, 248*a980e046SJonathan Cameron struct iio_dev_attr *p) 249*a980e046SJonathan Cameron { 250*a980e046SJonathan Cameron kfree(p->dev_attr.attr.name); 251*a980e046SJonathan Cameron kfree(p); 252*a980e046SJonathan Cameron } 253*a980e046SJonathan Cameron 254*a980e046SJonathan Cameron static void __iio_buffer_attr_cleanup(struct iio_dev *indio_dev) 255*a980e046SJonathan Cameron { 256*a980e046SJonathan Cameron struct iio_dev_attr *p, *n; 257*a980e046SJonathan Cameron struct iio_buffer *buffer = indio_dev->buffer; 258*a980e046SJonathan Cameron 259*a980e046SJonathan Cameron list_for_each_entry_safe(p, n, 260*a980e046SJonathan Cameron &buffer->scan_el_dev_attr_list, l) 261*a980e046SJonathan Cameron iio_buffer_remove_and_free_scan_dev_attr(indio_dev, p); 262*a980e046SJonathan Cameron } 263*a980e046SJonathan Cameron 264*a980e046SJonathan Cameron static const char * const iio_scan_elements_group_name = "scan_elements"; 265*a980e046SJonathan Cameron 266*a980e046SJonathan Cameron int iio_buffer_register(struct iio_dev *indio_dev, 267*a980e046SJonathan Cameron const struct iio_chan_spec *channels, 268*a980e046SJonathan Cameron int num_channels) 269*a980e046SJonathan Cameron { 270*a980e046SJonathan Cameron struct iio_dev_attr *p; 271*a980e046SJonathan Cameron struct attribute **attr; 272*a980e046SJonathan Cameron struct iio_buffer *buffer = indio_dev->buffer; 273*a980e046SJonathan Cameron int ret, i, attrn, attrcount, attrcount_orig = 0; 274*a980e046SJonathan Cameron 275*a980e046SJonathan Cameron if (buffer->attrs) 276*a980e046SJonathan Cameron indio_dev->groups[indio_dev->groupcounter++] = buffer->attrs; 277*a980e046SJonathan Cameron 278*a980e046SJonathan Cameron if (buffer->scan_el_attrs != NULL) { 279*a980e046SJonathan Cameron attr = buffer->scan_el_attrs->attrs; 280*a980e046SJonathan Cameron while (*attr++ != NULL) 281*a980e046SJonathan Cameron attrcount_orig++; 282*a980e046SJonathan Cameron } 283*a980e046SJonathan Cameron attrcount = attrcount_orig; 284*a980e046SJonathan Cameron INIT_LIST_HEAD(&buffer->scan_el_dev_attr_list); 285*a980e046SJonathan Cameron if (channels) { 286*a980e046SJonathan Cameron /* new magic */ 287*a980e046SJonathan Cameron for (i = 0; i < num_channels; i++) { 288*a980e046SJonathan Cameron /* Establish necessary mask length */ 289*a980e046SJonathan Cameron if (channels[i].scan_index > 290*a980e046SJonathan Cameron (int)indio_dev->masklength - 1) 291*a980e046SJonathan Cameron indio_dev->masklength 292*a980e046SJonathan Cameron = indio_dev->channels[i].scan_index + 1; 293*a980e046SJonathan Cameron 294*a980e046SJonathan Cameron ret = iio_buffer_add_channel_sysfs(indio_dev, 295*a980e046SJonathan Cameron &channels[i]); 296*a980e046SJonathan Cameron if (ret < 0) 297*a980e046SJonathan Cameron goto error_cleanup_dynamic; 298*a980e046SJonathan Cameron attrcount += ret; 299*a980e046SJonathan Cameron if (channels[i].type == IIO_TIMESTAMP) 300*a980e046SJonathan Cameron indio_dev->scan_index_timestamp = 301*a980e046SJonathan Cameron channels[i].scan_index; 302*a980e046SJonathan Cameron } 303*a980e046SJonathan Cameron if (indio_dev->masklength && buffer->scan_mask == NULL) { 304*a980e046SJonathan Cameron buffer->scan_mask = kcalloc(BITS_TO_LONGS(indio_dev->masklength), 305*a980e046SJonathan Cameron sizeof(*buffer->scan_mask), 306*a980e046SJonathan Cameron GFP_KERNEL); 307*a980e046SJonathan Cameron if (buffer->scan_mask == NULL) { 308*a980e046SJonathan Cameron ret = -ENOMEM; 309*a980e046SJonathan Cameron goto error_cleanup_dynamic; 310*a980e046SJonathan Cameron } 311*a980e046SJonathan Cameron } 312*a980e046SJonathan Cameron } 313*a980e046SJonathan Cameron 314*a980e046SJonathan Cameron buffer->scan_el_group.name = iio_scan_elements_group_name; 315*a980e046SJonathan Cameron 316*a980e046SJonathan Cameron buffer->scan_el_group.attrs = kcalloc(attrcount + 1, 317*a980e046SJonathan Cameron sizeof(buffer->scan_el_group.attrs[0]), 318*a980e046SJonathan Cameron GFP_KERNEL); 319*a980e046SJonathan Cameron if (buffer->scan_el_group.attrs == NULL) { 320*a980e046SJonathan Cameron ret = -ENOMEM; 321*a980e046SJonathan Cameron goto error_free_scan_mask; 322*a980e046SJonathan Cameron } 323*a980e046SJonathan Cameron if (buffer->scan_el_attrs) 324*a980e046SJonathan Cameron memcpy(buffer->scan_el_group.attrs, buffer->scan_el_attrs, 325*a980e046SJonathan Cameron sizeof(buffer->scan_el_group.attrs[0])*attrcount_orig); 326*a980e046SJonathan Cameron attrn = attrcount_orig; 327*a980e046SJonathan Cameron 328*a980e046SJonathan Cameron list_for_each_entry(p, &buffer->scan_el_dev_attr_list, l) 329*a980e046SJonathan Cameron buffer->scan_el_group.attrs[attrn++] = &p->dev_attr.attr; 330*a980e046SJonathan Cameron indio_dev->groups[indio_dev->groupcounter++] = &buffer->scan_el_group; 331*a980e046SJonathan Cameron 332*a980e046SJonathan Cameron return 0; 333*a980e046SJonathan Cameron 334*a980e046SJonathan Cameron error_free_scan_mask: 335*a980e046SJonathan Cameron kfree(buffer->scan_mask); 336*a980e046SJonathan Cameron error_cleanup_dynamic: 337*a980e046SJonathan Cameron __iio_buffer_attr_cleanup(indio_dev); 338*a980e046SJonathan Cameron 339*a980e046SJonathan Cameron return ret; 340*a980e046SJonathan Cameron } 341*a980e046SJonathan Cameron EXPORT_SYMBOL(iio_buffer_register); 342*a980e046SJonathan Cameron 343*a980e046SJonathan Cameron void iio_buffer_unregister(struct iio_dev *indio_dev) 344*a980e046SJonathan Cameron { 345*a980e046SJonathan Cameron kfree(indio_dev->buffer->scan_mask); 346*a980e046SJonathan Cameron kfree(indio_dev->buffer->scan_el_group.attrs); 347*a980e046SJonathan Cameron __iio_buffer_attr_cleanup(indio_dev); 348*a980e046SJonathan Cameron } 349*a980e046SJonathan Cameron EXPORT_SYMBOL(iio_buffer_unregister); 350*a980e046SJonathan Cameron 351*a980e046SJonathan Cameron ssize_t iio_buffer_read_length(struct device *dev, 352*a980e046SJonathan Cameron struct device_attribute *attr, 353*a980e046SJonathan Cameron char *buf) 354*a980e046SJonathan Cameron { 355*a980e046SJonathan Cameron struct iio_dev *indio_dev = dev_get_drvdata(dev); 356*a980e046SJonathan Cameron struct iio_buffer *buffer = indio_dev->buffer; 357*a980e046SJonathan Cameron 358*a980e046SJonathan Cameron if (buffer->access->get_length) 359*a980e046SJonathan Cameron return sprintf(buf, "%d\n", 360*a980e046SJonathan Cameron buffer->access->get_length(buffer)); 361*a980e046SJonathan Cameron 362*a980e046SJonathan Cameron return 0; 363*a980e046SJonathan Cameron } 364*a980e046SJonathan Cameron EXPORT_SYMBOL(iio_buffer_read_length); 365*a980e046SJonathan Cameron 366*a980e046SJonathan Cameron ssize_t iio_buffer_write_length(struct device *dev, 367*a980e046SJonathan Cameron struct device_attribute *attr, 368*a980e046SJonathan Cameron const char *buf, 369*a980e046SJonathan Cameron size_t len) 370*a980e046SJonathan Cameron { 371*a980e046SJonathan Cameron int ret; 372*a980e046SJonathan Cameron ulong val; 373*a980e046SJonathan Cameron struct iio_dev *indio_dev = dev_get_drvdata(dev); 374*a980e046SJonathan Cameron struct iio_buffer *buffer = indio_dev->buffer; 375*a980e046SJonathan Cameron 376*a980e046SJonathan Cameron ret = strict_strtoul(buf, 10, &val); 377*a980e046SJonathan Cameron if (ret) 378*a980e046SJonathan Cameron return ret; 379*a980e046SJonathan Cameron 380*a980e046SJonathan Cameron if (buffer->access->get_length) 381*a980e046SJonathan Cameron if (val == buffer->access->get_length(buffer)) 382*a980e046SJonathan Cameron return len; 383*a980e046SJonathan Cameron 384*a980e046SJonathan Cameron mutex_lock(&indio_dev->mlock); 385*a980e046SJonathan Cameron if (iio_buffer_enabled(indio_dev)) { 386*a980e046SJonathan Cameron ret = -EBUSY; 387*a980e046SJonathan Cameron } else { 388*a980e046SJonathan Cameron if (buffer->access->set_length) 389*a980e046SJonathan Cameron buffer->access->set_length(buffer, val); 390*a980e046SJonathan Cameron ret = 0; 391*a980e046SJonathan Cameron } 392*a980e046SJonathan Cameron mutex_unlock(&indio_dev->mlock); 393*a980e046SJonathan Cameron 394*a980e046SJonathan Cameron return ret ? ret : len; 395*a980e046SJonathan Cameron } 396*a980e046SJonathan Cameron EXPORT_SYMBOL(iio_buffer_write_length); 397*a980e046SJonathan Cameron 398*a980e046SJonathan Cameron ssize_t iio_buffer_store_enable(struct device *dev, 399*a980e046SJonathan Cameron struct device_attribute *attr, 400*a980e046SJonathan Cameron const char *buf, 401*a980e046SJonathan Cameron size_t len) 402*a980e046SJonathan Cameron { 403*a980e046SJonathan Cameron int ret; 404*a980e046SJonathan Cameron bool requested_state, current_state; 405*a980e046SJonathan Cameron int previous_mode; 406*a980e046SJonathan Cameron struct iio_dev *indio_dev = dev_get_drvdata(dev); 407*a980e046SJonathan Cameron struct iio_buffer *buffer = indio_dev->buffer; 408*a980e046SJonathan Cameron 409*a980e046SJonathan Cameron mutex_lock(&indio_dev->mlock); 410*a980e046SJonathan Cameron previous_mode = indio_dev->currentmode; 411*a980e046SJonathan Cameron requested_state = !(buf[0] == '0'); 412*a980e046SJonathan Cameron current_state = iio_buffer_enabled(indio_dev); 413*a980e046SJonathan Cameron if (current_state == requested_state) { 414*a980e046SJonathan Cameron printk(KERN_INFO "iio-buffer, current state requested again\n"); 415*a980e046SJonathan Cameron goto done; 416*a980e046SJonathan Cameron } 417*a980e046SJonathan Cameron if (requested_state) { 418*a980e046SJonathan Cameron if (indio_dev->setup_ops->preenable) { 419*a980e046SJonathan Cameron ret = indio_dev->setup_ops->preenable(indio_dev); 420*a980e046SJonathan Cameron if (ret) { 421*a980e046SJonathan Cameron printk(KERN_ERR 422*a980e046SJonathan Cameron "Buffer not started:" 423*a980e046SJonathan Cameron "buffer preenable failed\n"); 424*a980e046SJonathan Cameron goto error_ret; 425*a980e046SJonathan Cameron } 426*a980e046SJonathan Cameron } 427*a980e046SJonathan Cameron if (buffer->access->request_update) { 428*a980e046SJonathan Cameron ret = buffer->access->request_update(buffer); 429*a980e046SJonathan Cameron if (ret) { 430*a980e046SJonathan Cameron printk(KERN_INFO 431*a980e046SJonathan Cameron "Buffer not started:" 432*a980e046SJonathan Cameron "buffer parameter update failed\n"); 433*a980e046SJonathan Cameron goto error_ret; 434*a980e046SJonathan Cameron } 435*a980e046SJonathan Cameron } 436*a980e046SJonathan Cameron /* Definitely possible for devices to support both of these.*/ 437*a980e046SJonathan Cameron if (indio_dev->modes & INDIO_BUFFER_TRIGGERED) { 438*a980e046SJonathan Cameron if (!indio_dev->trig) { 439*a980e046SJonathan Cameron printk(KERN_INFO 440*a980e046SJonathan Cameron "Buffer not started: no trigger\n"); 441*a980e046SJonathan Cameron ret = -EINVAL; 442*a980e046SJonathan Cameron goto error_ret; 443*a980e046SJonathan Cameron } 444*a980e046SJonathan Cameron indio_dev->currentmode = INDIO_BUFFER_TRIGGERED; 445*a980e046SJonathan Cameron } else if (indio_dev->modes & INDIO_BUFFER_HARDWARE) 446*a980e046SJonathan Cameron indio_dev->currentmode = INDIO_BUFFER_HARDWARE; 447*a980e046SJonathan Cameron else { /* should never be reached */ 448*a980e046SJonathan Cameron ret = -EINVAL; 449*a980e046SJonathan Cameron goto error_ret; 450*a980e046SJonathan Cameron } 451*a980e046SJonathan Cameron 452*a980e046SJonathan Cameron if (indio_dev->setup_ops->postenable) { 453*a980e046SJonathan Cameron ret = indio_dev->setup_ops->postenable(indio_dev); 454*a980e046SJonathan Cameron if (ret) { 455*a980e046SJonathan Cameron printk(KERN_INFO 456*a980e046SJonathan Cameron "Buffer not started:" 457*a980e046SJonathan Cameron "postenable failed\n"); 458*a980e046SJonathan Cameron indio_dev->currentmode = previous_mode; 459*a980e046SJonathan Cameron if (indio_dev->setup_ops->postdisable) 460*a980e046SJonathan Cameron indio_dev->setup_ops-> 461*a980e046SJonathan Cameron postdisable(indio_dev); 462*a980e046SJonathan Cameron goto error_ret; 463*a980e046SJonathan Cameron } 464*a980e046SJonathan Cameron } 465*a980e046SJonathan Cameron } else { 466*a980e046SJonathan Cameron if (indio_dev->setup_ops->predisable) { 467*a980e046SJonathan Cameron ret = indio_dev->setup_ops->predisable(indio_dev); 468*a980e046SJonathan Cameron if (ret) 469*a980e046SJonathan Cameron goto error_ret; 470*a980e046SJonathan Cameron } 471*a980e046SJonathan Cameron indio_dev->currentmode = INDIO_DIRECT_MODE; 472*a980e046SJonathan Cameron if (indio_dev->setup_ops->postdisable) { 473*a980e046SJonathan Cameron ret = indio_dev->setup_ops->postdisable(indio_dev); 474*a980e046SJonathan Cameron if (ret) 475*a980e046SJonathan Cameron goto error_ret; 476*a980e046SJonathan Cameron } 477*a980e046SJonathan Cameron } 478*a980e046SJonathan Cameron done: 479*a980e046SJonathan Cameron mutex_unlock(&indio_dev->mlock); 480*a980e046SJonathan Cameron return len; 481*a980e046SJonathan Cameron 482*a980e046SJonathan Cameron error_ret: 483*a980e046SJonathan Cameron mutex_unlock(&indio_dev->mlock); 484*a980e046SJonathan Cameron return ret; 485*a980e046SJonathan Cameron } 486*a980e046SJonathan Cameron EXPORT_SYMBOL(iio_buffer_store_enable); 487*a980e046SJonathan Cameron 488*a980e046SJonathan Cameron ssize_t iio_buffer_show_enable(struct device *dev, 489*a980e046SJonathan Cameron struct device_attribute *attr, 490*a980e046SJonathan Cameron char *buf) 491*a980e046SJonathan Cameron { 492*a980e046SJonathan Cameron struct iio_dev *indio_dev = dev_get_drvdata(dev); 493*a980e046SJonathan Cameron return sprintf(buf, "%d\n", iio_buffer_enabled(indio_dev)); 494*a980e046SJonathan Cameron } 495*a980e046SJonathan Cameron EXPORT_SYMBOL(iio_buffer_show_enable); 496*a980e046SJonathan Cameron 497*a980e046SJonathan Cameron /* note NULL used as error indicator as it doesn't make sense. */ 498*a980e046SJonathan Cameron static const unsigned long *iio_scan_mask_match(const unsigned long *av_masks, 499*a980e046SJonathan Cameron unsigned int masklength, 500*a980e046SJonathan Cameron const unsigned long *mask) 501*a980e046SJonathan Cameron { 502*a980e046SJonathan Cameron if (bitmap_empty(mask, masklength)) 503*a980e046SJonathan Cameron return NULL; 504*a980e046SJonathan Cameron while (*av_masks) { 505*a980e046SJonathan Cameron if (bitmap_subset(mask, av_masks, masklength)) 506*a980e046SJonathan Cameron return av_masks; 507*a980e046SJonathan Cameron av_masks += BITS_TO_LONGS(masklength); 508*a980e046SJonathan Cameron } 509*a980e046SJonathan Cameron return NULL; 510*a980e046SJonathan Cameron } 511*a980e046SJonathan Cameron 512*a980e046SJonathan Cameron static int iio_compute_scan_bytes(struct iio_dev *indio_dev, const long *mask, 513*a980e046SJonathan Cameron bool timestamp) 514*a980e046SJonathan Cameron { 515*a980e046SJonathan Cameron const struct iio_chan_spec *ch; 516*a980e046SJonathan Cameron unsigned bytes = 0; 517*a980e046SJonathan Cameron int length, i; 518*a980e046SJonathan Cameron 519*a980e046SJonathan Cameron /* How much space will the demuxed element take? */ 520*a980e046SJonathan Cameron for_each_set_bit(i, mask, 521*a980e046SJonathan Cameron indio_dev->masklength) { 522*a980e046SJonathan Cameron ch = iio_find_channel_from_si(indio_dev, i); 523*a980e046SJonathan Cameron length = ch->scan_type.storagebits / 8; 524*a980e046SJonathan Cameron bytes = ALIGN(bytes, length); 525*a980e046SJonathan Cameron bytes += length; 526*a980e046SJonathan Cameron } 527*a980e046SJonathan Cameron if (timestamp) { 528*a980e046SJonathan Cameron ch = iio_find_channel_from_si(indio_dev, 529*a980e046SJonathan Cameron indio_dev->scan_index_timestamp); 530*a980e046SJonathan Cameron length = ch->scan_type.storagebits / 8; 531*a980e046SJonathan Cameron bytes = ALIGN(bytes, length); 532*a980e046SJonathan Cameron bytes += length; 533*a980e046SJonathan Cameron } 534*a980e046SJonathan Cameron return bytes; 535*a980e046SJonathan Cameron } 536*a980e046SJonathan Cameron 537*a980e046SJonathan Cameron int iio_sw_buffer_preenable(struct iio_dev *indio_dev) 538*a980e046SJonathan Cameron { 539*a980e046SJonathan Cameron struct iio_buffer *buffer = indio_dev->buffer; 540*a980e046SJonathan Cameron dev_dbg(&indio_dev->dev, "%s\n", __func__); 541*a980e046SJonathan Cameron 542*a980e046SJonathan Cameron /* How much space will the demuxed element take? */ 543*a980e046SJonathan Cameron indio_dev->scan_bytes = 544*a980e046SJonathan Cameron iio_compute_scan_bytes(indio_dev, buffer->scan_mask, 545*a980e046SJonathan Cameron buffer->scan_timestamp); 546*a980e046SJonathan Cameron buffer->access->set_bytes_per_datum(buffer, indio_dev->scan_bytes); 547*a980e046SJonathan Cameron 548*a980e046SJonathan Cameron /* What scan mask do we actually have ?*/ 549*a980e046SJonathan Cameron if (indio_dev->available_scan_masks) 550*a980e046SJonathan Cameron indio_dev->active_scan_mask = 551*a980e046SJonathan Cameron iio_scan_mask_match(indio_dev->available_scan_masks, 552*a980e046SJonathan Cameron indio_dev->masklength, 553*a980e046SJonathan Cameron buffer->scan_mask); 554*a980e046SJonathan Cameron else 555*a980e046SJonathan Cameron indio_dev->active_scan_mask = buffer->scan_mask; 556*a980e046SJonathan Cameron iio_update_demux(indio_dev); 557*a980e046SJonathan Cameron 558*a980e046SJonathan Cameron if (indio_dev->info->update_scan_mode) 559*a980e046SJonathan Cameron return indio_dev->info 560*a980e046SJonathan Cameron ->update_scan_mode(indio_dev, 561*a980e046SJonathan Cameron indio_dev->active_scan_mask); 562*a980e046SJonathan Cameron return 0; 563*a980e046SJonathan Cameron } 564*a980e046SJonathan Cameron EXPORT_SYMBOL(iio_sw_buffer_preenable); 565*a980e046SJonathan Cameron 566*a980e046SJonathan Cameron /** 567*a980e046SJonathan Cameron * iio_scan_mask_set() - set particular bit in the scan mask 568*a980e046SJonathan Cameron * @buffer: the buffer whose scan mask we are interested in 569*a980e046SJonathan Cameron * @bit: the bit to be set. 570*a980e046SJonathan Cameron **/ 571*a980e046SJonathan Cameron int iio_scan_mask_set(struct iio_dev *indio_dev, 572*a980e046SJonathan Cameron struct iio_buffer *buffer, int bit) 573*a980e046SJonathan Cameron { 574*a980e046SJonathan Cameron const unsigned long *mask; 575*a980e046SJonathan Cameron unsigned long *trialmask; 576*a980e046SJonathan Cameron 577*a980e046SJonathan Cameron trialmask = kmalloc(sizeof(*trialmask)* 578*a980e046SJonathan Cameron BITS_TO_LONGS(indio_dev->masklength), 579*a980e046SJonathan Cameron GFP_KERNEL); 580*a980e046SJonathan Cameron 581*a980e046SJonathan Cameron if (trialmask == NULL) 582*a980e046SJonathan Cameron return -ENOMEM; 583*a980e046SJonathan Cameron if (!indio_dev->masklength) { 584*a980e046SJonathan Cameron WARN_ON("trying to set scanmask prior to registering buffer\n"); 585*a980e046SJonathan Cameron kfree(trialmask); 586*a980e046SJonathan Cameron return -EINVAL; 587*a980e046SJonathan Cameron } 588*a980e046SJonathan Cameron bitmap_copy(trialmask, buffer->scan_mask, indio_dev->masklength); 589*a980e046SJonathan Cameron set_bit(bit, trialmask); 590*a980e046SJonathan Cameron 591*a980e046SJonathan Cameron if (indio_dev->available_scan_masks) { 592*a980e046SJonathan Cameron mask = iio_scan_mask_match(indio_dev->available_scan_masks, 593*a980e046SJonathan Cameron indio_dev->masklength, 594*a980e046SJonathan Cameron trialmask); 595*a980e046SJonathan Cameron if (!mask) { 596*a980e046SJonathan Cameron kfree(trialmask); 597*a980e046SJonathan Cameron return -EINVAL; 598*a980e046SJonathan Cameron } 599*a980e046SJonathan Cameron } 600*a980e046SJonathan Cameron bitmap_copy(buffer->scan_mask, trialmask, indio_dev->masklength); 601*a980e046SJonathan Cameron 602*a980e046SJonathan Cameron kfree(trialmask); 603*a980e046SJonathan Cameron 604*a980e046SJonathan Cameron return 0; 605*a980e046SJonathan Cameron }; 606*a980e046SJonathan Cameron EXPORT_SYMBOL_GPL(iio_scan_mask_set); 607*a980e046SJonathan Cameron 608*a980e046SJonathan Cameron int iio_scan_mask_query(struct iio_dev *indio_dev, 609*a980e046SJonathan Cameron struct iio_buffer *buffer, int bit) 610*a980e046SJonathan Cameron { 611*a980e046SJonathan Cameron if (bit > indio_dev->masklength) 612*a980e046SJonathan Cameron return -EINVAL; 613*a980e046SJonathan Cameron 614*a980e046SJonathan Cameron if (!buffer->scan_mask) 615*a980e046SJonathan Cameron return 0; 616*a980e046SJonathan Cameron 617*a980e046SJonathan Cameron return test_bit(bit, buffer->scan_mask); 618*a980e046SJonathan Cameron }; 619*a980e046SJonathan Cameron EXPORT_SYMBOL_GPL(iio_scan_mask_query); 620*a980e046SJonathan Cameron 621*a980e046SJonathan Cameron /** 622*a980e046SJonathan Cameron * struct iio_demux_table() - table describing demux memcpy ops 623*a980e046SJonathan Cameron * @from: index to copy from 624*a980e046SJonathan Cameron * @to: index to copy to 625*a980e046SJonathan Cameron * @length: how many bytes to copy 626*a980e046SJonathan Cameron * @l: list head used for management 627*a980e046SJonathan Cameron */ 628*a980e046SJonathan Cameron struct iio_demux_table { 629*a980e046SJonathan Cameron unsigned from; 630*a980e046SJonathan Cameron unsigned to; 631*a980e046SJonathan Cameron unsigned length; 632*a980e046SJonathan Cameron struct list_head l; 633*a980e046SJonathan Cameron }; 634*a980e046SJonathan Cameron 635*a980e046SJonathan Cameron static unsigned char *iio_demux(struct iio_buffer *buffer, 636*a980e046SJonathan Cameron unsigned char *datain) 637*a980e046SJonathan Cameron { 638*a980e046SJonathan Cameron struct iio_demux_table *t; 639*a980e046SJonathan Cameron 640*a980e046SJonathan Cameron if (list_empty(&buffer->demux_list)) 641*a980e046SJonathan Cameron return datain; 642*a980e046SJonathan Cameron list_for_each_entry(t, &buffer->demux_list, l) 643*a980e046SJonathan Cameron memcpy(buffer->demux_bounce + t->to, 644*a980e046SJonathan Cameron datain + t->from, t->length); 645*a980e046SJonathan Cameron 646*a980e046SJonathan Cameron return buffer->demux_bounce; 647*a980e046SJonathan Cameron } 648*a980e046SJonathan Cameron 649*a980e046SJonathan Cameron int iio_push_to_buffer(struct iio_buffer *buffer, unsigned char *data, 650*a980e046SJonathan Cameron s64 timestamp) 651*a980e046SJonathan Cameron { 652*a980e046SJonathan Cameron unsigned char *dataout = iio_demux(buffer, data); 653*a980e046SJonathan Cameron 654*a980e046SJonathan Cameron return buffer->access->store_to(buffer, dataout, timestamp); 655*a980e046SJonathan Cameron } 656*a980e046SJonathan Cameron EXPORT_SYMBOL_GPL(iio_push_to_buffer); 657*a980e046SJonathan Cameron 658*a980e046SJonathan Cameron static void iio_buffer_demux_free(struct iio_buffer *buffer) 659*a980e046SJonathan Cameron { 660*a980e046SJonathan Cameron struct iio_demux_table *p, *q; 661*a980e046SJonathan Cameron list_for_each_entry_safe(p, q, &buffer->demux_list, l) { 662*a980e046SJonathan Cameron list_del(&p->l); 663*a980e046SJonathan Cameron kfree(p); 664*a980e046SJonathan Cameron } 665*a980e046SJonathan Cameron } 666*a980e046SJonathan Cameron 667*a980e046SJonathan Cameron int iio_update_demux(struct iio_dev *indio_dev) 668*a980e046SJonathan Cameron { 669*a980e046SJonathan Cameron const struct iio_chan_spec *ch; 670*a980e046SJonathan Cameron struct iio_buffer *buffer = indio_dev->buffer; 671*a980e046SJonathan Cameron int ret, in_ind = -1, out_ind, length; 672*a980e046SJonathan Cameron unsigned in_loc = 0, out_loc = 0; 673*a980e046SJonathan Cameron struct iio_demux_table *p; 674*a980e046SJonathan Cameron 675*a980e046SJonathan Cameron /* Clear out any old demux */ 676*a980e046SJonathan Cameron iio_buffer_demux_free(buffer); 677*a980e046SJonathan Cameron kfree(buffer->demux_bounce); 678*a980e046SJonathan Cameron buffer->demux_bounce = NULL; 679*a980e046SJonathan Cameron 680*a980e046SJonathan Cameron /* First work out which scan mode we will actually have */ 681*a980e046SJonathan Cameron if (bitmap_equal(indio_dev->active_scan_mask, 682*a980e046SJonathan Cameron buffer->scan_mask, 683*a980e046SJonathan Cameron indio_dev->masklength)) 684*a980e046SJonathan Cameron return 0; 685*a980e046SJonathan Cameron 686*a980e046SJonathan Cameron /* Now we have the two masks, work from least sig and build up sizes */ 687*a980e046SJonathan Cameron for_each_set_bit(out_ind, 688*a980e046SJonathan Cameron indio_dev->active_scan_mask, 689*a980e046SJonathan Cameron indio_dev->masklength) { 690*a980e046SJonathan Cameron in_ind = find_next_bit(indio_dev->active_scan_mask, 691*a980e046SJonathan Cameron indio_dev->masklength, 692*a980e046SJonathan Cameron in_ind + 1); 693*a980e046SJonathan Cameron while (in_ind != out_ind) { 694*a980e046SJonathan Cameron in_ind = find_next_bit(indio_dev->active_scan_mask, 695*a980e046SJonathan Cameron indio_dev->masklength, 696*a980e046SJonathan Cameron in_ind + 1); 697*a980e046SJonathan Cameron ch = iio_find_channel_from_si(indio_dev, in_ind); 698*a980e046SJonathan Cameron length = ch->scan_type.storagebits/8; 699*a980e046SJonathan Cameron /* Make sure we are aligned */ 700*a980e046SJonathan Cameron in_loc += length; 701*a980e046SJonathan Cameron if (in_loc % length) 702*a980e046SJonathan Cameron in_loc += length - in_loc % length; 703*a980e046SJonathan Cameron } 704*a980e046SJonathan Cameron p = kmalloc(sizeof(*p), GFP_KERNEL); 705*a980e046SJonathan Cameron if (p == NULL) { 706*a980e046SJonathan Cameron ret = -ENOMEM; 707*a980e046SJonathan Cameron goto error_clear_mux_table; 708*a980e046SJonathan Cameron } 709*a980e046SJonathan Cameron ch = iio_find_channel_from_si(indio_dev, in_ind); 710*a980e046SJonathan Cameron length = ch->scan_type.storagebits/8; 711*a980e046SJonathan Cameron if (out_loc % length) 712*a980e046SJonathan Cameron out_loc += length - out_loc % length; 713*a980e046SJonathan Cameron if (in_loc % length) 714*a980e046SJonathan Cameron in_loc += length - in_loc % length; 715*a980e046SJonathan Cameron p->from = in_loc; 716*a980e046SJonathan Cameron p->to = out_loc; 717*a980e046SJonathan Cameron p->length = length; 718*a980e046SJonathan Cameron list_add_tail(&p->l, &buffer->demux_list); 719*a980e046SJonathan Cameron out_loc += length; 720*a980e046SJonathan Cameron in_loc += length; 721*a980e046SJonathan Cameron } 722*a980e046SJonathan Cameron /* Relies on scan_timestamp being last */ 723*a980e046SJonathan Cameron if (buffer->scan_timestamp) { 724*a980e046SJonathan Cameron p = kmalloc(sizeof(*p), GFP_KERNEL); 725*a980e046SJonathan Cameron if (p == NULL) { 726*a980e046SJonathan Cameron ret = -ENOMEM; 727*a980e046SJonathan Cameron goto error_clear_mux_table; 728*a980e046SJonathan Cameron } 729*a980e046SJonathan Cameron ch = iio_find_channel_from_si(indio_dev, 730*a980e046SJonathan Cameron indio_dev->scan_index_timestamp); 731*a980e046SJonathan Cameron length = ch->scan_type.storagebits/8; 732*a980e046SJonathan Cameron if (out_loc % length) 733*a980e046SJonathan Cameron out_loc += length - out_loc % length; 734*a980e046SJonathan Cameron if (in_loc % length) 735*a980e046SJonathan Cameron in_loc += length - in_loc % length; 736*a980e046SJonathan Cameron p->from = in_loc; 737*a980e046SJonathan Cameron p->to = out_loc; 738*a980e046SJonathan Cameron p->length = length; 739*a980e046SJonathan Cameron list_add_tail(&p->l, &buffer->demux_list); 740*a980e046SJonathan Cameron out_loc += length; 741*a980e046SJonathan Cameron in_loc += length; 742*a980e046SJonathan Cameron } 743*a980e046SJonathan Cameron buffer->demux_bounce = kzalloc(out_loc, GFP_KERNEL); 744*a980e046SJonathan Cameron if (buffer->demux_bounce == NULL) { 745*a980e046SJonathan Cameron ret = -ENOMEM; 746*a980e046SJonathan Cameron goto error_clear_mux_table; 747*a980e046SJonathan Cameron } 748*a980e046SJonathan Cameron return 0; 749*a980e046SJonathan Cameron 750*a980e046SJonathan Cameron error_clear_mux_table: 751*a980e046SJonathan Cameron iio_buffer_demux_free(buffer); 752*a980e046SJonathan Cameron 753*a980e046SJonathan Cameron return ret; 754*a980e046SJonathan Cameron } 755*a980e046SJonathan Cameron EXPORT_SYMBOL_GPL(iio_update_demux); 756