1 /* SPDX-License-Identifier: GPL-2.0-only */
5 * Copyright 2012 Texas Instruments
10 #ifndef __MFD_LP8788_H__
11 #define __MFD_LP8788_H__
13 #include <linux/irqdomain.h>
14 #include <linux/regmap.h>
16 #define LP8788_DEV_BUCK "lp8788-buck"
17 #define LP8788_DEV_DLDO "lp8788-dldo"
18 #define LP8788_DEV_ALDO "lp8788-aldo"
19 #define LP8788_DEV_CHARGER "lp8788-charger"
20 #define LP8788_DEV_RTC "lp8788-rtc"
21 #define LP8788_DEV_BACKLIGHT "lp8788-backlight"
22 #define LP8788_DEV_VIBRATOR "lp8788-vibrator"
23 #define LP8788_DEV_KEYLED "lp8788-keyled"
24 #define LP8788_DEV_ADC "lp8788-adc"
26 #define LP8788_NUM_BUCKS 4
27 #define LP8788_NUM_DLDOS 12
28 #define LP8788_NUM_ALDOS 10
29 #define LP8788_NUM_BUCK2_DVS 2
31 #define LP8788_CHG_IRQ "CHG_IRQ"
32 #define LP8788_PRSW_IRQ "PRSW_IRQ"
33 #define LP8788_BATT_IRQ "BATT_IRQ"
34 #define LP8788_ALM_IRQ "ALARM_IRQ"
37 /* interrup register 1 : Addr 00h */
42 LP8788_INT_PWRON_TIME,
47 /* interrupt register 2 : Addr 01h */
48 LP8788_INT_CHG_INPUT_STATE,
51 LP8788_INT_CHG_RESTART,
52 LP8788_INT_RESTART_TIMEOUT,
53 LP8788_INT_FULLCHG_TIMEOUT,
54 LP8788_INT_PRECHG_TIMEOUT,
56 /* interrupt register 3 : Addr 02h */
57 LP8788_INT_RTC_ALARM1 = 17,
58 LP8788_INT_RTC_ALARM2,
59 LP8788_INT_ENTER_SYS_SUPPORT,
60 LP8788_INT_EXIT_SYS_SUPPORT,
74 enum lp8788_ext_ldo_en_id {
84 enum lp8788_charger_event {
89 enum lp8788_bl_dim_mode {
90 LP8788_DIM_EXPONENTIAL,
94 enum lp8788_bl_full_scale_current {
95 LP8788_FULLSCALE_5000uA,
96 LP8788_FULLSCALE_8500uA,
97 LP8788_FULLSCALE_1200uA,
98 LP8788_FULLSCALE_1550uA,
99 LP8788_FULLSCALE_1900uA,
100 LP8788_FULLSCALE_2250uA,
101 LP8788_FULLSCALE_2600uA,
102 LP8788_FULLSCALE_2950uA,
105 enum lp8788_bl_ramp_step {
116 enum lp8788_isink_scale {
117 LP8788_ISINK_SCALE_100mA,
118 LP8788_ISINK_SCALE_120mA,
121 enum lp8788_isink_number {
127 enum lp8788_alarm_sel {
154 * @vsel : dvs selector for buck v1 register
156 struct lp8788_buck1_dvs {
157 enum lp8788_dvs_sel vsel;
162 * @vsel : dvs selector for buck v2 register
164 struct lp8788_buck2_dvs {
165 enum lp8788_dvs_sel vsel;
169 * struct lp8788_chg_param
170 * @addr : charging control register address (range : 0x11 ~ 0x1C)
171 * @val : charging parameter value
173 struct lp8788_chg_param {
179 * struct lp8788_charger_platform_data
180 * @adc_vbatt : adc channel name for battery voltage
181 * @adc_batt_temp : adc channel name for battery temperature
182 * @max_vbatt_mv : used for calculating battery capacity
183 * @chg_params : initial charging parameters
184 * @num_chg_params : numbers of charging parameters
185 * @charger_event : the charger event can be reported to the platform side
187 struct lp8788_charger_platform_data {
188 const char *adc_vbatt;
189 const char *adc_batt_temp;
190 unsigned int max_vbatt_mv;
191 struct lp8788_chg_param *chg_params;
193 void (*charger_event) (struct lp8788 *lp,
194 enum lp8788_charger_event event);
198 * struct lp8788_led_platform_data
199 * @name : led driver name. (default: "keyboard-backlight")
200 * @scale : current scale
201 * @num : current sink number
202 * @iout_code : current output value (Addr 9Ah ~ 9Bh)
204 struct lp8788_led_platform_data {
206 enum lp8788_isink_scale scale;
207 enum lp8788_isink_number num;
212 * struct lp8788_vib_platform_data
213 * @name : vibrator driver name
214 * @scale : current scale
215 * @num : current sink number
216 * @iout_code : current output value (Addr 9Ah ~ 9Bh)
217 * @pwm_code : PWM code value (Addr 9Ch ~ 9Eh)
219 struct lp8788_vib_platform_data {
221 enum lp8788_isink_scale scale;
222 enum lp8788_isink_number num;
228 * struct lp8788_platform_data
229 * @init_func : used for initializing registers
230 * before mfd driver is registered
231 * @buck_data : regulator initial data for buck
232 * @dldo_data : regulator initial data for digital ldo
233 * @aldo_data : regulator initial data for analog ldo
234 * @buck1_dvs : configurations for buck1 dvs
235 * @buck2_dvs : configurations for buck2 dvs
236 * @chg_pdata : platform data for charger driver
237 * @alarm_sel : rtc alarm selection (1 or 2)
238 * @led_pdata : configurable data for led driver
239 * @vib_pdata : configurable data for vibrator driver
240 * @adc_pdata : iio map data for adc driver
242 struct lp8788_platform_data {
243 /* general system information */
244 int (*init_func) (struct lp8788 *lp);
247 struct regulator_init_data *buck_data[LP8788_NUM_BUCKS];
248 struct regulator_init_data *dldo_data[LP8788_NUM_DLDOS];
249 struct regulator_init_data *aldo_data[LP8788_NUM_ALDOS];
250 struct lp8788_buck1_dvs *buck1_dvs;
251 struct lp8788_buck2_dvs *buck2_dvs;
254 struct lp8788_charger_platform_data *chg_pdata;
257 enum lp8788_alarm_sel alarm_sel;
260 struct lp8788_led_platform_data *led_pdata;
261 struct lp8788_vib_platform_data *vib_pdata;
263 /* adc iio map data */
264 struct iio_map *adc_pdata;
269 * @dev : parent device pointer
270 * @regmap : used for i2c communcation on accessing registers
271 * @irqdm : interrupt domain for handling nested interrupt
272 * @irq : pin number of IRQ_N
273 * @pdata : lp8788 platform specific data
277 struct regmap *regmap;
278 struct irq_domain *irqdm;
280 struct lp8788_platform_data *pdata;
283 int lp8788_irq_init(struct lp8788 *lp, int chip_irq);
284 void lp8788_irq_exit(struct lp8788 *lp);
285 int lp8788_read_byte(struct lp8788 *lp, u8 reg, u8 *data);
286 int lp8788_read_multi_bytes(struct lp8788 *lp, u8 reg, u8 *data, size_t count);
287 int lp8788_write_byte(struct lp8788 *lp, u8 reg, u8 data);
288 int lp8788_update_bits(struct lp8788 *lp, u8 reg, u8 mask, u8 data);