Re: [PATCH 1/3] iio: trigger: helpers to determine own trigger

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 01/09/16 09:27, Linus Walleij wrote:
> This adds a helper function to the IIO trigger framework:
> 
> iio_trigger_using_own(): for an IIO device, this tells
>   whether the device is using itself as a trigger.
>   This is true if the indio device:
>   (A) supplies a trigger and
>   (B) has assigned its own buffer poll function to use this
>       trigger.
> 
> This helper function is good when constructing triggered,
> buffered drivers that can either use its own hardware *OR*
> an external trigger such as a HRTimer or even the trigger from
> a totally different sensor.
> 
> Under such circumstances it is important to know for example
> if the timestamp from the same trigger hardware should be used
> when populating the buffer: if iio_trigger_using_own() is true,
> we can use this timestamp, else we need to pick a unique
> timestamp directly in the trigger handler.
> 
> For this to work of course IIO devices registering hardware
> triggers must follow the convention to set the parent device
> properly, as as well as setting the parent of the IIO device
> itself.
> 
> When a new poll function is attached, we check if the parent
> device of the IIO of the poll function is the same as the
> parent device of the trigger and in that case we conclude that
> the hardware is using itself as trigger.
> 
> Cc: Giuseppe Barba <giuseppe.barba@xxxxxx>
> Cc: Denis Ciocca <denis.ciocca@xxxxxx>
> Cc: Crestez Dan Leonard <leonard.crestez@xxxxxxxxx>
> Cc: Gregor Boirie <gregor.boirie@xxxxxxxxxx>
> Signed-off-by: Linus Walleij <linus.walleij@xxxxxxxxxx>
Looks good to me, but I'll hold back on this one until we
have your driver in.

Kick me if I forget about it.

Thanks,

Jonathan
> ---
>  drivers/iio/industrialio-trigger.c | 16 ++++++++++++++++
>  include/linux/iio/trigger.h        | 11 +++++++++++
>  2 files changed, 27 insertions(+)
> 
> diff --git a/drivers/iio/industrialio-trigger.c b/drivers/iio/industrialio-trigger.c
> index 7ad82fdd3e5b..866d86832c50 100644
> --- a/drivers/iio/industrialio-trigger.c
> +++ b/drivers/iio/industrialio-trigger.c
> @@ -255,6 +255,14 @@ static int iio_trigger_attach_poll_func(struct iio_trigger *trig,
>  			goto out_free_irq;
>  	}
>  
> +	/*
> +	 * Check if we just registered to our own trigger: we determine that
> +	 * this is the case if the IIO device and the trigger device share the
> +	 * same parent device.
> +	 */
> +	if (pf->indio_dev->dev.parent == trig->dev.parent)
> +		trig->attached_own_device = true;
I guess that's valid in all cases.  Was trying to think if we'd ever
have a more complex relationship but I don't think so...
> +
>  	return ret;
>  
>  out_free_irq:
> @@ -279,6 +287,8 @@ static int iio_trigger_detach_poll_func(struct iio_trigger *trig,
>  		if (ret)
>  			return ret;
>  	}
> +	if (pf->indio_dev->dev.parent == trig->dev.parent)
> +		trig->attached_own_device = false;
>  	iio_trigger_put_irq(trig, pf->irq);
>  	free_irq(pf->irq, pf);
>  	module_put(pf->indio_dev->info->driver_module);
> @@ -622,6 +632,12 @@ void devm_iio_trigger_free(struct device *dev, struct iio_trigger *iio_trig)
>  }
>  EXPORT_SYMBOL_GPL(devm_iio_trigger_free);
>  
> +bool iio_trigger_using_own(struct iio_dev *indio_dev)
> +{
> +	return indio_dev->trig->attached_own_device;
> +}
> +EXPORT_SYMBOL(iio_trigger_using_own);
> +
>  void iio_device_register_trigger_consumer(struct iio_dev *indio_dev)
>  {
>  	indio_dev->groups[indio_dev->groupcounter++] =
> diff --git a/include/linux/iio/trigger.h b/include/linux/iio/trigger.h
> index 1c9e028e0d4a..6e935ab0a47f 100644
> --- a/include/linux/iio/trigger.h
> +++ b/include/linux/iio/trigger.h
> @@ -56,6 +56,9 @@ struct iio_trigger_ops {
>   * @subirqs:		[INTERN] information about the 'child' irqs.
>   * @pool:		[INTERN] bitmap of irqs currently in use.
>   * @pool_lock:		[INTERN] protection of the irq pool.
> + * @attached_own_device:[INTERN] if we are using our own device as trigger,
> + *			i.e. if we registered a poll function to the same
> + *			device as the one providing the trigger.
>   **/
>  struct iio_trigger {
>  	const struct iio_trigger_ops	*ops;
> @@ -73,6 +76,7 @@ struct iio_trigger {
>  	struct iio_subirq subirqs[CONFIG_IIO_CONSUMERS_PER_TRIGGER];
>  	unsigned long pool[BITS_TO_LONGS(CONFIG_IIO_CONSUMERS_PER_TRIGGER)];
>  	struct mutex			pool_lock;
> +	bool				attached_own_device;
>  };
>  
>  
> @@ -145,6 +149,13 @@ irqreturn_t iio_trigger_generic_data_rdy_poll(int irq, void *private);
>  __printf(1, 2) struct iio_trigger *iio_trigger_alloc(const char *fmt, ...);
>  void iio_trigger_free(struct iio_trigger *trig);
>  
> +/**
> + * iio_trigger_using_own() - tells us if we use our own HW trigger ourselves
> + * @indio_dev:  device to check
> + */
> +bool iio_trigger_using_own(struct iio_dev *indio_dev);
> +
> +
>  #else
>  struct iio_trigger;
>  struct iio_trigger_ops;
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-iio" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Input]     [Linux Kernel]     [Linux SCSI]     [X.org]

  Powered by Linux