All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lee Jones <lee.jones@linaro.org>
To: Gwendal Grignou <gwendal@chromium.org>
Cc: andy.shevchenko@gmail.com, Guenter Roeck <groeck@chromium.org>,
	Enric Balletbo i Serra <enric.balletbo@collabora.com>,
	linux-kernel <linux-kernel@vger.kernel.org>,
	kernel@collabora.com
Subject: Re: [PATCH v5] mfd: cros_ec_dev: Register cros_ec_accel_legacy driver as a subdevice
Date: Fri, 31 May 2019 09:13:53 +0100	[thread overview]
Message-ID: <20190531081353.GQ4574@dell> (raw)
In-Reply-To: <CAPUE2usBh5r22Ak3LxLK-hS7wOObAdW4v1r8TDFUWPz=05FGMw@mail.gmail.com>

On Thu, 30 May 2019, Gwendal Grignou wrote:

> On Thu, May 30, 2019 at 12:48 AM Lee Jones <lee.jones@linaro.org> wrote:
> >
> > On Wed, 29 May 2019, Gwendal Grignou wrote:
> >
> > > On Wed, May 29, 2019 at 4:44 AM Lee Jones <lee.jones@linaro.org> wrote:
> > > >
> > > > On Tue, 28 May 2019, Gwendal Grignou wrote:
> > > >
> > > > > On Mon, Apr 1, 2019 at 8:46 PM Lee Jones <lee.jones@linaro.org> wrote:
> > > > > >
> > > > > > On Wed, 27 Feb 2019, Gwendal Grignou wrote:
> > > > > >
> > > > > > > From: Enric Balletbo i Serra <enric.balletbo@collabora.com>
> > > > > > >
> > > > > > > With this patch, the cros_ec_ctl driver will register the legacy
> > > > > > > accelerometer driver (named cros_ec_accel_legacy) if it fails to
> > > > > > > register sensors through the usual path cros_ec_sensors_register().
> > > > > > > This legacy device is present on Chromebook devices with older EC
> > > > > > > firmware only supporting deprecated EC commands (Glimmer based devices).
> > > > > > >
> > > > > > > Tested-by: Gwendal Grignou <gwendal@chromium.org>
> > > > > > > Signed-off-by: Enric Balletbo i Serra <enric.balletbo@collabora.com>
> > > > > > > Reviewed-by: Gwendal Grignou <gwendal@chromium.org>
> > > > > > > Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
> > > > > > > ---
> > > > > > > Changes in v5:
> > > > > > > - Remove unnecessary white lines.
> > > > > > >
> > > > > > > Changes in v4:
> > > > > > > - [5/8] Nit: EC -> ECs (Lee Jones)
> > > > > > > - [5/8] Statically define cros_ec_accel_legacy_cells (Lee Jones)
> > > > > > >
> > > > > > > Changes in v3:
> > > > > > > - [5/8] Add the Reviewed-by Andy Shevchenko.
> > > > > > >
> > > > > > > Changes in v2:
> > > > > > > - [5/8] Add the Reviewed-by Gwendal.
> > > > > > >
> > > > > > >  drivers/mfd/cros_ec_dev.c | 66 +++++++++++++++++++++++++++++++++++++++
> > > > > > >  1 file changed, 66 insertions(+)
> > > > > > >
> > > > > > > diff --git a/drivers/mfd/cros_ec_dev.c b/drivers/mfd/cros_ec_dev.c
> > > > > > > index d275deaecb12..64567bd0a081 100644
> > > > > > > --- a/drivers/mfd/cros_ec_dev.c
> > > > > > > +++ b/drivers/mfd/cros_ec_dev.c
> > > > > > > @@ -376,6 +376,69 @@ static void cros_ec_sensors_register(struct cros_ec_dev *ec)
> > > > > > >       kfree(msg);
> > > > > > >  }
> > > > > > >
> > > > > > > +static struct cros_ec_sensor_platform sensor_platforms[] = {
> > > > > > > +     { .sensor_num = 0 },
> > > > > > > +     { .sensor_num = 1 }
> > > > > > > +};
> > > > > >
> > > > > > I'm still very uncomfortable with this struct.
> > > > > >
> > > > > > Other than these indices, the sensors have no other distinguishing
> > > > > > features, thus there should be no need to identify or distinguish
> > > > > > between them in this way.
> > > > > When initializing the sensors, the IIO driver expect to find in the
> > > > > data  structure pointed by dev_get_platdata(dev), in field sensor_num
> > > > > is stored the index assigned by the embedded controller to talk to a
> > > > > given sensor.
> > > > > cros_ec_sensors_register() use the same mechanism; in that function,
> > > > > the sensor_num field is populated from the output of an EC command
> > > > > MOTIONSENSE_CMD_INFO. In case of legacy mode, that command may not be
> > > > > available and in any case we know the EC has only either 2
> > > > > accelerometers present or nothing.
> > > > >
> > > > > For instance, let's compare a legacy device with a more recent one:
> > > > >
> > > > > legacy:
> > > > > type                  |   id          | sensor_num   | device name
> > > > > accelerometer  |   0           |   0                  | cros-ec-accel.0
> > > > > accelerometer  |   1           |   1                  | cros-ec-accel.1
> > > > >
> > > > > Modern:
> > > > > type                  |   id          | sensor_num   | device name
> > > > > accelerometer  |   0           |   0                  | cros-ec-accel.0
> > > > > accelerometer  |   1           |   1                  | cros-ec-accel.1
> > > > > gyroscope        |    0          |    2                 | cros-ec-gyro.0
> > > > > magnetometer |    0          |   3                  | cros-ec-mag.0
> > > > > light                  |    0          |   4                  | cros-ec-light.0
> > > > > ...
> > > >
> > > > Why can't these numbers be assigned at runtime?
> > > I assume you want to know why IIO drivers need to know "sensor_num"
> > > ahead of time. It is because each IIO driver is independent from the
> > > other.
> > > Let assume there was 2 light sensors in the device:
> > > type                  |   id          | sensor_num   | device name
> > >  light                  |    0          |   4                  | cros-ec-light.0
> > >  light                  |    1          |   5                  | cros-ec-light.1
> > >
> > > In case of sensors of the same type without sensor_num, cros-ec-light
> > > driver has no information at probe time if it should bind to sensors
> > > named by the EC 4 or 5.
> > >
> > > We could get away with cros-ec-accel, as EC always presents
> > > accelerometers with sensor_num  0 and 1, but I don't want to rely on
> > > this property in the general case.
> > > Only cros_ec_dev MFD driver has the global view of all sensors available.
> >
> > Well seeing as this implementation has already been accepted and you're
> > only *using* it, rather than creating it, I think this conversation is
> > moot.  It looks like the original implementation patch was not
> > reviewed by me, which is frustrating since I would have NACKed it.
> >
> > Just so you know, pointlessly enumerating identical devices manually
> > is not a good practice.  It is one we reject all the time.  This
> > imp. should too have been rejected on submission.

