Commit cb875560 authored by Gwendal Grignou's avatar Gwendal Grignou Committed by Enric Balletbo i Serra

iio: cros_ec: Report hwfifo_watermark_max

Report the maximum amount of sample the EC can hold.
This is not tunable, but can be useful for application to find out the
maximum amount of time it can sleep when hwfifo_timeout is set to a
large number.
Signed-off-by: default avatarGwendal Grignou <gwendal@chromium.org>
Reviewed-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
Signed-off-by: default avatarEnric Balletbo i Serra <enric.balletbo@collabora.com>
parent 6562793b
...@@ -22,6 +22,12 @@ ...@@ -22,6 +22,12 @@
#include <linux/platform_data/cros_ec_sensorhub.h> #include <linux/platform_data/cros_ec_sensorhub.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
/*
* Hard coded to the first device to support sensor fifo. The EC has a 2048
* byte fifo and will trigger an interrupt when fifo is 2/3 full.
*/
#define CROS_EC_FIFO_SIZE (2048 * 2 / 3)
static char *cros_ec_loc[] = { static char *cros_ec_loc[] = {
[MOTIONSENSE_LOC_BASE] = "base", [MOTIONSENSE_LOC_BASE] = "base",
[MOTIONSENSE_LOC_LID] = "lid", [MOTIONSENSE_LOC_LID] = "lid",
...@@ -55,8 +61,15 @@ static int cros_ec_get_host_cmd_version_mask(struct cros_ec_device *ec_dev, ...@@ -55,8 +61,15 @@ static int cros_ec_get_host_cmd_version_mask(struct cros_ec_device *ec_dev,
static void get_default_min_max_freq(enum motionsensor_type type, static void get_default_min_max_freq(enum motionsensor_type type,
u32 *min_freq, u32 *min_freq,
u32 *max_freq) u32 *max_freq,
u32 *max_fifo_events)
{ {
/*
* We don't know fifo size, set to size previously used by older
* hardware.
*/
*max_fifo_events = CROS_EC_FIFO_SIZE;
switch (type) { switch (type) {
case MOTIONSENSE_TYPE_ACCEL: case MOTIONSENSE_TYPE_ACCEL:
case MOTIONSENSE_TYPE_GYRO: case MOTIONSENSE_TYPE_GYRO:
...@@ -149,8 +162,21 @@ static IIO_DEVICE_ATTR(hwfifo_timeout, 0644, ...@@ -149,8 +162,21 @@ static IIO_DEVICE_ATTR(hwfifo_timeout, 0644,
cros_ec_sensor_get_report_latency, cros_ec_sensor_get_report_latency,
cros_ec_sensor_set_report_latency, 0); cros_ec_sensor_set_report_latency, 0);
static ssize_t hwfifo_watermark_max_show(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);
return sprintf(buf, "%d\n", st->fifo_max_event_count);
}
static IIO_DEVICE_ATTR_RO(hwfifo_watermark_max, 0);
const struct attribute *cros_ec_sensor_fifo_attributes[] = { const struct attribute *cros_ec_sensor_fifo_attributes[] = {
&iio_dev_attr_hwfifo_timeout.dev_attr.attr, &iio_dev_attr_hwfifo_timeout.dev_attr.attr,
&iio_dev_attr_hwfifo_watermark_max.dev_attr.attr,
NULL, NULL,
}; };
EXPORT_SYMBOL_GPL(cros_ec_sensor_fifo_attributes); EXPORT_SYMBOL_GPL(cros_ec_sensor_fifo_attributes);
...@@ -279,12 +305,15 @@ int cros_ec_sensors_core_init(struct platform_device *pdev, ...@@ -279,12 +305,15 @@ int cros_ec_sensors_core_init(struct platform_device *pdev,
if (state->msg->version < 3) { if (state->msg->version < 3) {
get_default_min_max_freq(state->resp->info.type, get_default_min_max_freq(state->resp->info.type,
&state->frequencies[1], &state->frequencies[1],
&state->frequencies[2]); &state->frequencies[2],
&state->fifo_max_event_count);
} else { } else {
state->frequencies[1] = state->frequencies[1] =
state->resp->info_3.min_frequency; state->resp->info_3.min_frequency;
state->frequencies[2] = state->frequencies[2] =
state->resp->info_3.max_frequency; state->resp->info_3.max_frequency;
state->fifo_max_event_count =
state->resp->info_3.fifo_max_event_count;
} }
if (cros_ec_check_features(ec, EC_FEATURE_MOTION_SENSE_FIFO)) { if (cros_ec_check_features(ec, EC_FEATURE_MOTION_SENSE_FIFO)) {
......
...@@ -50,6 +50,7 @@ typedef irqreturn_t (*cros_ec_sensors_capture_t)(int irq, void *p); ...@@ -50,6 +50,7 @@ typedef irqreturn_t (*cros_ec_sensors_capture_t)(int irq, void *p);
* the timestamp. The timestamp is always last and * the timestamp. The timestamp is always last and
* is always 8-byte aligned. * is always 8-byte aligned.
* @read_ec_sensors_data: function used for accessing sensors values * @read_ec_sensors_data: function used for accessing sensors values
* @fifo_max_event_count: Size of the EC sensor FIFO
*/ */
struct cros_ec_sensors_core_state { struct cros_ec_sensors_core_state {
struct cros_ec_device *ec; struct cros_ec_device *ec;
...@@ -72,6 +73,8 @@ struct cros_ec_sensors_core_state { ...@@ -72,6 +73,8 @@ struct cros_ec_sensors_core_state {
int (*read_ec_sensors_data)(struct iio_dev *indio_dev, int (*read_ec_sensors_data)(struct iio_dev *indio_dev,
unsigned long scan_mask, s16 *data); unsigned long scan_mask, s16 *data);
u32 fifo_max_event_count;
/* Table of known available frequencies : 0, Min and Max in mHz */ /* Table of known available frequencies : 0, Min and Max in mHz */
int frequencies[3]; int frequencies[3];
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment