Blame view

drivers/regulator/lp8788-ldo.c 16.2 KB
d2912cb15   Thomas Gleixner   treewide: Replace...
1
  // SPDX-License-Identifier: GPL-2.0-only
ade7515fe   Kim, Milo   regulator: add ne...
2
3
4
5
6
7
  /*
   * TI LP8788 MFD - ldo regulator driver
   *
   * Copyright 2012 Texas Instruments
   *
   * Author: Milo(Woogyom) Kim <milo.kim@ti.com>
ade7515fe   Kim, Milo   regulator: add ne...
8
9
10
11
12
13
14
   */
  
  #include <linux/module.h>
  #include <linux/slab.h>
  #include <linux/err.h>
  #include <linux/platform_device.h>
  #include <linux/regulator/driver.h>
2468f0d51   Linus Walleij   regulator: lp8788...
15
  #include <linux/gpio/consumer.h>
ade7515fe   Kim, Milo   regulator: add ne...
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
  #include <linux/mfd/lp8788.h>
  
  /* register address */
  #define LP8788_EN_LDO_A			0x0D	/* DLDO 1 ~ 8 */
  #define LP8788_EN_LDO_B			0x0E	/* DLDO 9 ~ 12, ALDO 1 ~ 4 */
  #define LP8788_EN_LDO_C			0x0F	/* ALDO 5 ~ 10 */
  #define LP8788_EN_SEL			0x10
  #define LP8788_DLDO1_VOUT		0x2E
  #define LP8788_DLDO2_VOUT		0x2F
  #define LP8788_DLDO3_VOUT		0x30
  #define LP8788_DLDO4_VOUT		0x31
  #define LP8788_DLDO5_VOUT		0x32
  #define LP8788_DLDO6_VOUT		0x33
  #define LP8788_DLDO7_VOUT		0x34
  #define LP8788_DLDO8_VOUT		0x35
  #define LP8788_DLDO9_VOUT		0x36
  #define LP8788_DLDO10_VOUT		0x37
  #define LP8788_DLDO11_VOUT		0x38
  #define LP8788_DLDO12_VOUT		0x39
  #define LP8788_ALDO1_VOUT		0x3A
  #define LP8788_ALDO2_VOUT		0x3B
  #define LP8788_ALDO3_VOUT		0x3C
  #define LP8788_ALDO4_VOUT		0x3D
  #define LP8788_ALDO5_VOUT		0x3E
  #define LP8788_ALDO6_VOUT		0x3F
  #define LP8788_ALDO7_VOUT		0x40
  #define LP8788_ALDO8_VOUT		0x41
  #define LP8788_ALDO9_VOUT		0x42
  #define LP8788_ALDO10_VOUT		0x43
  #define LP8788_DLDO1_TIMESTEP		0x44
  
  /* mask/shift bits */
  #define LP8788_EN_DLDO1_M		BIT(0)	/* Addr 0Dh ~ 0Fh */
  #define LP8788_EN_DLDO2_M		BIT(1)
  #define LP8788_EN_DLDO3_M		BIT(2)
  #define LP8788_EN_DLDO4_M		BIT(3)
  #define LP8788_EN_DLDO5_M		BIT(4)
  #define LP8788_EN_DLDO6_M		BIT(5)
  #define LP8788_EN_DLDO7_M		BIT(6)
  #define LP8788_EN_DLDO8_M		BIT(7)
  #define LP8788_EN_DLDO9_M		BIT(0)
  #define LP8788_EN_DLDO10_M		BIT(1)
  #define LP8788_EN_DLDO11_M		BIT(2)
  #define LP8788_EN_DLDO12_M		BIT(3)
  #define LP8788_EN_ALDO1_M		BIT(4)
  #define LP8788_EN_ALDO2_M		BIT(5)
  #define LP8788_EN_ALDO3_M		BIT(6)
  #define LP8788_EN_ALDO4_M		BIT(7)
  #define LP8788_EN_ALDO5_M		BIT(0)
  #define LP8788_EN_ALDO6_M		BIT(1)
  #define LP8788_EN_ALDO7_M		BIT(2)
  #define LP8788_EN_ALDO8_M		BIT(3)
  #define LP8788_EN_ALDO9_M		BIT(4)
  #define LP8788_EN_ALDO10_M		BIT(5)
  #define LP8788_EN_SEL_DLDO911_M		BIT(0)	/* Addr 10h */
  #define LP8788_EN_SEL_DLDO7_M		BIT(1)
  #define LP8788_EN_SEL_ALDO7_M		BIT(2)
  #define LP8788_EN_SEL_ALDO5_M		BIT(3)
  #define LP8788_EN_SEL_ALDO234_M		BIT(4)
  #define LP8788_EN_SEL_ALDO1_M		BIT(5)
  #define LP8788_VOUT_5BIT_M		0x1F	/* Addr 2Eh ~ 43h */
  #define LP8788_VOUT_4BIT_M		0x0F
  #define LP8788_VOUT_3BIT_M		0x07
  #define LP8788_VOUT_1BIT_M		0x01
  #define LP8788_STARTUP_TIME_M		0xF8	/* Addr 44h ~ 59h */
  #define LP8788_STARTUP_TIME_S		3
  
  #define ENABLE_TIME_USEC		32
