1 // SPDX-License-Identifier: GPL-2.0-only 2 // Copyright (C) 2019 ROHM Semiconductors 3 // bd71828-regulator.c ROHM BD71828GW-DS1 regulator driver 4 // 5 6 #include <linux/delay.h> 7 #include <linux/err.h> 8 #include <linux/gpio.h> 9 #include <linux/interrupt.h> 10 #include <linux/kernel.h> 11 #include <linux/mfd/rohm-bd71828.h> 12 #include <linux/module.h> 13 #include <linux/of.h> 14 #include <linux/platform_device.h> 15 #include <linux/regmap.h> 16 #include <linux/regulator/driver.h> 17 #include <linux/regulator/machine.h> 18 #include <linux/regulator/of_regulator.h> 19 20 struct reg_init { 21 unsigned int reg; 22 unsigned int mask; 23 unsigned int val; 24 }; 25 struct bd71828_regulator_data { 26 struct regulator_desc desc; 27 const struct rohm_dvs_config dvs; 28 const struct reg_init *reg_inits; 29 int reg_init_amnt; 30 }; 31 32 static const struct reg_init buck1_inits[] = { 33 /* 34 * DVS Buck voltages can be changed by register values or via GPIO. 35 * Use register accesses by default. 36 */ 37 { 38 .reg = BD71828_REG_PS_CTRL_1, 39 .mask = BD71828_MASK_DVS_BUCK1_CTRL, 40 .val = BD71828_DVS_BUCK1_CTRL_I2C, 41 }, 42 }; 43 44 static const struct reg_init buck2_inits[] = { 45 { 46 .reg = BD71828_REG_PS_CTRL_1, 47 .mask = BD71828_MASK_DVS_BUCK2_CTRL, 48 .val = BD71828_DVS_BUCK2_CTRL_I2C, 49 }, 50 }; 51 52 static const struct reg_init buck6_inits[] = { 53 { 54 .reg = BD71828_REG_PS_CTRL_1, 55 .mask = BD71828_MASK_DVS_BUCK6_CTRL, 56 .val = BD71828_DVS_BUCK6_CTRL_I2C, 57 }, 58 }; 59 60 static const struct reg_init buck7_inits[] = { 61 { 62 .reg = BD71828_REG_PS_CTRL_1, 63 .mask = BD71828_MASK_DVS_BUCK7_CTRL, 64 .val = BD71828_DVS_BUCK7_CTRL_I2C, 65 }, 66 }; 67 68 static const struct linear_range bd71828_buck1267_volts[] = { 69 REGULATOR_LINEAR_RANGE(500000, 0x00, 0xef, 6250), 70 REGULATOR_LINEAR_RANGE(2000000, 0xf0, 0xff, 0), 71 }; 72 73 static const struct linear_range bd71828_buck3_volts[] = { 74 REGULATOR_LINEAR_RANGE(1200000, 0x00, 0x0f, 50000), 75 REGULATOR_LINEAR_RANGE(2000000, 0x10, 0x1f, 0), 76 }; 77 78 static const struct linear_range bd71828_buck4_volts[] = { 79 REGULATOR_LINEAR_RANGE(1000000, 0x00, 0x1f, 25000), 80 REGULATOR_LINEAR_RANGE(1800000, 0x20, 0x3f, 0), 81 }; 82 83 static const struct linear_range bd71828_buck5_volts[] = { 84 REGULATOR_LINEAR_RANGE(2500000, 0x00, 0x0f, 50000), 85 REGULATOR_LINEAR_RANGE(3300000, 0x10, 0x1f, 0), 86 }; 87 88 static const struct linear_range bd71828_ldo_volts[] = { 89 REGULATOR_LINEAR_RANGE(800000, 0x00, 0x31, 50000), 90 REGULATOR_LINEAR_RANGE(3300000, 0x32, 0x3f, 0), 91 }; 92 93 static int bd71828_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay) 94 { 95 unsigned int val; 96 97 switch (ramp_delay) { 98 case 1 ... 2500: 99 val = 0; 100 break; 101 case 2501 ... 5000: 102 val = 1; 103 break; 104 case 5001 ... 10000: 105 val = 2; 106 break; 107 case 10001 ... 20000: 108 val = 3; 109 break; 110 default: 111 val = 3; 112 dev_err(&rdev->dev, 113 "ramp_delay: %d not supported, setting 20mV/uS", 114 ramp_delay); 115 } 116 117 /* 118 * On BD71828 the ramp delay level control reg is at offset +2 to 119 * enable reg 120 */ 121 return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg + 2, 122 BD71828_MASK_RAMP_DELAY, 123 val << (ffs(BD71828_MASK_RAMP_DELAY) - 1)); 124 } 125 126 static int buck_set_hw_dvs_levels(struct device_node *np, 127 const struct regulator_desc *desc, 128 struct regulator_config *cfg) 129 { 130 struct bd71828_regulator_data *data; 131 132 data = container_of(desc, struct bd71828_regulator_data, desc); 133 134 return rohm_regulator_set_dvs_levels(&data->dvs, np, desc, cfg->regmap); 135 } 136 137 static int ldo6_parse_dt(struct device_node *np, 138 const struct regulator_desc *desc, 139 struct regulator_config *cfg) 140 { 141 int ret, i; 142 uint32_t uv = 0; 143 unsigned int en; 144 struct regmap *regmap = cfg->regmap; 145 static const char * const props[] = { "rohm,dvs-run-voltage", 146 "rohm,dvs-idle-voltage", 147 "rohm,dvs-suspend-voltage", 148 "rohm,dvs-lpsr-voltage" }; 149 unsigned int mask[] = { BD71828_MASK_RUN_EN, BD71828_MASK_IDLE_EN, 150 BD71828_MASK_SUSP_EN, BD71828_MASK_LPSR_EN }; 151 152 for (i = 0; i < ARRAY_SIZE(props); i++) { 153 ret = of_property_read_u32(np, props[i], &uv); 154 if (ret) { 155 if (ret != -EINVAL) 156 return ret; 157 continue; 158 } 159 if (uv) 160 en = 0xffffffff; 161 else 162 en = 0; 163 164 ret = regmap_update_bits(regmap, desc->enable_reg, mask[i], en); 165 if (ret) 166 return ret; 167 } 168 return 0; 169 } 170 171 static const struct regulator_ops bd71828_buck_ops = { 172 .enable = regulator_enable_regmap, 173 .disable = regulator_disable_regmap, 174 .is_enabled = regulator_is_enabled_regmap, 175 .list_voltage = regulator_list_voltage_linear_range, 176 .set_voltage_sel = regulator_set_voltage_sel_regmap, 177 .get_voltage_sel = regulator_get_voltage_sel_regmap, 178 }; 179 180 static const struct regulator_ops bd71828_dvs_buck_ops = { 181 .enable = regulator_enable_regmap, 182 .disable = regulator_disable_regmap, 183 .is_enabled = regulator_is_enabled_regmap, 184 .list_voltage = regulator_list_voltage_linear_range, 185 .set_voltage_sel = regulator_set_voltage_sel_regmap, 186 .get_voltage_sel = regulator_get_voltage_sel_regmap, 187 .set_voltage_time_sel = regulator_set_voltage_time_sel, 188 .set_ramp_delay = bd71828_set_ramp_delay, 189 }; 190 191 static const struct regulator_ops bd71828_ldo_ops = { 192 .enable = regulator_enable_regmap, 193 .disable = regulator_disable_regmap, 194 .is_enabled = regulator_is_enabled_regmap, 195 .list_voltage = regulator_list_voltage_linear_range, 196 .set_voltage_sel = regulator_set_voltage_sel_regmap, 197 .get_voltage_sel = regulator_get_voltage_sel_regmap, 198 }; 199 200 static const struct regulator_ops bd71828_ldo6_ops = { 201 .enable = regulator_enable_regmap, 202 .disable = regulator_disable_regmap, 203 .is_enabled = regulator_is_enabled_regmap, 204 }; 205 206 static const struct bd71828_regulator_data bd71828_rdata[] = { 207 { 208 .desc = { 209 .name = "buck1", 210 .of_match = of_match_ptr("BUCK1"), 211 .regulators_node = of_match_ptr("regulators"), 212 .id = BD71828_BUCK1, 213 .ops = &bd71828_dvs_buck_ops, 214 .type = REGULATOR_VOLTAGE, 215 .linear_ranges = bd71828_buck1267_volts, 216 .n_linear_ranges = ARRAY_SIZE(bd71828_buck1267_volts), 217 .n_voltages = BD71828_BUCK1267_VOLTS, 218 .enable_reg = BD71828_REG_BUCK1_EN, 219 .enable_mask = BD71828_MASK_RUN_EN, 220 .vsel_reg = BD71828_REG_BUCK1_VOLT, 221 .vsel_mask = BD71828_MASK_BUCK1267_VOLT, 222 .owner = THIS_MODULE, 223 .of_parse_cb = buck_set_hw_dvs_levels, 224 }, 225 .dvs = { 226 .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE | 227 ROHM_DVS_LEVEL_SUSPEND | 228 ROHM_DVS_LEVEL_LPSR, 229 .run_reg = BD71828_REG_BUCK1_VOLT, 230 .run_mask = BD71828_MASK_BUCK1267_VOLT, 231 .idle_reg = BD71828_REG_BUCK1_IDLE_VOLT, 232 .idle_mask = BD71828_MASK_BUCK1267_VOLT, 233 .idle_on_mask = BD71828_MASK_IDLE_EN, 234 .suspend_reg = BD71828_REG_BUCK1_SUSP_VOLT, 235 .suspend_mask = BD71828_MASK_BUCK1267_VOLT, 236 .suspend_on_mask = BD71828_MASK_SUSP_EN, 237 .lpsr_on_mask = BD71828_MASK_LPSR_EN, 238 /* 239 * LPSR voltage is same as SUSPEND voltage. Allow 240 * setting it so that regulator can be set enabled at 241 * LPSR state 242 */ 243 .lpsr_reg = BD71828_REG_BUCK1_SUSP_VOLT, 244 .lpsr_mask = BD71828_MASK_BUCK1267_VOLT, 245 }, 246 .reg_inits = buck1_inits, 247 .reg_init_amnt = ARRAY_SIZE(buck1_inits), 248 }, 249 { 250 .desc = { 251 .name = "buck2", 252 .of_match = of_match_ptr("BUCK2"), 253 .regulators_node = of_match_ptr("regulators"), 254 .id = BD71828_BUCK2, 255 .ops = &bd71828_dvs_buck_ops, 256 .type = REGULATOR_VOLTAGE, 257 .linear_ranges = bd71828_buck1267_volts, 258 .n_linear_ranges = ARRAY_SIZE(bd71828_buck1267_volts), 259 .n_voltages = BD71828_BUCK1267_VOLTS, 260 .enable_reg = BD71828_REG_BUCK2_EN, 261 .enable_mask = BD71828_MASK_RUN_EN, 262 .vsel_reg = BD71828_REG_BUCK2_VOLT, 263 .vsel_mask = BD71828_MASK_BUCK1267_VOLT, 264 .owner = THIS_MODULE, 265 .of_parse_cb = buck_set_hw_dvs_levels, 266 }, 267 .dvs = { 268 .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE | 269 ROHM_DVS_LEVEL_SUSPEND | 270 ROHM_DVS_LEVEL_LPSR, 271 .run_reg = BD71828_REG_BUCK2_VOLT, 272 .run_mask = BD71828_MASK_BUCK1267_VOLT, 273 .idle_reg = BD71828_REG_BUCK2_IDLE_VOLT, 274 .idle_mask = BD71828_MASK_BUCK1267_VOLT, 275 .idle_on_mask = BD71828_MASK_IDLE_EN, 276 .suspend_reg = BD71828_REG_BUCK2_SUSP_VOLT, 277 .suspend_mask = BD71828_MASK_BUCK1267_VOLT, 278 .suspend_on_mask = BD71828_MASK_SUSP_EN, 279 .lpsr_on_mask = BD71828_MASK_LPSR_EN, 280 .lpsr_reg = BD71828_REG_BUCK2_SUSP_VOLT, 281 .lpsr_mask = BD71828_MASK_BUCK1267_VOLT, 282 }, 283 .reg_inits = buck2_inits, 284 .reg_init_amnt = ARRAY_SIZE(buck2_inits), 285 }, 286 { 287 .desc = { 288 .name = "buck3", 289 .of_match = of_match_ptr("BUCK3"), 290 .regulators_node = of_match_ptr("regulators"), 291 .id = BD71828_BUCK3, 292 .ops = &bd71828_buck_ops, 293 .type = REGULATOR_VOLTAGE, 294 .linear_ranges = bd71828_buck3_volts, 295 .n_linear_ranges = ARRAY_SIZE(bd71828_buck3_volts), 296 .n_voltages = BD71828_BUCK3_VOLTS, 297 .enable_reg = BD71828_REG_BUCK3_EN, 298 .enable_mask = BD71828_MASK_RUN_EN, 299 .vsel_reg = BD71828_REG_BUCK3_VOLT, 300 .vsel_mask = BD71828_MASK_BUCK3_VOLT, 301 .owner = THIS_MODULE, 302 .of_parse_cb = buck_set_hw_dvs_levels, 303 }, 304 .dvs = { 305 /* 306 * BUCK3 only supports single voltage for all states. 307 * voltage can be individually enabled for each state 308 * though => allow setting all states to support 309 * enabling power rail on different states. 310 */ 311 .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE | 312 ROHM_DVS_LEVEL_SUSPEND | 313 ROHM_DVS_LEVEL_LPSR, 314 .run_reg = BD71828_REG_BUCK3_VOLT, 315 .idle_reg = BD71828_REG_BUCK3_VOLT, 316 .suspend_reg = BD71828_REG_BUCK3_VOLT, 317 .lpsr_reg = BD71828_REG_BUCK3_VOLT, 318 .run_mask = BD71828_MASK_BUCK3_VOLT, 319 .idle_mask = BD71828_MASK_BUCK3_VOLT, 320 .suspend_mask = BD71828_MASK_BUCK3_VOLT, 321 .lpsr_mask = BD71828_MASK_BUCK3_VOLT, 322 .idle_on_mask = BD71828_MASK_IDLE_EN, 323 .suspend_on_mask = BD71828_MASK_SUSP_EN, 324 .lpsr_on_mask = BD71828_MASK_LPSR_EN, 325 }, 326 }, 327 { 328 .desc = { 329 .name = "buck4", 330 .of_match = of_match_ptr("BUCK4"), 331 .regulators_node = of_match_ptr("regulators"), 332 .id = BD71828_BUCK4, 333 .ops = &bd71828_buck_ops, 334 .type = REGULATOR_VOLTAGE, 335 .linear_ranges = bd71828_buck4_volts, 336 .n_linear_ranges = ARRAY_SIZE(bd71828_buck4_volts), 337 .n_voltages = BD71828_BUCK4_VOLTS, 338 .enable_reg = BD71828_REG_BUCK4_EN, 339 .enable_mask = BD71828_MASK_RUN_EN, 340 .vsel_reg = BD71828_REG_BUCK4_VOLT, 341 .vsel_mask = BD71828_MASK_BUCK4_VOLT, 342 .owner = THIS_MODULE, 343 .of_parse_cb = buck_set_hw_dvs_levels, 344 }, 345 .dvs = { 346 /* 347 * BUCK4 only supports single voltage for all states. 348 * voltage can be individually enabled for each state 349 * though => allow setting all states to support 350 * enabling power rail on different states. 351 */ 352 .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE | 353 ROHM_DVS_LEVEL_SUSPEND | 354 ROHM_DVS_LEVEL_LPSR, 355 .run_reg = BD71828_REG_BUCK4_VOLT, 356 .idle_reg = BD71828_REG_BUCK4_VOLT, 357 .suspend_reg = BD71828_REG_BUCK4_VOLT, 358 .lpsr_reg = BD71828_REG_BUCK4_VOLT, 359 .run_mask = BD71828_MASK_BUCK4_VOLT, 360 .idle_mask = BD71828_MASK_BUCK4_VOLT, 361 .suspend_mask = BD71828_MASK_BUCK4_VOLT, 362 .lpsr_mask = BD71828_MASK_BUCK4_VOLT, 363 .idle_on_mask = BD71828_MASK_IDLE_EN, 364 .suspend_on_mask = BD71828_MASK_SUSP_EN, 365 .lpsr_on_mask = BD71828_MASK_LPSR_EN, 366 }, 367 }, 368 { 369 .desc = { 370 .name = "buck5", 371 .of_match = of_match_ptr("BUCK5"), 372 .regulators_node = of_match_ptr("regulators"), 373 .id = BD71828_BUCK5, 374 .ops = &bd71828_buck_ops, 375 .type = REGULATOR_VOLTAGE, 376 .linear_ranges = bd71828_buck5_volts, 377 .n_linear_ranges = ARRAY_SIZE(bd71828_buck5_volts), 378 .n_voltages = BD71828_BUCK5_VOLTS, 379 .enable_reg = BD71828_REG_BUCK5_EN, 380 .enable_mask = BD71828_MASK_RUN_EN, 381 .vsel_reg = BD71828_REG_BUCK5_VOLT, 382 .vsel_mask = BD71828_MASK_BUCK5_VOLT, 383 .owner = THIS_MODULE, 384 .of_parse_cb = buck_set_hw_dvs_levels, 385 }, 386 .dvs = { 387 /* 388 * BUCK5 only supports single voltage for all states. 389 * voltage can be individually enabled for each state 390 * though => allow setting all states to support 391 * enabling power rail on different states. 392 */ 393 .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE | 394 ROHM_DVS_LEVEL_SUSPEND | 395 ROHM_DVS_LEVEL_LPSR, 396 .run_reg = BD71828_REG_BUCK5_VOLT, 397 .idle_reg = BD71828_REG_BUCK5_VOLT, 398 .suspend_reg = BD71828_REG_BUCK5_VOLT, 399 .lpsr_reg = BD71828_REG_BUCK5_VOLT, 400 .run_mask = BD71828_MASK_BUCK5_VOLT, 401 .idle_mask = BD71828_MASK_BUCK5_VOLT, 402 .suspend_mask = BD71828_MASK_BUCK5_VOLT, 403 .lpsr_mask = BD71828_MASK_BUCK5_VOLT, 404 .idle_on_mask = BD71828_MASK_IDLE_EN, 405 .suspend_on_mask = BD71828_MASK_SUSP_EN, 406 .lpsr_on_mask = BD71828_MASK_LPSR_EN, 407 }, 408 }, 409 { 410 .desc = { 411 .name = "buck6", 412 .of_match = of_match_ptr("BUCK6"), 413 .regulators_node = of_match_ptr("regulators"), 414 .id = BD71828_BUCK6, 415 .ops = &bd71828_dvs_buck_ops, 416 .type = REGULATOR_VOLTAGE, 417 .linear_ranges = bd71828_buck1267_volts, 418 .n_linear_ranges = ARRAY_SIZE(bd71828_buck1267_volts), 419 .n_voltages = BD71828_BUCK1267_VOLTS, 420 .enable_reg = BD71828_REG_BUCK6_EN, 421 .enable_mask = BD71828_MASK_RUN_EN, 422 .vsel_reg = BD71828_REG_BUCK6_VOLT, 423 .vsel_mask = BD71828_MASK_BUCK1267_VOLT, 424 .owner = THIS_MODULE, 425 .of_parse_cb = buck_set_hw_dvs_levels, 426 }, 427 .dvs = { 428 .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE | 429 ROHM_DVS_LEVEL_SUSPEND | 430 ROHM_DVS_LEVEL_LPSR, 431 .run_reg = BD71828_REG_BUCK6_VOLT, 432 .run_mask = BD71828_MASK_BUCK1267_VOLT, 433 .idle_reg = BD71828_REG_BUCK6_IDLE_VOLT, 434 .idle_mask = BD71828_MASK_BUCK1267_VOLT, 435 .idle_on_mask = BD71828_MASK_IDLE_EN, 436 .suspend_reg = BD71828_REG_BUCK6_SUSP_VOLT, 437 .suspend_mask = BD71828_MASK_BUCK1267_VOLT, 438 .suspend_on_mask = BD71828_MASK_SUSP_EN, 439 .lpsr_on_mask = BD71828_MASK_LPSR_EN, 440 .lpsr_reg = BD71828_REG_BUCK6_SUSP_VOLT, 441 .lpsr_mask = BD71828_MASK_BUCK1267_VOLT, 442 }, 443 .reg_inits = buck6_inits, 444 .reg_init_amnt = ARRAY_SIZE(buck6_inits), 445 }, 446 { 447 .desc = { 448 .name = "buck7", 449 .of_match = of_match_ptr("BUCK7"), 450 .regulators_node = of_match_ptr("regulators"), 451 .id = BD71828_BUCK7, 452 .ops = &bd71828_dvs_buck_ops, 453 .type = REGULATOR_VOLTAGE, 454 .linear_ranges = bd71828_buck1267_volts, 455 .n_linear_ranges = ARRAY_SIZE(bd71828_buck1267_volts), 456 .n_voltages = BD71828_BUCK1267_VOLTS, 457 .enable_reg = BD71828_REG_BUCK7_EN, 458 .enable_mask = BD71828_MASK_RUN_EN, 459 .vsel_reg = BD71828_REG_BUCK7_VOLT, 460 .vsel_mask = BD71828_MASK_BUCK1267_VOLT, 461 .owner = THIS_MODULE, 462 .of_parse_cb = buck_set_hw_dvs_levels, 463 }, 464 .dvs = { 465 .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE | 466 ROHM_DVS_LEVEL_SUSPEND | 467 ROHM_DVS_LEVEL_LPSR, 468 .run_reg = BD71828_REG_BUCK7_VOLT, 469 .run_mask = BD71828_MASK_BUCK1267_VOLT, 470 .idle_reg = BD71828_REG_BUCK7_IDLE_VOLT, 471 .idle_mask = BD71828_MASK_BUCK1267_VOLT, 472 .idle_on_mask = BD71828_MASK_IDLE_EN, 473 .suspend_reg = BD71828_REG_BUCK7_SUSP_VOLT, 474 .suspend_mask = BD71828_MASK_BUCK1267_VOLT, 475 .suspend_on_mask = BD71828_MASK_SUSP_EN, 476 .lpsr_on_mask = BD71828_MASK_LPSR_EN, 477 .lpsr_reg = BD71828_REG_BUCK7_SUSP_VOLT, 478 .lpsr_mask = BD71828_MASK_BUCK1267_VOLT, 479 }, 480 .reg_inits = buck7_inits, 481 .reg_init_amnt = ARRAY_SIZE(buck7_inits), 482 }, 483 { 484 .desc = { 485 .name = "ldo1", 486 .of_match = of_match_ptr("LDO1"), 487 .regulators_node = of_match_ptr("regulators"), 488 .id = BD71828_LDO1, 489 .ops = &bd71828_ldo_ops, 490 .type = REGULATOR_VOLTAGE, 491 .linear_ranges = bd71828_ldo_volts, 492 .n_linear_ranges = ARRAY_SIZE(bd71828_ldo_volts), 493 .n_voltages = BD71828_LDO_VOLTS, 494 .enable_reg = BD71828_REG_LDO1_EN, 495 .enable_mask = BD71828_MASK_RUN_EN, 496 .vsel_reg = BD71828_REG_LDO1_VOLT, 497 .vsel_mask = BD71828_MASK_LDO_VOLT, 498 .owner = THIS_MODULE, 499 .of_parse_cb = buck_set_hw_dvs_levels, 500 }, 501 .dvs = { 502 /* 503 * LDO1 only supports single voltage for all states. 504 * voltage can be individually enabled for each state 505 * though => allow setting all states to support 506 * enabling power rail on different states. 507 */ 508 .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE | 509 ROHM_DVS_LEVEL_SUSPEND | 510 ROHM_DVS_LEVEL_LPSR, 511 .run_reg = BD71828_REG_LDO1_VOLT, 512 .idle_reg = BD71828_REG_LDO1_VOLT, 513 .suspend_reg = BD71828_REG_LDO1_VOLT, 514 .lpsr_reg = BD71828_REG_LDO1_VOLT, 515 .run_mask = BD71828_MASK_LDO_VOLT, 516 .idle_mask = BD71828_MASK_LDO_VOLT, 517 .suspend_mask = BD71828_MASK_LDO_VOLT, 518 .lpsr_mask = BD71828_MASK_LDO_VOLT, 519 .idle_on_mask = BD71828_MASK_IDLE_EN, 520 .suspend_on_mask = BD71828_MASK_SUSP_EN, 521 .lpsr_on_mask = BD71828_MASK_LPSR_EN, 522 }, 523 }, { 524 .desc = { 525 .name = "ldo2", 526 .of_match = of_match_ptr("LDO2"), 527 .regulators_node = of_match_ptr("regulators"), 528 .id = BD71828_LDO2, 529 .ops = &bd71828_ldo_ops, 530 .type = REGULATOR_VOLTAGE, 531 .linear_ranges = bd71828_ldo_volts, 532 .n_linear_ranges = ARRAY_SIZE(bd71828_ldo_volts), 533 .n_voltages = BD71828_LDO_VOLTS, 534 .enable_reg = BD71828_REG_LDO2_EN, 535 .enable_mask = BD71828_MASK_RUN_EN, 536 .vsel_reg = BD71828_REG_LDO2_VOLT, 537 .vsel_mask = BD71828_MASK_LDO_VOLT, 538 .owner = THIS_MODULE, 539 .of_parse_cb = buck_set_hw_dvs_levels, 540 }, 541 .dvs = { 542 /* 543 * LDO2 only supports single voltage for all states. 544 * voltage can be individually enabled for each state 545 * though => allow setting all states to support 546 * enabling power rail on different states. 547 */ 548 .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE | 549 ROHM_DVS_LEVEL_SUSPEND | 550 ROHM_DVS_LEVEL_LPSR, 551 .run_reg = BD71828_REG_LDO2_VOLT, 552 .idle_reg = BD71828_REG_LDO2_VOLT, 553 .suspend_reg = BD71828_REG_LDO2_VOLT, 554 .lpsr_reg = BD71828_REG_LDO2_VOLT, 555 .run_mask = BD71828_MASK_LDO_VOLT, 556 .idle_mask = BD71828_MASK_LDO_VOLT, 557 .suspend_mask = BD71828_MASK_LDO_VOLT, 558 .lpsr_mask = BD71828_MASK_LDO_VOLT, 559 .idle_on_mask = BD71828_MASK_IDLE_EN, 560 .suspend_on_mask = BD71828_MASK_SUSP_EN, 561 .lpsr_on_mask = BD71828_MASK_LPSR_EN, 562 }, 563 }, { 564 .desc = { 565 .name = "ldo3", 566 .of_match = of_match_ptr("LDO3"), 567 .regulators_node = of_match_ptr("regulators"), 568 .id = BD71828_LDO3, 569 .ops = &bd71828_ldo_ops, 570 .type = REGULATOR_VOLTAGE, 571 .linear_ranges = bd71828_ldo_volts, 572 .n_linear_ranges = ARRAY_SIZE(bd71828_ldo_volts), 573 .n_voltages = BD71828_LDO_VOLTS, 574 .enable_reg = BD71828_REG_LDO3_EN, 575 .enable_mask = BD71828_MASK_RUN_EN, 576 .vsel_reg = BD71828_REG_LDO3_VOLT, 577 .vsel_mask = BD71828_MASK_LDO_VOLT, 578 .owner = THIS_MODULE, 579 .of_parse_cb = buck_set_hw_dvs_levels, 580 }, 581 .dvs = { 582 /* 583 * LDO3 only supports single voltage for all states. 584 * voltage can be individually enabled for each state 585 * though => allow setting all states to support 586 * enabling power rail on different states. 587 */ 588 .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE | 589 ROHM_DVS_LEVEL_SUSPEND | 590 ROHM_DVS_LEVEL_LPSR, 591 .run_reg = BD71828_REG_LDO3_VOLT, 592 .idle_reg = BD71828_REG_LDO3_VOLT, 593 .suspend_reg = BD71828_REG_LDO3_VOLT, 594 .lpsr_reg = BD71828_REG_LDO3_VOLT, 595 .run_mask = BD71828_MASK_LDO_VOLT, 596 .idle_mask = BD71828_MASK_LDO_VOLT, 597 .suspend_mask = BD71828_MASK_LDO_VOLT, 598 .lpsr_mask = BD71828_MASK_LDO_VOLT, 599 .idle_on_mask = BD71828_MASK_IDLE_EN, 600 .suspend_on_mask = BD71828_MASK_SUSP_EN, 601 .lpsr_on_mask = BD71828_MASK_LPSR_EN, 602 }, 603 604 }, { 605 .desc = { 606 .name = "ldo4", 607 .of_match = of_match_ptr("LDO4"), 608 .regulators_node = of_match_ptr("regulators"), 609 .id = BD71828_LDO4, 610 .ops = &bd71828_ldo_ops, 611 .type = REGULATOR_VOLTAGE, 612 .linear_ranges = bd71828_ldo_volts, 613 .n_linear_ranges = ARRAY_SIZE(bd71828_ldo_volts), 614 .n_voltages = BD71828_LDO_VOLTS, 615 .enable_reg = BD71828_REG_LDO4_EN, 616 .enable_mask = BD71828_MASK_RUN_EN, 617 .vsel_reg = BD71828_REG_LDO4_VOLT, 618 .vsel_mask = BD71828_MASK_LDO_VOLT, 619 .owner = THIS_MODULE, 620 .of_parse_cb = buck_set_hw_dvs_levels, 621 }, 622 .dvs = { 623 /* 624 * LDO1 only supports single voltage for all states. 625 * voltage can be individually enabled for each state 626 * though => allow setting all states to support 627 * enabling power rail on different states. 628 */ 629 .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE | 630 ROHM_DVS_LEVEL_SUSPEND | 631 ROHM_DVS_LEVEL_LPSR, 632 .run_reg = BD71828_REG_LDO4_VOLT, 633 .idle_reg = BD71828_REG_LDO4_VOLT, 634 .suspend_reg = BD71828_REG_LDO4_VOLT, 635 .lpsr_reg = BD71828_REG_LDO4_VOLT, 636 .run_mask = BD71828_MASK_LDO_VOLT, 637 .idle_mask = BD71828_MASK_LDO_VOLT, 638 .suspend_mask = BD71828_MASK_LDO_VOLT, 639 .lpsr_mask = BD71828_MASK_LDO_VOLT, 640 .idle_on_mask = BD71828_MASK_IDLE_EN, 641 .suspend_on_mask = BD71828_MASK_SUSP_EN, 642 .lpsr_on_mask = BD71828_MASK_LPSR_EN, 643 }, 644 }, { 645 .desc = { 646 .name = "ldo5", 647 .of_match = of_match_ptr("LDO5"), 648 .regulators_node = of_match_ptr("regulators"), 649 .id = BD71828_LDO5, 650 .ops = &bd71828_ldo_ops, 651 .type = REGULATOR_VOLTAGE, 652 .linear_ranges = bd71828_ldo_volts, 653 .n_linear_ranges = ARRAY_SIZE(bd71828_ldo_volts), 654 .n_voltages = BD71828_LDO_VOLTS, 655 .enable_reg = BD71828_REG_LDO5_EN, 656 .enable_mask = BD71828_MASK_RUN_EN, 657 .vsel_reg = BD71828_REG_LDO5_VOLT, 658 .vsel_mask = BD71828_MASK_LDO_VOLT, 659 .of_parse_cb = buck_set_hw_dvs_levels, 660 .owner = THIS_MODULE, 661 }, 662 /* 663 * LDO5 is special. It can choose vsel settings to be configured 664 * from 2 different registers (by GPIO). 665 * 666 * This driver supports only configuration where 667 * BD71828_REG_LDO5_VOLT_L is used. 668 */ 669 .dvs = { 670 .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE | 671 ROHM_DVS_LEVEL_SUSPEND | 672 ROHM_DVS_LEVEL_LPSR, 673 .run_reg = BD71828_REG_LDO5_VOLT, 674 .idle_reg = BD71828_REG_LDO5_VOLT, 675 .suspend_reg = BD71828_REG_LDO5_VOLT, 676 .lpsr_reg = BD71828_REG_LDO5_VOLT, 677 .run_mask = BD71828_MASK_LDO_VOLT, 678 .idle_mask = BD71828_MASK_LDO_VOLT, 679 .suspend_mask = BD71828_MASK_LDO_VOLT, 680 .lpsr_mask = BD71828_MASK_LDO_VOLT, 681 .idle_on_mask = BD71828_MASK_IDLE_EN, 682 .suspend_on_mask = BD71828_MASK_SUSP_EN, 683 .lpsr_on_mask = BD71828_MASK_LPSR_EN, 684 }, 685 686 }, { 687 .desc = { 688 .name = "ldo6", 689 .of_match = of_match_ptr("LDO6"), 690 .regulators_node = of_match_ptr("regulators"), 691 .id = BD71828_LDO6, 692 .ops = &bd71828_ldo6_ops, 693 .type = REGULATOR_VOLTAGE, 694 .fixed_uV = BD71828_LDO_6_VOLTAGE, 695 .n_voltages = 1, 696 .enable_reg = BD71828_REG_LDO6_EN, 697 .enable_mask = BD71828_MASK_RUN_EN, 698 .owner = THIS_MODULE, 699 /* 700 * LDO6 only supports enable/disable for all states. 701 * Voltage for LDO6 is fixed. 702 */ 703 .of_parse_cb = ldo6_parse_dt, 704 }, 705 }, { 706 .desc = { 707 /* SNVS LDO in data-sheet */ 708 .name = "ldo7", 709 .of_match = of_match_ptr("LDO7"), 710 .regulators_node = of_match_ptr("regulators"), 711 .id = BD71828_LDO_SNVS, 712 .ops = &bd71828_ldo_ops, 713 .type = REGULATOR_VOLTAGE, 714 .linear_ranges = bd71828_ldo_volts, 715 .n_linear_ranges = ARRAY_SIZE(bd71828_ldo_volts), 716 .n_voltages = BD71828_LDO_VOLTS, 717 .enable_reg = BD71828_REG_LDO7_EN, 718 .enable_mask = BD71828_MASK_RUN_EN, 719 .vsel_reg = BD71828_REG_LDO7_VOLT, 720 .vsel_mask = BD71828_MASK_LDO_VOLT, 721 .owner = THIS_MODULE, 722 .of_parse_cb = buck_set_hw_dvs_levels, 723 }, 724 .dvs = { 725 /* 726 * LDO7 only supports single voltage for all states. 727 * voltage can be individually enabled for each state 728 * though => allow setting all states to support 729 * enabling power rail on different states. 730 */ 731 .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE | 732 ROHM_DVS_LEVEL_SUSPEND | 733 ROHM_DVS_LEVEL_LPSR, 734 .run_reg = BD71828_REG_LDO7_VOLT, 735 .idle_reg = BD71828_REG_LDO7_VOLT, 736 .suspend_reg = BD71828_REG_LDO7_VOLT, 737 .lpsr_reg = BD71828_REG_LDO7_VOLT, 738 .run_mask = BD71828_MASK_LDO_VOLT, 739 .idle_mask = BD71828_MASK_LDO_VOLT, 740 .suspend_mask = BD71828_MASK_LDO_VOLT, 741 .lpsr_mask = BD71828_MASK_LDO_VOLT, 742 .idle_on_mask = BD71828_MASK_IDLE_EN, 743 .suspend_on_mask = BD71828_MASK_SUSP_EN, 744 .lpsr_on_mask = BD71828_MASK_LPSR_EN, 745 }, 746 747 }, 748 }; 749 750 static int bd71828_probe(struct platform_device *pdev) 751 { 752 int i, j, ret; 753 struct regulator_config config = { 754 .dev = pdev->dev.parent, 755 }; 756 757 config.regmap = dev_get_regmap(pdev->dev.parent, NULL); 758 if (!config.regmap) 759 return -ENODEV; 760 761 for (i = 0; i < ARRAY_SIZE(bd71828_rdata); i++) { 762 struct regulator_dev *rdev; 763 const struct bd71828_regulator_data *rd; 764 765 rd = &bd71828_rdata[i]; 766 rdev = devm_regulator_register(&pdev->dev, 767 &rd->desc, &config); 768 if (IS_ERR(rdev)) { 769 dev_err(&pdev->dev, 770 "failed to register %s regulator\n", 771 rd->desc.name); 772 return PTR_ERR(rdev); 773 } 774 for (j = 0; j < rd->reg_init_amnt; j++) { 775 ret = regmap_update_bits(config.regmap, 776 rd->reg_inits[j].reg, 777 rd->reg_inits[j].mask, 778 rd->reg_inits[j].val); 779 if (ret) { 780 dev_err(&pdev->dev, 781 "regulator %s init failed\n", 782 rd->desc.name); 783 return ret; 784 } 785 } 786 } 787 return 0; 788 } 789 790 static struct platform_driver bd71828_regulator = { 791 .driver = { 792 .name = "bd71828-pmic" 793 }, 794 .probe = bd71828_probe, 795 }; 796 797 module_platform_driver(bd71828_regulator); 798 799 MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>"); 800 MODULE_DESCRIPTION("BD71828 voltage regulator driver"); 801 MODULE_LICENSE("GPL"); 802 MODULE_ALIAS("platform:bd71828-pmic"); 803