aboutsummaryrefslogtreecommitdiff
path: root/target/linux/starfive
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/starfive')
-rw-r--r--target/linux/starfive/patches-6.1/0117-driver-mfd-axp20x-Add-support-for-AXP15060.patch1014
-rw-r--r--target/linux/starfive/patches-6.1/0118-driver-regulator-axp20x-Support-AXP15060-variant.patch434
2 files changed, 0 insertions, 1448 deletions
diff --git a/target/linux/starfive/patches-6.1/0117-driver-mfd-axp20x-Add-support-for-AXP15060.patch b/target/linux/starfive/patches-6.1/0117-driver-mfd-axp20x-Add-support-for-AXP15060.patch
deleted file mode 100644
index 18ad298065..0000000000
--- a/target/linux/starfive/patches-6.1/0117-driver-mfd-axp20x-Add-support-for-AXP15060.patch
+++ /dev/null
@@ -1,1014 +0,0 @@
-From e62161318f2fe3e396fc31c50d210e99bec83021 Mon Sep 17 00:00:00 2001
-From: "ziv.xu" <ziv.xu@starfive.com>
-Date: Fri, 4 Aug 2023 13:53:10 +0800
-Subject: [PATCH 117/122] driver: mfd: axp20x: Add support for AXP15060
-
-axp20x add support for AXP15060
-
-Signed-off-by: ziv.xu <ziv.xu@starfive.com>
----
- drivers/mfd/axp20x-i2c.c | 2 +
- drivers/mfd/axp20x.c | 373 ++++++++++++++++++++++++++++++++++---
- include/linux/mfd/axp20x.h | 218 +++++++++++++++++++++-
- 3 files changed, 557 insertions(+), 36 deletions(-)
-
---- a/drivers/mfd/axp20x-i2c.c
-+++ b/drivers/mfd/axp20x-i2c.c
-@@ -66,6 +66,7 @@ static const struct of_device_id axp20x_
- { .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,axp15060", .data = (void *)AXP15060_ID },
- { },
- };
- MODULE_DEVICE_TABLE(of, axp20x_i2c_of_match);
-@@ -79,6 +80,7 @@ static const struct i2c_device_id axp20x
- { "axp223", 0 },
- { "axp803", 0 },
- { "axp806", 0 },
-+ { "axp15060", 0 },
- { },
- };
- MODULE_DEVICE_TABLE(i2c, axp20x_i2c_id);
---- a/drivers/mfd/axp20x.c
-+++ b/drivers/mfd/axp20x.c
-@@ -23,7 +23,7 @@
- #include <linux/mfd/core.h>
- #include <linux/module.h>
- #include <linux/of_device.h>
--#include <linux/pm_runtime.h>
-+#include <linux/reboot.h>
- #include <linux/regmap.h>
- #include <linux/regulator/consumer.h>
-
-@@ -34,15 +34,18 @@
-
- static const char * const axp20x_model_names[] = {
- "AXP152",
-+ "AXP192",
- "AXP202",
- "AXP209",
- "AXP221",
- "AXP223",
- "AXP288",
-+ "AXP313a",
- "AXP803",
- "AXP806",
- "AXP809",
- "AXP813",
-+ "AXP15060",
- };
-
- static const struct regmap_range axp152_writeable_ranges[] = {
-@@ -92,6 +95,35 @@ static const struct regmap_access_table
- .n_yes_ranges = ARRAY_SIZE(axp20x_volatile_ranges),
- };
-
-+static const struct regmap_range axp192_writeable_ranges[] = {
-+ regmap_reg_range(AXP192_DATACACHE(0), AXP192_DATACACHE(5)),
-+ regmap_reg_range(AXP192_PWR_OUT_CTRL, AXP192_IRQ5_STATE),
-+ regmap_reg_range(AXP20X_DCDC_MODE, AXP192_N_RSTO_CTRL),
-+ regmap_reg_range(AXP20X_CC_CTRL, AXP20X_CC_CTRL),
-+};
-+
-+static const struct regmap_range axp192_volatile_ranges[] = {
-+ regmap_reg_range(AXP20X_PWR_INPUT_STATUS, AXP192_USB_OTG_STATUS),
-+ regmap_reg_range(AXP192_IRQ1_STATE, AXP192_IRQ4_STATE),
-+ regmap_reg_range(AXP192_IRQ5_STATE, AXP192_IRQ5_STATE),
-+ regmap_reg_range(AXP20X_ACIN_V_ADC_H, AXP20X_IPSOUT_V_HIGH_L),
-+ regmap_reg_range(AXP20X_TIMER_CTRL, AXP20X_TIMER_CTRL),
-+ regmap_reg_range(AXP192_GPIO2_0_STATE, AXP192_GPIO2_0_STATE),
-+ regmap_reg_range(AXP192_GPIO4_3_STATE, AXP192_GPIO4_3_STATE),
-+ regmap_reg_range(AXP192_N_RSTO_CTRL, AXP192_N_RSTO_CTRL),
-+ regmap_reg_range(AXP20X_CHRG_CC_31_24, AXP20X_CC_CTRL),
-+};
-+
-+static const struct regmap_access_table axp192_writeable_table = {
-+ .yes_ranges = axp192_writeable_ranges,
-+ .n_yes_ranges = ARRAY_SIZE(axp192_writeable_ranges),
-+};
-+
-+static const struct regmap_access_table axp192_volatile_table = {
-+ .yes_ranges = axp192_volatile_ranges,
-+ .n_yes_ranges = ARRAY_SIZE(axp192_volatile_ranges),
-+};
-+
- /* AXP22x ranges are shared with the AXP809, as they cover the same range */
- static const struct regmap_range axp22x_writeable_ranges[] = {
- regmap_reg_range(AXP20X_DATACACHE(0), AXP20X_IRQ5_STATE),
-@@ -119,6 +151,7 @@ static const struct regmap_access_table
-
- /* AXP288 ranges are shared with the AXP803, as they cover the same range */
- static const struct regmap_range axp288_writeable_ranges[] = {
-+ regmap_reg_range(AXP288_POWER_REASON, AXP288_POWER_REASON),
- regmap_reg_range(AXP20X_DATACACHE(0), AXP20X_IRQ6_STATE),
- regmap_reg_range(AXP20X_DCDC_MODE, AXP288_FG_TUNE5),
- };
-@@ -154,6 +187,25 @@ static const struct regmap_range axp806_
- regmap_reg_range(AXP806_REG_ADDR_EXT, AXP806_REG_ADDR_EXT),
- };
-
-+static const struct regmap_range axp313a_writeable_ranges[] = {
-+ regmap_reg_range(AXP313A_ON_INDICATE, AXP313A_IRQ_STATE),
-+};
-+
-+static const struct regmap_range axp313a_volatile_ranges[] = {
-+ regmap_reg_range(AXP313A_SHUTDOWN_CTRL, AXP313A_SHUTDOWN_CTRL),
-+ regmap_reg_range(AXP313A_IRQ_STATE, AXP313A_IRQ_STATE),
-+};
-+
-+static const struct regmap_access_table axp313a_writeable_table = {
-+ .yes_ranges = axp313a_writeable_ranges,
-+ .n_yes_ranges = ARRAY_SIZE(axp313a_writeable_ranges),
-+};
-+
-+static const struct regmap_access_table axp313a_volatile_table = {
-+ .yes_ranges = axp313a_volatile_ranges,
-+ .n_yes_ranges = ARRAY_SIZE(axp313a_volatile_ranges),
-+};
-+
- static const struct regmap_range axp806_volatile_ranges[] = {
- regmap_reg_range(AXP20X_IRQ1_STATE, AXP20X_IRQ2_STATE),
- };
-@@ -168,11 +220,49 @@ static const struct regmap_access_table
- .n_yes_ranges = ARRAY_SIZE(axp806_volatile_ranges),
- };
-
-+static const struct regmap_range axp15060_writeable_ranges[] = {
-+ regmap_reg_range(AXP15060_PWR_OUT_CTRL1, AXP15060_DCDC_MODE_CTRL2),
-+ regmap_reg_range(AXP15060_OUTPUT_MONITOR_DISCHARGE, AXP15060_CPUSLDO_V_CTRL),
-+ regmap_reg_range(AXP15060_PWR_WAKEUP_CTRL, AXP15060_PWR_DISABLE_DOWN_SEQ),
-+ regmap_reg_range(AXP15060_PEK_KEY, AXP15060_PEK_KEY),
-+ regmap_reg_range(AXP15060_IRQ1_EN, AXP15060_IRQ2_EN),
-+ regmap_reg_range(AXP15060_IRQ1_STATE, AXP15060_IRQ2_STATE),
-+};
-+
-+static const struct regmap_range axp15060_volatile_ranges[] = {
-+ regmap_reg_range(AXP15060_STARTUP_SRC, AXP15060_STARTUP_SRC),
-+ regmap_reg_range(AXP15060_PWR_WAKEUP_CTRL, AXP15060_PWR_DISABLE_DOWN_SEQ),
-+ regmap_reg_range(AXP15060_IRQ1_STATE, AXP15060_IRQ2_STATE),
-+};
-+
-+static const struct regmap_access_table axp15060_writeable_table = {
-+ .yes_ranges = axp15060_writeable_ranges,
-+ .n_yes_ranges = ARRAY_SIZE(axp15060_writeable_ranges),
-+};
-+
-+static const struct regmap_access_table axp15060_volatile_table = {
-+ .yes_ranges = axp15060_volatile_ranges,
-+ .n_yes_ranges = ARRAY_SIZE(axp15060_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"),
- };
-
-+static const struct resource axp192_ac_power_supply_resources[] = {
-+ DEFINE_RES_IRQ_NAMED(AXP192_IRQ_ACIN_PLUGIN, "ACIN_PLUGIN"),
-+ DEFINE_RES_IRQ_NAMED(AXP192_IRQ_ACIN_REMOVAL, "ACIN_REMOVAL"),
-+ DEFINE_RES_IRQ_NAMED(AXP192_IRQ_ACIN_OVER_V, "ACIN_OVER_V"),
-+};
-+
-+static const struct resource axp192_usb_power_supply_resources[] = {
-+ DEFINE_RES_IRQ_NAMED(AXP192_IRQ_VBUS_PLUGIN, "VBUS_PLUGIN"),
-+ DEFINE_RES_IRQ_NAMED(AXP192_IRQ_VBUS_REMOVAL, "VBUS_REMOVAL"),
-+ DEFINE_RES_IRQ_NAMED(AXP192_IRQ_VBUS_VALID, "VBUS_VALID"),
-+ DEFINE_RES_IRQ_NAMED(AXP192_IRQ_VBUS_NOT_VALID, "VBUS_NOT_VALID"),
-+};
-+
- static const struct resource axp20x_ac_power_supply_resources[] = {
- DEFINE_RES_IRQ_NAMED(AXP20X_IRQ_ACIN_PLUGIN, "ACIN_PLUGIN"),
- DEFINE_RES_IRQ_NAMED(AXP20X_IRQ_ACIN_REMOVAL, "ACIN_REMOVAL"),
-@@ -221,6 +311,11 @@ static const struct resource axp288_fuel
- DEFINE_RES_IRQ(AXP288_IRQ_WL1),
- };
-
-+static const struct resource axp313a_pek_resources[] = {
-+ DEFINE_RES_IRQ_NAMED(AXP313A_IRQ_PEK_RIS_EDGE, "PEK_DBR"),
-+ DEFINE_RES_IRQ_NAMED(AXP313A_IRQ_PEK_FAL_EDGE, "PEK_DBF"),
-+};
-+
- static const struct resource axp803_pek_resources[] = {
- DEFINE_RES_IRQ_NAMED(AXP803_IRQ_PEK_RIS_EDGE, "PEK_DBR"),
- DEFINE_RES_IRQ_NAMED(AXP803_IRQ_PEK_FAL_EDGE, "PEK_DBF"),
-@@ -236,6 +331,11 @@ static const struct resource axp809_pek_
- DEFINE_RES_IRQ_NAMED(AXP809_IRQ_PEK_FAL_EDGE, "PEK_DBF"),
- };
-
-+static const struct resource axp15060_pek_resources[] = {
-+ DEFINE_RES_IRQ_NAMED(AXP15060_IRQ_PEK_RIS_EDGE, "PEK_DBR"),
-+ DEFINE_RES_IRQ_NAMED(AXP15060_IRQ_PEK_FAL_EDGE, "PEK_DBF"),
-+};
-+
- static const struct regmap_config axp152_regmap_config = {
- .reg_bits = 8,
- .val_bits = 8,
-@@ -245,6 +345,15 @@ static const struct regmap_config axp152
- .cache_type = REGCACHE_RBTREE,
- };
-
-+static const struct regmap_config axp192_regmap_config = {
-+ .reg_bits = 8,
-+ .val_bits = 8,
-+ .wr_table = &axp192_writeable_table,
-+ .volatile_table = &axp192_volatile_table,
-+ .max_register = AXP20X_CC_CTRL,
-+ .cache_type = REGCACHE_RBTREE,
-+};
-+
- static const struct regmap_config axp20x_regmap_config = {
- .reg_bits = 8,
- .val_bits = 8,
-@@ -272,6 +381,15 @@ static const struct regmap_config axp288
- .cache_type = REGCACHE_RBTREE,
- };
-
-+static const struct regmap_config axp313a_regmap_config = {
-+ .reg_bits = 8,
-+ .val_bits = 8,
-+ .wr_table = &axp313a_writeable_table,
-+ .volatile_table = &axp313a_volatile_table,
-+ .max_register = AXP313A_IRQ_STATE,
-+ .cache_type = REGCACHE_RBTREE,
-+};
-+
- static const struct regmap_config axp806_regmap_config = {
- .reg_bits = 8,
- .val_bits = 8,
-@@ -281,6 +399,15 @@ static const struct regmap_config axp806
- .cache_type = REGCACHE_RBTREE,
- };
-
-+static const struct regmap_config axp15060_regmap_config = {
-+ .reg_bits = 8,
-+ .val_bits = 8,
-+ .wr_table = &axp15060_writeable_table,
-+ .volatile_table = &axp15060_volatile_table,
-+ .max_register = AXP15060_IRQ2_STATE,
-+ .cache_type = REGCACHE_RBTREE,
-+};
-+
- #define INIT_REGMAP_IRQ(_variant, _irq, _off, _mask) \
- [_variant##_IRQ_##_irq] = { .reg_offset = (_off), .mask = BIT(_mask) }
-
-@@ -304,6 +431,42 @@ static const struct regmap_irq axp152_re
- INIT_REGMAP_IRQ(AXP152, GPIO0_INPUT, 2, 0),
- };
-
-+static const struct regmap_irq axp192_regmap_irqs[] = {
-+ INIT_REGMAP_IRQ(AXP192, ACIN_OVER_V, 0, 7),
-+ INIT_REGMAP_IRQ(AXP192, ACIN_PLUGIN, 0, 6),
-+ INIT_REGMAP_IRQ(AXP192, ACIN_REMOVAL, 0, 5),
-+ INIT_REGMAP_IRQ(AXP192, VBUS_OVER_V, 0, 4),
-+ INIT_REGMAP_IRQ(AXP192, VBUS_PLUGIN, 0, 3),
-+ INIT_REGMAP_IRQ(AXP192, VBUS_REMOVAL, 0, 2),
-+ INIT_REGMAP_IRQ(AXP192, VBUS_V_LOW, 0, 1),
-+ INIT_REGMAP_IRQ(AXP192, BATT_PLUGIN, 1, 7),
-+ INIT_REGMAP_IRQ(AXP192, BATT_REMOVAL, 1, 6),
-+ INIT_REGMAP_IRQ(AXP192, BATT_ENT_ACT_MODE, 1, 5),
-+ INIT_REGMAP_IRQ(AXP192, BATT_EXIT_ACT_MODE, 1, 4),
-+ INIT_REGMAP_IRQ(AXP192, CHARG, 1, 3),
-+ INIT_REGMAP_IRQ(AXP192, CHARG_DONE, 1, 2),
-+ INIT_REGMAP_IRQ(AXP192, BATT_TEMP_HIGH, 1, 1),
-+ INIT_REGMAP_IRQ(AXP192, BATT_TEMP_LOW, 1, 0),
-+ INIT_REGMAP_IRQ(AXP192, DIE_TEMP_HIGH, 2, 7),
-+ INIT_REGMAP_IRQ(AXP192, CHARG_I_LOW, 2, 6),
-+ INIT_REGMAP_IRQ(AXP192, DCDC1_V_LONG, 2, 5),
-+ INIT_REGMAP_IRQ(AXP192, DCDC2_V_LONG, 2, 4),
-+ INIT_REGMAP_IRQ(AXP192, DCDC3_V_LONG, 2, 3),
-+ INIT_REGMAP_IRQ(AXP192, PEK_SHORT, 2, 1),
-+ INIT_REGMAP_IRQ(AXP192, PEK_LONG, 2, 0),
-+ INIT_REGMAP_IRQ(AXP192, N_OE_PWR_ON, 3, 7),
-+ INIT_REGMAP_IRQ(AXP192, N_OE_PWR_OFF, 3, 6),
-+ INIT_REGMAP_IRQ(AXP192, VBUS_VALID, 3, 5),
-+ INIT_REGMAP_IRQ(AXP192, VBUS_NOT_VALID, 3, 4),
-+ INIT_REGMAP_IRQ(AXP192, VBUS_SESS_VALID, 3, 3),
-+ INIT_REGMAP_IRQ(AXP192, VBUS_SESS_END, 3, 2),
-+ INIT_REGMAP_IRQ(AXP192, LOW_PWR_LVL, 3, 0),
-+ INIT_REGMAP_IRQ(AXP192, TIMER, 4, 7),
-+ INIT_REGMAP_IRQ(AXP192, GPIO2_INPUT, 4, 2),
-+ INIT_REGMAP_IRQ(AXP192, GPIO1_INPUT, 4, 1),
-+ INIT_REGMAP_IRQ(AXP192, GPIO0_INPUT, 4, 0),
-+};
-+
- static const struct regmap_irq axp20x_regmap_irqs[] = {
- INIT_REGMAP_IRQ(AXP20X, ACIN_OVER_V, 0, 7),
- INIT_REGMAP_IRQ(AXP20X, ACIN_PLUGIN, 0, 6),
-@@ -415,6 +578,16 @@ static const struct regmap_irq axp288_re
- INIT_REGMAP_IRQ(AXP288, BC_USB_CHNG, 5, 1),
- };
-
-+static const struct regmap_irq axp313a_regmap_irqs[] = {
-+ INIT_REGMAP_IRQ(AXP313A, PEK_RIS_EDGE, 0, 7),
-+ INIT_REGMAP_IRQ(AXP313A, PEK_FAL_EDGE, 0, 6),
-+ INIT_REGMAP_IRQ(AXP313A, PEK_SHORT, 0, 5),
-+ INIT_REGMAP_IRQ(AXP313A, PEK_LONG, 0, 4),
-+ INIT_REGMAP_IRQ(AXP313A, DCDC3_V_LOW, 0, 3),
-+ INIT_REGMAP_IRQ(AXP313A, DCDC2_V_LOW, 0, 2),
-+ INIT_REGMAP_IRQ(AXP313A, DIE_TEMP_HIGH, 0, 0),
-+};
-+
- static const struct regmap_irq axp803_regmap_irqs[] = {
- INIT_REGMAP_IRQ(AXP803, ACIN_OVER_V, 0, 7),
- INIT_REGMAP_IRQ(AXP803, ACIN_PLUGIN, 0, 6),
-@@ -502,24 +675,65 @@ static const struct regmap_irq axp809_re
- INIT_REGMAP_IRQ(AXP809, GPIO0_INPUT, 4, 0),
- };
-
-+static const struct regmap_irq axp15060_regmap_irqs[] = {
-+ INIT_REGMAP_IRQ(AXP15060, DIE_TEMP_HIGH_LV1, 0, 0),
-+ INIT_REGMAP_IRQ(AXP15060, DIE_TEMP_HIGH_LV2, 0, 1),
-+ INIT_REGMAP_IRQ(AXP15060, DCDC1_V_LOW, 0, 2),
-+ INIT_REGMAP_IRQ(AXP15060, DCDC2_V_LOW, 0, 3),
-+ INIT_REGMAP_IRQ(AXP15060, DCDC3_V_LOW, 0, 4),
-+ INIT_REGMAP_IRQ(AXP15060, DCDC4_V_LOW, 0, 5),
-+ INIT_REGMAP_IRQ(AXP15060, DCDC5_V_LOW, 0, 6),
-+ INIT_REGMAP_IRQ(AXP15060, DCDC6_V_LOW, 0, 7),
-+ INIT_REGMAP_IRQ(AXP15060, PEK_LONG, 1, 0),
-+ INIT_REGMAP_IRQ(AXP15060, PEK_SHORT, 1, 1),
-+ INIT_REGMAP_IRQ(AXP15060, GPIO1_INPUT, 1, 2),
-+ INIT_REGMAP_IRQ(AXP15060, PEK_FAL_EDGE, 1, 3),
-+ INIT_REGMAP_IRQ(AXP15060, PEK_RIS_EDGE, 1, 4),
-+ INIT_REGMAP_IRQ(AXP15060, GPIO2_INPUT, 1, 5),
-+};
-+
- static const struct regmap_irq_chip axp152_regmap_irq_chip = {
- .name = "axp152_irq_chip",
- .status_base = AXP152_IRQ1_STATE,
- .ack_base = AXP152_IRQ1_STATE,
-- .mask_base = AXP152_IRQ1_EN,
-- .mask_invert = true,
-+ .unmask_base = AXP152_IRQ1_EN,
- .init_ack_masked = true,
- .irqs = axp152_regmap_irqs,
- .num_irqs = ARRAY_SIZE(axp152_regmap_irqs),
- .num_regs = 3,
- };
-
-+static unsigned int axp192_get_irq_reg(struct regmap_irq_chip_data *data,
-+ unsigned int base, int index)
-+{
-+ /* linear mapping for IRQ1 to IRQ4 */
-+ if (index < 4)
-+ return base + index;
-+
-+ /* handle IRQ5 separately */
-+ if (base == AXP192_IRQ1_EN)
-+ return AXP192_IRQ5_EN;
-+
-+ return AXP192_IRQ5_STATE;
-+}
-+
-+static const struct regmap_irq_chip axp192_regmap_irq_chip = {
-+ .name = "axp192_irq_chip",
-+ .status_base = AXP192_IRQ1_STATE,
-+ .ack_base = AXP192_IRQ1_STATE,
-+ .unmask_base = AXP192_IRQ1_EN,
-+ .init_ack_masked = true,
-+ .irqs = axp192_regmap_irqs,
-+ .num_irqs = ARRAY_SIZE(axp192_regmap_irqs),
-+ .num_regs = 5,
-+ .get_irq_reg = axp192_get_irq_reg,
-+};
-+
- static const struct regmap_irq_chip axp20x_regmap_irq_chip = {
- .name = "axp20x_irq_chip",
- .status_base = AXP20X_IRQ1_STATE,
- .ack_base = AXP20X_IRQ1_STATE,
-- .mask_base = AXP20X_IRQ1_EN,
-- .mask_invert = true,
-+ .unmask_base = AXP20X_IRQ1_EN,
- .init_ack_masked = true,
- .irqs = axp20x_regmap_irqs,
- .num_irqs = ARRAY_SIZE(axp20x_regmap_irqs),
-@@ -531,8 +745,7 @@ static const struct regmap_irq_chip axp2
- .name = "axp22x_irq_chip",
- .status_base = AXP20X_IRQ1_STATE,
- .ack_base = AXP20X_IRQ1_STATE,
-- .mask_base = AXP20X_IRQ1_EN,
-- .mask_invert = true,
-+ .unmask_base = AXP20X_IRQ1_EN,
- .init_ack_masked = true,
- .irqs = axp22x_regmap_irqs,
- .num_irqs = ARRAY_SIZE(axp22x_regmap_irqs),
-@@ -543,8 +756,7 @@ static const struct regmap_irq_chip axp2
- .name = "axp288_irq_chip",
- .status_base = AXP20X_IRQ1_STATE,
- .ack_base = AXP20X_IRQ1_STATE,
-- .mask_base = AXP20X_IRQ1_EN,
-- .mask_invert = true,
-+ .unmask_base = AXP20X_IRQ1_EN,
- .init_ack_masked = true,
- .irqs = axp288_regmap_irqs,
- .num_irqs = ARRAY_SIZE(axp288_regmap_irqs),
-@@ -552,12 +764,22 @@ static const struct regmap_irq_chip axp2
-
- };
-
-+static const struct regmap_irq_chip axp313a_regmap_irq_chip = {
-+ .name = "axp313a_irq_chip",
-+ .status_base = AXP313A_IRQ_STATE,
-+ .ack_base = AXP313A_IRQ_STATE,
-+ .unmask_base = AXP313A_IRQ_EN,
-+ .init_ack_masked = true,
-+ .irqs = axp313a_regmap_irqs,
-+ .num_irqs = ARRAY_SIZE(axp313a_regmap_irqs),
-+ .num_regs = 1,
-+};
-+
- static const struct regmap_irq_chip axp803_regmap_irq_chip = {
- .name = "axp803",
- .status_base = AXP20X_IRQ1_STATE,
- .ack_base = AXP20X_IRQ1_STATE,
-- .mask_base = AXP20X_IRQ1_EN,
-- .mask_invert = true,
-+ .unmask_base = AXP20X_IRQ1_EN,
- .init_ack_masked = true,
- .irqs = axp803_regmap_irqs,
- .num_irqs = ARRAY_SIZE(axp803_regmap_irqs),
-@@ -568,8 +790,7 @@ static const struct regmap_irq_chip axp8
- .name = "axp806",
- .status_base = AXP20X_IRQ1_STATE,
- .ack_base = AXP20X_IRQ1_STATE,
-- .mask_base = AXP20X_IRQ1_EN,
-- .mask_invert = true,
-+ .unmask_base = AXP20X_IRQ1_EN,
- .init_ack_masked = true,
- .irqs = axp806_regmap_irqs,
- .num_irqs = ARRAY_SIZE(axp806_regmap_irqs),
-@@ -580,14 +801,45 @@ static const struct regmap_irq_chip axp8
- .name = "axp809",
- .status_base = AXP20X_IRQ1_STATE,
- .ack_base = AXP20X_IRQ1_STATE,
-- .mask_base = AXP20X_IRQ1_EN,
-- .mask_invert = true,
-+ .unmask_base = AXP20X_IRQ1_EN,
- .init_ack_masked = true,
- .irqs = axp809_regmap_irqs,
- .num_irqs = ARRAY_SIZE(axp809_regmap_irqs),
- .num_regs = 5,
- };
-
-+static const struct regmap_irq_chip axp15060_regmap_irq_chip = {
-+ .name = "axp15060",
-+ .status_base = AXP15060_IRQ1_STATE,
-+ .ack_base = AXP15060_IRQ1_STATE,
-+ .unmask_base = AXP15060_IRQ1_EN,
-+ .init_ack_masked = true,
-+ .irqs = axp15060_regmap_irqs,
-+ .num_irqs = ARRAY_SIZE(axp15060_regmap_irqs),
-+ .num_regs = 2,
-+};
-+
-+static const struct mfd_cell axp192_cells[] = {
-+ {
-+ .name = "axp192-adc",
-+ .of_compatible = "x-powers,axp192-adc",
-+ }, {
-+ .name = "axp20x-battery-power-supply",
-+ .of_compatible = "x-powers,axp192-battery-power-supply",
-+ }, {
-+ .name = "axp20x-ac-power-supply",
-+ .of_compatible = "x-powers,axp202-ac-power-supply",
-+ .num_resources = ARRAY_SIZE(axp192_ac_power_supply_resources),
-+ .resources = axp192_ac_power_supply_resources,
-+ }, {
-+ .name = "axp20x-usb-power-supply",
-+ .of_compatible = "x-powers,axp192-usb-power-supply",
-+ .num_resources = ARRAY_SIZE(axp192_usb_power_supply_resources),
-+ .resources = axp192_usb_power_supply_resources,
-+ },
-+ { .name = "axp20x-regulator" },
-+};
-+
- static const struct mfd_cell axp20x_cells[] = {
- {
- .name = "axp20x-gpio",
-@@ -683,6 +935,11 @@ static const struct mfd_cell axp152_cell
- },
- };
-
-+static struct mfd_cell axp313a_cells[] = {
-+ MFD_CELL_NAME("axp20x-regulator"),
-+ MFD_CELL_RES("axp313a-pek", axp313a_pek_resources),
-+};
-+
- static const struct resource axp288_adc_resources[] = {
- DEFINE_RES_IRQ_NAMED(AXP288_IRQ_GPADC, "GPADC"),
- };
-@@ -832,17 +1089,43 @@ static const struct mfd_cell axp813_cell
- },
- };
-
--static struct axp20x_dev *axp20x_pm_power_off;
--static void axp20x_power_off(void)
-+static const struct mfd_cell axp15060_cells[] = {
-+ {
-+ .name = "axp221-pek",
-+ .num_resources = ARRAY_SIZE(axp15060_pek_resources),
-+ .resources = axp15060_pek_resources,
-+ }, {
-+ .name = "axp20x-regulator",
-+ },
-+};
-+
-+/* For boards that don't have IRQ line connected to SOC. */
-+static const struct mfd_cell axp_regulator_only_cells[] = {
-+ {
-+ .name = "axp20x-regulator",
-+ },
-+};
-+
-+static int axp20x_power_off(struct sys_off_data *data)
- {
-- if (axp20x_pm_power_off->variant == AXP288_ID)
-- return;
-+ struct axp20x_dev *axp20x = data->cb_data;
-+ unsigned int shutdown_reg;
-
-- regmap_write(axp20x_pm_power_off->regmap, AXP20X_OFF_CTRL,
-- AXP20X_OFF);
-+ switch (axp20x->variant) {
-+ case AXP313A_ID:
-+ shutdown_reg = AXP313A_SHUTDOWN_CTRL;
-+ break;
-+ default:
-+ shutdown_reg = AXP20X_OFF_CTRL;
-+ break;
-+ }
-+
-+ regmap_write(axp20x->regmap, shutdown_reg, AXP20X_OFF);
-
- /* Give capacitors etc. time to drain to avoid kernel panic msg. */
- mdelay(500);
-+
-+ return NOTIFY_DONE;
- }
-
- int axp20x_match_device(struct axp20x_dev *axp20x)
-@@ -874,6 +1157,12 @@ int axp20x_match_device(struct axp20x_de
- axp20x->regmap_cfg = &axp152_regmap_config;
- axp20x->regmap_irq_chip = &axp152_regmap_irq_chip;
- break;
-+ case AXP192_ID:
-+ axp20x->nr_cells = ARRAY_SIZE(axp192_cells);
-+ axp20x->cells = axp192_cells;
-+ axp20x->regmap_cfg = &axp192_regmap_config;
-+ axp20x->regmap_irq_chip = &axp192_regmap_irq_chip;
-+ break;
- case AXP202_ID:
- case AXP209_ID:
- axp20x->nr_cells = ARRAY_SIZE(axp20x_cells);
-@@ -900,6 +1189,12 @@ int axp20x_match_device(struct axp20x_de
- axp20x->regmap_irq_chip = &axp288_regmap_irq_chip;
- axp20x->irq_flags = IRQF_TRIGGER_LOW;
- break;
-+ case AXP313A_ID:
-+ axp20x->nr_cells = ARRAY_SIZE(axp313a_cells);
-+ axp20x->cells = axp313a_cells;
-+ axp20x->regmap_cfg = &axp313a_regmap_config;
-+ axp20x->regmap_irq_chip = &axp313a_regmap_irq_chip;
-+ break;
- case AXP803_ID:
- axp20x->nr_cells = ARRAY_SIZE(axp803_cells);
- axp20x->cells = axp803_cells;
-@@ -942,6 +1237,28 @@ int axp20x_match_device(struct axp20x_de
- */
- axp20x->regmap_irq_chip = &axp803_regmap_irq_chip;
- break;
-+ case AXP15060_ID:
-+ /*
-+ * Don't register the power key part if there is no interrupt
-+ * line.
-+ *
-+ * Since most use cases of AXP PMICs are Allwinner SOCs, board
-+ * designers follow Allwinner's reference design and connects
-+ * IRQ line to SOC, there's no need for those variants to deal
-+ * with cases that IRQ isn't connected. However, AXP15660 is
-+ * used by some other vendors' SOCs that didn't connect IRQ
-+ * line, we need to deal with this case.
-+ */
-+ if (axp20x->irq > 0) {
-+ axp20x->nr_cells = ARRAY_SIZE(axp15060_cells);
-+ axp20x->cells = axp15060_cells;
-+ } else {
-+ axp20x->nr_cells = ARRAY_SIZE(axp_regulator_only_cells);
-+ axp20x->cells = axp_regulator_only_cells;
-+ }
-+ axp20x->regmap_cfg = &axp15060_regmap_config;
-+ axp20x->regmap_irq_chip = &axp15060_regmap_irq_chip;
-+ break;
- default:
- dev_err(dev, "unsupported AXP20X ID %lu\n", axp20x->variant);
- return -EINVAL;
-@@ -1009,10 +1326,11 @@ int axp20x_device_probe(struct axp20x_de
- return ret;
- }
-
-- if (!pm_power_off) {
-- axp20x_pm_power_off = axp20x;
-- pm_power_off = axp20x_power_off;
-- }
-+ if (axp20x->variant != AXP288_ID)
-+ devm_register_sys_off_handler(axp20x->dev,
-+ SYS_OFF_MODE_POWER_OFF,
-+ SYS_OFF_PRIO_DEFAULT,
-+ axp20x_power_off, axp20x);
-
- dev_info(axp20x->dev, "AXP20X driver loaded\n");
-
-@@ -1022,11 +1340,6 @@ EXPORT_SYMBOL(axp20x_device_probe);
-
- void axp20x_device_remove(struct axp20x_dev *axp20x)
- {
-- if (axp20x == axp20x_pm_power_off) {
-- axp20x_pm_power_off = NULL;
-- pm_power_off = NULL;
-- }
--
- mfd_remove_devices(axp20x->dev);
- regmap_del_irq_chip(axp20x->irq, axp20x->regmap_irqc);
- }
---- a/include/linux/mfd/axp20x.h
-+++ b/include/linux/mfd/axp20x.h
-@@ -12,18 +12,22 @@
-
- enum axp20x_variants {
- AXP152_ID = 0,
-+ AXP192_ID,
- AXP202_ID,
- AXP209_ID,
- AXP221_ID,
- AXP223_ID,
- AXP288_ID,
-+ AXP313A_ID,
- AXP803_ID,
- AXP806_ID,
- AXP809_ID,
- AXP813_ID,
-+ AXP15060_ID,
- NR_AXP20X_VARIANTS,
- };
-
-+#define AXP192_DATACACHE(m) (0x06 + (m))
- #define AXP20X_DATACACHE(m) (0x04 + (m))
-
- /* Power supply */
-@@ -45,6 +49,13 @@ enum axp20x_variants {
- #define AXP152_DCDC_FREQ 0x37
- #define AXP152_DCDC_MODE 0x80
-
-+#define AXP192_USB_OTG_STATUS 0x04
-+#define AXP192_PWR_OUT_CTRL 0x12
-+#define AXP192_DCDC2_V_OUT 0x23
-+#define AXP192_DCDC1_V_OUT 0x26
-+#define AXP192_DCDC3_V_OUT 0x27
-+#define AXP192_LDO2_3_V_OUT 0x28
-+
- #define AXP20X_PWR_INPUT_STATUS 0x00
- #define AXP20X_PWR_OP_MODE 0x01
- #define AXP20X_USB_OTG_STATUS 0x02
-@@ -91,6 +102,17 @@ enum axp20x_variants {
- #define AXP22X_ALDO3_V_OUT 0x2a
- #define AXP22X_CHRG_CTRL3 0x35
-
-+#define AXP313A_ON_INDICATE 0x00
-+#define AXP313A_OUTPUT_CONTROL 0x10
-+#define AXP313A_DCDC1_CONRTOL 0x13
-+#define AXP313A_DCDC2_CONRTOL 0x14
-+#define AXP313A_DCDC3_CONRTOL 0x15
-+#define AXP313A_ALDO1_CONRTOL 0x16
-+#define AXP313A_DLDO1_CONRTOL 0x17
-+#define AXP313A_SHUTDOWN_CTRL 0x1a
-+#define AXP313A_IRQ_EN 0x20
-+#define AXP313A_IRQ_STATE 0x21
-+
- #define AXP806_STARTUP_SRC 0x00
- #define AXP806_CHIP_ID 0x03
- #define AXP806_PWR_OUT_CTRL1 0x10
-@@ -131,6 +153,39 @@ enum axp20x_variants {
- /* Other DCDC regulator control registers are the same as AXP803 */
- #define AXP813_DCDC7_V_OUT 0x26
-
-+#define AXP15060_STARTUP_SRC 0x00
-+#define AXP15060_PWR_OUT_CTRL1 0x10
-+#define AXP15060_PWR_OUT_CTRL2 0x11
-+#define AXP15060_PWR_OUT_CTRL3 0x12
-+#define AXP15060_DCDC1_V_CTRL 0x13
-+#define AXP15060_DCDC2_V_CTRL 0x14
-+#define AXP15060_DCDC3_V_CTRL 0x15
-+#define AXP15060_DCDC4_V_CTRL 0x16
-+#define AXP15060_DCDC5_V_CTRL 0x17
-+#define AXP15060_DCDC6_V_CTRL 0x18
-+#define AXP15060_ALDO1_V_CTRL 0x19
-+#define AXP15060_DCDC_MODE_CTRL1 0x1a
-+#define AXP15060_DCDC_MODE_CTRL2 0x1b
-+#define AXP15060_OUTPUT_MONITOR_DISCHARGE 0x1e
-+#define AXP15060_IRQ_PWROK_VOFF 0x1f
-+#define AXP15060_ALDO2_V_CTRL 0x20
-+#define AXP15060_ALDO3_V_CTRL 0x21
-+#define AXP15060_ALDO4_V_CTRL 0x22
-+#define AXP15060_ALDO5_V_CTRL 0x23
-+#define AXP15060_BLDO1_V_CTRL 0x24
-+#define AXP15060_BLDO2_V_CTRL 0x25
-+#define AXP15060_BLDO3_V_CTRL 0x26
-+#define AXP15060_BLDO4_V_CTRL 0x27
-+#define AXP15060_BLDO5_V_CTRL 0x28
-+#define AXP15060_CLDO1_V_CTRL 0x29
-+#define AXP15060_CLDO2_V_CTRL 0x2a
-+#define AXP15060_CLDO3_V_CTRL 0x2b
-+#define AXP15060_CLDO4_V_CTRL 0x2d
-+#define AXP15060_CPUSLDO_V_CTRL 0x2e
-+#define AXP15060_PWR_WAKEUP_CTRL 0x31
-+#define AXP15060_PWR_DISABLE_DOWN_SEQ 0x32
-+#define AXP15060_PEK_KEY 0x36
-+
- /* Interrupt */
- #define AXP152_IRQ1_EN 0x40
- #define AXP152_IRQ2_EN 0x41
-@@ -139,6 +194,17 @@ enum axp20x_variants {
- #define AXP152_IRQ2_STATE 0x49
- #define AXP152_IRQ3_STATE 0x4a
-
-+#define AXP192_IRQ1_EN 0x40
-+#define AXP192_IRQ2_EN 0x41
-+#define AXP192_IRQ3_EN 0x42
-+#define AXP192_IRQ4_EN 0x43
-+#define AXP192_IRQ1_STATE 0x44
-+#define AXP192_IRQ2_STATE 0x45
-+#define AXP192_IRQ3_STATE 0x46
-+#define AXP192_IRQ4_STATE 0x47
-+#define AXP192_IRQ5_EN 0x4a
-+#define AXP192_IRQ5_STATE 0x4d
-+
- #define AXP20X_IRQ1_EN 0x40
- #define AXP20X_IRQ2_EN 0x41
- #define AXP20X_IRQ3_EN 0x42
-@@ -152,7 +218,17 @@ enum axp20x_variants {
- #define AXP20X_IRQ5_STATE 0x4c
- #define AXP20X_IRQ6_STATE 0x4d
-
-+#define AXP15060_IRQ1_EN 0x40
-+#define AXP15060_IRQ2_EN 0x41
-+#define AXP15060_IRQ1_STATE 0x48
-+#define AXP15060_IRQ2_STATE 0x49
-+
- /* ADC */
-+#define AXP192_GPIO2_V_ADC_H 0x68
-+#define AXP192_GPIO2_V_ADC_L 0x69
-+#define AXP192_GPIO3_V_ADC_H 0x6a
-+#define AXP192_GPIO3_V_ADC_L 0x6b
-+
- #define AXP20X_ACIN_V_ADC_H 0x56
- #define AXP20X_ACIN_V_ADC_L 0x57
- #define AXP20X_ACIN_I_ADC_H 0x58
-@@ -182,6 +258,8 @@ enum axp20x_variants {
- #define AXP20X_IPSOUT_V_HIGH_L 0x7f
-
- /* Power supply */
-+#define AXP192_GPIO30_IN_RANGE 0x85
-+
- #define AXP20X_DCDC_MODE 0x80
- #define AXP20X_ADC_EN1 0x82
- #define AXP20X_ADC_EN2 0x83
-@@ -210,6 +288,16 @@ enum axp20x_variants {
- #define AXP152_PWM1_FREQ_Y 0x9c
- #define AXP152_PWM1_DUTY_CYCLE 0x9d
-
-+#define AXP192_GPIO0_CTRL 0x90
-+#define AXP192_LDO_IO0_V_OUT 0x91
-+#define AXP192_GPIO1_CTRL 0x92
-+#define AXP192_GPIO2_CTRL 0x93
-+#define AXP192_GPIO2_0_STATE 0x94
-+#define AXP192_GPIO4_3_CTRL 0x95
-+#define AXP192_GPIO4_3_STATE 0x96
-+#define AXP192_GPIO2_0_PULL 0x97
-+#define AXP192_N_RSTO_CTRL 0x9e
-+
- #define AXP20X_GPIO0_CTRL 0x90
- #define AXP20X_LDO5_V_OUT 0x91
- #define AXP20X_GPIO1_CTRL 0x92
-@@ -222,6 +310,8 @@ enum axp20x_variants {
- #define AXP22X_GPIO_STATE 0x94
- #define AXP22X_GPIO_PULL_DOWN 0x95
-
-+#define AXP15060_CLDO4_GPIO2_MODESET 0x2c
-+
- /* Battery */
- #define AXP20X_CHRG_CC_31_24 0xb0
- #define AXP20X_CHRG_CC_23_16 0xb1
-@@ -288,6 +378,17 @@ enum axp20x_variants {
-
- /* Regulators IDs */
- enum {
-+ AXP192_DCDC1 = 0,
-+ AXP192_DCDC2,
-+ AXP192_DCDC3,
-+ AXP192_LDO1,
-+ AXP192_LDO2,
-+ AXP192_LDO3,
-+ AXP192_LDO_IO0,
-+ AXP192_REG_ID_MAX
-+};
-+
-+enum {
- AXP20X_LDO1 = 0,
- AXP20X_LDO2,
- AXP20X_LDO3,
-@@ -323,6 +424,16 @@ enum {
- };
-
- enum {
-+ AXP313A_DCDC1 = 0,
-+ AXP313A_DCDC2,
-+ AXP313A_DCDC3,
-+ AXP313A_ALDO1,
-+ AXP313A_DLDO1,
-+ AXP313A_RTC_LDO,
-+ AXP313A_REG_ID_MAX,
-+};
-+
-+enum {
- AXP806_DCDCA = 0,
- AXP806_DCDCB,
- AXP806_DCDCC,
-@@ -419,6 +530,33 @@ enum {
- AXP813_REG_ID_MAX,
- };
-
-+enum {
-+ AXP15060_DCDC1 = 0,
-+ AXP15060_DCDC2,
-+ AXP15060_DCDC3,
-+ AXP15060_DCDC4,
-+ AXP15060_DCDC5,
-+ AXP15060_DCDC6,
-+ AXP15060_ALDO1,
-+ AXP15060_ALDO2,
-+ AXP15060_ALDO3,
-+ AXP15060_ALDO4,
-+ AXP15060_ALDO5,
-+ AXP15060_BLDO1,
-+ AXP15060_BLDO2,
-+ AXP15060_BLDO3,
-+ AXP15060_BLDO4,
-+ AXP15060_BLDO5,
-+ AXP15060_CLDO1,
-+ AXP15060_CLDO2,
-+ AXP15060_CLDO3,
-+ AXP15060_CLDO4,
-+ AXP15060_CPUSLDO,
-+ AXP15060_SW,
-+ AXP15060_RTC_LDO,
-+ AXP15060_REG_ID_MAX,
-+};
-+
- /* IRQs */
- enum {
- AXP152_IRQ_LDO0IN_CONNECT = 1,
-@@ -432,14 +570,51 @@ enum {
- AXP152_IRQ_PEK_SHORT,
- AXP152_IRQ_PEK_LONG,
- AXP152_IRQ_TIMER,
-- AXP152_IRQ_PEK_RIS_EDGE,
-+ /* out of bit order to make sure the press event is handled first */
- AXP152_IRQ_PEK_FAL_EDGE,
-+ AXP152_IRQ_PEK_RIS_EDGE,
- AXP152_IRQ_GPIO3_INPUT,
- AXP152_IRQ_GPIO2_INPUT,
- AXP152_IRQ_GPIO1_INPUT,
- AXP152_IRQ_GPIO0_INPUT,
- };
-
-+enum axp192_irqs {
-+ AXP192_IRQ_ACIN_OVER_V = 1,
-+ AXP192_IRQ_ACIN_PLUGIN,
-+ AXP192_IRQ_ACIN_REMOVAL,
-+ AXP192_IRQ_VBUS_OVER_V,
-+ AXP192_IRQ_VBUS_PLUGIN,
-+ AXP192_IRQ_VBUS_REMOVAL,
-+ AXP192_IRQ_VBUS_V_LOW,
-+ AXP192_IRQ_BATT_PLUGIN,
-+ AXP192_IRQ_BATT_REMOVAL,
-+ AXP192_IRQ_BATT_ENT_ACT_MODE,
-+ AXP192_IRQ_BATT_EXIT_ACT_MODE,
-+ AXP192_IRQ_CHARG,
-+ AXP192_IRQ_CHARG_DONE,
-+ AXP192_IRQ_BATT_TEMP_HIGH,
-+ AXP192_IRQ_BATT_TEMP_LOW,
-+ AXP192_IRQ_DIE_TEMP_HIGH,
-+ AXP192_IRQ_CHARG_I_LOW,
-+ AXP192_IRQ_DCDC1_V_LONG,
-+ AXP192_IRQ_DCDC2_V_LONG,
-+ AXP192_IRQ_DCDC3_V_LONG,
-+ AXP192_IRQ_PEK_SHORT = 22,
-+ AXP192_IRQ_PEK_LONG,
-+ AXP192_IRQ_N_OE_PWR_ON,
-+ AXP192_IRQ_N_OE_PWR_OFF,
-+ AXP192_IRQ_VBUS_VALID,
-+ AXP192_IRQ_VBUS_NOT_VALID,
-+ AXP192_IRQ_VBUS_SESS_VALID,
-+ AXP192_IRQ_VBUS_SESS_END,
-+ AXP192_IRQ_LOW_PWR_LVL = 31,
-+ AXP192_IRQ_TIMER,
-+ AXP192_IRQ_GPIO2_INPUT = 37,
-+ AXP192_IRQ_GPIO1_INPUT,
-+ AXP192_IRQ_GPIO0_INPUT,
-+};
-+
- enum {
- AXP20X_IRQ_ACIN_OVER_V = 1,
- AXP20X_IRQ_ACIN_PLUGIN,
-@@ -472,8 +647,9 @@ enum {
- AXP20X_IRQ_LOW_PWR_LVL1,
- AXP20X_IRQ_LOW_PWR_LVL2,
- AXP20X_IRQ_TIMER,
-- AXP20X_IRQ_PEK_RIS_EDGE,
-+ /* out of bit order to make sure the press event is handled first */
- AXP20X_IRQ_PEK_FAL_EDGE,
-+ AXP20X_IRQ_PEK_RIS_EDGE,
- AXP20X_IRQ_GPIO3_INPUT,
- AXP20X_IRQ_GPIO2_INPUT,
- AXP20X_IRQ_GPIO1_INPUT,
-@@ -502,8 +678,9 @@ enum axp22x_irqs {
- AXP22X_IRQ_LOW_PWR_LVL1,
- AXP22X_IRQ_LOW_PWR_LVL2,
- AXP22X_IRQ_TIMER,
-- AXP22X_IRQ_PEK_RIS_EDGE,
-+ /* out of bit order to make sure the press event is handled first */
- AXP22X_IRQ_PEK_FAL_EDGE,
-+ AXP22X_IRQ_PEK_RIS_EDGE,
- AXP22X_IRQ_GPIO1_INPUT,
- AXP22X_IRQ_GPIO0_INPUT,
- };
-@@ -545,6 +722,16 @@ enum axp288_irqs {
- AXP288_IRQ_BC_USB_CHNG,
- };
-
-+enum axp313a_irqs {
-+ AXP313A_IRQ_DIE_TEMP_HIGH,
-+ AXP313A_IRQ_DCDC2_V_LOW = 2,
-+ AXP313A_IRQ_DCDC3_V_LOW,
-+ AXP313A_IRQ_PEK_LONG,
-+ AXP313A_IRQ_PEK_SHORT,
-+ AXP313A_IRQ_PEK_FAL_EDGE,
-+ AXP313A_IRQ_PEK_RIS_EDGE,
-+};
-+
- enum axp803_irqs {
- AXP803_IRQ_ACIN_OVER_V = 1,
- AXP803_IRQ_ACIN_PLUGIN,
-@@ -571,8 +758,9 @@ enum axp803_irqs {
- AXP803_IRQ_LOW_PWR_LVL1,
- AXP803_IRQ_LOW_PWR_LVL2,
- AXP803_IRQ_TIMER,
-- AXP803_IRQ_PEK_RIS_EDGE,
-+ /* out of bit order to make sure the press event is handled first */
- AXP803_IRQ_PEK_FAL_EDGE,
-+ AXP803_IRQ_PEK_RIS_EDGE,
- AXP803_IRQ_PEK_SHORT,
- AXP803_IRQ_PEK_LONG,
- AXP803_IRQ_PEK_OVER_OFF,
-@@ -623,8 +811,9 @@ enum axp809_irqs {
- AXP809_IRQ_LOW_PWR_LVL1,
- AXP809_IRQ_LOW_PWR_LVL2,
- AXP809_IRQ_TIMER,
-- AXP809_IRQ_PEK_RIS_EDGE,
-+ /* out of bit order to make sure the press event is handled first */
- AXP809_IRQ_PEK_FAL_EDGE,
-+ AXP809_IRQ_PEK_RIS_EDGE,
- AXP809_IRQ_PEK_SHORT,
- AXP809_IRQ_PEK_LONG,
- AXP809_IRQ_PEK_OVER_OFF,
-@@ -632,6 +821,23 @@ enum axp809_irqs {
- AXP809_IRQ_GPIO0_INPUT,
- };
-
-+enum axp15060_irqs {
-+ AXP15060_IRQ_DIE_TEMP_HIGH_LV1 = 1,
-+ AXP15060_IRQ_DIE_TEMP_HIGH_LV2,
-+ AXP15060_IRQ_DCDC1_V_LOW,
-+ AXP15060_IRQ_DCDC2_V_LOW,
-+ AXP15060_IRQ_DCDC3_V_LOW,
-+ AXP15060_IRQ_DCDC4_V_LOW,
-+ AXP15060_IRQ_DCDC5_V_LOW,
-+ AXP15060_IRQ_DCDC6_V_LOW,
-+ AXP15060_IRQ_PEK_LONG,
-+ AXP15060_IRQ_PEK_SHORT,
-+ AXP15060_IRQ_GPIO1_INPUT,
-+ AXP15060_IRQ_PEK_FAL_EDGE,
-+ AXP15060_IRQ_PEK_RIS_EDGE,
-+ AXP15060_IRQ_GPIO2_INPUT,
-+};
-+
- struct axp20x_dev {
- struct device *dev;
- int irq;
-@@ -698,4 +904,4 @@ int axp20x_device_probe(struct axp20x_de
- */
- void axp20x_device_remove(struct axp20x_dev *axp20x);
-
--#endif /* __LINUX_MFD_AXP20X_H */
-+#endif /* __LINUX_MFD_AXP20X_H */
-\ No newline at end of file
diff --git a/target/linux/starfive/patches-6.1/0118-driver-regulator-axp20x-Support-AXP15060-variant.patch b/target/linux/starfive/patches-6.1/0118-driver-regulator-axp20x-Support-AXP15060-variant.patch
deleted file mode 100644
index ccb277b3a0..0000000000
--- a/target/linux/starfive/patches-6.1/0118-driver-regulator-axp20x-Support-AXP15060-variant.patch
+++ /dev/null
@@ -1,434 +0,0 @@
-From 1b017f3376a5df4a2cd5a120c16723e777fc9a36 Mon Sep 17 00:00:00 2001
-From: "ziv.xu" <ziv.xu@starfive.com>
-Date: Fri, 4 Aug 2023 13:55:23 +0800
-Subject: [PATCH 118/122] driver: regulator: axp20x: Support AXP15060 variant.
-
-Add axp15060 variant support to axp20x
-
-Signed-off-by: ziv.xu <ziv.xu@starfive.com>
----
- drivers/regulator/axp20x-regulator.c | 291 ++++++++++++++++++++++++++-
- 1 file changed, 283 insertions(+), 8 deletions(-)
-
---- a/drivers/regulator/axp20x-regulator.c
-+++ b/drivers/regulator/axp20x-regulator.c
-@@ -134,6 +134,11 @@
- #define AXP22X_PWR_OUT_DLDO4_MASK BIT_MASK(6)
- #define AXP22X_PWR_OUT_ALDO3_MASK BIT_MASK(7)
-
-+#define AXP313A_DCDC1_NUM_VOLTAGES 107
-+#define AXP313A_DCDC23_NUM_VOLTAGES 88
-+#define AXP313A_DCDC_V_OUT_MASK GENMASK(6, 0)
-+#define AXP313A_LDO_V_OUT_MASK GENMASK(4, 0)
-+
- #define AXP803_PWR_OUT_DCDC1_MASK BIT_MASK(0)
- #define AXP803_PWR_OUT_DCDC2_MASK BIT_MASK(1)
- #define AXP803_PWR_OUT_DCDC3_MASK BIT_MASK(2)
-@@ -270,6 +275,74 @@
-
- #define AXP813_PWR_OUT_DCDC7_MASK BIT_MASK(6)
-
-+#define AXP15060_DCDC1_V_CTRL_MASK GENMASK(4, 0)
-+#define AXP15060_DCDC2_V_CTRL_MASK GENMASK(6, 0)
-+#define AXP15060_DCDC3_V_CTRL_MASK GENMASK(6, 0)
-+#define AXP15060_DCDC4_V_CTRL_MASK GENMASK(6, 0)
-+#define AXP15060_DCDC5_V_CTRL_MASK GENMASK(6, 0)
-+#define AXP15060_DCDC6_V_CTRL_MASK GENMASK(4, 0)
-+#define AXP15060_ALDO1_V_CTRL_MASK GENMASK(4, 0)
-+#define AXP15060_ALDO2_V_CTRL_MASK GENMASK(4, 0)
-+#define AXP15060_ALDO3_V_CTRL_MASK GENMASK(4, 0)
-+#define AXP15060_ALDO4_V_CTRL_MASK GENMASK(4, 0)
-+#define AXP15060_ALDO5_V_CTRL_MASK GENMASK(4, 0)
-+#define AXP15060_BLDO1_V_CTRL_MASK GENMASK(4, 0)
-+#define AXP15060_BLDO2_V_CTRL_MASK GENMASK(4, 0)
-+#define AXP15060_BLDO3_V_CTRL_MASK GENMASK(4, 0)
-+#define AXP15060_BLDO4_V_CTRL_MASK GENMASK(4, 0)
-+#define AXP15060_BLDO5_V_CTRL_MASK GENMASK(4, 0)
-+#define AXP15060_CLDO1_V_CTRL_MASK GENMASK(4, 0)
-+#define AXP15060_CLDO2_V_CTRL_MASK GENMASK(4, 0)
-+#define AXP15060_CLDO3_V_CTRL_MASK GENMASK(4, 0)
-+#define AXP15060_CLDO4_V_CTRL_MASK GENMASK(5, 0)
-+#define AXP15060_CPUSLDO_V_CTRL_MASK GENMASK(3, 0)
-+
-+#define AXP15060_PWR_OUT_DCDC1_MASK BIT_MASK(0)
-+#define AXP15060_PWR_OUT_DCDC2_MASK BIT_MASK(1)
-+#define AXP15060_PWR_OUT_DCDC3_MASK BIT_MASK(2)
-+#define AXP15060_PWR_OUT_DCDC4_MASK BIT_MASK(3)
-+#define AXP15060_PWR_OUT_DCDC5_MASK BIT_MASK(4)
-+#define AXP15060_PWR_OUT_DCDC6_MASK BIT_MASK(5)
-+#define AXP15060_PWR_OUT_ALDO1_MASK BIT_MASK(0)
-+#define AXP15060_PWR_OUT_ALDO2_MASK BIT_MASK(1)
-+#define AXP15060_PWR_OUT_ALDO3_MASK BIT_MASK(2)
-+#define AXP15060_PWR_OUT_ALDO4_MASK BIT_MASK(3)
-+#define AXP15060_PWR_OUT_ALDO5_MASK BIT_MASK(4)
-+#define AXP15060_PWR_OUT_BLDO1_MASK BIT_MASK(5)
-+#define AXP15060_PWR_OUT_BLDO2_MASK BIT_MASK(6)
-+#define AXP15060_PWR_OUT_BLDO3_MASK BIT_MASK(7)
-+#define AXP15060_PWR_OUT_BLDO4_MASK BIT_MASK(0)
-+#define AXP15060_PWR_OUT_BLDO5_MASK BIT_MASK(1)
-+#define AXP15060_PWR_OUT_CLDO1_MASK BIT_MASK(2)
-+#define AXP15060_PWR_OUT_CLDO2_MASK BIT_MASK(3)
-+#define AXP15060_PWR_OUT_CLDO3_MASK BIT_MASK(4)
-+#define AXP15060_PWR_OUT_CLDO4_MASK BIT_MASK(5)
-+#define AXP15060_PWR_OUT_CPUSLDO_MASK BIT_MASK(6)
-+#define AXP15060_PWR_OUT_SW_MASK BIT_MASK(7)
-+
-+#define AXP15060_DCDC23_POLYPHASE_DUAL_MASK BIT_MASK(6)
-+#define AXP15060_DCDC46_POLYPHASE_DUAL_MASK BIT_MASK(7)
-+
-+#define AXP15060_DCDC234_500mV_START 0x00
-+#define AXP15060_DCDC234_500mV_STEPS 70
-+#define AXP15060_DCDC234_500mV_END \
-+ (AXP15060_DCDC234_500mV_START + AXP15060_DCDC234_500mV_STEPS)
-+#define AXP15060_DCDC234_1220mV_START 0x47
-+#define AXP15060_DCDC234_1220mV_STEPS 16
-+#define AXP15060_DCDC234_1220mV_END \
-+ (AXP15060_DCDC234_1220mV_START + AXP15060_DCDC234_1220mV_STEPS)
-+#define AXP15060_DCDC234_NUM_VOLTAGES 88
-+
-+#define AXP15060_DCDC5_800mV_START 0x00
-+#define AXP15060_DCDC5_800mV_STEPS 32
-+#define AXP15060_DCDC5_800mV_END \
-+ (AXP15060_DCDC5_800mV_START + AXP15060_DCDC5_800mV_STEPS)
-+#define AXP15060_DCDC5_1140mV_START 0x21
-+#define AXP15060_DCDC5_1140mV_STEPS 35
-+#define AXP15060_DCDC5_1140mV_END \
-+ (AXP15060_DCDC5_1140mV_START + AXP15060_DCDC5_1140mV_STEPS)
-+#define AXP15060_DCDC5_NUM_VOLTAGES 69
-+
- #define AXP_DESC_IO(_family, _id, _match, _supply, _min, _max, _step, _vreg, \
- _vmask, _ereg, _emask, _enable_val, _disable_val) \
- [_family##_##_id] = { \
-@@ -638,6 +711,48 @@ static const struct regulator_desc axp22
- .ops = &axp20x_ops_sw,
- };
-
-+static const struct linear_range axp313a_dcdc1_ranges[] = {
-+ REGULATOR_LINEAR_RANGE(500000, 0, 70, 10000),
-+ REGULATOR_LINEAR_RANGE(1220000, 71, 87, 20000),
-+ REGULATOR_LINEAR_RANGE(1600000, 88, 106, 100000),
-+};
-+
-+static const struct linear_range axp313a_dcdc2_ranges[] = {
-+ REGULATOR_LINEAR_RANGE(500000, 0, 70, 10000),
-+ REGULATOR_LINEAR_RANGE(1220000, 71, 87, 20000),
-+};
-+
-+/*
-+ * This is deviating from the datasheet. The values here are taken from the
-+ * BSP driver and have been confirmed by measurements.
-+ */
-+static const struct linear_range axp313a_dcdc3_ranges[] = {
-+ REGULATOR_LINEAR_RANGE(500000, 0, 70, 10000),
-+ REGULATOR_LINEAR_RANGE(1220000, 71, 102, 20000),
-+};
-+
-+static const struct regulator_desc axp313a_regulators[] = {
-+ AXP_DESC_RANGES(AXP313A, DCDC1, "dcdc1", "vin1",
-+ axp313a_dcdc1_ranges, AXP313A_DCDC1_NUM_VOLTAGES,
-+ AXP313A_DCDC1_CONRTOL, AXP313A_DCDC_V_OUT_MASK,
-+ AXP313A_OUTPUT_CONTROL, BIT(0)),
-+ AXP_DESC_RANGES(AXP313A, DCDC2, "dcdc2", "vin2",
-+ axp313a_dcdc2_ranges, AXP313A_DCDC23_NUM_VOLTAGES,
-+ AXP313A_DCDC2_CONRTOL, AXP313A_DCDC_V_OUT_MASK,
-+ AXP313A_OUTPUT_CONTROL, BIT(1)),
-+ AXP_DESC_RANGES(AXP313A, DCDC3, "dcdc3", "vin3",
-+ axp313a_dcdc3_ranges, AXP313A_DCDC23_NUM_VOLTAGES,
-+ AXP313A_DCDC3_CONRTOL, AXP313A_DCDC_V_OUT_MASK,
-+ AXP313A_OUTPUT_CONTROL, BIT(2)),
-+ AXP_DESC(AXP313A, ALDO1, "aldo1", "vin1", 500, 3500, 100,
-+ AXP313A_ALDO1_CONRTOL, AXP313A_LDO_V_OUT_MASK,
-+ AXP313A_OUTPUT_CONTROL, BIT(3)),
-+ AXP_DESC(AXP313A, DLDO1, "dldo1", "vin1", 500, 3500, 100,
-+ AXP313A_DLDO1_CONRTOL, AXP313A_LDO_V_OUT_MASK,
-+ AXP313A_OUTPUT_CONTROL, BIT(4)),
-+ AXP_DESC_FIXED(AXP313A, RTC_LDO, "rtc-ldo", "vin1", 1800),
-+};
-+
- /* DCDC ranges shared with AXP813 */
- static const struct linear_range axp803_dcdc234_ranges[] = {
- REGULATOR_LINEAR_RANGE(500000,
-@@ -1001,6 +1116,104 @@ static const struct regulator_desc axp81
- AXP22X_PWR_OUT_CTRL2, AXP22X_PWR_OUT_DC1SW_MASK),
- };
-
-+static const struct linear_range axp15060_dcdc234_ranges[] = {
-+ REGULATOR_LINEAR_RANGE(500000,
-+ AXP15060_DCDC234_500mV_START,
-+ AXP15060_DCDC234_500mV_END,
-+ 10000),
-+ REGULATOR_LINEAR_RANGE(1220000,
-+ AXP15060_DCDC234_1220mV_START,
-+ AXP15060_DCDC234_1220mV_END,
-+ 20000),
-+};
-+
-+static const struct linear_range axp15060_dcdc5_ranges[] = {
-+ REGULATOR_LINEAR_RANGE(800000,
-+ AXP15060_DCDC5_800mV_START,
-+ AXP15060_DCDC5_800mV_END,
-+ 10000),
-+ REGULATOR_LINEAR_RANGE(1140000,
-+ AXP15060_DCDC5_1140mV_START,
-+ AXP15060_DCDC5_1140mV_END,
-+ 20000),
-+};
-+
-+static const struct regulator_desc axp15060_regulators[] = {
-+ AXP_DESC(AXP15060, DCDC1, "dcdc1", "vin1", 1500, 3400, 100,
-+ AXP15060_DCDC1_V_CTRL, AXP15060_DCDC1_V_CTRL_MASK,
-+ AXP15060_PWR_OUT_CTRL1, AXP15060_PWR_OUT_DCDC1_MASK),
-+ AXP_DESC_RANGES(AXP15060, DCDC2, "dcdc2", "vin2",
-+ axp15060_dcdc234_ranges, AXP15060_DCDC234_NUM_VOLTAGES,
-+ AXP15060_DCDC2_V_CTRL, AXP15060_DCDC2_V_CTRL_MASK,
-+ AXP15060_PWR_OUT_CTRL1, AXP15060_PWR_OUT_DCDC2_MASK),
-+ AXP_DESC_RANGES(AXP15060, DCDC3, "dcdc3", "vin3",
-+ axp15060_dcdc234_ranges, AXP15060_DCDC234_NUM_VOLTAGES,
-+ AXP15060_DCDC3_V_CTRL, AXP15060_DCDC3_V_CTRL_MASK,
-+ AXP15060_PWR_OUT_CTRL1, AXP15060_PWR_OUT_DCDC3_MASK),
-+ AXP_DESC_RANGES(AXP15060, DCDC4, "dcdc4", "vin4",
-+ axp15060_dcdc234_ranges, AXP15060_DCDC234_NUM_VOLTAGES,
-+ AXP15060_DCDC4_V_CTRL, AXP15060_DCDC4_V_CTRL_MASK,
-+ AXP15060_PWR_OUT_CTRL1, AXP15060_PWR_OUT_DCDC4_MASK),
-+ AXP_DESC_RANGES(AXP15060, DCDC5, "dcdc5", "vin5",
-+ axp15060_dcdc5_ranges, AXP15060_DCDC5_NUM_VOLTAGES,
-+ AXP15060_DCDC5_V_CTRL, AXP15060_DCDC5_V_CTRL_MASK,
-+ AXP15060_PWR_OUT_CTRL1, AXP15060_PWR_OUT_DCDC5_MASK),
-+ AXP_DESC(AXP15060, DCDC6, "dcdc6", "vin6", 500, 3400, 100,
-+ AXP15060_DCDC6_V_CTRL, AXP15060_DCDC6_V_CTRL_MASK,
-+ AXP15060_PWR_OUT_CTRL1, AXP15060_PWR_OUT_DCDC6_MASK),
-+ AXP_DESC(AXP15060, ALDO1, "aldo1", "aldoin", 700, 3300, 100,
-+ AXP15060_ALDO1_V_CTRL, AXP15060_ALDO1_V_CTRL_MASK,
-+ AXP15060_PWR_OUT_CTRL2, AXP15060_PWR_OUT_ALDO1_MASK),
-+ AXP_DESC(AXP15060, ALDO2, "aldo2", "aldoin", 700, 3300, 100,
-+ AXP15060_ALDO2_V_CTRL, AXP15060_ALDO2_V_CTRL_MASK,
-+ AXP15060_PWR_OUT_CTRL2, AXP15060_PWR_OUT_ALDO2_MASK),
-+ AXP_DESC(AXP15060, ALDO3, "aldo3", "aldoin", 700, 3300, 100,
-+ AXP15060_ALDO3_V_CTRL, AXP15060_ALDO3_V_CTRL_MASK,
-+ AXP15060_PWR_OUT_CTRL2, AXP15060_PWR_OUT_ALDO3_MASK),
-+ AXP_DESC(AXP15060, ALDO4, "aldo4", "aldoin", 700, 3300, 100,
-+ AXP15060_ALDO4_V_CTRL, AXP15060_ALDO4_V_CTRL_MASK,
-+ AXP15060_PWR_OUT_CTRL2, AXP15060_PWR_OUT_ALDO4_MASK),
-+ AXP_DESC(AXP15060, ALDO5, "aldo5", "aldoin", 700, 3300, 100,
-+ AXP15060_ALDO5_V_CTRL, AXP15060_ALDO5_V_CTRL_MASK,
-+ AXP15060_PWR_OUT_CTRL2, AXP15060_PWR_OUT_ALDO5_MASK),
-+ AXP_DESC(AXP15060, BLDO1, "bldo1", "bldoin", 700, 3300, 100,
-+ AXP15060_BLDO1_V_CTRL, AXP15060_BLDO1_V_CTRL_MASK,
-+ AXP15060_PWR_OUT_CTRL2, AXP15060_PWR_OUT_BLDO1_MASK),
-+ AXP_DESC(AXP15060, BLDO2, "bldo2", "bldoin", 700, 3300, 100,
-+ AXP15060_BLDO2_V_CTRL, AXP15060_BLDO2_V_CTRL_MASK,
-+ AXP15060_PWR_OUT_CTRL2, AXP15060_PWR_OUT_BLDO2_MASK),
-+ AXP_DESC(AXP15060, BLDO3, "bldo3", "bldoin", 700, 3300, 100,
-+ AXP15060_BLDO3_V_CTRL, AXP15060_BLDO3_V_CTRL_MASK,
-+ AXP15060_PWR_OUT_CTRL2, AXP15060_PWR_OUT_BLDO3_MASK),
-+ AXP_DESC(AXP15060, BLDO4, "bldo4", "bldoin", 700, 3300, 100,
-+ AXP15060_BLDO4_V_CTRL, AXP15060_BLDO4_V_CTRL_MASK,
-+ AXP15060_PWR_OUT_CTRL3, AXP15060_PWR_OUT_BLDO4_MASK),
-+ AXP_DESC(AXP15060, BLDO5, "bldo5", "bldoin", 700, 3300, 100,
-+ AXP15060_BLDO5_V_CTRL, AXP15060_BLDO5_V_CTRL_MASK,
-+ AXP15060_PWR_OUT_CTRL3, AXP15060_PWR_OUT_BLDO5_MASK),
-+ AXP_DESC(AXP15060, CLDO1, "cldo1", "cldoin", 700, 3300, 100,
-+ AXP15060_CLDO1_V_CTRL, AXP15060_CLDO1_V_CTRL_MASK,
-+ AXP15060_PWR_OUT_CTRL3, AXP15060_PWR_OUT_CLDO1_MASK),
-+ AXP_DESC(AXP15060, CLDO2, "cldo2", "cldoin", 700, 3300, 100,
-+ AXP15060_CLDO2_V_CTRL, AXP15060_CLDO2_V_CTRL_MASK,
-+ AXP15060_PWR_OUT_CTRL3, AXP15060_PWR_OUT_CLDO2_MASK),
-+ AXP_DESC(AXP15060, CLDO3, "cldo3", "cldoin", 700, 3300, 100,
-+ AXP15060_CLDO3_V_CTRL, AXP15060_CLDO3_V_CTRL_MASK,
-+ AXP15060_PWR_OUT_CTRL3, AXP15060_PWR_OUT_CLDO3_MASK),
-+ AXP_DESC(AXP15060, CLDO4, "cldo4", "cldoin", 700, 4200, 100,
-+ AXP15060_CLDO4_V_CTRL, AXP15060_CLDO4_V_CTRL_MASK,
-+ AXP15060_PWR_OUT_CTRL3, AXP15060_PWR_OUT_CLDO4_MASK),
-+ /* Supply comes from DCDC5 */
-+ AXP_DESC(AXP15060, CPUSLDO, "cpusldo", NULL, 700, 1400, 50,
-+ AXP15060_CPUSLDO_V_CTRL, AXP15060_CPUSLDO_V_CTRL_MASK,
-+ AXP15060_PWR_OUT_CTRL3, AXP15060_PWR_OUT_CPUSLDO_MASK),
-+ /* Supply comes from DCDC1 */
-+ AXP_DESC_SW(AXP15060, SW, "sw", NULL,
-+ AXP15060_PWR_OUT_CTRL3, AXP15060_PWR_OUT_SW_MASK),
-+ /* Supply comes from ALDO1 */
-+ AXP_DESC_FIXED(AXP15060, RTC_LDO, "rtc-ldo", NULL, 1800),
-+};
-+
- static int axp20x_set_dcdc_freq(struct platform_device *pdev, u32 dcdcfreq)
- {
- struct axp20x_dev *axp20x = dev_get_drvdata(pdev->dev.parent);
-@@ -1040,6 +1253,16 @@ static int axp20x_set_dcdc_freq(struct p
- def = 3000;
- step = 150;
- break;
-+ case AXP313A_ID:
-+ case AXP15060_ID:
-+ /* The DCDC PWM frequency seems to be fixed to 3 MHz. */
-+ if (dcdcfreq != 0) {
-+ dev_err(&pdev->dev,
-+ "DCDC frequency on this PMIC is fixed to 3 MHz.\n");
-+ return -EINVAL;
-+ }
-+
-+ return 0;
- default:
- dev_err(&pdev->dev,
- "Setting DCDC frequency for unsupported AXP variant\n");
-@@ -1145,6 +1368,15 @@ static int axp20x_set_dcdc_workmode(stru
- workmode <<= id - AXP813_DCDC1;
- break;
-
-+ case AXP15060_ID:
-+ reg = AXP15060_DCDC_MODE_CTRL2;
-+ if (id < AXP15060_DCDC1 || id > AXP15060_DCDC6)
-+ return -EINVAL;
-+
-+ mask = AXP22X_WORKMODE_DCDCX_MASK(id - AXP15060_DCDC1);
-+ workmode <<= id - AXP15060_DCDC1;
-+ break;
-+
- default:
- /* should not happen */
- WARN_ON(1);
-@@ -1164,7 +1396,7 @@ static bool axp20x_is_polyphase_slave(st
-
- /*
- * Currently in our supported AXP variants, only AXP803, AXP806,
-- * and AXP813 have polyphase regulators.
-+ * AXP813 and AXP15060 have polyphase regulators.
- */
- switch (axp20x->variant) {
- case AXP803_ID:
-@@ -1196,6 +1428,17 @@ static bool axp20x_is_polyphase_slave(st
- }
- break;
-
-+ case AXP15060_ID:
-+ regmap_read(axp20x->regmap, AXP15060_DCDC_MODE_CTRL1, &reg);
-+
-+ switch (id) {
-+ case AXP15060_DCDC3:
-+ return !!(reg & AXP15060_DCDC23_POLYPHASE_DUAL_MASK);
-+ case AXP15060_DCDC6:
-+ return !!(reg & AXP15060_DCDC46_POLYPHASE_DUAL_MASK);
-+ }
-+ break;
-+
- default:
- return false;
- }
-@@ -1217,6 +1460,7 @@ static int axp20x_regulator_probe(struct
- u32 workmode;
- const char *dcdc1_name = axp22x_regulators[AXP22X_DCDC1].name;
- const char *dcdc5_name = axp22x_regulators[AXP22X_DCDC5].name;
-+ const char *aldo1_name = axp15060_regulators[AXP15060_ALDO1].name;
- bool drivevbus = false;
-
- switch (axp20x->variant) {
-@@ -1232,6 +1476,10 @@ static int axp20x_regulator_probe(struct
- drivevbus = of_property_read_bool(pdev->dev.parent->of_node,
- "x-powers,drive-vbus-en");
- break;
-+ case AXP313A_ID:
-+ regulators = axp313a_regulators;
-+ nregulators = AXP313A_REG_ID_MAX;
-+ break;
- case AXP803_ID:
- regulators = axp803_regulators;
- nregulators = AXP803_REG_ID_MAX;
-@@ -1252,6 +1500,10 @@ static int axp20x_regulator_probe(struct
- drivevbus = of_property_read_bool(pdev->dev.parent->of_node,
- "x-powers,drive-vbus-en");
- break;
-+ case AXP15060_ID:
-+ regulators = axp15060_regulators;
-+ nregulators = AXP15060_REG_ID_MAX;
-+ break;
- default:
- dev_err(&pdev->dev, "Unsupported AXP variant: %ld\n",
- axp20x->variant);
-@@ -1278,8 +1530,9 @@ static int axp20x_regulator_probe(struct
- continue;
-
- /*
-- * Regulators DC1SW and DC5LDO are connected internally,
-- * so we have to handle their supply names separately.
-+ * Regulators DC1SW, DC5LDO and RTCLDO on AXP15060 are
-+ * connected internally, so we have to handle their supply
-+ * names separately.
- *
- * We always register the regulators in proper sequence,
- * so the supply names are correctly read. See the last
-@@ -1288,7 +1541,8 @@ static int axp20x_regulator_probe(struct
- */
- if ((regulators == axp22x_regulators && i == AXP22X_DC1SW) ||
- (regulators == axp803_regulators && i == AXP803_DC1SW) ||
-- (regulators == axp809_regulators && i == AXP809_DC1SW)) {
-+ (regulators == axp809_regulators && i == AXP809_DC1SW) ||
-+ (regulators == axp15060_regulators && i == AXP15060_SW)) {
- new_desc = devm_kzalloc(&pdev->dev, sizeof(*desc),
- GFP_KERNEL);
- if (!new_desc)
-@@ -1300,7 +1554,8 @@ static int axp20x_regulator_probe(struct
- }
-
- if ((regulators == axp22x_regulators && i == AXP22X_DC5LDO) ||
-- (regulators == axp809_regulators && i == AXP809_DC5LDO)) {
-+ (regulators == axp809_regulators && i == AXP809_DC5LDO) ||
-+ (regulators == axp15060_regulators && i == AXP15060_CPUSLDO)) {
- new_desc = devm_kzalloc(&pdev->dev, sizeof(*desc),
- GFP_KERNEL);
- if (!new_desc)
-@@ -1311,6 +1566,18 @@ static int axp20x_regulator_probe(struct
- desc = new_desc;
- }
-
-+
-+ if (regulators == axp15060_regulators && i == AXP15060_RTC_LDO) {
-+ new_desc = devm_kzalloc(&pdev->dev, sizeof(*desc),
-+ GFP_KERNEL);
-+ if (!new_desc)
-+ return -ENOMEM;
-+
-+ *new_desc = regulators[i];
-+ new_desc->supply_name = aldo1_name;
-+ desc = new_desc;
-+ }
-+
- rdev = devm_regulator_register(&pdev->dev, desc, &config);
- if (IS_ERR(rdev)) {
- dev_err(&pdev->dev, "Failed to register %s\n",
-@@ -1329,19 +1596,26 @@ static int axp20x_regulator_probe(struct
- }
-
- /*
-- * Save AXP22X DCDC1 / DCDC5 regulator names for later.
-+ * Save AXP22X DCDC1 / DCDC5 / AXP15060 ALDO1 regulator names for later.
- */
- if ((regulators == axp22x_regulators && i == AXP22X_DCDC1) ||
-- (regulators == axp809_regulators && i == AXP809_DCDC1))
-+ (regulators == axp809_regulators && i == AXP809_DCDC1) ||
-+ (regulators == axp15060_regulators && i == AXP15060_DCDC1))
- of_property_read_string(rdev->dev.of_node,
- "regulator-name",
- &dcdc1_name);
-
- if ((regulators == axp22x_regulators && i == AXP22X_DCDC5) ||
-- (regulators == axp809_regulators && i == AXP809_DCDC5))
-+ (regulators == axp809_regulators && i == AXP809_DCDC5) ||
-+ (regulators == axp15060_regulators && i == AXP15060_DCDC5))
- of_property_read_string(rdev->dev.of_node,
- "regulator-name",
- &dcdc5_name);
-+
-+ if (regulators == axp15060_regulators && i == AXP15060_ALDO1)
-+ of_property_read_string(rdev->dev.of_node,
-+ "regulator-name",
-+ &aldo1_name);
- }
-
- if (drivevbus) {
-@@ -1364,6 +1638,7 @@ static struct platform_driver axp20x_reg
- .probe = axp20x_regulator_probe,
- .driver = {
- .name = "axp20x-regulator",
-+ .probe_type = PROBE_PREFER_ASYNCHRONOUS,
- },
- };
-