@@ -62,16 +62,20 @@ enum npm1300_gpio_type {
62
62
/* nPM1300 ship register offsets */
63
63
#define SHIP_OFFSET_SHIP 0x02U
64
64
65
- #define BUCK1_ON_MASK 0x04U
66
- #define BUCK2_ON_MASK 0x40U
65
+ #define BUCK1_ON_MASK 0x04U
66
+ #define BUCK2_ON_MASK 0x40U
67
+ #define BUCK1_EN_PULLDOWN_MASK BIT(2)
68
+ #define BUCK2_EN_PULLDOWN_MASK BIT(3)
67
69
68
70
#define LDSW1_ON_MASK 0x03U
69
71
#define LDSW2_ON_MASK 0x0CU
70
72
71
- #define LDSW1_SOFTSTART_MASK 0x0CU
72
- #define LDSW1_SOFTSTART_SHIFT 2U
73
- #define LDSW2_SOFTSTART_MASK 0x30U
74
- #define LDSW2_SOFTSTART_SHIFT 4U
73
+ #define LDSW1_SOFTSTART_MASK 0x0CU
74
+ #define LDSW1_SOFTSTART_SHIFT 2U
75
+ #define LDSW1_ACTIVE_DISCHARGE_MASK BIT(6)
76
+ #define LDSW2_SOFTSTART_MASK 0x30U
77
+ #define LDSW2_SOFTSTART_SHIFT 4U
78
+ #define LDSW2_ACTIVE_DISCHARGE_MASK BIT(7)
75
79
76
80
#define NPM1300_GPIO_UNUSED UINT8_MAX
77
81
@@ -94,6 +98,7 @@ struct regulator_npm1300_config {
94
98
struct npm1300_gpio_info retention_gpios ;
95
99
struct npm1300_gpio_info pwm_gpios ;
96
100
uint8_t soft_start ;
101
+ bool active_discharge ;
97
102
bool ldo_disable_workaround ;
98
103
};
99
104
@@ -603,6 +608,32 @@ static int soft_start_set(const struct device *dev, uint8_t soft_start)
603
608
}
604
609
}
605
610
611
+ static int active_discharge_set (const struct device * dev , bool enabled )
612
+ {
613
+ const struct regulator_npm1300_config * config = dev -> config ;
614
+
615
+ switch (config -> source ) {
616
+ case NPM1300_SOURCE_BUCK1 :
617
+ return mfd_npm1300_reg_update (config -> mfd , BUCK_BASE , BUCK_OFFSET_CTRL0 ,
618
+ enabled ? BUCK1_EN_PULLDOWN_MASK : 0 ,
619
+ BUCK1_EN_PULLDOWN_MASK );
620
+ case NPM1300_SOURCE_BUCK2 :
621
+ return mfd_npm1300_reg_update (config -> mfd , BUCK_BASE , BUCK_OFFSET_CTRL0 ,
622
+ enabled ? BUCK2_EN_PULLDOWN_MASK : 0 ,
623
+ BUCK2_EN_PULLDOWN_MASK );
624
+ case NPM1300_SOURCE_LDO1 :
625
+ return mfd_npm1300_reg_update (config -> mfd , LDSW_BASE , LDSW_OFFSET_CONFIG ,
626
+ enabled ? LDSW1_ACTIVE_DISCHARGE_MASK : 0 ,
627
+ LDSW1_ACTIVE_DISCHARGE_MASK );
628
+ case NPM1300_SOURCE_LDO2 :
629
+ return mfd_npm1300_reg_update (config -> mfd , LDSW_BASE , LDSW_OFFSET_CONFIG ,
630
+ enabled ? LDSW2_ACTIVE_DISCHARGE_MASK : 0 ,
631
+ LDSW2_ACTIVE_DISCHARGE_MASK );
632
+ default :
633
+ return - ENODEV ;
634
+ }
635
+ }
636
+
606
637
int regulator_npm1300_init (const struct device * dev )
607
638
{
608
639
const struct regulator_npm1300_config * config = dev -> config ;
@@ -639,6 +670,12 @@ int regulator_npm1300_init(const struct device *dev)
639
670
}
640
671
}
641
672
673
+ /* Configure active discharge */
674
+ ret = active_discharge_set (dev , config -> active_discharge );
675
+ if (ret != 0 ) {
676
+ return ret ;
677
+ }
678
+
642
679
/* Configure GPIO pin control */
643
680
ret = regulator_npm1300_set_pin_ctrl (dev , & config -> enable_gpios , NPM1300_GPIO_TYPE_ENABLE );
644
681
if (ret != 0 ) {
@@ -690,6 +727,7 @@ static DEVICE_API(regulator, api) = {
690
727
.enable_gpios = GPIO_CONFIG_DEFINE(node_id, enable_gpio_config), \
691
728
.retention_gpios = GPIO_CONFIG_DEFINE(node_id, retention_gpio_config), \
692
729
.pwm_gpios = GPIO_CONFIG_DEFINE(node_id, pwm_gpio_config), \
730
+ .active_discharge = DT_PROP(node_id, active_discharge), \
693
731
.ldo_disable_workaround = DT_PROP(node_id, nordic_anomaly38_disable_workaround)}; \
694
732
\
695
733
DEVICE_DT_DEFINE(node_id, regulator_npm1300_init, NULL, &data_##id, &config_##id, \
0 commit comments