diff options
author | Rob Barnes <robbarnes@google.com> | 2021-04-27 06:44:55 -0600 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2021-04-27 22:42:35 +0000 |
commit | da02ed5aace26a2abe545daaede8a18a100cc197 (patch) | |
tree | a33a181896aeb2e84048edb6f08d824f9ad0a2b8 /driver | |
parent | da8382de9741fad4af44dda39e59ec232f1ea66c (diff) | |
download | chrome-ec-da02ed5aace26a2abe545daaede8a18a100cc197.tar.gz |
ANX7451: Set upstream AUX FLIP
AUX flip control must be enabled. Otherwise alternate mode will not work
on ANX7451 when cable is flipped. The USB registers use a separate i2c
address that must be dynamically configured. Since there may be multiple
ANX74** parts on a board, this address must be dynamically configured
using a board callback.
BUG=b:185276137
TEST=Display works when cable is flipped on B2
BRANCH=None
Signed-off-by: Rob Barnes <robbarnes@google.com>
Change-Id: I144131b2f53985d97e0be960e202366f726dd90b
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2854120
Reviewed-by: Diana Z <dzigterman@chromium.org>
Diffstat (limited to 'driver')
-rw-r--r-- | driver/usb_mux/anx7451.c | 13 | ||||
-rw-r--r-- | driver/usb_mux/anx7451.h | 17 |
2 files changed, 30 insertions, 0 deletions
diff --git a/driver/usb_mux/anx7451.c b/driver/usb_mux/anx7451.c index c46a78acf8..ccf09f61be 100644 --- a/driver/usb_mux/anx7451.c +++ b/driver/usb_mux/anx7451.c @@ -52,6 +52,7 @@ static int anx7451_wake_up(const struct usb_mux *me) timestamp_t start; int rv; int val; + uint16_t usb_i2c_addr = board_anx7451_get_usb_i2c_addr(me); if (chipset_in_state(CHIPSET_STATE_HARD_OFF)) return EC_ERROR_NOT_POWERED; @@ -73,6 +74,18 @@ static int anx7451_wake_up(const struct usb_mux *me) RETURN_ERROR(anx7451_write(me, ANX7451_REG_ULTRA_LOW_POWER, ANX7451_ULTRA_LOW_POWER_DIS)); + /* + * Configure ANX7451 USB I2C address. + * Shift 1 bit to make 7 bit address an 8 bit address. + */ + RETURN_ERROR( + anx7451_write(me, ANX7451_REG_USB_I2C_ADDR, usb_i2c_addr << 1)); + + /* b/185276137: Fix ANX7451 upstream AUX FLIP */ + RETURN_ERROR(i2c_write8(me->i2c_port, usb_i2c_addr, + ANX7451_REG_USB_AUX_FLIP_CTRL, + ANX7451_USB_AUX_FLIP_EN)); + return EC_SUCCESS; } diff --git a/driver/usb_mux/anx7451.h b/driver/usb_mux/anx7451.h index cf7a701f6c..7eefb6e79e 100644 --- a/driver/usb_mux/anx7451.h +++ b/driver/usb_mux/anx7451.h @@ -9,6 +9,8 @@ #ifndef __CROS_EC_USB_MUX_ANX7451_H #define __CROS_EC_USB_MUX_ANX7451_H +#include "usb_mux.h" + /* I2C interface addresses */ #define ANX7451_I2C_ADDR0_FLAGS 0x10 #define ANX7451_I2C_ADDR1_FLAGS 0x14 @@ -36,6 +38,21 @@ #define ANX7451_ULP_CFG_MODE_DP_EN BIT(1) #define ANX7451_ULP_CFG_MODE_USB_EN BIT(0) +/* Register to set USB I2C address, defaults to 0x29 (7-bit) */ +#define ANX7451_REG_USB_I2C_ADDR 0x38 + +/* ANX7451 AUX FLIP control */ +#define ANX7451_REG_USB_AUX_FLIP_CTRL 0xA4 +#define ANX7451_USB_AUX_FLIP_EN 0x20 + extern const struct usb_mux_driver anx7451_usb_mux_driver; +/* + * ANX7451 uses a separate i2c address for USB configuration registers. + * This address is not controlled by address straps and defaults to 0x29. + * This address may conflict with other ANX74* parts. Implement + * board_anx7451_get_usb_i2c_addr to set a non-conflicting 7-bit address. + */ +uint16_t board_anx7451_get_usb_i2c_addr(const struct usb_mux *me); + #endif /* __CROS_EC_USB_MUX_ANX7451_H */ |