summaryrefslogtreecommitdiff
path: root/driver/tcpm/rt1718s.c
diff options
context:
space:
mode:
Diffstat (limited to 'driver/tcpm/rt1718s.c')
-rw-r--r--driver/tcpm/rt1718s.c205
1 files changed, 100 insertions, 105 deletions
diff --git a/driver/tcpm/rt1718s.c b/driver/tcpm/rt1718s.c
index e985419668..a009e33323 100644
--- a/driver/tcpm/rt1718s.c
+++ b/driver/tcpm/rt1718s.c
@@ -1,4 +1,4 @@
-/* Copyright 2021 The Chromium OS Authors. All rights reserved.
+/* Copyright 2021 The ChromiumOS Authors
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
@@ -22,26 +22,25 @@
#include "usb_pe_sm.h"
#include "util.h"
-#define CPRINTS(format, args...) cprints(CC_USBCHARGE, format, ## args)
-#define CPRINTF(format, args...) cprintf(CC_USBCHARGE, format, ## args)
+#define CPRINTS(format, args...) cprints(CC_USBCHARGE, format, ##args)
+#define CPRINTF(format, args...) cprintf(CC_USBCHARGE, format, ##args)
-#define RT1718S_SW_RESET_DELAY_MS 2
+#define RT1718S_SW_RESET_DELAY_MS 2
/* Time for delay deasserting EN_FRS after FRS VBUS drop. */
-#define RT1718S_FRS_DIS_DELAY (5 * MSEC)
+#define RT1718S_FRS_DIS_DELAY (5 * MSEC)
-#define FLAG_FRS_ENABLED BIT(0)
-#define FLAG_FRS_RX_SIGNALLED BIT(1)
-#define FLAG_FRS_VBUS_VALID_FALL BIT(2)
+#define FLAG_FRS_ENABLED BIT(0)
+#define FLAG_FRS_RX_SIGNALLED BIT(1)
+#define FLAG_FRS_VBUS_VALID_FALL BIT(2)
static atomic_t frs_flag[CONFIG_USB_PD_PORT_MAX_COUNT];
/* i2c_write function which won't wake TCPC from low power mode. */
static int rt1718s_write(int port, int reg, int val, int len)
{
if (reg > 0xFF) {
- return i2c_write_offset16(
- tcpc_config[port].i2c_info.port,
- tcpc_config[port].i2c_info.addr_flags,
- reg, val, len);
+ return i2c_write_offset16(tcpc_config[port].i2c_info.port,
+ tcpc_config[port].i2c_info.addr_flags,
+ reg, val, len);
} else if (len == 1) {
return tcpc_write(port, reg, val);
} else {
@@ -52,10 +51,9 @@ static int rt1718s_write(int port, int reg, int val, int len)
static int rt1718s_read(int port, int reg, int *val, int len)
{
if (reg > 0xFF) {
- return i2c_read_offset16(
- tcpc_config[port].i2c_info.port,
- tcpc_config[port].i2c_info.addr_flags,
- reg, val, len);
+ return i2c_read_offset16(tcpc_config[port].i2c_info.port,
+ tcpc_config[port].i2c_info.addr_flags,
+ reg, val, len);
} else if (len == 1) {
return tcpc_read(port, reg, val);
} else {
@@ -97,13 +95,12 @@ int rt1718s_read16(int port, int reg, int *val)
return rt1718s_read(port, reg, val, 2);
}
-
int rt1718s_sw_reset(int port)
{
int rv;
- rv = rt1718s_update_bits8(port, RT1718S_SYS_CTRL3,
- RT1718S_SWRESET_MASK, 0xFF);
+ rv = rt1718s_update_bits8(port, RT1718S_SYS_CTRL3, RT1718S_SWRESET_MASK,
+ 0xFF);
msleep(RT1718S_SW_RESET_DELAY_MS);
@@ -114,44 +111,43 @@ int rt1718s_sw_reset(int port)
static int rt1718s_enable_bc12_sink(int port, bool en)
{
return rt1718s_update_bits8(port, RT1718S_RT2_BC12_SNK_FUNC,
- RT1718S_RT2_BC12_SNK_FUNC_BC12_SNK_EN,
- en ? 0xFF : 0);
+ RT1718S_RT2_BC12_SNK_FUNC_BC12_SNK_EN,
+ en ? 0xFF : 0);
}
static int rt1718s_set_bc12_sink_spec_ta(int port, bool en)
{
- return rt1718s_update_bits8(port,
- RT1718S_RT2_BC12_SNK_FUNC,
- RT1718S_RT2_BC12_SNK_FUNC_SPEC_TA_EN, en ? 0xFF : 0);
+ return rt1718s_update_bits8(port, RT1718S_RT2_BC12_SNK_FUNC,
+ RT1718S_RT2_BC12_SNK_FUNC_SPEC_TA_EN,
+ en ? 0xFF : 0);
}
static int rt1718s_set_bc12_sink_dcdt_sel(int port, uint8_t dcdt_sel)
{
- return rt1718s_update_bits8(port,
- RT1718S_RT2_BC12_SNK_FUNC,
- RT1718S_RT2_BC12_SNK_FUNC_DCDT_SEL_MASK, dcdt_sel);
+ return rt1718s_update_bits8(port, RT1718S_RT2_BC12_SNK_FUNC,
+ RT1718S_RT2_BC12_SNK_FUNC_DCDT_SEL_MASK,
+ dcdt_sel);
}
static int rt1718s_set_bc12_sink_vlgc_option(int port, bool en)
{
- return rt1718s_update_bits8(port,
- RT1718S_RT2_BC12_SNK_FUNC,
- RT1718S_RT2_BC12_SNK_FUNC_VLGC_OPT, en ? 0xFF : 0);
+ return rt1718s_update_bits8(port, RT1718S_RT2_BC12_SNK_FUNC,
+ RT1718S_RT2_BC12_SNK_FUNC_VLGC_OPT,
+ en ? 0xFF : 0);
}
static int rt1718s_set_bc12_sink_vport_sel(int port, uint8_t sel)
{
- return rt1718s_update_bits8(port,
- RT1718S_RT2_DPDM_CTR1_DPDM_SET,
- RT1718S_RT2_DPDM_CTR1_DPDM_SET_DPDM_VSRC_SEL_MASK, sel);
+ return rt1718s_update_bits8(
+ port, RT1718S_RT2_DPDM_CTR1_DPDM_SET,
+ RT1718S_RT2_DPDM_CTR1_DPDM_SET_DPDM_VSRC_SEL_MASK, sel);
}
static int rt1718s_set_bc12_sink_wait_vbus(int port, bool en)
{
- return rt1718s_update_bits8(port,
- RT1718S_RT2_BC12_SNK_FUNC,
- RT1718S_RT2_BC12_SNK_FUNC_BC12_WAIT_VBUS,
- en ? 0xFF : 0);
+ return rt1718s_update_bits8(port, RT1718S_RT2_BC12_SNK_FUNC,
+ RT1718S_RT2_BC12_SNK_FUNC_BC12_WAIT_VBUS,
+ en ? 0xFF : 0);
}
/*
@@ -161,27 +157,27 @@ static int rt1718s_bc12_init(int port)
{
/* Enable vendor defined BC12 function */
RETURN_ERROR(rt1718s_write8(port, RT1718S_RT_MASK6,
- RT1718S_RT_MASK6_M_BC12_SNK_DONE |
- RT1718S_RT_MASK6_M_BC12_TA_CHG));
+ RT1718S_RT_MASK6_M_BC12_SNK_DONE |
+ RT1718S_RT_MASK6_M_BC12_TA_CHG));
RETURN_ERROR(rt1718s_write8(port, RT1718S_RT2_SBU_CTRL_01,
- RT1718S_RT2_SBU_CTRL_01_DPDM_VIEN |
- RT1718S_RT2_SBU_CTRL_01_DM_SWEN |
- RT1718S_RT2_SBU_CTRL_01_DP_SWEN));
+ RT1718S_RT2_SBU_CTRL_01_DPDM_VIEN |
+ RT1718S_RT2_SBU_CTRL_01_DM_SWEN |
+ RT1718S_RT2_SBU_CTRL_01_DP_SWEN));
/* Disable 2.7v mode */
RETURN_ERROR(rt1718s_set_bc12_sink_spec_ta(port, false));
/* DCDT select 600ms timeout */
- RETURN_ERROR(rt1718s_set_bc12_sink_dcdt_sel(port,
- RT1718S_RT2_BC12_SNK_FUNC_DCDT_SEL_600MS));
+ RETURN_ERROR(rt1718s_set_bc12_sink_dcdt_sel(
+ port, RT1718S_RT2_BC12_SNK_FUNC_DCDT_SEL_600MS));
/* Disable vlgc option */
RETURN_ERROR(rt1718s_set_bc12_sink_vlgc_option(port, false));
/* DPDM voltage selection */
- RETURN_ERROR(rt1718s_set_bc12_sink_vport_sel(port,
- RT1718S_RT2_DPDM_CTR1_DPDM_SET_DPDM_VSRC_SEL_0_65V));
+ RETURN_ERROR(rt1718s_set_bc12_sink_vport_sel(
+ port, RT1718S_RT2_DPDM_CTR1_DPDM_SET_DPDM_VSRC_SEL_0_65V));
/* Disable sink wait vbus */
RETURN_ERROR(rt1718s_set_bc12_sink_wait_vbus(port, false));
@@ -197,22 +193,24 @@ static int rt1718s_workaround(int port)
switch (device_id) {
case RT1718S_DEVICE_ID_ES1:
- RETURN_ERROR(rt1718s_update_bits8(port, RT1718S_VCONN_CONTROL_3,
- RT1718S_VCONN_CONTROL_3_VCONN_OVP_DEG,
- 0xFF));
+ RETURN_ERROR(rt1718s_update_bits8(
+ port, RT1718S_VCONN_CONTROL_3,
+ RT1718S_VCONN_CONTROL_3_VCONN_OVP_DEG, 0xFF));
/* fallthrough */
case RT1718S_DEVICE_ID_ES2:
- RETURN_ERROR(rt1718s_update_bits8(port, TCPC_REG_FAULT_CTRL,
- TCPC_REG_FAULT_CTRL_VBUS_OCP_FAULT_DIS,
- 0xFF));
- RETURN_ERROR(rt1718s_update_bits8(port, RT1718S_VCON_CTRL4,
- RT1718S_VCON_CTRL4_UVP_CP_EN |
- RT1718S_VCON_CTRL4_OCP_CP_EN,
- 0));
- RETURN_ERROR(rt1718s_update_bits8(port, RT1718S_VCONN_CONTROL_2,
- RT1718S_VCONN_CONTROL_2_OVP_EN_CC1 |
- RT1718S_VCONN_CONTROL_2_OVP_EN_CC2,
- 0xFF));
+ RETURN_ERROR(rt1718s_update_bits8(
+ port, TCPC_REG_FAULT_CTRL,
+ TCPC_REG_FAULT_CTRL_VBUS_OCP_FAULT_DIS, 0xFF));
+ RETURN_ERROR(rt1718s_update_bits8(
+ port, RT1718S_VCON_CTRL4,
+ RT1718S_VCON_CTRL4_UVP_CP_EN |
+ RT1718S_VCON_CTRL4_OCP_CP_EN,
+ 0));
+ RETURN_ERROR(rt1718s_update_bits8(
+ port, RT1718S_VCONN_CONTROL_2,
+ RT1718S_VCONN_CONTROL_2_OVP_EN_CC1 |
+ RT1718S_VCONN_CONTROL_2_OVP_EN_CC2,
+ 0xFF));
break;
default:
/* do nothing */
@@ -271,12 +269,13 @@ static int rt1718s_init(int port)
/* Set VBUS_VOL_SEL to 20V */
RETURN_ERROR(rt1718s_update_bits8(port, RT1718S_RT2_VBUS_VOL_CTRL,
- RT1718S_RT2_VBUS_VOL_CTRL_VOL_SEL,
- RT1718S_VBUS_VOL_TO_REG(20)));
+ RT1718S_RT2_VBUS_VOL_CTRL_VOL_SEL,
+ RT1718S_VBUS_VOL_TO_REG(20)));
/* Set VCONN_OCP_SEL to 400mA */
RETURN_ERROR(rt1718s_update_bits8(port, RT1718S_VCONN_CONTROL_3,
- RT1718S_VCONN_CONTROL_3_VCONN_OCP_SEL, 0x7F));
+ RT1718S_VCONN_CONTROL_3_VCONN_OCP_SEL,
+ 0x7F));
/* Increase the Vconn OCP shoot detection from 200ns to 3~5us */
RETURN_ERROR(rt1718s_update_bits8(port, RT1718S_VCON_CTRL4,
@@ -287,9 +286,10 @@ static int rt1718s_init(int port)
/* Tcpc connect invalid disabled. Exit shipping mode */
RETURN_ERROR(rt1718s_update_bits8(port, RT1718S_SYS_CTRL1,
- RT1718S_SYS_CTRL1_TCPC_CONN_INVALID, 0x00));
- RETURN_ERROR(rt1718s_update_bits8(port, RT1718S_SYS_CTRL1,
- RT1718S_SYS_CTRL1_SHIPPING_OFF, 0xFF));
+ RT1718S_SYS_CTRL1_TCPC_CONN_INVALID,
+ 0x00));
+ RETURN_ERROR(rt1718s_update_bits8(
+ port, RT1718S_SYS_CTRL1, RT1718S_SYS_CTRL1_SHIPPING_OFF, 0xFF));
/* Clear alert and fault */
RETURN_ERROR(rt1718s_write8(port, TCPC_REG_FAULT_STATUS, 0xFF));
@@ -303,8 +303,7 @@ static int rt1718s_init(int port)
* tcpci_tcpm_init.
*/
RETURN_ERROR(tcpc_update16(port, TCPC_REG_ALERT_MASK,
- TCPC_REG_ALERT_MASK_VENDOR_DEF,
- MASK_SET));
+ TCPC_REG_ALERT_MASK_VENDOR_DEF, MASK_SET));
if (IS_ENABLED(CONFIG_USB_PD_FRS)) {
memset(frs_flag, 0,
@@ -368,7 +367,7 @@ static void rt1718s_update_charge_manager(int port,
if (new_bc12_type != current_bc12_type) {
if (current_bc12_type != CHARGE_SUPPLIER_NONE)
charge_manager_update_charge(current_bc12_type, port,
- NULL);
+ NULL);
if (new_bc12_type != CHARGE_SUPPLIER_NONE) {
struct charge_port_info chg = {
@@ -391,16 +390,15 @@ static void rt1718s_bc12_usb_charger_task_init(const int port)
static void rt1718s_bc12_usb_charger_task_event(const int port, uint32_t evt)
{
bool is_non_pd_sink = !pd_capable(port) &&
- !usb_charger_port_is_sourcing_vbus(port) &&
- pd_check_vbus_level(port, VBUS_PRESENT);
+ !usb_charger_port_is_sourcing_vbus(port) &&
+ pd_check_vbus_level(port, VBUS_PRESENT);
if (evt & USB_CHG_EVENT_VBUS) {
-
if (is_non_pd_sink)
rt1718s_enable_bc12_sink(port, true);
else
- rt1718s_update_charge_manager(
- port, CHARGE_SUPPLIER_NONE);
+ rt1718s_update_charge_manager(port,
+ CHARGE_SUPPLIER_NONE);
}
/* detection done, update charge_manager and stop detection */
@@ -534,8 +532,7 @@ void rt1718s_vendor_defined_alert(int port)
return;
/* ES1 workaround: disable Vconn discharge */
rv = rt1718s_update_bits8(port, RT1718S_SYS_CTRL2,
- RT1718S_SYS_CTRL2_VCONN_DISCHARGE_EN,
- 0);
+ RT1718S_SYS_CTRL2_VCONN_DISCHARGE_EN, 0);
if (rv)
return;
@@ -547,7 +544,6 @@ __overridable int board_rt1718s_set_snk_enable(int port, int enable)
return EC_SUCCESS;
}
-
static int rt1718s_tcpm_set_snk_ctrl(int port, int enable)
{
int rv;
@@ -721,8 +717,7 @@ void rt1718s_gpio_set_flags(int port, enum rt1718s_gpio signal, uint32_t flags)
void rt1718s_gpio_set_level(int port, enum rt1718s_gpio signal, int value)
{
rt1718s_update_bits8(port, RT1718S_GPIO_CTRL(signal),
- RT1718S_GPIO_CTRL_O,
- value ? 0xFF : 0);
+ RT1718S_GPIO_CTRL_O, value ? 0xFF : 0);
}
int rt1718s_gpio_get_level(int port, enum rt1718s_gpio signal)
@@ -733,13 +728,12 @@ int rt1718s_gpio_get_level(int port, enum rt1718s_gpio signal)
return !!(val & RT1718S_GPIO_CTRL_I);
}
-static int command_rt1718s_gpio(int argc, char **argv)
+static int command_rt1718s_gpio(int argc, const char **argv)
{
int i, j;
uint32_t flags;
for (i = 0; i < board_get_usb_pd_port_count(); i++) {
-
if (tcpc_config[i].drv != &rt1718s_tcpm_drv)
continue;
@@ -751,7 +745,7 @@ static int command_rt1718s_gpio(int argc, char **argv)
return EC_ERROR_UNKNOWN;
ccprintf("C%d GPIO%d OD=%d PU=%d PD=%d OE=%d HL=%d\n",
- i, j+1, !(flags & RT1718S_GPIO_CTRL_OD_N),
+ i, j + 1, !(flags & RT1718S_GPIO_CTRL_OD_N),
!!(flags & RT1718S_GPIO_CTRL_PU),
!!(flags & RT1718S_GPIO_CTRL_PD),
!!(flags & RT1718S_GPIO_CTRL_OE),
@@ -780,42 +774,43 @@ static int rt1718s_set_sbu(int port, bool enable)
/* RT1718S is a TCPCI compatible port controller */
const struct tcpm_drv rt1718s_tcpm_drv = {
- .init = &rt1718s_init,
- .release = &tcpci_tcpm_release,
- .get_cc = &tcpci_tcpm_get_cc,
+ .init = &rt1718s_init,
+ .release = &tcpci_tcpm_release,
+ .get_cc = &tcpci_tcpm_get_cc,
#ifdef CONFIG_USB_PD_VBUS_DETECT_TCPC
- .check_vbus_level = &tcpci_tcpm_check_vbus_level,
+ .check_vbus_level = &tcpci_tcpm_check_vbus_level,
#endif
- .select_rp_value = &tcpci_tcpm_select_rp_value,
- .set_cc = &tcpci_tcpm_set_cc,
- .set_polarity = &tcpci_tcpm_set_polarity,
+ .select_rp_value = &tcpci_tcpm_select_rp_value,
+ .set_cc = &tcpci_tcpm_set_cc,
+ .set_polarity = &tcpci_tcpm_set_polarity,
#ifdef CONFIG_USB_PD_DECODE_SOP
- .sop_prime_enable = &tcpci_tcpm_sop_prime_enable,
+ .sop_prime_enable = &tcpci_tcpm_sop_prime_enable,
#endif
- .set_vconn = &rt1718s_set_vconn,
- .set_msg_header = &tcpci_tcpm_set_msg_header,
- .set_rx_enable = &tcpci_tcpm_set_rx_enable,
- .get_message_raw = &tcpci_tcpm_get_message_raw,
- .transmit = &tcpci_tcpm_transmit,
- .tcpc_alert = &rt1718s_alert,
+ .set_vconn = &rt1718s_set_vconn,
+ .set_msg_header = &tcpci_tcpm_set_msg_header,
+ .set_rx_enable = &tcpci_tcpm_set_rx_enable,
+ .get_message_raw = &tcpci_tcpm_get_message_raw,
+ .transmit = &tcpci_tcpm_transmit,
+ .tcpc_alert = &rt1718s_alert,
#ifdef CONFIG_USB_PD_DISCHARGE_TCPC
- .tcpc_discharge_vbus = &tcpci_tcpc_discharge_vbus,
+ .tcpc_discharge_vbus = &tcpci_tcpc_discharge_vbus,
#endif
#ifdef CONFIG_USB_PD_DUAL_ROLE_AUTO_TOGGLE
- .drp_toggle = &tcpci_tcpc_drp_toggle,
+ .drp_toggle = &tcpci_tcpc_drp_toggle,
#endif
- .get_chip_info = &tcpci_get_chip_info,
- .set_snk_ctrl = &rt1718s_tcpm_set_snk_ctrl,
- .set_src_ctrl = &tcpci_tcpm_set_src_ctrl,
+ .get_chip_info = &tcpci_get_chip_info,
+ .set_snk_ctrl = &rt1718s_tcpm_set_snk_ctrl,
+ .set_src_ctrl = &tcpci_tcpm_set_src_ctrl,
#ifdef CONFIG_USB_PD_TCPC_LOW_POWER
- .enter_low_power_mode = &rt1718s_enter_low_power_mode,
+ .enter_low_power_mode = &rt1718s_enter_low_power_mode,
#endif
#ifdef CONFIG_USB_PD_FRS_TCPC
- .set_frs_enable = &rt1718s_set_frs_enable,
+ .set_frs_enable = &rt1718s_set_frs_enable,
#endif
- .set_bist_test_mode = &tcpci_set_bist_test_mode,
+ .set_bist_test_mode = &tcpci_set_bist_test_mode,
+ .get_bist_test_mode = &tcpci_get_bist_test_mode,
#ifdef CONFIG_USB_PD_TCPM_SBU
- .set_sbu = &rt1718s_set_sbu,
+ .set_sbu = &rt1718s_set_sbu,
#endif
};