Commit 68afaf5e authored by Luis Ubieda's avatar Luis Ubieda Committed by Fabio Baltieri
Browse files

paa3905: Improve error-handling and cleanup during streaming



- Setting IODEV_SQE to NULL to subsequent triggers are rejected.
- Channel all error-resolutions through handle_result_on_error().

Signed-off-by: default avatarLuis Ubieda <luisf@croxel.com>
parent dbc49f04
Loading
Loading
Loading
Loading
+21 −16
Original line number Diff line number Diff line
@@ -21,17 +21,28 @@
#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(PAA3905_STREAM, CONFIG_SENSOR_LOG_LEVEL);

static inline void handle_result_on_error(const struct device *dev, int err)
{
	struct paa3905_data *data = dev->data;
	struct rtio_iodev_sqe *iodev_sqe = data->stream.iodev_sqe;

	data->stream.iodev_sqe = NULL;
	rtio_iodev_sqe_err(iodev_sqe, err);
}

static void paa3905_chip_recovery_handler(struct rtio_iodev_sqe *iodev_sqe)
{
	const struct sensor_read_config *cfg = iodev_sqe->sqe.iodev->data;
	const struct device *dev = cfg->sensor;
	struct paa3905_data *data = dev->data;
	int err;

	err = paa3905_recover(dev);

	if (err) {
		rtio_iodev_sqe_err(iodev_sqe, err);
		handle_result_on_error(dev, err);
	} else {
		data->stream.iodev_sqe = NULL;
		rtio_iodev_sqe_ok(iodev_sqe, 0);
	}
}
@@ -82,7 +93,7 @@ static void paa3905_complete_result(struct rtio *ctx,

		CHECKIF(!req) {
			LOG_ERR("Failed to allocate RTIO work request");
			rtio_iodev_sqe_err(iodev_sqe, -ENOMEM);
			handle_result_on_error(dev, -ENOMEM);
			return;
		}

@@ -128,12 +139,8 @@ static void paa3905_stream_get_data(const struct device *dev)

	/** Still throw an error even if asserts are off */
	if (err) {
		struct rtio_iodev_sqe *iodev_sqe = data->stream.iodev_sqe;

		LOG_ERR("Failed to acquire buffer for encoded data: %d", err);

		data->stream.iodev_sqe = NULL;
		rtio_iodev_sqe_err(iodev_sqe, err);
		handle_result_on_error(dev, err);
		return;
	}

@@ -144,19 +151,15 @@ static void paa3905_stream_get_data(const struct device *dev)

	err = sensor_clock_get_cycles(&cycles);
	CHECKIF(err) {
		struct rtio_iodev_sqe *iodev_sqe = data->stream.iodev_sqe;

		LOG_ERR("Failed to get timestamp: %d", err);

		data->stream.iodev_sqe = NULL;
		rtio_iodev_sqe_err(iodev_sqe, err);
		handle_result_on_error(dev, err);
		return;
	}
	buf->header.timestamp = sensor_clock_cycles_to_ns(cycles);

	CHECKIF(!write_sqe || !read_sqe || !cb_sqe) {
		LOG_ERR("Failed to acquire RTIO SQE's");
		rtio_iodev_sqe_err(data->stream.iodev_sqe, -ENOMEM);
		handle_result_on_error(dev, -ENOMEM);
		return;
	}

@@ -202,6 +205,7 @@ static void paa3905_gpio_callback(const struct device *gpio_dev,
					      GPIO_INT_MODE_DISABLED);
	if (err) {
		LOG_ERR("Failed to disable interrupt");
		handle_result_on_error(dev, err);
		return;
	}

@@ -222,6 +226,7 @@ static void paa3905_stream_drdy_timeout(struct k_timer *timer)
					      GPIO_INT_MODE_DISABLED);
	if (err) {
		LOG_ERR("Failed to disable interrupt");
		handle_result_on_error(dev, err);
		return;
	}

@@ -284,7 +289,7 @@ void paa3905_stream_submit(const struct device *dev,
						      GPIO_INT_MODE_DISABLED);
		if (err) {
			LOG_ERR("Failed to disable interrupt");
			rtio_iodev_sqe_err(iodev_sqe, err);
			handle_result_on_error(dev, err);
			return;
		}

@@ -292,7 +297,7 @@ void paa3905_stream_submit(const struct device *dev,
		err = paa3905_bus_read(dev, REG_MOTION, motion_data, sizeof(motion_data));
		if (err) {
			LOG_ERR("Failed to read motion data");
			rtio_iodev_sqe_err(iodev_sqe, err);
			handle_result_on_error(dev, err);
			return;
		}
	}
@@ -302,7 +307,7 @@ void paa3905_stream_submit(const struct device *dev,
						GPIO_INT_LEVEL_ACTIVE);
	if (err) {
		LOG_ERR("Failed to enable interrupt");
		rtio_iodev_sqe_err(iodev_sqe, err);
		handle_result_on_error(dev, err);
		return;
	}