Skip to content

Commit a27e71a

Browse files
cristiccbroonie
authored andcommitted
regulator: fan53555: Add support for RK860X
Extend the existing fan53555 driver to support the Rockchip RK860X regulators. RK8600/RK8601 are pretty similar to the FAN53555 regulators. RK8602/RK8603 are a bit different, having a wider output voltage selection range, from 0.5 V to 1.5 V in 6.25 mV steps. They also use additional VSEL0/VSEL1 registers for the voltage selector, but the enable and mode bits are still located in the original FAN53555 specific VSEL0/VSEL1 registers. Signed-off-by: Cristian Ciocaltea <[email protected]> Acked-by: Krzysztof Kozlowski <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Mark Brown <[email protected]>
1 parent 2c82f5b commit a27e71a

File tree

1 file changed

+118
-3
lines changed

1 file changed

+118
-3
lines changed

drivers/regulator/fan53555.c

Lines changed: 118 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@
2626
#define FAN53555_VSEL0 0x00
2727
#define FAN53555_VSEL1 0x01
2828

29+
#define RK8602_VSEL0 0x06
30+
#define RK8602_VSEL1 0x07
31+
2932
#define TCS4525_VSEL0 0x11
3033
#define TCS4525_VSEL1 0x10
3134
#define TCS4525_TIME 0x13
@@ -55,6 +58,7 @@
5558

5659
#define FAN53555_NVOLTAGES 64 /* Numbers of voltages */
5760
#define FAN53526_NVOLTAGES 128
61+
#define RK8602_NVOLTAGES 160
5862

5963
#define TCS_VSEL0_MODE BIT(7)
6064
#define TCS_VSEL1_MODE BIT(6)
@@ -64,6 +68,8 @@
6468
enum fan53555_vendor {
6569
FAN53526_VENDOR_FAIRCHILD = 0,
6670
FAN53555_VENDOR_FAIRCHILD,
71+
FAN53555_VENDOR_ROCKCHIP, /* RK8600, RK8601 */
72+
RK8602_VENDOR_ROCKCHIP, /* RK8602, RK8603 */
6773
FAN53555_VENDOR_SILERGY,
6874
FAN53526_VENDOR_TCS,
6975
};
@@ -87,6 +93,14 @@ enum {
8793
FAN53555_CHIP_ID_08 = 8,
8894
};
8995

