Skip to content

Commit d2ac3df

Browse files
Andre-ARMlag-linaro
authored andcommitted
regulator: axp20x: add support for the AXP717
The X-Powers AXP717 is a typical PMIC from X-Powers, featuring four DC/DC converters and 15 LDOs, on the regulator side. Describe the chip's voltage settings and switch registers, how the voltages are encoded, and connect this to the MFD device via its regulator ID. Signed-off-by: Andre Przywara <[email protected]> Acked-by: Mark Brown <[email protected]> Tested-by: Ryan Walklin <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Lee Jones <[email protected]>
1 parent b5bfc8a commit d2ac3df

File tree

2 files changed

+105
-0
lines changed

2 files changed

+105
-0
lines changed

drivers/regulator/axp20x-regulator.c

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,12 @@
138138
#define AXP313A_DCDC_V_OUT_MASK GENMASK(6, 0)
139139
#define AXP313A_LDO_V_OUT_MASK GENMASK(4, 0)
140140

141+
#define AXP717_DCDC1_NUM_VOLTAGES 88
142+
#define AXP717_DCDC2_NUM_VOLTAGES 107
143+
#define AXP717_DCDC3_NUM_VOLTAGES 104
144+
#define AXP717_DCDC_V_OUT_MASK GENMASK(6, 0)
145+
#define AXP717_LDO_V_OUT_MASK GENMASK(4, 0)
146+
141147
#define AXP803_PWR_OUT_DCDC1_MASK BIT_MASK(0)
142148
#define AXP803_PWR_OUT_DCDC2_MASK BIT_MASK(1)
143149
#define AXP803_PWR_OUT_DCDC3_MASK BIT_MASK(2)
@@ -752,6 +758,79 @@ static const struct regulator_desc axp313a_regulators[] = {
752758
AXP_DESC_FIXED(AXP313A, RTC_LDO, "rtc-ldo", "vin1", 1800),
753759
};
754760

