27
27
#define RTQ2208_REG_LDO1_CFG 0xB1
28
28
#define RTQ2208_REG_LDO2_CFG 0xC1
29
29
#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
30
33
31
34
/* Mask */
32
35
#define RTQ2208_BUCK_NR_MTP_SEL_MASK GENMASK(7, 0)
45
48
#define RTQ2208_LDO1_VOSEL_SD_MASK BIT(5)
46
49
#define RTQ2208_LDO2_DISCHG_EN_MASK BIT(6)
47
50
#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)
48
53
49
54
/* Size */
50
55
#define RTQ2208_VOUT_MAXNUM 256
@@ -524,27 +529,75 @@ static int rtq2208_parse_regulator_dt_data(int n_regulator, const unsigned int *
524
529
525
530
}
526
531
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 ,
533
533
int * regulator_idx_table , unsigned int * buck_masks )
534
534
{
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 ;
544
540
u8 mask ;
545
541
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
+
546
599
for (i = 0 ; i < RTQ2208_LDO_MAX ; i ++ ) {
547
- if (!rtq2208_used_table [idx ][ i ])
600
+ if (!rtq2208_used_table [i ])
548
601
continue ;
549
602
550
603
regulator_idx_table [(* num )++ ] = i ;
@@ -559,7 +612,7 @@ static int rtq2208_regulator_check(int slave_addr, int *num,
559
612
static const struct regmap_config rtq2208_regmap_config = {
560
613
.reg_bits = 8 ,
561
614
.val_bits = 8 ,
562
- .max_register = 0xEF ,
615
+ .max_register = 0xFF ,
563
616
};
564
617
565
618
static int rtq2208_probe (struct i2c_client * i2c )
@@ -583,7 +636,7 @@ static int rtq2208_probe(struct i2c_client *i2c)
583
636
return dev_err_probe (dev , PTR_ERR (regmap ), "Failed to allocate regmap\n" );
584
637
585
638
/* 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 );
587
640
if (ret )
588
641
return dev_err_probe (dev , ret , "Failed to check used regulators\n" );
589
642
0 commit comments