Linux Audio

Check our new training course

Loading...
v5.9
  1// SPDX-License-Identifier: GPL-2.0+
  2//
  3// wm831x-ldo.c  --  LDO driver for the WM831x series
  4//
  5// Copyright 2009 Wolfson Microelectronics PLC.
  6//
  7// Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
 
 
 
 
 
  8
  9#include <linux/module.h>
 10#include <linux/moduleparam.h>
 11#include <linux/init.h>
 12#include <linux/bitops.h>
 13#include <linux/err.h>
 14#include <linux/i2c.h>
 15#include <linux/platform_device.h>
 16#include <linux/regulator/driver.h>
 17#include <linux/slab.h>
 18
 19#include <linux/mfd/wm831x/core.h>
 20#include <linux/mfd/wm831x/regulator.h>
 21#include <linux/mfd/wm831x/pdata.h>
 22
 23#define WM831X_LDO_MAX_NAME 9
 24
 25#define WM831X_LDO_CONTROL       0
 26#define WM831X_LDO_ON_CONTROL    1
 27#define WM831X_LDO_SLEEP_CONTROL 2
 28
 29#define WM831X_ALIVE_LDO_ON_CONTROL    0
 30#define WM831X_ALIVE_LDO_SLEEP_CONTROL 1
 31
 32struct wm831x_ldo {
 33	char name[WM831X_LDO_MAX_NAME];
 34	char supply_name[WM831X_LDO_MAX_NAME];
 35	struct regulator_desc desc;
 36	int base;
 37	struct wm831x *wm831x;
 38	struct regulator_dev *regulator;
 39};
 40
 41/*
 42 * Shared
 43 */
 44
 45static irqreturn_t wm831x_ldo_uv_irq(int irq, void *data)
 46{
 47	struct wm831x_ldo *ldo = data;
 48
 49	regulator_lock(ldo->regulator);
 50	regulator_notifier_call_chain(ldo->regulator,
 51				      REGULATOR_EVENT_UNDER_VOLTAGE,
 52				      NULL);
 53	regulator_unlock(ldo->regulator);
 54
 55	return IRQ_HANDLED;
 56}
 57
 58/*
 59 * General purpose LDOs
 60 */
 61
 62static const struct linear_range wm831x_gp_ldo_ranges[] = {
 63	REGULATOR_LINEAR_RANGE(900000, 0, 14, 50000),
 64	REGULATOR_LINEAR_RANGE(1700000, 15, 31, 100000),
 65};
 66
 67static int wm831x_gp_ldo_set_suspend_voltage(struct regulator_dev *rdev,
 68					     int uV)
 69{
 70	struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
 71	struct wm831x *wm831x = ldo->wm831x;
 72	int sel, reg = ldo->base + WM831X_LDO_SLEEP_CONTROL;
 73
 74	sel = regulator_map_voltage_linear_range(rdev, uV, uV);
 75	if (sel < 0)
 76		return sel;
 77
 78	return wm831x_set_bits(wm831x, reg, WM831X_LDO1_ON_VSEL_MASK, sel);
 79}
 80
 81static unsigned int wm831x_gp_ldo_get_mode(struct regulator_dev *rdev)
 82{
 83	struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
 84	struct wm831x *wm831x = ldo->wm831x;
 85	int ctrl_reg = ldo->base + WM831X_LDO_CONTROL;
 86	int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
 87	int ret;
 88
 89	ret = wm831x_reg_read(wm831x, on_reg);
 90	if (ret < 0)
 91		return ret;
 92
 93	if (!(ret & WM831X_LDO1_ON_MODE))
 94		return REGULATOR_MODE_NORMAL;
 95
 96	ret = wm831x_reg_read(wm831x, ctrl_reg);
 97	if (ret < 0)
 98		return ret;
 99
100	if (ret & WM831X_LDO1_LP_MODE)
101		return REGULATOR_MODE_STANDBY;
102	else
103		return REGULATOR_MODE_IDLE;
104}
105
106static int wm831x_gp_ldo_set_mode(struct regulator_dev *rdev,
107				  unsigned int mode)
108{
109	struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
110	struct wm831x *wm831x = ldo->wm831x;
111	int ctrl_reg = ldo->base + WM831X_LDO_CONTROL;
112	int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
113	int ret;
114
115
116	switch (mode) {
117	case REGULATOR_MODE_NORMAL:
118		ret = wm831x_set_bits(wm831x, on_reg,
119				      WM831X_LDO1_ON_MODE, 0);
120		if (ret < 0)
121			return ret;
122		break;
123
124	case REGULATOR_MODE_IDLE:
125		ret = wm831x_set_bits(wm831x, ctrl_reg,
126				      WM831X_LDO1_LP_MODE, 0);
127		if (ret < 0)
128			return ret;
129
130		ret = wm831x_set_bits(wm831x, on_reg,
131				      WM831X_LDO1_ON_MODE,
132				      WM831X_LDO1_ON_MODE);
133		if (ret < 0)
134			return ret;
135		break;
136
137	case REGULATOR_MODE_STANDBY:
138		ret = wm831x_set_bits(wm831x, ctrl_reg,
139				      WM831X_LDO1_LP_MODE,
140				      WM831X_LDO1_LP_MODE);
141		if (ret < 0)
142			return ret;
143
144		ret = wm831x_set_bits(wm831x, on_reg,
145				      WM831X_LDO1_ON_MODE,
146				      WM831X_LDO1_ON_MODE);
147		if (ret < 0)
148			return ret;
149		break;
150
151	default:
152		return -EINVAL;
153	}
154
155	return 0;
156}
157
158static int wm831x_gp_ldo_get_status(struct regulator_dev *rdev)
159{
160	struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
161	struct wm831x *wm831x = ldo->wm831x;
162	int mask = 1 << rdev_get_id(rdev);
163	int ret;
164
165	/* Is the regulator on? */
166	ret = wm831x_reg_read(wm831x, WM831X_LDO_STATUS);
167	if (ret < 0)
168		return ret;
169	if (!(ret & mask))
170		return REGULATOR_STATUS_OFF;
171
172	/* Is it reporting under voltage? */
173	ret = wm831x_reg_read(wm831x, WM831X_LDO_UV_STATUS);
174	if (ret < 0)
175		return ret;
176	if (ret & mask)
177		return REGULATOR_STATUS_ERROR;
178
179	ret = wm831x_gp_ldo_get_mode(rdev);
180	if (ret < 0)
181		return ret;
182	else
183		return regulator_mode_to_status(ret);
184}
185
186static unsigned int wm831x_gp_ldo_get_optimum_mode(struct regulator_dev *rdev,
187						   int input_uV,
188						   int output_uV, int load_uA)
189{
190	if (load_uA < 20000)
191		return REGULATOR_MODE_STANDBY;
192	if (load_uA < 50000)
193		return REGULATOR_MODE_IDLE;
194	return REGULATOR_MODE_NORMAL;
195}
196
197
198static const struct regulator_ops wm831x_gp_ldo_ops = {
199	.list_voltage = regulator_list_voltage_linear_range,
200	.map_voltage = regulator_map_voltage_linear_range,
201	.get_voltage_sel = regulator_get_voltage_sel_regmap,
202	.set_voltage_sel = regulator_set_voltage_sel_regmap,
203	.set_suspend_voltage = wm831x_gp_ldo_set_suspend_voltage,
204	.get_mode = wm831x_gp_ldo_get_mode,
205	.set_mode = wm831x_gp_ldo_set_mode,
206	.get_status = wm831x_gp_ldo_get_status,
207	.get_optimum_mode = wm831x_gp_ldo_get_optimum_mode,
208	.get_bypass = regulator_get_bypass_regmap,
209	.set_bypass = regulator_set_bypass_regmap,
210
211	.is_enabled = regulator_is_enabled_regmap,
212	.enable = regulator_enable_regmap,
213	.disable = regulator_disable_regmap,
214};
215
216static int wm831x_gp_ldo_probe(struct platform_device *pdev)
217{
218	struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
219	struct wm831x_pdata *pdata = dev_get_platdata(wm831x->dev);
220	struct regulator_config config = { };
221	int id;
222	struct wm831x_ldo *ldo;
223	struct resource *res;
224	int ret, irq;
225
226	if (pdata && pdata->wm831x_num)
227		id = (pdata->wm831x_num * 10) + 1;
228	else
229		id = 0;
230	id = pdev->id - id;
231
232	dev_dbg(&pdev->dev, "Probing LDO%d\n", id + 1);
233
234	ldo = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ldo), GFP_KERNEL);
235	if (!ldo)
236		return -ENOMEM;
237
238	ldo->wm831x = wm831x;
239
240	res = platform_get_resource(pdev, IORESOURCE_REG, 0);
241	if (res == NULL) {
242		dev_err(&pdev->dev, "No REG resource\n");
243		ret = -EINVAL;
244		goto err;
245	}
246	ldo->base = res->start;
247
248	snprintf(ldo->name, sizeof(ldo->name), "LDO%d", id + 1);
249	ldo->desc.name = ldo->name;
250
251	snprintf(ldo->supply_name, sizeof(ldo->supply_name),
252		 "LDO%dVDD", id + 1);
253	ldo->desc.supply_name = ldo->supply_name;
254
255	ldo->desc.id = id;
256	ldo->desc.type = REGULATOR_VOLTAGE;
257	ldo->desc.n_voltages = 32;
258	ldo->desc.ops = &wm831x_gp_ldo_ops;
259	ldo->desc.owner = THIS_MODULE;
260	ldo->desc.vsel_reg = ldo->base + WM831X_LDO_ON_CONTROL;
261	ldo->desc.vsel_mask = WM831X_LDO1_ON_VSEL_MASK;
262	ldo->desc.enable_reg = WM831X_LDO_ENABLE;
263	ldo->desc.enable_mask = 1 << id;
264	ldo->desc.bypass_reg = ldo->base;
265	ldo->desc.bypass_mask = WM831X_LDO1_SWI;
266	ldo->desc.linear_ranges = wm831x_gp_ldo_ranges;
267	ldo->desc.n_linear_ranges = ARRAY_SIZE(wm831x_gp_ldo_ranges);
268
269	config.dev = pdev->dev.parent;
270	if (pdata)
271		config.init_data = pdata->ldo[id];
272	config.driver_data = ldo;
273	config.regmap = wm831x->regmap;
274
275	ldo->regulator = devm_regulator_register(&pdev->dev, &ldo->desc,
276						 &config);
277	if (IS_ERR(ldo->regulator)) {
278		ret = PTR_ERR(ldo->regulator);
279		dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
280			id + 1, ret);
281		goto err;
282	}
283
284	irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV"));
285	ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
286					wm831x_ldo_uv_irq,
287					IRQF_TRIGGER_RISING | IRQF_ONESHOT,
288					ldo->name,
289					ldo);
290	if (ret != 0) {
291		dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
292			irq, ret);
293		goto err;
294	}
295
296	platform_set_drvdata(pdev, ldo);
297
298	return 0;
299
300err:
301	return ret;
302}
303
304static struct platform_driver wm831x_gp_ldo_driver = {
305	.probe = wm831x_gp_ldo_probe,
306	.driver		= {
307		.name	= "wm831x-ldo",
 
308	},
309};
310
311/*
312 * Analogue LDOs
313 */
314
315static const struct linear_range wm831x_aldo_ranges[] = {
316	REGULATOR_LINEAR_RANGE(1000000, 0, 12, 50000),
317	REGULATOR_LINEAR_RANGE(1700000, 13, 31, 100000),
318};
319
320static int wm831x_aldo_set_suspend_voltage(struct regulator_dev *rdev,
321					     int uV)
322{
323	struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
324	struct wm831x *wm831x = ldo->wm831x;
325	int sel, reg = ldo->base + WM831X_LDO_SLEEP_CONTROL;
326
327	sel = regulator_map_voltage_linear_range(rdev, uV, uV);
328	if (sel < 0)
329		return sel;
330
331	return wm831x_set_bits(wm831x, reg, WM831X_LDO7_ON_VSEL_MASK, sel);
332}
333
334static unsigned int wm831x_aldo_get_mode(struct regulator_dev *rdev)
335{
336	struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
337	struct wm831x *wm831x = ldo->wm831x;
338	int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
339	int ret;
340
341	ret = wm831x_reg_read(wm831x, on_reg);
342	if (ret < 0)
343		return 0;
344
345	if (ret & WM831X_LDO7_ON_MODE)
346		return REGULATOR_MODE_IDLE;
347	else
348		return REGULATOR_MODE_NORMAL;
349}
350
351static int wm831x_aldo_set_mode(struct regulator_dev *rdev,
352				  unsigned int mode)
353{
354	struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
355	struct wm831x *wm831x = ldo->wm831x;
356	int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
357	int ret;
358
359
360	switch (mode) {
361	case REGULATOR_MODE_NORMAL:
362		ret = wm831x_set_bits(wm831x, on_reg, WM831X_LDO7_ON_MODE, 0);
363		if (ret < 0)
364			return ret;
365		break;
366
367	case REGULATOR_MODE_IDLE:
368		ret = wm831x_set_bits(wm831x, on_reg, WM831X_LDO7_ON_MODE,
369				      WM831X_LDO7_ON_MODE);
370		if (ret < 0)
371			return ret;
372		break;
373
374	default:
375		return -EINVAL;
376	}
377
378	return 0;
379}
380
381static int wm831x_aldo_get_status(struct regulator_dev *rdev)
382{
383	struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
384	struct wm831x *wm831x = ldo->wm831x;
385	int mask = 1 << rdev_get_id(rdev);
386	int ret;
387
388	/* Is the regulator on? */
389	ret = wm831x_reg_read(wm831x, WM831X_LDO_STATUS);
390	if (ret < 0)
391		return ret;
392	if (!(ret & mask))
393		return REGULATOR_STATUS_OFF;
394
395	/* Is it reporting under voltage? */
396	ret = wm831x_reg_read(wm831x, WM831X_LDO_UV_STATUS);
397	if (ret < 0)
398		return ret;
399	if (ret & mask)
400		return REGULATOR_STATUS_ERROR;
401
402	ret = wm831x_aldo_get_mode(rdev);
403	if (ret < 0)
404		return ret;
405	else
406		return regulator_mode_to_status(ret);
407}
408
409static const struct regulator_ops wm831x_aldo_ops = {
410	.list_voltage = regulator_list_voltage_linear_range,
411	.map_voltage = regulator_map_voltage_linear_range,
412	.get_voltage_sel = regulator_get_voltage_sel_regmap,
413	.set_voltage_sel = regulator_set_voltage_sel_regmap,
414	.set_suspend_voltage = wm831x_aldo_set_suspend_voltage,
415	.get_mode = wm831x_aldo_get_mode,
416	.set_mode = wm831x_aldo_set_mode,
417	.get_status = wm831x_aldo_get_status,
418	.set_bypass = regulator_set_bypass_regmap,
419	.get_bypass = regulator_get_bypass_regmap,
420
421	.is_enabled = regulator_is_enabled_regmap,
422	.enable = regulator_enable_regmap,
423	.disable = regulator_disable_regmap,
424};
425
426static int wm831x_aldo_probe(struct platform_device *pdev)
427{
428	struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
429	struct wm831x_pdata *pdata = dev_get_platdata(wm831x->dev);
430	struct regulator_config config = { };
431	int id;
432	struct wm831x_ldo *ldo;
433	struct resource *res;
434	int ret, irq;
435
436	if (pdata && pdata->wm831x_num)
437		id = (pdata->wm831x_num * 10) + 1;
438	else
439		id = 0;
440	id = pdev->id - id;
441
442	dev_dbg(&pdev->dev, "Probing LDO%d\n", id + 1);
443
444	ldo = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ldo), GFP_KERNEL);
445	if (!ldo)
446		return -ENOMEM;
447
448	ldo->wm831x = wm831x;
449
450	res = platform_get_resource(pdev, IORESOURCE_REG, 0);
451	if (res == NULL) {
452		dev_err(&pdev->dev, "No REG resource\n");
453		ret = -EINVAL;
454		goto err;
455	}
456	ldo->base = res->start;
457
458	snprintf(ldo->name, sizeof(ldo->name), "LDO%d", id + 1);
459	ldo->desc.name = ldo->name;
460
461	snprintf(ldo->supply_name, sizeof(ldo->supply_name),
462		 "LDO%dVDD", id + 1);
463	ldo->desc.supply_name = ldo->supply_name;
464
465	ldo->desc.id = id;
466	ldo->desc.type = REGULATOR_VOLTAGE;
467	ldo->desc.n_voltages = 32;
468	ldo->desc.linear_ranges = wm831x_aldo_ranges;
469	ldo->desc.n_linear_ranges = ARRAY_SIZE(wm831x_aldo_ranges);
470	ldo->desc.ops = &wm831x_aldo_ops;
471	ldo->desc.owner = THIS_MODULE;
472	ldo->desc.vsel_reg = ldo->base + WM831X_LDO_ON_CONTROL;
473	ldo->desc.vsel_mask = WM831X_LDO7_ON_VSEL_MASK;
474	ldo->desc.enable_reg = WM831X_LDO_ENABLE;
475	ldo->desc.enable_mask = 1 << id;
476	ldo->desc.bypass_reg = ldo->base;
477	ldo->desc.bypass_mask = WM831X_LDO7_SWI;
478
479	config.dev = pdev->dev.parent;
480	if (pdata)
481		config.init_data = pdata->ldo[id];
482	config.driver_data = ldo;
483	config.regmap = wm831x->regmap;
484
485	ldo->regulator = devm_regulator_register(&pdev->dev, &ldo->desc,
486						 &config);
487	if (IS_ERR(ldo->regulator)) {
488		ret = PTR_ERR(ldo->regulator);
489		dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
490			id + 1, ret);
491		goto err;
492	}
493
494	irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV"));
495	ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
496					wm831x_ldo_uv_irq,
497					IRQF_TRIGGER_RISING | IRQF_ONESHOT,
498					ldo->name, ldo);
499	if (ret != 0) {
500		dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
501			irq, ret);
502		goto err;
503	}
504
505	platform_set_drvdata(pdev, ldo);
506
507	return 0;
508
509err:
510	return ret;
511}
512
513static struct platform_driver wm831x_aldo_driver = {
514	.probe = wm831x_aldo_probe,
515	.driver		= {
516		.name	= "wm831x-aldo",
 
517	},
518};
519
520/*
521 * Alive LDO
522 */
523
524#define WM831X_ALIVE_LDO_MAX_SELECTOR 0xf
525
526static int wm831x_alive_ldo_set_suspend_voltage(struct regulator_dev *rdev,
527					     int uV)
528{
529	struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
530	struct wm831x *wm831x = ldo->wm831x;
531	int sel, reg = ldo->base + WM831X_ALIVE_LDO_SLEEP_CONTROL;
532
533	sel = regulator_map_voltage_linear(rdev, uV, uV);
534	if (sel < 0)
535		return sel;
536
537	return wm831x_set_bits(wm831x, reg, WM831X_LDO11_ON_VSEL_MASK, sel);
538}
539
540static int wm831x_alive_ldo_get_status(struct regulator_dev *rdev)
541{
542	struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
543	struct wm831x *wm831x = ldo->wm831x;
544	int mask = 1 << rdev_get_id(rdev);
545	int ret;
546
547	/* Is the regulator on? */
548	ret = wm831x_reg_read(wm831x, WM831X_LDO_STATUS);
549	if (ret < 0)
550		return ret;
551	if (ret & mask)
552		return REGULATOR_STATUS_ON;
553	else
554		return REGULATOR_STATUS_OFF;
555}
556
557static const struct regulator_ops wm831x_alive_ldo_ops = {
558	.list_voltage = regulator_list_voltage_linear,
559	.map_voltage = regulator_map_voltage_linear,
560	.get_voltage_sel = regulator_get_voltage_sel_regmap,
561	.set_voltage_sel = regulator_set_voltage_sel_regmap,
562	.set_suspend_voltage = wm831x_alive_ldo_set_suspend_voltage,
563	.get_status = wm831x_alive_ldo_get_status,
564
565	.is_enabled = regulator_is_enabled_regmap,
566	.enable = regulator_enable_regmap,
567	.disable = regulator_disable_regmap,
568};
569
570static int wm831x_alive_ldo_probe(struct platform_device *pdev)
571{
572	struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
573	struct wm831x_pdata *pdata = dev_get_platdata(wm831x->dev);
574	struct regulator_config config = { };
575	int id;
576	struct wm831x_ldo *ldo;
577	struct resource *res;
578	int ret;
579
580	if (pdata && pdata->wm831x_num)
581		id = (pdata->wm831x_num * 10) + 1;
582	else
583		id = 0;
584	id = pdev->id - id;
585
586
587	dev_dbg(&pdev->dev, "Probing LDO%d\n", id + 1);
588
589	ldo = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ldo), GFP_KERNEL);
590	if (!ldo)
591		return -ENOMEM;
592
593	ldo->wm831x = wm831x;
594
595	res = platform_get_resource(pdev, IORESOURCE_REG, 0);
596	if (res == NULL) {
597		dev_err(&pdev->dev, "No REG resource\n");
598		ret = -EINVAL;
599		goto err;
600	}
601	ldo->base = res->start;
602
603	snprintf(ldo->name, sizeof(ldo->name), "LDO%d", id + 1);
604	ldo->desc.name = ldo->name;
605
606	snprintf(ldo->supply_name, sizeof(ldo->supply_name),
607		 "LDO%dVDD", id + 1);
608	ldo->desc.supply_name = ldo->supply_name;
609
610	ldo->desc.id = id;
611	ldo->desc.type = REGULATOR_VOLTAGE;
612	ldo->desc.n_voltages = WM831X_ALIVE_LDO_MAX_SELECTOR + 1;
613	ldo->desc.ops = &wm831x_alive_ldo_ops;
614	ldo->desc.owner = THIS_MODULE;
615	ldo->desc.vsel_reg = ldo->base + WM831X_ALIVE_LDO_ON_CONTROL;
616	ldo->desc.vsel_mask = WM831X_LDO11_ON_VSEL_MASK;
617	ldo->desc.enable_reg = WM831X_LDO_ENABLE;
618	ldo->desc.enable_mask = 1 << id;
619	ldo->desc.min_uV = 800000;
620	ldo->desc.uV_step = 50000;
621	ldo->desc.enable_time = 1000;
622
623	config.dev = pdev->dev.parent;
624	if (pdata)
625		config.init_data = pdata->ldo[id];
626	config.driver_data = ldo;
627	config.regmap = wm831x->regmap;
628
629	ldo->regulator = devm_regulator_register(&pdev->dev, &ldo->desc,
630						 &config);
631	if (IS_ERR(ldo->regulator)) {
632		ret = PTR_ERR(ldo->regulator);
633		dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
634			id + 1, ret);
635		goto err;
636	}
637
638	platform_set_drvdata(pdev, ldo);
639
640	return 0;
641
642err:
643	return ret;
644}
645
646static struct platform_driver wm831x_alive_ldo_driver = {
647	.probe = wm831x_alive_ldo_probe,
648	.driver		= {
649		.name	= "wm831x-alive-ldo",
 
650	},
651};
652
653static struct platform_driver * const drivers[] = {
654	&wm831x_gp_ldo_driver,
655	&wm831x_aldo_driver,
656	&wm831x_alive_ldo_driver,
657};
658
659static int __init wm831x_ldo_init(void)
660{
661	return platform_register_drivers(drivers, ARRAY_SIZE(drivers));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
662}
663subsys_initcall(wm831x_ldo_init);
664
665static void __exit wm831x_ldo_exit(void)
666{
667	platform_unregister_drivers(drivers, ARRAY_SIZE(drivers));
 
 
668}
669module_exit(wm831x_ldo_exit);
670
671/* Module information */
672MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
673MODULE_DESCRIPTION("WM831x LDO driver");
674MODULE_LICENSE("GPL");
675MODULE_ALIAS("platform:wm831x-ldo");
676MODULE_ALIAS("platform:wm831x-aldo");
677MODULE_ALIAS("platform:wm831x-aliveldo");
v3.15
  1/*
  2 * wm831x-ldo.c  --  LDO driver for the WM831x series
  3 *
  4 * Copyright 2009 Wolfson Microelectronics PLC.
  5 *
  6 * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
  7 *
  8 *  This program is free software; you can redistribute  it and/or modify it
  9 *  under  the terms of  the GNU General  Public License as published by the
 10 *  Free Software Foundation;  either version 2 of the  License, or (at your
 11 *  option) any later version.
 12 */
 13
 14#include <linux/module.h>
 15#include <linux/moduleparam.h>
 16#include <linux/init.h>
 17#include <linux/bitops.h>
 18#include <linux/err.h>
 19#include <linux/i2c.h>
 20#include <linux/platform_device.h>
 21#include <linux/regulator/driver.h>
 22#include <linux/slab.h>
 23
 24#include <linux/mfd/wm831x/core.h>
 25#include <linux/mfd/wm831x/regulator.h>
 26#include <linux/mfd/wm831x/pdata.h>
 27
 28#define WM831X_LDO_MAX_NAME 9
 29
 30#define WM831X_LDO_CONTROL       0
 31#define WM831X_LDO_ON_CONTROL    1
 32#define WM831X_LDO_SLEEP_CONTROL 2
 33
 34#define WM831X_ALIVE_LDO_ON_CONTROL    0
 35#define WM831X_ALIVE_LDO_SLEEP_CONTROL 1
 36
 37struct wm831x_ldo {
 38	char name[WM831X_LDO_MAX_NAME];
 39	char supply_name[WM831X_LDO_MAX_NAME];
 40	struct regulator_desc desc;
 41	int base;
 42	struct wm831x *wm831x;
 43	struct regulator_dev *regulator;
 44};
 45
 46/*
 47 * Shared
 48 */
 49
 50static irqreturn_t wm831x_ldo_uv_irq(int irq, void *data)
 51{
 52	struct wm831x_ldo *ldo = data;
 53
 
 54	regulator_notifier_call_chain(ldo->regulator,
 55				      REGULATOR_EVENT_UNDER_VOLTAGE,
 56				      NULL);
 
 57
 58	return IRQ_HANDLED;
 59}
 60
 61/*
 62 * General purpose LDOs
 63 */
 64
 65static const struct regulator_linear_range wm831x_gp_ldo_ranges[] = {
 66	REGULATOR_LINEAR_RANGE(900000, 0, 14, 50000),
 67	REGULATOR_LINEAR_RANGE(1700000, 15, 31, 100000),
 68};
 69
 70static int wm831x_gp_ldo_set_suspend_voltage(struct regulator_dev *rdev,
 71					     int uV)
 72{
 73	struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
 74	struct wm831x *wm831x = ldo->wm831x;
 75	int sel, reg = ldo->base + WM831X_LDO_SLEEP_CONTROL;
 76
 77	sel = regulator_map_voltage_linear_range(rdev, uV, uV);
 78	if (sel < 0)
 79		return sel;
 80
 81	return wm831x_set_bits(wm831x, reg, WM831X_LDO1_ON_VSEL_MASK, sel);
 82}
 83
 84static unsigned int wm831x_gp_ldo_get_mode(struct regulator_dev *rdev)
 85{
 86	struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
 87	struct wm831x *wm831x = ldo->wm831x;
 88	int ctrl_reg = ldo->base + WM831X_LDO_CONTROL;
 89	int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
 90	int ret;
 91
 92	ret = wm831x_reg_read(wm831x, on_reg);
 93	if (ret < 0)
 94		return ret;
 95
 96	if (!(ret & WM831X_LDO1_ON_MODE))
 97		return REGULATOR_MODE_NORMAL;
 98
 99	ret = wm831x_reg_read(wm831x, ctrl_reg);
100	if (ret < 0)
101		return ret;
102
103	if (ret & WM831X_LDO1_LP_MODE)
104		return REGULATOR_MODE_STANDBY;
105	else
106		return REGULATOR_MODE_IDLE;
107}
108
109static int wm831x_gp_ldo_set_mode(struct regulator_dev *rdev,
110				  unsigned int mode)
111{
112	struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
113	struct wm831x *wm831x = ldo->wm831x;
114	int ctrl_reg = ldo->base + WM831X_LDO_CONTROL;
115	int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
116	int ret;
117
118
119	switch (mode) {
120	case REGULATOR_MODE_NORMAL:
121		ret = wm831x_set_bits(wm831x, on_reg,
122				      WM831X_LDO1_ON_MODE, 0);
123		if (ret < 0)
124			return ret;
125		break;
126
127	case REGULATOR_MODE_IDLE:
128		ret = wm831x_set_bits(wm831x, ctrl_reg,
129				      WM831X_LDO1_LP_MODE, 0);
130		if (ret < 0)
131			return ret;
132
133		ret = wm831x_set_bits(wm831x, on_reg,
134				      WM831X_LDO1_ON_MODE,
135				      WM831X_LDO1_ON_MODE);
136		if (ret < 0)
137			return ret;
138		break;
139
140	case REGULATOR_MODE_STANDBY:
141		ret = wm831x_set_bits(wm831x, ctrl_reg,
142				      WM831X_LDO1_LP_MODE,
143				      WM831X_LDO1_LP_MODE);
144		if (ret < 0)
145			return ret;
146
147		ret = wm831x_set_bits(wm831x, on_reg,
148				      WM831X_LDO1_ON_MODE,
149				      WM831X_LDO1_ON_MODE);
150		if (ret < 0)
151			return ret;
152		break;
153
154	default:
155		return -EINVAL;
156	}
157
158	return 0;
159}
160
161static int wm831x_gp_ldo_get_status(struct regulator_dev *rdev)
162{
163	struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
164	struct wm831x *wm831x = ldo->wm831x;
165	int mask = 1 << rdev_get_id(rdev);
166	int ret;
167
168	/* Is the regulator on? */
169	ret = wm831x_reg_read(wm831x, WM831X_LDO_STATUS);
170	if (ret < 0)
171		return ret;
172	if (!(ret & mask))
173		return REGULATOR_STATUS_OFF;
174
175	/* Is it reporting under voltage? */
176	ret = wm831x_reg_read(wm831x, WM831X_LDO_UV_STATUS);
177	if (ret < 0)
178		return ret;
179	if (ret & mask)
180		return REGULATOR_STATUS_ERROR;
181
182	ret = wm831x_gp_ldo_get_mode(rdev);
183	if (ret < 0)
184		return ret;
185	else
186		return regulator_mode_to_status(ret);
187}
188
189static unsigned int wm831x_gp_ldo_get_optimum_mode(struct regulator_dev *rdev,
190						   int input_uV,
191						   int output_uV, int load_uA)
192{
193	if (load_uA < 20000)
194		return REGULATOR_MODE_STANDBY;
195	if (load_uA < 50000)
196		return REGULATOR_MODE_IDLE;
197	return REGULATOR_MODE_NORMAL;
198}
199
200
201static struct regulator_ops wm831x_gp_ldo_ops = {
202	.list_voltage = regulator_list_voltage_linear_range,
203	.map_voltage = regulator_map_voltage_linear_range,
204	.get_voltage_sel = regulator_get_voltage_sel_regmap,
205	.set_voltage_sel = regulator_set_voltage_sel_regmap,
206	.set_suspend_voltage = wm831x_gp_ldo_set_suspend_voltage,
207	.get_mode = wm831x_gp_ldo_get_mode,
208	.set_mode = wm831x_gp_ldo_set_mode,
209	.get_status = wm831x_gp_ldo_get_status,
210	.get_optimum_mode = wm831x_gp_ldo_get_optimum_mode,
211	.get_bypass = regulator_get_bypass_regmap,
212	.set_bypass = regulator_set_bypass_regmap,
213
214	.is_enabled = regulator_is_enabled_regmap,
215	.enable = regulator_enable_regmap,
216	.disable = regulator_disable_regmap,
217};
218
219static int wm831x_gp_ldo_probe(struct platform_device *pdev)
220{
221	struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
222	struct wm831x_pdata *pdata = dev_get_platdata(wm831x->dev);
223	struct regulator_config config = { };
224	int id;
225	struct wm831x_ldo *ldo;
226	struct resource *res;
227	int ret, irq;
228
229	if (pdata && pdata->wm831x_num)
230		id = (pdata->wm831x_num * 10) + 1;
231	else
232		id = 0;
233	id = pdev->id - id;
234
235	dev_dbg(&pdev->dev, "Probing LDO%d\n", id + 1);
236
237	ldo = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ldo), GFP_KERNEL);
238	if (!ldo)
239		return -ENOMEM;
240
241	ldo->wm831x = wm831x;
242
243	res = platform_get_resource(pdev, IORESOURCE_REG, 0);
244	if (res == NULL) {
245		dev_err(&pdev->dev, "No REG resource\n");
246		ret = -EINVAL;
247		goto err;
248	}
249	ldo->base = res->start;
250
251	snprintf(ldo->name, sizeof(ldo->name), "LDO%d", id + 1);
252	ldo->desc.name = ldo->name;
253
254	snprintf(ldo->supply_name, sizeof(ldo->supply_name),
255		 "LDO%dVDD", id + 1);
256	ldo->desc.supply_name = ldo->supply_name;
257
258	ldo->desc.id = id;
259	ldo->desc.type = REGULATOR_VOLTAGE;
260	ldo->desc.n_voltages = 32;
261	ldo->desc.ops = &wm831x_gp_ldo_ops;
262	ldo->desc.owner = THIS_MODULE;
263	ldo->desc.vsel_reg = ldo->base + WM831X_LDO_ON_CONTROL;
264	ldo->desc.vsel_mask = WM831X_LDO1_ON_VSEL_MASK;
265	ldo->desc.enable_reg = WM831X_LDO_ENABLE;
266	ldo->desc.enable_mask = 1 << id;
267	ldo->desc.bypass_reg = ldo->base;
268	ldo->desc.bypass_mask = WM831X_LDO1_SWI;
269	ldo->desc.linear_ranges = wm831x_gp_ldo_ranges;
270	ldo->desc.n_linear_ranges = ARRAY_SIZE(wm831x_gp_ldo_ranges);
271
272	config.dev = pdev->dev.parent;
273	if (pdata)
274		config.init_data = pdata->ldo[id];
275	config.driver_data = ldo;
276	config.regmap = wm831x->regmap;
277
278	ldo->regulator = devm_regulator_register(&pdev->dev, &ldo->desc,
279						 &config);
280	if (IS_ERR(ldo->regulator)) {
281		ret = PTR_ERR(ldo->regulator);
282		dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
283			id + 1, ret);
284		goto err;
285	}
286
287	irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV"));
288	ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
289					wm831x_ldo_uv_irq,
290					IRQF_TRIGGER_RISING, ldo->name,
 
