summaryrefslogtreecommitdiff
path: root/driver/retimer
diff options
context:
space:
mode:
authorDiana Z <dzigterman@chromium.org>2021-07-21 09:56:40 -0600
committerCommit Bot <commit-bot@chromium.org>2021-08-14 06:06:39 +0000
commitab1cdf1648d390619848f4f4f901b14aeee75244 (patch)
tree74b814ec98390eabb46c4a012adbc501c70e9df2 /driver/retimer
parent80b43435ca89510e985481b725a470566fb65a05 (diff)
downloadchrome-ec-ab1cdf1648d390619848f4f4f901b14aeee75244.tar.gz
USB MUX: Generalize mux ACK
Currently, only the virtual mux driver uses the mux ACK feature, but the actual wait for the host command ACK is a part of the usb_mux general code. Generalize this mux ACK wait so it's available if needed in the future for more muxes. Additionally, moving this wait out of the mux set will allow us to lock the muxes intelligently between tasks, without keeping the muxes locked during the inactive ACK wait. BRANCH=None BUG=b:172222942,b:186777984 TEST=tast typec.Mode*.manual on voxel Signed-off-by: Diana Z <dzigterman@chromium.org> Change-Id: I61a043425a482cc6f3170548c888d91ec20c2a82 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3078411 Reviewed-by: Keith Short <keithshort@chromium.org>
Diffstat (limited to 'driver/retimer')
-rw-r--r--driver/retimer/bb_retimer.c6
-rw-r--r--driver/retimer/kb800x.c6
-rw-r--r--driver/retimer/nb7v904m.c6
-rw-r--r--driver/retimer/pi3dpx1207.c6
-rw-r--r--driver/retimer/ps8802.c6
-rw-r--r--driver/retimer/ps8818.c6
-rw-r--r--driver/retimer/tusb544.c6
7 files changed, 35 insertions, 7 deletions
diff --git a/driver/retimer/bb_retimer.c b/driver/retimer/bb_retimer.c
index 919e278a8b..43c67a95e1 100644
--- a/driver/retimer/bb_retimer.c
+++ b/driver/retimer/bb_retimer.c
@@ -379,12 +379,16 @@ __overridable int bb_retimer_reset(const struct usb_mux *me)
/**
* Driver interface functions
*/
-static int retimer_set_state(const struct usb_mux *me, mux_state_t mux_state)
+static int retimer_set_state(const struct usb_mux *me, mux_state_t mux_state,
+ bool *ack_required)
{
uint32_t set_retimer_con = 0;
uint8_t dp_pin_mode;
int port = me->usb_port;
+ /* This driver does not use host command ACKs */
+ *ack_required = false;
+
/*
* Bit 0: DATA_CONNECTION_PRESENT
* 0 - No connection present
diff --git a/driver/retimer/kb800x.c b/driver/retimer/kb800x.c
index 3fbb52cbc1..ad615a3532 100644
--- a/driver/retimer/kb800x.c
+++ b/driver/retimer/kb800x.c
@@ -376,10 +376,14 @@ static int kb800x_cio_init(const struct usb_mux *me, mux_state_t mux_state)
return kb800x_write(me, KB800X_REG_ORIENTATION, orientation);
}
-static int kb800x_set_state(const struct usb_mux *me, mux_state_t mux_state)
+static int kb800x_set_state(const struct usb_mux *me, mux_state_t mux_state,
+ bool *ack_required)
{
int rv;
+ /* This driver does not use host command ACKs */
+ *ack_required = false;
+
cached_mux_state[me->usb_port] = mux_state;
rv = kb800x_write(me, KB800X_REG_RESET, KB800X_RESET_MASK);
if (rv)
diff --git a/driver/retimer/nb7v904m.c b/driver/retimer/nb7v904m.c
index 18c7809e71..94e96230b2 100644
--- a/driver/retimer/nb7v904m.c
+++ b/driver/retimer/nb7v904m.c
@@ -147,12 +147,16 @@ static int nb7v904m_init(const struct usb_mux *me)
return rv;
}
-static int nb7v904m_set_mux(const struct usb_mux *me, mux_state_t mux_state)
+static int nb7v904m_set_mux(const struct usb_mux *me, mux_state_t mux_state,
+ bool *ack_required)
{
int rv = EC_SUCCESS;
int regval;
int flipped = !!(mux_state & USB_PD_MUX_POLARITY_INVERTED);
+ /* This driver does not use host command ACKs */
+ *ack_required = false;
+
/* Turn off redriver if it's not needed at all. */
if (mux_state == USB_PD_MUX_NONE)
return nb7v904m_enter_low_power_mode(me);
diff --git a/driver/retimer/pi3dpx1207.c b/driver/retimer/pi3dpx1207.c
index 9254c3d4bb..8829c508a1 100644
--- a/driver/retimer/pi3dpx1207.c
+++ b/driver/retimer/pi3dpx1207.c
@@ -90,7 +90,8 @@ static int pi3dpx1207_enter_low_power_mode(const struct usb_mux *me)
return EC_SUCCESS;
}
-static int pi3dpx1207_set_mux(const struct usb_mux *me, mux_state_t mux_state)
+static int pi3dpx1207_set_mux(const struct usb_mux *me, mux_state_t mux_state,
+ bool *ack_required)
{
int rv = EC_SUCCESS;
uint8_t mode_val = PI3DPX1207_MODE_WATCHDOG_EN;
@@ -98,6 +99,9 @@ static int pi3dpx1207_set_mux(const struct usb_mux *me, mux_state_t mux_state)
const int gpio_enable = pi3dpx1207_controls[port].enable_gpio;
const int gpio_dp_enable = pi3dpx1207_controls[port].dp_enable_gpio;
+ /* This driver does not use host command ACKs */
+ *ack_required = false;
+
/* USB */
if (mux_state & USB_PD_MUX_USB_ENABLED) {
gpio_or_ioex_set_level(gpio_enable, 1);
diff --git a/driver/retimer/ps8802.c b/driver/retimer/ps8802.c
index 7406d8c54e..9738123ace 100644
--- a/driver/retimer/ps8802.c
+++ b/driver/retimer/ps8802.c
@@ -215,11 +215,15 @@ static int ps8802_init(const struct usb_mux *me)
return EC_SUCCESS;
}
-static int ps8802_set_mux(const struct usb_mux *me, mux_state_t mux_state)
+static int ps8802_set_mux(const struct usb_mux *me, mux_state_t mux_state,
+ bool *ack_required)
{
int val;
int rv;
+ /* This driver does not use host command ACKs */
+ *ack_required = false;
+
if (chipset_in_state(CHIPSET_STATE_HARD_OFF))
return (mux_state == USB_PD_MUX_NONE) ? EC_SUCCESS
: EC_ERROR_NOT_POWERED;
diff --git a/driver/retimer/ps8818.c b/driver/retimer/ps8818.c
index 65abcddd23..2f8e353099 100644
--- a/driver/retimer/ps8818.c
+++ b/driver/retimer/ps8818.c
@@ -98,11 +98,15 @@ int ps8818_i2c_field_update8(const struct usb_mux *me, int page, int offset,
return rv;
}
-static int ps8818_set_mux(const struct usb_mux *me, mux_state_t mux_state)
+static int ps8818_set_mux(const struct usb_mux *me, mux_state_t mux_state,
+ bool *ack_required)
{
int rv;
int val = 0;
+ /* This driver does not use host command ACKs */
+ *ack_required = false;
+
if (chipset_in_state(CHIPSET_STATE_HARD_OFF))
return (mux_state == USB_PD_MUX_NONE) ? EC_SUCCESS
: EC_ERROR_NOT_POWERED;
diff --git a/driver/retimer/tusb544.c b/driver/retimer/tusb544.c
index e76e5bd976..9de543fd42 100644
--- a/driver/retimer/tusb544.c
+++ b/driver/retimer/tusb544.c
@@ -58,11 +58,15 @@ static int tusb544_init(const struct usb_mux *me)
return EC_SUCCESS;
}
-static int tusb544_set_mux(const struct usb_mux *me, mux_state_t mux_state)
+static int tusb544_set_mux(const struct usb_mux *me, mux_state_t mux_state,
+ bool *ack_required)
{
int reg;
int rv;
+ /* This driver does not use host command ACKs */
+ *ack_required = false;
+
if (mux_state == USB_PD_MUX_NONE)
return tusb544_enter_low_power_mode(me);