ade7515fe   Kim, Milo   regulator: add ne...
84

ade7515fe   Kim, Milo   regulator: add ne...
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
  enum lp8788_ldo_id {
  	DLDO1,
  	DLDO2,
  	DLDO3,
  	DLDO4,
  	DLDO5,
  	DLDO6,
  	DLDO7,
  	DLDO8,
  	DLDO9,
  	DLDO10,
  	DLDO11,
  	DLDO12,
  	ALDO1,
  	ALDO2,
  	ALDO3,
  	ALDO4,
  	ALDO5,
  	ALDO6,
  	ALDO7,
  	ALDO8,
  	ALDO9,
  	ALDO10,
  };
  
  struct lp8788_ldo {
  	struct lp8788 *lp;
  	struct regulator_desc *desc;
  	struct regulator_dev *regulator;
2468f0d51   Linus Walleij   regulator: lp8788...
114
  	struct gpio_desc *ena_gpiod;
ade7515fe   Kim, Milo   regulator: add ne...
115
116
117
  };
  
  /* DLDO 1, 2, 3, 9 voltage table */
4e92920b4   Mark Brown   regulator: lp8788...
118
  static const int lp8788_dldo1239_vtbl[] = {
ade7515fe   Kim, Milo   regulator: add ne...
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
  	1800000, 1900000, 2000000, 2100000, 2200000, 2300000, 2400000, 2500000,
  	2600000, 2700000, 2800000, 2900000, 3000000, 2850000, 2850000, 2850000,
  	2850000, 2850000, 2850000, 2850000, 2850000, 2850000, 2850000, 2850000,
  	2850000, 2850000, 2850000, 2850000, 2850000, 2850000, 2850000, 2850000,
  };
  
  /* DLDO 4 voltage table */
  static const int lp8788_dldo4_vtbl[] = { 1800000, 3000000 };
  
  /* DLDO 5, 7, 8 and ALDO 6 voltage table */
  static const int lp8788_dldo578_aldo6_vtbl[] = {
  	1800000, 1900000, 2000000, 2100000, 2200000, 2300000, 2400000, 2500000,
  	2600000, 2700000, 2800000, 2900000, 3000000, 3000000, 3000000, 3000000,
  };
  
  /* DLDO 6 voltage table */
  static const int lp8788_dldo6_vtbl[] = {
  	3000000, 3100000, 3200000, 3300000, 3400000, 3500000, 3600000, 3600000,
  };
  
  /* DLDO 10, 11 voltage table */
  static const int lp8788_dldo1011_vtbl[] = {
  	1100000, 1150000, 1200000, 1250000, 1300000, 1350000, 1400000, 1450000,
  	1500000, 1500000, 1500000, 1500000, 1500000, 1500000, 1500000, 1500000,
  };
  
  /* ALDO 1 voltage table */
  static const int lp8788_aldo1_vtbl[] = { 1800000, 2850000 };
  
  /* ALDO 7 voltage table */
  static const int lp8788_aldo7_vtbl[] = {
  	1200000, 1300000, 1400000, 1500000, 1600000, 1700000, 1800000, 1800000,
  };
ade7515fe   Kim, Milo   regulator: add ne...
152
153
154
155
156
157
158
159
160
161
162
163
164
  static int lp8788_ldo_enable_time(struct regulator_dev *rdev)
  {
  	struct lp8788_ldo *ldo = rdev_get_drvdata(rdev);
  	enum lp8788_ldo_id id = rdev_get_id(rdev);
  	u8 val, addr = LP8788_DLDO1_TIMESTEP + id;
  
  	if (lp8788_read_byte(ldo->lp, addr, &val))
  		return -EINVAL;
  
  	val = (val & LP8788_STARTUP_TIME_M) >> LP8788_STARTUP_TIME_S;
  
  	return ENABLE_TIME_USEC * val;
  }
