xref: /OK3568_Linux_fs/kernel/include/linux/mfd/lp8788.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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