162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * STMicroelectronics accelerometers driver 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright 2012-2013 STMicroelectronics Inc. 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Denis Ciocca <denis.ciocca@st.com> 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <linux/kernel.h> 1162306a36Sopenharmony_ci#include <linux/iio/iio.h> 1262306a36Sopenharmony_ci#include <linux/iio/buffer.h> 1362306a36Sopenharmony_ci#include <linux/iio/trigger.h> 1462306a36Sopenharmony_ci#include <linux/iio/triggered_buffer.h> 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#include <linux/iio/common/st_sensors.h> 1762306a36Sopenharmony_ci#include "st_accel.h" 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ciint st_accel_trig_set_state(struct iio_trigger *trig, bool state) 2062306a36Sopenharmony_ci{ 2162306a36Sopenharmony_ci struct iio_dev *indio_dev = iio_trigger_get_drvdata(trig); 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci return st_sensors_set_dataready_irq(indio_dev, state); 2462306a36Sopenharmony_ci} 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_cistatic int st_accel_buffer_postenable(struct iio_dev *indio_dev) 2762306a36Sopenharmony_ci{ 2862306a36Sopenharmony_ci int err; 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci err = st_sensors_set_axis_enable(indio_dev, indio_dev->active_scan_mask[0]); 3162306a36Sopenharmony_ci if (err < 0) 3262306a36Sopenharmony_ci return err; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci err = st_sensors_set_enable(indio_dev, true); 3562306a36Sopenharmony_ci if (err < 0) 3662306a36Sopenharmony_ci goto st_accel_buffer_enable_all_axis; 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci return 0; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_cist_accel_buffer_enable_all_axis: 4162306a36Sopenharmony_ci st_sensors_set_axis_enable(indio_dev, ST_SENSORS_ENABLE_ALL_AXIS); 4262306a36Sopenharmony_ci return err; 4362306a36Sopenharmony_ci} 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_cistatic int st_accel_buffer_predisable(struct iio_dev *indio_dev) 4662306a36Sopenharmony_ci{ 4762306a36Sopenharmony_ci int err; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci err = st_sensors_set_enable(indio_dev, false); 5062306a36Sopenharmony_ci if (err < 0) 5162306a36Sopenharmony_ci return err; 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci return st_sensors_set_axis_enable(indio_dev, 5462306a36Sopenharmony_ci ST_SENSORS_ENABLE_ALL_AXIS); 5562306a36Sopenharmony_ci} 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_cistatic const struct iio_buffer_setup_ops st_accel_buffer_setup_ops = { 5862306a36Sopenharmony_ci .postenable = &st_accel_buffer_postenable, 5962306a36Sopenharmony_ci .predisable = &st_accel_buffer_predisable, 6062306a36Sopenharmony_ci}; 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ciint st_accel_allocate_ring(struct iio_dev *indio_dev) 6362306a36Sopenharmony_ci{ 6462306a36Sopenharmony_ci return devm_iio_triggered_buffer_setup(indio_dev->dev.parent, indio_dev, 6562306a36Sopenharmony_ci NULL, &st_sensors_trigger_handler, &st_accel_buffer_setup_ops); 6662306a36Sopenharmony_ci} 67