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