at v3.7 364 lines 9.4 kB view raw
1/* 2 * TI LP8788 MFD Device 3 * 4 * Copyright 2012 Texas Instruments 5 * 6 * Author: Milo(Woogyom) Kim <milo.kim@ti.com> 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 41enum 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 72enum lp8788_dvs_sel { 73 DVS_SEL_V0, 74 DVS_SEL_V1, 75 DVS_SEL_V2, 76 DVS_SEL_V3, 77}; 78 79enum 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 89enum lp8788_charger_event { 90 NO_CHARGER, 91 CHARGER_DETECTED, 92}; 93 94enum 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 100enum lp8788_bl_dim_mode { 101 LP8788_DIM_EXPONENTIAL, 102 LP8788_DIM_LINEAR, 103}; 104 105enum 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 116enum 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 127enum lp8788_bl_pwm_polarity { 128 LP8788_PWM_ACTIVE_HIGH, 129 LP8788_PWM_ACTIVE_LOW, 130}; 131 132enum lp8788_isink_scale { 133 LP8788_ISINK_SCALE_100mA, 134 LP8788_ISINK_SCALE_120mA, 135}; 136 137enum lp8788_isink_number { 138 LP8788_ISINK_1, 139 LP8788_ISINK_2, 140 LP8788_ISINK_3, 141}; 142 143enum lp8788_alarm_sel { 144 LP8788_ALARM_1, 145 LP8788_ALARM_2, 146 LP8788_ALARM_MAX, 147}; 148 149enum 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 166struct lp8788; 167 168/* 169 * lp8788_buck1_dvs 170 * @gpio : gpio pin number for dvs control 171 * @vsel : dvs selector for buck v1 register 172 */ 173struct 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 */ 183struct 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 */ 197struct 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 */ 207struct 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 */ 221struct 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 */ 236struct 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 */ 254struct 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 */ 273struct 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 */ 288struct 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 */ 313struct 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 */ 350struct 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 358int lp8788_irq_init(struct lp8788 *lp, int chip_irq); 359void lp8788_irq_exit(struct lp8788 *lp); 360int lp8788_read_byte(struct lp8788 *lp, u8 reg, u8 *data); 361int lp8788_read_multi_bytes(struct lp8788 *lp, u8 reg, u8 *data, size_t count); 362int lp8788_write_byte(struct lp8788 *lp, u8 reg, u8 data); 363int lp8788_update_bits(struct lp8788 *lp, u8 reg, u8 mask, u8 data); 364#endif