diff options
Diffstat (limited to 'drivers/staging/iio/iio.h')
-rw-r--r-- | drivers/staging/iio/iio.h | 248 |
1 files changed, 100 insertions, 148 deletions
diff --git a/drivers/staging/iio/iio.h b/drivers/staging/iio/iio.h index 7a6ce4d..f3d88cd 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_ */ |