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 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 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 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 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 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 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 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_fwnode_gpiod_get(&pdev->dev,
 848                                of_fwnode_handle(rdata[reg].of_node),
 849                                "samsung,ext-control",
 850                                GPIOD_OUT_HIGH | GPIOD_FLAGS_BIT_NONEXCLUSIVE,
 851                                "s2mps11-regulator");
 852                if (PTR_ERR(gpio[reg]) == -ENOENT)
 853                        gpio[reg] = NULL;
 854                else if (IS_ERR(gpio[reg])) {
 855                        dev_err(&pdev->dev, "Failed to get control GPIO for %d/%s\n",
 856                                reg, rdata[reg].name);
 857                        gpio[reg] = NULL;
 858                        continue;
 859                }
 860                if (gpio[reg])
 861                        dev_dbg(&pdev->dev, "Using GPIO for ext-control over %d/%s\n",
 862                                reg, rdata[reg].name);
 863        }
 864}
 865
 866static int s2mps11_pmic_dt_parse(struct platform_device *pdev,
 867                struct of_regulator_match *rdata, struct s2mps11_info *s2mps11,
 868                unsigned int rdev_num)
 869{
 870        struct device_node *reg_np;
 871
 872        reg_np = of_get_child_by_name(pdev->dev.parent->of_node, "regulators");
 873        if (!reg_np) {
 874                dev_err(&pdev->dev, "could not find regulators sub-node\n");
 875                return -EINVAL;
 876        }
 877
 878        of_regulator_match(&pdev->dev, reg_np, rdata, rdev_num);
 879        if (s2mps11->dev_type == S2MPS14X)
 880                s2mps14_pmic_dt_parse_ext_control_gpio(pdev, rdata, s2mps11);
 881
 882        of_node_put(reg_np);
 883
 884        return 0;
 885}
 886
 887static int s2mpu02_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
 888{
 889        unsigned int ramp_val, ramp_shift, ramp_reg;
 890        int rdev_id = rdev_get_id(rdev);
 891
 892        switch (rdev_id) {
 893        case S2MPU02_BUCK1:
 894                ramp_shift = S2MPU02_BUCK1_RAMP_SHIFT;
 895                break;
 896        case S2MPU02_BUCK2:
 897                ramp_shift = S2MPU02_BUCK2_RAMP_SHIFT;
 898                break;
 899        case S2MPU02_BUCK3:
 900                ramp_shift = S2MPU02_BUCK3_RAMP_SHIFT;
 901                break;
 902        case S2MPU02_BUCK4:
 903                ramp_shift = S2MPU02_BUCK4_RAMP_SHIFT;
 904                break;
 905        default:
 906                return 0;
 907        }
 908        ramp_reg = S2MPU02_REG_RAMP1;
 909        ramp_val = get_ramp_delay(ramp_delay);
 910
 911        return regmap_update_bits(rdev->regmap, ramp_reg,
 912                                  S2MPU02_BUCK1234_RAMP_MASK << ramp_shift,
 913                                  ramp_val << ramp_shift);
 914}
 915
 916static const struct regulator_ops s2mpu02_ldo_ops = {
 917        .list_voltage           = regulator_list_voltage_linear,
 918        .map_voltage            = regulator_map_voltage_linear,
 919        .is_enabled             = regulator_is_enabled_regmap,
 920        .enable                 = s2mps11_regulator_enable,
 921        .disable                = regulator_disable_regmap,
 922        .get_voltage_sel        = regulator_get_voltage_sel_regmap,
 923        .set_voltage_sel        = regulator_set_voltage_sel_regmap,
 924        .set_voltage_time_sel   = regulator_set_voltage_time_sel,
 925        .set_suspend_disable    = s2mps11_regulator_set_suspend_disable,
 926};
 927
 928static const struct regulator_ops s2mpu02_buck_ops = {
 929        .list_voltage           = regulator_list_voltage_linear,
 930        .map_voltage            = regulator_map_voltage_linear,
 931        .is_enabled             = regulator_is_enabled_regmap,
 932        .enable                 = s2mps11_regulator_enable,
 933        .disable                = regulator_disable_regmap,
 934        .get_voltage_sel        = regulator_get_voltage_sel_regmap,
 935        .set_voltage_sel        = regulator_set_voltage_sel_regmap,
 936        .set_voltage_time_sel   = regulator_set_voltage_time_sel,
 937        .set_suspend_disable    = s2mps11_regulator_set_suspend_disable,
 938        .set_ramp_delay         = s2mpu02_set_ramp_delay,
 939};
 940
 941#define regulator_desc_s2mpu02_ldo1(num) {              \
 942        .name           = "LDO"#num,                    \
 943        .id             = S2MPU02_LDO##num,             \
 944        .ops            = &s2mpu02_ldo_ops,             \
 945        .type           = REGULATOR_VOLTAGE,            \
 946        .owner          = THIS_MODULE,                  \
 947        .min_uV         = S2MPU02_LDO_MIN_900MV,        \
 948        .uV_step        = S2MPU02_LDO_STEP_12_5MV,      \
 949        .linear_min_sel = S2MPU02_LDO_GROUP1_START_SEL, \
 950        .n_voltages     = S2MPU02_LDO_N_VOLTAGES,       \
 951        .vsel_reg       = S2MPU02_REG_L1CTRL,           \
 952        .vsel_mask      = S2MPU02_LDO_VSEL_MASK,        \
 953        .enable_reg     = S2MPU02_REG_L1CTRL,           \
 954        .enable_mask    = S2MPU02_ENABLE_MASK           \
 955}
 956#define regulator_desc_s2mpu02_ldo2(num) {              \
 957        .name           = "LDO"#num,                    \
 958        .id             = S2MPU02_LDO##num,             \
 959        .ops            = &s2mpu02_ldo_ops,             \
 960        .type           = REGULATOR_VOLTAGE,            \
 961        .owner          = THIS_MODULE,                  \
 962        .min_uV         = S2MPU02_LDO_MIN_1050MV,       \
 963        .uV_step        = S2MPU02_LDO_STEP_25MV,        \
 964        .linear_min_sel = S2MPU02_LDO_GROUP2_START_SEL, \
 965        .n_voltages     = S2MPU02_LDO_N_VOLTAGES,       \
 966        .vsel_reg       = S2MPU02_REG_L2CTRL1,          \
 967        .vsel_mask      = S2MPU02_LDO_VSEL_MASK,        \
 968        .enable_reg     = S2MPU02_REG_L2CTRL1,          \
 969        .enable_mask    = S2MPU02_ENABLE_MASK           \
 970}
 971#define regulator_desc_s2mpu02_ldo3(num) {              \
 972        .name           = "LDO"#num,                    \
 973        .id             = S2MPU02_LDO##num,             \
 974        .ops            = &s2mpu02_ldo_ops,             \
 975        .type           = REGULATOR_VOLTAGE,            \
 976        .owner          = THIS_MODULE,                  \
 977        .min_uV         = S2MPU02_LDO_MIN_900MV,        \
 978        .uV_step        = S2MPU02_LDO_STEP_12_5MV,      \
 979        .linear_min_sel = S2MPU02_LDO_GROUP1_START_SEL, \
 980        .n_voltages     = S2MPU02_LDO_N_VOLTAGES,       \
 981        .vsel_reg       = S2MPU02_REG_L3CTRL + num - 3, \
 982        .vsel_mask      = S2MPU02_LDO_VSEL_MASK,        \
 983        .enable_reg     = S2MPU02_REG_L3CTRL + num - 3, \
 984        .enable_mask    = S2MPU02_ENABLE_MASK           \
 985}
 986#define regulator_desc_s2mpu02_ldo4(num) {              \
 987        .name           = "LDO"#num,                    \
 988        .id             = S2MPU02_LDO##num,             \
 989        .ops            = &s2mpu02_ldo_ops,             \
 990        .type           = REGULATOR_VOLTAGE,            \
 991        .owner          = THIS_MODULE,                  \
 992        .min_uV         = S2MPU02_LDO_MIN_1050MV,       \
 993        .uV_step        = S2MPU02_LDO_STEP_25MV,        \
 994        .linear_min_sel = S2MPU02_LDO_GROUP2_START_SEL, \
 995        .n_voltages     = S2MPU02_LDO_N_VOLTAGES,       \
 996        .vsel_reg       = S2MPU02_REG_L3CTRL + num - 3, \
 997        .vsel_mask      = S2MPU02_LDO_VSEL_MASK,        \
 998        .enable_reg     = S2MPU02_REG_L3CTRL + num - 3, \
 999        .enable_mask    = S2MPU02_ENABLE_MASK           \
