Skip to content

Commit 1742e7e

Browse files
ChiYuan Huangbroonie
authored andcommitted
regulator: rtq2208: Fix incorrect buck converter phase mapping
Use the hidden bank RG to get the correct buck converter phase mapping. Fixes: 85a11f5 ("regulator: rtq2208: Add Richtek RTQ2208 SubPMIC") Signed-off-by: ChiYuan Huang <cy_huang@richtek.com> Link: https://patch.msgid.link/ae3245aa713f76000dbd20b4ad6f66d30611d3b8.1742204502.git.cy_huang@richtek.com Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 2c7a50b commit 1742e7e

File tree

1 file changed

+71
-18
lines changed

1 file changed

+71
-18
lines changed

drivers/regulator/rtq2208-regulator.c

Lines changed: 71 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@
2727
#define RTQ2208_REG_LDO1_CFG 0xB1
2828
#define RTQ2208_REG_LDO2_CFG 0xC1
2929
#define RTQ2208_REG_LDO_DVS_CTRL 0xD0
30+
#define RTQ2208_REG_HIDDEN_BUCKPH 0x55
31+
#define RTQ2208_REG_HIDDEN0 0xFE
32+
#define RTQ2208_REG_HIDDEN1 0xFF
3033

3134
/* Mask */
3235
#define RTQ2208_BUCK_NR_MTP_SEL_MASK GENMASK(7, 0)
@@ -45,6 +48,8 @@
4548
#define RTQ2208_LDO1_VOSEL_SD_MASK BIT(5)
4649
#define RTQ2208_LDO2_DISCHG_EN_MASK BIT(6)
4750
#define RTQ2208_LDO2_VOSEL_SD_MASK BIT(7)
51+
#define RTQ2208_MASK_BUCKPH_GROUP1 GENMASK(6, 4)
52+
#define RTQ2208_MASK_BUCKPH_GROUP2 GENMASK(2, 0)
4853

4954
/* Size */
5055
#define RTQ2208_VOUT_MAXNUM 256
@@ -524,27 +529,75 @@ static int rtq2208_parse_regulator_dt_data(int n_regulator, const unsigned int *
524529

525530
}
526531

527-
/** different slave address corresponds different used bucks
528-
* slave address 0x10: BUCK[BCA FGE]
529-
* slave address 0x20: BUCK[BC FGHE]
530-
* slave address 0x40: BUCK[C G]
531-
*/
532-
static int rtq2208_regulator_check(int slave_addr, int *num,
532+
static int rtq2208_regulator_check(struct device *dev, int *num,
533533
int *regulator_idx_table, unsigned int *buck_masks)
534534
{
535-
static bool rtq2208_used_table[3][RTQ2208_LDO_MAX] = {
536-
/* BUCK[BCA FGE], LDO[12] */
537-
{1, 1, 0, 1, 1, 1, 0, 1, 1, 1},
538-
/* BUCK[BC FGHE], LDO[12]*/
539-
{1, 1, 0, 0, 1, 1, 1, 1, 1, 1},
540-
/* BUCK[C G], LDO[12] */
541-
{0, 1, 0, 0, 0, 1, 0, 0, 1, 1},
542-
};
543-
int i, idx = ffs(slave_addr >> 4) - 1;
535+
struct regmap *regmap = dev_get_regmap(dev, NULL);
536+
bool rtq2208_used_table[RTQ2208_LDO_MAX] = {0};
537+
u8 entry_key[] = { 0x69, 0x01 };
538+
unsigned int buck_phase;
539+
int i, ret;
544540
u8 mask;
545541

542+
ret = regmap_raw_write(regmap, RTQ2208_REG_HIDDEN0, entry_key, ARRAY_SIZE(entry_key));
543+
if (ret)
544+
return dev_err_probe(dev, ret, "Failed to enter hidden page\n");
545+
546+
ret = regmap_read(regmap, RTQ2208_REG_HIDDEN_BUCKPH, &buck_phase);
547+
if (ret)
548+
return dev_err_probe(dev, ret, "Failed to read buck phase configuration\n");
549+
550+
ret = regmap_write(regmap, RTQ2208_REG_HIDDEN1, 0x00);
551+
if (ret)
552+
return dev_err_probe(dev, ret, "Failed to exit hidden page\n");
553+
554+
dev_info(dev, "BUCK Phase 0x%x\n", buck_phase);
555+
/*
556+
* Use buck phase configuration to assign used table mask
557+
* GROUP1 GROUP2
558+
* 0 -> 2P + 2P BC FG
559+
* 1 -> 2P + 1P + 1P BCA FGE
560+
* 2 -> 1P + 1P + 1P + 1P BCDA FGHE
561+
* 3 -> 3P + 1P BC FG
562+
* others -> 4P C G
563+
*/
564+
switch (FIELD_GET(RTQ2208_MASK_BUCKPH_GROUP1, buck_phase)) {
565+
case 2:
566+
rtq2208_used_table[RTQ2208_BUCK_D] = true;
567+
fallthrough;
568+
case 1:
569+
rtq2208_used_table[RTQ2208_BUCK_A] = true;
570+
fallthrough;
571+
case 0:
572+
case 3:
573+
rtq2208_used_table[RTQ2208_BUCK_B] = true;
574+
fallthrough;
575+
default:
576+
rtq2208_used_table[RTQ2208_BUCK_C] = true;
577+
break;
578+
}
579+
580+
switch (FIELD_GET(RTQ2208_MASK_BUCKPH_GROUP2, buck_phase)) {
581+
case 2:
582+
rtq2208_used_table[RTQ2208_BUCK_F] = true;
583+
fallthrough;
584+
case 1:
585+
rtq2208_used_table[RTQ2208_BUCK_E] = true;
586+
fallthrough;
587+
case 0:
588+
case 3:
589+
rtq2208_used_table[RTQ2208_BUCK_H] = true;
590+
fallthrough;
591+
default:
592+
rtq2208_used_table[RTQ2208_BUCK_G] = true;
593+
break;
594+
}
595+
596+
/* By default, LDO1 & LDO2 are always used */
597+
rtq2208_used_table[RTQ2208_LDO1] = rtq2208_used_table[RTQ2208_LDO2] = true;
598+
546599
for (i = 0; i < RTQ2208_LDO_MAX; i++) {
547-
if (!rtq2208_used_table[idx][i])
600+
if (!rtq2208_used_table[i])
548601
continue;
549602

550603
regulator_idx_table[(*num)++] = i;
@@ -559,7 +612,7 @@ static int rtq2208_regulator_check(int slave_addr, int *num,
559612
static const struct regmap_config rtq2208_regmap_config = {
560613
.reg_bits = 8,
561614
.val_bits = 8,
562-
.max_register = 0xEF,
615+
.max_register = 0xFF,
563616
};
564617

565618
static int rtq2208_probe(struct i2c_client *i2c)
@@ -583,7 +636,7 @@ static int rtq2208_probe(struct i2c_client *i2c)
583636
return dev_err_probe(dev, PTR_ERR(regmap), "Failed to allocate regmap\n");
584637

585638
/* get needed regulator */
586-
ret = rtq2208_regulator_check(i2c->addr, &n_regulator, regulator_idx_table, buck_masks);
639+
ret = rtq2208_regulator_check(dev, &n_regulator, regulator_idx_table, buck_masks);
587640
if (ret)
588641
return dev_err_probe(dev, ret, "Failed to check used regulators\n");
589642

0 commit comments

Comments
 (0)