root/include/linux/iio/iio-opaque.h
/* SPDX-License-Identifier: GPL-2.0 */

#ifndef _INDUSTRIAL_IO_OPAQUE_H_
#define _INDUSTRIAL_IO_OPAQUE_H_

/**
 * struct iio_dev_opaque - industrial I/O device opaque information
 * @indio_dev:                  public industrial I/O device information
 * @id:                 used to identify device internally
 * @currentmode:                operating mode currently in use, may be eventually
 *                              checked by device drivers but should be considered
 *                              read-only as this is a core internal bit
 * @driver_module:              used to make it harder to undercut users
 * @mlock:                      lock used to prevent simultaneous device state changes
 * @mlock_key:                  lockdep class for iio_dev lock
 * @info_exist_lock:            lock to prevent use during removal
 * @info_exist_key:             lockdep class for info_exist lock
 * @trig_readonly:              mark the current trigger immutable
 * @event_interface:            event chrdevs associated with interrupt lines
 * @attached_buffers:           array of buffers statically attached by the driver
 * @attached_buffers_cnt:       number of buffers in the array of statically attached buffers
 * @buffer_ioctl_handler:       ioctl() handler for this IIO device's buffer interface
 * @buffer_list:                list of all buffers currently attached
 * @channel_attr_list:          keep track of automatically created channel
 *                              attributes
 * @chan_attr_group:            group for all attrs in base directory
 * @ioctl_handlers:             ioctl handlers registered with the core handler
 * @groups:                     attribute groups
 * @groupcounter:               index of next attribute group
 * @legacy_scan_el_group:       attribute group for legacy scan elements attribute group
 * @legacy_buffer_group:        attribute group for legacy buffer attributes group
 * @bounce_buffer:              for devices that call iio_push_to_buffers_with_ts_unaligned()
 * @bounce_buffer_size:         size of currently allocate bounce buffer
 * @scan_index_timestamp:       cache of the index to the timestamp
 * @clock_id:                   timestamping clock posix identifier
 * @chrdev:                     associated character device
 * @flags:                      file ops related flags including busy flag.
 * @debugfs_dentry:             device specific debugfs dentry
 * @cached_reg_addr:            cached register address for debugfs reads
 * @read_buf:                   read buffer to be used for the initial reg read
 * @read_buf_len:               data length in @read_buf
 */
struct iio_dev_opaque {
        struct iio_dev                  indio_dev;
        int                             currentmode;
        int                             id;
        struct module                   *driver_module;
        struct mutex                    mlock;
        struct lock_class_key           mlock_key;
        struct mutex                    info_exist_lock;
        struct lock_class_key           info_exist_key;
        bool                            trig_readonly;
        struct iio_event_interface      *event_interface;
        struct iio_buffer               **attached_buffers;
        unsigned int                    attached_buffers_cnt;
        struct iio_ioctl_handler        *buffer_ioctl_handler;
        struct list_head                buffer_list;
        struct list_head                channel_attr_list;
        struct attribute_group          chan_attr_group;
        struct list_head                ioctl_handlers;
        const struct attribute_group    **groups;
        int                             groupcounter;
        struct attribute_group          legacy_scan_el_group;
        struct attribute_group          legacy_buffer_group;
        void                            *bounce_buffer;
        size_t                          bounce_buffer_size;

        unsigned int                    scan_index_timestamp;
        clockid_t                       clock_id;
        struct cdev                     chrdev;
        unsigned long                   flags;

#if defined(CONFIG_DEBUG_FS)
        struct dentry                   *debugfs_dentry;
        unsigned int                    cached_reg_addr;
        char                            read_buf[20];
        unsigned int                    read_buf_len;
#endif
};

#define to_iio_dev_opaque(_indio_dev)           \
        container_of((_indio_dev), struct iio_dev_opaque, indio_dev)

#endif