linux/drivers/staging/iio/trigger.h
<<
>>
Prefs
   1/* The industrial I/O core, trigger handling functions
   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#ifndef _IIO_TRIGGER_H_
  10#define _IIO_TRIGGER_H_
  11#define IIO_TRIGGER_NAME_LENGTH 20
  12#define IIO_TRIGGER_ID_PREFIX "iio:trigger"
  13#define IIO_TRIGGER_ID_FORMAT IIO_TRIGGER_ID_PREFIX "%d"
  14
  15
  16/**
  17 * struct iio_trigger - industrial I/O trigger device
  18 *
  19 * @id:                 [INTERN] unique id number
  20 * @name:               [DRIVER] unique name
  21 * @dev:                [DRIVER] associated device (if relevant)
  22 * @sysfs_dev:          [INTERN] sysfs relevant device
  23 * @private_data:       [DRIVER] device specific data
  24 * @list:               [INTERN] used in maintenance of global trigger list
  25 * @alloc_list:         [DRIVER] used for driver specific trigger list
  26 * @poll_func_list_lock:[INTERN] protection of the polling function list
  27 * @pollfunc_list:      [INTERN] list of functions to run on trigger.
  28 * @control_attrs:      [DRIVER] sysfs attributes relevant to trigger type
  29 * @set_trigger_state:  [DRIVER] switch on/off the trigger on demand
  30 * @timestamp:          [INTERN] timestamp usesd by some trigs (e.g. datardy)
  31 * @owner:              [DRIVER] used to monitor usage count of the trigger.
  32 **/
  33struct iio_trigger {
  34        int                             id;
  35        const char                      *name;
  36        struct device                   dev;
  37
  38        void                            *private_data;
  39        struct list_head                list;
  40        struct list_head                alloc_list;
  41        spinlock_t                      pollfunc_list_lock;
  42        struct list_head                pollfunc_list;
  43        const struct attribute_group    *control_attrs;
  44        s64                             timestamp;
  45        struct module                   *owner;
  46        int use_count;
  47
  48        int (*set_trigger_state)(struct iio_trigger *trig, bool state);
  49        int (*try_reenable)(struct iio_trigger *trig);
  50};
  51
  52static inline struct iio_trigger *to_iio_trigger(struct device *d)
  53{
  54        return container_of(d, struct iio_trigger, dev);
  55};
  56
  57static inline void iio_put_trigger(struct iio_trigger *trig)
  58{
  59        put_device(&trig->dev);
  60        module_put(trig->owner);
  61};
  62
  63static inline void iio_get_trigger(struct iio_trigger *trig)
  64{
  65        __module_get(trig->owner);
  66        get_device(&trig->dev);
  67};
  68
  69/**
  70 * iio_trigger_read_name() - sysfs access function to get the trigger name
  71 **/
  72ssize_t iio_trigger_read_name(struct device *dev,
  73                              struct device_attribute *attr,
  74                              char *buf);
  75
  76#define IIO_TRIGGER_NAME_ATTR DEVICE_ATTR(name, S_IRUGO,                \
  77                                          iio_trigger_read_name,        \
  78                                          NULL);
  79
  80/**
  81 * iio_trigger_find_by_name() - search global trigger list
  82 **/
  83struct iio_trigger *iio_trigger_find_by_name(const char *name, size_t len);
  84
  85/**
  86 * iio_trigger_register() - register a trigger with the IIO core
  87 * @trig_info:  trigger to be registered
  88 **/
  89int iio_trigger_register(struct iio_trigger *trig_info);
  90
  91/**
  92 * iio_trigger_unregister() - unregister a trigger from the core
  93 **/
  94void iio_trigger_unregister(struct iio_trigger *trig_info);
  95
  96/**
  97 * iio_trigger_attach_poll_func() - add a function pair to be run on trigger
  98 * @trig:       trigger to which the function pair are being added
  99 * @pf: poll function pair
 100 **/
 101int iio_trigger_attach_poll_func(struct iio_trigger *trig,
 102                                 struct iio_poll_func *pf);
 103
 104/**
 105 * iio_trigger_dettach_poll_func() -    remove function pair from those to be
 106 *                                      run on trigger.
 107 * @trig:       trigger from which the function is being removed.
 108 * @pf:         poll function pair
 109 **/
 110int iio_trigger_dettach_poll_func(struct iio_trigger *trig,
 111                                  struct iio_poll_func *pf);
 112
 113/**
 114 * iio_trigger_poll() - called on a trigger occuring
 115 * Typically called in relevant hardware interrupt handler.
 116 **/
 117void iio_trigger_poll(struct iio_trigger *);
 118void iio_trigger_notify_done(struct iio_trigger *);
 119
 120/**
 121 * struct iio_poll_func - poll function pair
 122 *
 123 * @list:                       associate this with a triggers pollfunc_list
 124 * @private_data:               data specific to device (passed into poll func)
 125 * @poll_func_immediate:        function in here is run first. They should be
 126 *                              extremely lightweight.  Typically used for latch
 127 *                              control on sensor supporting it.
 128 * @poll_func_main:             function in here is run after all immediates.
 129 *                              Reading from sensor etc typically involves
 130 *                              scheduling
 131 *                              from here.
 132 *
 133 * The two stage approach used here only important when multiple sensors are
 134 * being triggered by a single trigger. This really comes into it's own with
 135 * simultaneous sampling devices where a simple latch command can be used to
 136 * make the device store the values on all inputs.
 137 **/
 138struct iio_poll_func {
 139        struct                          list_head list;
 140        void                            *private_data;
 141        void (*poll_func_immediate)(struct iio_dev *indio_dev);
 142        void (*poll_func_main)(struct iio_dev  *private_data);
 143
 144};
 145
 146struct iio_trigger *iio_allocate_trigger(void);
 147
 148void iio_free_trigger(struct iio_trigger *trig);
 149
 150
 151#endif /* _IIO_TRIGGER_H_ */
 152