291					ldo);
292	if (ret != 0) {
293		dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
294			irq, ret);
295		goto err;
296	}
297
298	platform_set_drvdata(pdev, ldo);
299
300	return 0;
301
302err:
303	return ret;
304}
305
306static struct platform_driver wm831x_gp_ldo_driver = {
307	.probe = wm831x_gp_ldo_probe,
308	.driver		= {
309		.name	= "wm831x-ldo",
310		.owner	= THIS_MODULE,
311	},
312};
313
314/*
315 * Analogue LDOs
316 */
317
318static const struct regulator_linear_range wm831x_aldo_ranges[] = {
319	REGULATOR_LINEAR_RANGE(1000000, 0, 12, 50000),
320	REGULATOR_LINEAR_RANGE(1700000, 13, 31, 100000),
321};
322
323static int wm831x_aldo_set_suspend_voltage(struct regulator_dev *rdev,
324					     int uV)
325{
326	struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
327	struct wm831x *wm831x = ldo->wm831x;
328	int sel, reg = ldo->base + WM831X_LDO_SLEEP_CONTROL;
329
330	sel = regulator_map_voltage_linear_range(rdev, uV, uV);
331	if (sel < 0)
332		return sel;
333
334	return wm831x_set_bits(wm831x, reg, WM831X_LDO7_ON_VSEL_MASK, sel);
335}
336
337static unsigned int wm831x_aldo_get_mode(struct regulator_dev *rdev)
338{
339	struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
340	struct wm831x *wm831x = ldo->wm831x;
341	int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
342	int ret;
343
344	ret = wm831x_reg_read(wm831x, on_reg);
345	if (ret < 0)
346		return 0;
347
348	if (ret & WM831X_LDO7_ON_MODE)
349		return REGULATOR_MODE_IDLE;
350	else
351		return REGULATOR_MODE_NORMAL;
352}
353
354static int wm831x_aldo_set_mode(struct regulator_dev *rdev,
355				  unsigned int mode)
356{
357	struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
358	struct wm831x *wm831x = ldo->wm831x;
359	int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
360	int ret;
361
362
363	switch (mode) {
364	case REGULATOR_MODE_NORMAL:
365		ret = wm831x_set_bits(wm831x, on_reg, WM831X_LDO7_ON_MODE, 0);
366		if (ret < 0)
367			return ret;
368		break;
369
370	case REGULATOR_MODE_IDLE:
371		ret = wm831x_set_bits(wm831x, on_reg, WM831X_LDO7_ON_MODE,
372				      WM831X_LDO7_ON_MODE);
373		if (ret < 0)
374			return ret;
375		break;
376
377	default:
378		return -EINVAL;
379	}
380
381	return 0;
382}
383
384static int wm831x_aldo_get_status(struct regulator_dev *rdev)
385{
386	struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
387	struct wm831x *wm831x = ldo->wm831x;
388	int mask = 1 << rdev_get_id(rdev);
389	int ret;
390
391	/* Is the regulator on? */
392	ret = wm831x_reg_read(wm831x, WM831X_LDO_STATUS);
393	if (ret < 0)
394		return ret;
395	if (!(ret & mask))
396		return REGULATOR_STATUS_OFF;
397
398	/* Is it reporting under voltage? */
399	ret = wm831x_reg_read(wm831x, WM831X_LDO_UV_STATUS);
400	if (ret < 0)
401		return ret;
402	if (ret & mask)
403		return REGULATOR_STATUS_ERROR;
404
405	ret = wm831x_aldo_get_mode(rdev);
406	if (ret < 0)
407		return ret;
408	else
409		return regulator_mode_to_status(ret);
410}
411
412static struct regulator_ops wm831x_aldo_ops = {
413	.list_voltage = regulator_list_voltage_linear_range,
414	.map_voltage = regulator_map_voltage_linear_range,
415	.get_voltage_sel = regulator_get_voltage_sel_regmap,
416	.set_voltage_sel = regulator_set_voltage_sel_regmap,
417	.set_suspend_voltage = wm831x_aldo_set_suspend_voltage,
418	.get_mode = wm831x_aldo_get_mode,
419	.set_mode = wm831x_aldo_set_mode,
420	.get_status = wm831x_aldo_get_status,
421	.set_bypass = regulator_set_bypass_regmap,
422	.get_bypass = regulator_get_bypass_regmap,
423
424	.is_enabled = regulator_is_enabled_regmap,
425	.enable = regulator_enable_regmap,
426	.disable = regulator_disable_regmap,
427};
428
429static int wm831x_aldo_probe(struct platform_device *pdev)
430{
431	struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
432	struct wm831x_pdata *pdata = dev_get_platdata(wm831x->dev);
433	struct regulator_config config = { };
434	int id;
435	struct wm831x_ldo *ldo;
436	struct resource *res;
437	int ret, irq;
438
439	if (pdata && pdata->wm831x_num)
440		id = (pdata->wm831x_num * 10) + 1;
441	else
442		id = 0;
443	id = pdev->id - id;
444
445	dev_dbg(&pdev->dev, "Probing LDO%d\n", id + 1);
446
447	ldo = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ldo), GFP_KERNEL);
448	if (!ldo)
449		return -ENOMEM;
450
451	ldo->wm831x = wm831x;
452
453	res = platform_get_resource(pdev, IORESOURCE_REG, 0);
454	if (res == NULL) {
455		dev_err(&pdev->dev, "No REG resource\n");
456		ret = -EINVAL;
457		goto err;
458	}
459	ldo->base = res->start;
460
461	snprintf(ldo->name, sizeof(ldo->name), "LDO%d", id + 1);
462	ldo->desc.name = ldo->name;
463
464	snprintf(ldo->supply_name, sizeof(ldo->supply_name),
465		 "LDO%dVDD", id + 1);
466	ldo->desc.supply_name = ldo->supply_name;
467
468	ldo->desc.id = id;
469	ldo->desc.type = REGULATOR_VOLTAGE;
470	ldo->desc.n_voltages = 32;
471	ldo->desc.linear_ranges = wm831x_aldo_ranges;
472	ldo->desc.n_linear_ranges = ARRAY_SIZE(wm831x_aldo_ranges);
473	ldo->desc.ops = &wm831x_aldo_ops;
474	ldo->desc.owner = THIS_MODULE;
475	ldo->desc.vsel_reg = ldo->base + WM831X_LDO_ON_CONTROL;
476	ldo->desc.vsel_mask = WM831X_LDO7_ON_VSEL_MASK;
477	ldo->desc.enable_reg = WM831X_LDO_ENABLE;
478	ldo->desc.enable_mask = 1 << id;
479	ldo->desc.bypass_reg = ldo->base;
480	ldo->desc.bypass_mask = WM831X_LDO7_SWI;
481
482	config.dev = pdev->dev.parent;
483	if (pdata)
484		config.init_data = pdata->ldo[id];
485	config.driver_data = ldo;
486	config.regmap = wm831x->regmap;
487
488	ldo->regulator = devm_regulator_register(&pdev->dev, &ldo->desc,
489						 &config);
490	if (IS_ERR(ldo->regulator)) {
491		ret = PTR_ERR(ldo->regulator);
492		dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
493			id + 1, ret);
494		goto err;
495	}
496
497	irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV"));
498	ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
499					wm831x_ldo_uv_irq,
500					IRQF_TRIGGER_RISING, ldo->name, ldo);
 
