Files
android/drivers/power/supply/mediatek/charger/ln8000_charger.h
T
threeeye bc1d038eac REVVL 6 Pro kernel bring-up: full working tree snapshot (2026-09-12)
Squashed backup commit (no shallow-clone history issues) of
xiaomi-mt6833-dev/kernel_xiaomi_mt6833 (lineage-23.2 branch, upstream
commit 9eece662e) plus all fixes applied to get everpal_defconfig building
clean against a modern (GCC 15.2.0) toolchain -- see the previous commit
message on the lineage-23.2 branch (also in this repo history is not
available here since this is a squashed snapshot; full incremental history
lives in the local DL380 checkout and the upstream GitHub remote).

Upstream: https://github.com/xiaomi-mt6833-dev/kernel_xiaomi_mt6833 (lineage-23.2)
2026-09-12 13:36:46 +00:00

367 lines
14 KiB
C

/*
* ln8000-charger.h - Charger driver for LIONSEMI LN8000
*
* Copyright (C) 2021 Lion Semiconductor Inc.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
*/
#ifndef __LN8000_CHARGER_H__
#define __LN8000_CHARGER_H__
/* For support TI extend propertis */
#define BAT_OVP_FAULT_SHIFT 0
#define BAT_OCP_FAULT_SHIFT 1
#define BUS_OVP_FAULT_SHIFT 2
#define BUS_OCP_FAULT_SHIFT 3
#define BAT_THERM_FAULT_SHIFT 4
#define BUS_THERM_FAULT_SHIFT 5
#define DIE_THERM_FAULT_SHIFT 6
#define BAT_OVP_ALARM_SHIFT 0
#define BAT_OCP_ALARM_SHIFT 1
#define BUS_OVP_ALARM_SHIFT 2
#define BUS_OCP_ALARM_SHIFT 3
#define BAT_THERM_ALARM_SHIFT 4
#define BUS_THERM_ALARM_SHIFT 5
#define DIE_THERM_ALARM_SHIFT 6
#define BAT_UCP_ALARM_SHIFT 7
#define VBAT_REG_STATUS_SHIFT 0
#define IBAT_REG_STATUS_SHIFT 1
#if 0
enum hvdcp3_type {
HVDCP3_NONE = 0,
HVDCP3_CLASSA_18W,
HVDCP3_CLASSB_27W,
HVDCP3P5_CLASSA_18W,
HVDCP3P5_CLASSB_27W,
};
#else
enum hvdcp3_type {
HVDCP3_NONE = 0,
HVDCP3_CLASSA_18W,
HVDCP3_CLASSB_27W,
HVDCP3_P_CLASSA_18W,
HVDCP3_P_CLASSB_27W,
};
#endif
/* bus protection values for QC */
#define BUS_OVP_FOR_QC 13000000 /* ln8000 didn't used 10V, (support tot 6.5V, 11V, 12V, 13V) */
#define BUS_OVP_ALARM_FOR_QC 9500000
#define BUS_OCP_FOR_QC_CLASS_A 3250000
#define BUS_OCP_ALARM_FOR_QC_CLASS_A 2000000
#define BUS_OCP_FOR_QC_CLASS_B 4000000
#define BUS_OCP_ALARM_FOR_QC_CLASS_B 3000000
#define BUS_OVP_FOR_QC35 13000000
#define BUS_OVP_ALARM_FOR_QC35 9500000
#define BUS_OCP_FOR_QC35_CLASS_A_P 3000000
#define BUS_OCP_ALARM_FOR_QC35_CLASS_A_P 2550000
/**
* ln8000 device descripion definition
*/
#define ASSIGNED_BITS(_end, _start) ((BIT(_end) - BIT(_start)) + BIT(_end))
/* register map description */
enum ln8000_int1_desc {
LN8000_MASK_FAULT_INT = BIT(7),
LN8000_MASK_NTC_PROT_INT = BIT(6),
LN8000_MASK_CHARGE_PHASE_INT = BIT(5),
LN8000_MASK_MODE_INT = BIT(4),
LN8000_MASK_REV_CURR_INT = BIT(3),
LN8000_MASK_TEMP_INT = BIT(2),
LN8000_MASK_ADC_DONE_INT = BIT(1),
LN8000_MASK_TIMER_INT = BIT(0),
};
enum ln8000_sys_sts_desc {
LN8000_MASK_IIN_LOOP_STS = BIT(7),
LN8000_MASK_VFLOAT_LOOP_STS = BIT(6),
LN8000_MASK_BYPASS_ENABLED = BIT(3),
LN8000_MASK_SWITCHING_ENABLED = BIT(2),
LN8000_MASK_STANDBY_STS = BIT(1),
LN8000_MASK_SHUTDOWN_STS = BIT(0),
};
enum ln8000_safety_sts_desc {
LN8000_MASK_TEMP_MAX_STS = BIT(6),
LN8000_MASK_TEMP_REGULATION_STS = BIT(5),
LN8000_MASK_NTC_ALARM_STS = BIT(4),
LN8000_MASK_NTC_SHUTDOWN_STS = BIT(3),
LN8000_MASK_REV_IIN_STS = BIT(2),
};
enum ln8000_fault1_sts_desc {
LN8000_MASK_WATCHDOG_TIMER_STS = BIT(7),
LN8000_MASK_VBAT_OV_STS = BIT(6),
LN8000_MASK_VAC_UNPLUG_STS = BIT(4),
LN8000_MASK_VAC_OV_STS = BIT(3),
LN8000_MASK_VIN_OV_STS = BIT(1),
LN8000_MASK_VFAULTS = ASSIGNED_BITS(6,0),
};
enum ln8000_fault2_sts_desc {
LN8000_MASK_IIN_OC_DETECTED = BIT(7),
};
enum ln8000_ldo_sts_desc {
LN8000_MASK_VBAT_MIN_OK_STS = BIT(7),
LN8000_MASK_CHARGE_TERM_STS = BIT(5),
LN8000_MASK_RECHARGE_STS = BIT(4),
};
enum ln8000_regulation_ctrl_desc {
LN8000_BIT_ENABLE_VFLOAT_LOOP_INT = 7,
LN8000_BIT_ENABLE_IIN_LOOP_INT = 6,
LN8000_BIT_DISABLE_VFLOAT_LOOP = 5,
LN8000_BIT_DISABLE_IIN_LOOP = 4,
LN8000_BIT_TEMP_MAX_EN = 2,
LN8000_BIT_TEMP_REG_EN = 1,
};
enum ln8000_sys_ctrl_desc {
LN8000_BIT_STANDBY_EN = 3,
LN8000_BIT_REV_IIN_DET = 2,
LN8000_BIT_EN_1TO1 = 0,
};
enum ln8000_fault_ctrl_desc {
LN8000_BIT_DISABLE_IIN_OCP = 6,
LN8000_BIT_DISABLE_VBAT_OV = 5,
LN8000_BIT_DISABLE_VAC_OV = 4,
LN8000_BIT_DISABLE_VAC_UV = 3,
LN8000_BIT_DISABLE_VIN_OV = 2,
};
enum ln8000_bc_op1_desc {
LN8000_BIT_DUAL_FUNCTION_EN = 2,
LN8000_BIT_DUAL_CFG = 1,
LN8000_BIT_DUAL_LOCKOUT_EN = 0,
};
enum ln8000_reg_addr {
LN8000_REG_DEVICE_ID = 0x00,
LN8000_REG_INT1 = 0x01,
LN8000_REG_INT1_MSK = 0x02,
LN8000_REG_SYS_STS = 0x03,
LN8000_REG_SAFETY_STS = 0x04,
LN8000_REG_FAULT1_STS = 0x05,
LN8000_REG_FAULT2_STS = 0x06,
LN8000_REG_CURR1_STS = 0x07,
LN8000_REG_LDO_STS = 0x08,
LN8000_REG_ADC01_STS = 0x09,
LN8000_REG_ADC02_STS = 0x0A,
LN8000_REG_ADC03_STS = 0x0B,
LN8000_REG_ADC04_STS = 0x0C,
LN8000_REG_ADC05_STS = 0x0D,
LN8000_REG_ADC06_STS = 0x0E,
LN8000_REG_ADC07_STS = 0x0F,
LN8000_REG_ADC08_STS = 0x10,
LN8000_REG_ADC09_STS = 0x11,
LN8000_REG_ADC10_STS = 0x12,
LN8000_REG_IIN_CTRL = 0x1B,
LN8000_REG_REGULATION_CTRL = 0x1C,
LN8000_REG_PWR_CTRL = 0x1D,
LN8000_REG_SYS_CTRL = 0x1E,
LN8000_REG_LDO_CTRL = 0x1F,
LN8000_REG_GLITCH_CTRL = 0x20,
LN8000_REG_FAULT_CTRL = 0x21,
LN8000_REG_NTC_CTRL = 0x22,
LN8000_REG_ADC_CTRL = 0x23,
LN8000_REG_ADC_CFG = 0x24,
LN8000_REG_RECOVERY_CTRL = 0x25,
LN8000_REG_TIMER_CTRL = 0x26,
LN8000_REG_THRESHOLD_CTRL = 0x27,
LN8000_REG_V_FLOAT_CTRL = 0x28,
LN8000_REG_CHARGE_CTRL = 0x29,
LN8000_REG_LION_CTRL = 0x30,
LN8000_REG_BC_OP_1 = 0x41,
LN8000_REG_BC_OP_2 = 0x42,
LN8000_REG_BC_STS_A = 0x49,
LN8000_REG_BC_STS_B = 0x4A,
LN8000_REG_BC_STS_C = 0x4B,
LN8000_REG_BC_STS_D = 0x4C,
LN8000_REG_BC_STS_E = 0x4D,
LN8000_REG_MAX,
};
/* device feature configuration desc */
#define LN8000_DEVICE_ID 0x42
enum ln8000_role {
LN_ROLE_STANDALONE = 0x0,
LN_ROLE_MASTER = 0x1,
LN_ROLE_SLAVE = 0x2,
};
enum ln8000_opmode_{
LN8000_OPMODE_UNKNOWN = 0x0,
LN8000_OPMODE_STANDBY = 0x1,
LN8000_OPMODE_BYPASS = 0x2,
LN8000_OPMODE_SWITCHING = 0x3,
};
enum ln8000_vac_ov_cfg_desc {
LN8000_VAC_OVP_6P5V = 0x0,
LN8000_VAC_OVP_11V = 0x1,
LN8000_VAC_OVP_12V = 0x2,
LN8000_VAC_OVP_13V = 0x3,
};
enum ln8000_watchdpg_cfg_desc {
LN8000_WATCHDOG_5SEC = 0x0,
LN8000_WATCHDOG_10SEC = 0x1,
LN8000_WATCHDOG_20SEC = 0x2,
LN8000_WATCHDOG_40SEC = 0x3,
LN8000_WATCHDOG_MAX
};
enum ln8000_adc_channel_index {
LN8000_ADC_CH_VOUT = 1,
LN8000_ADC_CH_VIN,
LN8000_ADC_CH_VBAT,
LN8000_ADC_CH_VAC,
LN8000_ADC_CH_IIN,
LN8000_ADC_CH_DIETEMP,
LN8000_ADC_CH_TSBAT,
LN8000_ADC_CH_TSBUS,
LN8000_ADC_CH_ALL
};
enum ln8000_adc_mode_desc { /* used FORCE_ADC_MODE + ADC_SHUTDOWN_CFG */
ADC_AUTO_HIB_MODE = 0x0,
ADC_AUTO_SHD_MODE = 0x1,
ADC_SHUTDOWN_MODE = 0x2,
ADC_HIBERNATE_MODE = 0x4,
ADC_NORMAL_MODE = 0x6,
};
enum ln8000_adc_hibernate_delay_desc {
ADC_HIBERNATE_500MS = 0x0,
ADC_HIBERNATE_1S = 0x1,
ADC_HIBERNATE_2S = 0x2,
ADC_HIBERNATE_4S = 0x3,
};
/* electrical numeric calculation unit description */
#define LN8000_VBAT_FLOAT_MIN 3725000 /* unit = uV */
#define LN8000_VBAT_FLOAT_MAX 5000000
#define LN8000_VBAT_FLOAT_LSB 5000
#define LN8000_ADC_VOUT_STEP 5000 /* 5mV= 5000uV LSB (0V ~ 5.115V) */
#define LN8000_ADC_VIN_STEP 16000 /* 16mV=16000uV LSB (0V ~ 16.386V) */
#define LN8000_ADC_VBAT_STEP 5000 /* 5mV= 5000uV LSB (0V ~ 5.115V) */
#define LN8000_ADC_VBAT_MIN 1000000 /* 1V */
#define LN8000_ADC_VAC_STEP 16000 /* 16mV=16000uV LSB (0V ~ 16.386V) */
#define LN8000_ADC_VAC_OS 5
#define LN8000_ADC_IIN_STEP 4890 /* 4.89mA=4890uA LSB (0A ~ 5A) */
#define LN8000_ADC_DIETEMP_STEP 4350 /* 0.435C LSB = 4350dC/1000 (-25C ~ 160C) */
#define LN8000_ADC_DIETEMP_DENOM 1000 /* 1000 */
#define LN8000_ADC_DIETEMP_MIN (-250) /* -25C = -250dC */
#define LN8000_ADC_DIETEMP_MAX 1600 /* 160C = 1600dC */
#define LN8000_ADC_NTCV_STEP 2933 /* 2.933mV=2933uV LSB (0V ~ 3V) */
#define LN8000_IIN_CFG_MIN 500000 /* 500mA=500,000uA */
#define LN8000_IIN_CFG_LSB 50000 /* 50mA=50,000uA */
/* device default values */
#define LN8000_BAT_OVP_DEFAULT 4440000
#define LN8000_BUS_OVP_DEFAULT 9500000
#define LN8000_BUS_OCP_DEFAULT 2000000
#define LN8000_NTC_ALARM_CFG_DEFAULT 226 /* NTC alarm threshold (~40C) */
#define LN8000_NTC_SHUTDOWN_CFG 2 /* NTC shutdown config (-16LSB ~ 4.3C) */
#define LN8000_DEFAULT_FSW_CFG 8 /* 8=440kHz, switching freq */
#define LN8000_IIN_CFG_DEFAULT 2000000 /* 2A=2,000,000uA, input current limit */
/**
* driver instance structure definition
*/
struct ln8000_platform_data {
struct gpio_desc *irq_gpio; /* GPIO pin for (generic/power-on) interrupt */
/* feature configuration */
unsigned int bat_ovp_th; /* battery ovp threshold (mV) */
unsigned int bat_ovp_alarm_th; /* battery ovp alarm threshold (mV) */
unsigned int bus_ovp_th; /* IIN ovp threshold (mV) */
unsigned int bus_ovp_alarm_th; /* IIN ovp alarm threshold (mV) */
unsigned int bus_ocp_th; /* IIN ocp threshold (mA) */
unsigned int bus_ocp_alarm_th; /* IIN ocp alarm threshold */
unsigned int ntc_alarm_cfg; /* input/battery NTC voltage threshold code: 0~1023 */
/* protection enable/disable */
bool vbat_ovp_disable; /* disable battery voltage OVP */
bool vbat_reg_disable; /* disable battery voltage (float) regulation */
bool iin_ocp_disable; /* disable input current OCP */
bool iin_reg_disable; /* disable input current regulation */
bool tbus_mon_disable; /* disable BUS temperature monitor (prot/alarm) */
bool tbat_mon_disable; /* disable BAT temperature monitor (prot/alarm) */
bool tdie_prot_disable; /* disable die temperature protection */
bool tdie_reg_disable; /* disable die temperature regulation */
bool revcurr_prot_disable; /* disable reverse current protection */
};
struct ln8000_info {
struct device *dev;
struct i2c_client *client;
struct ln8000_platform_data *pdata;
struct power_supply *psy_chg;
struct mutex data_lock;
struct mutex i2c_lock;
struct mutex irq_lock;
struct power_supply_config psy_cfg;
struct power_supply_desc psy_desc;
unsigned int op_mode; /* target operation mode */
unsigned int pwr_status; /* current device status */
unsigned int dev_role; /* device role */
/* system/device status */
bool vbat_regulated; /* vbat loop is active (+ OV alarm) */
bool iin_regulated; /* iin loop is active (+ OC alarm) */
bool tdie_fault; /* die temperature fault */
bool tbus_tbat_fault; /* BUS/BAT temperature fault */
bool tdie_alarm; /* die temperature alarm (regulated) */
bool tbus_tbat_alarm; /* BUS/BAT temperature alarm */
bool wdt_fault; /* watchdog timer expiration */
bool vbat_ov; /* vbat OV fault */
bool vac_ov; /* vac OV fault */
bool vbus_ov; /* vbus OV fault */
bool iin_oc; /* iin OC fault */
bool vac_unplug; /* vac unplugged */
bool iin_rc; /* iin reverse current detected */
bool volt_qual; /* all voltages are qualified */
bool usb_present; /* usb plugged (present) */
bool chg_en; /* charging enavbled */
bool rcp_en; /* reverse current protection enabled */
int vbat_ovp_alarm_th; /* vbat ovp alarm threshold */
int vin_ovp_alarm_th; /* vin ovp alarm threshold */
int iin_ocp_alarm_th; /* iin ocp alarm threshold */
/* ADC readings */
int tbat_uV; /* BAT temperature (NTC, uV) */
int tbus_uV; /* BUS temperature (NTC, uV) */
int tdie_dC; /* die temperature (deci-Celsius) */
int vbat_uV; /* battery voltage (uV) */
int vbus_uV; /* input voltage (uV) */
int iin_uA; /* input current (uV) */
/* debugfs */
struct dentry *debug_root;
u32 debug_address;
};
#endif /* __LN8000_CHARGER_H__ */