summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Collyer <scollyer@google.com>2021-11-17 11:44:43 -0800
committerCommit Bot <commit-bot@chromium.org>2021-11-23 22:33:28 +0000
commit8f9fd8def52833ae6b74d5ac4f97ed8b41060f6a (patch)
treeefe26b19dbe703981bbad8f20927562ec9de48e8
parent8e2129c048a7bee277fb580f9d9b55f1ed18b10b (diff)
downloadchrome-ec-8f9fd8def52833ae6b74d5ac4f97ed8b41060f6a.tar.gz
usb_mux: tusb1064: Add method to set DP Rx EQ gain
This CL adds a method to set DP Rx EQ gain. The previous version of the driver was enabling a 10 dB gain by default in the init function. This CL removes setting both gain and EQ_OVERRIDE by default. A separate CL in the stack moves the 10dB gain setting to the board.c file for the only other board that currently is using the TUSB1064. BUG=b:206059703 BRANCH=quiche TEST=Verified on gingerbread that both EQ_OVERRIDE is set and the gain is set in both registers as expected. Signed-off-by: Scott Collyer <scollyer@google.com> Change-Id: Id2dc6127d27304d8149f7c51a8d527e046595baf Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3291129 Tested-by: Scott Collyer <scollyer@chromium.org> Reviewed-by: Diana Z <dzigterman@chromium.org> Commit-Queue: Scott Collyer <scollyer@chromium.org>
-rw-r--r--driver/usb_mux/tusb1064.c65
-rw-r--r--driver/usb_mux/tusb1064.h9
2 files changed, 53 insertions, 21 deletions
diff --git a/driver/usb_mux/tusb1064.c b/driver/usb_mux/tusb1064.c
index c236e3d1ab..6a82aca68f 100644
--- a/driver/usb_mux/tusb1064.c
+++ b/driver/usb_mux/tusb1064.c
@@ -14,12 +14,6 @@
#error "Must choose CONFIG_USB_MUX_TUSB1044 or CONFIG_USB_MUX_TUSB1064"
#endif
-/*
- * configuration bits which never change in the General Register
- * e.g. REG_GENERAL_DP_EN_CTRL or REG_GENERAL_EQ_OVERRIDE
- */
-#define REG_GENERAL_STATIC_BITS REG_GENERAL_EQ_OVERRIDE
-
static int tusb1064_read(const struct usb_mux *me, uint8_t reg, uint8_t *val)
{
int buffer = 0xee;
@@ -60,11 +54,54 @@ void tusb1044_hpd_update(const struct usb_mux *me, mux_state_t mux_state)
}
#endif
+int tusb1064_set_dp_rx_eq(const struct usb_mux *me, int db)
+{
+ uint8_t reg;
+ int rv;
+
+ if (db < TUSB1064_DP_EQ_RX_NEG_0_3_DB || db > TUSB1064_DP_EQ_RX_12_1_DB)
+ return EC_ERROR_INVAL;
+
+ /* Set the requested gain values */
+ reg = TUSB1064_DP1EQ(db) | TUSB1064_DP3EQ(db);
+ rv = tusb1064_write(me, TUSB1064_REG_DP1DP3EQ_SEL, reg);
+ if (rv)
+ return rv;
+
+ reg = TUSB1064_DP0EQ(db) | TUSB1064_DP2EQ(db);
+ rv = tusb1064_write(me, TUSB1064_REG_DP0DP2EQ_SEL, reg);
+ if (rv)
+ return rv;
+
+ /* Enable EQ_OVERRIDE so the gain registers are used */
+ rv = tusb1064_read(me, TUSB1064_REG_GENERAL, &reg);
+ if (rv)
+ return rv;
+
+ reg |= REG_GENERAL_EQ_OVERRIDE;
+
+ return tusb1064_write(me, TUSB1064_REG_GENERAL, reg);
+}
+
/* Writes control register to set switch mode */
static int tusb1064_set_mux(const struct usb_mux *me, mux_state_t mux_state,
bool *ack_required)
{
- int reg = REG_GENERAL_STATIC_BITS;
+ uint8_t reg;
+ int rv;
+ int mask;
+
+ rv = tusb1064_read(me, TUSB1064_REG_GENERAL, &reg);
+ if (rv)
+ return rv;
+
+ /* Mask bits that may be set in this function */
+ mask = REG_GENERAL_CTLSEL_USB3 | REG_GENERAL_CTLSEL_ANYDP |
+ REG_GENERAL_FLIPSEL;
+#ifdef CONFIG_USB_MUX_TUSB1044
+ mask |= REG_GENERAL_HPDIN_OVERRIDE;
+#endif
+ reg &= ~mask;
/* This driver does not use host command ACKs */
*ack_required = false;
@@ -112,22 +149,8 @@ static int tusb1064_get_mux(const struct usb_mux *me, mux_state_t *mux_state)
static int tusb1064_init(const struct usb_mux *me)
{
int res;
- uint8_t reg;
bool unused;
- /* Default to "Floating Pin" DP Equalization */
- reg = TUSB1064_DP1EQ(TUSB1064_DP_EQ_RX_10_0_DB) |
- TUSB1064_DP3EQ(TUSB1064_DP_EQ_RX_10_0_DB);
- res = tusb1064_write(me, TUSB1064_REG_DP1DP3EQ_SEL, reg);
- if (res)
- return res;
-
- reg = TUSB1064_DP0EQ(TUSB1064_DP_EQ_RX_10_0_DB) |
- TUSB1064_DP2EQ(TUSB1064_DP_EQ_RX_10_0_DB);
- res = tusb1064_write(me, TUSB1064_REG_DP0DP2EQ_SEL, reg);
- if (res)
- return res;
-
/*
* Note that bypassing the usb_mux API is okay for internal driver calls
* since the task calling init already holds this port's mux lock.
diff --git a/driver/usb_mux/tusb1064.h b/driver/usb_mux/tusb1064.h
index f6aa8e612e..a71d6defa3 100644
--- a/driver/usb_mux/tusb1064.h
+++ b/driver/usb_mux/tusb1064.h
@@ -140,4 +140,13 @@
void tusb1044_hpd_update(const struct usb_mux *me, mux_state_t mux_state);
#endif
+/**
+ * Set DP Rx Equalization value
+ *
+ * @param *me pointer to usb_mux descriptor
+ * @param db requested gain setting for DP Rx path
+ * @return EC_SUCCESS if db param is valid and I2C is successful
+ */
+int tusb1064_set_dp_rx_eq(const struct usb_mux *me, int db);
+
#endif /* __CROS_EC_TUSB1064_H */