2022-12-13 18:31:35

by Martin Botka

[permalink] [raw]
Subject: [PATCH v4 0/3] AXP1530 PMIC

Hello,

This patch series adds support for the AXP1530 PMIC which is controlled via the
I2C bus.

Changes in v2:
Remove RSB support.
Drop .id = 0
Add dt-binding for the AXP1530

Changes in v3:
Move AXP1530 dt-binding to alphabetical order

Changes in v4:
Fix indentation

Martin Botka (3):
dt-bindings: mfd: x-powers,axp152: Document the AXP1530 variant
mfd: ax20x: Add suppport for AXP1530 PMIC
regulator: axp20x: Add support for AXP1530 variant

.../bindings/mfd/x-powers,axp152.yaml | 1 +
drivers/mfd/axp20x-i2c.c | 2 +
drivers/mfd/axp20x.c | 62 +++++++++++++++++++
drivers/regulator/axp20x-regulator.c | 44 +++++++++++++
include/linux/mfd/axp20x.h | 34 ++++++++++
5 files changed, 143 insertions(+)

--
2.38.1


2022-12-13 18:45:29

by Martin Botka

[permalink] [raw]
Subject: [PATCH v4 3/3] regulator: axp20x: Add support for AXP1530 variant

AXP1530 has a few regulators that are controlled via I2C Bus.

Add support for them.

Signed-off-by: Martin Botka <[email protected]>
---
drivers/regulator/axp20x-regulator.c | 44 ++++++++++++++++++++++++++++
1 file changed, 44 insertions(+)

diff --git a/drivers/regulator/axp20x-regulator.c b/drivers/regulator/axp20x-regulator.c
index d260c442b788..9420839ff4f9 100644
--- a/drivers/regulator/axp20x-regulator.c
+++ b/drivers/regulator/axp20x-regulator.c
@@ -1001,6 +1001,40 @@ static const struct regulator_desc axp813_regulators[] = {
AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DC1SW_MASK),
};

