summaryrefslogtreecommitdiff
path: root/driver/retimer/ps8802.c
diff options
context:
space:
mode:
Diffstat (limited to 'driver/retimer/ps8802.c')
-rw-r--r--driver/retimer/ps8802.c157
1 files changed, 58 insertions, 99 deletions
diff --git a/driver/retimer/ps8802.c b/driver/retimer/ps8802.c
index 9738123ace..e2d93a25b4 100644
--- a/driver/retimer/ps8802.c
+++ b/driver/retimer/ps8802.c
@@ -1,4 +1,4 @@
-/* Copyright 2019 The Chromium OS Authors. All rights reserved.
+/* Copyright 2019 The ChromiumOS Authors
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*
@@ -16,22 +16,19 @@
#define PS8802_DEBUG 0
#define PS8802_I2C_WAKE_DELAY 500
-#define CPRINTS(format, args...) cprints(CC_USB, format, ## args)
-#define CPRINTF(format, args...) cprintf(CC_USB, format, ## args)
+#define CPRINTS(format, args...) cprints(CC_USB, format, ##args)
+#define CPRINTF(format, args...) cprintf(CC_USB, format, ##args)
int ps8802_i2c_read(const struct usb_mux *me, int page, int offset, int *data)
{
int rv;
- rv = i2c_read8(me->i2c_port,
- me->i2c_addr_flags + page,
- offset, data);
+ rv = i2c_read8(me->i2c_port, me->i2c_addr_flags + page, offset, data);
if (PS8802_DEBUG)
ccprintf("%s(%d:0x%02X, 0x%02X) =>0x%02X\n", __func__,
- me->i2c_port,
- me->i2c_addr_flags + page,
- offset, *data);
+ me->i2c_port, me->i2c_addr_flags + page, offset,
+ *data);
return rv;
}
@@ -42,58 +39,43 @@ int ps8802_i2c_write(const struct usb_mux *me, int page, int offset, int data)
int pre_val, post_val;
if (PS8802_DEBUG)
- i2c_read8(me->i2c_port,
- me->i2c_addr_flags + page,
- offset, &pre_val);
+ i2c_read8(me->i2c_port, me->i2c_addr_flags + page, offset,
+ &pre_val);
- rv = i2c_write8(me->i2c_port,
- me->i2c_addr_flags + page,
- offset, data);
+ rv = i2c_write8(me->i2c_port, me->i2c_addr_flags + page, offset, data);
if (PS8802_DEBUG) {
- i2c_read8(me->i2c_port,
- me->i2c_addr_flags + page,
- offset, &post_val);
+ i2c_read8(me->i2c_port, me->i2c_addr_flags + page, offset,
+ &post_val);
ccprintf("%s(%d:0x%02X, 0x%02X, 0x%02X) "
- "0x%02X=>0x%02X\n",
- __func__,
- me->i2c_port,
- me->i2c_addr_flags + page,
- offset, data,
- pre_val, post_val);
+ "0x%02X=>0x%02X\n",
+ __func__, me->i2c_port, me->i2c_addr_flags + page,
+ offset, data, pre_val, post_val);
}
return rv;
}
-int ps8802_i2c_write16(const struct usb_mux *me, int page, int offset,
- int data)
+int ps8802_i2c_write16(const struct usb_mux *me, int page, int offset, int data)
{
int rv;
int pre_val, post_val;
if (PS8802_DEBUG)
- i2c_read16(me->i2c_port,
- me->i2c_addr_flags + page,
- offset, &pre_val);
+ i2c_read16(me->i2c_port, me->i2c_addr_flags + page, offset,
+ &pre_val);
- rv = i2c_write16(me->i2c_port,
- me->i2c_addr_flags + page,
- offset, data);
+ rv = i2c_write16(me->i2c_port, me->i2c_addr_flags + page, offset, data);
if (PS8802_DEBUG) {
- i2c_read16(me->i2c_port,
- me->i2c_addr_flags + page,
- offset, &post_val);
+ i2c_read16(me->i2c_port, me->i2c_addr_flags + page, offset,
+ &post_val);
ccprintf("%s(%d:0x%02X, 0x%02X, 0x%04X) "
"0x%04X=>0x%04X\n",
- __func__,
- me->i2c_port,
- me->i2c_addr_flags + page,
- offset, data,
- pre_val, post_val);
+ __func__, me->i2c_port, me->i2c_addr_flags + page,
+ offset, data, pre_val, post_val);
}
return rv;
@@ -106,62 +88,46 @@ int ps8802_i2c_field_update8(const struct usb_mux *me, int page, int offset,
int pre_val, post_val;
if (PS8802_DEBUG)
- i2c_read8(me->i2c_port,
- me->i2c_addr_flags + page,
- offset, &pre_val);
+ i2c_read8(me->i2c_port, me->i2c_addr_flags + page, offset,
+ &pre_val);
- rv = i2c_field_update8(me->i2c_port,
- me->i2c_addr_flags + page,
- offset,
- field_mask,
- set_value);
+ rv = i2c_field_update8(me->i2c_port, me->i2c_addr_flags + page, offset,
+ field_mask, set_value);
if (PS8802_DEBUG) {
- i2c_read8(me->i2c_port,
- me->i2c_addr_flags + page,
- offset, &post_val);
+ i2c_read8(me->i2c_port, me->i2c_addr_flags + page, offset,
+ &post_val);
ccprintf("%s(%d:0x%02X, 0x%02X, 0x%02X, 0x%02X) "
"0x%02X=>0x%02X\n",
- __func__,
- me->i2c_port,
- me->i2c_addr_flags + page,
- offset, field_mask, set_value,
- pre_val, post_val);
+ __func__, me->i2c_port, me->i2c_addr_flags + page,
+ offset, field_mask, set_value, pre_val, post_val);
}
return rv;
}
int ps8802_i2c_field_update16(const struct usb_mux *me, int page, int offset,
- uint16_t field_mask, uint16_t set_value)
+ uint16_t field_mask, uint16_t set_value)
{
int rv;
int pre_val, post_val;
if (PS8802_DEBUG)
- i2c_read16(me->i2c_port,
- me->i2c_addr_flags + page,
- offset, &pre_val);
+ i2c_read16(me->i2c_port, me->i2c_addr_flags + page, offset,
+ &pre_val);
- rv = i2c_field_update16(me->i2c_port,
- me->i2c_addr_flags + page,
- offset,
- field_mask,
- set_value);
+ rv = i2c_field_update16(me->i2c_port, me->i2c_addr_flags + page, offset,
+ field_mask, set_value);
if (PS8802_DEBUG) {
- i2c_read16(me->i2c_port,
- me->i2c_addr_flags + page,
- offset, &post_val);
+ i2c_read16(me->i2c_port, me->i2c_addr_flags + page, offset,
+ &post_val);
ccprintf("%s(%d:0x%02X, 0x%02X, 0x%02X, 0x%04X) "
"0x%04X=>0x%04X\n",
- __func__,
- me->i2c_port,
- me->i2c_addr_flags + page,
- offset, field_mask, set_value,
- pre_val, post_val);
+ __func__, me->i2c_port, me->i2c_addr_flags + page,
+ offset, field_mask, set_value, pre_val, post_val);
}
return rv;
@@ -179,9 +145,7 @@ int ps8802_i2c_wake(const struct usb_mux *me)
/* If in standby, first read will fail, second should succeed. */
for (int i = 0; i < 2; i++) {
- rv = ps8802_i2c_read(me,
- PS8802_REG_PAGE2,
- PS8802_REG2_MODE,
+ rv = ps8802_i2c_read(me, PS8802_REG_PAGE2, PS8802_REG2_MODE,
&data);
if (rv == EC_SUCCESS)
return rv;
@@ -200,7 +164,7 @@ static int ps8802_enter_low_power_mode(const struct usb_mux *me)
int rv;
rv = ps8802_i2c_write(me, PS8802_REG_PAGE2, PS8802_REG2_MODE,
- PS8802_MODE_STANDBY_MODE);
+ PS8802_MODE_STANDBY_MODE);
if (rv)
CPRINTS("C%d: PS8802: Failed to enter low power mode!",
@@ -224,9 +188,13 @@ static int ps8802_set_mux(const struct usb_mux *me, mux_state_t mux_state,
/* This driver does not use host command ACKs */
*ack_required = false;
+ /* This driver treats safe mode as none */
+ if (mux_state == USB_PD_MUX_SAFE_MODE)
+ mux_state = USB_PD_MUX_NONE;
+
if (chipset_in_state(CHIPSET_STATE_HARD_OFF))
- return (mux_state == USB_PD_MUX_NONE) ? EC_SUCCESS
- : EC_ERROR_NOT_POWERED;
+ return (mux_state == USB_PD_MUX_NONE) ? EC_SUCCESS :
+ EC_ERROR_NOT_POWERED;
/* Make sure the PS8802 is awake */
rv = ps8802_i2c_wake(me);
@@ -234,18 +202,16 @@ static int ps8802_set_mux(const struct usb_mux *me, mux_state_t mux_state,
return rv;
if (PS8802_DEBUG)
- ccprintf("%s(%d, 0x%02X) %s %s %s\n",
- __func__, me->usb_port, mux_state,
- (mux_state & USB_PD_MUX_USB_ENABLED) ? "USB" : "",
- (mux_state & USB_PD_MUX_DP_ENABLED) ? "DP" : "",
- (mux_state & USB_PD_MUX_POLARITY_INVERTED)
- ? "FLIP" : "");
+ ccprintf("%s(%d, 0x%02X) %s %s %s\n", __func__, me->usb_port,
+ mux_state,
+ (mux_state & USB_PD_MUX_USB_ENABLED) ? "USB" : "",
+ (mux_state & USB_PD_MUX_DP_ENABLED) ? "DP" : "",
+ (mux_state & USB_PD_MUX_POLARITY_INVERTED) ? "FLIP" :
+ "");
/* Set the mode and flip */
- val = (PS8802_MODE_DP_REG_CONTROL |
- PS8802_MODE_USB_REG_CONTROL |
- PS8802_MODE_FLIP_REG_CONTROL |
- PS8802_MODE_IN_HPD_REG_CONTROL);
+ val = (PS8802_MODE_DP_REG_CONTROL | PS8802_MODE_USB_REG_CONTROL |
+ PS8802_MODE_FLIP_REG_CONTROL | PS8802_MODE_IN_HPD_REG_CONTROL);
if (mux_state & USB_PD_MUX_USB_ENABLED)
val |= PS8802_MODE_USB_ENABLE;
@@ -254,10 +220,7 @@ static int ps8802_set_mux(const struct usb_mux *me, mux_state_t mux_state,
if (mux_state & USB_PD_MUX_POLARITY_INVERTED)
val |= PS8802_MODE_FLIP_ENABLE;
- rv = ps8802_i2c_write(me,
- PS8802_REG_PAGE2,
- PS8802_REG2_MODE,
- val);
+ rv = ps8802_i2c_write(me, PS8802_REG_PAGE2, PS8802_REG2_MODE, val);
return rv;
}
@@ -276,10 +239,7 @@ static int ps8802_get_mux(const struct usb_mux *me, mux_state_t *mux_state)
if (rv)
return rv;
- rv = ps8802_i2c_read(me,
- PS8802_REG_PAGE2,
- PS8802_REG2_MODE,
- &val);
+ rv = ps8802_i2c_read(me, PS8802_REG_PAGE2, PS8802_REG2_MODE, &val);
if (rv)
return rv;
@@ -309,8 +269,7 @@ int ps8802_chg_i2c_addr(int i2c_port)
{
int rv;
- rv = i2c_write8(i2c_port,
- PS8802_P1_ADDR, PS8802_ADDR_CFG,
+ rv = i2c_write8(i2c_port, PS8802_P1_ADDR, PS8802_ADDR_CFG,
PS8802_I2C_ADDR_FLAGS_ALT);
return rv;