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