501	if (ret != 0) {
502		dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
503			irq, ret);
504		goto err;
505	}
506
507	platform_set_drvdata(pdev, ldo);
508
509	return 0;
510
511err:
512	return ret;
513}
514
515static struct platform_driver wm831x_aldo_driver = {
516	.probe = wm831x_aldo_probe,
517	.driver		= {
518		.name	= "wm831x-aldo",
519		.owner	= THIS_MODULE,
520	},
521};
522
523/*
524 * Alive LDO
525 */
526
527#define WM831X_ALIVE_LDO_MAX_SELECTOR 0xf
528
529static int wm831x_alive_ldo_set_suspend_voltage(struct regulator_dev *rdev,
530					     int uV)
531{
532	struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
533	struct wm831x *wm831x = ldo->wm831x;
534	int sel, reg = ldo->base + WM831X_ALIVE_LDO_SLEEP_CONTROL;
535
536	sel = regulator_map_voltage_linear(rdev, uV, uV);
537	if (sel < 0)
538		return sel;
539
540	return wm831x_set_bits(wm831x, reg, WM831X_LDO11_ON_VSEL_MASK, sel);
541}
542
543static int wm831x_alive_ldo_get_status(struct regulator_dev *rdev)
544{
545	struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
546	struct wm831x *wm831x = ldo->wm831x;
547	int mask = 1 << rdev_get_id(rdev);
548	int ret;
549
550	/* Is the regulator on? */
551	ret = wm831x_reg_read(wm831x, WM831X_LDO_STATUS);
552	if (ret < 0)
553		return ret;
554	if (ret & mask)
555		return REGULATOR_STATUS_ON;
556	else
557		return REGULATOR_STATUS_OFF;
558}
559
560static struct regulator_ops wm831x_alive_ldo_ops = {
561	.list_voltage = regulator_list_voltage_linear,
562	.map_voltage = regulator_map_voltage_linear,
563	.get_voltage_sel = regulator_get_voltage_sel_regmap,
564	.set_voltage_sel = regulator_set_voltage_sel_regmap,
565	.set_suspend_voltage = wm831x_alive_ldo_set_suspend_voltage,
566	.get_status = wm831x_alive_ldo_get_status,
567
568	.is_enabled = regulator_is_enabled_regmap,
569	.enable = regulator_enable_regmap,
570	.disable = regulator_disable_regmap,
571};
572
573static int wm831x_alive_ldo_probe(struct platform_device *pdev)
574{
575	struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
576	struct wm831x_pdata *pdata = dev_get_platdata(wm831x->dev);
577	struct regulator_config config = { };
578	int id;
579	struct wm831x_ldo *ldo;
580	struct resource *res;
581	int ret;
582
583	if (pdata && pdata->wm831x_num)
584		id = (pdata->wm831x_num * 10) + 1;
585	else
586		id = 0;
587	id = pdev->id - id;
588
589
590	dev_dbg(&pdev->dev, "Probing LDO%d\n", id + 1);
591
592	ldo = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ldo), GFP_KERNEL);
593	if (!ldo)
594		return -ENOMEM;
595
596	ldo->wm831x = wm831x;
597
598	res = platform_get_resource(pdev, IORESOURCE_REG, 0);
599	if (res == NULL) {
600		dev_err(&pdev->dev, "No REG resource\n");
601		ret = -EINVAL;
602		goto err;
603	}
604	ldo->base = res->start;
605
606	snprintf(ldo->name, sizeof(ldo->name), "LDO%d", id + 1);
607	ldo->desc.name = ldo->name;
608
609	snprintf(ldo->supply_name, sizeof(ldo->supply_name),
610		 "LDO%dVDD", id + 1);
611	ldo->desc.supply_name = ldo->supply_name;
612
613	ldo->desc.id = id;
614	ldo->desc.type = REGULATOR_VOLTAGE;
615	ldo->desc.n_voltages = WM831X_ALIVE_LDO_MAX_SELECTOR + 1;
616	ldo->desc.ops = &wm831x_alive_ldo_ops;
617	ldo->desc.owner = THIS_MODULE;
618	ldo->desc.vsel_reg = ldo->base + WM831X_ALIVE_LDO_ON_CONTROL;
619	ldo->desc.vsel_mask = WM831X_LDO11_ON_VSEL_MASK;
620	ldo->desc.enable_reg = WM831X_LDO_ENABLE;
621	ldo->desc.enable_mask = 1 << id;
622	ldo->desc.min_uV = 800000;
623	ldo->desc.uV_step = 50000;
624	ldo->desc.enable_time = 1000;
625
626	config.dev = pdev->dev.parent;
627	if (pdata)
628		config.init_data = pdata->ldo[id];
629	config.driver_data = ldo;
630	config.regmap = wm831x->regmap;
631
632	ldo->regulator = devm_regulator_register(&pdev->dev, &ldo->desc,
633						 &config);
634	if (IS_ERR(ldo->regulator)) {
635		ret = PTR_ERR(ldo->regulator);
636		dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
637			id + 1, ret);
638		goto err;
639	}
640
641	platform_set_drvdata(pdev, ldo);
642
643	return 0;
644
645err:
646	return ret;
647}
648
649static struct platform_driver wm831x_alive_ldo_driver = {
650	.probe = wm831x_alive_ldo_probe,
651	.driver		= {
652		.name	= "wm831x-alive-ldo",
653		.owner	= THIS_MODULE,
654	},
655};
656
 
 
 
 
 
 
657static int __init wm831x_ldo_init(void)
658{
659	int ret;
660
661	ret = platform_driver_register(&wm831x_gp_ldo_driver);
662	if (ret != 0)
663		pr_err("Failed to register WM831x GP LDO driver: %d\n", ret);
664
665	ret = platform_driver_register(&wm831x_aldo_driver);
666	if (ret != 0)
667		pr_err("Failed to register WM831x ALDO driver: %d\n", ret);
668
669	ret = platform_driver_register(&wm831x_alive_ldo_driver);
670	if (ret != 0)
671		pr_err("Failed to register WM831x alive LDO driver: %d\n",
672		       ret);
673
674	return 0;
675}
676subsys_initcall(wm831x_ldo_init);
677
678static void __exit wm831x_ldo_exit(void)
679{
680	platform_driver_unregister(&wm831x_alive_ldo_driver);
681	platform_driver_unregister(&wm831x_aldo_driver);
682	platform_driver_unregister(&wm831x_gp_ldo_driver);
683}
684module_exit(wm831x_ldo_exit);
685
686/* Module information */
687MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
688MODULE_DESCRIPTION("WM831x LDO driver");
689MODULE_LICENSE("GPL");
690MODULE_ALIAS("platform:wm831x-ldo");
691MODULE_ALIAS("platform:wm831x-aldo");
692MODULE_ALIAS("platform:wm831x-aliveldo");