linux/drivers/regulator/rk808-regulator.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Regulator driver for Rockchip RK805/RK808/RK818
   4 *
   5 * Copyright (c) 2014, Fuzhou Rockchip Electronics Co., Ltd
   6 *
   7 * Author: Chris Zhong <zyw@rock-chips.com>
   8 * Author: Zhang Qing <zhangqing@rock-chips.com>
   9 *
  10 * Copyright (C) 2016 PHYTEC Messtechnik GmbH
  11 *
  12 * Author: Wadim Egorov <w.egorov@phytec.de>
  13 */
  14
  15#include <linux/delay.h>
  16#include <linux/gpio.h>
  17#include <linux/i2c.h>
  18#include <linux/module.h>
  19#include <linux/of_device.h>
  20#include <linux/of_gpio.h>
  21#include <linux/mfd/rk808.h>
  22#include <linux/regulator/driver.h>
  23#include <linux/regulator/of_regulator.h>
  24#include <linux/gpio/consumer.h>
  25
  26/* Field Definitions */
  27#define RK808_BUCK_VSEL_MASK    0x3f
  28#define RK808_BUCK4_VSEL_MASK   0xf
  29#define RK808_LDO_VSEL_MASK     0x1f
  30
  31#define RK809_BUCK5_VSEL_MASK           0x7
  32
  33#define RK817_LDO_VSEL_MASK             0x7f
  34#define RK817_BOOST_VSEL_MASK           0x7
  35#define RK817_BUCK_VSEL_MASK            0x7f
  36
  37#define RK818_BUCK_VSEL_MASK            0x3f
  38#define RK818_BUCK4_VSEL_MASK           0x1f
  39#define RK818_LDO_VSEL_MASK             0x1f
  40#define RK818_LDO3_ON_VSEL_MASK         0xf
  41#define RK818_BOOST_ON_VSEL_MASK        0xe0
  42
  43/* Ramp rate definitions for buck1 / buck2 only */
  44#define RK808_RAMP_RATE_OFFSET          3
  45#define RK808_RAMP_RATE_MASK            (3 << RK808_RAMP_RATE_OFFSET)
  46#define RK808_RAMP_RATE_2MV_PER_US      (0 << RK808_RAMP_RATE_OFFSET)
  47#define RK808_RAMP_RATE_4MV_PER_US      (1 << RK808_RAMP_RATE_OFFSET)
  48#define RK808_RAMP_RATE_6MV_PER_US      (2 << RK808_RAMP_RATE_OFFSET)
  49#define RK808_RAMP_RATE_10MV_PER_US     (3 << RK808_RAMP_RATE_OFFSET)
  50
  51#define RK808_DVS2_POL          BIT(2)
  52#define RK808_DVS1_POL          BIT(1)
  53
  54/* Offset from XXX_ON_VSEL to XXX_SLP_VSEL */
  55#define RK808_SLP_REG_OFFSET 1
  56
  57/* Offset from XXX_ON_VSEL to XXX_DVS_VSEL */
  58#define RK808_DVS_REG_OFFSET 2
  59
  60/* Offset from XXX_EN_REG to SLEEP_SET_OFF_XXX */
  61#define RK808_SLP_SET_OFF_REG_OFFSET 2
  62
  63/* max steps for increase voltage of Buck1/2, equal 100mv*/
  64#define MAX_STEPS_ONE_TIME 8
  65
  66#define ENABLE_MASK(id)                 (BIT(id) | BIT(4 + (id)))
  67#define DISABLE_VAL(id)                 (BIT(4 + (id)))
  68
  69#define RK817_BOOST_DESC(_id, _match, _supply, _min, _max, _step, _vreg,\
  70        _vmask, _ereg, _emask, _enval, _disval, _etime, m_drop)         \
  71        {                                                       \
  72                .name           = (_match),                             \
  73                .supply_name    = (_supply),                            \
  74                .of_match       = of_match_ptr(_match),                 \
  75                .regulators_node = of_match_ptr("regulators"),          \
  76                .type           = REGULATOR_VOLTAGE,                    \
  77                .id             = (_id),                                \
  78                .n_voltages     = (((_max) - (_min)) / (_step) + 1),    \
  79                .owner          = THIS_MODULE,                          \
  80                .min_uV         = (_min) * 1000,                        \
  81                .uV_step        = (_step) * 1000,                       \
  82                .vsel_reg       = (_vreg),                              \
  83                .vsel_mask      = (_vmask),                             \
  84                .enable_reg     = (_ereg),                              \
  85                .enable_mask    = (_emask),                             \
  86                .enable_val     = (_enval),                             \
  87                .disable_val     = (_disval),                           \
  88                .enable_time    = (_etime),                             \
  89                .min_dropout_uV = (m_drop) * 1000,                      \
  90                .ops            = &rk817_boost_ops,                     \
  91        }
  92
  93#define RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg,  \
  94        _vmask, _ereg, _emask, _enval, _disval, _etime, _ops)           \
  95        {                                                               \
  96                .name           = (_match),                             \
  97                .supply_name    = (_supply),                            \
  98                .of_match       = of_match_ptr(_match),                 \
  99                .regulators_node = of_match_ptr("regulators"),          \
 100                .type           = REGULATOR_VOLTAGE,                    \
 101                .id             = (_id),                                \
 102                .n_voltages     = (((_max) - (_min)) / (_step) + 1),    \
 103                .owner          = THIS_MODULE,                          \
 104                .min_uV         = (_min) * 1000,                        \
 105                .uV_step        = (_step) * 1000,                       \
 106                .vsel_reg       = (_vreg),                              \
 107                .vsel_mask      = (_vmask),                             \
 108                .enable_reg     = (_ereg),                              \
 109                .enable_mask    = (_emask),                             \
 110                .enable_val     = (_enval),                             \
 111                .disable_val     = (_disval),                           \
 112                .enable_time    = (_etime),                             \
 113                .ops            = _ops,                 \
 114        }
 115
 116#define RK805_DESC(_id, _match, _supply, _min, _max, _step, _vreg,      \
 117        _vmask, _ereg, _emask, _etime)                                  \
 118        RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg,  \
 119        _vmask, _ereg, _emask, 0, 0, _etime, &rk805_reg_ops)
 120
 121#define RK8XX_DESC(_id, _match, _supply, _min, _max, _step, _vreg,      \
 122        _vmask, _ereg, _emask, _etime)                                  \
 123        RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg,  \
 124        _vmask, _ereg, _emask, 0, 0, _etime, &rk808_reg_ops)
 125
 126#define RK817_DESC(_id, _match, _supply, _min, _max, _step, _vreg,      \
 127        _vmask, _ereg, _emask, _disval, _etime)                         \
 128        RK8XX_DESC_COM(_id, _match, _supply, _min, _max, _step, _vreg,  \
 129        _vmask, _ereg, _emask, _emask, _disval, _etime, &rk817_reg_ops)
 130
 131#define RKXX_DESC_SWITCH_COM(_id, _match, _supply, _ereg, _emask,       \
 132        _enval, _disval, _ops)                                          \
 133        {                                                               \
 134                .name           = (_match),                             \
 135                .supply_name    = (_supply),                            \
 136                .of_match       = of_match_ptr(_match),                 \
 137                .regulators_node = of_match_ptr("regulators"),          \
 138                .type           = REGULATOR_VOLTAGE,                    \
 139                .id             = (_id),                                \
 140                .enable_reg     = (_ereg),                              \
 141                .enable_mask    = (_emask),                             \
 142                .enable_val     = (_enval),                             \
 143                .disable_val     = (_disval),                           \
 144                .owner          = THIS_MODULE,                          \
 145                .ops            = _ops                                  \
 146        }
 147
 148#define RK817_DESC_SWITCH(_id, _match, _supply, _ereg, _emask,          \
 149        _disval)                                                        \
 150        RKXX_DESC_SWITCH_COM(_id, _match, _supply, _ereg, _emask,       \
 151        _emask, _disval, &rk817_switch_ops)
 152
 153#define RK8XX_DESC_SWITCH(_id, _match, _supply, _ereg, _emask)          \
 154        RKXX_DESC_SWITCH_COM(_id, _match, _supply, _ereg, _emask,       \
 155        0, 0, &rk808_switch_ops)
 156
 157struct rk808_regulator_data {
 158        struct gpio_desc *dvs_gpio[2];
 159};
 160
 161static const int rk808_buck_config_regs[] = {
 162        RK808_BUCK1_CONFIG_REG,
 163        RK808_BUCK2_CONFIG_REG,
 164        RK808_BUCK3_CONFIG_REG,
 165        RK808_BUCK4_CONFIG_REG,
 166};
 167
 168static const struct regulator_linear_range rk808_ldo3_voltage_ranges[] = {
 169        REGULATOR_LINEAR_RANGE(800000, 0, 13, 100000),
 170        REGULATOR_LINEAR_RANGE(2500000, 15, 15, 0),
 171};
 172
 173#define RK809_BUCK5_SEL_CNT             (8)
 174
 175static const struct regulator_linear_range rk809_buck5_voltage_ranges[] = {
 176        REGULATOR_LINEAR_RANGE(1500000, 0, 0, 0),
 177        REGULATOR_LINEAR_RANGE(1800000, 1, 3, 200000),
 178        REGULATOR_LINEAR_RANGE(2800000, 4, 5, 200000),
 179        REGULATOR_LINEAR_RANGE(3300000, 6, 7, 300000),
 180};
 181
 182#define RK817_BUCK1_MIN0 500000
 183#define RK817_BUCK1_MAX0 1500000
 184
 185#define RK817_BUCK1_MIN1 1600000
 186#define RK817_BUCK1_MAX1 2400000
 187
 188#define RK817_BUCK3_MAX1 3400000
 189
 190#define RK817_BUCK1_STP0 12500
 191#define RK817_BUCK1_STP1 100000
 192
 193#define RK817_BUCK1_SEL0 ((RK817_BUCK1_MAX0 - RK817_BUCK1_MIN0) /\
 194                                                  RK817_BUCK1_STP0)
 195#define RK817_BUCK1_SEL1 ((RK817_BUCK1_MAX1 - RK817_BUCK1_MIN1) /\
 196                                                  RK817_BUCK1_STP1)
 197
 198#define RK817_BUCK3_SEL1 ((RK817_BUCK3_MAX1 - RK817_BUCK1_MIN1) /\
 199                                                  RK817_BUCK1_STP1)
 200
 201#define RK817_BUCK1_SEL_CNT (RK817_BUCK1_SEL0 + RK817_BUCK1_SEL1 + 1)
 202#define RK817_BUCK3_SEL_CNT (RK817_BUCK1_SEL0 + RK817_BUCK3_SEL1 + 1)
 203
 204static const struct regulator_linear_range rk817_buck1_voltage_ranges[] = {
 205        REGULATOR_LINEAR_RANGE(RK817_BUCK1_MIN0, 0,
 206                               RK817_BUCK1_SEL0, RK817_BUCK1_STP0),
 207        REGULATOR_LINEAR_RANGE(RK817_BUCK1_MIN1, RK817_BUCK1_SEL0 + 1,
 208                               RK817_BUCK1_SEL_CNT, RK817_BUCK1_STP1),
 209};
 210
 211static const struct regulator_linear_range rk817_buck3_voltage_ranges[] = {
 212        REGULATOR_LINEAR_RANGE(RK817_BUCK1_MIN0, 0,
 213                               RK817_BUCK1_SEL0, RK817_BUCK1_STP0),
 214        REGULATOR_LINEAR_RANGE(RK817_BUCK1_MIN1, RK817_BUCK1_SEL0 + 1,
 215                               RK817_BUCK3_SEL_CNT, RK817_BUCK1_STP1),
 216};
 217
 218static int rk808_buck1_2_get_voltage_sel_regmap(struct regulator_dev *rdev)
 219{
 220        struct rk808_regulator_data *pdata = rdev_get_drvdata(rdev);
 221        int id = rdev_get_id(rdev);
 222        struct gpio_desc *gpio = pdata->dvs_gpio[id];
 223        unsigned int val;
 224        int ret;
 225
 226        if (!gpio || gpiod_get_value(gpio) == 0)
 227                return regulator_get_voltage_sel_regmap(rdev);
 228
 229        ret = regmap_read(rdev->regmap,
 230                          rdev->desc->vsel_reg + RK808_DVS_REG_OFFSET,
 231                          &val);
 232        if (ret != 0)
 233                return ret;
 234
 235        val &= rdev->desc->vsel_mask;
 236        val >>= ffs(rdev->desc->vsel_mask) - 1;
 237
 238        return val;
 239}
 240
 241static int rk808_buck1_2_i2c_set_voltage_sel(struct regulator_dev *rdev,
 242                                             unsigned sel)
 243{
 244        int ret, delta_sel;
 245        unsigned int old_sel, tmp, val, mask = rdev->desc->vsel_mask;
 246
 247        ret = regmap_read(rdev->regmap, rdev->desc->vsel_reg, &val);
 248        if (ret != 0)
 249                return ret;
 250
 251        tmp = val & ~mask;
 252        old_sel = val & mask;
 253        old_sel >>= ffs(mask) - 1;
 254        delta_sel = sel - old_sel;
 255
 256        /*
 257         * If directly modify the register to change the voltage, we will face
 258         * the risk of overshoot. Put it into a multi-step, can effectively
 259         * avoid this problem, a step is 100mv here.
 260         */
 261        while (delta_sel > MAX_STEPS_ONE_TIME) {
 262                old_sel += MAX_STEPS_ONE_TIME;
 263                val = old_sel << (ffs(mask) - 1);
 264                val |= tmp;
 265
 266                /*
 267                 * i2c is 400kHz (2.5us per bit) and we must transmit _at least_
 268                 * 3 bytes (24 bits) plus start and stop so 26 bits.  So we've
 269                 * got more than 65 us between each voltage change and thus
 270                 * won't ramp faster than ~1500 uV / us.
 271                 */
 272                ret = regmap_write(rdev->regmap, rdev->desc->vsel_reg, val);
 273                delta_sel = sel - old_sel;
 274        }
 275
 276        sel <<= ffs(mask) - 1;
 277        val = tmp | sel;
 278        ret = regmap_write(rdev->regmap, rdev->desc->vsel_reg, val);
 279
 280        /*
 281         * When we change the voltage register directly, the ramp rate is about
 282         * 100000uv/us, wait 1us to make sure the target voltage to be stable,
 283         * so we needn't wait extra time after that.
 284         */
 285        udelay(1);
 286
 287        return ret;
 288}
 289
 290static int rk808_buck1_2_set_voltage_sel(struct regulator_dev *rdev,
 291                                         unsigned sel)
 292{
 293        struct rk808_regulator_data *pdata = rdev_get_drvdata(rdev);
 294        int id = rdev_get_id(rdev);
 295        struct gpio_desc *gpio = pdata->dvs_gpio[id];
 296        unsigned int reg = rdev->desc->vsel_reg;
 297        unsigned old_sel;
 298        int ret, gpio_level;
 299
 300        if (!gpio)
 301                return rk808_buck1_2_i2c_set_voltage_sel(rdev, sel);
 302
 303        gpio_level = gpiod_get_value(gpio);
 304        if (gpio_level == 0) {
 305                reg += RK808_DVS_REG_OFFSET;
 306                ret = regmap_read(rdev->regmap, rdev->desc->vsel_reg, &old_sel);
 307        } else {
 308                ret = regmap_read(rdev->regmap,
 309                                  reg + RK808_DVS_REG_OFFSET,
 310                                  &old_sel);
 311        }
 312
 313        if (ret != 0)
 314                return ret;
 315
 316        sel <<= ffs(rdev->desc->vsel_mask) - 1;
 317        sel |= old_sel & ~rdev->desc->vsel_mask;
 318
 319        ret = regmap_write(rdev->regmap, reg, sel);
 320        if (ret)
 321                return ret;
 322
 323        gpiod_set_value(gpio, !gpio_level);
 324
 325        return ret;
 326}
 327
 328static int rk808_buck1_2_set_voltage_time_sel(struct regulator_dev *rdev,
 329                                       unsigned int old_selector,
 330                                       unsigned int new_selector)
 331{
 332        struct rk808_regulator_data *pdata = rdev_get_drvdata(rdev);
 333        int id = rdev_get_id(rdev);
 334        struct gpio_desc *gpio = pdata->dvs_gpio[id];
 335
 336        /* if there is no dvs1/2 pin, we don't need wait extra time here. */
 337        if (!gpio)
 338                return 0;
 339
 340        return regulator_set_voltage_time_sel(rdev, old_selector, new_selector);
 341}
 342
 343static int rk808_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
 344{
 345        unsigned int ramp_value = RK808_RAMP_RATE_10MV_PER_US;
 346        unsigned int reg = rk808_buck_config_regs[rdev_get_id(rdev)];
 347
 348        switch (ramp_delay) {
 349        case 1 ... 2000:
 350                ramp_value = RK808_RAMP_RATE_2MV_PER_US;
 351                break;
 352        case 2001 ... 4000:
 353                ramp_value = RK808_RAMP_RATE_4MV_PER_US;
 354                break;
 355        case 4001 ... 6000:
 356                ramp_value = RK808_RAMP_RATE_6MV_PER_US;
 357                break;
 358        case 6001 ... 10000:
 359                break;
 360        default:
 361                pr_warn("%s ramp_delay: %d not supported, setting 10000\n",
 362                        rdev->desc->name, ramp_delay);
 363        }
 364
 365        return regmap_update_bits(rdev->regmap, reg,
 366                                  RK808_RAMP_RATE_MASK, ramp_value);
 367}
 368
 369/*
 370 * RK817 RK809
 371 */
 372static int rk817_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
 373{
 374        unsigned int ramp_value = RK817_RAMP_RATE_25MV_PER_US;
 375        unsigned int reg = RK817_BUCK_CONFIG_REG(rdev_get_id(rdev));
 376
 377        switch (ramp_delay) {
 378        case 0 ... 3000:
 379                ramp_value = RK817_RAMP_RATE_3MV_PER_US;
 380                break;
 381        case 3001 ... 6300:
 382                ramp_value = RK817_RAMP_RATE_6_3MV_PER_US;
 383                break;
 384        case 6301 ... 12500:
 385                ramp_value = RK817_RAMP_RATE_12_5MV_PER_US;
 386                break;
 387        case 12501 ... 25000:
 388                break;
 389        default:
 390                dev_warn(&rdev->dev,
 391                         "%s ramp_delay: %d not supported, setting 10000\n",
 392                         rdev->desc->name, ramp_delay);
 393        }
 394
 395        return regmap_update_bits(rdev->regmap, reg,
 396                                  RK817_RAMP_RATE_MASK, ramp_value);
 397}
 398
 399static int rk808_set_suspend_voltage(struct regulator_dev *rdev, int uv)
 400{
 401        unsigned int reg;
 402        int sel = regulator_map_voltage_linear(rdev, uv, uv);
 403
 404        if (sel < 0)
 405                return -EINVAL;
 406
 407        reg = rdev->desc->vsel_reg + RK808_SLP_REG_OFFSET;
 408
 409        return regmap_update_bits(rdev->regmap, reg,
 410                                  rdev->desc->vsel_mask,
 411                                  sel);
 412}
 413
 414static int rk817_set_suspend_voltage(struct regulator_dev *rdev, int uv)
 415{
 416        unsigned int reg;
 417        int sel = regulator_map_voltage_linear(rdev, uv, uv);
 418        /* only ldo1~ldo9 */
 419        if (sel < 0)
 420                return -EINVAL;
 421
 422        reg = rdev->desc->vsel_reg + RK808_SLP_REG_OFFSET;
 423
 424        return regmap_update_bits(rdev->regmap, reg,
 425                                  rdev->desc->vsel_mask,
 426                                  sel);
 427}
 428
 429static int rk808_set_suspend_voltage_range(struct regulator_dev *rdev, int uv)
 430{
 431        unsigned int reg;
 432        int sel = regulator_map_voltage_linear_range(rdev, uv, uv);
 433
 434        if (sel < 0)
 435                return -EINVAL;
 436
 437        reg = rdev->desc->vsel_reg + RK808_SLP_REG_OFFSET;
 438
 439        return regmap_update_bits(rdev->regmap, reg,
 440                                  rdev->desc->vsel_mask,
 441                                  sel);
 442}
 443
 444static int rk805_set_suspend_enable(struct regulator_dev *rdev)
 445{
 446        unsigned int reg;
 447
 448        reg = rdev->desc->enable_reg + RK808_SLP_SET_OFF_REG_OFFSET;
 449
 450        return regmap_update_bits(rdev->regmap, reg,
 451                                  rdev->desc->enable_mask,
 452                                  rdev->desc->enable_mask);
 453}
 454
 455static int rk805_set_suspend_disable(struct regulator_dev *rdev)
 456{
 457        unsigned int reg;
 458
 459        reg = rdev->desc->enable_reg + RK808_SLP_SET_OFF_REG_OFFSET;
 460
 461        return regmap_update_bits(rdev->regmap, reg,
 462                                  rdev->desc->enable_mask,
 463                                  0);
 464}
 465
 466static int rk808_set_suspend_enable(struct regulator_dev *rdev)
 467{
 468        unsigned int reg;
 469
 470        reg = rdev->desc->enable_reg + RK808_SLP_SET_OFF_REG_OFFSET;
 471
 472        return regmap_update_bits(rdev->regmap, reg,
 473                                  rdev->desc->enable_mask,
 474                                  0);
 475}
 476
 477static int rk808_set_suspend_disable(struct regulator_dev *rdev)
 478{
 479        unsigned int reg;
 480
 481        reg = rdev->desc->enable_reg + RK808_SLP_SET_OFF_REG_OFFSET;
 482
 483        return regmap_update_bits(rdev->regmap, reg,
 484                                  rdev->desc->enable_mask,
 485                                  rdev->desc->enable_mask);
 486}
 487
 488static int rk817_set_suspend_enable_ctrl(struct regulator_dev *rdev,
 489                                         unsigned int en)
 490{
 491        unsigned int reg;
 492        int id = rdev_get_id(rdev);
 493        unsigned int id_slp, msk, val;
 494
 495        if (id >= RK817_ID_DCDC1 && id <= RK817_ID_DCDC4)
 496                id_slp = id;
 497        else if (id >= RK817_ID_LDO1 && id <= RK817_ID_LDO8)
 498                id_slp = 8 + (id - RK817_ID_LDO1);
 499        else if (id >= RK817_ID_LDO9 && id <= RK809_ID_SW2)
 500                id_slp = 4 + (id - RK817_ID_LDO9);
 501        else
 502                return -EINVAL;
 503
 504        reg = RK817_POWER_SLP_EN_REG(id_slp / 8);
 505
 506        msk = BIT(id_slp % 8);
 507        if (en)
 508                val = msk;
 509        else
 510                val = 0;
 511
 512        return regmap_update_bits(rdev->regmap, reg, msk, val);
 513}
 514
 515static int rk817_set_suspend_enable(struct regulator_dev *rdev)
 516{
 517        return rk817_set_suspend_enable_ctrl(rdev, 1);
 518}
 519
 520static int rk817_set_suspend_disable(struct regulator_dev *rdev)
 521{
 522        return rk817_set_suspend_enable_ctrl(rdev, 0);
 523}
 524
 525static int rk8xx_set_suspend_mode(struct regulator_dev *rdev, unsigned int mode)
 526{
 527        unsigned int reg;
 528
 529        reg = rdev->desc->vsel_reg + RK808_SLP_REG_OFFSET;
 530
 531        switch (mode) {
 532        case REGULATOR_MODE_FAST:
 533                return regmap_update_bits(rdev->regmap, reg,
 534                                          PWM_MODE_MSK, FPWM_MODE);
 535        case REGULATOR_MODE_NORMAL:
 536                return regmap_update_bits(rdev->regmap, reg,
 537                                          PWM_MODE_MSK, AUTO_PWM_MODE);
 538        default:
 539                dev_err(&rdev->dev, "do not support this mode\n");
 540                return -EINVAL;
 541        }
 542
 543        return 0;
 544}
 545
 546static int rk8xx_set_mode(struct regulator_dev *rdev, unsigned int mode)
 547{
 548        switch (mode) {
 549        case REGULATOR_MODE_FAST:
 550                return regmap_update_bits(rdev->regmap, rdev->desc->vsel_reg,
 551                                          PWM_MODE_MSK, FPWM_MODE);
 552        case REGULATOR_MODE_NORMAL:
 553                return regmap_update_bits(rdev->regmap, rdev->desc->vsel_reg,
 554                                          PWM_MODE_MSK, AUTO_PWM_MODE);
 555        default:
 556                dev_err(&rdev->dev, "do not support this mode\n");
 557                return -EINVAL;
 558        }
 559
 560        return 0;
 561}
 562
 563static unsigned int rk8xx_get_mode(struct regulator_dev *rdev)
 564{
 565        unsigned int val;
 566        int err;
 567
 568        err = regmap_read(rdev->regmap, rdev->desc->vsel_reg, &val);
 569        if (err)
 570                return err;
 571
 572        if (val & FPWM_MODE)
 573                return REGULATOR_MODE_FAST;
 574        else
 575                return REGULATOR_MODE_NORMAL;
 576}
 577
 578static int rk8xx_is_enabled_wmsk_regmap(struct regulator_dev *rdev)
 579{
 580        unsigned int val;
 581        int ret;
 582
 583        ret = regmap_read(rdev->regmap, rdev->desc->enable_reg, &val);
 584        if (ret != 0)
 585                return ret;
 586
 587        /* add write mask bit */
 588        val |= (rdev->desc->enable_mask & 0xf0);
 589        val &= rdev->desc->enable_mask;
 590
 591        if (rdev->desc->enable_is_inverted) {
 592                if (rdev->desc->enable_val)
 593                        return val != rdev->desc->enable_val;
 594                return (val == 0);
 595        }
 596        if (rdev->desc->enable_val)
 597                return val == rdev->desc->enable_val;
 598        return val != 0;
 599}
 600
 601static unsigned int rk8xx_regulator_of_map_mode(unsigned int mode)
 602{
 603        switch (mode) {
 604        case 1:
 605                return REGULATOR_MODE_FAST;
 606        case 2:
 607                return REGULATOR_MODE_NORMAL;
 608        default:
 609                return -EINVAL;
 610        }
 611}
 612
 613static const struct regulator_ops rk805_reg_ops = {
 614        .list_voltage           = regulator_list_voltage_linear,
 615        .map_voltage            = regulator_map_voltage_linear,
 616        .get_voltage_sel        = regulator_get_voltage_sel_regmap,
 617        .set_voltage_sel        = regulator_set_voltage_sel_regmap,
 618        .enable                 = regulator_enable_regmap,
 619        .disable                = regulator_disable_regmap,
 620        .is_enabled             = regulator_is_enabled_regmap,
 621        .set_suspend_voltage    = rk808_set_suspend_voltage,
 622        .set_suspend_enable     = rk805_set_suspend_enable,
 623        .set_suspend_disable    = rk805_set_suspend_disable,
 624};
 625
 626static const struct regulator_ops rk805_switch_ops = {
 627        .enable                 = regulator_enable_regmap,
 628        .disable                = regulator_disable_regmap,
 629        .is_enabled             = regulator_is_enabled_regmap,
 630        .set_suspend_enable     = rk805_set_suspend_enable,
 631        .set_suspend_disable    = rk805_set_suspend_disable,
 632};
 633
 634static const struct regulator_ops rk808_buck1_2_ops = {
 635        .list_voltage           = regulator_list_voltage_linear,
 636        .map_voltage            = regulator_map_voltage_linear,
 637        .get_voltage_sel        = rk808_buck1_2_get_voltage_sel_regmap,
 638        .set_voltage_sel        = rk808_buck1_2_set_voltage_sel,
 639        .set_voltage_time_sel   = rk808_buck1_2_set_voltage_time_sel,
 640        .enable                 = regulator_enable_regmap,
 641        .disable                = regulator_disable_regmap,
 642        .is_enabled             = regulator_is_enabled_regmap,
 643        .set_ramp_delay         = rk808_set_ramp_delay,
 644        .set_suspend_voltage    = rk808_set_suspend_voltage,
 645        .set_suspend_enable     = rk808_set_suspend_enable,
 646        .set_suspend_disable    = rk808_set_suspend_disable,
 647};
 648
 649static const struct regulator_ops rk808_reg_ops = {
 650        .list_voltage           = regulator_list_voltage_linear,
 651        .map_voltage            = regulator_map_voltage_linear,
 652        .get_voltage_sel        = regulator_get_voltage_sel_regmap,
 653        .set_voltage_sel        = regulator_set_voltage_sel_regmap,
 654        .enable                 = regulator_enable_regmap,
 655        .disable                = regulator_disable_regmap,
 656        .is_enabled             = regulator_is_enabled_regmap,
 657        .set_suspend_voltage    = rk808_set_suspend_voltage,
 658        .set_suspend_enable     = rk808_set_suspend_enable,
 659        .set_suspend_disable    = rk808_set_suspend_disable,
 660};
 661
 662static const struct regulator_ops rk808_reg_ops_ranges = {
 663        .list_voltage           = regulator_list_voltage_linear_range,
 664        .map_voltage            = regulator_map_voltage_linear_range,
 665        .get_voltage_sel        = regulator_get_voltage_sel_regmap,
 666        .set_voltage_sel        = regulator_set_voltage_sel_regmap,
 667        .enable                 = regulator_enable_regmap,
 668        .disable                = regulator_disable_regmap,
 669        .is_enabled             = regulator_is_enabled_regmap,
 670        .set_suspend_voltage    = rk808_set_suspend_voltage_range,
 671        .set_suspend_enable     = rk808_set_suspend_enable,
 672        .set_suspend_disable    = rk808_set_suspend_disable,
 673};
 674
 675static const struct regulator_ops rk808_switch_ops = {
 676        .enable                 = regulator_enable_regmap,
 677        .disable                = regulator_disable_regmap,
 678        .is_enabled             = regulator_is_enabled_regmap,
 679        .set_suspend_enable     = rk808_set_suspend_enable,
 680        .set_suspend_disable    = rk808_set_suspend_disable,
 681};
 682
 683static const struct regulator_linear_range rk805_buck_1_2_voltage_ranges[] = {
 684        REGULATOR_LINEAR_RANGE(712500, 0, 59, 12500),
 685        REGULATOR_LINEAR_RANGE(1800000, 60, 62, 200000),
 686        REGULATOR_LINEAR_RANGE(2300000, 63, 63, 0),
 687};
 688
 689static struct regulator_ops rk809_buck5_ops_range = {
 690        .list_voltage           = regulator_list_voltage_linear_range,
 691        .map_voltage            = regulator_map_voltage_linear_range,
 692        .get_voltage_sel        = regulator_get_voltage_sel_regmap,
 693        .set_voltage_sel        = regulator_set_voltage_sel_regmap,
 694        .set_voltage_time_sel   = regulator_set_voltage_time_sel,
 695        .enable                 = regulator_enable_regmap,
 696        .disable                = regulator_disable_regmap,
 697        .is_enabled             = rk8xx_is_enabled_wmsk_regmap,
 698        .set_suspend_voltage    = rk808_set_suspend_voltage_range,
 699        .set_suspend_enable     = rk817_set_suspend_enable,
 700        .set_suspend_disable    = rk817_set_suspend_disable,
 701};
 702
 703static struct regulator_ops rk817_reg_ops = {
 704        .list_voltage           = regulator_list_voltage_linear,
 705        .map_voltage            = regulator_map_voltage_linear,
 706        .get_voltage_sel        = regulator_get_voltage_sel_regmap,
 707        .set_voltage_sel        = regulator_set_voltage_sel_regmap,
 708        .enable                 = regulator_enable_regmap,
 709        .disable                = regulator_disable_regmap,
 710        .is_enabled             = rk8xx_is_enabled_wmsk_regmap,
 711        .set_suspend_voltage    = rk817_set_suspend_voltage,
 712        .set_suspend_enable     = rk817_set_suspend_enable,
 713        .set_suspend_disable    = rk817_set_suspend_disable,
 714};
 715
 716static struct regulator_ops rk817_boost_ops = {
 717        .list_voltage           = regulator_list_voltage_linear,
 718        .map_voltage            = regulator_map_voltage_linear,
 719        .get_voltage_sel        = regulator_get_voltage_sel_regmap,
 720        .set_voltage_sel        = regulator_set_voltage_sel_regmap,
 721        .enable                 = regulator_enable_regmap,
 722        .disable                = regulator_disable_regmap,
 723        .is_enabled             = rk8xx_is_enabled_wmsk_regmap,
 724        .set_suspend_enable     = rk817_set_suspend_enable,
 725        .set_suspend_disable    = rk817_set_suspend_disable,
 726};
 727
 728static struct regulator_ops rk817_buck_ops_range = {
 729        .list_voltage           = regulator_list_voltage_linear_range,
 730        .map_voltage            = regulator_map_voltage_linear_range,
 731        .get_voltage_sel        = regulator_get_voltage_sel_regmap,
 732        .set_voltage_sel        = regulator_set_voltage_sel_regmap,
 733        .set_voltage_time_sel   = regulator_set_voltage_time_sel,
 734        .enable                 = regulator_enable_regmap,
 735        .disable                = regulator_disable_regmap,
 736        .is_enabled             = rk8xx_is_enabled_wmsk_regmap,
 737        .set_mode               = rk8xx_set_mode,
 738        .get_mode               = rk8xx_get_mode,
 739        .set_suspend_mode       = rk8xx_set_suspend_mode,
 740        .set_ramp_delay         = rk817_set_ramp_delay,
 741        .set_suspend_voltage    = rk808_set_suspend_voltage_range,
 742        .set_suspend_enable     = rk817_set_suspend_enable,
 743        .set_suspend_disable    = rk817_set_suspend_disable,
 744};
 745
 746static struct regulator_ops rk817_switch_ops = {
 747        .enable                 = regulator_enable_regmap,
 748        .disable                = regulator_disable_regmap,
 749        .is_enabled             = rk8xx_is_enabled_wmsk_regmap,
 750        .set_suspend_enable     = rk817_set_suspend_enable,
 751        .set_suspend_disable    = rk817_set_suspend_disable,
 752};
 753
 754static const struct regulator_desc rk805_reg[] = {
 755        {
 756                .name = "DCDC_REG1",
 757                .supply_name = "vcc1",
 758                .of_match = of_match_ptr("DCDC_REG1"),
 759                .regulators_node = of_match_ptr("regulators"),
 760                .id = RK805_ID_DCDC1,
 761                .ops = &rk808_reg_ops_ranges,
 762                .type = REGULATOR_VOLTAGE,
 763                .n_voltages = 64,
 764                .linear_ranges = rk805_buck_1_2_voltage_ranges,
 765                .n_linear_ranges = ARRAY_SIZE(rk805_buck_1_2_voltage_ranges),
 766                .vsel_reg = RK805_BUCK1_ON_VSEL_REG,
 767                .vsel_mask = RK818_BUCK_VSEL_MASK,
 768                .enable_reg = RK805_DCDC_EN_REG,
 769                .enable_mask = BIT(0),
 770                .owner = THIS_MODULE,
 771        }, {
 772                .name = "DCDC_REG2",
 773                .supply_name = "vcc2",
 774                .of_match = of_match_ptr("DCDC_REG2"),
 775                .regulators_node = of_match_ptr("regulators"),
 776                .id = RK805_ID_DCDC2,
 777                .ops = &rk808_reg_ops_ranges,
 778                .type = REGULATOR_VOLTAGE,
 779                .n_voltages = 64,
 780                .linear_ranges = rk805_buck_1_2_voltage_ranges,
 781                .n_linear_ranges = ARRAY_SIZE(rk805_buck_1_2_voltage_ranges),
 782                .vsel_reg = RK805_BUCK2_ON_VSEL_REG,
 783                .vsel_mask = RK818_BUCK_VSEL_MASK,
 784                .enable_reg = RK805_DCDC_EN_REG,
 785                .enable_mask = BIT(1),
 786                .owner = THIS_MODULE,
 787        }, {
 788                .name = "DCDC_REG3",
 789                .supply_name = "vcc3",
 790                .of_match = of_match_ptr("DCDC_REG3"),
 791                .regulators_node = of_match_ptr("regulators"),
 792                .id = RK805_ID_DCDC3,
 793                .ops = &rk805_switch_ops,
 794                .type = REGULATOR_VOLTAGE,
 795                .n_voltages = 1,
 796                .enable_reg = RK805_DCDC_EN_REG,
 797                .enable_mask = BIT(2),
 798                .owner = THIS_MODULE,
 799        },
 800
 801        RK805_DESC(RK805_ID_DCDC4, "DCDC_REG4", "vcc4", 800, 3400, 100,
 802                RK805_BUCK4_ON_VSEL_REG, RK818_BUCK4_VSEL_MASK,
 803                RK805_DCDC_EN_REG, BIT(3), 0),
 804
 805        RK805_DESC(RK805_ID_LDO1, "LDO_REG1", "vcc5", 800, 3400, 100,
 806                RK805_LDO1_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK805_LDO_EN_REG,
 807                BIT(0), 400),
 808        RK805_DESC(RK805_ID_LDO2, "LDO_REG2", "vcc5", 800, 3400, 100,
 809                RK805_LDO2_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK805_LDO_EN_REG,
 810                BIT(1), 400),
 811        RK805_DESC(RK805_ID_LDO3, "LDO_REG3", "vcc6", 800, 3400, 100,
 812                RK805_LDO3_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK805_LDO_EN_REG,
 813                BIT(2), 400),
 814};
 815
 816static const struct regulator_desc rk808_reg[] = {
 817        {
 818                .name = "DCDC_REG1",
 819                .supply_name = "vcc1",
 820                .of_match = of_match_ptr("DCDC_REG1"),
 821                .regulators_node = of_match_ptr("regulators"),
 822                .id = RK808_ID_DCDC1,
 823                .ops = &rk808_buck1_2_ops,
 824                .type = REGULATOR_VOLTAGE,
 825                .min_uV = 712500,
 826                .uV_step = 12500,
 827                .n_voltages = 64,
 828                .vsel_reg = RK808_BUCK1_ON_VSEL_REG,
 829                .vsel_mask = RK808_BUCK_VSEL_MASK,
 830                .enable_reg = RK808_DCDC_EN_REG,
 831                .enable_mask = BIT(0),
 832                .owner = THIS_MODULE,
 833        }, {
 834                .name = "DCDC_REG2",
 835                .supply_name = "vcc2",
 836                .of_match = of_match_ptr("DCDC_REG2"),
 837                .regulators_node = of_match_ptr("regulators"),
 838                .id = RK808_ID_DCDC2,
 839                .ops = &rk808_buck1_2_ops,
 840                .type = REGULATOR_VOLTAGE,
 841                .min_uV = 712500,
 842                .uV_step = 12500,
 843                .n_voltages = 64,
 844                .vsel_reg = RK808_BUCK2_ON_VSEL_REG,
 845                .vsel_mask = RK808_BUCK_VSEL_MASK,
 846                .enable_reg = RK808_DCDC_EN_REG,
 847                .enable_mask = BIT(1),
 848                .owner = THIS_MODULE,
 849        }, {
 850                .name = "DCDC_REG3",
 851                .supply_name = "vcc3",
 852                .of_match = of_match_ptr("DCDC_REG3"),
 853                .regulators_node = of_match_ptr("regulators"),
 854                .id = RK808_ID_DCDC3,
 855                .ops = &rk808_switch_ops,
 856                .type = REGULATOR_VOLTAGE,
 857                .n_voltages = 1,
 858                .enable_reg = RK808_DCDC_EN_REG,
 859                .enable_mask = BIT(2),
 860                .owner = THIS_MODULE,
 861        },
 862        RK8XX_DESC(RK808_ID_DCDC4, "DCDC_REG4", "vcc4", 1800, 3300, 100,
 863                RK808_BUCK4_ON_VSEL_REG, RK808_BUCK4_VSEL_MASK,
 864                RK808_DCDC_EN_REG, BIT(3), 0),
 865        RK8XX_DESC(RK808_ID_LDO1, "LDO_REG1", "vcc6", 1800, 3400, 100,
 866                RK808_LDO1_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
 867                BIT(0), 400),
 868        RK8XX_DESC(RK808_ID_LDO2, "LDO_REG2", "vcc6", 1800, 3400, 100,
 869                RK808_LDO2_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
 870                BIT(1), 400),
 871        {
 872                .name = "LDO_REG3",
 873                .supply_name = "vcc7",
 874                .of_match = of_match_ptr("LDO_REG3"),
 875                .regulators_node = of_match_ptr("regulators"),
 876                .id = RK808_ID_LDO3,
 877                .ops = &rk808_reg_ops_ranges,
 878                .type = REGULATOR_VOLTAGE,
 879                .n_voltages = 16,
 880                .linear_ranges = rk808_ldo3_voltage_ranges,
 881                .n_linear_ranges = ARRAY_SIZE(rk808_ldo3_voltage_ranges),
 882                .vsel_reg = RK808_LDO3_ON_VSEL_REG,
 883                .vsel_mask = RK808_BUCK4_VSEL_MASK,
 884                .enable_reg = RK808_LDO_EN_REG,
 885                .enable_mask = BIT(2),
 886                .enable_time = 400,
 887                .owner = THIS_MODULE,
 888        },
 889        RK8XX_DESC(RK808_ID_LDO4, "LDO_REG4", "vcc9", 1800, 3400, 100,
 890                RK808_LDO4_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
 891                BIT(3), 400),
 892        RK8XX_DESC(RK808_ID_LDO5, "LDO_REG5", "vcc9", 1800, 3400, 100,
 893                RK808_LDO5_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
 894                BIT(4), 400),
 895        RK8XX_DESC(RK808_ID_LDO6, "LDO_REG6", "vcc10", 800, 2500, 100,
 896                RK808_LDO6_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
 897                BIT(5), 400),
 898        RK8XX_DESC(RK808_ID_LDO7, "LDO_REG7", "vcc7", 800, 2500, 100,
 899                RK808_LDO7_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
 900                BIT(6), 400),
 901        RK8XX_DESC(RK808_ID_LDO8, "LDO_REG8", "vcc11", 1800, 3400, 100,
 902                RK808_LDO8_ON_VSEL_REG, RK808_LDO_VSEL_MASK, RK808_LDO_EN_REG,
 903                BIT(7), 400),
 904        RK8XX_DESC_SWITCH(RK808_ID_SWITCH1, "SWITCH_REG1", "vcc8",
 905                RK808_DCDC_EN_REG, BIT(5)),
 906        RK8XX_DESC_SWITCH(RK808_ID_SWITCH2, "SWITCH_REG2", "vcc12",
 907                RK808_DCDC_EN_REG, BIT(6)),
 908};
 909
 910static const struct regulator_desc rk809_reg[] = {
 911        {
 912                .name = "DCDC_REG1",
 913                .supply_name = "vcc1",
 914                .of_match = of_match_ptr("DCDC_REG1"),
 915                .regulators_node = of_match_ptr("regulators"),
 916                .id = RK817_ID_DCDC1,
 917                .ops = &rk817_buck_ops_range,
 918                .type = REGULATOR_VOLTAGE,
 919                .n_voltages = RK817_BUCK1_SEL_CNT + 1,
 920                .linear_ranges = rk817_buck1_voltage_ranges,
 921                .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),
 922                .vsel_reg = RK817_BUCK1_ON_VSEL_REG,
 923                .vsel_mask = RK817_BUCK_VSEL_MASK,
 924                .enable_reg = RK817_POWER_EN_REG(0),
 925                .enable_mask = ENABLE_MASK(RK817_ID_DCDC1),
 926                .enable_val = ENABLE_MASK(RK817_ID_DCDC1),
 927                .disable_val = DISABLE_VAL(RK817_ID_DCDC1),
 928                .of_map_mode = rk8xx_regulator_of_map_mode,
 929                .owner = THIS_MODULE,
 930        }, {
 931                .name = "DCDC_REG2",
 932                .supply_name = "vcc2",
 933                .of_match = of_match_ptr("DCDC_REG2"),
 934                .regulators_node = of_match_ptr("regulators"),
 935                .id = RK817_ID_DCDC2,
 936                .ops = &rk817_buck_ops_range,
 937                .type = REGULATOR_VOLTAGE,
 938                .n_voltages = RK817_BUCK1_SEL_CNT + 1,
 939                .linear_ranges = rk817_buck1_voltage_ranges,
 940                .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),
 941                .vsel_reg = RK817_BUCK2_ON_VSEL_REG,
 942                .vsel_mask = RK817_BUCK_VSEL_MASK,
 943                .enable_reg = RK817_POWER_EN_REG(0),
 944                .enable_mask = ENABLE_MASK(RK817_ID_DCDC2),
 945                .enable_val = ENABLE_MASK(RK817_ID_DCDC2),
 946                .disable_val = DISABLE_VAL(RK817_ID_DCDC2),
 947                .of_map_mode = rk8xx_regulator_of_map_mode,
 948                .owner = THIS_MODULE,
 949        }, {
 950                .name = "DCDC_REG3",
 951                .supply_name = "vcc3",
 952                .of_match = of_match_ptr("DCDC_REG3"),
 953                .regulators_node = of_match_ptr("regulators"),
 954                .id = RK817_ID_DCDC3,
 955                .ops = &rk817_buck_ops_range,
 956                .type = REGULATOR_VOLTAGE,
 957                .n_voltages = RK817_BUCK1_SEL_CNT + 1,
 958                .linear_ranges = rk817_buck1_voltage_ranges,
 959                .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),
 960                .vsel_reg = RK817_BUCK3_ON_VSEL_REG,
 961                .vsel_mask = RK817_BUCK_VSEL_MASK,
 962                .enable_reg = RK817_POWER_EN_REG(0),
 963                .enable_mask = ENABLE_MASK(RK817_ID_DCDC3),
 964                .enable_val = ENABLE_MASK(RK817_ID_DCDC3),
 965                .disable_val = DISABLE_VAL(RK817_ID_DCDC3),
 966                .of_map_mode = rk8xx_regulator_of_map_mode,
 967                .owner = THIS_MODULE,
 968        }, {
 969                .name = "DCDC_REG4",
 970                .supply_name = "vcc4",
 971                .of_match = of_match_ptr("DCDC_REG4"),
 972                .regulators_node = of_match_ptr("regulators"),
 973                .id = RK817_ID_DCDC4,
 974                .ops = &rk817_buck_ops_range,
 975                .type = REGULATOR_VOLTAGE,
 976                .n_voltages = RK817_BUCK3_SEL_CNT + 1,
 977                .linear_ranges = rk817_buck3_voltage_ranges,
 978                .n_linear_ranges = ARRAY_SIZE(rk817_buck3_voltage_ranges),
 979                .vsel_reg = RK817_BUCK4_ON_VSEL_REG,
 980                .vsel_mask = RK817_BUCK_VSEL_MASK,
 981                .enable_reg = RK817_POWER_EN_REG(0),
 982                .enable_mask = ENABLE_MASK(RK817_ID_DCDC4),
 983                .enable_val = ENABLE_MASK(RK817_ID_DCDC4),
 984                .disable_val = DISABLE_VAL(RK817_ID_DCDC4),
 985                .of_map_mode = rk8xx_regulator_of_map_mode,
 986                .owner = THIS_MODULE,
 987        },
 988        {
 989                .name = "DCDC_REG5",
 990                .supply_name = "vcc9",
 991                .of_match = of_match_ptr("DCDC_REG5"),
 992                .regulators_node = of_match_ptr("regulators"),
 993                .id = RK809_ID_DCDC5,
 994                .ops = &rk809_buck5_ops_range,
 995                .type = REGULATOR_VOLTAGE,
 996                .n_voltages = RK809_BUCK5_SEL_CNT,
 997                .linear_ranges = rk809_buck5_voltage_ranges,
 998                .n_linear_ranges = ARRAY_SIZE(rk809_buck5_voltage_ranges),
 999                .vsel_reg = RK809_BUCK5_CONFIG(0),
1000                .vsel_mask = RK809_BUCK5_VSEL_MASK,
1001                .enable_reg = RK817_POWER_EN_REG(3),
1002                .enable_mask = ENABLE_MASK(1),
1003                .enable_val = ENABLE_MASK(1),
1004                .disable_val = DISABLE_VAL(1),
1005                .of_map_mode = rk8xx_regulator_of_map_mode,
1006                .owner = THIS_MODULE,
1007        },
1008        RK817_DESC(RK817_ID_LDO1, "LDO_REG1", "vcc5", 600, 3400, 25,
1009                   RK817_LDO_ON_VSEL_REG(0), RK817_LDO_VSEL_MASK,
1010                   RK817_POWER_EN_REG(1), ENABLE_MASK(0),
1011                   DISABLE_VAL(0), 400),
1012        RK817_DESC(RK817_ID_LDO2, "LDO_REG2", "vcc5", 600, 3400, 25,
1013                   RK817_LDO_ON_VSEL_REG(1), RK817_LDO_VSEL_MASK,
1014                   RK817_POWER_EN_REG(1), ENABLE_MASK(1),
1015                   DISABLE_VAL(1), 400),
1016        RK817_DESC(RK817_ID_LDO3, "LDO_REG3", "vcc5", 600, 3400, 25,
1017                   RK817_LDO_ON_VSEL_REG(2), RK817_LDO_VSEL_MASK,
1018                   RK817_POWER_EN_REG(1), ENABLE_MASK(2),
1019                   DISABLE_VAL(2), 400),
1020        RK817_DESC(RK817_ID_LDO4, "LDO_REG4", "vcc6", 600, 3400, 25,
1021                   RK817_LDO_ON_VSEL_REG(3), RK817_LDO_VSEL_MASK,
1022                   RK817_POWER_EN_REG(1), ENABLE_MASK(3),
1023                   DISABLE_VAL(3), 400),
1024        RK817_DESC(RK817_ID_LDO5, "LDO_REG5", "vcc6", 600, 3400, 25,
1025                   RK817_LDO_ON_VSEL_REG(4), RK817_LDO_VSEL_MASK,
1026                   RK817_POWER_EN_REG(2), ENABLE_MASK(0),
1027                   DISABLE_VAL(0), 400),
1028        RK817_DESC(RK817_ID_LDO6, "LDO_REG6", "vcc6", 600, 3400, 25,
1029                   RK817_LDO_ON_VSEL_REG(5), RK817_LDO_VSEL_MASK,
1030                   RK817_POWER_EN_REG(2), ENABLE_MASK(1),
1031                   DISABLE_VAL(1), 400),
1032        RK817_DESC(RK817_ID_LDO7, "LDO_REG7", "vcc7", 600, 3400, 25,
1033                   RK817_LDO_ON_VSEL_REG(6), RK817_LDO_VSEL_MASK,
1034                   RK817_POWER_EN_REG(2), ENABLE_MASK(2),
1035                   DISABLE_VAL(2), 400),
1036        RK817_DESC(RK817_ID_LDO8, "LDO_REG8", "vcc7", 600, 3400, 25,
1037                   RK817_LDO_ON_VSEL_REG(7), RK817_LDO_VSEL_MASK,
1038                   RK817_POWER_EN_REG(2), ENABLE_MASK(3),
1039                   DISABLE_VAL(3), 400),
1040        RK817_DESC(RK817_ID_LDO9, "LDO_REG9", "vcc7", 600, 3400, 25,
1041                   RK817_LDO_ON_VSEL_REG(8), RK817_LDO_VSEL_MASK,
1042                   RK817_POWER_EN_REG(3), ENABLE_MASK(0),
1043                   DISABLE_VAL(0), 400),
1044        RK817_DESC_SWITCH(RK809_ID_SW1, "SWITCH_REG1", "vcc9",
1045                          RK817_POWER_EN_REG(3), ENABLE_MASK(2),
1046                          DISABLE_VAL(2)),
1047        RK817_DESC_SWITCH(RK809_ID_SW2, "SWITCH_REG2", "vcc8",
1048                          RK817_POWER_EN_REG(3), ENABLE_MASK(3),
1049                          DISABLE_VAL(3)),
1050};
1051
1052static const struct regulator_desc rk817_reg[] = {
1053        {
1054                .name = "DCDC_REG1",
1055                .supply_name = "vcc1",
1056                .of_match = of_match_ptr("DCDC_REG1"),
1057                .regulators_node = of_match_ptr("regulators"),
1058                .id = RK817_ID_DCDC1,
1059                .ops = &rk817_buck_ops_range,
1060                .type = REGULATOR_VOLTAGE,
1061                .n_voltages = RK817_BUCK1_SEL_CNT + 1,
1062                .linear_ranges = rk817_buck1_voltage_ranges,
1063                .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),
1064                .vsel_reg = RK817_BUCK1_ON_VSEL_REG,
1065                .vsel_mask = RK817_BUCK_VSEL_MASK,
1066                .enable_reg = RK817_POWER_EN_REG(0),
1067                .enable_mask = ENABLE_MASK(RK817_ID_DCDC1),
1068                .enable_val = ENABLE_MASK(RK817_ID_DCDC1),
1069                .disable_val = DISABLE_VAL(RK817_ID_DCDC1),
1070                .of_map_mode = rk8xx_regulator_of_map_mode,
1071                .owner = THIS_MODULE,
1072        }, {
1073                .name = "DCDC_REG2",
1074                .supply_name = "vcc2",
1075                .of_match = of_match_ptr("DCDC_REG2"),
1076                .regulators_node = of_match_ptr("regulators"),
1077                .id = RK817_ID_DCDC2,
1078                .ops = &rk817_buck_ops_range,
1079                .type = REGULATOR_VOLTAGE,
1080                .n_voltages = RK817_BUCK1_SEL_CNT + 1,
1081                .linear_ranges = rk817_buck1_voltage_ranges,
1082                .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),
1083                .vsel_reg = RK817_BUCK2_ON_VSEL_REG,
1084                .vsel_mask = RK817_BUCK_VSEL_MASK,
1085                .enable_reg = RK817_POWER_EN_REG(0),
1086                .enable_mask = ENABLE_MASK(RK817_ID_DCDC2),
1087                .enable_val = ENABLE_MASK(RK817_ID_DCDC2),
1088                .disable_val = DISABLE_VAL(RK817_ID_DCDC2),
1089                .of_map_mode = rk8xx_regulator_of_map_mode,
1090                .owner = THIS_MODULE,
1091        }, {
1092                .name = "DCDC_REG3",
1093                .supply_name = "vcc3",
1094                .of_match = of_match_ptr("DCDC_REG3"),
1095                .regulators_node = of_match_ptr("regulators"),
1096                .id = RK817_ID_DCDC3,
1097                .ops = &rk817_buck_ops_range,
1098                .type = REGULATOR_VOLTAGE,
1099                .n_voltages = RK817_BUCK1_SEL_CNT + 1,
1100                .linear_ranges = rk817_buck1_voltage_ranges,
1101                .n_linear_ranges = ARRAY_SIZE(rk817_buck1_voltage_ranges),
1102                .vsel_reg = RK817_BUCK3_ON_VSEL_REG,
1103                .vsel_mask = RK817_BUCK_VSEL_MASK,
1104                .enable_reg = RK817_POWER_EN_REG(0),
1105                .enable_mask = ENABLE_MASK(RK817_ID_DCDC3),
1106                .enable_val = ENABLE_MASK(RK817_ID_DCDC3),
1107                .disable_val = DISABLE_VAL(RK817_ID_DCDC3),
1108                .of_map_mode = rk8xx_regulator_of_map_mode,
1109                .owner = THIS_MODULE,
1110        }, {
1111                .name = "DCDC_REG4",
1112                .supply_name = "vcc4",
1113                .of_match = of_match_ptr("DCDC_REG4"),
1114                .regulators_node = of_match_ptr("regulators"),
1115                .id = RK817_ID_DCDC4,
1116                .ops = &rk817_buck_ops_range,
1117                .type = REGULATOR_VOLTAGE,
1118                .n_voltages = RK817_BUCK3_SEL_CNT + 1,
1119                .linear_ranges = rk817_buck3_voltage_ranges,
1120                .n_linear_ranges = ARRAY_SIZE(rk817_buck3_voltage_ranges),
1121                .vsel_reg = RK817_BUCK4_ON_VSEL_REG,
1122                .vsel_mask = RK817_BUCK_VSEL_MASK,
1123                .enable_reg = RK817_POWER_EN_REG(0),
1124                .enable_mask = ENABLE_MASK(RK817_ID_DCDC4),
1125                .enable_val = ENABLE_MASK(RK817_ID_DCDC4),
1126                .disable_val = DISABLE_VAL(RK817_ID_DCDC4),
1127                .of_map_mode = rk8xx_regulator_of_map_mode,
1128                .owner = THIS_MODULE,
1129        },
1130        RK817_DESC(RK817_ID_LDO1, "LDO_REG1", "vcc5", 600, 3400, 25,
1131                   RK817_LDO_ON_VSEL_REG(0), RK817_LDO_VSEL_MASK,
1132                   RK817_POWER_EN_REG(1), ENABLE_MASK(0),
1133                   DISABLE_VAL(0), 400),
1134        RK817_DESC(RK817_ID_LDO2, "LDO_REG2", "vcc5", 600, 3400, 25,
1135                   RK817_LDO_ON_VSEL_REG(1), RK817_LDO_VSEL_MASK,
1136                   RK817_POWER_EN_REG(1), ENABLE_MASK(1),
1137                   DISABLE_VAL(1), 400),
1138        RK817_DESC(RK817_ID_LDO3, "LDO_REG3", "vcc5", 600, 3400, 25,
1139                   RK817_LDO_ON_VSEL_REG(2), RK817_LDO_VSEL_MASK,
1140                   RK817_POWER_EN_REG(1), ENABLE_MASK(2),
1141                   DISABLE_VAL(2), 400),
1142        RK817_DESC(RK817_ID_LDO4, "LDO_REG4", "vcc6", 600, 3400, 25,
1143                   RK817_LDO_ON_VSEL_REG(3), RK817_LDO_VSEL_MASK,
1144                   RK817_POWER_EN_REG(1), ENABLE_MASK(3),
1145                   DISABLE_VAL(3), 400),
1146        RK817_DESC(RK817_ID_LDO5, "LDO_REG5", "vcc6", 600, 3400, 25,
1147                   RK817_LDO_ON_VSEL_REG(4), RK817_LDO_VSEL_MASK,
1148                   RK817_POWER_EN_REG(2), ENABLE_MASK(0),
1149                   DISABLE_VAL(0), 400),
1150        RK817_DESC(RK817_ID_LDO6, "LDO_REG6", "vcc6", 600, 3400, 25,
1151                   RK817_LDO_ON_VSEL_REG(5), RK817_LDO_VSEL_MASK,
1152                   RK817_POWER_EN_REG(2), ENABLE_MASK(1),
1153                   DISABLE_VAL(1), 400),
1154        RK817_DESC(RK817_ID_LDO7, "LDO_REG7", "vcc7", 600, 3400, 25,
1155                   RK817_LDO_ON_VSEL_REG(6), RK817_LDO_VSEL_MASK,
1156                   RK817_POWER_EN_REG(2), ENABLE_MASK(2),
1157                   DISABLE_VAL(2), 400),
1158        RK817_DESC(RK817_ID_LDO8, "LDO_REG8", "vcc7", 600, 3400, 25,
1159                   RK817_LDO_ON_VSEL_REG(7), RK817_LDO_VSEL_MASK,
1160                   RK817_POWER_EN_REG(2), ENABLE_MASK(3),
1161                   DISABLE_VAL(3), 400),
1162        RK817_DESC(RK817_ID_LDO9, "LDO_REG9", "vcc7", 600, 3400, 25,
1163                   RK817_LDO_ON_VSEL_REG(8), RK817_LDO_VSEL_MASK,
1164                   RK817_POWER_EN_REG(3), ENABLE_MASK(0),
1165                   DISABLE_VAL(0), 400),
1166        RK817_BOOST_DESC(RK817_ID_BOOST, "BOOST", "vcc8", 4700, 5400, 100,
1167                         RK817_BOOST_OTG_CFG, RK817_BOOST_VSEL_MASK,
1168                         RK817_POWER_EN_REG(3), ENABLE_MASK(1), ENABLE_MASK(1),
1169                   DISABLE_VAL(1), 400, 3500 - 5400),
1170        RK817_DESC_SWITCH(RK817_ID_BOOST_OTG_SW, "OTG_SWITCH", "vcc9",
1171                          RK817_POWER_EN_REG(3), ENABLE_MASK(2),
1172                          DISABLE_VAL(2)),
1173};
1174
1175static const struct regulator_desc rk818_reg[] = {
1176        {
1177                .name = "DCDC_REG1",
1178                .supply_name = "vcc1",
1179                .of_match = of_match_ptr("DCDC_REG1"),
1180                .regulators_node = of_match_ptr("regulators"),
1181                .id = RK818_ID_DCDC1,
1182                .ops = &rk808_reg_ops,
1183                .type = REGULATOR_VOLTAGE,
1184                .min_uV = 712500,
1185                .uV_step = 12500,
1186                .n_voltages = 64,
1187                .vsel_reg = RK818_BUCK1_ON_VSEL_REG,
1188                .vsel_mask = RK818_BUCK_VSEL_MASK,
1189                .enable_reg = RK818_DCDC_EN_REG,
1190                .enable_mask = BIT(0),
1191                .owner = THIS_MODULE,
1192        }, {
1193                .name = "DCDC_REG2",
1194                .supply_name = "vcc2",
1195                .of_match = of_match_ptr("DCDC_REG2"),
1196                .regulators_node = of_match_ptr("regulators"),
1197                .id = RK818_ID_DCDC2,
1198                .ops = &rk808_reg_ops,
1199                .type = REGULATOR_VOLTAGE,
1200                .min_uV = 712500,
1201                .uV_step = 12500,
1202                .n_voltages = 64,
1203                .vsel_reg = RK818_BUCK2_ON_VSEL_REG,
1204                .vsel_mask = RK818_BUCK_VSEL_MASK,
1205                .enable_reg = RK818_DCDC_EN_REG,
1206                .enable_mask = BIT(1),
1207                .owner = THIS_MODULE,
1208        }, {
1209                .name = "DCDC_REG3",
1210                .supply_name = "vcc3",
1211                .of_match = of_match_ptr("DCDC_REG3"),
1212                .regulators_node = of_match_ptr("regulators"),
1213                .id = RK818_ID_DCDC3,
1214                .ops = &rk808_switch_ops,
1215                .type = REGULATOR_VOLTAGE,
1216                .n_voltages = 1,
1217                .enable_reg = RK818_DCDC_EN_REG,
1218                .enable_mask = BIT(2),
1219                .owner = THIS_MODULE,
1220        },
1221        RK8XX_DESC(RK818_ID_DCDC4, "DCDC_REG4", "vcc4", 1800, 3600, 100,
1222                RK818_BUCK4_ON_VSEL_REG, RK818_BUCK4_VSEL_MASK,
1223                RK818_DCDC_EN_REG, BIT(3), 0),
1224        RK8XX_DESC(RK818_ID_BOOST, "DCDC_BOOST", "boost", 4700, 5400, 100,
1225                RK818_BOOST_LDO9_ON_VSEL_REG, RK818_BOOST_ON_VSEL_MASK,
1226                RK818_DCDC_EN_REG, BIT(4), 0),
1227        RK8XX_DESC(RK818_ID_LDO1, "LDO_REG1", "vcc6", 1800, 3400, 100,
1228                RK818_LDO1_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
1229                BIT(0), 400),
1230        RK8XX_DESC(RK818_ID_LDO2, "LDO_REG2", "vcc6", 1800, 3400, 100,
1231                RK818_LDO2_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
1232                BIT(1), 400),
1233        {
1234                .name = "LDO_REG3",
1235                .supply_name = "vcc7",
1236                .of_match = of_match_ptr("LDO_REG3"),
1237                .regulators_node = of_match_ptr("regulators"),
1238                .id = RK818_ID_LDO3,
1239                .ops = &rk808_reg_ops_ranges,
1240                .type = REGULATOR_VOLTAGE,
1241                .n_voltages = 16,
1242                .linear_ranges = rk808_ldo3_voltage_ranges,
1243                .n_linear_ranges = ARRAY_SIZE(rk808_ldo3_voltage_ranges),
1244                .vsel_reg = RK818_LDO3_ON_VSEL_REG,
1245                .vsel_mask = RK818_LDO3_ON_VSEL_MASK,
1246                .enable_reg = RK818_LDO_EN_REG,
1247                .enable_mask = BIT(2),
1248                .enable_time = 400,
1249                .owner = THIS_MODULE,
1250        },
1251        RK8XX_DESC(RK818_ID_LDO4, "LDO_REG4", "vcc8", 1800, 3400, 100,
1252                RK818_LDO4_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
1253                BIT(3), 400),
1254        RK8XX_DESC(RK818_ID_LDO5, "LDO_REG5", "vcc7", 1800, 3400, 100,
1255                RK818_LDO5_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
1256                BIT(4), 400),
1257        RK8XX_DESC(RK818_ID_LDO6, "LDO_REG6", "vcc8", 800, 2500, 100,
1258                RK818_LDO6_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
1259                BIT(5), 400),
1260        RK8XX_DESC(RK818_ID_LDO7, "LDO_REG7", "vcc7", 800, 2500, 100,
1261                RK818_LDO7_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
1262                BIT(6), 400),
1263        RK8XX_DESC(RK818_ID_LDO8, "LDO_REG8", "vcc8", 1800, 3400, 100,
1264                RK818_LDO8_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG,
1265                BIT(7), 400),
1266        RK8XX_DESC(RK818_ID_LDO9, "LDO_REG9", "vcc9", 1800, 3400, 100,
1267                RK818_BOOST_LDO9_ON_VSEL_REG, RK818_LDO_VSEL_MASK,
1268                RK818_DCDC_EN_REG, BIT(5), 400),
1269        RK8XX_DESC_SWITCH(RK818_ID_SWITCH, "SWITCH_REG", "vcc9",
1270                RK818_DCDC_EN_REG, BIT(6)),
1271        RK8XX_DESC_SWITCH(RK818_ID_HDMI_SWITCH, "HDMI_SWITCH", "h_5v",
1272                RK818_H5V_EN_REG, BIT(0)),
1273        RK8XX_DESC_SWITCH(RK818_ID_OTG_SWITCH, "OTG_SWITCH", "usb",
1274                RK818_DCDC_EN_REG, BIT(7)),
1275};
1276
1277static int rk808_regulator_dt_parse_pdata(struct device *dev,
1278                                   struct device *client_dev,
1279                                   struct regmap *map,
1280                                   struct rk808_regulator_data *pdata)
1281{
1282        struct device_node *np;
1283        int tmp, ret = 0, i;
1284
1285        np = of_get_child_by_name(client_dev->of_node, "regulators");
1286        if (!np)
1287                return -ENXIO;
1288
1289        for (i = 0; i < ARRAY_SIZE(pdata->dvs_gpio); i++) {
1290                pdata->dvs_gpio[i] =
1291                        devm_gpiod_get_index_optional(client_dev, "dvs", i,
1292                                                      GPIOD_OUT_LOW);
1293                if (IS_ERR(pdata->dvs_gpio[i])) {
1294                        ret = PTR_ERR(pdata->dvs_gpio[i]);
1295                        dev_err(dev, "failed to get dvs%d gpio (%d)\n", i, ret);
1296                        goto dt_parse_end;
1297                }
1298
1299                if (!pdata->dvs_gpio[i]) {
1300                        dev_warn(dev, "there is no dvs%d gpio\n", i);
1301                        continue;
1302                }
1303
1304                tmp = i ? RK808_DVS2_POL : RK808_DVS1_POL;
1305                ret = regmap_update_bits(map, RK808_IO_POL_REG, tmp,
1306                                gpiod_is_active_low(pdata->dvs_gpio[i]) ?
1307                                0 : tmp);
1308        }
1309
1310dt_parse_end:
1311        of_node_put(np);
1312        return ret;
1313}
1314
1315static int rk808_regulator_probe(struct platform_device *pdev)
1316{
1317        struct rk808 *rk808 = dev_get_drvdata(pdev->dev.parent);
1318        struct i2c_client *client = rk808->i2c;
1319        struct regulator_config config = {};
1320        struct regulator_dev *rk808_rdev;
1321        struct rk808_regulator_data *pdata;
1322        const struct regulator_desc *regulators;
1323        int ret, i, nregulators;
1324
1325        pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
1326        if (!pdata)
1327                return -ENOMEM;
1328
1329        ret = rk808_regulator_dt_parse_pdata(&pdev->dev, &client->dev,
1330                                             rk808->regmap, pdata);
1331        if (ret < 0)
1332                return ret;
1333
1334        platform_set_drvdata(pdev, pdata);
1335
1336        switch (rk808->variant) {
1337        case RK805_ID:
1338                regulators = rk805_reg;
1339                nregulators = RK805_NUM_REGULATORS;
1340                break;
1341        case RK808_ID:
1342                regulators = rk808_reg;
1343                nregulators = RK808_NUM_REGULATORS;
1344                break;
1345        case RK809_ID:
1346                regulators = rk809_reg;
1347                nregulators = RK809_NUM_REGULATORS;
1348                break;
1349        case RK817_ID:
1350                regulators = rk817_reg;
1351                nregulators = RK817_NUM_REGULATORS;
1352                break;
1353        case RK818_ID:
1354                regulators = rk818_reg;
1355                nregulators = RK818_NUM_REGULATORS;
1356                break;
1357        default:
1358                dev_err(&client->dev, "unsupported RK8XX ID %lu\n",
1359                        rk808->variant);
1360                return -EINVAL;
1361        }
1362
1363        config.dev = &client->dev;
1364        config.driver_data = pdata;
1365        config.regmap = rk808->regmap;
1366
1367        /* Instantiate the regulators */
1368        for (i = 0; i < nregulators; i++) {
1369                rk808_rdev = devm_regulator_register(&pdev->dev,
1370                                                     &regulators[i], &config);
1371                if (IS_ERR(rk808_rdev)) {
1372                        dev_err(&client->dev,
1373                                "failed to register %d regulator\n", i);
1374                        return PTR_ERR(rk808_rdev);
1375                }
1376        }
1377
1378        return 0;
1379}
1380
1381static struct platform_driver rk808_regulator_driver = {
1382        .probe = rk808_regulator_probe,
1383        .driver = {
1384                .name = "rk808-regulator"
1385        },
1386};
1387
1388module_platform_driver(rk808_regulator_driver);
1389
1390MODULE_DESCRIPTION("regulator driver for the RK805/RK808/RK818 series PMICs");
1391MODULE_AUTHOR("Tony xie <tony.xie@rock-chips.com>");
1392MODULE_AUTHOR("Chris Zhong <zyw@rock-chips.com>");
1393MODULE_AUTHOR("Zhang Qing <zhangqing@rock-chips.com>");
1394MODULE_AUTHOR("Wadim Egorov <w.egorov@phytec.de>");
1395MODULE_LICENSE("GPL");
1396MODULE_ALIAS("platform:rk808-regulator");
1397