eb1d8ebf2d
This patch is trying to cleanup for good the buffers operation functions. There is no need of using preenable, all can be done into postenable. Let's also use logical sequence of operations as already done in accel driver. Finally also rename the goto label using operation to perform and not where it fails. Not stable material as not fixing a 'bug' but rather bringing the driver in line with general 'patterns' to allow a subsystem wide cleanup. Signed-off-by: Denis Ciocca <denis.ciocca@st.com> Reviewed-by: Alexandru Ardelean <alexandru.ardelean@analog.com> Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
93 lines
2.2 KiB
C
93 lines
2.2 KiB
C
// SPDX-License-Identifier: GPL-2.0-only
|
|
/*
|
|
* STMicroelectronics pressures driver
|
|
*
|
|
* Copyright 2013 STMicroelectronics Inc.
|
|
*
|
|
* Denis Ciocca <denis.ciocca@st.com>
|
|
*/
|
|
|
|
#include <linux/module.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/stat.h>
|
|
#include <linux/interrupt.h>
|
|
#include <linux/i2c.h>
|
|
#include <linux/delay.h>
|
|
#include <linux/iio/iio.h>
|
|
#include <linux/iio/buffer.h>
|
|
#include <linux/iio/trigger_consumer.h>
|
|
#include <linux/iio/triggered_buffer.h>
|
|
|
|
#include <linux/iio/common/st_sensors.h>
|
|
#include "st_pressure.h"
|
|
|
|
int st_press_trig_set_state(struct iio_trigger *trig, bool state)
|
|
{
|
|
struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig);
|
|
|
|
return st_sensors_set_dataready_irq(indio_dev, state);
|
|
}
|
|
|
|
static int st_press_buffer_postenable(struct iio_dev *indio_dev)
|
|
{
|
|
struct st_sensor_data *press_data = iio_priv(indio_dev);
|
|
int err;
|
|
|
|
press_data->buffer_data = kmalloc(indio_dev->scan_bytes,
|
|
GFP_DMA | GFP_KERNEL);
|
|
if (!press_data->buffer_data)
|
|
return -ENOMEM;
|
|
|
|
err = iio_triggered_buffer_postenable(indio_dev);
|
|
if (err < 0)
|
|
goto st_press_free_buffer;
|
|
|
|
err = st_sensors_set_enable(indio_dev, true);
|
|
if (err < 0)
|
|
goto st_press_buffer_predisable;
|
|
|
|
return 0;
|
|
|
|
st_press_buffer_predisable:
|
|
iio_triggered_buffer_predisable(indio_dev);
|
|
st_press_free_buffer:
|
|
kfree(press_data->buffer_data);
|
|
return err;
|
|
}
|
|
|
|
static int st_press_buffer_predisable(struct iio_dev *indio_dev)
|
|
{
|
|
struct st_sensor_data *press_data = iio_priv(indio_dev);
|
|
int err, err2;
|
|
|
|
err = st_sensors_set_enable(indio_dev, false);
|
|
|
|
err2 = iio_triggered_buffer_predisable(indio_dev);
|
|
if (!err)
|
|
err = err2;
|
|
|
|
kfree(press_data->buffer_data);
|
|
return err;
|
|
}
|
|
|
|
static const struct iio_buffer_setup_ops st_press_buffer_setup_ops = {
|
|
.postenable = &st_press_buffer_postenable,
|
|
.predisable = &st_press_buffer_predisable,
|
|
};
|
|
|
|
int st_press_allocate_ring(struct iio_dev *indio_dev)
|
|
{
|
|
return iio_triggered_buffer_setup(indio_dev, NULL,
|
|
&st_sensors_trigger_handler, &st_press_buffer_setup_ops);
|
|
}
|
|
|
|
void st_press_deallocate_ring(struct iio_dev *indio_dev)
|
|
{
|
|
iio_triggered_buffer_cleanup(indio_dev);
|
|
}
|
|
|
|
MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");
|
|
MODULE_DESCRIPTION("STMicroelectronics pressures buffer");
|
|
MODULE_LICENSE("GPL v2");
|