Merge tag 'ntb-5.15' of git://github.com/jonmason/ntb
[linux-2.6-microblaze.git] / include / linux / mfd / lp8788.h
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * TI LP8788 MFD Device
4  *
5  * Copyright 2012 Texas Instruments
6  *
7  * Author: Milo(Woogyom) Kim <milo.kim@ti.com>
8  */
9
10 #ifndef __MFD_LP8788_H__
11 #define __MFD_LP8788_H__
12
13 #include <linux/gpio.h>
14 #include <linux/irqdomain.h>
15 #include <linux/pwm.h>
16 #include <linux/regmap.h>
17
18 #define LP8788_DEV_BUCK         "lp8788-buck"
19 #define LP8788_DEV_DLDO         "lp8788-dldo"
20 #define LP8788_DEV_ALDO         "lp8788-aldo"
21 #define LP8788_DEV_CHARGER      "lp8788-charger"
22 #define LP8788_DEV_RTC          "lp8788-rtc"
23 #define LP8788_DEV_BACKLIGHT    "lp8788-backlight"
24 #define LP8788_DEV_VIBRATOR     "lp8788-vibrator"
25 #define LP8788_DEV_KEYLED       "lp8788-keyled"
26 #define LP8788_DEV_ADC          "lp8788-adc"
27
28 #define LP8788_NUM_BUCKS        4
29 #define LP8788_NUM_DLDOS        12
30 #define LP8788_NUM_ALDOS        10
31 #define LP8788_NUM_BUCK2_DVS    2
32
33 #define LP8788_CHG_IRQ          "CHG_IRQ"
34 #define LP8788_PRSW_IRQ         "PRSW_IRQ"
35 #define LP8788_BATT_IRQ         "BATT_IRQ"
36 #define LP8788_ALM_IRQ          "ALARM_IRQ"
37
38 enum lp8788_int_id {
39         /* interrup register 1 : Addr 00h */
40         LP8788_INT_TSDL,
41         LP8788_INT_TSDH,
42         LP8788_INT_UVLO,
43         LP8788_INT_FLAGMON,
44         LP8788_INT_PWRON_TIME,
45         LP8788_INT_PWRON,
46         LP8788_INT_COMP1,
47         LP8788_INT_COMP2,
48
49         /* interrupt register 2 : Addr 01h */
50         LP8788_INT_CHG_INPUT_STATE,
51         LP8788_INT_CHG_STATE,
52         LP8788_INT_EOC,
53         LP8788_INT_CHG_RESTART,
54         LP8788_INT_RESTART_TIMEOUT,
55         LP8788_INT_FULLCHG_TIMEOUT,
56         LP8788_INT_PRECHG_TIMEOUT,
57
58         /* interrupt register 3 : Addr 02h */
59         LP8788_INT_RTC_ALARM1 = 17,
60         LP8788_INT_RTC_ALARM2,
61         LP8788_INT_ENTER_SYS_SUPPORT,
62         LP8788_INT_EXIT_SYS_SUPPORT,
63         LP8788_INT_BATT_LOW,
64         LP8788_INT_NO_BATT,
65
66         LP8788_INT_MAX = 24,
67 };
68
69 enum lp8788_dvs_sel {
70         DVS_SEL_V0,
71         DVS_SEL_V1,
72         DVS_SEL_V2,
73         DVS_SEL_V3,
74 };
75
76 enum lp8788_ext_ldo_en_id {
77         EN_ALDO1,
78         EN_ALDO234,
79         EN_ALDO5,
80         EN_ALDO7,
81         EN_DLDO7,
82         EN_DLDO911,
83         EN_LDOS_MAX,
84 };
85
86 enum lp8788_charger_event {
87         NO_CHARGER,
88         CHARGER_DETECTED,
89 };
90
91 enum lp8788_bl_ctrl_mode {
92         LP8788_BL_REGISTER_ONLY,
93         LP8788_BL_COMB_PWM_BASED,       /* PWM + I2C, changed by PWM input */
94         LP8788_BL_COMB_REGISTER_BASED,  /* PWM + I2C, changed by I2C */
95 };
96
97 enum lp8788_bl_dim_mode {
98         LP8788_DIM_EXPONENTIAL,
99         LP8788_DIM_LINEAR,
100 };
101
102 enum lp8788_bl_full_scale_current {
103         LP8788_FULLSCALE_5000uA,
104         LP8788_FULLSCALE_8500uA,
105         LP8788_FULLSCALE_1200uA,
106         LP8788_FULLSCALE_1550uA,
107         LP8788_FULLSCALE_1900uA,
108         LP8788_FULLSCALE_2250uA,
109         LP8788_FULLSCALE_2600uA,
110         LP8788_FULLSCALE_2950uA,
111 };
112
113 enum lp8788_bl_ramp_step {
114         LP8788_RAMP_8us,
115         LP8788_RAMP_1024us,
116         LP8788_RAMP_2048us,
117         LP8788_RAMP_4096us,
118         LP8788_RAMP_8192us,
119         LP8788_RAMP_16384us,
120         LP8788_RAMP_32768us,
121         LP8788_RAMP_65538us,
122 };
123
124 enum lp8788_isink_scale {
125         LP8788_ISINK_SCALE_100mA,
126         LP8788_ISINK_SCALE_120mA,
127 };
128
129 enum lp8788_isink_number {
130         LP8788_ISINK_1,
131         LP8788_ISINK_2,
132         LP8788_ISINK_3,
133 };
134
135 enum lp8788_alarm_sel {
136         LP8788_ALARM_1,
137         LP8788_ALARM_2,
138         LP8788_ALARM_MAX,
139 };
140
141 enum lp8788_adc_id {
142         LPADC_VBATT_5P5,
143         LPADC_VIN_CHG,
144         LPADC_IBATT,
145         LPADC_IC_TEMP,
146         LPADC_VBATT_6P0,
147         LPADC_VBATT_5P0,
148         LPADC_ADC1,
149         LPADC_ADC2,
150         LPADC_VDD,
151         LPADC_VCOIN,
152         LPADC_VDD_LDO,
153         LPADC_ADC3,
154         LPADC_ADC4,
155         LPADC_MAX,
156 };
157
158 struct lp8788;
159
160 /*
161  * lp8788_buck1_dvs
162  * @gpio         : gpio pin number for dvs control
163  * @vsel         : dvs selector for buck v1 register
164  */
165 struct lp8788_buck1_dvs {
166         int gpio;
167         enum lp8788_dvs_sel vsel;
168 };
169
170 /*
171  * lp8788_buck2_dvs
172  * @gpio         : two gpio pin numbers are used for dvs
173  * @vsel         : dvs selector for buck v2 register
174  */
175 struct lp8788_buck2_dvs {
176         int gpio[LP8788_NUM_BUCK2_DVS];
177         enum lp8788_dvs_sel vsel;
178 };
179
180 /*
181  * struct lp8788_chg_param
182  * @addr         : charging control register address (range : 0x11 ~ 0x1C)
183  * @val          : charging parameter value
184  */
185 struct lp8788_chg_param {
186         u8 addr;
187         u8 val;
188 };
189
190 /*
191  * struct lp8788_charger_platform_data
192  * @adc_vbatt         : adc channel name for battery voltage
193  * @adc_batt_temp     : adc channel name for battery temperature
194  * @max_vbatt_mv      : used for calculating battery capacity
195  * @chg_params        : initial charging parameters
196  * @num_chg_params    : numbers of charging parameters
197  * @charger_event     : the charger event can be reported to the platform side
198  */
199 struct lp8788_charger_platform_data {
200         const char *adc_vbatt;
201         const char *adc_batt_temp;
202         unsigned int max_vbatt_mv;
203         struct lp8788_chg_param *chg_params;
204         int num_chg_params;
205         void (*charger_event) (struct lp8788 *lp,
206                                 enum lp8788_charger_event event);
207 };
208
209 /*
210  * struct lp8788_backlight_platform_data
211  * @name                  : backlight driver name. (default: "lcd-backlight")
212  * @initial_brightness    : initial value of backlight brightness
213  * @bl_mode               : brightness control by pwm or lp8788 register
214  * @dim_mode              : dimming mode selection
215  * @full_scale            : full scale current setting
216  * @rise_time             : brightness ramp up step time
217  * @fall_time             : brightness ramp down step time
218  * @pwm_pol               : pwm polarity setting when bl_mode is pwm based
219  * @period_ns             : platform specific pwm period value. unit is nano.
220                             Only valid when bl_mode is LP8788_BL_COMB_PWM_BASED
221  */
222 struct lp8788_backlight_platform_data {
223         char *name;
224         int initial_brightness;
225         enum lp8788_bl_ctrl_mode bl_mode;
226         enum lp8788_bl_dim_mode dim_mode;
227         enum lp8788_bl_full_scale_current full_scale;
228         enum lp8788_bl_ramp_step rise_time;
229         enum lp8788_bl_ramp_step fall_time;
230         enum pwm_polarity pwm_pol;
231         unsigned int period_ns;
232 };
233
234 /*
235  * struct lp8788_led_platform_data
236  * @name         : led driver name. (default: "keyboard-backlight")
237  * @scale        : current scale
238  * @num          : current sink number
239  * @iout_code    : current output value (Addr 9Ah ~ 9Bh)
240  */
241 struct lp8788_led_platform_data {
242         char *name;
243         enum lp8788_isink_scale scale;
244         enum lp8788_isink_number num;
245         int iout_code;
246 };
247
248 /*
249  * struct lp8788_vib_platform_data
250  * @name         : vibrator driver name
251  * @scale        : current scale
252  * @num          : current sink number
253  * @iout_code    : current output value (Addr 9Ah ~ 9Bh)
254  * @pwm_code     : PWM code value (Addr 9Ch ~ 9Eh)
255  */
256 struct lp8788_vib_platform_data {
257         char *name;
258         enum lp8788_isink_scale scale;
259         enum lp8788_isink_number num;
260         int iout_code;
261         int pwm_code;
262 };
263
264 /*
265  * struct lp8788_platform_data
266  * @init_func    : used for initializing registers
267  *                 before mfd driver is registered
268  * @buck_data    : regulator initial data for buck
269  * @dldo_data    : regulator initial data for digital ldo
270  * @aldo_data    : regulator initial data for analog ldo
271  * @buck1_dvs    : gpio configurations for buck1 dvs
272  * @buck2_dvs    : gpio configurations for buck2 dvs
273  * @chg_pdata    : platform data for charger driver
274  * @alarm_sel    : rtc alarm selection (1 or 2)
275  * @bl_pdata     : configurable data for backlight driver
276  * @led_pdata    : configurable data for led driver
277  * @vib_pdata    : configurable data for vibrator driver
278  * @adc_pdata    : iio map data for adc driver
279  */
280 struct lp8788_platform_data {
281         /* general system information */
282         int (*init_func) (struct lp8788 *lp);
283
284         /* regulators */
285         struct regulator_init_data *buck_data[LP8788_NUM_BUCKS];
286         struct regulator_init_data *dldo_data[LP8788_NUM_DLDOS];
287         struct regulator_init_data *aldo_data[LP8788_NUM_ALDOS];
288         struct lp8788_buck1_dvs *buck1_dvs;
289         struct lp8788_buck2_dvs *buck2_dvs;
290
291         /* charger */
292         struct lp8788_charger_platform_data *chg_pdata;
293
294         /* rtc alarm */
295         enum lp8788_alarm_sel alarm_sel;
296
297         /* backlight */
298         struct lp8788_backlight_platform_data *bl_pdata;
299
300         /* current sinks */
301         struct lp8788_led_platform_data *led_pdata;
302         struct lp8788_vib_platform_data *vib_pdata;
303
304         /* adc iio map data */
305         struct iio_map *adc_pdata;
306 };
307
308 /*
309  * struct lp8788
310  * @dev          : parent device pointer
311  * @regmap       : used for i2c communcation on accessing registers
312  * @irqdm        : interrupt domain for handling nested interrupt
313  * @irq          : pin number of IRQ_N
314  * @pdata        : lp8788 platform specific data
315  */
316 struct lp8788 {
317         struct device *dev;
318         struct regmap *regmap;
319         struct irq_domain *irqdm;
320         int irq;
321         struct lp8788_platform_data *pdata;
322 };
323
324 int lp8788_irq_init(struct lp8788 *lp, int chip_irq);
325 void lp8788_irq_exit(struct lp8788 *lp);
326 int lp8788_read_byte(struct lp8788 *lp, u8 reg, u8 *data);
327 int lp8788_read_multi_bytes(struct lp8788 *lp, u8 reg, u8 *data, size_t count);
328 int lp8788_write_byte(struct lp8788 *lp, u8 reg, u8 data);
329 int lp8788_update_bits(struct lp8788 *lp, u8 reg, u8 mask, u8 data);
330 #endif