linux/include/linux/iio/buffer.h
<<
>>
Prefs
   1/* The industrial I/O core - generic buffer interfaces.
   2 *
   3 * Copyright (c) 2008 Jonathan Cameron
   4 *
   5 * This program is free software; you can redistribute it and/or modify it
   6 * under the terms of the GNU General Public License version 2 as published by
   7 * the Free Software Foundation.
   8 */
   9
  10#ifndef _IIO_BUFFER_GENERIC_H_
  11#define _IIO_BUFFER_GENERIC_H_
  12#include <linux/sysfs.h>
  13#include <linux/iio/iio.h>
  14#include <linux/kref.h>
  15
  16#ifdef CONFIG_IIO_BUFFER
  17
  18struct iio_buffer;
  19
  20/**
  21 * INDIO_BUFFER_FLAG_FIXED_WATERMARK - Watermark level of the buffer can not be
  22 *   configured. It has a fixed value which will be buffer specific.
  23 */
  24#define INDIO_BUFFER_FLAG_FIXED_WATERMARK BIT(0)
  25
  26/**
  27 * struct iio_buffer_access_funcs - access functions for buffers.
  28 * @store_to:           actually store stuff to the buffer
  29 * @read_first_n:       try to get a specified number of bytes (must exist)
  30 * @data_available:     indicates how much data is available for reading from
  31 *                      the buffer.
  32 * @request_update:     if a parameter change has been marked, update underlying
  33 *                      storage.
  34 * @set_bytes_per_datum:set number of bytes per datum
  35 * @set_length:         set number of datums in buffer
  36 * @enable:             called if the buffer is attached to a device and the
  37 *                      device starts sampling. Calls are balanced with
  38 *                      @disable.
  39 * @disable:            called if the buffer is attached to a device and the
  40 *                      device stops sampling. Calles are balanced with @enable.
  41 * @release:            called when the last reference to the buffer is dropped,
  42 *                      should free all resources allocated by the buffer.
  43 * @modes:              Supported operating modes by this buffer type
  44 * @flags:              A bitmask combination of INDIO_BUFFER_FLAG_*
  45 *
  46 * The purpose of this structure is to make the buffer element
  47 * modular as event for a given driver, different usecases may require
  48 * different buffer designs (space efficiency vs speed for example).
  49 *
  50 * It is worth noting that a given buffer implementation may only support a
  51 * small proportion of these functions.  The core code 'should' cope fine with
  52 * any of them not existing.
  53 **/
  54struct iio_buffer_access_funcs {
  55        int (*store_to)(struct iio_buffer *buffer, const void *data);
  56        int (*read_first_n)(struct iio_buffer *buffer,
  57                            size_t n,
  58                            char __user *buf);
  59        size_t (*data_available)(struct iio_buffer *buffer);
  60
  61        int (*request_update)(struct iio_buffer *buffer);
  62
  63        int (*set_bytes_per_datum)(struct iio_buffer *buffer, size_t bpd);
  64        int (*set_length)(struct iio_buffer *buffer, int length);
  65
  66        int (*enable)(struct iio_buffer *buffer, struct iio_dev *indio_dev);
  67        int (*disable)(struct iio_buffer *buffer, struct iio_dev *indio_dev);
  68
  69        void (*release)(struct iio_buffer *buffer);
  70
  71        unsigned int modes;
  72        unsigned int flags;
  73};
  74
  75/**
  76 * struct iio_buffer - general buffer structure
  77 * @length:             [DEVICE] number of datums in buffer
  78 * @bytes_per_datum:    [DEVICE] size of individual datum including timestamp
  79 * @scan_el_attrs:      [DRIVER] control of scan elements if that scan mode
  80 *                      control method is used
  81 * @scan_mask:          [INTERN] bitmask used in masking scan mode elements
  82 * @scan_timestamp:     [INTERN] does the scan mode include a timestamp
  83 * @access:             [DRIVER] buffer access functions associated with the
  84 *                      implementation.
  85 * @scan_el_dev_attr_list:[INTERN] list of scan element related attributes.
  86 * @buffer_group:       [INTERN] attributes of the buffer group
  87 * @scan_el_group:      [DRIVER] attribute group for those attributes not
  88 *                      created from the iio_chan_info array.
  89 * @pollq:              [INTERN] wait queue to allow for polling on the buffer.
  90 * @stufftoread:        [INTERN] flag to indicate new data.
  91 * @attrs:              [INTERN] standard attributes of the buffer
  92 * @demux_list:         [INTERN] list of operations required to demux the scan.
  93 * @demux_bounce:       [INTERN] buffer for doing gather from incoming scan.
  94 * @buffer_list:        [INTERN] entry in the devices list of current buffers.
  95 * @ref:                [INTERN] reference count of the buffer.
  96 * @watermark:          [INTERN] number of datums to wait for poll/read.
  97 */
  98struct iio_buffer {
  99        int                                     length;
 100        int                                     bytes_per_datum;
 101        struct attribute_group                  *scan_el_attrs;
 102        long                                    *scan_mask;
 103        bool                                    scan_timestamp;
 104        const struct iio_buffer_access_funcs    *access;
 105        struct list_head                        scan_el_dev_attr_list;
 106        struct attribute_group                  buffer_group;
 107        struct attribute_group                  scan_el_group;
 108        wait_queue_head_t                       pollq;
 109        bool                                    stufftoread;
 110        const struct attribute                  **attrs;
 111        struct list_head                        demux_list;
 112        void                                    *demux_bounce;
 113        struct list_head                        buffer_list;
 114        struct kref                             ref;
 115        unsigned int                            watermark;
 116};
 117
 118/**
 119 * iio_update_buffers() - add or remove buffer from active list
 120 * @indio_dev:          device to add buffer to
 121 * @insert_buffer:      buffer to insert
 122 * @remove_buffer:      buffer_to_remove
 123 *
 124 * Note this will tear down the all buffering and build it up again
 125 */
 126int iio_update_buffers(struct iio_dev *indio_dev,
 127                       struct iio_buffer *insert_buffer,
 128                       struct iio_buffer *remove_buffer);
 129
 130/**
 131 * iio_buffer_init() - Initialize the buffer structure
 132 * @buffer:             buffer to be initialized
 133 **/
 134void iio_buffer_init(struct iio_buffer *buffer);
 135
 136int iio_scan_mask_query(struct iio_dev *indio_dev,
 137                        struct iio_buffer *buffer, int bit);
 138
 139/**
 140 * iio_push_to_buffers() - push to a registered buffer.
 141 * @indio_dev:          iio_dev structure for device.
 142 * @data:               Full scan.
 143 */
 144int iio_push_to_buffers(struct iio_dev *indio_dev, const void *data);
 145
 146/*
 147 * iio_push_to_buffers_with_timestamp() - push data and timestamp to buffers
 148 * @indio_dev:          iio_dev structure for device.
 149 * @data:               sample data
 150 * @timestamp:          timestamp for the sample data
 151 *
 152 * Pushes data to the IIO device's buffers. If timestamps are enabled for the
 153 * device the function will store the supplied timestamp as the last element in
 154 * the sample data buffer before pushing it to the device buffers. The sample
 155 * data buffer needs to be large enough to hold the additional timestamp
 156 * (usually the buffer should be indio->scan_bytes bytes large).
 157 *
 158 * Returns 0 on success, a negative error code otherwise.
 159 */
 160static inline int iio_push_to_buffers_with_timestamp(struct iio_dev *indio_dev,
 161        void *data, int64_t timestamp)
 162{
 163        if (indio_dev->scan_timestamp) {
 164                size_t ts_offset = indio_dev->scan_bytes / sizeof(int64_t) - 1;
 165                ((int64_t *)data)[ts_offset] = timestamp;
 166        }
 167
 168        return iio_push_to_buffers(indio_dev, data);
 169}
 170
 171int iio_update_demux(struct iio_dev *indio_dev);
 172
 173bool iio_validate_scan_mask_onehot(struct iio_dev *indio_dev,
 174        const unsigned long *mask);
 175
 176struct iio_buffer *iio_buffer_get(struct iio_buffer *buffer);
 177void iio_buffer_put(struct iio_buffer *buffer);
 178
 179/**
 180 * iio_device_attach_buffer - Attach a buffer to a IIO device
 181 * @indio_dev: The device the buffer should be attached to
 182 * @buffer: The buffer to attach to the device
 183 *
 184 * This function attaches a buffer to a IIO device. The buffer stays attached to
 185 * the device until the device is freed. The function should only be called at
 186 * most once per device.
 187 */
 188static inline void iio_device_attach_buffer(struct iio_dev *indio_dev,
 189        struct iio_buffer *buffer)
 190{
 191        indio_dev->buffer = iio_buffer_get(buffer);
 192}
 193
 194#else /* CONFIG_IIO_BUFFER */
 195
 196static inline void iio_buffer_get(struct iio_buffer *buffer) {}
 197static inline void iio_buffer_put(struct iio_buffer *buffer) {}
 198
 199#endif /* CONFIG_IIO_BUFFER */
 200
 201#endif /* _IIO_BUFFER_GENERIC_H_ */
 202