diff options
author | Yilun Lin <yllin@google.com> | 2018-06-14 10:44:56 +0800 |
---|---|---|
committer | Daisuke Nojiri <dnojiri@chromium.org> | 2018-06-21 18:08:22 -0700 |
commit | dcdcd341cfecaca583f53ab76c7b5d9141bb04a8 (patch) | |
tree | e1f7f56148913af33a05752311af77e7d83843c2 /driver | |
parent | 1e67a45739e302a12d1bfb4f6edcda5e1b925ebb (diff) | |
download | chrome-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.mk | 1 | ||||
-rw-r--r-- | driver/charger/rt946x.c | 47 | ||||
-rw-r--r-- | driver/charger/rt946x.h | 105 |
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, ®)) 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, ®)) + 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 */ |