2828#define RTQ2208_REG_LDO2_CFG 0xC1
2929#define RTQ2208_REG_LDO_DVS_CTRL 0xD0
3030#define RTQ2208_REG_HIDDEN_BUCKPH 0x55
31+ #define RTQ2208_REG_HIDDEN_LDOCFG0 0x8F
32+ #define RTQ2208_REG_HIDDEN_LDOCFG1 0x96
3133#define RTQ2208_REG_HIDDEN0 0xFE
3234#define RTQ2208_REG_HIDDEN1 0xFF
3335
5052#define RTQ2208_LDO2_VOSEL_SD_MASK BIT(7)
5153#define RTQ2208_MASK_BUCKPH_GROUP1 GENMASK(6, 4)
5254#define RTQ2208_MASK_BUCKPH_GROUP2 GENMASK(2, 0)
55+ #define RTQ2208_MASK_LDO2_OPT0 BIT(7)
56+ #define RTQ2208_MASK_LDO2_OPT1 BIT(6)
57+ #define RTQ2208_MASK_LDO1_FIXED BIT(6)
5358
5459/* Size */
5560#define RTQ2208_VOUT_MAXNUM 256
@@ -250,11 +255,6 @@ static const unsigned int rtq2208_ldo_volt_table[] = {
250255 3300000 ,
251256};
252257
253- static struct of_regulator_match rtq2208_ldo_match [] = {
254- {.name = "ldo2" , },
255- {.name = "ldo1" , },
256- };
257-
258258static unsigned int rtq2208_of_map_mode (unsigned int mode )
259259{
260260 switch (mode ) {
@@ -349,59 +349,6 @@ static irqreturn_t rtq2208_irq_handler(int irqno, void *devid)
349349 return IRQ_HANDLED ;
350350}
351351
352- static int rtq2208_of_get_ldo_dvs_ability (struct device * dev )
353- {
354- struct device_node * np ;
355- struct of_regulator_match * match ;
356- struct regulator_desc * desc ;
357- struct regulator_init_data * init_data ;
358- u32 fixed_uV ;
359- int ret , i ;
360-
361- if (!dev -> of_node )
362- return - ENODEV ;
363-
364- np = of_get_child_by_name (dev -> of_node , "regulators" );
365- if (!np )
366- np = dev -> of_node ;
367-
368- ret = of_regulator_match (dev , np , rtq2208_ldo_match , ARRAY_SIZE (rtq2208_ldo_match ));
369-
370- of_node_put (np );
371-
372- if (ret < 0 )
373- return ret ;
374-
375- for (i = 0 ; i < ARRAY_SIZE (rtq2208_ldo_match ); i ++ ) {
376- match = rtq2208_ldo_match + i ;
377- init_data = match -> init_data ;
378- desc = (struct regulator_desc * )match -> desc ;
379-
380- if (!init_data || !desc )
381- continue ;
382-
383- /* specify working fixed voltage if the propery exists */
384- ret = of_property_read_u32 (match -> of_node , "richtek,fixed-microvolt" , & fixed_uV );
385-
386- if (!ret ) {
387- if (fixed_uV != init_data -> constraints .min_uV ||
388- fixed_uV != init_data -> constraints .max_uV )
389- return - EINVAL ;
390- desc -> n_voltages = 1 ;
391- desc -> fixed_uV = fixed_uV ;
392- desc -> fixed_uV = init_data -> constraints .min_uV ;
393- desc -> ops = & rtq2208_regulator_ldo_fix_ops ;
394- } else {
395- desc -> n_voltages = ARRAY_SIZE (rtq2208_ldo_volt_table );
396- desc -> volt_table = rtq2208_ldo_volt_table ;
397- desc -> ops = & rtq2208_regulator_ldo_adj_ops ;
398- }
399- }
400-
401- return 0 ;
402- }
403-
404-
405352#define BUCK_INFO (_name , _id ) \
406353{ \
407354 .name = _name, \
@@ -429,9 +376,11 @@ static const struct linear_range rtq2208_vout_range[] = {
429376 REGULATOR_LINEAR_RANGE (1310000 , 181 , 255 , 10000 ),
430377};
431378
432- static void rtq2208_init_regulator_desc (struct rtq2208_regulator_desc * rdesc , int mtp_sel , int idx )
379+ static void rtq2208_init_regulator_desc (struct rtq2208_regulator_desc * rdesc , int mtp_sel , int idx ,
380+ unsigned int ldo1_fixed , unsigned int ldo2_fixed )
433381{
434382 struct regulator_desc * desc ;
383+ unsigned int fixed_uV ;
435384 static const struct {
436385 char * name ;
437386 int base ;
@@ -467,7 +416,8 @@ static void rtq2208_init_regulator_desc(struct rtq2208_regulator_desc *rdesc, in
467416
468417 rdesc -> mode_mask = RTQ2208_BUCK_NRMODE_MASK ;
469418
470- if (idx >= RTQ2208_BUCK_B && idx <= RTQ2208_BUCK_E ) {
419+ switch (idx ) {
420+ case RTQ2208_BUCK_B ... RTQ2208_BUCK_E :
471421 /* init buck desc */
472422 desc -> ops = & rtq2208_regulator_buck_ops ;
473423 desc -> vsel_reg = curr_info -> base + VSEL_SHIFT (mtp_sel );
@@ -485,7 +435,19 @@ static void rtq2208_init_regulator_desc(struct rtq2208_regulator_desc *rdesc, in
485435 rdesc -> suspend_config_reg = BUCK_RG_SHIFT (curr_info -> base , 4 );
486436 rdesc -> suspend_enable_mask = RTQ2208_BUCK_EN_STR_MASK ;
487437 rdesc -> suspend_mode_mask = RTQ2208_BUCK_STRMODE_MASK ;
488- } else {
438+ break ;
439+ default :
440+ fixed_uV = idx == RTQ2208_LDO2 ? ldo2_fixed : ldo1_fixed ;
441+ if (fixed_uV ) {
442+ desc -> n_voltages = 1 ;
443+ desc -> fixed_uV = fixed_uV ;
444+ desc -> ops = & rtq2208_regulator_ldo_fix_ops ;
445+ } else {
446+ desc -> n_voltages = ARRAY_SIZE (rtq2208_ldo_volt_table );
447+ desc -> volt_table = rtq2208_ldo_volt_table ;
448+ desc -> ops = & rtq2208_regulator_ldo_adj_ops ;
449+ }
450+
489451 /* init ldo desc */
490452 desc -> active_discharge_reg = RTQ2208_REG_LDO_DVS_CTRL ;
491453 desc -> active_discharge_on = curr_info -> dis_on ;
@@ -495,13 +457,15 @@ static void rtq2208_init_regulator_desc(struct rtq2208_regulator_desc *rdesc, in
495457
496458 rdesc -> suspend_config_reg = curr_info -> base ;
497459 rdesc -> suspend_enable_mask = RTQ2208_LDO_EN_STR_MASK ;
460+ break ;
498461 }
499462}
500463
501464static int rtq2208_parse_regulator_dt_data (int n_regulator , const unsigned int * regulator_idx_table ,
502- struct rtq2208_regulator_desc * rdesc [RTQ2208_LDO_MAX ], struct device * dev )
465+ struct rtq2208_regulator_desc * rdesc [RTQ2208_LDO_MAX ], struct device * dev ,
466+ unsigned int ldo1_fixed , unsigned int ldo2_fixed )
503467{
504- int mtp_sel , i , idx , ret ;
468+ int mtp_sel , i , idx ;
505469
506470 /* get mtp_sel0 or mtp_sel1 */
507471 mtp_sel = device_property_read_bool (dev , "richtek,mtp-sel-high" );
@@ -513,29 +477,21 @@ static int rtq2208_parse_regulator_dt_data(int n_regulator, const unsigned int *
513477 if (!rdesc [i ])
514478 return - ENOMEM ;
515479
516- rtq2208_init_regulator_desc (rdesc [i ], mtp_sel , idx );
517-
518- /* init ldo dvs ability */
519- if (idx >= RTQ2208_LDO2 )
520- rtq2208_ldo_match [idx - RTQ2208_LDO2 ].desc = & rdesc [i ]-> desc ;
480+ rtq2208_init_regulator_desc (rdesc [i ], mtp_sel , idx , ldo1_fixed , ldo2_fixed );
521481 }
522482
523- /* init ldo fixed_uV */
524- ret = rtq2208_of_get_ldo_dvs_ability (dev );
525- if (ret )
526- return dev_err_probe (dev , ret , "Failed to get ldo fixed_uV\n" );
527-
528483 return 0 ;
529484
530485}
531486
532- static int rtq2208_regulator_check (struct device * dev , int * num ,
533- int * regulator_idx_table , unsigned int * buck_masks )
487+ static int rtq2208_regulator_check (struct device * dev , int * num , int * regulator_idx_table ,
488+ unsigned int * buck_masks , unsigned int * ldo1_fixed_uV ,
489+ unsigned int * ldo2_fixed_uV )
534490{
535491 struct regmap * regmap = dev_get_regmap (dev , NULL );
536492 bool rtq2208_used_table [RTQ2208_LDO_MAX ] = {0 };
537493 u8 entry_key [] = { 0x69 , 0x01 };
538- unsigned int buck_phase ;
494+ unsigned int buck_phase , ldo_cfg0 , ldo_cfg1 ;
539495 int i , ret ;
540496 u8 mask ;
541497
@@ -547,6 +503,14 @@ static int rtq2208_regulator_check(struct device *dev, int *num,
547503 if (ret )
548504 return dev_err_probe (dev , ret , "Failed to read buck phase configuration\n" );
549505
506+ ret = regmap_read (regmap , RTQ2208_REG_HIDDEN_LDOCFG0 , & ldo_cfg0 );
507+ if (ret )
508+ return dev_err_probe (dev , ret , "Failed to read ldo cfg0\n" );
509+
510+ ret = regmap_read (regmap , RTQ2208_REG_HIDDEN_LDOCFG1 , & ldo_cfg1 );
511+ if (ret )
512+ return dev_err_probe (dev , ret , "Failed to read ldo cfg1\n" );
513+
550514 ret = regmap_write (regmap , RTQ2208_REG_HIDDEN1 , 0x00 );
551515 if (ret )
552516 return dev_err_probe (dev , ret , "Failed to exit hidden page\n" );
@@ -593,6 +557,16 @@ static int rtq2208_regulator_check(struct device *dev, int *num,
593557 break ;
594558 }
595559
560+ * ldo1_fixed_uV = FIELD_GET (RTQ2208_MASK_LDO1_FIXED , ldo_cfg1 ) ? 1200000 : 0 ;
561+
562+ if (!FIELD_GET (RTQ2208_MASK_LDO2_OPT0 , ldo_cfg0 ) &&
563+ !FIELD_GET (RTQ2208_MASK_LDO2_OPT1 , ldo_cfg1 ))
564+ * ldo2_fixed_uV = 0 ;
565+ else if (FIELD_GET (RTQ2208_MASK_LDO2_OPT1 , ldo_cfg1 ))
566+ * ldo2_fixed_uV = 900000 ;
567+ else
568+ * ldo2_fixed_uV = 1200000 ;
569+
596570 /* By default, LDO1 & LDO2 are always used */
597571 rtq2208_used_table [RTQ2208_LDO1 ] = rtq2208_used_table [RTQ2208_LDO2 ] = true;
598572
@@ -626,6 +600,7 @@ static int rtq2208_probe(struct i2c_client *i2c)
626600 int i , ret = 0 , idx , n_regulator = 0 ;
627601 unsigned int regulator_idx_table [RTQ2208_LDO_MAX ],
628602 buck_masks [RTQ2208_BUCK_NUM_IRQ_REGS ] = {0x33 , 0x33 , 0x33 , 0x33 , 0x33 };
603+ unsigned int ldo1_fixed_uV , ldo2_fixed_uV ;
629604
630605 rdev_map = devm_kzalloc (dev , sizeof (struct rtq2208_rdev_map ), GFP_KERNEL );
631606 if (!rdev_map )
@@ -636,7 +611,8 @@ static int rtq2208_probe(struct i2c_client *i2c)
636611 return dev_err_probe (dev , PTR_ERR (regmap ), "Failed to allocate regmap\n" );
637612
638613 /* get needed regulator */
639- ret = rtq2208_regulator_check (dev , & n_regulator , regulator_idx_table , buck_masks );
614+ ret = rtq2208_regulator_check (dev , & n_regulator , regulator_idx_table , buck_masks ,
615+ & ldo1_fixed_uV , & ldo2_fixed_uV );
640616 if (ret )
641617 return dev_err_probe (dev , ret , "Failed to check used regulators\n" );
642618
@@ -646,7 +622,8 @@ static int rtq2208_probe(struct i2c_client *i2c)
646622 cfg .dev = dev ;
647623
648624 /* init regulator desc */
649- ret = rtq2208_parse_regulator_dt_data (n_regulator , regulator_idx_table , rdesc , dev );
625+ ret = rtq2208_parse_regulator_dt_data (n_regulator , regulator_idx_table , rdesc , dev ,
626+ ldo1_fixed_uV , ldo2_fixed_uV );
650627 if (ret )
651628 return ret ;
652629
0 commit comments