Unverified Commit c2945541 authored by Matti Vaittinen's avatar Matti Vaittinen Committed by Mark Brown
Browse files

regulator: bd718x7, bd71828, Fix dvs voltage levels



The ROHM BD718x7 and BD71828 drivers support setting HW state
specific voltages from device-tree. This is used also by various
in-tree DTS files.

These drivers do incorrectly try to compose bit-map using enum
values. By a chance this works for first two valid levels having
values 1 and 2 - but setting values for the rest of the levels
do indicate capability of setting values for first levels as
well. Luckily the regulators which support setting values for
SUSPEND/LPSR do usually also support setting values for RUN
and IDLE too - thus this has not been such a fatal issue.

Fix this by defining the old enum values as bits and fixing the
parsing code. This allows keeping existing IC specific drivers
intact and only slightly changing the rohm-regulator.c

Fixes: 21b72156 ("regulator: bd718x7: Split driver to common and bd718x7 specific parts")
Signed-off-by: default avatarMatti Vaittinen <matti.vaittinen@fi.rohmeurope.com>
Acked-by: default avatarLee Jones <lee.jones@linaro.org>
Link: https://lore.kernel.org/r/20210212080023.GA880728@localhost.localdomain


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 20ccc362
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -52,9 +52,12 @@ int rohm_regulator_set_dvs_levels(const struct rohm_dvs_config *dvs,
	char *prop;
	unsigned int reg, mask, omask, oreg = desc->enable_reg;

	for (i = 0; i < ROHM_DVS_LEVEL_MAX && !ret; i++) {
		if (dvs->level_map & (1 << i)) {
			switch (i + 1) {
	for (i = 0; i < ROHM_DVS_LEVEL_VALID_AMOUNT && !ret; i++) {
		int bit;

		bit = BIT(i);
		if (dvs->level_map & bit) {
			switch (bit) {
			case ROHM_DVS_LEVEL_RUN:
				prop = "rohm,dvs-run-voltage";
				reg = dvs->run_reg;
+6 −8
Original line number Diff line number Diff line
@@ -20,14 +20,12 @@ struct rohm_regmap_dev {
	struct regmap *regmap;
};

enum {
	ROHM_DVS_LEVEL_UNKNOWN,
	ROHM_DVS_LEVEL_RUN,
	ROHM_DVS_LEVEL_IDLE,
	ROHM_DVS_LEVEL_SUSPEND,
	ROHM_DVS_LEVEL_LPSR,
	ROHM_DVS_LEVEL_MAX = ROHM_DVS_LEVEL_LPSR,
};
#define ROHM_DVS_LEVEL_RUN		BIT(0)
#define ROHM_DVS_LEVEL_IDLE		BIT(1)
#define ROHM_DVS_LEVEL_SUSPEND		BIT(2)
#define ROHM_DVS_LEVEL_LPSR		BIT(3)
#define ROHM_DVS_LEVEL_VALID_AMOUNT	4
#define ROHM_DVS_LEVEL_UNKNOWN		0

/**
 * struct rohm_dvs_config - dynamic voltage scaling register descriptions