2626#define RTQ2208_REG_BUCK_H_CFG0 0xA2
2727#define RTQ2208_REG_LDO1_CFG 0xB1
2828#define RTQ2208_REG_LDO2_CFG 0xC1
29+ #define RTQ2208_REG_LDO_DVS_CTRL 0xD0
2930
3031/* Mask */
3132#define RTQ2208_BUCK_NR_MTP_SEL_MASK GENMASK(7, 0)
4041#define RTQ2208_EN_DIS_MASK BIT(0)
4142#define RTQ2208_BUCK_RAMP_SEL_MASK GENMASK(2, 0)
4243#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)
4348
4449/* Size */
4550#define RTQ2208_VOUT_MAXNUM 256
@@ -318,23 +323,6 @@ static irqreturn_t rtq2208_irq_handler(int irqno, void *devid)
318323 return IRQ_HANDLED ;
319324}
320325
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-
338326static int rtq2208_of_get_fixed_voltage (struct device * dev ,
339327 struct of_regulator_match * rtq2208_ldo_match , int n_fixed )
340328{
@@ -373,24 +361,57 @@ static int rtq2208_of_get_fixed_voltage(struct device *dev,
373361 return 0 ;
374362}
375363
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+
376392static void rtq2208_init_regulator_desc (struct rtq2208_regulator_desc * rdesc , int mtp_sel ,
377393 int idx , struct of_regulator_match * rtq2208_ldo_match , int * ldo_idx )
378394{
379395 struct regulator_desc * desc ;
380396 static const struct {
381397 char * name ;
382398 int base ;
399+ int enable_reg ;
400+ int dis_reg ;
401+ int dis_mask ;
402+ int dis_on ;
403+ int vsel_mask ;
383404 } 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 ),
394415 }, * curr_info ;
395416
396417 curr_info = regulator_info + idx ;
@@ -402,39 +423,36 @@ static void rtq2208_init_regulator_desc(struct rtq2208_regulator_desc *rdesc, in
402423 desc -> owner = THIS_MODULE ;
403424 desc -> type = REGULATOR_VOLTAGE ;
404425 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 ;
406427 desc -> active_discharge_off = 0 ;
407- desc -> active_discharge_mask = RTQ2208_EN_DIS_MASK ;
408428
409429 rdesc -> mode_mask = RTQ2208_BUCK_NRMODE_MASK ;
410430
411431 if (idx >= RTQ2208_BUCK_B && idx <= RTQ2208_BUCK_E ) {
412432 /* init buck desc */
413- desc -> enable_reg = BUCK_RG_SHIFT (curr_info -> base , 2 );
414433 desc -> ops = & rtq2208_regulator_buck_ops ;
415434 desc -> vsel_reg = curr_info -> base + VSEL_SHIFT (mtp_sel );
416435 desc -> vsel_mask = RTQ2208_BUCK_NR_MTP_SEL_MASK ;
417436 desc -> n_voltages = RTQ2208_VOUT_MAXNUM ;
418437 desc -> linear_ranges = rtq2208_vout_range ;
419438 desc -> n_linear_ranges = ARRAY_SIZE (rtq2208_vout_range );
420439 desc -> ramp_reg = BUCK_RG_SHIFT (curr_info -> base , 5 );
421- desc -> active_discharge_reg = curr_info -> base ;
422440 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 ;
423444
424445 rdesc -> mode_reg = BUCK_RG_SHIFT (curr_info -> base , 2 );
425446 rdesc -> suspend_config_reg = BUCK_RG_SHIFT (curr_info -> base , 4 );
426447 rdesc -> suspend_enable_mask = RTQ2208_BUCK_EN_STR_MASK ;
427448 rdesc -> suspend_mode_mask = RTQ2208_BUCK_STRMODE_MASK ;
428449 } else {
429450 /* 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 ;
438456
439457 rdesc -> suspend_config_reg = curr_info -> base ;
440458 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 *
458476 return - ENOMEM ;
459477
460478 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 ;
461483 }
462484
463485 /* init ldo fixed_uV */
0 commit comments