Re: [RFC PATCH 0/5] iio: remove iio_buffer_set_attrs() and assign buffer attrs during alloc

From: Jonathan Cameron
Date: Sat Sep 26 2020 - 12:20:24 EST


On Fri, 25 Sep 2020 11:37:38 +0300
Alexandru Ardelean <alexandru.ardelean@xxxxxxxxxx> wrote:

> I've been mulling this over for a while, and I am still not 100% convinced
> that this is the best approach, but this feels closer to something
> correct.

I'd not worry too much. It might not be perfect but it's also not hideous
- though that won't stop me suggesting an alternative :)

>
> A few things about this patchset:
> 1. it hasn't been tested; it just compiles
> 2. there are some patches that have went out [from my side] in the last
> few days that deal with trying to organize iio_buffer_set_attrs()
> in order to get to this point [as-in: this patch-set]
> 2a. the only reason patch [1] is in this set, is so that [5] applies
> 2b. the main reason patch [2] is in this set, is so that [5] compiles
> 3. This patch is only meant as RFC, as I'd like that some cleanup
> patches go in before this set; this RFC is meant to provide an idea
> of where I want to get at.
>
> This tries to address the issue with iio_buffer_set_attrs(), where a
> driver needs to provide a reference to a buffer to assign extra sysfs
> attributes.
> Something like 'iio_buffer_set_attrs(indio_dev->buffer, <buffer_attrs>)'
>
> This works well for the 1 IIO buffer == 1 IIO device case.
> The driver access the 'buffer' reference attached to the IIO device.
>
> But for a multiple IIO buffers per 1 IIO device, this is cumbersome, as
> a driver would need to:
> 1. allocate a set of buffers
> 2. dig out of IIO the buffers to which it wants to assign extra sysfs
> attributes
>
> The main change here is to move the attributes [usually HW FIFO
> attributes] to become arguments of the devm_}iio_triggered_buffer_setup()
> functions.
> Other buffer allocation functions would need to do the same, but right
> now, it's only these functions that assign extra buffer attributes.

Probably worth stating here that we have a confusing mess of where
these attributes are and will probably look long term to move them
or at least think about doing so.