1000}
1001#define regulator_desc_s2mpu02_ldo5(num) {              \
1002        .name           = "LDO"#num,                    \
1003        .id             = S2MPU02_LDO##num,             \
1004        .ops            = &s2mpu02_ldo_ops,             \
1005        .type           = REGULATOR_VOLTAGE,            \
1006        .owner          = THIS_MODULE,                  \
1007        .min_uV         = S2MPU02_LDO_MIN_1600MV,       \
1008        .uV_step        = S2MPU02_LDO_STEP_50MV,        \
1009        .linear_min_sel = S2MPU02_LDO_GROUP3_START_SEL, \
1010        .n_voltages     = S2MPU02_LDO_N_VOLTAGES,       \
1011        .vsel_reg       = S2MPU02_REG_L3CTRL + num - 3, \
1012        .vsel_mask      = S2MPU02_LDO_VSEL_MASK,        \
1013        .enable_reg     = S2MPU02_REG_L3CTRL + num - 3, \
1014        .enable_mask    = S2MPU02_ENABLE_MASK           \
1015}
1016
1017#define regulator_desc_s2mpu02_buck1234(num) {                  \
1018        .name           = "BUCK"#num,                           \
1019        .id             = S2MPU02_BUCK##num,                    \
1020        .ops            = &s2mpu02_buck_ops,                    \
1021        .type           = REGULATOR_VOLTAGE,                    \
1022        .owner          = THIS_MODULE,                          \
1023        .min_uV         = S2MPU02_BUCK1234_MIN_600MV,           \
1024        .uV_step        = S2MPU02_BUCK1234_STEP_6_25MV,         \
1025        .n_voltages     = S2MPU02_BUCK_N_VOLTAGES,              \
1026        .linear_min_sel = S2MPU02_BUCK1234_START_SEL,           \
1027        .ramp_delay     = S2MPU02_BUCK_RAMP_DELAY,              \
1028        .vsel_reg       = S2MPU02_REG_B1CTRL2 + (num - 1) * 2,  \
1029        .vsel_mask      = S2MPU02_BUCK_VSEL_MASK,               \
1030        .enable_reg     = S2MPU02_REG_B1CTRL1 + (num - 1) * 2,  \
1031        .enable_mask    = S2MPU02_ENABLE_MASK                   \
1032}
1033#define regulator_desc_s2mpu02_buck5(num) {                     \
1034        .name           = "BUCK"#num,                           \
1035        .id             = S2MPU02_BUCK##num,                    \
1036        .ops            = &s2mpu02_ldo_ops,                     \
1037        .type           = REGULATOR_VOLTAGE,                    \
1038        .owner          = THIS_MODULE,                          \
1039        .min_uV         = S2MPU02_BUCK5_MIN_1081_25MV,          \
1040        .uV_step        = S2MPU02_BUCK5_STEP_6_25MV,            \
1041        .n_voltages     = S2MPU02_BUCK_N_VOLTAGES,              \
1042        .linear_min_sel = S2MPU02_BUCK5_START_SEL,              \
1043        .ramp_delay     = S2MPU02_BUCK_RAMP_DELAY,              \
1044        .vsel_reg       = S2MPU02_REG_B5CTRL2,                  \
1045        .vsel_mask      = S2MPU02_BUCK_VSEL_MASK,               \
1046        .enable_reg     = S2MPU02_REG_B5CTRL1,                  \
1047        .enable_mask    = S2MPU02_ENABLE_MASK                   \
1048}
1049#define regulator_desc_s2mpu02_buck6(num) {                     \
1050        .name           = "BUCK"#num,                           \
1051        .id             = S2MPU02_BUCK##num,                    \
1052        .ops            = &s2mpu02_ldo_ops,                     \
1053        .type           = REGULATOR_VOLTAGE,                    \
1054        .owner          = THIS_MODULE,                          \
1055        .min_uV         = S2MPU02_BUCK6_MIN_1700MV,             \
1056        .uV_step        = S2MPU02_BUCK6_STEP_2_50MV,            \
1057        .n_voltages     = S2MPU02_BUCK_N_VOLTAGES,              \
1058        .linear_min_sel = S2MPU02_BUCK6_START_SEL,              \
1059        .ramp_delay     = S2MPU02_BUCK_RAMP_DELAY,              \
1060        .vsel_reg       = S2MPU02_REG_B6CTRL2,                  \
1061        .vsel_mask      = S2MPU02_BUCK_VSEL_MASK,               \
1062        .enable_reg     = S2MPU02_REG_B6CTRL1,                  \
1063        .enable_mask    = S2MPU02_ENABLE_MASK                   \
1064}
1065#define regulator_desc_s2mpu02_buck7(num) {                     \
1066        .name           = "BUCK"#num,                           \
1067        .id             = S2MPU02_BUCK##num,                    \
1068        .ops            = &s2mpu02_ldo_ops,                     \
1069        .type           = REGULATOR_VOLTAGE,                    \
1070        .owner          = THIS_MODULE,                          \
1071        .min_uV         = S2MPU02_BUCK7_MIN_900MV,              \
1072        .uV_step        = S2MPU02_BUCK7_STEP_6_25MV,            \
1073        .n_voltages     = S2MPU02_BUCK_N_VOLTAGES,              \
1074        .linear_min_sel = S2MPU02_BUCK7_START_SEL,              \
1075        .ramp_delay     = S2MPU02_BUCK_RAMP_DELAY,              \
1076        .vsel_reg       = S2MPU02_REG_B7CTRL2,                  \
1077        .vsel_mask      = S2MPU02_BUCK_VSEL_MASK,               \
1078        .enable_reg     = S2MPU02_REG_B7CTRL1,                  \
1079        .enable_mask    = S2MPU02_ENABLE_MASK                   \
1080}
1081
1082static const struct regulator_desc s2mpu02_regulators[] = {
1083        regulator_desc_s2mpu02_ldo1(1),
1084        regulator_desc_s2mpu02_ldo2(2),
1085        regulator_desc_s2mpu02_ldo4(3),
1086        regulator_desc_s2mpu02_ldo5(4),
1087        regulator_desc_s2mpu02_ldo4(5),
1088        regulator_desc_s2mpu02_ldo3(6),
1089        regulator_desc_s2mpu02_ldo3(7),
1090        regulator_desc_s2mpu02_ldo4(8),
1091        regulator_desc_s2mpu02_ldo5(9),
1092        regulator_desc_s2mpu02_ldo3(10),
1093        regulator_desc_s2mpu02_ldo4(11),
1094        regulator_desc_s2mpu02_ldo5(12),
1095        regulator_desc_s2mpu02_ldo5(13),
1096        regulator_desc_s2mpu02_ldo5(14),
1097        regulator_desc_s2mpu02_ldo5(15),
1098        regulator_desc_s2mpu02_ldo5(16),
1099        regulator_desc_s2mpu02_ldo4(17),
1100        regulator_desc_s2mpu02_ldo5(18),
1101        regulator_desc_s2mpu02_ldo3(19),
1102        regulator_desc_s2mpu02_ldo4(20),
1103        regulator_desc_s2mpu02_ldo5(21),
1104        regulator_desc_s2mpu02_ldo5(22),
1105        regulator_desc_s2mpu02_ldo5(23),
1106        regulator_desc_s2mpu02_ldo4(24),
1107        regulator_desc_s2mpu02_ldo5(25),
1108        regulator_desc_s2mpu02_ldo4(26),
1109        regulator_desc_s2mpu02_ldo5(27),
1110        regulator_desc_s2mpu02_ldo5(28),
1111        regulator_desc_s2mpu02_buck1234(1),
1112        regulator_desc_s2mpu02_buck1234(2),
1113        regulator_desc_s2mpu02_buck1234(3),
1114        regulator_desc_s2mpu02_buck1234(4),
1115        regulator_desc_s2mpu02_buck5(5),
1116        regulator_desc_s2mpu02_buck6(6),
1117        regulator_desc_s2mpu02_buck7(7),
1118};
1119
1120static int s2mps11_pmic_probe(struct platform_device *pdev)
1121{
1122        struct sec_pmic_dev *iodev = dev_get_drvdata(pdev->dev.parent);
1123        struct of_regulator_match *rdata = NULL;
1124        struct regulator_config config = { };
1125        struct s2mps11_info *s2mps11;
1126        unsigned int rdev_num = 0;
1127        int i, ret = 0;
1128        const struct regulator_desc *regulators;
1129
1130        s2mps11 = devm_kzalloc(&pdev->dev, sizeof(struct s2mps11_info),
1131                                GFP_KERNEL);
1132        if (!s2mps11)
1133                return -ENOMEM;
1134
1135        s2mps11->dev_type = platform_get_device_id(pdev)->driver_data;
1136        switch (s2mps11->dev_type) {
1137        case S2MPS11X:
1138                rdev_num = ARRAY_SIZE(s2mps11_regulators);
1139                regulators = s2mps11_regulators;
1140                BUILD_BUG_ON(S2MPS_REGULATOR_MAX < ARRAY_SIZE(s2mps11_regulators));
1141                break;
1142        case S2MPS13X:
1143                rdev_num = ARRAY_SIZE(s2mps13_regulators);
1144                regulators = s2mps13_regulators;
1145                BUILD_BUG_ON(S2MPS_REGULATOR_MAX < ARRAY_SIZE(s2mps13_regulators));
1146                break;
1147        case S2MPS14X:
1148                rdev_num = ARRAY_SIZE(s2mps14_regulators);
1149                regulators = s2mps14_regulators;
1150                BUILD_BUG_ON(S2MPS_REGULATOR_MAX < ARRAY_SIZE(s2mps14_regulators));
1151                break;
1152        case S2MPS15X:
1153                rdev_num = ARRAY_SIZE(s2mps15_regulators);
1154                regulators = s2mps15_regulators;
1155                BUILD_BUG_ON(S2MPS_REGULATOR_MAX < ARRAY_SIZE(s2mps15_regulators));
1156                break;
1157        case S2MPU02:
1158                rdev_num = ARRAY_SIZE(s2mpu02_regulators);
1159                regulators = s2mpu02_regulators;
1160                BUILD_BUG_ON(S2MPS_REGULATOR_MAX < ARRAY_SIZE(s2mpu02_regulators));
1161                break;
1162        default:
1163                dev_err(&pdev->dev, "Invalid device type: %u\n",
1164                                    s2mps11->dev_type);
1165                return -EINVAL;
1166        }
1167
1168        s2mps11->ext_control_gpiod = devm_kcalloc(&pdev->dev, rdev_num,
1169                               sizeof(*s2mps11->ext_control_gpiod), GFP_KERNEL);
1170        if (!s2mps11->ext_control_gpiod)
1171                return -ENOMEM;
1172
1173        rdata = kcalloc(rdev_num, sizeof(*rdata), GFP_KERNEL);
1174        if (!rdata)
1175                return -ENOMEM;
1176
1177        for (i = 0; i < rdev_num; i++)
1178                rdata[i].name = regulators[i].name;
1179
1180        ret = s2mps11_pmic_dt_parse(pdev, rdata, s2mps11, rdev_num);
1181        if (ret)
1182                goto out;
1183
1184        platform_set_drvdata(pdev, s2mps11);
1185
1186        config.dev = &pdev->dev;
1187        config.regmap = iodev->regmap_pmic;
1188        config.driver_data = s2mps11;
1189        for (i = 0; i < rdev_num; i++) {
1190                struct regulator_dev *regulator;
1191
1192                config.init_data = rdata[i].init_data;
1193                config.of_node = rdata[i].of_node;
1194                config.ena_gpiod = s2mps11->ext_control_gpiod[i];
1195                /*
1196                 * Hand the GPIO descriptor management over to the regulator
1197                 * core, remove it from devres management.
1198                 */
1199                if (config.ena_gpiod)
1200                        devm_gpiod_unhinge(&pdev->dev, config.ena_gpiod);
1201                regulator = devm_regulator_register(&pdev->dev,
1202                                                &regulators[i], &config);
1203                if (IS_ERR(regulator)) {
1204                        ret = PTR_ERR(regulator);
1205                        dev_err(&pdev->dev, "regulator init failed for %d\n",
1206                                i);
1207                        goto out;
1208                }
1209
1210                if (config.ena_gpiod) {
1211                        ret = s2mps14_pmic_enable_ext_control(s2mps11,
1212                                        regulator);
1213                        if (ret < 0) {
1214                                dev_err(&pdev->dev,
1215                                                "failed to enable GPIO control over %s: %d\n",
1216                                                regulator->desc->name, ret);
1217                                goto out;
1218                        }
1219                }
1220        }
1221
1222out:
1223        kfree(rdata);
1224
1225        return ret;
1226}
1227
1228static const struct platform_device_id s2mps11_pmic_id[] = {
1229        { "s2mps11-regulator", S2MPS11X},
1230        { "s2mps13-regulator", S2MPS13X},
1231        { "s2mps14-regulator", S2MPS14X},
1232        { "s2mps15-regulator", S2MPS15X},
1233        { "s2mpu02-regulator", S2MPU02},
1234        { },
1235};
1236MODULE_DEVICE_TABLE(platform, s2mps11_pmic_id);
1237
1238static struct platform_driver s2mps11_pmic_driver = {
1239        .driver = {
1240                .name = "s2mps11-pmic",
1241        },
1242        .probe = s2mps11_pmic_probe,
1243        .id_table = s2mps11_pmic_id,
1244};
1245
1246module_platform_driver(s2mps11_pmic_driver);
1247
1248/* Module information */
1249MODULE_AUTHOR("Sangbeom Kim <sbkim73@samsung.com>");
1250MODULE_DESCRIPTION("Samsung S2MPS11/S2MPS14/S2MPS15/S2MPU02 Regulator Driver");
1251MODULE_LICENSE("GPL");
1252