1417c0fc2SLinus Walleij /* SPDX-License-Identifier: GPL-2.0-only */ 2417c0fc2SLinus Walleij 3417c0fc2SLinus Walleij #ifndef _AB8500_CHARGER_H_ 4417c0fc2SLinus Walleij #define _AB8500_CHARGER_H_ 5417c0fc2SLinus Walleij 6417c0fc2SLinus Walleij #include <linux/kernel.h> 7417c0fc2SLinus Walleij 8417c0fc2SLinus Walleij /* 9417c0fc2SLinus Walleij * System control 2 register offsets. 10417c0fc2SLinus Walleij * bank = 0x02 11417c0fc2SLinus Walleij */ 12417c0fc2SLinus Walleij #define AB8500_MAIN_WDOG_CTRL_REG 0x01 13417c0fc2SLinus Walleij #define AB8500_LOW_BAT_REG 0x03 14417c0fc2SLinus Walleij #define AB8500_BATT_OK_REG 0x04 15417c0fc2SLinus Walleij /* 16417c0fc2SLinus Walleij * USB/ULPI register offsets 17417c0fc2SLinus Walleij * Bank : 0x5 18417c0fc2SLinus Walleij */ 19417c0fc2SLinus Walleij #define AB8500_USB_LINE_STAT_REG 0x80 20417c0fc2SLinus Walleij #define AB8500_USB_LINE_CTRL2_REG 0x82 21417c0fc2SLinus Walleij #define AB8500_USB_LINK1_STAT_REG 0x94 22417c0fc2SLinus Walleij 23417c0fc2SLinus Walleij /* 24417c0fc2SLinus Walleij * Charger / status register offfsets 25417c0fc2SLinus Walleij * Bank : 0x0B 26417c0fc2SLinus Walleij */ 27417c0fc2SLinus Walleij #define AB8500_CH_STATUS1_REG 0x00 28417c0fc2SLinus Walleij #define AB8500_CH_STATUS2_REG 0x01 29417c0fc2SLinus Walleij #define AB8500_CH_USBCH_STAT1_REG 0x02 30417c0fc2SLinus Walleij #define AB8500_CH_USBCH_STAT2_REG 0x03 31417c0fc2SLinus Walleij #define AB8540_CH_USBCH_STAT3_REG 0x04 32417c0fc2SLinus Walleij #define AB8500_CH_STAT_REG 0x05 33417c0fc2SLinus Walleij 34417c0fc2SLinus Walleij /* 35417c0fc2SLinus Walleij * Charger / control register offfsets 36417c0fc2SLinus Walleij * Bank : 0x0B 37417c0fc2SLinus Walleij */ 38417c0fc2SLinus Walleij #define AB8500_CH_VOLT_LVL_REG 0x40 39417c0fc2SLinus Walleij #define AB8500_CH_VOLT_LVL_MAX_REG 0x41 /*Only in Cut2.0*/ 40417c0fc2SLinus Walleij #define AB8500_CH_OPT_CRNTLVL_REG 0x42 41417c0fc2SLinus Walleij #define AB8500_CH_OPT_CRNTLVL_MAX_REG 0x43 /*Only in Cut2.0*/ 42417c0fc2SLinus Walleij #define AB8500_CH_WD_TIMER_REG 0x50 43417c0fc2SLinus Walleij #define AB8500_CHARG_WD_CTRL 0x51 44417c0fc2SLinus Walleij #define AB8500_BTEMP_HIGH_TH 0x52 45417c0fc2SLinus Walleij #define AB8500_LED_INDICATOR_PWM_CTRL 0x53 46417c0fc2SLinus Walleij #define AB8500_LED_INDICATOR_PWM_DUTY 0x54 47417c0fc2SLinus Walleij #define AB8500_BATT_OVV 0x55 48417c0fc2SLinus Walleij #define AB8500_CHARGER_CTRL 0x56 49417c0fc2SLinus Walleij #define AB8500_BAT_CTRL_CURRENT_SOURCE 0x60 /*Only in Cut2.0*/ 50417c0fc2SLinus Walleij 51417c0fc2SLinus Walleij /* 52417c0fc2SLinus Walleij * Charger / main control register offsets 53417c0fc2SLinus Walleij * Bank : 0x0B 54417c0fc2SLinus Walleij */ 55417c0fc2SLinus Walleij #define AB8500_MCH_CTRL1 0x80 56417c0fc2SLinus Walleij #define AB8500_MCH_CTRL2 0x81 57417c0fc2SLinus Walleij #define AB8500_MCH_IPT_CURLVL_REG 0x82 58417c0fc2SLinus Walleij #define AB8500_CH_WD_REG 0x83 59417c0fc2SLinus Walleij 60417c0fc2SLinus Walleij /* 61417c0fc2SLinus Walleij * Charger / USB control register offsets 62417c0fc2SLinus Walleij * Bank : 0x0B 63417c0fc2SLinus Walleij */ 64417c0fc2SLinus Walleij #define AB8500_USBCH_CTRL1_REG 0xC0 65417c0fc2SLinus Walleij #define AB8500_USBCH_CTRL2_REG 0xC1 66417c0fc2SLinus Walleij #define AB8500_USBCH_IPT_CRNTLVL_REG 0xC2 67417c0fc2SLinus Walleij #define AB8540_USB_PP_MODE_REG 0xC5 68417c0fc2SLinus Walleij #define AB8540_USB_PP_CHR_REG 0xC6 69417c0fc2SLinus Walleij 70417c0fc2SLinus Walleij /* 71417c0fc2SLinus Walleij * Gas Gauge register offsets 72417c0fc2SLinus Walleij * Bank : 0x0C 73417c0fc2SLinus Walleij */ 74417c0fc2SLinus Walleij #define AB8500_GASG_CC_CTRL_REG 0x00 75417c0fc2SLinus Walleij #define AB8500_GASG_CC_ACCU1_REG 0x01 76417c0fc2SLinus Walleij #define AB8500_GASG_CC_ACCU2_REG 0x02 77417c0fc2SLinus Walleij #define AB8500_GASG_CC_ACCU3_REG 0x03 78417c0fc2SLinus Walleij #define AB8500_GASG_CC_ACCU4_REG 0x04 79417c0fc2SLinus Walleij #define AB8500_GASG_CC_SMPL_CNTRL_REG 0x05 80417c0fc2SLinus Walleij #define AB8500_GASG_CC_SMPL_CNTRH_REG 0x06 81417c0fc2SLinus Walleij #define AB8500_GASG_CC_SMPL_CNVL_REG 0x07 82417c0fc2SLinus Walleij #define AB8500_GASG_CC_SMPL_CNVH_REG 0x08 83417c0fc2SLinus Walleij #define AB8500_GASG_CC_CNTR_AVGOFF_REG 0x09 84417c0fc2SLinus Walleij #define AB8500_GASG_CC_OFFSET_REG 0x0A 85417c0fc2SLinus Walleij #define AB8500_GASG_CC_NCOV_ACCU 0x10 86417c0fc2SLinus Walleij #define AB8500_GASG_CC_NCOV_ACCU_CTRL 0x11 87417c0fc2SLinus Walleij #define AB8500_GASG_CC_NCOV_ACCU_LOW 0x12 88417c0fc2SLinus Walleij #define AB8500_GASG_CC_NCOV_ACCU_MED 0x13 89417c0fc2SLinus Walleij #define AB8500_GASG_CC_NCOV_ACCU_HIGH 0x14 90417c0fc2SLinus Walleij 91417c0fc2SLinus Walleij /* 92417c0fc2SLinus Walleij * Interrupt register offsets 93417c0fc2SLinus Walleij * Bank : 0x0E 94417c0fc2SLinus Walleij */ 95417c0fc2SLinus Walleij #define AB8500_IT_SOURCE2_REG 0x01 96417c0fc2SLinus Walleij #define AB8500_IT_SOURCE21_REG 0x14 97417c0fc2SLinus Walleij 98417c0fc2SLinus Walleij /* 99417c0fc2SLinus Walleij * RTC register offsets 100417c0fc2SLinus Walleij * Bank: 0x0F 101417c0fc2SLinus Walleij */ 102417c0fc2SLinus Walleij #define AB8500_RTC_BACKUP_CHG_REG 0x0C 103417c0fc2SLinus Walleij #define AB8500_RTC_CC_CONF_REG 0x01 104417c0fc2SLinus Walleij #define AB8500_RTC_CTRL_REG 0x0B 105417c0fc2SLinus Walleij #define AB8500_RTC_CTRL1_REG 0x11 106417c0fc2SLinus Walleij 107417c0fc2SLinus Walleij /* 108417c0fc2SLinus Walleij * OTP register offsets 109417c0fc2SLinus Walleij * Bank : 0x15 110417c0fc2SLinus Walleij */ 111417c0fc2SLinus Walleij #define AB8500_OTP_CONF_15 0x0E 112417c0fc2SLinus Walleij 113417c0fc2SLinus Walleij /* GPADC constants from AB8500 spec, UM0836 */ 114417c0fc2SLinus Walleij #define ADC_RESOLUTION 1024 115417c0fc2SLinus Walleij #define ADC_CH_MAIN_MIN 0 116417c0fc2SLinus Walleij #define ADC_CH_MAIN_MAX 20030 117417c0fc2SLinus Walleij #define ADC_CH_VBUS_MIN 0 118417c0fc2SLinus Walleij #define ADC_CH_VBUS_MAX 20030 119417c0fc2SLinus Walleij #define ADC_CH_VBAT_MIN 2300 120417c0fc2SLinus Walleij #define ADC_CH_VBAT_MAX 4800 121417c0fc2SLinus Walleij #define ADC_CH_BKBAT_MIN 0 122417c0fc2SLinus Walleij #define ADC_CH_BKBAT_MAX 3200 123417c0fc2SLinus Walleij 124417c0fc2SLinus Walleij /* Main charge i/p current */ 125417c0fc2SLinus Walleij #define MAIN_CH_IP_CUR_0P9A 0x80 126417c0fc2SLinus Walleij #define MAIN_CH_IP_CUR_1P0A 0x90 127417c0fc2SLinus Walleij #define MAIN_CH_IP_CUR_1P1A 0xA0 128417c0fc2SLinus Walleij #define MAIN_CH_IP_CUR_1P2A 0xB0 129417c0fc2SLinus Walleij #define MAIN_CH_IP_CUR_1P3A 0xC0 130417c0fc2SLinus Walleij #define MAIN_CH_IP_CUR_1P4A 0xD0 131417c0fc2SLinus Walleij #define MAIN_CH_IP_CUR_1P5A 0xE0 132417c0fc2SLinus Walleij 133417c0fc2SLinus Walleij /* ChVoltLevel */ 134417c0fc2SLinus Walleij #define CH_VOL_LVL_3P5 0x00 135417c0fc2SLinus Walleij #define CH_VOL_LVL_4P0 0x14 136417c0fc2SLinus Walleij #define CH_VOL_LVL_4P05 0x16 137417c0fc2SLinus Walleij #define CH_VOL_LVL_4P1 0x1B 138417c0fc2SLinus Walleij #define CH_VOL_LVL_4P15 0x20 139417c0fc2SLinus Walleij #define CH_VOL_LVL_4P2 0x25 140417c0fc2SLinus Walleij #define CH_VOL_LVL_4P6 0x4D 141417c0fc2SLinus Walleij 142417c0fc2SLinus Walleij /* ChOutputCurrentLevel */ 143417c0fc2SLinus Walleij #define CH_OP_CUR_LVL_0P1 0x00 144417c0fc2SLinus Walleij #define CH_OP_CUR_LVL_0P2 0x01 145417c0fc2SLinus Walleij #define CH_OP_CUR_LVL_0P3 0x02 146417c0fc2SLinus Walleij #define CH_OP_CUR_LVL_0P4 0x03 147417c0fc2SLinus Walleij #define CH_OP_CUR_LVL_0P5 0x04 148417c0fc2SLinus Walleij #define CH_OP_CUR_LVL_0P6 0x05 149417c0fc2SLinus Walleij #define CH_OP_CUR_LVL_0P7 0x06 150417c0fc2SLinus Walleij #define CH_OP_CUR_LVL_0P8 0x07 151417c0fc2SLinus Walleij #define CH_OP_CUR_LVL_0P9 0x08 152417c0fc2SLinus Walleij #define CH_OP_CUR_LVL_1P4 0x0D 153417c0fc2SLinus Walleij #define CH_OP_CUR_LVL_1P5 0x0E 154417c0fc2SLinus Walleij #define CH_OP_CUR_LVL_1P6 0x0F 155417c0fc2SLinus Walleij #define CH_OP_CUR_LVL_2P 0x3F 156417c0fc2SLinus Walleij 157417c0fc2SLinus Walleij /* BTEMP High thermal limits */ 158417c0fc2SLinus Walleij #define BTEMP_HIGH_TH_57_0 0x00 159417c0fc2SLinus Walleij #define BTEMP_HIGH_TH_52 0x01 160417c0fc2SLinus Walleij #define BTEMP_HIGH_TH_57_1 0x02 161417c0fc2SLinus Walleij #define BTEMP_HIGH_TH_62 0x03 162417c0fc2SLinus Walleij 163417c0fc2SLinus Walleij #define LOW_BAT_3P1V 0x20 164417c0fc2SLinus Walleij #define LOW_BAT_2P3V 0x00 165417c0fc2SLinus Walleij #define LOW_BAT_RESET 0x01 166417c0fc2SLinus Walleij #define LOW_BAT_ENABLE 0x01 167417c0fc2SLinus Walleij 168417c0fc2SLinus Walleij /* Backup battery constants */ 169417c0fc2SLinus Walleij #define BUP_ICH_SEL_50UA 0x00 170417c0fc2SLinus Walleij #define BUP_ICH_SEL_150UA 0x04 171417c0fc2SLinus Walleij #define BUP_ICH_SEL_300UA 0x08 172417c0fc2SLinus Walleij #define BUP_ICH_SEL_700UA 0x0C 173417c0fc2SLinus Walleij 174417c0fc2SLinus Walleij enum bup_vch_sel { 175417c0fc2SLinus Walleij BUP_VCH_SEL_2P5V, 176417c0fc2SLinus Walleij BUP_VCH_SEL_2P6V, 177417c0fc2SLinus Walleij BUP_VCH_SEL_2P8V, 178417c0fc2SLinus Walleij BUP_VCH_SEL_3P1V, 179417c0fc2SLinus Walleij /* 180417c0fc2SLinus Walleij * Note that the following 5 values 2.7v, 2.9v, 3.0v, 3.2v, 3.3v 181417c0fc2SLinus Walleij * are only available on ab8540. You can't choose these 5 182417c0fc2SLinus Walleij * voltage on ab8500/ab8505/ab9540. 183417c0fc2SLinus Walleij */ 184417c0fc2SLinus Walleij BUP_VCH_SEL_2P7V, 185417c0fc2SLinus Walleij BUP_VCH_SEL_2P9V, 186417c0fc2SLinus Walleij BUP_VCH_SEL_3P0V, 187417c0fc2SLinus Walleij BUP_VCH_SEL_3P2V, 188417c0fc2SLinus Walleij BUP_VCH_SEL_3P3V, 189417c0fc2SLinus Walleij }; 190417c0fc2SLinus Walleij 191417c0fc2SLinus Walleij #define BUP_VCH_RANGE 0x02 192417c0fc2SLinus Walleij #define VBUP33_VRTCN 0x01 193417c0fc2SLinus Walleij 194417c0fc2SLinus Walleij /* Battery OVV constants */ 195417c0fc2SLinus Walleij #define BATT_OVV_ENA 0x02 196417c0fc2SLinus Walleij #define BATT_OVV_TH_3P7 0x00 197417c0fc2SLinus Walleij #define BATT_OVV_TH_4P75 0x01 198417c0fc2SLinus Walleij 199*0525f34dSLinus Walleij /* A value to indicate over voltage (microvolts) */ 200*0525f34dSLinus Walleij #define BATT_OVV_VALUE 4750000 201417c0fc2SLinus Walleij 202417c0fc2SLinus Walleij /* VBUS OVV constants */ 203417c0fc2SLinus Walleij #define VBUS_OVV_SELECT_MASK 0x78 204417c0fc2SLinus Walleij #define VBUS_OVV_SELECT_5P6V 0x00 205417c0fc2SLinus Walleij #define VBUS_OVV_SELECT_5P7V 0x08 206417c0fc2SLinus Walleij #define VBUS_OVV_SELECT_5P8V 0x10 207417c0fc2SLinus Walleij #define VBUS_OVV_SELECT_5P9V 0x18 208417c0fc2SLinus Walleij #define VBUS_OVV_SELECT_6P0V 0x20 209417c0fc2SLinus Walleij #define VBUS_OVV_SELECT_6P1V 0x28 210417c0fc2SLinus Walleij #define VBUS_OVV_SELECT_6P2V 0x30 211417c0fc2SLinus Walleij #define VBUS_OVV_SELECT_6P3V 0x38 212417c0fc2SLinus Walleij 213417c0fc2SLinus Walleij #define VBUS_AUTO_IN_CURR_LIM_ENA 0x04 214417c0fc2SLinus Walleij 215417c0fc2SLinus Walleij /* Fuel Gauge constants */ 216417c0fc2SLinus Walleij #define RESET_ACCU 0x02 217417c0fc2SLinus Walleij #define READ_REQ 0x01 218417c0fc2SLinus Walleij #define CC_DEEP_SLEEP_ENA 0x02 219417c0fc2SLinus Walleij #define CC_PWR_UP_ENA 0x01 220417c0fc2SLinus Walleij #define CC_SAMPLES_40 0x28 221417c0fc2SLinus Walleij #define RD_NCONV_ACCU_REQ 0x01 222417c0fc2SLinus Walleij #define CC_CALIB 0x08 223417c0fc2SLinus Walleij #define CC_INTAVGOFFSET_ENA 0x10 224417c0fc2SLinus Walleij #define CC_MUXOFFSET 0x80 225417c0fc2SLinus Walleij #define CC_INT_CAL_N_AVG_MASK 0x60 226417c0fc2SLinus Walleij #define CC_INT_CAL_SAMPLES_16 0x40 227417c0fc2SLinus Walleij #define CC_INT_CAL_SAMPLES_8 0x20 228417c0fc2SLinus Walleij #define CC_INT_CAL_SAMPLES_4 0x00 229417c0fc2SLinus Walleij 230417c0fc2SLinus Walleij /* RTC constants */ 231417c0fc2SLinus Walleij #define RTC_BUP_CH_ENA 0x10 232417c0fc2SLinus Walleij 233417c0fc2SLinus Walleij /* BatCtrl Current Source Constants */ 234417c0fc2SLinus Walleij #define BAT_CTRL_7U_ENA 0x01 235417c0fc2SLinus Walleij #define BAT_CTRL_20U_ENA 0x02 236417c0fc2SLinus Walleij #define BAT_CTRL_18U_ENA 0x01 237417c0fc2SLinus Walleij #define BAT_CTRL_16U_ENA 0x02 238417c0fc2SLinus Walleij #define BAT_CTRL_CMP_ENA 0x04 239417c0fc2SLinus Walleij #define FORCE_BAT_CTRL_CMP_HIGH 0x08 240417c0fc2SLinus Walleij #define BAT_CTRL_PULL_UP_ENA 0x10 241417c0fc2SLinus Walleij 242417c0fc2SLinus Walleij /* Battery type */ 243417c0fc2SLinus Walleij #define BATTERY_UNKNOWN 00 244417c0fc2SLinus Walleij 245417c0fc2SLinus Walleij /* Registers for pcut feature in ab8505 and ab9540 */ 246417c0fc2SLinus Walleij #define AB8505_RTC_PCUT_CTL_STATUS_REG 0x12 247417c0fc2SLinus Walleij #define AB8505_RTC_PCUT_TIME_REG 0x13 248417c0fc2SLinus Walleij #define AB8505_RTC_PCUT_MAX_TIME_REG 0x14 249417c0fc2SLinus Walleij #define AB8505_RTC_PCUT_FLAG_TIME_REG 0x15 250417c0fc2SLinus Walleij #define AB8505_RTC_PCUT_RESTART_REG 0x16 251417c0fc2SLinus Walleij #define AB8505_RTC_PCUT_DEBOUNCE_REG 0x17 252417c0fc2SLinus Walleij 253417c0fc2SLinus Walleij /* USB Power Path constants for ab8540 */ 254417c0fc2SLinus Walleij #define BUS_VSYS_VOL_SELECT_MASK 0x06 255417c0fc2SLinus Walleij #define BUS_VSYS_VOL_SELECT_3P6V 0x00 256417c0fc2SLinus Walleij #define BUS_VSYS_VOL_SELECT_3P325V 0x02 257417c0fc2SLinus Walleij #define BUS_VSYS_VOL_SELECT_3P9V 0x04 258417c0fc2SLinus Walleij #define BUS_VSYS_VOL_SELECT_4P3V 0x06 259417c0fc2SLinus Walleij #define BUS_POWER_PATH_MODE_ENA 0x01 260417c0fc2SLinus Walleij #define BUS_PP_PRECHG_CURRENT_MASK 0x0E 261417c0fc2SLinus Walleij #define BUS_POWER_PATH_PRECHG_ENA 0x01 262417c0fc2SLinus Walleij 263ee0975c3SLinus Walleij /* 264ee0975c3SLinus Walleij * ADC for the battery thermistor. 265484a9cc3SLinus Walleij * When using the AB8500_ADC_THERM_BATCTRL the battery ID resistor is combined 266ee0975c3SLinus Walleij * with a NTC resistor to both identify the battery and to measure its 267ee0975c3SLinus Walleij * temperature. Different phone manufactures uses different techniques to both 268ee0975c3SLinus Walleij * identify the battery and to read its temperature. 269ee0975c3SLinus Walleij */ 270484a9cc3SLinus Walleij enum ab8500_adc_therm { 271484a9cc3SLinus Walleij AB8500_ADC_THERM_BATCTRL, 272484a9cc3SLinus Walleij AB8500_ADC_THERM_BATTEMP, 273ee0975c3SLinus Walleij }; 274ee0975c3SLinus Walleij 275ee0975c3SLinus Walleij /** 276484a9cc3SLinus Walleij * struct ab8500_res_to_temp - defines one point in a temp to res curve. To 277ee0975c3SLinus Walleij * be used in battery packs that combines the identification resistor with a 278ee0975c3SLinus Walleij * NTC resistor. 279ee0975c3SLinus Walleij * @temp: battery pack temperature in Celsius 280ee0975c3SLinus Walleij * @resist: NTC resistor net total resistance 281ee0975c3SLinus Walleij */ 282484a9cc3SLinus Walleij struct ab8500_res_to_temp { 283ee0975c3SLinus Walleij int temp; 284ee0975c3SLinus Walleij int resist; 285ee0975c3SLinus Walleij }; 286ee0975c3SLinus Walleij 287ee0975c3SLinus Walleij /* Forward declaration */ 288484a9cc3SLinus Walleij struct ab8500_fg; 289ee0975c3SLinus Walleij 290ee0975c3SLinus Walleij /** 291484a9cc3SLinus Walleij * struct ab8500_fg_parameters - Fuel gauge algorithm parameters, in seconds 292ee0975c3SLinus Walleij * if not specified 293ee0975c3SLinus Walleij * @recovery_sleep_timer: Time between measurements while recovering 294ee0975c3SLinus Walleij * @recovery_total_time: Total recovery time 295ee0975c3SLinus Walleij * @init_timer: Measurement interval during startup 296ee0975c3SLinus Walleij * @init_discard_time: Time we discard voltage measurement at startup 297ee0975c3SLinus Walleij * @init_total_time: Total init time during startup 298ee0975c3SLinus Walleij * @high_curr_time: Time current has to be high to go to recovery 299ee0975c3SLinus Walleij * @accu_charging: FG accumulation time while charging 300*0525f34dSLinus Walleij * @accu_high_curr_ua: FG accumulation time in high current mode 301*0525f34dSLinus Walleij * @high_curr_threshold_ua: High current threshold, in uA 302*0525f34dSLinus Walleij * @lowbat_threshold_uv: Low battery threshold, in uV 303ee0975c3SLinus Walleij * @battok_falling_th_sel0 Threshold in mV for battOk signal sel0 304ee0975c3SLinus Walleij * Resolution in 50 mV step. 305ee0975c3SLinus Walleij * @battok_raising_th_sel1 Threshold in mV for battOk signal sel1 306ee0975c3SLinus Walleij * Resolution in 50 mV step. 307ee0975c3SLinus Walleij * @user_cap_limit Capacity reported from user must be within this 308ee0975c3SLinus Walleij * limit to be considered as sane, in percentage 309ee0975c3SLinus Walleij * points. 310ee0975c3SLinus Walleij * @maint_thres This is the threshold where we stop reporting 311ee0975c3SLinus Walleij * battery full while in maintenance, in per cent 312ee0975c3SLinus Walleij * @pcut_enable: Enable power cut feature in ab8505 313ee0975c3SLinus Walleij * @pcut_max_time: Max time threshold 314ee0975c3SLinus Walleij * @pcut_flag_time: Flagtime threshold 315ee0975c3SLinus Walleij * @pcut_max_restart: Max number of restarts 316ee0975c3SLinus Walleij * @pcut_debounce_time: Sets battery debounce time 317ee0975c3SLinus Walleij */ 318484a9cc3SLinus Walleij struct ab8500_fg_parameters { 319ee0975c3SLinus Walleij int recovery_sleep_timer; 320ee0975c3SLinus Walleij int recovery_total_time; 321ee0975c3SLinus Walleij int init_timer; 322ee0975c3SLinus Walleij int init_discard_time; 323ee0975c3SLinus Walleij int init_total_time; 324ee0975c3SLinus Walleij int high_curr_time; 325ee0975c3SLinus Walleij int accu_charging; 326ee0975c3SLinus Walleij int accu_high_curr; 327*0525f34dSLinus Walleij int high_curr_threshold_ua; 328*0525f34dSLinus Walleij int lowbat_threshold_uv; 329ee0975c3SLinus Walleij int battok_falling_th_sel0; 330ee0975c3SLinus Walleij int battok_raising_th_sel1; 331ee0975c3SLinus Walleij int user_cap_limit; 332ee0975c3SLinus Walleij int maint_thres; 333ee0975c3SLinus Walleij bool pcut_enable; 334ee0975c3SLinus Walleij u8 pcut_max_time; 335ee0975c3SLinus Walleij u8 pcut_flag_time; 336ee0975c3SLinus Walleij u8 pcut_max_restart; 337ee0975c3SLinus Walleij u8 pcut_debounce_time; 338ee0975c3SLinus Walleij }; 339ee0975c3SLinus Walleij 340ee0975c3SLinus Walleij /** 341484a9cc3SLinus Walleij * struct ab8500_charger_maximization - struct used by the board config. 342ee0975c3SLinus Walleij * @use_maxi: Enable maximization for this battery type 34383e5aa77SLinus Walleij * @maxi_chg_curr_ua: Maximum charger current allowed in microampere 344ee0975c3SLinus Walleij * @maxi_wait_cycles: cycles to wait before setting charger current 34583e5aa77SLinus Walleij * @charger_curr_step_ua: delta between two charger current settings (uA) 346ee0975c3SLinus Walleij */ 347484a9cc3SLinus Walleij struct ab8500_maxim_parameters { 348ee0975c3SLinus Walleij bool ena_maxi; 34983e5aa77SLinus Walleij int chg_curr_ua; 350ee0975c3SLinus Walleij int wait_cycles; 35183e5aa77SLinus Walleij int charger_curr_step_ua; 352ee0975c3SLinus Walleij }; 353ee0975c3SLinus Walleij 354ee0975c3SLinus Walleij /** 355484a9cc3SLinus Walleij * struct ab8500_battery_type - different batteries supported 356ee0975c3SLinus Walleij * @resis_high: battery upper resistance limit 357ee0975c3SLinus Walleij * @resis_low: battery lower resistance limit 358ee0975c3SLinus Walleij * @maint_a_cur_lvl: charger current in maintenance A state in mA 359ee0975c3SLinus Walleij * @maint_a_vol_lvl: charger voltage in maintenance A state in mV 360ee0975c3SLinus Walleij * @maint_a_chg_timer_h: charge time in maintenance A state 361ee0975c3SLinus Walleij * @maint_b_cur_lvl: charger current in maintenance B state in mA 362ee0975c3SLinus Walleij * @maint_b_vol_lvl: charger voltage in maintenance B state in mV 363ee0975c3SLinus Walleij * @maint_b_chg_timer_h: charge time in maintenance B state 364ee0975c3SLinus Walleij * @low_high_cur_lvl: charger current in temp low/high state in mA 365ee0975c3SLinus Walleij * @low_high_vol_lvl: charger voltage in temp low/high state in mV' 366ee0975c3SLinus Walleij * @n_r_t_tbl_elements: number of elements in r_to_t_tbl 367ee0975c3SLinus Walleij * @r_to_t_tbl: table containing resistance to temp points 368ee0975c3SLinus Walleij */ 369484a9cc3SLinus Walleij struct ab8500_battery_type { 370ee0975c3SLinus Walleij int resis_high; 371ee0975c3SLinus Walleij int resis_low; 372ee0975c3SLinus Walleij int maint_a_cur_lvl; 373ee0975c3SLinus Walleij int maint_a_vol_lvl; 374ee0975c3SLinus Walleij int maint_a_chg_timer_h; 375ee0975c3SLinus Walleij int maint_b_cur_lvl; 376ee0975c3SLinus Walleij int maint_b_vol_lvl; 377ee0975c3SLinus Walleij int maint_b_chg_timer_h; 378ee0975c3SLinus Walleij int low_high_cur_lvl; 379ee0975c3SLinus Walleij int low_high_vol_lvl; 380ee0975c3SLinus Walleij int n_temp_tbl_elements; 381484a9cc3SLinus Walleij const struct ab8500_res_to_temp *r_to_t_tbl; 382ee0975c3SLinus Walleij }; 383ee0975c3SLinus Walleij 384ee0975c3SLinus Walleij /** 385417c0fc2SLinus Walleij * struct ab8500_bm_capacity_levels - ab8500 capacity level data 386417c0fc2SLinus Walleij * @critical: critical capacity level in percent 387417c0fc2SLinus Walleij * @low: low capacity level in percent 388417c0fc2SLinus Walleij * @normal: normal capacity level in percent 389417c0fc2SLinus Walleij * @high: high capacity level in percent 390417c0fc2SLinus Walleij * @full: full capacity level in percent 391417c0fc2SLinus Walleij */ 392417c0fc2SLinus Walleij struct ab8500_bm_capacity_levels { 393417c0fc2SLinus Walleij int critical; 394417c0fc2SLinus Walleij int low; 395417c0fc2SLinus Walleij int normal; 396417c0fc2SLinus Walleij int high; 397417c0fc2SLinus Walleij int full; 398417c0fc2SLinus Walleij }; 399417c0fc2SLinus Walleij 400417c0fc2SLinus Walleij /** 401417c0fc2SLinus Walleij * struct ab8500_bm_charger_parameters - Charger specific parameters 402bc6e0287SLinus Walleij * @usb_volt_max_uv: maximum allowed USB charger voltage in uV 40383e5aa77SLinus Walleij * @usb_curr_max_ua: maximum allowed USB charger current in uA 404bc6e0287SLinus Walleij * @ac_volt_max_uv: maximum allowed AC charger voltage in uV 40583e5aa77SLinus Walleij * @ac_curr_max_ua: maximum allowed AC charger current in uA 406417c0fc2SLinus Walleij */ 407417c0fc2SLinus Walleij struct ab8500_bm_charger_parameters { 408bc6e0287SLinus Walleij int usb_volt_max_uv; 40983e5aa77SLinus Walleij int usb_curr_max_ua; 410bc6e0287SLinus Walleij int ac_volt_max_uv; 41183e5aa77SLinus Walleij int ac_curr_max_ua; 412417c0fc2SLinus Walleij }; 413417c0fc2SLinus Walleij 414417c0fc2SLinus Walleij /** 415417c0fc2SLinus Walleij * struct ab8500_bm_data - ab8500 battery management data 4166252c706SLinus Walleij * @bi battery info from device tree 417484a9cc3SLinus Walleij * @temp_now present battery temperature 418417c0fc2SLinus Walleij * @temp_interval_chg temperature measurement interval in s when charging 419417c0fc2SLinus Walleij * @temp_interval_nochg temperature measurement interval in s when not charging 420417c0fc2SLinus Walleij * @main_safety_tmr_h safety timer for main charger 421417c0fc2SLinus Walleij * @usb_safety_tmr_h safety timer for usb charger 422417c0fc2SLinus Walleij * @bkup_bat_v voltage which we charge the backup battery with 423417c0fc2SLinus Walleij * @bkup_bat_i current which we charge the backup battery with 424417c0fc2SLinus Walleij * @no_maintenance indicates that maintenance charging is disabled 425417c0fc2SLinus Walleij * @capacity_scaling indicates whether capacity scaling is to be used 426484a9cc3SLinus Walleij * @ab8500_adc_therm placement of thermistor, batctrl or battemp adc 427417c0fc2SLinus Walleij * @chg_unknown_bat flag to enable charging of unknown batteries 428417c0fc2SLinus Walleij * @enable_overshoot flag to enable VBAT overshoot control 429484a9cc3SLinus Walleij * @auto_trig flag to enable auto adc trigger 430417c0fc2SLinus Walleij * @fg_res resistance of FG resistor in 0.1mOhm 431417c0fc2SLinus Walleij * @interval_charging charge alg cycle period time when charging (sec) 432417c0fc2SLinus Walleij * @interval_not_charging charge alg cycle period time when not charging (sec) 433417c0fc2SLinus Walleij * @temp_hysteresis temperature hysteresis 434417c0fc2SLinus Walleij * @gnd_lift_resistance Battery ground to phone ground resistance (mOhm) 435484a9cc3SLinus Walleij * @maxi maximization parameters 436417c0fc2SLinus Walleij * @cap_levels capacity in percent for the different capacity levels 437417c0fc2SLinus Walleij * @bat_type table of supported battery types 438417c0fc2SLinus Walleij * @chg_params charger parameters 439417c0fc2SLinus Walleij * @fg_params fuel gauge parameters 440417c0fc2SLinus Walleij */ 441417c0fc2SLinus Walleij struct ab8500_bm_data { 4426252c706SLinus Walleij struct power_supply_battery_info bi; 443484a9cc3SLinus Walleij int temp_now; 444417c0fc2SLinus Walleij int temp_interval_chg; 445417c0fc2SLinus Walleij int temp_interval_nochg; 446417c0fc2SLinus Walleij int main_safety_tmr_h; 447417c0fc2SLinus Walleij int usb_safety_tmr_h; 448417c0fc2SLinus Walleij int bkup_bat_v; 449417c0fc2SLinus Walleij int bkup_bat_i; 450417c0fc2SLinus Walleij bool no_maintenance; 451417c0fc2SLinus Walleij bool capacity_scaling; 452417c0fc2SLinus Walleij bool chg_unknown_bat; 453417c0fc2SLinus Walleij bool enable_overshoot; 454484a9cc3SLinus Walleij bool auto_trig; 455484a9cc3SLinus Walleij enum ab8500_adc_therm adc_therm; 456417c0fc2SLinus Walleij int fg_res; 457417c0fc2SLinus Walleij int interval_charging; 458417c0fc2SLinus Walleij int interval_not_charging; 459417c0fc2SLinus Walleij int temp_hysteresis; 460417c0fc2SLinus Walleij int gnd_lift_resistance; 461417c0fc2SLinus Walleij const struct ab8500_maxim_parameters *maxi; 462417c0fc2SLinus Walleij const struct ab8500_bm_capacity_levels *cap_levels; 463484a9cc3SLinus Walleij struct ab8500_battery_type *bat_type; 464417c0fc2SLinus Walleij const struct ab8500_bm_charger_parameters *chg_params; 465417c0fc2SLinus Walleij const struct ab8500_fg_parameters *fg_params; 466417c0fc2SLinus Walleij }; 467417c0fc2SLinus Walleij 468484a9cc3SLinus Walleij enum { 469484a9cc3SLinus Walleij NTC_EXTERNAL = 0, 470484a9cc3SLinus Walleij NTC_INTERNAL, 471484a9cc3SLinus Walleij }; 472484a9cc3SLinus Walleij 473484a9cc3SLinus Walleij /** 474484a9cc3SLinus Walleij * struct res_to_temp - defines one point in a temp to res curve. To 475484a9cc3SLinus Walleij * be used in battery packs that combines the identification resistor with a 476484a9cc3SLinus Walleij * NTC resistor. 477484a9cc3SLinus Walleij * @temp: battery pack temperature in Celsius 478484a9cc3SLinus Walleij * @resist: NTC resistor net total resistance 479484a9cc3SLinus Walleij */ 480484a9cc3SLinus Walleij struct res_to_temp { 481484a9cc3SLinus Walleij int temp; 482484a9cc3SLinus Walleij int resist; 483484a9cc3SLinus Walleij }; 484484a9cc3SLinus Walleij 485484a9cc3SLinus Walleij /* Forward declaration */ 486484a9cc3SLinus Walleij struct ab8500_fg; 487484a9cc3SLinus Walleij 488484a9cc3SLinus Walleij extern struct ab8500_bm_data ab8500_bm_data; 489417c0fc2SLinus Walleij 490417c0fc2SLinus Walleij void ab8500_charger_usb_state_changed(u8 bm_usb_state, u16 mA); 491417c0fc2SLinus Walleij struct ab8500_fg *ab8500_fg_get(void); 492417c0fc2SLinus Walleij int ab8500_fg_inst_curr_blocking(struct ab8500_fg *dev); 493417c0fc2SLinus Walleij int ab8500_fg_inst_curr_start(struct ab8500_fg *di); 494417c0fc2SLinus Walleij int ab8500_fg_inst_curr_finalize(struct ab8500_fg *di, int *res); 495417c0fc2SLinus Walleij int ab8500_fg_inst_curr_started(struct ab8500_fg *di); 496417c0fc2SLinus Walleij int ab8500_fg_inst_curr_done(struct ab8500_fg *di); 49759f1b854SLinus Walleij int ab8500_bm_of_probe(struct power_supply *psy, 498484a9cc3SLinus Walleij struct ab8500_bm_data *bm); 4996252c706SLinus Walleij void ab8500_bm_of_remove(struct power_supply *psy, 5006252c706SLinus Walleij struct ab8500_bm_data *bm); 501417c0fc2SLinus Walleij 5021c1f13a0SLinus Walleij extern struct platform_driver ab8500_fg_driver; 5031c1f13a0SLinus Walleij extern struct platform_driver ab8500_btemp_driver; 504c5b64a99SLinus Walleij extern struct platform_driver ab8500_chargalg_driver; 5051c1f13a0SLinus Walleij 506417c0fc2SLinus Walleij #endif /* _AB8500_CHARGER_H_ */ 507