cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

wm831x-ldo.c (16776B)


      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	},
    307};
    308
    309/*
    310 * Analogue LDOs
    311 */
    312
    313static const struct linear_range wm831x_aldo_ranges[] = {
    314	REGULATOR_LINEAR_RANGE(1000000, 0, 12, 50000),
    315	REGULATOR_LINEAR_RANGE(1700000, 13, 31, 100000),
    316};
    317
    318static int wm831x_aldo_set_suspend_voltage(struct regulator_dev *rdev,
    319					     int uV)
    320{
    321	struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
    322	struct wm831x *wm831x = ldo->wm831x;
    323	int sel, reg = ldo->base + WM831X_LDO_SLEEP_CONTROL;
    324
    325	sel = regulator_map_voltage_linear_range(rdev, uV, uV);
    326	if (sel < 0)
    327		return sel;
    328
    329	return wm831x_set_bits(wm831x, reg, WM831X_LDO7_ON_VSEL_MASK, sel);
    330}
    331
    332static unsigned int wm831x_aldo_get_mode(struct regulator_dev *rdev)
    333{
    334	struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
    335	struct wm831x *wm831x = ldo->wm831x;
    336	int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
    337	int ret;
    338
    339	ret = wm831x_reg_read(wm831x, on_reg);
    340	if (ret < 0)
    341		return 0;
    342
    343	if (ret & WM831X_LDO7_ON_MODE)
    344		return REGULATOR_MODE_IDLE;
    345	else
    346		return REGULATOR_MODE_NORMAL;
    347}
    348
    349static int wm831x_aldo_set_mode(struct regulator_dev *rdev,
    350				  unsigned int mode)
    351{
    352	struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
    353	struct wm831x *wm831x = ldo->wm831x;
    354	int on_reg = ldo->base + WM831X_LDO_ON_CONTROL;
    355	int ret;
    356
    357
    358	switch (mode) {
    359	case REGULATOR_MODE_NORMAL:
    360		ret = wm831x_set_bits(wm831x, on_reg, WM831X_LDO7_ON_MODE, 0);
    361		if (ret < 0)
    362			return ret;
    363		break;
    364
    365	case REGULATOR_MODE_IDLE:
    366		ret = wm831x_set_bits(wm831x, on_reg, WM831X_LDO7_ON_MODE,
    367				      WM831X_LDO7_ON_MODE);
    368		if (ret < 0)
    369			return ret;
    370		break;
    371
    372	default:
    373		return -EINVAL;
    374	}
    375
    376	return 0;
    377}
    378
    379static int wm831x_aldo_get_status(struct regulator_dev *rdev)
    380{
    381	struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
    382	struct wm831x *wm831x = ldo->wm831x;
    383	int mask = 1 << rdev_get_id(rdev);
    384	int ret;
    385
    386	/* Is the regulator on? */
    387	ret = wm831x_reg_read(wm831x, WM831X_LDO_STATUS);
    388	if (ret < 0)
    389		return ret;
    390	if (!(ret & mask))
    391		return REGULATOR_STATUS_OFF;
    392
    393	/* Is it reporting under voltage? */
    394	ret = wm831x_reg_read(wm831x, WM831X_LDO_UV_STATUS);
    395	if (ret < 0)
    396		return ret;
    397	if (ret & mask)
    398		return REGULATOR_STATUS_ERROR;
    399
    400	ret = wm831x_aldo_get_mode(rdev);
    401	if (ret < 0)
    402		return ret;
    403	else
    404		return regulator_mode_to_status(ret);
    405}
    406
    407static const struct regulator_ops wm831x_aldo_ops = {
    408	.list_voltage = regulator_list_voltage_linear_range,
    409	.map_voltage = regulator_map_voltage_linear_range,
    410	.get_voltage_sel = regulator_get_voltage_sel_regmap,
    411	.set_voltage_sel = regulator_set_voltage_sel_regmap,
    412	.set_suspend_voltage = wm831x_aldo_set_suspend_voltage,
    413	.get_mode = wm831x_aldo_get_mode,
    414	.set_mode = wm831x_aldo_set_mode,
    415	.get_status = wm831x_aldo_get_status,
    416	.set_bypass = regulator_set_bypass_regmap,
    417	.get_bypass = regulator_get_bypass_regmap,
    418
    419	.is_enabled = regulator_is_enabled_regmap,
    420	.enable = regulator_enable_regmap,
    421	.disable = regulator_disable_regmap,
    422};
    423
    424static int wm831x_aldo_probe(struct platform_device *pdev)
    425{
    426	struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
    427	struct wm831x_pdata *pdata = dev_get_platdata(wm831x->dev);
    428	struct regulator_config config = { };
    429	int id;
    430	struct wm831x_ldo *ldo;
    431	struct resource *res;
    432	int ret, irq;
    433
    434	if (pdata && pdata->wm831x_num)
    435		id = (pdata->wm831x_num * 10) + 1;
    436	else
    437		id = 0;
    438	id = pdev->id - id;
    439
    440	dev_dbg(&pdev->dev, "Probing LDO%d\n", id + 1);
    441
    442	ldo = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ldo), GFP_KERNEL);
    443	if (!ldo)
    444		return -ENOMEM;
    445
    446	ldo->wm831x = wm831x;
    447
    448	res = platform_get_resource(pdev, IORESOURCE_REG, 0);
    449	if (res == NULL) {
    450		dev_err(&pdev->dev, "No REG resource\n");
    451		ret = -EINVAL;
    452		goto err;
    453	}
    454	ldo->base = res->start;
    455
    456	snprintf(ldo->name, sizeof(ldo->name), "LDO%d", id + 1);
    457	ldo->desc.name = ldo->name;
    458
    459	snprintf(ldo->supply_name, sizeof(ldo->supply_name),
    460		 "LDO%dVDD", id + 1);
    461	ldo->desc.supply_name = ldo->supply_name;
    462
    463	ldo->desc.id = id;
    464	ldo->desc.type = REGULATOR_VOLTAGE;
    465	ldo->desc.n_voltages = 32;
    466	ldo->desc.linear_ranges = wm831x_aldo_ranges;
    467	ldo->desc.n_linear_ranges = ARRAY_SIZE(wm831x_aldo_ranges);
    468	ldo->desc.ops = &wm831x_aldo_ops;
    469	ldo->desc.owner = THIS_MODULE;
    470	ldo->desc.vsel_reg = ldo->base + WM831X_LDO_ON_CONTROL;
    471	ldo->desc.vsel_mask = WM831X_LDO7_ON_VSEL_MASK;
    472	ldo->desc.enable_reg = WM831X_LDO_ENABLE;
    473	ldo->desc.enable_mask = 1 << id;
    474	ldo->desc.bypass_reg = ldo->base;
    475	ldo->desc.bypass_mask = WM831X_LDO7_SWI;
    476
    477	config.dev = pdev->dev.parent;
    478	if (pdata)
    479		config.init_data = pdata->ldo[id];
    480	config.driver_data = ldo;
    481	config.regmap = wm831x->regmap;
    482
    483	ldo->regulator = devm_regulator_register(&pdev->dev, &ldo->desc,
    484						 &config);
    485	if (IS_ERR(ldo->regulator)) {
    486		ret = PTR_ERR(ldo->regulator);
    487		dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
    488			id + 1, ret);
    489		goto err;
    490	}
    491
    492	irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV"));
    493	ret = devm_request_threaded_irq(&pdev->dev, irq, NULL,
    494					wm831x_ldo_uv_irq,
    495					IRQF_TRIGGER_RISING | IRQF_ONESHOT,
    496					ldo->name, ldo);
    497	if (ret != 0) {
    498		dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
    499			irq, ret);
    500		goto err;
    501	}
    502
    503	platform_set_drvdata(pdev, ldo);
    504
    505	return 0;
    506
    507err:
    508	return ret;
    509}
    510
    511static struct platform_driver wm831x_aldo_driver = {
    512	.probe = wm831x_aldo_probe,
    513	.driver		= {
    514		.name	= "wm831x-aldo",
    515	},
    516};
    517
    518/*
    519 * Alive LDO
    520 */
    521
    522#define WM831X_ALIVE_LDO_MAX_SELECTOR 0xf
    523
    524static int wm831x_alive_ldo_set_suspend_voltage(struct regulator_dev *rdev,
    525					     int uV)
    526{
    527	struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
    528	struct wm831x *wm831x = ldo->wm831x;
    529	int sel, reg = ldo->base + WM831X_ALIVE_LDO_SLEEP_CONTROL;
    530
    531	sel = regulator_map_voltage_linear(rdev, uV, uV);
    532	if (sel < 0)
    533		return sel;
    534
    535	return wm831x_set_bits(wm831x, reg, WM831X_LDO11_ON_VSEL_MASK, sel);
    536}
    537
    538static int wm831x_alive_ldo_get_status(struct regulator_dev *rdev)
    539{
    540	struct wm831x_ldo *ldo = rdev_get_drvdata(rdev);
    541	struct wm831x *wm831x = ldo->wm831x;
    542	int mask = 1 << rdev_get_id(rdev);
    543	int ret;
    544
    545	/* Is the regulator on? */
    546	ret = wm831x_reg_read(wm831x, WM831X_LDO_STATUS);
    547	if (ret < 0)
    548		return ret;
    549	if (ret & mask)
    550		return REGULATOR_STATUS_ON;
    551	else
    552		return REGULATOR_STATUS_OFF;
    553}
    554
    555static const struct regulator_ops wm831x_alive_ldo_ops = {
    556	.list_voltage = regulator_list_voltage_linear,
    557	.map_voltage = regulator_map_voltage_linear,
    558	.get_voltage_sel = regulator_get_voltage_sel_regmap,
    559	.set_voltage_sel = regulator_set_voltage_sel_regmap,
    560	.set_suspend_voltage = wm831x_alive_ldo_set_suspend_voltage,
    561	.get_status = wm831x_alive_ldo_get_status,
    562
    563	.is_enabled = regulator_is_enabled_regmap,
    564	.enable = regulator_enable_regmap,
    565	.disable = regulator_disable_regmap,
    566};
    567
    568static int wm831x_alive_ldo_probe(struct platform_device *pdev)
    569{
    570	struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
    571	struct wm831x_pdata *pdata = dev_get_platdata(wm831x->dev);
    572	struct regulator_config config = { };
    573	int id;
    574	struct wm831x_ldo *ldo;
    575	struct resource *res;
    576	int ret;
    577
    578	if (pdata && pdata->wm831x_num)
    579		id = (pdata->wm831x_num * 10) + 1;
    580	else
    581		id = 0;
    582	id = pdev->id - id;
    583
    584
    585	dev_dbg(&pdev->dev, "Probing LDO%d\n", id + 1);
    586
    587	ldo = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_ldo), GFP_KERNEL);
    588	if (!ldo)
    589		return -ENOMEM;
    590
    591	ldo->wm831x = wm831x;
    592
    593	res = platform_get_resource(pdev, IORESOURCE_REG, 0);
    594	if (res == NULL) {
    595		dev_err(&pdev->dev, "No REG resource\n");
    596		ret = -EINVAL;
    597		goto err;
    598	}
    599	ldo->base = res->start;
    600
    601	snprintf(ldo->name, sizeof(ldo->name), "LDO%d", id + 1);
    602	ldo->desc.name = ldo->name;
    603
    604	snprintf(ldo->supply_name, sizeof(ldo->supply_name),
    605		 "LDO%dVDD", id + 1);
    606	ldo->desc.supply_name = ldo->supply_name;
    607
    608	ldo->desc.id = id;
    609	ldo->desc.type = REGULATOR_VOLTAGE;
    610	ldo->desc.n_voltages = WM831X_ALIVE_LDO_MAX_SELECTOR + 1;
    611	ldo->desc.ops = &wm831x_alive_ldo_ops;
    612	ldo->desc.owner = THIS_MODULE;
    613	ldo->desc.vsel_reg = ldo->base + WM831X_ALIVE_LDO_ON_CONTROL;
    614	ldo->desc.vsel_mask = WM831X_LDO11_ON_VSEL_MASK;
    615	ldo->desc.enable_reg = WM831X_LDO_ENABLE;
    616	ldo->desc.enable_mask = 1 << id;
    617	ldo->desc.min_uV = 800000;
    618	ldo->desc.uV_step = 50000;
    619	ldo->desc.enable_time = 1000;
    620
    621	config.dev = pdev->dev.parent;
    622	if (pdata)
    623		config.init_data = pdata->ldo[id];
    624	config.driver_data = ldo;
    625	config.regmap = wm831x->regmap;
    626
    627	ldo->regulator = devm_regulator_register(&pdev->dev, &ldo->desc,
    628						 &config);
    629	if (IS_ERR(ldo->regulator)) {
    630		ret = PTR_ERR(ldo->regulator);
    631		dev_err(wm831x->dev, "Failed to register LDO%d: %d\n",
    632			id + 1, ret);
    633		goto err;
    634	}
    635
    636	platform_set_drvdata(pdev, ldo);
    637
    638	return 0;
    639
    640err:
    641	return ret;
    642}
    643
    644static struct platform_driver wm831x_alive_ldo_driver = {
    645	.probe = wm831x_alive_ldo_probe,
    646	.driver		= {
    647		.name	= "wm831x-alive-ldo",
    648	},
    649};
    650
    651static struct platform_driver * const drivers[] = {
    652	&wm831x_gp_ldo_driver,
    653	&wm831x_aldo_driver,
    654	&wm831x_alive_ldo_driver,
    655};
    656
    657static int __init wm831x_ldo_init(void)
    658{
    659	return platform_register_drivers(drivers, ARRAY_SIZE(drivers));
    660}
    661subsys_initcall(wm831x_ldo_init);
    662
    663static void __exit wm831x_ldo_exit(void)
    664{
    665	platform_unregister_drivers(drivers, ARRAY_SIZE(drivers));
    666}
    667module_exit(wm831x_ldo_exit);
    668
    669/* Module information */
    670MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
    671MODULE_DESCRIPTION("WM831x LDO driver");
    672MODULE_LICENSE("GPL");
    673MODULE_ALIAS("platform:wm831x-ldo");
    674MODULE_ALIAS("platform:wm831x-aldo");
    675MODULE_ALIAS("platform:wm831x-aliveldo");