95dfead1d   Julia Lawall   regulator: lp8788...
165
  static const struct regulator_ops lp8788_ldo_voltage_table_ops = {
ade7515fe   Kim, Milo   regulator: add ne...
166
167
168
  	.list_voltage = regulator_list_voltage_table,
  	.set_voltage_sel = regulator_set_voltage_sel_regmap,
  	.get_voltage_sel = regulator_get_voltage_sel_regmap,
407945fd7   Kim, Milo   regulator: lp8788...
169
170
171
  	.enable = regulator_enable_regmap,
  	.disable = regulator_disable_regmap,
  	.is_enabled = regulator_is_enabled_regmap,
ade7515fe   Kim, Milo   regulator: add ne...
172
173
  	.enable_time = lp8788_ldo_enable_time,
  };
95dfead1d   Julia Lawall   regulator: lp8788...
174
  static const struct regulator_ops lp8788_ldo_voltage_fixed_ops = {
b5366e5ed   Axel Lin   regulator: lp8788...
175
  	.list_voltage = regulator_list_voltage_linear,
407945fd7   Kim, Milo   regulator: lp8788...
176
177
178
  	.enable = regulator_enable_regmap,
  	.disable = regulator_disable_regmap,
  	.is_enabled = regulator_is_enabled_regmap,
ade7515fe   Kim, Milo   regulator: add ne...
179
180
  	.enable_time = lp8788_ldo_enable_time,
  };
