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 9
  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        char supply_name[WM831X_DCDC_MAX_NAME];
  54        struct regulator_desc desc;
  55        int base;
  56        struct wm831x *wm831x;
  57        struct regulator_dev *regulator;
  58        int dvs_gpio;
  59        int dvs_gpio_state;
  60        int on_vsel;
  61        int dvs_vsel;
  62};
  63
  64static unsigned int wm831x_dcdc_get_mode(struct regulator_dev *rdev)
  65
  66{
  67        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
  68        struct wm831x *wm831x = dcdc->wm831x;
  69        u16 reg = dcdc->base + WM831X_DCDC_ON_CONFIG;
  70        int val;
  71
  72        val = wm831x_reg_read(wm831x, reg);
  73        if (val < 0)
  74                return val;
  75
  76        val = (val & WM831X_DC1_ON_MODE_MASK) >> WM831X_DC1_ON_MODE_SHIFT;
  77
  78        switch (val) {
  79        case WM831X_DCDC_MODE_FAST:
  80                return REGULATOR_MODE_FAST;
  81        case WM831X_DCDC_MODE_NORMAL:
  82                return REGULATOR_MODE_NORMAL;
  83        case WM831X_DCDC_MODE_STANDBY:
  84                return REGULATOR_MODE_STANDBY;
  85        case WM831X_DCDC_MODE_IDLE:
  86                return REGULATOR_MODE_IDLE;
  87        default:
  88                BUG();
  89                return -EINVAL;
  90        }
  91}
  92
  93static int wm831x_dcdc_set_mode_int(struct wm831x *wm831x, int reg,
  94                                    unsigned int mode)
  95{
  96        int val;
  97
  98        switch (mode) {
  99        case REGULATOR_MODE_FAST:
 100                val = WM831X_DCDC_MODE_FAST;
 101                break;
 102        case REGULATOR_MODE_NORMAL:
 103                val = WM831X_DCDC_MODE_NORMAL;
 104                break;
 105        case REGULATOR_MODE_STANDBY:
 106                val = WM831X_DCDC_MODE_STANDBY;
 107                break;
 108        case REGULATOR_MODE_IDLE:
 109                val = WM831X_DCDC_MODE_IDLE;
 110                break;
 111        default:
 112                return -EINVAL;
 113        }
 114
 115        return wm831x_set_bits(wm831x, reg, WM831X_DC1_ON_MODE_MASK,
 116                               val << WM831X_DC1_ON_MODE_SHIFT);
 117}
 118
 119static int wm831x_dcdc_set_mode(struct regulator_dev *rdev, unsigned int mode)
 120{
 121        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 122        struct wm831x *wm831x = dcdc->wm831x;
 123        u16 reg = dcdc->base + WM831X_DCDC_ON_CONFIG;
 124
 125        return wm831x_dcdc_set_mode_int(wm831x, reg, mode);
 126}
 127
 128static int wm831x_dcdc_set_suspend_mode(struct regulator_dev *rdev,
 129                                        unsigned int mode)
 130{
 131        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 132        struct wm831x *wm831x = dcdc->wm831x;
 133        u16 reg = dcdc->base + WM831X_DCDC_SLEEP_CONTROL;
 134
 135        return wm831x_dcdc_set_mode_int(wm831x, reg, mode);
 136}
 137
 138static int wm831x_dcdc_get_status(struct regulator_dev *rdev)
 139{
 140        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 141        struct wm831x *wm831x = dcdc->wm831x;
 142        int ret;
 143
 144        /* First, check for errors */
 145        ret = wm831x_reg_read(wm831x, WM831X_DCDC_UV_STATUS);
 146        if (ret < 0)
 147                return ret;
 148
 149        if (ret & (1 << rdev_get_id(rdev))) {
 150                dev_dbg(wm831x->dev, "DCDC%d under voltage\n",
 151                        rdev_get_id(rdev) + 1);
 152                return REGULATOR_STATUS_ERROR;
 153        }
 154
 155        /* DCDC1 and DCDC2 can additionally detect high voltage/current */
 156        if (rdev_get_id(rdev) < 2) {
 157                if (ret & (WM831X_DC1_OV_STS << rdev_get_id(rdev))) {
 158                        dev_dbg(wm831x->dev, "DCDC%d over voltage\n",
 159                                rdev_get_id(rdev) + 1);
 160                        return REGULATOR_STATUS_ERROR;
 161                }
 162
 163                if (ret & (WM831X_DC1_HC_STS << rdev_get_id(rdev))) {
 164                        dev_dbg(wm831x->dev, "DCDC%d over current\n",
 165                                rdev_get_id(rdev) + 1);
 166                        return REGULATOR_STATUS_ERROR;
 167                }
 168        }
 169
 170        /* Is the regulator on? */
 171        ret = wm831x_reg_read(wm831x, WM831X_DCDC_STATUS);
 172        if (ret < 0)
 173                return ret;
 174        if (!(ret & (1 << rdev_get_id(rdev))))
 175                return REGULATOR_STATUS_OFF;
 176
 177        /* TODO: When we handle hardware control modes so we can report the
 178         * current mode. */
 179        return REGULATOR_STATUS_ON;
 180}
 181
 182static irqreturn_t wm831x_dcdc_uv_irq(int irq, void *data)
 183{
 184        struct wm831x_dcdc *dcdc = data;
 185
 186        regulator_notifier_call_chain(dcdc->regulator,
 187                                      REGULATOR_EVENT_UNDER_VOLTAGE,
 188                                      NULL);
 189
 190        return IRQ_HANDLED;
 191}
 192
 193static irqreturn_t wm831x_dcdc_oc_irq(int irq, void *data)
 194{
 195        struct wm831x_dcdc *dcdc = data;
 196
 197        regulator_notifier_call_chain(dcdc->regulator,
 198                                      REGULATOR_EVENT_OVER_CURRENT,
 199                                      NULL);
 200
 201        return IRQ_HANDLED;
 202}
 203
 204/*
 205 * BUCKV specifics
 206 */
 207
 208static int wm831x_buckv_list_voltage(struct regulator_dev *rdev,
 209                                      unsigned selector)
 210{
 211        if (selector <= 0x8)
 212                return 600000;
 213        if (selector <= WM831X_BUCKV_MAX_SELECTOR)
 214                return 600000 + ((selector - 0x8) * 12500);
 215        return -EINVAL;
 216}
 217
 218static int wm831x_buckv_map_voltage(struct regulator_dev *rdev,
 219                                   int min_uV, int max_uV)
 220{
 221        u16 vsel;
 222
 223        if (min_uV < 600000)
 224                vsel = 0;
 225        else if (min_uV <= 1800000)
 226                vsel = DIV_ROUND_UP(min_uV - 600000, 12500) + 8;
 227        else
 228                return -EINVAL;
 229
 230        if (wm831x_buckv_list_voltage(rdev, vsel) > max_uV)
 231                return -EINVAL;
 232
 233        return vsel;
 234}
 235
 236static int wm831x_buckv_set_dvs(struct regulator_dev *rdev, int state)
 237{
 238        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 239
 240        if (state == dcdc->dvs_gpio_state)
 241                return 0;
 242
 243        dcdc->dvs_gpio_state = state;
 244        gpio_set_value(dcdc->dvs_gpio, state);
 245
 246        /* Should wait for DVS state change to be asserted if we have
 247         * a GPIO for it, for now assume the device is configured
 248         * for the fastest possible transition.
 249         */
 250
 251        return 0;
 252}
 253
 254static int wm831x_buckv_set_voltage_sel(struct regulator_dev *rdev,
 255                                        unsigned vsel)
 256{
 257        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 258        struct wm831x *wm831x = dcdc->wm831x;
 259        int on_reg = dcdc->base + WM831X_DCDC_ON_CONFIG;
 260        int dvs_reg = dcdc->base + WM831X_DCDC_DVS_CONTROL;
 261        int ret;
 262
 263        /* If this value is already set then do a GPIO update if we can */
 264        if (dcdc->dvs_gpio && dcdc->on_vsel == vsel)
 265                return wm831x_buckv_set_dvs(rdev, 0);
 266
 267        if (dcdc->dvs_gpio && dcdc->dvs_vsel == vsel)
 268                return wm831x_buckv_set_dvs(rdev, 1);
 269
 270        /* Always set the ON status to the minimum voltage */
 271        ret = wm831x_set_bits(wm831x, on_reg, WM831X_DC1_ON_VSEL_MASK, vsel);
 272        if (ret < 0)
 273                return ret;
 274        dcdc->on_vsel = vsel;
 275
 276        if (!dcdc->dvs_gpio)
 277                return ret;
 278
 279        /* Kick the voltage transition now */
 280        ret = wm831x_buckv_set_dvs(rdev, 0);
 281        if (ret < 0)
 282                return ret;
 283
 284        /*
 285         * If this VSEL is higher than the last one we've seen then
 286         * remember it as the DVS VSEL.  This is optimised for CPUfreq
 287         * usage where we want to get to the highest voltage very
 288         * quickly.
 289         */
 290        if (vsel > dcdc->dvs_vsel) {
 291                ret = wm831x_set_bits(wm831x, dvs_reg,
 292                                      WM831X_DC1_DVS_VSEL_MASK,
 293                                      vsel);
 294                if (ret == 0)
 295                        dcdc->dvs_vsel = vsel;
 296                else
 297                        dev_warn(wm831x->dev,
 298                                 "Failed to set DCDC DVS VSEL: %d\n", ret);
 299        }
 300
 301        return 0;
 302}
 303
 304static int wm831x_buckv_set_suspend_voltage(struct regulator_dev *rdev,
 305                                            int uV)
 306{
 307        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 308        struct wm831x *wm831x = dcdc->wm831x;
 309        u16 reg = dcdc->base + WM831X_DCDC_SLEEP_CONTROL;
 310        int vsel;
 311
 312        vsel = wm831x_buckv_map_voltage(rdev, uV, uV);
 313        if (vsel < 0)
 314                return vsel;
 315
 316        return wm831x_set_bits(wm831x, reg, WM831X_DC1_SLP_VSEL_MASK, vsel);
 317}
 318
 319static int wm831x_buckv_get_voltage_sel(struct regulator_dev *rdev)
 320{
 321        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 322
 323        if (dcdc->dvs_gpio && dcdc->dvs_gpio_state)
 324                return dcdc->dvs_vsel;
 325        else
 326                return dcdc->on_vsel;
 327}
 328
 329/* Current limit options */
 330static u16 wm831x_dcdc_ilim[] = {
 331        125, 250, 375, 500, 625, 750, 875, 1000
 332};
 333
 334static int wm831x_buckv_set_current_limit(struct regulator_dev *rdev,
 335                                           int min_uA, int max_uA)
 336{
 337        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 338        struct wm831x *wm831x = dcdc->wm831x;
 339        u16 reg = dcdc->base + WM831X_DCDC_CONTROL_2;
 340        int i;
 341
 342        for (i = ARRAY_SIZE(wm831x_dcdc_ilim) - 1; i >= 0; i--) {
 343                if ((min_uA <= wm831x_dcdc_ilim[i]) &&
 344                    (wm831x_dcdc_ilim[i] <= max_uA))
 345                        return wm831x_set_bits(wm831x, reg,
 346                                               WM831X_DC1_HC_THR_MASK,
 347                                                i << WM831X_DC1_HC_THR_SHIFT);
 348        }
 349
 350        return -EINVAL;
 351}
 352
 353static int wm831x_buckv_get_current_limit(struct regulator_dev *rdev)
 354{
 355        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 356        struct wm831x *wm831x = dcdc->wm831x;
 357        u16 reg = dcdc->base + WM831X_DCDC_CONTROL_2;
 358        int val;
 359
 360        val = wm831x_reg_read(wm831x, reg);
 361        if (val < 0)
 362                return val;
 363
 364        val = (val & WM831X_DC1_HC_THR_MASK) >> WM831X_DC1_HC_THR_SHIFT;
 365        return wm831x_dcdc_ilim[val];
 366}
 367
 368static struct regulator_ops wm831x_buckv_ops = {
 369        .set_voltage_sel = wm831x_buckv_set_voltage_sel,
 370        .get_voltage_sel = wm831x_buckv_get_voltage_sel,
 371        .list_voltage = wm831x_buckv_list_voltage,
 372        .map_voltage = wm831x_buckv_map_voltage,
 373        .set_suspend_voltage = wm831x_buckv_set_suspend_voltage,
 374        .set_current_limit = wm831x_buckv_set_current_limit,
 375        .get_current_limit = wm831x_buckv_get_current_limit,
 376
 377        .is_enabled = regulator_is_enabled_regmap,
 378        .enable = regulator_enable_regmap,
 379        .disable = regulator_disable_regmap,
 380        .get_status = wm831x_dcdc_get_status,
 381        .get_mode = wm831x_dcdc_get_mode,
 382        .set_mode = wm831x_dcdc_set_mode,
 383        .set_suspend_mode = wm831x_dcdc_set_suspend_mode,
 384};
 385
 386/*
 387 * Set up DVS control.  We just log errors since we can still run
 388 * (with reduced performance) if we fail.
 389 */
 390static void wm831x_buckv_dvs_init(struct wm831x_dcdc *dcdc,
 391                                            struct wm831x_buckv_pdata *pdata)
 392{
 393        struct wm831x *wm831x = dcdc->wm831x;
 394        int ret;
 395        u16 ctrl;
 396
 397        if (!pdata || !pdata->dvs_gpio)
 398                return;
 399
 400        /* gpiolib won't let us read the GPIO status so pick the higher
 401         * of the two existing voltages so we take it as platform data.
 402         */
 403        dcdc->dvs_gpio_state = pdata->dvs_init_state;
 404
 405        ret = gpio_request_one(pdata->dvs_gpio,
 406                               dcdc->dvs_gpio_state ? GPIOF_INIT_HIGH : 0,
 407                               "DCDC DVS");
 408        if (ret < 0) {
 409                dev_err(wm831x->dev, "Failed to get %s DVS GPIO: %d\n",
 410                        dcdc->name, ret);
 411                return;
 412        }
 413
 414        dcdc->dvs_gpio = pdata->dvs_gpio;
 415
 416        switch (pdata->dvs_control_src) {
 417        case 1:
 418                ctrl = 2 << WM831X_DC1_DVS_SRC_SHIFT;
 419                break;
 420        case 2:
 421                ctrl = 3 << WM831X_DC1_DVS_SRC_SHIFT;
 422                break;
 423        default:
 424                dev_err(wm831x->dev, "Invalid DVS control source %d for %s\n",
 425                        pdata->dvs_control_src, dcdc->name);
 426                return;
 427        }
 428
 429        /* If DVS_VSEL is set to the minimum value then raise it to ON_VSEL
 430         * to make bootstrapping a bit smoother.
 431         */
 432        if (!dcdc->dvs_vsel) {
 433                ret = wm831x_set_bits(wm831x,
 434                                      dcdc->base + WM831X_DCDC_DVS_CONTROL,
 435                                      WM831X_DC1_DVS_VSEL_MASK, dcdc->on_vsel);
 436                if (ret == 0)
 437                        dcdc->dvs_vsel = dcdc->on_vsel;
 438                else
 439                        dev_warn(wm831x->dev, "Failed to set DVS_VSEL: %d\n",
 440                                 ret);
 441        }
 442
 443        ret = wm831x_set_bits(wm831x, dcdc->base + WM831X_DCDC_DVS_CONTROL,
 444                              WM831X_DC1_DVS_SRC_MASK, ctrl);
 445        if (ret < 0) {
 446                dev_err(wm831x->dev, "Failed to set %s DVS source: %d\n",
 447                        dcdc->name, ret);
 448        }
 449}
 450
 451static int wm831x_buckv_probe(struct platform_device *pdev)
 452{
 453        struct wm831x *wm831x = dev_get_drvdata(pdev->dev.parent);
 454        struct wm831x_pdata *pdata = wm831x->dev->platform_data;
 455        struct regulator_config config = { };
 456        int id;
 457        struct wm831x_dcdc *dcdc;
 458        struct resource *res;
 459        int ret, irq;
 460
 461        if (pdata && pdata->wm831x_num)
 462                id = (pdata->wm831x_num * 10) + 1;
 463        else
 464                id = 0;
 465        id = pdev->id - id;
 466
 467        dev_dbg(&pdev->dev, "Probing DCDC%d\n", id + 1);
 468
 469        dcdc = devm_kzalloc(&pdev->dev,  sizeof(struct wm831x_dcdc),
 470                            GFP_KERNEL);
 471        if (dcdc == NULL) {
 472                dev_err(&pdev->dev, "Unable to allocate private data\n");
 473                return -ENOMEM;
 474        }
 475
 476        dcdc->wm831x = wm831x;
 477
 478        res = platform_get_resource(pdev, IORESOURCE_REG, 0);
 479        if (res == NULL) {
 480                dev_err(&pdev->dev, "No REG resource\n");
 481                ret = -EINVAL;
 482                goto err;
 483        }
 484        dcdc->base = res->start;
 485
 486        snprintf(dcdc->name, sizeof(dcdc->name), "DCDC%d", id + 1);
 487        dcdc->desc.name = dcdc->name;
 488
 489        snprintf(dcdc->supply_name, sizeof(dcdc->supply_name),
 490                 "DC%dVDD", id + 1);
 491        dcdc->desc.supply_name = dcdc->supply_name;
 492
 493        dcdc->desc.id = id;
 494        dcdc->desc.type = REGULATOR_VOLTAGE;
 495        dcdc->desc.n_voltages = WM831X_BUCKV_MAX_SELECTOR + 1;
 496        dcdc->desc.ops = &wm831x_buckv_ops;
 497        dcdc->desc.owner = THIS_MODULE;
 498        dcdc->desc.enable_reg = WM831X_DCDC_ENABLE;
 499        dcdc->desc.enable_mask = 1 << id;
 500
 501        ret = wm831x_reg_read(wm831x, dcdc->base + WM831X_DCDC_ON_CONFIG);
 502        if (ret < 0) {
 503                dev_err(wm831x->dev, "Failed to read ON VSEL: %d\n", ret);
 504                goto err;
 505        }
 506        dcdc->on_vsel = ret & WM831X_DC1_ON_VSEL_MASK;
 507
 508        ret = wm831x_reg_read(wm831x, dcdc->base + WM831X_DCDC_DVS_CONTROL);
 509        if (ret < 0) {
 510                dev_err(wm831x->dev, "Failed to read DVS VSEL: %d\n", ret);
 511                goto err;
 512        }
 513        dcdc->dvs_vsel = ret & WM831X_DC1_DVS_VSEL_MASK;
 514
 515        if (pdata && pdata->dcdc[id])
 516                wm831x_buckv_dvs_init(dcdc, pdata->dcdc[id]->driver_data);
 517
 518        config.dev = pdev->dev.parent;
 519        if (pdata)
 520                config.init_data = pdata->dcdc[id];
 521        config.driver_data = dcdc;
 522        config.regmap = wm831x->regmap;
 523
 524        dcdc->regulator = regulator_register(&dcdc->desc, &config);
 525        if (IS_ERR(dcdc->regulator)) {
 526                ret = PTR_ERR(dcdc->regulator);
 527                dev_err(wm831x->dev, "Failed to register DCDC%d: %d\n",
 528                        id + 1, ret);
 529                goto err;
 530        }
 531
 532        irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV"));
 533        ret = request_threaded_irq(irq, NULL, wm831x_dcdc_uv_irq,
 534                                   IRQF_TRIGGER_RISING, dcdc->name, dcdc);
 535        if (ret != 0) {
 536                dev_err(&pdev->dev, "Failed to request UV IRQ %d: %d\n",
 537                        irq, ret);
 538                goto err_regulator;
 539        }
 540
 541        irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "HC"));
 542        ret = request_threaded_irq(irq, NULL, wm831x_dcdc_oc_irq,
 543                                   IRQF_TRIGGER_RISING, dcdc->name, dcdc);
 544        if (ret != 0) {
 545                dev_err(&pdev->dev, "Failed to request HC IRQ %d: %d\n",
 546                        irq, ret);
 547                goto err_uv;
 548        }
 549
 550        platform_set_drvdata(pdev, dcdc);
 551
 552        return 0;
 553
 554err_uv:
 555        free_irq(wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV")),
 556                 dcdc);
 557err_regulator:
 558        regulator_unregister(dcdc->regulator);
 559err:
 560        if (dcdc->dvs_gpio)
 561                gpio_free(dcdc->dvs_gpio);
 562        return ret;
 563}
 564
 565static int wm831x_buckv_remove(struct platform_device *pdev)
 566{
 567        struct wm831x_dcdc *dcdc = platform_get_drvdata(pdev);
 568        struct wm831x *wm831x = dcdc->wm831x;
 569
 570        platform_set_drvdata(pdev, NULL);
 571
 572        free_irq(wm831x_irq(wm831x, platform_get_irq_byname(pdev, "HC")),
 573                            dcdc);
 574        free_irq(wm831x_irq(wm831x, platform_get_irq_byname(pdev, "UV")),
 575                            dcdc);
 576        regulator_unregister(dcdc->regulator);
 577        if (dcdc->dvs_gpio)
 578                gpio_free(dcdc->dvs_gpio);
 579
 580        return 0;
 581}
 582
 583static struct platform_driver wm831x_buckv_driver = {
 584        .probe = wm831x_buckv_probe,
 585        .remove = wm831x_buckv_remove,
 586        .driver         = {
 587                .name   = "wm831x-buckv",
 588                .owner  = THIS_MODULE,
 589        },
 590};
 591
 592/*
 593 * BUCKP specifics
 594 */
 595
 596static int wm831x_buckp_set_suspend_voltage(struct regulator_dev *rdev, int uV)
 597{
 598        struct wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
 599        struct wm831x *wm831x = dcdc->wm831x;
 600        u16 reg = dcdc->base + WM831X_DCDCSLEEPS_CONTRODC_SLEEPS_CONTROL" class="sref">WM831X_DCDCSLEEPS_4ass="sref">reg = uV)
reg = 6503                <6 href60t" class="sref">ret = regulatmapcode=reg_    agister(rdev);
6504                g6to ret != 0 = 6595
ret;
reg = 6596static int 6507
ret;
;
wm831x, ;
6598        struct 6509        if (6510                <6 href6"+codelatform_driver" class="sref">ef="+code=_ops;
wm831x_pv_ops;
6511                g6to supplregulatcla ode=reg_ = _r;
6512        }
suppgregulatgla ode=reg_ = _r;
6513        supplistbuckp_set_suspend_voltalistbuckp_sess="gister" class="sref">regulatlistbuckp_se_    agister(6514
probe mapcode=register(regulatmapcode=reg_    agister(6515        if (removewm831x_buckp_set_suspend_volta wm831x_sref">wm831x_buckp_set_suspend_voltage(struct 6516                <6 href61or/wm831x-dcdc.c#L467" id="L467" class="line" na6e="L517">6517
removeregulat"s_a href _r;
6518        enable_mashref="drivers/rle_masss="gister" class="sref">regulate=WM831X_D6519        if (driveris_mashref="drivers/r>is_masss="gister" class="sref">regulat>is_mas1X_D6520                <6 href6"+code=config"lass="sref">suppg;
wm8ers/rg;
wm8ers/rg6521        suppg;
wm8ers/rg;
wm8ers/rg6522        supps;
wm8ers/rs;
wm8ers/rs6523
supp wm8ers/rswm8ers/rs6524        6525        if (6526                <6 href62=wm831x_buckp_set_suspend_voltage" class="srkv_probe,
platform_device *pdev)
6527                <6 href62tor/wm831x-dcdc.c#L598" id="L598" class="line" na6e="L528">6528                 6     62code=wm831x" class="sref">wm831x *wm831x = dcdc->dev_get_drvdata(rdev);
t;dev.parent;
6529                g6to wm831x *pdev)
wm831x->regmapregmap(6530        }
ef="+code=>);
);
6531
uV)
6532        wm831x_dcdc *dcdc = 6533        efsource *rdev, in> = 6534                 6     6           uV)
id + 1);
6535        if (6536                <6 href6"+code=dev_errs="sref">pdata && pdata->dcdc[6537                 6     6uV)
pdata && dcdc[6538                g6to 6539        }
uV)
6540
u16 id;
dev.uV)
6541        6542        ret = pdev->dev, "Failed to request HC IRQ %PulaC Ipan>,
ret);
6543                 6     64or/wm831x-dcdc.c#L554" id="L554" class="line" na6e="L544">6544        if (dcdc->dcdc->dem_kzallo;pdev->dev, "Faisizeofm_device" class="sref">1x_dcdc *6545                <6 href6"+code=dev_err" class=e=err" class">uV)
6546                 6     64+code=dev_errs="sref">pdata t;dcdc-&g6547                g6to ret = pdev->dev, "Failed to request HC IRQ %U=WM837;d\allo;ate p#L5ate codee=ret" class="swm831x-dcdc.c#L599" id="L599" class="line" na6e="L538">6548        }
dev, ENOMEMor/wm831x-dcdc.c#L500" id="L500" class="line" na6e="L529">6549
6550        6551
irq = wm831x;
wm831x->6552        return 0;66553
ret = platformefsource *platformefsources="sref">rdev);
t;ret);
, 6554ret != 0)  = dcdc-&g6555        ret = pdev->dev, "Failed to request HC IRQ %No REI efsourcee=ret" class="swm831x-dcdc.c#L599" id="L599" class="line" na6e="L556">6556                 6a hre6="+code=dcdc" class="s">uV)
dev, 6557err_uv;
href="drivers/rlator/wm831x-dcdc.c#L530" id="L530" class="line" na6e="L558">6558        6559irq = wm831xwm831x6560        if (6561                <6 href66q" class="sref">irq = rdev);
t;wm831xrdev);
t;wm831xret);
6562        return ret = dvs_gpiomp;name   = "sref">dcdc->base + = &quom831x-dcdc.c#L599" id="L599" class="line" na6e="L553">6563}
6564
dcdc-&gsnp#Lntff="drivers/regusnp#Lntfs="sref">rdev);
t;wm831xrdev);
t;wm831x6565static int ret);
6566{
dvs_gpiomp;name   supply_= dcdc->base + supply_= 6567        struct 6568        struct dvs_gpiomp;name   ref="+code=id" class="sref">id;
6569
irq = wm831xname   typspan class="stritypss="sref">id;
,
6570        dvs_gpiomp;name   =code=reg = id;
6571
irq = wm831xname   _ops;
pdev-&gef">wm831x_pv_ops;
6572        free_irt;wm831xname   _= THIS_MODULE,
6573                 6     67t" class="sref">ret = wm831xname   v = _r;
dcdc->base + WONss="FIISING, WONss="FIIor/wm831x-dcdc.c#L500" id="L500" class="line" na6e="L564">6574        free_irt;wm831xname   v = _maskid;
;
6575                 6     6    free_irt;wm831xname   e=WM831X_Dhref="drivers/rl=WM831X_Ds="sref">id;
WENABa>,
WENABa>or/wm831x-dcdc.c#L500" id="L500" class="line" na6e="L556">6576        wm831xname   e=WM831maskid;
6577        if (wm831xname   min_ef="drivers/regulmin_efs="sref850000m831x-dcdc.c#L500" id="L500" class="line" na6e="L568">6578                <6 href67gulator_unregister" class="sc;dvs_gpiomp;name   uV_ste href="drivers/ruV_ste s="sref25000m831x-dcdc.c#L500" id="L500" class="line" na6e="L569">6579
6580        return 0;6drivern class="string">"Fref">id;
dev.parent;
6581}
pdata && 6582
driver(id;
dcdc[id;
6583static struct ret = );
driver#L500ev_drvdata(#L500ev_drss="tsref">dcdc->6584        .free_ir>);
driverwm831x->regmap6585        .6586        .wm831x(pdev-&gc;dvs_gpiomp;pdev-&g>);
6587                .6a hre68e=dcdc" class="sref">dcdc-&gs/rERR= rdev);
t;wm831x6588                .6a hre6="+code=owner" class="sref">wm831xrdev);
t;wm831x6589        },
uV)
wm831x->regmap"Failed to request HC IRQ %d: %d\n&" claspan>,
6590};
uV)
ret);
6591
err_uv;
href="drivers/rlator/wm831x-dcdc.c#L530" id="L530" class="line" na6e="L592">6592/69ee_irq" classm831x-dcdc.c#L549" id="L549" class="line" na6e="L593">6593 69or/wm831x-dcdc.c#L554" id="L554" class="line" na6e="L594">6594 69ee_irq" class="sref">free_irwm8wm8wm831x->platform_get_irq_byname(pdev, "UV")),
6595
free_iridref="+code=request_threaded_irq" class="sn"_trq"aded8pdev, <NULL);
NULL);
ef">wm8ers/ruv8wm8ers/ruv86596static int uV)
, NULL);
t;wm831xNULL);
t;6597{
dcdc-&gidref="+code=request_threa!= 0wcm831x-dcdc.c#L598" id="L598" class="line" na6e="L598">6598        struct wm831xpdev->dev, "Failed to request HC IRQ %d: %d\n" UV eRQ 
6599        struct free_irret);
7600        err_uv;
_id="L596"href="drivers/rivers/regulator/wm831x-dcdc.c#L547" id="L547" class="line" na7e1"L600">7691
7503                <7 href70t" class="sref">ret = platform_set_drvdata(pdev, NULL);
t;7504                g7to 7595
7596static int 7507
err_regulator:
7598        struct regulator_unregister(dcdc->regulator);
7509        if (err:
7510                <7 href71="drivers/regulator/f">ret);
7511                g7to 7512        }
7513        platform_device *pdev)
7514
7515        if (wm831x_dcdc *dcdc = platform_get_drvdata(pdev);
7516                <7 href71or/wm831x-dcdc.c#L467" id="L467" class="line" na7e="L517">7517
platform_set_drvdata(pdev, NULL);
7518        7519        if (irq = (wm831x_irq(wm831xregula>->platform_get_irq_byname(pdev, "UV")),
7520                <7 href720ef="+code=err" classr" classss="sref">wm831x7521        irq = regulator_unregister(dcdc->regulator);
7522        7523
7524        7525        if (7526                <7 href72=wm831x_buck_driver" class="sref">platform_driver wm831x_puckv_driver = {
7527                <7 href727move" class="sref">removewm831x_bsrkv_probe,
7528                 7     72nfig" class="lass="sref">enab> = wm831x_srckv_remove,
7529                g7to driverkv_driver = {
7530        }
name   = "wm831x-buckv",
7531
owner  = THIS_MODULE,
7532        7533        7534                 7     73or/wm831x-dcdc.c#L565" id="L565" class="line" na7e="L525">7535        if (7536                <7 href7"+code specifics
, boost con59393"lator/wm831x-dcdc.c#L594" id="L594" class="line" na7e="L537">7537                 7     7
7538                g7to 7539        }
;
wm8soostprgef="+code=v *rdev, int 7540
7541        wm831x_dcdc *dcdc = rdev_get_drvdata(rdev);
7542        wm831x *wm831x = dcdc->wm831x;
7543                 7     74dc" class="srsref">uV)
7544        if (7545                <7 href7"+code=dev_err>
7546                 7     74gulator_unregister" class="sidref="+code=request_threaded_irq" class="se=dcdc"id=_q"ad *wm831x->WUV_STATUSWUV_STATUStor/wm831x-dcdc.c#L599" id="L599" class="line" na7e="L537">7547                g7to dcdc-&gidref="+code=request_threaulator/831x-dcdc.c#L599" id="L599" class="line" na7e="L538">7548        }
uV)
7549
7550        dcdc-&gidref="+code=request_threauss="s(1gulatulato">id;
rdev);
7551
wm831xwm831x->dev, "Failed to request HC IRQ %an>,
7552        return 0;7rdev);
7553
uV)
75547555        7556                 7a hre7="+code=dcdc" >
7557wm831x->WSTATUSWSTATUStor/wm831x-dcdc.c#L599" id="L599" class="line" na7e="L558">7558        dcdc-&gidref="+code=request_threaulator/831x-dcdc.c#L599" id="L599" class="line" na7e="L559">7559uV)
7560        if (dcdc-&gidref="+code=request_threauss="s(1gulatulato">id;
rdev);
7561                <7 href76+code=gpio_free" classs="sre">uV)
7562        return 7563}
uV)
7564
7565static int 7566{
ode=rdev" _ops;
wm83oostpr_ops;
7567        struct remove;
wm8soostprg;
wm8soostprg7568        struct 7569
driverregulat"s_a href _r;
7570        supple_mashref="drivers/rle_masss="gister" class="sref">regulate=WM831X_D7571
driveris_mashref="drivers/r>is_masss="gister" class="sref">regulat>is_mas1X_D7572        7573                 7     77or/wm831x-dcdc.c#L554" id="L554" class="line" na7e="L564">7574        ,
platform_device *pdev)
7575                 7     7    7576        wm831x *wm831x = dcdc->dev_get_drvdata(rdev);
t;dev.rdev);
t;
7577        if (wm831x *pdev)
wm831x->regmapregmap(7578                <7 href77gulator_unreg_driver" class="sref">ef="+code=>);
);
7579
uV)
id;
dev.id;
,
rdev);
t;mp;& dcdc[7580        return 0;71x_dcdc *dcdc = 7581}
wm83efsource *rdev, in> = 7582
uV)
id + 1);
7583static struct 7584        .free_ircodedba href="drivers/codedbas="srs="sref">pdev->dev, "Failed to request HC IRQ %PulaC Ipan>,
ret);
7585        .7586        .pdata && dcdc-&gid;
dcdc[id;
dcdc-&g7587                .7a hre78ref="+code=err_uv" clss="sre-f">dev, 7588                .7a hre78nfig"831x-dcdc.c#L571" id="L571" class="line" na7e="L569">7589        },
irq = dcdc->dem_kzallo;pdev->dev, "Faisizeofm_device" class="sref">1x_dcdc *GFP_KERNEEEPS_CONTRODC_SLGFP_KERNEEor/wwm831x-dcdc.c#L599" id="L599" class="line" na7e="L590">7590};
dcdc->dcdc-&g7591
free_ircode&pdev->dev, "Failed to request HC IRQ %U=WM837;d\allo;ate p#L5ate codee=ret" class="swm831x-dcdc.c#L599" id="L599" class="line" na7e="L592">7592/79ee_irq" classm_set_drss="sre-f">dev, ENOMEMor/wm831x-dcdc.c#L500" id="L500" class="line" na7e="L593">7593 79t" class="srew831x-dcdc.c#L581" id="L581" class="line" na7e="L594">7594 79or/wm831x-dcdc.c#L565" id="L565" class="line" na7e="L565">7595
free_irt;wm831x;
wm831x->7596static int 7597{
platformefsource *platformefsources="sref">rdev);
t;ret);
, 7598        struct dcdc-&gid = dcdc-&g7599        struct free_ircode&pdev->dev, "Failed to request HC IRQ %No REI efsourcee=ret" class="swm831x-dcdc.c#L599" id="L599" class="line" na8e="L600">8600        dev, 8691
err_uv;
href="drivers/rlator/wm831x-dcdc.c#L530" id="L530" class="line" na8=2+code=d8d928503                <8 href80t" class="sref">ret = wm831xwm831x8504                g8to 8595
free_irsnp#Lntff="drivers/regusnp#Lntfs="sref">rdev);
t;wm831xrdev);
t;wm831xret);
8596static int wm831xname   = "sref">dcdc->base + = &quom831x-dcdc.c#L599" id="L599" class="line" na8e="L507">8507
wm831xname   ref="+code=id" class="sref">id;
8598        struct wm831xname   typspan class="stritypss="sref">id;
,
8509        if (irq = wm831xname   _ops;
pdev-&gef">wm83oostpr_ops;
8510                <8 href81atform_set_drvdata" class="sc;dvs_gpiomp;name   _= THIS_MODULE,
8511                g8to irq = wm831xname   e=WM831X_Dhref="drivers/rl=WM831X_Ds="sref">id;
WENABa>,
WENABa>or/wm831x-dcdc.c#L500" id="L500" class="line" na8e="L512">8512        }
free_irt;wm831xname   e=WM831maskid;
8513        8514
free_ir>);
drivern class="string">"Fref">id;
dev.parent;
8515        if (pdata && 8516                <8 href81a href="+code=irq" cl="sref">free_ir>);
driver(id;
dcdc[id;
8517
driver#L500ev_drvdata(#L500ev_drss="tsref">dcdc->8518        driverwm831x->regmap8519        if (8520                <8 href82atform_set_drvdata" class="sc;dvs_gpiid="L580"href="drivers/reguregulator/Sister" class="sref"="+code=rr_unregister(pdev-&gc;dvs_gpiomp;pdev-&g>);
8521        dcdc-&gs/rERR= rdev);
t;wm831x8522        rdev);
t;wm831x8523
wm831x->regmap"Failed to request HC IRQ %d: %d\n&" claspan>,
8524        ret);
8525        if (err_uv;
href="drivers/rlator/wm831x-dcdc.c#L530" id="L530" class="line" na8e="L526">8526                <8 href82a href="+codem831x-dcdc.c#L549" id="L549" class="line" na8e="L527">8527                <8 href827move831x-dcdc.c#L549" id="L549" class="line" na8e8"L507">8528                 8     82gulator_unregister" class="swm8wm8wm831x->platform_get_irq_byname(pdev, "UV")),
8529                g8to irq = pdev, <NULL);
NULL);
ef">wm8ers/ruv8wm8ers/ruv88530        }
NULL);
t;wm831x8531
8532        dcdc-&gidref="+code=request_threa!= 0wcm831x-dcdc.c#L598" id="L598" class="line" na8e="L503">8533        pdev->dev, "Failed to request HC IRQ %d: %d\n" UV eRQ 
8534                 8     834c" class="srm_set_drm_set_drvdata" class="saref="+code=ret" class="sref">ret);
8535        if (err_uv;
_id="L596"href="drivers/rivers/regulator/wm831x-dcdc.c#L547" id="L547" class="line" na8e="L536">8536                <8 href83a href="+codem831x-dcdc.c#L549" id="L549" class="line" na8e="L537">8537                 8     837move831x-dcdc.c#L549" id="L549" class="line" na8e="L538">8538                g8to platform_set_drvdata(pdev, NULL);
t;8539        }
8540
8541        8542        err_uv;
_id="L596"href="drivers/rivers/regulator/wm831x-dcdc.c#L560" id="L560" class="line" na8e="L543">8543                 8     84dc" class="srter" class="sref"="+code=ator_unregister(dcdc->regulator);
8544        if (err_uv;
href="drivers/rlator/wm831x-dcdc.c#L560" id="L560" class="line" na8e="L525">8545                <8 href8"+code=dev_errss="sre">uV)
8546                 8     84gulatm831x-dcdc.c#L549" id="L549" class="line" na8e="L537">8547                g8to 8548        }
,
platform_device *pdev)
8549
8550        1x_dcdc *dcdc = platform_get_drvdata(pdev);
8551
8552        return 0;8free_irref">platform_set_drvdata(pdev, NULL);
8553
8554free_irq(wm831x_irq(wm831xregula>->platform_get_irq_byname(pdev, "UV")),
8555        NULL);
t;8556                 8a hre85gulator_unregister" class="sf"="+code=ator_unregister(dcdc->regulator);
85578558        85598560        if (8561                <8 href86+code1x_buck_driver" class="sref">platform_driver wm83oostprdriver wm83oostprdriver_drv_drm831x-dcdc.c#L598" id="L598" class="line" na8e="L552">8562        return removewm831oostprkv_probe,
8563}
enab> = wm83oostprckv_remove,
8564
enabdriver 8565static int name   = "wm831x-buckv",
8566{
owner  = THIS_MODULE,
8567        struct 8568        struct 8569
8570        8571

8572        8573                 8     87or/wm specifics
,s but look like them in hardwgul so sharsssor/wm831x-dcdc.c#L593" id="L593" class="line" na8e="L554">8574        8575                 8     87or/wm>
8576        8577        if (id;
,
8578                <8 href87nfig"831x-dcdc.c#L571" id="L571" class="line" na8e="L569">8579
ef="+code=_ops;
wm8eper_ops;
8580        return 0;8suppis_a href href="+code=ret"s_a href ss="gister" class="sref">regulat"s_a href _r;
8581}
supple_mashref="drivers/rle_masss="gister" class="sref">regulate=WM831X_D8582
removeis_mashref="drivers/r>is_masss="gister" class="sref">regulat>is_mas1X_D8583static struct enabg;
wm8ers/rg;
wm8ers/rg8584        .8585        .8586        .,
platform_device *pdev)
8587                .8a hre88ref="m831x-dcdc.c#L598" id="L598" class="line" na8e="L568">8588                .8a hre88gulator_unreg_driver" class="sref">>->wm831x = dcdc->dev_get_drvdata(rdev);
t;dev.rdev);
t;
8589        },
wm831x *pdev)
wm831x->regmapregmap(8590};
eguregulat>);
);
8591
uV)
id;
dev.id;
,
rdev);
t;mp;& dcdc[8592/89ee_irq" class_driver" class="sref">1x_dcdc *dcdc = 8593 89t" class="sresref">uV)
8594 89or/wm831x-dcdc.c#L565" id="L565" class="line" na8e="L565">8595
free_irtodedba href="drivers/codedbas="srs="sref">pdev->dev, "Failed to request HC IRQ %PulaC IpEPE
ret);
8596static int 8597{
pdev->dev, "Faisizeofm_device" class="sref">1x_dcdc *GFP_KERNEEEPS_CONTRODC_SLGFP_KERNEEor/wwm831x-dcdc.c#L599" id="L599" class="line" na8e="L598">8598        struct dcdc-&gdcdc-&g8599        struct free_ircode&pdev->dev, "Failed to request HC IRQ %U=WM837;d\allo;ate p#L5ate codee=ret" class="swm831x-dcdc.c#L599" id="L599" class="line" na9e="L600">9600        dev, ENOMEMor/wm831x-dcdc.c#L500" id="L500" class="line" na9e1"L600">9691
ret = wm831x = dcdc-&g> = 9595
9596static int 
9507
9598        struct rdev);
t;wm831xrdev);
t;wm831xret);
9509        if (irq = wm831xname   = "sref">dcdc->base + = &quom831x-dcdc.c#L599" id="L599" class="line" na9e="L510">9510                <9 href91atform_set_drvdata" class="sc;dvs_gpiomp;name   ref="+code=id" class="sref">id;
id;
,
,\n&" classg*lator/wm831x-dcdc.c#L595" id="L595" class="line" na9e="L511">9511                g9to irq = wm831xname   _ops;
pdev-&gef">wm8eper_ops;
        }
