RE: [PATCH V1 2/6] iio: accel: sca3300: Add interface for operation modes.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Thanks a lot all of your inputs, I'm just back from long holiday and start to rework on the patches.

> From: Jonathan Cameron <jic23@xxxxxxxxxx>
> Sent: Sunday, January 30, 2022 7:40 PM
> To: LI Qingwu <qing-wu.li@xxxxxxxxxxxxxxxxxxxxxxx>
> Cc: lars@xxxxxxxxxx; robh+dt@xxxxxxxxxx; tomas.melin@xxxxxxxxxxx;
> andy.shevchenko@xxxxxxxxx; devicetree@xxxxxxxxxxxxxxx;
> linux-kernel@xxxxxxxxxxxxxxx
> Subject: Re: [PATCH V1 2/6] iio: accel: sca3300: Add interface for operation
> modes.
> 
> This email is not from Hexagon’s Office 365 instance. Please be careful while
> clicking links, opening attachments, or replying to this email.
> 
> 
> On Mon, 24 Jan 2022 09:39:08 +0000
> LI Qingwu <Qing-wu.Li@xxxxxxxxxxxxxxxxxxxxxxx> wrote:
> 
> > The acceleration scale and the frequency were set via operation modes,
> > the scal and frequency are both non-uniqueness, this leads to logic
> > confusion for setting scale.and.frequency.
> > it getting worse if add more different sensor types into the driver.
> >
> > The commit add an interface for set and get the operation modes.
> > the following interfaces added:
> > in_accel_op_mode_available
> > in_op_mode
> >
> > SCA3300 operation modes table:
> > | Mode | Full-scale | low pass filter frequency |
> > | ---- | ---------- | ------------------------- |
> > | 1    | ± 3 g      | 70 Hz                     |
> > | 2    | ± 6 g      | 70 Hz                     |
> > | 3    | ± 1.5 g    | 70 Hz                     |
> > | 4    | ± 1.5 g    | 10 Hz                     |
> >
> > Signed-off-by: LI Qingwu <Qing-wu.Li@xxxxxxxxxxxxxxxxxxxxxxx>
> 
> While it may seem convenient to expose this to userspace, the reality is that
> generic userspace has no way to know how to use it.
> 
> That makes supplying this control a bad idea however convenient it may seem.
> It's not unusual to have these sorts of constraints on devices and so the ABI
> always assumes any setting may modify any other and / or change what is
> available for a given setting.
> 
> If you need a particular combination for your own userspace, then make the
> userspace aware of the constraints rather than exposing it as a 'mode' which
> the userspace will need to know about anyway.
> 
> Jonathan

Thanks a lot Jonathan, I couldn't agree with you more, the mode is not good for userspace,
I would like to ask you how to handle this.
Since the change for 'mode' was a prepare for support SCL3300,
For SCL3300, mode 3 and mode 4 are totally same for both scale and frequency.
The only different is mode 4 is low noise mode, but no difference from software point of view.
Then it's impossible to set to between mode 3/4, let's say normal noise and low noise mode, with index of frequency and scale.
Set between mode 3 and 4 is necessary, I have no idea how to handle it.

| Mode             | Full-scale   | frequency |
| -------------------      | ----------------- | ------------- |
| 1                 | ± 1.2 g     | 40 Hz    |
| 2                 | ± 2.4 g     | 70 Hz    |
| 3                 | ± 0.6 g     | 10 Hz    |
| 4 (Low noise mode)  | ± 0.6 g     | 10 Hz    |   
               
The link of the SCL3300 datasheet:
https://www.murata.com/-/media/webrenewal/products/sensor/pdf/datasheet/datasheet_scl3300-d01.ashx?la=en&cvid=20210316063715000000

> 
> 
> > ---
> >  drivers/iio/accel/sca3300.c | 55
> > +++++++++++++++++++++++++++++++++++++
> >  1 file changed, 55 insertions(+)
> >
> > diff --git a/drivers/iio/accel/sca3300.c b/drivers/iio/accel/sca3300.c
> > index 083ae2a47ad9..e26b3175b3c6 100644
> > --- a/drivers/iio/accel/sca3300.c
> > +++ b/drivers/iio/accel/sca3300.c
> > @@ -42,6 +42,38 @@
> >  /* Device return status and mask */
> >  #define SCA3300_VALUE_RS_ERROR       0x3
> >  #define SCA3300_MASK_RS_STATUS       GENMASK(1, 0)
> > +enum sca3300_op_mode_indexes {
> > +     OP_MOD_1 = 0,
> > +     OP_MOD_2,
> > +     OP_MOD_3,
> > +     OP_MOD_4,
> > +     OP_MOD_CNT
> > +};
> > +
> > +static const char * const sca3300_op_modes[] = {
> > +     [OP_MOD_1] = "1",
> > +     [OP_MOD_2] = "2",
> > +     [OP_MOD_3] = "3",
> > +     [OP_MOD_4] = "4"
> > +};
> > +
> > +static int sca3300_get_op_mode(struct iio_dev *indio_dev,
> > +             const struct iio_chan_spec *chan); static int
> > +sca3300_set_op_mode(struct iio_dev *indio_dev,
> > +             const struct iio_chan_spec *chan, unsigned int mode);
> > +
> > +static const struct iio_enum sca3300_op_mode_enum = {
> > +     .items = sca3300_op_modes,
> > +     .num_items = ARRAY_SIZE(sca3300_op_modes),
> > +     .get = sca3300_get_op_mode,
> > +     .set = sca3300_set_op_mode,
> > +};
> > +
> > +static const struct iio_chan_spec_ext_info sca3300_ext_info[] = {
> > +     IIO_ENUM("op_mode", IIO_SHARED_BY_DIR,
> &sca3300_op_mode_enum),
> > +     IIO_ENUM_AVAILABLE("op_mode", &sca3300_op_mode_enum),
> > +     { }
> > +};
> >
> >  enum sca3300_scan_indexes {
> >       SCA3300_ACC_X = 0,
> > @@ -70,6 +102,7 @@ enum sca3300_scan_indexes {
> >               .storagebits = 16,
> \
> >               .endianness = IIO_CPU,
> \
> >       },
> \
> > +     .ext_info = sca3300_ext_info,
> \
> >  }
> >
> >  #define SCA3300_TEMP_CHANNEL(index, reg)
> {                           \
> > @@ -400,6 +433,28 @@ static int sca3300_read_avail(struct iio_dev
> *indio_dev,
> >       }
> >  }
> >
> > +static int sca3300_get_op_mode(struct iio_dev *indio_dev,
> > +             const struct iio_chan_spec *chan) {
> > +     int mode;
> > +     int ret;
> > +     struct sca3300_data *data = iio_priv(indio_dev);
> > +
> > +     ret = sca3300_read_reg(data, SCA3300_REG_MODE, &mode);
> > +     if (ret)
> > +             return ret;
> > +     return mode;
> > +
> > +}
> > +
> > +static int sca3300_set_op_mode(struct iio_dev *indio_dev,
> > +             const struct iio_chan_spec *chan, unsigned int mode) {
> > +     struct sca3300_data *data = iio_priv(indio_dev);
> > +
> > +     return sca3300_write_reg(data, SCA3300_REG_MODE, mode); }
> > +
> >  static const struct iio_info sca3300_info = {
> >       .read_raw = sca3300_read_raw,
> >       .write_raw = sca3300_write_raw,





[Index of Archives]     [Device Tree Compilter]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux PCI Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Yosemite Backpacking]


  Powered by Linux