Skip to content

Commit 38bcec0

Browse files
Alina Yubroonie
authored andcommitted
regulator: rtq2208: Fix LDO discharge register and add vsel setting
The LDO's Vout is adjustable if the hardware setting allows it, and it can be set either 1800mv or 3300mv. Additionally, the discharge register has been moved to another position. Signed-off-by: Alina Yu <[email protected]> Link: https://lore.kernel.org/r/5d56b79c94de63fc86b5a70b7e374da4240fee8b.1714467553.git.alina_yu@richtek.com Signed-off-by: Mark Brown <[email protected]>
1 parent b6d4b35 commit 38bcec0

File tree

1 file changed

+61
-39
lines changed

1 file changed

+61
-39
lines changed

drivers/regulator/rtq2208-regulator.c

Lines changed: 61 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#define RTQ2208_REG_BUCK_H_CFG0 0xA2
2727
#define RTQ2208_REG_LDO1_CFG 0xB1
2828
#define RTQ2208_REG_LDO2_CFG 0xC1
29+
#define RTQ2208_REG_LDO_DVS_CTRL 0xD0
2930

3031
/* Mask */
3132
#define RTQ2208_BUCK_NR_MTP_SEL_MASK GENMASK(7, 0)
@@ -40,6 +41,10 @@
4041
#define RTQ2208_EN_DIS_MASK BIT(0)
4142
#define RTQ2208_BUCK_RAMP_SEL_MASK GENMASK(2, 0)
4243
#define RTQ2208_HD_INT_MASK BIT(0)
44+
#define RTQ2208_LDO1_DISCHG_EN_MASK BIT(4)
45+
#define RTQ2208_LDO1_VOSEL_SD_MASK BIT(5)
46+
#define RTQ2208_LDO2_DISCHG_EN_MASK BIT(6)
47+
#define RTQ2208_LDO2_VOSEL_SD_MASK BIT(7)
4348

4449
/* Size */
4550
#define RTQ2208_VOUT_MAXNUM 256
@@ -318,23 +323,6 @@ static irqreturn_t rtq2208_irq_handler(int irqno, void *devid)
318323
return IRQ_HANDLED;
319324
}
320325