free_irt;wm831xname   typspan class="stritypss="sref">id;
,
9513        ret = wm831xname   _= THIS_MODULE,
9514
free_irt;wm831xname   e=WM831X_Dhref="drivers/rl=WM831X_Ds="sref">id;
WENABa>,
WENABa>or/wm831x-dcdc.c#L500" id="L500" class="line" na9e5"L504">9515        if (free_irt;wm831xname   e=WM831maskid;
dvs_gpiomp;name   ref="+code=id" class="sm831x-dcdc.c#L500" id="L500" class="line" na9e6"L504">9516                <9 href91or/wm831x-dcdc.c#L467" id="L467" class="line" na9e="L517">9517
drivern class="string">"Fref">id;
dev.parent;
9518        dcdc-&g&& 9519        if (free_ir>);
driver(id;
dcdc[id;
9520                <9 href92atform_set_drvdata" class="s>);
driver#L500ev_drvdata(#L500ev_drss="tsref">dcdc->9521        irq = );
driverwm831x->regmap9522        9523
ret = wm831x);
(pdev-&gc;dvs_gpiomp;pdev-&g>);
9524        dcdc-&gs/rERR= rdev);
t;wm831x9525        if (uV)
rdev);
t;wm831x9526                <9 href92a href="+code=irq" cl="sref">free_ircode&wm831x->regmap"Failed to request HC IRQ %d: %d\n&" claspEPE
9527                <9 href92ref="+code=err_uv" cl=irq" cl="sref">free_ira href="+code=ret" class="sref">ret);
9528                 9     92gulator_unregggggggggass="sref">err_uv;
href="drivers/rlator/wm831x-dcdc.c#L530" id="L530" class="line" na9e="L509">9529                g9to 9530        }
9531
irq = platform_set_drvdata(pdev, NULL);
t;9532        9533        9534                 9     93or/wm831x-dcdc.c#L565" id="L565" class="line" na9e="L525">9535        if (err_uv;
href="drivers/rlator/wm831x-dcdc.c#L560" id="L560" class="line" na9e="L536">9536                <9 href93a href="+codess="sre">uV)
9537                 9     937movem831x-dcdc.c#L549" id="L549" class="line" na9e8"L507">9538                g9to 9539        }
,
platform_device *pdev)
9540
9541        1x_dcdc *dcdc = platform_get_drvdata(pdev);
9542        9543                 9     94dc" class="srter" class="sreref">platform_set_drvdata(pdev, NULL);
9544        if (free_irf"="+code=ator_unregister(dcdc->regulator);
9545                <9 href94or/wm831x-dcdc.c#L596" id="L596" class="line" na9e="L546">9546                 9     94a href="+codess="srewm831x-dcdc.c#L581" id="L581" class="line" na9e="L537">9547                g9to 9548        }
9549
platform_driver wm8eperdriver wm8eperdriver_drv_drm831x-dcdc.c#L598" id="L598" class="line" na9e="L550">9550        supp= wm83eperkv_probe,
9551
supp> = wm8eperckv_remove,
9552        return 0;9removeriver 9553
name   = "wm831x-buckv",
9554owner  = THIS_MODULE,
9555        9556                 9a hre95gulatwm831x-dcdc.c#L591" id="L591" class="line" na9e="L547">95579558        wm8ers/rinit,
wm8ers/rinits="srvoidm831x-dcdc.c#L566" id="L566" class="line" na9e="L559">95599560        if (uV)
9561                <9 href96q" class="sref">irq = pdev-&gef">wm8buckvrdriver wm83uckvrdrivertor/wm831x-dcdc.c#L559" id="L559" class="line" na9e="L552">9562        return dcdc-&gidref="+code=request_threa!= 0w831x-dcdc.c#L559" id="L559" class="line" na9e="L553">9563}
supp= e&ret);
9564
9565static int free_irhref="drivers/regulator/waded_irq" class="scode=wm831x_buc=rr_unregister(pdev-&gef">wm8buckprdriver wm83uckprdrivertor/wm831x-dcdc.c#L547" id="L547" class="line" na9e="L556">9566{
dcdc-&gidref="+code=request_threa!= 0w831x-dcdc.c#L559" id="L559" class="line" na9e="L547">9567        struct supp= e&ret);
9568        struct 9569
irq = pdev-&gef">wm8boostprdriver wm83oostprdriver_drvwm831x-dcdc.c#L547" id="L547" class="line" na9e="L570">9570        dcdc-&gidref="+code=request_threa!= 0w831x-dcdc.c#L559" id="L559" class="line" na9e="L561">9571
supp= e&ret);
9572        9573                 9     97dc" class="srter" class="sref"ref="+code=request_threaded_irq" class="scode=wm831x_buc=rr_unregister(pdev-&gef">wm8eperdriver wm8eperdriver_drvwm831x-dcdc.c#L547" id="L547" class="line" na9e="L554">9574        dcdc-&gidref="+code=request_threa!= 0w831x-dcdc.c#L559" id="L559" class="line" na9e="L555">9575                 9     975c" class="srm_set_dr">uV)
ret);
9576        9577        if (9578                <9 href97nfig"m831x-dcdc.c#L549" id="L549" class="line" na9e="L569">9579
ret);
wm831x->8ers/rinit,
wm8ers/rinits="swm831x-dcdc.c#L547" id="L547" class="line" na9e="L580">9580        return 0;99581}
wm8ers/rexit,
wm8ers/rexits="srvoidm831x-dcdc.c#L566" id="L566" class="line" na9e="L582">9582
9583static struct plat1x_buc=ator_unregister(plat1x_buc=ator_unregs="srs="sref">pdev-&gef">wm8eperdriver wm8eperdriver_drvwm831x-dcdc.c#L547" id="L547" class="line" na9e="L554">9584        .free_irref">plat1x_buc=ator_unregister(plat1x_buc=ator_unregs="srs="sref">pdev-&gef">wm8boostprdriver wm83oostprdriver_drvwm831x-dcdc.c#L547" id="L547" class="line" na9e="L565">9585        .free_irref">plat1x_buc=ator_unregister(plat1x_buc=ator_unregs="srs="sref">pdev-&gef">wm8buckprdriver wm83uckprdrivertor/wm831x-dcdc.c#L547" id="L547" class="line" na9e="L586">9586        .plat1x_buc=ator_unregister(plat1x_buc=ator_unregs="srs="sref">pdev-&gef">wm8buckvrdriver wm83uckvrdrivertor/wm831x-dcdc.c#L559" id="L559" class="line" na9e="L577">9587                .9a hre987movem831x-dcdc.c#L549" id="L549" class="line" na9e="L568">9588                .9a hre98gulatef">pdev-&gmodulerexit,
wm831x->8ers/rexit,
wm8ers/rexits="swm831x-dcdc.c#L559" id="L559" class="line" na9e="L569">9589        },
9590};
pla_buong*lator/wm831x-dcdc.c#L595" id="L595" class="line" na9e="L591">9591
wm831x9592/99t" clsref">err_uv9593 99t" clsref">err_uv,
9594 99or/wmsref">err_uvpla:class="3uckvret" class="swm831x-dcdc.c#L599" id="L599" class="line" na9e="L565">9595
err_uvpla:class="3uckpret" class="swm831x-dcdc.c#L599" id="L599" class="line" na9e="L586">9596static int err_uvpla:class="3oostps/regulator/wwm831x-dcdc.c#L599" id="L599" class="line" na9e="L577">9597{
err_uvpla:class="epes/regulator/wwm831x-dcdc.c#L599" id="L599" class="line" na9e="L568">9598        struct 


fooregi> The original LXR softwgul by thegister" clhttp://source>plge.net/projects/lxgi>LXR iverunityss="srthis experirs/ral 599"uongby ister" clmailto:lxg@ ux.no">lxg@ ux.noss=".
subfooregi> lxg. ux.no kindly hostedgby ister" clhttp://www.redpill- pro.no">Redpill L pro ASs="s, kv_vider of L ux consultC Ipand oper_buons ser clas since 1995.