> I wrote the original code, Enric submitted it, so I am not just using it.

My point was, *this* patch is just using it.  The implementation has
already been applied to the mainline kernel.  Who wrote the initial
commit is not important at this point.

> We can work on implementing the right way. Which model should I follow?
> The code function is similar to HID sensor hub code which is done in
> driver/hid/hid-sensor-hub.c [sensor_hub_probe()] which calls
> mfd_add_hotplug_devices() with an array of mfd_cell,
> hid_sensor_hub_client_devs. Each cell platfom_data contains  a hsdev
> structure that is shared between the iio driver and the hid sensor hub
> driver. hsdev->usage information is sent back and forth between
> specialized hid IIO device driver and the HID sensor hub driver, for
> example when sensor_hub_input_attr_get_raw_value() is called.
> hsdev->usage has the same usage a sensor_num I am using.

It looks like the HID Usage implementation is using a set of
pre-defined values to identify sensor *types*:

  include/linux/hid-sensor-ids.h

Where as your implementation is confusing me.  In some instances you
are using it as what looks like an *index* into a register set:

  ec_cmd_read_u16(st->ec,
                EC_MEMMAP_ACC_DATA +
                sizeof(s16) *
                (1 + i + st->sensor_num * MAX_AXIS),
                data);

And at other times it is used for sensor *types*, but in a very
limited way:

  enum motionsensor_location {
          MOTIONSENSE_LOC_BASE = 0,
          MOTIONSENSE_LOC_LID = 1,
          MOTIONSENSE_LOC_MAX,
  };

  static char *cros_ec_accel_legacy_loc_strings[] = {
          [MOTIONSENSE_LOC_BASE] = "base",
          [MOTIONSENSE_LOC_LID] = "lid",
          [MOTIONSENSE_LOC_MAX] = "unknown",
  };

  return sprintf(buf, "%s\n",
                 cros_ec_accel_legacy_loc_strings[st->sensor_num +
                                                MOTIONSENSE_LOC_BASE]);

> I am not enumerating identical devices twice: the embedded controller
> manages a list of sensors:
> 
> For instance on pixelbook, it look like:
>        +--------+
>         | EC    |
>        +--------+
>    ( via several i2c/spi buses)
> +--------------------+--------------+-------- ...
> |                         |                  |
> IMU (base)     light/prox    Accelrometer (lid)
> |
> Magnetometer
> 
> A given hardware sensor may be composed of multiple logical sensors
> (IMU is a accelerometer and a gyroscope into one package).
> 
> The EC firmware list all the (logical) sensors in array, and that
> unique index - sensor_num - points to a single logical sensor.

