2021-09-28 16:22:19

by Andriy Tryshnivskyy

[permalink] [raw]
Subject: [PATCH v3 0/1] iio/scmi: Add reading "raw" attribute.

This patch implements reading "raw" attribute.

The patch is based on v5.14.

Comparing to the previous version it has:
* adaptation for changes in structure scmi_iio_priv (no member named 'handle')

Any comments are very welcome.

Thanks,
Andriy.

Andriy Tryshnivskyy (1):
iio/scmi: Add reading "raw" attribute.

drivers/iio/common/scmi_sensors/scmi_iio.c | 45 +++++++++++++++++++++-
1 file changed, 44 insertions(+), 1 deletion(-)


base-commit: 7d2a07b769330c34b4deabeed939325c77a7ec2f
--
2.17.1


2021-09-30 21:51:17

by Jonathan Cameron

[permalink] [raw]
Subject: Re: [PATCH v3 0/1] iio/scmi: Add reading "raw" attribute.

On Tue, 28 Sep 2021 19:19:56 +0300
Andriy Tryshnivskyy <[email protected]> wrote:

> This patch implements reading "raw" attribute.
>
> The patch is based on v5.14.
>
> Comparing to the previous version it has:
> * adaptation for changes in structure scmi_iio_priv (no member named 'handle')
>
Ah.. If you have a case like this where you send out a new version because you've
found an issue yourself, please also reply to the earlier version to say what the
problem was. That way no one reviews the wrong version :)

Thanks,

Jonathan

> Any comments are very welcome.
>
> Thanks,
> Andriy.
>
> Andriy Tryshnivskyy (1):
> iio/scmi: Add reading "raw" attribute.
>
> drivers/iio/common/scmi_sensors/scmi_iio.c | 45 +++++++++++++++++++++-
> 1 file changed, 44 insertions(+), 1 deletion(-)
>
>
> base-commit: 7d2a07b769330c34b4deabeed939325c77a7ec2f

2021-10-04 23:59:55

by Jyoti Bhayana

[permalink] [raw]
Subject: Re: [PATCH v3 0/1] iio/scmi: Add reading "raw" attribute.

Hi Andriy,

Please find my feedback below:

> @@ -286,6 +286,9 @@ static int scmi_iio_read_raw(struct iio_dev *iio_dev,
> struct scmi_iio_priv *sensor = iio_priv(iio_dev);
> s8 scale;
> int ret;
> + int err;


Why do we have two variables with a similar purpose of saving the
return value? Can't ret be used in this case instead of adding a new
one?


In the code below, why is the logic of enabling and disabling the
sensor in this function? Generally the function to read the sensor
value is just used for the code to read the sensor values ? and not
enable/disable the sensor

> case IIO_CHAN_INFO_RAW:
> + sensor_config = FIELD_PREP(SCMI_SENS_CFG_SENSOR_ENABLED_MASK,
> + SCMI_SENS_CFG_SENSOR_ENABLE);
> + err = sensor->sensor_ops->config_set(
> + sensor->ph, sensor->sensor_info->id, sensor_config);
> + if (err) {
> + dev_err(&iio_dev->dev,
> + "Error in enabling sensor %s err %d",
> + sensor->sensor_info->name, err);
> + return err;
> + }
> +
> + err = sensor->sensor_ops->reading_get_timestamped(
> + sensor->ph, sensor->sensor_info->id,
> + sensor->sensor_info->num_axis, readings);
> + if (err) {
> + dev_err(&iio_dev->dev,
> + "Error in reading raw attribute for sensor %s err %d",
> + sensor->sensor_info->name, err);
> + return err;
> + }
> +
> + sensor_config = FIELD_PREP(SCMI_SENS_CFG_SENSOR_ENABLED_MASK,
> + SCMI_SENS_CFG_SENSOR_DISABLE);
> + err = sensor->sensor_ops->config_set(
> + sensor->ph, sensor->sensor_info->id, sensor_config);
> + if (err) {
> + dev_err(&iio_dev->dev,
> + "Error in enabling sensor %s err %d",
> + sensor->sensor_info->name, err);
> + return err;
> + }
> + /* Check if raw value fits 32 bits */
> + if (readings[ch->scan_index].value < INT_MIN ||
> + readings[ch->scan_index].value > INT_MAX)
> + return -ERANGE;
> + /* Use 32-bit value, since practically there is no need in 64 bits */
> + *val = (int)readings[ch->scan_index].value;
>
> + return IIO_VAL_INT;


On Thu, Sep 30, 2021 at 9:36 AM Jonathan Cameron <[email protected]> wrote:
>
> On Tue, 28 Sep 2021 19:19:56 +0300
> Andriy Tryshnivskyy <[email protected]> wrote:
>
> > This patch implements reading "raw" attribute.
> >
> > The patch is based on v5.14.
> >
> > Comparing to the previous version it has:
> > * adaptation for changes in structure scmi_iio_priv (no member named 'handle')
> >
> Ah.. If you have a case like this where you send out a new version because you've
> found an issue yourself, please also reply to the earlier version to say what the
> problem was. That way no one reviews the wrong version :)
>
> Thanks,
>
> Jonathan
>
> > Any comments are very welcome.
> >
> > Thanks,
> > Andriy.
> >
> > Andriy Tryshnivskyy (1):
> > iio/scmi: Add reading "raw" attribute.
> >
> > drivers/iio/common/scmi_sensors/scmi_iio.c | 45 +++++++++++++++++++++-
> > 1 file changed, 44 insertions(+), 1 deletion(-)
> >
> >
> > base-commit: 7d2a07b769330c34b4deabeed939325c77a7ec2f
>

2021-10-05 12:54:24

by Vasyl Vavrychuk

[permalink] [raw]
Subject: Re: [PATCH v3 0/1] iio/scmi: Add reading "raw" attribute.

Hi, Jyoti,

> In the code below, why is the logic of enabling and disabling the
> sensor in this function? Generally the function to read the sensor
> value is just used for the code to read the sensor values ? and not
> enable/disable the sensor

But to read sensor value we have to enable it first. Other way to enable
sensor we found is, for example:

echo 1 > /sys/bus/iio/devices/.../scan_elements/in_anglvel_x_en

But, this command is related to IIO buffers use.

Other sensors drivers enable/disable sensor in read raw too, for
example, drivers/iio/accel/kxcjk-1013.c has:

case IIO_CHAN_INFO_RAW:
mutex_lock(&data->mutex);
if (iio_buffer_enabled(indio_dev))
ret = -EBUSY;
else {
ret = kxcjk1013_set_power_state(data, true);
... reading ...
ret = kxcjk1013_set_power_state(data, false);
}
mutex_unlock(&data->mutex);

But, after looking on this code I have some questions:

1. Should we block reading raw attribute and IIO buffer enabled, for for
SCMI sensor it can coexist?
2. Should we wrap reading raw attribute implementation in iio_dev->mlock
mutex?

>> case IIO_CHAN_INFO_RAW:
>> + sensor_config = FIELD_PREP(SCMI_SENS_CFG_SENSOR_ENABLED_MASK,
>> + SCMI_SENS_CFG_SENSOR_ENABLE);
>> + err = sensor->sensor_ops->config_set(
>> + sensor->ph, sensor->sensor_info->id, sensor_config);
>> + if (err) {
>> + dev_err(&iio_dev->dev,
>> + "Error in enabling sensor %s err %d",
>> + sensor->sensor_info->name, err);
>> + return err;
>> + }
>> +
>> + err = sensor->sensor_ops->reading_get_timestamped(
>> + sensor->ph, sensor->sensor_info->id,
>> + sensor->sensor_info->num_axis, readings);
>> + if (err) {
>> + dev_err(&iio_dev->dev,
>> + "Error in reading raw attribute for sensor %s err %d",
>> + sensor->sensor_info->name, err);
>> + return err;
>> + }
>> +
>> + sensor_config = FIELD_PREP(SCMI_SENS_CFG_SENSOR_ENABLED_MASK,
>> + SCMI_SENS_CFG_SENSOR_DISABLE);
>> + err = sensor->sensor_ops->config_set(
>> + sensor->ph, sensor->sensor_info->id, sensor_config);
>> + if (err) {
>> + dev_err(&iio_dev->dev,
>> + "Error in enabling sensor %s err %d",
>> + sensor->sensor_info->name, err);
>> + return err;
>> + }
>> + /* Check if raw value fits 32 bits */
>> + if (readings[ch->scan_index].value < INT_MIN ||
>> + readings[ch->scan_index].value > INT_MAX)
>> + return -ERANGE;
>> + /* Use 32-bit value, since practically there is no need in 64 bits */
>> + *val = (int)readings[ch->scan_index].value;
>>
>> + return IIO_VAL_INT;

2021-10-06 00:17:47

by Jyoti Bhayana

[permalink] [raw]
Subject: Re: [PATCH v3 0/1] iio/scmi: Add reading "raw" attribute.

Hi Vasyl,

