26
26
#define RTQ2208_REG_BUCK_H_CFG0 0xA2
27
27
#define RTQ2208_REG_LDO1_CFG 0xB1
28
28
#define RTQ2208_REG_LDO2_CFG 0xC1
29
+ #define RTQ2208_REG_LDO_DVS_CTRL 0xD0
29
30
30
31
/* Mask */
31
32
#define RTQ2208_BUCK_NR_MTP_SEL_MASK GENMASK(7, 0)
40
41
#define RTQ2208_EN_DIS_MASK BIT(0)
41
42
#define RTQ2208_BUCK_RAMP_SEL_MASK GENMASK(2, 0)
42
43
#define RTQ2208_HD_INT_MASK BIT(0)
44
+ #define RTQ2208_LDO1_DISCHG_EN_MASK BIT(4)
45
+ #define RTQ2208_LDO1_VOSEL_SD_MASK BIT(5)
46
+ #define RTQ2208_LDO2_DISCHG_EN_MASK BIT(6)
47
+ #define RTQ2208_LDO2_VOSEL_SD_MASK BIT(7)
43
48
44
49
/* Size */
45
50
#define RTQ2208_VOUT_MAXNUM 256
@@ -318,23 +323,6 @@ static irqreturn_t rtq2208_irq_handler(int irqno, void *devid)
318
323
return IRQ_HANDLED ;
319
324
}
320
325
321
- #define RTQ2208_REGULATOR_INFO (_name , _base ) \
322
- { \
323
- .name = #_name, \
324
- .base = _base, \
325
- }
326
- #define BUCK_RG_BASE (_id ) RTQ2208_REG_BUCK_##_id##_CFG0
327
- #define BUCK_RG_SHIFT (_base , _shift ) (_base + _shift)
328
- #define LDO_RG_BASE (_id ) RTQ2208_REG_LDO##_id##_CFG
329
- #define LDO_RG_SHIFT (_base , _shift ) (_base + _shift)
330
- #define VSEL_SHIFT (_sel ) (_sel ? 3 : 1)
331
- #define MTP_SEL_MASK (_sel ) RTQ2208_BUCK_EN_NR_MTP_SEL##_sel##_MASK
332
-
333
- static const struct linear_range rtq2208_vout_range [] = {
334
- REGULATOR_LINEAR_RANGE (400000 , 0 , 180 , 5000 ),
335
- REGULATOR_LINEAR_RANGE (1310000 , 181 , 255 , 10000 ),
336
- };
337
-
338
326
static int rtq2208_of_get_fixed_voltage (struct device * dev ,
339
327
struct of_regulator_match * rtq2208_ldo_match , int n_fixed )
340
328
{
@@ -373,24 +361,57 @@ static int rtq2208_of_get_fixed_voltage(struct device *dev,
373
361
return 0 ;
374
362
}
375
363
364
+
365
+ #define BUCK_INFO (_name , _id ) \
366
+ { \
367
+ .name = _name, \
368
+ .base = RTQ2208_REG_BUCK_##_id##_CFG0, \
369
+ .enable_reg = BUCK_RG_SHIFT(RTQ2208_REG_BUCK_##_id##_CFG0, 2), \
370
+ .dis_reg = RTQ2208_REG_BUCK_##_id##_CFG0, \
371
+ }
372
+
373
+ #define LDO_INFO (_name , _id ) \
374
+ { \
375
+ .name = _name, \
376
+ .base = RTQ2208_REG_LDO##_id##_CFG, \
377
+ .enable_reg = RTQ2208_REG_LDO##_id##_CFG, \
378
+ .dis_mask = RTQ2208_LDO##_id##_DISCHG_EN_MASK, \
379
+ .dis_on = RTQ2208_LDO##_id##_DISCHG_EN_MASK, \
380
+ .vsel_mask = RTQ2208_LDO##_id##_VOSEL_SD_MASK, \
381
+ }
382
+
383
+ #define BUCK_RG_SHIFT (_base , _shift ) (_base + _shift)
384
+ #define VSEL_SHIFT (_sel ) (_sel ? 3 : 1)
385
+ #define MTP_SEL_MASK (_sel ) RTQ2208_BUCK_EN_NR_MTP_SEL##_sel##_MASK
386
+
387
+ static const struct linear_range rtq2208_vout_range [] = {
388
+ REGULATOR_LINEAR_RANGE (400000 , 0 , 180 , 5000 ),
389
+ REGULATOR_LINEAR_RANGE (1310000 , 181 , 255 , 10000 ),
390
+ };
391
+
376
392
static void rtq2208_init_regulator_desc (struct rtq2208_regulator_desc * rdesc , int mtp_sel ,
377
393
int idx , struct of_regulator_match * rtq2208_ldo_match , int * ldo_idx )
378
394
{
379
395
struct regulator_desc * desc ;
380
396
static const struct {
381
397
char * name ;
382
398
int base ;
399
+ int enable_reg ;
400
+ int dis_reg ;
401
+ int dis_mask ;
402
+ int dis_on ;
403
+ int vsel_mask ;
383
404
} regulator_info [] = {
384
- RTQ2208_REGULATOR_INFO ( buck - b , BUCK_RG_BASE ( B ) ),
385
- RTQ2208_REGULATOR_INFO ( buck - c , BUCK_RG_BASE ( C ) ),
386
- RTQ2208_REGULATOR_INFO ( buck - d , BUCK_RG_BASE ( D ) ),
387
- RTQ2208_REGULATOR_INFO ( buck - a , BUCK_RG_BASE ( A ) ),
388
- RTQ2208_REGULATOR_INFO ( buck - f , BUCK_RG_BASE ( F ) ),
389
- RTQ2208_REGULATOR_INFO ( buck - g , BUCK_RG_BASE ( G ) ),
390
- RTQ2208_REGULATOR_INFO ( buck - h , BUCK_RG_BASE ( H ) ),
391
- RTQ2208_REGULATOR_INFO ( buck - e , BUCK_RG_BASE ( E ) ),
392
- RTQ2208_REGULATOR_INFO ( ldo2 , LDO_RG_BASE ( 2 ) ),
393
- RTQ2208_REGULATOR_INFO ( ldo1 , LDO_RG_BASE ( 1 ) ),
405
+ BUCK_INFO ( " buck-b" , B ),
406
+ BUCK_INFO ( " buck-c" , C ),
407
+ BUCK_INFO ( " buck-d" , D ),
408
+ BUCK_INFO ( " buck-a" , A ),
409
+ BUCK_INFO ( " buck-f" , F ),
410
+ BUCK_INFO ( " buck-g" , G ),
411
+ BUCK_INFO ( " buck-h" , H ),
412
+ BUCK_INFO ( " buck-e" , E ),
413
+ LDO_INFO ( " ldo2" , 2 ),
414
+ LDO_INFO ( " ldo1" , 1 ),
394
415
}, * curr_info ;
395
416
396
417
curr_info = regulator_info + idx ;
@@ -402,39 +423,36 @@ static void rtq2208_init_regulator_desc(struct rtq2208_regulator_desc *rdesc, in
402
423
desc -> owner = THIS_MODULE ;
403
424
desc -> type = REGULATOR_VOLTAGE ;
404
425
desc -> enable_mask = mtp_sel ? MTP_SEL_MASK (1 ) : MTP_SEL_MASK (0 );
405
- desc -> active_discharge_on = RTQ2208_EN_DIS_MASK ;
426
+ desc -> enable_reg = curr_info -> enable_reg ;
406
427
desc -> active_discharge_off = 0 ;
407
- desc -> active_discharge_mask = RTQ2208_EN_DIS_MASK ;
408
428
409
429
rdesc -> mode_mask = RTQ2208_BUCK_NRMODE_MASK ;
410
430
411
431
if (idx >= RTQ2208_BUCK_B && idx <= RTQ2208_BUCK_E ) {
412
432
/* init buck desc */
413
- desc -> enable_reg = BUCK_RG_SHIFT (curr_info -> base , 2 );
414
433
desc -> ops = & rtq2208_regulator_buck_ops ;
415
434
desc -> vsel_reg = curr_info -> base + VSEL_SHIFT (mtp_sel );
416
435
desc -> vsel_mask = RTQ2208_BUCK_NR_MTP_SEL_MASK ;
417
436
desc -> n_voltages = RTQ2208_VOUT_MAXNUM ;
418
437
desc -> linear_ranges = rtq2208_vout_range ;
419
438
desc -> n_linear_ranges = ARRAY_SIZE (rtq2208_vout_range );
420
439
desc -> ramp_reg = BUCK_RG_SHIFT (curr_info -> base , 5 );
421
- desc -> active_discharge_reg = curr_info -> base ;
422
440
desc -> of_map_mode = rtq2208_of_map_mode ;
441
+ desc -> active_discharge_reg = curr_info -> dis_reg ;
442
+ desc -> active_discharge_on = RTQ2208_EN_DIS_MASK ;
443
+ desc -> active_discharge_mask = RTQ2208_EN_DIS_MASK ;
423
444
424
445
rdesc -> mode_reg = BUCK_RG_SHIFT (curr_info -> base , 2 );
425
446
rdesc -> suspend_config_reg = BUCK_RG_SHIFT (curr_info -> base , 4 );
426
447
rdesc -> suspend_enable_mask = RTQ2208_BUCK_EN_STR_MASK ;
427
448
rdesc -> suspend_mode_mask = RTQ2208_BUCK_STRMODE_MASK ;
428
449
} else {
429
450
/* init ldo desc */
430
- desc -> enable_reg = curr_info -> base ;
431
- desc -> ops = & rtq2208_regulator_ldo_ops ;
432
- desc -> n_voltages = 1 ;
433
- desc -> active_discharge_reg = LDO_RG_SHIFT (curr_info -> base , 2 );
434
-
435
- rtq2208_ldo_match [* ldo_idx ].name = desc -> name ;
436
- rtq2208_ldo_match [* ldo_idx ].driver_data = rdesc ;
437
- rtq2208_ldo_match [(* ldo_idx )++ ].desc = desc ;
451
+ desc -> active_discharge_reg = RTQ2208_REG_LDO_DVS_CTRL ;
452
+ desc -> active_discharge_on = curr_info -> dis_on ;
453
+ desc -> active_discharge_mask = curr_info -> dis_mask ;
454
+ desc -> vsel_reg = RTQ2208_REG_LDO_DVS_CTRL ;
455
+ desc -> vsel_mask = curr_info -> vsel_mask ;
438
456
439
457
rdesc -> suspend_config_reg = curr_info -> base ;
440
458
rdesc -> suspend_enable_mask = RTQ2208_LDO_EN_STR_MASK ;
@@ -458,6 +476,10 @@ static int rtq2208_parse_regulator_dt_data(int n_regulator, const unsigned int *
458
476
return - ENOMEM ;
459
477
460
478
rtq2208_init_regulator_desc (rdesc [i ], mtp_sel , idx , rtq2208_ldo_match , & ldo_idx );
479
+
480
+ /* init ldo dvs ability */
481
+ if (idx >= RTQ2208_LDO2 )
482
+ rtq2208_ldo_match [idx - RTQ2208_LDO2 ].desc = & rdesc [i ]-> desc ;
461
483
}
462
484
463
485
/* init ldo fixed_uV */
0 commit comments