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
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)
6468enum 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+
90104enum {
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
166182static 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+
320380static 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