linux/drivers/regulator/s2mps11.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2//
   3// Copyright (c) 2012-2014 Samsung Electronics Co., Ltd
   4//              http://www.samsung.com
   5
   6#include <linux/bug.h>
   7#include <linux/err.h>
   8#include <linux/gpio/consumer.h>
   9#include <linux/slab.h>
  10#include <linux/module.h>
  11#include <linux/of.h>
  12#include <linux/regmap.h>
  13#include <linux/platform_device.h>
  14#include <linux/regulator/driver.h>
  15#include <linux/regulator/machine.h>
  16#include <linux/regulator/of_regulator.h>
  17#include <linux/mfd/samsung/core.h>
  18#include <linux/mfd/samsung/s2mps11.h>
  19#include <linux/mfd/samsung/s2mps13.h>
  20#include <linux/mfd/samsung/s2mps14.h>
  21#include <linux/mfd/samsung/s2mps15.h>
  22#include <linux/mfd/samsung/s2mpu02.h>
  23
  24/* The highest number of possible regulators for supported devices. */
  25#define S2MPS_REGULATOR_MAX             S2MPS13_REGULATOR_MAX
  26struct s2mps11_info {
  27        int ramp_delay2;
  28        int ramp_delay34;
  29        int ramp_delay5;
  30        int ramp_delay16;
  31        int ramp_delay7810;
  32        int ramp_delay9;
  33
  34        enum sec_device_type dev_type;
  35
  36        /*
  37         * One bit for each S2MPS11/S2MPS13/S2MPS14/S2MPU02 regulator whether
  38         * the suspend mode was enabled.
  39         */
  40        DECLARE_BITMAP(suspend_state, S2MPS_REGULATOR_MAX);
  41
  42        /*
  43         * Array (size: number of regulators) with GPIO-s for external
  44         * sleep control.
  45         */
  46        struct gpio_desc **ext_control_gpiod;
  47};
  48
  49static int get_ramp_delay(int ramp_delay)
  50{
  51        unsigned char cnt = 0;
  52
  53        ramp_delay /= 6250;
  54
  55        while (true) {
  56                ramp_delay = ramp_delay >> 1;
  57                if (ramp_delay == 0)
  58                        break;
  59                cnt++;
  60        }
  61
  62        if (cnt > 3)
  63                cnt = 3;
  64
  65        return cnt;
  66}
  67
  68static int s2mps11_regulator_set_voltage_time_sel(struct regulator_dev *rdev,
  69                                   unsigned int old_selector,
  70                                   unsigned int new_selector)
  71{
  72        struct s2mps11_info *s2mps11 = rdev_get_drvdata(rdev);
  73        int rdev_id = rdev_get_id(rdev);
  74        unsigned int ramp_delay = 0;
  75        int old_volt, new_volt;
  76
  77        switch (rdev_id) {
  78        case S2MPS11_BUCK2:
  79                ramp_delay = s2mps11->ramp_delay2;
  80                break;
  81        case S2MPS11_BUCK3:
  82        case S2MPS11_BUCK4:
  83                ramp_delay = s2mps11->ramp_delay34;
  84                break;
  85        case S2MPS11_BUCK5:
  86                ramp_delay = s2mps11->ramp_delay5;
  87                break;
  88        case S2MPS11_BUCK6:
  89        case S2MPS11_BUCK1:
  90                ramp_delay = s2mps11->ramp_delay16;
  91                break;
  92        case S2MPS11_BUCK7:
  93        case S2MPS11_BUCK8:
  94        case S2MPS11_BUCK10:
  95                ramp_delay = s2mps11->ramp_delay7810;
  96                break;
  97        case S2MPS11_BUCK9:
  98                ramp_delay = s2mps11->ramp_delay9;
  99        }
 100
 101        if (ramp_delay == 0)
 102                ramp_delay = rdev->desc->ramp_delay;
 103
 104        old_volt = rdev->desc->min_uV + (rdev->desc->uV_step * old_selector);
 105        new_volt = rdev->desc->min_uV + (rdev->desc->uV_step * new_selector);
 106
 107        return DIV_ROUND_UP(abs(new_volt - old_volt), ramp_delay);
 108}
 109
 110static int s2mps11_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
 111{
 112        struct s2mps11_info *s2mps11 = rdev_get_drvdata(rdev);
 113        unsigned int ramp_val, ramp_shift, ramp_reg = S2MPS11_REG_RAMP_BUCK;
 114        unsigned int ramp_enable = 1, enable_shift = 0;
 115        int rdev_id = rdev_get_id(rdev);
 116        int ret;
 117
 118        switch (rdev_id) {
 119        case S2MPS11_BUCK1:
 120                if (ramp_delay > s2mps11->ramp_delay16)
 121                        s2mps11->ramp_delay16 = ramp_delay;
 122                else
 123                        ramp_delay = s2mps11->ramp_delay16;
 124
 125                ramp_shift = S2MPS11_BUCK16_RAMP_SHIFT;
 126                break;
 127        case S2MPS11_BUCK2:
 128                enable_shift = S2MPS11_BUCK2_RAMP_EN_SHIFT;
 129                if (!ramp_delay) {
 130                        ramp_enable = 0;
 131                        break;
 132                }
 133
 134                s2mps11->ramp_delay2 = ramp_delay;
 135                ramp_shift = S2MPS11_BUCK2_RAMP_SHIFT;
 136                ramp_reg = S2MPS11_REG_RAMP;
 137                break;
 138        case S2MPS11_BUCK3:
 139                enable_shift = S2MPS11_BUCK3_RAMP_EN_SHIFT;
 140                if (!ramp_delay) {
 141                        ramp_enable = 0;
 142                        break;
 143                }
 144
 145                if (ramp_delay > s2mps11->ramp_delay34)
 146                        s2mps11->ramp_delay34 = ramp_delay;
 147                else
 148                        ramp_delay = s2mps11->ramp_delay34;
 149
 150                ramp_shift = S2MPS11_BUCK34_RAMP_SHIFT;
 151                ramp_reg = S2MPS11_REG_RAMP;
 152                break;
 153        case S2MPS11_BUCK4:
 154                enable_shift = S2MPS11_BUCK4_RAMP_EN_SHIFT;
 155                if (!ramp_delay) {
 156                        ramp_enable = 0;
 157                        break;
 158                }
 159
 160                if (ramp_delay > s2mps11->ramp_delay34)
 161                        s2mps11->ramp_delay34 = ramp_delay;
 162                else
 163                        ramp_delay = s2mps11->ramp_delay34;
 164
 165                ramp_shift = S2MPS11_BUCK34_RAMP_SHIFT;
 166                ramp_reg = S2MPS11_REG_RAMP;
 167                break;
 168        case S2MPS11_BUCK5:
 169                s2mps11->ramp_delay5 = ramp_delay;
 170                ramp_shift = S2MPS11_BUCK5_RAMP_SHIFT;
 171                break;
 172        case S2MPS11_BUCK6:
 173                enable_shift = S2MPS11_BUCK6_RAMP_EN_SHIFT;
 174                if (!ramp_delay) {
 175                        ramp_enable = 0;
 176                        break;
 177                }
 178
 179                if (ramp_delay > s2mps11->ramp_delay16)
 180                        s2mps11->ramp_delay16 = ramp_delay;
 181                else
 182                        ramp_delay = s2mps11->ramp_delay16;
 183
 184                ramp_shift = S2MPS11_BUCK16_RAMP_SHIFT;
 185                break;
 186        case S2MPS11_BUCK7:
 187        case S2MPS11_BUCK8:
 188        case S2MPS11_BUCK10:
 189                if (ramp_delay > s2mps11->ramp_delay7810)
 190                        s2mps11->ramp_delay7810 = ramp_delay;
 191                else
 192                        ramp_delay = s2mps11->ramp_delay7810;
 193
 194                ramp_shift = S2MPS11_BUCK7810_RAMP_SHIFT;
 195                break;
 196        case S2MPS11_BUCK9:
 197                s2mps11->ramp_delay9 = ramp_delay;
 198                ramp_shift = S2MPS11_BUCK9_RAMP_SHIFT;
 199                break;
 200        default:
 201                return 0;
 202        }
 203
 204        if (!ramp_enable)
 205                goto ramp_disable;
 206
 207        /* Ramp delay can be enabled/disabled only for buck[2346] */
 208        if ((rdev_id >= S2MPS11_BUCK2 && rdev_id <= S2MPS11_BUCK4) ||
 209            rdev_id == S2MPS11_BUCK6)  {
 210                ret = regmap_update_bits(rdev->regmap, S2MPS11_REG_RAMP,
 211                                         1 << enable_shift, 1 << enable_shift);
 212                if (ret) {
 213                        dev_err(&rdev->dev, "failed to enable ramp rate\n");
 214                        return ret;
 215                }
 216        }
 217
 218        ramp_val = get_ramp_delay(ramp_delay);
 219
 220        return regmap_update_bits(rdev->regmap, ramp_reg, 0x3 << ramp_shift,
 221                                  ramp_val << ramp_shift);
 222
 223ramp_disable:
 224        return regmap_update_bits(rdev->regmap, S2MPS11_REG_RAMP,
 225                                  1 << enable_shift, 0);
 226}
 227
 228static int s2mps11_regulator_enable(struct regulator_dev *rdev)
 229{
 230        struct s2mps11_info *s2mps11 = rdev_get_drvdata(rdev);
 231        int rdev_id = rdev_get_id(rdev);
 232        unsigned int val;
 233
 234        switch (s2mps11->dev_type) {
 235        case S2MPS11X:
 236                if (test_bit(rdev_id, s2mps11->suspend_state))
 237                        val = S2MPS14_ENABLE_SUSPEND;
 238                else
 239                        val = rdev->desc->enable_mask;
 240                break;
 241        case S2MPS13X:
 242        case S2MPS14X:
 243                if (test_bit(rdev_id, s2mps11->suspend_state))
 244                        val = S2MPS14_ENABLE_SUSPEND;
 245                else if (s2mps11->ext_control_gpiod[rdev_id])
 246                        val = S2MPS14_ENABLE_EXT_CONTROL;
 247                else
 248                        val = rdev->desc->enable_mask;
 249                break;
 250        case S2MPU02:
 251                if (test_bit(rdev_id, s2mps11->suspend_state))
 252                        val = S2MPU02_ENABLE_SUSPEND;
 253                else
 254                        val = rdev->desc->enable_mask;
 255                break;
 256        default:
 257                return -EINVAL;
 258        }
 259
 260        return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
 261                        rdev->desc->enable_mask, val);
 262}
 263
 264static int s2mps11_regulator_set_suspend_disable(struct regulator_dev *rdev)
 265{
 266        int ret;
 267        unsigned int val, state;
 268        struct s2mps11_info *s2mps11 = rdev_get_drvdata(rdev);
 269        int rdev_id = rdev_get_id(rdev);
 270
 271        /* Below LDO should be always on or does not support suspend mode. */
 272        switch (s2mps11->dev_type) {
 273        case S2MPS11X:
 274                switch (rdev_id) {
 275                case S2MPS11_LDO2:
 276                case S2MPS11_LDO36:
 277                case S2MPS11_LDO37:
 278                case S2MPS11_LDO38:
 279                        return 0;
 280                default:
 281                        state = S2MPS14_ENABLE_SUSPEND;
 282                        break;
 283                }
 284                break;
 285        case S2MPS13X:
 286        case S2MPS14X:
 287                switch (rdev_id) {
 288                case S2MPS14_LDO3:
 289                        return 0;
 290                default:
 291                        state = S2MPS14_ENABLE_SUSPEND;
 292                        break;
 293                }
 294                break;
 295        case S2MPU02:
 296                switch (rdev_id) {
 297                case S2MPU02_LDO13:
 298                case S2MPU02_LDO14:
 299                case S2MPU02_LDO15:
 300                case S2MPU02_LDO17:
 301                case S2MPU02_BUCK7:
 302                        state = S2MPU02_DISABLE_SUSPEND;
 303                        break;
 304                default:
 305                        state = S2MPU02_ENABLE_SUSPEND;
 306                        break;
 307                }
 308                break;
 309        default:
 310                return -EINVAL;
 311        }
 312
 313        ret = regmap_read(rdev->regmap, rdev->desc->enable_reg, &val);
 314        if (ret < 0)
 315                return ret;
 316
 317        set_bit(rdev_id, s2mps11->suspend_state);
 318        /*
 319         * Don't enable suspend mode if regulator is already disabled because
 320         * this would effectively for a short time turn on the regulator after
 321         * resuming.
 322         * However we still want to toggle the suspend_state bit for regulator
 323         * in case if it got enabled before suspending the system.
 324         */
 325        if (!(val & rdev->desc->enable_mask))
 326                return 0;
 327
 328        return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
 329                                  rdev->desc->enable_mask, state);
 330}
 331
 332static const struct regulator_ops s2mps11_ldo_ops = {
 333        .list_voltage           = regulator_list_voltage_linear,
 334        .map_voltage            = regulator_map_voltage_linear,
 335        .is_enabled             = regulator_is_enabled_regmap,
 336        .enable                 = s2mps11_regulator_enable,
 337        .disable                = regulator_disable_regmap,
 338        .get_voltage_sel        = regulator_get_voltage_sel_regmap,
 339        .set_voltage_sel        = regulator_set_voltage_sel_regmap,
 340        .set_voltage_time_sel   = regulator_set_voltage_time_sel,
 341        .set_suspend_disable    = s2mps11_regulator_set_suspend_disable,
 342};
 343
 344static const struct regulator_ops s2mps11_buck_ops = {
 345        .list_voltage           = regulator_list_voltage_linear,
 346        .map_voltage            = regulator_map_voltage_linear,
 347        .is_enabled             = regulator_is_enabled_regmap,
 348        .enable                 = s2mps11_regulator_enable,
 349        .disable                = regulator_disable_regmap,
 350        .get_voltage_sel        = regulator_get_voltage_sel_regmap,
 351        .set_voltage_sel        = regulator_set_voltage_sel_regmap,
 352        .set_voltage_time_sel   = s2mps11_regulator_set_voltage_time_sel,
 353        .set_ramp_delay         = s2mps11_set_ramp_delay,
 354        .set_suspend_disable    = s2mps11_regulator_set_suspend_disable,
 355};
 356
 357#define regulator_desc_s2mps11_ldo(num, step) {         \
 358        .name           = "LDO"#num,                    \
 359        .id             = S2MPS11_LDO##num,             \
 360        .ops            = &s2mps11_ldo_ops,             \
 361        .type           = REGULATOR_VOLTAGE,            \
 362        .owner          = THIS_MODULE,                  \
 363        .ramp_delay     = RAMP_DELAY_12_MVUS,           \
 364        .min_uV         = MIN_800_MV,                   \
 365        .uV_step        = step,                         \
 366        .n_voltages     = S2MPS11_LDO_N_VOLTAGES,       \
 367        .vsel_reg       = S2MPS11_REG_L1CTRL + num - 1, \
 368        .vsel_mask      = S2MPS11_LDO_VSEL_MASK,        \
 369        .enable_reg     = S2MPS11_REG_L1CTRL + num - 1, \
 370        .enable_mask    = S2MPS11_ENABLE_MASK           \
 371}
 372
 373#define regulator_desc_s2mps11_buck1_4(num) {                   \
 374        .name           = "BUCK"#num,                           \
 375        .id             = S2MPS11_BUCK##num,                    \
 376        .ops            = &s2mps11_buck_ops,                    \
 377        .type           = REGULATOR_VOLTAGE,                    \
 378        .owner          = THIS_MODULE,                          \
 379        .min_uV         = MIN_650_MV,                           \
 380        .uV_step        = STEP_6_25_MV,                         \
 381        .linear_min_sel = 8,                                    \
 382        .n_voltages     = S2MPS11_BUCK12346_N_VOLTAGES,         \
 383        .ramp_delay     = S2MPS11_RAMP_DELAY,                   \
 384        .vsel_reg       = S2MPS11_REG_B1CTRL2 + (num - 1) * 2,  \
 385        .vsel_mask      = S2MPS11_BUCK_VSEL_MASK,               \
 386        .enable_reg     = S2MPS11_REG_B1CTRL1 + (num - 1) * 2,  \
 387        .enable_mask    = S2MPS11_ENABLE_MASK                   \
 388}
 389
 390#define regulator_desc_s2mps11_buck5 {                          \
 391        .name           = "BUCK5",                              \
 392        .id             = S2MPS11_BUCK5,                        \
 393        .ops            = &s2mps11_buck_ops,                    \
 394        .type           = REGULATOR_VOLTAGE,                    \
 395        .owner          = THIS_MODULE,                          \
 396        .min_uV         = MIN_650_MV,                           \
 397        .uV_step        = STEP_6_25_MV,                         \
 398        .linear_min_sel = 8,                                    \
 399        .n_voltages     = S2MPS11_BUCK5_N_VOLTAGES,             \
 400        .ramp_delay     = S2MPS11_RAMP_DELAY,                   \
 401        .vsel_reg       = S2MPS11_REG_B5CTRL2,                  \
 402        .vsel_mask      = S2MPS11_BUCK_VSEL_MASK,               \
 403        .enable_reg     = S2MPS11_REG_B5CTRL1,                  \
 404        .enable_mask    = S2MPS11_ENABLE_MASK                   \
 405}
 406
 407#define regulator_desc_s2mps11_buck67810(num, min, step, min_sel, voltages) {   \
 408        .name           = "BUCK"#num,                           \
 409        .id             = S2MPS11_BUCK##num,                    \
 410        .ops            = &s2mps11_buck_ops,                    \
 411        .type           = REGULATOR_VOLTAGE,                    \
 412        .owner          = THIS_MODULE,                          \
 413        .min_uV         = min,                                  \
 414        .uV_step        = step,                                 \
 415        .linear_min_sel = min_sel,                              \
 416        .n_voltages     = voltages,                             \
 417        .ramp_delay     = S2MPS11_RAMP_DELAY,                   \
 418        .vsel_reg       = S2MPS11_REG_B6CTRL2 + (num - 6) * 2,  \
 419        .vsel_mask      = S2MPS11_BUCK_VSEL_MASK,               \
 420        .enable_reg     = S2MPS11_REG_B6CTRL1 + (num - 6) * 2,  \
 421        .enable_mask    = S2MPS11_ENABLE_MASK                   \
 422}
 423
 424#define regulator_desc_s2mps11_buck9 {                          \
 425        .name           = "BUCK9",                              \
 426        .id             = S2MPS11_BUCK9,                        \
 427        .ops            = &s2mps11_buck_ops,                    \
 428        .type           = REGULATOR_VOLTAGE,                    \
 429        .owner          = THIS_MODULE,                          \
 430        .min_uV         = MIN_3000_MV,                          \
 431        .uV_step        = STEP_25_MV,                           \
 432        .n_voltages     = S2MPS11_BUCK9_N_VOLTAGES,             \
 433        .ramp_delay     = S2MPS11_RAMP_DELAY,                   \
 434        .vsel_reg       = S2MPS11_REG_B9CTRL2,                  \
 435        .vsel_mask      = S2MPS11_BUCK9_VSEL_MASK,              \
 436        .enable_reg     = S2MPS11_REG_B9CTRL1,                  \
 437        .enable_mask    = S2MPS11_ENABLE_MASK                   \
 438}
 439
 440static const struct regulator_desc s2mps11_regulators[] = {
 441        regulator_desc_s2mps11_ldo(1, STEP_25_MV),
 442        regulator_desc_s2mps11_ldo(2, STEP_50_MV),
 443        regulator_desc_s2mps11_ldo(3, STEP_50_MV),
 444        regulator_desc_s2mps11_ldo(4, STEP_50_MV),
 445        regulator_desc_s2mps11_ldo(5, STEP_50_MV),
 446        regulator_desc_s2mps11_ldo(6, STEP_25_MV),
 447        regulator_desc_s2mps11_ldo(7, STEP_50_MV),
 448        regulator_desc_s2mps11_ldo(8, STEP_50_MV),
 449        regulator_desc_s2mps11_ldo(9, STEP_50_MV),
 450        regulator_desc_s2mps11_ldo(10, STEP_50_MV),
 451        regulator_desc_s2mps11_ldo(11, STEP_25_MV),
 452        regulator_desc_s2mps11_ldo(12, STEP_50_MV),
 453        regulator_desc_s2mps11_ldo(13, STEP_50_MV),
 454        regulator_desc_s2mps11_ldo(14, STEP_50_MV),
 455        regulator_desc_s2mps11_ldo(15, STEP_50_MV),
 456        regulator_desc_s2mps11_ldo(16, STEP_50_MV),
 457        regulator_desc_s2mps11_ldo(17, STEP_50_MV),
 458        regulator_desc_s2mps11_ldo(18, STEP_50_MV),
 459        regulator_desc_s2mps11_ldo(19, STEP_50_MV),
 460        regulator_desc_s2mps11_ldo(20, STEP_50_MV),
 461        regulator_desc_s2mps11_ldo(21, STEP_50_MV),
 462        regulator_desc_s2mps11_ldo(22, STEP_25_MV),
 463        regulator_desc_s2mps11_ldo(23, STEP_25_MV),
 464        regulator_desc_s2mps11_ldo(24, STEP_50_MV),
 465        regulator_desc_s2mps11_ldo(25, STEP_50_MV),
 466        regulator_desc_s2mps11_ldo(26, STEP_50_MV),
 467        regulator_desc_s2mps11_ldo(27, STEP_25_MV),
 468        regulator_desc_s2mps11_ldo(28, STEP_50_MV),
 469        regulator_desc_s2mps11_ldo(29, STEP_50_MV),
 470        regulator_desc_s2mps11_ldo(30, STEP_50_MV),
 471        regulator_desc_s2mps11_ldo(31, STEP_50_MV),
 472        regulator_desc_s2mps11_ldo(32, STEP_50_MV),
 473        regulator_desc_s2mps11_ldo(33, STEP_50_MV),
 474        regulator_desc_s2mps11_ldo(34, STEP_50_MV),
 475        regulator_desc_s2mps11_ldo(35, STEP_25_MV),
 476        regulator_desc_s2mps11_ldo(36, STEP_50_MV),
 477        regulator_desc_s2mps11_ldo(37, STEP_50_MV),
 478        regulator_desc_s2mps11_ldo(38, STEP_50_MV),
 479        regulator_desc_s2mps11_buck1_4(1),
 480        regulator_desc_s2mps11_buck1_4(2),
 481        regulator_desc_s2mps11_buck1_4(3),
 482        regulator_desc_s2mps11_buck1_4(4),
 483        regulator_desc_s2mps11_buck5,
 484        regulator_desc_s2mps11_buck67810(6, MIN_650_MV, STEP_6_25_MV, 8,
 485                                         S2MPS11_BUCK12346_N_VOLTAGES),
 486        regulator_desc_s2mps11_buck67810(7, MIN_750_MV, STEP_12_5_MV, 0,
 487                                         S2MPS11_BUCK7810_N_VOLTAGES),
 488        regulator_desc_s2mps11_buck67810(8, MIN_750_MV, STEP_12_5_MV, 0,
 489                                         S2MPS11_BUCK7810_N_VOLTAGES),
 490        regulator_desc_s2mps11_buck9,
 491        regulator_desc_s2mps11_buck67810(10, MIN_750_MV, STEP_12_5_MV, 0,
 492                                         S2MPS11_BUCK7810_N_VOLTAGES),
 493};
 494
 495static const struct regulator_ops s2mps14_reg_ops;
 496
 497#define regulator_desc_s2mps13_ldo(num, min, step, min_sel) {   \
 498        .name           = "LDO"#num,                            \
 499        .id             = S2MPS13_LDO##num,                     \
 500        .ops            = &s2mps14_reg_ops,                     \
 501        .type           = REGULATOR_VOLTAGE,                    \
 502        .owner          = THIS_MODULE,                          \
 503        .min_uV         = min,                                  \
 504        .uV_step        = step,                                 \
 505        .linear_min_sel = min_sel,                              \
 506        .n_voltages     = S2MPS14_LDO_N_VOLTAGES,               \
 507        .vsel_reg       = S2MPS13_REG_L1CTRL + num - 1,         \
 508        .vsel_mask      = S2MPS14_LDO_VSEL_MASK,                \
 509        .enable_reg     = S2MPS13_REG_L1CTRL + num - 1,         \
 510        .enable_mask    = S2MPS14_ENABLE_MASK                   \
 511}
 512
 513#define regulator_desc_s2mps13_buck(num, min, step, min_sel) {  \
 514        .name           = "BUCK"#num,                           \
 515        .id             = S2MPS13_BUCK##num,                    \
 516        .ops            = &s2mps14_reg_ops,                     \
 517        .type           = REGULATOR_VOLTAGE,                    \
 518        .owner          = THIS_MODULE,                          \
 519        .min_uV         = min,                                  \
 520        .uV_step        = step,                                 \
 521        .linear_min_sel = min_sel,                              \
 522        .n_voltages     = S2MPS14_BUCK_N_VOLTAGES,              \
 523        .ramp_delay     = S2MPS13_BUCK_RAMP_DELAY,              \
 524        .vsel_reg       = S2MPS13_REG_B1OUT + (num - 1) * 2,    \
 525        .vsel_mask      = S2MPS14_BUCK_VSEL_MASK,               \
 526        .enable_reg     = S2MPS13_REG_B1CTRL + (num - 1) * 2,   \
 527        .enable_mask    = S2MPS14_ENABLE_MASK                   \
 528}
 529
 530#define regulator_desc_s2mps13_buck7(num, min, step, min_sel) { \
 531        .name           = "BUCK"#num,                           \
 532        .id             = S2MPS13_BUCK##num,                    \
 533        .ops            = &s2mps14_reg_ops,                     \
 534        .type           = REGULATOR_VOLTAGE,                    \
 535        .owner          = THIS_MODULE,                          \
 536        .min_uV         = min,                                  \
 537        .uV_step        = step,                                 \
 538        .linear_min_sel = min_sel,                              \
 539        .n_voltages     = S2MPS14_BUCK_N_VOLTAGES,              \
 540        .ramp_delay     = S2MPS13_BUCK_RAMP_DELAY,              \
 541        .vsel_reg       = S2MPS13_REG_B1OUT + (num) * 2 - 1,    \
 542        .vsel_mask      = S2MPS14_BUCK_VSEL_MASK,               \
 543        .enable_reg     = S2MPS13_REG_B1CTRL + (num - 1) * 2,   \
 544        .enable_mask    = S2MPS14_ENABLE_MASK                   \
 545}
 546
 547#define regulator_desc_s2mps13_buck8_10(num, min, step, min_sel) {      \
 548        .name           = "BUCK"#num,                           \
 549        .id             = S2MPS13_BUCK##num,                    \
 550        .ops            = &s2mps14_reg_ops,                     \
 551        .type           = REGULATOR_VOLTAGE,                    \
 552        .owner          = THIS_MODULE,                          \
 553        .min_uV         = min,                                  \
 554        .uV_step        = step,                                 \
 555        .linear_min_sel = min_sel,                              \
 556        .n_voltages     = S2MPS14_BUCK_N_VOLTAGES,              \
 557        .ramp_delay     = S2MPS13_BUCK_RAMP_DELAY,              \
 558        .vsel_reg       = S2MPS13_REG_B1OUT + (num) * 2 - 1,    \
 559        .vsel_mask      = S2MPS14_BUCK_VSEL_MASK,               \
 560        .enable_reg     = S2MPS13_REG_B1CTRL + (num) * 2 - 1,   \
 561        .enable_mask    = S2MPS14_ENABLE_MASK                   \
 562}
 563
 564static const struct regulator_desc s2mps13_regulators[] = {
 565        regulator_desc_s2mps13_ldo(1,  MIN_800_MV,  STEP_12_5_MV, 0x00),
 566        regulator_desc_s2mps13_ldo(2,  MIN_1400_MV, STEP_50_MV,   0x0C),
 567        regulator_desc_s2mps13_ldo(3,  MIN_1000_MV, STEP_25_MV,   0x08),
 568        regulator_desc_s2mps13_ldo(4,  MIN_800_MV,  STEP_12_5_MV, 0x00),
 569        regulator_desc_s2mps13_ldo(5,  MIN_800_MV,  STEP_12_5_MV, 0x00),
 570        regulator_desc_s2mps13_ldo(6,  MIN_800_MV,  STEP_12_5_MV, 0x00),
 571        regulator_desc_s2mps13_ldo(7,  MIN_1000_MV, STEP_25_MV,   0x08),
 572        regulator_desc_s2mps13_ldo(8,  MIN_1000_MV, STEP_25_MV,   0x08),
 573        regulator_desc_s2mps13_ldo(9,  MIN_1000_MV, STEP_25_MV,   0x08),
 574        regulator_desc_s2mps13_ldo(10, MIN_1400_MV, STEP_50_MV,   0x0C),
 575        regulator_desc_s2mps13_ldo(11, MIN_800_MV,  STEP_25_MV,   0x10),
 576        regulator_desc_s2mps13_ldo(12, MIN_800_MV,  STEP_25_MV,   0x10),
 577        regulator_desc_s2mps13_ldo(13, MIN_800_MV,  STEP_25_MV,   0x10),
 578        regulator_desc_s2mps13_ldo(14, MIN_800_MV,  STEP_12_5_MV, 0x00),
 579        regulator_desc_s2mps13_ldo(15, MIN_800_MV,  STEP_12_5_MV, 0x00),
 580        regulator_desc_s2mps13_ldo(16, MIN_1400_MV, STEP_50_MV,   0x0C),
 581        regulator_desc_s2mps13_ldo(17, MIN_1400_MV, STEP_50_MV,   0x0C),
 582        regulator_desc_s2mps13_ldo(18, MIN_1000_MV, STEP_25_MV,   0x08),
 583        regulator_desc_s2mps13_ldo(19, MIN_1000_MV, STEP_25_MV,   0x08),
 584        regulator_desc_s2mps13_ldo(20, MIN_1400_MV, STEP_50_MV,   0x0C),
 585        regulator_desc_s2mps13_ldo(21, MIN_1000_MV, STEP_25_MV,   0x08),
 586        regulator_desc_s2mps13_ldo(22, MIN_1000_MV, STEP_25_MV,   0x08),
 587        regulator_desc_s2mps13_ldo(23, MIN_800_MV,  STEP_12_5_MV, 0x00),
 588        regulator_desc_s2mps13_ldo(24, MIN_800_MV,  STEP_12_5_MV, 0x00),
 589        regulator_desc_s2mps13_ldo(25, MIN_1400_MV, STEP_50_MV,   0x0C),
 590        regulator_desc_s2mps13_ldo(26, MIN_1400_MV, STEP_50_MV,   0x0C),
 591        regulator_desc_s2mps13_ldo(27, MIN_1400_MV, STEP_50_MV,   0x0C),
 592        regulator_desc_s2mps13_ldo(28, MIN_1000_MV, STEP_25_MV,   0x08),
 593        regulator_desc_s2mps13_ldo(29, MIN_1400_MV, STEP_50_MV,   0x0C),
 594        regulator_desc_s2mps13_ldo(30, MIN_1400_MV, STEP_50_MV,   0x0C),
 595        regulator_desc_s2mps13_ldo(31, MIN_1000_MV, STEP_25_MV,   0x08),
 596        regulator_desc_s2mps13_ldo(32, MIN_1000_MV, STEP_25_MV,   0x08),
 597        regulator_desc_s2mps13_ldo(33, MIN_1400_MV, STEP_50_MV,   0x0C),
 598        regulator_desc_s2mps13_ldo(34, MIN_1000_MV, STEP_25_MV,   0x08),
 599        regulator_desc_s2mps13_ldo(35, MIN_1400_MV, STEP_50_MV,   0x0C),
 600        regulator_desc_s2mps13_ldo(36, MIN_800_MV,  STEP_12_5_MV, 0x00),
 601        regulator_desc_s2mps13_ldo(37, MIN_1000_MV, STEP_25_MV,   0x08),
 602        regulator_desc_s2mps13_ldo(38, MIN_1400_MV, STEP_50_MV,   0x0C),
 603        regulator_desc_s2mps13_ldo(39, MIN_1000_MV, STEP_25_MV,   0x08),
 604        regulator_desc_s2mps13_ldo(40, MIN_1400_MV, STEP_50_MV,   0x0C),
 605        regulator_desc_s2mps13_buck(1,  MIN_500_MV,  STEP_6_25_MV, 0x10),
 606        regulator_desc_s2mps13_buck(2,  MIN_500_MV,  STEP_6_25_MV, 0x10),
 607        regulator_desc_s2mps13_buck(3,  MIN_500_MV,  STEP_6_25_MV, 0x10),
 608        regulator_desc_s2mps13_buck(4,  MIN_500_MV,  STEP_6_25_MV, 0x10),
 609        regulator_desc_s2mps13_buck(5,  MIN_500_MV,  STEP_6_25_MV, 0x10),
 610        regulator_desc_s2mps13_buck(6,  MIN_500_MV,  STEP_6_25_MV, 0x10),
 611        regulator_desc_s2mps13_buck7(7,  MIN_500_MV,  STEP_6_25_MV, 0x10),
 612        regulator_desc_s2mps13_buck8_10(8,  MIN_1000_MV, STEP_12_5_MV, 0x20),
 613        regulator_desc_s2mps13_buck8_10(9,  MIN_1000_MV, STEP_12_5_MV, 0x20),
 614        regulator_desc_s2mps13_buck8_10(10, MIN_500_MV,  STEP_6_25_MV, 0x10),
 615};
 616
 617static const struct regulator_ops s2mps14_reg_ops = {
 618        .list_voltage           = regulator_list_voltage_linear,
 619        .map_voltage            = regulator_map_voltage_linear,
 620        .is_enabled             = regulator_is_enabled_regmap,
 621        .enable                 = s2mps11_regulator_enable,
 622        .disable                = regulator_disable_regmap,
 623        .get_voltage_sel        = regulator_get_voltage_sel_regmap,
 624        .set_voltage_sel        = regulator_set_voltage_sel_regmap,
 625        .set_voltage_time_sel   = regulator_set_voltage_time_sel,
 626        .set_suspend_disable    = s2mps11_regulator_set_suspend_disable,
 627};
 628
 629#define regulator_desc_s2mps14_ldo(num, min, step) {    \
 630        .name           = "LDO"#num,                    \
 631        .id             = S2MPS14_LDO##num,             \
 632        .ops            = &s2mps14_reg_ops,             \
 633        .type           = REGULATOR_VOLTAGE,            \
 634        .owner          = THIS_MODULE,                  \
 635        .min_uV         = min,                          \
 636        .uV_step        = step,                         \
 637        .n_voltages     = S2MPS14_LDO_N_VOLTAGES,       \
 638        .vsel_reg       = S2MPS14_REG_L1CTRL + num - 1, \
 639        .vsel_mask      = S2MPS14_LDO_VSEL_MASK,        \
 640        .enable_reg     = S2MPS14_REG_L1CTRL + num - 1, \
 641        .enable_mask    = S2MPS14_ENABLE_MASK           \
 642}
 643
 644#define regulator_desc_s2mps14_buck(num, min, step, min_sel) {  \
 645        .name           = "BUCK"#num,                           \
 646        .id             = S2MPS14_BUCK##num,                    \
 647        .ops            = &s2mps14_reg_ops,                     \
 648        .type           = REGULATOR_VOLTAGE,                    \
 649        .owner          = THIS_MODULE,                          \
 650        .min_uV         = min,                                  \
 651        .uV_step        = step,                                 \
 652        .n_voltages     = S2MPS14_BUCK_N_VOLTAGES,              \
 653        .linear_min_sel = min_sel,                              \
 654        .ramp_delay     = S2MPS14_BUCK_RAMP_DELAY,              \
 655        .vsel_reg       = S2MPS14_REG_B1CTRL2 + (num - 1) * 2,  \
 656        .vsel_mask      = S2MPS14_BUCK_VSEL_MASK,               \
 657        .enable_reg     = S2MPS14_REG_B1CTRL1 + (num - 1) * 2,  \
 658        .enable_mask    = S2MPS14_ENABLE_MASK                   \
 659}
 660
 661static const struct regulator_desc s2mps14_regulators[] = {
 662        regulator_desc_s2mps14_ldo(1, MIN_800_MV, STEP_12_5_MV),
 663        regulator_desc_s2mps14_ldo(2, MIN_800_MV, STEP_12_5_MV),
 664        regulator_desc_s2mps14_ldo(3, MIN_800_MV, STEP_25_MV),
 665        regulator_desc_s2mps14_ldo(4, MIN_800_MV, STEP_25_MV),
 666        regulator_desc_s2mps14_ldo(5, MIN_800_MV, STEP_12_5_MV),
 667        regulator_desc_s2mps14_ldo(6, MIN_800_MV, STEP_12_5_MV),
 668        regulator_desc_s2mps14_ldo(7, MIN_800_MV, STEP_25_MV),
 669        regulator_desc_s2mps14_ldo(8, MIN_1800_MV, STEP_25_MV),
 670        regulator_desc_s2mps14_ldo(9, MIN_800_MV, STEP_12_5_MV),
 671        regulator_desc_s2mps14_ldo(10, MIN_800_MV, STEP_12_5_MV),
 672        regulator_desc_s2mps14_ldo(11, MIN_800_MV, STEP_25_MV),
 673        regulator_desc_s2mps14_ldo(12, MIN_1800_MV, STEP_25_MV),
 674        regulator_desc_s2mps14_ldo(13, MIN_1800_MV, STEP_25_MV),
 675        regulator_desc_s2mps14_ldo(14, MIN_1800_MV, STEP_25_MV),
 676        regulator_desc_s2mps14_ldo(15, MIN_1800_MV, STEP_25_MV),
 677        regulator_desc_s2mps14_ldo(16, MIN_1800_MV, STEP_25_MV),
 678        regulator_desc_s2mps14_ldo(17, MIN_1800_MV, STEP_25_MV),
 679        regulator_desc_s2mps14_ldo(18, MIN_1800_MV, STEP_25_MV),
 680        regulator_desc_s2mps14_ldo(19, MIN_800_MV, STEP_25_MV),
 681        regulator_desc_s2mps14_ldo(20, MIN_800_MV, STEP_25_MV),
 682        regulator_desc_s2mps14_ldo(21, MIN_800_MV, STEP_25_MV),
 683        regulator_desc_s2mps14_ldo(22, MIN_800_MV, STEP_12_5_MV),
 684        regulator_desc_s2mps14_ldo(23, MIN_800_MV, STEP_25_MV),
 685        regulator_desc_s2mps14_ldo(24, MIN_1800_MV, STEP_25_MV),
 686        regulator_desc_s2mps14_ldo(25, MIN_1800_MV, STEP_25_MV),
 687        regulator_desc_s2mps14_buck(1, MIN_600_MV, STEP_6_25_MV,
 688                                    S2MPS14_BUCK1235_START_SEL),
 689        regulator_desc_s2mps14_buck(2, MIN_600_MV, STEP_6_25_MV,
 690                                    S2MPS14_BUCK1235_START_SEL),
 691        regulator_desc_s2mps14_buck(3, MIN_600_MV, STEP_6_25_MV,
 692                                    S2MPS14_BUCK1235_START_SEL),
 693        regulator_desc_s2mps14_buck(4, MIN_1400_MV, STEP_12_5_MV,
 694                                    S2MPS14_BUCK4_START_SEL),
 695        regulator_desc_s2mps14_buck(5, MIN_600_MV, STEP_6_25_MV,
 696                                    S2MPS14_BUCK1235_START_SEL),
 697};
 698
 699static const struct regulator_ops s2mps15_reg_ldo_ops = {
 700        .list_voltage           = regulator_list_voltage_linear_range,
 701        .map_voltage            = regulator_map_voltage_linear_range,
 702        .is_enabled             = regulator_is_enabled_regmap,
 703        .enable                 = regulator_enable_regmap,
 704        .disable                = regulator_disable_regmap,
 705        .get_voltage_sel        = regulator_get_voltage_sel_regmap,
 706        .set_voltage_sel        = regulator_set_voltage_sel_regmap,
 707};
 708
 709static const struct regulator_ops s2mps15_reg_buck_ops = {
 710        .list_voltage           = regulator_list_voltage_linear_range,
 711        .map_voltage            = regulator_map_voltage_linear_range,
 712        .is_enabled             = regulator_is_enabled_regmap,
 713        .enable                 = regulator_enable_regmap,
 714        .disable                = regulator_disable_regmap,
 715        .get_voltage_sel        = regulator_get_voltage_sel_regmap,
 716        .set_voltage_sel        = regulator_set_voltage_sel_regmap,
 717        .set_voltage_time_sel   = regulator_set_voltage_time_sel,
 718};
 719
 720#define regulator_desc_s2mps15_ldo(num, range) {        \
 721        .name           = "LDO"#num,                    \
 722        .id             = S2MPS15_LDO##num,             \
 723        .ops            = &s2mps15_reg_ldo_ops,         \
 724        .type           = REGULATOR_VOLTAGE,            \
 725        .owner          = THIS_MODULE,                  \
 726        .linear_ranges  = range,                        \
 727        .n_linear_ranges = ARRAY_SIZE(range),           \
 728        .n_voltages     = S2MPS15_LDO_N_VOLTAGES,       \
 729        .vsel_reg       = S2MPS15_REG_L1CTRL + num - 1, \
 730        .vsel_mask      = S2MPS15_LDO_VSEL_MASK,        \
 731        .enable_reg     = S2MPS15_REG_L1CTRL + num - 1, \
 732        .enable_mask    = S2MPS15_ENABLE_MASK           \
 733}
 734
 735#define regulator_desc_s2mps15_buck(num, range) {                       \
 736        .name           = "BUCK"#num,                                   \
 737        .id             = S2MPS15_BUCK##num,                            \
 738        .ops            = &s2mps15_reg_buck_ops,                        \
 739        .type           = REGULATOR_VOLTAGE,                            \
 740        .owner          = THIS_MODULE,                                  \
 741        .linear_ranges  = range,                                        \
 742        .n_linear_ranges = ARRAY_SIZE(range),                           \
 743        .ramp_delay     = 12500,                                        \
 744        .n_voltages     = S2MPS15_BUCK_N_VOLTAGES,                      \
 745        .vsel_reg       = S2MPS15_REG_B1CTRL2 + ((num - 1) * 2),        \
 746        .vsel_mask      = S2MPS15_BUCK_VSEL_MASK,                       \
 747        .enable_reg     = S2MPS15_REG_B1CTRL1 + ((num - 1) * 2),        \
 748        .enable_mask    = S2MPS15_ENABLE_MASK                           \
 749}
 750
 751/* voltage range for s2mps15 LDO 3, 5, 15, 16, 18, 20, 23 and 27 */
 752static const struct regulator_linear_range s2mps15_ldo_voltage_ranges1[] = {
 753        REGULATOR_LINEAR_RANGE(1000000, 0xc, 0x38, 25000),
 754};
 755
 756/* voltage range for s2mps15 LDO 2, 6, 14, 17, 19, 21, 24 and 25 */
 757static const struct regulator_linear_range s2mps15_ldo_voltage_ranges2[] = {
 758        REGULATOR_LINEAR_RANGE(1800000, 0x0, 0x3f, 25000),
 759};
 760
 761/* voltage range for s2mps15 LDO 4, 11, 12, 13, 22 and 26 */
 762static const struct regulator_linear_range s2mps15_ldo_voltage_ranges3[] = {
 763        REGULATOR_LINEAR_RANGE(700000, 0x0, 0x34, 12500),
 764};
 765
 766/* voltage range for s2mps15 LDO 7, 8, 9 and 10 */
 767static const struct regulator_linear_range s2mps15_ldo_voltage_ranges4[] = {
 768        REGULATOR_LINEAR_RANGE(700000, 0x10, 0x20, 25000),
 769};
 770
 771/* voltage range for s2mps15 LDO 1 */
 772static const struct regulator_linear_range s2mps15_ldo_voltage_ranges5[] = {
 773        REGULATOR_LINEAR_RANGE(500000, 0x0, 0x20, 12500),
 774};
 775
 776/* voltage range for s2mps15 BUCK 1, 2, 3, 4, 5, 6 and 7 */
 777static const struct regulator_linear_range s2mps15_buck_voltage_ranges1[] = {
 778        REGULATOR_LINEAR_RANGE(500000, 0x20, 0xc0, 6250),
 779};
 780
 781/* voltage range for s2mps15 BUCK 8, 9 and 10 */
 782static const struct regulator_linear_range s2mps15_buck_voltage_ranges2[] = {
 783        REGULATOR_LINEAR_RANGE(1000000, 0x20, 0x78, 12500),
 784};
 785
 786static const struct regulator_desc s2mps15_regulators[] = {
 787        regulator_desc_s2mps15_ldo(1, s2mps15_ldo_voltage_ranges5),
 788        regulator_desc_s2mps15_ldo(2, s2mps15_ldo_voltage_ranges2),
 789        regulator_desc_s2mps15_ldo(3, s2mps15_ldo_voltage_ranges1),
 790        regulator_desc_s2mps15_ldo(4, s2mps15_ldo_voltage_ranges3),
 791        regulator_desc_s2mps15_ldo(5, s2mps15_ldo_voltage_ranges1),
 792        regulator_desc_s2mps15_ldo(6, s2mps15_ldo_voltage_ranges2),
 793        regulator_desc_s2mps15_ldo(7, s2mps15_ldo_voltage_ranges4),
 794        regulator_desc_s2mps15_ldo(8, s2mps15_ldo_voltage_ranges4),
 795        regulator_desc_s2mps15_ldo(9, s2mps15_ldo_voltage_ranges4),
 796        regulator_desc_s2mps15_ldo(10, s2mps15_ldo_voltage_ranges4),
 797        regulator_desc_s2mps15_ldo(11, s2mps15_ldo_voltage_ranges3),
 798        regulator_desc_s2mps15_ldo(12, s2mps15_ldo_voltage_ranges3),
 799        regulator_desc_s2mps15_ldo(13, s2mps15_ldo_voltage_ranges3),
 800        regulator_desc_s2mps15_ldo(14, s2mps15_ldo_voltage_ranges2),
 801        regulator_desc_s2mps15_ldo(15, s2mps15_ldo_voltage_ranges1),
 802        regulator_desc_s2mps15_ldo(16, s2mps15_ldo_voltage_ranges1),
 803        regulator_desc_s2mps15_ldo(17, s2mps15_ldo_voltage_ranges2),
 804        regulator_desc_s2mps15_ldo(18, s2mps15_ldo_voltage_ranges1),
 805        regulator_desc_s2mps15_ldo(19, s2mps15_ldo_voltage_ranges2),
 806        regulator_desc_s2mps15_ldo(20, s2mps15_ldo_voltage_ranges1),
 807        regulator_desc_s2mps15_ldo(21, s2mps15_ldo_voltage_ranges2),
 808        regulator_desc_s2mps15_ldo(22, s2mps15_ldo_voltage_ranges3),
 809        regulator_desc_s2mps15_ldo(23, s2mps15_ldo_voltage_ranges1),
 810        regulator_desc_s2mps15_ldo(24, s2mps15_ldo_voltage_ranges2),
 811        regulator_desc_s2mps15_ldo(25, s2mps15_ldo_voltage_ranges2),
 812        regulator_desc_s2mps15_ldo(26, s2mps15_ldo_voltage_ranges3),
 813        regulator_desc_s2mps15_ldo(27, s2mps15_ldo_voltage_ranges1),
 814        regulator_desc_s2mps15_buck(1, s2mps15_buck_voltage_ranges1),
 815        regulator_desc_s2mps15_buck(2, s2mps15_buck_voltage_ranges1),
 816        regulator_desc_s2mps15_buck(3, s2mps15_buck_voltage_ranges1),
 817        regulator_desc_s2mps15_buck(4, s2mps15_buck_voltage_ranges1),
 818        regulator_desc_s2mps15_buck(5, s2mps15_buck_voltage_ranges1),
 819        regulator_desc_s2mps15_buck(6, s2mps15_buck_voltage_ranges1),
 820        regulator_desc_s2mps15_buck(7, s2mps15_buck_voltage_ranges1),
 821        regulator_desc_s2mps15_buck(8, s2mps15_buck_voltage_ranges2),
 822        regulator_desc_s2mps15_buck(9, s2mps15_buck_voltage_ranges2),
 823        regulator_desc_s2mps15_buck(10, s2mps15_buck_voltage_ranges2),
 824};
 825
 826static int s2mps14_pmic_enable_ext_control(struct s2mps11_info *s2mps11,
 827                struct regulator_dev *rdev)
 828{
 829        return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg,
 830                        rdev->desc->enable_mask, S2MPS14_ENABLE_EXT_CONTROL);
 831}
 832
 833static void s2mps14_pmic_dt_parse_ext_control_gpio(struct platform_device *pdev,
 834                struct of_regulator_match *rdata, struct s2mps11_info *s2mps11)
 835{
 836        struct gpio_desc **gpio = s2mps11->ext_control_gpiod;
 837        unsigned int i;
 838        unsigned int valid_regulators[3] = { S2MPS14_LDO10, S2MPS14_LDO11,
 839                S2MPS14_LDO12 };
 840
 841        for (i = 0; i < ARRAY_SIZE(valid_regulators); i++) {
 842                unsigned int reg = valid_regulators[i];
 843
 844                if (!rdata[reg].init_data || !rdata[reg].of_node)
 845                        continue;
 846
 847                gpio[reg] = devm_gpiod_get_from_of_node(&pdev->dev,
 848                                rdata[reg].of_node,
 849                                "samsung,ext-control-gpios",
 850                                0,
 851                                GPIOD_OUT_HIGH | GPIOD_FLAGS_BIT_NONEXCLUSIVE,
 852                                "s2mps11-regulator");
 853                if (PTR_ERR(gpio[reg]) == -ENOENT)
 854                        gpio[reg] = NULL;
 855                else if (IS_ERR(gpio[reg])) {
 856                        dev_err(&pdev->dev, "Failed to get control GPIO for %d/%s\n",
 857                                reg, rdata[reg].name);
 858                        gpio[reg] = NULL;
 859                        continue;
 860                }
 861                if (gpio[reg])
 862                        dev_dbg(&pdev->dev, "Using GPIO for ext-control over %d/%s\n",
 863                                reg, rdata[reg].name);
 864        }
 865}
 866
 867static int s2mps11_pmic_dt_parse(struct platform_device *pdev,
 868                struct of_regulator_match *rdata, struct s2mps11_info *s2mps11,
 869                unsigned int rdev_num)
 870{
 871        struct device_node *reg_np;
 872
 873        reg_np = of_get_child_by_name(pdev->dev.parent->of_node, "regulators");
 874        if (!reg_np) {
 875                dev_err(&pdev->dev, "could not find regulators sub-node\n");
 876                return -EINVAL;
 877        }
 878
 879        of_regulator_match(&pdev->dev, reg_np, rdata, rdev_num);
 880        if (s2mps11->dev_type == S2MPS14X)
 881                s2mps14_pmic_dt_parse_ext_control_gpio(pdev, rdata, s2mps11);
 882
 883        of_node_put(reg_np);
 884
 885        return 0;
 886}
 887
 888static int s2mpu02_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
 889{
 890        unsigned int ramp_val, ramp_shift, ramp_reg;
 891        int rdev_id = rdev_get_id(rdev);
 892
 893        switch (rdev_id) {
 894        case S2MPU02_BUCK1:
 895                ramp_shift = S2MPU02_BUCK1_RAMP_SHIFT;
 896                break;
 897        case S2MPU02_BUCK2:
 898                ramp_shift = S2MPU02_BUCK2_RAMP_SHIFT;
 899                break;
 900        case S2MPU02_BUCK3:
 901                ramp_shift = S2MPU02_BUCK3_RAMP_SHIFT;
 902                break;
 903        case S2MPU02_BUCK4:
 904                ramp_shift = S2MPU02_BUCK4_RAMP_SHIFT;
 905                break;
 906        default:
 907                return 0;
 908        }
 909        ramp_reg = S2MPU02_REG_RAMP1;
 910        ramp_val = get_ramp_delay(ramp_delay);
 911
 912        return regmap_update_bits(rdev->regmap, ramp_reg,
 913                                  S2MPU02_BUCK1234_RAMP_MASK << ramp_shift,
 914                                  ramp_val << ramp_shift);
 915}
 916
 917static const struct regulator_ops s2mpu02_ldo_ops = {
 918        .list_voltage           = regulator_list_voltage_linear,
 919        .map_voltage            = regulator_map_voltage_linear,
 920        .is_enabled             = regulator_is_enabled_regmap,
 921        .enable                 = s2mps11_regulator_enable,
 922        .disable                = regulator_disable_regmap,
 923        .get_voltage_sel        = regulator_get_voltage_sel_regmap,
 924        .set_voltage_sel        = regulator_set_voltage_sel_regmap,
 925        .set_voltage_time_sel   = regulator_set_voltage_time_sel,
 926        .set_suspend_disable    = s2mps11_regulator_set_suspend_disable,
 927};
 928
 929static const struct regulator_ops s2mpu02_buck_ops = {
 930        .list_voltage           = regulator_list_voltage_linear,
 931        .map_voltage            = regulator_map_voltage_linear,
 932        .is_enabled             = regulator_is_enabled_regmap,
 933        .enable                 = s2mps11_regulator_enable,
 934        .disable                = regulator_disable_regmap,
 935        .get_voltage_sel        = regulator_get_voltage_sel_regmap,
 936        .set_voltage_sel        = regulator_set_voltage_sel_regmap,
 937        .set_voltage_time_sel   = regulator_set_voltage_time_sel,
 938        .set_suspend_disable    = s2mps11_regulator_set_suspend_disable,
 939        .set_ramp_delay         = s2mpu02_set_ramp_delay,
 940};
 941
 942#define regulator_desc_s2mpu02_ldo1(num) {              \
 943        .name           = "LDO"#num,                    \
 944        .id             = S2MPU02_LDO##num,             \
 945        .ops            = &s2mpu02_ldo_ops,             \
 946        .type           = REGULATOR_VOLTAGE,            \
 947        .owner          = THIS_MODULE,                  \
 948        .min_uV         = S2MPU02_LDO_MIN_900MV,        \
 949        .uV_step        = S2MPU02_LDO_STEP_12_5MV,      \
 950        .linear_min_sel = S2MPU02_LDO_GROUP1_START_SEL, \
 951        .n_voltages     = S2MPU02_LDO_N_VOLTAGES,       \
 952        .vsel_reg       = S2MPU02_REG_L1CTRL,           \
 953        .vsel_mask      = S2MPU02_LDO_VSEL_MASK,        \
 954        .enable_reg     = S2MPU02_REG_L1CTRL,           \
 955        .enable_mask    = S2MPU02_ENABLE_MASK           \
 956}
 957#define regulator_desc_s2mpu02_ldo2(num) {              \
 958        .name           = "LDO"#num,                    \
 959        .id             = S2MPU02_LDO##num,             \
 960        .ops            = &s2mpu02_ldo_ops,             \
 961        .type           = REGULATOR_VOLTAGE,            \
 962        .owner          = THIS_MODULE,                  \
 963        .min_uV         = S2MPU02_LDO_MIN_1050MV,       \
 964        .uV_step        = S2MPU02_LDO_STEP_25MV,        \
 965        .linear_min_sel = S2MPU02_LDO_GROUP2_START_SEL, \
 966        .n_voltages     = S2MPU02_LDO_N_VOLTAGES,       \
 967        .vsel_reg       = S2MPU02_REG_L2CTRL1,          \
 968        .vsel_mask      = S2MPU02_LDO_VSEL_MASK,        \
 969        .enable_reg     = S2MPU02_REG_L2CTRL1,          \
 970        .enable_mask    = S2MPU02_ENABLE_MASK           \
 971}
 972#define regulator_desc_s2mpu02_ldo3(num) {              \
 973        .name           = "LDO"#num,                    \
 974        .id             = S2MPU02_LDO##num,             \
 975        .ops            = &s2mpu02_ldo_ops,             \
 976        .type           = REGULATOR_VOLTAGE,            \
 977        .owner          = THIS_MODULE,                  \
 978        .min_uV         = S2MPU02_LDO_MIN_900MV,        \
 979        .uV_step        = S2MPU02_LDO_STEP_12_5MV,      \
 980        .linear_min_sel = S2MPU02_LDO_GROUP1_START_SEL, \
 981        .n_voltages     = S2MPU02_LDO_N_VOLTAGES,       \
 982        .vsel_reg       = S2MPU02_REG_L3CTRL + num - 3, \
 983        .vsel_mask      = S2MPU02_LDO_VSEL_MASK,        \
 984        .enable_reg     = S2MPU02_REG_L3CTRL + num - 3, \
 985        .enable_mask    = S2MPU02_ENABLE_MASK           \
 986}
 987#define regulator_desc_s2mpu02_ldo4(num) {              \
 988        .name           = "LDO"#num,                    \
 989        .id             = S2MPU02_LDO##num,             \
 990        .ops            = &s2mpu02_ldo_ops,             \
 991        .type           = REGULATOR_VOLTAGE,            \
 992        .owner          = THIS_MODULE,                  \
 993        .min_uV         = S2MPU02_LDO_MIN_1050MV,       \
 994        .uV_step        = S2MPU02_LDO_STEP_25MV,        \
 995        .linear_min_sel = S2MPU02_LDO_GROUP2_START_SEL, \
 996        .n_voltages     = S2MPU02_LDO_N_VOLTAGES,       \
 997        .vsel_reg       = S2MPU02_REG_L3CTRL + num - 3, \
 998        .vsel_mask      = S2MPU02_LDO_VSEL_MASK,        \
 999        .enable_reg     = S2MPU02_REG_L3CTRL + num - 3, \
