Lines Matching +full:proximity +full:- +full:close +full:- +full:hysteresis
1 // SPDX-License-Identifier: GPL-2.0-only
10 #define pr_fmt(fmt) "iio-core: " fmt
33 #include <linux/iio/iio-opaque.h>
67 [IIO_PROXIMITY] = "proximity",
176 [IIO_CHAN_INFO_HYSTERESIS] = "hysteresis",
192 * iio_device_id() - query the unique ID for the device
204 return iio_dev_opaque->id; in iio_device_id()
209 * iio_buffer_enabled() - helper function to test if the buffer is enabled
218 return iio_dev_opaque->currentmode & INDIO_ALL_BUFFER_MODES; in iio_buffer_enabled()
231 return iio_dev_opaque->debugfs_dentry; in iio_get_debugfs_dentry()
237 * iio_find_channel_from_si() - get channel from its scan index
249 for (i = 0; i < indio_dev->num_channels; i++) in iio_find_channel_from_si()
250 if (indio_dev->channels[i].scan_index == si) in iio_find_channel_from_si()
251 return &indio_dev->channels[i]; in iio_find_channel_from_si()
260 return sysfs_emit(buf, "%s\n", to_iio_const_attr(attr)->string); in iio_read_const_attr()
265 * iio_device_set_clock() - Set current timestamping clock for the device
275 const struct iio_event_interface *ev_int = iio_dev_opaque->event_interface; in iio_device_set_clock()
277 ret = mutex_lock_interruptible(&iio_dev_opaque->mlock); in iio_device_set_clock()
282 mutex_unlock(&iio_dev_opaque->mlock); in iio_device_set_clock()
283 return -EBUSY; in iio_device_set_clock()
285 iio_dev_opaque->clock_id = clock_id; in iio_device_set_clock()
286 mutex_unlock(&iio_dev_opaque->mlock); in iio_device_set_clock()
293 * iio_device_get_clock() - Retrieve current timestamping clock for the device
302 return iio_dev_opaque->clock_id; in iio_device_get_clock()
307 * iio_get_time_ns() - utility function to get a time stamp for events etc
377 struct iio_dev *indio_dev = file->private_data; in iio_debugfs_read_reg()
384 iio_dev_opaque->read_buf, in iio_debugfs_read_reg()
385 iio_dev_opaque->read_buf_len); in iio_debugfs_read_reg()
387 ret = indio_dev->info->debugfs_reg_access(indio_dev, in iio_debugfs_read_reg()
388 iio_dev_opaque->cached_reg_addr, in iio_debugfs_read_reg()
391 dev_err(indio_dev->dev.parent, "%s: read failed\n", __func__); in iio_debugfs_read_reg()
395 iio_dev_opaque->read_buf_len = snprintf(iio_dev_opaque->read_buf, in iio_debugfs_read_reg()
396 sizeof(iio_dev_opaque->read_buf), in iio_debugfs_read_reg()
400 iio_dev_opaque->read_buf, in iio_debugfs_read_reg()
401 iio_dev_opaque->read_buf_len); in iio_debugfs_read_reg()
407 struct iio_dev *indio_dev = file->private_data; in iio_debugfs_write_reg()
413 count = min(count, sizeof(buf) - 1); in iio_debugfs_write_reg()
415 return -EFAULT; in iio_debugfs_write_reg()
423 iio_dev_opaque->cached_reg_addr = reg; in iio_debugfs_write_reg()
426 iio_dev_opaque->cached_reg_addr = reg; in iio_debugfs_write_reg()
427 ret = indio_dev->info->debugfs_reg_access(indio_dev, reg, in iio_debugfs_write_reg()
430 dev_err(indio_dev->dev.parent, "%s: write failed\n", in iio_debugfs_write_reg()
436 return -EINVAL; in iio_debugfs_write_reg()
452 debugfs_remove_recursive(iio_dev_opaque->debugfs_dentry); in iio_device_unregister_debugfs()
459 if (indio_dev->info->debugfs_reg_access == NULL) in iio_device_register_debugfs()
467 iio_dev_opaque->debugfs_dentry = in iio_device_register_debugfs()
468 debugfs_create_dir(dev_name(&indio_dev->dev), in iio_device_register_debugfs()
472 iio_dev_opaque->debugfs_dentry, indio_dev, in iio_device_register_debugfs()
493 ext_info = &this_attr->c->ext_info[this_attr->address]; in iio_read_channel_ext_info()
495 return ext_info->read(indio_dev, ext_info->private, this_attr->c, buf); in iio_read_channel_ext_info()
506 ext_info = &this_attr->c->ext_info[this_attr->address]; in iio_write_channel_ext_info()
508 return ext_info->write(indio_dev, ext_info->private, in iio_write_channel_ext_info()
509 this_attr->c, buf, len); in iio_write_channel_ext_info()
519 if (!e->num_items) in iio_enum_available_read()
522 for (i = 0; i < e->num_items; ++i) { in iio_enum_available_read()
523 if (!e->items[i]) in iio_enum_available_read()
525 len += sysfs_emit_at(buf, len, "%s ", e->items[i]); in iio_enum_available_read()
529 buf[len - 1] = '\n'; in iio_enum_available_read()
541 if (!e->get) in iio_enum_read()
542 return -EINVAL; in iio_enum_read()
544 i = e->get(indio_dev, chan); in iio_enum_read()
547 if (i >= e->num_items || !e->items[i]) in iio_enum_read()
548 return -EINVAL; in iio_enum_read()
550 return sysfs_emit(buf, "%s\n", e->items[i]); in iio_enum_read()
561 if (!e->set) in iio_enum_write()
562 return -EINVAL; in iio_enum_write()
564 ret = __sysfs_match_string(e->items, e->num_items, buf); in iio_enum_write()
568 ret = e->set(indio_dev, chan, ret); in iio_enum_write()
602 mtx->rotation[0], mtx->rotation[1], mtx->rotation[2], in iio_show_mount_matrix()
603 mtx->rotation[3], mtx->rotation[4], mtx->rotation[5], in iio_show_mount_matrix()
604 mtx->rotation[6], mtx->rotation[7], mtx->rotation[8]); in iio_show_mount_matrix()
609 * iio_read_mount_matrix() - retrieve iio device mounting matrix from
610 * device "mount-matrix" property
624 err = device_property_read_string_array(dev, "mount-matrix", matrix->rotation, len); in iio_read_mount_matrix()
630 return -EINVAL; in iio_read_mount_matrix()
632 if (err != -EINVAL) in iio_read_mount_matrix()
656 return sysfs_emit_at(buf, offset, "-%d.%06u%s", in __iio_format_value()
657 abs(vals[0]), -vals[1], in __iio_format_value()
664 return sysfs_emit_at(buf, offset, "-%d.%09u", in __iio_format_value()
665 abs(vals[0]), -vals[1]); in __iio_format_value()
673 return sysfs_emit_at(buf, offset, "-0.%09u", abs(tmp1)); in __iio_format_value()
681 return sysfs_emit_at(buf, offset, "-0.%09u", abs(tmp1)); in __iio_format_value()
705 * iio_format_value() - Formats a IIO value into its string representation
723 if (len >= PAGE_SIZE - 1) in iio_format_value()
724 return -EFBIG; in iio_format_value()
734 if (indio_dev->info->read_label) in do_iio_read_channel_label()
735 return indio_dev->info->read_label(indio_dev, c, buf); in do_iio_read_channel_label()
737 if (c->extend_name) in do_iio_read_channel_label()
738 return sysfs_emit(buf, "%s\n", c->extend_name); in do_iio_read_channel_label()
740 return -EINVAL; in do_iio_read_channel_label()
748 to_iio_dev_attr(attr)->c, buf); in iio_read_channel_label()
761 if (indio_dev->info->read_raw_multi) in iio_read_channel_info()
762 ret = indio_dev->info->read_raw_multi(indio_dev, this_attr->c, in iio_read_channel_info()
765 this_attr->address); in iio_read_channel_info()
766 else if (indio_dev->info->read_raw) in iio_read_channel_info()
767 ret = indio_dev->info->read_raw(indio_dev, this_attr->c, in iio_read_channel_info()
768 &vals[0], &vals[1], this_attr->address); in iio_read_channel_info()
770 return -EINVAL; in iio_read_channel_info()
796 for (i = 0; i <= length - stride; i += stride) { in iio_format_list()
800 return -EFBIG; in iio_format_list()
805 return -EFBIG; in iio_format_list()
852 if (!indio_dev->info->read_avail) in iio_read_channel_info_avail()
853 return -EINVAL; in iio_read_channel_info_avail()
855 ret = indio_dev->info->read_avail(indio_dev, this_attr->c, in iio_read_channel_info_avail()
857 this_attr->address); in iio_read_channel_info_avail()
867 return -EINVAL; in iio_read_channel_info_avail()
872 * __iio_str_to_fixpoint() - Parse a fixed-point number from a string
894 if (str[0] == '-') { in __iio_str_to_fixpoint()
904 i = i * 10 + *str - '0'; in __iio_str_to_fixpoint()
906 f += fract_mult * (*str - '0'); in __iio_str_to_fixpoint()
912 return -EINVAL; in __iio_str_to_fixpoint()
913 } else if (!strncmp(str, " dB", sizeof(" dB") - 1) && scale_db) { in __iio_str_to_fixpoint()
915 str += sizeof(" dB") - 1; in __iio_str_to_fixpoint()
917 } else if (!strncmp(str, "dB", sizeof("dB") - 1) && scale_db) { in __iio_str_to_fixpoint()
919 str += sizeof("dB") - 1; in __iio_str_to_fixpoint()
924 return -EINVAL; in __iio_str_to_fixpoint()
931 i = -i; in __iio_str_to_fixpoint()
933 f = -f; in __iio_str_to_fixpoint()
943 * iio_str_to_fixpoint() - Parse a fixed-point number from a string
971 /* Assumes decimal - precision based on number of digits */ in iio_write_channel_info()
972 if (!indio_dev->info->write_raw) in iio_write_channel_info()
973 return -EINVAL; in iio_write_channel_info()
975 if (indio_dev->info->write_raw_get_fmt) in iio_write_channel_info()
976 switch (indio_dev->info->write_raw_get_fmt(indio_dev, in iio_write_channel_info()
977 this_attr->c, this_attr->address)) { in iio_write_channel_info()
994 return -EINVAL; in iio_write_channel_info()
1001 return -EINVAL; in iio_write_channel_info()
1010 ret = indio_dev->info->write_raw(indio_dev, this_attr->c, in iio_write_channel_info()
1011 integer, fract, this_attr->address); in iio_write_channel_info()
1035 sysfs_attr_init(&dev_attr->attr); in __iio_device_attr_init()
1038 if (chan->modified && (shared_by == IIO_SEPARATE)) { in __iio_device_attr_init()
1039 if (chan->extend_name) in __iio_device_attr_init()
1041 iio_modifier_names[chan->channel2], in __iio_device_attr_init()
1042 chan->extend_name, in __iio_device_attr_init()
1046 iio_modifier_names[chan->channel2], in __iio_device_attr_init()
1049 if (chan->extend_name == NULL || shared_by != IIO_SEPARATE) in __iio_device_attr_init()
1054 chan->extend_name, in __iio_device_attr_init()
1058 return -ENOMEM; in __iio_device_attr_init()
1060 if (chan->differential) { /* Differential can not have modifier */ in __iio_device_attr_init()
1067 iio_direction[chan->output], in __iio_device_attr_init()
1071 name = kasprintf(GFP_KERNEL, "%s_%s-%s_%s", in __iio_device_attr_init()
1072 iio_direction[chan->output], in __iio_device_attr_init()
1073 iio_chan_type_name_spec[chan->type], in __iio_device_attr_init()
1074 iio_chan_type_name_spec[chan->type], in __iio_device_attr_init()
1078 if (!chan->indexed) { in __iio_device_attr_init()
1080 ret = -EINVAL; in __iio_device_attr_init()
1084 "%s_%s%d-%s%d_%s", in __iio_device_attr_init()
1085 iio_direction[chan->output], in __iio_device_attr_init()
1086 iio_chan_type_name_spec[chan->type], in __iio_device_attr_init()
1087 chan->channel, in __iio_device_attr_init()
1088 iio_chan_type_name_spec[chan->type], in __iio_device_attr_init()
1089 chan->channel2, in __iio_device_attr_init()
1100 iio_direction[chan->output], in __iio_device_attr_init()
1105 iio_direction[chan->output], in __iio_device_attr_init()
1106 iio_chan_type_name_spec[chan->type], in __iio_device_attr_init()
1111 if (chan->indexed) in __iio_device_attr_init()
1113 iio_direction[chan->output], in __iio_device_attr_init()
1114 iio_chan_type_name_spec[chan->type], in __iio_device_attr_init()
1115 chan->channel, in __iio_device_attr_init()
1119 iio_direction[chan->output], in __iio_device_attr_init()
1120 iio_chan_type_name_spec[chan->type], in __iio_device_attr_init()
1126 ret = -ENOMEM; in __iio_device_attr_init()
1129 dev_attr->attr.name = name; in __iio_device_attr_init()
1132 dev_attr->attr.mode |= 0444; in __iio_device_attr_init()
1133 dev_attr->show = readfunc; in __iio_device_attr_init()
1137 dev_attr->attr.mode |= 0200; in __iio_device_attr_init()
1138 dev_attr->store = writefunc; in __iio_device_attr_init()
1149 kfree(dev_attr->attr.name); in __iio_device_attr_deinit()
1172 return -ENOMEM; in __iio_add_chan_devattr()
1173 ret = __iio_device_attr_init(&iio_attr->dev_attr, in __iio_add_chan_devattr()
1178 iio_attr->c = chan; in __iio_add_chan_devattr()
1179 iio_attr->address = mask; in __iio_add_chan_devattr()
1180 iio_attr->buffer = buffer; in __iio_add_chan_devattr()
1182 if (strcmp(t->dev_attr.attr.name, in __iio_add_chan_devattr()
1183 iio_attr->dev_attr.attr.name) == 0) { in __iio_add_chan_devattr()
1186 t->dev_attr.attr.name); in __iio_add_chan_devattr()
1187 ret = -EBUSY; in __iio_add_chan_devattr()
1190 list_add(&iio_attr->l, attr_list); in __iio_add_chan_devattr()
1195 __iio_device_attr_deinit(&iio_attr->dev_attr); in __iio_add_chan_devattr()
1207 if (!indio_dev->info->read_label && !chan->extend_name) in iio_device_add_channel_label()
1216 &indio_dev->dev, in iio_device_add_channel_label()
1218 &iio_dev_opaque->channel_attr_list); in iio_device_add_channel_label()
1235 return -EINVAL; in iio_device_add_info_mask_type()
1242 &indio_dev->dev, in iio_device_add_info_mask_type()
1244 &iio_dev_opaque->channel_attr_list); in iio_device_add_info_mask_type()
1245 if ((ret == -EBUSY) && (shared_by != IIO_SEPARATE)) in iio_device_add_info_mask_type()
1266 return -EINVAL; in iio_device_add_info_mask_type_avail()
1271 return -ENOMEM; in iio_device_add_info_mask_type_avail()
1279 &indio_dev->dev, in iio_device_add_info_mask_type_avail()
1281 &iio_dev_opaque->channel_attr_list); in iio_device_add_info_mask_type_avail()
1283 if ((ret == -EBUSY) && (shared_by != IIO_SEPARATE)) in iio_device_add_info_mask_type_avail()
1300 if (chan->channel < 0) in iio_device_add_channel_sysfs()
1304 &chan->info_mask_separate); in iio_device_add_channel_sysfs()
1311 &chan->info_mask_separate_available); in iio_device_add_channel_sysfs()
1318 &chan->info_mask_shared_by_type); in iio_device_add_channel_sysfs()
1325 &chan->info_mask_shared_by_type_available); in iio_device_add_channel_sysfs()
1332 &chan->info_mask_shared_by_dir); in iio_device_add_channel_sysfs()
1339 &chan->info_mask_shared_by_dir_available); in iio_device_add_channel_sysfs()
1346 &chan->info_mask_shared_by_all); in iio_device_add_channel_sysfs()
1353 &chan->info_mask_shared_by_all_available); in iio_device_add_channel_sysfs()
1363 if (chan->ext_info) { in iio_device_add_channel_sysfs()
1366 for (ext_info = chan->ext_info; ext_info->name; ext_info++) { in iio_device_add_channel_sysfs()
1367 ret = __iio_add_chan_devattr(ext_info->name, in iio_device_add_channel_sysfs()
1369 ext_info->read ? in iio_device_add_channel_sysfs()
1371 ext_info->write ? in iio_device_add_channel_sysfs()
1374 ext_info->shared, in iio_device_add_channel_sysfs()
1375 &indio_dev->dev, in iio_device_add_channel_sysfs()
1377 &iio_dev_opaque->channel_attr_list); in iio_device_add_channel_sysfs()
1379 if (ret == -EBUSY && ext_info->shared) in iio_device_add_channel_sysfs()
1393 * iio_free_chan_devattr_list() - Free a list of IIO device attributes
1404 kfree_const(p->dev_attr.attr.name); in iio_free_chan_devattr_list()
1405 list_del(&p->l); in iio_free_chan_devattr_list()
1415 return sysfs_emit(buf, "%s\n", indio_dev->name); in name_show()
1425 return sysfs_emit(buf, "%s\n", indio_dev->label); in label_show()
1490 return -EINVAL; in current_timestamp_clock_store()
1504 const struct attribute_group **new, **old = iio_dev_opaque->groups; in iio_device_register_sysfs_group()
1505 unsigned int cnt = iio_dev_opaque->groupcounter; in iio_device_register_sysfs_group()
1509 return -ENOMEM; in iio_device_register_sysfs_group()
1511 new[iio_dev_opaque->groupcounter++] = group; in iio_device_register_sysfs_group()
1512 new[iio_dev_opaque->groupcounter] = NULL; in iio_device_register_sysfs_group()
1514 iio_dev_opaque->groups = new; in iio_device_register_sysfs_group()
1529 if (indio_dev->info->attrs) { in iio_device_register_sysfs()
1530 attr = indio_dev->info->attrs->attrs; in iio_device_register_sysfs()
1536 * New channel registration method - relies on the fact a group does in iio_device_register_sysfs()
1539 if (indio_dev->channels) in iio_device_register_sysfs()
1540 for (i = 0; i < indio_dev->num_channels; i++) { in iio_device_register_sysfs()
1542 &indio_dev->channels[i]; in iio_device_register_sysfs()
1544 if (chan->type == IIO_TIMESTAMP) in iio_device_register_sysfs()
1553 if (iio_dev_opaque->event_interface) in iio_device_register_sysfs()
1556 if (indio_dev->name) in iio_device_register_sysfs()
1558 if (indio_dev->label) in iio_device_register_sysfs()
1563 iio_dev_opaque->chan_attr_group.attrs = in iio_device_register_sysfs()
1565 sizeof(iio_dev_opaque->chan_attr_group.attrs[0]), in iio_device_register_sysfs()
1567 if (iio_dev_opaque->chan_attr_group.attrs == NULL) { in iio_device_register_sysfs()
1568 ret = -ENOMEM; in iio_device_register_sysfs()
1572 if (indio_dev->info->attrs) { in iio_device_register_sysfs()
1573 memcpy(iio_dev_opaque->chan_attr_group.attrs, in iio_device_register_sysfs()
1574 indio_dev->info->attrs->attrs, in iio_device_register_sysfs()
1575 sizeof(iio_dev_opaque->chan_attr_group.attrs[0]) in iio_device_register_sysfs()
1577 iio_dev_opaque->chan_attr_group.is_visible = in iio_device_register_sysfs()
1578 indio_dev->info->attrs->is_visible; in iio_device_register_sysfs()
1579 iio_dev_opaque->chan_attr_group.bin_attrs = in iio_device_register_sysfs()
1580 indio_dev->info->attrs->bin_attrs; in iio_device_register_sysfs()
1584 list_for_each_entry(p, &iio_dev_opaque->channel_attr_list, l) in iio_device_register_sysfs()
1585 iio_dev_opaque->chan_attr_group.attrs[attrn++] = &p->dev_attr.attr; in iio_device_register_sysfs()
1586 if (indio_dev->name) in iio_device_register_sysfs()
1587 iio_dev_opaque->chan_attr_group.attrs[attrn++] = &dev_attr_name.attr; in iio_device_register_sysfs()
1588 if (indio_dev->label) in iio_device_register_sysfs()
1589 iio_dev_opaque->chan_attr_group.attrs[attrn++] = &dev_attr_label.attr; in iio_device_register_sysfs()
1591 iio_dev_opaque->chan_attr_group.attrs[attrn++] = clk; in iio_device_register_sysfs()
1594 &iio_dev_opaque->chan_attr_group); in iio_device_register_sysfs()
1601 kfree(iio_dev_opaque->chan_attr_group.attrs); in iio_device_register_sysfs()
1602 iio_dev_opaque->chan_attr_group.attrs = NULL; in iio_device_register_sysfs()
1604 iio_free_chan_devattr_list(&iio_dev_opaque->channel_attr_list); in iio_device_register_sysfs()
1613 iio_free_chan_devattr_list(&iio_dev_opaque->channel_attr_list); in iio_device_unregister_sysfs()
1614 kfree(iio_dev_opaque->chan_attr_group.attrs); in iio_device_unregister_sysfs()
1615 iio_dev_opaque->chan_attr_group.attrs = NULL; in iio_device_unregister_sysfs()
1616 kfree(iio_dev_opaque->groups); in iio_device_unregister_sysfs()
1617 iio_dev_opaque->groups = NULL; in iio_device_unregister_sysfs()
1625 if (indio_dev->modes & INDIO_ALL_TRIGGERED_MODES) in iio_dev_release()
1632 lockdep_unregister_key(&iio_dev_opaque->mlock_key); in iio_dev_release()
1634 ida_free(&iio_ida, iio_dev_opaque->id); in iio_dev_release()
1644 * iio_device_alloc() - allocate an iio_dev from a driver
1666 indio_dev = &iio_dev_opaque->indio_dev; in iio_device_alloc()
1672 indio_dev->dev.parent = parent; in iio_device_alloc()
1673 indio_dev->dev.type = &iio_device_type; in iio_device_alloc()
1674 indio_dev->dev.bus = &iio_bus_type; in iio_device_alloc()
1675 device_initialize(&indio_dev->dev); in iio_device_alloc()
1676 mutex_init(&iio_dev_opaque->mlock); in iio_device_alloc()
1677 mutex_init(&iio_dev_opaque->info_exist_lock); in iio_device_alloc()
1678 INIT_LIST_HEAD(&iio_dev_opaque->channel_attr_list); in iio_device_alloc()
1680 iio_dev_opaque->id = ida_alloc(&iio_ida, GFP_KERNEL); in iio_device_alloc()
1681 if (iio_dev_opaque->id < 0) { in iio_device_alloc()
1688 if (dev_set_name(&indio_dev->dev, "iio:device%d", iio_dev_opaque->id)) { in iio_device_alloc()
1689 ida_free(&iio_ida, iio_dev_opaque->id); in iio_device_alloc()
1694 INIT_LIST_HEAD(&iio_dev_opaque->buffer_list); in iio_device_alloc()
1695 INIT_LIST_HEAD(&iio_dev_opaque->ioctl_handlers); in iio_device_alloc()
1697 lockdep_register_key(&iio_dev_opaque->mlock_key); in iio_device_alloc()
1698 lockdep_set_class(&iio_dev_opaque->mlock, &iio_dev_opaque->mlock_key); in iio_device_alloc()
1705 * iio_device_free() - free an iio_dev from a driver
1711 put_device(&dev->dev); in iio_device_free()
1721 * devm_iio_device_alloc - Resource-managed iio_device_alloc()
1750 * iio_chrdev_open() - chrdev file open for buffer access and ioctls
1755 * Returns: 0 on success or -EBUSY if the device is already opened
1760 container_of(inode->i_cdev, struct iio_dev_opaque, chrdev); in iio_chrdev_open()
1761 struct iio_dev *indio_dev = &iio_dev_opaque->indio_dev; in iio_chrdev_open()
1764 if (test_and_set_bit(IIO_BUSY_BIT_POS, &iio_dev_opaque->flags)) in iio_chrdev_open()
1765 return -EBUSY; in iio_chrdev_open()
1772 clear_bit(IIO_BUSY_BIT_POS, &iio_dev_opaque->flags); in iio_chrdev_open()
1773 return -ENOMEM; in iio_chrdev_open()
1776 ib->indio_dev = indio_dev; in iio_chrdev_open()
1777 ib->buffer = indio_dev->buffer; in iio_chrdev_open()
1779 filp->private_data = ib; in iio_chrdev_open()
1785 * iio_chrdev_release() - chrdev file close buffer access and ioctls
1793 struct iio_dev_buffer_pair *ib = filp->private_data; in iio_chrdev_release()
1795 container_of(inode->i_cdev, struct iio_dev_opaque, chrdev); in iio_chrdev_release()
1796 struct iio_dev *indio_dev = &iio_dev_opaque->indio_dev; in iio_chrdev_release()
1799 clear_bit(IIO_BUSY_BIT_POS, &iio_dev_opaque->flags); in iio_chrdev_release()
1810 list_add_tail(&h->entry, &iio_dev_opaque->ioctl_handlers); in iio_device_ioctl_handler_register()
1815 list_del(&h->entry); in iio_device_ioctl_handler_unregister()
1820 struct iio_dev_buffer_pair *ib = filp->private_data; in iio_ioctl()
1821 struct iio_dev *indio_dev = ib->indio_dev; in iio_ioctl()
1826 guard(mutex)(&iio_dev_opaque->info_exist_lock); in iio_ioctl()
1832 if (!indio_dev->info) in iio_ioctl()
1833 return -ENODEV; in iio_ioctl()
1835 list_for_each_entry(h, &iio_dev_opaque->ioctl_handlers, entry) { in iio_ioctl()
1836 ret = h->ioctl(indio_dev, filp, cmd, arg); in iio_ioctl()
1841 return -ENODEV; in iio_ioctl()
1868 const struct iio_chan_spec *channels = indio_dev->channels; in iio_check_unique_scan_index()
1870 if (!(indio_dev->modes & INDIO_ALL_BUFFER_MODES)) in iio_check_unique_scan_index()
1873 for (i = 0; i < indio_dev->num_channels - 1; i++) { in iio_check_unique_scan_index()
1876 for (j = i + 1; j < indio_dev->num_channels; j++) in iio_check_unique_scan_index()
1878 dev_err(&indio_dev->dev, in iio_check_unique_scan_index()
1881 return -EINVAL; in iio_check_unique_scan_index()
1892 if (!indio_dev->info->read_label) in iio_check_extended_name()
1895 for (i = 0; i < indio_dev->num_channels; i++) { in iio_check_extended_name()
1896 if (indio_dev->channels[i].extend_name) { in iio_check_extended_name()
1897 dev_err(&indio_dev->dev, in iio_check_extended_name()
1899 return -EINVAL; in iio_check_extended_name()
1914 av_masks = indio_dev->available_scan_masks; in iio_sanity_check_avail_scan_masks()
1928 dev_warn(indio_dev->dev.parent, in iio_sanity_check_avail_scan_masks()
1932 dev_warn(indio_dev->dev.parent, "empty scan mask\n"); in iio_sanity_check_avail_scan_masks()
1940 av_masks = indio_dev->available_scan_masks; in iio_sanity_check_avail_scan_masks()
1951 for (i = 0; i < num_masks - 1; i++) { in iio_sanity_check_avail_scan_masks()
1961 dev_warn(indio_dev->dev.parent, in iio_sanity_check_avail_scan_masks()
1969 * iio_active_scan_mask_index - Get index of the active scan mask inside the
1973 * Returns: the index or -EINVAL if active_scan_mask is not set
1982 if (!indio_dev->active_scan_mask) in iio_active_scan_mask_index()
1983 return -EINVAL; in iio_active_scan_mask_index()
1987 * the condition here do not handle multi-long masks correctly. in iio_active_scan_mask_index()
1997 av_masks = indio_dev->available_scan_masks; in iio_active_scan_mask_index()
1999 if (indio_dev->active_scan_mask == av_masks) in iio_active_scan_mask_index()
2005 dev_warn(indio_dev->dev.parent, in iio_active_scan_mask_index()
2007 return -EINVAL; in iio_active_scan_mask_index()
2017 if (!indio_dev->info) in __iio_device_register()
2018 return -EINVAL; in __iio_device_register()
2020 iio_dev_opaque->driver_module = this_mod; in __iio_device_register()
2023 if (dev_fwnode(&indio_dev->dev)) in __iio_device_register()
2024 fwnode = dev_fwnode(&indio_dev->dev); in __iio_device_register()
2026 else if (indio_dev->dev.parent) in __iio_device_register()
2027 fwnode = dev_fwnode(indio_dev->dev.parent); in __iio_device_register()
2028 device_set_node(&indio_dev->dev, fwnode); in __iio_device_register()
2030 fwnode_property_read_string(fwnode, "label", &indio_dev->label); in __iio_device_register()
2044 dev_err(indio_dev->dev.parent, in __iio_device_register()
2049 if (indio_dev->available_scan_masks) in __iio_device_register()
2054 dev_err(indio_dev->dev.parent, in __iio_device_register()
2060 dev_err(indio_dev->dev.parent, in __iio_device_register()
2064 if (indio_dev->modes & INDIO_ALL_TRIGGERED_MODES) in __iio_device_register()
2067 if ((indio_dev->modes & INDIO_ALL_BUFFER_MODES) && in __iio_device_register()
2068 indio_dev->setup_ops == NULL) in __iio_device_register()
2069 indio_dev->setup_ops = &noop_ring_setup_ops; in __iio_device_register()
2071 if (iio_dev_opaque->attached_buffers_cnt) in __iio_device_register()
2072 cdev_init(&iio_dev_opaque->chrdev, &iio_buffer_fileops); in __iio_device_register()
2073 else if (iio_dev_opaque->event_interface) in __iio_device_register()
2074 cdev_init(&iio_dev_opaque->chrdev, &iio_event_fileops); in __iio_device_register()
2076 if (iio_dev_opaque->attached_buffers_cnt || iio_dev_opaque->event_interface) { in __iio_device_register()
2077 indio_dev->dev.devt = MKDEV(MAJOR(iio_devt), iio_dev_opaque->id); in __iio_device_register()
2078 iio_dev_opaque->chrdev.owner = this_mod; in __iio_device_register()
2082 indio_dev->dev.groups = iio_dev_opaque->groups; in __iio_device_register()
2084 ret = cdev_device_add(&iio_dev_opaque->chrdev, &indio_dev->dev); in __iio_device_register()
2103 * iio_device_unregister() - unregister a device from the IIO subsystem
2110 cdev_device_del(&iio_dev_opaque->chrdev, &indio_dev->dev); in iio_device_unregister()
2112 scoped_guard(mutex, &iio_dev_opaque->info_exist_lock) { in iio_device_unregister()
2117 indio_dev->info = NULL; in iio_device_unregister()
2146 * iio_device_claim_direct_mode - Keep device in direct mode
2154 * Returns: 0 on success, -EBUSY on failure.
2160 mutex_lock(&iio_dev_opaque->mlock); in iio_device_claim_direct_mode()
2163 mutex_unlock(&iio_dev_opaque->mlock); in iio_device_claim_direct_mode()
2164 return -EBUSY; in iio_device_claim_direct_mode()
2171 * iio_device_release_direct_mode - releases claim on direct mode
2181 mutex_unlock(&to_iio_dev_opaque(indio_dev)->mlock); in iio_device_release_direct_mode()
2186 * iio_device_claim_buffer_mode - Keep device in buffer mode
2194 * Returns: 0 on success, -EBUSY on failure.
2200 mutex_lock(&iio_dev_opaque->mlock); in iio_device_claim_buffer_mode()
2205 mutex_unlock(&iio_dev_opaque->mlock); in iio_device_claim_buffer_mode()
2206 return -EBUSY; in iio_device_claim_buffer_mode()
2211 * iio_device_release_buffer_mode - releases claim on buffer mode
2221 mutex_unlock(&to_iio_dev_opaque(indio_dev)->mlock); in iio_device_release_buffer_mode()
2226 * iio_device_get_current_mode() - helper function providing read-only access to
2234 return iio_dev_opaque->currentmode; in iio_device_get_current_mode()