+static const struct linear_range axp1530_dcdc1_ranges[] = {
+ REGULATOR_LINEAR_RANGE(500000, 0x0, 0x46, 10000),
+ REGULATOR_LINEAR_RANGE(1220000, 0x47, 0x57, 20000),
+ REGULATOR_LINEAR_RANGE(1600000, 0x58, 0x6A, 100000),
+};
+
+static const struct linear_range axp1530_dcdc2_ranges[] = {
+ REGULATOR_LINEAR_RANGE(500000, 0x0, 0x46, 10000),
+ REGULATOR_LINEAR_RANGE(1220000, 0x47, 0x57, 20000),
+};
+
+static const struct linear_range axp1530_dcdc3_ranges[] = {
+ REGULATOR_LINEAR_RANGE(500000, 0x0, 0x46, 10000),
+ REGULATOR_LINEAR_RANGE(1220000, 0x47, 0x66, 20000),
+};
+
+static const struct regulator_desc axp1530_regulators[] = {
+ AXP_DESC_RANGES(AXP1530, DCDC1, "dcdc1", "vin1", axp1530_dcdc1_ranges,
+ 0x6B, AXP1530_DCDC1_CONRTOL, 0x7f, AXP1530_OUTPUT_CONTROL,
+ BIT(0)),
+ AXP_DESC_RANGES(AXP1530, DCDC2, "dcdc2", "vin2", axp1530_dcdc2_ranges,
+ 0x58, AXP1530_DCDC2_CONRTOL, 0x7f, AXP1530_OUTPUT_CONTROL,
+ BIT(1)),
+ AXP_DESC_RANGES(AXP1530, DCDC3, "dcdc3", "vin3", axp1530_dcdc3_ranges,
+ 0x58, AXP1530_DCDC3_CONRTOL, 0x7f, AXP1530_OUTPUT_CONTROL,
+ BIT(2)),
+ AXP_DESC(AXP1530, LDO1, "ldo1", "ldo1in", 500, 3500, 100,
+ AXP1530_ALDO1_CONRTOL, 0x1f, AXP1530_OUTPUT_CONTROL,
+ BIT(3)),
+ AXP_DESC(AXP1530, LDO2, "ldo2", "ldo2in", 500, 3500, 100,
+ AXP1530_DLDO1_CONRTOL, 0x1f, AXP1530_OUTPUT_CONTROL,
+ BIT(4)),
+};
+
static int axp20x_set_dcdc_freq(struct platform_device *pdev, u32 dcdcfreq)
{
struct axp20x_dev *axp20x = dev_get_drvdata(pdev->dev.parent);
@@ -1040,6 +1074,12 @@ static int axp20x_set_dcdc_freq(struct platform_device *pdev, u32 dcdcfreq)
def = 3000;
step = 150;
break;
+ case AXP1530_ID:
+ /*
+ * Do not set the DCDC frequency on AXP1530
+ */
+ return 0;
+ break;
default:
dev_err(&pdev->dev,
"Setting DCDC frequency for unsupported AXP variant\n");
@@ -1220,6 +1260,10 @@ static int axp20x_regulator_probe(struct platform_device *pdev)
bool drivevbus = false;

switch (axp20x->variant) {
+ case AXP1530_ID:
+ regulators = axp1530_regulators;
+ nregulators = AXP1530_REG_ID_MAX;
+ break;
case AXP202_ID:
case AXP209_ID:
regulators = axp20x_regulators;
--
2.38.1

2022-12-13 18:46:19

by Martin Botka

[permalink] [raw]
Subject: [PATCH v4 2/3] mfd: ax20x: Add suppport for AXP1530 PMIC

AXP1530 is a PMIC chip produced by X-Powers and an be connected via
I2C bus.
Where AXP313A seems to be closely related so the same driver can be used and
seen it only paired with H616 SoC.

Signed-off-by: Martin Botka <[email protected]>
---
drivers/mfd/axp20x-i2c.c | 2 ++
drivers/mfd/axp20x.c | 62 ++++++++++++++++++++++++++++++++++++++
include/linux/mfd/axp20x.h | 34 +++++++++++++++++++++
3 files changed, 98 insertions(+)

diff --git a/drivers/mfd/axp20x-i2c.c b/drivers/mfd/axp20x-i2c.c
index 8fd6727dc30a..49c4acee3927 100644
--- a/drivers/mfd/axp20x-i2c.c
+++ b/drivers/mfd/axp20x-i2c.c
@@ -66,6 +66,7 @@ static const struct of_device_id axp20x_i2c_of_match[] = {
{ .compatible = "x-powers,axp223", .data = (void *)AXP223_ID },
{ .compatible = "x-powers,axp803", .data = (void *)AXP803_ID },
{ .compatible = "x-powers,axp806", .data = (void *)AXP806_ID },
+ { .compatible = "x-powers,axp1530", .data = (void *)AXP1530_ID},
{ },
};
MODULE_DEVICE_TABLE(of, axp20x_i2c_of_match);
@@ -79,6 +80,7 @@ static const struct i2c_device_id axp20x_i2c_id[] = {
{ "axp223", 0 },
{ "axp803", 0 },
{ "axp806", 0 },
+ { "axp1530", 0 },
{ },
};
MODULE_DEVICE_TABLE(i2c, axp20x_i2c_id);
diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
index 880c41fa7021..d80bf25cfd72 100644
--- a/drivers/mfd/axp20x.c
+++ b/drivers/mfd/axp20x.c
@@ -43,6 +43,7 @@ static const char * const axp20x_model_names[] = {
"AXP806",
"AXP809",
"AXP813",
+ "AXP1530",
};

static const struct regmap_range axp152_writeable_ranges[] = {
@@ -168,6 +169,24 @@ static const struct regmap_access_table axp806_volatile_table = {
.n_yes_ranges = ARRAY_SIZE(axp806_volatile_ranges),
};

+static const struct regmap_range axp1530_writeable_ranges[] = {
+ regmap_reg_range(AXP1530_ON_INDICATE, AXP1530_FREQUENCY),
+};
+
+static const struct regmap_range axp1530_volatile_ranges[] = {
+ regmap_reg_range(AXP1530_ON_INDICATE, AXP1530_FREQUENCY),
+};
+
+static const struct regmap_access_table axp1530_writeable_table = {
+ .yes_ranges = axp1530_writeable_ranges,
+ .n_yes_ranges = ARRAY_SIZE(axp1530_writeable_ranges),
+};
+
+static const struct regmap_access_table axp1530_volatile_table = {
+ .yes_ranges = axp1530_volatile_ranges,
+ .n_yes_ranges = ARRAY_SIZE(axp1530_volatile_ranges),
+};
+
static const struct resource axp152_pek_resources[] = {
DEFINE_RES_IRQ_NAMED(AXP152_IRQ_PEK_RIS_EDGE, "PEK_DBR"),
DEFINE_RES_IRQ_NAMED(AXP152_IRQ_PEK_FAL_EDGE, "PEK_DBF"),
@@ -281,6 +300,15 @@ static const struct regmap_config axp806_regmap_config = {
.cache_type = REGCACHE_RBTREE,
};

+static const struct regmap_config axp1530_regmap_config = {
+ .reg_bits = 8,
+ .val_bits = 8,
+ .wr_table = &axp1530_writeable_table,
+ .volatile_table = &axp1530_volatile_table,
+ .max_register = AXP1530_FREQUENCY,
+ .cache_type = REGCACHE_RBTREE,
+};
+
#define INIT_REGMAP_IRQ(_variant, _irq, _off, _mask) \
[_variant##_IRQ_##_irq] = { .reg_offset = (_off), .mask = BIT(_mask) }

@@ -502,6 +530,16 @@ static const struct regmap_irq axp809_regmap_irqs[] = {
INIT_REGMAP_IRQ(AXP809, GPIO0_INPUT, 4, 0),
};

+static const struct regmap_irq axp1530_regmap_irqs[] = {
+ INIT_REGMAP_IRQ(AXP1530, KEY_L2H_EN, 0, 7),
+ INIT_REGMAP_IRQ(AXP1530, KEY_H2L_EN, 0, 6),
+ INIT_REGMAP_IRQ(AXP1530, POKSIRQ_EN, 0, 5),
+ INIT_REGMAP_IRQ(AXP1530, POKLIRQ_EN, 0, 4),
+ INIT_REGMAP_IRQ(AXP1530, DCDC3_UNDER, 0, 3),
+ INIT_REGMAP_IRQ(AXP1530, DCDC2_UNDER, 0, 2),
+ INIT_REGMAP_IRQ(AXP1530, TEMP_OVER, 0, 0),
+};
+
static const struct regmap_irq_chip axp152_regmap_irq_chip = {
.name = "axp152_irq_chip",
.status_base = AXP152_IRQ1_STATE,
@@ -588,6 +626,18 @@ static const struct regmap_irq_chip axp809_regmap_irq_chip = {
.num_regs = 5,
};

+static const struct regmap_irq_chip axp1530_regmap_irq_chip = {
+ .name = "axp1530_irq_chip",
+ .status_base = AXP1530_IRQ_STATUS1,
+ .ack_base = AXP1530_IRQ_STATUS1,
+ .mask_base = AXP1530_IRQ_ENABLE1,
+ .mask_invert = true,
+ .init_ack_masked = true,
+ .irqs = axp1530_regmap_irqs,
+ .num_irqs = ARRAY_SIZE(axp1530_regmap_irqs),
+ .num_regs = 1,
+};
+
static const struct mfd_cell axp20x_cells[] = {
{
.name = "axp20x-gpio",
@@ -832,6 +882,12 @@ static const struct mfd_cell axp813_cells[] = {
},
};

+static struct mfd_cell axp1530_cells[] = {
+ {
+ .name = "axp20x-regulator",
+ },
+};
+
static struct axp20x_dev *axp20x_pm_power_off;
static void axp20x_power_off(void)
{
@@ -942,6 +998,12 @@ int axp20x_match_device(struct axp20x_dev *axp20x)
*/
axp20x->regmap_irq_chip = &axp803_regmap_irq_chip;
break;
+ case AXP1530_ID:
+ axp20x->nr_cells = ARRAY_SIZE(axp1530_cells);
+ axp20x->cells = axp1530_cells;
+ axp20x->regmap_cfg = &axp1530_regmap_config;
+ axp20x->regmap_irq_chip = &axp1530_regmap_irq_chip;
+ break;
default:
dev_err(dev, "unsupported AXP20X ID %lu\n", axp20x->variant);
return -EINVAL;
diff --git a/include/linux/mfd/axp20x.h b/include/linux/mfd/axp20x.h
index 9ab0e2fca7ea..75dcc2411940 100644
--- a/include/linux/mfd/axp20x.h
+++ b/include/linux/mfd/axp20x.h
@@ -21,6 +21,7 @@ enum axp20x_variants {
AXP806_ID,
AXP809_ID,
AXP813_ID,
+ AXP1530_ID,
NR_AXP20X_VARIANTS,
};

@@ -128,6 +129,18 @@ enum axp20x_variants {
#define AXP803_DCDC6_V_OUT 0x25
#define AXP803_DCDC_FREQ_CTRL 0x3b

+#define AXP1530_ON_INDICATE 0x00
+#define AXP1530_OUTPUT_CONTROL 0x10
+#define AXP1530_DCDC1_CONRTOL 0x13
+#define AXP1530_DCDC2_CONRTOL 0x14
+#define AXP1530_DCDC3_CONRTOL 0x15
+#define AXP1530_ALDO1_CONRTOL 0x16
+#define AXP1530_DLDO1_CONRTOL 0x17
+#define AXP1530_OUTOUT_MONITOR 0x1D
+#define AXP1530_IRQ_ENABLE1 0x20
+#define AXP1530_IRQ_STATUS1 0x21
+#define AXP1530_FREQUENCY 0x87
+
/* Other DCDC regulator control registers are the same as AXP803 */
#define AXP813_DCDC7_V_OUT 0x26

@@ -419,6 +432,16 @@ enum {
AXP813_REG_ID_MAX,
};

+enum
+{
+ AXP1530_DCDC1 = 0,
+ AXP1530_DCDC2,
+ AXP1530_DCDC3,
+ AXP1530_LDO1,
+ AXP1530_LDO2,
+ AXP1530_REG_ID_MAX,
+};
+
/* IRQs */
enum {
AXP152_IRQ_LDO0IN_CONNECT = 1,
@@ -632,6 +655,17 @@ enum axp809_irqs {
AXP809_IRQ_GPIO0_INPUT,
};

+enum axp1530_irqs
+{
+ AXP1530_IRQ_TEMP_OVER,
+ AXP1530_IRQ_DCDC2_UNDER = 2,
+ AXP1530_IRQ_DCDC3_UNDER,
+ AXP1530_IRQ_POKLIRQ_EN,
+ AXP1530_IRQ_POKSIRQ_EN,
+ AXP1530_IRQ_KEY_L2H_EN,
+ AXP1530_IRQ_KEY_H2L_EN,
+};
+
struct axp20x_dev {
struct device *dev;
int irq;
--
2.38.1

2022-12-13 19:27:32

by Martin Botka

[permalink] [raw]
Subject: [PATCH v4 1/1] dt-bindings: mfd: x-powers,axp152: Document the AXP1530 variant

AXP1530 is a PMIC used on board BIQU CB1 SoM

Signed-off-by: Martin Botka <[email protected]>
---
Documentation/devicetree/bindings/mfd/x-powers,axp152.yaml | 1 +
1 file changed, 1 insertion(+)

diff --git a/Documentation/devicetree/bindings/mfd/x-powers,axp152.yaml b/Documentation/devicetree/bindings/mfd/x-powers,axp152.yaml
index b7a8747d5fa0..7559a13a071c 100644
--- a/Documentation/devicetree/bindings/mfd/x-powers,axp152.yaml
+++ b/Documentation/devicetree/bindings/mfd/x-powers,axp152.yaml
@@ -84,6 +84,7 @@ properties:
oneOf:
- enum:
- x-powers,axp152
+ - x-powers,axp1530
- x-powers,axp202
- x-powers,axp209
- x-powers,axp221
--
2.38.1

2022-12-13 19:54:19

by Martin Botka

[permalink] [raw]
Subject: Re: [PATCH v4 1/1] dt-bindings: mfd: x-powers,axp152: Document the AXP1530 variant

That is very much my bad.

I understand the purpose of them :)

I just straight up forgot to add them.
There is also ordering issue in mfd patch which was forgotten as well and was meant to be included in v4.
This ordering was corrected in regulators patch so i do apologize.

I will be sending v5 in a day or two with your ack included and this corrected and other comments that may show up during this time.

Thank you.
Best regards,
Martin

On December 13, 2022 8:37:48 PM GMT+01:00, Krzysztof Kozlowski <[email protected]> wrote:
>On 13/12/2022 19:27, Martin Botka wrote:
>> AXP1530 is a PMIC used on board BIQU CB1 SoM
>>
>> Signed-off-by: Martin Botka <[email protected]>
>> ---
>> Documentation/devicetree/bindings/mfd/x-powers,axp152.yaml | 1 +
>
>This is a friendly reminder during the review process.
>
>It looks like you received a tag and forgot to add it.
>
>If you do not know the process, here is a short explanation:
>Please add Acked-by/Reviewed-by/Tested-by tags when posting new
>versions. However, there's no need to repost patches *only* to add the
>tags. The upstream maintainer will do that for acks received on the
>version they apply.
>
>https://elixir.bootlin.com/linux/v5.17/source/Documentation/process/submitting-patches.rst#L540
>
>If a tag was not added on purpose, please state why and what changed.
>
>Best regards,
>Krzysztof
>

2022-12-13 20:15:56

by Krzysztof Kozlowski

[permalink] [raw]
Subject: Re: [PATCH v4 1/1] dt-bindings: mfd: x-powers,axp152: Document the AXP1530 variant

On 13/12/2022 19:27, Martin Botka wrote:
> AXP1530 is a PMIC used on board BIQU CB1 SoM
>
> Signed-off-by: Martin Botka <[email protected]>
> ---
> Documentation/devicetree/bindings/mfd/x-powers,axp152.yaml | 1 +

This is a friendly reminder during the review process.

It looks like you received a tag and forgot to add it.

If you do not know the process, here is a short explanation:
Please add Acked-by/Reviewed-by/Tested-by tags when posting new
versions. However, there's no need to repost patches *only* to add the
tags. The upstream maintainer will do that for acks received on the
version they apply.

https://elixir.bootlin.com/linux/v5.17/source/Documentation/process/submitting-patches.rst#L540

If a tag was not added on purpose, please state why and what changed.

Best regards,
Krzysztof

2022-12-13 20:16:17

by Krzysztof Kozlowski

[permalink] [raw]
Subject: Re: [PATCH v4 1/1] dt-bindings: mfd: x-powers,axp152: Document the AXP1530 variant

On 13/12/2022 20:43, Martin Botka wrote:
> That is very much my bad.
>
> I understand the purpose of them :)
>
> I just straight up forgot to add them.

Sure, happens, no worries.

Acked-by: Krzysztof Kozlowski <[email protected]>

Best regards,
Krzysztof