1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* 3 * TI LP8788 MFD Device 4 * 5 * Copyright 2012 Texas Instruments 6 * 7 * Author: Milo(Woogyom) Kim <milo.kim@ti.com> 8 */ 9 10#ifndef __MFD_LP8788_H__ 11#define __MFD_LP8788_H__ 12 13#include <linux/irqdomain.h> 14#include <linux/pwm.h> 15#include <linux/regmap.h> 16 17#define LP8788_DEV_BUCK "lp8788-buck" 18#define LP8788_DEV_DLDO "lp8788-dldo" 19#define LP8788_DEV_ALDO "lp8788-aldo" 20#define LP8788_DEV_CHARGER "lp8788-charger" 21#define LP8788_DEV_RTC "lp8788-rtc" 22#define LP8788_DEV_BACKLIGHT "lp8788-backlight" 23#define LP8788_DEV_VIBRATOR "lp8788-vibrator" 24#define LP8788_DEV_KEYLED "lp8788-keyled" 25#define LP8788_DEV_ADC "lp8788-adc" 26 27#define LP8788_NUM_BUCKS 4 28#define LP8788_NUM_DLDOS 12 29#define LP8788_NUM_ALDOS 10 30#define LP8788_NUM_BUCK2_DVS 2 31 32#define LP8788_CHG_IRQ "CHG_IRQ" 33#define LP8788_PRSW_IRQ "PRSW_IRQ" 34#define LP8788_BATT_IRQ "BATT_IRQ" 35#define LP8788_ALM_IRQ "ALARM_IRQ" 36 37enum lp8788_int_id { 38 /* interrup register 1 : Addr 00h */ 39 LP8788_INT_TSDL, 40 LP8788_INT_TSDH, 41 LP8788_INT_UVLO, 42 LP8788_INT_FLAGMON, 43 LP8788_INT_PWRON_TIME, 44 LP8788_INT_PWRON, 45 LP8788_INT_COMP1, 46 LP8788_INT_COMP2, 47 48 /* interrupt register 2 : Addr 01h */ 49 LP8788_INT_CHG_INPUT_STATE, 50 LP8788_INT_CHG_STATE, 51 LP8788_INT_EOC, 52 LP8788_INT_CHG_RESTART, 53 LP8788_INT_RESTART_TIMEOUT, 54 LP8788_INT_FULLCHG_TIMEOUT, 55 LP8788_INT_PRECHG_TIMEOUT, 56 57 /* interrupt register 3 : Addr 02h */ 58 LP8788_INT_RTC_ALARM1 = 17, 59 LP8788_INT_RTC_ALARM2, 60 LP8788_INT_ENTER_SYS_SUPPORT, 61 LP8788_INT_EXIT_SYS_SUPPORT, 62 LP8788_INT_BATT_LOW, 63 LP8788_INT_NO_BATT, 64 65 LP8788_INT_MAX = 24, 66}; 67 68enum lp8788_dvs_sel { 69 DVS_SEL_V0, 70 DVS_SEL_V1, 71 DVS_SEL_V2, 72 DVS_SEL_V3, 73}; 74 75enum lp8788_ext_ldo_en_id { 76 EN_ALDO1, 77 EN_ALDO234, 78 EN_ALDO5, 79 EN_ALDO7, 80 EN_DLDO7, 81 EN_DLDO911, 82 EN_LDOS_MAX, 83}; 84 85enum lp8788_charger_event { 86 NO_CHARGER, 87 CHARGER_DETECTED, 88}; 89 90enum lp8788_bl_ctrl_mode { 91 LP8788_BL_REGISTER_ONLY, 92 LP8788_BL_COMB_PWM_BASED, /* PWM + I2C, changed by PWM input */ 93 LP8788_BL_COMB_REGISTER_BASED, /* PWM + I2C, changed by I2C */ 94}; 95 96enum lp8788_bl_dim_mode { 97 LP8788_DIM_EXPONENTIAL, 98 LP8788_DIM_LINEAR, 99}; 100 101enum lp8788_bl_full_scale_current { 102 LP8788_FULLSCALE_5000uA, 103 LP8788_FULLSCALE_8500uA, 104 LP8788_FULLSCALE_1200uA, 105 LP8788_FULLSCALE_1550uA, 106 LP8788_FULLSCALE_1900uA, 107 LP8788_FULLSCALE_2250uA, 108 LP8788_FULLSCALE_2600uA, 109 LP8788_FULLSCALE_2950uA, 110}; 111 112enum lp8788_bl_ramp_step { 113 LP8788_RAMP_8us, 114 LP8788_RAMP_1024us, 115 LP8788_RAMP_2048us, 116 LP8788_RAMP_4096us, 117 LP8788_RAMP_8192us, 118 LP8788_RAMP_16384us, 119 LP8788_RAMP_32768us, 120 LP8788_RAMP_65538us, 121}; 122 123enum lp8788_isink_scale { 124 LP8788_ISINK_SCALE_100mA, 125 LP8788_ISINK_SCALE_120mA, 126}; 127 128enum lp8788_isink_number { 129 LP8788_ISINK_1, 130 LP8788_ISINK_2, 131 LP8788_ISINK_3, 132}; 133 134enum lp8788_alarm_sel { 135 LP8788_ALARM_1, 136 LP8788_ALARM_2, 137 LP8788_ALARM_MAX, 138}; 139 140enum lp8788_adc_id { 141 LPADC_VBATT_5P5, 142 LPADC_VIN_CHG, 143 LPADC_IBATT, 144 LPADC_IC_TEMP, 145 LPADC_VBATT_6P0, 146 LPADC_VBATT_5P0, 147 LPADC_ADC1, 148 LPADC_ADC2, 149 LPADC_VDD, 150 LPADC_VCOIN, 151 LPADC_VDD_LDO, 152 LPADC_ADC3, 153 LPADC_ADC4, 154 LPADC_MAX, 155}; 156 157struct lp8788; 158 159/* 160 * lp8788_buck1_dvs 161 * @vsel : dvs selector for buck v1 register 162 */ 163struct lp8788_buck1_dvs { 164 enum lp8788_dvs_sel vsel; 165}; 166 167/* 168 * lp8788_buck2_dvs 169 * @vsel : dvs selector for buck v2 register 170 */ 171struct lp8788_buck2_dvs { 172 enum lp8788_dvs_sel vsel; 173}; 174 175/* 176 * struct lp8788_chg_param 177 * @addr : charging control register address (range : 0x11 ~ 0x1C) 178 * @val : charging parameter value 179 */ 180struct lp8788_chg_param { 181 u8 addr; 182 u8 val; 183}; 184 185/* 186 * struct lp8788_charger_platform_data 187 * @adc_vbatt : adc channel name for battery voltage 188 * @adc_batt_temp : adc channel name for battery temperature 189 * @max_vbatt_mv : used for calculating battery capacity 190 * @chg_params : initial charging parameters 191 * @num_chg_params : numbers of charging parameters 192 * @charger_event : the charger event can be reported to the platform side 193 */ 194struct lp8788_charger_platform_data { 195 const char *adc_vbatt; 196 const char *adc_batt_temp; 197 unsigned int max_vbatt_mv; 198 struct lp8788_chg_param *chg_params; 199 int num_chg_params; 200 void (*charger_event) (struct lp8788 *lp, 201 enum lp8788_charger_event event); 202}; 203 204/* 205 * struct lp8788_backlight_platform_data 206 * @name : backlight driver name. (default: "lcd-backlight") 207 * @initial_brightness : initial value of backlight brightness 208 * @bl_mode : brightness control by pwm or lp8788 register 209 * @dim_mode : dimming mode selection 210 * @full_scale : full scale current setting 211 * @rise_time : brightness ramp up step time 212 * @fall_time : brightness ramp down step time 213 * @pwm_pol : pwm polarity setting when bl_mode is pwm based 214 * @period_ns : platform specific pwm period value. unit is nano. 215 Only valid when bl_mode is LP8788_BL_COMB_PWM_BASED 216 */ 217struct lp8788_backlight_platform_data { 218 char *name; 219 int initial_brightness; 220 enum lp8788_bl_ctrl_mode bl_mode; 221 enum lp8788_bl_dim_mode dim_mode; 222 enum lp8788_bl_full_scale_current full_scale; 223 enum lp8788_bl_ramp_step rise_time; 224 enum lp8788_bl_ramp_step fall_time; 225 enum pwm_polarity pwm_pol; 226 unsigned int period_ns; 227}; 228 229/* 230 * struct lp8788_led_platform_data 231 * @name : led driver name. (default: "keyboard-backlight") 232 * @scale : current scale 233 * @num : current sink number 234 * @iout_code : current output value (Addr 9Ah ~ 9Bh) 235 */ 236struct lp8788_led_platform_data { 237 char *name; 238 enum lp8788_isink_scale scale; 239 enum lp8788_isink_number num; 240 int iout_code; 241}; 242 243/* 244 * struct lp8788_vib_platform_data 245 * @name : vibrator driver name 246 * @scale : current scale 247 * @num : current sink number 248 * @iout_code : current output value (Addr 9Ah ~ 9Bh) 249 * @pwm_code : PWM code value (Addr 9Ch ~ 9Eh) 250 */ 251struct lp8788_vib_platform_data { 252 char *name; 253 enum lp8788_isink_scale scale; 254 enum lp8788_isink_number num; 255 int iout_code; 256 int pwm_code; 257}; 258 259/* 260 * struct lp8788_platform_data 261 * @init_func : used for initializing registers 262 * before mfd driver is registered 263 * @buck_data : regulator initial data for buck 264 * @dldo_data : regulator initial data for digital ldo 265 * @aldo_data : regulator initial data for analog ldo 266 * @buck1_dvs : configurations for buck1 dvs 267 * @buck2_dvs : configurations for buck2 dvs 268 * @chg_pdata : platform data for charger driver 269 * @alarm_sel : rtc alarm selection (1 or 2) 270 * @bl_pdata : configurable data for backlight driver 271 * @led_pdata : configurable data for led driver 272 * @vib_pdata : configurable data for vibrator driver 273 * @adc_pdata : iio map data for adc driver 274 */ 275struct lp8788_platform_data { 276 /* general system information */ 277 int (*init_func) (struct lp8788 *lp); 278 279 /* regulators */ 280 struct regulator_init_data *buck_data[LP8788_NUM_BUCKS]; 281 struct regulator_init_data *dldo_data[LP8788_NUM_DLDOS]; 282 struct regulator_init_data *aldo_data[LP8788_NUM_ALDOS]; 283 struct lp8788_buck1_dvs *buck1_dvs; 284 struct lp8788_buck2_dvs *buck2_dvs; 285 286 /* charger */ 287 struct lp8788_charger_platform_data *chg_pdata; 288 289 /* rtc alarm */ 290 enum lp8788_alarm_sel alarm_sel; 291 292 /* backlight */ 293 struct lp8788_backlight_platform_data *bl_pdata; 294 295 /* current sinks */ 296 struct lp8788_led_platform_data *led_pdata; 297 struct lp8788_vib_platform_data *vib_pdata; 298 299 /* adc iio map data */ 300 struct iio_map *adc_pdata; 301}; 302 303/* 304 * struct lp8788 305 * @dev : parent device pointer 306 * @regmap : used for i2c communcation on accessing registers 307 * @irqdm : interrupt domain for handling nested interrupt 308 * @irq : pin number of IRQ_N 309 * @pdata : lp8788 platform specific data 310 */ 311struct lp8788 { 312 struct device *dev; 313 struct regmap *regmap; 314 struct irq_domain *irqdm; 315 int irq; 316 struct lp8788_platform_data *pdata; 317}; 318 319int lp8788_irq_init(struct lp8788 *lp, int chip_irq); 320void lp8788_irq_exit(struct lp8788 *lp); 321int lp8788_read_byte(struct lp8788 *lp, u8 reg, u8 *data); 322int lp8788_read_multi_bytes(struct lp8788 *lp, u8 reg, u8 *data, size_t count); 323int lp8788_write_byte(struct lp8788 *lp, u8 reg, u8 data); 324int lp8788_update_bits(struct lp8788 *lp, u8 reg, u8 mask, u8 data); 325#endif 326