Regarding below question, yes reading raw attribute should be blocked
if buffer is enabled for that sensor.

> 1. Should we block reading raw attribute and IIO buffer enabled, for for
> SCMI sensor it can coexist?


PLease see https://elixir.bootlin.com/linux/latest/source/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c#L667
as well. It has

case IIO_CHAN_INFO_RAW:
ret = iio_device_claim_direct_mode(indio_dev);
if (ret)
return ret;
mutex_lock(&st->lock);
ret = inv_mpu6050_read_channel_data(indio_dev, chan, val);
mutex_unlock(&st->lock);
iio_device_release_direct_mode(indio_dev);
return ret;

Regarding the question below, the answer is yes.

> 2. Should we wrap reading raw attribute implementation in iio_dev->mlock
> mutex?


Thanks, Jyoti





On Tue, Oct 5, 2021 at 5:52 AM Vasyl Vavrychuk
<[email protected]> wrote:
>
> Hi, Jyoti,
>
> > In the code below, why is the logic of enabling and disabling the
> > sensor in this function? Generally the function to read the sensor
> > value is just used for the code to read the sensor values ? and not
> > enable/disable the sensor
>
> But to read sensor value we have to enable it first. Other way to enable
> sensor we found is, for example:
>
> echo 1 > /sys/bus/iio/devices/.../scan_elements/in_anglvel_x_en
>
> But, this command is related to IIO buffers use.
>
> Other sensors drivers enable/disable sensor in read raw too, for
> example, drivers/iio/accel/kxcjk-1013.c has:
>
> case IIO_CHAN_INFO_RAW:
> mutex_lock(&data->mutex);
> if (iio_buffer_enabled(indio_dev))
> ret = -EBUSY;
> else {
> ret = kxcjk1013_set_power_state(data, true);
> ... reading ...
> ret = kxcjk1013_set_power_state(data, false);
> }
> mutex_unlock(&data->mutex);
>
> But, after looking on this code I have some questions:
>
> 1. Should we block reading raw attribute and IIO buffer enabled, for for
> SCMI sensor it can coexist?
> 2. Should we wrap reading raw attribute implementation in iio_dev->mlock
> mutex?
>
> >> case IIO_CHAN_INFO_RAW:
> >> + sensor_config = FIELD_PREP(SCMI_SENS_CFG_SENSOR_ENABLED_MASK,
> >> + SCMI_SENS_CFG_SENSOR_ENABLE);
> >> + err = sensor->sensor_ops->config_set(
> >> + sensor->ph, sensor->sensor_info->id, sensor_config);
> >> + if (err) {
> >> + dev_err(&iio_dev->dev,
> >> + "Error in enabling sensor %s err %d",
> >> + sensor->sensor_info->name, err);
> >> + return err;
> >> + }
> >> +
> >> + err = sensor->sensor_ops->reading_get_timestamped(
> >> + sensor->ph, sensor->sensor_info->id,
> >> + sensor->sensor_info->num_axis, readings);
> >> + if (err) {
> >> + dev_err(&iio_dev->dev,
> >> + "Error in reading raw attribute for sensor %s err %d",
> >> + sensor->sensor_info->name, err);
> >> + return err;
> >> + }
> >> +
> >> + sensor_config = FIELD_PREP(SCMI_SENS_CFG_SENSOR_ENABLED_MASK,
> >> + SCMI_SENS_CFG_SENSOR_DISABLE);
> >> + err = sensor->sensor_ops->config_set(
> >> + sensor->ph, sensor->sensor_info->id, sensor_config);
> >> + if (err) {
> >> + dev_err(&iio_dev->dev,
> >> + "Error in enabling sensor %s err %d",
> >> + sensor->sensor_info->name, err);
> >> + return err;
> >> + }
> >> + /* Check if raw value fits 32 bits */
> >> + if (readings[ch->scan_index].value < INT_MIN ||
> >> + readings[ch->scan_index].value > INT_MAX)
> >> + return -ERANGE;
> >> + /* Use 32-bit value, since practically there is no need in 64 bits */
> >> + *val = (int)readings[ch->scan_index].value;
> >>
> >> + return IIO_VAL_INT;

2021-10-08 11:36:21

by Andriy Tryshnivskyy

[permalink] [raw]
Subject: Re: [PATCH v3 0/1] iio/scmi: Add reading "raw" attribute.

Hi Jyoti and Vasyl,

Thanks for your review.
I will provide new patch version soon.

Thanks,
Andriy

On 06.10.21 03:16, Jyoti Bhayana wrote:

