diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2009-09-22 19:54:53 (GMT) |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2009-09-22 20:01:40 (GMT) |
commit | ae19ffbadc1b2100285a5b5b3d0a4e0a11390904 (patch) | |
tree | 3c2086ab67398a019089a47ca3f362a4bc6db74f /drivers/staging/iio/chrdev.h | |
parent | 34e84f39a27d059a3e6ec6e8b94aafa702e6f220 (diff) | |
parent | 9173a8ef24a6b1b8031507b35b8ffe5f85a87692 (diff) | |
download | linux-fsl-qoriq-ae19ffbadc1b2100285a5b5b3d0a4e0a11390904.tar.xz |
Merge branch 'master' into for-linus
Diffstat (limited to 'drivers/staging/iio/chrdev.h')
-rw-r--r-- | drivers/staging/iio/chrdev.h | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/drivers/staging/iio/chrdev.h b/drivers/staging/iio/chrdev.h new file mode 100644 index 0000000..8bc64bf --- /dev/null +++ b/drivers/staging/iio/chrdev.h @@ -0,0 +1,118 @@ +/* The industrial I/O core - character device related + * + * Copyright (c) 2008 Jonathan Cameron + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 as published by + * the Free Software Foundation. + */ + +#ifndef _IIO_CHRDEV_H_ +#define _IIO_CHRDEV_H_ +struct iio_dev; + +/** + * struct iio_handler - Structure used to specify file operations + * for a particular chrdev + * @chrdev: character device structure + * @id: the location in the handler table - used for deallocation. + * @flags: file operations related flags including busy flag. + * @private: handler specific data used by the fileops registered with + * the chrdev. + */ +struct iio_handler { + struct cdev chrdev; + int id; + unsigned long flags; + void *private; +}; + +#define iio_cdev_to_handler(cd) \ + container_of(cd, struct iio_handler, chrdev) + +/** + * struct iio_event_data - The actual event being pushed to userspace + * @id: event identifier + * @timestamp: best estimate of time of event occurance (often from + * the interrupt handler) + */ +struct iio_event_data { + int id; + s64 timestamp; +}; + +/** + * struct iio_detected_event_list - list element for events that have occured + * @list: linked list header + * @ev: the event itself + * @shared_pointer: used when the event is shared - i.e. can be escallated + * on demand (eg ring buffer 50%->100% full) + */ +struct iio_detected_event_list { + struct list_head list; + struct iio_event_data ev; + struct iio_shared_ev_pointer *shared_pointer; +}; +/** + * struct iio_shared_ev_pointer - allows shared events to identify if currently + * in the detected event list + * @ev_p: pointer to detected event list element (null if not in list) + * @lock: protect this element to prevent simultaneous edit and remove + */ +struct iio_shared_ev_pointer { + struct iio_detected_event_list *ev_p; + spinlock_t lock; +}; + +/** + * struct iio_event_interface - chrdev interface for an event line + * @dev: device assocated with event interface + * @handler: fileoperations and related control for the chrdev + * @wait: wait queue to allow blocking reads of events + * @event_list_lock: mutex to protect the list of detected events + * @det_events: list of detected events + * @max_events: maximum number of events before new ones are dropped + * @current_events: number of events in detected list + * @id: indentifier to allow the event interface to know which + * physical line it corresponds to + * @owner: ensure the driver module owns the file, not iio + * @private: driver specific data + * @_name: used internally to store the sysfs name for minor id + * attribute + */ +struct iio_event_interface { + struct device dev; + struct iio_handler handler; + wait_queue_head_t wait; + struct mutex event_list_lock; + struct iio_detected_event_list det_events; + int max_events; + int current_events; + int id; + struct iio_chrdev_minor_attr attr; + struct module *owner; + void *private; + char _name[20]; + char _attrname[20]; +}; + +/** + * struct iio_event_handler_list - element in list of handlers for events + * @list: list header + * @refcount: as the handler may be shared between multiple device + * side events, reference counting ensures clean removal + * @exist_lock: prevents race conditions related to refcount useage. + * @handler: event handler function - called on event if this + * event_handler is enabled. + * + * Each device has one list of these per interrupt line + **/ +struct iio_event_handler_list { + struct list_head list; + int refcount; + struct mutex exist_lock; + int (*handler)(struct iio_dev *dev_info, int index, s64 timestamp, + int no_test); +}; + +#endif |