linux/drivers/regulator/bd718x7-regulator.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2// Copyright (C) 2018 ROHM Semiconductors
   3// bd71837-regulator.c ROHM BD71837MWV/BD71847MWV regulator driver
   4
   5#include <linux/delay.h>
   6#include <linux/err.h>
   7#include <linux/interrupt.h>
   8#include <linux/kernel.h>
   9#include <linux/mfd/rohm-bd718x7.h>
  10#include <linux/module.h>
  11#include <linux/of.h>
  12#include <linux/platform_device.h>
  13#include <linux/regulator/driver.h>
  14#include <linux/regulator/machine.h>
  15#include <linux/regulator/of_regulator.h>
  16#include <linux/slab.h>
  17
  18/*
  19 * BUCK1/2/3/4
  20 * BUCK1RAMPRATE[1:0] BUCK1 DVS ramp rate setting
  21 * 00: 10.00mV/usec 10mV 1uS
  22 * 01: 5.00mV/usec      10mV 2uS
  23 * 10: 2.50mV/usec      10mV 4uS
  24 * 11: 1.25mV/usec      10mV 8uS
  25 */
  26static int bd718xx_buck1234_set_ramp_delay(struct regulator_dev *rdev,
  27                                           int ramp_delay)
  28{
  29        int id = rdev_get_id(rdev);
  30        unsigned int ramp_value;
  31
  32        dev_dbg(&rdev->dev, "Buck[%d] Set Ramp = %d\n", id + 1,
  33                ramp_delay);
  34        switch (ramp_delay) {
  35        case 1 ... 1250:
  36                ramp_value = BUCK_RAMPRATE_1P25MV;
  37                break;
  38        case 1251 ... 2500:
  39                ramp_value = BUCK_RAMPRATE_2P50MV;
  40                break;
  41        case 2501 ... 5000:
  42                ramp_value = BUCK_RAMPRATE_5P00MV;
  43                break;
  44        case 5001 ... 10000:
  45                ramp_value = BUCK_RAMPRATE_10P00MV;
  46                break;
  47        default:
  48                ramp_value = BUCK_RAMPRATE_10P00MV;
  49                dev_err(&rdev->dev,
  50                        "%s: ramp_delay: %d not supported, setting 10000mV//us\n",
  51                        rdev->desc->name, ramp_delay);
  52        }
  53
  54        return regmap_update_bits(rdev->regmap, BD718XX_REG_BUCK1_CTRL + id,
  55                                  BUCK_RAMPRATE_MASK, ramp_value << 6);
  56}
  57
  58/*
  59 * On BD71837 (not on BD71847, BD71850, ...)
  60 * Bucks 1 to 4 support DVS. PWM mode is used when voltage is changed.
  61 * Bucks 5 to 8 and LDOs can use PFM and must be disabled when voltage
  62 * is changed. Hence we return -EBUSY for these if voltage is changed
  63 * when BUCK/LDO is enabled.
  64 *
  65 * On BD71847, BD71850, ... The LDO voltage can be changed when LDO is
  66 * enabled. But if voltage is increased the LDO power-good monitoring
  67 * must be disabled for the duration of changing + 1mS to ensure voltage
  68 * has reached the higher level before HW does next under voltage detection
  69 * cycle.
  70 */
  71static int bd71837_set_voltage_sel_restricted(struct regulator_dev *rdev,
  72                                                    unsigned int sel)
  73{
  74        if (regulator_is_enabled_regmap(rdev))
  75                return -EBUSY;
  76
  77        return regulator_set_voltage_sel_regmap(rdev, sel);
  78}
  79
  80static void voltage_change_done(struct regulator_dev *rdev, unsigned int sel,
  81                                unsigned int *mask)
  82{
  83        int ret;
  84
  85        if (*mask) {
  86                /*
  87                 * Let's allow scheduling as we use I2C anyways. We just need to
  88                 * guarantee minimum of 1ms sleep - it shouldn't matter if we
  89                 * exceed it due to the scheduling.
  90                 */
  91                msleep(1);
  92                /*
  93                 * Note for next hacker. The PWRGOOD should not be masked on
  94                 * BD71847 so we will just unconditionally enable detection
  95                 * when voltage is set.
  96                 * If someone want's to disable PWRGOOD he must implement
  97                 * caching and restoring the old value here. I am not
  98                 * aware of such use-cases so for the sake of the simplicity
  99                 * we just always enable PWRGOOD here.
 100                 */
 101                ret = regmap_update_bits(rdev->regmap, BD718XX_REG_MVRFLTMASK2,
 102                                         *mask, 0);
 103                if (ret)
 104                        dev_err(&rdev->dev,
 105                                "Failed to re-enable voltage monitoring (%d)\n",
 106                                ret);
 107        }
 108}
 109
 110static int voltage_change_prepare(struct regulator_dev *rdev, unsigned int sel,
 111                                  unsigned int *mask)
 112{
 113        int ret;
 114
 115        *mask = 0;
 116        if (regulator_is_enabled_regmap(rdev)) {
 117                int now, new;
 118
 119                now = rdev->desc->ops->get_voltage_sel(rdev);
 120                if (now < 0)
 121                        return now;
 122
 123                now = rdev->desc->ops->list_voltage(rdev, now);
 124                if (now < 0)
 125                        return now;
 126
 127                new = rdev->desc->ops->list_voltage(rdev, sel);
 128                if (new < 0)
 129                        return new;
 130
 131                /*
 132                 * If we increase LDO voltage when LDO is enabled we need to
 133                 * disable the power-good detection until voltage has reached
 134                 * the new level. According to HW colleagues the maximum time
 135                 * it takes is 1000us. I assume that on systems with light load
 136                 * this might be less - and we could probably use DT to give
 137                 * system specific delay value if performance matters.
 138                 *
 139                 * Well, knowing we use I2C here and can add scheduling delays
 140                 * I don't think it is worth the hassle and I just add fixed
 141                 * 1ms sleep here (and allow scheduling). If this turns out to
 142                 * be a problem we can change it to delay and make the delay
 143                 * time configurable.
 144                 */
 145                if (new > now) {
 146                        int ldo_offset = rdev->desc->id - BD718XX_LDO1;
 147
 148                        *mask = BD718XX_LDO1_VRMON80 << ldo_offset;
 149                        ret = regmap_update_bits(rdev->regmap,
 150                                                 BD718XX_REG_MVRFLTMASK2,
 151                                                 *mask, *mask);
 152                        if (ret) {
 153                                dev_err(&rdev->dev,
 154                                        "Failed to stop voltage monitoring\n");
 155                                return ret;
 156                        }
 157                }
 158        }
 159
 160        return 0;
 161}
 162
 163static int bd718xx_set_voltage_sel_restricted(struct regulator_dev *rdev,
 164                                                    unsigned int sel)
 165{
 166        int ret;
 167        int mask;
 168
 169        ret = voltage_change_prepare(rdev, sel, &mask);
 170        if (ret)
 171                return ret;
 172
 173        ret = regulator_set_voltage_sel_regmap(rdev, sel);
 174        voltage_change_done(rdev, sel, &mask);
 175
 176        return ret;
 177}
 178
 179static int bd718xx_set_voltage_sel_pickable_restricted(
 180                struct regulator_dev *rdev, unsigned int sel)
 181{
 182        int ret;
 183        int mask;
 184
 185        ret = voltage_change_prepare(rdev, sel, &mask);
 186        if (ret)
 187                return ret;
 188
 189        ret = regulator_set_voltage_sel_pickable_regmap(rdev, sel);
 190        voltage_change_done(rdev, sel, &mask);
 191
 192        return ret;
 193}
 194
 195static int bd71837_set_voltage_sel_pickable_restricted(
 196                struct regulator_dev *rdev, unsigned int sel)
 197{
 198        if (regulator_is_enabled_regmap(rdev))
 199                return -EBUSY;
 200
 201        return regulator_set_voltage_sel_pickable_regmap(rdev, sel);
 202}
 203
 204static const struct regulator_ops bd718xx_pickable_range_ldo_ops = {
 205        .enable = regulator_enable_regmap,
 206        .disable = regulator_disable_regmap,
 207        .is_enabled = regulator_is_enabled_regmap,
 208        .list_voltage = regulator_list_voltage_pickable_linear_range,
 209        .set_voltage_sel = bd718xx_set_voltage_sel_pickable_restricted,
 210        .get_voltage_sel = regulator_get_voltage_sel_pickable_regmap,
 211
 212};
 213
 214static const struct regulator_ops bd71837_pickable_range_ldo_ops = {
 215        .enable = regulator_enable_regmap,
 216        .disable = regulator_disable_regmap,
 217        .is_enabled = regulator_is_enabled_regmap,
 218        .list_voltage = regulator_list_voltage_pickable_linear_range,
 219        .set_voltage_sel = bd71837_set_voltage_sel_pickable_restricted,
 220        .get_voltage_sel = regulator_get_voltage_sel_pickable_regmap,
 221};
 222
 223static const struct regulator_ops bd718xx_pickable_range_buck_ops = {
 224        .enable = regulator_enable_regmap,
 225        .disable = regulator_disable_regmap,
 226        .is_enabled = regulator_is_enabled_regmap,
 227        .list_voltage = regulator_list_voltage_pickable_linear_range,
 228        .set_voltage_sel = regulator_set_voltage_sel_pickable_regmap,
 229        .get_voltage_sel = regulator_get_voltage_sel_pickable_regmap,
 230        .set_voltage_time_sel = regulator_set_voltage_time_sel,
 231};
 232
 233static const struct regulator_ops bd71837_pickable_range_buck_ops = {
 234        .enable = regulator_enable_regmap,
 235        .disable = regulator_disable_regmap,
 236        .is_enabled = regulator_is_enabled_regmap,
 237        .list_voltage = regulator_list_voltage_pickable_linear_range,
 238        .set_voltage_sel = bd71837_set_voltage_sel_pickable_restricted,
 239        .get_voltage_sel = regulator_get_voltage_sel_pickable_regmap,
 240        .set_voltage_time_sel = regulator_set_voltage_time_sel,
 241};
 242
 243static const struct regulator_ops bd71837_ldo_regulator_ops = {
 244        .enable = regulator_enable_regmap,
 245        .disable = regulator_disable_regmap,
 246        .is_enabled = regulator_is_enabled_regmap,
 247        .list_voltage = regulator_list_voltage_linear_range,
 248        .set_voltage_sel = bd71837_set_voltage_sel_restricted,
 249        .get_voltage_sel = regulator_get_voltage_sel_regmap,
 250};
 251
 252static const struct regulator_ops bd718xx_ldo_regulator_ops = {
 253        .enable = regulator_enable_regmap,
 254        .disable = regulator_disable_regmap,
 255        .is_enabled = regulator_is_enabled_regmap,
 256        .list_voltage = regulator_list_voltage_linear_range,
 257        .set_voltage_sel = bd718xx_set_voltage_sel_restricted,
 258        .get_voltage_sel = regulator_get_voltage_sel_regmap,
 259};
 260
 261static const struct regulator_ops bd71837_ldo_regulator_nolinear_ops = {
 262        .enable = regulator_enable_regmap,
 263        .disable = regulator_disable_regmap,
 264        .is_enabled = regulator_is_enabled_regmap,
 265        .list_voltage = regulator_list_voltage_table,
 266        .set_voltage_sel = bd71837_set_voltage_sel_restricted,
 267        .get_voltage_sel = regulator_get_voltage_sel_regmap,
 268};
 269
 270static const struct regulator_ops bd718xx_ldo_regulator_nolinear_ops = {
 271        .enable = regulator_enable_regmap,
 272        .disable = regulator_disable_regmap,
 273        .is_enabled = regulator_is_enabled_regmap,
 274        .list_voltage = regulator_list_voltage_table,
 275        .set_voltage_sel = bd718xx_set_voltage_sel_restricted,
 276        .get_voltage_sel = regulator_get_voltage_sel_regmap,
 277};
 278
 279static const struct regulator_ops bd718xx_buck_regulator_ops = {
 280        .enable = regulator_enable_regmap,
 281        .disable = regulator_disable_regmap,
 282        .is_enabled = regulator_is_enabled_regmap,
 283        .list_voltage = regulator_list_voltage_linear_range,
 284        .set_voltage_sel = regulator_set_voltage_sel_regmap,
 285        .get_voltage_sel = regulator_get_voltage_sel_regmap,
 286        .set_voltage_time_sel = regulator_set_voltage_time_sel,
 287};
 288
 289static const struct regulator_ops bd71837_buck_regulator_ops = {
 290        .enable = regulator_enable_regmap,
 291        .disable = regulator_disable_regmap,
 292        .is_enabled = regulator_is_enabled_regmap,
 293        .list_voltage = regulator_list_voltage_linear_range,
 294        .set_voltage_sel = bd71837_set_voltage_sel_restricted,
 295        .get_voltage_sel = regulator_get_voltage_sel_regmap,
 296        .set_voltage_time_sel = regulator_set_voltage_time_sel,
 297};
 298
 299static const struct regulator_ops bd718xx_buck_regulator_nolinear_ops = {
 300        .enable = regulator_enable_regmap,
 301        .disable = regulator_disable_regmap,
 302        .is_enabled = regulator_is_enabled_regmap,
 303        .list_voltage = regulator_list_voltage_table,
 304        .map_voltage = regulator_map_voltage_ascend,
 305        .set_voltage_sel = regulator_set_voltage_sel_regmap,
 306        .get_voltage_sel = regulator_get_voltage_sel_regmap,
 307        .set_voltage_time_sel = regulator_set_voltage_time_sel,
 308};
 309
 310static const struct regulator_ops bd71837_buck_regulator_nolinear_ops = {
 311        .enable = regulator_enable_regmap,
 312        .disable = regulator_disable_regmap,
 313        .is_enabled = regulator_is_enabled_regmap,
 314        .list_voltage = regulator_list_voltage_table,
 315        .map_voltage = regulator_map_voltage_ascend,
 316        .set_voltage_sel = bd718xx_set_voltage_sel_restricted,
 317        .get_voltage_sel = regulator_get_voltage_sel_regmap,
 318        .set_voltage_time_sel = regulator_set_voltage_time_sel,
 319};
 320
 321static const struct regulator_ops bd718xx_dvs_buck_regulator_ops = {
 322        .enable = regulator_enable_regmap,
 323        .disable = regulator_disable_regmap,
 324        .is_enabled = regulator_is_enabled_regmap,
 325        .list_voltage = regulator_list_voltage_linear_range,
 326        .set_voltage_sel = regulator_set_voltage_sel_regmap,
 327        .get_voltage_sel = regulator_get_voltage_sel_regmap,
 328        .set_voltage_time_sel = regulator_set_voltage_time_sel,
 329        .set_ramp_delay = bd718xx_buck1234_set_ramp_delay,
 330};
 331
 332/*
 333 * BD71837 BUCK1/2/3/4
 334 * BD71847 BUCK1/2
 335 * 0.70 to 1.30V (10mV step)
 336 */
 337static const struct linear_range bd718xx_dvs_buck_volts[] = {
 338        REGULATOR_LINEAR_RANGE(700000, 0x00, 0x3C, 10000),
 339        REGULATOR_LINEAR_RANGE(1300000, 0x3D, 0x3F, 0),
 340};
 341
 342/*
 343 * BD71837 BUCK5
 344 * 0.7V to 1.35V  (range 0)
 345 * and
 346 * 0.675 to 1.325 (range 1)
 347 */
 348static const struct linear_range bd71837_buck5_volts[] = {
 349        /* Ranges when VOLT_SEL bit is 0 */
 350        REGULATOR_LINEAR_RANGE(700000, 0x00, 0x03, 100000),
 351        REGULATOR_LINEAR_RANGE(1050000, 0x04, 0x05, 50000),
 352        REGULATOR_LINEAR_RANGE(1200000, 0x06, 0x07, 150000),
 353        /* Ranges when VOLT_SEL bit is 1  */
 354        REGULATOR_LINEAR_RANGE(675000, 0x0, 0x3, 100000),
 355        REGULATOR_LINEAR_RANGE(1025000, 0x4, 0x5, 50000),
 356        REGULATOR_LINEAR_RANGE(1175000, 0x6, 0x7, 150000),
 357};
 358
 359/*
 360 * Range selector for first 3 linear ranges is 0x0
 361 * and 0x1 for last 3 ranges.
 362 */
 363static const unsigned int bd71837_buck5_volt_range_sel[] = {
 364        0x0, 0x0, 0x0, 0x80, 0x80, 0x80
 365};
 366
 367/*
 368 * BD71847 BUCK3
 369 */
 370static const struct linear_range bd71847_buck3_volts[] = {
 371        /* Ranges when VOLT_SEL bits are 00 */
 372        REGULATOR_LINEAR_RANGE(700000, 0x00, 0x03, 100000),
 373        REGULATOR_LINEAR_RANGE(1050000, 0x04, 0x05, 50000),
 374        REGULATOR_LINEAR_RANGE(1200000, 0x06, 0x07, 150000),
 375        /* Ranges when VOLT_SEL bits are 01 */
 376        REGULATOR_LINEAR_RANGE(550000, 0x0, 0x7, 50000),
 377        /* Ranges when VOLT_SEL bits are 11 */
 378        REGULATOR_LINEAR_RANGE(675000, 0x0, 0x3, 100000),
 379        REGULATOR_LINEAR_RANGE(1025000, 0x4, 0x5, 50000),
 380        REGULATOR_LINEAR_RANGE(1175000, 0x6, 0x7, 150000),
 381};
 382
 383static const unsigned int bd71847_buck3_volt_range_sel[] = {
 384        0x0, 0x0, 0x0, 0x40, 0x80, 0x80, 0x80
 385};
 386
 387static const struct linear_range bd71847_buck4_volts[] = {
 388        REGULATOR_LINEAR_RANGE(3000000, 0x00, 0x03, 100000),
 389        REGULATOR_LINEAR_RANGE(2600000, 0x00, 0x03, 100000),
 390};
 391
 392static const unsigned int bd71847_buck4_volt_range_sel[] = { 0x0, 0x40 };
 393
 394/*
 395 * BUCK6
 396 * 3.0V to 3.3V (step 100mV)
 397 */
 398static const struct linear_range bd71837_buck6_volts[] = {
 399        REGULATOR_LINEAR_RANGE(3000000, 0x00, 0x03, 100000),
 400};
 401
 402/*
 403 * BD71837 BUCK7
 404 * BD71847 BUCK5
 405 * 000 = 1.605V
 406 * 001 = 1.695V
 407 * 010 = 1.755V
 408 * 011 = 1.8V (Initial)
 409 * 100 = 1.845V
 410 * 101 = 1.905V
 411 * 110 = 1.95V
 412 * 111 = 1.995V
 413 */
 414static const unsigned int bd718xx_3rd_nodvs_buck_volts[] = {
 415        1605000, 1695000, 1755000, 1800000, 1845000, 1905000, 1950000, 1995000
 416};
 417
 418/*
 419 * BUCK8
 420 * 0.8V to 1.40V (step 10mV)
 421 */
 422static const struct linear_range bd718xx_4th_nodvs_buck_volts[] = {
 423        REGULATOR_LINEAR_RANGE(800000, 0x00, 0x3C, 10000),
 424};
 425
 426/*
 427 * LDO1
 428 * 3.0 to 3.3V (100mV step)
 429 */
 430static const struct linear_range bd718xx_ldo1_volts[] = {
 431        REGULATOR_LINEAR_RANGE(3000000, 0x00, 0x03, 100000),
 432        REGULATOR_LINEAR_RANGE(1600000, 0x00, 0x03, 100000),
 433};
 434
 435static const unsigned int bd718xx_ldo1_volt_range_sel[] = { 0x0, 0x20 };
 436
 437/*
 438 * LDO2
 439 * 0.8 or 0.9V
 440 */
 441static const unsigned int ldo_2_volts[] = {
 442        900000, 800000
 443};
 444
 445/*
 446 * LDO3
 447 * 1.8 to 3.3V (100mV step)
 448 */
 449static const struct linear_range bd718xx_ldo3_volts[] = {
 450        REGULATOR_LINEAR_RANGE(1800000, 0x00, 0x0F, 100000),
 451};
 452
 453/*
 454 * LDO4
 455 * 0.9 to 1.8V (100mV step)
 456 */
 457static const struct linear_range bd718xx_ldo4_volts[] = {
 458        REGULATOR_LINEAR_RANGE(900000, 0x00, 0x09, 100000),
 459};
 460
 461/*
 462 * LDO5 for BD71837
 463 * 1.8 to 3.3V (100mV step)
 464 */
 465static const struct linear_range bd71837_ldo5_volts[] = {
 466        REGULATOR_LINEAR_RANGE(1800000, 0x00, 0x0F, 100000),
 467};
 468
 469/*
 470 * LDO5 for BD71837
 471 * 1.8 to 3.3V (100mV step)
 472 */
 473static const struct linear_range bd71847_ldo5_volts[] = {
 474        REGULATOR_LINEAR_RANGE(1800000, 0x00, 0x0F, 100000),
 475        REGULATOR_LINEAR_RANGE(800000, 0x00, 0x0F, 100000),
 476};
 477
 478static const unsigned int bd71847_ldo5_volt_range_sel[] = { 0x0, 0x20 };
 479
 480/*
 481 * LDO6
 482 * 0.9 to 1.8V (100mV step)
 483 */
 484static const struct linear_range bd718xx_ldo6_volts[] = {
 485        REGULATOR_LINEAR_RANGE(900000, 0x00, 0x09, 100000),
 486};
 487
 488/*
 489 * LDO7
 490 * 1.8 to 3.3V (100mV step)
 491 */
 492static const struct linear_range bd71837_ldo7_volts[] = {
 493        REGULATOR_LINEAR_RANGE(1800000, 0x00, 0x0F, 100000),
 494};
 495
 496struct reg_init {
 497        unsigned int reg;
 498        unsigned int mask;
 499        unsigned int val;
 500};
 501struct bd718xx_regulator_data {
 502        struct regulator_desc desc;
 503        const struct rohm_dvs_config dvs;
 504        const struct reg_init init;
 505        const struct reg_init *additional_inits;
 506        int additional_init_amnt;
 507};
 508
 509/*
 510 * There is a HW quirk in BD71837. The shutdown sequence timings for
 511 * bucks/LDOs which are controlled via register interface are changed.
 512 * At PMIC poweroff the voltage for BUCK6/7 is cut immediately at the
 513 * beginning of shut-down sequence. As bucks 6 and 7 are parent
 514 * supplies for LDO5 and LDO6 - this causes LDO5/6 voltage
 515 * monitoring to errorneously detect under voltage and force PMIC to
 516 * emergency state instead of poweroff. In order to avoid this we
 517 * disable voltage monitoring for LDO5 and LDO6
 518 */
 519static const struct reg_init bd71837_ldo5_inits[] = {
 520        {
 521                .reg = BD718XX_REG_MVRFLTMASK2,
 522                .mask = BD718XX_LDO5_VRMON80,
 523                .val = BD718XX_LDO5_VRMON80,
 524        },
 525};
 526
 527static const struct reg_init bd71837_ldo6_inits[] = {
 528        {
 529                .reg = BD718XX_REG_MVRFLTMASK2,
 530                .mask = BD718XX_LDO6_VRMON80,
 531                .val = BD718XX_LDO6_VRMON80,
 532        },
 533};
 534
 535static int buck_set_hw_dvs_levels(struct device_node *np,
 536                            const struct regulator_desc *desc,
 537                            struct regulator_config *cfg)
 538{
 539        struct bd718xx_regulator_data *data;
 540
 541        data = container_of(desc, struct bd718xx_regulator_data, desc);
 542
 543        return rohm_regulator_set_dvs_levels(&data->dvs, np, desc, cfg->regmap);
 544}
 545
 546static const struct bd718xx_regulator_data bd71847_regulators[] = {
 547        {
 548                .desc = {
 549                        .name = "buck1",
 550                        .of_match = of_match_ptr("BUCK1"),
 551                        .regulators_node = of_match_ptr("regulators"),
 552                        .id = BD718XX_BUCK1,
 553                        .ops = &bd718xx_dvs_buck_regulator_ops,
 554                        .type = REGULATOR_VOLTAGE,
 555                        .n_voltages = BD718XX_DVS_BUCK_VOLTAGE_NUM,
 556                        .linear_ranges = bd718xx_dvs_buck_volts,
 557                        .n_linear_ranges =
 558                                ARRAY_SIZE(bd718xx_dvs_buck_volts),
 559                        .vsel_reg = BD718XX_REG_BUCK1_VOLT_RUN,
 560                        .vsel_mask = DVS_BUCK_RUN_MASK,
 561                        .enable_reg = BD718XX_REG_BUCK1_CTRL,
 562                        .enable_mask = BD718XX_BUCK_EN,
 563                        .owner = THIS_MODULE,
 564                        .of_parse_cb = buck_set_hw_dvs_levels,
 565                },
 566                .dvs = {
 567                        .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
 568                                     ROHM_DVS_LEVEL_SUSPEND,
 569                        .run_reg = BD718XX_REG_BUCK1_VOLT_RUN,
 570                        .run_mask = DVS_BUCK_RUN_MASK,
 571                        .idle_reg = BD718XX_REG_BUCK1_VOLT_IDLE,
 572                        .idle_mask = DVS_BUCK_RUN_MASK,
 573                        .suspend_reg = BD718XX_REG_BUCK1_VOLT_SUSP,
 574                        .suspend_mask = DVS_BUCK_RUN_MASK,
 575                },
 576                .init = {
 577                        .reg = BD718XX_REG_BUCK1_CTRL,
 578                        .mask = BD718XX_BUCK_SEL,
 579                        .val = BD718XX_BUCK_SEL,
 580                },
 581        },
 582        {
 583                .desc = {
 584                        .name = "buck2",
 585                        .of_match = of_match_ptr("BUCK2"),
 586                        .regulators_node = of_match_ptr("regulators"),
 587                        .id = BD718XX_BUCK2,
 588                        .ops = &bd718xx_dvs_buck_regulator_ops,
 589                        .type = REGULATOR_VOLTAGE,
 590                        .n_voltages = BD718XX_DVS_BUCK_VOLTAGE_NUM,
 591                        .linear_ranges = bd718xx_dvs_buck_volts,
 592                        .n_linear_ranges = ARRAY_SIZE(bd718xx_dvs_buck_volts),
 593                        .vsel_reg = BD718XX_REG_BUCK2_VOLT_RUN,
 594                        .vsel_mask = DVS_BUCK_RUN_MASK,
 595                        .enable_reg = BD718XX_REG_BUCK2_CTRL,
 596                        .enable_mask = BD718XX_BUCK_EN,
 597                        .owner = THIS_MODULE,
 598                        .of_parse_cb = buck_set_hw_dvs_levels,
 599                },
 600                .dvs = {
 601                        .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE,
 602                        .run_reg = BD718XX_REG_BUCK2_VOLT_RUN,
 603                        .run_mask = DVS_BUCK_RUN_MASK,
 604                        .idle_reg = BD718XX_REG_BUCK2_VOLT_IDLE,
 605                        .idle_mask = DVS_BUCK_RUN_MASK,
 606                },
 607                .init = {
 608                        .reg = BD718XX_REG_BUCK2_CTRL,
 609                        .mask = BD718XX_BUCK_SEL,
 610                        .val = BD718XX_BUCK_SEL,
 611                },
 612        },
 613        {
 614                .desc = {
 615                        .name = "buck3",
 616                        .of_match = of_match_ptr("BUCK3"),
 617                        .regulators_node = of_match_ptr("regulators"),
 618                        .id = BD718XX_BUCK3,
 619                        .ops = &bd718xx_pickable_range_buck_ops,
 620                        .type = REGULATOR_VOLTAGE,
 621                        .n_voltages = BD71847_BUCK3_VOLTAGE_NUM,
 622                        .linear_ranges = bd71847_buck3_volts,
 623                        .n_linear_ranges =
 624                                ARRAY_SIZE(bd71847_buck3_volts),
 625                        .vsel_reg = BD718XX_REG_1ST_NODVS_BUCK_VOLT,
 626                        .vsel_mask = BD718XX_1ST_NODVS_BUCK_MASK,
 627                        .vsel_range_reg = BD718XX_REG_1ST_NODVS_BUCK_VOLT,
 628                        .vsel_range_mask = BD71847_BUCK3_RANGE_MASK,
 629                        .linear_range_selectors = bd71847_buck3_volt_range_sel,
 630                        .enable_reg = BD718XX_REG_1ST_NODVS_BUCK_CTRL,
 631                        .enable_mask = BD718XX_BUCK_EN,
 632                        .owner = THIS_MODULE,
 633                },
 634                .init = {
 635                        .reg = BD718XX_REG_1ST_NODVS_BUCK_CTRL,
 636                        .mask = BD718XX_BUCK_SEL,
 637                        .val = BD718XX_BUCK_SEL,
 638                },
 639        },
 640        {
 641                .desc = {
 642                        .name = "buck4",
 643                        .of_match = of_match_ptr("BUCK4"),
 644                        .regulators_node = of_match_ptr("regulators"),
 645                        .id = BD718XX_BUCK4,
 646                        .ops = &bd718xx_pickable_range_buck_ops,
 647                        .type = REGULATOR_VOLTAGE,
 648                        .n_voltages = BD71847_BUCK4_VOLTAGE_NUM,
 649                        .linear_ranges = bd71847_buck4_volts,
 650                        .n_linear_ranges =
 651                                ARRAY_SIZE(bd71847_buck4_volts),
 652                        .enable_reg = BD718XX_REG_2ND_NODVS_BUCK_CTRL,
 653                        .vsel_reg = BD718XX_REG_2ND_NODVS_BUCK_VOLT,
 654                        .vsel_mask = BD71847_BUCK4_MASK,
 655                        .vsel_range_reg = BD718XX_REG_2ND_NODVS_BUCK_VOLT,
 656                        .vsel_range_mask = BD71847_BUCK4_RANGE_MASK,
 657                        .linear_range_selectors = bd71847_buck4_volt_range_sel,
 658                        .enable_mask = BD718XX_BUCK_EN,
 659                        .owner = THIS_MODULE,
 660                },
 661                .init = {
 662                        .reg = BD718XX_REG_2ND_NODVS_BUCK_CTRL,
 663                        .mask = BD718XX_BUCK_SEL,
 664                        .val = BD718XX_BUCK_SEL,
 665                },
 666        },
 667        {
 668                .desc = {
 669                        .name = "buck5",
 670                        .of_match = of_match_ptr("BUCK5"),
 671                        .regulators_node = of_match_ptr("regulators"),
 672                        .id = BD718XX_BUCK5,
 673                        .ops = &bd718xx_buck_regulator_nolinear_ops,
 674                        .type = REGULATOR_VOLTAGE,
 675                        .volt_table = &bd718xx_3rd_nodvs_buck_volts[0],
 676                        .n_voltages = ARRAY_SIZE(bd718xx_3rd_nodvs_buck_volts),
 677                        .vsel_reg = BD718XX_REG_3RD_NODVS_BUCK_VOLT,
 678                        .vsel_mask = BD718XX_3RD_NODVS_BUCK_MASK,
 679                        .enable_reg = BD718XX_REG_3RD_NODVS_BUCK_CTRL,
 680                        .enable_mask = BD718XX_BUCK_EN,
 681                        .owner = THIS_MODULE,
 682                },
 683                .init = {
 684                        .reg = BD718XX_REG_3RD_NODVS_BUCK_CTRL,
 685                        .mask = BD718XX_BUCK_SEL,
 686                        .val = BD718XX_BUCK_SEL,
 687                },
 688        },
 689        {
 690                .desc = {
 691                        .name = "buck6",
 692                        .of_match = of_match_ptr("BUCK6"),
 693                        .regulators_node = of_match_ptr("regulators"),
 694                        .id = BD718XX_BUCK6,
 695                        .ops = &bd718xx_buck_regulator_ops,
 696                        .type = REGULATOR_VOLTAGE,
 697                        .n_voltages = BD718XX_4TH_NODVS_BUCK_VOLTAGE_NUM,
 698                        .linear_ranges = bd718xx_4th_nodvs_buck_volts,
 699                        .n_linear_ranges =
 700                                ARRAY_SIZE(bd718xx_4th_nodvs_buck_volts),
 701                        .vsel_reg = BD718XX_REG_4TH_NODVS_BUCK_VOLT,
 702                        .vsel_mask = BD718XX_4TH_NODVS_BUCK_MASK,
 703                        .enable_reg = BD718XX_REG_4TH_NODVS_BUCK_CTRL,
 704                        .enable_mask = BD718XX_BUCK_EN,
 705                        .owner = THIS_MODULE,
 706                },
 707                .init = {
 708                        .reg = BD718XX_REG_4TH_NODVS_BUCK_CTRL,
 709                        .mask = BD718XX_BUCK_SEL,
 710                        .val = BD718XX_BUCK_SEL,
 711                },
 712        },
 713        {
 714                .desc = {
 715                        .name = "ldo1",
 716                        .of_match = of_match_ptr("LDO1"),
 717                        .regulators_node = of_match_ptr("regulators"),
 718                        .id = BD718XX_LDO1,
 719                        .ops = &bd718xx_pickable_range_ldo_ops,
 720                        .type = REGULATOR_VOLTAGE,
 721                        .n_voltages = BD718XX_LDO1_VOLTAGE_NUM,
 722                        .linear_ranges = bd718xx_ldo1_volts,
 723                        .n_linear_ranges = ARRAY_SIZE(bd718xx_ldo1_volts),
 724                        .vsel_reg = BD718XX_REG_LDO1_VOLT,
 725                        .vsel_mask = BD718XX_LDO1_MASK,
 726                        .vsel_range_reg = BD718XX_REG_LDO1_VOLT,
 727                        .vsel_range_mask = BD718XX_LDO1_RANGE_MASK,
 728                        .linear_range_selectors = bd718xx_ldo1_volt_range_sel,
 729                        .enable_reg = BD718XX_REG_LDO1_VOLT,
 730                        .enable_mask = BD718XX_LDO_EN,
 731                        .owner = THIS_MODULE,
 732                },
 733                .init = {
 734                        .reg = BD718XX_REG_LDO1_VOLT,
 735                        .mask = BD718XX_LDO_SEL,
 736                        .val = BD718XX_LDO_SEL,
 737                },
 738        },
 739        {
 740                .desc = {
 741                        .name = "ldo2",
 742                        .of_match = of_match_ptr("LDO2"),
 743                        .regulators_node = of_match_ptr("regulators"),
 744                        .id = BD718XX_LDO2,
 745                        .ops = &bd718xx_ldo_regulator_nolinear_ops,
 746                        .type = REGULATOR_VOLTAGE,
 747                        .volt_table = &ldo_2_volts[0],
 748                        .vsel_reg = BD718XX_REG_LDO2_VOLT,
 749                        .vsel_mask = BD718XX_LDO2_MASK,
 750                        .n_voltages = ARRAY_SIZE(ldo_2_volts),
 751                        .enable_reg = BD718XX_REG_LDO2_VOLT,
 752                        .enable_mask = BD718XX_LDO_EN,
 753                        .owner = THIS_MODULE,
 754                },
 755                .init = {
 756                        .reg = BD718XX_REG_LDO2_VOLT,
 757                        .mask = BD718XX_LDO_SEL,
 758                        .val = BD718XX_LDO_SEL,
 759                },
 760        },
 761        {
 762                .desc = {
 763                        .name = "ldo3",
 764                        .of_match = of_match_ptr("LDO3"),
 765                        .regulators_node = of_match_ptr("regulators"),
 766                        .id = BD718XX_LDO3,
 767                        .ops = &bd718xx_ldo_regulator_ops,
 768                        .type = REGULATOR_VOLTAGE,
 769                        .n_voltages = BD718XX_LDO3_VOLTAGE_NUM,
 770                        .linear_ranges = bd718xx_ldo3_volts,
 771                        .n_linear_ranges = ARRAY_SIZE(bd718xx_ldo3_volts),
 772                        .vsel_reg = BD718XX_REG_LDO3_VOLT,
 773                        .vsel_mask = BD718XX_LDO3_MASK,
 774                        .enable_reg = BD718XX_REG_LDO3_VOLT,
 775                        .enable_mask = BD718XX_LDO_EN,
 776                        .owner = THIS_MODULE,
 777                },
 778                .init = {
 779                        .reg = BD718XX_REG_LDO3_VOLT,
 780                        .mask = BD718XX_LDO_SEL,
 781                        .val = BD718XX_LDO_SEL,
 782                },
 783        },
 784        {
 785                .desc = {
 786                        .name = "ldo4",
 787                        .of_match = of_match_ptr("LDO4"),
 788                        .regulators_node = of_match_ptr("regulators"),
 789                        .id = BD718XX_LDO4,
 790                        .ops = &bd718xx_ldo_regulator_ops,
 791                        .type = REGULATOR_VOLTAGE,
 792                        .n_voltages = BD718XX_LDO4_VOLTAGE_NUM,
 793                        .linear_ranges = bd718xx_ldo4_volts,
 794                        .n_linear_ranges = ARRAY_SIZE(bd718xx_ldo4_volts),
 795                        .vsel_reg = BD718XX_REG_LDO4_VOLT,
 796                        .vsel_mask = BD718XX_LDO4_MASK,
 797                        .enable_reg = BD718XX_REG_LDO4_VOLT,
 798                        .enable_mask = BD718XX_LDO_EN,
 799                        .owner = THIS_MODULE,
 800                },
 801                .init = {
 802                        .reg = BD718XX_REG_LDO4_VOLT,
 803                        .mask = BD718XX_LDO_SEL,
 804                        .val = BD718XX_LDO_SEL,
 805                },
 806        },
 807        {
 808                .desc = {
 809                        .name = "ldo5",
 810                        .of_match = of_match_ptr("LDO5"),
 811                        .regulators_node = of_match_ptr("regulators"),
 812                        .id = BD718XX_LDO5,
 813                        .ops = &bd718xx_pickable_range_ldo_ops,
 814                        .type = REGULATOR_VOLTAGE,
 815                        .n_voltages = BD71847_LDO5_VOLTAGE_NUM,
 816                        .linear_ranges = bd71847_ldo5_volts,
 817                        .n_linear_ranges = ARRAY_SIZE(bd71847_ldo5_volts),
 818                        .vsel_reg = BD718XX_REG_LDO5_VOLT,
 819                        .vsel_mask = BD71847_LDO5_MASK,
 820                        .vsel_range_reg = BD718XX_REG_LDO5_VOLT,
 821                        .vsel_range_mask = BD71847_LDO5_RANGE_MASK,
 822                        .linear_range_selectors = bd71847_ldo5_volt_range_sel,
 823                        .enable_reg = BD718XX_REG_LDO5_VOLT,
 824                        .enable_mask = BD718XX_LDO_EN,
 825                        .owner = THIS_MODULE,
 826                },
 827                .init = {
 828                        .reg = BD718XX_REG_LDO5_VOLT,
 829                        .mask = BD718XX_LDO_SEL,
 830                        .val = BD718XX_LDO_SEL,
 831                },
 832        },
 833        {
 834                .desc = {
 835                        .name = "ldo6",
 836                        .of_match = of_match_ptr("LDO6"),
 837                        .regulators_node = of_match_ptr("regulators"),
 838                        .id = BD718XX_LDO6,
 839                        .ops = &bd718xx_ldo_regulator_ops,
 840                        .type = REGULATOR_VOLTAGE,
 841                        .n_voltages = BD718XX_LDO6_VOLTAGE_NUM,
 842                        .linear_ranges = bd718xx_ldo6_volts,
 843                        .n_linear_ranges = ARRAY_SIZE(bd718xx_ldo6_volts),
 844                        /* LDO6 is supplied by buck5 */
 845                        .supply_name = "buck5",
 846                        .vsel_reg = BD718XX_REG_LDO6_VOLT,
 847                        .vsel_mask = BD718XX_LDO6_MASK,
 848                        .enable_reg = BD718XX_REG_LDO6_VOLT,
 849                        .enable_mask = BD718XX_LDO_EN,
 850                        .owner = THIS_MODULE,
 851                },
 852                .init = {
 853                        .reg = BD718XX_REG_LDO6_VOLT,
 854                        .mask = BD718XX_LDO_SEL,
 855                        .val = BD718XX_LDO_SEL,
 856                },
 857        },
 858};
 859
 860static const struct bd718xx_regulator_data bd71837_regulators[] = {
 861        {
 862                .desc = {
 863                        .name = "buck1",
 864                        .of_match = of_match_ptr("BUCK1"),
 865                        .regulators_node = of_match_ptr("regulators"),
 866                        .id = BD718XX_BUCK1,
 867                        .ops = &bd718xx_dvs_buck_regulator_ops,
 868                        .type = REGULATOR_VOLTAGE,
 869                        .n_voltages = BD718XX_DVS_BUCK_VOLTAGE_NUM,
 870                        .linear_ranges = bd718xx_dvs_buck_volts,
 871                        .n_linear_ranges = ARRAY_SIZE(bd718xx_dvs_buck_volts),
 872                        .vsel_reg = BD718XX_REG_BUCK1_VOLT_RUN,
 873                        .vsel_mask = DVS_BUCK_RUN_MASK,
 874                        .enable_reg = BD718XX_REG_BUCK1_CTRL,
 875                        .enable_mask = BD718XX_BUCK_EN,
 876                        .owner = THIS_MODULE,
 877                        .of_parse_cb = buck_set_hw_dvs_levels,
 878                },
 879                .dvs = {
 880                        .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
 881                                     ROHM_DVS_LEVEL_SUSPEND,
 882                        .run_reg = BD718XX_REG_BUCK1_VOLT_RUN,
 883                        .run_mask = DVS_BUCK_RUN_MASK,
 884                        .idle_reg = BD718XX_REG_BUCK1_VOLT_IDLE,
 885                        .idle_mask = DVS_BUCK_RUN_MASK,
 886                        .suspend_reg = BD718XX_REG_BUCK1_VOLT_SUSP,
 887                        .suspend_mask = DVS_BUCK_RUN_MASK,
 888                },
 889                .init = {
 890                        .reg = BD718XX_REG_BUCK1_CTRL,
 891                        .mask = BD718XX_BUCK_SEL,
 892                        .val = BD718XX_BUCK_SEL,
 893                },
 894        },
 895        {
 896                .desc = {
 897                        .name = "buck2",
 898                        .of_match = of_match_ptr("BUCK2"),
 899                        .regulators_node = of_match_ptr("regulators"),
 900                        .id = BD718XX_BUCK2,
 901                        .ops = &bd718xx_dvs_buck_regulator_ops,
 902                        .type = REGULATOR_VOLTAGE,
 903                        .n_voltages = BD718XX_DVS_BUCK_VOLTAGE_NUM,
 904                        .linear_ranges = bd718xx_dvs_buck_volts,
 905                        .n_linear_ranges = ARRAY_SIZE(bd718xx_dvs_buck_volts),
 906                        .vsel_reg = BD718XX_REG_BUCK2_VOLT_RUN,
 907                        .vsel_mask = DVS_BUCK_RUN_MASK,
 908                        .enable_reg = BD718XX_REG_BUCK2_CTRL,
 909                        .enable_mask = BD718XX_BUCK_EN,
 910                        .owner = THIS_MODULE,
 911                        .of_parse_cb = buck_set_hw_dvs_levels,
 912                },
 913                .dvs = {
 914                        .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE,
 915                        .run_reg = BD718XX_REG_BUCK2_VOLT_RUN,
 916                        .run_mask = DVS_BUCK_RUN_MASK,
 917                        .idle_reg = BD718XX_REG_BUCK2_VOLT_IDLE,
 918                        .idle_mask = DVS_BUCK_RUN_MASK,
 919                },
 920                .init = {
 921                        .reg = BD718XX_REG_BUCK2_CTRL,
 922                        .mask = BD718XX_BUCK_SEL,
 923                        .val = BD718XX_BUCK_SEL,
 924                },
 925        },
 926        {
 927                .desc = {
 928                        .name = "buck3",
 929                        .of_match = of_match_ptr("BUCK3"),
 930                        .regulators_node = of_match_ptr("regulators"),
 931                        .id = BD718XX_BUCK3,
 932                        .ops = &bd718xx_dvs_buck_regulator_ops,
 933                        .type = REGULATOR_VOLTAGE,
 934                        .n_voltages = BD718XX_DVS_BUCK_VOLTAGE_NUM,
 935                        .linear_ranges = bd718xx_dvs_buck_volts,
 936                        .n_linear_ranges = ARRAY_SIZE(bd718xx_dvs_buck_volts),
 937                        .vsel_reg = BD71837_REG_BUCK3_VOLT_RUN,
 938                        .vsel_mask = DVS_BUCK_RUN_MASK,
 939                        .enable_reg = BD71837_REG_BUCK3_CTRL,
 940                        .enable_mask = BD718XX_BUCK_EN,
 941                        .owner = THIS_MODULE,
 942                        .of_parse_cb = buck_set_hw_dvs_levels,
 943                },
 944                .dvs = {
 945                        .level_map = ROHM_DVS_LEVEL_RUN,
 946                        .run_reg = BD71837_REG_BUCK3_VOLT_RUN,
 947                        .run_mask = DVS_BUCK_RUN_MASK,
 948                },
 949                .init = {
 950                        .reg = BD71837_REG_BUCK3_CTRL,
 951                        .mask = BD718XX_BUCK_SEL,
 952                        .val = BD718XX_BUCK_SEL,
 953                },
 954        },
 955        {
 956                .desc = {
 957                        .name = "buck4",
 958                        .of_match = of_match_ptr("BUCK4"),
 959                        .regulators_node = of_match_ptr("regulators"),
 960                        .id = BD718XX_BUCK4,
 961                        .ops = &bd718xx_dvs_buck_regulator_ops,
 962                        .type = REGULATOR_VOLTAGE,
 963                        .n_voltages = BD718XX_DVS_BUCK_VOLTAGE_NUM,
 964                        .linear_ranges = bd718xx_dvs_buck_volts,
 965                        .n_linear_ranges = ARRAY_SIZE(bd718xx_dvs_buck_volts),
 966                        .vsel_reg = BD71837_REG_BUCK4_VOLT_RUN,
 967                        .vsel_mask = DVS_BUCK_RUN_MASK,
 968                        .enable_reg = BD71837_REG_BUCK4_CTRL,
 969                        .enable_mask = BD718XX_BUCK_EN,
 970                        .owner = THIS_MODULE,
 971                        .of_parse_cb = buck_set_hw_dvs_levels,
 972                },
 973                .dvs = {
 974                        .level_map = ROHM_DVS_LEVEL_RUN,
 975                        .run_reg = BD71837_REG_BUCK4_VOLT_RUN,
 976                        .run_mask = DVS_BUCK_RUN_MASK,
 977                },
 978                .init = {
 979                        .reg = BD71837_REG_BUCK4_CTRL,
 980                        .mask = BD718XX_BUCK_SEL,
 981                        .val = BD718XX_BUCK_SEL,
 982                },
 983        },
 984        {
 985                .desc = {
 986                        .name = "buck5",
 987                        .of_match = of_match_ptr("BUCK5"),
 988                        .regulators_node = of_match_ptr("regulators"),
 989                        .id = BD718XX_BUCK5,
 990                        .ops = &bd71837_pickable_range_buck_ops,
 991                        .type = REGULATOR_VOLTAGE,
 992                        .n_voltages = BD71837_BUCK5_VOLTAGE_NUM,
 993                        .linear_ranges = bd71837_buck5_volts,
 994                        .n_linear_ranges =
 995                                ARRAY_SIZE(bd71837_buck5_volts),
 996                        .vsel_reg = BD718XX_REG_1ST_NODVS_BUCK_VOLT,
 997                        .vsel_mask = BD71837_BUCK5_MASK,
 998                        .vsel_range_reg = BD718XX_REG_1ST_NODVS_BUCK_VOLT,
 999                        .vsel_range_mask = BD71837_BUCK5_RANGE_MASK,
1000                        .linear_range_selectors = bd71837_buck5_volt_range_sel,
1001                        .enable_reg = BD718XX_REG_1ST_NODVS_BUCK_CTRL,
1002                        .enable_mask = BD718XX_BUCK_EN,
1003                        .owner = THIS_MODULE,
1004                },
1005                .init = {
1006                        .reg = BD718XX_REG_1ST_NODVS_BUCK_CTRL,
1007                        .mask = BD718XX_BUCK_SEL,
1008                        .val = BD718XX_BUCK_SEL,
1009                },
1010        },
1011        {
1012                .desc = {
1013                        .name = "buck6",
1014                        .of_match = of_match_ptr("BUCK6"),
1015                        .regulators_node = of_match_ptr("regulators"),
1016                        .id = BD718XX_BUCK6,
1017                        .ops = &bd71837_buck_regulator_ops,
1018                        .type = REGULATOR_VOLTAGE,
1019                        .n_voltages = BD71837_BUCK6_VOLTAGE_NUM,
1020                        .linear_ranges = bd71837_buck6_volts,
1021                        .n_linear_ranges =
1022                                ARRAY_SIZE(bd71837_buck6_volts),
1023                        .vsel_reg = BD718XX_REG_2ND_NODVS_BUCK_VOLT,
1024                        .vsel_mask = BD71837_BUCK6_MASK,
1025                        .enable_reg = BD718XX_REG_2ND_NODVS_BUCK_CTRL,
1026                        .enable_mask = BD718XX_BUCK_EN,
1027                        .owner = THIS_MODULE,
1028                },
1029                .init = {
1030                        .reg = BD718XX_REG_2ND_NODVS_BUCK_CTRL,
1031                        .mask = BD718XX_BUCK_SEL,
1032                        .val = BD718XX_BUCK_SEL,
1033                },
1034        },
1035        {
1036                .desc = {
1037                        .name = "buck7",
1038                        .of_match = of_match_ptr("BUCK7"),
1039                        .regulators_node = of_match_ptr("regulators"),
1040                        .id = BD718XX_BUCK7,
1041                        .ops = &bd71837_buck_regulator_nolinear_ops,
1042                        .type = REGULATOR_VOLTAGE,
1043                        .volt_table = &bd718xx_3rd_nodvs_buck_volts[0],
1044                        .n_voltages = ARRAY_SIZE(bd718xx_3rd_nodvs_buck_volts),
1045                        .vsel_reg = BD718XX_REG_3RD_NODVS_BUCK_VOLT,
1046                        .vsel_mask = BD718XX_3RD_NODVS_BUCK_MASK,
1047                        .enable_reg = BD718XX_REG_3RD_NODVS_BUCK_CTRL,
1048                        .enable_mask = BD718XX_BUCK_EN,
1049                        .owner = THIS_MODULE,
1050                },
1051                .init = {
1052                        .reg = BD718XX_REG_3RD_NODVS_BUCK_CTRL,
1053                        .mask = BD718XX_BUCK_SEL,
1054                        .val = BD718XX_BUCK_SEL,
1055                },
1056        },
1057        {
1058                .desc = {
1059                        .name = "buck8",
1060                        .of_match = of_match_ptr("BUCK8"),
1061                        .regulators_node = of_match_ptr("regulators"),
1062                        .id = BD718XX_BUCK8,
1063                        .ops = &bd71837_buck_regulator_ops,
1064                        .type = REGULATOR_VOLTAGE,
1065                        .n_voltages = BD718XX_4TH_NODVS_BUCK_VOLTAGE_NUM,
1066                        .linear_ranges = bd718xx_4th_nodvs_buck_volts,
1067                        .n_linear_ranges =
1068                                ARRAY_SIZE(bd718xx_4th_nodvs_buck_volts),
1069                        .vsel_reg = BD718XX_REG_4TH_NODVS_BUCK_VOLT,
1070                        .vsel_mask = BD718XX_4TH_NODVS_BUCK_MASK,
1071                        .enable_reg = BD718XX_REG_4TH_NODVS_BUCK_CTRL,
1072                        .enable_mask = BD718XX_BUCK_EN,
1073                        .owner = THIS_MODULE,
1074                },
1075                .init = {
1076                        .reg = BD718XX_REG_4TH_NODVS_BUCK_CTRL,
1077                        .mask = BD718XX_BUCK_SEL,
1078                        .val = BD718XX_BUCK_SEL,
1079                },
1080        },
1081        {
1082                .desc = {
1083                        .name = "ldo1",
1084                        .of_match = of_match_ptr("LDO1"),
1085                        .regulators_node = of_match_ptr("regulators"),
1086                        .id = BD718XX_LDO1,
1087                        .ops = &bd71837_pickable_range_ldo_ops,
1088                        .type = REGULATOR_VOLTAGE,
1089                        .n_voltages = BD718XX_LDO1_VOLTAGE_NUM,
1090                        .linear_ranges = bd718xx_ldo1_volts,
1091                        .n_linear_ranges = ARRAY_SIZE(bd718xx_ldo1_volts),
1092                        .vsel_reg = BD718XX_REG_LDO1_VOLT,
1093                        .vsel_mask = BD718XX_LDO1_MASK,
1094                        .vsel_range_reg = BD718XX_REG_LDO1_VOLT,
1095                        .vsel_range_mask = BD718XX_LDO1_RANGE_MASK,
1096                        .linear_range_selectors = bd718xx_ldo1_volt_range_sel,
1097                        .enable_reg = BD718XX_REG_LDO1_VOLT,
1098                        .enable_mask = BD718XX_LDO_EN,
1099                        .owner = THIS_MODULE,
1100                },
1101                .init = {
1102                        .reg = BD718XX_REG_LDO1_VOLT,
1103                        .mask = BD718XX_LDO_SEL,
1104                        .val = BD718XX_LDO_SEL,
1105                },
1106        },
1107        {
1108                .desc = {
1109                        .name = "ldo2",
1110                        .of_match = of_match_ptr("LDO2"),
1111                        .regulators_node = of_match_ptr("regulators"),
1112                        .id = BD718XX_LDO2,
1113                        .ops = &bd71837_ldo_regulator_nolinear_ops,
1114                        .type = REGULATOR_VOLTAGE,
1115                        .volt_table = &ldo_2_volts[0],
1116                        .vsel_reg = BD718XX_REG_LDO2_VOLT,
1117                        .vsel_mask = BD718XX_LDO2_MASK,
1118                        .n_voltages = ARRAY_SIZE(ldo_2_volts),
1119                        .enable_reg = BD718XX_REG_LDO2_VOLT,
1120                        .enable_mask = BD718XX_LDO_EN,
1121                        .owner = THIS_MODULE,
1122                },
1123                .init = {
1124                        .reg = BD718XX_REG_LDO2_VOLT,
1125                        .mask = BD718XX_LDO_SEL,
1126                        .val = BD718XX_LDO_SEL,
1127                },
1128        },
1129        {
1130                .desc = {
1131                        .name = "ldo3",
1132                        .of_match = of_match_ptr("LDO3"),
1133                        .regulators_node = of_match_ptr("regulators"),
1134                        .id = BD718XX_LDO3,
1135                        .ops = &bd71837_ldo_regulator_ops,
1136                        .type = REGULATOR_VOLTAGE,
1137                        .n_voltages = BD718XX_LDO3_VOLTAGE_NUM,
1138                        .linear_ranges = bd718xx_ldo3_volts,
1139                        .n_linear_ranges = ARRAY_SIZE(bd718xx_ldo3_volts),
1140                        .vsel_reg = BD718XX_REG_LDO3_VOLT,
1141                        .vsel_mask = BD718XX_LDO3_MASK,
1142                        .enable_reg = BD718XX_REG_LDO3_VOLT,
1143                        .enable_mask = BD718XX_LDO_EN,
1144                        .owner = THIS_MODULE,
1145                },
1146                .init = {
1147                        .reg = BD718XX_REG_LDO3_VOLT,
1148                        .mask = BD718XX_LDO_SEL,
1149                        .val = BD718XX_LDO_SEL,
1150                },
1151        },
1152        {
1153                .desc = {
1154                        .name = "ldo4",
1155                        .of_match = of_match_ptr("LDO4"),
1156                        .regulators_node = of_match_ptr("regulators"),
1157                        .id = BD718XX_LDO4,
1158                        .ops = &bd71837_ldo_regulator_ops,
1159                        .type = REGULATOR_VOLTAGE,
1160                        .n_voltages = BD718XX_LDO4_VOLTAGE_NUM,
1161                        .linear_ranges = bd718xx_ldo4_volts,
1162                        .n_linear_ranges = ARRAY_SIZE(bd718xx_ldo4_volts),
1163                        .vsel_reg = BD718XX_REG_LDO4_VOLT,
1164                        .vsel_mask = BD718XX_LDO4_MASK,
1165                        .enable_reg = BD718XX_REG_LDO4_VOLT,
1166                        .enable_mask = BD718XX_LDO_EN,
1167                        .owner = THIS_MODULE,
1168                },
1169                .init = {
1170                        .reg = BD718XX_REG_LDO4_VOLT,
1171                        .mask = BD718XX_LDO_SEL,
1172                        .val = BD718XX_LDO_SEL,
1173                },
1174        },
1175        {
1176                .desc = {
1177                        .name = "ldo5",
1178                        .of_match = of_match_ptr("LDO5"),
1179                        .regulators_node = of_match_ptr("regulators"),
1180                        .id = BD718XX_LDO5,
1181                        .ops = &bd71837_ldo_regulator_ops,
1182                        .type = REGULATOR_VOLTAGE,
1183                        .n_voltages = BD71837_LDO5_VOLTAGE_NUM,
1184                        .linear_ranges = bd71837_ldo5_volts,
1185                        .n_linear_ranges = ARRAY_SIZE(bd71837_ldo5_volts),
1186                        /* LDO5 is supplied by buck6 */
1187                        .supply_name = "buck6",
1188                        .vsel_reg = BD718XX_REG_LDO5_VOLT,
1189                        .vsel_mask = BD71837_LDO5_MASK,
1190                        .enable_reg = BD718XX_REG_LDO5_VOLT,
1191                        .enable_mask = BD718XX_LDO_EN,
1192                        .owner = THIS_MODULE,
1193                },
1194                .init = {
1195                        .reg = BD718XX_REG_LDO5_VOLT,
1196                        .mask = BD718XX_LDO_SEL,
1197                        .val = BD718XX_LDO_SEL,
1198                },
1199                .additional_inits = bd71837_ldo5_inits,
1200                .additional_init_amnt = ARRAY_SIZE(bd71837_ldo5_inits),
1201        },
1202        {
1203                .desc = {
1204                        .name = "ldo6",
1205                        .of_match = of_match_ptr("LDO6"),
1206                        .regulators_node = of_match_ptr("regulators"),
1207                        .id = BD718XX_LDO6,
1208                        .ops = &bd71837_ldo_regulator_ops,
1209                        .type = REGULATOR_VOLTAGE,
1210                        .n_voltages = BD718XX_LDO6_VOLTAGE_NUM,
1211                        .linear_ranges = bd718xx_ldo6_volts,
1212                        .n_linear_ranges = ARRAY_SIZE(bd718xx_ldo6_volts),
1213                        /* LDO6 is supplied by buck7 */
1214                        .supply_name = "buck7",
1215                        .vsel_reg = BD718XX_REG_LDO6_VOLT,
1216                        .vsel_mask = BD718XX_LDO6_MASK,
1217                        .enable_reg = BD718XX_REG_LDO6_VOLT,
1218                        .enable_mask = BD718XX_LDO_EN,
1219                        .owner = THIS_MODULE,
1220                },
1221                .init = {
1222                        .reg = BD718XX_REG_LDO6_VOLT,
1223                        .mask = BD718XX_LDO_SEL,
1224                        .val = BD718XX_LDO_SEL,
1225                },
1226                .additional_inits = bd71837_ldo6_inits,
1227                .additional_init_amnt = ARRAY_SIZE(bd71837_ldo6_inits),
1228        },
1229        {
1230                .desc = {
1231                        .name = "ldo7",
1232                        .of_match = of_match_ptr("LDO7"),
1233                        .regulators_node = of_match_ptr("regulators"),
1234                        .id = BD718XX_LDO7,
1235                        .ops = &bd71837_ldo_regulator_ops,
1236                        .type = REGULATOR_VOLTAGE,
1237                        .n_voltages = BD71837_LDO7_VOLTAGE_NUM,
1238                        .linear_ranges = bd71837_ldo7_volts,
1239                        .n_linear_ranges = ARRAY_SIZE(bd71837_ldo7_volts),
1240                        .vsel_reg = BD71837_REG_LDO7_VOLT,
1241                        .vsel_mask = BD71837_LDO7_MASK,
1242                        .enable_reg = BD71837_REG_LDO7_VOLT,
1243                        .enable_mask = BD718XX_LDO_EN,
1244                        .owner = THIS_MODULE,
1245                },
1246                .init = {
1247                        .reg = BD71837_REG_LDO7_VOLT,
1248                        .mask = BD718XX_LDO_SEL,
1249                        .val = BD718XX_LDO_SEL,
1250                },
1251        },
1252};
1253
1254static int bd718xx_probe(struct platform_device *pdev)
1255{
1256        struct bd718xx *mfd;
1257        struct regulator_config config = { 0 };
1258        int i, j, err;
1259        bool use_snvs;
1260        const struct bd718xx_regulator_data *reg_data;
1261        unsigned int num_reg_data;
1262        enum rohm_chip_type chip = platform_get_device_id(pdev)->driver_data;
1263
1264        mfd = dev_get_drvdata(pdev->dev.parent);
1265        if (!mfd) {
1266                dev_err(&pdev->dev, "No MFD driver data\n");
1267                err = -EINVAL;
1268                goto err;
1269        }
1270
1271        switch (chip) {
1272        case ROHM_CHIP_TYPE_BD71837:
1273                reg_data = bd71837_regulators;
1274                num_reg_data = ARRAY_SIZE(bd71837_regulators);
1275                break;
1276        case ROHM_CHIP_TYPE_BD71847:
1277                reg_data = bd71847_regulators;
1278                num_reg_data = ARRAY_SIZE(bd71847_regulators);
1279                break;
1280        default:
1281                dev_err(&pdev->dev, "Unsupported chip type\n");
1282                err = -EINVAL;
1283                goto err;
1284        }
1285
1286        /* Register LOCK release */
1287        err = regmap_update_bits(mfd->chip.regmap, BD718XX_REG_REGLOCK,
1288                                 (REGLOCK_PWRSEQ | REGLOCK_VREG), 0);
1289        if (err) {
1290                dev_err(&pdev->dev, "Failed to unlock PMIC (%d)\n", err);
1291                goto err;
1292        } else {
1293                dev_dbg(&pdev->dev, "Unlocked lock register 0x%x\n",
1294                        BD718XX_REG_REGLOCK);
1295        }
1296
1297        use_snvs = of_property_read_bool(pdev->dev.parent->of_node,
1298                                         "rohm,reset-snvs-powered");
1299
1300        /*
1301         * Change the next stage from poweroff to be READY instead of SNVS
1302         * for all reset types because OTP loading at READY will clear SEL
1303         * bit allowing HW defaults for power rails to be used
1304         */
1305        if (!use_snvs) {
1306                err = regmap_update_bits(mfd->chip.regmap,
1307                                         BD718XX_REG_TRANS_COND1,
1308                                         BD718XX_ON_REQ_POWEROFF_MASK |
1309                                         BD718XX_SWRESET_POWEROFF_MASK |
1310                                         BD718XX_WDOG_POWEROFF_MASK |
1311                                         BD718XX_KEY_L_POWEROFF_MASK,
1312                                         BD718XX_POWOFF_TO_RDY);
1313                if (err) {
1314                        dev_err(&pdev->dev, "Failed to change reset target\n");
1315                        goto err;
1316                } else {
1317                        dev_dbg(&pdev->dev,
1318                                "Changed all resets from SVNS to READY\n");
1319                }
1320        }
1321
1322        for (i = 0; i < num_reg_data; i++) {
1323
1324                const struct regulator_desc *desc;
1325                struct regulator_dev *rdev;
1326                const struct bd718xx_regulator_data *r;
1327
1328                r = &reg_data[i];
1329                desc = &r->desc;
1330
1331                config.dev = pdev->dev.parent;
1332                config.regmap = mfd->chip.regmap;
1333
1334                rdev = devm_regulator_register(&pdev->dev, desc, &config);
1335                if (IS_ERR(rdev)) {
1336                        dev_err(&pdev->dev,
1337                                "failed to register %s regulator\n",
1338                                desc->name);
1339                        err = PTR_ERR(rdev);
1340                        goto err;
1341                }
1342
1343                /*
1344                 * Regulator register gets the regulator constraints and
1345                 * applies them (set_machine_constraints). This should have
1346                 * turned the control register(s) to correct values and we
1347                 * can now switch the control from PMIC state machine to the
1348                 * register interface
1349                 *
1350                 * At poweroff transition PMIC HW disables EN bit for
1351                 * regulators but leaves SEL bit untouched. So if state
1352                 * transition from POWEROFF is done to SNVS - then all power
1353                 * rails controlled by SW (having SEL bit set) stay disabled
1354                 * as EN is cleared. This will result boot failure if any
1355                 * crucial systems are powered by these rails. We don't
1356                 * enable SW control for crucial regulators if snvs state is
1357                 * used
1358                 */
1359                if (!use_snvs || !rdev->constraints->always_on ||
1360                    !rdev->constraints->boot_on) {
1361                        err = regmap_update_bits(mfd->chip.regmap, r->init.reg,
1362                                                 r->init.mask, r->init.val);
1363                        if (err) {
1364                                dev_err(&pdev->dev,
1365                                        "Failed to take control for (%s)\n",
1366                                        desc->name);
1367                                goto err;
1368                        }
1369                }
1370                for (j = 0; j < r->additional_init_amnt; j++) {
1371                        err = regmap_update_bits(mfd->chip.regmap,
1372                                                 r->additional_inits[j].reg,
1373                                                 r->additional_inits[j].mask,
1374                                                 r->additional_inits[j].val);
1375                        if (err) {
1376                                dev_err(&pdev->dev,
1377                                        "Buck (%s) initialization failed\n",
1378                                        desc->name);
1379                                goto err;
1380                        }
1381                }
1382        }
1383
1384err:
1385        return err;
1386}
1387
1388static const struct platform_device_id bd718x7_pmic_id[] = {
1389        { "bd71837-pmic", ROHM_CHIP_TYPE_BD71837 },
1390        { "bd71847-pmic", ROHM_CHIP_TYPE_BD71847 },
1391        { },
1392};
1393MODULE_DEVICE_TABLE(platform, bd718x7_pmic_id);
1394
1395static struct platform_driver bd718xx_regulator = {
1396        .driver = {
1397                .name = "bd718xx-pmic",
1398        },
1399        .probe = bd718xx_probe,
1400        .id_table = bd718x7_pmic_id,
1401};
1402
1403module_platform_driver(bd718xx_regulator);
1404
1405MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>");
1406MODULE_DESCRIPTION("BD71837/BD71847 voltage regulator driver");
1407MODULE_LICENSE("GPL");
1408MODULE_ALIAS("platform:bd718xx-pmic");
1409