The buffer directory in modern IIO isn't strictly matched to a hwfifo
any more (it used to be - see sca3000 for the history - the model
was not a nice solution, but it took a few years to figure that out).
buffer/* represent a software buffer fed by the hardware fifo. There
are potentially other software buffers being fed in the form of
other consumers.

The hardware fifo is a separate entity. However as Alex adds
support for multiple streams of data (that may come from mulitple hardware
fifos) we are going to still need a mapping of hardware buffer X
to software buffer X. So separate entities, but with a one to one
(technically many of the consumer side, but only one in the IIO
userspace interface) mapping.

Anyhow, Alex and others know this from previous discussions but perhaps others
reading this don't hence I thought I'd mention it :)

>
> Some alternative ideas to doing this change [as-is]:
> * move the attributes to 'struct iio_buffer_setup_ops' ; this has a
> minimal patch/change-impact, but it doesn't feel correct
> * introduce a new type called 'struct iio_trigerred_buffer_args' that
> wrap all the triggered-buffer arguments into a single object; this is
> still a big patch [like this], but future-wise, we would just be
> extending that object [if more args are needed]; the main point
> here is that right now 'devm_iio_triggered_buffer_setup()' has 6
> arguments, which feels a bit much

So here is another one:
* Let us assume that we actually don't want to use this interface in new
drivers because we decide to deprecate putting the hardware fifo stuff
where it currently is. (big assumption - dependent on what userspace
code is using this and it will take a while).
* With that assumption, we could add a new function that takes the attrs
e.g. iio_setup_triggered_buffer_ext()
and only replace the instances where we need to provide the attrs.

To be honest, as I said above, I'm not that bothered which route is
taken.

Jonathan

>
>
> Alexandru Ardelean (5):
> [1] iio: cros_ec: unify hw fifo attributes into the core file
> [2] iio: buffer: dmaengine: unwrap the use of iio_buffer_set_attrs()
> [3] iio: triggered-buffer: add sysfs buffer attributes as args for setup
> [4] iio: buffer: extend arg list for {devm_}iio_triggered_buffer_setup()
> [5] iio: remove iio_buffer_set_attrs() and assign buffer attrs during
> alloc
>
> drivers/iio/accel/adxl372.c | 5 ++--
> drivers/iio/accel/bma180.c | 2 +-
> drivers/iio/accel/bma220_spi.c | 2 +-
> drivers/iio/accel/bmc150-accel-core.c | 19 ++++++++------
> drivers/iio/accel/cros_ec_accel_legacy.c | 2 +-
> drivers/iio/accel/kxcjk-1013.c | 2 +-
> drivers/iio/accel/kxsd9.c | 2 +-
> drivers/iio/accel/mma7455_core.c | 2 +-
> drivers/iio/accel/mma8452.c | 2 +-
> drivers/iio/accel/mxc4005.c | 2 +-
> drivers/iio/accel/st_accel_buffer.c | 2 +-
> drivers/iio/accel/stk8312.c | 2 +-
> drivers/iio/accel/stk8ba50.c | 2 +-
> drivers/iio/adc/ad7266.c | 3 ++-
> drivers/iio/adc/ad7298.c | 2 +-
> drivers/iio/adc/ad7476.c | 2 +-
> drivers/iio/adc/ad7606.c | 2 +-
> drivers/iio/adc/ad7766.c | 2 +-
> drivers/iio/adc/ad7768-1.c | 2 +-
> drivers/iio/adc/ad7887.c | 2 +-
> drivers/iio/adc/ad7923.c | 2 +-
> drivers/iio/adc/ad799x.c | 2 +-
> drivers/iio/adc/ad_sigma_delta.c | 2 +-
> drivers/iio/adc/at91-sama5d2_adc.c | 25 +++++++++++--------
> drivers/iio/adc/at91_adc.c | 2 +-
> drivers/iio/adc/cc10001_adc.c | 2 +-
> drivers/iio/adc/dln2-adc.c | 3 ++-
> drivers/iio/adc/hx711.c | 3 ++-
> drivers/iio/adc/max1027.c | 2 +-
> drivers/iio/adc/max1118.c | 2 +-
> drivers/iio/adc/max1363.c | 2 +-
> drivers/iio/adc/mxs-lradc-adc.c | 2 +-
> drivers/iio/adc/rockchip_saradc.c | 2 +-
> drivers/iio/adc/stm32-adc.c | 2 +-
> drivers/iio/adc/stm32-dfsdm-adc.c | 2 +-
> drivers/iio/adc/ti-adc081c.c | 3 ++-
> drivers/iio/adc/ti-adc0832.c | 2 +-
> drivers/iio/adc/ti-adc084s021.c | 3 ++-
> drivers/iio/adc/ti-adc108s102.c | 3 ++-
> drivers/iio/adc/ti-adc12138.c | 2 +-
> drivers/iio/adc/ti-adc161s626.c | 2 +-
> drivers/iio/adc/ti-ads1015.c | 2 +-
> drivers/iio/adc/ti-ads124s08.c | 3 ++-
> drivers/iio/adc/ti-ads7950.c | 3 ++-
> drivers/iio/adc/ti-ads8688.c | 3 ++-
> drivers/iio/adc/ti-tlc4541.c | 2 +-
> drivers/iio/adc/vf610_adc.c | 3 ++-
> drivers/iio/adc/xilinx-xadc-core.c | 2 +-
> .../buffer/industrialio-buffer-dmaengine.c | 3 +--
> .../buffer/industrialio-triggered-buffer.c | 13 +++++++---
> drivers/iio/chemical/atlas-sensor.c | 2 +-
> drivers/iio/chemical/ccs811.c | 2 +-
> drivers/iio/chemical/pms7003.c | 3 ++-
> drivers/iio/chemical/scd30_core.c | 3 ++-
> drivers/iio/chemical/sps30.c | 3 ++-
> .../cros_ec_sensors/cros_ec_lid_angle.c | 5 ++--
> .../common/cros_ec_sensors/cros_ec_sensors.c | 5 ++--
> .../cros_ec_sensors/cros_ec_sensors_core.c | 16 +++++++++---
> .../common/hid-sensors/hid-sensor-trigger.c | 19 ++++++--------
> drivers/iio/gyro/adxrs290.c | 3 ++-
> drivers/iio/gyro/bmg160_core.c | 2 +-
> drivers/iio/gyro/fxas21002c_core.c | 3 ++-
> drivers/iio/gyro/itg3200_buffer.c | 2 +-
> drivers/iio/gyro/mpu3050-core.c | 2 +-
> drivers/iio/gyro/st_gyro_buffer.c | 2 +-
> drivers/iio/health/afe4403.c | 2 +-
> drivers/iio/health/afe4404.c | 2 +-
> drivers/iio/humidity/am2315.c | 2 +-
> drivers/iio/humidity/hdc100x.c | 2 +-
> drivers/iio/humidity/hts221_buffer.c | 2 +-
> drivers/iio/imu/adis_buffer.c | 2 +-
> drivers/iio/imu/bmi160/bmi160_core.c | 3 ++-
> drivers/iio/imu/inv_mpu6050/inv_mpu_core.c | 2 +-
> drivers/iio/imu/kmx61.c | 4 +--
> drivers/iio/industrialio-buffer.c | 12 ---------
> drivers/iio/light/adjd_s311.c | 2 +-
> drivers/iio/light/as73211.c | 3 ++-
> drivers/iio/light/cros_ec_light_prox.c | 5 ++--
> drivers/iio/light/gp2ap020a00f.c | 3 ++-
> drivers/iio/light/isl29125.c | 2 +-
> drivers/iio/light/ltr501.c | 2 +-
> drivers/iio/light/max44000.c | 3 ++-
> drivers/iio/light/rpr0521.c | 2 +-
> drivers/iio/light/si1145.c | 2 +-
> drivers/iio/light/st_uvis25_core.c | 2 +-
> drivers/iio/light/tcs3414.c | 2 +-
> drivers/iio/light/tcs3472.c | 2 +-
> drivers/iio/light/vcnl4000.c | 3 ++-
> drivers/iio/light/vcnl4035.c | 2 +-
> drivers/iio/magnetometer/ak8974.c | 2 +-
> drivers/iio/magnetometer/ak8975.c | 2 +-
> drivers/iio/magnetometer/bmc150_magn.c | 2 +-
> drivers/iio/magnetometer/hmc5843_core.c | 2 +-
> drivers/iio/magnetometer/mag3110.c | 2 +-
> drivers/iio/magnetometer/rm3100-core.c | 2 +-
> drivers/iio/magnetometer/st_magn_buffer.c | 2 +-
> drivers/iio/potentiostat/lmp91000.c | 2 +-
> drivers/iio/pressure/cros_ec_baro.c | 5 ++--
> drivers/iio/pressure/dlhl60d.c | 2 +-
> drivers/iio/pressure/mpl3115.c | 2 +-
> drivers/iio/pressure/ms5611_core.c | 2 +-
> drivers/iio/pressure/st_pressure_buffer.c | 2 +-
> drivers/iio/pressure/zpa2326.c | 2 +-
> drivers/iio/proximity/as3935.c | 3 ++-
> drivers/iio/proximity/isl29501.c | 2 +-
> drivers/iio/proximity/mb1232.c | 3 ++-
> .../iio/proximity/pulsedlight-lidar-lite-v2.c | 2 +-
> drivers/iio/proximity/srf08.c | 3 ++-
> drivers/iio/proximity/sx9310.c | 2 +-
> drivers/iio/proximity/sx9500.c | 2 +-
> drivers/iio/temperature/maxim_thermocouple.c | 3 ++-
> include/linux/iio/buffer.h | 3 ---
> .../linux/iio/common/cros_ec_sensors_core.h | 4 +--
> include/linux/iio/triggered_buffer.h | 7 ++++--
> 114 files changed, 198 insertions(+), 172 deletions(-)
>