Received: by 2002:a25:8b12:0:0:0:0:0 with SMTP id i18csp2165957ybl; Thu, 29 Aug 2019 04:36:34 -0700 (PDT) X-Google-Smtp-Source: APXvYqydyTkt6J7nU07d0lI7PlDyqdYLoSGuGgKqISHpCj5ge/e9lujwjuq2vqWa5qQqYy6LYNWq X-Received: by 2002:a65:5202:: with SMTP id o2mr7505947pgp.29.1567078594005; Thu, 29 Aug 2019 04:36:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1567078594; cv=none; d=google.com; s=arc-20160816; b=rhSSfEdjI0b42sMo+lo/T/jfQLIZcIENVDJD8Y5PHVrXulSjTFREyLmjGwQWZT4rye fsmEm7JtNS9iPsMCwXZ4YmT5sBjx9Ml7Vj4B9XqhL4qUIV0WpFGF+/qML6EaCxHl79mK GdyOcavGYa1KrzLaLCkoT/pl6z4dvFp6gh/Pc2UdoSGaj81Wsl0yquBxlYqVS31vxICr MvpaHEchk61P1v5C5IBRsLsIlx/QvpXBw42A45aL6RemWlEyNfTBU0d1B20FIMJhqqrD dTI71LzcO2FasPQVjeqkQirOv6ErU42Ur88LQLPozUbYsff6FiqG8a9zUfzSSxp5l3Q2 7t3g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:dkim-signature; bh=Dyi2ne7Lfc8KHf9mzyhBZNz7d44JXzDPDLL3CQKNFvk=; b=rMngMJL1KWaPiJ6j+m5DFoA6rMeP2oQPfSLEOrcJ+uA/UMyBk9fjish/0trMlKCPL3 He0COjxg2SRYzy4S030wKA1cnq47tXoRq/umGwOU5lOLkLFWsiOloUbR5b0tEfrUwvdB uliIRhbGUJ4rblyct/ov97XwsSFHhGoGYjkS6X02I6wrrE9WR7BNvEYJDj5GcKY1oDjc feWisuad2zFNsEAYA7MChUl72MhNSarJNaS7Y9feGlp9W6GKwRRcVy/J+rT+ODr2uihw vZUxHyrIns+/XNiMR1Bs2NMkGHAEz1VwGh3pi27tWNJs+kR80nLsnFpoy5mqvb94wCVX tvLQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=RZVR5v7r; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 11si2312804pfj.239.2019.08.29.04.36.17; Thu, 29 Aug 2019 04:36:33 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=RZVR5v7r; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727359AbfH2LfY (ORCPT + 99 others); Thu, 29 Aug 2019 07:35:24 -0400 Received: from mail-pf1-f193.google.com ([209.85.210.193]:43491 "EHLO mail-pf1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727073AbfH2LfX (ORCPT ); Thu, 29 Aug 2019 07:35:23 -0400 Received: by mail-pf1-f193.google.com with SMTP id v12so1849608pfn.10; Thu, 29 Aug 2019 04:35:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=Dyi2ne7Lfc8KHf9mzyhBZNz7d44JXzDPDLL3CQKNFvk=; b=RZVR5v7rSOkQsa7yFexYQdGqGnZTHlZSXxP0kHcCzD2PJNySt541hd+FguyU6itMKN ++EHacmVU78YyjfgXfkWRGJkuFNMAV0sotAgxfZ4CKMjPV9vEpyE48Vq1Qd1xQxLps9J oMsDT8d2GdwmNm1HmvWLfFA4WMNmkb126q92ZdP5Fa4HOhNQYZRHcIMPtynl8t4fkBW8 wokO1rOD5BQPa+0hA+6rktpa9OfQ7CD8Nfrox1ThMOYFKktBb24r4jRTaPmdEEZ+Kawg g3C2I0hlqRTPzKrbZPjoC0fb3mL7rKg6iUFMZuZQ9Mu5eBJkPoGYaJgQrfwsHJ657yvh 6qAg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=Dyi2ne7Lfc8KHf9mzyhBZNz7d44JXzDPDLL3CQKNFvk=; b=lmuUfM8d6h4a/A0w5XYJnuHXePZnV8VG5amDb0qJwlL3KKz7o4HknENhSsaZvong4F XD7fTuNRqfEsNhizxYqmHaX925vZoroJmlSl1QGHZBUKeCrZorPAhpR1PLmRdIp3VrIw DuEQcaGy7JKVt4nX8qj9/8pfZCx9TH9TGcMZsMkibRmMALw76oMmc5V6wsoOLZimtTfp ocmBXt6pg5vtXZfp+EC2xxUAr2a+MeHc7svMlZs+KqZNSr2wG5CLEYTUNHahwOrFakqM 9JCw6ekJWEMsPlmGvFtELHoo+jBh+JQ/n3MkYykm6rD5DF0o27aNbPyZzPy05DHREGR0 VyAA== X-Gm-Message-State: APjAAAUZe/C4f83B06MMcCiWWOGtEepynFa2owx4acNST30p/Aa5Q7tP qX4YEJiyz3lRWXD6lCu/dSg= X-Received: by 2002:a63:1020:: with SMTP id f32mr8173514pgl.203.1567078522618; Thu, 29 Aug 2019 04:35:22 -0700 (PDT) Received: from icarus ([2001:268:c144:27ae:e62c:5919:6925:1a01]) by smtp.gmail.com with ESMTPSA id b30sm6091623pfr.117.2019.08.29.04.35.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Aug 2019 04:35:21 -0700 (PDT) Date: Thu, 29 Aug 2019 20:34:37 +0900 From: William Breathitt Gray To: Fabien Lahoudere Cc: gwendal@chromium.org, egranata@chromium.org, kernel@collabora.com, Jonathan Corbet , Benson Leung , Enric Balletbo i Serra , Guenter Roeck , Jonathan Cameron , Hartmut Knaack , Lars-Peter Clausen , Peter Meerwald-Stadler , Lee Jones , Mauro Carvalho Chehab , "David S. Miller" , Greg Kroah-Hartman , Nicolas Ferre , Nick Vaccaro , linux-iio@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v2 1/1] counter: cros_ec: Add synchronization sensor Message-ID: <20190829112001.GA644343@icarus> References: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.12.1 (2019-06-15) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Aug 23, 2019 at 02:41:27PM +0200, Fabien Lahoudere wrote: > From: Gwendal Grignou > > EC returns a counter when there is an event on camera vsync. > This patch comes from chromeos kernel 4.4 > > Signed-off-by: Gwendal Grignou > Signed-off-by: Fabien Lahoudere > > CROS EC sync sensor was originally designed as an IIO device. > Now that the counter subsystem will replace IIO_COUNTER, we > have to implement a new way to get sync count. > > Signed-off-by: Fabien Lahoudere > --- > Documentation/driver-api/generic-counter.rst | 3 + > MAINTAINERS | 7 + > drivers/counter/Kconfig | 9 + > drivers/counter/Makefile | 1 + > drivers/counter/counter.c | 2 + > drivers/counter/cros_ec_sensors_sync.c | 208 ++++++++++++++++++ > .../cros_ec_sensors/cros_ec_sensors_core.c | 1 + > drivers/mfd/cros_ec_dev.c | 3 + > include/linux/counter.h | 1 + > 9 files changed, 235 insertions(+) > create mode 100644 drivers/counter/cros_ec_sensors_sync.c > > diff --git a/Documentation/driver-api/generic-counter.rst b/Documentation/driver-api/generic-counter.rst > index 8382f01a53e3..beb80714ac8b 100644 > --- a/Documentation/driver-api/generic-counter.rst > +++ b/Documentation/driver-api/generic-counter.rst > @@ -44,6 +44,9 @@ Counter interface provides the following available count data types: > * COUNT_POSITION: > Unsigned integer value representing position. > > +* COUNT_TALLY: > + Unsigned integer value representing tally. > + > A Count has a count function mode which represents the update behavior > for the count data. The Generic Counter interface provides the following > available count function modes: > diff --git a/MAINTAINERS b/MAINTAINERS > index e60f5c361969..83bd291d103e 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -3902,6 +3902,13 @@ R: Guenter Roeck > F: Documentation/devicetree/bindings/sound/google,cros-ec-codec.txt > F: sound/soc/codecs/cros_ec_codec.* > > +CHROMEOS EC COUNTER DRIVER > +M: Fabien Lahoudere > +M: William Breathitt Gray No need to include me here since I'm already listed as the maintainer of the Counter subsystem in its respective entry. > +L: linux-iio@vger.kernel.org > +S: Maintained > +F: drivers/counter/cros_ec_sensors_sync.c > + > CIRRUS LOGIC AUDIO CODEC DRIVERS > M: Brian Austin > M: Paul Handrigan > diff --git a/drivers/counter/Kconfig b/drivers/counter/Kconfig > index 2967d0a9ff91..22287f5715e5 100644 > --- a/drivers/counter/Kconfig > +++ b/drivers/counter/Kconfig > @@ -59,4 +59,13 @@ config FTM_QUADDEC > To compile this driver as a module, choose M here: the > module will be called ftm-quaddec. > > +config IIO_CROS_EC_SENSORS_SYNC > + tristate "ChromeOS EC Counter Sensors" > + depends on IIO_CROS_EC_SENSORS_CORE && IIO > + help > + Module to handle synchronisation sensors presented by the ChromeOS EC > + Sensor hub. > + Synchronisation sensors are counter sensors triggered when events > + occurs from other subsystems. > + > endif # COUNTER > diff --git a/drivers/counter/Makefile b/drivers/counter/Makefile > index 40d35522937d..6fe4c98a446f 100644 > --- a/drivers/counter/Makefile > +++ b/drivers/counter/Makefile > @@ -9,3 +9,4 @@ obj-$(CONFIG_104_QUAD_8) += 104-quad-8.o > obj-$(CONFIG_STM32_TIMER_CNT) += stm32-timer-cnt.o > obj-$(CONFIG_STM32_LPTIMER_CNT) += stm32-lptimer-cnt.o > obj-$(CONFIG_FTM_QUADDEC) += ftm-quaddec.o > +obj-$(CONFIG_IIO_CROS_EC_SENSORS_SYNC) += cros_ec_sensors_sync.o > diff --git a/drivers/counter/counter.c b/drivers/counter/counter.c > index 106bc7180cd8..53525b109094 100644 > --- a/drivers/counter/counter.c > +++ b/drivers/counter/counter.c > @@ -261,6 +261,7 @@ void counter_count_read_value_set(struct counter_count_read_value *const val, > { > switch (type) { > case COUNTER_COUNT_POSITION: > + case COUNTER_COUNT_TALLY: > val->len = sprintf(val->buf, "%lu\n", *(unsigned long *)data); > break; > default: > @@ -290,6 +291,7 @@ int counter_count_write_value_get(void *const data, > > switch (type) { > case COUNTER_COUNT_POSITION: > + case COUNTER_COUNT_TALLY: > err = kstrtoul(val->buf, 0, data); > if (err) > return err; Dedicate the core counter subsystem related changes to their own patch so that we can commit them separately. That'll make it easier both to evaluate the changes and debug later by keeping the history clear. > diff --git a/drivers/counter/cros_ec_sensors_sync.c b/drivers/counter/cros_ec_sensors_sync.c > new file mode 100644 > index 000000000000..b6f5e2c6da9f > --- /dev/null > +++ b/drivers/counter/cros_ec_sensors_sync.c > @@ -0,0 +1,208 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Driver of counter incremented after events on interrupt line in EC. > + * > + * Copyright 2018 Google, Inc > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#define DRV_NAME "cros-ec-sync" > + > +/* > + * One channel for counter, the other for timestamp. > + */ > +#define MAX_CHANNELS (1) > + > +/* State data for ec_sensors iio driver. */ > +struct cros_ec_sensors_sync_state { > + /* Shared by all sensors */ > + struct cros_ec_sensors_core_state core; > + struct counter_device counter; > + struct iio_chan_spec channels[MAX_CHANNELS]; > +}; > + > +static int cros_ec_sensors_sync_read(struct iio_dev *indio_dev, > + struct iio_chan_spec const *chan, > + int *val, int *val2, long mask) > +{ > + struct cros_ec_sensors_sync_state *st = iio_priv(indio_dev); > + u16 data; > + int ret; > + > + mutex_lock(&st->core.cmd_lock); > + switch (mask) { > + case IIO_CHAN_INFO_RAW: > + ret = cros_ec_sensors_read_cmd(indio_dev, BIT(0), &data); > + if (ret < 0) > + break; > + ret = IIO_VAL_INT; > + *val = data; > + break; > + default: > + ret = cros_ec_sensors_core_read(&st->core, chan, val, val2, > + mask); > + break; > + } > + mutex_unlock(&st->core.cmd_lock); > + return ret; > +} > + > +static struct iio_info cros_ec_sensors_sync_info = { > + .read_raw = &cros_ec_sensors_sync_read, > + .read_avail = &cros_ec_sensors_core_read_avail, > +}; > + > +static struct counter_count cros_ec_sync_counts = { > + .id = 0, > + .name = "Cros EC sync counter", > +}; > + > +static int cros_ec_sync_cnt_read(struct counter_device *counter, > + struct counter_count *count, > + struct counter_count_read_value *val) > +{ > + s16 cnt; > + int ret; > + struct iio_dev *indio_dev = counter->priv; > + struct cros_ec_sensors_sync_state *const st = iio_priv(indio_dev); > + unsigned long data; > + > + mutex_lock(&st->core.cmd_lock); > + ret = cros_ec_sensors_read_cmd(indio_dev, BIT(0), &cnt); > + mutex_unlock(&st->core.cmd_lock); > + if (ret != 0) { > + dev_warn(&indio_dev->dev, "Unable to read sensor data\n"); > + return ret; > + } > + > + data = (unsigned long) cnt; This cast is not necessary since the data variable is already unsigned long; conversion can occur implicitly with a simple set operation. > + counter_count_read_value_set(val, COUNTER_COUNT_TALLY, &data); > + > + return 0; > +} > + > +static const struct counter_ops cros_ec_sync_cnt_ops = { > + .count_read = cros_ec_sync_cnt_read, > +}; Like in my previous review: does the hardware allow the counter to be reset back to zero, or is it purely read-only? It's okay if you want to focus on just reading for this patch, but it'll be good to know the capabilities of this hardware if we want support for it in the future. > + > +static char *cros_ec_loc[] = { > + [MOTIONSENSE_LOC_BASE] = "base", > + [MOTIONSENSE_LOC_LID] = "lid", > + [MOTIONSENSE_LOC_CAMERA] = "camera", > + [MOTIONSENSE_LOC_MAX] = "unknown", > +}; > + > +static ssize_t cros_ec_sync_id(struct counter_device *counter, > + void *private, char *buf) > +{ > + struct iio_dev *indio_dev = counter->priv; > + struct cros_ec_sensors_sync_state *const st = iio_priv(indio_dev); > + > + return snprintf(buf, PAGE_SIZE, "%d\n", st->core.param.info.sensor_num); > +} > + > +static ssize_t cros_ec_sync_loc(struct counter_device *counter, > + void *private, char *buf) > +{ > + struct iio_dev *indio_dev = counter->priv; > + struct cros_ec_sensors_sync_state *const st = iio_priv(indio_dev); > + > + return snprintf(buf, PAGE_SIZE, "%s\n", cros_ec_loc[st->core.loc]); > +} > + > +static struct counter_device_ext cros_ec_sync_cnt_ext[] = { > + { > + .name = "id", > + .read = cros_ec_sync_id > + }, > + { > + .name = "location", > + .read = cros_ec_sync_loc > + }, > +}; Create a corresponding documentation file to describe these attributes: Documentation/ABI/testing/sysfs-bus-counter-cros_ec_sensors_sync > + > +static int cros_ec_sensors_sync_probe(struct platform_device *pdev) > +{ > + struct cros_ec_sensors_sync_state *state; > + struct device *dev = &pdev->dev; > + struct iio_chan_spec *channel; > + struct iio_dev *indio_dev; > + int ret; > + > + indio_dev = devm_iio_device_alloc(dev, sizeof(*state)); > + if (!indio_dev) > + return -ENOMEM; > + > + ret = cros_ec_sensors_core_init(pdev, indio_dev, true); > + if (ret) > + return ret; > + > + indio_dev->info = &cros_ec_sensors_sync_info; > + state = iio_priv(indio_dev); > + > + if (state->core.type != MOTIONSENSE_TYPE_SYNC) > + return -EINVAL; > + > + /* Initialize IIO device */ > + channel = state->channels; > + channel->type = IIO_TIMESTAMP; > + channel->channel = -1; > + channel->scan_index = 1; > + channel->scan_type.sign = 's'; > + channel->scan_type.realbits = 64; > + channel->scan_type.storagebits = 64; > + > + indio_dev->channels = state->channels; > + indio_dev->num_channels = MAX_CHANNELS; > + > + state->core.read_ec_sensors_data = cros_ec_sensors_read_cmd; > + > + ret = devm_iio_triggered_buffer_setup(dev, indio_dev, NULL, > + cros_ec_sensors_capture, NULL); > + if (ret) > + return ret; > + > + ret = devm_iio_device_register(dev, indio_dev); > + if (ret) > + return ret; > + > + /* Initialize counter device */ > + state->counter.name = dev_name(&pdev->dev); > + state->counter.parent = &pdev->dev; > + state->counter.counts = &cros_ec_sync_counts; > + state->counter.num_counts = 1; > + state->counter.priv = indio_dev; > + state->counter.ops = &cros_ec_sync_cnt_ops; > + state->counter.ext = cros_ec_sync_cnt_ext; > + state->counter.num_ext = ARRAY_SIZE(cros_ec_sync_cnt_ext); > + > + return devm_counter_register(&pdev->dev, &state->counter); > +} > + > +static const struct platform_device_id cros_ec_sensors_sync_ids[] = { > + { .name = DRV_NAME, }, > + { } > +}; > +MODULE_DEVICE_TABLE(platform, cros_ec_sensors_sync_ids); > + > +static struct platform_driver cros_ec_sensors_sync_platform_driver = { > + .driver = { > + .name = DRV_NAME, > + .pm = &cros_ec_sensors_pm_ops, > + }, > + .probe = cros_ec_sensors_sync_probe, > + .id_table = cros_ec_sensors_sync_ids, > +}; > +module_platform_driver(cros_ec_sensors_sync_platform_driver); > + > +MODULE_DESCRIPTION("ChromeOS EC synchronisation sensor driver"); > +MODULE_ALIAS("platform:" DRV_NAME); > +MODULE_LICENSE("GPL v2"); From the email you sent in response to Jonathan Cameron's comments, the IIO code in this driver will be removed so that should take care of the error message reported by the kbuild test robot. With only the Counter subsystem to worry about, this driver should end up a lot simpler in v3. I'm looking forward to it. :-) William Breathitt Gray > 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 805652250960..2bf183425eaf 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 > @@ -22,6 +22,7 @@ > static char *cros_ec_loc[] = { > [MOTIONSENSE_LOC_BASE] = "base", > [MOTIONSENSE_LOC_LID] = "lid", > + [MOTIONSENSE_LOC_CAMERA] = "camera", > [MOTIONSENSE_LOC_MAX] = "unknown", > }; > > diff --git a/drivers/mfd/cros_ec_dev.c b/drivers/mfd/cros_ec_dev.c > index 41dccced5026..1c5c2c38af88 100644 > --- a/drivers/mfd/cros_ec_dev.c > +++ b/drivers/mfd/cros_ec_dev.c > @@ -332,6 +332,9 @@ static void cros_ec_sensors_register(struct cros_ec_dev *ec) > case MOTIONSENSE_TYPE_ACTIVITY: > sensor_cells[id].name = "cros-ec-activity"; > break; > + case MOTIONSENSE_TYPE_SYNC: > + sensor_cells[id].name = "cros-ec-sync"; > + break; > default: > dev_warn(ec->dev, "unknown type %d\n", resp->info.type); > continue; > diff --git a/include/linux/counter.h b/include/linux/counter.h > index a061cdcdef7c..1198e675306f 100644 > --- a/include/linux/counter.h > +++ b/include/linux/counter.h > @@ -488,6 +488,7 @@ enum counter_signal_value_type { > > enum counter_count_value_type { > COUNTER_COUNT_POSITION = 0, > + COUNTER_COUNT_TALLY > }; > > void counter_signal_read_value_set(struct counter_signal_read_value *const val, > -- > 2.20.1 >