usb: typec: tcpm: fix create duplicate source-capabilities file
The kernel will dump in the below cases:
sysfs: cannot create duplicate filename
'/devices/virtual/usb_power_delivery/pd1/source-capabilities'
1. After soft reset has completed, an Explicit Contract negotiation occurs.
The sink device will receive source capabilitys again. This will cause
a duplicate source-capabilities file be created.
2. Power swap twice on a device that is initailly sink role.
This will unregister existing capabilities when above cases occurs.
Fixes: 8203d26905
("usb: typec: tcpm: Register USB Power Delivery Capabilities")
cc: <stable@vger.kernel.org>
Signed-off-by: Xu Yang <xu.yang_2@nxp.com>
Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Link: https://lore.kernel.org/r/20230215054951.238394-1-xu.yang_2@nxp.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
6c67ed9ad9
commit
a826492fc9
|
@ -4570,6 +4570,9 @@ static void run_state_machine(struct tcpm_port *port)
|
|||
case SOFT_RESET:
|
||||
port->message_id = 0;
|
||||
port->rx_msgid = -1;
|
||||
/* remove existing capabilities */
|
||||
usb_power_delivery_unregister_capabilities(port->partner_source_caps);
|
||||
port->partner_source_caps = NULL;
|
||||
tcpm_pd_send_control(port, PD_CTRL_ACCEPT);
|
||||
tcpm_ams_finish(port);
|
||||
if (port->pwr_role == TYPEC_SOURCE) {
|
||||
|
@ -4589,6 +4592,9 @@ static void run_state_machine(struct tcpm_port *port)
|
|||
case SOFT_RESET_SEND:
|
||||
port->message_id = 0;
|
||||
port->rx_msgid = -1;
|
||||
/* remove existing capabilities */
|
||||
usb_power_delivery_unregister_capabilities(port->partner_source_caps);
|
||||
port->partner_source_caps = NULL;
|
||||
if (tcpm_pd_send_control(port, PD_CTRL_SOFT_RESET))
|
||||
tcpm_set_state_cond(port, hard_reset_state(port), 0);
|
||||
else
|
||||
|
@ -4718,6 +4724,9 @@ static void run_state_machine(struct tcpm_port *port)
|
|||
tcpm_set_state(port, SNK_STARTUP, 0);
|
||||
break;
|
||||
case PR_SWAP_SNK_SRC_SINK_OFF:
|
||||
/* will be source, remove existing capabilities */
|
||||
usb_power_delivery_unregister_capabilities(port->partner_source_caps);
|
||||
port->partner_source_caps = NULL;
|
||||
/*
|
||||
* Prevent vbus discharge circuit from turning on during PR_SWAP
|
||||
* as this is not a disconnect.
|
||||
|
|
Loading…
Reference in New Issue