On Mon, 22 Jul 2019, Enric Balletbo i Serra wrote: > With the increasing use of dedicated CrOS EC MCUs, it takes a fair amount > of boiler plate code to add those devices, add a struct that can be used > to specify a dedicated CrOS EC MCU so we can just add a new item to it to > define a new dedicated MCU. > > Signed-off-by: Enric Balletbo i Serra <enric.balle...@collabora.com> > Acked-by: Andy Shevchenko <andriy.shevche...@linux.intel.com> > Reviewed-by: Gwendal Grignou <gwen...@chromium.org> > Tested-by: Gwendal Grignou <gwen...@chromium.org> > --- > > Changes in v5: None > Changes in v4: None > Changes in v3: None > Changes in v2: None > > drivers/mfd/cros_ec_dev.c | 87 +++++++++++++++++++++------------------ > 1 file changed, 48 insertions(+), 39 deletions(-) > > diff --git a/drivers/mfd/cros_ec_dev.c b/drivers/mfd/cros_ec_dev.c > index c6bf52d795f2..e0e18c0eb9f5 100644 > --- a/drivers/mfd/cros_ec_dev.c > +++ b/drivers/mfd/cros_ec_dev.c > @@ -22,6 +22,41 @@ static struct class cros_class = { > .name = "chromeos", > }; > > +/** > + * cros_feature_to_name - CrOS feature id to name/short description. > + * @id: The feature identifier. > + * @name: Device name associated with the feature id. > + * @desc: Short name that will be displayed. > + */ > +struct cros_feature_to_name { > + unsigned int id; > + const char *name; > + const char *desc; > +}; > + > +static const struct cros_feature_to_name cros_mcu_devices[] = { > + { > + .id = EC_FEATURE_FINGERPRINT, > + .name = CROS_EC_DEV_FP_NAME, > + .desc = "Fingerprint", > + }, > + { > + .id = EC_FEATURE_ISH, > + .name = CROS_EC_DEV_ISH_NAME, > + .desc = "Integrated Sensor Hub", > + }, > + { > + .id = EC_FEATURE_SCP, > + .name = CROS_EC_DEV_SCP_NAME, > + .desc = "System Control Processor", > + }, > + { > + .id = EC_FEATURE_TOUCHPAD, > + .name = CROS_EC_DEV_TP_NAME, > + .desc = "Touchpad", > + }, > +}; > + > static int cros_ec_check_features(struct cros_ec_dev *ec, int feature) > { > struct cros_ec_command *msg; > @@ -278,6 +313,7 @@ static int ec_device_probe(struct platform_device *pdev) > struct device *dev = &pdev->dev; > struct cros_ec_platform *ec_platform = dev_get_platdata(dev); > struct cros_ec_dev *ec = kzalloc(sizeof(*ec), GFP_KERNEL); > + int i; > > if (!ec) > return retval; > @@ -290,47 +326,20 @@ static int ec_device_probe(struct platform_device *pdev) > ec->features[1] = -1U; /* Not cached yet */ > device_initialize(&ec->class_dev); > > - /* Check whether this is actually a Fingerprint MCU rather than an EC */ > - if (cros_ec_check_features(ec, EC_FEATURE_FINGERPRINT)) { > - dev_info(dev, "CrOS Fingerprint MCU detected.\n"); > - /* > - * Help userspace differentiating ECs from FP MCU, > - * regardless of the probing order. > - */ > - ec_platform->ec_name = CROS_EC_DEV_FP_NAME; > - } > - > - /* > - * Check whether this is actually an Integrated Sensor Hub (ISH) > - * rather than an EC. > - */ > - if (cros_ec_check_features(ec, EC_FEATURE_ISH)) { > - dev_info(dev, "CrOS ISH MCU detected.\n"); > - /* > - * Help userspace differentiating ECs from ISH MCU, > - * regardless of the probing order. > - */ > - ec_platform->ec_name = CROS_EC_DEV_ISH_NAME; > - } > - > - /* Check whether this is actually a Touchpad MCU rather than an EC */ > - if (cros_ec_check_features(ec, EC_FEATURE_TOUCHPAD)) { > - dev_info(dev, "CrOS Touchpad MCU detected.\n"); > + for (i = 0; i < ARRAY_SIZE(cros_mcu_devices); i++) { > /* > - * Help userspace differentiating ECs from TP MCU, > - * regardless of the probing order. > + * Check whether this is actually a dedicated MCU rather > + * than an standard EC. > */ > - ec_platform->ec_name = CROS_EC_DEV_TP_NAME; > - } > - > - /* Check whether this is actually a SCP rather than an EC. */ > - if (cros_ec_check_features(ec, EC_FEATURE_SCP)) { > - dev_info(dev, "CrOS SCP MCU detected.\n"); > - /* > - * Help userspace differentiating ECs from SCP, > - * regardless of the probing order. > - */ > - ec_platform->ec_name = CROS_EC_DEV_SCP_NAME; > + if (cros_ec_check_features(ec, cros_mcu_devices[i].id)) { > + dev_info(dev, "CrOS %s MCU detected\n", > + cros_mcu_devices[i].desc); > + /* > + * Help userspace differentiating ECs from other MCU, > + * regardless of the probing order. > + */ > + ec_platform->ec_name = cros_mcu_devices[i].name;
I assume by "dedicated MCU", you mean it can only support one of these at a time? If so, please make that clear by adding a break statement once the MCU type has been determined. > + } > } > > /* -- Lee Jones [李琼斯] Linaro Services Technical Lead Linaro.org │ Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog