![Lars-Peter Clausen](/assets/img/avatar_default.png)
The event configuration interface of the IIO framework has not been getting the same attention as other parts. As a result it has not seen the same improvements as e.g. the channel interface has seen with the introduction of the channel spec struct. Currently all the event config callbacks take a u64 (the so called event code) to pass all the different information about for which event the callback is invoked. The callback function then has to extract the information it is interested in using some macros with rather long names. Most information encoded in the event code comes straight from the iio_chan_spec struct the event was registered for. Since we always have a handle to the channel spec when we call the event callbacks the first step is to add the channel spec as a parameter to the event callbacks. The two remaining things encoded in the event code are the type and direction of the event. Instead of passing them in one parameter, add one parameter for each of them and remove the eventcode from the event callbacks. The patch also adds a new iio_event_info parameter to the {read,write}_event_value callbacks. This makes it possible, similar to the iio_chan_info_enum for channels, to specify additional properties other than just the value for an event. Furthermore the new interface will allow to register shared events. This is e.g. useful if a device allows configuring a threshold event, but the threshold setting is the same for all channels. To implement this the patch adds a new iio_event_spec struct which is similar to the iio_chan_spec struct. It as two field to specify the type and the direction of the event. Furthermore it has a mask field for each one of the different iio_shared_by types. These mask fields holds which kind of attributes should be registered for the event. Creation of the attributes follows the same rules as the for the channel attributes. E.g. for the separate_mask there will be a attribute for each channel with this event, for the shared_by_type there will only be one attribute per channel type. The iio_chan_spec struct gets two new fields, 'event_spec' and 'num_event_specs', which is used to specify which the events for this channel. These two fields are going to replace the channel's event_mask field. For now both the old and the new event config interface coexist, but over the few patches all drivers will be converted from the old to the new interface. Once that is done all code for supporting the old interface will be removed. Signed-off-by: Lars-Peter Clausen <lars@metafoo.de> Signed-off-by: Jonathan Cameron <jic23@kernel.org>
92 lines
3.3 KiB
C
92 lines
3.3 KiB
C
/* The industrial I/O - event passing to userspace
|
|
*
|
|
* Copyright (c) 2008-2011 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_EVENTS_H_
|
|
#define _IIO_EVENTS_H_
|
|
|
|
#include <linux/ioctl.h>
|
|
#include <linux/types.h>
|
|
#include <linux/iio/types.h>
|
|
|
|
/**
|
|
* struct iio_event_data - The actual event being pushed to userspace
|
|
* @id: event identifier
|
|
* @timestamp: best estimate of time of event occurrence (often from
|
|
* the interrupt handler)
|
|
*/
|
|
struct iio_event_data {
|
|
__u64 id;
|
|
__s64 timestamp;
|
|
};
|
|
|
|
#define IIO_GET_EVENT_FD_IOCTL _IOR('i', 0x90, int)
|
|
|
|
/**
|
|
* IIO_EVENT_CODE() - create event identifier
|
|
* @chan_type: Type of the channel. Should be one of enum iio_chan_type.
|
|
* @diff: Whether the event is for an differential channel or not.
|
|
* @modifier: Modifier for the channel. Should be one of enum iio_modifier.
|
|
* @direction: Direction of the event. One of enum iio_event_direction.
|
|
* @type: Type of the event. Should be one of enum iio_event_type.
|
|
* @chan: Channel number for non-differential channels.
|
|
* @chan1: First channel number for differential channels.
|
|
* @chan2: Second channel number for differential channels.
|
|
*/
|
|
|
|
#define IIO_EVENT_CODE(chan_type, diff, modifier, direction, \
|
|
type, chan, chan1, chan2) \
|
|
(((u64)type << 56) | ((u64)diff << 55) | \
|
|
((u64)direction << 48) | ((u64)modifier << 40) | \
|
|
((u64)chan_type << 32) | (((u16)chan2) << 16) | ((u16)chan1) | \
|
|
((u16)chan))
|
|
|
|
|
|
#define IIO_EV_DIR_MAX 4
|
|
#define IIO_EV_BIT(type, direction) \
|
|
(1 << (type*IIO_EV_DIR_MAX + direction))
|
|
|
|
/**
|
|
* IIO_MOD_EVENT_CODE() - create event identifier for modified channels
|
|
* @chan_type: Type of the channel. Should be one of enum iio_chan_type.
|
|
* @number: Channel number.
|
|
* @modifier: Modifier for the channel. Should be one of enum iio_modifier.
|
|
* @type: Type of the event. Should be one of enum iio_event_type.
|
|
* @direction: Direction of the event. One of enum iio_event_direction.
|
|
*/
|
|
|
|
#define IIO_MOD_EVENT_CODE(chan_type, number, modifier, \
|
|
type, direction) \
|
|
IIO_EVENT_CODE(chan_type, 0, modifier, direction, type, number, 0, 0)
|
|
|
|
/**
|
|
* IIO_UNMOD_EVENT_CODE() - create event identifier for unmodified channels
|
|
* @chan_type: Type of the channel. Should be one of enum iio_chan_type.
|
|
* @number: Channel number.
|
|
* @type: Type of the event. Should be one of enum iio_event_type.
|
|
* @direction: Direction of the event. One of enum iio_event_direction.
|
|
*/
|
|
|
|
#define IIO_UNMOD_EVENT_CODE(chan_type, number, type, direction) \
|
|
IIO_EVENT_CODE(chan_type, 0, 0, direction, type, number, 0, 0)
|
|
|
|
#define IIO_EVENT_CODE_EXTRACT_TYPE(mask) ((mask >> 56) & 0xFF)
|
|
|
|
#define IIO_EVENT_CODE_EXTRACT_DIR(mask) ((mask >> 48) & 0xCF)
|
|
|
|
#define IIO_EVENT_CODE_EXTRACT_CHAN_TYPE(mask) ((mask >> 32) & 0xFF)
|
|
|
|
/* Event code number extraction depends on which type of event we have.
|
|
* Perhaps review this function in the future*/
|
|
#define IIO_EVENT_CODE_EXTRACT_CHAN(mask) ((__s16)(mask & 0xFFFF))
|
|
#define IIO_EVENT_CODE_EXTRACT_CHAN2(mask) ((__s16)(((mask) >> 16) & 0xFFFF))
|
|
|
|
#define IIO_EVENT_CODE_EXTRACT_MODIFIER(mask) ((mask >> 40) & 0xFF)
|
|
#define IIO_EVENT_CODE_EXTRACT_DIFF(mask) (((mask) >> 55) & 0x1)
|
|
|
|
#endif
|