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

regulator: Add X-Powers AXP15060/AXP313a PMIC

Merge series from Andre Przywara <andre.przywara@arm.com>:

This patch series adds support for the X-Powers AXP15060 and AXP313a
PMIC, which are general purpose PMICs as seen on different boards with
different SOCs, mostly from Allwinner.

This is mostly a repost of the previous patches, combining both the
AXP313a and AXP15060 series, rebased on top of v6.4-rc3, and omitting
the patches that already got merged.
The first two patches are the successors of the AXP313a v10 post,
the third patch is based on Shengyu's AXP15060 v3 post.

There were no code changes, just some tiny context differences due to
the rebase, plus I added the newly gained tags.

As the DT bindings and the AXP15060 MFD part are already in the tree,
this is just completing support with the MFD part for the AXP313a, and
the regulator support for both PMICs.

+393 -9
+2
drivers/mfd/axp20x-i2c.c
··· 63 63 { .compatible = "x-powers,axp209", .data = (void *)AXP209_ID }, 64 64 { .compatible = "x-powers,axp221", .data = (void *)AXP221_ID }, 65 65 { .compatible = "x-powers,axp223", .data = (void *)AXP223_ID }, 66 + { .compatible = "x-powers,axp313a", .data = (void *)AXP313A_ID }, 66 67 { .compatible = "x-powers,axp803", .data = (void *)AXP803_ID }, 67 68 { .compatible = "x-powers,axp806", .data = (void *)AXP806_ID }, 68 69 { .compatible = "x-powers,axp15060", .data = (void *)AXP15060_ID }, ··· 78 77 { "axp209", 0 }, 79 78 { "axp221", 0 }, 80 79 { "axp223", 0 }, 80 + { "axp313a", 0 }, 81 81 { "axp803", 0 }, 82 82 { "axp806", 0 }, 83 83 { "axp15060", 0 },
+77 -1
drivers/mfd/axp20x.c
··· 39 39 "AXP221", 40 40 "AXP223", 41 41 "AXP288", 42 + "AXP313a", 42 43 "AXP803", 43 44 "AXP806", 44 45 "AXP809", ··· 157 156 regmap_reg_range(AXP806_REG_ADDR_EXT, AXP806_REG_ADDR_EXT), 158 157 }; 159 158 159 + static const struct regmap_range axp313a_writeable_ranges[] = { 160 + regmap_reg_range(AXP313A_ON_INDICATE, AXP313A_IRQ_STATE), 161 + }; 162 + 163 + static const struct regmap_range axp313a_volatile_ranges[] = { 164 + regmap_reg_range(AXP313A_SHUTDOWN_CTRL, AXP313A_SHUTDOWN_CTRL), 165 + regmap_reg_range(AXP313A_IRQ_STATE, AXP313A_IRQ_STATE), 166 + }; 167 + 168 + static const struct regmap_access_table axp313a_writeable_table = { 169 + .yes_ranges = axp313a_writeable_ranges, 170 + .n_yes_ranges = ARRAY_SIZE(axp313a_writeable_ranges), 171 + }; 172 + 173 + static const struct regmap_access_table axp313a_volatile_table = { 174 + .yes_ranges = axp313a_volatile_ranges, 175 + .n_yes_ranges = ARRAY_SIZE(axp313a_volatile_ranges), 176 + }; 177 + 160 178 static const struct regmap_range axp806_volatile_ranges[] = { 161 179 regmap_reg_range(AXP20X_IRQ1_STATE, AXP20X_IRQ2_STATE), 162 180 }; ··· 268 248 DEFINE_RES_IRQ(AXP288_IRQ_WL1), 269 249 }; 270 250 251 + static const struct resource axp313a_pek_resources[] = { 252 + DEFINE_RES_IRQ_NAMED(AXP313A_IRQ_PEK_RIS_EDGE, "PEK_DBR"), 253 + DEFINE_RES_IRQ_NAMED(AXP313A_IRQ_PEK_FAL_EDGE, "PEK_DBF"), 254 + }; 255 + 271 256 static const struct resource axp803_pek_resources[] = { 272 257 DEFINE_RES_IRQ_NAMED(AXP803_IRQ_PEK_RIS_EDGE, "PEK_DBR"), 273 258 DEFINE_RES_IRQ_NAMED(AXP803_IRQ_PEK_FAL_EDGE, "PEK_DBF"), ··· 327 302 .volatile_table = &axp288_volatile_table, 328 303 .max_register = AXP288_FG_TUNE5, 329 304 .cache_type = REGCACHE_RBTREE, 305 + }; 306 + 307 + static const struct regmap_config axp313a_regmap_config = { 308 + .reg_bits = 8, 309 + .val_bits = 8, 310 + .wr_table = &axp313a_writeable_table, 311 + .volatile_table = &axp313a_volatile_table, 312 + .max_register = AXP313A_IRQ_STATE, 313 + .cache_type = REGCACHE_RBTREE, 330 314 }; 331 315 332 316 static const struct regmap_config axp806_regmap_config = { ··· 490 456 INIT_REGMAP_IRQ(AXP288, BC_USB_CHNG, 5, 1), 491 457 }; 492 458 459 + static const struct regmap_irq axp313a_regmap_irqs[] = { 460 + INIT_REGMAP_IRQ(AXP313A, PEK_RIS_EDGE, 0, 7), 461 + INIT_REGMAP_IRQ(AXP313A, PEK_FAL_EDGE, 0, 6), 462 + INIT_REGMAP_IRQ(AXP313A, PEK_SHORT, 0, 5), 463 + INIT_REGMAP_IRQ(AXP313A, PEK_LONG, 0, 4), 464 + INIT_REGMAP_IRQ(AXP313A, DCDC3_V_LOW, 0, 3), 465 + INIT_REGMAP_IRQ(AXP313A, DCDC2_V_LOW, 0, 2), 466 + INIT_REGMAP_IRQ(AXP313A, DIE_TEMP_HIGH, 0, 0), 467 + }; 468 + 493 469 static const struct regmap_irq axp803_regmap_irqs[] = { 494 470 INIT_REGMAP_IRQ(AXP803, ACIN_OVER_V, 0, 7), 495 471 INIT_REGMAP_IRQ(AXP803, ACIN_PLUGIN, 0, 6), ··· 650 606 651 607 }; 652 608 609 + static const struct regmap_irq_chip axp313a_regmap_irq_chip = { 610 + .name = "axp313a_irq_chip", 611 + .status_base = AXP313A_IRQ_STATE, 612 + .ack_base = AXP313A_IRQ_STATE, 613 + .unmask_base = AXP313A_IRQ_EN, 614 + .init_ack_masked = true, 615 + .irqs = axp313a_regmap_irqs, 616 + .num_irqs = ARRAY_SIZE(axp313a_regmap_irqs), 617 + .num_regs = 1, 618 + }; 619 + 653 620 static const struct regmap_irq_chip axp803_regmap_irq_chip = { 654 621 .name = "axp803", 655 622 .status_base = AXP20X_IRQ1_STATE, ··· 798 743 .num_resources = ARRAY_SIZE(axp152_pek_resources), 799 744 .resources = axp152_pek_resources, 800 745 }, 746 + }; 747 + 748 + static struct mfd_cell axp313a_cells[] = { 749 + MFD_CELL_NAME("axp20x-regulator"), 750 + MFD_CELL_RES("axp313a-pek", axp313a_pek_resources), 801 751 }; 802 752 803 753 static const struct resource axp288_adc_resources[] = { ··· 974 914 static int axp20x_power_off(struct sys_off_data *data) 975 915 { 976 916 struct axp20x_dev *axp20x = data->cb_data; 917 + unsigned int shutdown_reg; 977 918 978 - regmap_write(axp20x->regmap, AXP20X_OFF_CTRL, AXP20X_OFF); 919 + switch (axp20x->variant) { 920 + case AXP313A_ID: 921 + shutdown_reg = AXP313A_SHUTDOWN_CTRL; 922 + break; 923 + default: 924 + shutdown_reg = AXP20X_OFF_CTRL; 925 + break; 926 + } 927 + 928 + regmap_write(axp20x->regmap, shutdown_reg, AXP20X_OFF); 979 929 980 930 /* Give capacitors etc. time to drain to avoid kernel panic msg. */ 981 931 mdelay(500); ··· 1047 977 axp20x->regmap_cfg = &axp288_regmap_config; 1048 978 axp20x->regmap_irq_chip = &axp288_regmap_irq_chip; 1049 979 axp20x->irq_flags = IRQF_TRIGGER_LOW; 980 + break; 981 + case AXP313A_ID: 982 + axp20x->nr_cells = ARRAY_SIZE(axp313a_cells); 983 + axp20x->cells = axp313a_cells; 984 + axp20x->regmap_cfg = &axp313a_regmap_config; 985 + axp20x->regmap_irq_chip = &axp313a_regmap_irq_chip; 1050 986 break; 1051 987 case AXP803_ID: 1052 988 axp20x->nr_cells = ARRAY_SIZE(axp803_cells);
+282 -8
drivers/regulator/axp20x-regulator.c
··· 134 134 #define AXP22X_PWR_OUT_DLDO4_MASK BIT_MASK(6) 135 135 #define AXP22X_PWR_OUT_ALDO3_MASK BIT_MASK(7) 136 136 137 + #define AXP313A_DCDC1_NUM_VOLTAGES 107 138 + #define AXP313A_DCDC23_NUM_VOLTAGES 88 139 + #define AXP313A_DCDC_V_OUT_MASK GENMASK(6, 0) 140 + #define AXP313A_LDO_V_OUT_MASK GENMASK(4, 0) 141 + 137 142 #define AXP803_PWR_OUT_DCDC1_MASK BIT_MASK(0) 138 143 #define AXP803_PWR_OUT_DCDC2_MASK BIT_MASK(1) 139 144 #define AXP803_PWR_OUT_DCDC3_MASK BIT_MASK(2) ··· 274 269 #define AXP813_DCDC7_V_OUT_MASK GENMASK(6, 0) 275 270 276 271 #define AXP813_PWR_OUT_DCDC7_MASK BIT_MASK(6) 272 + 273 + #define AXP15060_DCDC1_V_CTRL_MASK GENMASK(4, 0) 274 + #define AXP15060_DCDC2_V_CTRL_MASK GENMASK(6, 0) 275 + #define AXP15060_DCDC3_V_CTRL_MASK GENMASK(6, 0) 276 + #define AXP15060_DCDC4_V_CTRL_MASK GENMASK(6, 0) 277 + #define AXP15060_DCDC5_V_CTRL_MASK GENMASK(6, 0) 278 + #define AXP15060_DCDC6_V_CTRL_MASK GENMASK(4, 0) 279 + #define AXP15060_ALDO1_V_CTRL_MASK GENMASK(4, 0) 280 + #define AXP15060_ALDO2_V_CTRL_MASK GENMASK(4, 0) 281 + #define AXP15060_ALDO3_V_CTRL_MASK GENMASK(4, 0) 282 + #define AXP15060_ALDO4_V_CTRL_MASK GENMASK(4, 0) 283 + #define AXP15060_ALDO5_V_CTRL_MASK GENMASK(4, 0) 284 + #define AXP15060_BLDO1_V_CTRL_MASK GENMASK(4, 0) 285 + #define AXP15060_BLDO2_V_CTRL_MASK GENMASK(4, 0) 286 + #define AXP15060_BLDO3_V_CTRL_MASK GENMASK(4, 0) 287 + #define AXP15060_BLDO4_V_CTRL_MASK GENMASK(4, 0) 288 + #define AXP15060_BLDO5_V_CTRL_MASK GENMASK(4, 0) 289 + #define AXP15060_CLDO1_V_CTRL_MASK GENMASK(4, 0) 290 + #define AXP15060_CLDO2_V_CTRL_MASK GENMASK(4, 0) 291 + #define AXP15060_CLDO3_V_CTRL_MASK GENMASK(4, 0) 292 + #define AXP15060_CLDO4_V_CTRL_MASK GENMASK(5, 0) 293 + #define AXP15060_CPUSLDO_V_CTRL_MASK GENMASK(3, 0) 294 + 295 + #define AXP15060_PWR_OUT_DCDC1_MASK BIT_MASK(0) 296 + #define AXP15060_PWR_OUT_DCDC2_MASK BIT_MASK(1) 297 + #define AXP15060_PWR_OUT_DCDC3_MASK BIT_MASK(2) 298 + #define AXP15060_PWR_OUT_DCDC4_MASK BIT_MASK(3) 299 + #define AXP15060_PWR_OUT_DCDC5_MASK BIT_MASK(4) 300 + #define AXP15060_PWR_OUT_DCDC6_MASK BIT_MASK(5) 301 + #define AXP15060_PWR_OUT_ALDO1_MASK BIT_MASK(0) 302 + #define AXP15060_PWR_OUT_ALDO2_MASK BIT_MASK(1) 303 + #define AXP15060_PWR_OUT_ALDO3_MASK BIT_MASK(2) 304 + #define AXP15060_PWR_OUT_ALDO4_MASK BIT_MASK(3) 305 + #define AXP15060_PWR_OUT_ALDO5_MASK BIT_MASK(4) 306 + #define AXP15060_PWR_OUT_BLDO1_MASK BIT_MASK(5) 307 + #define AXP15060_PWR_OUT_BLDO2_MASK BIT_MASK(6) 308 + #define AXP15060_PWR_OUT_BLDO3_MASK BIT_MASK(7) 309 + #define AXP15060_PWR_OUT_BLDO4_MASK BIT_MASK(0) 310 + #define AXP15060_PWR_OUT_BLDO5_MASK BIT_MASK(1) 311 + #define AXP15060_PWR_OUT_CLDO1_MASK BIT_MASK(2) 312 + #define AXP15060_PWR_OUT_CLDO2_MASK BIT_MASK(3) 313 + #define AXP15060_PWR_OUT_CLDO3_MASK BIT_MASK(4) 314 + #define AXP15060_PWR_OUT_CLDO4_MASK BIT_MASK(5) 315 + #define AXP15060_PWR_OUT_CPUSLDO_MASK BIT_MASK(6) 316 + #define AXP15060_PWR_OUT_SW_MASK BIT_MASK(7) 317 + 318 + #define AXP15060_DCDC23_POLYPHASE_DUAL_MASK BIT_MASK(6) 319 + #define AXP15060_DCDC46_POLYPHASE_DUAL_MASK BIT_MASK(7) 320 + 321 + #define AXP15060_DCDC234_500mV_START 0x00 322 + #define AXP15060_DCDC234_500mV_STEPS 70 323 + #define AXP15060_DCDC234_500mV_END \ 324 + (AXP15060_DCDC234_500mV_START + AXP15060_DCDC234_500mV_STEPS) 325 + #define AXP15060_DCDC234_1220mV_START 0x47 326 + #define AXP15060_DCDC234_1220mV_STEPS 16 327 + #define AXP15060_DCDC234_1220mV_END \ 328 + (AXP15060_DCDC234_1220mV_START + AXP15060_DCDC234_1220mV_STEPS) 329 + #define AXP15060_DCDC234_NUM_VOLTAGES 88 330 + 331 + #define AXP15060_DCDC5_800mV_START 0x00 332 + #define AXP15060_DCDC5_800mV_STEPS 32 333 + #define AXP15060_DCDC5_800mV_END \ 334 + (AXP15060_DCDC5_800mV_START + AXP15060_DCDC5_800mV_STEPS) 335 + #define AXP15060_DCDC5_1140mV_START 0x21 336 + #define AXP15060_DCDC5_1140mV_STEPS 35 337 + #define AXP15060_DCDC5_1140mV_END \ 338 + (AXP15060_DCDC5_1140mV_START + AXP15060_DCDC5_1140mV_STEPS) 339 + #define AXP15060_DCDC5_NUM_VOLTAGES 69 277 340 278 341 #define AXP_DESC_IO(_family, _id, _match, _supply, _min, _max, _step, _vreg, \ 279 342 _vmask, _ereg, _emask, _enable_val, _disable_val) \ ··· 711 638 .ops = &axp20x_ops_sw, 712 639 }; 713 640 641 + static const struct linear_range axp313a_dcdc1_ranges[] = { 642 + REGULATOR_LINEAR_RANGE(500000, 0, 70, 10000), 643 + REGULATOR_LINEAR_RANGE(1220000, 71, 87, 20000), 644 + REGULATOR_LINEAR_RANGE(1600000, 88, 106, 100000), 645 + }; 646 + 647 + static const struct linear_range axp313a_dcdc2_ranges[] = { 648 + REGULATOR_LINEAR_RANGE(500000, 0, 70, 10000), 649 + REGULATOR_LINEAR_RANGE(1220000, 71, 87, 20000), 650 + }; 651 + 652 + /* 653 + * This is deviating from the datasheet. The values here are taken from the 654 + * BSP driver and have been confirmed by measurements. 655 + */ 656 + static const struct linear_range axp313a_dcdc3_ranges[] = { 657 + REGULATOR_LINEAR_RANGE(500000, 0, 70, 10000), 658 + REGULATOR_LINEAR_RANGE(1220000, 71, 102, 20000), 659 + }; 660 + 661 + static const struct regulator_desc axp313a_regulators[] = { 662 + AXP_DESC_RANGES(AXP313A, DCDC1, "dcdc1", "vin1", 663 + axp313a_dcdc1_ranges, AXP313A_DCDC1_NUM_VOLTAGES, 664 + AXP313A_DCDC1_CONRTOL, AXP313A_DCDC_V_OUT_MASK, 665 + AXP313A_OUTPUT_CONTROL, BIT(0)), 666 + AXP_DESC_RANGES(AXP313A, DCDC2, "dcdc2", "vin2", 667 + axp313a_dcdc2_ranges, AXP313A_DCDC23_NUM_VOLTAGES, 668 + AXP313A_DCDC2_CONRTOL, AXP313A_DCDC_V_OUT_MASK, 669 + AXP313A_OUTPUT_CONTROL, BIT(1)), 670 + AXP_DESC_RANGES(AXP313A, DCDC3, "dcdc3", "vin3", 671 + axp313a_dcdc3_ranges, AXP313A_DCDC23_NUM_VOLTAGES, 672 + AXP313A_DCDC3_CONRTOL, AXP313A_DCDC_V_OUT_MASK, 673 + AXP313A_OUTPUT_CONTROL, BIT(2)), 674 + AXP_DESC(AXP313A, ALDO1, "aldo1", "vin1", 500, 3500, 100, 675 + AXP313A_ALDO1_CONRTOL, AXP313A_LDO_V_OUT_MASK, 676 + AXP313A_OUTPUT_CONTROL, BIT(3)), 677 + AXP_DESC(AXP313A, DLDO1, "dldo1", "vin1", 500, 3500, 100, 678 + AXP313A_DLDO1_CONRTOL, AXP313A_LDO_V_OUT_MASK, 679 + AXP313A_OUTPUT_CONTROL, BIT(4)), 680 + AXP_DESC_FIXED(AXP313A, RTC_LDO, "rtc-ldo", "vin1", 1800), 681 + }; 682 + 714 683 /* DCDC ranges shared with AXP813 */ 715 684 static const struct linear_range axp803_dcdc234_ranges[] = { 716 685 REGULATOR_LINEAR_RANGE(500000, ··· 1116 1001 AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DC1SW_MASK), 1117 1002 }; 1118 1003 1004 + static const struct linear_range axp15060_dcdc234_ranges[] = { 1005 + REGULATOR_LINEAR_RANGE(500000, 1006 + AXP15060_DCDC234_500mV_START, 1007 + AXP15060_DCDC234_500mV_END, 1008 + 10000), 1009 + REGULATOR_LINEAR_RANGE(1220000, 1010 + AXP15060_DCDC234_1220mV_START, 1011 + AXP15060_DCDC234_1220mV_END, 1012 + 20000), 1013 + }; 1014 + 1015 + static const struct linear_range axp15060_dcdc5_ranges[] = { 1016 + REGULATOR_LINEAR_RANGE(800000, 1017 + AXP15060_DCDC5_800mV_START, 1018 + AXP15060_DCDC5_800mV_END, 1019 + 10000), 1020 + REGULATOR_LINEAR_RANGE(1140000, 1021 + AXP15060_DCDC5_1140mV_START, 1022 + AXP15060_DCDC5_1140mV_END, 1023 + 20000), 1024 + }; 1025 + 1026 + static const struct regulator_desc axp15060_regulators[] = { 1027 + AXP_DESC(AXP15060, DCDC1, "dcdc1", "vin1", 1500, 3400, 100, 1028 + AXP15060_DCDC1_V_CTRL, AXP15060_DCDC1_V_CTRL_MASK, 1029 + AXP15060_PWR_OUT_CTRL1, AXP15060_PWR_OUT_DCDC1_MASK), 1030 + AXP_DESC_RANGES(AXP15060, DCDC2, "dcdc2", "vin2", 1031 + axp15060_dcdc234_ranges, AXP15060_DCDC234_NUM_VOLTAGES, 1032 + AXP15060_DCDC2_V_CTRL, AXP15060_DCDC2_V_CTRL_MASK, 1033 + AXP15060_PWR_OUT_CTRL1, AXP15060_PWR_OUT_DCDC2_MASK), 1034 + AXP_DESC_RANGES(AXP15060, DCDC3, "dcdc3", "vin3", 1035 + axp15060_dcdc234_ranges, AXP15060_DCDC234_NUM_VOLTAGES, 1036 + AXP15060_DCDC3_V_CTRL, AXP15060_DCDC3_V_CTRL_MASK, 1037 + AXP15060_PWR_OUT_CTRL1, AXP15060_PWR_OUT_DCDC3_MASK), 1038 + AXP_DESC_RANGES(AXP15060, DCDC4, "dcdc4", "vin4", 1039 + axp15060_dcdc234_ranges, AXP15060_DCDC234_NUM_VOLTAGES, 1040 + AXP15060_DCDC4_V_CTRL, AXP15060_DCDC4_V_CTRL_MASK, 1041 + AXP15060_PWR_OUT_CTRL1, AXP15060_PWR_OUT_DCDC4_MASK), 1042 + AXP_DESC_RANGES(AXP15060, DCDC5, "dcdc5", "vin5", 1043 + axp15060_dcdc5_ranges, AXP15060_DCDC5_NUM_VOLTAGES, 1044 + AXP15060_DCDC5_V_CTRL, AXP15060_DCDC5_V_CTRL_MASK, 1045 + AXP15060_PWR_OUT_CTRL1, AXP15060_PWR_OUT_DCDC5_MASK), 1046 + AXP_DESC(AXP15060, DCDC6, "dcdc6", "vin6", 500, 3400, 100, 1047 + AXP15060_DCDC6_V_CTRL, AXP15060_DCDC6_V_CTRL_MASK, 1048 + AXP15060_PWR_OUT_CTRL1, AXP15060_PWR_OUT_DCDC6_MASK), 1049 + AXP_DESC(AXP15060, ALDO1, "aldo1", "aldoin", 700, 3300, 100, 1050 + AXP15060_ALDO1_V_CTRL, AXP15060_ALDO1_V_CTRL_MASK, 1051 + AXP15060_PWR_OUT_CTRL2, AXP15060_PWR_OUT_ALDO1_MASK), 1052 + AXP_DESC(AXP15060, ALDO2, "aldo2", "aldoin", 700, 3300, 100, 1053 + AXP15060_ALDO2_V_CTRL, AXP15060_ALDO2_V_CTRL_MASK, 1054 + AXP15060_PWR_OUT_CTRL2, AXP15060_PWR_OUT_ALDO2_MASK), 1055 + AXP_DESC(AXP15060, ALDO3, "aldo3", "aldoin", 700, 3300, 100, 1056 + AXP15060_ALDO3_V_CTRL, AXP15060_ALDO3_V_CTRL_MASK, 1057 + AXP15060_PWR_OUT_CTRL2, AXP15060_PWR_OUT_ALDO3_MASK), 1058 + AXP_DESC(AXP15060, ALDO4, "aldo4", "aldoin", 700, 3300, 100, 1059 + AXP15060_ALDO4_V_CTRL, AXP15060_ALDO4_V_CTRL_MASK, 1060 + AXP15060_PWR_OUT_CTRL2, AXP15060_PWR_OUT_ALDO4_MASK), 1061 + AXP_DESC(AXP15060, ALDO5, "aldo5", "aldoin", 700, 3300, 100, 1062 + AXP15060_ALDO5_V_CTRL, AXP15060_ALDO5_V_CTRL_MASK, 1063 + AXP15060_PWR_OUT_CTRL2, AXP15060_PWR_OUT_ALDO5_MASK), 1064 + AXP_DESC(AXP15060, BLDO1, "bldo1", "bldoin", 700, 3300, 100, 1065 + AXP15060_BLDO1_V_CTRL, AXP15060_BLDO1_V_CTRL_MASK, 1066 + AXP15060_PWR_OUT_CTRL2, AXP15060_PWR_OUT_BLDO1_MASK), 1067 + AXP_DESC(AXP15060, BLDO2, "bldo2", "bldoin", 700, 3300, 100, 1068 + AXP15060_BLDO2_V_CTRL, AXP15060_BLDO2_V_CTRL_MASK, 1069 + AXP15060_PWR_OUT_CTRL2, AXP15060_PWR_OUT_BLDO2_MASK), 1070 + AXP_DESC(AXP15060, BLDO3, "bldo3", "bldoin", 700, 3300, 100, 1071 + AXP15060_BLDO3_V_CTRL, AXP15060_BLDO3_V_CTRL_MASK, 1072 + AXP15060_PWR_OUT_CTRL2, AXP15060_PWR_OUT_BLDO3_MASK), 1073 + AXP_DESC(AXP15060, BLDO4, "bldo4", "bldoin", 700, 3300, 100, 1074 + AXP15060_BLDO4_V_CTRL, AXP15060_BLDO4_V_CTRL_MASK, 1075 + AXP15060_PWR_OUT_CTRL3, AXP15060_PWR_OUT_BLDO4_MASK), 1076 + AXP_DESC(AXP15060, BLDO5, "bldo5", "bldoin", 700, 3300, 100, 1077 + AXP15060_BLDO5_V_CTRL, AXP15060_BLDO5_V_CTRL_MASK, 1078 + AXP15060_PWR_OUT_CTRL3, AXP15060_PWR_OUT_BLDO5_MASK), 1079 + AXP_DESC(AXP15060, CLDO1, "cldo1", "cldoin", 700, 3300, 100, 1080 + AXP15060_CLDO1_V_CTRL, AXP15060_CLDO1_V_CTRL_MASK, 1081 + AXP15060_PWR_OUT_CTRL3, AXP15060_PWR_OUT_CLDO1_MASK), 1082 + AXP_DESC(AXP15060, CLDO2, "cldo2", "cldoin", 700, 3300, 100, 1083 + AXP15060_CLDO2_V_CTRL, AXP15060_CLDO2_V_CTRL_MASK, 1084 + AXP15060_PWR_OUT_CTRL3, AXP15060_PWR_OUT_CLDO2_MASK), 1085 + AXP_DESC(AXP15060, CLDO3, "cldo3", "cldoin", 700, 3300, 100, 1086 + AXP15060_CLDO3_V_CTRL, AXP15060_CLDO3_V_CTRL_MASK, 1087 + AXP15060_PWR_OUT_CTRL3, AXP15060_PWR_OUT_CLDO3_MASK), 1088 + AXP_DESC(AXP15060, CLDO4, "cldo4", "cldoin", 700, 4200, 100, 1089 + AXP15060_CLDO4_V_CTRL, AXP15060_CLDO4_V_CTRL_MASK, 1090 + AXP15060_PWR_OUT_CTRL3, AXP15060_PWR_OUT_CLDO4_MASK), 1091 + /* Supply comes from DCDC5 */ 1092 + AXP_DESC(AXP15060, CPUSLDO, "cpusldo", NULL, 700, 1400, 50, 1093 + AXP15060_CPUSLDO_V_CTRL, AXP15060_CPUSLDO_V_CTRL_MASK, 1094 + AXP15060_PWR_OUT_CTRL3, AXP15060_PWR_OUT_CPUSLDO_MASK), 1095 + /* Supply comes from DCDC1 */ 1096 + AXP_DESC_SW(AXP15060, SW, "sw", NULL, 1097 + AXP15060_PWR_OUT_CTRL3, AXP15060_PWR_OUT_SW_MASK), 1098 + /* Supply comes from ALDO1 */ 1099 + AXP_DESC_FIXED(AXP15060, RTC_LDO, "rtc-ldo", NULL, 1800), 1100 + }; 1101 + 1119 1102 static int axp20x_set_dcdc_freq(struct platform_device *pdev, u32 dcdcfreq) 1120 1103 { 1121 1104 struct axp20x_dev *axp20x = dev_get_drvdata(pdev->dev.parent); ··· 1253 1040 def = 3000; 1254 1041 step = 150; 1255 1042 break; 1043 + case AXP313A_ID: 1044 + case AXP15060_ID: 1045 + /* The DCDC PWM frequency seems to be fixed to 3 MHz. */ 1046 + if (dcdcfreq != 0) { 1047 + dev_err(&pdev->dev, 1048 + "DCDC frequency on this PMIC is fixed to 3 MHz.\n"); 1049 + return -EINVAL; 1050 + } 1051 + 1052 + return 0; 1256 1053 default: 1257 1054 dev_err(&pdev->dev, 1258 1055 "Setting DCDC frequency for unsupported AXP variant\n"); ··· 1368 1145 workmode <<= id - AXP813_DCDC1; 1369 1146 break; 1370 1147 1148 + case AXP15060_ID: 1149 + reg = AXP15060_DCDC_MODE_CTRL2; 1150 + if (id < AXP15060_DCDC1 || id > AXP15060_DCDC6) 1151 + return -EINVAL; 1152 + 1153 + mask = AXP22X_WORKMODE_DCDCX_MASK(id - AXP15060_DCDC1); 1154 + workmode <<= id - AXP15060_DCDC1; 1155 + break; 1156 + 1371 1157 default: 1372 1158 /* should not happen */ 1373 1159 WARN_ON(1); ··· 1396 1164 1397 1165 /* 1398 1166 * Currently in our supported AXP variants, only AXP803, AXP806, 1399 - * and AXP813 have polyphase regulators. 1167 + * AXP813 and AXP15060 have polyphase regulators. 1400 1168 */ 1401 1169 switch (axp20x->variant) { 1402 1170 case AXP803_ID: ··· 1428 1196 } 1429 1197 break; 1430 1198 1199 + case AXP15060_ID: 1200 + regmap_read(axp20x->regmap, AXP15060_DCDC_MODE_CTRL1, &reg); 1201 + 1202 + switch (id) { 1203 + case AXP15060_DCDC3: 1204 + return !!(reg & AXP15060_DCDC23_POLYPHASE_DUAL_MASK); 1205 + case AXP15060_DCDC6: 1206 + return !!(reg & AXP15060_DCDC46_POLYPHASE_DUAL_MASK); 1207 + } 1208 + break; 1209 + 1431 1210 default: 1432 1211 return false; 1433 1212 } ··· 1460 1217 u32 workmode; 1461 1218 const char *dcdc1_name = axp22x_regulators[AXP22X_DCDC1].name; 1462 1219 const char *dcdc5_name = axp22x_regulators[AXP22X_DCDC5].name; 1220 + const char *aldo1_name = axp15060_regulators[AXP15060_ALDO1].name; 1463 1221 bool drivevbus = false; 1464 1222 1465 1223 switch (axp20x->variant) { ··· 1475 1231 nregulators = AXP22X_REG_ID_MAX; 1476 1232 drivevbus = of_property_read_bool(pdev->dev.parent->of_node, 1477 1233 "x-powers,drive-vbus-en"); 1234 + break; 1235 + case AXP313A_ID: 1236 + regulators = axp313a_regulators; 1237 + nregulators = AXP313A_REG_ID_MAX; 1478 1238 break; 1479 1239 case AXP803_ID: 1480 1240 regulators = axp803_regulators; ··· 1499 1251 nregulators = AXP813_REG_ID_MAX; 1500 1252 drivevbus = of_property_read_bool(pdev->dev.parent->of_node, 1501 1253 "x-powers,drive-vbus-en"); 1254 + break; 1255 + case AXP15060_ID: 1256 + regulators = axp15060_regulators; 1257 + nregulators = AXP15060_REG_ID_MAX; 1502 1258 break; 1503 1259 default: 1504 1260 dev_err(&pdev->dev, "Unsupported AXP variant: %ld\n", ··· 1530 1278 continue; 1531 1279 1532 1280 /* 1533 - * Regulators DC1SW and DC5LDO are connected internally, 1534 - * so we have to handle their supply names separately. 1281 + * Regulators DC1SW, DC5LDO and RTCLDO on AXP15060 are 1282 + * connected internally, so we have to handle their supply 1283 + * names separately. 1535 1284 * 1536 1285 * We always register the regulators in proper sequence, 1537 1286 * so the supply names are correctly read. See the last ··· 1541 1288 */ 1542 1289 if ((regulators == axp22x_regulators && i == AXP22X_DC1SW) || 1543 1290 (regulators == axp803_regulators && i == AXP803_DC1SW) || 1544 - (regulators == axp809_regulators && i == AXP809_DC1SW)) { 1291 + (regulators == axp809_regulators && i == AXP809_DC1SW) || 1292 + (regulators == axp15060_regulators && i == AXP15060_SW)) { 1545 1293 new_desc = devm_kzalloc(&pdev->dev, sizeof(*desc), 1546 1294 GFP_KERNEL); 1547 1295 if (!new_desc) ··· 1554 1300 } 1555 1301 1556 1302 if ((regulators == axp22x_regulators && i == AXP22X_DC5LDO) || 1557 - (regulators == axp809_regulators && i == AXP809_DC5LDO)) { 1303 + (regulators == axp809_regulators && i == AXP809_DC5LDO) || 1304 + (regulators == axp15060_regulators && i == AXP15060_CPUSLDO)) { 1558 1305 new_desc = devm_kzalloc(&pdev->dev, sizeof(*desc), 1559 1306 GFP_KERNEL); 1560 1307 if (!new_desc) ··· 1563 1308 1564 1309 *new_desc = regulators[i]; 1565 1310 new_desc->supply_name = dcdc5_name; 1311 + desc = new_desc; 1312 + } 1313 + 1314 + 1315 + if (regulators == axp15060_regulators && i == AXP15060_RTC_LDO) { 1316 + new_desc = devm_kzalloc(&pdev->dev, sizeof(*desc), 1317 + GFP_KERNEL); 1318 + if (!new_desc) 1319 + return -ENOMEM; 1320 + 1321 + *new_desc = regulators[i]; 1322 + new_desc->supply_name = aldo1_name; 1566 1323 desc = new_desc; 1567 1324 } 1568 1325 ··· 1596 1329 } 1597 1330 1598 1331 /* 1599 - * Save AXP22X DCDC1 / DCDC5 regulator names for later. 1332 + * Save AXP22X DCDC1 / DCDC5 / AXP15060 ALDO1 regulator names for later. 1600 1333 */ 1601 1334 if ((regulators == axp22x_regulators && i == AXP22X_DCDC1) || 1602 - (regulators == axp809_regulators && i == AXP809_DCDC1)) 1335 + (regulators == axp809_regulators && i == AXP809_DCDC1) || 1336 + (regulators == axp15060_regulators && i == AXP15060_DCDC1)) 1603 1337 of_property_read_string(rdev->dev.of_node, 1604 1338 "regulator-name", 1605 1339 &dcdc1_name); 1606 1340 1607 1341 if ((regulators == axp22x_regulators && i == AXP22X_DCDC5) || 1608 - (regulators == axp809_regulators && i == AXP809_DCDC5)) 1342 + (regulators == axp809_regulators && i == AXP809_DCDC5) || 1343 + (regulators == axp15060_regulators && i == AXP15060_DCDC5)) 1609 1344 of_property_read_string(rdev->dev.of_node, 1610 1345 "regulator-name", 1611 1346 &dcdc5_name); 1347 + 1348 + if (regulators == axp15060_regulators && i == AXP15060_ALDO1) 1349 + of_property_read_string(rdev->dev.of_node, 1350 + "regulator-name", 1351 + &aldo1_name); 1612 1352 } 1613 1353 1614 1354 if (drivevbus) {
+32
include/linux/mfd/axp20x.h
··· 17 17 AXP221_ID, 18 18 AXP223_ID, 19 19 AXP288_ID, 20 + AXP313A_ID, 20 21 AXP803_ID, 21 22 AXP806_ID, 22 23 AXP809_ID, ··· 92 91 #define AXP22X_ALDO2_V_OUT 0x29 93 92 #define AXP22X_ALDO3_V_OUT 0x2a 94 93 #define AXP22X_CHRG_CTRL3 0x35 94 + 95 + #define AXP313A_ON_INDICATE 0x00 96 + #define AXP313A_OUTPUT_CONTROL 0x10 97 + #define AXP313A_DCDC1_CONRTOL 0x13 98 + #define AXP313A_DCDC2_CONRTOL 0x14 99 + #define AXP313A_DCDC3_CONRTOL 0x15 100 + #define AXP313A_ALDO1_CONRTOL 0x16 101 + #define AXP313A_DLDO1_CONRTOL 0x17 102 + #define AXP313A_SHUTDOWN_CTRL 0x1a 103 + #define AXP313A_IRQ_EN 0x20 104 + #define AXP313A_IRQ_STATE 0x21 95 105 96 106 #define AXP806_STARTUP_SRC 0x00 97 107 #define AXP806_CHIP_ID 0x03 ··· 376 364 }; 377 365 378 366 enum { 367 + AXP313A_DCDC1 = 0, 368 + AXP313A_DCDC2, 369 + AXP313A_DCDC3, 370 + AXP313A_ALDO1, 371 + AXP313A_DLDO1, 372 + AXP313A_RTC_LDO, 373 + AXP313A_REG_ID_MAX, 374 + }; 375 + 376 + enum { 379 377 AXP806_DCDCA = 0, 380 378 AXP806_DCDCB, 381 379 AXP806_DCDCC, ··· 636 614 AXP288_IRQ_TIMER, 637 615 AXP288_IRQ_MV_CHNG, 638 616 AXP288_IRQ_BC_USB_CHNG, 617 + }; 618 + 619 + enum axp313a_irqs { 620 + AXP313A_IRQ_DIE_TEMP_HIGH, 621 + AXP313A_IRQ_DCDC2_V_LOW = 2, 622 + AXP313A_IRQ_DCDC3_V_LOW, 623 + AXP313A_IRQ_PEK_LONG, 624 + AXP313A_IRQ_PEK_SHORT, 625 + AXP313A_IRQ_PEK_FAL_EDGE, 626 + AXP313A_IRQ_PEK_RIS_EDGE, 639 627 }; 640 628 641 629 enum axp803_irqs {