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