+Benjamin On Tue, Nov 10, 2020 at 10:31:36AM +0200, Heikki Krogerus wrote: > Hi Vladimir, > > On Tue, Nov 10, 2020 at 03:02:40AM +1000, Vladimir Yerilov wrote: > > Forwarding to y'all. > > > > Just some extra info: > > `cat /sys/class/power_supply/ucsi-source-psy-USBC000:001/online` shows > > zero when the cable is unplugged, same for > > `/sys/class/power_supply/ADP0/online` status, but that means nothing > > for upower and all system services considering that there a power > > source available and not setting display brightness and other > > parameters due to that. > > Checked in Ubuntu as well, same situation with their kernel 5.8. > > Please try to avoid top-posting. > > It seems that the ucsi psy does not report any changes. That is one > obvious bug that I can see. > > I'm attaching a patch to fix that. Can you give it a try? > > thanks, > > -- > heikki > From 3017dd8d8f9b8bca58d5ac80fff00d7af80e87bd Mon Sep 17 00:00:00 2001 > From: Heikki Krogerus <heikki.krogerus@xxxxxxxxxxxxxxx> > Date: Tue, 10 Nov 2020 11:25:42 +0300 > Subject: [PATCH] usb: typec: ucsi: Send power supply change notifications > > When the ucsi power supply goes online/offline, and when the > power levels change, the power supply class needs to be > notified so it can inform the user space. > > Fixes: 992a60ed0d5e ("usb: typec: ucsi: register with power_supply class") > Signed-off-by: Heikki Krogerus <heikki.krogerus@xxxxxxxxxxxxxxx> > --- > drivers/usb/typec/ucsi/psy.c | 9 +++++++++ > drivers/usb/typec/ucsi/ucsi.c | 7 ++++++- > drivers/usb/typec/ucsi/ucsi.h | 2 ++ > 3 files changed, 17 insertions(+), 1 deletion(-) > > diff --git a/drivers/usb/typec/ucsi/psy.c b/drivers/usb/typec/ucsi/psy.c > index 26ed0b520749a..571a51e162346 100644 > --- a/drivers/usb/typec/ucsi/psy.c > +++ b/drivers/usb/typec/ucsi/psy.c > @@ -238,4 +238,13 @@ void ucsi_unregister_port_psy(struct ucsi_connector *con) > return; > > power_supply_unregister(con->psy); > + con->psy = NULL; > +} > + > +void ucsi_port_psy_changed(struct ucsi_connector *con) > +{ > + if (IS_ERR_OR_NULL(con->psy)) > + return; > + > + power_supply_changed(con->psy); > } > diff --git a/drivers/usb/typec/ucsi/ucsi.c b/drivers/usb/typec/ucsi/ucsi.c > index 758b988ac518a..51a570d40a42e 100644 > --- a/drivers/usb/typec/ucsi/ucsi.c > +++ b/drivers/usb/typec/ucsi/ucsi.c > @@ -643,8 +643,10 @@ static void ucsi_handle_connector_change(struct work_struct *work) > role = !!(con->status.flags & UCSI_CONSTAT_PWR_DIR); > > if (con->status.change & UCSI_CONSTAT_POWER_OPMODE_CHANGE || > - con->status.change & UCSI_CONSTAT_POWER_LEVEL_CHANGE) > + con->status.change & UCSI_CONSTAT_POWER_LEVEL_CHANGE) { > ucsi_pwr_opmode_change(con); > + ucsi_port_psy_changed(con); > + } > > if (con->status.change & UCSI_CONSTAT_POWER_DIR_CHANGE) { > typec_set_pwr_role(con->port, role); > @@ -674,6 +676,8 @@ static void ucsi_handle_connector_change(struct work_struct *work) > ucsi_register_partner(con); > else > ucsi_unregister_partner(con); > + > + ucsi_port_psy_changed(con); > } > > if (con->status.change & UCSI_CONSTAT_CAM_CHANGE) { > @@ -994,6 +998,7 @@ static int ucsi_register_port(struct ucsi *ucsi, int index) > !!(con->status.flags & UCSI_CONSTAT_PWR_DIR)); > ucsi_pwr_opmode_change(con); > ucsi_register_partner(con); > + ucsi_port_psy_changed(con); > } > > if (con->partner) { > diff --git a/drivers/usb/typec/ucsi/ucsi.h b/drivers/usb/typec/ucsi/ucsi.h > index cba6f77bea61b..b7a92f2460507 100644 > --- a/drivers/usb/typec/ucsi/ucsi.h > +++ b/drivers/usb/typec/ucsi/ucsi.h > @@ -340,9 +340,11 @@ int ucsi_resume(struct ucsi *ucsi); > #if IS_ENABLED(CONFIG_POWER_SUPPLY) > int ucsi_register_port_psy(struct ucsi_connector *con); > void ucsi_unregister_port_psy(struct ucsi_connector *con); > +void ucsi_port_psy_changed(struct ucsi_connector *con); > #else > static inline int ucsi_register_port_psy(struct ucsi_connector *con) { return 0; } > static inline void ucsi_unregister_port_psy(struct ucsi_connector *con) { } > +static inline void ucsi_port_psy_changed(struct ucsi_connector *con) { } > #endif /* CONFIG_POWER_SUPPLY */ > > #if IS_ENABLED(CONFIG_TYPEC_DP_ALTMODE) > -- > 2.28.0 > -- heikki