root/drivers/regulator/bd718x7-regulator.c

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

DEFINITIONS

This source file includes following definitions.
  1. bd718xx_buck1234_set_ramp_delay
  2. bd718xx_set_voltage_sel_restricted
  3. bd718xx_set_voltage_sel_pickable_restricted
  4. set_dvs_levels
  5. buck4_set_hw_dvs_levels
  6. buck3_set_hw_dvs_levels
  7. buck2_set_hw_dvs_levels
  8. buck1_set_hw_dvs_levels
  9. bd718xx_probe

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

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