On Wed, Oct 01, 2025 at 07:33:43PM +0000, Jameson Thies wrote: > On devices with a UCSI PPM in the EC, check for cros_ec_ucsi to be > defined in the OF device tree or an ACPI node. If it is defined by > either OF or ACPI, it does not need to be added as a subdevice of > cros_ec_dev. > > Signed-off-by: Jameson Thies Reviewed-by: Benson Leung > --- > drivers/mfd/cros_ec_dev.c | 40 ++++++++++++++++++++++++++++++++++----- > 1 file changed, 35 insertions(+), 5 deletions(-) > > diff --git a/drivers/mfd/cros_ec_dev.c b/drivers/mfd/cros_ec_dev.c > index dc80a272726b..b0523f6541d2 100644 > --- a/drivers/mfd/cros_ec_dev.c > +++ b/drivers/mfd/cros_ec_dev.c > @@ -5,6 +5,7 @@ > * Copyright (C) 2014 Google, Inc. > */ > > +#include > #include > #include > #include > @@ -131,11 +132,6 @@ static const struct cros_feature_to_cells cros_subdevices[] = { > .mfd_cells = cros_ec_rtc_cells, > .num_cells = ARRAY_SIZE(cros_ec_rtc_cells), > }, > - { > - .id = EC_FEATURE_UCSI_PPM, > - .mfd_cells = cros_ec_ucsi_cells, > - .num_cells = ARRAY_SIZE(cros_ec_ucsi_cells), > - }, > { > .id = EC_FEATURE_HANG_DETECT, > .mfd_cells = cros_ec_wdt_cells, > @@ -177,6 +173,16 @@ static const struct mfd_cell cros_ec_vbc_cells[] = { > { .name = "cros-ec-vbc", } > }; > > +static int ucsi_acpi_match(struct device *dev, const void *data) > +{ > + struct acpi_device_id ucsi_acpi_device_ids[] = { > + { "GOOG0021", 0 }, > + {"", 0}, > + }; > + return !!acpi_match_device(ucsi_acpi_device_ids, dev); > +} > + > + > static void cros_ec_class_release(struct device *dev) > { > kfree(to_cros_ec_dev(dev)); > @@ -264,6 +270,30 @@ static int ec_device_probe(struct platform_device *pdev) > } > } > > + /* > + * FW nodes can load cros_ec_ucsi, but early PDC devices did not define > + * the required nodes. On PDC systems without FW nodes for cros_ec_ucsi, > + * the driver should be added as an mfd subdevice. > + */ > + if (cros_ec_check_features(ec, EC_FEATURE_USB_PD) && > + cros_ec_check_features(ec, EC_FEATURE_UCSI_PPM)) { > + struct device *acpi_dev = device_find_child(ec->ec_dev->dev, > + NULL, > + ucsi_acpi_match); > + > + if (!!acpi_dev) { > + put_device(acpi_dev); > + } else if (!of_find_compatible_node(NULL, NULL, > + "google,cros-ec-ucsi")) { > + retval = mfd_add_hotplug_devices( > + ec->dev, cros_ec_ucsi_cells, > + ARRAY_SIZE(cros_ec_ucsi_cells)); > + if (retval) > + dev_warn(ec->dev, > + "failed to add cros_ec_ucsi: %d\n", retval); > + } > + } > + > /* > * UCSI provides power supply information so we don't need to separately > * load the cros_usbpd_charger driver. > -- > 2.51.0.618.g983fd99d29-goog >