23295d798   Axel Lin   regulator: lp8788...
181
  static const struct regulator_desc lp8788_dldo_desc[] = {
ade7515fe   Kim, Milo   regulator: add ne...
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
  	{
  		.name = "dldo1",
  		.id = DLDO1,
  		.ops = &lp8788_ldo_voltage_table_ops,
  		.n_voltages = ARRAY_SIZE(lp8788_dldo1239_vtbl),
  		.volt_table = lp8788_dldo1239_vtbl,
  		.type = REGULATOR_VOLTAGE,
  		.owner = THIS_MODULE,
  		.vsel_reg = LP8788_DLDO1_VOUT,
  		.vsel_mask = LP8788_VOUT_5BIT_M,
  		.enable_reg = LP8788_EN_LDO_A,
  		.enable_mask = LP8788_EN_DLDO1_M,
  	},
  	{
  		.name = "dldo2",
  		.id = DLDO2,
  		.ops = &lp8788_ldo_voltage_table_ops,
  		.n_voltages = ARRAY_SIZE(lp8788_dldo1239_vtbl),
  		.volt_table = lp8788_dldo1239_vtbl,
  		.type = REGULATOR_VOLTAGE,
  		.owner = THIS_MODULE,
  		.vsel_reg = LP8788_DLDO2_VOUT,
  		.vsel_mask = LP8788_VOUT_5BIT_M,
  		.enable_reg = LP8788_EN_LDO_A,
  		.enable_mask = LP8788_EN_DLDO2_M,
  	},
  	{
  		.name = "dldo3",
  		.id = DLDO3,
  		.ops = &lp8788_ldo_voltage_table_ops,
  		.n_voltages = ARRAY_SIZE(lp8788_dldo1239_vtbl),
  		.volt_table = lp8788_dldo1239_vtbl,
  		.type = REGULATOR_VOLTAGE,
  		.owner = THIS_MODULE,
  		.vsel_reg = LP8788_DLDO3_VOUT,
  		.vsel_mask = LP8788_VOUT_5BIT_M,
  		.enable_reg = LP8788_EN_LDO_A,
  		.enable_mask = LP8788_EN_DLDO3_M,
  	},
  	{
  		.name = "dldo4",
  		.id = DLDO4,
  		.ops = &lp8788_ldo_voltage_table_ops,
  		.n_voltages = ARRAY_SIZE(lp8788_dldo4_vtbl),
  		.volt_table = lp8788_dldo4_vtbl,
  		.type = REGULATOR_VOLTAGE,
  		.owner = THIS_MODULE,
  		.vsel_reg = LP8788_DLDO4_VOUT,
  		.vsel_mask = LP8788_VOUT_1BIT_M,
  		.enable_reg = LP8788_EN_LDO_A,
  		.enable_mask = LP8788_EN_DLDO4_M,
  	},
  	{
  		.name = "dldo5",
  		.id = DLDO5,
  		.ops = &lp8788_ldo_voltage_table_ops,
  		.n_voltages = ARRAY_SIZE(lp8788_dldo578_aldo6_vtbl),
  		.volt_table = lp8788_dldo578_aldo6_vtbl,
  		.type = REGULATOR_VOLTAGE,
  		.owner = THIS_MODULE,
  		.vsel_reg = LP8788_DLDO5_VOUT,
  		.vsel_mask = LP8788_VOUT_4BIT_M,
  		.enable_reg = LP8788_EN_LDO_A,
  		.enable_mask = LP8788_EN_DLDO5_M,
  	},
  	{
  		.name = "dldo6",
  		.id = DLDO6,
  		.ops = &lp8788_ldo_voltage_table_ops,
  		.n_voltages = ARRAY_SIZE(lp8788_dldo6_vtbl),
  		.volt_table = lp8788_dldo6_vtbl,
  		.type = REGULATOR_VOLTAGE,
  		.owner = THIS_MODULE,
  		.vsel_reg = LP8788_DLDO6_VOUT,
  		.vsel_mask = LP8788_VOUT_3BIT_M,
  		.enable_reg = LP8788_EN_LDO_A,
  		.enable_mask = LP8788_EN_DLDO6_M,
  	},
  	{
  		.name = "dldo7",
  		.id = DLDO7,
  		.ops = &lp8788_ldo_voltage_table_ops,
  		.n_voltages = ARRAY_SIZE(lp8788_dldo578_aldo6_vtbl),
  		.volt_table = lp8788_dldo578_aldo6_vtbl,
  		.type = REGULATOR_VOLTAGE,
  		.owner = THIS_MODULE,
  		.vsel_reg = LP8788_DLDO7_VOUT,
  		.vsel_mask = LP8788_VOUT_4BIT_M,
  		.enable_reg = LP8788_EN_LDO_A,
  		.enable_mask = LP8788_EN_DLDO7_M,
  	},
  	{
  		.name = "dldo8",
  		.id = DLDO8,
  		.ops = &lp8788_ldo_voltage_table_ops,
  		.n_voltages = ARRAY_SIZE(lp8788_dldo578_aldo6_vtbl),
  		.volt_table = lp8788_dldo578_aldo6_vtbl,
  		.type = REGULATOR_VOLTAGE,
  		.owner = THIS_MODULE,
  		.vsel_reg = LP8788_DLDO8_VOUT,
  		.vsel_mask = LP8788_VOUT_4BIT_M,
  		.enable_reg = LP8788_EN_LDO_A,
  		.enable_mask = LP8788_EN_DLDO8_M,
  	},
  	{
  		.name = "dldo9",
  		.id = DLDO9,
  		.ops = &lp8788_ldo_voltage_table_ops,
  		.n_voltages = ARRAY_SIZE(lp8788_dldo1239_vtbl),
  		.volt_table = lp8788_dldo1239_vtbl,
  		.type = REGULATOR_VOLTAGE,
  		.owner = THIS_MODULE,
  		.vsel_reg = LP8788_DLDO9_VOUT,
  		.vsel_mask = LP8788_VOUT_5BIT_M,
  		.enable_reg = LP8788_EN_LDO_B,
  		.enable_mask = LP8788_EN_DLDO9_M,
  	},
  	{
  		.name = "dldo10",
  		.id = DLDO10,
  		.ops = &lp8788_ldo_voltage_table_ops,
  		.n_voltages = ARRAY_SIZE(lp8788_dldo1011_vtbl),
  		.volt_table = lp8788_dldo1011_vtbl,
  		.type = REGULATOR_VOLTAGE,
  		.owner = THIS_MODULE,
  		.vsel_reg = LP8788_DLDO10_VOUT,
  		.vsel_mask = LP8788_VOUT_4BIT_M,
  		.enable_reg = LP8788_EN_LDO_B,
  		.enable_mask = LP8788_EN_DLDO10_M,
  	},
  	{
  		.name = "dldo11",
  		.id = DLDO11,
  		.ops = &lp8788_ldo_voltage_table_ops,
  		.n_voltages = ARRAY_SIZE(lp8788_dldo1011_vtbl),
  		.volt_table = lp8788_dldo1011_vtbl,
  		.type = REGULATOR_VOLTAGE,
  		.owner = THIS_MODULE,
  		.vsel_reg = LP8788_DLDO11_VOUT,
  		.vsel_mask = LP8788_VOUT_4BIT_M,
  		.enable_reg = LP8788_EN_LDO_B,
  		.enable_mask = LP8788_EN_DLDO11_M,
  	},
  	{
  		.name = "dldo12",
  		.id = DLDO12,
  		.ops = &lp8788_ldo_voltage_fixed_ops,
74c8cfdaa   Axel Lin   regulator: lp8788...
329
  		.n_voltages = 1,
ade7515fe   Kim, Milo   regulator: add ne...
330
331
332
333
  		.type = REGULATOR_VOLTAGE,
  		.owner = THIS_MODULE,
  		.enable_reg = LP8788_EN_LDO_B,
  		.enable_mask = LP8788_EN_DLDO12_M,
b5366e5ed   Axel Lin   regulator: lp8788...
334
  		.min_uV = 2500000,
ade7515fe   Kim, Milo   regulator: add ne...
335
336
  	},
  };
23295d798   Axel Lin   regulator: lp8788...
337
  static const struct regulator_desc lp8788_aldo_desc[] = {
ade7515fe   Kim, Milo   regulator: add ne...
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
  	{
  		.name = "aldo1",
  		.id = ALDO1,
  		.ops = &lp8788_ldo_voltage_table_ops,
  		.n_voltages = ARRAY_SIZE(lp8788_aldo1_vtbl),
  		.volt_table = lp8788_aldo1_vtbl,
  		.type = REGULATOR_VOLTAGE,
  		.owner = THIS_MODULE,
  		.vsel_reg = LP8788_ALDO1_VOUT,
  		.vsel_mask = LP8788_VOUT_1BIT_M,
  		.enable_reg = LP8788_EN_LDO_B,
  		.enable_mask = LP8788_EN_ALDO1_M,
  	},
  	{
  		.name = "aldo2",
  		.id = ALDO2,
  		.ops = &lp8788_ldo_voltage_fixed_ops,
74c8cfdaa   Axel Lin   regulator: lp8788...
355
  		.n_voltages = 1,
ade7515fe   Kim, Milo   regulator: add ne...
356
357
358
359
  		.type = REGULATOR_VOLTAGE,
  		.owner = THIS_MODULE,
  		.enable_reg = LP8788_EN_LDO_B,
  		.enable_mask = LP8788_EN_ALDO2_M,
b5366e5ed   Axel Lin   regulator: lp8788...
360
  		.min_uV = 2850000,
ade7515fe   Kim, Milo   regulator: add ne...
361
362
363
364
365
  	},
  	{
  		.name = "aldo3",
  		.id = ALDO3,
  		.ops = &lp8788_ldo_voltage_fixed_ops,
74c8cfdaa   Axel Lin   regulator: lp8788...
366
  		.n_voltages = 1,
ade7515fe   Kim, Milo   regulator: add ne...
367
368
369
370
  		.type = REGULATOR_VOLTAGE,
  		.owner = THIS_MODULE,
  		.enable_reg = LP8788_EN_LDO_B,
  		.enable_mask = LP8788_EN_ALDO3_M,
b5366e5ed   Axel Lin   regulator: lp8788...
371
  		.min_uV = 2850000,
ade7515fe   Kim, Milo   regulator: add ne...
372
373
374
375
376
  	},
  	{
  		.name = "aldo4",
  		.id = ALDO4,
  		.ops = &lp8788_ldo_voltage_fixed_ops,
74c8cfdaa   Axel Lin   regulator: lp8788...
377
  		.n_voltages = 1,
ade7515fe   Kim, Milo   regulator: add ne...
378
379
380
381
  		.type = REGULATOR_VOLTAGE,
  		.owner = THIS_MODULE,
  		.enable_reg = LP8788_EN_LDO_B,
  		.enable_mask = LP8788_EN_ALDO4_M,
b5366e5ed   Axel Lin   regulator: lp8788...
382
  		.min_uV = 2850000,
ade7515fe   Kim, Milo   regulator: add ne...
383
384
385
386
387
  	},
  	{
  		.name = "aldo5",
  		.id = ALDO5,
  		.ops = &lp8788_ldo_voltage_fixed_ops,
74c8cfdaa   Axel Lin   regulator: lp8788...
388
  		.n_voltages = 1,
ade7515fe   Kim, Milo   regulator: add ne...
389
390
391
392
  		.type = REGULATOR_VOLTAGE,
  		.owner = THIS_MODULE,
  		.enable_reg = LP8788_EN_LDO_C,
  		.enable_mask = LP8788_EN_ALDO5_M,
b5366e5ed   Axel Lin   regulator: lp8788...
393
  		.min_uV = 2850000,
ade7515fe   Kim, Milo   regulator: add ne...
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
  	},
  	{
  		.name = "aldo6",
  		.id = ALDO6,
  		.ops = &lp8788_ldo_voltage_table_ops,
  		.n_voltages = ARRAY_SIZE(lp8788_dldo578_aldo6_vtbl),
  		.volt_table = lp8788_dldo578_aldo6_vtbl,
  		.type = REGULATOR_VOLTAGE,
  		.owner = THIS_MODULE,
  		.vsel_reg = LP8788_ALDO6_VOUT,
  		.vsel_mask = LP8788_VOUT_4BIT_M,
  		.enable_reg = LP8788_EN_LDO_C,
  		.enable_mask = LP8788_EN_ALDO6_M,
  	},
  	{
  		.name = "aldo7",
  		.id = ALDO7,
  		.ops = &lp8788_ldo_voltage_table_ops,
  		.n_voltages = ARRAY_SIZE(lp8788_aldo7_vtbl),
  		.volt_table = lp8788_aldo7_vtbl,
  		.type = REGULATOR_VOLTAGE,
  		.owner = THIS_MODULE,
  		.vsel_reg = LP8788_ALDO7_VOUT,
  		.vsel_mask = LP8788_VOUT_3BIT_M,
  		.enable_reg = LP8788_EN_LDO_C,
  		.enable_mask = LP8788_EN_ALDO7_M,
  	},
  	{
  		.name = "aldo8",
  		.id = ALDO8,
  		.ops = &lp8788_ldo_voltage_fixed_ops,
74c8cfdaa   Axel Lin   regulator: lp8788...
425
  		.n_voltages = 1,
ade7515fe   Kim, Milo   regulator: add ne...
426
427
428
429
  		.type = REGULATOR_VOLTAGE,
  		.owner = THIS_MODULE,
  		.enable_reg = LP8788_EN_LDO_C,
  		.enable_mask = LP8788_EN_ALDO8_M,
b5366e5ed   Axel Lin   regulator: lp8788...
430
  		.min_uV = 2500000,
ade7515fe   Kim, Milo   regulator: add ne...
431
432
433
434
435
  	},
  	{
  		.name = "aldo9",
  		.id = ALDO9,
  		.ops = &lp8788_ldo_voltage_fixed_ops,
74c8cfdaa   Axel Lin   regulator: lp8788...
436
  		.n_voltages = 1,
ade7515fe   Kim, Milo   regulator: add ne...
437
438
439
440
  		.type = REGULATOR_VOLTAGE,
  		.owner = THIS_MODULE,
  		.enable_reg = LP8788_EN_LDO_C,
  		.enable_mask = LP8788_EN_ALDO9_M,
b5366e5ed   Axel Lin   regulator: lp8788...
441
  		.min_uV = 2500000,
ade7515fe   Kim, Milo   regulator: add ne...
442
443
444
445
446
  	},
  	{
  		.name = "aldo10",
  		.id = ALDO10,
  		.ops = &lp8788_ldo_voltage_fixed_ops,
74c8cfdaa   Axel Lin   regulator: lp8788...
447
  		.n_voltages = 1,
ade7515fe   Kim, Milo   regulator: add ne...
448
449
450
451
  		.type = REGULATOR_VOLTAGE,
  		.owner = THIS_MODULE,
  		.enable_reg = LP8788_EN_LDO_C,
  		.enable_mask = LP8788_EN_ALDO10_M,
b5366e5ed   Axel Lin   regulator: lp8788...
452
  		.min_uV = 1100000,
ade7515fe   Kim, Milo   regulator: add ne...
453
454
  	},
  };
