diff options
author | Scott Collyer <scollyer@google.com> | 2021-02-08 21:10:49 -0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-04-02 18:51:59 +0000 |
commit | ac04e07d387782fc91a8758890570c13adfb7d81 (patch) | |
tree | e1885c50e20ecada1d3a98138ec3e00da91e2023 /driver/usb_mux/ps8822.c | |
parent | 651debfcc8ca9bdd02ac1583cf114cbaf5ad9b27 (diff) | |
download | chrome-ec-ac04e07d387782fc91a8758890570c13adfb7d81.tar.gz |
usb_mux: ps8822: Add support to adjust rx DP EQ setting
This CL modifies the PS8822 usb_mux driver to support multiple pages
(there is a page 0, 1, and 2 for this chip). The usb_mux driver only
needs access to page 0, but page 1 access is needed for DP EQ
settings.
In addition this CL adds a new driver function to allow setting of the
DP Rx equalization gain value.
BUG=b:178656398
BRANCH=None
TEST=tested on quiche and verified the register is programmed when DP
mode is active.
Signed-off-by: Scott Collyer <scollyer@google.com>
Change-Id: I65cb2fc2c982b01537eb60c0b9da30f4363419aa
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2686918
Tested-by: Scott Collyer <scollyer@chromium.org>
Reviewed-by: Diana Z <dzigterman@chromium.org>
Commit-Queue: Scott Collyer <scollyer@chromium.org>
Diffstat (limited to 'driver/usb_mux/ps8822.c')
-rw-r--r-- | driver/usb_mux/ps8822.c | 50 |
1 files changed, 40 insertions, 10 deletions
diff --git a/driver/usb_mux/ps8822.c b/driver/usb_mux/ps8822.c index 43ea22de3d..f7a60df6fa 100644 --- a/driver/usb_mux/ps8822.c +++ b/driver/usb_mux/ps8822.c @@ -12,16 +12,45 @@ #include "usb_mux.h" #include "util.h" -static int ps8822_read(const struct usb_mux *me, uint8_t reg, int *val) +static int ps8822_read(const struct usb_mux *me, int page, uint8_t reg, + int *val) { - return i2c_read8(me->i2c_port, me->i2c_addr_flags, + return i2c_read8(me->i2c_port, me->i2c_addr_flags + page, reg, val); } -static int ps8822_write(const struct usb_mux *me, uint8_t reg, uint8_t val) +static int ps8822_write(const struct usb_mux *me, int page, uint8_t reg, + int val) { - return i2c_write8(me->i2c_port, me->i2c_addr_flags, - reg, val); + return i2c_write8(me->i2c_port, me->i2c_addr_flags + page, + reg, val); +} + +int ps8822_set_dp_rx_eq(const struct usb_mux *me, int db) +{ + int dpeq_reg; + int rv; + + /* Read DP EQ register */ + rv = ps8822_read(me, PS8822_REG_PAGE1, PS8822_REG_DP_EQ, + &dpeq_reg); + if (rv) + return rv; + + if (db < PS8822_DPEQ_LEVEL_UP_9DB || db > PS8822_DPEQ_LEVEL_UP_21DB) + return EC_ERROR_INVAL; + + /* Disable auto eq */ + dpeq_reg &= ~PS8822_DP_EQ_AUTO_EN; + + /* Set gain to the requested value */ + dpeq_reg &= ~(PS8822_DPEQ_LEVEL_UP_MASK << + PS8822_REG_DP_EQ_SHIFT); + dpeq_reg |= (db << PS8822_REG_DP_EQ_SHIFT); + + /* Apply new EQ setting */ + return ps8822_write(me, PS8822_REG_PAGE1, PS8822_REG_DP_EQ, + dpeq_reg); } static int ps8822_init(const struct usb_mux *me) @@ -33,7 +62,8 @@ static int ps8822_init(const struct usb_mux *me) /* Read ID registers */ for (i = 0; i < PS8822_ID_LEN; i++) { - rv |= ps8822_read(me, PS8822_REG_DEV_ID1 + i, ®); + rv |= ps8822_read(me, PS8822_REG_PAGE0, PS8822_REG_DEV_ID1 + i, + ®); if (!rv) id[i] = reg; } @@ -41,7 +71,7 @@ static int ps8822_init(const struct usb_mux *me) if (!rv) { id[PS8822_ID_LEN] = '\0'; /* Set mode register to default value */ - rv = ps8822_write(me, PS8822_REG_MODE, 0); + rv = ps8822_write(me, PS8822_REG_PAGE0, PS8822_REG_MODE, 0); rv |= strcasecmp("PS8822", id); } @@ -54,7 +84,7 @@ static int ps8822_set_mux(const struct usb_mux *me, mux_state_t mux_state) int reg; int rv; - rv = ps8822_read(me, PS8822_REG_MODE, ®); + rv = ps8822_read(me, PS8822_REG_PAGE0, PS8822_REG_MODE, ®); if (rv) return rv; @@ -68,7 +98,7 @@ static int ps8822_set_mux(const struct usb_mux *me, mux_state_t mux_state) if (mux_state & USB_PD_MUX_POLARITY_INVERTED) reg |= PS8822_MODE_FLIP; - return ps8822_write(me, PS8822_REG_MODE, reg); + return ps8822_write(me, PS8822_REG_PAGE0, PS8822_REG_MODE, reg); } /* Reads control register and updates mux_state accordingly */ @@ -77,7 +107,7 @@ static int ps8822_get_mux(const struct usb_mux *me, mux_state_t *mux_state) int reg; int res; - res = ps8822_read(me, PS8822_REG_MODE, ®); + res = ps8822_read(me, PS8822_REG_PAGE0, PS8822_REG_MODE, ®); if (res) return res; |