summaryrefslogtreecommitdiff
path: root/driver
diff options
context:
space:
mode:
authorYilun Lin <yllin@google.com>2018-06-14 10:44:56 +0800
committerDaisuke Nojiri <dnojiri@chromium.org>2018-06-21 18:08:22 -0700
commitdcdcd341cfecaca583f53ab76c7b5d9141bb04a8 (patch)
treee1f7f56148913af33a05752311af77e7d83843c2 /driver
parent1e67a45739e302a12d1bfb4f6edcda5e1b925ebb (diff)
downloadchrome-ec-dcdcd341cfecaca583f53ab76c7b5d9141bb04a8.tar.gz
charger/mt6370: add Mediatek mt6370 charger driver.
BRANCH=none BUG=b:80160408 TEST=1) add MT6370 config to kukui and build the code 2) hook up mt6370 eval board with dummy load 3) verify the i2c traffic: set voltage, set current, and get device id Change-Id: I47461530f9cc490a9dc2da74eede1297ebc4443e Signed-off-by: Yilun Lin <yllin@google.com> Reviewed-on: https://chromium-review.googlesource.com/1100365 Commit-Ready: Yilun Lin <yllin@chromium.org> Tested-by: Yilun Lin <yllin@chromium.org> Reviewed-by: Nicolas Boichat <drinkcat@chromium.org>
Diffstat (limited to 'driver')
-rw-r--r--driver/build.mk1
-rw-r--r--driver/charger/rt946x.c47
-rw-r--r--driver/charger/rt946x.h105
3 files changed, 144 insertions, 9 deletions
diff --git a/driver/build.mk b/driver/build.mk
index 230ca34af3..68b14f836e 100644
--- a/driver/build.mk
+++ b/driver/build.mk
@@ -57,6 +57,7 @@ driver-$(CONFIG_CHARGER_BQ25892)+=charger/bq2589x.o
driver-$(CONFIG_CHARGER_BQ25895)+=charger/bq2589x.o
driver-$(CONFIG_CHARGER_ISL9237)+=charger/isl923x.o
driver-$(CONFIG_CHARGER_ISL9238)+=charger/isl923x.o
+driver-$(CONFIG_CHARGER_MT6370)+=charger/rt946x.o
driver-$(CONFIG_CHARGER_RT9466)+=charger/rt946x.o
driver-$(CONFIG_CHARGER_RT9467)+=charger/rt946x.o
driver-$(CONFIG_CHARGER_SY21612)+=charger/sy21612.o
diff --git a/driver/charger/rt946x.c b/driver/charger/rt946x.c
index 27b92abf43..f14ad97a27 100644
--- a/driver/charger/rt946x.c
+++ b/driver/charger/rt946x.c
@@ -2,7 +2,7 @@
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*
- * Richtek rt946x battery charger driver.
+ * Richtek rt946x, Mediatek mt6370 battery charger driver.
*/
#include "battery.h"
@@ -75,6 +75,7 @@ enum rt946x_adc_in_sel {
RT946X_ADC_VBUS_DIV2,
};
+#if defined(CONFIG_CHARGER_RT9466) || defined(CONFIG_CHARGER_RT9467)
enum rt946x_irq {
RT946X_IRQ_CHGSTATC = 0,
RT946X_IRQ_CHGFAULT,
@@ -101,6 +102,29 @@ static const uint8_t rt946x_irq_maskall[RT946X_IRQ_COUNT] = {
0xFF,
#endif
};
+#elif defined(CONFIG_CHARGER_MT6370)
+enum rt946x_irq {
+ MT6370_IRQ_CHGSTAT1 = 0,
+ MT6370_IRQ_CHGSTAT2,
+ MT6370_IRQ_CHGSTAT3,
+ MT6370_IRQ_CHGSTAT4,
+ MT6370_IRQ_CHGSTAT5,
+ MT6370_IRQ_CHGSTAT6,
+ MT6370_IRQ_DPDMSTAT,
+ MT6370_IRQ_DICHGSTAT,
+ MT6370_IRQ_OVPCTRLSTAT,
+ RT946X_IRQ_COUNT,
+};
+
+static uint8_t rt946x_irqmask[RT946X_IRQ_COUNT] = {
+ /* TODO(b:110241788): choose irq init */
+ 0xF0, 0xF8, 0xF0, 0xF8, 0xFF, 0xE3, 0xE3, 0xF8,
+};
+
+static const uint8_t rt946x_irq_maskall[RT946X_IRQ_COUNT] = {
+ 0xF0, 0xF8, 0xF0, 0xF8, 0xFF, 0xE3, 0xE3, 0xF8,
+};
+#endif
/* Must be in ascending order */
static const uint16_t rt946x_boost_current[] = {
@@ -200,7 +224,7 @@ static int rt946x_por_reset(void)
if (rv)
return rv;
- return rt946x_set_bit(RT946X_REG_CORECTRL0, RT946X_MASK_RST);
+ return rt946x_set_bit(RT946X_REG_CORECTRL_RST, RT946X_MASK_RST);
}
static int rt946x_reset_to_zero(void)
@@ -220,7 +244,7 @@ static int rt946x_reset_to_zero(void)
static int rt946x_enable_bc12_detection(int en)
{
-#ifdef CONFIG_CHARGER_RT9467
+#if defined(CONFIG_CHARGER_RT9467) || defined(CONFIG_CHARGER_MT6370)
return (en ? rt946x_set_bit : rt946x_clr_bit)
(RT946X_REG_DPDM1, RT946X_MASK_USBCHGEN);
#endif
@@ -831,6 +855,7 @@ 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;
@@ -844,6 +869,22 @@ static int rt946x_get_bc12_device_type(void)
default:
return CHARGE_SUPPLIER_NONE;
}
+#elif defined(CONFIG_CHARGER_MT6370)
+ if (rt946x_read8(MT6370_REG_USBSTATUS1, &reg))
+ return CHARGE_SUPPLIER_NONE;
+
+ switch ((reg & MT6370_MASK_USB_STATUS) >> MT6370_SHIFT_USB_STATUS) {
+ case MT6370_CHG_TYPE_SDP:
+ case MT6370_CHG_TYPE_SDPNSTD:
+ return CHARGE_SUPPLIER_BC12_SDP;
+ case MT6370_CHG_TYPE_CDP:
+ return CHARGE_SUPPLIER_BC12_CDP;
+ case MT6370_CHG_TYPE_DCP:
+ return CHARGE_SUPPLIER_BC12_DCP;
+ default:
+ return CHARGE_SUPPLIER_NONE;
+ }
+#endif
}
static int rt946x_get_bc12_ilim(int charge_supplier)
diff --git a/driver/charger/rt946x.h b/driver/charger/rt946x.h
index 208a8e80fe..9ff4eaad10 100644
--- a/driver/charger/rt946x.h
+++ b/driver/charger/rt946x.h
@@ -2,7 +2,7 @@
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*
- * Richtek rt9466/rt9467 battery charger driver.
+ * Richtek rt9466/rt9467, Mediatek mt6370 battery charger driver.
*/
#ifndef __CROS_EC_RT946X_H
@@ -21,8 +21,10 @@
#define INPUT_I_MIN 100
#define INPUT_I_STEP 50
-/* Registers */
+/* Registers for rt9466, rt9467 */
+#if defined(CONFIG_CHARGER_RT9466) || defined(CONFIG_CHARGER_RT9467)
#define RT946X_REG_CORECTRL0 0x00
+#define RT946X_REG_CORECTRL_RST RT946X_REG_CORECTRL0
#define RT946X_REG_CHGCTRL1 0x01
#define RT946X_REG_CHGCTRL2 0x02
#define RT946X_REG_CHGCTRL3 0x03
@@ -84,6 +86,66 @@
#define RT946X_REG_DPDMIRQCTRL 0x66
#endif
+#elif defined(CONFIG_CHARGER_MT6370)
+/* Registers for mt6370 */
+#define RT946X_REG_DEVICEID 0x00
+#define RT946X_REG_CORECTRL1 0x01
+#define RT946X_REG_CORECTRL2 0x02
+#define RT946X_REG_CORECTRL_RST RT946X_REG_CORECTRL2
+#define RT946X_REG_CHGCTRL1 0x11
+#define RT946X_REG_CHGCTRL2 0x12
+#define RT946X_REG_CHGCTRL3 0x13
+#define RT946X_REG_CHGCTRL4 0x14
+#define RT946X_REG_CHGCTRL5 0x15
+#define RT946X_REG_CHGCTRL6 0x16
+#define RT946X_REG_CHGCTRL7 0x17
+#define RT946X_REG_CHGCTRL8 0x18
+#define RT946X_REG_CHGCTRL9 0x19
+#define RT946X_REG_CHGCTRL10 0x1A
+#define RT946X_REG_CHGCTRL11 0x1B
+#define RT946X_REG_CHGCTRL12 0x1C
+#define RT946X_REG_CHGCTRL13 0x1D
+#define RT946X_REG_CHGCTRL14 0x1E
+#define RT946X_REG_CHGCTRL15 0x1F
+#define RT946X_REG_CHGCTRL16 0x20
+#define RT946X_REG_CHGADC 0x21
+#define MT6370_REG_DEVICETYPE 0x22
+#define RT946X_REG_DPDM1 MT6370_REG_DEVICETYPE
+#define MT6370_REG_USBSTATUS1 0x27
+#define RT946X_REG_CHGCTRL17 0X2B
+#define RT946X_REG_CHGCTRL18 0X2C
+#define RT946X_REG_CHGSTAT 0X4A
+#define RT946X_REG_CHGNTC 0X4B
+#define RT946X_REG_ADCDATAH 0X4C
+#define RT946X_REG_ADCDATAL 0X4D
+#define RT946X_REG_DPDMIRQ 0xC6
+/* status event */
+#define MT6370_REG_CHGSTAT1 0xD0
+#define RT946X_REG_CHGSTATC MT6370_REG_CHGSTAT1
+#define MT6370_REG_CHGSTAT2 0xD1
+#define RT946X_REG_CHGFAULT MT6370_REG_CHGSTAT2
+#define MT6370_REG_CHGSTAT3 0xD2
+#define MT6370_REG_CHGSTAT4 0xD3
+#define MT6370_REG_CHGSTAT5 0xD4
+#define MT6370_REG_CHGSTAT6 0xD5
+#define MT6370_REG_DPDMSTAT 0xD6
+#define MT6370_REG_DICHGSTAT 0xD7
+#define MT6370_REG_OVPCTRLSTAT 0xD8
+/* irq mask */
+#define MT6370_REG_CHGMASK1 0xE0
+#define RT946X_REG_CHGSTATCCTRL MT6370_REG_CHGMASK1
+#define MT6370_REG_CHGMASK2 0xE1
+#define MT6370_REG_CHGMASK3 0xE2
+#define MT6370_REG_CHGMASK4 0xE3
+#define MT6370_REG_CHGMASK5 0xE4
+#define MT6370_REG_CHGMASK6 0xE5
+#define MT6370_REG_DPDMMASK1 0xE6
+#define MT6370_REG_DICHGMASK 0xE7
+#define MT6370_REG_OVPCTRLMASK 0xE8
+#else
+#error "No suitable charger option defined"
+#endif
+
/* EOC current */
#define RT946X_IEOC_MIN 100
#define RT946X_IEOC_MAX 850
@@ -227,7 +289,7 @@
#define RT946X_MASK_ADC_IN_SEL (0xF << RT946X_SHIFT_ADC_IN_SEL)
#define RT946X_MASK_ADC_START (1 << RT946X_SHIFT_ADC_START)
-/* ========== CHGDPDM1 0x12 ============ */
+/* ========== CHGDPDM1 0x12 (rt946x) DEVICETYPE 0x22 (mt6370) ============ */
#define RT946X_SHIFT_USBCHGEN 7
#define RT946X_SHIFT_DCP 2
#define RT946X_SHIFT_CDP 1
@@ -242,6 +304,18 @@
RT946X_MASK_CDP | \
RT946X_MASK_SDP)
+/* ========== USBSTATUS1 0x27 (mt6370) ============ */
+#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
+
/* ========== CHGCTRL18 0x1A ============ */
#define RT946X_SHIFT_IRCMP_RES 3
#define RT946X_SHIFT_IRCMP_VCLAMP 0
@@ -265,12 +339,13 @@
#define RT946X_MASK_BATNTC_FAULT 0x70
-/* ========== CHGSTATC 0x50 ============ */
+/* ========== CHGSTATC 0x50 (rt946x) ============ */
#define RT946X_SHIFT_PWR_RDY 7
#define RT946X_MASK_PWR_RDY (1 << RT946X_SHIFT_PWR_RDY)
-/* ========== CHGFAULT 0x51 ============ */
+/* ========== CHGFAULT 0x51 (rt946x) ============ */
+#if defined(CONFIG_CHARGER_RT9466) || defined(CONFIG_CHARGER_RT9467)
#define RT946X_SHIFT_CHG_VSYSUV 4
#define RT946X_SHIFT_CHG_VSYSOV 5
#define RT946X_SHIFT_CHG_VBATOV 6
@@ -280,9 +355,10 @@
#define RT946X_MASK_CHG_VSYSOV (1 << RT946X_SHIFT_CHG_VSYSOV)
#define RT946X_MASK_CHG_VBATOV (1 << RT946X_SHIFT_CHG_VBATOV)
#define RT946X_MASK_CHG_VBUSOV (1 << RT946X_SHIFT_CHG_VBUSOV)
+#endif
/* ========== DPDMIRQ 0x56 ============ */
-#ifdef CONFIG_CHARGER_RT9467
+#if defined(CONFIG_CHARGER_RT9467) || defined(CONFIG_CHARGER_MT6370)
#define RT946X_SHIFT_DPDMIRQ_DETACH 1
#define RT946X_SHIFT_DPDMIRQ_ATTACH 0
@@ -290,6 +366,17 @@
#define RT946X_MASK_DPDMIRQ_ATTACH (1 << RT946X_SHIFT_DPDMIRQ_ATTACH)
#endif
+/* ========== CHGSTAT2 0xD1 (mt6370) ============ */
+#ifdef CONFIG_CHARGER_MT6370
+#define MT6370_SHIFT_CHG_VBUSOV_STAT 7
+#define MT6370_SHIFT_CHG_VBATOV_STAT 6
+
+#define RT946X_MASK_CHG_VBATOV MT6370_SHIFT_CHG_VBATOV_STAT
+
+#define MT6370_MASK_CHG_VBUSOV_STAT (1 << MT6370_SHIFT_CHG_VBUSOV_STAT)
+#define MT6370_MASK_CHG_VBATOV_STAT (1 << MT6370_SHIFT_CHG_VBATOV_STAT)
+#endif
+
/* ========== Variant-specific configuration ============ */
#if defined(CONFIG_CHARGER_RT9466)
#define RT946X_CHARGER_NAME "rt9466"
@@ -299,6 +386,12 @@
#define RT946X_CHARGER_NAME "rt9467"
#define RT946X_VENDOR_ID 0x90
#define RT946X_ADDR (0x5B << 1)
+#elif defined(CONFIG_CHARGER_MT6370)
+ #define RT946X_CHARGER_NAME "mt6370"
+ #define RT946X_VENDOR_ID 0xE0
+ #define RT946X_ADDR (0x34 << 1)
+#else
+ #error "No suitable charger option defined"
#endif
/* RT946x specific interface functions */