diff options
Diffstat (limited to 'include/linux/iio')
| -rw-r--r-- | include/linux/iio/common/st_sensors.h | 15 | ||||
| -rw-r--r-- | include/linux/iio/iio.h | 22 | ||||
| -rw-r--r-- | include/linux/iio/sw_device.h | 70 | 
3 files changed, 95 insertions, 12 deletions
| diff --git a/include/linux/iio/common/st_sensors.h b/include/linux/iio/common/st_sensors.h index d029ffac0d69..228bd44efa4c 100644 --- a/include/linux/iio/common/st_sensors.h +++ b/include/linux/iio/common/st_sensors.h @@ -223,6 +223,9 @@ struct st_sensor_settings {   * @get_irq_data_ready: Function to get the IRQ used for data ready signal.   * @tf: Transfer function structure used by I/O operations.   * @tb: Transfer buffers and mutex used by I/O operations. + * @edge_irq: the IRQ triggers on edges and need special handling. + * @hw_irq_trigger: if we're using the hardware interrupt on the sensor. + * @hw_timestamp: Latest timestamp from the interrupt handler, when in use.   */  struct st_sensor_data {  	struct device *dev; @@ -247,12 +250,14 @@ struct st_sensor_data {  	const struct st_sensor_transfer_function *tf;  	struct st_sensor_transfer_buffer tb; + +	bool edge_irq; +	bool hw_irq_trigger; +	s64 hw_timestamp;  };  #ifdef CONFIG_IIO_BUFFER  irqreturn_t st_sensors_trigger_handler(int irq, void *p); - -int st_sensors_get_buffer_element(struct iio_dev *indio_dev, u8 *buf);  #endif  #ifdef CONFIG_IIO_TRIGGER @@ -260,7 +265,8 @@ int st_sensors_allocate_trigger(struct iio_dev *indio_dev,  				const struct iio_trigger_ops *trigger_ops);  void st_sensors_deallocate_trigger(struct iio_dev *indio_dev); - +int st_sensors_validate_device(struct iio_trigger *trig, +			       struct iio_dev *indio_dev);  #else  static inline int st_sensors_allocate_trigger(struct iio_dev *indio_dev,  				const struct iio_trigger_ops *trigger_ops) @@ -271,6 +277,7 @@ static inline void st_sensors_deallocate_trigger(struct iio_dev *indio_dev)  {  	return;  } +#define st_sensors_validate_device NULL  #endif  int st_sensors_init_sensor(struct iio_dev *indio_dev, @@ -280,7 +287,7 @@ int st_sensors_set_enable(struct iio_dev *indio_dev, bool enable);  int st_sensors_set_axis_enable(struct iio_dev *indio_dev, u8 axis_enable); -void st_sensors_power_enable(struct iio_dev *indio_dev); +int st_sensors_power_enable(struct iio_dev *indio_dev);  void st_sensors_power_disable(struct iio_dev *indio_dev); diff --git a/include/linux/iio/iio.h b/include/linux/iio/iio.h index 7c29cb0124ae..854e2dad1e0d 100644 --- a/include/linux/iio/iio.h +++ b/include/linux/iio/iio.h @@ -312,13 +312,8 @@ static inline bool iio_channel_has_info(const struct iio_chan_spec *chan,  		},							\  } -/** - * iio_get_time_ns() - utility function to get a time stamp for events etc - **/ -static inline s64 iio_get_time_ns(void) -{ -	return ktime_get_real_ns(); -} +s64 iio_get_time_ns(const struct iio_dev *indio_dev); +unsigned int iio_get_time_res(const struct iio_dev *indio_dev);  /* Device operating modes */  #define INDIO_DIRECT_MODE		0x01 @@ -497,6 +492,7 @@ struct iio_buffer_setup_ops {   * @chan_attr_group:	[INTERN] group for all attrs in base directory   * @name:		[DRIVER] name of the device.   * @info:		[DRIVER] callbacks and constant info from driver + * @clock_id:		[INTERN] timestamping clock posix identifier   * @info_exist_lock:	[INTERN] lock to prevent use during removal   * @setup_ops:		[DRIVER] callbacks to call before and after buffer   *			enable/disable @@ -537,6 +533,7 @@ struct iio_dev {  	struct attribute_group		chan_attr_group;  	const char			*name;  	const struct iio_info		*info; +	clockid_t			clock_id;  	struct mutex			info_exist_lock;  	const struct iio_buffer_setup_ops	*setup_ops;  	struct cdev			chrdev; @@ -565,7 +562,7 @@ extern struct bus_type iio_bus_type;  /**   * iio_device_put() - reference counted deallocation of struct device - * @indio_dev: 		IIO device structure containing the device + * @indio_dev: IIO device structure containing the device   **/  static inline void iio_device_put(struct iio_dev *indio_dev)  { @@ -574,6 +571,15 @@ static inline void iio_device_put(struct iio_dev *indio_dev)  }  /** + * iio_device_get_clock() - Retrieve current timestamping clock for the device + * @indio_dev: IIO device structure containing the device + */ +static inline clockid_t iio_device_get_clock(const struct iio_dev *indio_dev) +{ +	return indio_dev->clock_id; +} + +/**   * dev_to_iio_dev() - Get IIO device struct from a device struct   * @dev: 		The device embedded in the IIO device   * diff --git a/include/linux/iio/sw_device.h b/include/linux/iio/sw_device.h new file mode 100644 index 000000000000..23ca41515527 --- /dev/null +++ b/include/linux/iio/sw_device.h @@ -0,0 +1,70 @@ +/* + * Industrial I/O software device interface + * + * Copyright (c) 2016 Intel Corporation + * + * 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_SW_DEVICE +#define __IIO_SW_DEVICE + +#include <linux/module.h> +#include <linux/device.h> +#include <linux/iio/iio.h> +#include <linux/configfs.h> + +#define module_iio_sw_device_driver(__iio_sw_device_type) \ +	module_driver(__iio_sw_device_type, iio_register_sw_device_type, \ +		      iio_unregister_sw_device_type) + +struct iio_sw_device_ops; + +struct iio_sw_device_type { +	const char *name; +	struct module *owner; +	const struct iio_sw_device_ops *ops; +	struct list_head list; +	struct config_group *group; +}; + +struct iio_sw_device { +	struct iio_dev *device; +	struct iio_sw_device_type *device_type; +	struct config_group group; +}; + +struct iio_sw_device_ops { +	struct iio_sw_device* (*probe)(const char *); +	int (*remove)(struct iio_sw_device *); +}; + +static inline +struct iio_sw_device *to_iio_sw_device(struct config_item *item) +{ +	return container_of(to_config_group(item), struct iio_sw_device, +			    group); +} + +int iio_register_sw_device_type(struct iio_sw_device_type *dt); +void iio_unregister_sw_device_type(struct iio_sw_device_type *dt); + +struct iio_sw_device *iio_sw_device_create(const char *, const char *); +void iio_sw_device_destroy(struct iio_sw_device *); + +int iio_sw_device_type_configfs_register(struct iio_sw_device_type *dt); +void iio_sw_device_type_configfs_unregister(struct iio_sw_device_type *dt); + +static inline +void iio_swd_group_init_type_name(struct iio_sw_device *d, +				  const char *name, +				  struct config_item_type *type) +{ +#ifdef CONFIG_CONFIGFS_FS +	config_group_init_type_name(&d->group, name, type); +#endif +} + +#endif /* __IIO_SW_DEVICE */ |