xref: /OK3568_Linux_fs/kernel/include/linux/mfd/adp5520.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Definitions and platform data for Analog Devices
4*4882a593Smuzhiyun  * ADP5520/ADP5501 MFD PMICs (Backlight, LED, GPIO and Keys)
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  * Copyright 2009 Analog Devices Inc.
7*4882a593Smuzhiyun  */
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #ifndef __LINUX_MFD_ADP5520_H
11*4882a593Smuzhiyun #define __LINUX_MFD_ADP5520_H
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #define ID_ADP5520		5520
14*4882a593Smuzhiyun #define ID_ADP5501		5501
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun /*
17*4882a593Smuzhiyun  * ADP5520/ADP5501 Register Map
18*4882a593Smuzhiyun  */
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #define ADP5520_MODE_STATUS 		0x00
21*4882a593Smuzhiyun #define ADP5520_INTERRUPT_ENABLE 	0x01
22*4882a593Smuzhiyun #define ADP5520_BL_CONTROL 		0x02
23*4882a593Smuzhiyun #define ADP5520_BL_TIME 		0x03
24*4882a593Smuzhiyun #define ADP5520_BL_FADE 		0x04
25*4882a593Smuzhiyun #define ADP5520_DAYLIGHT_MAX 		0x05
26*4882a593Smuzhiyun #define ADP5520_DAYLIGHT_DIM 		0x06
27*4882a593Smuzhiyun #define ADP5520_OFFICE_MAX 		0x07
28*4882a593Smuzhiyun #define ADP5520_OFFICE_DIM 		0x08
29*4882a593Smuzhiyun #define ADP5520_DARK_MAX 		0x09
30*4882a593Smuzhiyun #define ADP5520_DARK_DIM 		0x0A
31*4882a593Smuzhiyun #define ADP5520_BL_VALUE 		0x0B
32*4882a593Smuzhiyun #define ADP5520_ALS_CMPR_CFG 		0x0C
33*4882a593Smuzhiyun #define ADP5520_L2_TRIP 		0x0D
34*4882a593Smuzhiyun #define ADP5520_L2_HYS 			0x0E
35*4882a593Smuzhiyun #define ADP5520_L3_TRIP 		0x0F
36*4882a593Smuzhiyun #define ADP5520_L3_HYS 			0x10
37*4882a593Smuzhiyun #define ADP5520_LED_CONTROL 		0x11
38*4882a593Smuzhiyun #define ADP5520_LED_TIME 		0x12
39*4882a593Smuzhiyun #define ADP5520_LED_FADE 		0x13
40*4882a593Smuzhiyun #define ADP5520_LED1_CURRENT 		0x14
41*4882a593Smuzhiyun #define ADP5520_LED2_CURRENT 		0x15
42*4882a593Smuzhiyun #define ADP5520_LED3_CURRENT 		0x16
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun /*
45*4882a593Smuzhiyun  * ADP5520 Register Map
46*4882a593Smuzhiyun  */
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun #define ADP5520_GPIO_CFG_1 		0x17
49*4882a593Smuzhiyun #define ADP5520_GPIO_CFG_2 		0x18
50*4882a593Smuzhiyun #define ADP5520_GPIO_IN 		0x19
51*4882a593Smuzhiyun #define ADP5520_GPIO_OUT 		0x1A
52*4882a593Smuzhiyun #define ADP5520_GPIO_INT_EN 		0x1B
53*4882a593Smuzhiyun #define ADP5520_GPIO_INT_STAT 		0x1C
54*4882a593Smuzhiyun #define ADP5520_GPIO_INT_LVL 		0x1D
55*4882a593Smuzhiyun #define ADP5520_GPIO_DEBOUNCE 		0x1E
56*4882a593Smuzhiyun #define ADP5520_GPIO_PULLUP 		0x1F
57*4882a593Smuzhiyun #define ADP5520_KP_INT_STAT_1 		0x20
58*4882a593Smuzhiyun #define ADP5520_KP_INT_STAT_2 		0x21
59*4882a593Smuzhiyun #define ADP5520_KR_INT_STAT_1 		0x22
60*4882a593Smuzhiyun #define ADP5520_KR_INT_STAT_2 		0x23
61*4882a593Smuzhiyun #define ADP5520_KEY_STAT_1 		0x24
62*4882a593Smuzhiyun #define ADP5520_KEY_STAT_2 		0x25
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun /*
65*4882a593Smuzhiyun  * MODE_STATUS bits
66*4882a593Smuzhiyun  */
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun #define ADP5520_nSTNBY		(1 << 7)
69*4882a593Smuzhiyun #define ADP5520_BL_EN           (1 << 6)
70*4882a593Smuzhiyun #define ADP5520_DIM_EN          (1 << 5)
71*4882a593Smuzhiyun #define ADP5520_OVP_INT         (1 << 4)
72*4882a593Smuzhiyun #define ADP5520_CMPR_INT        (1 << 3)
73*4882a593Smuzhiyun #define ADP5520_GPI_INT         (1 << 2)
74*4882a593Smuzhiyun #define ADP5520_KR_INT          (1 << 1)
75*4882a593Smuzhiyun #define ADP5520_KP_INT          (1 << 0)
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun /*
78*4882a593Smuzhiyun  * INTERRUPT_ENABLE bits
79*4882a593Smuzhiyun  */
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun #define ADP5520_AUTO_LD_EN      (1 << 4)
82*4882a593Smuzhiyun #define ADP5520_CMPR_IEN        (1 << 3)
83*4882a593Smuzhiyun #define ADP5520_OVP_IEN         (1 << 2)
84*4882a593Smuzhiyun #define ADP5520_KR_IEN          (1 << 1)
85*4882a593Smuzhiyun #define ADP5520_KP_IEN          (1 << 0)
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun /*
88*4882a593Smuzhiyun  * BL_CONTROL bits
89*4882a593Smuzhiyun  */
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun #define ADP5520_BL_LVL          ((x) << 5)
92*4882a593Smuzhiyun #define ADP5520_BL_LAW          ((x) << 4)
93*4882a593Smuzhiyun #define ADP5520_BL_AUTO_ADJ     (1 << 3)
94*4882a593Smuzhiyun #define ADP5520_OVP_EN          (1 << 2)
95*4882a593Smuzhiyun #define ADP5520_FOVR            (1 << 1)
96*4882a593Smuzhiyun #define ADP5520_KP_BL_EN        (1 << 0)
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun /*
99*4882a593Smuzhiyun  * ALS_CMPR_CFG bits
100*4882a593Smuzhiyun  */
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun #define ADP5520_L3_OUT		(1 << 3)
103*4882a593Smuzhiyun #define ADP5520_L2_OUT		(1 << 2)
104*4882a593Smuzhiyun #define ADP5520_L3_EN		(1 << 1)
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun #define ADP5020_MAX_BRIGHTNESS	0x7F
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun #define FADE_VAL(in, out)	((0xF & (in)) | ((0xF & (out)) << 4))
109*4882a593Smuzhiyun #define BL_CTRL_VAL(law, auto)	(((1 & (auto)) << 3) | ((0x3 & (law)) << 4))
110*4882a593Smuzhiyun #define ALS_CMPR_CFG_VAL(filt, l3_en)	(((0x7 & filt) << 5) | l3_en)
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun /*
113*4882a593Smuzhiyun  * LEDs subdevice bits and masks
114*4882a593Smuzhiyun  */
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun #define ADP5520_01_MAXLEDS 3
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun #define ADP5520_FLAG_LED_MASK 		0x3
119*4882a593Smuzhiyun #define ADP5520_FLAG_OFFT_SHIFT 	8
120*4882a593Smuzhiyun #define ADP5520_FLAG_OFFT_MASK 		0x3
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun #define ADP5520_R3_MODE		(1 << 5)
123*4882a593Smuzhiyun #define ADP5520_C3_MODE		(1 << 4)
124*4882a593Smuzhiyun #define ADP5520_LED_LAW		(1 << 3)
125*4882a593Smuzhiyun #define ADP5520_LED3_EN		(1 << 2)
126*4882a593Smuzhiyun #define ADP5520_LED2_EN		(1 << 1)
127*4882a593Smuzhiyun #define ADP5520_LED1_EN		(1 << 0)
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun /*
130*4882a593Smuzhiyun  * GPIO subdevice bits and masks
131*4882a593Smuzhiyun  */
132*4882a593Smuzhiyun 
133*4882a593Smuzhiyun #define ADP5520_MAXGPIOS	8
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun #define ADP5520_GPIO_C3		(1 << 7)	/* LED2 or GPIO7 aka C3 */
136*4882a593Smuzhiyun #define ADP5520_GPIO_C2		(1 << 6)
137*4882a593Smuzhiyun #define ADP5520_GPIO_C1		(1 << 5)
138*4882a593Smuzhiyun #define ADP5520_GPIO_C0		(1 << 4)
139*4882a593Smuzhiyun #define ADP5520_GPIO_R3		(1 << 3)	/* LED3 or GPIO3 aka R3 */
140*4882a593Smuzhiyun #define ADP5520_GPIO_R2		(1 << 2)
141*4882a593Smuzhiyun #define ADP5520_GPIO_R1		(1 << 1)
142*4882a593Smuzhiyun #define ADP5520_GPIO_R0		(1 << 0)
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun struct adp5520_gpio_platform_data {
145*4882a593Smuzhiyun 	unsigned gpio_start;
146*4882a593Smuzhiyun 	u8 gpio_en_mask;
147*4882a593Smuzhiyun 	u8 gpio_pullup_mask;
148*4882a593Smuzhiyun };
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun /*
151*4882a593Smuzhiyun  * Keypad subdevice bits and masks
152*4882a593Smuzhiyun  */
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun #define ADP5520_MAXKEYS	16
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun #define ADP5520_COL_C3 		(1 << 7)	/* LED2 or GPIO7 aka C3 */
157*4882a593Smuzhiyun #define ADP5520_COL_C2		(1 << 6)
158*4882a593Smuzhiyun #define ADP5520_COL_C1		(1 << 5)
159*4882a593Smuzhiyun #define ADP5520_COL_C0		(1 << 4)
160*4882a593Smuzhiyun #define ADP5520_ROW_R3		(1 << 3)	/* LED3 or GPIO3 aka R3 */
161*4882a593Smuzhiyun #define ADP5520_ROW_R2		(1 << 2)
162*4882a593Smuzhiyun #define ADP5520_ROW_R1		(1 << 1)
163*4882a593Smuzhiyun #define ADP5520_ROW_R0		(1 << 0)
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun #define ADP5520_KEY(row, col) (col + row * 4)
166*4882a593Smuzhiyun #define ADP5520_KEYMAPSIZE	ADP5520_MAXKEYS
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun struct adp5520_keys_platform_data {
169*4882a593Smuzhiyun 	int rows_en_mask;		/* Number of rows */
170*4882a593Smuzhiyun 	int cols_en_mask;		/* Number of columns */
171*4882a593Smuzhiyun 	const unsigned short *keymap;	/* Pointer to keymap */
172*4882a593Smuzhiyun 	unsigned short keymapsize;	/* Keymap size */
173*4882a593Smuzhiyun 	unsigned repeat:1;		/* Enable key repeat */
174*4882a593Smuzhiyun };
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun /*
178*4882a593Smuzhiyun  * LEDs subdevice platform data
179*4882a593Smuzhiyun  */
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun #define FLAG_ID_ADP5520_LED1_ADP5501_LED0 	1	/* ADP5520 PIN ILED */
182*4882a593Smuzhiyun #define FLAG_ID_ADP5520_LED2_ADP5501_LED1 	2	/* ADP5520 PIN C3 */
183*4882a593Smuzhiyun #define FLAG_ID_ADP5520_LED3_ADP5501_LED2 	3	/* ADP5520 PIN R3 */
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun #define ADP5520_LED_DIS_BLINK	(0 << ADP5520_FLAG_OFFT_SHIFT)
186*4882a593Smuzhiyun #define ADP5520_LED_OFFT_600ms	(1 << ADP5520_FLAG_OFFT_SHIFT)
187*4882a593Smuzhiyun #define ADP5520_LED_OFFT_800ms	(2 << ADP5520_FLAG_OFFT_SHIFT)
188*4882a593Smuzhiyun #define ADP5520_LED_OFFT_1200ms	(3 << ADP5520_FLAG_OFFT_SHIFT)
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun #define ADP5520_LED_ONT_200ms	0
191*4882a593Smuzhiyun #define ADP5520_LED_ONT_600ms	1
192*4882a593Smuzhiyun #define ADP5520_LED_ONT_800ms	2
193*4882a593Smuzhiyun #define ADP5520_LED_ONT_1200ms	3
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun struct adp5520_leds_platform_data {
196*4882a593Smuzhiyun 	int num_leds;
197*4882a593Smuzhiyun 	struct led_info	*leds;
198*4882a593Smuzhiyun 	u8 fade_in;		/* Backlight Fade-In Timer */
199*4882a593Smuzhiyun 	u8 fade_out;		/* Backlight Fade-Out Timer */
200*4882a593Smuzhiyun 	u8 led_on_time;
201*4882a593Smuzhiyun };
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun /*
204*4882a593Smuzhiyun  * Backlight subdevice platform data
205*4882a593Smuzhiyun  */
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun #define ADP5520_FADE_T_DIS	0	/* Fade Timer Disabled */
208*4882a593Smuzhiyun #define ADP5520_FADE_T_300ms	1	/* 0.3 Sec */
209*4882a593Smuzhiyun #define ADP5520_FADE_T_600ms	2
210*4882a593Smuzhiyun #define ADP5520_FADE_T_900ms	3
211*4882a593Smuzhiyun #define ADP5520_FADE_T_1200ms	4
212*4882a593Smuzhiyun #define ADP5520_FADE_T_1500ms	5
213*4882a593Smuzhiyun #define ADP5520_FADE_T_1800ms	6
214*4882a593Smuzhiyun #define ADP5520_FADE_T_2100ms	7
215*4882a593Smuzhiyun #define ADP5520_FADE_T_2400ms	8
216*4882a593Smuzhiyun #define ADP5520_FADE_T_2700ms	9
217*4882a593Smuzhiyun #define ADP5520_FADE_T_3000ms	10
218*4882a593Smuzhiyun #define ADP5520_FADE_T_3500ms	11
219*4882a593Smuzhiyun #define ADP5520_FADE_T_4000ms	12
220*4882a593Smuzhiyun #define ADP5520_FADE_T_4500ms	13
221*4882a593Smuzhiyun #define ADP5520_FADE_T_5000ms	14
222*4882a593Smuzhiyun #define ADP5520_FADE_T_5500ms	15	/* 5.5 Sec */
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun #define ADP5520_BL_LAW_LINEAR 	0
225*4882a593Smuzhiyun #define ADP5520_BL_LAW_SQUARE 	1
226*4882a593Smuzhiyun #define ADP5520_BL_LAW_CUBIC1 	2
227*4882a593Smuzhiyun #define ADP5520_BL_LAW_CUBIC2 	3
228*4882a593Smuzhiyun 
229*4882a593Smuzhiyun #define ADP5520_BL_AMBL_FILT_80ms 	0	/* Light sensor filter time */
230*4882a593Smuzhiyun #define ADP5520_BL_AMBL_FILT_160ms 	1
231*4882a593Smuzhiyun #define ADP5520_BL_AMBL_FILT_320ms 	2
232*4882a593Smuzhiyun #define ADP5520_BL_AMBL_FILT_640ms 	3
233*4882a593Smuzhiyun #define ADP5520_BL_AMBL_FILT_1280ms 	4
234*4882a593Smuzhiyun #define ADP5520_BL_AMBL_FILT_2560ms 	5
235*4882a593Smuzhiyun #define ADP5520_BL_AMBL_FILT_5120ms 	6
236*4882a593Smuzhiyun #define ADP5520_BL_AMBL_FILT_10240ms 	7	/* 10.24 sec */
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun 	/*
239*4882a593Smuzhiyun 	 * Blacklight current 0..30mA
240*4882a593Smuzhiyun 	 */
241*4882a593Smuzhiyun #define ADP5520_BL_CUR_mA(I)		((I * 127) / 30)
242*4882a593Smuzhiyun 
243*4882a593Smuzhiyun 	/*
244*4882a593Smuzhiyun 	 * L2 comparator current 0..1000uA
245*4882a593Smuzhiyun 	 */
246*4882a593Smuzhiyun #define ADP5520_L2_COMP_CURR_uA(I)	((I * 255) / 1000)
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun 	/*
249*4882a593Smuzhiyun 	 * L3 comparator current 0..127uA
250*4882a593Smuzhiyun 	 */
251*4882a593Smuzhiyun #define ADP5520_L3_COMP_CURR_uA(I)	((I * 255) / 127)
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun struct adp5520_backlight_platform_data {
254*4882a593Smuzhiyun 	u8 fade_in;		/* Backlight Fade-In Timer */
255*4882a593Smuzhiyun 	u8 fade_out;		/* Backlight Fade-Out Timer */
256*4882a593Smuzhiyun 	u8 fade_led_law;	/* fade-on/fade-off transfer characteristic */
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun 	u8 en_ambl_sens;	/* 1 = enable ambient light sensor */
259*4882a593Smuzhiyun 	u8 abml_filt;		/* Light sensor filter time */
260*4882a593Smuzhiyun 	u8 l1_daylight_max;	/* use BL_CUR_mA(I) 0 <= I <= 30 mA */
261*4882a593Smuzhiyun 	u8 l1_daylight_dim;	/* typ = 0, use BL_CUR_mA(I) 0 <= I <= 30 mA */
262*4882a593Smuzhiyun 	u8 l2_office_max;	/* use BL_CUR_mA(I) 0 <= I <= 30 mA */
263*4882a593Smuzhiyun 	u8 l2_office_dim;	/* typ = 0, use BL_CUR_mA(I) 0 <= I <= 30 mA */
264*4882a593Smuzhiyun 	u8 l3_dark_max;		/* use BL_CUR_mA(I) 0 <= I <= 30 mA */
265*4882a593Smuzhiyun 	u8 l3_dark_dim;		/* typ = 0, use BL_CUR_mA(I) 0 <= I <= 30 mA */
266*4882a593Smuzhiyun 	u8 l2_trip;		/* use L2_COMP_CURR_uA(I) 0 <= I <= 1000 uA */
267*4882a593Smuzhiyun 	u8 l2_hyst;		/* use L2_COMP_CURR_uA(I) 0 <= I <= 1000 uA */
268*4882a593Smuzhiyun 	u8 l3_trip;		/* use L3_COMP_CURR_uA(I) 0 <= I <= 127 uA */
269*4882a593Smuzhiyun 	u8 l3_hyst;		/* use L3_COMP_CURR_uA(I) 0 <= I <= 127 uA */
270*4882a593Smuzhiyun };
271*4882a593Smuzhiyun 
272*4882a593Smuzhiyun /*
273*4882a593Smuzhiyun  * MFD chip platform data
274*4882a593Smuzhiyun  */
275*4882a593Smuzhiyun 
276*4882a593Smuzhiyun struct adp5520_platform_data {
277*4882a593Smuzhiyun 	struct adp5520_keys_platform_data *keys;
278*4882a593Smuzhiyun 	struct adp5520_gpio_platform_data *gpio;
279*4882a593Smuzhiyun 	struct adp5520_leds_platform_data *leds;
280*4882a593Smuzhiyun 	struct adp5520_backlight_platform_data *backlight;
281*4882a593Smuzhiyun };
282*4882a593Smuzhiyun 
283*4882a593Smuzhiyun /*
284*4882a593Smuzhiyun  * MFD chip functions
285*4882a593Smuzhiyun  */
286*4882a593Smuzhiyun 
287*4882a593Smuzhiyun extern int adp5520_read(struct device *dev, int reg, uint8_t *val);
288*4882a593Smuzhiyun extern int adp5520_write(struct device *dev, int reg, u8 val);
289*4882a593Smuzhiyun extern int adp5520_clr_bits(struct device *dev, int reg, uint8_t bit_mask);
290*4882a593Smuzhiyun extern int adp5520_set_bits(struct device *dev, int reg, uint8_t bit_mask);
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun extern int adp5520_register_notifier(struct device *dev,
293*4882a593Smuzhiyun 		 struct notifier_block *nb, unsigned int events);
294*4882a593Smuzhiyun 
295*4882a593Smuzhiyun extern int adp5520_unregister_notifier(struct device *dev,
296*4882a593Smuzhiyun 		struct notifier_block *nb, unsigned int events);
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun #endif /* __LINUX_MFD_ADP5520_H */
299