staging:iio: rationalization of different buffer implementation hooks.
[pandora-kernel.git] / drivers / staging / iio / ring_generic.h
index ada51c2..3349676 100644 (file)
 
 struct iio_ring_buffer;
 
-/**
- * iio_push_ring_event() - ring buffer specific push to event chrdev
- * @ring_buf:          ring buffer that is the event source
- * @event_code:                event indentification code
- * @timestamp:         time of event
- **/
-int iio_push_ring_event(struct iio_ring_buffer *ring_buf,
-                       int event_code,
-                       s64 timestamp);
-/**
- * iio_push_or_escallate_ring_event() -        escalate or add as appropriate
- * @ring_buf:          ring buffer that is the event source
- * @event_code:                event indentification code
- * @timestamp:         time of event
- *
- * Typical usecase is to escalate a 50% ring full to 75% full if no one has yet
- * read the first event. Clearly the 50% full is no longer of interest in
- * typical use case.
- **/
-int iio_push_or_escallate_ring_event(struct iio_ring_buffer *ring_buf,
-                                    int event_code,
-                                    s64 timestamp);
-
 /**
  * struct iio_ring_access_funcs - access functions for ring buffers.
  * @mark_in_use:       reference counting, typically to prevent module removal
@@ -73,8 +50,7 @@ struct iio_ring_access_funcs {
        int (*read_last)(struct iio_ring_buffer *ring, u8 *data);
        int (*read_first_n)(struct iio_ring_buffer *ring,
                            size_t n,
-                           char __user *buf,
-                           int *dead_offset);
+                           char __user *buf);
 
        int (*mark_param_change)(struct iio_ring_buffer *ring);
        int (*request_update)(struct iio_ring_buffer *ring);
@@ -88,14 +64,19 @@ struct iio_ring_access_funcs {
        int (*enable)(struct iio_ring_buffer *ring);
 };
 
+struct iio_ring_setup_ops {
+       int                             (*preenable)(struct iio_dev *);
+       int                             (*postenable)(struct iio_dev *);
+       int                             (*predisable)(struct iio_dev *);
+       int                             (*postdisable)(struct iio_dev *);
+};
+
 /**
  * struct iio_ring_buffer - general ring buffer structure
  * @dev:               ring buffer device struct
- * @access_dev:                system device struct for the chrdev
  * @indio_dev:         industrial I/O device structure
  * @owner:             module that owns the ring buffer (for ref counting)
  * @id:                        unique id number
- * @access_id:         device id number
  * @length:            [DEVICE] number of datums in ring
  * @bytes_per_datum:   [DEVICE] size of individual datum including timestamp
  * @bpe:               [DEVICE] size of individual channel value
@@ -106,9 +87,6 @@ struct iio_ring_access_funcs {
  * @scan_mask:         [INTERN] bitmask used in masking scan mode elements
  * @scan_timestamp:    [INTERN] does the scan mode include a timestamp
  * @access_handler:    [INTERN] chrdev access handling
- * @ev_int:            [INTERN] chrdev interface for the event chrdev
- * @shared_ev_pointer: [INTERN] the shared event pointer to allow escalation of
- *                     events
  * @access:            [DRIVER] ring access functions associated with the
  *                     implementation.
  * @preenable:         [DRIVER] function to run prior to marking ring enabled
@@ -118,11 +96,9 @@ struct iio_ring_access_funcs {
   **/
 struct iio_ring_buffer {
        struct device dev;
-       struct device access_dev;
        struct iio_dev *indio_dev;
        struct module *owner;
        int                             id;
-       int                             access_id;
        int                             length;
        int                             bytes_per_datum;
        int                             bpe;
@@ -132,16 +108,12 @@ struct iio_ring_buffer {
        u32                             scan_mask;
        bool                            scan_timestamp;
        struct iio_handler              access_handler;
-       struct iio_event_interface      ev_int;
-       struct iio_shared_ev_pointer    shared_ev_pointer;
-       struct iio_ring_access_funcs    access;
-       int                             (*preenable)(struct iio_dev *);
-       int                             (*postenable)(struct iio_dev *);
-       int                             (*predisable)(struct iio_dev *);
-       int                             (*postdisable)(struct iio_dev *);
-
+       const struct iio_ring_access_funcs      *access;
+       const struct iio_ring_setup_ops *setup_ops;
        struct list_head scan_el_dev_attr_list;
-       struct list_head scan_el_en_attr_list;
+
+       wait_queue_head_t pollq;
+       bool stufftoread;
 };
 
 /**
@@ -166,29 +138,6 @@ static inline void __iio_update_ring_buffer(struct iio_ring_buffer *ring,
        ring->loopcount = 0;
 }
 
-/**
- * struct iio_scan_el - an individual element of a scan
- * @dev_attr:          control attribute (if directly controllable)
- * @number:            unique identifier of element (used for bit mask)
- * @label:             useful data for the scan el (often reg address)
- * @set_state:         for some devices datardy signals are generated
- *                     for any enabled lines.  This allows unwanted lines
- *                     to be disabled and hence not get in the way.
- **/
-struct iio_scan_el {
-       struct device_attribute         dev_attr;
-       unsigned int                    number;
-       unsigned int                    label;
-       struct list_head l;
-
-       int (*set_state)(struct iio_scan_el *scanel,
-                        struct iio_dev *dev_info,
-                        bool state);
-};
-
-#define to_iio_scan_el(_dev_attr)                              \
-       container_of(_dev_attr, struct iio_scan_el, dev_attr);
-
 /**
  * iio_scan_el_store() - sysfs scan element selection interface
  * @dev: the target device
@@ -227,90 +176,6 @@ ssize_t iio_scan_el_ts_store(struct device *dev, struct device_attribute *attr,
  **/
 ssize_t iio_scan_el_ts_show(struct device *dev, struct device_attribute *attr,
                            char *buf);
-/**
- * IIO_SCAN_EL_C - declare and initialize a scan element with a control func
- *
- * @_name:     identifying name. Resulting struct is iio_scan_el_##_name,
- *             sysfs element, _name##_en.
- * @_number:   unique id number for the scan element.
- *             length devices).
- * @_label:    indentification variable used by drivers.  Often a reg address.
- * @_controlfunc: function used to notify hardware of whether state changes
- **/
-#define __IIO_SCAN_EL_C(_name, _number, _label, _controlfunc)  \
-       struct iio_scan_el iio_scan_el_##_name = {                      \
-               .dev_attr = __ATTR(_name##_en,                          \
-                                  S_IRUGO | S_IWUSR,                   \
-                                  iio_scan_el_show,                    \
-                                  iio_scan_el_store),                  \
-               .number =  _number,                                     \
-               .label = _label,                                        \
-               .set_state = _controlfunc,                              \
-       };                                                              \
-       static IIO_CONST_ATTR(_name##_index, #_number)
-
-#define IIO_SCAN_EL_C(_name, _number, _label, _controlfunc)    \
-       __IIO_SCAN_EL_C(_name, _number, _label, _controlfunc)
-
-#define __IIO_SCAN_NAMED_EL_C(_name, _string, _number, _label, _cf)    \
-       struct iio_scan_el iio_scan_el_##_name = {                      \
-               .dev_attr = __ATTR(_string##_en,                        \
-                                  S_IRUGO | S_IWUSR,                   \
-                                  iio_scan_el_show,                    \
-                                  iio_scan_el_store),                  \
-               .number =  _number,                                     \
-               .label = _label,                                        \
-               .set_state = _cf,                                       \
-       };                                                              \
-       static struct iio_const_attr iio_const_attr_##_name##_index = { \
-               .string = #_number,                                     \
-               .dev_attr = __ATTR(_string##_index,                     \
-                                  S_IRUGO, iio_read_const_attr, NULL)  \
-       }
-
-
-#define IIO_SCAN_NAMED_EL_C(_name, _string, _number, _label, _cf) \
-       __IIO_SCAN_NAMED_EL_C(_name, _string, _number, _label, _cf)
-/**
- * IIO_SCAN_EL_TIMESTAMP - declare a special scan element for timestamps
- * @number: specify where in the scan order this is stored.
- *
- * Odd one out. Handled slightly differently from other scan elements.
- **/
-#define IIO_SCAN_EL_TIMESTAMP(number)                          \
-       struct iio_scan_el iio_scan_el_timestamp = {            \
-               .dev_attr = __ATTR(timestamp_en,                \
-                                  S_IRUGO | S_IWUSR,           \
-                                  iio_scan_el_ts_show,         \
-                                  iio_scan_el_ts_store),       \
-       };                                                      \
-       static IIO_CONST_ATTR(timestamp_index, #number)
-
-/**
- * IIO_CONST_ATTR_SCAN_EL_TYPE - attr to specify the data format of a scan el
- * @name: the scan el name (may be more general and cover a set of scan elements
- * @_sign: either s or u for signed or unsigned
- * @_bits: number of actual bits occuplied by the value
- * @_storagebits: number of bits _bits is padded to when read out of buffer
- **/
-#define IIO_CONST_ATTR_SCAN_EL_TYPE(_name, _sign, _bits, _storagebits) \
-       IIO_CONST_ATTR(_name##_type, #_sign#_bits"/"#_storagebits);
-
-/**
- * IIO_CONST_ATTR_SCAN_EL_TYPE_WITH_SHIFT - attr to specify the data format of a scan el
- * @name: the scan el name (may be more general and cover a set of scan elements
- * @_sign: either s or u for signed or unsigned
- * @_bits: number of actual bits occuplied by the value
- * @_storagebits: number of bits _bits is padded to when read out of buffer
- * @_shiftbits: number of bits _shiftbits the result must be shifted
- **/
-#define IIO_CONST_ATTR_SCAN_EL_TYPE_WITH_SHIFT(_name, _sign, _bits, \
-                                              _storagebits, _shiftbits) \
-       IIO_CONST_ATTR(_name##_type, #_sign#_bits"/"#_storagebits \
-                      ">>"#_shiftbits);
-
-#define IIO_SCAN_EL_TYPE_SIGNED         's'
-#define IIO_SCAN_EL_TYPE_UNSIGNED       'u'
 
 /*
  * These are mainly provided to allow for a change of implementation if a device
@@ -423,8 +288,6 @@ static inline void iio_put_ring_buffer(struct iio_ring_buffer *ring)
 
 #define to_iio_ring_buffer(d)                  \
        container_of(d, struct iio_ring_buffer, dev)
-#define access_dev_to_iio_ring_buffer(d)                       \
-       container_of(d, struct iio_ring_buffer, access_dev)
 
 /**
  * iio_ring_buffer_register() - register the buffer with IIO core
@@ -441,6 +304,8 @@ int iio_ring_buffer_register_ex(struct iio_ring_buffer *ring, int id,
                                const struct iio_chan_spec *channels,
                                int num_channels);
 
+void iio_ring_access_release(struct device *dev);
+
 /**
  * iio_ring_buffer_unregister() - unregister the buffer from IIO core
  * @ring: the buffer to be unregistered
@@ -487,6 +352,9 @@ ssize_t iio_show_ring_enable(struct device *dev,
 #define IIO_RING_ENABLE_ATTR DEVICE_ATTR(enable, S_IRUGO | S_IWUSR, \
                                         iio_show_ring_enable,          \
                                         iio_store_ring_enable)
+
+int iio_sw_ring_preenable(struct iio_dev *indio_dev);
+
 #else /* CONFIG_IIO_RING_BUFFER */
 static inline int iio_ring_buffer_register(struct iio_ring_buffer *ring, int id)
 {