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