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_select_max_voltage(struct regulator_dev *rdev,
 271                                           int min_uV, int max_uV)
 272{
 273        u16 vsel;
 274
 275        if (max_uV < 600000 || max_uV > 1800000)
 276                return -EINVAL;
 277
 278        vsel = ((max_uV - 600000) / 12500) + 8;
 279
 280        if (wm831x_buckv_list_voltage(rdev, vsel) < min_uV ||
 281            wm831x_buckv_list_voltage(rdev, vsel) < max_uV)
 282                return -EINVAL;
 283
 284        return vsel;
 285}
 286
 287static int wm831x_buckv_set_dvs(struct regulator_dev *rdev, int state)
 288{
 289        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 290
 291        if (state == dcdc->dvs_gpio_state)
 292                return 0;
 293
 294        dcdc->dvs_gpio_state = state;
 295        gpio_set_value(dcdc->dvs_gpio, state);
 296
 297        /* Should wait for DVS state change to be asserted if we have
 298         * a GPIO for it, for now assume the device is configured
 299         * for the fastest possible transition.
 300         */
 301
 302        return 0;
 303}
 304
 305static int wm831x_buckv_set_voltage(struct regulator_dev *rdev,
 306                                    int min_uV, int max_uV, unsigned *selector)
 307{
 308        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 309        struct wm831x *wm831x = dcdc->wm831x;
 310        int on_reg = dcdc->base + WM831X_DCDC_ON_CONFIG;
 311        int dvs_reg = dcdc->base + WM831X_DCDC_DVS_CONTROL;
 312        int vsel, ret;
 313
 314        vsel = wm831x_buckv_select_min_voltage(rdev, min_uV, max_uV);
 315        if (vsel < 0)
 316                return vsel;
 317
 318        *selector = vsel;
 319
 320        /* If this value is already set then do a GPIO update if we can */
 321        if (dcdc->dvs_gpio && dcdc->on_vsel == vsel)
 322                return wm831x_buckv_set_dvs(rdev, 0);
 323
 324        if (dcdc->dvs_gpio && dcdc->dvs_vsel == vsel)
 325                return wm831x_buckv_set_dvs(rdev, 1);
 326
 327        /* Always set the ON status to the minimum voltage */
 328        ret = wm831x_set_bits(wm831x, on_reg, WM831X_DC1_ON_VSEL_MASK, vsel);
 329        if (ret < 0)
 330                return ret;
 331        dcdc->on_vsel = vsel;
 332
 333        if (!dcdc->dvs_gpio)
 334                return ret;
 335
 336        /* Kick the voltage transition now */
 337        ret = wm831x_buckv_set_dvs(rdev, 0);
 338        if (ret < 0)
 339                return ret;
 340
 341        /* Set the high voltage as the DVS voltage.  This is optimised
 342         * for CPUfreq usage, most processors will keep the maximum
 343         * voltage constant and lower the minimum with the frequency. */
 344        vsel = wm831x_buckv_select_max_voltage(rdev, min_uV, max_uV);
 345        if (vsel < 0) {
 346                /* This should never happen - at worst the same vsel
 347                 * should be chosen */
 348                WARN_ON(vsel < 0);
 349                return 0;
 350        }
 351
 352        /* Don't bother if it's the same VSEL we're already using */
 353        if (vsel == dcdc->on_vsel)
 354                return 0;
 355
 356        ret = wm831x_set_bits(wm831x, dvs_reg, WM831X_DC1_DVS_VSEL_MASK, vsel);
 357        if (ret == 0)
 358                dcdc->dvs_vsel = vsel;
 359        else
 360                dev_warn(wm831x->dev, "Failed to set DCDC DVS VSEL: %d\n",
 361                         ret);
 362
 363        return 0;
 364}
 365
 366static int wm831x_buckv_set_suspend_voltage(struct regulator_dev *rdev,
 367                                            int uV)
 368{
 369        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 370        struct wm831x *wm831x = dcdc->wm831x;
 371        u16 reg = dcdc->base + WM831X_DCDC_SLEEP_CONTROL;
 372        int vsel;
 373
 374        vsel = wm831x_buckv_select_min_voltage(rdev, uV, uV);
 375        if (vsel < 0)
 376                return vsel;
 377
 378        return wm831x_set_bits(wm831x, reg, WM831X_DC1_SLP_VSEL_MASK, vsel);
 379}
 380
 381static int wm831x_buckv_get_voltage_sel(struct regulator_dev *rdev)
 382{
 383        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 384
 385        if (dcdc->dvs_gpio && dcdc->dvs_gpio_state)
 386                return dcdc->dvs_vsel;
 387        else
 388                return dcdc->on_vsel;
 389}
 390
 391/* Current limit options */
 392static u16 wm831x_dcdc_ilim[] = {
 393        125, 250, 375, 500, 625, 750, 875, 1000
 394};
 395
 396static int wm831x_buckv_set_current_limit(struct regulator_dev *rdev,
 397                                           int min_uA, int max_uA)
 398{
 399        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 400        struct wm831x *wm831x = dcdc->wm831x;
 401        u16 reg = dcdc->base + WM831X_DCDC_CONTROL_2;
 402        int i;
 403
 404        for (i = 0; i < ARRAY_SIZE(wm831x_dcdc_ilim); i++) {
 405                if (max_uA <= wm831x_dcdc_ilim[i])
 406                        break;
 407        }
 408        if (i == ARRAY_SIZE(wm831x_dcdc_ilim))
 409                return -EINVAL;
 410
 411        return wm831x_set_bits(wm831x, reg, WM831X_DC1_HC_THR_MASK, i);
 412}
 413
 414static int wm831x_buckv_get_current_limit(struct regulator_dev *rdev)
 415{
 416        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 417        struct wm831x *wm831x = dcdc->wm831x;
 418        u16 reg = dcdc->base + WM831X_DCDC_CONTROL_2;
 419        int val;
 420
 421        val = wm831x_reg_read(wm831x, reg);
 422        if (val < 0)
 423                return val;
 424
 425        return wm831x_dcdc_ilim[val & WM831X_DC1_HC_THR_MASK];
 426}
 427
 428static struct regulator_ops wm831x_buckv_ops = {
 429        .set_voltage = wm831x_buckv_set_voltage,
 430        .get_voltage_sel = wm831x_buckv_get_voltage_sel,
 431        .list_voltage = wm831x_buckv_list_voltage,
 432        .set_suspend_voltage = wm831x_buckv_set_suspend_voltage,
 433        .set_current_limit = wm831x_buckv_set_current_limit,
 434        .get_current_limit = wm831x_buckv_get_current_limit,
 435
 436        .is_enabled = wm831x_dcdc_is_enabled,
 437        .enable = wm831x_dcdc_enable,
 438        .disable = wm831x_dcdc_disable,
 439        .get_status = wm831x_dcdc_get_status,
 440        .get_mode = wm831x_dcdc_get_mode,
 441        .set_mode = wm831x_dcdc_set_mode,
 442        .set_suspend_mode = wm831x_dcdc_set_suspend_mode,
 443};
 444
 445/*
 446 * Set up DVS control.  We just log errors since we can still run
 447 * (with reduced performance) if we fail.
 448 */
 449static __devinit void wm831x_buckv_dvs_init(struct wm831x_dcdc *dcdc,
 450                                            struct wm831x_buckv_pdata *pdata)
 451{
 452        struct wm831x *wm831x = dcdc->wm831x;
 453        int ret;
 454        u16 ctrl;
 455
 456        if (!pdata || !pdata->dvs_gpio)
 457                return;
 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        ret = wm831x_set_bits(wm831x, dcdc->base + WM831X_DCDC_DVS_CONTROL,
 473                              WM831X_DC1_DVS_SRC_MASK, ctrl);
 474        if (ret < 0) {
 475                dev_err(wm831x->dev, "Failed to set %s DVS source: %d\n",
 476                        dcdc->name, ret);
 477                return;
 478        }
 479
 480        ret = gpio_request(pdata->dvs_gpio, "DCDC DVS");
 481        if (ret < 0) {
 482                dev_err(wm831x->dev, "Failed to get %s DVS GPIO: %d\n",
 483                        dcdc->name, ret);
 484                return;
 485        }
 486
 487        /* gpiolib won't let us read the GPIO status so pick the higher
 488         * of the two existing voltages so we take it as platform data.
 489         */
 490        dcdc->dvs_gpio_state = pdata->dvs_init_state;
 491
 492        ret = gpio_direction_output(pdata->dvs_gpio, dcdc->dvs_gpio_state);
 493        if (ret < 0) {
 494                dev_err(wm831x->dev, "Failed to enable %s DVS GPIO: %d\n",
 495                        dcdc->name, ret);
 496                gpio_free(pdata->dvs_gpio);
 497                return;
 498        }
 499
 500        dcdc->dvs_gpio = pdata->dvs_gpio;
 501}
 502
 503static __devinit int wm831x_buckv_probe(struct platform_device *pdev)
 504{
 505        struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
 506        struct wm831x_pdata *pdata = wm831x->dev->platform_data;
 507        int id = pdev->id % ARRAY_SIZE(pdata->dcdc);
 508        struct wm831x_dcdc *dcdc;
 509        struct resource *res;
 510        int ret, irq;
 511
 512        dev_dbg(&pdev->dev, "Probing DCDC%d\n", id + 1);
 513
 514        if (pdata == NULL || pdata->dcdc[id] == NULL)
 515                return -ENODEV;
 516
 517        dcdc = kzalloc(sizeof(struct wm831x_dcdc), GFP_KERNEL);
 518        if (dcdc == NULL) {
 519                dev_err(&pdev->dev, "Unable to allocate private data\n");
 520                return -ENOMEM;
 521        }
 522
 523        dcdc->wm831x = wm831x;
 524
 525        res = platform_get_resource(pdev, IORESOURCE_IO, 0);
 526        if (res == NULL) {
 527                dev_err(&pdev->dev, "No I/O resource\n");
 528                ret = -EINVAL;
 529                goto err;
 530        }
 531        dcdc->base = res->start;
 532
 533        snprintf(dcdc->name, sizeof(dcdc->name), "DCDC%d", id + 1);
 534        dcdc->desc.name = dcdc->name;
 535        dcdc->desc.id = id;
 536        dcdc->desc.type = REGULATOR_VOLTAGE;
 537        dcdc->desc.n_voltages = WM831X_BUCKV_MAX_SELECTOR + 1;
 538        dcdc->desc.ops = &wm831x_buckv_ops;
 539        dcdc->desc.owner = THIS_MODULE;
 540
 541        ret = wm831x_reg_read(wm831x, dcdc->base + WM831X_DCDC_ON_CONFIG);
 542        if (ret < 0) {
 543                dev_err(wm831x->dev, "Failed to read ON VSEL: %d\n", ret);
 544                goto err;
 545        }
 546        dcdc->on_vsel = ret & WM831X_DC1_ON_VSEL_MASK;
 547
 548        ret = wm831x_reg_read(wm831x, dcdc->base + WM831X_DCDC_ON_CONFIG);
 549        if (ret < 0) {
 550                dev_err(wm831x->dev, "Failed to read DVS VSEL: %d\n", ret);
 551                goto err;
 552        }
 553        dcdc->dvs_vsel = ret & WM831X_DC1_DVS_VSEL_MASK;
 554
 555        if (pdata->dcdc[id])
 556                wm831x_buckv_dvs_init(dcdc, pdata->dcdc[id]->driver_data);
 557
 558        dcdc->regulator = regulator_register(&dcdc->desc, &pdev->dev,
 559                                             pdata->dcdc[id], dcdc);
 560        if (IS_ERR(dcdc->regulator)) {
 561                ret = PTR_ERR(dcdc->regulator);
 562                dev_err(wm831x->dev, "Failed to register DCDC%d: %d\n",
 563                        id + 1, ret);
 564                goto err;
 565        }
 566
 567        irq = platform_get_irq_byname(pdev, "UV");
 568        ret = wm831x_request_irq(wm831x, irq, wm831x_dcdc_uv_irq,
 569                                 IRQF_TRIGGER_RISING, dcdc->name,
 570                                 dcdc);
 571        if (ret != 0) {
 572                dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
 573                        irq, ret);
 574                goto err_regulator;
 575        }
 576
 577        irq = platform_get_irq_byname(pdev, "HC");
 578        ret = wm831x_request_irq(wm831x, irq, wm831x_dcdc_oc_irq,
 579                                 IRQF_TRIGGER_RISING, dcdc->name,
 580                                 dcdc);
 581        if (ret != 0) {
 582                dev_err(&pdev->dev, "Failed to request HC IRQ %d: %d\n",
 583                        irq, ret);
 584                goto err_uv;
 585        }
 586
 587        platform_set_drvdata(pdev, dcdc);
 588
 589        return 0;
 590
 591err_uv:
 592        wm831x_free_irq(wm831x, platform_get_irq_byname(pdev, "UV"), dcdc);
 593err_regulator:
 594        regulator_unregister(dcdc->regulator);
 595err:
 596        if (dcdc->dvs_gpio)
 597                gpio_free(dcdc->dvs_gpio);
 598        kfree(dcdc);
 599        return ret;
 600}
 601
 602static __devexit int wm831x_buckv_remove(struct platform_device *pdev)
 603{
 604        struct wm831x_dcdc *dcdc = platform_get_drvdata(pdev);
 605        struct wm831x *wm831x = dcdc->wm831x;
 606
 607        platform_set_drvdata(pdev, NULL);
 608
 609        wm831x_free_irq(wm831x, platform_get_irq_byname(pdev, "HC"), dcdc);
 610        wm831x_free_irq(wm831x, platform_get_irq_byname(pdev, "UV"), dcdc);
 611        regulator_unregister(dcdc->regulator);
 612        if (dcdc->dvs_gpio)
 613                gpio_free(dcdc->dvs_gpio);
 614        kfree(dcdc);
 615
 616        return 0;
 617}
 618
 619static struct platform_driver wm831x_buckv_driver = {
 620        .probe = wm831x_buckv_probe,
 621        .remove = __devexit_p(wm831x_buckv_remove),
 622        .driver         = {
 623                .name   = "wm831x-buckv",
 624                .owner  = THIS_MODULE,
 625        },
 626};
 627
 628/*
 629 * BUCKP specifics
 630 */
 631
 632static int wm831x_buckp_list_voltage(struct regulator_dev *rdev,
 633                                      unsigned selector)
 634{
 635        if (selector <= WM831X_BUCKP_MAX_SELECTOR)
 636                return 850000 + (selector * 25000);
 637        else
 638                return -EINVAL;
 639}
 640
 641static int wm831x_buckp_set_voltage_int(struct regulator_dev *rdev, int reg,
 642                                        int min_uV, int max_uV, int *selector)
 643{
 644        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 645        struct wm831x *wm831x = dcdc->wm831x;
 646        u16 vsel;
 647
 648        if (min_uV <= 34000000)
 649                vsel = (min_uV - 850000) / 25000;
 650        else
 651                return -EINVAL;
 652
 653        if (wm831x_buckp_list_voltage(rdev, vsel) > max_uV)
 654                return -EINVAL;
 655
 656        *selector = vsel;
 657
 658        return wm831x_set_bits(wm831x, reg, WM831X_DC3_ON_VSEL_MASK, vsel);
 659}
 660
 661static int wm831x_buckp_set_voltage(struct regulator_dev *rdev,
 662                                    int min_uV, int max_uV,
 663                                    unsigned *selector)
 664{
 665        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 666        u16 reg = dcdc->base + WM831X_DCDC_ON_CONFIG;
 667
 668        return wm831x_buckp_set_voltage_int(rdev, reg, min_uV, max_uV,
 669                                            selector);
 670}
 671
 672static int wm831x_buckp_set_suspend_voltage(struct regulator_dev *rdev,
 673                                            int uV)
 674{
 675        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 676        u16 reg = dcdc->base + WM831X_DCDC_SLEEP_CONTROL;
 677        unsigned selector;
 678
 679        return wm831x_buckp_set_voltage_int(rdev, reg, uV, uV, &selector);
 680}
 681
 682static int wm831x_buckp_get_voltage_sel(struct regulator_dev *rdev)
 683{
 684        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 685        struct wm831x *wm831x = dcdc->wm831x;
 686        u16 reg = dcdc->base + WM831X_DCDC_ON_CONFIG;
 687        int val;
 688
 689        val = wm831x_reg_read(wm831x, reg);
 690        if (val < 0)
 691                return val;
 692
 693        return val & WM831X_DC3_ON_VSEL_MASK;
 694}
 695
 696static struct regulator_ops wm831x_buckp_ops = {
 697        .set_voltage = wm831x_buckp_set_voltage,
 698        .get_voltage_sel = wm831x_buckp_get_voltage_sel,
 699        .list_voltage = wm831x_buckp_list_voltage,
 700        .set_suspend_voltage = wm831x_buckp_set_suspend_voltage,
 701
 702        .is_enabled = wm831x_dcdc_is_enabled,
 703        .enable = wm831x_dcdc_enable,
 704        .disable = wm831x_dcdc_disable,
 705        .get_status = wm831x_dcdc_get_status,
 706        .get_mode = wm831x_dcdc_get_mode,
 707        .set_mode = wm831x_dcdc_set_mode,
 708        .set_suspend_mode = wm831x_dcdc_set_suspend_mode,
 709};
 710
 711static __devinit int wm831x_buckp_probe(struct platform_device *pdev)
 712{
 713        struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
 714        struct wm831x_pdata *pdata = wm831x->dev->platform_data;
 715        int id = pdev->id % ARRAY_SIZE(pdata->dcdc);
 716        struct wm831x_dcdc *dcdc;
 717        struct resource *res;
 718        int ret, irq;
 719
 720        dev_dbg(&pdev->dev, "Probing DCDC%d\n", id + 1);
 721
 722        if (pdata == NULL || pdata->dcdc[id] == NULL)
 723                return -ENODEV;
 724
 725        dcdc = kzalloc(sizeof(struct wm831x_dcdc), 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);
 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 = wm831x_request_irq(wm831x, irq, wm831x_dcdc_uv_irq,
 760                                 IRQF_TRIGGER_RISING, dcdc->name,
 761                                 dcdc);
 762        if (ret != 0) {
 763                dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
 764                        irq, ret);
 765                goto err_regulator;
 766        }
 767
 768        platform_set_drvdata(pdev, dcdc);
 769
 770        return 0;
 771
 772err_regulator:
 773        regulator_unregister(dcdc->regulator);
 774err:
 775        kfree(dcdc);
 776        return ret;
 777}
 778
 779static __devexit int wm831x_buckp_remove(struct platform_device *pdev)
 780{
 781        struct wm831x_dcdc *dcdc = platform_get_drvdata(pdev);
 782        struct wm831x *wm831x = dcdc->wm831x;
 783
 784        platform_set_drvdata(pdev, NULL);
 785
 786        wm831x_free_irq(wm831x, platform_get_irq_byname(pdev, "UV"), dcdc);
 787        regulator_unregister(dcdc->regulator);
 788        kfree(dcdc);
 789
 790        return 0;
 791}
 792
 793static struct platform_driver wm831x_buckp_driver = {
 794        .probe = wm831x_buckp_probe,
 795        .remove = __devexit_p(wm831x_buckp_remove),
 796        .driver         = {
 797                .name   = "wm831x-buckp",
 798                .owner  = THIS_MODULE,
 799        },
 800};
 801
 802/*
 803 * DCDC boost convertors
 804 */
 805
 806static int wm831x_boostp_get_status(struct regulator_dev *rdev)
 807{
 808        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 809        struct wm831x *wm831x = dcdc->wm831x;
 810        int ret;
 811
 812        /* First, check for errors */
 813        ret = wm831x_reg_read(wm831x, WM831X_DCDC_UV_STATUS);
 814        if (ret < 0)
 815                return ret;
 816
 817        if (ret & (1 << rdev_get_id(rdev))) {
 818                dev_dbg(wm831x->dev, "DCDC%d under voltage\n",
 819                        rdev_get_id(rdev) + 1);
 820                return REGULATOR_STATUS_ERROR;
 821        }
 822
 823        /* Is the regulator on? */
 824        ret = wm831x_reg_read(wm831x, WM831X_DCDC_STATUS);
 825        if (ret < 0)
 826                return ret;
 827        if (ret & (1 << rdev_get_id(rdev)))
 828                return REGULATOR_STATUS_ON;
 829        else
 830                return REGULATOR_STATUS_OFF;
 831}
 832
 833static struct regulator_ops wm831x_boostp_ops = {
 834        .get_status = wm831x_boostp_get_status,
 835
 836        .is_enabled = wm831x_dcdc_is_enabled,
 837        .enable = wm831x_dcdc_enable,
 838        .disable = wm831x_dcdc_disable,
 839};
 840
 841static __devinit int wm831x_boostp_probe(struct platform_device *pdev)
 842{
 843        struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
 844        struct wm831x_pdata *pdata = wm831x->dev->platform_data;
 845        int id = pdev->id % ARRAY_SIZE(pdata->dcdc);
 846        struct wm831x_dcdc *dcdc;
 847        struct resource *res;
 848        int ret, irq;
 849
 850        dev_dbg(&pdev->dev, "Probing DCDC%d\n", id + 1);
 851
 852        if (pdata == NULL || pdata->dcdc[id] == NULL)
 853                return -ENODEV;
 854
 855        dcdc = kzalloc(sizeof(struct wm831x_dcdc), GFP_KERNEL);
 856        if (dcdc == NULL) {
 857                dev_err(&pdev->dev, "Unable to allocate private data\n");
 858                return -ENOMEM;
 859        }
 860
 861        dcdc->wm831x = wm831x;
 862
 863        res = platform_get_resource(pdev, IORESOURCE_IO, 0);
 864        if (res == NULL) {
 865                dev_err(&pdev->dev, "No I/O resource\n");
 866                ret = -EINVAL;
 867                goto err;
 868        }
 869        dcdc->base = res->start;
 870
 871        snprintf(dcdc->name, sizeof(dcdc->name), "DCDC%d", id + 1);
 872        dcdc->desc.name = dcdc->name;
 873        dcdc->desc.id = id;
 874        dcdc->desc.type = REGULATOR_VOLTAGE;
 875        dcdc->desc.ops = &wm831x_boostp_ops;
 876        dcdc->desc.owner = THIS_MODULE;
 877
 878        dcdc->regulator = regulator_register(&dcdc->desc, &pdev->dev,
 879                                             pdata->dcdc[id], dcdc);
 880        if (IS_ERR(dcdc->regulator)) {
 881                ret = PTR_ERR(dcdc->regulator);
 882                dev_err(wm831x->dev, "Failed to register DCDC%d: %d\n",
 883                        id + 1, ret);
 884                goto err;
 885        }
 886
 887        irq = platform_get_irq_byname(pdev, "UV");
 888        ret = wm831x_request_irq(wm831x, irq, wm831x_dcdc_uv_irq,
 889                                 IRQF_TRIGGER_RISING, dcdc->name,
 890                                 dcdc);
 891        if (ret != 0) {
 892                dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
 893                        irq, ret);
 894                goto err_regulator;
 895        }
 896
 897        platform_set_drvdata(pdev, dcdc);
 898
 899        return 0;
 900
 901err_regulator:
 902        regulator_unregister(dcdc->regulator);
 903err:
 904        kfree(dcdc);
 905        return ret;
 906}
 907
 908static __devexit int wm831x_boostp_remove(struct platform_device *pdev)
 909{
 910        struct wm831x_dcdc *dcdc = platform_get_drvdata(pdev);
 911        struct wm831x *wm831x = dcdc->wm831x;
 912
 913        platform_set_drvdata(pdev, NULL);
 914
 915        wm831x_free_irq(wm831x, platform_get_irq_byname(pdev, "UV"), dcdc);
 916        regulator_unregister(dcdc->regulator);
 917        kfree(dcdc);
 918
 919        return 0;
 920}
 921
 922static struct platform_driver wm831x_boostp_driver = {
 923        .probe = wm831x_boostp_probe,
 924        .remove = __devexit_p(wm831x_boostp_remove),
 925        .driver         = {
 926                .name   = "wm831x-boostp",
 927                .owner  = THIS_MODULE,
 928        },
 929};
 930
 931/*
 932 * External Power Enable
 933 *
 934 * These aren't actually DCDCs but look like them in hardware so share
 935 * code.
 936 */
 937
 938#define WM831X_EPE_BASE 6
 939
 940static struct regulator_ops wm831x_epe_ops = {
 941        .is_enabled = wm831x_dcdc_is_enabled,
 942        .enable = wm831x_dcdc_enable,
 943        .disable = wm831x_dcdc_disable,
 944        .get_status = wm831x_dcdc_get_status,
 945};
 946
 947static __devinit int wm831x_epe_probe(struct platform_device *pdev)
 948{
 949        struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
 950        struct wm831x_pdata *pdata = wm831x->dev->platform_data;
 951        int id = pdev->id % ARRAY_SIZE(pdata->epe);
 952        struct wm831x_dcdc *dcdc;
 953        int ret;
 954
 955        dev_dbg(&pdev->dev, "Probing EPE%d\n", id + 1);
 956
 957        if (pdata == NULL || pdata->epe[id] == NULL)
 958                return -ENODEV;
 959
 960        dcdc = kzalloc(sizeof(struct wm831x_dcdc), GFP_KERNEL);
 961        if (dcdc == NULL) {
 962                dev_err(&pdev->dev, "Unable to allocate private data\n");
 963                return -ENOMEM;
 964        }
 965
 966        dcdc->wm831x = wm831x;
 967
 968        /* For current parts this is correct; probably need to revisit
 969         * in future.
 970         */
 971        snprintf(dcdc->name, sizeof(dcdc->name), "EPE%d", id + 1);
 972        dcdc->desc.name = dcdc->name;
 973        dcdc->desc.id = id + WM831X_EPE_BASE; /* Offset in DCDC registers */
 974        dcdc->desc.ops = &wm831x_epe_ops;
 975        dcdc->desc.type = REGULATOR_VOLTAGE;
 976        dcdc->desc.owner = THIS_MODULE;
 977
 978        dcdc->regulator = regulator_register(&dcdc->desc, &pdev->dev,
 979                                             pdata->epe[id], dcdc);
 980        if (IS_ERR(dcdc->regulator)) {
 981                ret = PTR_ERR(dcdc->regulator);
 982                dev_err(wm831x->dev, "Failed to register EPE%d: %d\n",
 983                        id + 1, ret);
 984                goto err;
 985        }
 986
 987        platform_set_drvdata(pdev, dcdc);
 988
 989        return 0;
 990
 991err:
 992        kfree(dcdc);
 993        return ret;
 994}
 995
 996static __devexit int wm831x_epe_remove(struct platform_device *pdev)
 997{
 998        struct wm831x_dcdc *dcdc = platform_get_drvdata(pdev);
 999
1000        platform_set_drvdata(pdev, NULL);
1001
1002        regulator_unregister(dcdc->regulator);
1003        kfree(dcdc);
1004
1005        return 0;
1006}
1007
1008static struct platform_driver wm831x_epe_driver = {
1009        .probe = wm831x_epe_probe,
1010        .remove = __devexit_p(wm831x_epe_remove),
1011        .driver         = {
1012                .name   = "wm831x-epe",
1013                .owner  = THIS_MODULE,
1014        },
1015};
1016
1017static int __init wm831x_dcdc_init(void)
1018{
1019        int ret;
1020        ret = platform_driver_register(&wm831x_buckv_driver);
1021        if (ret != 0)
1022                pr_err("Failed to register WM831x BUCKV driver: %d\n", ret);
1023
1024        ret = platform_driver_register(&wm831x_buckp_driver);
1025        if (ret != 0)
1026                pr_err("Failed to register WM831x BUCKP driver: %d\n", ret);
1027
1028        ret = platform_driver_register(&wm831x_boostp_driver);
1029        if (ret != 0)
1030                pr_err("Failed to register WM831x BOOST driver: %d\n", ret);
1031
1032        ret = platform_driver_register(&wm831x_epe_driver);
1033        if (ret != 0)
1034                pr_err("Failed to register WM831x EPE driver: %d\n", ret);
1035
1036        return 0;
1037}
1038subsys_initcall(wm831x_dcdc_init);
1039
1040static void __exit wm831x_dcdc_exit(void)
1041{
1042        platform_driver_unregister(&wm831x_epe_driver);
1043        platform_driver_unregister(&wm831x_boostp_driver);
1044        platform_driver_unregister(&wm831x_buckp_driver);
1045        platform_driver_unregister(&wm831x_buckv_driver);
1046}
1047module_exit(wm831x_dcdc_exit);
1048
1049/* Module information */
1050MODULE_AUTHOR("Mark Brown");
1051MODULE_DESCRIPTION("WM831x DC-DC convertor driver");
1052MODULE_LICENSE("GPL");
1053MODULE_ALIAS("platform:wm831x-buckv");
1054MODULE_ALIAS("platform:wm831x-buckp");
1055