From 8dc33b7c995e3e08087053b79cf919fba61e3669 Mon Sep 17 00:00:00 2001 From: Matti Vaittinen Date: Mon, 15 Dec 2025 15:19:53 +0200 Subject: regulator: bd71828: rename IC specific entities The new ROHM BD72720 PMIC has similarities with the BD71828. It makes sense to support the regulator control for both PMICs using the same driver. It is often more clear to have the IC specific functions and globals named starting with the chip-name. So, as a preparatory step, prefix the BD71828 specific functions and globals with the bd71828. It would be tempting to try also removing the chip ID from those functions which will be common for both PMICs. I have bad experiences on this as it tends to lead to problems when yet another IC is being supported with the same driver, and we will have some functions used for all, some for two of the three, and some for just one. At this point I used to start inventing wildcards like BD718XX or BD7272X. This approach is pretty much always failing as we tend to eventually have something like BD73900 - where all the wildcard stuff will break down. So, my approach these days is to: - keep the original chip-id prefix for anything that had it already (and avoid the churn). - use same prefix for all things that are used by multiple ICs - typically the chip-ID of the first chip. This typically matches also the driver and file names. - use specific chip-ID as a prefix for anything which is specific to just one chip. As a preparatory step to adding the BD72720, add bd71828 prefix to all commonly usable functions and globals. Signed-off-by: Matti Vaittinen Acked-by: Mark Brown Link: https://patch.msgid.link/df5c98c6392c3b52cd41e3d98d60b65a1585b2dd.1765804226.git.mazziesaccount@gmail.com Signed-off-by: Lee Jones --- drivers/regulator/bd71828-regulator.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) (limited to 'drivers/regulator') diff --git a/drivers/regulator/bd71828-regulator.c b/drivers/regulator/bd71828-regulator.c index 87de87793fa1..8c006bff89a8 100644 --- a/drivers/regulator/bd71828-regulator.c +++ b/drivers/regulator/bd71828-regulator.c @@ -28,7 +28,7 @@ struct bd71828_regulator_data { int reg_init_amnt; }; -static const struct reg_init buck1_inits[] = { +static const struct reg_init bd71828_buck1_inits[] = { /* * DVS Buck voltages can be changed by register values or via GPIO. * Use register accesses by default. @@ -40,7 +40,7 @@ static const struct reg_init buck1_inits[] = { }, }; -static const struct reg_init buck2_inits[] = { +static const struct reg_init bd71828_buck2_inits[] = { { .reg = BD71828_REG_PS_CTRL_1, .mask = BD71828_MASK_DVS_BUCK2_CTRL, @@ -48,7 +48,7 @@ static const struct reg_init buck2_inits[] = { }, }; -static const struct reg_init buck6_inits[] = { +static const struct reg_init bd71828_buck6_inits[] = { { .reg = BD71828_REG_PS_CTRL_1, .mask = BD71828_MASK_DVS_BUCK6_CTRL, @@ -56,7 +56,7 @@ static const struct reg_init buck6_inits[] = { }, }; -static const struct reg_init buck7_inits[] = { +static const struct reg_init bd71828_buck7_inits[] = { { .reg = BD71828_REG_PS_CTRL_1, .mask = BD71828_MASK_DVS_BUCK7_CTRL, @@ -102,9 +102,9 @@ static int buck_set_hw_dvs_levels(struct device_node *np, return rohm_regulator_set_dvs_levels(&data->dvs, np, desc, cfg->regmap); } -static int ldo6_parse_dt(struct device_node *np, - const struct regulator_desc *desc, - struct regulator_config *cfg) +static int bd71828_ldo6_parse_dt(struct device_node *np, + const struct regulator_desc *desc, + struct regulator_config *cfg) { int ret, i; uint32_t uv = 0; @@ -212,8 +212,8 @@ static const struct bd71828_regulator_data bd71828_rdata[] = { */ .lpsr_on_mask = BD71828_MASK_LPSR_EN, }, - .reg_inits = buck1_inits, - .reg_init_amnt = ARRAY_SIZE(buck1_inits), + .reg_inits = bd71828_buck1_inits, + .reg_init_amnt = ARRAY_SIZE(bd71828_buck1_inits), }, { .desc = { @@ -253,8 +253,8 @@ static const struct bd71828_regulator_data bd71828_rdata[] = { .lpsr_reg = BD71828_REG_BUCK2_SUSP_VOLT, .lpsr_mask = BD71828_MASK_BUCK1267_VOLT, }, - .reg_inits = buck2_inits, - .reg_init_amnt = ARRAY_SIZE(buck2_inits), + .reg_inits = bd71828_buck2_inits, + .reg_init_amnt = ARRAY_SIZE(bd71828_buck2_inits), }, { .desc = { @@ -399,8 +399,8 @@ static const struct bd71828_regulator_data bd71828_rdata[] = { .lpsr_reg = BD71828_REG_BUCK6_SUSP_VOLT, .lpsr_mask = BD71828_MASK_BUCK1267_VOLT, }, - .reg_inits = buck6_inits, - .reg_init_amnt = ARRAY_SIZE(buck6_inits), + .reg_inits = bd71828_buck6_inits, + .reg_init_amnt = ARRAY_SIZE(bd71828_buck6_inits), }, { .desc = { @@ -440,8 +440,8 @@ static const struct bd71828_regulator_data bd71828_rdata[] = { .lpsr_reg = BD71828_REG_BUCK7_SUSP_VOLT, .lpsr_mask = BD71828_MASK_BUCK1267_VOLT, }, - .reg_inits = buck7_inits, - .reg_init_amnt = ARRAY_SIZE(buck7_inits), + .reg_inits = bd71828_buck7_inits, + .reg_init_amnt = ARRAY_SIZE(bd71828_buck7_inits), }, { .desc = { @@ -633,7 +633,7 @@ static const struct bd71828_regulator_data bd71828_rdata[] = { * LDO6 only supports enable/disable for all states. * Voltage for LDO6 is fixed. */ - .of_parse_cb = ldo6_parse_dt, + .of_parse_cb = bd71828_ldo6_parse_dt, }, }, { .desc = { -- cgit v1.2.3 From f16a9d76a71df5038fc8e6dae44caa1e5e76b041 Mon Sep 17 00:00:00 2001 From: Matti Vaittinen Date: Mon, 15 Dec 2025 15:20:06 +0200 Subject: regulator: bd71828: Support ROHM BD72720 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 Reviewed-by: Mark Brown Link: https://patch.msgid.link/88b82128648516d9dbb173044042f2a7a5dfdf1c.1765804226.git.mazziesaccount@gmail.com Signed-off-by: Lee Jones --- drivers/regulator/Kconfig | 8 +- drivers/regulator/bd71828-regulator.c | 993 +++++++++++++++++++++++++++++++++- 2 files changed, 992 insertions(+), 9 deletions(-) (limited to 'drivers/regulator') diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig index d2335276cce5..003bd938c84a 100644 --- a/drivers/regulator/Kconfig +++ b/drivers/regulator/Kconfig @@ -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. diff --git a/drivers/regulator/bd71828-regulator.c b/drivers/regulator/bd71828-regulator.c index 8c006bff89a8..c8f3343cfe23 100644 --- a/drivers/regulator/bd71828-regulator.c +++ b/drivers/regulator/bd71828-regulator.c @@ -3,12 +3,15 @@ // bd71828-regulator.c ROHM BD71828GW-DS1 regulator driver // +#include #include #include #include #include #include +#include #include +#include #include #include #include @@ -16,6 +19,7 @@ #include #include +#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 "); MODULE_DESCRIPTION("BD71828 voltage regulator driver"); MODULE_LICENSE("GPL"); -MODULE_ALIAS("platform:bd71828-pmic"); -- cgit v1.2.3 From 09b174f1a554d69b9f69f3c6c115db12c1f6d29d Mon Sep 17 00:00:00 2001 From: Michael Tretter Date: Mon, 26 Jan 2026 15:27:48 +0100 Subject: regulator: bd71815: switch to devm_fwnode_gpiod_get_optional Use the devm_fwnode_gpiod_get_optional variant to simplify the error handling code. Reviewed-by: Matti Vaittinen Acked-by: Mark Brown Signed-off-by: Michael Tretter Link: https://lore.kernel.org/r/20260126-gpio-devm_fwnode_gpiod_get_optional-v2-2-ec34f8e35077@pengutronix.de Signed-off-by: Bartosz Golaszewski --- drivers/regulator/bd71815-regulator.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) (limited to 'drivers/regulator') diff --git a/drivers/regulator/bd71815-regulator.c b/drivers/regulator/bd71815-regulator.c index 8da57a7bb2f1..668714f35464 100644 --- a/drivers/regulator/bd71815-regulator.c +++ b/drivers/regulator/bd71815-regulator.c @@ -571,15 +571,12 @@ static int bd7181x_probe(struct platform_device *pdev) return -ENODEV; } - ldo4_en = devm_fwnode_gpiod_get(&pdev->dev, - dev_fwnode(pdev->dev.parent), - "rohm,vsel", GPIOD_ASIS, "ldo4-en"); - if (IS_ERR(ldo4_en)) { - ret = PTR_ERR(ldo4_en); - if (ret != -ENOENT) - return ret; - ldo4_en = NULL; - } + ldo4_en = devm_fwnode_gpiod_get_optional(&pdev->dev, + dev_fwnode(pdev->dev.parent), + "rohm,vsel", GPIOD_ASIS, + "ldo4-en"); + if (IS_ERR(ldo4_en)) + return PTR_ERR(ldo4_en); /* Disable to go to ship-mode */ ret = regmap_update_bits(regmap, BD71815_REG_PWRCTRL, RESTARTEN, 0); -- cgit v1.2.3