761+
static const struct linear_range axp717_dcdc1_ranges[] = {
762+
REGULATOR_LINEAR_RANGE(500000, 0, 70, 10000),
763+
REGULATOR_LINEAR_RANGE(1220000, 71, 87, 20000),
764+
};
765+
766+
static const struct linear_range axp717_dcdc2_ranges[] = {
767+
REGULATOR_LINEAR_RANGE(500000, 0, 70, 10000),
768+
REGULATOR_LINEAR_RANGE(1220000, 71, 87, 20000),
769+
REGULATOR_LINEAR_RANGE(1600000, 88, 107, 100000),
770+
};
771+
772+
static const struct linear_range axp717_dcdc3_ranges[] = {
773+
REGULATOR_LINEAR_RANGE(500000, 0, 70, 10000),
774+
REGULATOR_LINEAR_RANGE(1220000, 71, 102, 20000),
775+
};
776+
777+
static const struct regulator_desc axp717_regulators[] = {
778+
AXP_DESC_RANGES(AXP717, DCDC1, "dcdc1", "vin1",
779+
axp717_dcdc1_ranges, AXP717_DCDC1_NUM_VOLTAGES,
780+
AXP717_DCDC1_CONTROL, AXP717_DCDC_V_OUT_MASK,
781+
AXP717_DCDC_OUTPUT_CONTROL, BIT(0)),
782+
AXP_DESC_RANGES(AXP717, DCDC2, "dcdc2", "vin2",
783+
axp717_dcdc2_ranges, AXP717_DCDC2_NUM_VOLTAGES,
784+
AXP717_DCDC2_CONTROL, AXP717_DCDC_V_OUT_MASK,
785+
AXP717_DCDC_OUTPUT_CONTROL, BIT(1)),
786+
AXP_DESC_RANGES(AXP717, DCDC3, "dcdc3", "vin3",
787+
axp717_dcdc3_ranges, AXP717_DCDC3_NUM_VOLTAGES,
788+
AXP717_DCDC3_CONTROL, AXP717_DCDC_V_OUT_MASK,
789+
AXP717_DCDC_OUTPUT_CONTROL, BIT(2)),
790+
AXP_DESC(AXP717, DCDC4, "dcdc4", "vin4", 1000, 3700, 100,
791+
AXP717_DCDC4_CONTROL, AXP717_DCDC_V_OUT_MASK,
792+
AXP717_DCDC_OUTPUT_CONTROL, BIT(3)),
793+
AXP_DESC(AXP717, ALDO1, "aldo1", "vin1", 500, 3500, 100,
794+
AXP717_ALDO1_CONTROL, AXP717_LDO_V_OUT_MASK,
795+
AXP717_LDO0_OUTPUT_CONTROL, BIT(0)),
796+
AXP_DESC(AXP717, ALDO2, "aldo2", "vin1", 500, 3500, 100,
797+
AXP717_ALDO2_CONTROL, AXP717_LDO_V_OUT_MASK,
798+
AXP717_LDO0_OUTPUT_CONTROL, BIT(1)),
799+
AXP_DESC(AXP717, ALDO3, "aldo3", "vin1", 500, 3500, 100,
800+
AXP717_ALDO3_CONTROL, AXP717_LDO_V_OUT_MASK,
801+
AXP717_LDO0_OUTPUT_CONTROL, BIT(2)),
802+
AXP_DESC(AXP717, ALDO4, "aldo4", "vin1", 500, 3500, 100,
803+
AXP717_ALDO4_CONTROL, AXP717_LDO_V_OUT_MASK,
804+
AXP717_LDO0_OUTPUT_CONTROL, BIT(3)),
805+
AXP_DESC(AXP717, BLDO1, "bldo1", "vin1", 500, 3500, 100,
806+
AXP717_BLDO1_CONTROL, AXP717_LDO_V_OUT_MASK,
807+
AXP717_LDO0_OUTPUT_CONTROL, BIT(4)),
808+
AXP_DESC(AXP717, BLDO2, "bldo2", "vin1", 500, 3500, 100,
809+
AXP717_BLDO2_CONTROL, AXP717_LDO_V_OUT_MASK,
810+
AXP717_LDO0_OUTPUT_CONTROL, BIT(5)),
811+
AXP_DESC(AXP717, BLDO3, "bldo3", "vin1", 500, 3500, 100,
812+
AXP717_BLDO3_CONTROL, AXP717_LDO_V_OUT_MASK,
813+
AXP717_LDO0_OUTPUT_CONTROL, BIT(6)),
814+
AXP_DESC(AXP717, BLDO4, "bldo4", "vin1", 500, 3500, 100,
815+
AXP717_BLDO4_CONTROL, AXP717_LDO_V_OUT_MASK,
816+
AXP717_LDO0_OUTPUT_CONTROL, BIT(7)),
817+
AXP_DESC(AXP717, CLDO1, "cldo1", "vin1", 500, 3500, 100,
818+
AXP717_CLDO1_CONTROL, AXP717_LDO_V_OUT_MASK,
819+
AXP717_LDO1_OUTPUT_CONTROL, BIT(0)),
820+
AXP_DESC(AXP717, CLDO2, "cldo2", "vin1", 500, 3500, 100,
821+
AXP717_CLDO2_CONTROL, AXP717_LDO_V_OUT_MASK,
822+
AXP717_LDO1_OUTPUT_CONTROL, BIT(1)),
823+
AXP_DESC(AXP717, CLDO3, "cldo3", "vin1", 500, 3500, 100,
824+
AXP717_CLDO3_CONTROL, AXP717_LDO_V_OUT_MASK,
825+
AXP717_LDO1_OUTPUT_CONTROL, BIT(2)),
826+
AXP_DESC(AXP717, CLDO4, "cldo4", "vin1", 500, 3500, 100,
827+
AXP717_CLDO4_CONTROL, AXP717_LDO_V_OUT_MASK,
828+
AXP717_LDO1_OUTPUT_CONTROL, BIT(3)),
829+
AXP_DESC(AXP717, CPUSLDO, "cpusldo", "vin1", 500, 1400, 50,
830+
AXP717_CPUSLDO_CONTROL, AXP717_LDO_V_OUT_MASK,
831+
AXP717_LDO1_OUTPUT_CONTROL, BIT(4)),
832+
};
833+
755834
/* DCDC ranges shared with AXP813 */
756835
static const struct linear_range axp803_dcdc234_ranges[] = {
757836
REGULATOR_LINEAR_RANGE(500000,
@@ -1253,6 +1332,7 @@ static int axp20x_set_dcdc_freq(struct platform_device *pdev, u32 dcdcfreq)
12531332
step = 150;
12541333
break;
12551334
case AXP313A_ID:
1335+
case AXP717_ID:
12561336
case AXP15060_ID:
12571337
/* The DCDC PWM frequency seems to be fixed to 3 MHz. */
12581338
if (dcdcfreq != 0) {
@@ -1479,6 +1559,10 @@ static int axp20x_regulator_probe(struct platform_device *pdev)
14791559
regulators = axp313a_regulators;
14801560
nregulators = AXP313A_REG_ID_MAX;
14811561
break;
1562+
case AXP717_ID:
1563+
regulators = axp717_regulators;
1564+
nregulators = AXP717_REG_ID_MAX;
1565+
break;
14821566
case AXP803_ID:
14831567
regulators = axp803_regulators;
14841568
nregulators = AXP803_REG_ID_MAX;

include/linux/mfd/axp20x.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,27 @@ enum {
466466
AXP313A_REG_ID_MAX,
467467
};
468468

469+
enum {
470+
AXP717_DCDC1 = 0,
471+
AXP717_DCDC2,
472+
AXP717_DCDC3,
473+
AXP717_DCDC4,
474+
AXP717_ALDO1,
475+
AXP717_ALDO2,
476+
AXP717_ALDO3,
477+
AXP717_ALDO4,
478+
AXP717_BLDO1,
479+
AXP717_BLDO2,
480+
AXP717_BLDO3,
481+
AXP717_BLDO4,
482+
AXP717_CLDO1,
483+
AXP717_CLDO2,
484+
AXP717_CLDO3,
485+
AXP717_CLDO4,
486+
AXP717_CPUSLDO,
487+
AXP717_REG_ID_MAX,
488+
};
489+
469490
enum {
470491
AXP806_DCDCA = 0,
471492
AXP806_DCDCB,

0 commit comments

Comments
 (0)