linux/drivers/regulator/wm831x-dcdc.c
<<
>>
Prefs
   1/*
   2 * wm831x-dcdc.c  --  DC-DC buck convertor 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/regulator/machine.h>
  23#include <linux/gpio.h>
  24#include <linux/slab.h>
  25
  26#include <linux/mfd/wm831x/core.h>
  27#include <linux/mfd/wm831x/regulator.h>
  28#include <linux/mfd/wm831x/pdata.h>
  29
  30#define WM831X_BUCKV_MAX_SELECTOR 0x68
  31#define WM831X_BUCKP_MAX_SELECTOR 0x66
  32
  33#define WM831X_DCDC_MODE_FAST    0
  34#define WM831X_DCDC_MODE_NORMAL  1
  35#define WM831X_DCDC_MODE_IDLE    2
  36#define WM831X_DCDC_MODE_STANDBY 3
  37
  38#define WM831X_DCDC_MAX_NAME 6
  39
  40/* Register offsets in control block */
  41#define WM831X_DCDC_CONTROL_1     0
  42#define WM831X_DCDC_CONTROL_2     1
  43#define WM831X_DCDC_ON_CONFIG     2
  44#define WM831X_DCDC_SLEEP_CONTROL 3
  45#define WM831X_DCDC_DVS_CONTROL   4
  46
  47/*
  48 * Shared
  49 */
  50
  51struct wm831x_dcdc {
  52        char name[WM831X_DCDC_MAX_NAME];
  53        struct regulator_desc desc;
  54        int base;
  55        struct wm831x *wm831x;
  56        struct regulator_dev *regulator;
  57        int dvs_gpio;
  58        int dvs_gpio_state;
  59        int on_vsel;
  60        int dvs_vsel;
  61};
  62
  63static int wm831x_dcdc_is_enabled(struct regulator_dev *rdev)
  64{
  65        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
  66        struct wm831x *wm831x = dcdc->wm831x;
  67        int mask = 1 << rdev_get_id(rdev);
  68        int reg;
  69
  70        reg = wm831x_reg_read(wm831x, WM831X_DCDC_ENABLE);
  71        if (reg < 0)
  72                return reg;
  73
  74        if (reg & mask)
  75                return 1;
  76        else
  77                return 0;
  78}
  79
  80static int wm831x_dcdc_enable(struct regulator_dev *rdev)
  81{
  82        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
  83        struct wm831x *wm831x = dcdc->wm831x;
  84        int mask = 1 << rdev_get_id(rdev);
  85
  86        return wm831x_set_bits(wm831x, WM831X_DCDC_ENABLE, mask, mask);
  87}
  88
  89static int wm831x_dcdc_disable(struct regulator_dev *rdev)
  90{
  91        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
  92        struct wm831x *wm831x = dcdc->wm831x;
  93        int mask = 1 << rdev_get_id(rdev);
  94
  95        return wm831x_set_bits(wm831x, WM831X_DCDC_ENABLE, mask, 0);
  96}
  97
  98static unsigned int wm831x_dcdc_get_mode(struct regulator_dev *rdev)
  99
 100{
 101        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 102        struct wm831x *wm831x = dcdc->wm831x;
 103        u16 reg = dcdc->base + WM831X_DCDC_ON_CONFIG;
 104        int val;
 105
 106        val = wm831x_reg_read(wm831x, reg);
 107        if (val < 0)
 108                return val;
 109
 110        val = (val & WM831X_DC1_ON_MODE_MASK) >> WM831X_DC1_ON_MODE_SHIFT;
 111
 112        switch (val) {
 113        case WM831X_DCDC_MODE_FAST:
 114                return REGULATOR_MODE_FAST;
 115        case WM831X_DCDC_MODE_NORMAL:
 116                return REGULATOR_MODE_NORMAL;
 117        case WM831X_DCDC_MODE_STANDBY:
 118                return REGULATOR_MODE_STANDBY;
 119        case WM831X_DCDC_MODE_IDLE:
 120                return REGULATOR_MODE_IDLE;
 121        default:
 122                BUG();
 123                return -EINVAL;
 124        }
 125}
 126
 127static int wm831x_dcdc_set_mode_int(struct wm831x *wm831x, int reg,
 128                                    unsigned int mode)
 129{
 130        int val;
 131
 132        switch (mode) {
 133        case REGULATOR_MODE_FAST:
 134                val = WM831X_DCDC_MODE_FAST;
 135                break;
 136        case REGULATOR_MODE_NORMAL:
 137                val = WM831X_DCDC_MODE_NORMAL;
 138                break;
 139        case REGULATOR_MODE_STANDBY:
 140                val = WM831X_DCDC_MODE_STANDBY;
 141                break;
 142        case REGULATOR_MODE_IDLE:
 143                val = WM831X_DCDC_MODE_IDLE;
 144                break;
 145        default:
 146                return -EINVAL;
 147        }
 148
 149        return wm831x_set_bits(wm831x, reg, WM831X_DC1_ON_MODE_MASK,
 150                               val << WM831X_DC1_ON_MODE_SHIFT);
 151}
 152
 153static int wm831x_dcdc_set_mode(struct regulator_dev *rdev, unsigned int mode)
 154{
 155        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 156        struct wm831x *wm831x = dcdc->wm831x;
 157        u16 reg = dcdc->base + WM831X_DCDC_ON_CONFIG;
 158
 159        return wm831x_dcdc_set_mode_int(wm831x, reg, mode);
 160}
 161
 162static int wm831x_dcdc_set_suspend_mode(struct regulator_dev *rdev,
 163                                        unsigned int mode)
 164{
 165        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 166        struct wm831x *wm831x = dcdc->wm831x;
 167        u16 reg = dcdc->base + WM831X_DCDC_SLEEP_CONTROL;
 168
 169        return wm831x_dcdc_set_mode_int(wm831x, reg, mode);
 170}
 171
 172static int wm831x_dcdc_get_status(struct regulator_dev *rdev)
 173{
 174        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 175        struct wm831x *wm831x = dcdc->wm831x;
 176        int ret;
 177
 178        /* First, check for errors */
 179        ret = wm831x_reg_read(wm831x, WM831X_DCDC_UV_STATUS);
 180        if (ret < 0)
 181                return ret;
 182
 183        if (ret & (1 << rdev_get_id(rdev))) {
 184                dev_dbg(wm831x->dev, "DCDC%d under voltage\n",
 185                        rdev_get_id(rdev) + 1);
 186                return REGULATOR_STATUS_ERROR;
 187        }
 188
 189        /* DCDC1 and DCDC2 can additionally detect high voltage/current */
 190        if (rdev_get_id(rdev) < 2) {
 191                if (ret & (WM831X_DC1_OV_STS << rdev_get_id(rdev))) {
 192                        dev_dbg(wm831x->dev, "DCDC%d over voltage\n",
 193                                rdev_get_id(rdev) + 1);
 194                        return REGULATOR_STATUS_ERROR;
 195                }
 196
 197                if (ret & (WM831X_DC1_HC_STS << rdev_get_id(rdev))) {
 198                        dev_dbg(wm831x->dev, "DCDC%d over current\n",
 199                                rdev_get_id(rdev) + 1);
 200                        return REGULATOR_STATUS_ERROR;
 201                }
 202        }
 203
 204        /* Is the regulator on? */
 205        ret = wm831x_reg_read(wm831x, WM831X_DCDC_STATUS);
 206        if (ret < 0)
 207                return ret;
 208        if (!(ret & (1 << rdev_get_id(rdev))))
 209                return REGULATOR_STATUS_OFF;
 210
 211        /* TODO: When we handle hardware control modes so we can report the
 212         * current mode. */
 213        return REGULATOR_STATUS_ON;
 214}
 215
 216static irqreturn_t wm831x_dcdc_uv_irq(int irq, void *data)
 217{
 218        struct wm831x_dcdc *dcdc = data;
 219
 220        regulator_notifier_call_chain(dcdc->regulator,
 221                                      REGULATOR_EVENT_UNDER_VOLTAGE,
 222                                      NULL);
 223
 224        return IRQ_HANDLED;
 225}
 226
 227static irqreturn_t wm831x_dcdc_oc_irq(int irq, void *data)
 228{
 229        struct wm831x_dcdc *dcdc = data;
 230
 231        regulator_notifier_call_chain(dcdc->regulator,
 232                                      REGULATOR_EVENT_OVER_CURRENT,
 233                                      NULL);
 234
 235        return IRQ_HANDLED;
 236}
 237
 238/*
 239 * BUCKV specifics
 240 */
 241
 242static int wm831x_buckv_list_voltage(struct regulator_dev *rdev,
 243                                      unsigned selector)
 244{
 245        if (selector <= 0x8)
 246                return 600000;
 247        if (selector <= WM831X_BUCKV_MAX_SELECTOR)
 248                return 600000 + ((selector - 0x8) * 12500);
 249        return -EINVAL;
 250}
 251
 252static int wm831x_buckv_select_min_voltage(struct regulator_dev *rdev,
 253                                           int min_uV, int max_uV)
 254{
 255        u16 vsel;
 256
 257        if (min_uV < 600000)
 258                vsel = 0;
 259        else if (min_uV <= 1800000)
 260                vsel = ((min_uV - 600000) / 12500) + 8;
 261        else
 262                return -EINVAL;
 263
 264        if (wm831x_buckv_list_voltage(rdev, vsel) > max_uV)
 265                return -EINVAL;
 266
 267        return vsel;
 268}
 269
 270static int wm831x_buckv_set_dvs(struct regulator_dev *rdev, int state)
 271{
 272        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 273
 274        if (state == dcdc->dvs_gpio_state)
 275                return 0;
 276
 277        dcdc->dvs_gpio_state = state;
 278        gpio_set_value(dcdc->dvs_gpio, state);
 279
 280        /* Should wait for DVS state change to be asserted if we have
 281         * a GPIO for it, for now assume the device is configured
 282         * for the fastest possible transition.
 283         */
 284
 285        return 0;
 286}
 287
 288static int wm831x_buckv_set_voltage(struct regulator_dev *rdev,
 289                                    int min_uV, int max_uV, unsigned *selector)
 290{
 291        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 292        struct wm831x *wm831x = dcdc->wm831x;
 293        int on_reg = dcdc->base + WM831X_DCDC_ON_CONFIG;
 294        int dvs_reg = dcdc->base + WM831X_DCDC_DVS_CONTROL;
 295        int vsel, ret;
 296
 297        vsel = wm831x_buckv_select_min_voltage(rdev, min_uV, max_uV);
 298        if (vsel < 0)
 299                return vsel;
 300
 301        *selector = vsel;
 302
 303        /* If this value is already set then do a GPIO update if we can */
 304        if (dcdc->dvs_gpio && dcdc->on_vsel == vsel)
 305                return wm831x_buckv_set_dvs(rdev, 0);
 306
 307        if (dcdc->dvs_gpio && dcdc->dvs_vsel == vsel)
 308                return wm831x_buckv_set_dvs(rdev, 1);
 309
 310        /* Always set the ON status to the minimum voltage */
 311        ret = wm831x_set_bits(wm831x, on_reg, WM831X_DC1_ON_VSEL_MASK, vsel);
 312        if (ret < 0)
 313                return ret;
 314        dcdc->on_vsel = vsel;
 315
 316        if (!dcdc->dvs_gpio)
 317                return ret;
 318
 319        /* Kick the voltage transition now */
 320        ret = wm831x_buckv_set_dvs(rdev, 0);
 321        if (ret < 0)
 322                return ret;
 323
 324        /*
 325         * If this VSEL is higher than the last one we've seen then
 326         * remember it as the DVS VSEL.  This is optimised for CPUfreq
 327         * usage where we want to get to the highest voltage very
 328         * quickly.
 329         */
 330        if (vsel > dcdc->dvs_vsel) {
 331                ret = wm831x_set_bits(wm831x, dvs_reg,
 332                                      WM831X_DC1_DVS_VSEL_MASK,
 333                                      dcdc->dvs_vsel);
 334                if (ret == 0)
 335                        dcdc->dvs_vsel = vsel;
 336                else
 337                        dev_warn(wm831x->dev,
 338                                 "Failed to set DCDC DVS VSEL: %d\n", ret);
 339        }
 340
 341        return 0;
 342}
 343
 344static int wm831x_buckv_set_suspend_voltage(struct regulator_dev *rdev,
 345                                            int uV)
 346{
 347        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 348        struct wm831x *wm831x = dcdc->wm831x;
 349        u16 reg = dcdc->base + WM831X_DCDC_SLEEP_CONTROL;
 350        int vsel;
 351
 352        vsel = wm831x_buckv_select_min_voltage(rdev, uV, uV);
 353        if (vsel < 0)
 354                return vsel;
 355
 356        return wm831x_set_bits(wm831x, reg, WM831X_DC1_SLP_VSEL_MASK, vsel);
 357}
 358
 359static int wm831x_buckv_get_voltage_sel(struct regulator_dev *rdev)
 360{
 361        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 362
 363        if (dcdc->dvs_gpio && dcdc->dvs_gpio_state)
 364                return dcdc->dvs_vsel;
 365        else
 366                return dcdc->on_vsel;
 367}
 368
 369/* Current limit options */
 370static u16 wm831x_dcdc_ilim[] = {
 371        125, 250, 375, 500, 625, 750, 875, 1000
 372};
 373
 374static int wm831x_buckv_set_current_limit(struct regulator_dev *rdev,
 375                                           int min_uA, int max_uA)
 376{
 377        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 378        struct wm831x *wm831x = dcdc->wm831x;
 379        u16 reg = dcdc->base + WM831X_DCDC_CONTROL_2;
 380        int i;
 381
 382        for (i = 0; i < ARRAY_SIZE(wm831x_dcdc_ilim); i++) {
 383                if (max_uA <= wm831x_dcdc_ilim[i])
 384                        break;
 385        }
 386        if (i == ARRAY_SIZE(wm831x_dcdc_ilim))
 387                return -EINVAL;
 388
 389        return wm831x_set_bits(wm831x, reg, WM831X_DC1_HC_THR_MASK, i);
 390}
 391
 392static int wm831x_buckv_get_current_limit(struct regulator_dev *rdev)
 393{
 394        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 395        struct wm831x *wm831x = dcdc->wm831x;
 396        u16 reg = dcdc->base + WM831X_DCDC_CONTROL_2;
 397        int val;
 398
 399        val = wm831x_reg_read(wm831x, reg);
 400        if (val < 0)
 401                return val;
 402
 403        return wm831x_dcdc_ilim[val & WM831X_DC1_HC_THR_MASK];
 404}
 405
 406static struct regulator_ops wm831x_buckv_ops = {
 407        .set_voltage = wm831x_buckv_set_voltage,
 408        .get_voltage_sel = wm831x_buckv_get_voltage_sel,
 409        .list_voltage = wm831x_buckv_list_voltage,
 410        .set_suspend_voltage = wm831x_buckv_set_suspend_voltage,
 411        .set_current_limit = wm831x_buckv_set_current_limit,
 412        .get_current_limit = wm831x_buckv_get_current_limit,
 413
 414        .is_enabled = wm831x_dcdc_is_enabled,
 415        .enable = wm831x_dcdc_enable,
 416        .disable = wm831x_dcdc_disable,
 417        .get_status = wm831x_dcdc_get_status,
 418        .get_mode = wm831x_dcdc_get_mode,
 419        .set_mode = wm831x_dcdc_set_mode,
 420        .set_suspend_mode = wm831x_dcdc_set_suspend_mode,
 421};
 422
 423/*
 424 * Set up DVS control.  We just log errors since we can still run
 425 * (with reduced performance) if we fail.
 426 */
 427static __devinit void wm831x_buckv_dvs_init(struct wm831x_dcdc *dcdc,
 428                                            struct wm831x_buckv_pdata *pdata)
 429{
 430        struct wm831x *wm831x = dcdc->wm831x;
 431        int ret;
 432        u16 ctrl;
 433
 434        if (!pdata || !pdata->dvs_gpio)
 435                return;
 436
 437        ret = gpio_request(pdata->dvs_gpio, "DCDC DVS");
 438        if (ret < 0) {
 439                dev_err(wm831x->dev, "Failed to get %s DVS GPIO: %d\n",
 440                        dcdc->name, ret);
 441                return;
 442        }
 443
 444        /* gpiolib won't let us read the GPIO status so pick the higher
 445         * of the two existing voltages so we take it as platform data.
 446         */
 447        dcdc->dvs_gpio_state = pdata->dvs_init_state;
 448
 449        ret = gpio_direction_output(pdata->dvs_gpio, dcdc->dvs_gpio_state);
 450        if (ret < 0) {
 451                dev_err(wm831x->dev, "Failed to enable %s DVS GPIO: %d\n",
 452                        dcdc->name, ret);
 453                gpio_free(pdata->dvs_gpio);
 454                return;
 455        }
 456
 457        dcdc->dvs_gpio = pdata->dvs_gpio;
 458
 459        switch (pdata->dvs_control_src) {
 460        case 1:
 461                ctrl = 2 << WM831X_DC1_DVS_SRC_SHIFT;
 462                break;
 463        case 2:
 464                ctrl = 3 << WM831X_DC1_DVS_SRC_SHIFT;
 465                break;
 466        default:
 467                dev_err(wm831x->dev, "Invalid DVS control source %d for %s\n",
 468                        pdata->dvs_control_src, dcdc->name);
 469                return;
 470        }
 471
 472        /* If DVS_VSEL is set to the minimum value then raise it to ON_VSEL
 473         * to make bootstrapping a bit smoother.
 474         */
 475        if (!dcdc->dvs_vsel) {
 476                ret = wm831x_set_bits(wm831x,
 477                                      dcdc->base + WM831X_DCDC_DVS_CONTROL,
 478                                      WM831X_DC1_DVS_VSEL_MASK, dcdc->on_vsel);
 479                if (ret == 0)
 480                        dcdc->dvs_vsel = dcdc->on_vsel;
 481                else
 482                        dev_warn(wm831x->dev, "Failed to set DVS_VSEL: %d\n",
 483                                 ret);
 484        }
 485
 486        ret = wm831x_set_bits(wm831x, dcdc->base + WM831X_DCDC_DVS_CONTROL,
 487                              WM831X_DC1_DVS_SRC_MASK, ctrl);
 488        if (ret < 0) {
 489                dev_err(wm831x->dev, "Failed to set %s DVS source: %d\n",
 490                        dcdc->name, ret);
 491        }
 492}
 493
 494static __devinit int wm831x_buckv_probe(struct platform_device *pdev)
 495{
 496        struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
 497        struct wm831x_pdata *pdata = wm831x->dev->platform_data;
 498        int id;
 499        struct wm831x_dcdc *dcdc;
 500        struct resource *res;
 501        int ret, irq;
 502
 503        if (pdata && pdata->wm831x_num)
 504                id = (pdata->wm831x_num * 10) + 1;
 505        else
 506                id = 0;
 507        id = pdev->id - id;
 508
 509        dev_dbg(&pdev->dev, "Probing DCDC%d\n", id + 1);
 510
 511        if (pdata == NULL || pdata->dcdc[id] == NULL)
 512                return -ENODEV;
 513
 514        dcdc = devm_kzalloc(&pdev->dev,  sizeof(struct wm831x_dcdc),
 515                            GFP_KERNEL);
 516        if (dcdc == NULL) {
 517                dev_err(&pdev->dev, "Unable to allocate private data\n");
 518                return -ENOMEM;
 519        }
 520
 521        dcdc->wm831x = wm831x;
 522
 523        res = platform_get_resource(pdev, IORESOURCE_IO, 0);
 524        if (res == NULL) {
 525                dev_err(&pdev->dev, "No I/O resource\n");
 526                ret = -EINVAL;
 527                goto err;
 528        }
 529        dcdc->base = res->start;
 530
 531        snprintf(dcdc->name, sizeof(dcdc->name), "DCDC%d", id + 1);
 532        dcdc->desc.name = dcdc->name;
 533        dcdc->desc.id = id;
 534        dcdc->desc.type = REGULATOR_VOLTAGE;
 535        dcdc->desc.n_voltages = WM831X_BUCKV_MAX_SELECTOR + 1;
 536        dcdc->desc.ops = &wm831x_buckv_ops;
 537        dcdc->desc.owner = THIS_MODULE;
 538
 539        ret = wm831x_reg_read(wm831x, dcdc->base + WM831X_DCDC_ON_CONFIG);
 540        if (ret < 0) {
 541                dev_err(wm831x->dev, "Failed to read ON VSEL: %d\n", ret);
 542                goto err;
 543        }
 544        dcdc->on_vsel = ret & WM831X_DC1_ON_VSEL_MASK;
 545
 546        ret = wm831x_reg_read(wm831x, dcdc->base + WM831X_DCDC_DVS_CONTROL);
 547        if (ret < 0) {
 548                dev_err(wm831x->dev, "Failed to read DVS VSEL: %d\n", ret);
 549                goto err;
 550        }
 551        dcdc->dvs_vsel = ret & WM831X_DC1_DVS_VSEL_MASK;
 552
 553        if (pdata->dcdc[id])
 554                wm831x_buckv_dvs_init(dcdc, pdata->dcdc[id]->driver_data);
 555
 556        dcdc->regulator = regulator_register(&dcdc->desc, &pdev->dev,
 557                                             pdata->dcdc[id], dcdc, NULL);
 558        if (IS_ERR(dcdc->regulator)) {
 559                ret = PTR_ERR(dcdc->regulator);
 560                dev_err(wm831x->dev, "Failed to register DCDC%d: %d\n",
 561                        id + 1, ret);
 562                goto err;
 563        }
 564
 565        irq = platform_get_irq_byname(pdev, "UV");
 566        ret = request_threaded_irq(irq, NULL, wm831x_dcdc_uv_irq,
 567                                   IRQF_TRIGGER_RISING, dcdc->name, dcdc);
 568        if (ret != 0) {
 569                dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
 570                        irq, ret);
 571                goto err_regulator;
 572        }
 573
 574        irq = platform_get_irq_byname(pdev, "HC");
 575        ret = request_threaded_irq(irq, NULL, wm831x_dcdc_oc_irq,
 576                                   IRQF_TRIGGER_RISING, dcdc->name, dcdc);
 577        if (ret != 0) {
 578                dev_err(&pdev->dev, "Failed to request HC IRQ %d: %d\n",
 579                        irq, ret);
 580                goto err_uv;
 581        }
 582
 583        platform_set_drvdata(pdev, dcdc);
 584
 585        return 0;
 586
 587err_uv:
 588        free_irq(platform_get_irq_byname(pdev, "UV"), dcdc);
 589err_regulator:
 590        regulator_unregister(dcdc->regulator);
 591err:
 592        if (dcdc->dvs_gpio)
 593                gpio_free(dcdc->dvs_gpio);
 594        return ret;
 595}
 596
 597static __devexit int wm831x_buckv_remove(struct platform_device *pdev)
 598{
 599        struct wm831x_dcdc *dcdc = platform_get_drvdata(pdev);
 600
 601        platform_set_drvdata(pdev, NULL);
 602
 603        free_irq(platform_get_irq_byname(pdev, "HC"), dcdc);
 604        free_irq(platform_get_irq_byname(pdev, "UV"), dcdc);
 605        regulator_unregister(dcdc->regulator);
 606        if (dcdc->dvs_gpio)
 607                gpio_free(dcdc->dvs_gpio);
 608
 609        return 0;
 610}
 611
 612static struct platform_driver wm831x_buckv_driver = {
 613        .probe = wm831x_buckv_probe,
 614        .remove = __devexit_p(wm831x_buckv_remove),
 615        .driver         = {
 616                .name   = "wm831x-buckv",
 617                .owner  = THIS_MODULE,
 618        },
 619};
 620
 621/*
 622 * BUCKP specifics
 623 */
 624
 625static int wm831x_buckp_list_voltage(struct regulator_dev *rdev,
 626                                      unsigned selector)
 627{
 628        if (selector <= WM831X_BUCKP_MAX_SELECTOR)
 629                return 850000 + (selector * 25000);
 630        else
 631                return -EINVAL;
 632}
 633
 634static int wm831x_buckp_set_voltage_int(struct regulator_dev *rdev, int reg,
 635                                        int min_uV, int max_uV, int *selector)
 636{
 637        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 638        struct wm831x *wm831x = dcdc->wm831x;
 639        u16 vsel;
 640
 641        if (min_uV <= 34000000)
 642                vsel = (min_uV - 850000) / 25000;
 643        else
 644                return -EINVAL;
 645
 646        if (wm831x_buckp_list_voltage(rdev, vsel) > max_uV)
 647                return -EINVAL;
 648
 649        *selector = vsel;
 650
 651        return wm831x_set_bits(wm831x, reg, WM831X_DC3_ON_VSEL_MASK, vsel);
 652}
 653
 654static int wm831x_buckp_set_voltage(struct regulator_dev *rdev,
 655                                    int min_uV, int max_uV,
 656                                    unsigned *selector)
 657{
 658        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 659        u16 reg = dcdc->base + WM831X_DCDC_ON_CONFIG;
 660
 661        return wm831x_buckp_set_voltage_int(rdev, reg, min_uV, max_uV,
 662                                            selector);
 663}
 664
 665static int wm831x_buckp_set_suspend_voltage(struct regulator_dev *rdev,
 666                                            int uV)
 667{
 668        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 669        u16 reg = dcdc->base + WM831X_DCDC_SLEEP_CONTROL;
 670        unsigned selector;
 671
 672        return wm831x_buckp_set_voltage_int(rdev, reg, uV, uV, &selector);
 673}
 674
 675static int wm831x_buckp_get_voltage_sel(struct regulator_dev *rdev)
 676{
 677        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 678        struct wm831x *wm831x = dcdc->wm831x;
 679        u16 reg = dcdc->base + WM831X_DCDC_ON_CONFIG;
 680        int val;
 681
 682        val = wm831x_reg_read(wm831x, reg);
 683        if (val < 0)
 684                return val;
 685
 686        return val & WM831X_DC3_ON_VSEL_MASK;
 687}
 688
 689static struct regulator_ops wm831x_buckp_ops = {
 690        .set_voltage = wm831x_buckp_set_voltage,
 691        .get_voltage_sel = wm831x_buckp_get_voltage_sel,
 692        .list_voltage = wm831x_buckp_list_voltage,
 693        .set_suspend_voltage = wm831x_buckp_set_suspend_voltage,
 694
 695        .is_enabled = wm831x_dcdc_is_enabled,
 696        .enable = wm831x_dcdc_enable,
 697        .disable = wm831x_dcdc_disable,
 698        .get_status = wm831x_dcdc_get_status,
 699        .get_mode = wm831x_dcdc_get_mode,
 700        .set_mode = wm831x_dcdc_set_mode,
 701        .set_suspend_mode = wm831x_dcdc_set_suspend_mode,
 702};
 703
 704static __devinit int wm831x_buckp_probe(struct platform_device *pdev)
 705{
 706        struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
 707        struct wm831x_pdata *pdata = wm831x->dev->platform_data;
 708        int id;
 709        struct wm831x_dcdc *dcdc;
 710        struct resource *res;
 711        int ret, irq;
 712
 713        if (pdata && pdata->wm831x_num)
 714                id = (pdata->wm831x_num * 10) + 1;
 715        else
 716                id = 0;
 717        id = pdev->id - id;
 718
 719        dev_dbg(&pdev->dev, "Probing DCDC%d\n", id + 1);
 720
 721        if (pdata == NULL || pdata->dcdc[id] == NULL)
 722                return -ENODEV;
 723
 724        dcdc = devm_kzalloc(&pdev->dev, sizeof(struct wm831x_dcdc),
 725                            GFP_KERNEL);
 726        if (dcdc == NULL) {
 727                dev_err(&pdev->dev, "Unable to allocate private data\n");
 728                return -ENOMEM;
 729        }
 730
 731        dcdc->wm831x = wm831x;
 732
 733        res = platform_get_resource(pdev, IORESOURCE_IO, 0);
 734        if (res == NULL) {
 735                dev_err(&pdev->dev, "No I/O resource\n");
 736                ret = -EINVAL;
 737                goto err;
 738        }
 739        dcdc->base = res->start;
 740
 741        snprintf(dcdc->name, sizeof(dcdc->name), "DCDC%d", id + 1);
 742        dcdc->desc.name = dcdc->name;
 743        dcdc->desc.id = id;
 744        dcdc->desc.type = REGULATOR_VOLTAGE;
 745        dcdc->desc.n_voltages = WM831X_BUCKP_MAX_SELECTOR + 1;
 746        dcdc->desc.ops = &wm831x_buckp_ops;
 747        dcdc->desc.owner = THIS_MODULE;
 748
 749        dcdc->regulator = regulator_register(&dcdc->desc, &pdev->dev,
 750                                             pdata->dcdc[id], dcdc, NULL);
 751        if (IS_ERR(dcdc->regulator)) {
 752                ret = PTR_ERR(dcdc->regulator);
 753                dev_err(wm831x->dev, "Failed to register DCDC%d: %d\n",
 754                        id + 1, ret);
 755                goto err;
 756        }
 757
 758        irq = platform_get_irq_byname(pdev, "UV");
 759        ret = request_threaded_irq(irq, NULL, wm831x_dcdc_uv_irq,
 760                                   IRQF_TRIGGER_RISING, dcdc->name, dcdc);
 761        if (ret != 0) {
 762                dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
 763                        irq, ret);
 764                goto err_regulator;
 765        }
 766
 767        platform_set_drvdata(pdev, dcdc);
 768
 769        return 0;
 770
 771err_regulator:
 772        regulator_unregister(dcdc->regulator);
 773err:
 774        return ret;
 775}
 776
 777static __devexit int wm831x_buckp_remove(struct platform_device *pdev)
 778{
 779        struct wm831x_dcdc *dcdc = platform_get_drvdata(pdev);
 780
 781        platform_set_drvdata(pdev, NULL);
 782
 783        free_irq(platform_get_irq_byname(pdev, "UV"), dcdc);
 784        regulator_unregister(dcdc->regulator);
 785
 786        return 0;
 787}
 788
 789static struct platform_driver wm831x_buckp_driver = {
 790        .probe = wm831x_buckp_probe,
 791        .remove = __devexit_p(wm831x_buckp_remove),
 792        .driver         = {
 793                .name   = "wm831x-buckp",
 794                .owner  = THIS_MODULE,
 795        },
 796};
 797
 798/*
 799 * DCDC boost convertors
 800 */
 801
 802static int wm831x_boostp_get_status(struct regulator_dev *rdev)
 803{
 804        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 805        struct wm831x *wm831x = dcdc->wm831x;
 806        int ret;
 807
 808        /* First, check for errors */
 809        ret = wm831x_reg_read(wm831x, WM831X_DCDC_UV_STATUS);
 810        if (ret < 0)
 811                return ret;
 812
 813        if (ret & (1 << rdev_get_id(rdev))) {
 814                dev_dbg(wm831x->dev, "DCDC%d under voltage\n",
 815                        rdev_get_id(rdev) + 1);
 816                return REGULATOR_STATUS_ERROR;
 817        }
 818
 819        /* Is the regulator on? */
 820        ret = wm831x_reg_read(wm831x, WM831X_DCDC_STATUS);
 821        if (ret < 0)
 822                return ret;
 823        if (ret & (1 << rdev_get_id(rdev)))
 824                return REGULATOR_STATUS_ON;
 825        else
 826                return REGULATOR_STATUS_OFF;
 827}
 828
 829static struct regulator_ops wm831x_boostp_ops = {
 830        .get_status = wm831x_boostp_get_status,
 831
 832        .is_enabled = wm831x_dcdc_is_enabled,
 833        .enable = wm831x_dcdc_enable,
 834        .disable = wm831x_dcdc_disable,
 835};
 836
 837static __devinit int wm831x_boostp_probe(struct platform_device *pdev)
 838{
 839        struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
 840        struct wm831x_pdata *pdata = wm831x->dev->platform_data;
 841        int id = pdev->id % ARRAY_SIZE(pdata->dcdc);
 842        struct wm831x_dcdc *dcdc;
 843        struct resource *res;
 844        int ret, irq;
 845
 846        dev_dbg(&pdev->dev, "Probing DCDC%d\n", id + 1);
 847
 848        if (pdata == NULL || pdata->dcdc[id] == NULL)
 849                return -ENODEV;
 850
 851        dcdc = kzalloc(sizeof(struct wm831x_dcdc), GFP_KERNEL);
 852        if (dcdc == NULL) {
 853                dev_err(&pdev->dev, "Unable to allocate private data\n");
 854                return -ENOMEM;
 855        }
 856
 857        dcdc->wm831x = wm831x;
 858
 859        res = platform_get_resource(pdev, IORESOURCE_IO, 0);
 860        if (res == NULL) {
 861                dev_err(&pdev->dev, "No I/O resource\n");
 862                ret = -EINVAL;
 863                goto err;
 864        }
 865        dcdc->base = res->start;
 866
 867        snprintf(dcdc->name, sizeof(dcdc->name), "DCDC%d", id + 1);
 868        dcdc->desc.name = dcdc->name;
 869        dcdc->desc.id = id;
 870        dcdc->desc.type = REGULATOR_VOLTAGE;
 871        dcdc->desc.ops = &wm831x_boostp_ops;
 872        dcdc->desc.owner = THIS_MODULE;
 873
 874        dcdc->regulator = regulator_register(&dcdc->desc, &pdev->dev,
 875                                             pdata->dcdc[id], dcdc, NULL);
 876        if (IS_ERR(dcdc->regulator)) {
 877                ret = PTR_ERR(dcdc->regulator);
 878                dev_err(wm831x->dev, "Failed to register DCDC%d: %d\n",
 879                        id + 1, ret);
 880                goto err;
 881        }
 882
 883        irq = platform_get_irq_byname(pdev, "UV");
 884        ret = request_threaded_irq(irq, NULL, wm831x_dcdc_uv_irq,
 885                                   IRQF_TRIGGER_RISING, dcdc->name,
 886                                   dcdc);
 887        if (ret != 0) {
 888                dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
 889                        irq, ret);
 890                goto err_regulator;
 891        }
 892
 893        platform_set_drvdata(pdev, dcdc);
 894
 895        return 0;
 896
 897err_regulator:
 898        regulator_unregister(dcdc->regulator);
 899err:
 900        kfree(dcdc);
 901        return ret;
 902}
 903
 904static __devexit int wm831x_boostp_remove(struct platform_device *pdev)
 905{
 906        struct wm831x_dcdc *dcdc = platform_get_drvdata(pdev);
 907
 908        platform_set_drvdata(pdev, NULL);
 909
 910        free_irq(platform_get_irq_byname(pdev, "UV"), dcdc);
 911        regulator_unregister(dcdc->regulator);
 912        kfree(dcdc);
 913
 914        return 0;
 915}
 916
 917static struct platform_driver wm831x_boostp_driver = {
 918        .probe = wm831x_boostp_probe,
 919        .remove = __devexit_p(wm831x_boostp_remove),
 920        .driver         = {
 921                .name   = "wm831x-boostp",
 922                .owner  = THIS_MODULE,
 923        },
 924};
 925
 926/*
 927 * External Power Enable
 928 *
 929 * These aren't actually DCDCs but look like them in hardware so share
 930 * code.
 931 */
 932
 933#define WM831X_EPE_BASE 6
 934
 935static struct regulator_ops wm831x_epe_ops = {
 936        .is_enabled = wm831x_dcdc_is_enabled,
 937        .enable = wm831x_dcdc_enable,
 938        .disable = wm831x_dcdc_disable,
 939        .get_status = wm831x_dcdc_get_status,
 940};
 941
 942static __devinit int wm831x_epe_probe(struct platform_device *pdev)
 943{
 944        struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
 945        struct wm831x_pdata *pdata = wm831x->dev->platform_data;
 946        int id = pdev->id % ARRAY_SIZE(pdata->epe);
 947        struct wm831x_dcdc *dcdc;
 948        int ret;
 949
 950        dev_dbg(&pdev->dev, "Probing EPE%d\n", id + 1);
 951
 952        if (pdata == NULL || pdata->epe[id] == NULL)
 953                return -ENODEV;
 954
 955        dcdc = kzalloc(sizeof(struct wm831x_dcdc), GFP_KERNEL);
 956        if (dcdc == NULL) {
 957                dev_err(&pdev->dev, "Unable to allocate private data\n");
 958                return -ENOMEM;
 959        }
 960
 961        dcdc->wm831x = wm831x;
 962
 963        /* For current parts this is correct; probably need to revisit
 964         * in future.
 965         */
 966        snprintf(dcdc->name, sizeof(dcdc->name), "EPE%d", id + 1);
 967        dcdc->desc.name = dcdc->name;
 968        dcdc->desc.id = id + WM831X_EPE_BASE; /* Offset in DCDC registers */
 969        dcdc->desc.ops = &wm831x_epe_ops;
 970        dcdc->desc.type = REGULATOR_VOLTAGE;
 971        dcdc->desc.owner = THIS_MODULE;
 972
 973        dcdc->regulator = regulator_register(&dcdc->desc, &pdev->dev,
 974                                             pdata->epe[id], dcdc, NULL);
 975        if (IS_ERR(dcdc->regulator)) {
 976                ret = PTR_ERR(dcdc->regulator);
 977                dev_err(wm831x->dev, "Failed to register EPE%d: %d\n",
 978                        id + 1, ret);
 979                goto err;
 980        }
 981
 982        platform_set_drvdata(pdev, dcdc);
 983
 984        return 0;
 985
 986err:
 987        kfree(dcdc);
 988        return ret;
 989}
 990
 991static __devexit int wm831x_epe_remove(struct platform_device *pdev)
 992{
 993        struct wm831x_dcdc *dcdc = platform_get_drvdata(pdev);
 994
 995        platform_set_drvdata(pdev, NULL);
 996
 997        regulator_unregister(dcdc->regulator);
 998        kfree(dcdc);
 999
1000        return 0;
1001}
1002
1003static struct platform_driver wm831x_epe_driver = {
1004        .probe = wm831x_epe_probe,
1005        .remove = __devexit_p(wm831x_epe_remove),
1006        .driver         = {
1007                .name   = "wm831x-epe",
1008                .owner  = THIS_MODULE,
1009        },
1010};
1011
1012static int __init wm831x_dcdc_init(void)
1013{
1014        int ret;
1015        ret = platform_driver_register(&wm831x_buckv_driver);
1016        if (ret != 0)
1017                pr_err("Failed to register WM831x BUCKV driver: %d\n", ret);
1018
1019        ret = platform_driver_register(&wm831x_buckp_driver);
1020        if (ret != 0)
1021                pr_err("Failed to register WM831x BUCKP driver: %d\n", ret);
1022
1023        ret = platform_driver_register(&wm831x_boostp_driver);
1024        if (ret != 0)
1025                pr_err("Failed to register WM831x BOOST driver: %d\n", ret);
1026
1027        ret = platform_driver_register(&wm831x_epe_driver);
1028        if (ret != 0)
1029                pr_err("Failed to register WM831x EPE driver: %d\n", ret);
1030
1031        return 0;
1032}
1033subsys_initcall(wm831x_dcdc_init);
1034
1035static void __exit wm831x_dcdc_exit(void)
1036{
1037        platform_driver_unregister(&wm831x_epe_driver);
1038        platform_driver_unregister(&wm831x_boostp_driver);
1039        platform_driver_unregister(&wm831x_buckp_driver);
1040        platform_driver_unregister(&wm831x_buckv_driver);
1041}
1042module_exit(wm831x_dcdc_exit);
1043
1044/* Module information */
1045MODULE_AUTHOR("Mark Brown");
1046MODULE_DESCRIPTION("WM831x DC-DC convertor driver");
1047MODULE_LICENSE("GPL");
1048MODULE_ALIAS("platform:wm831x-buckv");
1049MODULE_ALIAS("platform:wm831x-buckp");
1050MODULE_ALIAS("platform:wm831x-epe");
1051