]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
regulator: bd71828: Support ROHM BD72720
authorMatti Vaittinen <mazziesaccount@gmail.com>
Mon, 15 Dec 2025 13:20:06 +0000 (15:20 +0200)
committerLee Jones <lee@kernel.org>
Tue, 13 Jan 2026 12:49:39 +0000 (12:49 +0000)
ROHM BD72720 is a power management IC which integrates 10 buck and 11 LDO
regulators. This PMIC has plenty of commonalities with the BD71828 and
BD71879.

The BD72720 does also have similar 'run-level'-concept as the BD71828 had.
It allows controlling the regulator's 'en masse', although only BUCK1
and LDO1 can utilize this in BD72720. Similar to BD71828, this 'en
masse' -control is not supported by this driver.

Support the voltage and enable/disable state control for the BD72720.

Signed-off-by: Matti Vaittinen <mazziesaccount@gmail.com>
Reviewed-by: Mark Brown <broonie@kernel.org>
Link: https://patch.msgid.link/88b82128648516d9dbb173044042f2a7a5dfdf1c.1765804226.git.mazziesaccount@gmail.com
Signed-off-by: Lee Jones <lee@kernel.org>
drivers/regulator/Kconfig
drivers/regulator/bd71828-regulator.c

index d2335276cce5ffbd500bbaf251d1761a9116aee9..003bd938c84ab5f8f281d7b6a801d3f3d08e09f3 100644 (file)
@@ -241,13 +241,13 @@ config REGULATOR_BD71815
          will be called bd71815-regulator.
 
 config REGULATOR_BD71828
-       tristate "ROHM BD71828 Power Regulator"
+       tristate "ROHM BD71828, BD72720 and BD73900 Power Regulators"
        depends on MFD_ROHM_BD71828
        select REGULATOR_ROHM
        help
-         This driver supports voltage regulators on ROHM BD71828 PMIC.
-         This will enable support for the software controllable buck
-         and LDO regulators.
+         This driver supports voltage regulators on ROHM BD71828,
+         BD71879, BD72720 and BD73900 PMICs. This will enable
+         support for the software controllable buck and LDO regulators.
 
          This driver can also be built as a module. If so, the module
          will be called bd71828-regulator.
index 8c006bff89a8f3bd83249f5a0527d33121816311..c8f3343cfe23e6ae0d3c48fec3b5f5285c468cd7 100644 (file)
@@ -3,12 +3,15 @@
 // bd71828-regulator.c ROHM BD71828GW-DS1 regulator driver
 //
 
+#include <linux/cleanup.h>
 #include <linux/delay.h>
 #include <linux/err.h>
 #include <linux/interrupt.h>
 #include <linux/kernel.h>
 #include <linux/mfd/rohm-bd71828.h>
+#include <linux/mfd/rohm-bd72720.h>
 #include <linux/module.h>
+#include <linux/mod_devicetable.h>
 #include <linux/of.h>
 #include <linux/platform_device.h>
 #include <linux/regmap.h>
@@ -16,6 +19,7 @@
 #include <linux/regulator/machine.h>
 #include <linux/regulator/of_regulator.h>
 
+#define BD72720_MASK_LDON_HEAD GENMASK(2, 0)
 struct reg_init {
        unsigned int reg;
        unsigned int mask;
@@ -64,6 +68,26 @@ static const struct reg_init bd71828_buck7_inits[] = {
        },
 };
 