f02a3917b   Kim, Milo   lp8788-ldo: fix a...
455
456
  static int lp8788_config_ldo_enable_mode(struct platform_device *pdev,
  					struct lp8788_ldo *ldo,
ade7515fe   Kim, Milo   regulator: add ne...
457
458
  					enum lp8788_ldo_id id)
  {
ade7515fe   Kim, Milo   regulator: add ne...
459
  	struct lp8788 *lp = ldo->lp;
ade7515fe   Kim, Milo   regulator: add ne...
460
  	enum lp8788_ext_ldo_en_id enable_id;
6cbe29c92   Colin Ian King   regulator: lp8788...
461
  	static const u8 en_mask[] = {
ade7515fe   Kim, Milo   regulator: add ne...
462
463
464
465
466
467
468
  		[EN_ALDO1]   = LP8788_EN_SEL_ALDO1_M,
  		[EN_ALDO234] = LP8788_EN_SEL_ALDO234_M,
  		[EN_ALDO5]   = LP8788_EN_SEL_ALDO5_M,
  		[EN_ALDO7]   = LP8788_EN_SEL_ALDO7_M,
  		[EN_DLDO7]   = LP8788_EN_SEL_DLDO7_M,
  		[EN_DLDO911] = LP8788_EN_SEL_DLDO911_M,
  	};
ade7515fe   Kim, Milo   regulator: add ne...
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
  
  	switch (id) {
  	case DLDO7:
  		enable_id = EN_DLDO7;
  		break;
  	case DLDO9:
  	case DLDO11:
  		enable_id = EN_DLDO911;
  		break;
  	case ALDO1:
  		enable_id = EN_ALDO1;
  		break;
  	case ALDO2 ... ALDO4:
  		enable_id = EN_ALDO234;
  		break;
  	case ALDO5:
  		enable_id = EN_ALDO5;
  		break;
  	case ALDO7:
  		enable_id = EN_ALDO7;
  		break;
  	default:
  		return 0;
  	}
2bb8ede0b   Linus Walleij   regulator: lp8788...
493
494
495
496
497
498
  	/*
  	 * Do not use devm* here: the regulator core takes over the
  	 * lifecycle management of the GPIO descriptor.
  	 * FIXME: check default mode for GPIO here: high or low?
  	 */
  	ldo->ena_gpiod = gpiod_get_index_optional(&pdev->dev,
63239e4bf   Linus Walleij   regulator: Fetch ...
499
500
501
502
  					       "enable",
  					       enable_id,
  					       GPIOD_OUT_HIGH |
  					       GPIOD_FLAGS_BIT_NONEXCLUSIVE);
2468f0d51   Linus Walleij   regulator: lp8788...
503
504
505
506
507
  	if (IS_ERR(ldo->ena_gpiod))
  		return PTR_ERR(ldo->ena_gpiod);
  
  	/* if no GPIO for ldo pin, then set default enable mode */
  	if (!ldo->ena_gpiod)
ade7515fe   Kim, Milo   regulator: add ne...
508
  		goto set_default_ldo_enable_mode;
407945fd7   Kim, Milo   regulator: lp8788...
509
  	return 0;
ade7515fe   Kim, Milo   regulator: add ne...
510
511
  
  set_default_ldo_enable_mode:
40b5aa8f0   Axel Lin   regulator: lp8788...
512
  	return lp8788_update_bits(lp, LP8788_EN_SEL, en_mask[enable_id], 0);
ade7515fe   Kim, Milo   regulator: add ne...
513
  }
