1 // SPDX-License-Identifier: GPL-2.0+ 2 // 3 // max77686.c - Regulator driver for the Maxim 77686 4 // 5 // Copyright (C) 2012 Samsung Electronics 6 // Chiwoong Byun <woong.byun@samsung.com> 7 // Jonghwa Lee <jonghwa3.lee@samsung.com> 8 // 9 // This driver is based on max8997.c 10 11 #include <linux/kernel.h> 12 #include <linux/bug.h> 13 #include <linux/err.h> 14 #include <linux/gpio/consumer.h> 15 #include <linux/slab.h> 16 #include <linux/platform_device.h> 17 #include <linux/regulator/driver.h> 18 #include <linux/regulator/machine.h> 19 #include <linux/regulator/of_regulator.h> 20 #include <linux/mfd/max77686.h> 21 #include <linux/mfd/max77686-private.h> 22 23 #define MAX77686_LDO_MINUV 800000 24 #define MAX77686_LDO_UVSTEP 50000 25 #define MAX77686_LDO_LOW_MINUV 800000 26 #define MAX77686_LDO_LOW_UVSTEP 25000 27 #define MAX77686_BUCK_MINUV 750000 28 #define MAX77686_BUCK_UVSTEP 50000 29 #define MAX77686_BUCK_ENABLE_TIME 40 /* us */ 30 #define MAX77686_DVS_ENABLE_TIME 22 /* us */ 31 #define MAX77686_RAMP_DELAY 100000 /* uV/us */ 32 #define MAX77686_DVS_RAMP_DELAY 27500 /* uV/us */ 33 #define MAX77686_DVS_MINUV 600000 34 #define MAX77686_DVS_UVSTEP 12500 35 36 /* 37 * Value for configuring buck[89] and LDO{20,21,22} as GPIO control. 38 * It is the same as 'off' for other regulators. 39 */ 40 #define MAX77686_GPIO_CONTROL 0x0 41 /* 42 * Values used for configuring LDOs and bucks. 43 * Forcing low power mode: LDO1, 3-5, 9, 13, 17-26 44 */ 45 #define MAX77686_LDO_LOWPOWER 0x1 46 /* 47 * On/off controlled by PWRREQ: 48 * - LDO2, 6-8, 10-12, 14-16 49 * - buck[1234] 50 */ 51 #define MAX77686_OFF_PWRREQ 0x1 52 /* Low power mode controlled by PWRREQ: All LDOs */ 53 #define MAX77686_LDO_LOWPOWER_PWRREQ 0x2 54 /* Forcing low power mode: buck[234] */ 55 #define MAX77686_BUCK_LOWPOWER 0x2 56 #define MAX77686_NORMAL 0x3 57 58 #define MAX77686_OPMODE_SHIFT 6 59 #define MAX77686_OPMODE_BUCK234_SHIFT 4 60 #define MAX77686_OPMODE_MASK 0x3 61 62 #define MAX77686_VSEL_MASK 0x3F 63 #define MAX77686_DVS_VSEL_MASK 0xFF 64 65 #define MAX77686_RAMP_RATE_MASK 0xC0 66 67 #define MAX77686_REGULATORS MAX77686_REG_MAX 68 #define MAX77686_LDOS 26 69 70 enum max77686_ramp_rate { 71 RAMP_RATE_13P75MV, 72 RAMP_RATE_27P5MV, 73 RAMP_RATE_55MV, 74 RAMP_RATE_NO_CTRL, /* 100mV/us */ 75 }; 76 77 struct max77686_data { 78 struct device *dev; 79 DECLARE_BITMAP(gpio_enabled, MAX77686_REGULATORS); 80 81 /* Array indexed by regulator id */ 82 unsigned int opmode[MAX77686_REGULATORS]; 83 }; 84 85 static unsigned int max77686_get_opmode_shift(int id) 86 { 87 switch (id) { 88 case MAX77686_BUCK1: 89 case MAX77686_BUCK5 ... MAX77686_BUCK9: 90 return 0; 91 case MAX77686_BUCK2 ... MAX77686_BUCK4: 92 return MAX77686_OPMODE_BUCK234_SHIFT; 93 default: 94 /* all LDOs */ 95 return MAX77686_OPMODE_SHIFT; 96 } 97 } 98 99 /* 100 * When regulator is configured for GPIO control then it 101 * replaces "normal" mode. Any change from low power mode to normal 102 * should actually change to GPIO control. 103 * Map normal mode to proper value for such regulators. 104 */ 105 static unsigned int max77686_map_normal_mode(struct max77686_data *max77686, 106 int id) 107 { 108 switch (id) { 109 case MAX77686_BUCK8: 110 case MAX77686_BUCK9: 111 case MAX77686_LDO20 ... MAX77686_LDO22: 112 if (test_bit(id, max77686->gpio_enabled)) 113 return MAX77686_GPIO_CONTROL; 114 } 115 116 return MAX77686_NORMAL; 117 } 118 119 /* Some BUCKs and LDOs supports Normal[ON/OFF] mode during suspend */ 120 static int max77686_set_suspend_disable(struct regulator_dev *rdev) 121 { 122 unsigned int val, shift; 123 struct max77686_data *max77686 = rdev_get_drvdata(rdev); 124 int ret, id = rdev_get_id(rdev); 125 126 shift = max77686_get_opmode_shift(id); 127 val = MAX77686_OFF_PWRREQ; 128 129 ret = regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, 130 rdev->desc->enable_mask, val << shift); 131 if (ret) 132 return ret; 133 134 max77686->opmode[id] = val; 135 return 0; 136 } 137 138 /* Some LDOs supports [LPM/Normal]ON mode during suspend state */ 139 static int max77686_set_suspend_mode(struct regulator_dev *rdev, 140 unsigned int mode) 141 { 142 struct max77686_data *max77686 = rdev_get_drvdata(rdev); 143 unsigned int val; 144 int ret, id = rdev_get_id(rdev); 145 146 /* BUCK[5-9] doesn't support this feature */ 147 if (id >= MAX77686_BUCK5) 148 return 0; 149 150 switch (mode) { 151 case REGULATOR_MODE_IDLE: /* ON in LP Mode */ 152 val = MAX77686_LDO_LOWPOWER_PWRREQ; 153 break; 154 case REGULATOR_MODE_NORMAL: /* ON in Normal Mode */ 155 val = max77686_map_normal_mode(max77686, id); 156 break; 157 default: 158 pr_warn("%s: regulator_suspend_mode : 0x%x not supported\n", 159 rdev->desc->name, mode); 160 return -EINVAL; 161 } 162 163 ret = regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, 164 rdev->desc->enable_mask, 165 val << MAX77686_OPMODE_SHIFT); 166 if (ret) 167 return ret; 168 169 max77686->opmode[id] = val; 170 return 0; 171 } 172 173 /* Some LDOs supports LPM-ON/OFF/Normal-ON mode during suspend state */ 174 static int max77686_ldo_set_suspend_mode(struct regulator_dev *rdev, 175 unsigned int mode) 176 { 177 unsigned int val; 178 struct max77686_data *max77686 = rdev_get_drvdata(rdev); 179 int ret, id = rdev_get_id(rdev); 180 181 switch (mode) { 182 case REGULATOR_MODE_STANDBY: /* switch off */ 183 val = MAX77686_OFF_PWRREQ; 184 break; 185 case REGULATOR_MODE_IDLE: /* ON in LP Mode */ 186 val = MAX77686_LDO_LOWPOWER_PWRREQ; 187 break; 188 case REGULATOR_MODE_NORMAL: /* ON in Normal Mode */ 189 val = max77686_map_normal_mode(max77686, id); 190 break; 191 default: 192 pr_warn("%s: regulator_suspend_mode : 0x%x not supported\n", 193 rdev->desc->name, mode); 194 return -EINVAL; 195 } 196 197 ret = regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, 198 rdev->desc->enable_mask, 199 val << MAX77686_OPMODE_SHIFT); 200 if (ret) 201 return ret; 202 203 max77686->opmode[id] = val; 204 return 0; 205 } 206 207 static int max77686_enable(struct regulator_dev *rdev) 208 { 209 struct max77686_data *max77686 = rdev_get_drvdata(rdev); 210 unsigned int shift; 211 int id = rdev_get_id(rdev); 212 213 shift = max77686_get_opmode_shift(id); 214 215 if (max77686->opmode[id] == MAX77686_OFF_PWRREQ) 216 max77686->opmode[id] = max77686_map_normal_mode(max77686, id); 217 218 return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, 219 rdev->desc->enable_mask, 220 max77686->opmode[id] << shift); 221 } 222 223 static int max77686_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay) 224 { 225 unsigned int ramp_value = RAMP_RATE_NO_CTRL; 226 227 switch (ramp_delay) { 228 case 1 ... 13750: 229 ramp_value = RAMP_RATE_13P75MV; 230 break; 231 case 13751 ... 27500: 232 ramp_value = RAMP_RATE_27P5MV; 233 break; 234 case 27501 ... 55000: 235 ramp_value = RAMP_RATE_55MV; 236 break; 237 case 55001 ... 100000: 238 break; 239 default: 240 pr_warn("%s: ramp_delay: %d not supported, setting 100000\n", 241 rdev->desc->name, ramp_delay); 242 } 243 244 return regmap_update_bits(rdev->regmap, rdev->desc->enable_reg, 245 MAX77686_RAMP_RATE_MASK, ramp_value << 6); 246 } 247 248 static int max77686_of_parse_cb(struct device_node *np, 249 const struct regulator_desc *desc, 250 struct regulator_config *config) 251 { 252 struct max77686_data *max77686 = config->driver_data; 253 254 switch (desc->id) { 255 case MAX77686_BUCK8: 256 case MAX77686_BUCK9: 257 case MAX77686_LDO20 ... MAX77686_LDO22: 258 config->ena_gpiod = devm_gpiod_get_from_of_node(max77686->dev, 259 np, 260 "maxim,ena", 261 0, 262 GPIOD_OUT_HIGH | GPIOD_FLAGS_BIT_NONEXCLUSIVE, 263 "max77686-regulator"); 264 if (IS_ERR(config->ena_gpiod)) 265 config->ena_gpiod = NULL; 266 break; 267 default: 268 return 0; 269 } 270 271 if (config->ena_gpiod) { 272 set_bit(desc->id, max77686->gpio_enabled); 273 274 return regmap_update_bits(config->regmap, desc->enable_reg, 275 desc->enable_mask, 276 MAX77686_GPIO_CONTROL); 277 } 278 279 return 0; 280 } 281 282 static const struct regulator_ops max77686_ops = { 283 .list_voltage = regulator_list_voltage_linear, 284 .map_voltage = regulator_map_voltage_linear, 285 .is_enabled = regulator_is_enabled_regmap, 286 .enable = max77686_enable, 287 .disable = regulator_disable_regmap, 288 .get_voltage_sel = regulator_get_voltage_sel_regmap, 289 .set_voltage_sel = regulator_set_voltage_sel_regmap, 290 .set_voltage_time_sel = regulator_set_voltage_time_sel, 291 .set_suspend_mode = max77686_set_suspend_mode, 292 }; 293 294 static const struct regulator_ops max77686_ldo_ops = { 295 .list_voltage = regulator_list_voltage_linear, 296 .map_voltage = regulator_map_voltage_linear, 297 .is_enabled = regulator_is_enabled_regmap, 298 .enable = max77686_enable, 299 .disable = regulator_disable_regmap, 300 .get_voltage_sel = regulator_get_voltage_sel_regmap, 301 .set_voltage_sel = regulator_set_voltage_sel_regmap, 302 .set_voltage_time_sel = regulator_set_voltage_time_sel, 303 .set_suspend_mode = max77686_ldo_set_suspend_mode, 304 .set_suspend_disable = max77686_set_suspend_disable, 305 }; 306 307 static const struct regulator_ops max77686_buck1_ops = { 308 .list_voltage = regulator_list_voltage_linear, 309 .map_voltage = regulator_map_voltage_linear, 310 .is_enabled = regulator_is_enabled_regmap, 311 .enable = max77686_enable, 312 .disable = regulator_disable_regmap, 313 .get_voltage_sel = regulator_get_voltage_sel_regmap, 314 .set_voltage_sel = regulator_set_voltage_sel_regmap, 315 .set_voltage_time_sel = regulator_set_voltage_time_sel, 316 .set_suspend_disable = max77686_set_suspend_disable, 317 }; 318 319 static const struct regulator_ops max77686_buck_dvs_ops = { 320 .list_voltage = regulator_list_voltage_linear, 321 .map_voltage = regulator_map_voltage_linear, 322 .is_enabled = regulator_is_enabled_regmap, 323 .enable = max77686_enable, 324 .disable = regulator_disable_regmap, 325 .get_voltage_sel = regulator_get_voltage_sel_regmap, 326 .set_voltage_sel = regulator_set_voltage_sel_regmap, 327 .set_voltage_time_sel = regulator_set_voltage_time_sel, 328 .set_ramp_delay = max77686_set_ramp_delay, 329 .set_suspend_disable = max77686_set_suspend_disable, 330 }; 331 332 #define regulator_desc_ldo(num) { \ 333 .name = "LDO"#num, \ 334 .of_match = of_match_ptr("LDO"#num), \ 335 .regulators_node = of_match_ptr("voltage-regulators"), \ 336 .of_parse_cb = max77686_of_parse_cb, \ 337 .id = MAX77686_LDO##num, \ 338 .ops = &max77686_ops, \ 339 .type = REGULATOR_VOLTAGE, \ 340 .owner = THIS_MODULE, \ 341 .min_uV = MAX77686_LDO_MINUV, \ 342 .uV_step = MAX77686_LDO_UVSTEP, \ 343 .ramp_delay = MAX77686_RAMP_DELAY, \ 344 .n_voltages = MAX77686_VSEL_MASK + 1, \ 345 .vsel_reg = MAX77686_REG_LDO1CTRL1 + num - 1, \ 346 .vsel_mask = MAX77686_VSEL_MASK, \ 347 .enable_reg = MAX77686_REG_LDO1CTRL1 + num - 1, \ 348 .enable_mask = MAX77686_OPMODE_MASK \ 349 << MAX77686_OPMODE_SHIFT, \ 350 } 351 #define regulator_desc_lpm_ldo(num) { \ 352 .name = "LDO"#num, \ 353 .of_match = of_match_ptr("LDO"#num), \ 354 .regulators_node = of_match_ptr("voltage-regulators"), \ 355 .id = MAX77686_LDO##num, \ 356 .ops = &max77686_ldo_ops, \ 357 .type = REGULATOR_VOLTAGE, \ 358 .owner = THIS_MODULE, \ 359 .min_uV = MAX77686_LDO_MINUV, \ 360 .uV_step = MAX77686_LDO_UVSTEP, \ 361 .ramp_delay = MAX77686_RAMP_DELAY, \ 362 .n_voltages = MAX77686_VSEL_MASK + 1, \ 363 .vsel_reg = MAX77686_REG_LDO1CTRL1 + num - 1, \ 364 .vsel_mask = MAX77686_VSEL_MASK, \ 365 .enable_reg = MAX77686_REG_LDO1CTRL1 + num - 1, \ 366 .enable_mask = MAX77686_OPMODE_MASK \ 367 << MAX77686_OPMODE_SHIFT, \ 368 } 369 #define regulator_desc_ldo_low(num) { \ 370 .name = "LDO"#num, \ 371 .of_match = of_match_ptr("LDO"#num), \ 372 .regulators_node = of_match_ptr("voltage-regulators"), \ 373 .id = MAX77686_LDO##num, \ 374 .ops = &max77686_ldo_ops, \ 375 .type = REGULATOR_VOLTAGE, \ 376 .owner = THIS_MODULE, \ 377 .min_uV = MAX77686_LDO_LOW_MINUV, \ 378 .uV_step = MAX77686_LDO_LOW_UVSTEP, \ 379 .ramp_delay = MAX77686_RAMP_DELAY, \ 380 .n_voltages = MAX77686_VSEL_MASK + 1, \ 381 .vsel_reg = MAX77686_REG_LDO1CTRL1 + num - 1, \ 382 .vsel_mask = MAX77686_VSEL_MASK, \ 383 .enable_reg = MAX77686_REG_LDO1CTRL1 + num - 1, \ 384 .enable_mask = MAX77686_OPMODE_MASK \ 385 << MAX77686_OPMODE_SHIFT, \ 386 } 387 #define regulator_desc_ldo1_low(num) { \ 388 .name = "LDO"#num, \ 389 .of_match = of_match_ptr("LDO"#num), \ 390 .regulators_node = of_match_ptr("voltage-regulators"), \ 391 .id = MAX77686_LDO##num, \ 392 .ops = &max77686_ops, \ 393 .type = REGULATOR_VOLTAGE, \ 394 .owner = THIS_MODULE, \ 395 .min_uV = MAX77686_LDO_LOW_MINUV, \ 396 .uV_step = MAX77686_LDO_LOW_UVSTEP, \ 397 .ramp_delay = MAX77686_RAMP_DELAY, \ 398 .n_voltages = MAX77686_VSEL_MASK + 1, \ 399 .vsel_reg = MAX77686_REG_LDO1CTRL1 + num - 1, \ 400 .vsel_mask = MAX77686_VSEL_MASK, \ 401 .enable_reg = MAX77686_REG_LDO1CTRL1 + num - 1, \ 402 .enable_mask = MAX77686_OPMODE_MASK \ 403 << MAX77686_OPMODE_SHIFT, \ 404 } 405 #define regulator_desc_buck(num) { \ 406 .name = "BUCK"#num, \ 407 .of_match = of_match_ptr("BUCK"#num), \ 408 .regulators_node = of_match_ptr("voltage-regulators"), \ 409 .of_parse_cb = max77686_of_parse_cb, \ 410 .id = MAX77686_BUCK##num, \ 411 .ops = &max77686_ops, \ 412 .type = REGULATOR_VOLTAGE, \ 413 .owner = THIS_MODULE, \ 414 .min_uV = MAX77686_BUCK_MINUV, \ 415 .uV_step = MAX77686_BUCK_UVSTEP, \ 416 .ramp_delay = MAX77686_RAMP_DELAY, \ 417 .enable_time = MAX77686_BUCK_ENABLE_TIME, \ 418 .n_voltages = MAX77686_VSEL_MASK + 1, \ 419 .vsel_reg = MAX77686_REG_BUCK5OUT + (num - 5) * 2, \ 420 .vsel_mask = MAX77686_VSEL_MASK, \ 421 .enable_reg = MAX77686_REG_BUCK5CTRL + (num - 5) * 2, \ 422 .enable_mask = MAX77686_OPMODE_MASK, \ 423 } 424 #define regulator_desc_buck1(num) { \ 425 .name = "BUCK"#num, \ 426 .of_match = of_match_ptr("BUCK"#num), \ 427 .regulators_node = of_match_ptr("voltage-regulators"), \ 428 .id = MAX77686_BUCK##num, \ 429 .ops = &max77686_buck1_ops, \ 430 .type = REGULATOR_VOLTAGE, \ 431 .owner = THIS_MODULE, \ 432 .min_uV = MAX77686_BUCK_MINUV, \ 433 .uV_step = MAX77686_BUCK_UVSTEP, \ 434 .ramp_delay = MAX77686_RAMP_DELAY, \ 435 .enable_time = MAX77686_BUCK_ENABLE_TIME, \ 436 .n_voltages = MAX77686_VSEL_MASK + 1, \ 437 .vsel_reg = MAX77686_REG_BUCK1OUT, \ 438 .vsel_mask = MAX77686_VSEL_MASK, \ 439 .enable_reg = MAX77686_REG_BUCK1CTRL, \ 440 .enable_mask = MAX77686_OPMODE_MASK, \ 441 } 442 #define regulator_desc_buck_dvs(num) { \ 443 .name = "BUCK"#num, \ 444 .of_match = of_match_ptr("BUCK"#num), \ 445 .regulators_node = of_match_ptr("voltage-regulators"), \ 446 .id = MAX77686_BUCK##num, \ 447 .ops = &max77686_buck_dvs_ops, \ 448 .type = REGULATOR_VOLTAGE, \ 449 .owner = THIS_MODULE, \ 450 .min_uV = MAX77686_DVS_MINUV, \ 451 .uV_step = MAX77686_DVS_UVSTEP, \ 452 .ramp_delay = MAX77686_DVS_RAMP_DELAY, \ 453 .enable_time = MAX77686_DVS_ENABLE_TIME, \ 454 .n_voltages = MAX77686_DVS_VSEL_MASK + 1, \ 455 .vsel_reg = MAX77686_REG_BUCK2DVS1 + (num - 2) * 10, \ 456 .vsel_mask = MAX77686_DVS_VSEL_MASK, \ 457 .enable_reg = MAX77686_REG_BUCK2CTRL1 + (num - 2) * 10, \ 458 .enable_mask = MAX77686_OPMODE_MASK \ 459 << MAX77686_OPMODE_BUCK234_SHIFT, \ 460 } 461 462 static const struct regulator_desc regulators[] = { 463 regulator_desc_ldo1_low(1), 464 regulator_desc_ldo_low(2), 465 regulator_desc_ldo(3), 466 regulator_desc_ldo(4), 467 regulator_desc_ldo(5), 468 regulator_desc_ldo_low(6), 469 regulator_desc_ldo_low(7), 470 regulator_desc_ldo_low(8), 471 regulator_desc_ldo(9), 472 regulator_desc_lpm_ldo(10), 473 regulator_desc_lpm_ldo(11), 474 regulator_desc_lpm_ldo(12), 475 regulator_desc_ldo(13), 476 regulator_desc_lpm_ldo(14), 477 regulator_desc_ldo_low(15), 478 regulator_desc_lpm_ldo(16), 479 regulator_desc_ldo(17), 480 regulator_desc_ldo(18), 481 regulator_desc_ldo(19), 482 regulator_desc_ldo(20), 483 regulator_desc_ldo(21), 484 regulator_desc_ldo(22), 485 regulator_desc_ldo(23), 486 regulator_desc_ldo(24), 487 regulator_desc_ldo(25), 488 regulator_desc_ldo(26), 489 regulator_desc_buck1(1), 490 regulator_desc_buck_dvs(2), 491 regulator_desc_buck_dvs(3), 492 regulator_desc_buck_dvs(4), 493 regulator_desc_buck(5), 494 regulator_desc_buck(6), 495 regulator_desc_buck(7), 496 regulator_desc_buck(8), 497 regulator_desc_buck(9), 498 }; 499 500 static int max77686_pmic_probe(struct platform_device *pdev) 501 { 502 struct max77686_dev *iodev = dev_get_drvdata(pdev->dev.parent); 503 struct max77686_data *max77686; 504 int i; 505 struct regulator_config config = { }; 506 507 dev_dbg(&pdev->dev, "%s\n", __func__); 508 509 max77686 = devm_kzalloc(&pdev->dev, sizeof(struct max77686_data), 510 GFP_KERNEL); 511 if (!max77686) 512 return -ENOMEM; 513 514 max77686->dev = &pdev->dev; 515 config.dev = iodev->dev; 516 config.regmap = iodev->regmap; 517 config.driver_data = max77686; 518 platform_set_drvdata(pdev, max77686); 519 520 for (i = 0; i < MAX77686_REGULATORS; i++) { 521 struct regulator_dev *rdev; 522 int id = regulators[i].id; 523 524 max77686->opmode[id] = MAX77686_NORMAL; 525 rdev = devm_regulator_register(&pdev->dev, 526 ®ulators[i], &config); 527 if (IS_ERR(rdev)) { 528 int ret = PTR_ERR(rdev); 529 dev_err(&pdev->dev, 530 "regulator init failed for %d: %d\n", i, ret); 531 return ret; 532 } 533 } 534 535 return 0; 536 } 537 538 static const struct platform_device_id max77686_pmic_id[] = { 539 {"max77686-pmic", 0}, 540 { }, 541 }; 542 MODULE_DEVICE_TABLE(platform, max77686_pmic_id); 543 544 static struct platform_driver max77686_pmic_driver = { 545 .driver = { 546 .name = "max77686-pmic", 547 }, 548 .probe = max77686_pmic_probe, 549 .id_table = max77686_pmic_id, 550 }; 551 552 module_platform_driver(max77686_pmic_driver); 553 554 MODULE_DESCRIPTION("MAXIM 77686 Regulator Driver"); 555 MODULE_AUTHOR("Chiwoong Byun <woong.byun@samsung.com>"); 556 MODULE_LICENSE("GPL"); 557