96+
enum {
97+
RK8600_CHIP_ID_08 = 8, /* RK8600, RK8601 */
98+
};
99+
100+
enum {
101+
RK8602_CHIP_ID_10 = 10, /* RK8602, RK8603 */
102+
};
103+
90104
enum {
91105
TCS4525_CHIP_ID_12 = 12,
92106
};
@@ -117,6 +131,8 @@ struct fan53555_device_info {
117131
/* Voltage setting register */
118132
unsigned int vol_reg;
119133
unsigned int sleep_reg;
134+
unsigned int en_reg;
135+
unsigned int sleep_en_reg;
120136
/* Voltage range and step(linear) */
121137
unsigned int vsel_min;
122138
unsigned int vsel_step;
@@ -159,15 +175,15 @@ static int fan53555_set_suspend_enable(struct regulator_dev *rdev)
159175
{
160176
struct fan53555_device_info *di = rdev_get_drvdata(rdev);
161177

162-
return regmap_update_bits(rdev->regmap, di->sleep_reg,
178+
return regmap_update_bits(rdev->regmap, di->sleep_en_reg,
163179
VSEL_BUCK_EN, VSEL_BUCK_EN);
164180
}
165181

166182
static int fan53555_set_suspend_disable(struct regulator_dev *rdev)
167183
{
168184
struct fan53555_device_info *di = rdev_get_drvdata(rdev);
169185

170-
return regmap_update_bits(rdev->regmap, di->sleep_reg,
186+
return regmap_update_bits(rdev->regmap, di->sleep_en_reg,
171187
VSEL_BUCK_EN, 0);
172188
}
173189

@@ -317,6 +333,50 @@ static int fan53555_voltages_setup_fairchild(struct fan53555_device_info *di)
317333
return 0;
318334
}
319335

336+
static int fan53555_voltages_setup_rockchip(struct fan53555_device_info *di)
337+
{
338+
/* Init voltage range and step */
339+
switch (di->chip_id) {
340+
case RK8600_CHIP_ID_08:
341+
di->vsel_min = 712500;
342+
di->vsel_step = 12500;
343+
break;
344+
default:
345+
dev_err(di->dev,
346+
"Chip ID %d not supported!\n", di->chip_id);
347+
return -EINVAL;
348+
}
349+
di->slew_reg = FAN53555_CONTROL;
350+
di->slew_mask = CTL_SLEW_MASK;
351+
di->ramp_delay_table = slew_rates;
352+
di->n_ramp_values = ARRAY_SIZE(slew_rates);
353+
di->vsel_count = FAN53555_NVOLTAGES;
354+
355+
return 0;
356+
}
357+
358+
static int rk8602_voltages_setup_rockchip(struct fan53555_device_info *di)
359+
{
360+
/* Init voltage range and step */
361+
switch (di->chip_id) {
362+
case RK8602_CHIP_ID_10:
363+
di->vsel_min = 500000;
364+
di->vsel_step = 6250;
365+
break;
366+
default:
367+
dev_err(di->dev,
368+
"Chip ID %d not supported!\n", di->chip_id);
369+
return -EINVAL;
370+
}
371+
di->slew_reg = FAN53555_CONTROL;
372+
di->slew_mask = CTL_SLEW_MASK;
373+
di->ramp_delay_table = slew_rates;
374+
di->n_ramp_values = ARRAY_SIZE(slew_rates);
375+
di->vsel_count = RK8602_NVOLTAGES;
376+
377+
return 0;
378+
}
379+
320380
static int fan53555_voltages_setup_silergy(struct fan53555_device_info *di)
321381
{
322382
/* Init voltage range and step */
@@ -377,6 +437,7 @@ static int fan53555_device_setup(struct fan53555_device_info *di,
377437
switch (di->vendor) {
378438
case FAN53526_VENDOR_FAIRCHILD:
379439
case FAN53555_VENDOR_FAIRCHILD:
440+
case FAN53555_VENDOR_ROCKCHIP:
380441
case FAN53555_VENDOR_SILERGY:
381442
switch (pdata->sleep_vsel_id) {
382443
case FAN53555_VSEL_ID_0:
@@ -391,6 +452,27 @@ static int fan53555_device_setup(struct fan53555_device_info *di,
391452
dev_err(di->dev, "Invalid VSEL ID!\n");
392453
return -EINVAL;
393454
}
455+
di->sleep_en_reg = di->sleep_reg;
456+
di->en_reg = di->vol_reg;
457+
break;
458+
case RK8602_VENDOR_ROCKCHIP:
459+
switch (pdata->sleep_vsel_id) {
460+
case FAN53555_VSEL_ID_0:
461+
di->sleep_reg = RK8602_VSEL0;
462+
di->vol_reg = RK8602_VSEL1;
463+
di->sleep_en_reg = FAN53555_VSEL0;
464+
di->en_reg = FAN53555_VSEL1;
465+
break;
466+
case FAN53555_VSEL_ID_1:
467+
di->sleep_reg = RK8602_VSEL1;
468+
di->vol_reg = RK8602_VSEL0;
469+
di->sleep_en_reg = FAN53555_VSEL1;
470+
di->en_reg = FAN53555_VSEL0;
471+
break;
472+
default:
473+
dev_err(di->dev, "Invalid VSEL ID!\n");
474+
return -EINVAL;
475+
}
394476
break;
395477
case FAN53526_VENDOR_TCS:
396478
switch (pdata->sleep_vsel_id) {
@@ -406,6 +488,8 @@ static int fan53555_device_setup(struct fan53555_device_info *di,
406488
dev_err(di->dev, "Invalid VSEL ID!\n");
407489
return -EINVAL;
408490
}
491+
di->sleep_en_reg = di->sleep_reg;
492+
di->en_reg = di->vol_reg;
409493
break;
410494
default:
411495
dev_err(di->dev, "vendor %d not supported!\n", di->vendor);
@@ -427,10 +511,23 @@ static int fan53555_device_setup(struct fan53555_device_info *di,
427511
}
428512
break;
429513
case FAN53555_VENDOR_FAIRCHILD:
514+
case FAN53555_VENDOR_ROCKCHIP:
430515
case FAN53555_VENDOR_SILERGY:
431516
di->mode_reg = di->vol_reg;
432517
di->mode_mask = VSEL_MODE;
433518
break;
519+
case RK8602_VENDOR_ROCKCHIP:
520+
di->mode_mask = VSEL_MODE;
521+
522+
switch (pdata->sleep_vsel_id) {
523+
case FAN53555_VSEL_ID_0:
524+
di->mode_reg = FAN53555_VSEL1;
525+
break;
526+
case FAN53555_VSEL_ID_1:
527+
di->mode_reg = FAN53555_VSEL0;
528+
break;
529+
}
530+
break;
434531
case FAN53526_VENDOR_TCS:
435532
di->mode_reg = TCS4525_COMMAND;
436533

@@ -456,6 +553,12 @@ static int fan53555_device_setup(struct fan53555_device_info *di,
456553
case FAN53555_VENDOR_FAIRCHILD:
457554
ret = fan53555_voltages_setup_fairchild(di);
458555
break;
556+
case FAN53555_VENDOR_ROCKCHIP:
557+
ret = fan53555_voltages_setup_rockchip(di);
558+
break;
559+
case RK8602_VENDOR_ROCKCHIP:
560+
ret = rk8602_voltages_setup_rockchip(di);
561+
break;
459562
case FAN53555_VENDOR_SILERGY:
460563
ret = fan53555_voltages_setup_silergy(di);
461564
break;
@@ -481,7 +584,7 @@ static int fan53555_regulator_register(struct fan53555_device_info *di,
481584
rdesc->ops = &fan53555_regulator_ops;
482585
rdesc->type = REGULATOR_VOLTAGE;
483586
rdesc->n_voltages = di->vsel_count;
484-
rdesc->enable_reg = di->vol_reg;
587+
rdesc->enable_reg = di->en_reg;
485588
rdesc->enable_mask = VSEL_BUCK_EN;
486589
rdesc->min_uV = di->vsel_min;
487590
rdesc->uV_step = di->vsel_step;
@@ -531,6 +634,12 @@ static const struct of_device_id __maybe_unused fan53555_dt_ids[] = {
531634
}, {
532635
.compatible = "fcs,fan53555",
533636
.data = (void *)FAN53555_VENDOR_FAIRCHILD
637+
}, {
638+
.compatible = "rockchip,rk8600",
639+
.data = (void *)FAN53555_VENDOR_ROCKCHIP
640+
}, {
641+
.compatible = "rockchip,rk8602",
642+
.data = (void *)RK8602_VENDOR_ROCKCHIP
534643
}, {
535644
.compatible = "silergy,syr827",
536645
.data = (void *)FAN53555_VENDOR_SILERGY,
@@ -637,6 +746,12 @@ static const struct i2c_device_id fan53555_id[] = {
637746
}, {
638747
.name = "fan53555",
639748
.driver_data = FAN53555_VENDOR_FAIRCHILD
749+
}, {
750+
.name = "rk8600",
751+
.driver_data = FAN53555_VENDOR_ROCKCHIP
752+
}, {
753+
.name = "rk8602",
754+
.driver_data = RK8602_VENDOR_ROCKCHIP
640755
}, {
641756
.name = "syr827",
642757
.driver_data = FAN53555_VENDOR_SILERGY

0 commit comments

Comments
 (0)