]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - include/linux/iio/iio.h
Merge remote-tracking branch 'staging/staging-next'
[karo-tx-linux.git] / include / linux / iio / iio.h
index 2103cc32a5fb9b7d701d428e2f49ac636bbc6376..256a90a1bea681fde6473e2d5d74bc93ea868a87 100644 (file)
@@ -36,6 +36,14 @@ enum iio_chan_info_enum {
        IIO_CHAN_INFO_PHASE,
        IIO_CHAN_INFO_HARDWAREGAIN,
        IIO_CHAN_INFO_HYSTERESIS,
+       IIO_CHAN_INFO_INT_TIME,
+};
+
+enum iio_shared_by {
+       IIO_SEPARATE,
+       IIO_SHARED_BY_TYPE,
+       IIO_SHARED_BY_DIR,
+       IIO_SHARED_BY_ALL
 };
 
 enum iio_endian {
@@ -57,7 +65,7 @@ struct iio_dev;
  */
 struct iio_chan_spec_ext_info {
        const char *name;
-       bool shared;
+       enum iio_shared_by shared;
        ssize_t (*read)(struct iio_dev *, uintptr_t private,
                        struct iio_chan_spec const *, char *buf);
        ssize_t (*write)(struct iio_dev *, uintptr_t private,
@@ -125,11 +133,34 @@ ssize_t iio_enum_write(struct iio_dev *indio_dev,
 #define IIO_ENUM_AVAILABLE(_name, _e) \
 { \
        .name = (_name "_available"), \
-       .shared = true, \
+       .shared = IIO_SHARED_BY_TYPE, \
        .read = iio_enum_available_read, \
        .private = (uintptr_t)(_e), \
 }
 
+/**
+ * struct iio_event_spec - specification for a channel event
+ * @type:                  Type of the event
+ * @dir:                   Direction of the event
+ * @mask_separate:         Bit mask of enum iio_event_info values. Attributes
+ *                         set in this mask will be registered per channel.
+ * @mask_shared_by_type:    Bit mask of enum iio_event_info values. Attributes
+ *                         set in this mask will be shared by channel type.
+ * @mask_shared_by_dir:            Bit mask of enum iio_event_info values. Attributes
+ *                         set in this mask will be shared by channel type and
+ *                         direction.
+ * @mask_shared_by_all:            Bit mask of enum iio_event_info values. Attributes
+ *                         set in this mask will be shared by all channels.
+ */
+struct iio_event_spec {
+       enum iio_event_type type;
+       enum iio_event_direction dir;
+       unsigned long mask_separate;
+       unsigned long mask_shared_by_type;
+       unsigned long mask_shared_by_dir;
+       unsigned long mask_shared_by_all;
+};
+
 /**
  * struct iio_chan_spec - specification of a single channel
  * @type:              What type of measurement is the channel making.
@@ -146,13 +177,18 @@ ssize_t iio_enum_write(struct iio_dev *indio_dev,
  *                     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.
  * @info_mask_separate: What information is to be exported that is specific to
  *                     this channel.
  * @info_mask_shared_by_type: What information is to be exported that is shared
-*                      by all channels of the same type.
+ *                     by all channels of the same type.
+ * @info_mask_shared_by_dir: What information is to be exported that is shared
+ *                     by all channels of the same direction.
+ * @info_mask_shared_by_all: What information is to be exported that is shared
+ *                     by all channels.
  * @event_mask:                What events can this channel produce.
+ * @event_spec:                Array of events which should be registered for this
+ *                     channel.
+ * @num_event_specs:   Size of the event_spec array.
  * @ext_info:          Array of extended info attributes for this channel.
  *                     The array is NULL terminated, the last element should
  *                     have its name field set to NULL.
@@ -186,10 +222,13 @@ struct iio_chan_spec {
                u8      shift;
                enum iio_endian endianness;
        } scan_type;
-       long                    info_mask;
        long                    info_mask_separate;
        long                    info_mask_shared_by_type;
+       long                    info_mask_shared_by_dir;
+       long                    info_mask_shared_by_all;
        long                    event_mask;
+       const struct iio_event_spec *event_spec;
+       unsigned int            num_event_specs;
        const struct iio_chan_spec_ext_info *ext_info;
        const char              *extend_name;
        const char              *datasheet_name;
@@ -212,7 +251,9 @@ static inline bool iio_channel_has_info(const struct iio_chan_spec *chan,
        enum iio_chan_info_enum type)
 {
        return (chan->info_mask_separate & BIT(type)) |
-              (chan->info_mask_shared_by_type & BIT(type));
+               (chan->info_mask_shared_by_type & BIT(type)) |
+               (chan->info_mask_shared_by_dir & BIT(type)) |
+               (chan->info_mask_shared_by_all & BIT(type));
 }
 
 #define IIO_ST(si, rb, sb, sh)                                         \
@@ -270,6 +311,12 @@ struct iio_dev;
  *                     is event dependant. event_code specifies which event.
  * @write_event_value: write the value associated with the event.
  *                     Meaning is event dependent.
+ * @read_event_config_new: find out if the event is enabled. New style interface.
+ * @write_event_config_new: set if the event is enabled. New style interface.
+ * @read_event_value_new: read a configuration value associated with the event.
+ *                         New style interface.
+ * @write_event_value_new: write a configuration value for the event. New style
+ *                        interface.
  * @validate_trigger:  function to validate the trigger when the
  *                     current trigger gets changed.
  * @update_scan_mode:  function to configure device and scan buffer when
@@ -310,6 +357,30 @@ struct iio_info {
        int (*write_event_value)(struct iio_dev *indio_dev,
                                 u64 event_code,
                                 int val);
+
+       int (*read_event_config_new)(struct iio_dev *indio_dev,
+                                const struct iio_chan_spec *chan,
+                                enum iio_event_type type,
+                                enum iio_event_direction dir);
+
+       int (*write_event_config_new)(struct iio_dev *indio_dev,
+                                 const struct iio_chan_spec *chan,
+                                 enum iio_event_type type,
+                                 enum iio_event_direction dir,
+                                 int state);
+
+       int (*read_event_value_new)(struct iio_dev *indio_dev,
+                               const struct iio_chan_spec *chan,
+                               enum iio_event_type type,
+                               enum iio_event_direction dir,
+                               enum iio_event_info info, int *val, int *val2);
+
+       int (*write_event_value_new)(struct iio_dev *indio_dev,
+                                const struct iio_chan_spec *chan,
+                                enum iio_event_type type,
+                                enum iio_event_direction dir,
+                                enum iio_event_info info, int val, int val2);
+
        int (*validate_trigger)(struct iio_dev *indio_dev,
                                struct iio_trigger *trig);
        int (*update_scan_mode)(struct iio_dev *indio_dev,
@@ -457,7 +528,7 @@ static inline void iio_device_put(struct iio_dev *indio_dev)
 {
        if (indio_dev)
                put_device(&indio_dev->dev);
-};
+}
 
 /**
  * dev_to_iio_dev() - Get IIO device struct from a device struct
@@ -593,7 +664,7 @@ static inline bool iio_buffer_enabled(struct iio_dev *indio_dev)
 {
        return indio_dev->currentmode
                & (INDIO_BUFFER_TRIGGERED | INDIO_BUFFER_HARDWARE);
-};
+}
 
 /**
  * iio_get_debugfs_dentry() - helper function to get the debugfs_dentry
@@ -603,12 +674,12 @@ static inline bool iio_buffer_enabled(struct iio_dev *indio_dev)
 static inline struct dentry *iio_get_debugfs_dentry(struct iio_dev *indio_dev)
 {
        return indio_dev->debugfs_dentry;
-};
+}
 #else
 static inline struct dentry *iio_get_debugfs_dentry(struct iio_dev *indio_dev)
 {
        return NULL;
-};
+}
 #endif
 
 int iio_str_to_fixpoint(const char *str, int fract_mult, int *integer,