2019-06-04 10:11:33 +02:00
// SPDX-License-Identifier: GPL-2.0-only
2012-06-18 18:33:48 +02:00
/*
* Copyright ( c ) 2012 Analog Devices , Inc .
* Author : Lars - Peter Clausen < lars @ metafoo . de >
*/
# include <linux/kernel.h>
# include <linux/export.h>
# include <linux/module.h>
# include <linux/iio/iio.h>
# include <linux/iio/buffer.h>
2020-09-29 15:59:43 +03:00
# include <linux/iio/buffer_impl.h>
2012-06-18 18:33:48 +02:00
# include <linux/iio/kfifo_buf.h>
# include <linux/iio/triggered_buffer.h>
# include <linux/iio/trigger_consumer.h>
/**
2020-09-29 15:59:43 +03:00
* iio_triggered_buffer_setup_ext ( ) - Setup triggered buffer and pollfunc
2012-06-18 18:33:48 +02:00
* @ indio_dev : IIO device structure
2015-06-23 16:34:19 +03:00
* @ h : Function which will be used as pollfunc top half
* @ thread : Function which will be used as pollfunc bottom half
2021-10-07 08:00:32 +00:00
* @ direction : Direction of the data stream ( in / out ) .
2012-06-18 18:33:48 +02:00
* @ setup_ops : Buffer setup functions to use for this device .
* If NULL the default setup functions for triggered
* buffers will be used .
2020-09-29 15:59:43 +03:00
* @ buffer_attrs : Extra sysfs buffer attributes for this IIO buffer
2012-06-18 18:33:48 +02:00
*
* This function combines some common tasks which will normally be performed
* when setting up a triggered buffer . It will allocate the buffer and the
2014-11-26 18:55:12 +01:00
* pollfunc .
2012-06-18 18:33:48 +02:00
*
* Before calling this function the indio_dev structure should already be
* completely initialized , but not yet registered . In practice this means that
* this function should be called right before iio_device_register ( ) .
*
* To free the resources allocated by this function call
* iio_triggered_buffer_cleanup ( ) .
*/
2020-09-29 15:59:43 +03:00
int iio_triggered_buffer_setup_ext ( struct iio_dev * indio_dev ,
2015-06-23 16:34:19 +03:00
irqreturn_t ( * h ) ( int irq , void * p ) ,
irqreturn_t ( * thread ) ( int irq , void * p ) ,
2021-10-07 08:00:32 +00:00
enum iio_buffer_direction direction ,
2020-09-29 15:59:43 +03:00
const struct iio_buffer_setup_ops * setup_ops ,
2022-10-03 11:13:53 +03:00
const struct iio_dev_attr * * buffer_attrs )
2012-06-18 18:33:48 +02:00
{
2013-10-04 12:06:00 +01:00
struct iio_buffer * buffer ;
2012-06-18 18:33:48 +02:00
int ret ;
2014-12-19 18:39:24 +01:00
buffer = iio_kfifo_allocate ( ) ;
2013-10-04 12:06:00 +01:00
if ( ! buffer ) {
2012-06-18 18:33:48 +02:00
ret = - ENOMEM ;
goto error_ret ;
}
2015-06-23 16:34:19 +03:00
indio_dev - > pollfunc = iio_alloc_pollfunc ( h ,
thread ,
2012-06-18 18:33:48 +02:00
IRQF_ONESHOT ,
indio_dev ,
" %s_consumer%d " ,
indio_dev - > name ,
2021-04-26 18:49:03 +01:00
iio_device_id ( indio_dev ) ) ;
2012-06-18 18:33:48 +02:00
if ( indio_dev - > pollfunc = = NULL ) {
ret = - ENOMEM ;
goto error_kfifo_free ;
}
/* Ring buffer functions - here trigger setup related */
2020-05-25 14:38:53 +03:00
indio_dev - > setup_ops = setup_ops ;
2012-06-18 18:33:48 +02:00
/* Flag that polled ring buffering is possible */
indio_dev - > modes | = INDIO_BUFFER_TRIGGERED ;
2021-10-07 08:00:32 +00:00
buffer - > direction = direction ;
2020-09-29 15:59:43 +03:00
buffer - > attrs = buffer_attrs ;
2021-02-15 12:40:38 +02:00
ret = iio_device_attach_buffer ( indio_dev , buffer ) ;
if ( ret < 0 )
goto error_dealloc_pollfunc ;
2012-06-18 18:33:48 +02:00
return 0 ;
2021-02-15 12:40:38 +02:00
error_dealloc_pollfunc :
iio_dealloc_pollfunc ( indio_dev - > pollfunc ) ;
2012-06-18 18:33:48 +02:00
error_kfifo_free :
2021-02-15 12:40:38 +02:00
iio_kfifo_free ( buffer ) ;
2012-06-18 18:33:48 +02:00
error_ret :
return ret ;
}
2020-09-29 15:59:43 +03:00
EXPORT_SYMBOL ( iio_triggered_buffer_setup_ext ) ;
2012-06-18 18:33:48 +02:00
/**
2020-09-29 15:59:43 +03:00
* iio_triggered_buffer_cleanup ( ) - Free resources allocated by iio_triggered_buffer_setup_ext ( )
2012-06-18 18:33:48 +02:00
* @ indio_dev : IIO device structure
*/
void iio_triggered_buffer_cleanup ( struct iio_dev * indio_dev )
{
iio_dealloc_pollfunc ( indio_dev - > pollfunc ) ;
iio_kfifo_free ( indio_dev - > buffer ) ;
}
EXPORT_SYMBOL ( iio_triggered_buffer_cleanup ) ;
2021-04-08 19:38:13 +08:00
static void devm_iio_triggered_buffer_clean ( void * indio_dev )
2016-09-02 20:47:55 +02:00
{
2021-04-08 19:38:13 +08:00
iio_triggered_buffer_cleanup ( indio_dev ) ;
2016-09-02 20:47:55 +02:00
}
2020-09-29 15:59:43 +03:00
int devm_iio_triggered_buffer_setup_ext ( struct device * dev ,
struct iio_dev * indio_dev ,
irqreturn_t ( * h ) ( int irq , void * p ) ,
irqreturn_t ( * thread ) ( int irq , void * p ) ,
2021-10-07 08:00:32 +00:00
enum iio_buffer_direction direction ,
2020-09-29 15:59:43 +03:00
const struct iio_buffer_setup_ops * ops ,
2022-10-03 11:13:53 +03:00
const struct iio_dev_attr * * buffer_attrs )
2016-09-02 20:47:55 +02:00
{
int ret ;
2021-10-07 08:00:32 +00:00
ret = iio_triggered_buffer_setup_ext ( indio_dev , h , thread , direction ,
ops , buffer_attrs ) ;
2021-04-08 19:38:13 +08:00
if ( ret )
return ret ;
2016-09-02 20:47:55 +02:00
2021-04-08 19:38:13 +08:00
return devm_add_action_or_reset ( dev , devm_iio_triggered_buffer_clean ,
indio_dev ) ;
2016-09-02 20:47:55 +02:00
}
2020-09-29 15:59:43 +03:00
EXPORT_SYMBOL_GPL ( devm_iio_triggered_buffer_setup_ext ) ;
2016-09-02 20:47:55 +02:00
2012-06-18 18:33:48 +02:00
MODULE_AUTHOR ( " Lars-Peter Clausen <lars@metafoo.de> " ) ;
MODULE_DESCRIPTION ( " IIO helper functions for setting up triggered buffers " ) ;
MODULE_LICENSE ( " GPL " ) ;