Linux Audio

Check our new training course

Loading...
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");
v6.13.7
  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_notifier_call_chain(ldo->regulator,
 50				      REGULATOR_EVENT_UNDER_VOLTAGE,
 51				      NULL);
 52
 53	return IRQ_HANDLED;
 54}
 55
 56/*
 57 * General purpose LDOs
 58 */
 59
 60static const struct linear_range wm831x_gp_ldo_ranges[] = {
 61	REGULATOR_LINEAR_RANGE(900000, 0, 14, 50000),
 62	REGULATOR_LINEAR_RANGE(1700000, 15, 31, 100000),
 63};
 64
 65static int wm831x_gp_ldo_set_suspend_voltage(struct regulator_dev *rdev,
 66					     int uV)
 67{
 68	struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
 69	struct wm831x *wm831x = ldo->wm831x;
 70	int sel, reg = ldo->base + WM831X_LDO_SLEEP_CONTROL;
 71
 72	sel = regulator_map_voltage_linear_range(rdev, uV, uV);
 73	if (sel < 0)
 74		return sel;
 75
 76	return wm831x_set_bits(wm831x, reg, WM831X_LDO1_ON_VSEL_MASK, sel);
 77}
 78
 79static unsigned int wm831x_gp_ldo_get_mode(struct regulator_dev *rdev)
 80{
 81	struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
 82	struct wm831x *wm831x = ldo->wm831x;
 83	int ctrl_reg = ldo->base + WM831X_LDO_CONTROL;
 84	int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
 85	int ret;
 86
 87	ret = wm831x_reg_read(wm831x, on_reg);
 88	if (ret < 0)
 89		return ret;
 90
 91	if (!(ret & WM831X_LDO1_ON_MODE))
 92		return REGULATOR_MODE_NORMAL;
 93
 94	ret = wm831x_reg_read(wm831x, ctrl_reg);
 95	if (ret < 0)
 96		return ret;
 97
 98	if (ret & WM831X_LDO1_LP_MODE)
 99		return REGULATOR_MODE_STANDBY;
100	else
101		return REGULATOR_MODE_IDLE;
102}
103
104static int wm831x_gp_ldo_set_mode(struct regulator_dev *rdev,
105				  unsigned int mode)
106{
107	struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
108	struct wm831x *wm831x = ldo->wm831x;
109	int ctrl_reg = ldo->base + WM831X_LDO_CONTROL;
110	int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
111	int ret;
112
113
114	switch (mode) {
115	case REGULATOR_MODE_NORMAL:
116		ret = wm831x_set_bits(wm831x, on_reg,
117				      WM831X_LDO1_ON_MODE, 0);
118		if (ret < 0)
119			return ret;
120		break;
121
122	case REGULATOR_MODE_IDLE:
123		ret = wm831x_set_bits(wm831x, ctrl_reg,
124				      WM831X_LDO1_LP_MODE, 0);
125		if (ret < 0)
126			return ret;
127
128		ret = wm831x_set_bits(wm831x, on_reg,
129				      WM831X_LDO1_ON_MODE,
130				      WM831X_LDO1_ON_MODE);
131		if (ret < 0)
132			return ret;
133		break;
134
135	case REGULATOR_MODE_STANDBY:
136		ret = wm831x_set_bits(wm831x, ctrl_reg,
137				      WM831X_LDO1_LP_MODE,
138				      WM831X_LDO1_LP_MODE);
139		if (ret < 0)
140			return ret;
141
142		ret = wm831x_set_bits(wm831x, on_reg,
143				      WM831X_LDO1_ON_MODE,
144				      WM831X_LDO1_ON_MODE);
145		if (ret < 0)
146			return ret;
147		break;
148
149	default:
150		return -EINVAL;
151	}
152
153	return 0;
154}
155
156static int wm831x_gp_ldo_get_status(struct regulator_dev *rdev)
157{
158	struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
159	struct wm831x *wm831x = ldo->wm831x;
160	int mask = 1 << rdev_get_id(rdev);
161	int ret;
162
163	/* Is the regulator on? */
164	ret = wm831x_reg_read(wm831x, WM831X_LDO_STATUS);
165	if (ret < 0)
166		return ret;
167	if (!(ret & mask))
168		return REGULATOR_STATUS_OFF;
169
170	/* Is it reporting under voltage? */
171	ret = wm831x_reg_read(wm831x, WM831X_LDO_UV_STATUS);
172	if (ret < 0)
173		return ret;
174	if (ret & mask)
175		return REGULATOR_STATUS_ERROR;
176
177	ret = wm831x_gp_ldo_get_mode(rdev);
178	if (ret < 0)
179		return ret;
180	else
181		return regulator_mode_to_status(ret);
182}
183
184static unsigned int wm831x_gp_ldo_get_optimum_mode(struct regulator_dev *rdev,
185						   int input_uV,
186						   int output_uV, int load_uA)
187{
188	if (load_uA < 20000)
189		return REGULATOR_MODE_STANDBY;
190	if (load_uA < 50000)
191		return REGULATOR_MODE_IDLE;
192	return REGULATOR_MODE_NORMAL;
193}
194
195
196static const struct regulator_ops wm831x_gp_ldo_ops = {
197	.list_voltage = regulator_list_voltage_linear_range,
198	.map_voltage = regulator_map_voltage_linear_range,
199	.get_voltage_sel = regulator_get_voltage_sel_regmap,
200	.set_voltage_sel = regulator_set_voltage_sel_regmap,
201	.set_suspend_voltage = wm831x_gp_ldo_set_suspend_voltage,
202	.get_mode = wm831x_gp_ldo_get_mode,
203	.set_mode = wm831x_gp_ldo_set_mode,
204	.get_status = wm831x_gp_ldo_get_status,
205	.get_optimum_mode = wm831x_gp_ldo_get_optimum_mode,
206	.get_bypass = regulator_get_bypass_regmap,
207	.set_bypass = regulator_set_bypass_regmap,
208
209	.is_enabled = regulator_is_enabled_regmap,
210	.enable = regulator_enable_regmap,
211	.disable = regulator_disable_regmap,
212};
213
214static int wm831x_gp_ldo_probe(struct platform_device *pdev)
215{
216	struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
217	struct wm831x_pdata *pdata = dev_get_platdata(wm831x->dev);
218	struct regulator_config config = { };
219	int id;
220	struct wm831x_ldo *ldo;
221	struct resource *res;
222	int ret, irq;
223
224	if (pdata && pdata->wm831x_num)
225		id = (pdata->wm831x_num * 10) + 1;
226	else
227		id = 0;
228	id = pdev->id - id;
229
230	dev_dbg(&pdev->dev, "Probing LDO%d\n", id + 1);
231
232	ldo = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ldo), GFP_KERNEL);
233	if (!ldo)
234		return -ENOMEM;
235
236	ldo->wm831x = wm831x;
237
238	res = platform_get_resource(pdev, IORESOURCE_REG, 0);
239	if (res == NULL) {
240		dev_err(&pdev->dev, "No REG resource\n");
241		ret = -EINVAL;
242		goto err;
243	}
244	ldo->base = res->start;
245
246	snprintf(ldo->name, sizeof(ldo->name), "LDO%d", id + 1);
247	ldo->desc.name = ldo->name;
248
249	snprintf(ldo->supply_name, sizeof(ldo->supply_name),
250		 "LDO%dVDD", id + 1);
251	ldo->desc.supply_name = ldo->supply_name;
252
253	ldo->desc.id = id;
254	ldo->desc.type = REGULATOR_VOLTAGE;
255	ldo->desc.n_voltages = 32;
256	ldo->desc.ops = &wm831x_gp_ldo_ops;
257	ldo->desc.owner = THIS_MODULE;
258	ldo->desc.vsel_reg = ldo->base + WM831X_LDO_ON_CONTROL;
259	ldo->desc.vsel_mask = WM831X_LDO1_ON_VSEL_MASK;
260	ldo->desc.enable_reg = WM831X_LDO_ENABLE;
261	ldo->desc.enable_mask = 1 << id;
262	ldo->desc.bypass_reg = ldo->base;
263	ldo->desc.bypass_mask = WM831X_LDO1_SWI;
264	ldo->desc.linear_ranges = wm831x_gp_ldo_ranges;
265	ldo->desc.n_linear_ranges = ARRAY_SIZE(wm831x_gp_ldo_ranges);
266
267	config.dev = pdev->dev.parent;
268	if (pdata)
269		config.init_data = pdata->ldo[id];
270	config.driver_data = ldo;
271	config.regmap = wm831x->regmap;
272
273	ldo->regulator = devm_regulator_register(&pdev->dev, &ldo->desc,
274						 &config);
275	if (IS_ERR(ldo->regulator)) {
276		ret = PTR_ERR(ldo->regulator);
277		dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
278			id + 1, ret);
279		goto err;
280	}
281
282	irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV"));
283	ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
284					wm831x_ldo_uv_irq,
285					IRQF_TRIGGER_RISING | IRQF_ONESHOT,
286					ldo->name,
287					ldo);
288	if (ret != 0) {
289		dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
290			irq, ret);
291		goto err;
292	}
293
294	platform_set_drvdata(pdev, ldo);
295
296	return 0;
297
298err:
299	return ret;
300}
301
302static struct platform_driver wm831x_gp_ldo_driver = {
303	.probe = wm831x_gp_ldo_probe,
304	.driver		= {
305		.name	= "wm831x-ldo",
306		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
307	},
308};
309
310/*
311 * Analogue LDOs
312 */
313
314static const struct linear_range wm831x_aldo_ranges[] = {
315	REGULATOR_LINEAR_RANGE(1000000, 0, 12, 50000),
316	REGULATOR_LINEAR_RANGE(1700000, 13, 31, 100000),
317};
318
319static int wm831x_aldo_set_suspend_voltage(struct regulator_dev *rdev,
320					     int uV)
321{
322	struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
323	struct wm831x *wm831x = ldo->wm831x;
324	int sel, reg = ldo->base + WM831X_LDO_SLEEP_CONTROL;
325
326	sel = regulator_map_voltage_linear_range(rdev, uV, uV);
327	if (sel < 0)
328		return sel;
329
330	return wm831x_set_bits(wm831x, reg, WM831X_LDO7_ON_VSEL_MASK, sel);
331}
332
333static unsigned int wm831x_aldo_get_mode(struct regulator_dev *rdev)
334{
335	struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
336	struct wm831x *wm831x = ldo->wm831x;
337	int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
338	int ret;
339
340	ret = wm831x_reg_read(wm831x, on_reg);
341	if (ret < 0)
342		return 0;
343
344	if (ret & WM831X_LDO7_ON_MODE)
345		return REGULATOR_MODE_IDLE;
346	else
347		return REGULATOR_MODE_NORMAL;
348}
349
350static int wm831x_aldo_set_mode(struct regulator_dev *rdev,
351				  unsigned int mode)
352{
353	struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
354	struct wm831x *wm831x = ldo->wm831x;
355	int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
356	int ret;
357
358
359	switch (mode) {
360	case REGULATOR_MODE_NORMAL:
361		ret = wm831x_set_bits(wm831x, on_reg, WM831X_LDO7_ON_MODE, 0);
362		if (ret < 0)
363			return ret;
364		break;
365
366	case REGULATOR_MODE_IDLE:
367		ret = wm831x_set_bits(wm831x, on_reg, WM831X_LDO7_ON_MODE,
368				      WM831X_LDO7_ON_MODE);
369		if (ret < 0)
370			return ret;
371		break;
372
373	default:
374		return -EINVAL;
375	}
376
377	return 0;
378}
379
380static int wm831x_aldo_get_status(struct regulator_dev *rdev)
381{
382	struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
383	struct wm831x *wm831x = ldo->wm831x;
384	int mask = 1 << rdev_get_id(rdev);
385	int ret;
386
387	/* Is the regulator on? */
388	ret = wm831x_reg_read(wm831x, WM831X_LDO_STATUS);
389	if (ret < 0)
390		return ret;
391	if (!(ret & mask))
392		return REGULATOR_STATUS_OFF;
393
394	/* Is it reporting under voltage? */
395	ret = wm831x_reg_read(wm831x, WM831X_LDO_UV_STATUS);
396	if (ret < 0)
397		return ret;
398	if (ret & mask)
399		return REGULATOR_STATUS_ERROR;
400
401	ret = wm831x_aldo_get_mode(rdev);
402	if (ret < 0)
403		return ret;
404	else
405		return regulator_mode_to_status(ret);
406}
407
408static const struct regulator_ops wm831x_aldo_ops = {
409	.list_voltage = regulator_list_voltage_linear_range,
410	.map_voltage = regulator_map_voltage_linear_range,
411	.get_voltage_sel = regulator_get_voltage_sel_regmap,
412	.set_voltage_sel = regulator_set_voltage_sel_regmap,
413	.set_suspend_voltage = wm831x_aldo_set_suspend_voltage,
414	.get_mode = wm831x_aldo_get_mode,
415	.set_mode = wm831x_aldo_set_mode,
416	.get_status = wm831x_aldo_get_status,
417	.set_bypass = regulator_set_bypass_regmap,
418	.get_bypass = regulator_get_bypass_regmap,
419
420	.is_enabled = regulator_is_enabled_regmap,
421	.enable = regulator_enable_regmap,
422	.disable = regulator_disable_regmap,
423};
424
425static int wm831x_aldo_probe(struct platform_device *pdev)
426{
427	struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
428	struct wm831x_pdata *pdata = dev_get_platdata(wm831x->dev);
429	struct regulator_config config = { };
430	int id;
431	struct wm831x_ldo *ldo;
432	struct resource *res;
433	int ret, irq;
434
435	if (pdata && pdata->wm831x_num)
436		id = (pdata->wm831x_num * 10) + 1;
437	else
438		id = 0;
439	id = pdev->id - id;
440
441	dev_dbg(&pdev->dev, "Probing LDO%d\n", id + 1);
442
443	ldo = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ldo), GFP_KERNEL);
444	if (!ldo)
445		return -ENOMEM;
446
447	ldo->wm831x = wm831x;
448
449	res = platform_get_resource(pdev, IORESOURCE_REG, 0);
450	if (res == NULL) {
451		dev_err(&pdev->dev, "No REG resource\n");
452		ret = -EINVAL;
453		goto err;
454	}
455	ldo->base = res->start;
456
457	snprintf(ldo->name, sizeof(ldo->name), "LDO%d", id + 1);
458	ldo->desc.name = ldo->name;
459
460	snprintf(ldo->supply_name, sizeof(ldo->supply_name),
461		 "LDO%dVDD", id + 1);
462	ldo->desc.supply_name = ldo->supply_name;
463
464	ldo->desc.id = id;
465	ldo->desc.type = REGULATOR_VOLTAGE;
466	ldo->desc.n_voltages = 32;
467	ldo->desc.linear_ranges = wm831x_aldo_ranges;
468	ldo->desc.n_linear_ranges = ARRAY_SIZE(wm831x_aldo_ranges);
469	ldo->desc.ops = &wm831x_aldo_ops;
470	ldo->desc.owner = THIS_MODULE;
471	ldo->desc.vsel_reg = ldo->base + WM831X_LDO_ON_CONTROL;
472	ldo->desc.vsel_mask = WM831X_LDO7_ON_VSEL_MASK;
473	ldo->desc.enable_reg = WM831X_LDO_ENABLE;
474	ldo->desc.enable_mask = 1 << id;
475	ldo->desc.bypass_reg = ldo->base;
476	ldo->desc.bypass_mask = WM831X_LDO7_SWI;
477
478	config.dev = pdev->dev.parent;
479	if (pdata)
480		config.init_data = pdata->ldo[id];
481	config.driver_data = ldo;
482	config.regmap = wm831x->regmap;
483
484	ldo->regulator = devm_regulator_register(&pdev->dev, &ldo->desc,
485						 &config);
486	if (IS_ERR(ldo->regulator)) {
487		ret = PTR_ERR(ldo->regulator);
488		dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
489			id + 1, ret);
490		goto err;
491	}
492
493	irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV"));
494	ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
495					wm831x_ldo_uv_irq,
496					IRQF_TRIGGER_RISING | IRQF_ONESHOT,
497					ldo->name, ldo);
498	if (ret != 0) {
499		dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
500			irq, ret);
501		goto err;
502	}
503
504	platform_set_drvdata(pdev, ldo);
505
506	return 0;
507
508err:
509	return ret;
510}
511
512static struct platform_driver wm831x_aldo_driver = {
513	.probe = wm831x_aldo_probe,
514	.driver		= {
515		.name	= "wm831x-aldo",
516		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
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		.probe_type = PROBE_PREFER_ASYNCHRONOUS,
651	},
652};
653
654static struct platform_driver * const drivers[] = {
655	&wm831x_gp_ldo_driver,
656	&wm831x_aldo_driver,
657	&wm831x_alive_ldo_driver,
658};
659
660static int __init wm831x_ldo_init(void)
661{
662	return platform_register_drivers(drivers, ARRAY_SIZE(drivers));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
663}
664subsys_initcall(wm831x_ldo_init);
665
666static void __exit wm831x_ldo_exit(void)
667{
668	platform_unregister_drivers(drivers, ARRAY_SIZE(drivers));
 
 
669}
670module_exit(wm831x_ldo_exit);
671
672/* Module information */
673MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
674MODULE_DESCRIPTION("WM831x LDO driver");
675MODULE_LICENSE("GPL");
676MODULE_ALIAS("platform:wm831x-ldo");
677MODULE_ALIAS("platform:wm831x-aldo");
678MODULE_ALIAS("platform:wm831x-aliveldo");