From: Jonathan Cameron <jic23@kernel.org>
To: Gwendal Grignou <gwendal@chromium.org>
Cc: briannorris@chromium.org, knaack.h@gmx.de, lars@metafoo.de,
pmeerw@pmeerw.net, lee.jones@linaro.org, bleung@chromium.org,
enric.balletbo@collabora.com, dianders@chromium.org,
groeck@chromium.org, fabien.lahoudere@collabora.com,
linux-kernel@vger.kernel.org, linux-iio@vger.kernel.org
Subject: Re: [PATCH v4 15/17] iio: cros_ec: Expose hwfifo_timeout
Date: Sun, 10 Nov 2019 13:21:19 +0000 [thread overview]
Message-ID: <20191110132119.5b9bdbca@archlinux> (raw)
In-Reply-To: <20191105222652.70226-16-gwendal@chromium.org>
On Tue, 5 Nov 2019 14:26:50 -0800
Gwendal Grignou <gwendal@chromium.org> wrote:
> Expose EC minimal interrupt period through buffer/hwfifo_timeout:
> - Maximal timeout is limited to 65s.
> - When timeout for all sensors is set to 0, EC will not send events,
> even if the sensor sampling rate is greater than 0.
>
> Rename frequency to sampling_frequency to match IIO ABI.
Would have preferred this as two patches, but not that important as one
is really simple.
>
> Signed-off-by: Gwendal Grignou <gwendal@chromium.org>
One note on something else to tidy up inline (not relevant to this patch)
Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
> ---
> Changes in v4:
> - Check patch with --strict option
> Alignement
> No changes in v3.
> Changes in v2:
> - Register fifo_attributes in sensors drivers that previously advertise
> that feature.
>
> .../common/cros_ec_sensors/cros_ec_sensors.c | 4 +-
> .../cros_ec_sensors/cros_ec_sensors_core.c | 95 ++++++++++++++-----
> drivers/iio/light/cros_ec_light_prox.c | 5 +-
> drivers/iio/pressure/cros_ec_baro.c | 5 +-
> .../linux/iio/common/cros_ec_sensors_core.h | 4 +-
> 5 files changed, 82 insertions(+), 30 deletions(-)
>
> 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 9d0b8ad7a0a5..6f511f9067d9 100644
> --- a/drivers/iio/common/cros_ec_sensors/cros_ec_sensors.c
> +++ b/drivers/iio/common/cros_ec_sensors/cros_ec_sensors.c
> @@ -237,6 +237,8 @@ static int cros_ec_sensors_probe(struct platform_device *pdev)
> if (ret)
> return ret;
>
> + iio_buffer_set_attrs(indio_dev->buffer, cros_ec_sensor_fifo_attributes);
> +
> indio_dev->info = &ec_sensors_info;
> state = iio_priv(indio_dev);
> for (channel = state->channels, i = CROS_EC_SENSOR_X;
> @@ -248,7 +250,6 @@ static int cros_ec_sensors_probe(struct platform_device *pdev)
> BIT(IIO_CHAN_INFO_CALIBSCALE);
> channel->info_mask_shared_by_all =
> BIT(IIO_CHAN_INFO_SCALE) |
> - BIT(IIO_CHAN_INFO_FREQUENCY) |
> BIT(IIO_CHAN_INFO_SAMP_FREQ);
> channel->info_mask_shared_by_all_available =
> BIT(IIO_CHAN_INFO_SAMP_FREQ);
> 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 879b69527cae..62dc1e4aa7a8 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
> @@ -11,6 +11,7 @@
> #include <linux/iio/common/cros_ec_sensors_core.h>
> #include <linux/iio/iio.h>
> #include <linux/iio/kfifo_buf.h>
> +#include <linux/iio/sysfs.h>
> #include <linux/iio/trigger_consumer.h>
> #include <linux/iio/triggered_buffer.h>
> #include <linux/kernel.h>
> @@ -84,6 +85,77 @@ static void get_default_min_max_freq(enum motionsensor_type type,
> }
> }
>
> +static int cros_ec_sensor_set_ec_rate(struct cros_ec_sensors_core_state *st,
> + int rate)
> +{
> + int ret;
> +
> + if (rate > U16_MAX)
> + rate = U16_MAX;
> +
> + mutex_lock(&st->cmd_lock);
> + st->param.cmd = MOTIONSENSE_CMD_EC_RATE;
> + st->param.ec_rate.data = rate;
> + ret = cros_ec_motion_send_host_cmd(st, 0);
> + mutex_unlock(&st->cmd_lock);
> + return ret;
> +}
> +
> +static ssize_t cros_ec_sensor_set_report_latency(struct device *dev,
> + struct device_attribute *attr,
> + const char *buf, size_t len)
> +{
> + struct iio_dev *indio_dev = dev_to_iio_dev(dev);
> + struct cros_ec_sensors_core_state *st = iio_priv(indio_dev);
> + int integer, fract, ret;
> + int latency;
> +
> + ret = iio_str_to_fixpoint(buf, 100000, &integer, &fract);
> + if (ret)
> + return ret;
> +
> + /* EC rate is in ms. */
> + latency = integer * 1000 + fract / 1000;
> + ret = cros_ec_sensor_set_ec_rate(st, latency);
> + if (ret < 0)
> + return ret;
> +
> + return len;
> +}
> +
> +static ssize_t cros_ec_sensor_get_report_latency(struct device *dev,
> + struct device_attribute *attr,
> + char *buf)
> +{
> + struct iio_dev *indio_dev = dev_to_iio_dev(dev);
> + struct cros_ec_sensors_core_state *st = iio_priv(indio_dev);
> + int latency, ret;
> +
> + mutex_lock(&st->cmd_lock);
> + st->param.cmd = MOTIONSENSE_CMD_EC_RATE;
> + st->param.ec_rate.data = EC_MOTION_SENSE_NO_VALUE;
> +
> + ret = cros_ec_motion_send_host_cmd(st, 0);
> + latency = st->resp->ec_rate.ret;
> + mutex_unlock(&st->cmd_lock);
> + if (ret < 0)
> + return ret;
> +
> + return sprintf(buf, "%d.%06u\n",
> + latency / 1000,
> + (latency % 1000) * 1000);
> +}
> +
> +static IIO_DEVICE_ATTR(hwfifo_timeout, 0644,
> + cros_ec_sensor_get_report_latency,
> + cros_ec_sensor_set_report_latency, 0);
> +
> +const struct attribute *cros_ec_sensor_fifo_attributes[] = {
> + &iio_dev_attr_hwfifo_timeout.dev_attr.attr,
> + NULL,
> +};
> +EXPORT_SYMBOL_GPL(cros_ec_sensor_fifo_attributes);
> +
> int cros_ec_sensors_push_data(struct iio_dev *indio_dev,
> s16 *data,
> s64 timestamp)
> @@ -616,18 +688,6 @@ int cros_ec_sensors_core_read(struct cros_ec_sensors_core_state *st,
>
> switch (mask) {
> case IIO_CHAN_INFO_SAMP_FREQ:
> - st->param.cmd = MOTIONSENSE_CMD_EC_RATE;
> - st->param.ec_rate.data =
> - EC_MOTION_SENSE_NO_VALUE;
> -
> - ret = cros_ec_motion_send_host_cmd(st, 0);
> - if (ret)
> - break;
> -
> - *val = st->resp->ec_rate.ret;
> - ret = IIO_VAL_INT;
> - break;
> - case IIO_CHAN_INFO_FREQUENCY:
> st->param.cmd = MOTIONSENSE_CMD_SENSOR_ODR;
> st->param.sensor_odr.data =
> EC_MOTION_SENSE_NO_VALUE;
> @@ -697,7 +757,7 @@ int cros_ec_sensors_core_write(struct cros_ec_sensors_core_state *st,
> int ret;
>
> switch (mask) {
> - case IIO_CHAN_INFO_FREQUENCY:
> + case IIO_CHAN_INFO_SAMP_FREQ:
> st->param.cmd = MOTIONSENSE_CMD_SENSOR_ODR;
> st->param.sensor_odr.data = val;
>
> @@ -706,15 +766,6 @@ int cros_ec_sensors_core_write(struct cros_ec_sensors_core_state *st,
>
> ret = cros_ec_motion_send_host_cmd(st, 0);
> break;
> - case IIO_CHAN_INFO_SAMP_FREQ:
> - st->param.cmd = MOTIONSENSE_CMD_EC_RATE;
> - st->param.ec_rate.data = val;
> -
> - ret = cros_ec_motion_send_host_cmd(st, 0);
> - if (ret)
> - break;
> - st->curr_sampl_freq = val;
> - break;
> default:
> ret = -EINVAL;
> break;
> diff --git a/drivers/iio/light/cros_ec_light_prox.c b/drivers/iio/light/cros_ec_light_prox.c
> index ccdc6d8958c6..863d01994aae 100644
> --- a/drivers/iio/light/cros_ec_light_prox.c
> +++ b/drivers/iio/light/cros_ec_light_prox.c
> @@ -184,6 +184,8 @@ static int cros_ec_light_prox_probe(struct platform_device *pdev)
> if (ret)
> return ret;
>
> + iio_buffer_set_attrs(indio_dev->buffer, cros_ec_sensor_fifo_attributes);
> +
> indio_dev->info = &cros_ec_light_prox_info;
> state = iio_priv(indio_dev);
> state->core.type = state->core.resp->info.type;
> @@ -192,8 +194,7 @@ static int cros_ec_light_prox_probe(struct platform_device *pdev)
>
> /* Common part */
> channel->info_mask_shared_by_all =
> - BIT(IIO_CHAN_INFO_SAMP_FREQ) |
> - BIT(IIO_CHAN_INFO_FREQUENCY);
> + BIT(IIO_CHAN_INFO_SAMP_FREQ);
> channel->info_mask_shared_by_all_available =
> BIT(IIO_CHAN_INFO_SAMP_FREQ);
> channel->scan_type.realbits = CROS_EC_SENSOR_BITS;
> diff --git a/drivers/iio/pressure/cros_ec_baro.c b/drivers/iio/pressure/cros_ec_baro.c
> index e1c86b22676c..0dee943f955e 100644
> --- a/drivers/iio/pressure/cros_ec_baro.c
> +++ b/drivers/iio/pressure/cros_ec_baro.c
> @@ -140,6 +140,8 @@ static int cros_ec_baro_probe(struct platform_device *pdev)
> if (ret)
> return ret;
>
> + iio_buffer_set_attrs(indio_dev->buffer, cros_ec_sensor_fifo_attributes);
> +
> indio_dev->info = &cros_ec_baro_info;
> state = iio_priv(indio_dev);
> state->core.type = state->core.resp->info.type;
> @@ -149,8 +151,7 @@ static int cros_ec_baro_probe(struct platform_device *pdev)
> channel->info_mask_separate = BIT(IIO_CHAN_INFO_RAW);
> channel->info_mask_shared_by_all =
> BIT(IIO_CHAN_INFO_SCALE) |
> - BIT(IIO_CHAN_INFO_SAMP_FREQ) |
> - BIT(IIO_CHAN_INFO_FREQUENCY);
> + BIT(IIO_CHAN_INFO_SAMP_FREQ);
> channel->scan_type.realbits = CROS_EC_SENSOR_BITS;
> channel->scan_type.storagebits = CROS_EC_SENSOR_BITS;
> channel->scan_type.shift = 0;
> diff --git a/include/linux/iio/common/cros_ec_sensors_core.h b/include/linux/iio/common/cros_ec_sensors_core.h
> index 96ea4551945e..5b0acc14c891 100644
> --- a/include/linux/iio/common/cros_ec_sensors_core.h
> +++ b/include/linux/iio/common/cros_ec_sensors_core.h
> @@ -50,7 +50,6 @@ typedef irqreturn_t (*cros_ec_sensors_capture_t)(int irq, void *p);
> * the timestamp. The timestamp is always last and
> * is always 8-byte aligned.
> * @read_ec_sensors_data: function used for accessing sensors values
> - * @cuur_sampl_freq: current sampling period
Side note. Seems that 'frequencies' is not documented...
> */
> struct cros_ec_sensors_core_state {
> struct cros_ec_device *ec;
> @@ -73,8 +72,6 @@ struct cros_ec_sensors_core_state {
> int (*read_ec_sensors_data)(struct iio_dev *indio_dev,
> unsigned long scan_mask, s16 *data);
>
> - int curr_sampl_freq;
> -
> /* Table of known available frequencies : 0, Min and Max in mHz */
> int frequencies[3];
> };
> @@ -116,5 +113,6 @@ int cros_ec_sensors_core_write(struct cros_ec_sensors_core_state *st,
>
> /* List of extended channel specification for all sensors */
> extern const struct iio_chan_spec_ext_info cros_ec_sensors_ext_info[];
> +extern const struct attribute *cros_ec_sensor_fifo_attributes[];
>
> #endif /* __CROS_EC_SENSORS_CORE_H */
next prev parent reply other threads:[~2019-11-10 13:21 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-11-05 22:26 [PATCH v4 00/17] cros_ec: Add sensorhub driver and FIFO processing Gwendal Grignou
2019-11-05 22:26 ` [PATCH v4 01/17] mfd: cros_ec: Add sensor_count and make check_features public Gwendal Grignou
2019-11-08 22:03 ` Enric Balletbo Serra
2019-11-11 11:44 ` Lee Jones
2019-11-16 11:49 ` Jonathan Cameron
2019-11-05 22:26 ` [PATCH v4 02/17] platform: cros_ec: Add cros_ec_sensor_hub driver Gwendal Grignou
2019-11-10 12:10 ` Jonathan Cameron
2019-11-11 9:24 ` Enric Balletbo i Serra
2019-11-11 11:55 ` Jonathan Cameron
2019-11-05 22:26 ` [PATCH v4 03/17] platform/mfd:iio: cros_ec: Register sensor through sensorhub Gwendal Grignou
2019-11-10 12:13 ` Jonathan Cameron
2019-11-11 9:25 ` Enric Balletbo i Serra
2019-11-11 11:43 ` Lee Jones
2019-11-05 22:26 ` [PATCH v4 04/17] platform: chrome: cros-ec: record event timestamp in the hard irq Gwendal Grignou
2019-11-10 12:16 ` Jonathan Cameron
2019-11-11 9:27 ` Enric Balletbo i Serra
2019-11-05 22:26 ` [PATCH v4 05/17] platform: chrome: cros_ec: Do not attempt to register a non-positive IRQ number Gwendal Grignou
2019-11-10 12:17 ` Jonathan Cameron
2019-11-11 9:29 ` Enric Balletbo i Serra
2019-11-14 0:58 ` Gwendal Grignou
2019-11-05 22:26 ` [PATCH v4 06/17] platform: chrome: cros_ec: handle MKBP more events flag Gwendal Grignou
2019-11-10 12:28 ` Jonathan Cameron
2019-11-11 9:30 ` Enric Balletbo i Serra
2019-11-05 22:26 ` [PATCH v4 07/17] Revert "Input: cros_ec_keyb - add back missing mask for event_type" Gwendal Grignou
2019-11-11 9:20 ` Enric Balletbo i Serra
2019-11-11 19:23 ` Dmitry Torokhov
2019-11-05 22:26 ` [PATCH v4 08/17] Revert "Input: cros_ec_keyb: mask out extra flags in event_type" Gwendal Grignou
2019-11-11 9:20 ` Enric Balletbo i Serra
2019-11-11 19:23 ` Dmitry Torokhov
2019-11-05 22:26 ` [PATCH v4 09/17] platform: chrome: sensorhub: Add FIFO support Gwendal Grignou
2019-11-06 21:13 ` Gwendal Grignou
2019-11-10 12:54 ` Jonathan Cameron
2019-11-14 1:01 ` Gwendal Grignou
2019-11-05 22:26 ` [PATCH v4 10/17] platform: chrome: sensorhub: Add code to spread timestmap Gwendal Grignou
2019-11-10 12:57 ` Jonathan Cameron
2019-11-05 22:26 ` [PATCH v4 11/17] platform: chrome: sensorhub: Add median filter Gwendal Grignou
2019-11-10 13:07 ` Jonathan Cameron
2019-11-05 22:26 ` [PATCH v4 12/17] iio: cros_ec: Move function description to .c file Gwendal Grignou
2019-11-10 13:08 ` Jonathan Cameron
2019-11-11 9:35 ` Enric Balletbo i Serra
2019-11-05 22:26 ` [PATCH v4 13/17] iio: cros_ec: Register to cros_ec_sensorhub when EC supports FIFO Gwendal Grignou
2019-11-10 13:17 ` Jonathan Cameron
2019-11-14 18:17 ` Gwendal Grignou
2019-11-05 22:26 ` [PATCH v4 14/17] iio: cros_ec: Remove pm function Gwendal Grignou
2019-11-10 13:18 ` Jonathan Cameron
2019-11-11 9:37 ` Enric Balletbo i Serra
2019-11-05 22:26 ` [PATCH v4 15/17] iio: cros_ec: Expose hwfifo_timeout Gwendal Grignou
2019-11-10 13:21 ` Jonathan Cameron [this message]
2019-11-05 22:26 ` [PATCH v4 16/17] iio: cros_ec: Report hwfifo_watermark_max Gwendal Grignou
2019-11-10 13:22 ` Jonathan Cameron
2019-11-05 22:26 ` [PATCH v4 17/17] iio: cros_ec: Use Hertz as unit for sampling frequency Gwendal Grignou
2019-11-10 13:24 ` Jonathan Cameron
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191110132119.5b9bdbca@archlinux \
--to=jic23@kernel.org \
--cc=bleung@chromium.org \
--cc=briannorris@chromium.org \
--cc=dianders@chromium.org \
--cc=enric.balletbo@collabora.com \
--cc=fabien.lahoudere@collabora.com \
--cc=groeck@chromium.org \
--cc=gwendal@chromium.org \
--cc=knaack.h@gmx.de \
--cc=lars@metafoo.de \
--cc=lee.jones@linaro.org \
--cc=linux-iio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=pmeerw@pmeerw.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).