> CAUTION: This email originated from outside of the organization.
> Do not click links or open attachments unless you recognize the sender and know the content is safe.
>
>
> Hi Vasyl,
>
> Regarding below question, yes reading raw attribute should be blocked
> if buffer is enabled for that sensor.
>
>> 1. Should we block reading raw attribute and IIO buffer enabled, for for
>> SCMI sensor it can coexist?
>
> PLease see https://elixir.bootlin.com/linux/latest/source/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c#L667
> as well. It has
>
> case IIO_CHAN_INFO_RAW:
> ret = iio_device_claim_direct_mode(indio_dev);
> if (ret)
> return ret;
> mutex_lock(&st->lock);
> ret = inv_mpu6050_read_channel_data(indio_dev, chan, val);
> mutex_unlock(&st->lock);
> iio_device_release_direct_mode(indio_dev);
> return ret;
>
> Regarding the question below, the answer is yes.
>
>> 2. Should we wrap reading raw attribute implementation in iio_dev->mlock
>> mutex?
>
> Thanks, Jyoti
>
>
>
>
>
> On Tue, Oct 5, 2021 at 5:52 AM Vasyl Vavrychuk
> <[email protected]> wrote:
>> Hi, Jyoti,
>>
>>> In the code below, why is the logic of enabling and disabling the
>>> sensor in this function? Generally the function to read the sensor
>>> value is just used for the code to read the sensor values ? and not
>>> enable/disable the sensor
>> But to read sensor value we have to enable it first. Other way to enable
>> sensor we found is, for example:
>>
>> echo 1 > /sys/bus/iio/devices/.../scan_elements/in_anglvel_x_en
>>
>> But, this command is related to IIO buffers use.
>>
>> Other sensors drivers enable/disable sensor in read raw too, for
>> example, drivers/iio/accel/kxcjk-1013.c has:
>>
>> case IIO_CHAN_INFO_RAW:
>> mutex_lock(&data->mutex);
>> if (iio_buffer_enabled(indio_dev))
>> ret = -EBUSY;
>> else {
>> ret = kxcjk1013_set_power_state(data, true);
>> ... reading ...
>> ret = kxcjk1013_set_power_state(data, false);
>> }
>> mutex_unlock(&data->mutex);
>>
>> But, after looking on this code I have some questions:
>>
>> 1. Should we block reading raw attribute and IIO buffer enabled, for for
>> SCMI sensor it can coexist?
>> 2. Should we wrap reading raw attribute implementation in iio_dev->mlock
>> mutex?
>>
>>>> case IIO_CHAN_INFO_RAW:
>>>> + sensor_config = FIELD_PREP(SCMI_SENS_CFG_SENSOR_ENABLED_MASK,
>>>> + SCMI_SENS_CFG_SENSOR_ENABLE);
>>>> + err = sensor->sensor_ops->config_set(
>>>> + sensor->ph, sensor->sensor_info->id, sensor_config);
>>>> + if (err) {
>>>> + dev_err(&iio_dev->dev,
>>>> + "Error in enabling sensor %s err %d",
>>>> + sensor->sensor_info->name, err);
>>>> + return err;
>>>> + }
>>>> +
>>>> + err = sensor->sensor_ops->reading_get_timestamped(
>>>> + sensor->ph, sensor->sensor_info->id,
>>>> + sensor->sensor_info->num_axis, readings);
>>>> + if (err) {
>>>> + dev_err(&iio_dev->dev,
>>>> + "Error in reading raw attribute for sensor %s err %d",
>>>> + sensor->sensor_info->name, err);
>>>> + return err;
>>>> + }
>>>> +
>>>> + sensor_config = FIELD_PREP(SCMI_SENS_CFG_SENSOR_ENABLED_MASK,
>>>> + SCMI_SENS_CFG_SENSOR_DISABLE);
>>>> + err = sensor->sensor_ops->config_set(
>>>> + sensor->ph, sensor->sensor_info->id, sensor_config);
>>>> + if (err) {
>>>> + dev_err(&iio_dev->dev,
>>>> + "Error in enabling sensor %s err %d",
>>>> + sensor->sensor_info->name, err);
>>>> + return err;
>>>> + }
>>>> + /* Check if raw value fits 32 bits */
>>>> + if (readings[ch->scan_index].value < INT_MIN ||
>>>> + readings[ch->scan_index].value > INT_MAX)
>>>> + return -ERANGE;
>>>> + /* Use 32-bit value, since practically there is no need in 64 bits */
>>>> + *val = (int)readings[ch->scan_index].value;
>>>>
>>>> + return IIO_VAL_INT;