a5023574d   Bill Pemberton   regulator: remove...
514
  static int lp8788_dldo_probe(struct platform_device *pdev)
ade7515fe   Kim, Milo   regulator: add ne...
515
516
517
518
519
520
521
  {
  	struct lp8788 *lp = dev_get_drvdata(pdev->dev.parent);
  	int id = pdev->id;
  	struct lp8788_ldo *ldo;
  	struct regulator_config cfg = { };
  	struct regulator_dev *rdev;
  	int ret;
939e88f09   Kim, Milo   lp8788-ldo: fix a...
522
  	ldo = devm_kzalloc(&pdev->dev, sizeof(struct lp8788_ldo), GFP_KERNEL);
ade7515fe   Kim, Milo   regulator: add ne...
523
524
525
526
  	if (!ldo)
  		return -ENOMEM;
  
  	ldo->lp = lp;
80abd60d9   Axel Lin   regulator: lp8788...
527
  	ret = lp8788_config_ldo_enable_mode(pdev, ldo, id);
ade7515fe   Kim, Milo   regulator: add ne...
528
529
  	if (ret)
  		return ret;
2468f0d51   Linus Walleij   regulator: lp8788...
530
531
  	if (ldo->ena_gpiod)
  		cfg.ena_gpiod = ldo->ena_gpiod;
407945fd7   Kim, Milo   regulator: lp8788...
532

939e88f09   Kim, Milo   lp8788-ldo: fix a...
533
  	cfg.dev = pdev->dev.parent;
ade7515fe   Kim, Milo   regulator: add ne...
534
535
536
  	cfg.init_data = lp->pdata ? lp->pdata->dldo_data[id] : NULL;
  	cfg.driver_data = ldo;
  	cfg.regmap = lp->regmap;
0b7bb0905   Jingoo Han   regulator: lp8788...
537
  	rdev = devm_regulator_register(&pdev->dev, &lp8788_dldo_desc[id], &cfg);
ade7515fe   Kim, Milo   regulator: add ne...
538
539
  	if (IS_ERR(rdev)) {
  		ret = PTR_ERR(rdev);
939e88f09   Kim, Milo   lp8788-ldo: fix a...
540
541
  		dev_err(&pdev->dev, "DLDO%d regulator register err = %d
  ",
ade7515fe   Kim, Milo   regulator: add ne...
542
543
544
545
546
547
548
549
550
  				id + 1, ret);
  		return ret;
  	}
  
  	ldo->regulator = rdev;
  	platform_set_drvdata(pdev, ldo);
  
  	return 0;
  }