1000        .enable_mask    = S2MPU02_ENABLE_MASK           \
1001}
1002#define regulator_desc_s2mpu02_ldo5(num) {              \
1003        .name           = "LDO"#num,                    \
1004        .id             = S2MPU02_LDO##num,             \
1005        .ops            = &s2mpu02_ldo_ops,             \
1006        .type           = REGULATOR_VOLTAGE,            \
1007        .owner          = THIS_MODULE,                  \
1008        .min_uV         = S2MPU02_LDO_MIN_1600MV,       \
1009        .uV_step        = S2MPU02_LDO_STEP_50MV,        \
1010        .linear_min_sel = S2MPU02_LDO_GROUP3_START_SEL, \
1011        .n_voltages     = S2MPU02_LDO_N_VOLTAGES,       \
1012        .vsel_reg       = S2MPU02_REG_L3CTRL + num - 3, \
1013        .vsel_mask      = S2MPU02_LDO_VSEL_MASK,        \
1014        .enable_reg     = S2MPU02_REG_L3CTRL + num - 3, \
1015        .enable_mask    = S2MPU02_ENABLE_MASK           \
1016}
1017
1018#define regulator_desc_s2mpu02_buck1234(num) {                  \
1019        .name           = "BUCK"#num,                           \
1020        .id             = S2MPU02_BUCK##num,                    \
1021        .ops            = &s2mpu02_buck_ops,                    \
1022        .type           = REGULATOR_VOLTAGE,                    \
1023        .owner          = THIS_MODULE,                          \
1024        .min_uV         = S2MPU02_BUCK1234_MIN_600MV,           \
1025        .uV_step        = S2MPU02_BUCK1234_STEP_6_25MV,         \
1026        .n_voltages     = S2MPU02_BUCK_N_VOLTAGES,              \
1027        .linear_min_sel = S2MPU02_BUCK1234_START_SEL,           \
1028        .ramp_delay     = S2MPU02_BUCK_RAMP_DELAY,              \
1029        .vsel_reg       = S2MPU02_REG_B1CTRL2 + (num - 1) * 2,  \
1030        .vsel_mask      = S2MPU02_BUCK_VSEL_MASK,               \
1031        .enable_reg     = S2MPU02_REG_B1CTRL1 + (num - 1) * 2,  \
1032        .enable_mask    = S2MPU02_ENABLE_MASK                   \
1033}
1034#define regulator_desc_s2mpu02_buck5(num) {                     \
1035        .name           = "BUCK"#num,                           \
1036        .id             = S2MPU02_BUCK##num,                    \
1037        .ops            = &s2mpu02_ldo_ops,                     \
1038        .type           = REGULATOR_VOLTAGE,                    \
1039        .owner          = THIS_MODULE,                          \
1040        .min_uV         = S2MPU02_BUCK5_MIN_1081_25MV,          \
1041        .uV_step        = S2MPU02_BUCK5_STEP_6_25MV,            \
1042        .n_voltages     = S2MPU02_BUCK_N_VOLTAGES,              \
1043        .linear_min_sel = S2MPU02_BUCK5_START_SEL,              \
1044        .ramp_delay     = S2MPU02_BUCK_RAMP_DELAY,              \
1045        .vsel_reg       = S2MPU02_REG_B5CTRL2,                  \
1046        .vsel_mask      = S2MPU02_BUCK_VSEL_MASK,               \
1047        .enable_reg     = S2MPU02_REG_B5CTRL1,                  \
1048        .enable_mask    = S2MPU02_ENABLE_MASK                   \
1049}
1050#define regulator_desc_s2mpu02_buck6(num) {                     \
1051        .name           = "BUCK"#num,                           \
1052        .id             = S2MPU02_BUCK##num,                    \
1053        .ops            = &s2mpu02_ldo_ops,                     \
1054        .type           = REGULATOR_VOLTAGE,                    \
1055        .owner          = THIS_MODULE,                          \
1056        .min_uV         = S2MPU02_BUCK6_MIN_1700MV,             \
1057        .uV_step        = S2MPU02_BUCK6_STEP_2_50MV,            \
1058        .n_voltages     = S2MPU02_BUCK_N_VOLTAGES,              \
1059        .linear_min_sel = S2MPU02_BUCK6_START_SEL,              \
1060        .ramp_delay     = S2MPU02_BUCK_RAMP_DELAY,              \
1061        .vsel_reg       = S2MPU02_REG_B6CTRL2,                  \
1062        .vsel_mask      = S2MPU02_BUCK_VSEL_MASK,               \
1063        .enable_reg     = S2MPU02_REG_B6CTRL1,                  \
1064        .enable_mask    = S2MPU02_ENABLE_MASK                   \
1065}
1066#define regulator_desc_s2mpu02_buck7(num) {                     \
1067        .name           = "BUCK"#num,                           \
1068        .id             = S2MPU02_BUCK##num,                    \
1069        .ops            = &s2mpu02_ldo_ops,                     \
1070        .type           = REGULATOR_VOLTAGE,                    \
1071        .owner          = THIS_MODULE,                          \
1072        .min_uV         = S2MPU02_BUCK7_MIN_900MV,              \
1073        .uV_step        = S2MPU02_BUCK7_STEP_6_25MV,            \
1074        .n_voltages     = S2MPU02_BUCK_N_VOLTAGES,              \
1075        .linear_min_sel = S2MPU02_BUCK7_START_SEL,              \
1076        .ramp_delay     = S2MPU02_BUCK_RAMP_DELAY,              \
1077        .vsel_reg       = S2MPU02_REG_B7CTRL2,                  \
1078        .vsel_mask      = S2MPU02_BUCK_VSEL_MASK,               \
1079        .enable_reg     = S2MPU02_REG_B7CTRL1,                  \
1080        .enable_mask    = S2MPU02_ENABLE_MASK                   \
1081}
1082
1083static const struct regulator_desc s2mpu02_regulators[] = {
1084        regulator_desc_s2mpu02_ldo1(1),
1085        regulator_desc_s2mpu02_ldo2(2),
1086        regulator_desc_s2mpu02_ldo4(3),
1087        regulator_desc_s2mpu02_ldo5(4),
1088        regulator_desc_s2mpu02_ldo4(5),
1089        regulator_desc_s2mpu02_ldo3(6),
1090        regulator_desc_s2mpu02_ldo3(7),
1091        regulator_desc_s2mpu02_ldo4(8),
1092        regulator_desc_s2mpu02_ldo5(9),
1093        regulator_desc_s2mpu02_ldo3(10),
1094        regulator_desc_s2mpu02_ldo4(11),
1095        regulator_desc_s2mpu02_ldo5(12),
1096        regulator_desc_s2mpu02_ldo5(13),
1097        regulator_desc_s2mpu02_ldo5(14),
1098        regulator_desc_s2mpu02_ldo5(15),
1099        regulator_desc_s2mpu02_ldo5(16),
1100        regulator_desc_s2mpu02_ldo4(17),
1101        regulator_desc_s2mpu02_ldo5(18),
1102        regulator_desc_s2mpu02_ldo3(19),
1103        regulator_desc_s2mpu02_ldo4(20),
1104        regulator_desc_s2mpu02_ldo5(21),
1105        regulator_desc_s2mpu02_ldo5(22),
1106        regulator_desc_s2mpu02_ldo5(23),
1107        regulator_desc_s2mpu02_ldo4(24),
1108        regulator_desc_s2mpu02_ldo5(25),
1109        regulator_desc_s2mpu02_ldo4(26),
1110        regulator_desc_s2mpu02_ldo5(27),
1111        regulator_desc_s2mpu02_ldo5(28),
1112        regulator_desc_s2mpu02_buck1234(1),
1113        regulator_desc_s2mpu02_buck1234(2),
1114        regulator_desc_s2mpu02_buck1234(3),
1115        regulator_desc_s2mpu02_buck1234(4),
1116        regulator_desc_s2mpu02_buck5(5),
1117        regulator_desc_s2mpu02_buck6(6),
1118        regulator_desc_s2mpu02_buck7(7),
1119};
1120
1121static int s2mps11_pmic_probe(struct platform_device *pdev)
1122{
1123        struct sec_pmic_dev *iodev = dev_get_drvdata(pdev->dev.parent);
1124        struct sec_platform_data *pdata = NULL;
1125        struct of_regulator_match *rdata = NULL;
1126        struct regulator_config config = { };
1127        struct s2mps11_info *s2mps11;
1128        unsigned int rdev_num = 0;
1129        int i, ret = 0;
1130        const struct regulator_desc *regulators;
1131
1132        s2mps11 = devm_kzalloc(&pdev->dev, sizeof(struct s2mps11_info),
1133                                GFP_KERNEL);
1134        if (!s2mps11)
1135                return -ENOMEM;
1136
1137        s2mps11->dev_type = platform_get_device_id(pdev)->driver_data;
1138        switch (s2mps11->dev_type) {
1139        case S2MPS11X:
1140                rdev_num = ARRAY_SIZE(s2mps11_regulators);
1141                regulators = s2mps11_regulators;
1142                BUILD_BUG_ON(S2MPS_REGULATOR_MAX < ARRAY_SIZE(s2mps11_regulators));
1143                break;
1144        case S2MPS13X:
1145                rdev_num = ARRAY_SIZE(s2mps13_regulators);
1146                regulators = s2mps13_regulators;
1147                BUILD_BUG_ON(S2MPS_REGULATOR_MAX < ARRAY_SIZE(s2mps13_regulators));
1148                break;
1149        case S2MPS14X:
1150                rdev_num = ARRAY_SIZE(s2mps14_regulators);
1151                regulators = s2mps14_regulators;
1152                BUILD_BUG_ON(S2MPS_REGULATOR_MAX < ARRAY_SIZE(s2mps14_regulators));
1153                break;
1154        case S2MPS15X:
1155                rdev_num = ARRAY_SIZE(s2mps15_regulators);
1156                regulators = s2mps15_regulators;
1157                BUILD_BUG_ON(S2MPS_REGULATOR_MAX < ARRAY_SIZE(s2mps15_regulators));
1158                break;
1159        case S2MPU02:
1160                rdev_num = ARRAY_SIZE(s2mpu02_regulators);
1161                regulators = s2mpu02_regulators;
1162                BUILD_BUG_ON(S2MPS_REGULATOR_MAX < ARRAY_SIZE(s2mpu02_regulators));
1163                break;
1164        default:
1165                dev_err(&pdev->dev, "Invalid device type: %u\n",
1166                                    s2mps11->dev_type);
1167                return -EINVAL;
1168        }
1169
1170        s2mps11->ext_control_gpiod = devm_kcalloc(&pdev->dev, rdev_num,
1171                               sizeof(*s2mps11->ext_control_gpiod), GFP_KERNEL);
1172        if (!s2mps11->ext_control_gpiod)
1173                return -ENOMEM;
1174
1175        if (!iodev->dev->of_node) {
1176                if (iodev->pdata) {
1177                        pdata = iodev->pdata;
1178                        goto common_reg;
1179                } else {
1180                        dev_err(pdev->dev.parent,
1181                                "Platform data or DT node not supplied\n");
1182                        return -ENODEV;
1183                }
1184        }
1185
1186        rdata = kcalloc(rdev_num, sizeof(*rdata), GFP_KERNEL);
1187        if (!rdata)
1188                return -ENOMEM;
1189
1190        for (i = 0; i < rdev_num; i++)
1191                rdata[i].name = regulators[i].name;
1192
1193        ret = s2mps11_pmic_dt_parse(pdev, rdata, s2mps11, rdev_num);
1194        if (ret)
1195                goto out;
1196
1197common_reg:
1198        platform_set_drvdata(pdev, s2mps11);
1199
1200        config.dev = &pdev->dev;
1201        config.regmap = iodev->regmap_pmic;
1202        config.driver_data = s2mps11;
1203        for (i = 0; i < rdev_num; i++) {
1204                struct regulator_dev *regulator;
1205
1206                if (pdata) {
1207                        config.init_data = pdata->regulators[i].initdata;
1208                        config.of_node = pdata->regulators[i].reg_node;
1209                } else {
1210                        config.init_data = rdata[i].init_data;
1211                        config.of_node = rdata[i].of_node;
1212                }
1213                config.ena_gpiod = s2mps11->ext_control_gpiod[i];
1214                /*
1215                 * Hand the GPIO descriptor management over to the regulator
1216                 * core, remove it from devres management.
1217                 */
1218                if (config.ena_gpiod)
1219                        devm_gpiod_unhinge(&pdev->dev, config.ena_gpiod);
1220                regulator = devm_regulator_register(&pdev->dev,
1221                                                &regulators[i], &config);
1222                if (IS_ERR(regulator)) {
1223                        ret = PTR_ERR(regulator);
1224                        dev_err(&pdev->dev, "regulator init failed for %d\n",
1225                                i);
1226                        goto out;
1227                }
1228
1229                if (s2mps11->ext_control_gpiod[i]) {
1230                        ret = s2mps14_pmic_enable_ext_control(s2mps11,
1231                                        regulator);
1232                        if (ret < 0) {
1233                                dev_err(&pdev->dev,
1234                                                "failed to enable GPIO control over %s: %d\n",
1235                                                regulator->desc->name, ret);
1236                                goto out;
1237                        }
1238                }
1239        }
1240
1241out:
1242        kfree(rdata);
1243
1244        return ret;
1245}
1246
1247static const struct platform_device_id s2mps11_pmic_id[] = {
1248        { "s2mps11-regulator", S2MPS11X},
1249        { "s2mps13-regulator", S2MPS13X},
1250        { "s2mps14-regulator", S2MPS14X},
1251        { "s2mps15-regulator", S2MPS15X},
1252        { "s2mpu02-regulator", S2MPU02},
1253        { },
1254};
1255MODULE_DEVICE_TABLE(platform, s2mps11_pmic_id);
1256
1257static struct platform_driver s2mps11_pmic_driver = {
1258        .driver = {
1259                .name = "s2mps11-pmic",
1260        },
1261        .probe = s2mps11_pmic_probe,
1262        .id_table = s2mps11_pmic_id,
1263};
1264
1265module_platform_driver(s2mps11_pmic_driver);
1266
1267/* Module information */
1268MODULE_AUTHOR("Sangbeom Kim <sbkim73@samsung.com>");
1269MODULE_DESCRIPTION("SAMSUNG S2MPS11/S2MPS14/S2MPS15/S2MPU02 Regulator Driver");
1270MODULE_LICENSE("GPL");
1271