coreboot-libre-fam15h-rdimm/3rdparty/chromeec/driver/charger/bd9995x.h

365 lines
14 KiB
C
Raw Permalink Normal View History

2024-03-04 11:14:53 +01:00
/* Copyright 2016 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*
* ROHM BD9995X battery charger driver.
*/
#ifndef __CROS_EC_BD9995X_H
#define __CROS_EC_BD9995X_H
#define BD9995X_ADDR_FLAGS 0x09
#define I2C_ADDR_CHARGER_FLAGS BD9995X_ADDR_FLAGS
#define BD9995X_CHARGER_NAME "bd9995x"
#define BD99955_CHIP_ID 0x221
#define BD99956_CHIP_ID 0x331
/* BD9995X commands to change the command code map */
enum bd9995x_command {
BD9995X_BAT_CHG_COMMAND,
BD9995X_EXTENDED_COMMAND,
BD9995X_DEBUG_COMMAND,
BD9995X_INVALID_COMMAND
};
/*
* BD9995X has two external VBUS inputs (named VBUS and VCC) and two sets
* of registers / bits for control. This entire driver is written under the
* assumption that the physical VBUS port corresponds to PD port 0, and the
* physical VCC port corresponds to PD port 1.
*/
enum bd9995x_charge_port {
BD9995X_CHARGE_PORT_VBUS,
BD9995X_CHARGE_PORT_VCC,
BD9995X_CHARGE_PORT_BOTH,
};
/* Charger parameters */
#define CHARGER_NAME BD9995X_CHARGER_NAME
#define CHARGE_V_MAX 19200
#define CHARGE_V_MIN 3072
#define CHARGE_V_STEP 16
#define CHARGE_I_MAX 16320
#define CHARGE_I_MIN 128
#define CHARGE_I_OFF 0
#define CHARGE_I_STEP 64
#define INPUT_I_MAX 16352
#define INPUT_I_MIN 512
#define INPUT_I_STEP 32
/* Min. charge current w/ no battery to prevent collapse */
#define BD9995X_NO_BATTERY_CHARGE_I_MIN 512
/*
* BC1.2 minimum voltage threshold.
* BC1.2 charging port output voltage range is 4.75V to 5.25V,
* BD9995X Anti-Collapse Threshold Voltage Accuracy is -100mV to +100mV,
* and Delta of 50mV.
*/
#define BD9995X_BC12_MIN_VOLTAGE 4600
/* Battery Charger Commands */
#define BD9995X_CMD_CHG_CURRENT 0x14
#define BD9995X_CMD_CHG_VOLTAGE 0x15
#define BD9995X_CMD_IBUS_LIM_SET 0x3C
#define BD9995X_CMD_ICC_LIM_SET 0x3D
#define BD9995X_CMD_PROTECT_SET 0x3E
#define BD9995X_CMD_MAP_SET 0x3F
/* Extended commands */
#define BD9995X_CMD_CHGSTM_STATUS 0x00
#define BD9995X_CMD_VBAT_VSYS_STATUS 0x01
#define BD9995X_CMD_VBUS_VCC_STATUS 0x02
#define BD9995X_CMD_VBUS_VCC_STATUS_VCC_DETECT BIT(8)
#define BD9995X_CMD_VBUS_VCC_STATUS_VBUS_DETECT BIT(0)
#define BD9995X_CMD_CHGOP_STATUS 0x03
#define BD9995X_CMD_CHGOP_STATUS_BATTEMP2 BIT(10)
#define BD9995X_CMD_CHGOP_STATUS_BATTEMP1 BIT(9)
#define BD9995X_CMD_CHGOP_STATUS_BATTEMP0 BIT(8)
#define BD9995X_BATTTEMP_MASK 0x700
#define BD9995X_CMD_CHGOP_STATUS_BATTEMP_ROOMTEMP 0
#define BD9995X_CMD_CHGOP_STATUS_BATTEMP_HOT1 1
#define BD9995X_CMD_CHGOP_STATUS_BATTEMP_HOT2 2
#define BD9995X_CMD_CHGOP_STATUS_BATTEMP_HOT3 3
#define BD9995X_CMD_CHGOP_STATUS_BATTEMP_COLD1 4
#define BD9995X_CMD_CHGOP_STATUS_BATTEMP_COLD2 5
#define BD9995X_CMD_CHGOP_STATUS_BATTEMP_DISABLE 6
#define BD9995X_CMD_CHGOP_STATUS_BATTEMP_BATOPEN 7
#define BD9995X_CMD_CHGOP_STATUS_RBOOST_UV BIT(1)
#define BD9995X_CMD_WDT_STATUS 0x04
#define BD9995X_CMD_CUR_ILIM_VAL 0x05
#define BD9995X_CMD_SEL_ILIM_VAL 0x06
#define BD9995X_CMD_EXT_IBUS_LIM_SET 0x07
#define BD9995X_CMD_EXT_ICC_LIM_SET 0x08
#define BD9995X_CMD_IOTG_LIM_SET 0x09
#define BD9995X_CMD_VIN_CTRL_SET 0x0A
#define BD9995X_CMD_VIN_CTRL_SET_VSYS_PRIORITY BIT(4)
#define BD9995X_CMD_VIN_CTRL_SET_PP_BOTH_THRU BIT(11)
#define BD9995X_CMD_VIN_CTRL_SET_VBUS_PRIORITY BIT(7)
#define BD9995X_CMD_VIN_CTRL_SET_VBUS_EN BIT(6)
#define BD9995X_CMD_VIN_CTRL_SET_VCC_EN BIT(5)
#define BD9995X_CMD_CHGOP_SET1 0x0B
#define BD9995X_CMD_CHGOP_SET1_DCP_2500_SEL BIT(15)
#define BD9995X_CMD_CHGOP_SET1_SDP_500_SEL BIT(14)
#define BD9995X_CMD_CHGOP_SET1_ILIM_AUTO_DISEN BIT(13)
#define BD9995X_CMD_CHGOP_SET1_VCC_BC_DISEN BIT(11)
#define BD9995X_CMD_CHGOP_SET1_VBUS_BC_DISEN BIT(10)
#define BD9995X_CMD_CHGOP_SET1_SDP_CHG_TRIG_EN BIT(9)
#define BD9995X_CMD_CHGOP_SET1_SDP_CHG_TRIG BIT(8)
#define BD9995X_CMD_CHGOP_SET2 0x0C
#define BD9995X_CMD_CHGOP_SET2_BATT_LEARN BIT(8)
#define BD9995X_CMD_CHGOP_SET2_CHG_EN BIT(7)
#define BD9995X_CMD_CHGOP_SET2_USB_SUS BIT(6)
#define BD9995X_CMD_CHGOP_SET2_DCDC_CLK_SEL (3 << 2)
#define BD9995X_CMD_CHGOP_SET2_DCDC_CLK_SEL_600 (0 << 2)
#define BD9995X_CMD_CHGOP_SET2_DCDC_CLK_SEL_857 BIT(2)
#define BD9995X_CMD_CHGOP_SET2_DCDC_CLK_SEL_1000 (2 << 2)
#define BD9995X_CMD_CHGOP_SET2_DCDC_CLK_SEL_1200 (3 << 2)
#define BD9995X_CMD_VBUSCLPS_TH_SET 0x0D
#define BD9995X_CMD_VCCCLPS_TH_SET 0x0E
#define BD9995X_CMD_CHGWDT_SET 0x0F
#define BD9995X_CMD_BATTWDT_SET 0x10
#define BD9995X_CMD_VSYSREG_SET 0x11
#define BD9995X_CMD_VSYSVAL_THH_SET 0x12
#define BD9995X_CMD_VSYSVAL_THL_SET 0x13
#define BD9995X_CMD_ITRICH_SET 0x14
#define BD9995X_CMD_IPRECH_SET 0x15
#define BD9995X_IPRECH_MAX 1024
#define BD9995X_CMD_ICHG_SET 0x16
#define BD9995X_CMD_ITERM_SET 0x17
#define BD9995X_CMD_VPRECHG_TH_SET 0x18
#define BD9995X_CMD_VRBOOST_SET 0x19
#define BD9995X_CMD_VFASTCHG_REG_SET1 0x1A
#define BD9995X_CMD_VFASTCHG_REG_SET2 0x1B
#define BD9995X_CMD_VFASTCHG_REG_SET3 0x1C
#define BD9995X_CMD_VRECHG_SET 0x1D
#define BD9995X_CMD_VBATOVP_SET 0x1E
#define BD9995X_CMD_IBATSHORT_SET 0x1F
#define BD9995X_CMD_PROCHOT_CTRL_SET 0x20
#define BD9995X_CMD_PROCHOT_CTRL_SET_PROCHOT_EN4 BIT(4)
#define BD9995X_CMD_PROCHOT_CTRL_SET_PROCHOT_EN3 BIT(3)
#define BD9995X_CMD_PROCHOT_CTRL_SET_PROCHOT_EN2 BIT(2)
#define BD9995X_CMD_PROCHOT_CTRL_SET_PROCHOT_EN1 BIT(1)
#define BD9995X_CMD_PROCHOT_CTRL_SET_PROCHOT_EN0 BIT(0)
#define BD9995X_CMD_PROCHOT_ICRIT_SET 0x21
#define BD9995X_CMD_PROCHOT_INORM_SET 0x22
#define BD9995X_CMD_PROCHOT_IDCHG_SET 0x23
#define BD9995X_CMD_PROCHOT_VSYS_SET 0x24
#define BD9995X_CMD_PMON_IOUT_CTRL_SET 0x25
#define BD9995X_CMD_PMON_IOUT_CTRL_SET_IMON_INSEL BIT(9)
#define BD9995X_CMD_PMON_IOUT_CTRL_SET_PMON_INSEL BIT(8)
#define BD9995X_CMD_PMON_IOUT_CTRL_SET_IOUT_OUT_EN BIT(7)
#define BD9995X_CMD_PMON_IOUT_CTRL_SET_IOUT_SOURCE_SEL BIT(6)
#define BD9995X_CMD_PMON_IOUT_CTRL_SET_IOUT_GAIN_SET_MASK 0x30
#define BD9995X_CMD_PMON_IOUT_CTRL_SET_IOUT_GAIN_SET_40V 0x03
#define BD9995X_CMD_PMON_IOUT_CTRL_SET_IOUT_GAIN_SET_20V 0x02
#define BD9995X_CMD_PMON_IOUT_CTRL_SET_IOUT_GAIN_SET_10V 0x01
#define BD9995X_CMD_PMON_IOUT_CTRL_SET_IOUT_GAIN_SET_05V 0x00
#define BD9995X_CMD_PMON_IOUT_CTRL_SET_PMON_OUT_EN BIT(3)
#define BD9995X_CMD_PMON_IOUT_CTRL_SET_PMON_GAIN_SET_MASK 0x07
#define BD9995X_CMD_PMON_IOUT_CTRL_SET_PMON_GAIN_SET_64UAW 0x06
#define BD9995X_CMD_PMON_IOUT_CTRL_SET_PMON_GAIN_SET_32UAW 0x05
#define BD9995X_CMD_PMON_IOUT_CTRL_SET_PMON_GAIN_SET_16UAW 0x04
#define BD9995X_CMD_PMON_IOUT_CTRL_SET_PMON_GAIN_SET_08UAW 0x03
#define BD9995X_CMD_PMON_IOUT_CTRL_SET_PMON_GAIN_SET_04UAW 0x02
#define BD9995X_CMD_PMON_IOUT_CTRL_SET_PMON_GAIN_SET_02UAW 0x01
#define BD9995X_CMD_PMON_IOUT_CTRL_SET_PMON_GAIN_SET_01UAW 0x00
#define BD9995X_PMON_IOUT_ADC_READ_COUNT 128
#define BD9995X_CMD_PMON_DACIN_VAL 0x26
#define BD9995X_CMD_IOUT_DACIN_VAL 0x27
#define BD9995X_CMD_VCC_UCD_SET 0x28
/* Bits for both VCC_UCD_SET and VBUS_UCD_SET regs */
/* Retry BC1.2 detection on set */
#define BD9995X_CMD_UCD_SET_BCSRETRY BIT(12)
/* Enable BC1.2 detection, will automatically occur on VBUS detect */
#define BD9995X_CMD_UCD_SET_USBDETEN BIT(7)
/* USB switch state auto-control */
#define BD9995X_CMD_UCD_SET_USB_SW_EN BIT(1)
/* USB switch state, 1 = ON, only meaningful when USB_SW_EN = 0 */
#define BD9995X_CMD_UCD_SET_USB_SW BIT(0)
#define BD9995X_CMD_VCC_UCD_STATUS 0x29
/* Bits for both VCC_UCD_STATUS and VBUS_UCD_STATUS regs */
#define BD9995X_CMD_UCD_STATUS_DCDFAIL BIT(15)
#define BD9995X_CMD_UCD_STATUS_CHGPORT1 BIT(13)
#define BD9995X_CMD_UCD_STATUS_CHGPORT0 BIT(12)
#define BD9995X_CMD_UCD_STATUS_PUPDET BIT(11)
#define BD9995X_CMD_UCD_STATUS_CHGDET BIT(6)
#define BD9995X_TYPE_MASK (BD9995X_CMD_UCD_STATUS_DCDFAIL | \
BD9995X_CMD_UCD_STATUS_CHGPORT1 | \
BD9995X_CMD_UCD_STATUS_CHGPORT0 | \
BD9995X_CMD_UCD_STATUS_PUPDET | \
BD9995X_CMD_UCD_STATUS_CHGDET)
/* BC1.2 chargers */
#define BD9995X_TYPE_CDP (BD9995X_CMD_UCD_STATUS_CHGPORT1 | \
BD9995X_CMD_UCD_STATUS_CHGDET)
#define BD9995X_TYPE_DCP (BD9995X_CMD_UCD_STATUS_CHGPORT1 | \
BD9995X_CMD_UCD_STATUS_CHGPORT0 | \
BD9995X_CMD_UCD_STATUS_CHGDET)
#define BD9995X_TYPE_SDP (BD9995X_CMD_UCD_STATUS_CHGPORT0)
/* non-standard BC1.2 chargers */
#define BD9995X_TYPE_OTHER (BD9995X_CMD_UCD_STATUS_DCDFAIL | \
BD9995X_CMD_UCD_STATUS_CHGPORT1 | \
BD9995X_CMD_UCD_STATUS_CHGPORT0 | \
BD9995X_CMD_UCD_STATUS_CHGDET)
#define BD9995X_TYPE_PUP_PORT (BD9995X_CMD_UCD_STATUS_DCDFAIL | \
BD9995X_CMD_UCD_STATUS_CHGPORT0 | \
BD9995X_CMD_UCD_STATUS_PUPDET)
/* Open ports */
#define BD9995X_TYPE_OPEN_PORT (BD9995X_CMD_UCD_STATUS_DCDFAIL | \
BD9995X_CMD_UCD_STATUS_CHGPORT0)
#define BD9995X_TYPE_VBUS_OPEN 0
#define BD9995X_CMD_VCC_IDD_STATUS 0x2A
#define BD9995X_CMD_VCC_UCD_FCTRL_SET 0x2B
#define BD9995X_CMD_VCC_UCD_FCTRL_EN 0x2C
#define BD9995X_CMD_VBUS_UCD_SET 0x30
#define BD9995X_CMD_VBUS_UCD_STATUS 0x31
#define BD9995X_CMD_VBUS_IDD_STATUS 0x32
#define BD9995X_CMD_VBUS_UCD_FCTRL_SET 0x33
#define BD9995X_CMD_VBUS_UCD_FCTRL_EN 0x34
#define BD9995X_CMD_CHIP_ID 0x38
#define BD9995X_CMD_CHIP_REV 0x39
#define BD9995X_CMD_IC_SET1 0x3A
#define BD9995X_CMD_IC_SET2 0x3B
#define BD9995X_CMD_SYSTEM_STATUS 0x3C
#define BD9995X_CMD_SYSTEM_STATUS_OTPLD_STATE BIT(1)
#define BD9995X_CMD_SYSTEM_STATUS_ALLRST_STATE BIT(0)
#define BD9995X_CMD_SYSTEM_CTRL_SET 0x3D
#define BD9995X_CMD_SYSTEM_CTRL_SET_OTPLD BIT(1)
#define BD9995X_CMD_SYSTEM_CTRL_SET_ALLRST BIT(0)
#define BD9995X_CMD_EXT_PROTECT_SET 0x3E
#define BD9995X_CMD_EXT_MAP_SET 0x3F
#define BD9995X_CMD_VM_CTRL_SET 0x40
#define BD9995X_CMD_VM_CTRL_SET_EXTIADPEN BIT(9)
#define BD9995X_CMD_THERM_WINDOW_SET1 0x41
#define BD9995X_CMD_THERM_WINDOW_SET2 0x42
#define BD9995X_CMD_THERM_WINDOW_SET3 0x43
#define BD9995X_CMD_THERM_WINDOW_SET4 0x44
#define BD9995X_CMD_THERM_WINDOW_SET5 0x45
#define BD9995X_CMD_IBATP_TH_SET 0x46
#define BD9995X_CMD_IBATM_TH_SET 0x47
#define BD9995X_CMD_VBAT_TH_SET 0x48
#define BD9995X_CMD_THERM_TH_SET 0x49
#define BD9995X_CMD_IACP_TH_SET 0x4A
#define BD9995X_CMD_VACP_TH_SET 0x4B
/* Enable discharge when VBUS falls below BD9995X_VBUS_DISCHARGE_TH */
#define BD9995X_VBUS_DISCHARGE_TH 3900
#define BD9995X_CMD_VBUS_TH_SET 0x4C
#define BD9995X_CMD_VCC_TH_SET 0x4D
#define BD9995X_CMD_VSYS_TH_SET 0x4E
#define BD9995X_CMD_EXTIADP_TH_SET 0x4F
#define BD9995X_CMD_IBATP_VAL 0x50
#define BD9995X_CMD_IBATP_AVE_VAL 0x51
#define BD9995X_CMD_IBATM_VAL 0x52
#define BD9995X_CMD_IBATM_AVE_VAL 0x53
#define BD9995X_CMD_VBAT_VAL 0x54
#define BD9995X_CMD_VBAT_AVE_VAL 0x55
#define BD9995X_CMD_THERM_VAL 0x56
#define BD9995X_CMD_VTH_VAL 0x57
#define BD9995X_CMD_IACP_VAL 0x58
#define BD9995X_CMD_IACP_AVE_VAL 0x59
#define BD9995X_CMD_VACP_VAL 0x5A
#define BD9995X_CMD_VACP_AVE_VAL 0x5B
#define BD9995X_CMD_VBUS_VAL 0x5C
#define BD9995X_CMD_VBUS_AVE_VAL 0x5D
#define BD9995X_CMD_VCC_VAL 0x5E
#define BD9995X_CMD_VCC_AVE_VAL 0x5F
#define BD9995X_CMD_VSYS_VAL 0x60
#define BD9995X_CMD_VSYS_AVE_VAL 0x61
#define BD9995X_CMD_EXTIADP_VAL 0x62
#define BD9995X_CMD_EXTIADP_AVE_VAL 0x63
#define BD9995X_CMD_VACPCLPS_TH_SET 0x64
#define BD9995X_CMD_INT0_SET 0x68
#define BD9995X_CMD_INT0_SET_INT2_EN BIT(2)
#define BD9995X_CMD_INT0_SET_INT1_EN BIT(1)
#define BD9995X_CMD_INT0_SET_INT0_EN BIT(0)
#define BD9995X_CMD_INT1_SET 0x69
/* Bits for both INT1 & INT2 reg */
#define BD9995X_CMD_INT_SET_TH_DET BIT(9)
#define BD9995X_CMD_INT_SET_TH_RES BIT(8)
#define BD9995X_CMD_INT_SET_DET BIT(1)
#define BD9995X_CMD_INT_SET_RES BIT(0)
#define BD9995X_CMD_INT_VBUS_DET (BD9995X_CMD_INT_SET_RES | \
BD9995X_CMD_INT_SET_DET)
#define BD9995X_CMD_INT_VBUS_TH (BD9995X_CMD_INT_SET_TH_RES | \
BD9995X_CMD_INT_SET_TH_DET)
#define BD9995X_CMD_INT2_SET 0x6A
#define BD9995X_CMD_INT3_SET 0x6B
#define BD9995X_CMD_INT4_SET 0x6C
#define BD9995X_CMD_INT5_SET 0x6D
#define BD9995X_CMD_INT6_SET 0x6E
#define BD9995X_CMD_INT7_SET 0x6F
#define BD9995X_CMD_INT0_STATUS 0x70
#define BD9995X_CMD_INT1_STATUS 0x71
/* Bits for both INT1_STATUS & INT2_STATUS reg */
#define BD9995X_CMD_INT_STATUS_DET BIT(1)
#define BD9995X_CMD_INT_STATUS_RES BIT(0)
#define BD9995X_CMD_INT2_STATUS 0x72
#define BD9995X_CMD_INT3_STATUS 0x73
#define BD9995X_CMD_INT4_STATUS 0x74
#define BD9995X_CMD_INT5_STATUS 0x75
#define BD9995X_CMD_INT6_STATUS 0x76
#define BD9995X_CMD_INT7_STATUS 0x77
#define BD9995X_CMD_REG0 0x78
#define BD9995X_CMD_REG1 0x79
#define BD9995X_CMD_OTPREG0 0x7A
#define BD9995X_CMD_OTPREG1 0x7B
#define BD9995X_CMD_SMBREG 0x7C
/* Normal functionality - power save mode disabled. */
#define BD9995X_PWR_SAVE_OFF 0
/* BGATE ON w/ PROCHOT# monitored only system voltage. */
#define BD9995X_PWR_SAVE_LOW 0x1
/* BGATE ON w/ PROCHOT# monitored only system voltage every 1ms. */
#define BD9995X_PWR_SAVE_MED 0x2
/* BGATE ON w/o PROCHOT# monitoring. */
#define BD9995X_PWR_SAVE_HIGH 0x5
/* BGATE OFF */
#define BD9995X_PWR_SAVE_MAX 0x6
#define BD9995X_CMD_DEBUG_MODE_SET 0x7F
/*
* Non-standard interface functions - bd9995x integrates additional
* functionality not part of the standard charger interface.
*/
/* Is VBUS provided or external power present */
int bd9995x_is_vbus_provided(enum bd9995x_charge_port port);
/* Select or deselect input port from {VCC, VBUS, VCC&VBUS}. */
int bd9995x_select_input_port(enum bd9995x_charge_port port, int select);
/* Enable/Disable charging triggered by BC1.2 */
int bd9995x_bc12_enable_charging(int port, int enable);
/* Interrupt handler for USB charger VBUS */
void bd9995x_vbus_interrupt(enum gpio_signal signal);
/* Read temperature measurement value (in Celsius) */
int bd9995x_get_battery_temp(int *temp_ptr);
/* Set power save mode */
void bd9995x_set_power_save_mode(int mode);
/* Get Battery Voltage Measurement Value */
int bd9995x_get_battery_voltage(void);
#ifdef CONFIG_CMD_I2C_STRESS_TEST_CHARGER
extern struct i2c_stress_test_dev bd9995x_i2c_stress_test_dev;
#endif
#endif /* __CROS_EC_BD9995X_H */