summaryrefslogtreecommitdiff
path: root/driver
diff options
context:
space:
mode:
authorTJ Wu <tj_wu@richtek.com>2018-11-26 14:38:15 +0800
committerCommit Bot <commit-bot@chromium.org>2019-11-07 04:41:55 +0000
commit166aea52ce152350b9d4572dffd8b0ae0103d400 (patch)
tree9199bbb813aabd060839b6994884bc237599cfab /driver
parent8b17cc42def4f3af7bf1fb799b0f68c287246d82 (diff)
downloadchrome-ec-166aea52ce152350b9d4572dffd8b0ae0103d400.tar.gz
kukui: Support mt6370 bc12 detect apple/samsung TA
Support mt6370 bc12 detect apple/samsung TA TEST=plug in apple/samsung TA, and use power supply check charger type BUG=b:118791032 b:122866184 BRANCH=kukui Change-Id: Ieb684f7a3d38e3b36aab9bcf27cbc823b5a7df81 Signed-off-by: TJ Wu <tj_wu@richtek.com> Signed-off-by: Yilun Lin <yllin@google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1351910 Reviewed-by: Eric Yilun Lin <yllin@chromium.org> Commit-Queue: Hung-Te Lin <hungte@chromium.org> Tested-by: Hung-Te Lin <hungte@chromium.org>
Diffstat (limited to 'driver')
-rw-r--r--driver/charger/rt946x.c187
-rw-r--r--driver/charger/rt946x.h45
2 files changed, 190 insertions, 42 deletions
diff --git a/driver/charger/rt946x.c b/driver/charger/rt946x.c
index eec6abff26..d6933b8736 100644
--- a/driver/charger/rt946x.c
+++ b/driver/charger/rt946x.c
@@ -242,7 +242,7 @@ int rt946x_por_reset(void)
static int rt946x_reset_to_zero(void)
{
- int rv = 0;
+ int rv;
rv = charger_set_current(0);
if (rv)
@@ -888,40 +888,155 @@ static void rt946x_init(void)
DECLARE_HOOK(HOOK_INIT, rt946x_init, HOOK_PRIO_INIT_I2C + 1);
#ifdef HAS_TASK_USB_CHG
-static int rt946x_get_bc12_device_type(void)
-{
- int reg;
-
-#if defined(CONFIG_CHARGER_RT9466) || defined(CONFIG_CHARGER_RT9467)
- if (rt946x_read8(RT946X_REG_DPDM1, &reg))
- return CHARGE_SUPPLIER_NONE;
+#ifdef CONFIG_CHARGER_MT6370
+static int mt6370_detect_apple_samsung_ta(int usb_stat)
+{
+ int ret, reg;
+ int chg_type =
+ (usb_stat & MT6370_MASK_USB_STATUS) >> MT6370_SHIFT_USB_STATUS;
+ int dp_2_3v, dm_2_3v;
+
+ /* Only SDP/CDP/DCP could possibly be Apple/Samsung TA */
+ if (chg_type != MT6370_CHG_TYPE_SDPNSTD &&
+ chg_type != MT6370_CHG_TYPE_CDP &&
+ chg_type != MT6370_CHG_TYPE_DCP)
+ return chg_type;
+
+ if (chg_type == MT6370_CHG_TYPE_SDPNSTD ||
+ chg_type == MT6370_CHG_TYPE_CDP)
+ if (!(usb_stat & MT6370_MASK_DCD_TIMEOUT))
+ return chg_type;
+
+ /* Check D+ > 0.9V */
+ ret = rt946x_update_bits(MT6370_REG_QCSTATUS2, MT6360_MASK_CHECK_DPDM,
+ MT6370_MASK_APP_SS_EN | MT6370_MASK_APP_SS_PL);
+ ret |= rt946x_read8(MT6370_REG_QCSTATUS2, &reg);
+
+ if (ret)
+ return chg_type;
+
+ /* Normal port (D+ < 0.9V) */
+ if (!(reg & MT6370_MASK_SS_OUT))
+ return chg_type;
+
+ /* Samsung charger (D+ < 1.5V) */
+ if (!(reg & MT6370_MASK_APP_OUT))
+ return MT6370_CHG_TYPE_SAMSUNG_CHARGER;
+
+ /* Check D+ > 2.3 V */
+ ret = rt946x_update_bits(MT6370_REG_QCSTATUS2, MT6360_MASK_CHECK_DPDM,
+ MT6370_MASK_APP_REF | MT6370_MASK_APP_SS_PL |
+ MT6370_MASK_APP_SS_EN);
+ ret |= rt946x_read8(MT6370_REG_QCSTATUS2, &reg);
+ dp_2_3v = reg & MT6370_MASK_APP_OUT;
+
+ /* Check D- > 2.3 V */
+ ret |= rt946x_update_bits(
+ MT6370_REG_QCSTATUS2, MT6360_MASK_CHECK_DPDM,
+ MT6370_MASK_APP_REF | MT6370_MASK_APP_DPDM_IN |
+ MT6370_MASK_APP_SS_PL | MT6370_MASK_APP_SS_EN);
+ ret |= rt946x_read8(MT6370_REG_QCSTATUS2, &reg);
+ dm_2_3v = reg & MT6370_MASK_APP_OUT;
+
+ if (ret)
+ return chg_type;
+
+ /* Apple charger */
+ if (!dp_2_3v && !dm_2_3v)
+ /* Apple 2.5W charger */
+ return MT6370_CHG_TYPE_APPLE_0_5A_CHARGER;
+ else if (!dp_2_3v && dm_2_3v)
+ /* Apple 5W charger */
+ return MT6370_CHG_TYPE_APPLE_1_0A_CHARGER;
+ else if (dp_2_3v && !dm_2_3v)
+ /* Apple 10W charger */
+ return MT6370_CHG_TYPE_APPLE_2_1A_CHARGER;
+ else
+ /* Apple 12W charger */
+ return MT6370_CHG_TYPE_APPLE_2_4A_CHARGER;
+}
+#endif
- switch (reg & RT946X_MASK_BC12_TYPE) {
- case RT946X_MASK_SDP:
+static int mt6370_get_bc12_device_type(int charger_type)
+{
+ switch (charger_type) {
+ case MT6370_CHG_TYPE_SDP:
+ case MT6370_CHG_TYPE_SDPNSTD:
return CHARGE_SUPPLIER_BC12_SDP;
- case RT946X_MASK_CDP:
+ case MT6370_CHG_TYPE_CDP:
return CHARGE_SUPPLIER_BC12_CDP;
- case RT946X_MASK_DCP:
+ case MT6370_CHG_TYPE_DCP:
+ case MT6370_CHG_TYPE_SAMSUNG_CHARGER:
+ case MT6370_CHG_TYPE_APPLE_0_5A_CHARGER:
+ case MT6370_CHG_TYPE_APPLE_1_0A_CHARGER:
+ case MT6370_CHG_TYPE_APPLE_2_1A_CHARGER:
+ case MT6370_CHG_TYPE_APPLE_2_4A_CHARGER:
return CHARGE_SUPPLIER_BC12_DCP;
default:
return CHARGE_SUPPLIER_NONE;
}
-#elif defined(CONFIG_CHARGER_MT6370)
+}
+
+/* Returns a mt6370 charger_type. */
+static int mt6370_get_charger_type(void)
+{
+#ifdef CONFIG_CHARGER_MT6370
+ int reg;
+
if (rt946x_read8(MT6370_REG_USBSTATUS1, &reg))
return CHARGE_SUPPLIER_NONE;
+ return mt6370_detect_apple_samsung_ta(reg);
+#else
+ return CHARGE_SUPPLIER_NONE;
+#endif
+}
- switch ((reg & MT6370_MASK_USB_STATUS) >> MT6370_SHIFT_USB_STATUS) {
+static int mt6370_get_bc12_ilim(int charge_supplier)
+{
+ switch (charge_supplier) {
+ case MT6370_CHG_TYPE_APPLE_0_5A_CHARGER:
+ return 500;
+ case MT6370_CHG_TYPE_APPLE_1_0A_CHARGER:
+ return 1000;
+ case MT6370_CHG_TYPE_APPLE_2_1A_CHARGER:
+ if (IS_ENABLED(CONFIG_CHARGE_RAMP_SW) ||
+ IS_ENABLED(CONFIG_CHARGE_RAMP_HW))
+ return 2100;
+ case MT6370_CHG_TYPE_APPLE_2_4A_CHARGER:
+ if (IS_ENABLED(CONFIG_CHARGE_RAMP_SW) ||
+ IS_ENABLED(CONFIG_CHARGE_RAMP_HW))
+ return 2400;
+ case MT6370_CHG_TYPE_DCP:
+ if (IS_ENABLED(CONFIG_CHARGE_RAMP_SW) ||
+ IS_ENABLED(CONFIG_CHARGE_RAMP_HW))
+ /* A conservative value to prevent a bad charger. */
+ return RT946X_AICR_TYP2MAX(2000);
+ case MT6370_CHG_TYPE_CDP:
+ case MT6370_CHG_TYPE_SAMSUNG_CHARGER:
+ return 1500;
case MT6370_CHG_TYPE_SDP:
- case MT6370_CHG_TYPE_SDPNSTD:
+ default:
+ return USB_CHARGER_MIN_CURR_MA;
+ }
+}
+
+static int rt946x_get_bc12_device_type(int charger_type)
+{
+ int reg;
+
+ if (rt946x_read8(RT946X_REG_DPDM1, &reg))
+ return CHARGE_SUPPLIER_NONE;
+
+ switch (reg & RT946X_MASK_BC12_TYPE) {
+ case RT946X_MASK_SDP:
return CHARGE_SUPPLIER_BC12_SDP;
- case MT6370_CHG_TYPE_CDP:
+ case RT946X_MASK_CDP:
return CHARGE_SUPPLIER_BC12_CDP;
- case MT6370_CHG_TYPE_DCP:
+ case RT946X_MASK_DCP:
return CHARGE_SUPPLIER_BC12_DCP;
default:
return CHARGE_SUPPLIER_NONE;
}
-#endif
}
static int rt946x_get_bc12_ilim(int charge_supplier)
@@ -929,7 +1044,7 @@ static int rt946x_get_bc12_ilim(int charge_supplier)
switch (charge_supplier) {
case CHARGE_SUPPLIER_BC12_DCP:
if (IS_ENABLED(CONFIG_CHARGE_RAMP_SW) ||
- IS_ENABLED(CONFIG_CHARGE_RAMP_HW))
+ IS_ENABLED(CONFIG_CHARGE_RAMP_HW))
/* A conservative value to prevent a bad charger. */
return RT946X_AICR_TYP2MAX(2000);
/* fallback */
@@ -969,6 +1084,7 @@ void usb_charger_task(void *u)
{
struct charge_port_info chg;
int bc12_type = CHARGE_SUPPLIER_NONE;
+ int chg_type;
int reg = 0;
chg.voltage = USB_CHARGER_VOLTAGE_MV;
@@ -979,27 +1095,28 @@ void usb_charger_task(void *u)
if (reg & RT946X_MASK_DPDMIRQ_ATTACH) {
CPRINTS("VBUS attached: %dmV",
charger_get_vbus_voltage(0));
- bc12_type = rt946x_get_bc12_device_type();
-
+ if (IS_ENABLED(CONFIG_CHARGER_MT6370)) {
+ chg_type = mt6370_get_charger_type();
+ bc12_type =
+ mt6370_get_bc12_device_type(chg_type);
+ chg.current = mt6370_get_bc12_ilim(bc12_type);
+ } else {
+ bc12_type =
+ rt946x_get_bc12_device_type(chg_type);
+ chg.current = rt946x_get_bc12_ilim(bc12_type);
+ }
CPRINTS("BC12 type %d", bc12_type);
- if (bc12_type != CHARGE_SUPPLIER_NONE) {
-#ifdef CONFIG_WIRELESS_CHARGER_P9221_R7
- if ((bc12_type == CHARGE_SUPPLIER_BC12_SDP) &&
- wpc_chip_is_online()) {
+ if (bc12_type == CHARGE_SUPPLIER_NONE)
+ goto bc12_none;
+ if (IS_ENABLED(CONFIG_WIRELESS_CHARGER_P9221_R7) &&
+ bc12_type == CHARGE_SUPPLIER_BC12_SDP &&
+ wpc_chip_is_online()) {
p9221_notify_vbus_change(1);
CPRINTS("WPC ON");
- } else {
-
-#endif
- chg.current = rt946x_get_bc12_ilim(
- bc12_type);
- charge_manager_update_charge(bc12_type,
- 0, &chg);
-#ifdef CONFIG_WIRELESS_CHARGER_P9221_R7
- }
-#endif
}
+ charge_manager_update_charge(bc12_type, 0, &chg);
+bc12_none:
rt946x_enable_bc12_detection(0);
hook_notify(HOOK_AC_CHANGE);
}
diff --git a/driver/charger/rt946x.h b/driver/charger/rt946x.h
index 8918b8789f..86a0e7cd65 100644
--- a/driver/charger/rt946x.h
+++ b/driver/charger/rt946x.h
@@ -114,6 +114,7 @@
#define MT6370_REG_DEVICETYPE 0x22
#define RT946X_REG_DPDM1 MT6370_REG_DEVICETYPE
#define MT6370_REG_USBSTATUS1 0x27
+#define MT6370_REG_QCSTATUS2 0x29
#define RT946X_REG_CHGCTRL17 0X2B
#define RT946X_REG_CHGCTRL18 0X2C
#define RT946X_REG_CHGSTAT 0X4A
@@ -374,11 +375,13 @@
/* ========== CHGDPDM1 0x12 (rt946x) DEVICETYPE 0x22 (mt6370) ============ */
#define RT946X_SHIFT_USBCHGEN 7
+#define RT946X_SHIFT_DCDTIMEOUT 6
#define RT946X_SHIFT_DCP 2
#define RT946X_SHIFT_CDP 1
#define RT946X_SHIFT_SDP 0
#define RT946X_MASK_USBCHGEN BIT(RT946X_SHIFT_USBCHGEN)
+#define RT946X_MASK_DCDTIMEOUT BIT(RT946X_SHIFT_DCDTIMEOUT)
#define RT946X_MASK_DCP BIT(RT946X_SHIFT_DCP)
#define RT946X_MASK_CDP BIT(RT946X_SHIFT_CDP)
#define RT946X_MASK_SDP BIT(RT946X_SHIFT_SDP)
@@ -388,16 +391,44 @@
RT946X_MASK_SDP)
/* ========== USBSTATUS1 0x27 (mt6370) ============ */
-#define MT6370_SHIFT_USB_STATUS 4
+#define MT6370_SHIFT_DCD_TIMEOUT 2
+#define MT6370_SHIFT_USB_STATUS 4
#define MT6370_MASK_USB_STATUS 0x70
-#define MT6370_CHG_TYPE_NOVBUS 0
-#define MT6370_CHG_TYPE_BUSY 1
-#define MT6370_CHG_TYPE_SDP 2
-#define MT6370_CHG_TYPE_SDPNSTD 3
-#define MT6370_CHG_TYPE_DCP 4
-#define MT6370_CHG_TYPE_CDP 5
+#define MT6370_CHG_TYPE_NOVBUS 0
+#define MT6370_CHG_TYPE_BUSY 1
+#define MT6370_CHG_TYPE_SDP 2
+#define MT6370_CHG_TYPE_SDPNSTD 3
+#define MT6370_CHG_TYPE_DCP 4
+#define MT6370_CHG_TYPE_CDP 5
+#define MT6370_CHG_TYPE_SAMSUNG_CHARGER 6
+#define MT6370_CHG_TYPE_APPLE_0_5A_CHARGER 7
+#define MT6370_CHG_TYPE_APPLE_1_0A_CHARGER 8
+#define MT6370_CHG_TYPE_APPLE_2_1A_CHARGER 9
+#define MT6370_CHG_TYPE_APPLE_2_4A_CHARGER 10
+
+#define MT6370_MASK_DCD_TIMEOUT BIT(MT6370_SHIFT_DCD_TIMEOUT)
+
+/* ========== QCSTATUS2 0x29 (mt6370) ============ */
+#define MT6370_SHIFT_APP_OUT 5
+#define MT6370_SHIFT_SS_OUT 4
+#define MT6370_SHIFT_APP_REF 3
+#define MT6370_SHIFT_APP_DPDM_IN 2
+#define MT6370_SHIFT_APP_SS_PL 1
+#define MT6370_SHIFT_APP_SS_EN 0
+
+#define MT6370_MASK_APP_OUT BIT(MT6370_SHIFT_APP_OUT)
+#define MT6370_MASK_SS_OUT BIT(MT6370_SHIFT_SS_OUT)
+#define MT6370_MASK_APP_REF BIT(MT6370_SHIFT_APP_REF)
+#define MT6370_MASK_APP_DPDM_IN BIT(MT6370_SHIFT_APP_DPDM_IN)
+#define MT6370_MASK_APP_SS_PL BIT(MT6370_SHIFT_APP_SS_PL)
+#define MT6370_MASK_APP_SS_EN BIT(MT6370_SHIFT_APP_SS_EN)
+
+#define MT6360_MASK_CHECK_DPDM (MT6370_MASK_APP_SS_EN | \
+ MT6370_MASK_APP_SS_PL | \
+ MT6370_MASK_APP_DPDM_IN | \
+ MT6370_MASK_APP_REF)
/* ========== CHGCTRL18 0x1A ============ */
#define RT946X_SHIFT_IRCMP_RES 3