root/drivers/regulator/rk808-regulator.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. rk808_buck1_2_get_voltage_sel_regmap
  2. rk808_buck1_2_i2c_set_voltage_sel
  3. rk808_buck1_2_set_voltage_sel
  4. rk808_buck1_2_set_voltage_time_sel
  5. rk808_set_ramp_delay
  6. rk817_set_ramp_delay
  7. rk808_set_suspend_voltage
  8. rk817_set_suspend_voltage
  9. rk808_set_suspend_voltage_range
  10. rk805_set_suspend_enable
  11. rk805_set_suspend_disable
  12. rk808_set_suspend_enable
  13. rk808_set_suspend_disable
  14. rk817_set_suspend_enable_ctrl
  15. rk817_set_suspend_enable
  16. rk817_set_suspend_disable
  17. rk8xx_set_suspend_mode
  18. rk8xx_set_mode
  19. rk8xx_get_mode
  20. rk8xx_is_enabled_wmsk_regmap
  21. rk8xx_regulator_of_map_mode
  22. rk808_regulator_dt_parse_pdata
  23. rk808_regulator_probe

   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 
 157 struct rk808_regulator_data {
 158         struct gpio_desc *dvs_gpio[2];
 159 };
 160 
 161 static 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 
 168 static 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 
 175 static 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 
 204 static 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 
 211 static 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 
 218 static 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 
 241 static 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 
 290 static 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 
 328 static 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 
 343 static 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  */
 372 static 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 
 399 static 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 
 414 static 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 
 429 static 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 
 444 static 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 
 455 static 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 
 466 static 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 
 477 static 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 
 488 static 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 
 515 static int rk817_set_suspend_enable(struct regulator_dev *rdev)
 516 {
 517         return rk817_set_suspend_enable_ctrl(rdev, 1);
 518 }
 519 
 520 static int rk817_set_suspend_disable(struct regulator_dev *rdev)
 521 {
 522         return rk817_set_suspend_enable_ctrl(rdev, 0);
 523 }
 524 
 525 static 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 
 546 static 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 
 563 static 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 
 578 static 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 
 601 static 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 REGULATOR_MODE_INVALID;
 610         }
 611 }
 612 
 613 static 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 
 626 static 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 
 634 static 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 
 649 static 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 
 662 static 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 
 675 static 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 
 683 static 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 
 689 static 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 
 703 static 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 
 716 static 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 
 728 static 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 
 746 static 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 
 754 static 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 
 816 static 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 
 910 static 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 
1052 static 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 
1175 static 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 
1277 static 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_info(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 
1310 dt_parse_end:
1311         of_node_put(np);
1312         return ret;
1313 }
1314 
1315 static 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 
1381 static struct platform_driver rk808_regulator_driver = {
1382         .probe = rk808_regulator_probe,
1383         .driver = {
1384                 .name = "rk808-regulator"
1385         },
1386 };
1387 
1388 module_platform_driver(rk808_regulator_driver);
1389 
1390 MODULE_DESCRIPTION("regulator driver for the RK805/RK808/RK818 series PMICs");
1391 MODULE_AUTHOR("Tony xie <tony.xie@rock-chips.com>");
1392 MODULE_AUTHOR("Chris Zhong <zyw@rock-chips.com>");
1393 MODULE_AUTHOR("Zhang Qing <zhangqing@rock-chips.com>");
1394 MODULE_AUTHOR("Wadim Egorov <w.egorov@phytec.de>");
1395 MODULE_LICENSE("GPL");
1396 MODULE_ALIAS("platform:rk808-regulator");

/* [<][>][^][v][top][bottom][index][help] */