lkml.org 
[lkml]   [2020]   [Mar]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v6 10/11] iio: cros_ec: Use Hertz as unit for sampling frequency
    Date
    To be compliant with other sensors, set and get sensor sampling
    frequency in Hz, not mHz.

    Fixes: ae7b02ad2f32 ("iio: common: cros_ec_sensors: Expose
    cros_ec_sensors frequency range via iio sysfs")

    Acked-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
    Signed-off-by: Gwendal Grignou <gwendal@chromium.org>
    ---
    Changes in v6:
    - No changes.
    Changes in v5:
    Added ack.
    Changes in v4:
    - Check patch with --strict option
    Alignement
    No changes in v3.
    No changes in v2.

    .../cros_ec_sensors/cros_ec_sensors_core.c | 32 +++++++++++--------
    .../linux/iio/common/cros_ec_sensors_core.h | 6 ++--
    2 files changed, 22 insertions(+), 16 deletions(-)

    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 67e8eff038cf5..c831915ca7e56 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
    @@ -253,6 +253,7 @@ int cros_ec_sensors_core_init(struct platform_device *pdev,
    struct cros_ec_dev *ec = sensor_hub->ec;
    struct cros_ec_sensor_platform *sensor_platform = dev_get_platdata(dev);
    u32 ver_mask;
    + int frequencies[ARRAY_SIZE(state->frequencies) / 2] = { 0 };
    int ret, i;

    platform_set_drvdata(pdev, indio_dev);
    @@ -301,20 +302,22 @@ int cros_ec_sensors_core_init(struct platform_device *pdev,
    state->calib[i].scale = MOTION_SENSE_DEFAULT_SCALE;

    /* 0 is a correct value used to stop the device */
    - state->frequencies[0] = 0;
    if (state->msg->version < 3) {
    get_default_min_max_freq(state->resp->info.type,
    - &state->frequencies[1],
    - &state->frequencies[2],
    + &frequencies[1],
    + &frequencies[2],
    &state->fifo_max_event_count);
    } else {
    - state->frequencies[1] =
    - state->resp->info_3.min_frequency;
    - state->frequencies[2] =
    - state->resp->info_3.max_frequency;
    + frequencies[1] = state->resp->info_3.min_frequency;
    + frequencies[2] = state->resp->info_3.max_frequency;
    state->fifo_max_event_count =
    state->resp->info_3.fifo_max_event_count;
    }
    + for (i = 0; i < ARRAY_SIZE(frequencies); i++) {
    + state->frequencies[2 * i] = frequencies[i] / 1000;
    + state->frequencies[2 * i + 1] =
    + (frequencies[i] % 1000) * 1000;
    + }

    if (cros_ec_check_features(ec, EC_FEATURE_MOTION_SENSE_FIFO)) {
    /*
    @@ -728,7 +731,7 @@ int cros_ec_sensors_core_read(struct cros_ec_sensors_core_state *st,
    struct iio_chan_spec const *chan,
    int *val, int *val2, long mask)
    {
    - int ret;
    + int ret, frequency;

    switch (mask) {
    case IIO_CHAN_INFO_SAMP_FREQ:
    @@ -740,8 +743,10 @@ int cros_ec_sensors_core_read(struct cros_ec_sensors_core_state *st,
    if (ret)
    break;

    - *val = st->resp->sensor_odr.ret;
    - ret = IIO_VAL_INT;
    + frequency = st->resp->sensor_odr.ret;
    + *val = frequency / 1000;
    + *val2 = (frequency % 1000) * 1000;
    + ret = IIO_VAL_INT_PLUS_MICRO;
    break;
    default:
    ret = -EINVAL;
    @@ -776,7 +781,7 @@ int cros_ec_sensors_core_read_avail(struct iio_dev *indio_dev,
    case IIO_CHAN_INFO_SAMP_FREQ:
    *length = ARRAY_SIZE(state->frequencies);
    *vals = (const int *)&state->frequencies;
    - *type = IIO_VAL_INT;
    + *type = IIO_VAL_INT_PLUS_MICRO;
    return IIO_AVAIL_LIST;
    }

    @@ -798,12 +803,13 @@ int cros_ec_sensors_core_write(struct cros_ec_sensors_core_state *st,
    struct iio_chan_spec const *chan,
    int val, int val2, long mask)
    {
    - int ret;
    + int ret, frequency;

    switch (mask) {
    case IIO_CHAN_INFO_SAMP_FREQ:
    + frequency = val * 1000 + val2 / 1000;
    st->param.cmd = MOTIONSENSE_CMD_SENSOR_ODR;
    - st->param.sensor_odr.data = val;
    + st->param.sensor_odr.data = frequency;

    /* Always roundup, so caller gets at least what it asks for. */
    st->param.sensor_odr.roundup = 1;
    diff --git a/include/linux/iio/common/cros_ec_sensors_core.h b/include/linux/iio/common/cros_ec_sensors_core.h
    index bc26ae2e32729..7bc961defa87e 100644
    --- a/include/linux/iio/common/cros_ec_sensors_core.h
    +++ b/include/linux/iio/common/cros_ec_sensors_core.h
    @@ -51,6 +51,8 @@ typedef irqreturn_t (*cros_ec_sensors_capture_t)(int irq, void *p);
    * is always 8-byte aligned.
    * @read_ec_sensors_data: function used for accessing sensors values
    * @fifo_max_event_count: Size of the EC sensor FIFO
    + * @frequencies: Table of known available frequencies:
    + * 0, Min and Max in mHz
    */
    struct cros_ec_sensors_core_state {
    struct cros_ec_device *ec;
    @@ -74,9 +76,7 @@ struct cros_ec_sensors_core_state {
    unsigned long scan_mask, s16 *data);

    u32 fifo_max_event_count;
    -
    - /* Table of known available frequencies : 0, Min and Max in mHz */
    - int frequencies[3];
    + int frequencies[6];
    };

    int cros_ec_sensors_read_lpc(struct iio_dev *indio_dev, unsigned long scan_mask,
    --
    2.25.1.696.g5e7596f4ac-goog
    \
     
     \ /
      Last update: 2020-03-24 21:29    [W:2.859 / U:0.000 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site