diff options
Diffstat (limited to 'driver/retimer/ps8802.c')
-rw-r--r-- | driver/retimer/ps8802.c | 157 |
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; |