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