ade7515fe   Kim, Milo   regulator: add ne...
551
552
  static struct platform_driver lp8788_dldo_driver = {
  	.probe = lp8788_dldo_probe,
ade7515fe   Kim, Milo   regulator: add ne...
553
554
  	.driver = {
  		.name = LP8788_DEV_DLDO,
ade7515fe   Kim, Milo   regulator: add ne...
555
556
  	},
  };
a5023574d   Bill Pemberton   regulator: remove...
557
  static int lp8788_aldo_probe(struct platform_device *pdev)
ade7515fe   Kim, Milo   regulator: add ne...
558
559
560
561
562
563
564
  {
  	struct lp8788 *lp = dev_get_drvdata(pdev->dev.parent);
  	int id = pdev->id;
  	struct lp8788_ldo *ldo;
  	struct regulator_config cfg = { };
  	struct regulator_dev *rdev;
  	int ret;
939e88f09   Kim, Milo   lp8788-ldo: fix a...
565
  	ldo = devm_kzalloc(&pdev->dev, sizeof(struct lp8788_ldo), GFP_KERNEL);
ade7515fe   Kim, Milo   regulator: add ne...
566
567
568
569
  	if (!ldo)
  		return -ENOMEM;
  
  	ldo->lp = lp;
80abd60d9   Axel Lin   regulator: lp8788...
570
  	ret = lp8788_config_ldo_enable_mode(pdev, ldo, id + ALDO1);
ade7515fe   Kim, Milo   regulator: add ne...
571
572
  	if (ret)
  		return ret;
2468f0d51   Linus Walleij   regulator: lp8788...
573
574
  	if (ldo->ena_gpiod)
  		cfg.ena_gpiod = ldo->ena_gpiod;
407945fd7   Kim, Milo   regulator: lp8788...
575

939e88f09   Kim, Milo   lp8788-ldo: fix a...
576
  	cfg.dev = pdev->dev.parent;
ade7515fe   Kim, Milo   regulator: add ne...
577
578
579
  	cfg.init_data = lp->pdata ? lp->pdata->aldo_data[id] : NULL;
  	cfg.driver_data = ldo;
  	cfg.regmap = lp->regmap;
0b7bb0905   Jingoo Han   regulator: lp8788...
580
  	rdev = devm_regulator_register(&pdev->dev, &lp8788_aldo_desc[id], &cfg);
ade7515fe   Kim, Milo   regulator: add ne...
581
582
  	if (IS_ERR(rdev)) {
  		ret = PTR_ERR(rdev);
939e88f09   Kim, Milo   lp8788-ldo: fix a...
583
584
  		dev_err(&pdev->dev, "ALDO%d regulator register err = %d
  ",
ade7515fe   Kim, Milo   regulator: add ne...
585
586
587
588
589
590
591
592
593
  				id + 1, ret);
  		return ret;
  	}
  
  	ldo->regulator = rdev;
  	platform_set_drvdata(pdev, ldo);
  
  	return 0;
  }
ade7515fe   Kim, Milo   regulator: add ne...
594
595
  static struct platform_driver lp8788_aldo_driver = {
  	.probe = lp8788_aldo_probe,
ade7515fe   Kim, Milo   regulator: add ne...
596
597
  	.driver = {
  		.name = LP8788_DEV_ALDO,
ade7515fe   Kim, Milo   regulator: add ne...
598
599
  	},
  };
7629cef11   Thierry Reding   regulator: lp8788...
600
601
602
603
  static struct platform_driver * const drivers[] = {
  	&lp8788_dldo_driver,
  	&lp8788_aldo_driver,
  };
ade7515fe   Kim, Milo   regulator: add ne...
604
605
  static int __init lp8788_ldo_init(void)
  {
7629cef11   Thierry Reding   regulator: lp8788...
606
  	return platform_register_drivers(drivers, ARRAY_SIZE(drivers));
ade7515fe   Kim, Milo   regulator: add ne...
607
608
609
610
611
  }
  subsys_initcall(lp8788_ldo_init);
  
  static void __exit lp8788_ldo_exit(void)
  {
7629cef11   Thierry Reding   regulator: lp8788...
612
  	platform_unregister_drivers(drivers, ARRAY_SIZE(drivers));
ade7515fe   Kim, Milo   regulator: add ne...
613
614
615
616
617
618
619
620
  }
  module_exit(lp8788_ldo_exit);
  
  MODULE_DESCRIPTION("TI LP8788 LDO Driver");
  MODULE_AUTHOR("Milo Kim");
  MODULE_LICENSE("GPL");
  MODULE_ALIAS("platform:lp8788-dldo");
  MODULE_ALIAS("platform:lp8788-aldo");