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 /* current is mA */ 164417c0fc2SLinus Walleij #define USB_0P1A 100 165417c0fc2SLinus Walleij #define USB_0P2A 200 166417c0fc2SLinus Walleij #define USB_0P3A 300 167417c0fc2SLinus Walleij #define USB_0P4A 400 168417c0fc2SLinus Walleij #define USB_0P5A 500 169417c0fc2SLinus Walleij 170417c0fc2SLinus Walleij #define LOW_BAT_3P1V 0x20 171417c0fc2SLinus Walleij #define LOW_BAT_2P3V 0x00 172417c0fc2SLinus Walleij #define LOW_BAT_RESET 0x01 173417c0fc2SLinus Walleij #define LOW_BAT_ENABLE 0x01 174417c0fc2SLinus Walleij 175417c0fc2SLinus Walleij /* Backup battery constants */ 176417c0fc2SLinus Walleij #define BUP_ICH_SEL_50UA 0x00 177417c0fc2SLinus Walleij #define BUP_ICH_SEL_150UA 0x04 178417c0fc2SLinus Walleij #define BUP_ICH_SEL_300UA 0x08 179417c0fc2SLinus Walleij #define BUP_ICH_SEL_700UA 0x0C 180417c0fc2SLinus Walleij 181417c0fc2SLinus Walleij enum bup_vch_sel { 182417c0fc2SLinus Walleij BUP_VCH_SEL_2P5V, 183417c0fc2SLinus Walleij BUP_VCH_SEL_2P6V, 184417c0fc2SLinus Walleij BUP_VCH_SEL_2P8V, 185417c0fc2SLinus Walleij BUP_VCH_SEL_3P1V, 186417c0fc2SLinus Walleij /* 187417c0fc2SLinus Walleij * Note that the following 5 values 2.7v, 2.9v, 3.0v, 3.2v, 3.3v 188417c0fc2SLinus Walleij * are only available on ab8540. You can't choose these 5 189417c0fc2SLinus Walleij * voltage on ab8500/ab8505/ab9540. 190417c0fc2SLinus Walleij */ 191417c0fc2SLinus Walleij BUP_VCH_SEL_2P7V, 192417c0fc2SLinus Walleij BUP_VCH_SEL_2P9V, 193417c0fc2SLinus Walleij BUP_VCH_SEL_3P0V, 194417c0fc2SLinus Walleij BUP_VCH_SEL_3P2V, 195417c0fc2SLinus Walleij BUP_VCH_SEL_3P3V, 196417c0fc2SLinus Walleij }; 197417c0fc2SLinus Walleij 198417c0fc2SLinus Walleij #define BUP_VCH_RANGE 0x02 199417c0fc2SLinus Walleij #define VBUP33_VRTCN 0x01 200417c0fc2SLinus Walleij 201417c0fc2SLinus Walleij /* Battery OVV constants */ 202417c0fc2SLinus Walleij #define BATT_OVV_ENA 0x02 203417c0fc2SLinus Walleij #define BATT_OVV_TH_3P7 0x00 204417c0fc2SLinus Walleij #define BATT_OVV_TH_4P75 0x01 205417c0fc2SLinus Walleij 206417c0fc2SLinus Walleij /* A value to indicate over voltage */ 207417c0fc2SLinus Walleij #define BATT_OVV_VALUE 4750 208417c0fc2SLinus Walleij 209417c0fc2SLinus Walleij /* VBUS OVV constants */ 210417c0fc2SLinus Walleij #define VBUS_OVV_SELECT_MASK 0x78 211417c0fc2SLinus Walleij #define VBUS_OVV_SELECT_5P6V 0x00 212417c0fc2SLinus Walleij #define VBUS_OVV_SELECT_5P7V 0x08 213417c0fc2SLinus Walleij #define VBUS_OVV_SELECT_5P8V 0x10 214417c0fc2SLinus Walleij #define VBUS_OVV_SELECT_5P9V 0x18 215417c0fc2SLinus Walleij #define VBUS_OVV_SELECT_6P0V 0x20 216417c0fc2SLinus Walleij #define VBUS_OVV_SELECT_6P1V 0x28 217417c0fc2SLinus Walleij #define VBUS_OVV_SELECT_6P2V 0x30 218417c0fc2SLinus Walleij #define VBUS_OVV_SELECT_6P3V 0x38 219417c0fc2SLinus Walleij 220417c0fc2SLinus Walleij #define VBUS_AUTO_IN_CURR_LIM_ENA 0x04 221417c0fc2SLinus Walleij 222417c0fc2SLinus Walleij /* Fuel Gauge constants */ 223417c0fc2SLinus Walleij #define RESET_ACCU 0x02 224417c0fc2SLinus Walleij #define READ_REQ 0x01 225417c0fc2SLinus Walleij #define CC_DEEP_SLEEP_ENA 0x02 226417c0fc2SLinus Walleij #define CC_PWR_UP_ENA 0x01 227417c0fc2SLinus Walleij #define CC_SAMPLES_40 0x28 228417c0fc2SLinus Walleij #define RD_NCONV_ACCU_REQ 0x01 229417c0fc2SLinus Walleij #define CC_CALIB 0x08 230417c0fc2SLinus Walleij #define CC_INTAVGOFFSET_ENA 0x10 231417c0fc2SLinus Walleij #define CC_MUXOFFSET 0x80 232417c0fc2SLinus Walleij #define CC_INT_CAL_N_AVG_MASK 0x60 233417c0fc2SLinus Walleij #define CC_INT_CAL_SAMPLES_16 0x40 234417c0fc2SLinus Walleij #define CC_INT_CAL_SAMPLES_8 0x20 235417c0fc2SLinus Walleij #define CC_INT_CAL_SAMPLES_4 0x00 236417c0fc2SLinus Walleij 237417c0fc2SLinus Walleij /* RTC constants */ 238417c0fc2SLinus Walleij #define RTC_BUP_CH_ENA 0x10 239417c0fc2SLinus Walleij 240417c0fc2SLinus Walleij /* BatCtrl Current Source Constants */ 241417c0fc2SLinus Walleij #define BAT_CTRL_7U_ENA 0x01 242417c0fc2SLinus Walleij #define BAT_CTRL_20U_ENA 0x02 243417c0fc2SLinus Walleij #define BAT_CTRL_18U_ENA 0x01 244417c0fc2SLinus Walleij #define BAT_CTRL_16U_ENA 0x02 245417c0fc2SLinus Walleij #define BAT_CTRL_CMP_ENA 0x04 246417c0fc2SLinus Walleij #define FORCE_BAT_CTRL_CMP_HIGH 0x08 247417c0fc2SLinus Walleij #define BAT_CTRL_PULL_UP_ENA 0x10 248417c0fc2SLinus Walleij 249417c0fc2SLinus Walleij /* Battery type */ 250417c0fc2SLinus Walleij #define BATTERY_UNKNOWN 00 251417c0fc2SLinus Walleij 252417c0fc2SLinus Walleij /* Registers for pcut feature in ab8505 and ab9540 */ 253417c0fc2SLinus Walleij #define AB8505_RTC_PCUT_CTL_STATUS_REG 0x12 254417c0fc2SLinus Walleij #define AB8505_RTC_PCUT_TIME_REG 0x13 255417c0fc2SLinus Walleij #define AB8505_RTC_PCUT_MAX_TIME_REG 0x14 256417c0fc2SLinus Walleij #define AB8505_RTC_PCUT_FLAG_TIME_REG 0x15 257417c0fc2SLinus Walleij #define AB8505_RTC_PCUT_RESTART_REG 0x16 258417c0fc2SLinus Walleij #define AB8505_RTC_PCUT_DEBOUNCE_REG 0x17 259417c0fc2SLinus Walleij 260417c0fc2SLinus Walleij /* USB Power Path constants for ab8540 */ 261417c0fc2SLinus Walleij #define BUS_VSYS_VOL_SELECT_MASK 0x06 262417c0fc2SLinus Walleij #define BUS_VSYS_VOL_SELECT_3P6V 0x00 263417c0fc2SLinus Walleij #define BUS_VSYS_VOL_SELECT_3P325V 0x02 264417c0fc2SLinus Walleij #define BUS_VSYS_VOL_SELECT_3P9V 0x04 265417c0fc2SLinus Walleij #define BUS_VSYS_VOL_SELECT_4P3V 0x06 266417c0fc2SLinus Walleij #define BUS_POWER_PATH_MODE_ENA 0x01 267417c0fc2SLinus Walleij #define BUS_PP_PRECHG_CURRENT_MASK 0x0E 268417c0fc2SLinus Walleij #define BUS_POWER_PATH_PRECHG_ENA 0x01 269417c0fc2SLinus Walleij 270ee0975c3SLinus Walleij /* 271ee0975c3SLinus Walleij * ADC for the battery thermistor. 272484a9cc3SLinus Walleij * When using the AB8500_ADC_THERM_BATCTRL the battery ID resistor is combined 273ee0975c3SLinus Walleij * with a NTC resistor to both identify the battery and to measure its 274ee0975c3SLinus Walleij * temperature. Different phone manufactures uses different techniques to both 275ee0975c3SLinus Walleij * identify the battery and to read its temperature. 276ee0975c3SLinus Walleij */ 277484a9cc3SLinus Walleij enum ab8500_adc_therm { 278484a9cc3SLinus Walleij AB8500_ADC_THERM_BATCTRL, 279484a9cc3SLinus Walleij AB8500_ADC_THERM_BATTEMP, 280ee0975c3SLinus Walleij }; 281ee0975c3SLinus Walleij 282ee0975c3SLinus Walleij /** 283484a9cc3SLinus Walleij * struct ab8500_res_to_temp - defines one point in a temp to res curve. To 284ee0975c3SLinus Walleij * be used in battery packs that combines the identification resistor with a 285ee0975c3SLinus Walleij * NTC resistor. 286ee0975c3SLinus Walleij * @temp: battery pack temperature in Celsius 287ee0975c3SLinus Walleij * @resist: NTC resistor net total resistance 288ee0975c3SLinus Walleij */ 289484a9cc3SLinus Walleij struct ab8500_res_to_temp { 290ee0975c3SLinus Walleij int temp; 291ee0975c3SLinus Walleij int resist; 292ee0975c3SLinus Walleij }; 293ee0975c3SLinus Walleij 294ee0975c3SLinus Walleij /** 295484a9cc3SLinus Walleij * struct ab8500_v_to_cap - Table for translating voltage to capacity 296ee0975c3SLinus Walleij * @voltage: Voltage in mV 297ee0975c3SLinus Walleij * @capacity: Capacity in percent 298ee0975c3SLinus Walleij */ 299484a9cc3SLinus Walleij struct ab8500_v_to_cap { 300ee0975c3SLinus Walleij int voltage; 301ee0975c3SLinus Walleij int capacity; 302ee0975c3SLinus Walleij }; 303ee0975c3SLinus Walleij 304ee0975c3SLinus Walleij /* Forward declaration */ 305484a9cc3SLinus Walleij struct ab8500_fg; 306ee0975c3SLinus Walleij 307ee0975c3SLinus Walleij /** 308484a9cc3SLinus Walleij * struct ab8500_fg_parameters - Fuel gauge algorithm parameters, in seconds 309ee0975c3SLinus Walleij * if not specified 310ee0975c3SLinus Walleij * @recovery_sleep_timer: Time between measurements while recovering 311ee0975c3SLinus Walleij * @recovery_total_time: Total recovery time 312ee0975c3SLinus Walleij * @init_timer: Measurement interval during startup 313ee0975c3SLinus Walleij * @init_discard_time: Time we discard voltage measurement at startup 314ee0975c3SLinus Walleij * @init_total_time: Total init time during startup 315ee0975c3SLinus Walleij * @high_curr_time: Time current has to be high to go to recovery 316ee0975c3SLinus Walleij * @accu_charging: FG accumulation time while charging 317ee0975c3SLinus Walleij * @accu_high_curr: FG accumulation time in high current mode 318ee0975c3SLinus Walleij * @high_curr_threshold: High current threshold, in mA 319ee0975c3SLinus Walleij * @lowbat_threshold: Low battery threshold, in mV 320ee0975c3SLinus Walleij * @overbat_threshold: Over battery threshold, in mV 321ee0975c3SLinus Walleij * @battok_falling_th_sel0 Threshold in mV for battOk signal sel0 322ee0975c3SLinus Walleij * Resolution in 50 mV step. 323ee0975c3SLinus Walleij * @battok_raising_th_sel1 Threshold in mV for battOk signal sel1 324ee0975c3SLinus Walleij * Resolution in 50 mV step. 325ee0975c3SLinus Walleij * @user_cap_limit Capacity reported from user must be within this 326ee0975c3SLinus Walleij * limit to be considered as sane, in percentage 327ee0975c3SLinus Walleij * points. 328ee0975c3SLinus Walleij * @maint_thres This is the threshold where we stop reporting 329ee0975c3SLinus Walleij * battery full while in maintenance, in per cent 330ee0975c3SLinus Walleij * @pcut_enable: Enable power cut feature in ab8505 331ee0975c3SLinus Walleij * @pcut_max_time: Max time threshold 332ee0975c3SLinus Walleij * @pcut_flag_time: Flagtime threshold 333ee0975c3SLinus Walleij * @pcut_max_restart: Max number of restarts 334ee0975c3SLinus Walleij * @pcut_debounce_time: Sets battery debounce time 335ee0975c3SLinus Walleij */ 336484a9cc3SLinus Walleij struct ab8500_fg_parameters { 337ee0975c3SLinus Walleij int recovery_sleep_timer; 338ee0975c3SLinus Walleij int recovery_total_time; 339ee0975c3SLinus Walleij int init_timer; 340ee0975c3SLinus Walleij int init_discard_time; 341ee0975c3SLinus Walleij int init_total_time; 342ee0975c3SLinus Walleij int high_curr_time; 343ee0975c3SLinus Walleij int accu_charging; 344ee0975c3SLinus Walleij int accu_high_curr; 345ee0975c3SLinus Walleij int high_curr_threshold; 346ee0975c3SLinus Walleij int lowbat_threshold; 347ee0975c3SLinus Walleij int overbat_threshold; 348ee0975c3SLinus Walleij int battok_falling_th_sel0; 349ee0975c3SLinus Walleij int battok_raising_th_sel1; 350ee0975c3SLinus Walleij int user_cap_limit; 351ee0975c3SLinus Walleij int maint_thres; 352ee0975c3SLinus Walleij bool pcut_enable; 353ee0975c3SLinus Walleij u8 pcut_max_time; 354ee0975c3SLinus Walleij u8 pcut_flag_time; 355ee0975c3SLinus Walleij u8 pcut_max_restart; 356ee0975c3SLinus Walleij u8 pcut_debounce_time; 357ee0975c3SLinus Walleij }; 358ee0975c3SLinus Walleij 359ee0975c3SLinus Walleij /** 360484a9cc3SLinus Walleij * struct ab8500_charger_maximization - struct used by the board config. 361ee0975c3SLinus Walleij * @use_maxi: Enable maximization for this battery type 362ee0975c3SLinus Walleij * @maxi_chg_curr: Maximum charger current allowed 363ee0975c3SLinus Walleij * @maxi_wait_cycles: cycles to wait before setting charger current 364ee0975c3SLinus Walleij * @charger_curr_step delta between two charger current settings (mA) 365ee0975c3SLinus Walleij */ 366484a9cc3SLinus Walleij struct ab8500_maxim_parameters { 367ee0975c3SLinus Walleij bool ena_maxi; 368ee0975c3SLinus Walleij int chg_curr; 369ee0975c3SLinus Walleij int wait_cycles; 370ee0975c3SLinus Walleij int charger_curr_step; 371ee0975c3SLinus Walleij }; 372ee0975c3SLinus Walleij 373ee0975c3SLinus Walleij /** 374484a9cc3SLinus Walleij * struct ab8500_battery_type - different batteries supported 375ee0975c3SLinus Walleij * @name: battery technology 376ee0975c3SLinus Walleij * @resis_high: battery upper resistance limit 377ee0975c3SLinus Walleij * @resis_low: battery lower resistance limit 378ee0975c3SLinus Walleij * @charge_full_design: Maximum battery capacity in mAh 379ee0975c3SLinus Walleij * @nominal_voltage: Nominal voltage of the battery in mV 380ee0975c3SLinus Walleij * @termination_vol: max voltage upto which battery can be charged 381ee0975c3SLinus Walleij * @termination_curr battery charging termination current in mA 382ee0975c3SLinus Walleij * @recharge_cap battery capacity limit that will trigger a new 383ee0975c3SLinus Walleij * full charging cycle in the case where maintenan- 384ee0975c3SLinus Walleij * -ce charging has been disabled 385ee0975c3SLinus Walleij * @normal_cur_lvl: charger current in normal state in mA 386ee0975c3SLinus Walleij * @normal_vol_lvl: charger voltage in normal state in mV 387ee0975c3SLinus Walleij * @maint_a_cur_lvl: charger current in maintenance A state in mA 388ee0975c3SLinus Walleij * @maint_a_vol_lvl: charger voltage in maintenance A state in mV 389ee0975c3SLinus Walleij * @maint_a_chg_timer_h: charge time in maintenance A state 390ee0975c3SLinus Walleij * @maint_b_cur_lvl: charger current in maintenance B state in mA 391ee0975c3SLinus Walleij * @maint_b_vol_lvl: charger voltage in maintenance B state in mV 392ee0975c3SLinus Walleij * @maint_b_chg_timer_h: charge time in maintenance B state 393ee0975c3SLinus Walleij * @low_high_cur_lvl: charger current in temp low/high state in mA 394ee0975c3SLinus Walleij * @low_high_vol_lvl: charger voltage in temp low/high state in mV' 395ee0975c3SLinus Walleij * @battery_resistance: battery inner resistance in mOhm. 396ee0975c3SLinus Walleij * @n_r_t_tbl_elements: number of elements in r_to_t_tbl 397ee0975c3SLinus Walleij * @r_to_t_tbl: table containing resistance to temp points 398ee0975c3SLinus Walleij * @n_v_cap_tbl_elements: number of elements in v_to_cap_tbl 399ee0975c3SLinus Walleij * @v_to_cap_tbl: Voltage to capacity (in %) table 400ee0975c3SLinus Walleij * @n_batres_tbl_elements number of elements in the batres_tbl 401ee0975c3SLinus Walleij * @batres_tbl battery internal resistance vs temperature table 402ee0975c3SLinus Walleij */ 403484a9cc3SLinus Walleij struct ab8500_battery_type { 404ee0975c3SLinus Walleij int name; 405ee0975c3SLinus Walleij int resis_high; 406ee0975c3SLinus Walleij int resis_low; 407ee0975c3SLinus Walleij int charge_full_design; 408ee0975c3SLinus Walleij int nominal_voltage; 409ee0975c3SLinus Walleij int termination_vol; 410ee0975c3SLinus Walleij int termination_curr; 411ee0975c3SLinus Walleij int recharge_cap; 412ee0975c3SLinus Walleij int normal_cur_lvl; 413ee0975c3SLinus Walleij int normal_vol_lvl; 414ee0975c3SLinus Walleij int maint_a_cur_lvl; 415ee0975c3SLinus Walleij int maint_a_vol_lvl; 416ee0975c3SLinus Walleij int maint_a_chg_timer_h; 417ee0975c3SLinus Walleij int maint_b_cur_lvl; 418ee0975c3SLinus Walleij int maint_b_vol_lvl; 419ee0975c3SLinus Walleij int maint_b_chg_timer_h; 420ee0975c3SLinus Walleij int low_high_cur_lvl; 421ee0975c3SLinus Walleij int low_high_vol_lvl; 422ee0975c3SLinus Walleij int battery_resistance; 423ee0975c3SLinus Walleij int n_temp_tbl_elements; 424484a9cc3SLinus Walleij const struct ab8500_res_to_temp *r_to_t_tbl; 425ee0975c3SLinus Walleij int n_v_cap_tbl_elements; 426484a9cc3SLinus Walleij const struct ab8500_v_to_cap *v_to_cap_tbl; 427ee0975c3SLinus Walleij int n_batres_tbl_elements; 428ee0975c3SLinus Walleij const struct batres_vs_temp *batres_tbl; 429ee0975c3SLinus Walleij }; 430ee0975c3SLinus Walleij 431ee0975c3SLinus Walleij /** 432417c0fc2SLinus Walleij * struct ab8500_bm_capacity_levels - ab8500 capacity level data 433417c0fc2SLinus Walleij * @critical: critical capacity level in percent 434417c0fc2SLinus Walleij * @low: low capacity level in percent 435417c0fc2SLinus Walleij * @normal: normal capacity level in percent 436417c0fc2SLinus Walleij * @high: high capacity level in percent 437417c0fc2SLinus Walleij * @full: full capacity level in percent 438417c0fc2SLinus Walleij */ 439417c0fc2SLinus Walleij struct ab8500_bm_capacity_levels { 440417c0fc2SLinus Walleij int critical; 441417c0fc2SLinus Walleij int low; 442417c0fc2SLinus Walleij int normal; 443417c0fc2SLinus Walleij int high; 444417c0fc2SLinus Walleij int full; 445417c0fc2SLinus Walleij }; 446417c0fc2SLinus Walleij 447417c0fc2SLinus Walleij /** 448417c0fc2SLinus Walleij * struct ab8500_bm_charger_parameters - Charger specific parameters 449417c0fc2SLinus Walleij * @usb_volt_max: maximum allowed USB charger voltage in mV 450417c0fc2SLinus Walleij * @usb_curr_max: maximum allowed USB charger current in mA 451417c0fc2SLinus Walleij * @ac_volt_max: maximum allowed AC charger voltage in mV 452417c0fc2SLinus Walleij * @ac_curr_max: maximum allowed AC charger current in mA 453417c0fc2SLinus Walleij */ 454417c0fc2SLinus Walleij struct ab8500_bm_charger_parameters { 455417c0fc2SLinus Walleij int usb_volt_max; 456417c0fc2SLinus Walleij int usb_curr_max; 457417c0fc2SLinus Walleij int ac_volt_max; 458417c0fc2SLinus Walleij int ac_curr_max; 459417c0fc2SLinus Walleij }; 460417c0fc2SLinus Walleij 461417c0fc2SLinus Walleij /** 462417c0fc2SLinus Walleij * struct ab8500_bm_data - ab8500 battery management data 463417c0fc2SLinus Walleij * @temp_under under this temp, charging is stopped 464417c0fc2SLinus Walleij * @temp_low between this temp and temp_under charging is reduced 465417c0fc2SLinus Walleij * @temp_high between this temp and temp_over charging is reduced 466417c0fc2SLinus Walleij * @temp_over over this temp, charging is stopped 467484a9cc3SLinus Walleij * @temp_now present battery temperature 468417c0fc2SLinus Walleij * @temp_interval_chg temperature measurement interval in s when charging 469417c0fc2SLinus Walleij * @temp_interval_nochg temperature measurement interval in s when not charging 470417c0fc2SLinus Walleij * @main_safety_tmr_h safety timer for main charger 471417c0fc2SLinus Walleij * @usb_safety_tmr_h safety timer for usb charger 472417c0fc2SLinus Walleij * @bkup_bat_v voltage which we charge the backup battery with 473417c0fc2SLinus Walleij * @bkup_bat_i current which we charge the backup battery with 474417c0fc2SLinus Walleij * @no_maintenance indicates that maintenance charging is disabled 475417c0fc2SLinus Walleij * @capacity_scaling indicates whether capacity scaling is to be used 476484a9cc3SLinus Walleij * @ab8500_adc_therm placement of thermistor, batctrl or battemp adc 477417c0fc2SLinus Walleij * @chg_unknown_bat flag to enable charging of unknown batteries 478417c0fc2SLinus Walleij * @enable_overshoot flag to enable VBAT overshoot control 479484a9cc3SLinus Walleij * @auto_trig flag to enable auto adc trigger 480417c0fc2SLinus Walleij * @fg_res resistance of FG resistor in 0.1mOhm 481417c0fc2SLinus Walleij * @n_btypes number of elements in array bat_type 482417c0fc2SLinus Walleij * @batt_id index of the identified battery in array bat_type 483417c0fc2SLinus Walleij * @interval_charging charge alg cycle period time when charging (sec) 484417c0fc2SLinus Walleij * @interval_not_charging charge alg cycle period time when not charging (sec) 485417c0fc2SLinus Walleij * @temp_hysteresis temperature hysteresis 486417c0fc2SLinus Walleij * @gnd_lift_resistance Battery ground to phone ground resistance (mOhm) 487484a9cc3SLinus Walleij * @n_chg_out_curr number of elements in array chg_output_curr 488484a9cc3SLinus Walleij * @n_chg_in_curr number of elements in array chg_input_curr 489484a9cc3SLinus Walleij * @chg_output_curr charger output current level map 490484a9cc3SLinus Walleij * @chg_input_curr charger input current level map 491484a9cc3SLinus Walleij * @maxi maximization parameters 492417c0fc2SLinus Walleij * @cap_levels capacity in percent for the different capacity levels 493417c0fc2SLinus Walleij * @bat_type table of supported battery types 494417c0fc2SLinus Walleij * @chg_params charger parameters 495417c0fc2SLinus Walleij * @fg_params fuel gauge parameters 496417c0fc2SLinus Walleij */ 497417c0fc2SLinus Walleij struct ab8500_bm_data { 498417c0fc2SLinus Walleij int temp_under; 499417c0fc2SLinus Walleij int temp_low; 500417c0fc2SLinus Walleij int temp_high; 501417c0fc2SLinus Walleij int temp_over; 502484a9cc3SLinus Walleij int temp_now; 503417c0fc2SLinus Walleij int temp_interval_chg; 504417c0fc2SLinus Walleij int temp_interval_nochg; 505417c0fc2SLinus Walleij int main_safety_tmr_h; 506417c0fc2SLinus Walleij int usb_safety_tmr_h; 507417c0fc2SLinus Walleij int bkup_bat_v; 508417c0fc2SLinus Walleij int bkup_bat_i; 509417c0fc2SLinus Walleij bool no_maintenance; 510417c0fc2SLinus Walleij bool capacity_scaling; 511417c0fc2SLinus Walleij bool chg_unknown_bat; 512417c0fc2SLinus Walleij bool enable_overshoot; 513484a9cc3SLinus Walleij bool auto_trig; 514484a9cc3SLinus Walleij enum ab8500_adc_therm adc_therm; 515417c0fc2SLinus Walleij int fg_res; 516417c0fc2SLinus Walleij int n_btypes; 517417c0fc2SLinus Walleij int batt_id; 518417c0fc2SLinus Walleij int interval_charging; 519417c0fc2SLinus Walleij int interval_not_charging; 520417c0fc2SLinus Walleij int temp_hysteresis; 521417c0fc2SLinus Walleij int gnd_lift_resistance; 522484a9cc3SLinus Walleij int n_chg_out_curr; 523484a9cc3SLinus Walleij int n_chg_in_curr; 524484a9cc3SLinus Walleij int *chg_output_curr; 525484a9cc3SLinus Walleij int *chg_input_curr; 526417c0fc2SLinus Walleij const struct ab8500_maxim_parameters *maxi; 527417c0fc2SLinus Walleij const struct ab8500_bm_capacity_levels *cap_levels; 528484a9cc3SLinus Walleij struct ab8500_battery_type *bat_type; 529417c0fc2SLinus Walleij const struct ab8500_bm_charger_parameters *chg_params; 530417c0fc2SLinus Walleij const struct ab8500_fg_parameters *fg_params; 531417c0fc2SLinus Walleij }; 532417c0fc2SLinus Walleij 533484a9cc3SLinus Walleij enum { 534484a9cc3SLinus Walleij NTC_EXTERNAL = 0, 535484a9cc3SLinus Walleij NTC_INTERNAL, 536484a9cc3SLinus Walleij }; 537484a9cc3SLinus Walleij 538484a9cc3SLinus Walleij /** 539484a9cc3SLinus Walleij * struct res_to_temp - defines one point in a temp to res curve. To 540484a9cc3SLinus Walleij * be used in battery packs that combines the identification resistor with a 541484a9cc3SLinus Walleij * NTC resistor. 542484a9cc3SLinus Walleij * @temp: battery pack temperature in Celsius 543484a9cc3SLinus Walleij * @resist: NTC resistor net total resistance 544484a9cc3SLinus Walleij */ 545484a9cc3SLinus Walleij struct res_to_temp { 546484a9cc3SLinus Walleij int temp; 547484a9cc3SLinus Walleij int resist; 548484a9cc3SLinus Walleij }; 549484a9cc3SLinus Walleij 550484a9cc3SLinus Walleij /** 551484a9cc3SLinus Walleij * struct batres_vs_temp - defines one point in a temp vs battery internal 552484a9cc3SLinus Walleij * resistance curve. 553484a9cc3SLinus Walleij * @temp: battery pack temperature in Celsius 554484a9cc3SLinus Walleij * @resist: battery internal reistance in mOhm 555484a9cc3SLinus Walleij */ 556484a9cc3SLinus Walleij struct batres_vs_temp { 557484a9cc3SLinus Walleij int temp; 558484a9cc3SLinus Walleij int resist; 559484a9cc3SLinus Walleij }; 560484a9cc3SLinus Walleij 561484a9cc3SLinus Walleij /* Forward declaration */ 562484a9cc3SLinus Walleij struct ab8500_fg; 563484a9cc3SLinus Walleij 564484a9cc3SLinus Walleij extern struct ab8500_bm_data ab8500_bm_data; 565417c0fc2SLinus Walleij 566417c0fc2SLinus Walleij void ab8500_charger_usb_state_changed(u8 bm_usb_state, u16 mA); 567417c0fc2SLinus Walleij struct ab8500_fg *ab8500_fg_get(void); 568417c0fc2SLinus Walleij int ab8500_fg_inst_curr_blocking(struct ab8500_fg *dev); 569417c0fc2SLinus Walleij int ab8500_fg_inst_curr_start(struct ab8500_fg *di); 570417c0fc2SLinus Walleij int ab8500_fg_inst_curr_finalize(struct ab8500_fg *di, int *res); 571417c0fc2SLinus Walleij int ab8500_fg_inst_curr_started(struct ab8500_fg *di); 572417c0fc2SLinus Walleij int ab8500_fg_inst_curr_done(struct ab8500_fg *di); 573*59f1b854SLinus Walleij int ab8500_bm_of_probe(struct power_supply *psy, 574484a9cc3SLinus Walleij struct ab8500_bm_data *bm); 575417c0fc2SLinus Walleij 5761c1f13a0SLinus Walleij extern struct platform_driver ab8500_fg_driver; 5771c1f13a0SLinus Walleij extern struct platform_driver ab8500_btemp_driver; 578c5b64a99SLinus Walleij extern struct platform_driver ab8500_chargalg_driver; 5791c1f13a0SLinus Walleij 580417c0fc2SLinus Walleij #endif /* _AB8500_CHARGER_H_ */ 581