321-
#define RTQ2208_REGULATOR_INFO(_name, _base) \
322-
{ \
323-
.name = #_name, \
324-
.base = _base, \
325-
}
326-
#define BUCK_RG_BASE(_id) RTQ2208_REG_BUCK_##_id##_CFG0
327-
#define BUCK_RG_SHIFT(_base, _shift) (_base + _shift)
328-
#define LDO_RG_BASE(_id) RTQ2208_REG_LDO##_id##_CFG
329-
#define LDO_RG_SHIFT(_base, _shift) (_base + _shift)
330-
#define VSEL_SHIFT(_sel) (_sel ? 3 : 1)
331-
#define MTP_SEL_MASK(_sel) RTQ2208_BUCK_EN_NR_MTP_SEL##_sel##_MASK
332-
333-
static const struct linear_range rtq2208_vout_range[] = {
334-
REGULATOR_LINEAR_RANGE(400000, 0, 180, 5000),
335-
REGULATOR_LINEAR_RANGE(1310000, 181, 255, 10000),
336-
};
337-
338326
static int rtq2208_of_get_fixed_voltage(struct device *dev,
339327
struct of_regulator_match *rtq2208_ldo_match, int n_fixed)
340328
{
@@ -373,24 +361,57 @@ static int rtq2208_of_get_fixed_voltage(struct device *dev,
373361
return 0;
374362
}
375363

364+
365+
#define BUCK_INFO(_name, _id) \
366+
{ \
367+
.name = _name, \
368+
.base = RTQ2208_REG_BUCK_##_id##_CFG0, \
369+
.enable_reg = BUCK_RG_SHIFT(RTQ2208_REG_BUCK_##_id##_CFG0, 2), \
370+
.dis_reg = RTQ2208_REG_BUCK_##_id##_CFG0, \
371+
}
372+
373+
#define LDO_INFO(_name, _id) \
374+
{ \
375+
.name = _name, \
376+
.base = RTQ2208_REG_LDO##_id##_CFG, \
377+
.enable_reg = RTQ2208_REG_LDO##_id##_CFG, \
378+
.dis_mask = RTQ2208_LDO##_id##_DISCHG_EN_MASK, \
379+
.dis_on = RTQ2208_LDO##_id##_DISCHG_EN_MASK, \
380+
.vsel_mask = RTQ2208_LDO##_id##_VOSEL_SD_MASK, \
381+
}
382+
383+
#define BUCK_RG_SHIFT(_base, _shift) (_base + _shift)
384+
#define VSEL_SHIFT(_sel) (_sel ? 3 : 1)
385+
#define MTP_SEL_MASK(_sel) RTQ2208_BUCK_EN_NR_MTP_SEL##_sel##_MASK
386+
387+
static const struct linear_range rtq2208_vout_range[] = {
388+
REGULATOR_LINEAR_RANGE(400000, 0, 180, 5000),
389+
REGULATOR_LINEAR_RANGE(1310000, 181, 255, 10000),
390+
};
391+
376392
static void rtq2208_init_regulator_desc(struct rtq2208_regulator_desc *rdesc, int mtp_sel,
377393
int idx, struct of_regulator_match *rtq2208_ldo_match, int *ldo_idx)
378394
{
379395
struct regulator_desc *desc;
380396
static const struct {
381397
char *name;
382398
int base;
399+
int enable_reg;
400+
int dis_reg;
401+
int dis_mask;
402+
int dis_on;
403+
int vsel_mask;
383404
} regulator_info[] = {
384-
RTQ2208_REGULATOR_INFO(buck-b, BUCK_RG_BASE(B)),
385-
RTQ2208_REGULATOR_INFO(buck-c, BUCK_RG_BASE(C)),
386-
RTQ2208_REGULATOR_INFO(buck-d, BUCK_RG_BASE(D)),
387-
RTQ2208_REGULATOR_INFO(buck-a, BUCK_RG_BASE(A)),
388-
RTQ2208_REGULATOR_INFO(buck-f, BUCK_RG_BASE(F)),
389-
RTQ2208_REGULATOR_INFO(buck-g, BUCK_RG_BASE(G)),
390-
RTQ2208_REGULATOR_INFO(buck-h, BUCK_RG_BASE(H)),
391-
RTQ2208_REGULATOR_INFO(buck-e, BUCK_RG_BASE(E)),
392-
RTQ2208_REGULATOR_INFO(ldo2, LDO_RG_BASE(2)),
393-
RTQ2208_REGULATOR_INFO(ldo1, LDO_RG_BASE(1)),
405+
BUCK_INFO("buck-b", B),
406+
BUCK_INFO("buck-c", C),
407+
BUCK_INFO("buck-d", D),
408+
BUCK_INFO("buck-a", A),
409+
BUCK_INFO("buck-f", F),
410+
BUCK_INFO("buck-g", G),
411+
BUCK_INFO("buck-h", H),
412+
BUCK_INFO("buck-e", E),
413+
LDO_INFO("ldo2", 2),
414+
LDO_INFO("ldo1", 1),
394415
}, *curr_info;
395416

396417
curr_info = regulator_info + idx;
@@ -402,39 +423,36 @@ static void rtq2208_init_regulator_desc(struct rtq2208_regulator_desc *rdesc, in
402423
desc->owner = THIS_MODULE;
403424
desc->type = REGULATOR_VOLTAGE;
404425
desc->enable_mask = mtp_sel ? MTP_SEL_MASK(1) : MTP_SEL_MASK(0);
405-
desc->active_discharge_on = RTQ2208_EN_DIS_MASK;
426+
desc->enable_reg = curr_info->enable_reg;
406427
desc->active_discharge_off = 0;
407-
desc->active_discharge_mask = RTQ2208_EN_DIS_MASK;
408428

409429
rdesc->mode_mask = RTQ2208_BUCK_NRMODE_MASK;
410430

411431
if (idx >= RTQ2208_BUCK_B && idx <= RTQ2208_BUCK_E) {
412432
/* init buck desc */
413-
desc->enable_reg = BUCK_RG_SHIFT(curr_info->base, 2);
414433
desc->ops = &rtq2208_regulator_buck_ops;
415434
desc->vsel_reg = curr_info->base + VSEL_SHIFT(mtp_sel);
416435
desc->vsel_mask = RTQ2208_BUCK_NR_MTP_SEL_MASK;
417436
desc->n_voltages = RTQ2208_VOUT_MAXNUM;
418437
desc->linear_ranges = rtq2208_vout_range;
419438
desc->n_linear_ranges = ARRAY_SIZE(rtq2208_vout_range);
420439
desc->ramp_reg = BUCK_RG_SHIFT(curr_info->base, 5);
421-
desc->active_discharge_reg = curr_info->base;
422440
desc->of_map_mode = rtq2208_of_map_mode;
441+
desc->active_discharge_reg = curr_info->dis_reg;
442+
desc->active_discharge_on = RTQ2208_EN_DIS_MASK;
443+
desc->active_discharge_mask = RTQ2208_EN_DIS_MASK;
423444

424445
rdesc->mode_reg = BUCK_RG_SHIFT(curr_info->base, 2);
425446
rdesc->suspend_config_reg = BUCK_RG_SHIFT(curr_info->base, 4);
426447
rdesc->suspend_enable_mask = RTQ2208_BUCK_EN_STR_MASK;
427448
rdesc->suspend_mode_mask = RTQ2208_BUCK_STRMODE_MASK;
428449
} else {
429450
/* init ldo desc */
430-
desc->enable_reg = curr_info->base;
431-
desc->ops = &rtq2208_regulator_ldo_ops;
432-
desc->n_voltages = 1;
433-
desc->active_discharge_reg = LDO_RG_SHIFT(curr_info->base, 2);
434-
435-
rtq2208_ldo_match[*ldo_idx].name = desc->name;
436-
rtq2208_ldo_match[*ldo_idx].driver_data = rdesc;
437-
rtq2208_ldo_match[(*ldo_idx)++].desc = desc;
451+
desc->active_discharge_reg = RTQ2208_REG_LDO_DVS_CTRL;
452+
desc->active_discharge_on = curr_info->dis_on;
453+
desc->active_discharge_mask = curr_info->dis_mask;
454+
desc->vsel_reg = RTQ2208_REG_LDO_DVS_CTRL;
455+
desc->vsel_mask = curr_info->vsel_mask;
438456

439457
rdesc->suspend_config_reg = curr_info->base;
440458
rdesc->suspend_enable_mask = RTQ2208_LDO_EN_STR_MASK;
@@ -458,6 +476,10 @@ static int rtq2208_parse_regulator_dt_data(int n_regulator, const unsigned int *
458476
return -ENOMEM;
459477

460478
rtq2208_init_regulator_desc(rdesc[i], mtp_sel, idx, rtq2208_ldo_match, &ldo_idx);
479+
480+
/* init ldo dvs ability */
481+
if (idx >= RTQ2208_LDO2)
482+
rtq2208_ldo_match[idx - RTQ2208_LDO2].desc = &rdesc[i]->desc;
461483
}
462484

463485
/* init ldo fixed_uV */

0 commit comments

Comments
 (0)