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