Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

regulator: rk808: Add regulator driver for RK818

Add support for the rk818 regulator. The regulator module consists
of 4 DCDCs, 9 LDOs, 1 switch and 1 BOOST converter which is used to
power OTG and HDMI5V.

The output voltages are configurable and are meant to supply power
to the main processor and other components.

Signed-off-by: Wadim Egorov <w.egorov@phytec.de>
Acked-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Lee Jones <lee.jones@linaro.org>

authored by

Wadim Egorov and committed by
Lee Jones
11375293 2eedcbfc

+138 -9
+2 -2
drivers/regulator/Kconfig
··· 635 635 outputs which can be controlled by i2c communication. 636 636 637 637 config REGULATOR_RK808 638 - tristate "Rockchip RK808 Power regulators" 638 + tristate "Rockchip RK808/RK818 Power regulators" 639 639 depends on MFD_RK808 640 640 help 641 641 Select this option to enable the power regulator of ROCKCHIP 642 - PMIC RK808. 642 + PMIC RK808 and RK818. 643 643 This driver supports the control of different power rails of device 644 644 through regulator interface. The device supports multiple DCDC/LDO 645 645 outputs which can be controlled by i2c communication.
+136 -7
drivers/regulator/rk808-regulator.c
··· 1 1 /* 2 - * Regulator driver for Rockchip RK808 2 + * Regulator driver for Rockchip RK808/RK818 3 3 * 4 4 * Copyright (c) 2014, Fuzhou Rockchip Electronics Co., Ltd 5 5 * 6 6 * Author: Chris Zhong <zyw@rock-chips.com> 7 7 * Author: Zhang Qing <zhangqing@rock-chips.com> 8 + * 9 + * Copyright (C) 2016 PHYTEC Messtechnik GmbH 10 + * 11 + * Author: Wadim Egorov <w.egorov@phytec.de> 8 12 * 9 13 * This program is free software; you can redistribute it and/or modify it 10 14 * under the terms and conditions of the GNU General Public License, ··· 35 31 #define RK808_BUCK_VSEL_MASK 0x3f 36 32 #define RK808_BUCK4_VSEL_MASK 0xf 37 33 #define RK808_LDO_VSEL_MASK 0x1f 34 + 35 + #define RK818_BUCK_VSEL_MASK 0x3f 36 + #define RK818_BUCK4_VSEL_MASK 0x1f 37 + #define RK818_LDO_VSEL_MASK 0x1f 38 + #define RK818_LDO3_ON_VSEL_MASK 0xf 39 + #define RK818_BOOST_ON_VSEL_MASK 0xe0 38 40 39 41 /* Ramp rate definitions for buck1 / buck2 only */ 40 42 #define RK808_RAMP_RATE_OFFSET 3 ··· 464 454 RK808_DCDC_EN_REG, BIT(6)), 465 455 }; 466 456 457 + static const struct regulator_desc rk818_reg[] = { 458 + { 459 + .name = "DCDC_REG1", 460 + .supply_name = "vcc1", 461 + .of_match = of_match_ptr("DCDC_REG1"), 462 + .regulators_node = of_match_ptr("regulators"), 463 + .id = RK818_ID_DCDC1, 464 + .ops = &rk808_reg_ops, 465 + .type = REGULATOR_VOLTAGE, 466 + .min_uV = 712500, 467 + .uV_step = 12500, 468 + .n_voltages = 64, 469 + .vsel_reg = RK818_BUCK1_ON_VSEL_REG, 470 + .vsel_mask = RK818_BUCK_VSEL_MASK, 471 + .enable_reg = RK818_DCDC_EN_REG, 472 + .enable_mask = BIT(0), 473 + .owner = THIS_MODULE, 474 + }, { 475 + .name = "DCDC_REG2", 476 + .supply_name = "vcc2", 477 + .of_match = of_match_ptr("DCDC_REG2"), 478 + .regulators_node = of_match_ptr("regulators"), 479 + .id = RK818_ID_DCDC2, 480 + .ops = &rk808_reg_ops, 481 + .type = REGULATOR_VOLTAGE, 482 + .min_uV = 712500, 483 + .uV_step = 12500, 484 + .n_voltages = 64, 485 + .vsel_reg = RK818_BUCK2_ON_VSEL_REG, 486 + .vsel_mask = RK818_BUCK_VSEL_MASK, 487 + .enable_reg = RK818_DCDC_EN_REG, 488 + .enable_mask = BIT(1), 489 + .owner = THIS_MODULE, 490 + }, { 491 + .name = "DCDC_REG3", 492 + .supply_name = "vcc3", 493 + .of_match = of_match_ptr("DCDC_REG3"), 494 + .regulators_node = of_match_ptr("regulators"), 495 + .id = RK818_ID_DCDC3, 496 + .ops = &rk808_switch_ops, 497 + .type = REGULATOR_VOLTAGE, 498 + .n_voltages = 1, 499 + .enable_reg = RK818_DCDC_EN_REG, 500 + .enable_mask = BIT(2), 501 + .owner = THIS_MODULE, 502 + }, 503 + RK8XX_DESC(RK818_ID_DCDC4, "DCDC_REG4", "vcc4", 1800, 3600, 100, 504 + RK818_BUCK4_ON_VSEL_REG, RK818_BUCK4_VSEL_MASK, 505 + RK818_DCDC_EN_REG, BIT(3), 0), 506 + RK8XX_DESC(RK818_ID_BOOST, "DCDC_BOOST", "boost", 4700, 5400, 100, 507 + RK818_BOOST_LDO9_ON_VSEL_REG, RK818_BOOST_ON_VSEL_MASK, 508 + RK818_DCDC_EN_REG, BIT(4), 0), 509 + RK8XX_DESC(RK818_ID_LDO1, "LDO_REG1", "vcc6", 1800, 3400, 100, 510 + RK818_LDO1_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG, 511 + BIT(0), 400), 512 + RK8XX_DESC(RK818_ID_LDO2, "LDO_REG2", "vcc6", 1800, 3400, 100, 513 + RK818_LDO1_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG, 514 + BIT(1), 400), 515 + { 516 + .name = "LDO_REG3", 517 + .supply_name = "vcc7", 518 + .of_match = of_match_ptr("LDO_REG3"), 519 + .regulators_node = of_match_ptr("regulators"), 520 + .id = RK818_ID_LDO3, 521 + .ops = &rk808_reg_ops_ranges, 522 + .type = REGULATOR_VOLTAGE, 523 + .n_voltages = 16, 524 + .linear_ranges = rk808_ldo3_voltage_ranges, 525 + .n_linear_ranges = ARRAY_SIZE(rk808_ldo3_voltage_ranges), 526 + .vsel_reg = RK818_LDO3_ON_VSEL_REG, 527 + .vsel_mask = RK818_LDO3_ON_VSEL_MASK, 528 + .enable_reg = RK818_LDO_EN_REG, 529 + .enable_mask = BIT(2), 530 + .enable_time = 400, 531 + .owner = THIS_MODULE, 532 + }, 533 + RK8XX_DESC(RK818_ID_LDO4, "LDO_REG4", "vcc8", 1800, 3400, 100, 534 + RK818_LDO4_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG, 535 + BIT(3), 400), 536 + RK8XX_DESC(RK818_ID_LDO5, "LDO_REG5", "vcc7", 1800, 3400, 100, 537 + RK818_LDO5_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG, 538 + BIT(4), 400), 539 + RK8XX_DESC(RK818_ID_LDO6, "LDO_REG6", "vcc8", 800, 2500, 100, 540 + RK818_LDO6_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG, 541 + BIT(5), 400), 542 + RK8XX_DESC(RK818_ID_LDO7, "LDO_REG7", "vcc7", 800, 2500, 100, 543 + RK818_LDO7_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG, 544 + BIT(6), 400), 545 + RK8XX_DESC(RK818_ID_LDO8, "LDO_REG8", "vcc8", 1800, 3400, 100, 546 + RK818_LDO8_ON_VSEL_REG, RK818_LDO_VSEL_MASK, RK818_LDO_EN_REG, 547 + BIT(7), 400), 548 + RK8XX_DESC(RK818_ID_LDO9, "LDO_REG9", "vcc9", 1800, 3400, 100, 549 + RK818_BOOST_LDO9_ON_VSEL_REG, RK818_LDO_VSEL_MASK, 550 + RK818_DCDC_EN_REG, BIT(5), 400), 551 + RK8XX_DESC_SWITCH(RK818_ID_SWITCH, "SWITCH_REG", "vcc9", 552 + RK818_DCDC_EN_REG, BIT(6)), 553 + RK8XX_DESC_SWITCH(RK818_ID_HDMI_SWITCH, "HDMI_SWITCH", "h_5v", 554 + RK818_H5V_EN_REG, BIT(0)), 555 + RK8XX_DESC_SWITCH(RK818_ID_OTG_SWITCH, "OTG_SWITCH", "usb", 556 + RK818_DCDC_EN_REG, BIT(7)), 557 + }; 558 + 467 559 static int rk808_regulator_dt_parse_pdata(struct device *dev, 468 560 struct device *client_dev, 469 561 struct regmap *map, ··· 611 499 struct regulator_config config = {}; 612 500 struct regulator_dev *rk808_rdev; 613 501 struct rk808_regulator_data *pdata; 614 - int ret, i; 502 + const struct regulator_desc *regulators; 503 + int ret, i, nregulators; 615 504 616 505 pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); 617 506 if (!pdata) ··· 625 512 626 513 platform_set_drvdata(pdev, pdata); 627 514 515 + switch (rk808->variant) { 516 + case RK808_ID: 517 + regulators = rk808_reg; 518 + nregulators = RK808_NUM_REGULATORS; 519 + break; 520 + case RK818_ID: 521 + regulators = rk818_reg; 522 + nregulators = RK818_NUM_REGULATORS; 523 + break; 524 + default: 525 + dev_err(&client->dev, "unsupported RK8XX ID %lu\n", 526 + rk808->variant); 527 + return -EINVAL; 528 + } 529 + 628 530 config.dev = &client->dev; 629 531 config.driver_data = pdata; 630 532 config.regmap = rk808->regmap; 631 533 632 534 /* Instantiate the regulators */ 633 - for (i = 0; i < RK808_NUM_REGULATORS; i++) { 535 + for (i = 0; i < nregulators; i++) { 634 536 rk808_rdev = devm_regulator_register(&pdev->dev, 635 - &rk808_reg[i], &config); 537 + &regulators[i], &config); 636 538 if (IS_ERR(rk808_rdev)) { 637 539 dev_err(&client->dev, 638 540 "failed to register %d regulator\n", i); ··· 668 540 669 541 module_platform_driver(rk808_regulator_driver); 670 542 671 - MODULE_DESCRIPTION("regulator driver for the rk808 series PMICs"); 672 - MODULE_AUTHOR("Chris Zhong<zyw@rock-chips.com>"); 673 - MODULE_AUTHOR("Zhang Qing<zhangqing@rock-chips.com>"); 543 + MODULE_DESCRIPTION("regulator driver for the RK808/RK818 series PMICs"); 544 + MODULE_AUTHOR("Chris Zhong <zyw@rock-chips.com>"); 545 + MODULE_AUTHOR("Zhang Qing <zhangqing@rock-chips.com>"); 546 + MODULE_AUTHOR("Wadim Egorov <w.egorov@phytec.de>"); 674 547 MODULE_LICENSE("GPL"); 675 548 MODULE_ALIAS("platform:rk808-regulator");