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 * struct iio_buffer_access_funcs - access functions for buffers.
  22 * @store_to:           actually store stuff to the buffer
  23 * @read_first_n:       try to get a specified number of bytes (must exist)
  24 * @data_available:     indicates whether data for reading from the buffer is
  25 *                      available.
  26 * @request_update:     if a parameter change has been marked, update underlying
  27 *                      storage.
  28 * @set_bytes_per_datum:set number of bytes per datum
  29 * @set_length:         set number of datums in buffer
  30 * @release:            called when the last reference to the buffer is dropped,
  31 *                      should free all resources allocated by the buffer.
  32 *
  33 * The purpose of this structure is to make the buffer element
  34 * modular as event for a given driver, different usecases may require
  35 * different buffer designs (space efficiency vs speed for example).
  36 *
  37 * It is worth noting that a given buffer implementation may only support a
  38 * small proportion of these functions.  The core code 'should' cope fine with
  39 * any of them not existing.
  40 **/
  41struct iio_buffer_access_funcs {
  42        int (*store_to)(struct iio_buffer *buffer, const void *data);
  43        int (*read_first_n)(struct iio_buffer *buffer,
  44                            size_t n,
  45                            char __user *buf);
  46        bool (*data_available)(struct iio_buffer *buffer);
  47
  48        int (*request_update)(struct iio_buffer *buffer);
  49
  50        int (*set_bytes_per_datum)(struct iio_buffer *buffer, size_t bpd);
  51        int (*set_length)(struct iio_buffer *buffer, int length);
  52
  53        void (*release)(struct iio_buffer *buffer);
  54};
  55
  56/**
  57 * struct iio_buffer - general buffer structure
  58 * @length:             [DEVICE] number of datums in buffer
  59 * @bytes_per_datum:    [DEVICE] size of individual datum including timestamp
  60 * @scan_el_attrs:      [DRIVER] control of scan elements if that scan mode
  61 *                      control method is used
  62 * @scan_mask:          [INTERN] bitmask used in masking scan mode elements
  63 * @scan_timestamp:     [INTERN] does the scan mode include a timestamp
  64 * @access:             [DRIVER] buffer access functions associated with the
  65 *                      implementation.
  66 * @scan_el_dev_attr_list:[INTERN] list of scan element related attributes.
  67 * @scan_el_group:      [DRIVER] attribute group for those attributes not
  68 *                      created from the iio_chan_info array.
  69 * @pollq:              [INTERN] wait queue to allow for polling on the buffer.
  70 * @stufftoread:        [INTERN] flag to indicate new data.
  71 * @demux_list:         [INTERN] list of operations required to demux the scan.
  72 * @demux_bounce:       [INTERN] buffer for doing gather from incoming scan.
  73 * @buffer_list:        [INTERN] entry in the devices list of current buffers.
  74 * @ref:                [INTERN] reference count of the buffer.
  75 */
  76struct iio_buffer {
  77        int                                     length;
  78        int                                     bytes_per_datum;
  79        struct attribute_group                  *scan_el_attrs;
  80        long                                    *scan_mask;
  81        bool                                    scan_timestamp;
  82        const struct iio_buffer_access_funcs    *access;
  83        struct list_head                        scan_el_dev_attr_list;
  84        struct attribute_group                  buffer_group;
  85        struct attribute_group                  scan_el_group;
  86        wait_queue_head_t                       pollq;
  87        bool                                    stufftoread;
  88        const struct attribute                  **attrs;
  89        struct list_head                        demux_list;
  90        void                                    *demux_bounce;
  91        struct list_head                        buffer_list;
  92        struct kref                             ref;
  93};
  94
  95/**
  96 * iio_update_buffers() - add or remove buffer from active list
  97 * @indio_dev:          device to add buffer to
  98 * @insert_buffer:      buffer to insert
  99 * @remove_buffer:      buffer_to_remove
 100 *
 101 * Note this will tear down the all buffering and build it up again
 102 */
 103int iio_update_buffers(struct iio_dev *indio_dev,
 104                       struct iio_buffer *insert_buffer,
 105                       struct iio_buffer *remove_buffer);
 106
 107/**
 108 * iio_buffer_init() - Initialize the buffer structure
 109 * @buffer:             buffer to be initialized
 110 **/
 111void iio_buffer_init(struct iio_buffer *buffer);
 112
 113int iio_scan_mask_query(struct iio_dev *indio_dev,
 114                        struct iio_buffer *buffer, int bit);
 115
 116/**
 117 * iio_push_to_buffers() - push to a registered buffer.
 118 * @indio_dev:          iio_dev structure for device.
 119 * @data:               Full scan.
 120 */
 121int iio_push_to_buffers(struct iio_dev *indio_dev, const void *data);
 122
 123/*
 124 * iio_push_to_buffers_with_timestamp() - push data and timestamp to buffers
 125 * @indio_dev:          iio_dev structure for device.
 126 * @data:               sample data
 127 * @timestamp:          timestamp for the sample data
 128 *
 129 * Pushes data to the IIO device's buffers. If timestamps are enabled for the
 130 * device the function will store the supplied timestamp as the last element in
 131 * the sample data buffer before pushing it to the device buffers. The sample
 132 * data buffer needs to be large enough to hold the additional timestamp
 133 * (usually the buffer should be indio->scan_bytes bytes large).
 134 *
 135 * Returns 0 on success, a negative error code otherwise.
 136 */
 137static inline int iio_push_to_buffers_with_timestamp(struct iio_dev *indio_dev,
 138        void *data, int64_t timestamp)
 139{
 140        if (indio_dev->scan_timestamp) {
 141                size_t ts_offset = indio_dev->scan_bytes / sizeof(int64_t) - 1;
 142                ((int64_t *)data)[ts_offset] = timestamp;
 143        }
 144
 145        return iio_push_to_buffers(indio_dev, data);
 146}
 147
 148int iio_update_demux(struct iio_dev *indio_dev);
 149
 150bool iio_validate_scan_mask_onehot(struct iio_dev *indio_dev,
 151        const unsigned long *mask);
 152
 153struct iio_buffer *iio_buffer_get(struct iio_buffer *buffer);
 154void iio_buffer_put(struct iio_buffer *buffer);
 155
 156/**
 157 * iio_device_attach_buffer - Attach a buffer to a IIO device
 158 * @indio_dev: The device the buffer should be attached to
 159 * @buffer: The buffer to attach to the device
 160 *
 161 * This function attaches a buffer to a IIO device. The buffer stays attached to
 162 * the device until the device is freed. The function should only be called at
 163 * most once per device.
 164 */
 165static inline void iio_device_attach_buffer(struct iio_dev *indio_dev,
 166        struct iio_buffer *buffer)
 167{
 168        indio_dev->buffer = iio_buffer_get(buffer);
 169}
 170
 171#else /* CONFIG_IIO_BUFFER */
 172
 173static inline void iio_buffer_get(struct iio_buffer *buffer) {}
 174static inline void iio_buffer_put(struct iio_buffer *buffer) {}
 175
 176#endif /* CONFIG_IIO_BUFFER */
 177
 178#endif /* _IIO_BUFFER_GENERIC_H_ */
 179