Re: Fwd: Power supply detection issue caused by ucsi_psy?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



+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



[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux