summaryrefslogtreecommitdiff
path: root/driver/charger/rt9490.c
diff options
context:
space:
mode:
authorTom Hughes <tomhughes@chromium.org>2022-09-21 14:08:36 -0700
committerTom Hughes <tomhughes@chromium.org>2022-09-22 12:59:38 -0700
commitc453fd704268ef72de871b0c5ac7a989de662334 (patch)
treefcf6ce5810f9ff9e3c8cce434812dd75492269ed /driver/charger/rt9490.c
parent6c1587ca70f558b4f96b3f0b18ad8b027d3ba99d (diff)
parent28712dae9d7ed1e694f7622cc083afa71090d4d5 (diff)
downloadchrome-ec-c453fd704268ef72de871b0c5ac7a989de662334.tar.gz
Merge remote-tracking branch cros/main into firmware-fpmcu-dartmonkey-releasefirmware-fpmcu-dartmonkey-release
Generated by: ./util/update_release_branch.py --board dartmonkey --relevant_paths_file ./util/fingerprint-relevant-paths.txt firmware-fpmcu-dartmonkey-release Relevant changes: git log --oneline 6c1587ca70..28712dae9d -- board/nocturne_fp board/dartmonkey common/fpsensor docs/fingerprint driver/fingerprint util/getversion.sh ded9307b79 util/getversion.sh: Fix version when not in a git repo 956055e692 board: change Google USB vendor info 71b2ef709d Update license boilerplate text in source code files 33e11afda0 Revert "fpsensor: Build fpsensor source file with C++" c8d0360723 fpsensor: Build fpsensor source file with C++ bc113abd53 fpsensor: Fix g++ compiler error 150a58a0dc fpsensor: Fix fp_set_sensor_mode return type b33b5ce85b fpsensor: Remove nested designators for C++ compatibility 2e864b2539 tree-wide: const-ify argv for console commands 56d8b360f9 test: Add test for get ikm failure when seed not set 3a3d6c3690 test: Add test for fpsensor trivial key failure 233e6bbd08 fpsensor_crypto: Abstract calls to hmac_SHA256 0a041b285b docs/fingerprint: Typo correction c03fab67e2 docs/fingerprint: Fix the path of fputils.py 0b5d4baf5a util/getversion.sh: Fix empty file list handling 6e128fe760 FPMCU dev board environment with Satlab 3eb29b6aa5 builtin: Move ssize_t to sys/types.h 345d62ebd1 docs/fingerprint: Update power numbers for latest dartmonkey release c25ffdb316 common: Conditionally support printf %l and %i modifiers 9a3c514b45 test: Add a test to check if the debugger is connected 54e603413f Move standard library tests to their own file 43fa6b4bf8 docs/fingerprint: Update power numbers for latest bloonchipper release 25536f9a84 driver/fingerprint/fpc/bep/fpc_sensor_spi.c: Format with clang-format 4face99efd driver/fingerprint/fpc/libfp/fpc_sensor_pal.h: Format with clang-format 738de2b575 trng: Rename rand to trng_rand 14b8270edd docs/fingerprint: Update dragonclaw power numbers 0b268f93d1 driver/fingerprint/fpc/libfp/fpc_private.c: Format with clang-format f80da163f2 driver/fingerprint/fpc/libfp/fpc_private.h: Format with clang-format a0751778f4 board/nocturne_fp/ro_workarounds.c: Format with clang-format 5e9c85c9b1 driver/fingerprint/fpc/libfp/fpc_sensor_pal.c: Format with clang-format c1f9dd3cf8 driver/fingerprint/fpc/libfp/fpc_bio_algorithm.h: Format with clang-format eb1e1bed8d driver/fingerprint/fpc/libfp/fpc1145_private.h: Format with clang-format 6e7b611821 driver/fingerprint/fpc/bep/fpc_bio_algorithm.h: Format with clang-format e0589cd5e2 driver/fingerprint/fpc/bep/fpc1035_private.h: Format with clang-format 58f0246dbe board/nocturne_fp/board_ro.c: Format with clang-format 7905e556a0 common/fpsensor/fpsensor_crypto.c: Format with clang-format 21289d170c driver/fingerprint/fpc/bep/fpc1025_private.h: Format with clang-format 98a20f937e common/fpsensor/fpsensor_state.c: Format with clang-format a2d255d8af common/fpsensor/fpsensor.c: Format with clang-format 84e53a65da board/nocturne_fp/board.h: Format with clang-format 73055eeb3f driver/fingerprint/fpc/bep/fpc_private.c: Format with clang-format 0f7b5cb509 common/fpsensor/fpsensor_private.h: Format with clang-format 1ceade6e65 driver/fingerprint/fpc/bep/fpc_private.h: Format with clang-format dca9d74321 Revert "trng: Rename rand to trng_rand" a6b0b3554f trng: Rename rand to trng_rand 28d0b75b70 third_party/boringssl: Remove unused header BRANCH=None BUG=b:244387210 b:242720240 b:215613183 b:242720910 b:236386294 BUG=b:234181908 b:244781166 b:234781655 b:234143158 b:234181908 BUG=b:237344361 b:236025198 b:234181908 b:180945056 chromium:1098010 BUG=b:246424843 b:234181908 b:131913998 TEST=`make -j buildall` TEST=./util/run_device_tests.py --board dartmonkey Test "aes": PASSED Test "cec": PASSED Test "cortexm_fpu": PASSED Test "crc": PASSED Test "flash_physical": PASSED Test "flash_write_protect": PASSED Test "fpsensor_hw": PASSED Test "fpsensor_spi_ro": PASSED Test "fpsensor_spi_rw": PASSED Test "fpsensor_uart_ro": PASSED Test "fpsensor_uart_rw": PASSED Test "mpu_ro": PASSED Test "mpu_rw": PASSED Test "mutex": PASSED Test "pingpong": PASSED Test "printf": PASSED Test "queue": PASSED Test "rollback_region0": PASSED Test "rollback_region1": PASSED Test "rollback_entropy": PASSED Test "rtc": PASSED Test "sha256": PASSED Test "sha256_unrolled": PASSED Test "static_if": PASSED Test "stdlib": PASSED Test "system_is_locked_wp_on": PASSED Test "system_is_locked_wp_off": PASSED Test "timer_dos": PASSED Test "utils": PASSED Test "utils_str": PASSED Test "panic_data_dartmonkey_v2.0.2887": PASSED Test "panic_data_nocturne_fp_v2.2.64": PASSED Test "panic_data_nami_fp_v2.2.144": PASSED Force-Relevant-Builds: all Signed-off-by: Tom Hughes <tomhughes@chromium.org> Change-Id: I2c312583a709fedae8fe11d92c22328c3b634bc7
Diffstat (limited to 'driver/charger/rt9490.c')
-rw-r--r--driver/charger/rt9490.c152
1 files changed, 87 insertions, 65 deletions
diff --git a/driver/charger/rt9490.c b/driver/charger/rt9490.c
index 2d69e843e9..a1c73c47d5 100644
--- a/driver/charger/rt9490.c
+++ b/driver/charger/rt9490.c
@@ -1,4 +1,4 @@
-/* Copyright 2022 The Chromium OS Authors. All rights reserved.
+/* Copyright 2022 The ChromiumOS Authors
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*
@@ -7,6 +7,7 @@
#include "battery.h"
#include "battery_smart.h"
+#include "builtin/assert.h"
#include "builtin/endian.h"
#include "charger.h"
#include "charge_manager.h"
@@ -20,35 +21,45 @@
#include "usb_charge.h"
#include "usb_pd.h"
#include "util.h"
+#include "temp_sensor/temp_sensor.h"
+#include "temp_sensor/thermistor.h"
/* Console output macros */
-#define CPRINTF(format, args...) cprintf(CC_CHARGER, format, ## args)
+#define CPRINTF(format, args...) cprintf(CC_CHARGER, format, ##args)
#define CPRINTS(format, args...) \
- cprints(CC_CHARGER, "%s " format, "RT9490", ## args)
+ cprints(CC_CHARGER, "%s " format, "RT9490", ##args)
/* Charger parameters */
-#define CHARGER_NAME "rt9490"
-#define CHARGE_V_MAX 18800
-#define CHARGE_V_MIN 3000
-#define CHARGE_V_STEP 10
-#define CHARGE_I_MAX 5000
-#define CHARGE_I_MIN 50
-#define CHARGE_I_STEP 10
-#define INPUT_I_MAX 3300
-#define INPUT_I_MIN 100
-#define INPUT_I_STEP 10
+#define CHARGER_NAME "rt9490"
+#define CHARGE_V_MAX 18800
+#define CHARGE_V_MIN 3000
+#define CHARGE_V_STEP 10
+#define CHARGE_I_MAX 5000
+
+/* b/238980988
+ * RT9490 can't measure the 50mA charge current precisely due to insufficient
+ * ADC resolution, and faulty leads it into battery supply mode.
+ * the final number would be expected between 100mA ~ 200mA.
+ * Vendor has done the FT correlation and will revise the datasheet's
+ * CHARGE_I_MIN value from 50mA to 150mA as the final solution.
+ */
+#define CHARGE_I_MIN 150
+#define CHARGE_I_STEP 10
+#define INPUT_I_MAX 3300
+#define INPUT_I_MIN 100
+#define INPUT_I_STEP 10
/* Charger parameters */
static const struct charger_info rt9490_charger_info = {
- .name = CHARGER_NAME,
- .voltage_max = CHARGE_V_MAX,
- .voltage_min = CHARGE_V_MIN,
+ .name = CHARGER_NAME,
+ .voltage_max = CHARGE_V_MAX,
+ .voltage_min = CHARGE_V_MIN,
.voltage_step = CHARGE_V_STEP,
- .current_max = CHARGE_I_MAX,
- .current_min = CHARGE_I_MIN,
+ .current_max = CHARGE_I_MAX,
+ .current_min = CHARGE_I_MIN,
.current_step = CHARGE_I_STEP,
- .input_current_max = INPUT_I_MAX,
- .input_current_min = INPUT_I_MIN,
+ .input_current_max = INPUT_I_MAX,
+ .input_current_min = INPUT_I_MIN,
.input_current_step = INPUT_I_STEP,
};
@@ -62,13 +73,13 @@ static const struct rt9490_init_setting default_init_setting = {
static enum ec_error_list rt9490_read8(int chgnum, int reg, int *val)
{
return i2c_read8(chg_chips[chgnum].i2c_port,
- chg_chips[chgnum].i2c_addr_flags, reg, val);
+ chg_chips[chgnum].i2c_addr_flags, reg, val);
}
static enum ec_error_list rt9490_write8(int chgnum, int reg, int val)
{
return i2c_write8(chg_chips[chgnum].i2c_port,
- chg_chips[chgnum].i2c_addr_flags, reg, val);
+ chg_chips[chgnum].i2c_addr_flags, reg, val);
}
static enum ec_error_list rt9490_read16(int chgnum, int reg, uint16_t *val)
@@ -76,7 +87,8 @@ static enum ec_error_list rt9490_read16(int chgnum, int reg, uint16_t *val)
int reg_val;
RETURN_ERROR(i2c_read16(chg_chips[chgnum].i2c_port,
- chg_chips[chgnum].i2c_addr_flags, reg, &reg_val));
+ chg_chips[chgnum].i2c_addr_flags, reg,
+ &reg_val));
*val = be16toh(reg_val);
@@ -88,22 +100,21 @@ static enum ec_error_list rt9490_write16(int chgnum, int reg, uint16_t val)
int reg_val = htobe16(val);
return i2c_write16(chg_chips[chgnum].i2c_port,
- chg_chips[chgnum].i2c_addr_flags, reg, reg_val);
+ chg_chips[chgnum].i2c_addr_flags, reg, reg_val);
}
static int rt9490_field_update8(int chgnum, int reg, int mask, int val)
{
return i2c_field_update8(chg_chips[chgnum].i2c_port,
- chg_chips[chgnum].i2c_addr_flags,
- reg, mask, val);
+ chg_chips[chgnum].i2c_addr_flags, reg, mask,
+ val);
}
static inline int rt9490_update8(int chgnum, int reg, int mask,
enum mask_update_action action)
{
return i2c_update8(chg_chips[chgnum].i2c_port,
- chg_chips[chgnum].i2c_addr_flags,
- reg, mask, action);
+ chg_chips[chgnum].i2c_addr_flags, reg, mask, action);
}
static inline int rt9490_set_bit(int chgnum, int reg, int mask)
@@ -130,7 +141,7 @@ static const struct charger_info *rt9490_get_info(int chgnum)
static enum ec_error_list rt9490_get_current(int chgnum, int *current)
{
uint16_t val = 0;
- const struct charger_info * const info = rt9490_get_info(chgnum);
+ const struct charger_info *const info = rt9490_get_info(chgnum);
RETURN_ERROR(rt9490_read16(chgnum, RT9490_REG_ICHG_CTRL, &val));
@@ -159,7 +170,7 @@ static enum ec_error_list rt9490_set_current(int chgnum, int current)
static enum ec_error_list rt9490_get_voltage(int chgnum, int *voltage)
{
uint16_t val = 0;
- const struct charger_info * const info = rt9490_get_info(chgnum);
+ const struct charger_info *const info = rt9490_get_info(chgnum);
RETURN_ERROR(rt9490_read16(chgnum, RT9490_REG_VCHG_CTRL, &val));
@@ -287,48 +298,37 @@ static int rt9490_init_setting(int chgnum)
/* Disable boost-mode output voltage */
RETURN_ERROR(rt9490_enable_otg_power(chgnum, 0));
RETURN_ERROR(rt9490_set_otg_current_voltage(
- chgnum,
- default_init_setting.boost_current,
- default_init_setting.boost_voltage));
+ chgnum, default_init_setting.boost_current,
+ default_init_setting.boost_voltage));
#endif
/* Disable ILIM_HZ pin current limit */
- RETURN_ERROR(rt9490_clr_bit(
- chgnum, RT9490_REG_CHG_CTRL5, RT9490_ILIM_HZ_EN));
+ RETURN_ERROR(rt9490_clr_bit(chgnum, RT9490_REG_CHG_CTRL5,
+ RT9490_ILIM_HZ_EN));
/* Disable BC 1.2 detection by default. It will be enabled on demand */
RETURN_ERROR(rt9490_enable_chgdet_flow(chgnum, false));
/* Disable WDT */
RETURN_ERROR(rt9490_enable_wdt(chgnum, false));
/* Disable battery thermal protection */
- RETURN_ERROR(rt9490_set_bit(
- chgnum, RT9490_REG_ADD_CTRL0, RT9490_JEITA_COLD_HOT));
+ RETURN_ERROR(rt9490_set_bit(chgnum, RT9490_REG_ADD_CTRL0,
+ RT9490_JEITA_COLD_HOT));
/* Disable AUTO_AICR / AUTO_MIVR */
- RETURN_ERROR(rt9490_clr_bit(
- chgnum,
- RT9490_REG_ADD_CTRL0,
- RT9490_AUTO_AICR | RT9490_AUTO_MIVR));
- /* Disable charge timer */
- RETURN_ERROR(rt9490_clr_bit(
- chgnum,
- RT9490_REG_SAFETY_TMR_CTRL,
- RT9490_EN_TRICHG_TMR |
- RT9490_EN_PRECHG_TMR |
- RT9490_EN_FASTCHG_TMR));
+ RETURN_ERROR(rt9490_clr_bit(chgnum, RT9490_REG_ADD_CTRL0,
+ RT9490_AUTO_AICR | RT9490_AUTO_MIVR));
RETURN_ERROR(rt9490_set_mivr(chgnum, default_init_setting.mivr));
RETURN_ERROR(rt9490_set_ieoc(chgnum, default_init_setting.eoc_current));
RETURN_ERROR(rt9490_set_iprec(chgnum, batt_info->precharge_current));
RETURN_ERROR(rt9490_enable_adc(chgnum, true));
RETURN_ERROR(rt9490_enable_jeita(chgnum, false));
RETURN_ERROR(rt9490_field_update8(
- chgnum, RT9490_REG_CHG_CTRL1, RT9490_VAC_OVP_MASK,
- RT9490_VAC_OVP_26V << RT9490_VAC_OVP_SHIFT));
-
+ chgnum, RT9490_REG_CHG_CTRL1, RT9490_VAC_OVP_MASK,
+ RT9490_VAC_OVP_26V << RT9490_VAC_OVP_SHIFT));
/* Mask all interrupts except BC12 done */
RETURN_ERROR(rt9490_set_bit(chgnum, RT9490_REG_CHG_IRQ_MASK0,
RT9490_CHG_IRQ_MASK0_ALL));
RETURN_ERROR(rt9490_set_bit(chgnum, RT9490_REG_CHG_IRQ_MASK1,
RT9490_CHG_IRQ_MASK1_ALL &
- ~RT9490_BC12_DONE_MASK));
+ ~RT9490_BC12_DONE_MASK));
RETURN_ERROR(rt9490_set_bit(chgnum, RT9490_REG_CHG_IRQ_MASK2,
RT9490_CHG_IRQ_MASK2_ALL));
RETURN_ERROR(rt9490_set_bit(chgnum, RT9490_REG_CHG_IRQ_MASK3,
@@ -337,6 +337,10 @@ static int rt9490_init_setting(int chgnum)
RT9490_CHG_IRQ_MASK4_ALL));
RETURN_ERROR(rt9490_set_bit(chgnum, RT9490_REG_CHG_IRQ_MASK5,
RT9490_CHG_IRQ_MASK5_ALL));
+ /* Reduce SW freq from 1.5MHz to 1MHz
+ * for 10% higher current rating b/215294785
+ */
+ RETURN_ERROR(rt9490_enable_pwm_1mhz(CHARGER_SOLO, true));
return EC_SUCCESS;
}
@@ -344,7 +348,7 @@ static int rt9490_init_setting(int chgnum)
int rt9490_enable_pwm_1mhz(int chgnum, bool en)
{
return rt9490_update8(chgnum, RT9490_REG_ADD_CTRL1, RT9490_PWM_1MHZ_EN,
- en ? MASK_SET : MASK_CLR);
+ en ? MASK_SET : MASK_CLR);
}
static void rt9490_init(int chgnum)
@@ -409,7 +413,7 @@ static enum ec_error_list rt9490_get_actual_current(int chgnum, int *current)
uint16_t reg_val;
RETURN_ERROR(rt9490_read16(chgnum, RT9490_REG_IBAT_ADC, &reg_val));
- *current = (int)reg_val * 1000;
+ *current = (int)reg_val;
return EC_SUCCESS;
}
@@ -418,7 +422,7 @@ static enum ec_error_list rt9490_get_actual_voltage(int chgnum, int *voltage)
uint16_t reg_val;
RETURN_ERROR(rt9490_read16(chgnum, RT9490_REG_VBAT_ADC, &reg_val));
- *voltage = (int)reg_val * 1000;
+ *voltage = (int)reg_val;
return EC_SUCCESS;
}
@@ -433,7 +437,7 @@ static enum ec_error_list rt9490_get_vbus_voltage(int chgnum, int port,
uint16_t reg_val;
RETURN_ERROR(rt9490_read16(chgnum, RT9490_REG_VBUS_ADC, &reg_val));
- *voltage = (int)reg_val * 1000;
+ *voltage = (int)reg_val;
return EC_SUCCESS;
}
@@ -460,10 +464,11 @@ static enum ec_error_list rt9490_get_input_current_limit(int chgnum,
static enum ec_error_list rt9490_get_input_current(int chgnum,
int *input_current)
{
- uint16_t reg_val;
+ int16_t reg_val;
- RETURN_ERROR(rt9490_read16(chgnum, RT9490_REG_IBUS_ADC, &reg_val));
- *input_current = (int)reg_val * 1000;
+ RETURN_ERROR(rt9490_read16(chgnum, RT9490_REG_IBUS_ADC,
+ (uint16_t *)&reg_val));
+ *input_current = reg_val;
return EC_SUCCESS;
}
@@ -623,7 +628,7 @@ static void rt9490_update_charge_manager(int port,
if (new_bc12_type != current_bc12_type) {
if (current_bc12_type >= 0)
charge_manager_update_charge(current_bc12_type, port,
- NULL);
+ NULL);
if (new_bc12_type != CHARGE_SUPPLIER_NONE) {
struct charge_port_info chg = {
@@ -660,17 +665,16 @@ static void rt9490_usb_charger_task_event(const int port, uint32_t evt)
* to always trigger bc1.2 detection for other cases.
*/
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);
/* vbus change, start bc12 detection */
if (evt & USB_CHG_EVENT_VBUS) {
-
if (is_non_pd_sink)
rt9490_enable_chgdet_flow(CHARGER_SOLO, true);
else
- rt9490_update_charge_manager(
- port, CHARGE_SUPPLIER_NONE);
+ rt9490_update_charge_manager(port,
+ CHARGE_SUPPLIER_NONE);
}
/* detection done, update charge_manager and stop detection */
@@ -733,3 +737,21 @@ struct bc12_config bc12_ports[CHARGE_PORT_COUNT] = {
},
};
#endif /* CONFIG_BC12_SINGLE_DRIVER */
+
+int rt9490_get_thermistor_val(const struct temp_sensor_t *sensor, int *temp_ptr)
+{
+ uint16_t mv;
+ int idx = sensor->idx;
+#if IS_ENABLED(CONFIG_ZEPHYR) && IS_ENABLED(CONFIG_TEMP_SENSOR)
+ const struct thermistor_info *info = sensor->zephyr_info->thermistor;
+#else
+ const struct thermistor_info *info = &rt9490_thermistor_info;
+#endif
+
+ if (idx != 0)
+ return EC_ERROR_PARAM1;
+ RETURN_ERROR(rt9490_read16(idx, RT9490_REG_TS_ADC, &mv));
+ *temp_ptr = thermistor_linear_interpolate(mv, info);
+ *temp_ptr = C_TO_K(*temp_ptr);
+ return EC_SUCCESS;
+}