What what is 'sensor_num'; is it a channel address/number similar to
what I2C HIDs use to communicate over a specific I2C line, or is it a
type, similar to what HID devices provide on request for
identification purposes? 

> Is it more acceptable if I use PLATFORM_DEVID_AUTO instead of
> assigning .id myself?

Is this a separate question, or can 'sensor_num' be any unique
arbitrary number?

> The topology will look like:
> find . -type d -name \*auto
> ./devices/pci0000:00/0000:00:1f.0/PNP0C09:00/GOOG0004:00/cros-ec-dev.1.auto
> ./devices/pci0000:00/0000:00:1f.0/PNP0C09:00/GOOG0004:00/cros-ec-dev.1.auto/cros-usbpd-logger.8.auto
> ./devices/pci0000:00/0000:00:1f.0/PNP0C09:00/GOOG0004:00/cros-ec-dev.1.auto/cros-ec-accel.2.auto
> ./devices/pci0000:00/0000:00:1f.0/PNP0C09:00/GOOG0004:00/cros-ec-dev.1.auto/cros-ec-gyro.4.auto
> ./devices/pci0000:00/0000:00:1f.0/PNP0C09:00/GOOG0004:00/cros-ec-dev.1.auto/cros-usbpd-charger.7.auto
> ./devices/pci0000:00/0000:00:1f.0/PNP0C09:00/GOOG0004:00/cros-ec-dev.1.auto/cros-ec-gyro.3.auto
> ./devices/pci0000:00/0000:00:1f.0/PNP0C09:00/GOOG0004:00/cros-ec-dev.1.auto/cros-ec-mag.5.auto
> ./devices/pci0000:00/0000:00:1f.0/PNP0C09:00/GOOG0004:00/cros-ec-dev.1.auto/cros-ec-ring.6.auto
> ./devices/pci0000:00/0000:00:15.2/i2c_designware.2/i2c-8/i2c-GOOG0008:00/cros-ec-dev.0.auto
> 
> Thank you for your support,

No problem.

-- 
Lee Jones [李琼斯]
Linaro Services Technical Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

  reply	other threads:[~2019-05-31  8:13 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-03-20 12:27 [PATCH v4 0/8] mfd: cros_ec: add subdevices and fixes Enric Balletbo i Serra
2018-03-20 12:27 ` [PATCH v4 1/8] mfd: cros_ec: fail early if we cannot identify the EC Enric Balletbo i Serra
2018-03-20 12:27 ` [PATCH v4 2/8] mfd: cros_ec: free IRQ automatically Enric Balletbo i Serra
2018-03-20 12:27 ` [PATCH v4 3/8] mfd: cros_ec: Don't try to grab log when suspended Enric Balletbo i Serra
2018-03-20 12:27 ` [PATCH v4 4/8] mfd: cros_ec_dev: Register cros-ec-rtc driver as a subdevice Enric Balletbo i Serra
2018-03-28 10:54   ` Lee Jones
2018-03-28 10:58     ` Enric Balletbo i Serra
2018-03-20 12:27 ` [PATCH v4 5/8] mfd: cros_ec_dev: Register cros_ec_accel_legacy " Enric Balletbo i Serra
2018-03-28 11:03   ` Lee Jones
2018-04-04  8:03     ` Enric Balletbo Serra
2018-04-04  9:06       ` Enric Balletbo Serra
2018-04-16 13:20         ` Lee Jones
2019-02-28  1:03           ` Gwendal Grignou
2019-02-28  1:35             ` [PATCH v5] " Gwendal Grignou
2019-04-02  3:46               ` Lee Jones
2019-05-28 21:53                 ` Gwendal Grignou
2019-05-29 11:44                   ` Lee Jones
2019-05-29 18:38                     ` Gwendal Grignou
2019-05-30  7:48                       ` Lee Jones
2019-05-31  4:46                         ` Gwendal Grignou
2019-05-31  8:13                           ` Lee Jones [this message]
2019-05-31 21:02                             ` Gwendal Grignou
2019-06-03  6:22                               ` Lee Jones
2019-06-03 17:01                                 ` Gwendal Grignou
2018-03-20 12:27 ` [PATCH v4 6/8] mfd: cros_ec_dev: register shutdown function for debugfs Enric Balletbo i Serra
2018-03-20 12:27 ` [PATCH v4 7/8] mfd: cros_ec_i2c: add ACPI module device table Enric Balletbo i Serra
2018-03-20 12:27 ` [PATCH v4 8/8] mfd: cros_ec_i2c: moving the system sleep pm ops to late Enric Balletbo i Serra

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=20190531081353.GQ4574@dell \
    --to=lee.jones@linaro.org \
    --cc=andy.shevchenko@gmail.com \
    --cc=enric.balletbo@collabora.com \
    --cc=groeck@chromium.org \
    --cc=gwendal@chromium.org \
    --cc=kernel@collabora.com \
    --cc=linux-kernel@vger.kernel.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.