platform/chrome: cros_usbpd_notify: defer probe when parent EC driver isn't ready

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>
This commit is contained in:
Jameson Thies 2025-10-07 00:40:43 +00:00 committed by Tzung-Bi Shih
parent 3a86608788
commit e4ee0bb077
1 changed files with 15 additions and 2 deletions

View 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");
}