+#define BD72720_MASK_DVS_BUCK1_CTRL BIT(4)
+#define BD72720_MASK_DVS_LDO1_CTRL BIT(5)
+
+static const struct reg_init bd72720_buck1_inits[] = {
+       {
+               .reg = BD72720_REG_PS_CTRL_2,
+               .mask = BD72720_MASK_DVS_BUCK1_CTRL,
+               .val = 0, /* Disable "run-level" control */
+       },
+};
+
+static const struct reg_init bd72720_ldo1_inits[] = {
+       {
+               .reg = BD72720_REG_PS_CTRL_2,
+               .mask = BD72720_MASK_DVS_LDO1_CTRL,
+               .val = 0, /* Disable "run-level" control */
+       },
+};
+
+/* BD71828 Buck voltages */
 static const struct linear_range bd71828_buck1267_volts[] = {
        REGULATOR_LINEAR_RANGE(500000, 0x00, 0xef, 6250),
        REGULATOR_LINEAR_RANGE(2000000, 0xf0, 0xff, 0),
@@ -84,13 +108,79 @@ static const struct linear_range bd71828_buck5_volts[] = {
        REGULATOR_LINEAR_RANGE(3300000, 0x10, 0x1f, 0),
 };
 
+/* BD71828 LDO voltages */
 static const struct linear_range bd71828_ldo_volts[] = {
        REGULATOR_LINEAR_RANGE(800000, 0x00, 0x31, 50000),
        REGULATOR_LINEAR_RANGE(3300000, 0x32, 0x3f, 0),
 };
 
+/* BD72720 Buck voltages */
+static const struct linear_range bd72720_buck1234_volts[] = {
+       REGULATOR_LINEAR_RANGE(500000, 0x00, 0xc0, 6250),
+       REGULATOR_LINEAR_RANGE(1700000, 0xc1, 0xff, 0),
+};
+
+static const struct linear_range bd72720_buck589_volts[] = {
+       REGULATOR_LINEAR_RANGE(500000, 0x00, 0x78, 10000),
+       REGULATOR_LINEAR_RANGE(1700000, 0x79, 0xff, 0),
+};
+
+static const struct linear_range bd72720_buck67_volts[] = {
+       REGULATOR_LINEAR_RANGE(1500000, 0x00, 0xb4, 10000),
+       REGULATOR_LINEAR_RANGE(3300000, 0xb5, 0xff, 0),
+};
+
+/*
+ * The BUCK10 on BD72720 has two modes of operation, depending on a LDON_HEAD
+ * setting. When LDON_HEAD is 0x0, the behaviour is as with other bucks, eg.
+ * voltage can be set to a values indicated below using the VSEL register.
+ *
+ * However, when LDON_HEAD is set to 0x1 ... 0x7, BUCK 10 voltage is, according
+ * to the data-sheet, "automatically adjusted following LDON_HEAD setting and
+ * clamped to BUCK10_VID setting".
+ *
+ * Again, reading the data-sheet shows a "typical connection" where the BUCK10
+ * is used to supply the LDOs 1-4. My assumption is that in practice, this
+ * means that the BUCK10 voltage will be adjusted based on the maximum output
+ * of the LDO 1-4 (to minimize power loss). This makes sense.
+ *
+ * Auto-adjusting regulators aren't something I really like to model in the
+ * driver though - and, if the auto-adjustment works as intended, then there
+ * should really be no need to software to care about the buck10 voltages.
+ * If enable/disable control is still needed, we can implement buck10 as a
+ * regulator with only the enable/disable ops - and device-tree can be used
+ * to model the supply-relations. I believe this could allow the regulator
+ * framework to automagically disable the BUCK10 if all LDOs that are being
+ * supplied by it are disabled.
+ */
+static const struct linear_range bd72720_buck10_volts[] = {
+       REGULATOR_LINEAR_RANGE(500000, 0x00, 0xc0, 6250),
+       REGULATOR_LINEAR_RANGE(1700000, 0xc1, 0xff, 0),
+};
+
+/* BD72720 LDO voltages */
+static const struct linear_range bd72720_ldo1234_volts[] = {
+       REGULATOR_LINEAR_RANGE(500000, 0x00, 0x50, 6250),
+       REGULATOR_LINEAR_RANGE(1000000, 0x51, 0x7f, 0),
+};
+
+static const struct linear_range bd72720_ldo57891011_volts[] = {
+       REGULATOR_LINEAR_RANGE(750000, 0x00, 0xff, 10000),
+};
+
+static const struct linear_range bd72720_ldo6_volts[] = {
+       REGULATOR_LINEAR_RANGE(600000, 0x00, 0x78, 10000),
+       REGULATOR_LINEAR_RANGE(1800000, 0x79, 0x7f, 0),
+};
+
 static const unsigned int bd71828_ramp_delay[] = { 2500, 5000, 10000, 20000 };
 
+/*
+ * BD72720 supports setting both the ramp-up and ramp-down values
+ * separately. Do we need to support ramp-down setting?
+ */
+static const unsigned int bd72720_ramp_delay[] = { 5000, 7500, 10000, 12500 };
+
 static int buck_set_hw_dvs_levels(struct device_node *np,
                                  const struct regulator_desc *desc,
                                  struct regulator_config *cfg)
@@ -171,6 +261,24 @@ static const struct regulator_ops bd71828_ldo6_ops = {
        .is_enabled = regulator_is_enabled_regmap,
 };
 
+static const struct regulator_ops bd72720_regulator_ops = {
+       .enable = regulator_enable_regmap,
+       .disable = regulator_disable_regmap,
+       .is_enabled = regulator_is_enabled_regmap,
+       .list_voltage = regulator_list_voltage_linear_range,
+       .set_voltage_sel = regulator_set_voltage_sel_regmap,
+       .get_voltage_sel = regulator_get_voltage_sel_regmap,
+       .set_voltage_time_sel = regulator_set_voltage_time_sel,
+       .set_ramp_delay = regulator_set_ramp_delay_regmap,
+};
+
+static const struct regulator_ops bd72720_buck10_ldon_head_op = {
+       .enable = regulator_enable_regmap,
+       .disable = regulator_disable_regmap,
+       .is_enabled = regulator_is_enabled_regmap,
+       .set_ramp_delay = regulator_set_ramp_delay_regmap,
+};
+
 static const struct bd71828_regulator_data bd71828_rdata[] = {
        {
                .desc = {
@@ -677,22 +785,890 @@ static const struct bd71828_regulator_data bd71828_rdata[] = {
        },
 };
 
+#define BD72720_BUCK10_DESC_INDEX 10
+#define BD72720_NUM_BUCK_VOLTS 0x100
+#define BD72720_NUM_LDO_VOLTS 0x100
+#define BD72720_NUM_LDO12346_VOLTS 0x80
+
+static const struct bd71828_regulator_data bd72720_rdata[] = {
+       {
+               .desc = {
+                       .name = "buck1",
+                       .of_match = of_match_ptr("buck1"),
+                       .regulators_node = of_match_ptr("regulators"),
+                       .id = BD72720_BUCK1,
+                       .type = REGULATOR_VOLTAGE,
+
+                       /*
+                        * The BD72720 BUCK1 and LDO1 support GPIO toggled
+                        * sub-RUN states called RUN0, RUN1, RUN2 and RUN3.
+                        * The "operating mode" (sub-RUN states or normal)
+                        * can be changed by a register.
+                        *
+                        * When the sub-RUN states are used, the voltage and
+                        * enable state depend on a state specific
+                        * configuration. The voltage and enable configuration
+                        * for BUCK1 and LDO1 can be defined for each sub-RUN
+                        * state using BD72720_REG_[BUCK,LDO]1_VSEL_R[0,1,2,3]
+                        * voltage selection registers and the bits
+                        * BD72720_MASK_RUN_[0,1,2,3]_EN in the enable registers.
+                        * The PMIC will change both the BUCK1 and LDO1 voltages
+                        * to the states defined in these registers when
+                        * "DVS GPIOs" are toggled.
+                        *
+                        * If RUN 0 .. RUN 4 states are to be used, the normal
+                        * voltage configuration mechanisms do not apply
+                        * and we should overwrite the ops and ignore the
+                        * voltage setting/getting registers which are setup
+                        * here. This is not supported for now. If you need
+                        * this functionality, you may try merging functionality
+                        * from a downstream driver:
+                        * https://rohmsemiconductor.github.io/Linux-Kernel-PMIC-Drivers/BD72720/
+                        */
+                       .ops = &bd72720_regulator_ops,
+                       .linear_ranges = bd72720_buck1234_volts,
+                       .n_linear_ranges = ARRAY_SIZE(bd72720_buck1234_volts),
+                       .n_voltages = BD72720_NUM_BUCK_VOLTS,
+                       .enable_reg = BD72720_REG_BUCK1_ON,
+                       .enable_mask = BD72720_MASK_RUN_B_EN,
+                       .vsel_reg = BD72720_REG_BUCK1_VSEL_RB,
+                       .vsel_mask = BD72720_MASK_BUCK_VSEL,
+
+                       .ramp_delay_table = bd72720_ramp_delay,
+                       .n_ramp_values = ARRAY_SIZE(bd72720_ramp_delay),
+                       .ramp_reg = BD72720_REG_BUCK1_MODE,
+                       .ramp_mask = BD72720_MASK_RAMP_UP_DELAY,
+                       .owner = THIS_MODULE,
+                       .of_parse_cb = buck_set_hw_dvs_levels,
+               },
+               .dvs = {
+                       .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
+                                    ROHM_DVS_LEVEL_SUSPEND |
+                                    ROHM_DVS_LEVEL_LPSR, /* Deep idle in data-sheet */
+                       .run_reg = BD72720_REG_BUCK1_VSEL_RB,
+                       .run_mask = BD72720_MASK_BUCK_VSEL,
+                       .idle_reg = BD72720_REG_BUCK1_VSEL_I,
+                       .idle_mask = BD72720_MASK_BUCK_VSEL,
+                       .idle_on_mask = BD72720_MASK_IDLE_EN,
+                       .suspend_reg = BD72720_REG_BUCK1_VSEL_S,
+                       .suspend_mask = BD72720_MASK_BUCK_VSEL,
+                       .suspend_on_mask = BD72720_MASK_SUSPEND_EN,
+                       .lpsr_reg = BD72720_REG_BUCK1_VSEL_DI,
+                       .lpsr_mask = BD72720_MASK_BUCK_VSEL,
+                       .lpsr_on_mask = BD72720_MASK_DEEP_IDLE_EN,
+               },
+               .reg_inits = bd72720_buck1_inits,
+               .reg_init_amnt = ARRAY_SIZE(bd72720_buck1_inits),
+       }, {
+               .desc = {
+                       .name = "buck2",
+                       .of_match = of_match_ptr("buck2"),
+                       .regulators_node = of_match_ptr("regulators"),
+                       .id = BD72720_BUCK2,
+                       .type = REGULATOR_VOLTAGE,
+                       .ops = &bd72720_regulator_ops,
+                       .linear_ranges = bd72720_buck1234_volts,
+                       .n_linear_ranges = ARRAY_SIZE(bd72720_buck1234_volts),
+                       .n_voltages = BD72720_NUM_BUCK_VOLTS,
+                       .enable_reg = BD72720_REG_BUCK2_ON,
+                       .enable_mask = BD72720_MASK_RUN_B_EN,
+                       .vsel_reg = BD72720_REG_BUCK2_VSEL_R,
+                       .vsel_mask = BD72720_MASK_BUCK_VSEL,
+
+                       .ramp_delay_table = bd72720_ramp_delay,
+                       .n_ramp_values = ARRAY_SIZE(bd72720_ramp_delay),
+                       .ramp_reg = BD72720_REG_BUCK2_MODE,
+                       .ramp_mask = BD72720_MASK_RAMP_UP_DELAY,
+                       .owner = THIS_MODULE,
+                       .of_parse_cb = buck_set_hw_dvs_levels,
+               },
+               .dvs = {
+                       .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
+                                    ROHM_DVS_LEVEL_SUSPEND |
+                                    ROHM_DVS_LEVEL_LPSR,
+                       .run_reg = BD72720_REG_BUCK2_VSEL_R,
+                       .run_mask = BD72720_MASK_BUCK_VSEL,
+                       .idle_reg = BD72720_REG_BUCK2_VSEL_I,
+                       .idle_mask = BD72720_MASK_BUCK_VSEL,
+                       .idle_on_mask = BD72720_MASK_IDLE_EN,
+                       .suspend_reg = BD72720_REG_BUCK2_VSEL_S,
+                       .suspend_mask = BD72720_MASK_BUCK_VSEL,
+                       .suspend_on_mask = BD72720_MASK_SUSPEND_EN,
+                       .lpsr_reg = BD72720_REG_BUCK2_VSEL_DI,
+                       .lpsr_mask = BD72720_MASK_BUCK_VSEL,
+                       .lpsr_on_mask = BD72720_MASK_DEEP_IDLE_EN,
+               },
+       }, {
+               .desc = {
+                       .name = "buck3",
+                       .of_match = of_match_ptr("buck3"),
+                       .regulators_node = of_match_ptr("regulators"),
+                       .id = BD72720_BUCK3,
+                       .type = REGULATOR_VOLTAGE,
+                       .ops = &bd72720_regulator_ops,
+                       .linear_ranges = bd72720_buck1234_volts,
+                       .n_linear_ranges = ARRAY_SIZE(bd72720_buck1234_volts),
+                       .n_voltages = BD72720_NUM_BUCK_VOLTS,
+                       .enable_reg = BD72720_REG_BUCK3_ON,
+                       .enable_mask = BD72720_MASK_RUN_B_EN,
+                       .vsel_reg = BD72720_REG_BUCK3_VSEL_R,
+                       .vsel_mask = BD72720_MASK_BUCK_VSEL,
+
+                       .ramp_delay_table = bd72720_ramp_delay,
+                       .n_ramp_values = ARRAY_SIZE(bd72720_ramp_delay),
+                       .ramp_reg = BD72720_REG_BUCK3_MODE,
+                       .ramp_mask = BD72720_MASK_RAMP_UP_DELAY,
+                       .owner = THIS_MODULE,
+                       .of_parse_cb = buck_set_hw_dvs_levels,
+               },
+               .dvs = {
+                       .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
+                                    ROHM_DVS_LEVEL_SUSPEND |
+                                    ROHM_DVS_LEVEL_LPSR,
+                       .run_reg = BD72720_REG_BUCK3_VSEL_R,
+                       .run_mask = BD72720_MASK_BUCK_VSEL,
+                       .idle_reg = BD72720_REG_BUCK3_VSEL_I,
+                       .idle_mask = BD72720_MASK_BUCK_VSEL,
+                       .idle_on_mask = BD72720_MASK_IDLE_EN,
+                       .suspend_reg = BD72720_REG_BUCK3_VSEL_S,
+                       .suspend_mask = BD72720_MASK_BUCK_VSEL,
+                       .suspend_on_mask = BD72720_MASK_SUSPEND_EN,
+                       .lpsr_reg = BD72720_REG_BUCK3_VSEL_DI,
+                       .lpsr_mask = BD72720_MASK_BUCK_VSEL,
+                       .lpsr_on_mask = BD72720_MASK_DEEP_IDLE_EN,
+               },
+       }, {
+               .desc = {
+                       .name = "buck4",
+                       .of_match = of_match_ptr("buck4"),
+                       .regulators_node = of_match_ptr("regulators"),
+                       .id = BD72720_BUCK4,
+                       .type = REGULATOR_VOLTAGE,
+                       .ops = &bd72720_regulator_ops,
+                       .linear_ranges = bd72720_buck1234_volts,
+                       .n_linear_ranges = ARRAY_SIZE(bd72720_buck1234_volts),
+                       .n_voltages = BD72720_NUM_BUCK_VOLTS,
+                       .enable_reg = BD72720_REG_BUCK4_ON,
+                       .enable_mask = BD72720_MASK_RUN_B_EN,
+                       .vsel_reg = BD72720_REG_BUCK4_VSEL_R,
+                       .vsel_mask = BD72720_MASK_BUCK_VSEL,
+
+                       .ramp_delay_table = bd72720_ramp_delay,
+                       .n_ramp_values = ARRAY_SIZE(bd72720_ramp_delay),
+                       .ramp_reg = BD72720_REG_BUCK4_MODE,
+                       .ramp_mask = BD72720_MASK_RAMP_UP_DELAY,
+                       .owner = THIS_MODULE,
+                       .of_parse_cb = buck_set_hw_dvs_levels,
+               },
+               .dvs = {
+                       .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
+                                    ROHM_DVS_LEVEL_SUSPEND |
+                                    ROHM_DVS_LEVEL_LPSR,
+                       .run_reg = BD72720_REG_BUCK4_VSEL_R,
+                       .run_mask = BD72720_MASK_BUCK_VSEL,
+                       .idle_reg = BD72720_REG_BUCK4_VSEL_I,
+                       .idle_mask = BD72720_MASK_BUCK_VSEL,
+                       .idle_on_mask = BD72720_MASK_IDLE_EN,
+                       .suspend_reg = BD72720_REG_BUCK4_VSEL_S,
+                       .suspend_mask = BD72720_MASK_BUCK_VSEL,
+                       .suspend_on_mask = BD72720_MASK_SUSPEND_EN,
+                       .lpsr_reg = BD72720_REG_BUCK4_VSEL_DI,
+                       .lpsr_mask = BD72720_MASK_BUCK_VSEL,
+                       .lpsr_on_mask = BD72720_MASK_DEEP_IDLE_EN,
+               },
+       }, {
+               .desc = {
+                       .name = "buck5",
+                       .of_match = of_match_ptr("buck5"),
+                       .regulators_node = of_match_ptr("regulators"),
+                       .id = BD72720_BUCK5,
+                       .type = REGULATOR_VOLTAGE,
+                       .ops = &bd72720_regulator_ops,
+                       .linear_ranges = bd72720_buck589_volts,
+                       .n_linear_ranges = ARRAY_SIZE(bd72720_buck589_volts),
+                       .n_voltages = BD72720_NUM_BUCK_VOLTS,
+                       .enable_reg = BD72720_REG_BUCK5_ON,
+                       .enable_mask = BD72720_MASK_RUN_B_EN,
+                       .vsel_reg = BD72720_REG_BUCK5_VSEL,
+                       .vsel_mask = BD72720_MASK_BUCK_VSEL,
+
+                       .ramp_delay_table = bd72720_ramp_delay,
+                       .n_ramp_values = ARRAY_SIZE(bd72720_ramp_delay),
+                       .ramp_reg = BD72720_REG_BUCK5_MODE,
+                       .ramp_mask = BD72720_MASK_RAMP_UP_DELAY,
+                       .owner = THIS_MODULE,
+                       .of_parse_cb = buck_set_hw_dvs_levels,
+               },
+               .dvs = {
+                       .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
+                                    ROHM_DVS_LEVEL_SUSPEND |
+                                    ROHM_DVS_LEVEL_LPSR,
+                       .run_reg = BD72720_REG_BUCK5_VSEL,
+                       .run_mask = BD72720_MASK_BUCK_VSEL,
+                       .idle_on_mask = BD72720_MASK_IDLE_EN,
+                       .suspend_on_mask = BD72720_MASK_SUSPEND_EN,
+                       .lpsr_on_mask = BD72720_MASK_DEEP_IDLE_EN,
+               },
+       }, {
+               .desc = {
+                       .name = "buck6",
+                       .of_match = of_match_ptr("buck6"),
+                       .regulators_node = of_match_ptr("regulators"),
+                       .id = BD72720_BUCK6,
+                       .type = REGULATOR_VOLTAGE,
+                       .ops = &bd72720_regulator_ops,
+                       .linear_ranges = bd72720_buck67_volts,
+                       .n_linear_ranges = ARRAY_SIZE(bd72720_buck67_volts),
+                       .n_voltages = BD72720_NUM_BUCK_VOLTS,
+                       .enable_reg = BD72720_REG_BUCK6_ON,
+                       .enable_mask = BD72720_MASK_RUN_B_EN,
+                       .vsel_reg = BD72720_REG_BUCK6_VSEL,
+                       .vsel_mask = BD72720_MASK_BUCK_VSEL,
+
+                       .ramp_delay_table = bd72720_ramp_delay,
+                       .n_ramp_values = ARRAY_SIZE(bd72720_ramp_delay),
+                       .ramp_reg = BD72720_REG_BUCK6_MODE,
+                       .ramp_mask = BD72720_MASK_RAMP_UP_DELAY,
+                       .owner = THIS_MODULE,
+                       .of_parse_cb = buck_set_hw_dvs_levels,
+               },
+               .dvs = {
+                       .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
+                                    ROHM_DVS_LEVEL_SUSPEND |
+                                    ROHM_DVS_LEVEL_LPSR,
+                       .run_reg = BD72720_REG_BUCK6_VSEL,
+                       .run_mask = BD72720_MASK_BUCK_VSEL,
+                       .idle_on_mask = BD72720_MASK_IDLE_EN,
+                       .suspend_on_mask = BD72720_MASK_SUSPEND_EN,
+                       .lpsr_on_mask = BD72720_MASK_DEEP_IDLE_EN,
+               },
+       }, {
+               .desc = {
+                       .name = "buck7",
+                       .of_match = of_match_ptr("buck7"),
+                       .regulators_node = of_match_ptr("regulators"),
+                       .id = BD72720_BUCK7,
+                       .type = REGULATOR_VOLTAGE,
+                       .ops = &bd72720_regulator_ops,
+                       .linear_ranges = bd72720_buck67_volts,
+                       .n_linear_ranges = ARRAY_SIZE(bd72720_buck67_volts),
+                       .n_voltages = BD72720_NUM_BUCK_VOLTS,
+                       .enable_reg = BD72720_REG_BUCK7_ON,
+                       .enable_mask = BD72720_MASK_RUN_B_EN,
+                       .vsel_reg = BD72720_REG_BUCK7_VSEL,
+                       .vsel_mask = BD72720_MASK_BUCK_VSEL,
+
+                       .ramp_delay_table = bd72720_ramp_delay,
+                       .n_ramp_values = ARRAY_SIZE(bd72720_ramp_delay),
+                       .ramp_reg = BD72720_REG_BUCK7_MODE,
+                       .ramp_mask = BD72720_MASK_RAMP_UP_DELAY,
+                       .owner = THIS_MODULE,
+                       .of_parse_cb = buck_set_hw_dvs_levels,
+               },
+               .dvs = {
+                       .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
+                                    ROHM_DVS_LEVEL_SUSPEND |
+                                    ROHM_DVS_LEVEL_LPSR,
+                       .run_reg = BD72720_REG_BUCK7_VSEL,
+                       .run_mask = BD72720_MASK_BUCK_VSEL,
+                       .idle_on_mask = BD72720_MASK_IDLE_EN,
+                       .suspend_on_mask = BD72720_MASK_SUSPEND_EN,
+                       .lpsr_on_mask = BD72720_MASK_DEEP_IDLE_EN,
+               },
+       }, {
+               .desc = {
+                       .name = "buck8",
+                       .of_match = of_match_ptr("buck8"),
+                       .regulators_node = of_match_ptr("regulators"),
+                       .id = BD72720_BUCK8,
+                       .type = REGULATOR_VOLTAGE,
+                       .ops = &bd72720_regulator_ops,
+                       .linear_ranges = bd72720_buck589_volts,
+                       .n_linear_ranges = ARRAY_SIZE(bd72720_buck589_volts),
+                       .n_voltages = BD72720_NUM_BUCK_VOLTS,
+                       .enable_reg = BD72720_REG_BUCK8_ON,
+                       .enable_mask = BD72720_MASK_RUN_B_EN,
+                       .vsel_reg = BD72720_REG_BUCK8_VSEL,
+                       .vsel_mask = BD72720_MASK_BUCK_VSEL,
+
+                       .ramp_delay_table = bd72720_ramp_delay,
+                       .n_ramp_values = ARRAY_SIZE(bd72720_ramp_delay),
+                       .ramp_reg = BD72720_REG_BUCK8_MODE,
+                       .ramp_mask = BD72720_MASK_RAMP_UP_DELAY,
+                       .owner = THIS_MODULE,
+                       .of_parse_cb = buck_set_hw_dvs_levels,
+               },
+               .dvs = {
+                       .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
+                                    ROHM_DVS_LEVEL_SUSPEND |
+                                    ROHM_DVS_LEVEL_LPSR,
+                       .run_reg = BD72720_REG_BUCK8_VSEL,
+                       .run_mask = BD72720_MASK_BUCK_VSEL,
+                       .idle_on_mask = BD72720_MASK_IDLE_EN,
+                       .suspend_on_mask = BD72720_MASK_SUSPEND_EN,
+                       .lpsr_on_mask = BD72720_MASK_DEEP_IDLE_EN,
+               },
+       }, {
+               .desc = {
+                       .name = "buck9",
+                       .of_match = of_match_ptr("buck9"),
+                       .regulators_node = of_match_ptr("regulators"),
+                       .id = BD72720_BUCK9,
+                       .type = REGULATOR_VOLTAGE,
+                       .ops = &bd72720_regulator_ops,
+                       .linear_ranges = bd72720_buck589_volts,
+                       .n_linear_ranges = ARRAY_SIZE(bd72720_buck589_volts),
+                       .n_voltages = BD72720_NUM_BUCK_VOLTS,
+                       .enable_reg = BD72720_REG_BUCK9_ON,
+                       .enable_mask = BD72720_MASK_RUN_B_EN,
+                       .vsel_reg = BD72720_REG_BUCK9_VSEL,
+                       .vsel_mask = BD72720_MASK_BUCK_VSEL,
+
+                       .ramp_delay_table = bd72720_ramp_delay,
+                       .n_ramp_values = ARRAY_SIZE(bd72720_ramp_delay),
+                       .ramp_reg = BD72720_REG_BUCK9_MODE,
+                       .ramp_mask = BD72720_MASK_RAMP_UP_DELAY,
+                       .owner = THIS_MODULE,
+                       .of_parse_cb = buck_set_hw_dvs_levels,
+               },
+               .dvs = {
+                       .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
+                                    ROHM_DVS_LEVEL_SUSPEND |
+                                    ROHM_DVS_LEVEL_LPSR,
+                       .run_reg = BD72720_REG_BUCK9_VSEL,
+                       .run_mask = BD72720_MASK_BUCK_VSEL,
+                       .idle_on_mask = BD72720_MASK_IDLE_EN,
+                       .suspend_on_mask = BD72720_MASK_SUSPEND_EN,
+                       .lpsr_on_mask = BD72720_MASK_DEEP_IDLE_EN,
+               },
+       }, {
+               .desc = {
+                       .name = "buck10",
+                       .of_match = of_match_ptr("buck10"),
+                       .regulators_node = of_match_ptr("regulators"),
+                       .id = BD72720_BUCK10,
+                       .type = REGULATOR_VOLTAGE,
+                       .ops = &bd72720_regulator_ops,
+                       .linear_ranges = bd72720_buck10_volts,
+                       .n_linear_ranges = ARRAY_SIZE(bd72720_buck10_volts),
+                       .n_voltages = BD72720_NUM_BUCK_VOLTS,
+                       .enable_reg = BD72720_REG_BUCK10_ON,
+                       .enable_mask = BD72720_MASK_RUN_B_EN,
+                       .vsel_reg = BD72720_REG_BUCK10_VSEL,
+                       .vsel_mask = BD72720_MASK_BUCK_VSEL,
+
+                       .ramp_delay_table = bd72720_ramp_delay,
+                       .n_ramp_values = ARRAY_SIZE(bd72720_ramp_delay),
+                       .ramp_reg = BD72720_REG_BUCK10_MODE,
+                       .ramp_mask = BD72720_MASK_RAMP_UP_DELAY,
+                       .owner = THIS_MODULE,
+                       .of_parse_cb = buck_set_hw_dvs_levels,
+               },
+               .dvs = {
+                       .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
+                                    ROHM_DVS_LEVEL_SUSPEND |
+                                    ROHM_DVS_LEVEL_LPSR,
+                       .run_reg = BD72720_REG_BUCK10_VSEL,
+                       .run_mask = BD72720_MASK_BUCK_VSEL,
+                       .idle_on_mask = BD72720_MASK_IDLE_EN,
+                       .suspend_on_mask = BD72720_MASK_SUSPEND_EN,
+                       .lpsr_on_mask = BD72720_MASK_DEEP_IDLE_EN,
+               },
+       }, {
+               .desc = {
+                       .name = "ldo1",
+                       .of_match = of_match_ptr("ldo1"),
+                       .regulators_node = of_match_ptr("regulators"),
+                       .id = BD72720_LDO1,
+                       .type = REGULATOR_VOLTAGE,
+                       .ops = &bd72720_regulator_ops,
+                       .linear_ranges = bd72720_ldo1234_volts,
+                       .n_linear_ranges = ARRAY_SIZE(bd72720_ldo1234_volts),
+                       .n_voltages = BD72720_NUM_LDO12346_VOLTS,
+                       .enable_reg = BD72720_REG_LDO1_ON,
+                       .enable_mask = BD72720_MASK_RUN_B_EN,
+                       .vsel_reg = BD72720_REG_LDO1_VSEL_RB,
+                       .vsel_mask = BD72720_MASK_LDO12346_VSEL,
+
+                       .ramp_delay_table = bd72720_ramp_delay,
+                       .n_ramp_values = ARRAY_SIZE(bd72720_ramp_delay),
+                       .ramp_reg = BD72720_REG_LDO1_MODE1,
+                       .ramp_mask = BD72720_MASK_RAMP_UP_DELAY,
+                       .owner = THIS_MODULE,
+                       .of_parse_cb = buck_set_hw_dvs_levels,
+               },
+               .dvs = {
+                       .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
+                                    ROHM_DVS_LEVEL_SUSPEND |
+                                    ROHM_DVS_LEVEL_LPSR,
+                       .run_reg = BD72720_REG_LDO1_VSEL_RB,
+                       .run_mask = BD72720_MASK_LDO12346_VSEL,
+                       .idle_reg = BD72720_REG_LDO1_VSEL_I,
+                       .idle_mask = BD72720_MASK_LDO12346_VSEL,
+                       .idle_on_mask = BD72720_MASK_IDLE_EN,
+                       .suspend_reg = BD72720_REG_LDO1_VSEL_S,
+                       .suspend_mask = BD72720_MASK_LDO12346_VSEL,
+                       .suspend_on_mask = BD72720_MASK_SUSPEND_EN,
+                       .lpsr_reg = BD72720_REG_LDO1_VSEL_DI,
+                       .lpsr_mask = BD72720_MASK_LDO12346_VSEL,
+                       .lpsr_on_mask = BD72720_MASK_DEEP_IDLE_EN,
+               },
+               .reg_inits = bd72720_ldo1_inits,
+               .reg_init_amnt = ARRAY_SIZE(bd72720_ldo1_inits),
+       }, {
+               .desc = {
+                       .name = "ldo2",
+                       .of_match = of_match_ptr("ldo2"),
+                       .regulators_node = of_match_ptr("regulators"),
+                       .id = BD72720_LDO2,
+                       .type = REGULATOR_VOLTAGE,
+                       .ops = &bd72720_regulator_ops,
+                       .linear_ranges = bd72720_ldo1234_volts,
+                       .n_linear_ranges = ARRAY_SIZE(bd72720_ldo1234_volts),
+                       .n_voltages = BD72720_NUM_LDO12346_VOLTS,
+                       .enable_reg = BD72720_REG_LDO2_ON,
+                       .enable_mask = BD72720_MASK_RUN_B_EN,
+                       .vsel_reg = BD72720_REG_LDO2_VSEL_R,
+                       .vsel_mask = BD72720_MASK_LDO12346_VSEL,
+
+                       .ramp_delay_table = bd72720_ramp_delay,
+                       .n_ramp_values = ARRAY_SIZE(bd72720_ramp_delay),
+                       .ramp_reg = BD72720_REG_LDO2_MODE,
+                       .ramp_mask = BD72720_MASK_RAMP_UP_DELAY,
+                       .owner = THIS_MODULE,
+                       .of_parse_cb = buck_set_hw_dvs_levels,
+               },
+               .dvs = {
+                       .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
+                                    ROHM_DVS_LEVEL_SUSPEND |
+                                    ROHM_DVS_LEVEL_LPSR,
+                       .run_reg = BD72720_REG_LDO2_VSEL_R,
+                       .run_mask = BD72720_MASK_LDO12346_VSEL,
+                       .idle_reg = BD72720_REG_LDO2_VSEL_I,
+                       .idle_mask = BD72720_MASK_LDO12346_VSEL,
+                       .idle_on_mask = BD72720_MASK_IDLE_EN,
+                       .suspend_reg = BD72720_REG_LDO2_VSEL_S,
+                       .suspend_mask = BD72720_MASK_LDO12346_VSEL,
+                       .suspend_on_mask = BD72720_MASK_SUSPEND_EN,
+                       .lpsr_reg = BD72720_REG_LDO2_VSEL_DI,
+                       .lpsr_mask = BD72720_MASK_LDO12346_VSEL,
+                       .lpsr_on_mask = BD72720_MASK_DEEP_IDLE_EN,
+               },
+       }, {
+               .desc = {
+                       .name = "ldo3",
+                       .of_match = of_match_ptr("ldo3"),
+                       .regulators_node = of_match_ptr("regulators"),
+                       .id = BD72720_LDO3,
+                       .type = REGULATOR_VOLTAGE,
+                       .ops = &bd72720_regulator_ops,
+                       .linear_ranges = bd72720_ldo1234_volts,
+                       .n_linear_ranges = ARRAY_SIZE(bd72720_ldo1234_volts),
+                       .n_voltages = BD72720_NUM_LDO12346_VOLTS,
+                       .enable_reg = BD72720_REG_LDO3_ON,
+                       .enable_mask = BD72720_MASK_RUN_B_EN,
+                       .vsel_reg = BD72720_REG_LDO3_VSEL_R,
+                       .vsel_mask = BD72720_MASK_LDO12346_VSEL,
+
+                       .ramp_delay_table = bd72720_ramp_delay,
+                       .n_ramp_values = ARRAY_SIZE(bd72720_ramp_delay),
+                       .ramp_reg = BD72720_REG_LDO3_MODE,
+                       .ramp_mask = BD72720_MASK_RAMP_UP_DELAY,
+                       .owner = THIS_MODULE,
+                       .of_parse_cb = buck_set_hw_dvs_levels,
+               },
+               .dvs = {
+                       .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
+                                    ROHM_DVS_LEVEL_SUSPEND |
+                                    ROHM_DVS_LEVEL_LPSR,
+                       .run_reg = BD72720_REG_LDO3_VSEL_R,
+                       .run_mask = BD72720_MASK_LDO12346_VSEL,
+                       .idle_reg = BD72720_REG_LDO3_VSEL_I,
+                       .idle_mask = BD72720_MASK_LDO12346_VSEL,
+                       .idle_on_mask = BD72720_MASK_IDLE_EN,
+                       .suspend_reg = BD72720_REG_LDO3_VSEL_S,
+                       .suspend_mask = BD72720_MASK_LDO12346_VSEL,
+                       .suspend_on_mask = BD72720_MASK_SUSPEND_EN,
+                       .lpsr_reg = BD72720_REG_LDO3_VSEL_DI,
+                       .lpsr_mask = BD72720_MASK_LDO12346_VSEL,
+                       .lpsr_on_mask = BD72720_MASK_DEEP_IDLE_EN,
+               },
+       }, {
+               .desc = {
+                       .name = "ldo4",
+                       .of_match = of_match_ptr("ldo4"),
+                       .regulators_node = of_match_ptr("regulators"),
+                       .id = BD72720_LDO4,
+                       .type = REGULATOR_VOLTAGE,
+                       .ops = &bd72720_regulator_ops,
+                       .linear_ranges = bd72720_ldo1234_volts,
+                       .n_linear_ranges = ARRAY_SIZE(bd72720_ldo1234_volts),
+                       .n_voltages = BD72720_NUM_LDO12346_VOLTS,
+                       .enable_reg = BD72720_REG_LDO4_ON,
+                       .enable_mask = BD72720_MASK_RUN_B_EN,
+                       .vsel_reg = BD72720_REG_LDO4_VSEL_R,
+                       .vsel_mask = BD72720_MASK_LDO12346_VSEL,
+
+                       .ramp_delay_table = bd72720_ramp_delay,
+                       .n_ramp_values = ARRAY_SIZE(bd72720_ramp_delay),
+                       .ramp_reg = BD72720_REG_LDO4_MODE,
+                       .ramp_mask = BD72720_MASK_RAMP_UP_DELAY,
+                       .owner = THIS_MODULE,
+                       .of_parse_cb = buck_set_hw_dvs_levels,
+               },
+               .dvs = {
+                       .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
+                                    ROHM_DVS_LEVEL_SUSPEND |
+                                    ROHM_DVS_LEVEL_LPSR,
+                       .run_reg = BD72720_REG_LDO4_VSEL_R,
+                       .run_mask = BD72720_MASK_LDO12346_VSEL,
+                       .idle_reg = BD72720_REG_LDO4_VSEL_I,
+                       .idle_mask = BD72720_MASK_LDO12346_VSEL,
+                       .idle_on_mask = BD72720_MASK_IDLE_EN,
+                       .suspend_reg = BD72720_REG_LDO4_VSEL_S,
+                       .suspend_mask = BD72720_MASK_LDO12346_VSEL,
+                       .suspend_on_mask = BD72720_MASK_SUSPEND_EN,
+                       .lpsr_reg = BD72720_REG_LDO4_VSEL_DI,
+                       .lpsr_mask = BD72720_MASK_LDO12346_VSEL,
+                       .lpsr_on_mask = BD72720_MASK_DEEP_IDLE_EN,
+               },
+       }, {
+               .desc = {
+                       .name = "ldo5",
+                       .of_match = of_match_ptr("ldo5"),
+                       .regulators_node = of_match_ptr("regulators"),
+                       .id = BD72720_LDO5,
+                       .type = REGULATOR_VOLTAGE,
+                       .ops = &bd72720_regulator_ops,
+                       .linear_ranges = bd72720_ldo57891011_volts,
+                       .n_linear_ranges = ARRAY_SIZE(bd72720_ldo57891011_volts),
+                       .n_voltages = BD72720_NUM_LDO_VOLTS,
+                       .enable_reg = BD72720_REG_LDO5_ON,
+                       .enable_mask = BD72720_MASK_RUN_B_EN,
+                       .vsel_reg = BD72720_REG_LDO5_VSEL,
+                       .vsel_mask = BD72720_MASK_LDO_VSEL,
+
+                       .ramp_delay_table = bd72720_ramp_delay,
+                       .n_ramp_values = ARRAY_SIZE(bd72720_ramp_delay),
+                       .ramp_reg = BD72720_REG_LDO5_MODE,
+                       .ramp_mask = BD72720_MASK_RAMP_UP_DELAY,
+                       .owner = THIS_MODULE,
+                       .of_parse_cb = buck_set_hw_dvs_levels,
+               },
+               .dvs = {
+                       .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
+                                    ROHM_DVS_LEVEL_SUSPEND |
+                                    ROHM_DVS_LEVEL_LPSR,
+                       .run_reg = BD72720_REG_LDO5_VSEL,
+                       .run_mask = BD72720_MASK_LDO_VSEL,
+                       .idle_on_mask = BD72720_MASK_IDLE_EN,
+                       .suspend_on_mask = BD72720_MASK_SUSPEND_EN,
+                       .lpsr_on_mask = BD72720_MASK_DEEP_IDLE_EN,
+               },
+       }, {
+               .desc = {
+                       .name = "ldo6",
+                       .of_match = of_match_ptr("ldo6"),
+                       .regulators_node = of_match_ptr("regulators"),
+                       .id = BD72720_LDO6,
+                       .type = REGULATOR_VOLTAGE,
+                       .ops = &bd72720_regulator_ops,
+                       .linear_ranges = bd72720_ldo6_volts,
+                       .n_linear_ranges = ARRAY_SIZE(bd72720_ldo6_volts),
+                       .n_voltages = BD72720_NUM_LDO12346_VOLTS,
+                       .enable_reg = BD72720_REG_LDO6_ON,
+                       .enable_mask = BD72720_MASK_RUN_B_EN,
+                       .vsel_reg = BD72720_REG_LDO6_VSEL,
+                       .vsel_mask = BD72720_MASK_LDO12346_VSEL,
+
+                       .ramp_delay_table = bd72720_ramp_delay,
+                       .n_ramp_values = ARRAY_SIZE(bd72720_ramp_delay),
+                       .ramp_reg = BD72720_REG_LDO6_MODE,
+                       .ramp_mask = BD72720_MASK_RAMP_UP_DELAY,
+                       .owner = THIS_MODULE,
+                       .of_parse_cb = buck_set_hw_dvs_levels,
+               },
+               .dvs = {
+                       .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
+                                    ROHM_DVS_LEVEL_SUSPEND |
+                                    ROHM_DVS_LEVEL_LPSR,
+                       .run_reg = BD72720_REG_LDO6_VSEL,
+                       .run_mask = BD72720_MASK_LDO12346_VSEL,
+                       .idle_on_mask = BD72720_MASK_IDLE_EN,
+                       .suspend_on_mask = BD72720_MASK_SUSPEND_EN,
+                       .lpsr_on_mask = BD72720_MASK_DEEP_IDLE_EN,
+               },
+       }, {
+               .desc = {
+                       .name = "ldo7",
+                       .of_match = of_match_ptr("ldo7"),
+                       .regulators_node = of_match_ptr("regulators"),
+                       .id = BD72720_LDO7,
+                       .type = REGULATOR_VOLTAGE,
+                       .ops = &bd72720_regulator_ops,
+                       .linear_ranges = bd72720_ldo57891011_volts,
+                       .n_linear_ranges = ARRAY_SIZE(bd72720_ldo57891011_volts),
+                       .n_voltages = BD72720_NUM_LDO_VOLTS,
+                       .enable_reg = BD72720_REG_LDO7_ON,
+                       .enable_mask = BD72720_MASK_RUN_B_EN,
+                       .vsel_reg = BD72720_REG_LDO7_VSEL,
+                       .vsel_mask = BD72720_MASK_LDO_VSEL,
+
+                       .ramp_delay_table = bd72720_ramp_delay,
+                       .n_ramp_values = ARRAY_SIZE(bd72720_ramp_delay),
+                       .ramp_reg = BD72720_REG_LDO7_MODE,
+                       .ramp_mask = BD72720_MASK_RAMP_UP_DELAY,
+                       .owner = THIS_MODULE,
+                       .of_parse_cb = buck_set_hw_dvs_levels,
+               },
+               .dvs = {
+                       .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
+                                    ROHM_DVS_LEVEL_SUSPEND |
+                                    ROHM_DVS_LEVEL_LPSR,
+                       .run_reg = BD72720_REG_LDO7_VSEL,
+                       .run_mask = BD72720_MASK_LDO_VSEL,
+                       .idle_on_mask = BD72720_MASK_IDLE_EN,
+                       .suspend_on_mask = BD72720_MASK_SUSPEND_EN,
+                       .lpsr_on_mask = BD72720_MASK_DEEP_IDLE_EN,
+               },
+       }, {
+               .desc = {
+                       .name = "ldo8",
+                       .of_match = of_match_ptr("ldo8"),
+                       .regulators_node = of_match_ptr("regulators"),
+                       .id = BD72720_LDO8,
+                       .type = REGULATOR_VOLTAGE,
+                       .ops = &bd72720_regulator_ops,
+                       .linear_ranges = bd72720_ldo57891011_volts,
+                       .n_linear_ranges = ARRAY_SIZE(bd72720_ldo57891011_volts),
+                       .n_voltages = BD72720_NUM_LDO_VOLTS,
+                       .enable_reg = BD72720_REG_LDO8_ON,
+                       .enable_mask = BD72720_MASK_RUN_B_EN,
+                       .vsel_reg = BD72720_REG_LDO8_VSEL,
+                       .vsel_mask = BD72720_MASK_LDO_VSEL,
+
+                       .ramp_delay_table = bd72720_ramp_delay,
+                       .n_ramp_values = ARRAY_SIZE(bd72720_ramp_delay),
+                       .ramp_reg = BD72720_REG_LDO8_MODE,
+                       .ramp_mask = BD72720_MASK_RAMP_UP_DELAY,
+                       .owner = THIS_MODULE,
+                       .of_parse_cb = buck_set_hw_dvs_levels,
+               },
+               .dvs = {
+                       .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
+                                    ROHM_DVS_LEVEL_SUSPEND |
+                                    ROHM_DVS_LEVEL_LPSR,
+                       .run_reg = BD72720_REG_LDO8_VSEL,
+                       .run_mask = BD72720_MASK_LDO_VSEL,
+                       .idle_on_mask = BD72720_MASK_IDLE_EN,
+                       .suspend_on_mask = BD72720_MASK_SUSPEND_EN,
+                       .lpsr_on_mask = BD72720_MASK_DEEP_IDLE_EN,
+               },
+       }, {
+               .desc = {
+                       .name = "ldo9",
+                       .of_match = of_match_ptr("ldo9"),
+                       .regulators_node = of_match_ptr("regulators"),
+                       .id = BD72720_LDO9,
+                       .type = REGULATOR_VOLTAGE,
+                       .ops = &bd72720_regulator_ops,
+                       .linear_ranges = bd72720_ldo57891011_volts,
+                       .n_linear_ranges = ARRAY_SIZE(bd72720_ldo57891011_volts),
+                       .n_voltages = BD72720_NUM_LDO_VOLTS,
+                       .enable_reg = BD72720_REG_LDO9_ON,
+                       .enable_mask = BD72720_MASK_RUN_B_EN,
+                       .vsel_reg = BD72720_REG_LDO9_VSEL,
+                       .vsel_mask = BD72720_MASK_LDO_VSEL,
+
+                       .ramp_delay_table = bd72720_ramp_delay,
+                       .n_ramp_values = ARRAY_SIZE(bd72720_ramp_delay),
+                       .ramp_reg = BD72720_REG_LDO9_MODE,
+                       .ramp_mask = BD72720_MASK_RAMP_UP_DELAY,
+                       .owner = THIS_MODULE,
+                       .of_parse_cb = buck_set_hw_dvs_levels,
+               },
+               .dvs = {
+                       .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
+                                    ROHM_DVS_LEVEL_SUSPEND |
+                                    ROHM_DVS_LEVEL_LPSR,
+                       .run_reg = BD72720_REG_LDO9_VSEL,
+                       .run_mask = BD72720_MASK_LDO_VSEL,
+                       .idle_on_mask = BD72720_MASK_IDLE_EN,
+                       .suspend_on_mask = BD72720_MASK_SUSPEND_EN,
+                       .lpsr_on_mask = BD72720_MASK_DEEP_IDLE_EN,
+               },
+       }, {
+               .desc = {
+                       .name = "ldo10",
+                       .of_match = of_match_ptr("ldo10"),
+                       .regulators_node = of_match_ptr("regulators"),
+                       .id = BD72720_LDO10,
+                       .type = REGULATOR_VOLTAGE,
+                       .ops = &bd72720_regulator_ops,
+                       .linear_ranges = bd72720_ldo57891011_volts,
+                       .n_linear_ranges = ARRAY_SIZE(bd72720_ldo57891011_volts),
+                       .n_voltages = BD72720_NUM_LDO_VOLTS,
+                       .enable_reg = BD72720_REG_LDO10_ON,
+                       .enable_mask = BD72720_MASK_RUN_B_EN,
+                       .vsel_reg = BD72720_REG_LDO10_VSEL,
+                       .vsel_mask = BD72720_MASK_LDO_VSEL,
+
+                       .ramp_delay_table = bd72720_ramp_delay,
+                       .n_ramp_values = ARRAY_SIZE(bd72720_ramp_delay),
+                       .ramp_reg = BD72720_REG_LDO10_MODE,
+                       .ramp_mask = BD72720_MASK_RAMP_UP_DELAY,
+                       .owner = THIS_MODULE,
+                       .of_parse_cb = buck_set_hw_dvs_levels,
+               },
+               .dvs = {
+                       .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
+                                    ROHM_DVS_LEVEL_SUSPEND |
+                                    ROHM_DVS_LEVEL_LPSR,
+                       .run_reg = BD72720_REG_LDO10_VSEL,
+                       .run_mask = BD72720_MASK_LDO_VSEL,
+                       .idle_on_mask = BD72720_MASK_IDLE_EN,
+                       .suspend_on_mask = BD72720_MASK_SUSPEND_EN,
+                       .lpsr_on_mask = BD72720_MASK_DEEP_IDLE_EN,
+               },
+       }, {
+               .desc = {
+                       .name = "ldo11",
+                       .of_match = of_match_ptr("ldo11"),
+                       .regulators_node = of_match_ptr("regulators"),
+                       .id = BD72720_LDO11,
+                       .type = REGULATOR_VOLTAGE,
+                       .ops = &bd72720_regulator_ops,
+                       .linear_ranges = bd72720_ldo57891011_volts,
+                       .n_linear_ranges = ARRAY_SIZE(bd72720_ldo57891011_volts),
+                       .n_voltages = BD72720_NUM_LDO_VOLTS,
+                       .enable_reg = BD72720_REG_LDO11_ON,
+                       .enable_mask = BD72720_MASK_RUN_B_EN,
+                       .vsel_reg = BD72720_REG_LDO11_VSEL,
+                       .vsel_mask = BD72720_MASK_LDO_VSEL,
+
+                       .ramp_delay_table = bd72720_ramp_delay,
+                       .n_ramp_values = ARRAY_SIZE(bd72720_ramp_delay),
+                       .ramp_reg = BD72720_REG_LDO11_MODE,
+                       .ramp_mask = BD72720_MASK_RAMP_UP_DELAY,
+                       .owner = THIS_MODULE,
+                       .of_parse_cb = buck_set_hw_dvs_levels,
+               },
+               .dvs = {
+                       .level_map = ROHM_DVS_LEVEL_RUN | ROHM_DVS_LEVEL_IDLE |
+                                    ROHM_DVS_LEVEL_SUSPEND |
+                                    ROHM_DVS_LEVEL_LPSR,
+                       .run_reg = BD72720_REG_LDO11_VSEL,
+                       .run_mask = BD72720_MASK_LDO_VSEL,
+                       .idle_on_mask = BD72720_MASK_IDLE_EN,
+                       .suspend_on_mask = BD72720_MASK_SUSPEND_EN,
+                       .lpsr_on_mask = BD72720_MASK_DEEP_IDLE_EN,
+               },
+       },
+};
+
+static int bd72720_buck10_ldon_head_mode(struct device *dev,
+                                        struct device_node *npreg,
+                                        struct regmap *regmap,
+                                        struct regulator_desc *buck10_desc)
+{
+       struct device_node *np __free(device_node) =
+               of_get_child_by_name(npreg, "buck10");
+       uint32_t ldon_head;
+       int ldon_val;
+       int ret;
+
+       if (!np) {
+               dev_err(dev, "failed to find buck10 regulator node\n");
+               return -ENODEV;
+       }
+
+       ret = of_property_read_u32(np, "rohm,ldon-head-microvolt", &ldon_head);
+       if (ret == -EINVAL)
+               return 0;
+       if (ret)
+               return ret;
+
+       /*
+        * LDON_HEAD mode means the BUCK10 is used to supply LDOs 1-4 and
+        * the BUCK 10 voltage is automatically set to follow LDO 1-4
+        * settings. Thus the BUCK10 should not allow voltage [g/s]etting.
+        */
+       buck10_desc->ops = &bd72720_buck10_ldon_head_op;
+
+       ldon_val = ldon_head / 50000 + 1;
+       if (ldon_head > 300000) {
+               dev_warn(dev, "Unsupported LDON_HEAD, clamping to 300 mV\n");
+               ldon_val = 7;
+       }
+
+       return regmap_update_bits(regmap, BD72720_REG_LDO1_MODE2,
+                                 BD72720_MASK_LDON_HEAD, ldon_val);
+}
+
+static int bd72720_dt_parse(struct device *dev,
+                           struct regulator_desc *buck10_desc,
+                           struct regmap *regmap)
+{
+       struct device_node *nproot __free(device_node) =
+               of_get_child_by_name(dev->parent->of_node, "regulators");
+
+       if (!nproot) {
+               dev_err(dev, "failed to find regulators node\n");
+               return -ENODEV;
+       }
+
+       return bd72720_buck10_ldon_head_mode(dev, nproot, regmap, buck10_desc);
+}
+
 static int bd71828_probe(struct platform_device *pdev)
 {
-       int i, j, ret;
+       int i, j, ret, num_regulators;
        struct regulator_config config = {
                .dev = pdev->dev.parent,
        };
+       enum rohm_chip_type chip = platform_get_device_id(pdev)->driver_data;
+       struct bd71828_regulator_data *rdata;
 
        config.regmap = dev_get_regmap(pdev->dev.parent, NULL);
        if (!config.regmap)
                return -ENODEV;
 
-       for (i = 0; i < ARRAY_SIZE(bd71828_rdata); i++) {
+       switch (chip) {
+       case ROHM_CHIP_TYPE_BD72720:
+               rdata = devm_kmemdup(&pdev->dev, bd72720_rdata,
+                                    sizeof(bd72720_rdata), GFP_KERNEL);
+               if (!rdata)
+                       return -ENOMEM;
+
+               ret = bd72720_dt_parse(&pdev->dev, &rdata[BD72720_BUCK10_DESC_INDEX].desc,
+                                      config.regmap);
+               if (ret)
+                       return ret;
+
+               num_regulators = ARRAY_SIZE(bd72720_rdata);
+               break;
+
+       case ROHM_CHIP_TYPE_BD71828:
+               rdata = devm_kmemdup(&pdev->dev, bd71828_rdata,
+                                    sizeof(bd71828_rdata), GFP_KERNEL);
+               if (!rdata)
+                       return -ENOMEM;
+
+               num_regulators = ARRAY_SIZE(bd71828_rdata);
+
+               break;
+       default:
+               return dev_err_probe(&pdev->dev, -EINVAL,
+                                    "Unsupported device\n");
+       }
+
+       for (i = 0; i < num_regulators; i++) {
                struct regulator_dev *rdev;
-               const struct bd71828_regulator_data *rd;
+               struct bd71828_regulator_data *rd;
+
+               rd = &rdata[i];
 
-               rd = &bd71828_rdata[i];
+               config.driver_data = rd;
                rdev = devm_regulator_register(&pdev->dev,
                                               &rd->desc, &config);
                if (IS_ERR(rdev))
@@ -714,12 +1690,20 @@ static int bd71828_probe(struct platform_device *pdev)
        return 0;
 }
 
+static const struct platform_device_id bd71828_pmic_id[] = {
+       { "bd71828-pmic", ROHM_CHIP_TYPE_BD71828 },
+       { "bd72720-pmic", ROHM_CHIP_TYPE_BD72720 },
+       { },
+};
+MODULE_DEVICE_TABLE(platform, bd71828_pmic_id);
+
 static struct platform_driver bd71828_regulator = {
        .driver = {
                .name = "bd71828-pmic",
                .probe_type = PROBE_PREFER_ASYNCHRONOUS,
        },
        .probe = bd71828_probe,
+       .id_table = bd71828_pmic_id,
 };
 
 module_platform_driver(bd71828_regulator);
@@ -727,4 +1711,3 @@ module_platform_driver(bd71828_regulator);
 MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>");
 MODULE_DESCRIPTION("BD71828 voltage regulator driver");
 MODULE_LICENSE("GPL");
-MODULE_ALIAS("platform:bd71828-pmic");