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>
# include <linux/iio/kfifo_buf.h>
# include <linux/iio/triggered_buffer.h>
# include <linux/iio/trigger_consumer.h>
static const struct iio_buffer_setup_ops iio_triggered_buffer_setup_ops = {
. postenable = & iio_triggered_buffer_postenable ,
. predisable = & iio_triggered_buffer_predisable ,
} ;
/**
* iio_triggered_buffer_setup ( ) - Setup triggered buffer and pollfunc
* @ 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
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 .
*
* 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 ( ) .
*/
int iio_triggered_buffer_setup ( 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 ) ,
2012-06-18 18:33:48 +02:00
const struct iio_buffer_setup_ops * setup_ops )
{
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 ;
}
2013-10-04 12:06:00 +01:00
iio_device_attach_buffer ( indio_dev , buffer ) ;
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 ,
indio_dev - > id ) ;
if ( indio_dev - > pollfunc = = NULL ) {
ret = - ENOMEM ;
goto error_kfifo_free ;
}
/* Ring buffer functions - here trigger setup related */
if ( setup_ops )
indio_dev - > setup_ops = setup_ops ;
else
indio_dev - > setup_ops = & iio_triggered_buffer_setup_ops ;
/* Flag that polled ring buffering is possible */
indio_dev - > modes | = INDIO_BUFFER_TRIGGERED ;
return 0 ;
error_kfifo_free :
iio_kfifo_free ( indio_dev - > buffer ) ;
error_ret :
return ret ;
}
EXPORT_SYMBOL ( iio_triggered_buffer_setup ) ;
/**
* iio_triggered_buffer_cleanup ( ) - Free resources allocated by iio_triggered_buffer_setup ( )
* @ 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 ) ;
2016-09-02 20:47:55 +02:00
static void devm_iio_triggered_buffer_clean ( struct device * dev , void * res )
{
iio_triggered_buffer_cleanup ( * ( struct iio_dev * * ) res ) ;
}
int devm_iio_triggered_buffer_setup ( struct device * dev ,
struct iio_dev * indio_dev ,
irqreturn_t ( * h ) ( int irq , void * p ) ,
irqreturn_t ( * thread ) ( int irq , void * p ) ,
const struct iio_buffer_setup_ops * ops )
{
struct iio_dev * * ptr ;
int ret ;
ptr = devres_alloc ( devm_iio_triggered_buffer_clean , sizeof ( * ptr ) ,
GFP_KERNEL ) ;
if ( ! ptr )
return - ENOMEM ;
* ptr = indio_dev ;
ret = iio_triggered_buffer_setup ( indio_dev , h , thread , ops ) ;
if ( ! ret )
devres_add ( dev , ptr ) ;
else
devres_free ( ptr ) ;
return ret ;
}
EXPORT_SYMBOL_GPL ( devm_iio_triggered_buffer_setup ) ;
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 " ) ;