]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
mfd: cros_ec: Don't add cros_ec_ucsi if it is defined in OF or ACPI
authorJameson Thies <jthies@google.com>
Fri, 3 Apr 2026 22:22:53 +0000 (22:22 +0000)
committerLee Jones <lee@kernel.org>
Wed, 17 Jun 2026 10:30:48 +0000 (11:30 +0100)
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 mfd. cros_ec_ucsi will load from the OF or ACPI node.

Signed-off-by: Jameson Thies <jthies@google.com>
Reviewed-by: Benson Leung <bleung@chromium.org>
Reviewed-by: Abhishek Pandit-Subedi <abhishekpandit@chromium.org>
Link: https://patch.msgid.link/20260403222253.1888991-2-jthies@google.com
Signed-off-by: Lee Jones <lee@kernel.org>
drivers/mfd/cros_ec_dev.c

index 39430dd44e30cd76629b532a5724f86aa55bf1ad..70d64b7c624300077b800a58e0ddc8626ee0f016 100644 (file)
@@ -5,6 +5,7 @@
  * Copyright (C) 2014 Google, Inc.
  */
 
+#include <linux/acpi.h>
 #include <linux/dmi.h>
 #include <linux/kconfig.h>
 #include <linux/mfd/core.h>
@@ -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,
@@ -264,6 +260,23 @@ 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) &&
+           !acpi_dev_found("GOOG0021") &&
+           !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.