xref: /linux-6.15/include/linux/mfd/lp8788.h (revision a671de08)
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