Re: [PATCH v5 7/9] mfd: cros_ec: Support multiple EC in a system
Hello Lee, On 06/03/2015 03:49 PM, Lee Jones wrote: [...] >> >> int cros_ec_register(struct cros_ec_device *ec_dev) >> @@ -52,14 +68,39 @@ int cros_ec_register(struct cros_ec_device *ec_dev) >> >> cros_ec_query_all(ec_dev); >> >> -err = mfd_add_devices(dev, 0, cros_devs, >> - ARRAY_SIZE(cros_devs), >> +if (IS_ENABLED(CONFIG_OF) && dev->of_node) >> +ec_p.ec_name = of_get_property(dev->of_node, >> + "google,cros-ec-name", NULL); > > NACK > > You either need to obtain this another way, or have a chat with the DT > Maintainers and explain why this platform is special enough to break > the normal conventions. > > HINT: I different compatible string is normally more amenable, but > this will also require a DT ACK for me to take it through. > Ok, I'll just remove the property then. After all the driver only supports two types of controllers currently, the normal host EC and the Power Delivery (PD) one. And there isn't a DTS even in the downstream ChromiumOS tree that is setting a different EC name right now. I guess the idea of the binding was to make it future proof from when the driver supports more types of controllers but I'll let Gwendal to comment on this since he is the author of these patches. >> +if (!ec_p.ec_name) >> +ec_p.ec_name = CROS_EC_DEV_NAME; >> + >> +err = mfd_add_devices(ec_dev->dev, PLATFORM_DEVID_AUTO, &ec_cell, 1, >>NULL, ec_dev->irq, NULL); >> if (err) { >> -dev_err(dev, "failed to add mfd devices\n"); >> +dev_err(dev, "failed to add ec\n"); > > Might be nice to expand 'ec' so your users have half a chance in > deciphering what just went wrong. > I will, thanks a lot for your feedback. > [...] > Best regards, Javier -- To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH v5 7/9] mfd: cros_ec: Support multiple EC in a system
On Wed, 03 Jun 2015, Javier Martinez Canillas wrote: > From: Gwendal Grignou > > Chromebooks can have more than one Embedded Controller so the > cros_ec device id has to be incremented for each EC registered. > > Add a new structure to represent multiple EC as different char > devices (e.g: /dev/cros_ec, /dev/cros_pd). It connects to > cros_ec_device and allows sysfs inferface for cros_pd. > > Also reduce number of allocated objects, make chromeos sysfs > class object a static and add refcounting to prevent object > deletion while command is in progress. > > Signed-off-by: Gwendal Grignou > Reviewed-by: Dmitry Torokhov > Signed-off-by: Javier Martinez Canillas > Tested-by: Heiko Stuebner > --- > > Changes since v4: > - Use cros-ec-name DT property instead of devname. Suggested by Lee Jones. > - Pass PLATFORM_DEVID_AUTO directly to mfd_add_devices(). >Suggested by Lee Jones. > - Add Heiko Stuebner tested-by tag. > - Fix get_version by passing the cmd_offset to EC_CMD_GET_VERSION. > > Changes since v3: > - Add defines for the EC and PD index constants. > - Remove cros_ec_dev_register() and declare the mfd_cells as static structs. >Suggested by Lee Jones. > > Changes since v2: None > > Changes since v1: > - Squash patch that adds support to represent EC's as different > char devices (e.g: /dev/cros_ec, /dev/cros_pd): > https://chromium-review.googlesource.com/#/c/217297/ > Suggested by Gwendal Grignou > - Use cros_ec instead of cros-ec in the subject line to be consistent. > Suggested by Gwendal Grignou > --- > drivers/input/keyboard/cros_ec_keyb.c | 2 +- > drivers/mfd/cros_ec.c | 57 +++-- > drivers/mfd/cros_ec_i2c.c | 1 - > drivers/mfd/cros_ec_spi.c | 1 - > drivers/platform/chrome/cros_ec_dev.c | 130 > - > drivers/platform/chrome/cros_ec_dev.h | 7 -- > drivers/platform/chrome/cros_ec_lightbar.c | 75 + > drivers/platform/chrome/cros_ec_lpc.c | 1 - > drivers/platform/chrome/cros_ec_sysfs.c| 48 +-- > include/linux/mfd/cros_ec.h| 44 -- > 10 files changed, 239 insertions(+), 127 deletions(-) > > diff --git a/drivers/input/keyboard/cros_ec_keyb.c > b/drivers/input/keyboard/cros_ec_keyb.c > index 974154a74505..b01966dc7eb3 100644 > --- a/drivers/input/keyboard/cros_ec_keyb.c > +++ b/drivers/input/keyboard/cros_ec_keyb.c > @@ -275,7 +275,7 @@ static int cros_ec_keyb_probe(struct platform_device > *pdev) > ckdev->dev = dev; > dev_set_drvdata(&pdev->dev, ckdev); > > - idev->name = ec->ec_name; > + idev->name = CROS_EC_DEV_NAME; > idev->phys = ec->phys_name; > __set_bit(EV_REP, idev->evbit); > > diff --git a/drivers/mfd/cros_ec.c b/drivers/mfd/cros_ec.c > index 08d82bfc5268..6935f385992e 100644 > --- a/drivers/mfd/cros_ec.c > +++ b/drivers/mfd/cros_ec.c > @@ -24,11 +24,27 @@ > #include > #include > > -static const struct mfd_cell cros_devs[] = { > - { > - .name = "cros-ec-ctl", > - .id = PLATFORM_DEVID_AUTO, > - }, > +#define CROS_EC_DEV_EC_INDEX 0 > +#define CROS_EC_DEV_PD_INDEX 1 > + > +struct cros_ec_platform ec_p = { > + .cmd_offset = EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_EC_INDEX), > +}; > + > +struct cros_ec_platform pd_p = { > + .cmd_offset = EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX), > +}; > + > +struct mfd_cell ec_cell = { > + .name = "cros-ec-ctl", > + .platform_data = &ec_p, > + .pdata_size = sizeof(ec_p), > +}; > + > +struct mfd_cell ec_pd_cell = { > + .name = "cros-ec-ctl", > + .platform_data = &pd_p, > + .pdata_size = sizeof(pd_p), > }; > > int cros_ec_register(struct cros_ec_device *ec_dev) > @@ -52,14 +68,39 @@ int cros_ec_register(struct cros_ec_device *ec_dev) > > cros_ec_query_all(ec_dev); > > - err = mfd_add_devices(dev, 0, cros_devs, > - ARRAY_SIZE(cros_devs), > + if (IS_ENABLED(CONFIG_OF) && dev->of_node) > + ec_p.ec_name = of_get_property(dev->of_node, > +"google,cros-ec-name", NULL); NACK You either need to obtain this another way, or have a chat with the DT Maintainers and explain why this platform is special enough to break the normal conventions. HINT: I different compatible string is normally more amenable, but this will also require a DT ACK for me to take it through. > + if (!ec_p.ec_name) > + ec_p.ec_name = CROS_EC_DEV_NAME; > + > + err = mfd_add_devices(ec_dev->dev, PLATFORM_DEVID_AUTO, &ec_cell, 1, > NULL, ec_dev->irq, NULL); > if (err) { > - dev_err(dev, "failed to add mfd devices\n"); > + dev_err(dev, "failed to add ec\n"); Might be nice to expand 'ec' so your users have half a chance in deciphering what just went wrong. [...] -- Lee Jones Linaro STMicroelect
[PATCH v5 7/9] mfd: cros_ec: Support multiple EC in a system
From: Gwendal Grignou Chromebooks can have more than one Embedded Controller so the cros_ec device id has to be incremented for each EC registered. Add a new structure to represent multiple EC as different char devices (e.g: /dev/cros_ec, /dev/cros_pd). It connects to cros_ec_device and allows sysfs inferface for cros_pd. Also reduce number of allocated objects, make chromeos sysfs class object a static and add refcounting to prevent object deletion while command is in progress. Signed-off-by: Gwendal Grignou Reviewed-by: Dmitry Torokhov Signed-off-by: Javier Martinez Canillas Tested-by: Heiko Stuebner --- Changes since v4: - Use cros-ec-name DT property instead of devname. Suggested by Lee Jones. - Pass PLATFORM_DEVID_AUTO directly to mfd_add_devices(). Suggested by Lee Jones. - Add Heiko Stuebner tested-by tag. - Fix get_version by passing the cmd_offset to EC_CMD_GET_VERSION. Changes since v3: - Add defines for the EC and PD index constants. - Remove cros_ec_dev_register() and declare the mfd_cells as static structs. Suggested by Lee Jones. Changes since v2: None Changes since v1: - Squash patch that adds support to represent EC's as different char devices (e.g: /dev/cros_ec, /dev/cros_pd): https://chromium-review.googlesource.com/#/c/217297/ Suggested by Gwendal Grignou - Use cros_ec instead of cros-ec in the subject line to be consistent. Suggested by Gwendal Grignou --- drivers/input/keyboard/cros_ec_keyb.c | 2 +- drivers/mfd/cros_ec.c | 57 +++-- drivers/mfd/cros_ec_i2c.c | 1 - drivers/mfd/cros_ec_spi.c | 1 - drivers/platform/chrome/cros_ec_dev.c | 130 - drivers/platform/chrome/cros_ec_dev.h | 7 -- drivers/platform/chrome/cros_ec_lightbar.c | 75 + drivers/platform/chrome/cros_ec_lpc.c | 1 - drivers/platform/chrome/cros_ec_sysfs.c| 48 +-- include/linux/mfd/cros_ec.h| 44 -- 10 files changed, 239 insertions(+), 127 deletions(-) diff --git a/drivers/input/keyboard/cros_ec_keyb.c b/drivers/input/keyboard/cros_ec_keyb.c index 974154a74505..b01966dc7eb3 100644 --- a/drivers/input/keyboard/cros_ec_keyb.c +++ b/drivers/input/keyboard/cros_ec_keyb.c @@ -275,7 +275,7 @@ static int cros_ec_keyb_probe(struct platform_device *pdev) ckdev->dev = dev; dev_set_drvdata(&pdev->dev, ckdev); - idev->name = ec->ec_name; + idev->name = CROS_EC_DEV_NAME; idev->phys = ec->phys_name; __set_bit(EV_REP, idev->evbit); diff --git a/drivers/mfd/cros_ec.c b/drivers/mfd/cros_ec.c index 08d82bfc5268..6935f385992e 100644 --- a/drivers/mfd/cros_ec.c +++ b/drivers/mfd/cros_ec.c @@ -24,11 +24,27 @@ #include #include -static const struct mfd_cell cros_devs[] = { - { - .name = "cros-ec-ctl", - .id = PLATFORM_DEVID_AUTO, - }, +#define CROS_EC_DEV_EC_INDEX 0 +#define CROS_EC_DEV_PD_INDEX 1 + +struct cros_ec_platform ec_p = { + .cmd_offset = EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_EC_INDEX), +}; + +struct cros_ec_platform pd_p = { + .cmd_offset = EC_CMD_PASSTHRU_OFFSET(CROS_EC_DEV_PD_INDEX), +}; + +struct mfd_cell ec_cell = { + .name = "cros-ec-ctl", + .platform_data = &ec_p, + .pdata_size = sizeof(ec_p), +}; + +struct mfd_cell ec_pd_cell = { + .name = "cros-ec-ctl", + .platform_data = &pd_p, + .pdata_size = sizeof(pd_p), }; int cros_ec_register(struct cros_ec_device *ec_dev) @@ -52,14 +68,39 @@ int cros_ec_register(struct cros_ec_device *ec_dev) cros_ec_query_all(ec_dev); - err = mfd_add_devices(dev, 0, cros_devs, - ARRAY_SIZE(cros_devs), + if (IS_ENABLED(CONFIG_OF) && dev->of_node) + ec_p.ec_name = of_get_property(dev->of_node, + "google,cros-ec-name", NULL); + + if (!ec_p.ec_name) + ec_p.ec_name = CROS_EC_DEV_NAME; + + err = mfd_add_devices(ec_dev->dev, PLATFORM_DEVID_AUTO, &ec_cell, 1, NULL, ec_dev->irq, NULL); if (err) { - dev_err(dev, "failed to add mfd devices\n"); + dev_err(dev, "failed to add ec\n"); return err; } + if (ec_dev->max_passthru) { + /* +* Register a PD device as well on top of this device. +* We make the following assumptions: +* - behind an EC, we have a pd +* - only one device added. +* - the EC is responsive at init time (it is not true for a +* sensor hub. +*/ + pd_p.ec_name = CROS_EC_DEV_PD_NAME; + + err = mfd_add_devices(ec_dev->dev, PLATFORM_DEVID_AUTO, + &ec_pd_cell, 1, NULL, ec_dev->irq, NULL); + if (err) { +