Lines Matching +full:mount +full:- +full:matrix

1 // SPDX-License-Identifier: GPL-2.0-only
9 #define pr_fmt(fmt) "iio-core: " fmt
28 #include <linux/iio/iio-opaque.h>
173 * iio_device_id() - query the unique ID for the device
183 return iio_dev_opaque->id; in iio_device_id()
188 * iio_sysfs_match_string_with_gaps - matches given string in an array with gaps
193 * Returns index of @str in the @array or -EINVAL, similar to match_string().
197 * The search will continue until the element is found or the n-th element
214 return -EINVAL; in iio_sysfs_match_string_with_gaps()
225 return iio_dev_opaque->debugfs_dentry; in iio_get_debugfs_dentry()
231 * iio_find_channel_from_si() - get channel from its scan index
240 for (i = 0; i < indio_dev->num_channels; i++) in iio_find_channel_from_si()
241 if (indio_dev->channels[i].scan_index == si) in iio_find_channel_from_si()
242 return &indio_dev->channels[i]; in iio_find_channel_from_si()
251 return sysfs_emit(buf, "%s\n", to_iio_const_attr(attr)->string); in iio_read_const_attr()
256 * iio_device_set_clock() - Set current timestamping clock for the device
264 const struct iio_event_interface *ev_int = iio_dev_opaque->event_interface; in iio_device_set_clock()
266 ret = mutex_lock_interruptible(&indio_dev->mlock); in iio_device_set_clock()
271 mutex_unlock(&indio_dev->mlock); in iio_device_set_clock()
272 return -EBUSY; in iio_device_set_clock()
274 iio_dev_opaque->clock_id = clock_id; in iio_device_set_clock()
275 mutex_unlock(&indio_dev->mlock); in iio_device_set_clock()
282 * iio_device_get_clock() - Retrieve current timestamping clock for the device
289 return iio_dev_opaque->clock_id; in iio_device_get_clock()
294 * iio_get_time_ns() - utility function to get a time stamp for events etc
324 * iio_get_time_res() - utility function to get time stamp clock resolution in
385 struct iio_dev *indio_dev = file->private_data; in iio_debugfs_read_reg()
392 iio_dev_opaque->read_buf, in iio_debugfs_read_reg()
393 iio_dev_opaque->read_buf_len); in iio_debugfs_read_reg()
395 ret = indio_dev->info->debugfs_reg_access(indio_dev, in iio_debugfs_read_reg()
396 iio_dev_opaque->cached_reg_addr, in iio_debugfs_read_reg()
399 dev_err(indio_dev->dev.parent, "%s: read failed\n", __func__); in iio_debugfs_read_reg()
403 iio_dev_opaque->read_buf_len = snprintf(iio_dev_opaque->read_buf, in iio_debugfs_read_reg()
404 sizeof(iio_dev_opaque->read_buf), in iio_debugfs_read_reg()
408 iio_dev_opaque->read_buf, in iio_debugfs_read_reg()
409 iio_dev_opaque->read_buf_len); in iio_debugfs_read_reg()
415 struct iio_dev *indio_dev = file->private_data; in iio_debugfs_write_reg()
421 count = min_t(size_t, count, (sizeof(buf)-1)); in iio_debugfs_write_reg()
423 return -EFAULT; in iio_debugfs_write_reg()
431 iio_dev_opaque->cached_reg_addr = reg; in iio_debugfs_write_reg()
434 iio_dev_opaque->cached_reg_addr = reg; in iio_debugfs_write_reg()
435 ret = indio_dev->info->debugfs_reg_access(indio_dev, reg, in iio_debugfs_write_reg()
438 dev_err(indio_dev->dev.parent, "%s: write failed\n", in iio_debugfs_write_reg()
444 return -EINVAL; in iio_debugfs_write_reg()
459 debugfs_remove_recursive(iio_dev_opaque->debugfs_dentry); in iio_device_unregister_debugfs()
466 if (indio_dev->info->debugfs_reg_access == NULL) in iio_device_register_debugfs()
474 iio_dev_opaque->debugfs_dentry = in iio_device_register_debugfs()
475 debugfs_create_dir(dev_name(&indio_dev->dev), in iio_device_register_debugfs()
479 iio_dev_opaque->debugfs_dentry, indio_dev, in iio_device_register_debugfs()
500 ext_info = &this_attr->c->ext_info[this_attr->address]; in iio_read_channel_ext_info()
502 return ext_info->read(indio_dev, ext_info->private, this_attr->c, buf); in iio_read_channel_ext_info()
514 ext_info = &this_attr->c->ext_info[this_attr->address]; in iio_write_channel_ext_info()
516 return ext_info->write(indio_dev, ext_info->private, in iio_write_channel_ext_info()
517 this_attr->c, buf, len); in iio_write_channel_ext_info()
527 if (!e->num_items) in iio_enum_available_read()
530 for (i = 0; i < e->num_items; ++i) { in iio_enum_available_read()
531 if (!e->items[i]) in iio_enum_available_read()
533 len += sysfs_emit_at(buf, len, "%s ", e->items[i]); in iio_enum_available_read()
537 buf[len - 1] = '\n'; in iio_enum_available_read()
549 if (!e->get) in iio_enum_read()
550 return -EINVAL; in iio_enum_read()
552 i = e->get(indio_dev, chan); in iio_enum_read()
555 else if (i >= e->num_items || !e->items[i]) in iio_enum_read()
556 return -EINVAL; in iio_enum_read()
558 return sysfs_emit(buf, "%s\n", e->items[i]); in iio_enum_read()
569 if (!e->set) in iio_enum_write()
570 return -EINVAL; in iio_enum_write()
572 ret = iio_sysfs_match_string_with_gaps(e->items, e->num_items, buf); in iio_enum_write()
576 ret = e->set(indio_dev, chan, ret); in iio_enum_write()
590 struct iio_mount_matrix *matrix) in iio_setup_mount_idmatrix() argument
592 *matrix = iio_mount_idmatrix; in iio_setup_mount_idmatrix()
593 dev_info(dev, "mounting matrix not found: using identity...\n"); in iio_setup_mount_idmatrix()
610 mtx->rotation[0], mtx->rotation[1], mtx->rotation[2], in iio_show_mount_matrix()
611 mtx->rotation[3], mtx->rotation[4], mtx->rotation[5], in iio_show_mount_matrix()
612 mtx->rotation[6], mtx->rotation[7], mtx->rotation[8]); in iio_show_mount_matrix()
617 * iio_read_mount_matrix() - retrieve iio device mounting matrix from
618 * device "mount-matrix" property
619 * @dev: device the mounting matrix property is assigned to
620 * @matrix: where to store retrieved matrix
622 * If device is assigned no mounting matrix property, a default 3x3 identity
623 * matrix will be filled in.
627 int iio_read_mount_matrix(struct device *dev, struct iio_mount_matrix *matrix) in iio_read_mount_matrix() argument
632 err = device_property_read_string_array(dev, "mount-matrix", matrix->rotation, len); in iio_read_mount_matrix()
637 /* Invalid number of matrix entries. */ in iio_read_mount_matrix()
638 return -EINVAL; in iio_read_mount_matrix()
640 if (err != -EINVAL) in iio_read_mount_matrix()
641 /* Invalid matrix declaration format. */ in iio_read_mount_matrix()
644 /* Matrix was not declared at all: fallback to identity. */ in iio_read_mount_matrix()
645 return iio_setup_mount_idmatrix(dev, matrix); in iio_read_mount_matrix()
664 return sysfs_emit_at(buf, offset, "-%d.%06u%s", in __iio_format_value()
665 abs(vals[0]), -vals[1], in __iio_format_value()
672 return sysfs_emit_at(buf, offset, "-%d.%09u", in __iio_format_value()
673 abs(vals[0]), -vals[1]); in __iio_format_value()
682 return sysfs_emit_at(buf, offset, "-0.%09u", abs(tmp1)); in __iio_format_value()
690 return sysfs_emit_at(buf, offset, "-0.%09u", abs(tmp1)); in __iio_format_value()
711 * iio_format_value() - Formats a IIO value into its string representation
729 if (len >= PAGE_SIZE - 1) in iio_format_value()
730 return -EFBIG; in iio_format_value()
743 if (indio_dev->info->read_label) in iio_read_channel_label()
744 return indio_dev->info->read_label(indio_dev, this_attr->c, buf); in iio_read_channel_label()
746 if (this_attr->c->extend_name) in iio_read_channel_label()
747 return sprintf(buf, "%s\n", this_attr->c->extend_name); in iio_read_channel_label()
749 return -EINVAL; in iio_read_channel_label()
762 if (indio_dev->info->read_raw_multi) in iio_read_channel_info()
763 ret = indio_dev->info->read_raw_multi(indio_dev, this_attr->c, in iio_read_channel_info()
766 this_attr->address); in iio_read_channel_info()
768 ret = indio_dev->info->read_raw(indio_dev, this_attr->c, in iio_read_channel_info()
769 &vals[0], &vals[1], this_attr->address); in iio_read_channel_info()
795 for (i = 0; i <= length - stride; i += stride) { in iio_format_list()
799 return -EFBIG; in iio_format_list()
804 return -EFBIG; in iio_format_list()
835 ret = indio_dev->info->read_avail(indio_dev, this_attr->c, in iio_read_channel_info_avail()
837 this_attr->address); in iio_read_channel_info_avail()
847 return -EINVAL; in iio_read_channel_info_avail()
852 * __iio_str_to_fixpoint() - Parse a fixed-point number from a string
874 if (str[0] == '-') { in __iio_str_to_fixpoint()
884 i = i * 10 + *str - '0'; in __iio_str_to_fixpoint()
886 f += fract_mult * (*str - '0'); in __iio_str_to_fixpoint()
893 return -EINVAL; in __iio_str_to_fixpoint()
894 } else if (!strncmp(str, " dB", sizeof(" dB") - 1) && scale_db) { in __iio_str_to_fixpoint()
896 str += sizeof(" dB") - 1; in __iio_str_to_fixpoint()
898 } else if (!strncmp(str, "dB", sizeof("dB") - 1) && scale_db) { in __iio_str_to_fixpoint()
900 str += sizeof("dB") - 1; in __iio_str_to_fixpoint()
905 return -EINVAL; in __iio_str_to_fixpoint()
912 i = -i; in __iio_str_to_fixpoint()
914 f = -f; in __iio_str_to_fixpoint()
924 * iio_str_to_fixpoint() - Parse a fixed-point number from a string
952 /* Assumes decimal - precision based on number of digits */ in iio_write_channel_info()
953 if (!indio_dev->info->write_raw) in iio_write_channel_info()
954 return -EINVAL; in iio_write_channel_info()
956 if (indio_dev->info->write_raw_get_fmt) in iio_write_channel_info()
957 switch (indio_dev->info->write_raw_get_fmt(indio_dev, in iio_write_channel_info()
958 this_attr->c, this_attr->address)) { in iio_write_channel_info()
975 return -EINVAL; in iio_write_channel_info()
982 return -EINVAL; in iio_write_channel_info()
991 ret = indio_dev->info->write_raw(indio_dev, this_attr->c, in iio_write_channel_info()
992 integer, fract, this_attr->address); in iio_write_channel_info()
1015 sysfs_attr_init(&dev_attr->attr); in __iio_device_attr_init()
1018 if (chan->modified && (shared_by == IIO_SEPARATE)) { in __iio_device_attr_init()
1019 if (chan->extend_name) in __iio_device_attr_init()
1022 ->channel2], in __iio_device_attr_init()
1023 chan->extend_name, in __iio_device_attr_init()
1028 ->channel2], in __iio_device_attr_init()
1031 if (chan->extend_name == NULL || shared_by != IIO_SEPARATE) in __iio_device_attr_init()
1036 chan->extend_name, in __iio_device_attr_init()
1040 return -ENOMEM; in __iio_device_attr_init()
1042 if (chan->differential) { /* Differential can not have modifier */ in __iio_device_attr_init()
1049 iio_direction[chan->output], in __iio_device_attr_init()
1053 name = kasprintf(GFP_KERNEL, "%s_%s-%s_%s", in __iio_device_attr_init()
1054 iio_direction[chan->output], in __iio_device_attr_init()
1055 iio_chan_type_name_spec[chan->type], in __iio_device_attr_init()
1056 iio_chan_type_name_spec[chan->type], in __iio_device_attr_init()
1060 if (!chan->indexed) { in __iio_device_attr_init()
1062 ret = -EINVAL; in __iio_device_attr_init()
1066 "%s_%s%d-%s%d_%s", in __iio_device_attr_init()
1067 iio_direction[chan->output], in __iio_device_attr_init()
1068 iio_chan_type_name_spec[chan->type], in __iio_device_attr_init()
1069 chan->channel, in __iio_device_attr_init()
1070 iio_chan_type_name_spec[chan->type], in __iio_device_attr_init()
1071 chan->channel2, in __iio_device_attr_init()
1082 iio_direction[chan->output], in __iio_device_attr_init()
1087 iio_direction[chan->output], in __iio_device_attr_init()
1088 iio_chan_type_name_spec[chan->type], in __iio_device_attr_init()
1093 if (chan->indexed) in __iio_device_attr_init()
1095 iio_direction[chan->output], in __iio_device_attr_init()
1096 iio_chan_type_name_spec[chan->type], in __iio_device_attr_init()
1097 chan->channel, in __iio_device_attr_init()
1101 iio_direction[chan->output], in __iio_device_attr_init()
1102 iio_chan_type_name_spec[chan->type], in __iio_device_attr_init()
1108 ret = -ENOMEM; in __iio_device_attr_init()
1111 dev_attr->attr.name = name; in __iio_device_attr_init()
1114 dev_attr->attr.mode |= S_IRUGO; in __iio_device_attr_init()
1115 dev_attr->show = readfunc; in __iio_device_attr_init()
1119 dev_attr->attr.mode |= S_IWUSR; in __iio_device_attr_init()
1120 dev_attr->store = writefunc; in __iio_device_attr_init()
1131 kfree(dev_attr->attr.name); in __iio_device_attr_deinit()
1154 return -ENOMEM; in __iio_add_chan_devattr()
1155 ret = __iio_device_attr_init(&iio_attr->dev_attr, in __iio_add_chan_devattr()
1160 iio_attr->c = chan; in __iio_add_chan_devattr()
1161 iio_attr->address = mask; in __iio_add_chan_devattr()
1162 iio_attr->buffer = buffer; in __iio_add_chan_devattr()
1164 if (strcmp(t->dev_attr.attr.name, in __iio_add_chan_devattr()
1165 iio_attr->dev_attr.attr.name) == 0) { in __iio_add_chan_devattr()
1168 t->dev_attr.attr.name); in __iio_add_chan_devattr()
1169 ret = -EBUSY; in __iio_add_chan_devattr()
1172 list_add(&iio_attr->l, attr_list); in __iio_add_chan_devattr()
1177 __iio_device_attr_deinit(&iio_attr->dev_attr); in __iio_add_chan_devattr()
1189 if (!indio_dev->info->read_label && !chan->extend_name) in iio_device_add_channel_label()
1198 &indio_dev->dev, in iio_device_add_channel_label()
1200 &iio_dev_opaque->channel_attr_list); in iio_device_add_channel_label()
1217 return -EINVAL; in iio_device_add_info_mask_type()
1224 &indio_dev->dev, in iio_device_add_info_mask_type()
1226 &iio_dev_opaque->channel_attr_list); in iio_device_add_info_mask_type()
1227 if ((ret == -EBUSY) && (shared_by != IIO_SEPARATE)) in iio_device_add_info_mask_type()
1248 return -EINVAL; in iio_device_add_info_mask_type_avail()
1253 return -ENOMEM; in iio_device_add_info_mask_type_avail()
1261 &indio_dev->dev, in iio_device_add_info_mask_type_avail()
1263 &iio_dev_opaque->channel_attr_list); in iio_device_add_info_mask_type_avail()
1265 if ((ret == -EBUSY) && (shared_by != IIO_SEPARATE)) in iio_device_add_info_mask_type_avail()
1282 if (chan->channel < 0) in iio_device_add_channel_sysfs()
1286 &chan->info_mask_separate); in iio_device_add_channel_sysfs()
1293 &chan-> in iio_device_add_channel_sysfs()
1301 &chan->info_mask_shared_by_type); in iio_device_add_channel_sysfs()
1308 &chan-> in iio_device_add_channel_sysfs()
1316 &chan->info_mask_shared_by_dir); in iio_device_add_channel_sysfs()
1323 &chan->info_mask_shared_by_dir_available); in iio_device_add_channel_sysfs()
1330 &chan->info_mask_shared_by_all); in iio_device_add_channel_sysfs()
1337 &chan->info_mask_shared_by_all_available); in iio_device_add_channel_sysfs()
1347 if (chan->ext_info) { in iio_device_add_channel_sysfs()
1349 for (ext_info = chan->ext_info; ext_info->name; ext_info++) { in iio_device_add_channel_sysfs()
1350 ret = __iio_add_chan_devattr(ext_info->name, in iio_device_add_channel_sysfs()
1352 ext_info->read ? in iio_device_add_channel_sysfs()
1354 ext_info->write ? in iio_device_add_channel_sysfs()
1357 ext_info->shared, in iio_device_add_channel_sysfs()
1358 &indio_dev->dev, in iio_device_add_channel_sysfs()
1360 &iio_dev_opaque->channel_attr_list); in iio_device_add_channel_sysfs()
1362 if (ret == -EBUSY && ext_info->shared) in iio_device_add_channel_sysfs()
1376 * iio_free_chan_devattr_list() - Free a list of IIO device attributes
1387 kfree_const(p->dev_attr.attr.name); in iio_free_chan_devattr_list()
1388 list_del(&p->l); in iio_free_chan_devattr_list()
1398 return sysfs_emit(buf, "%s\n", indio_dev->name); in iio_show_dev_name()
1408 return sysfs_emit(buf, "%s\n", indio_dev->label); in iio_show_dev_label()
1481 return -EINVAL; in iio_store_timestamp_clock()
1494 const struct attribute_group **new, **old = iio_dev_opaque->groups; in iio_device_register_sysfs_group()
1495 unsigned int cnt = iio_dev_opaque->groupcounter; in iio_device_register_sysfs_group()
1499 return -ENOMEM; in iio_device_register_sysfs_group()
1501 new[iio_dev_opaque->groupcounter++] = group; in iio_device_register_sysfs_group()
1502 new[iio_dev_opaque->groupcounter] = NULL; in iio_device_register_sysfs_group()
1504 iio_dev_opaque->groups = new; in iio_device_register_sysfs_group()
1520 if (indio_dev->info->attrs) { in iio_device_register_sysfs()
1521 attr = indio_dev->info->attrs->attrs; in iio_device_register_sysfs()
1527 * New channel registration method - relies on the fact a group does in iio_device_register_sysfs()
1530 if (indio_dev->channels) in iio_device_register_sysfs()
1531 for (i = 0; i < indio_dev->num_channels; i++) { in iio_device_register_sysfs()
1533 &indio_dev->channels[i]; in iio_device_register_sysfs()
1535 if (chan->type == IIO_TIMESTAMP) in iio_device_register_sysfs()
1544 if (iio_dev_opaque->event_interface) in iio_device_register_sysfs()
1547 if (indio_dev->name) in iio_device_register_sysfs()
1549 if (indio_dev->label) in iio_device_register_sysfs()
1554 iio_dev_opaque->chan_attr_group.attrs = in iio_device_register_sysfs()
1556 sizeof(iio_dev_opaque->chan_attr_group.attrs[0]), in iio_device_register_sysfs()
1558 if (iio_dev_opaque->chan_attr_group.attrs == NULL) { in iio_device_register_sysfs()
1559 ret = -ENOMEM; in iio_device_register_sysfs()
1563 if (indio_dev->info->attrs) { in iio_device_register_sysfs()
1564 memcpy(iio_dev_opaque->chan_attr_group.attrs, in iio_device_register_sysfs()
1565 indio_dev->info->attrs->attrs, in iio_device_register_sysfs()
1566 sizeof(iio_dev_opaque->chan_attr_group.attrs[0]) in iio_device_register_sysfs()
1568 iio_dev_opaque->chan_attr_group.is_visible = in iio_device_register_sysfs()
1569 indio_dev->info->attrs->is_visible; in iio_device_register_sysfs()
1573 list_for_each_entry(p, &iio_dev_opaque->channel_attr_list, l) in iio_device_register_sysfs()
1574 iio_dev_opaque->chan_attr_group.attrs[attrn++] = &p->dev_attr.attr; in iio_device_register_sysfs()
1575 if (indio_dev->name) in iio_device_register_sysfs()
1576 iio_dev_opaque->chan_attr_group.attrs[attrn++] = &dev_attr_name.attr; in iio_device_register_sysfs()
1577 if (indio_dev->label) in iio_device_register_sysfs()
1578 iio_dev_opaque->chan_attr_group.attrs[attrn++] = &dev_attr_label.attr; in iio_device_register_sysfs()
1580 iio_dev_opaque->chan_attr_group.attrs[attrn++] = clk; in iio_device_register_sysfs()
1583 &iio_dev_opaque->chan_attr_group); in iio_device_register_sysfs()
1590 iio_free_chan_devattr_list(&iio_dev_opaque->channel_attr_list); in iio_device_register_sysfs()
1599 iio_free_chan_devattr_list(&iio_dev_opaque->channel_attr_list); in iio_device_unregister_sysfs()
1600 kfree(iio_dev_opaque->chan_attr_group.attrs); in iio_device_unregister_sysfs()
1601 iio_dev_opaque->chan_attr_group.attrs = NULL; in iio_device_unregister_sysfs()
1602 kfree(iio_dev_opaque->groups); in iio_device_unregister_sysfs()
1610 if (indio_dev->modes & INDIO_ALL_TRIGGERED_MODES) in iio_dev_release()
1617 ida_simple_remove(&iio_ida, iio_dev_opaque->id); in iio_dev_release()
1627 * iio_device_alloc() - allocate an iio_dev from a driver
1647 indio_dev = &iio_dev_opaque->indio_dev; in iio_device_alloc()
1648 indio_dev->priv = (char *)iio_dev_opaque + in iio_device_alloc()
1651 indio_dev->dev.parent = parent; in iio_device_alloc()
1652 indio_dev->dev.type = &iio_device_type; in iio_device_alloc()
1653 indio_dev->dev.bus = &iio_bus_type; in iio_device_alloc()
1654 device_initialize(&indio_dev->dev); in iio_device_alloc()
1656 mutex_init(&indio_dev->mlock); in iio_device_alloc()
1657 mutex_init(&iio_dev_opaque->info_exist_lock); in iio_device_alloc()
1658 INIT_LIST_HEAD(&iio_dev_opaque->channel_attr_list); in iio_device_alloc()
1660 iio_dev_opaque->id = ida_simple_get(&iio_ida, 0, 0, GFP_KERNEL); in iio_device_alloc()
1661 if (iio_dev_opaque->id < 0) { in iio_device_alloc()
1667 dev_set_name(&indio_dev->dev, "iio:device%d", iio_dev_opaque->id); in iio_device_alloc()
1668 INIT_LIST_HEAD(&iio_dev_opaque->buffer_list); in iio_device_alloc()
1669 INIT_LIST_HEAD(&iio_dev_opaque->ioctl_handlers); in iio_device_alloc()
1676 * iio_device_free() - free an iio_dev from a driver
1682 put_device(&dev->dev); in iio_device_free()
1692 * devm_iio_device_alloc - Resource-managed iio_device_alloc()
1721 * iio_chrdev_open() - chrdev file open for buffer access and ioctls
1726 * Return: 0 on success or -EBUSY if the device is already opened
1731 container_of(inode->i_cdev, struct iio_dev_opaque, chrdev); in iio_chrdev_open()
1732 struct iio_dev *indio_dev = &iio_dev_opaque->indio_dev; in iio_chrdev_open()
1735 if (test_and_set_bit(IIO_BUSY_BIT_POS, &iio_dev_opaque->flags)) in iio_chrdev_open()
1736 return -EBUSY; in iio_chrdev_open()
1743 clear_bit(IIO_BUSY_BIT_POS, &iio_dev_opaque->flags); in iio_chrdev_open()
1744 return -ENOMEM; in iio_chrdev_open()
1747 ib->indio_dev = indio_dev; in iio_chrdev_open()
1748 ib->buffer = indio_dev->buffer; in iio_chrdev_open()
1750 filp->private_data = ib; in iio_chrdev_open()
1756 * iio_chrdev_release() - chrdev file close buffer access and ioctls
1764 struct iio_dev_buffer_pair *ib = filp->private_data; in iio_chrdev_release()
1766 container_of(inode->i_cdev, struct iio_dev_opaque, chrdev); in iio_chrdev_release()
1767 struct iio_dev *indio_dev = &iio_dev_opaque->indio_dev; in iio_chrdev_release()
1769 clear_bit(IIO_BUSY_BIT_POS, &iio_dev_opaque->flags); in iio_chrdev_release()
1780 list_add_tail(&h->entry, &iio_dev_opaque->ioctl_handlers); in iio_device_ioctl_handler_register()
1785 list_del(&h->entry); in iio_device_ioctl_handler_unregister()
1790 struct iio_dev_buffer_pair *ib = filp->private_data; in iio_ioctl()
1791 struct iio_dev *indio_dev = ib->indio_dev; in iio_ioctl()
1794 int ret = -ENODEV; in iio_ioctl()
1796 mutex_lock(&iio_dev_opaque->info_exist_lock); in iio_ioctl()
1803 if (!indio_dev->info) in iio_ioctl()
1806 list_for_each_entry(h, &iio_dev_opaque->ioctl_handlers, entry) { in iio_ioctl()
1807 ret = h->ioctl(indio_dev, filp, cmd, arg); in iio_ioctl()
1813 ret = -ENODEV; in iio_ioctl()
1816 mutex_unlock(&iio_dev_opaque->info_exist_lock); in iio_ioctl()
1844 const struct iio_chan_spec *channels = indio_dev->channels; in iio_check_unique_scan_index()
1846 if (!(indio_dev->modes & INDIO_ALL_BUFFER_MODES)) in iio_check_unique_scan_index()
1849 for (i = 0; i < indio_dev->num_channels - 1; i++) { in iio_check_unique_scan_index()
1852 for (j = i + 1; j < indio_dev->num_channels; j++) in iio_check_unique_scan_index()
1854 dev_err(&indio_dev->dev, in iio_check_unique_scan_index()
1857 return -EINVAL; in iio_check_unique_scan_index()
1868 if (!indio_dev->info->read_label) in iio_check_extended_name()
1871 for (i = 0; i < indio_dev->num_channels; i++) { in iio_check_extended_name()
1872 if (indio_dev->channels[i].extend_name) { in iio_check_extended_name()
1873 dev_err(&indio_dev->dev, in iio_check_extended_name()
1875 return -EINVAL; in iio_check_extended_name()
1890 if (!indio_dev->info) in __iio_device_register()
1891 return -EINVAL; in __iio_device_register()
1893 iio_dev_opaque->driver_module = this_mod; in __iio_device_register()
1895 if (!indio_dev->dev.of_node && indio_dev->dev.parent) in __iio_device_register()
1896 indio_dev->dev.of_node = indio_dev->dev.parent->of_node; in __iio_device_register()
1898 label = of_get_property(indio_dev->dev.of_node, "label", NULL); in __iio_device_register()
1900 indio_dev->label = label; in __iio_device_register()
1914 dev_err(indio_dev->dev.parent, in __iio_device_register()
1921 dev_err(indio_dev->dev.parent, in __iio_device_register()
1927 dev_err(indio_dev->dev.parent, in __iio_device_register()
1931 if (indio_dev->modes & INDIO_ALL_TRIGGERED_MODES) in __iio_device_register()
1934 if ((indio_dev->modes & INDIO_ALL_BUFFER_MODES) && in __iio_device_register()
1935 indio_dev->setup_ops == NULL) in __iio_device_register()
1936 indio_dev->setup_ops = &noop_ring_setup_ops; in __iio_device_register()
1938 if (iio_dev_opaque->attached_buffers_cnt) in __iio_device_register()
1939 cdev_init(&iio_dev_opaque->chrdev, &iio_buffer_fileops); in __iio_device_register()
1940 else if (iio_dev_opaque->event_interface) in __iio_device_register()
1941 cdev_init(&iio_dev_opaque->chrdev, &iio_event_fileops); in __iio_device_register()
1943 if (iio_dev_opaque->attached_buffers_cnt || iio_dev_opaque->event_interface) { in __iio_device_register()
1944 indio_dev->dev.devt = MKDEV(MAJOR(iio_devt), iio_dev_opaque->id); in __iio_device_register()
1945 iio_dev_opaque->chrdev.owner = this_mod; in __iio_device_register()
1949 indio_dev->dev.groups = iio_dev_opaque->groups; in __iio_device_register()
1951 ret = cdev_device_add(&iio_dev_opaque->chrdev, &indio_dev->dev); in __iio_device_register()
1970 * iio_device_unregister() - unregister a device from the IIO subsystem
1977 cdev_device_del(&iio_dev_opaque->chrdev, &indio_dev->dev); in iio_device_unregister()
1979 mutex_lock(&iio_dev_opaque->info_exist_lock); in iio_device_unregister()
1985 indio_dev->info = NULL; in iio_device_unregister()
1990 mutex_unlock(&iio_dev_opaque->info_exist_lock); in iio_device_unregister()
2015 * iio_device_claim_direct_mode - Keep device in direct mode
2023 * Returns: 0 on success, -EBUSY on failure
2027 mutex_lock(&indio_dev->mlock); in iio_device_claim_direct_mode()
2030 mutex_unlock(&indio_dev->mlock); in iio_device_claim_direct_mode()
2031 return -EBUSY; in iio_device_claim_direct_mode()
2038 * iio_device_release_direct_mode - releases claim on direct mode
2048 mutex_unlock(&indio_dev->mlock); in iio_device_release_direct_mode()