On Mon, Mar 8, 2021 at 1:19 AM Alexandru Ardelean <ardeleanalex@xxxxxxxxx> wrote: > > On Mon, Mar 8, 2021 at 10:34 AM Gwendal Grignou <gwendal@xxxxxxxxxxxx> wrote: > > > > fixes commit 2e2366c2d141 ("iio: cros_ec: unify hw fifo attributes into the core file") > > fixes commit 165aea80e2e2 ("iio: cros_ec: use devm_iio_triggered_buffer_setup_ext()") > > > > 1. Instead of adding has_fw_fifo, deduct it from the configuration: > > - EC must support FIFO (EC_FEATURE_MOTION_SENSE_FIFO) set. > > - sensors send data a regular interval (accelerometer, gyro, > > magnetomer, barometer, light sensor). > > - "Legacy accelerometer" is only present on EC without FIFO, so we don't > > need to set buffer attributes. > > > > 2. devm_iio_triggered_buffer_setup_ext() does not need to be called. > > Only when the EC support FIFO we set the buffer attributes directly to set > > timeout and watermark. > > > > Signed-off-by: Gwendal Grignou <gwendal@xxxxxxxxxxxx> > > --- > > drivers/iio/accel/cros_ec_accel_legacy.c | 2 +- > > .../cros_ec_sensors/cros_ec_lid_angle.c | 3 +-- > > .../common/cros_ec_sensors/cros_ec_sensors.c | 3 +-- > > .../cros_ec_sensors/cros_ec_sensors_core.c | 19 +++++++------------ > > drivers/iio/light/cros_ec_light_prox.c | 3 +-- > > drivers/iio/pressure/cros_ec_baro.c | 3 +-- > > .../linux/iio/common/cros_ec_sensors_core.h | 3 +-- > > 7 files changed, 13 insertions(+), 23 deletions(-) > > > > diff --git a/drivers/iio/accel/cros_ec_accel_legacy.c b/drivers/iio/accel/cros_ec_accel_legacy.c > > index 8f1232c38e0d7..b6f3471b62dcf 100644 > > --- a/drivers/iio/accel/cros_ec_accel_legacy.c > > +++ b/drivers/iio/accel/cros_ec_accel_legacy.c > > @@ -215,7 +215,7 @@ static int cros_ec_accel_legacy_probe(struct platform_device *pdev) > > return -ENOMEM; > > > > ret = cros_ec_sensors_core_init(pdev, indio_dev, true, > > - cros_ec_sensors_capture, NULL, false); > > + cros_ec_sensors_capture, NULL); > > if (ret) > > return ret; > > > > diff --git a/drivers/iio/common/cros_ec_sensors/cros_ec_lid_angle.c b/drivers/iio/common/cros_ec_sensors/cros_ec_lid_angle.c > > index 752f59037715b..af801e203623e 100644 > > --- a/drivers/iio/common/cros_ec_sensors/cros_ec_lid_angle.c > > +++ b/drivers/iio/common/cros_ec_sensors/cros_ec_lid_angle.c > > @@ -97,8 +97,7 @@ static int cros_ec_lid_angle_probe(struct platform_device *pdev) > > if (!indio_dev) > > return -ENOMEM; > > > > - ret = cros_ec_sensors_core_init(pdev, indio_dev, false, NULL, > > - NULL, false); > > + ret = cros_ec_sensors_core_init(pdev, indio_dev, false, NULL, NULL); > > if (ret) > > return ret; > > > > diff --git a/drivers/iio/common/cros_ec_sensors/cros_ec_sensors.c b/drivers/iio/common/cros_ec_sensors/cros_ec_sensors.c > > index dee1191de7528..376a5b30010ae 100644 > > --- a/drivers/iio/common/cros_ec_sensors/cros_ec_sensors.c > > +++ b/drivers/iio/common/cros_ec_sensors/cros_ec_sensors.c > > @@ -236,8 +236,7 @@ static int cros_ec_sensors_probe(struct platform_device *pdev) > > > > ret = cros_ec_sensors_core_init(pdev, indio_dev, true, > > cros_ec_sensors_capture, > > - cros_ec_sensors_push_data, > > - true); > > + cros_ec_sensors_push_data); > > if (ret) > > return ret; > > > > diff --git a/drivers/iio/common/cros_ec_sensors/cros_ec_sensors_core.c b/drivers/iio/common/cros_ec_sensors/cros_ec_sensors_core.c > > index c833ec0ef2147..1926f5719b2d4 100644 > > --- a/drivers/iio/common/cros_ec_sensors/cros_ec_sensors_core.c > > +++ b/drivers/iio/common/cros_ec_sensors/cros_ec_sensors_core.c > > @@ -8,6 +8,7 @@ > > #include <linux/delay.h> > > #include <linux/device.h> > > #include <linux/iio/buffer.h> > > +#include <linux/iio/buffer_impl.h> > > buffer_impl.h should not need to be included in drivers; > in should be included in buffer implementations like kfifo, > dma-buffer, and others I added the include file to be able to access buffer->attrs. I agree it is not supposed to be called by iio driver themselves. > > > #include <linux/iio/common/cros_ec_sensors_core.h> > > #include <linux/iio/iio.h> > > #include <linux/iio/kfifo_buf.h> > > @@ -240,7 +241,6 @@ static void cros_ec_sensors_core_clean(void *arg) > > * for backward compatibility. > > * @push_data: function to call when cros_ec_sensorhub receives > > * a sample for that sensor. > > - * @has_hw_fifo: Set true if this device has/uses a HW FIFO > > * > > * Return: 0 on success, -errno on failure. > > */ > > @@ -248,8 +248,7 @@ int cros_ec_sensors_core_init(struct platform_device *pdev, > > struct iio_dev *indio_dev, > > bool physical_device, > > cros_ec_sensors_capture_t trigger_capture, > > - cros_ec_sensorhub_push_data_cb_t push_data, > > - bool has_hw_fifo) > > + cros_ec_sensorhub_push_data_cb_t push_data) > > { > > struct device *dev = &pdev->dev; > > struct cros_ec_sensors_core_state *state = iio_priv(indio_dev); > > @@ -358,21 +357,17 @@ int cros_ec_sensors_core_init(struct platform_device *pdev, > > ret = iio_device_set_clock(indio_dev, CLOCK_BOOTTIME); > > if (ret) > > return ret; > > - } else { > > - const struct attribute **fifo_attrs; > > - > > - if (has_hw_fifo) > > - fifo_attrs = cros_ec_sensor_fifo_attributes; > > - else > > - fifo_attrs = NULL; > > > > + /* Set attributes to control EC FIFO directly. */ > > + indio_dev->buffer->attrs = cros_ec_sensor_fifo_attributes; > > accessing 'indio_dev->buffer' directly will be discouraged, because > the idea [moving forward] is to support more than one IIO buffer per > IIO device; > the idea of devm_iio_triggered_buffer_setup_ext() is to pass the > 'cros_ec_sensor_fifo_attributes' to the IIO buffer, without needing to > dig it from the IIO device; What I can do using the existing iio API is to create a "slim" trigger that does not do much like hid sensor stack does at hid_sensor_setup_trigger() while callbacks callbacks.send_event and callbacks.capture_sample are doing the real work. But once I have a trigger, I can call devm_iio_triggered_buffer_setup_ext and set the fifo attributes. Gwendal. > > maybe a new method will be needed to access each IIO buffer of the IIO device; > but when that happens, accessing a buffer with 'indio_dev->buffer' > and iio_device_get_buffer(indio_dev, 0 [or 1]) will look a bit > confusing (or at least duplicate) > > > + } else { > > /* > > * The only way to get samples in buffer is to set a > > * software trigger (systrig, hrtimer). > > */ > > - ret = devm_iio_triggered_buffer_setup_ext( > > + ret = devm_iio_triggered_buffer_setup( > > dev, indio_dev, NULL, trigger_capture, > > - NULL, fifo_attrs); > > + NULL); > > if (ret) > > return ret; > > } > > diff --git a/drivers/iio/light/cros_ec_light_prox.c b/drivers/iio/light/cros_ec_light_prox.c > > index 75d6b5fcf2cc4..de472f23d1cba 100644 > > --- a/drivers/iio/light/cros_ec_light_prox.c > > +++ b/drivers/iio/light/cros_ec_light_prox.c > > @@ -182,8 +182,7 @@ static int cros_ec_light_prox_probe(struct platform_device *pdev) > > > > ret = cros_ec_sensors_core_init(pdev, indio_dev, true, > > cros_ec_sensors_capture, > > - cros_ec_sensors_push_data, > > - true); > > + cros_ec_sensors_push_data); > > if (ret) > > return ret; > > > > diff --git a/drivers/iio/pressure/cros_ec_baro.c b/drivers/iio/pressure/cros_ec_baro.c > > index aa043cb9ac426..2f882e1094232 100644 > > --- a/drivers/iio/pressure/cros_ec_baro.c > > +++ b/drivers/iio/pressure/cros_ec_baro.c > > @@ -139,8 +139,7 @@ static int cros_ec_baro_probe(struct platform_device *pdev) > > > > ret = cros_ec_sensors_core_init(pdev, indio_dev, true, > > cros_ec_sensors_capture, > > - cros_ec_sensors_push_data, > > - true); > > + cros_ec_sensors_push_data); > > if (ret) > > return ret; > > > > diff --git a/include/linux/iio/common/cros_ec_sensors_core.h b/include/linux/iio/common/cros_ec_sensors_core.h > > index c9b80be82440f..7ce8a8adad587 100644 > > --- a/include/linux/iio/common/cros_ec_sensors_core.h > > +++ b/include/linux/iio/common/cros_ec_sensors_core.h > > @@ -96,8 +96,7 @@ struct platform_device; > > int cros_ec_sensors_core_init(struct platform_device *pdev, > > struct iio_dev *indio_dev, bool physical_device, > > cros_ec_sensors_capture_t trigger_capture, > > - cros_ec_sensorhub_push_data_cb_t push_data, > > - bool has_hw_fifo); > > + cros_ec_sensorhub_push_data_cb_t push_data); > > > > irqreturn_t cros_ec_sensors_capture(int irq, void *p); > > int cros_ec_sensors_push_data(struct iio_dev *indio_dev, > > -- > > 2.30.1.766.gb4fecdf3b7-goog > >