summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTing Shen <phoenixshen@google.com>2023-03-09 15:15:46 +0800
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2023-03-13 08:59:58 +0000
commite0bd01f81c927758aa43d469338e19c4c9c47952 (patch)
tree8b3eecf88dd9ea35e24385eff4be6e63d88382a0
parent142a8521b5c335a7ae75ec8405ba00cc7269252f (diff)
downloadchrome-ec-e0bd01f81c927758aa43d469338e19c4c9c47952.tar.gz
rt1739: implement set_vbus_source_current_limit
Implements set_vbus_source_current_limit and initialize source ocp level to a proper limit based on RP config. BUG=b:271942294 TEST=On geralt, `i2c read_byte i2c@f01cc0 0x70 0x25` returns 0x12 BRANCH=none LOW_COVERAGE_REASON=early bringup Change-Id: I583ec6101939410e29bf0a537637263ac5780dd6 Signed-off-by: Ting Shen <phoenixshen@google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/4323579 Commit-Queue: Ting Shen <phoenixshen@chromium.org> Reviewed-by: Eric Yilun Lin <yllin@google.com> Tested-by: Ting Shen <phoenixshen@chromium.org>
-rw-r--r--driver/ppc/rt1739.c34
-rw-r--r--driver/ppc/rt1739.h1
2 files changed, 31 insertions, 4 deletions
diff --git a/driver/ppc/rt1739.c b/driver/ppc/rt1739.c
index e85f4f6202..c6c3f46ae8 100644
--- a/driver/ppc/rt1739.c
+++ b/driver/ppc/rt1739.c
@@ -246,6 +246,27 @@ static int rt1739_set_frs_enable(int port, int enable)
return EC_SUCCESS;
}
+static int rt1739_src_oc(enum tcpc_rp_value rp)
+{
+ switch (rp) {
+ case TYPEC_RP_3A0:
+ return RT1739_LV_SRC_OCP_SEL_3_3A;
+ case TYPEC_RP_1A5:
+ return RT1739_LV_SRC_OCP_SEL_1_75A;
+ default:
+ return RT1739_LV_SRC_OCP_SEL_1_25A;
+ }
+}
+
+static int rt1739_set_vbus_source_current_limit(int port, enum tcpc_rp_value rp)
+{
+ int reg;
+
+ RETURN_ERROR(read_reg(port, RT1739_REG_VBUS_OC_SETTING, &reg));
+ reg = (reg & ~RT1739_LV_SRC_OCP_MASK) | rt1739_src_oc(rp);
+ return write_reg(port, RT1739_REG_VBUS_OC_SETTING, reg);
+}
+
static int rt1739_init(int port)
{
int device_id, oc_setting, sys_ctrl, vbus_switch_ctrl;
@@ -305,12 +326,16 @@ static int rt1739_init(int port)
(RT1739_OVP_SEL_23_0V << RT1739_VIN_HV_OVP_SEL_SHIFT)));
/* VBUS OCP -> 3.3A (or 5.5A for ES2 HV Sink) */
RETURN_ERROR(rt1739_get_device_id(port, &device_id));
+ oc_setting = 0;
if (device_id == RT1739_DEVICE_ID_ES2)
- oc_setting = (RT1739_LV_SRC_OCP_SEL_3_3A |
- RT1739_HV_SINK_OCP_SEL_5_5A);
+ oc_setting |= RT1739_HV_SINK_OCP_SEL_5_5A;
else
- oc_setting = (RT1739_LV_SRC_OCP_SEL_3_3A |
- RT1739_HV_SINK_OCP_SEL_3_3A);
+ oc_setting |= RT1739_HV_SINK_OCP_SEL_3_3A;
+#if defined(CONFIG_USB_PD_MAX_SINGLE_SOURCE_CURRENT)
+ oc_setting |= rt1739_src_oc(CONFIG_USB_PD_MAX_SINGLE_SOURCE_CURRENT);
+#else
+ oc_setting |= rt1739_src_oc(CONFIG_USB_PD_PULLUP);
+#endif
RETURN_ERROR(write_reg(port, RT1739_REG_VBUS_OC_SETTING, oc_setting));
return EC_SUCCESS;
@@ -468,6 +493,7 @@ const struct ppc_drv rt1739_ppc_drv = {
#ifdef CONFIG_USB_PD_VBUS_DETECT_PPC
.is_vbus_present = &rt1739_is_vbus_present,
#endif
+ .set_vbus_source_current_limit = &rt1739_set_vbus_source_current_limit,
#ifdef CONFIG_USBC_PPC_POLARITY
.set_polarity = &rt1739_set_polarity,
#endif
diff --git a/driver/ppc/rt1739.h b/driver/ppc/rt1739.h
index 620045ef40..9fab34229e 100644
--- a/driver/ppc/rt1739.h
+++ b/driver/ppc/rt1739.h
@@ -67,6 +67,7 @@
#define RT1739_REG_VBUS_OC_SETTING 0x25
#define RT1739_LV_SRC_OCP_SHIFT 4
+#define RT1739_LV_SRC_OCP_MASK (3 << RT1739_LV_SRC_OCP_SHIFT)
#define RT1739_LV_SRC_OCP_SEL_1_25A (0 << RT1739_LV_SRC_OCP_SHIFT)
#define RT1739_LV_SRC_OCP_SEL_1_75A (1 << RT1739_LV_SRC_OCP_SHIFT)
#define RT1739_LV_SRC_OCP_SEL_2_25A (2 << RT1739_LV_SRC_OCP_SHIFT)