summaryrefslogtreecommitdiff
path: root/drivers/staging/iio/iio.h
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/iio/iio.h')
-rw-r--r--drivers/staging/iio/iio.h248
1 files changed, 100 insertions, 148 deletions
diff --git a/drivers/staging/iio/iio.h b/drivers/staging/iio/iio.h
index 7a6ce4d0fb7..f3d88cd7e8a 100644
--- a/drivers/staging/iio/iio.h
+++ b/drivers/staging/iio/iio.h
@@ -1,3 +1,4 @@
+
/* The industrial I/O core
*
* Copyright (c) 2008 Jonathan Cameron
@@ -12,9 +13,6 @@
#include <linux/device.h>
#include <linux/cdev.h>
-#include <linux/irq.h>
-#include "sysfs.h"
-#include "chrdev.h"
/* IIO TODO LIST */
/*
@@ -22,20 +20,18 @@
* Currently assumes nano seconds.
*/
-/* Event interface flags */
-#define IIO_BUSY_BIT_POS 1
+enum iio_data_type {
+ IIO_RAW,
+ IIO_PROCESSED,
+};
-/* naughty temporary hack to match these against the event version
- - need to flattern these together */
enum iio_chan_type {
/* real channel types */
- IIO_IN,
- IIO_OUT,
+ IIO_VOLTAGE,
IIO_CURRENT,
IIO_POWER,
IIO_ACCEL,
- IIO_IN_DIFF,
- IIO_GYRO,
+ IIO_ANGL_VEL,
IIO_MAGN,
IIO_LIGHT,
IIO_INTENSITY,
@@ -45,21 +41,25 @@ enum iio_chan_type {
IIO_ROT,
IIO_ANGL,
IIO_TIMESTAMP,
+ IIO_CAPACITANCE,
};
-#define IIO_MOD_X 0
-#define IIO_MOD_LIGHT_BOTH 0
-#define IIO_MOD_Y 1
-#define IIO_MOD_LIGHT_IR 1
-#define IIO_MOD_Z 2
-#define IIO_MOD_X_AND_Y 3
-#define IIO_MOD_X_ANX_Z 4
-#define IIO_MOD_Y_AND_Z 5
-#define IIO_MOD_X_AND_Y_AND_Z 6
-#define IIO_MOD_X_OR_Y 7
-#define IIO_MOD_X_OR_Z 8
-#define IIO_MOD_Y_OR_Z 9
-#define IIO_MOD_X_OR_Y_OR_Z 10
+enum iio_modifier {
+ IIO_NO_MOD,
+ IIO_MOD_X,
+ IIO_MOD_Y,
+ IIO_MOD_Z,
+ IIO_MOD_X_AND_Y,
+ IIO_MOD_X_ANX_Z,
+ IIO_MOD_Y_AND_Z,
+ IIO_MOD_X_AND_Y_AND_Z,
+ IIO_MOD_X_OR_Y,
+ IIO_MOD_X_OR_Z,
+ IIO_MOD_Y_OR_Z,
+ IIO_MOD_X_OR_Y_OR_Z,
+ IIO_MOD_LIGHT_BOTH,
+ IIO_MOD_LIGHT_IR,
+};
/* Could add the raw attributes as well - allowing buffer only devices */
enum iio_chan_info_enum {
@@ -75,6 +75,16 @@ enum iio_chan_info_enum {
IIO_CHAN_INFO_PEAK_SEPARATE,
IIO_CHAN_INFO_PEAK_SCALE_SHARED,
IIO_CHAN_INFO_PEAK_SCALE_SEPARATE,
+ IIO_CHAN_INFO_QUADRATURE_CORRECTION_RAW_SHARED,
+ IIO_CHAN_INFO_QUADRATURE_CORRECTION_RAW_SEPARATE,
+ IIO_CHAN_INFO_AVERAGE_RAW_SHARED,
+ IIO_CHAN_INFO_AVERAGE_RAW_SEPARATE,
+};
+
+enum iio_endian {
+ IIO_CPU,
+ IIO_BE,
+ IIO_LE,
};
/**
@@ -92,6 +102,7 @@ enum iio_chan_info_enum {
* storage_bits: Realbits + padding
* shift: Shift right by this before masking out
* realbits.
+ * endianness: little or big endian
* @info_mask: What information is to be exported about this channel.
* This includes calibbias, scale etc.
* @event_mask: What events can this channel produce.
@@ -108,6 +119,7 @@ enum iio_chan_info_enum {
* the value in channel will be suppressed for attribute
* but not for event codes. Typically set it to 0 when
* the index is false.
+ * @differential: Channel is differential.
*/
struct iio_chan_spec {
enum iio_chan_type type;
@@ -120,33 +132,26 @@ struct iio_chan_spec {
u8 realbits;
u8 storagebits;
u8 shift;
+ enum iio_endian endianness;
} scan_type;
- const long info_mask;
- const long event_mask;
- const char *extend_name;
+ long info_mask;
+ long event_mask;
+ char *extend_name;
unsigned processed_val:1;
unsigned modified:1;
unsigned indexed:1;
+ unsigned output:1;
+ unsigned differential:1;
};
-/* Meant for internal use only */
-void __iio_device_attr_deinit(struct device_attribute *dev_attr);
-int __iio_device_attr_init(struct device_attribute *dev_attr,
- const char *postfix,
- struct iio_chan_spec const *chan,
- ssize_t (*readfunc)(struct device *dev,
- struct device_attribute *attr,
- char *buf),
- ssize_t (*writefunc)(struct device *dev,
- struct device_attribute *attr,
- const char *buf,
- size_t len),
- bool generic);
+
#define IIO_ST(si, rb, sb, sh) \
{ .sign = si, .realbits = rb, .storagebits = sb, .shift = sh }
-#define IIO_CHAN(_type, _mod, _indexed, _proc, _name, _chan, _chan2, \
+/* Macro assumes input channels */
+#define IIO_CHAN(_type, _mod, _indexed, _proc, _name, _chan, _chan2, \
_inf_mask, _address, _si, _stype, _event_mask) \
{ .type = _type, \
+ .output = 0, \
.modified = _mod, \
.indexed = _indexed, \
.processed_val = _proc, \
@@ -163,20 +168,6 @@ int __iio_device_attr_init(struct device_attribute *dev_attr,
{ .type = IIO_TIMESTAMP, .channel = -1, \
.scan_index = _si, .scan_type = IIO_ST('s', 64, 64, 0) }
-int __iio_add_chan_devattr(const char *postfix,
- const char *group,
- struct iio_chan_spec const *chan,
- ssize_t (*func)(struct device *dev,
- struct device_attribute *attr,
- char *buf),
- ssize_t (*writefunc)(struct device *dev,
- struct device_attribute *attr,
- const char *buf,
- size_t len),
- int mask,
- bool generic,
- struct device *dev,
- struct list_head *attr_list);
/**
* iio_get_time_ns() - utility function to get a time stamp for events etc
**/
@@ -194,10 +185,11 @@ static inline s64 iio_get_time_ns(void)
/* Device operating modes */
#define INDIO_DIRECT_MODE 0x01
-#define INDIO_RING_TRIGGERED 0x02
-#define INDIO_RING_HARDWARE_BUFFER 0x08
+#define INDIO_BUFFER_TRIGGERED 0x02
+#define INDIO_BUFFER_HARDWARE 0x08
-#define INDIO_ALL_RING_MODES (INDIO_RING_TRIGGERED | INDIO_RING_HARDWARE_BUFFER)
+#define INDIO_ALL_BUFFER_MODES \
+ (INDIO_BUFFER_TRIGGERED | INDIO_BUFFER_HARDWARE)
/* Vast majority of this is set by the industrialio subsystem on a
* call to iio_device_register. */
@@ -206,12 +198,12 @@ static inline s64 iio_get_time_ns(void)
#define IIO_VAL_INT_PLUS_NANO 3
struct iio_trigger; /* forward declaration */
+struct iio_dev;
/**
* struct iio_info - constant information about device
* @driver_module: module structure used to ensure correct
* ownership of chrdevs etc
- * @num_interrupt_lines:number of physical interrupt lines from device
* @event_attrs: event control attributes
* @attrs: general purpose device attributes
* @read_raw: function to request a value from the device.
@@ -235,7 +227,6 @@ struct iio_trigger; /* forward declaration */
**/
struct iio_info {
struct module *driver_module;
- int num_interrupt_lines;
struct attribute_group *event_attrs;
const struct attribute_group *attrs;
@@ -256,17 +247,17 @@ struct iio_info {
long mask);
int (*read_event_config)(struct iio_dev *indio_dev,
- int event_code);
+ u64 event_code);
int (*write_event_config)(struct iio_dev *indio_dev,
- int event_code,
+ u64 event_code,
int state);
int (*read_event_value)(struct iio_dev *indio_dev,
- int event_code,
+ u64 event_code,
int *val);
int (*write_event_value)(struct iio_dev *indio_dev,
- int event_code,
+ u64 event_code,
int val);
int (*validate_trigger)(struct iio_dev *indio_dev,
struct iio_trigger *trig);
@@ -276,110 +267,92 @@ struct iio_info {
/**
* struct iio_dev - industrial I/O device
* @id: [INTERN] used to identify device internally
- * @dev_data: [DRIVER] device specific data
* @modes: [DRIVER] operating modes supported by device
* @currentmode: [DRIVER] current operating mode
* @dev: [DRIVER] device structure, should be assigned a parent
* and owner
- * @event_interfaces: [INTERN] event chrdevs associated with interrupt lines
- * @ring: [DRIVER] any ring buffer present
+ * @event_interface: [INTERN] event chrdevs associated with interrupt lines
+ * @buffer: [DRIVER] any buffer present
* @mlock: [INTERN] lock used to prevent simultaneous device state
* changes
* @available_scan_masks: [DRIVER] optional array of allowed bitmasks
- * @trig: [INTERN] current device trigger (ring buffer modes)
+ * @masklength: [INTERN] the length of the mask established from
+ * channels
+ * @trig: [INTERN] current device trigger (buffer modes)
* @pollfunc: [DRIVER] function run on trigger being received
* @channels: [DRIVER] channel specification structure table
* @num_channels: [DRIVER] number of chanels specified in @channels.
* @channel_attr_list: [INTERN] keep track of automatically created channel
- * attributes.
+ * attributes
+ * @chan_attr_group: [INTERN] group for all attrs in base directory
* @name: [DRIVER] name of the device.
+ * @info: [DRIVER] callbacks and constant info from driver
+ * @chrdev: [INTERN] associated character device
+ * @groups: [INTERN] attribute groups
+ * @groupcounter: [INTERN] index of next attribute group
**/
struct iio_dev {
int id;
- void *dev_data;
+
int modes;
int currentmode;
struct device dev;
- struct iio_event_interface *event_interfaces;
+ struct iio_event_interface *event_interface;
- struct iio_ring_buffer *ring;
+ struct iio_buffer *buffer;
struct mutex mlock;
- u32 *available_scan_masks;
+ unsigned long *available_scan_masks;
+ unsigned masklength;
struct iio_trigger *trig;
struct iio_poll_func *pollfunc;
- struct iio_chan_spec const *channels;
- int num_channels;
-
- struct list_head channel_attr_list;
- const char *name;
- const struct iio_info *info;
+ struct iio_chan_spec const *channels;
+ int num_channels;
+
+ struct list_head channel_attr_list;
+ struct attribute_group chan_attr_group;
+ const char *name;
+ const struct iio_info *info;
+ struct cdev chrdev;
+#define IIO_MAX_GROUPS 6
+ const struct attribute_group *groups[IIO_MAX_GROUPS + 1];
+ int groupcounter;
};
/**
* iio_device_register() - register a device with the IIO subsystem
- * @dev_info: Device structure filled by the device driver
+ * @indio_dev: Device structure filled by the device driver
**/
-int iio_device_register(struct iio_dev *dev_info);
+int iio_device_register(struct iio_dev *indio_dev);
/**
* iio_device_unregister() - unregister a device from the IIO subsystem
- * @dev_info: Device structure representing the device.
+ * @indio_dev: Device structure representing the device.
**/
-void iio_device_unregister(struct iio_dev *dev_info);
+void iio_device_unregister(struct iio_dev *indio_dev);
/**
* iio_push_event() - try to add event to the list for userspace reading
- * @dev_info: IIO device structure
- * @ev_line: Which event line (hardware interrupt)
+ * @indio_dev: IIO device structure
* @ev_code: What event
* @timestamp: When the event occurred
**/
-int iio_push_event(struct iio_dev *dev_info,
- int ev_line,
- int ev_code,
- s64 timestamp);
-
-/* Used to distinguish between bipolar and unipolar scan elemenents.
- * Whilst this may seem obvious, we may well want to change the representation
- * in the future!*/
-#define IIO_SIGNED(a) -(a)
-#define IIO_UNSIGNED(a) (a)
-
-extern dev_t iio_devt;
+int iio_push_event(struct iio_dev *indio_dev, u64 ev_code, s64 timestamp);
+
extern struct bus_type iio_bus_type;
/**
* iio_put_device() - reference counted deallocation of struct device
* @dev: the iio_device containing the device
**/
-static inline void iio_put_device(struct iio_dev *dev)
+static inline void iio_put_device(struct iio_dev *indio_dev)
{
- if (dev)
- put_device(&dev->dev);
+ if (indio_dev)
+ put_device(&indio_dev->dev);
};
-/**
- * to_iio_dev() - get iio_dev for which we have the struct device
- * @d: the struct device
- **/
-static inline struct iio_dev *to_iio_dev(struct device *d)
-{
- return container_of(d, struct iio_dev, dev);
-};
-
-/**
- * iio_dev_get_devdata() - helper function gets device specific data
- * @d: the iio_dev associated with the device
- **/
-static inline void *iio_dev_get_devdata(struct iio_dev *d)
-{
- return d->dev_data;
-}
-
-
/* Can we make this smaller? */
#define IIO_ALIGN L1_CACHE_BYTES
/**
@@ -388,9 +361,9 @@ static inline void *iio_dev_get_devdata(struct iio_dev *d)
**/
struct iio_dev *iio_allocate_device(int sizeof_priv);
-static inline void *iio_priv(const struct iio_dev *dev)
+static inline void *iio_priv(const struct iio_dev *indio_dev)
{
- return (char *)dev + ALIGN(sizeof(struct iio_dev), IIO_ALIGN);
+ return (char *)indio_dev + ALIGN(sizeof(struct iio_dev), IIO_ALIGN);
}
static inline struct iio_dev *iio_priv_to_dev(void *priv)
@@ -403,37 +376,16 @@ static inline struct iio_dev *iio_priv_to_dev(void *priv)
* iio_free_device() - free an iio_dev from a driver
* @dev: the iio_dev associated with the device
**/
-void iio_free_device(struct iio_dev *dev);
-
-/**
- * iio_put() - internal module reference count reduce
- **/
-void iio_put(void);
+void iio_free_device(struct iio_dev *indio_dev);
/**
- * iio_get() - internal module reference count increase
+ * iio_buffer_enabled() - helper function to test if the buffer is enabled
+ * @indio_dev: IIO device info structure for device
**/
-void iio_get(void);
-
-/**
- * iio_device_get_chrdev_minor() - get an unused minor number
- **/
-int iio_device_get_chrdev_minor(void);
-void iio_device_free_chrdev_minor(int val);
-
-/**
- * iio_ring_enabled() - helper function to test if any form of ring is enabled
- * @dev_info: IIO device info structure for device
- **/
-static inline bool iio_ring_enabled(struct iio_dev *dev_info)
+static inline bool iio_buffer_enabled(struct iio_dev *indio_dev)
{
- return dev_info->currentmode
- & (INDIO_RING_TRIGGERED
- | INDIO_RING_HARDWARE_BUFFER);
+ return indio_dev->currentmode
+ & (INDIO_BUFFER_TRIGGERED | INDIO_BUFFER_HARDWARE);
};
-struct ida;
-
-int iio_get_new_ida_val(struct ida *this_ida);
-void iio_free_ida_val(struct ida *this_ida, int id);
#endif /* _INDUSTRIAL_IO_H_ */