aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb
diff options
authorJameson Thies <jthies@google.com>2025-02-04 02:45:59 +0000
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2025-02-14 09:29:07 +0100
commit7f7283183c62411ea50730b3d0728fedd9aceb21 (patch)
tree63e8189ef195c867feee8e76bc45c07f5d122fdc /drivers/usb
parentdcba69711fff8af4370cb4c00460db0bf47c7093 (diff)
downloadath-7f7283183c62411ea50730b3d0728fedd9aceb21.tar.gz
usb: typec: ucsi: resume work after EC init
A manual EC sysjump will restart the PPM and break communication with the UCSI driver by disabling notifications in the initial PPM state. Update cros_ec_ucsi to listen for PPM init events and treat them as a system resume to re-establish communication with the PPM (ChromeOS EC). Signed-off-by: Jameson Thies <jthies@google.com> Reviewed-by: Ɓukasz Bartosik <ukaszb@chromium.org> Reviewed-by: Benson Leung <bleung@chromium.org> Link: https://lore.kernel.org/r/20250204024600.4138776-3-jthies@google.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/typec/ucsi/cros_ec_ucsi.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/drivers/usb/typec/ucsi/cros_ec_ucsi.c b/drivers/usb/typec/ucsi/cros_ec_ucsi.c
index 744f0709a40ed..4ec1c6d223109 100644
--- a/drivers/usb/typec/ucsi/cros_ec_ucsi.c
+++ b/drivers/usb/typec/ucsi/cros_ec_ucsi.c
@@ -206,12 +206,19 @@ static int cros_ucsi_event(struct notifier_block *nb,
{
struct cros_ucsi_data *udata = container_of(nb, struct cros_ucsi_data, nb);
- if (!(host_event & PD_EVENT_PPM))
- return NOTIFY_OK;
+ if (host_event & PD_EVENT_INIT) {
+ /* Late init event received from ChromeOS EC. Treat this as a
+ * system resume to re-enable communication with the PPM.
+ */
+ dev_dbg(udata->dev, "Late PD init received\n");
+ ucsi_resume(udata->ucsi);
+ }
- dev_dbg(udata->dev, "UCSI notification received\n");
- flush_work(&udata->work);
- schedule_work(&udata->work);
+ if (host_event & PD_EVENT_PPM) {
+ dev_dbg(udata->dev, "UCSI notification received\n");
+ flush_work(&udata->work);
+ schedule_work(&udata->work);
+ }
return NOTIFY_OK;
}