linux/drivers/staging/iio/chrdev.h
<<
>>
Prefs
   1/* The industrial I/O core - character device related
   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
  10#ifndef _IIO_CHRDEV_H_
  11#define _IIO_CHRDEV_H_
  12struct iio_dev;
  13
  14/**
  15 * struct iio_handler - Structure used to specify file operations
  16 *                      for a particular chrdev
  17 * @chrdev:     character device structure
  18 * @id:         the location in the handler table - used for deallocation.
  19 * @flags:      file operations related flags including busy flag.
  20 * @private:    handler specific data used by the fileops registered with
  21 *              the chrdev.
  22 */
  23struct iio_handler {
  24        struct cdev     chrdev;
  25        int             id;
  26        unsigned long   flags;
  27        void            *private;
  28};
  29
  30#define iio_cdev_to_handler(cd)                         \
  31        container_of(cd, struct iio_handler, chrdev)
  32
  33/**
  34 * struct iio_event_data - The actual event being pushed to userspace
  35 * @id:         event identifier
  36 * @timestamp:  best estimate of time of event occurance (often from
  37 *              the interrupt handler)
  38 */
  39struct iio_event_data {
  40        int     id;
  41        s64     timestamp;
  42};
  43
  44/**
  45 * struct iio_detected_event_list - list element for events that have occured
  46 * @list:               linked list header
  47 * @ev:                 the event itself
  48 * @shared_pointer:     used when the event is shared - i.e. can be escallated
  49 *                      on demand (eg ring buffer 50%->100% full)
  50 */
  51struct iio_detected_event_list {
  52        struct list_head                list;
  53        struct iio_event_data           ev;
  54        struct iio_shared_ev_pointer    *shared_pointer;
  55};
  56/**
  57 * struct iio_shared_ev_pointer - allows shared events to identify if currently
  58 *                              in the detected event list
  59 * @ev_p:       pointer to detected event list element (null if not in list)
  60 * @lock:       protect this element to prevent simultaneous edit and remove
  61 */
  62struct iio_shared_ev_pointer {
  63        struct iio_detected_event_list  *ev_p;
  64        spinlock_t                      lock;
  65};
  66
  67/**
  68 * struct iio_event_interface - chrdev interface for an event line
  69 * @dev:                device assocated with event interface
  70 * @handler:            fileoperations and related control for the chrdev
  71 * @wait:               wait queue to allow blocking reads of events
  72 * @event_list_lock:    mutex to protect the list of detected events
  73 * @det_events:         list of detected events
  74 * @max_events:         maximum number of events before new ones are dropped
  75 * @current_events:     number of events in detected list
  76 * @owner:              ensure the driver module owns the file, not iio
  77 * @private:            driver specific data
  78 * @_name:              used internally to store the sysfs name for minor id
  79 *                      attribute
  80 * @_attrname:          the event interface's attribute name
  81 */
  82struct iio_event_interface {
  83        struct device                           dev;
  84        struct iio_handler                      handler;
  85        wait_queue_head_t                       wait;
  86        struct mutex                            event_list_lock;
  87        struct iio_detected_event_list          det_events;
  88        int                                     max_events;
  89        int                                     current_events;
  90        struct module                           *owner;
  91        void                                    *private;
  92        char                                    _name[35];
  93        char                                    _attrname[20];
  94};
  95
  96/**
  97 * struct iio_event_handler_list - element in list of handlers for events
  98 * @list:               list header
  99 * @refcount:           as the handler may be shared between multiple device
 100 *                      side events, reference counting ensures clean removal
 101 * @exist_lock:         prevents race conditions related to refcount useage.
 102 * @handler:            event handler function - called on event if this
 103 *                      event_handler is enabled.
 104 *
 105 * Each device has one list of these per interrupt line.
 106 **/
 107struct iio_event_handler_list {
 108        struct list_head        list;
 109        int                     refcount;
 110        struct mutex            exist_lock;
 111        int (*handler)(struct iio_dev *dev_info, int index, s64 timestamp,
 112                       int no_test);
 113};
 114
 115#endif
 116