]> Gentwo Git Trees - linux/.git/commitdiff
platform/chrome: cros_usbpd_notify: defer probe when parent EC driver isn't ready
authorJameson Thies <jthies@google.com>
Tue, 7 Oct 2025 00:40:43 +0000 (00:40 +0000)
committerTzung-Bi Shih <tzungbi@kernel.org>
Mon, 13 Oct 2025 02:53:44 +0000 (02:53 +0000)
The cros-usbpd-notify-acpi probe currently does not exit when it fails
to get a pointer to the ChromeOS EC device. It is expected behavior on
older devices, where GOOG0004 is not a parent of GOOG0003.

Update the cros-usbpd-notify-acpi probe to check for a GOOG0004 parent
fwnode. If the device has correct device hierarchy and fails to get an
EC device pointer, defer the probe function.

Signed-off-by: Jameson Thies <jthies@google.com>
Reviewed-by: Benson Leung <bleung@chromium.org>
Link: https://lore.kernel.org/r/20251007004043.4109957-1-jthies@google.com
Signed-off-by: Tzung-Bi Shih <tzungbi@kernel.org>
drivers/platform/chrome/cros_usbpd_notify.c

index 313d2bcd577bdaa9d09c605c884c1c29c64c8d02..c90174360004c7061c5b3b10ece81a5c4fa6f00e 100644 (file)
@@ -6,6 +6,7 @@
  */
 
 #include <linux/acpi.h>
+#include <linux/fwnode.h>
 #include <linux/mod_devicetable.h>
 #include <linux/module.h>
 #include <linux/platform_data/cros_ec_proto.h>
@@ -15,6 +16,7 @@
 #define DRV_NAME "cros-usbpd-notify"
 #define DRV_NAME_PLAT_ACPI "cros-usbpd-notify-acpi"
 #define ACPI_DRV_NAME "GOOG0003"
+#define CREC_DRV_NAME "GOOG0004"
 
 static BLOCKING_NOTIFIER_HEAD(cros_usbpd_notifier_list);
 
@@ -98,8 +100,9 @@ static int cros_usbpd_notify_probe_acpi(struct platform_device *pdev)
 {
        struct cros_usbpd_notify_data *pdnotify;
        struct device *dev = &pdev->dev;
-       struct acpi_device *adev;
+       struct acpi_device *adev, *parent_adev;
        struct cros_ec_device *ec_dev;
+       struct fwnode_handle *parent_fwnode;
        acpi_status status;
 
        adev = ACPI_COMPANION(dev);
@@ -114,8 +117,18 @@ static int cros_usbpd_notify_probe_acpi(struct platform_device *pdev)
                /*
                 * We continue even for older devices which don't have the
                 * correct device heirarchy, namely, GOOG0003 is a child
-                * of GOOG0004.
+                * of GOOG0004. If GOOG0003 is a child of GOOG0004 and we
+                * can't get a pointer to the Chrome EC device, defer the
+                * probe function.
                 */
+               parent_fwnode = fwnode_get_parent(dev->fwnode);
+               if (parent_fwnode) {
+                       parent_adev = to_acpi_device_node(parent_fwnode);
+                       if (parent_adev &&
+                           acpi_dev_hid_match(parent_adev, CREC_DRV_NAME)) {
+                               return -EPROBE_DEFER;
+                       }
+               }
                dev_warn(dev, "Couldn't get Chrome EC device pointer.\n");
        }