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