This is a short series that reorganizes when mux configuration occurs
during Type C port updates. The first 2 patches are minor refactors
which move some of the mux update logic to within
cros_typec_configure_mux(). The third patch moves
cros_typec_configure_mux() itself to be earlier in
cros_typec_port_update().
The final patch updates the stashed mux flag when a partner removal has
occured.
v1:
https://lore.kernel.org/chrome-platform/20220207214026.1526151-1-pmalani@chromium.org/
Changes in v2:
- Addressed minor comments (unrelated variable initialization. variable
name change, return value can be 0).
Prashant Malani (4):
platform/chrome: cros_ec_typec: Move mux flag checks
platform/chrome: cros_ec_typec: Get mux state inside configure_mux
platform/chrome: cros_ec_typec: Configure muxes at start of port
update
platform/chrome: cros_ec_typec: Update mux flags during partner
removal
drivers/platform/chrome/cros_ec_typec.c | 76 +++++++++++--------------
1 file changed, 34 insertions(+), 42 deletions(-)
--
2.35.0.263.gb82422642f-goog
Move mux and role flag checks inside of cros_typec_configure_mux(),
which is a more logical location for them.
Signed-off-by: Prashant Malani <redacted>
---
Changes in v2:
- Removed unrelated "ret" variable initialization.
drivers/platform/chrome/cros_ec_typec.c | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
@@ -521,6 +521,13 @@ static int cros_typec_configure_mux(struct cros_typec_data *typec, int port_num,enumtypec_orientationorientation;intret;+/* No change needs to be made, let's exit early. */+if(port->mux_flags==mux_flags&&port->role==pd_ctrl->role)+return0;++port->mux_flags=mux_flags;+port->role=pd_ctrl->role;+if(mux_flags==USB_PD_MUX_NONE){ret=cros_typec_usb_disconnect_state(port);gotomux_ack;
@@ -983,13 +990,6 @@ static int cros_typec_port_update(struct cros_typec_data *typec, int port_num)return0;}-/* No change needs to be made, let's exit early. */-if(typec->ports[port_num]->mux_flags==mux_resp.flags&&-typec->ports[port_num]->role==resp.role)-return0;--typec->ports[port_num]->mux_flags=mux_resp.flags;-typec->ports[port_num]->role=resp.role;ret=cros_typec_configure_mux(typec,port_num,mux_resp.flags,&resp);if(ret)dev_warn(typec->dev,"Configure muxes failed, err = %d\n",ret);
Move the function which gets current mux state inside the
cros_typec_configure_mux() function. It is better to group those
bits of functionality together, and it makes it easier to move around
cros_typec_configure_mux() later.
While we are doing this, also inline the cros_typec_get_mux_info() inside
of cros_typec_configure_mux().
Signed-off-by: Prashant Malani <redacted>
---
Changes in v2:
- Changed "mux_resp" variable to "resp".
drivers/platform/chrome/cros_ec_typec.c | 55 +++++++++++--------------
1 file changed, 23 insertions(+), 32 deletions(-)
@@ -513,27 +513,38 @@ static int cros_typec_enable_usb4(struct cros_typec_data *typec,}staticintcros_typec_configure_mux(structcros_typec_data*typec,intport_num,-uint8_tmux_flags,structec_response_usb_pd_control_v2*pd_ctrl){structcros_typec_port*port=typec->ports[port_num];+structec_response_usb_pd_mux_inforesp;+structec_params_usb_pd_mux_inforeq={+.port=port_num,+};structec_params_usb_pd_mux_ackmux_ack;enumtypec_orientationorientation;intret;+ret=cros_ec_command(typec->ec,0,EC_CMD_USB_PD_MUX_INFO,+&req,sizeof(req),&resp,sizeof(resp));+if(ret<0){+dev_warn(typec->dev,"Failed to get mux info for port: %d, err = %d\n",+port_num,ret);+returnret;+}+/* No change needs to be made, let's exit early. */-if(port->mux_flags==mux_flags&&port->role==pd_ctrl->role)+if(port->mux_flags==resp.flags&&port->role==pd_ctrl->role)return0;-port->mux_flags=mux_flags;+port->mux_flags=resp.flags;port->role=pd_ctrl->role;-if(mux_flags==USB_PD_MUX_NONE){+if(port->mux_flags==USB_PD_MUX_NONE){ret=cros_typec_usb_disconnect_state(port);gotomux_ack;}-if(mux_flags&USB_PD_MUX_POLARITY_INVERTED)+if(port->mux_flags&USB_PD_MUX_POLARITY_INVERTED)orientation=TYPEC_ORIENTATION_REVERSE;elseorientation=TYPEC_ORIENTATION_NORMAL;
@@ -548,22 +559,22 @@ static int cros_typec_configure_mux(struct cros_typec_data *typec, int port_num,if(ret)returnret;-if(mux_flags&USB_PD_MUX_USB4_ENABLED){+if(port->mux_flags&USB_PD_MUX_USB4_ENABLED){ret=cros_typec_enable_usb4(typec,port_num,pd_ctrl);-}elseif(mux_flags&USB_PD_MUX_TBT_COMPAT_ENABLED){+}elseif(port->mux_flags&USB_PD_MUX_TBT_COMPAT_ENABLED){ret=cros_typec_enable_tbt(typec,port_num,pd_ctrl);-}elseif(mux_flags&USB_PD_MUX_DP_ENABLED){+}elseif(port->mux_flags&USB_PD_MUX_DP_ENABLED){ret=cros_typec_enable_dp(typec,port_num,pd_ctrl);-}elseif(mux_flags&USB_PD_MUX_SAFE_MODE){+}elseif(port->mux_flags&USB_PD_MUX_SAFE_MODE){ret=cros_typec_usb_safe_state(port);-}elseif(mux_flags&USB_PD_MUX_USB_ENABLED){+}elseif(port->mux_flags&USB_PD_MUX_USB_ENABLED){port->state.alt=NULL;port->state.mode=TYPEC_STATE_USB;ret=typec_mux_set(port->mux,&port->state);}else{dev_dbg(typec->dev,"Unrecognized mode requested, mux flags: %x\n",-mux_flags);+port->mux_flags);}mux_ack:
@@ -946,7 +946,6 @@ static int cros_typec_port_update(struct cros_typec_data *typec, int port_num){structec_params_usb_pd_controlreq;structec_response_usb_pd_control_v2resp;-structec_response_usb_pd_mux_infomux_resp;intret;if(port_num<0||port_num>=typec->num_ports){
@@ -982,15 +981,7 @@ static int cros_typec_port_update(struct cros_typec_data *typec, int port_num)cros_typec_handle_status(typec,port_num);/* Update the switches if they exist, according to requested state */-ret=cros_typec_get_mux_info(typec,port_num,&mux_resp);-if(ret<0){-dev_warn(typec->dev,-"Failed to get mux info for port: %d, err = %d\n",-port_num,ret);-return0;-}--ret=cros_typec_configure_mux(typec,port_num,mux_resp.flags,&resp);+ret=cros_typec_configure_mux(typec,port_num,&resp);if(ret)dev_warn(typec->dev,"Configure muxes failed, err = %d\n",ret);
There are situations where the mux state reported by the Embedded
Controller (EC), might lag the partner "connected" state. So, the mux
state might still suggest that a partner is connected, while the PD
"connected" state, being in Try.SNK (for example) suggests that the
partner is disconnected.
In such a scenario, we will end up sending a disconnect command to the
mux driver, followed by a connect command, since the mux is configured
later. Avoid this by configuring the mux before
registering/disconnecting a partner.
Signed-off-by: Prashant Malani <redacted>
---
Changes in v2:
- Change return at end of port_update() to just return 0.
drivers/platform/chrome/cros_ec_typec.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
@@ -965,6 +965,11 @@ static int cros_typec_port_update(struct cros_typec_data *typec, int port_num)if(ret<0)returnret;+/* Update the switches if they exist, according to requested state */+ret=cros_typec_configure_mux(typec,port_num,&resp);+if(ret)+dev_warn(typec->dev,"Configure muxes failed, err = %d\n",ret);+dev_dbg(typec->dev,"Enabled %d: 0x%hhx\n",port_num,resp.enabled);dev_dbg(typec->dev,"Role %d: 0x%hhx\n",port_num,resp.role);dev_dbg(typec->dev,"Polarity %d: 0x%hhx\n",port_num,resp.polarity);
@@ -980,12 +985,7 @@ static int cros_typec_port_update(struct cros_typec_data *typec, int port_num)if(typec->typec_cmd_supported)cros_typec_handle_status(typec,port_num);-/* Update the switches if they exist, according to requested state */-ret=cros_typec_configure_mux(typec,port_num,&resp);-if(ret)-dev_warn(typec->dev,"Configure muxes failed, err = %d\n",ret);--returnret;+return0;}staticintcros_typec_get_cmd_version(structcros_typec_data*typec)
In cros_typec_remove_partner(), we call
cros_typec_usb_disconnect_state() which sets the switches/muxes to be in
a disconnected state. This also happens in cros_typec_configure_mux().
However, unlike there, here the mux_flags variable hasn't been updated
to reflect that a disconnection has occurred. Update the flag here
accordingly.
Signed-off-by: Prashant Malani <redacted>
---
Changes in v2:
- No changes.
drivers/platform/chrome/cros_ec_typec.c | 1 +
1 file changed, 1 insertion(+)
On Tue, Feb 08, 2022 at 06:47:24PM +0000, Prashant Malani wrote:
In cros_typec_remove_partner(), we call
cros_typec_usb_disconnect_state() which sets the switches/muxes to be in
a disconnected state. This also happens in cros_typec_configure_mux().
However, unlike there, here the mux_flags variable hasn't been updated
to reflect that a disconnection has occurred. Update the flag here
accordingly.
Signed-off-by: Prashant Malani <redacted>
On Tue, Feb 08, 2022 at 06:47:20PM +0000, Prashant Malani wrote:
Move the function which gets current mux state inside the
cros_typec_configure_mux() function. It is better to group those
bits of functionality together, and it makes it easier to move around
cros_typec_configure_mux() later.
While we are doing this, also inline the cros_typec_get_mux_info() inside
of cros_typec_configure_mux().
Signed-off-by: Prashant Malani <redacted>
On Tue, Feb 08, 2022 at 06:47:18PM +0000, Prashant Malani wrote:
Move mux and role flag checks inside of cros_typec_configure_mux(),
which is a more logical location for them.
Signed-off-by: Prashant Malani <redacted>
Hi Prashant,
On Tue, Feb 08, 2022 at 06:47:22PM +0000, Prashant Malani wrote:
There are situations where the mux state reported by the Embedded
Controller (EC), might lag the partner "connected" state. So, the mux
state might still suggest that a partner is connected, while the PD
"connected" state, being in Try.SNK (for example) suggests that the
partner is disconnected.
In such a scenario, we will end up sending a disconnect command to the
mux driver, followed by a connect command, since the mux is configured
later. Avoid this by configuring the mux before
registering/disconnecting a partner.
Signed-off-by: Prashant Malani <redacted>
Reviewed-by: Benson Leung <bleung@chromium.org>
quoted hunk
---
Changes in v2:
- Change return at end of port_update() to just return 0.
drivers/platform/chrome/cros_ec_typec.c | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
@@ -965,6 +965,11 @@ static int cros_typec_port_update(struct cros_typec_data *typec, int port_num)if(ret<0)returnret;+/* Update the switches if they exist, according to requested state */+ret=cros_typec_configure_mux(typec,port_num,&resp);+if(ret)+dev_warn(typec->dev,"Configure muxes failed, err = %d\n",ret);+dev_dbg(typec->dev,"Enabled %d: 0x%hhx\n",port_num,resp.enabled);dev_dbg(typec->dev,"Role %d: 0x%hhx\n",port_num,resp.role);dev_dbg(typec->dev,"Polarity %d: 0x%hhx\n",port_num,resp.polarity);
@@ -980,12 +985,7 @@ static int cros_typec_port_update(struct cros_typec_data *typec, int port_num)if(typec->typec_cmd_supported)cros_typec_handle_status(typec,port_num);-/* Update the switches if they exist, according to requested state */-ret=cros_typec_configure_mux(typec,port_num,&resp);-if(ret)-dev_warn(typec->dev,"Configure muxes failed, err = %d\n",ret);--returnret;+return0;}staticintcros_typec_get_cmd_version(structcros_typec_data*typec)
--
2.35.0.263.gb82422642f-goog
--
Benson Leung
Staff Software Engineer
Chrome OS Kernel
Google Inc.
bleung@google.com
Chromium OS Project
bleung@chromium.org
Hello:
This series was applied to chrome-platform/linux.git (for-kernelci)
by Prashant Malani [off-list ref]:
On Tue, 8 Feb 2022 18:47:16 +0000 you wrote:
This is a short series that reorganizes when mux configuration occurs
during Type C port updates. The first 2 patches are minor refactors
which move some of the mux update logic to within
cros_typec_configure_mux(). The third patch moves
cros_typec_configure_mux() itself to be earlier in
cros_typec_port_update().
[...]
Hello:
This series was applied to chrome-platform/linux.git (for-next)
by Prashant Malani [off-list ref]:
On Tue, 8 Feb 2022 18:47:16 +0000 you wrote:
This is a short series that reorganizes when mux configuration occurs
during Type C port updates. The first 2 patches are minor refactors
which move some of the mux update logic to within
cros_typec_configure_mux(). The third patch moves
cros_typec_configure_mux() itself to be earlier in
cros_typec_port_update().
[...]