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)
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,
559612static 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
565618static 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