28
28
#define RTQ2208_REG_LDO2_CFG 0xC1
29
29
#define RTQ2208_REG_LDO_DVS_CTRL 0xD0
30
30
#define RTQ2208_REG_HIDDEN_BUCKPH 0x55
31
+ #define RTQ2208_REG_HIDDEN_LDOCFG0 0x8F
32
+ #define RTQ2208_REG_HIDDEN_LDOCFG1 0x96
31
33
#define RTQ2208_REG_HIDDEN0 0xFE
32
34
#define RTQ2208_REG_HIDDEN1 0xFF
33
35
50
52
#define RTQ2208_LDO2_VOSEL_SD_MASK BIT(7)
51
53
#define RTQ2208_MASK_BUCKPH_GROUP1 GENMASK(6, 4)
52
54
#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)
53
58
54
59
/* Size */
55
60
#define RTQ2208_VOUT_MAXNUM 256
@@ -250,11 +255,6 @@ static const unsigned int rtq2208_ldo_volt_table[] = {
250
255
3300000 ,
251
256
};
252
257
253
- static struct of_regulator_match rtq2208_ldo_match [] = {
254
- {.name = "ldo2" , },
255
- {.name = "ldo1" , },
256
- };
257
-
258
258
static unsigned int rtq2208_of_map_mode (unsigned int mode )
259
259
{
260
260
switch (mode ) {
@@ -349,59 +349,6 @@ static irqreturn_t rtq2208_irq_handler(int irqno, void *devid)
349
349
return IRQ_HANDLED ;
350
350
}
351
351
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
-
405
352
#define BUCK_INFO (_name , _id ) \
406
353
{ \
407
354
.name = _name, \
@@ -429,9 +376,11 @@ static const struct linear_range rtq2208_vout_range[] = {
429
376
REGULATOR_LINEAR_RANGE (1310000 , 181 , 255 , 10000 ),
430
377
};
431
378
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 )
433
381
{
434
382
struct regulator_desc * desc ;
383
+ unsigned int fixed_uV ;
435
384
static const struct {
436
385
char * name ;
437
386
int base ;
@@ -467,7 +416,8 @@ static void rtq2208_init_regulator_desc(struct rtq2208_regulator_desc *rdesc, in
467
416
468
417
rdesc -> mode_mask = RTQ2208_BUCK_NRMODE_MASK ;
469
418
470
- if (idx >= RTQ2208_BUCK_B && idx <= RTQ2208_BUCK_E ) {
419
+ switch (idx ) {
420
+ case RTQ2208_BUCK_B ... RTQ2208_BUCK_E :
471
421
/* init buck desc */
472
422
desc -> ops = & rtq2208_regulator_buck_ops ;
473
423
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
485
435
rdesc -> suspend_config_reg = BUCK_RG_SHIFT (curr_info -> base , 4 );
486
436
rdesc -> suspend_enable_mask = RTQ2208_BUCK_EN_STR_MASK ;
487
437
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
+
489
451
/* init ldo desc */
490
452
desc -> active_discharge_reg = RTQ2208_REG_LDO_DVS_CTRL ;
491
453
desc -> active_discharge_on = curr_info -> dis_on ;
@@ -495,13 +457,15 @@ static void rtq2208_init_regulator_desc(struct rtq2208_regulator_desc *rdesc, in
495
457
496
458
rdesc -> suspend_config_reg = curr_info -> base ;
497
459
rdesc -> suspend_enable_mask = RTQ2208_LDO_EN_STR_MASK ;
460
+ break ;
498
461
}
499
462
}
500
463
501
464
static 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 )
503
467
{
504
- int mtp_sel , i , idx , ret ;
468
+ int mtp_sel , i , idx ;
505
469
506
470
/* get mtp_sel0 or mtp_sel1 */
507
471
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 *
513
477
if (!rdesc [i ])
514
478
return - ENOMEM ;
515
479
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 );
521
481
}
522
482
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
-
528
483
return 0 ;
529
484
530
485
}
531
486
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 )
534
490
{
535
491
struct regmap * regmap = dev_get_regmap (dev , NULL );
536
492
bool rtq2208_used_table [RTQ2208_LDO_MAX ] = {0 };
537
493
u8 entry_key [] = { 0x69 , 0x01 };
538
- unsigned int buck_phase ;
494
+ unsigned int buck_phase , ldo_cfg0 , ldo_cfg1 ;
539
495
int i , ret ;
540
496
u8 mask ;
541
497
@@ -547,6 +503,14 @@ static int rtq2208_regulator_check(struct device *dev, int *num,
547
503
if (ret )
548
504
return dev_err_probe (dev , ret , "Failed to read buck phase configuration\n" );
549
505
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
+
550
514
ret = regmap_write (regmap , RTQ2208_REG_HIDDEN1 , 0x00 );
551
515
if (ret )
552
516
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,
593
557
break ;
594
558
}
595
559
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
+
596
570
/* By default, LDO1 & LDO2 are always used */
597
571
rtq2208_used_table [RTQ2208_LDO1 ] = rtq2208_used_table [RTQ2208_LDO2 ] = true;
598
572
@@ -626,6 +600,7 @@ static int rtq2208_probe(struct i2c_client *i2c)
626
600
int i , ret = 0 , idx , n_regulator = 0 ;
627
601
unsigned int regulator_idx_table [RTQ2208_LDO_MAX ],
628
602
buck_masks [RTQ2208_BUCK_NUM_IRQ_REGS ] = {0x33 , 0x33 , 0x33 , 0x33 , 0x33 };
603
+ unsigned int ldo1_fixed_uV , ldo2_fixed_uV ;
629
604
630
605
rdev_map = devm_kzalloc (dev , sizeof (struct rtq2208_rdev_map ), GFP_KERNEL );
631
606
if (!rdev_map )
@@ -636,7 +611,8 @@ static int rtq2208_probe(struct i2c_client *i2c)
636
611
return dev_err_probe (dev , PTR_ERR (regmap ), "Failed to allocate regmap\n" );
637
612
638
613
/* 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 );
640
616
if (ret )
641
617
return dev_err_probe (dev , ret , "Failed to check used regulators\n" );
642
618
@@ -646,7 +622,8 @@ static int rtq2208_probe(struct i2c_client *i2c)
646
622
cfg .dev = dev ;
647
623
648
624
/* 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 );
650
627
if (ret )
651
628
return ret ;
652
629
0 commit comments