summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chip/npcx/pwm.c10
-rw-r--r--chip/npcx/registers.h3
2 files changed, 8 insertions, 5 deletions
diff --git a/chip/npcx/pwm.c b/chip/npcx/pwm.c
index d89ff365c3..7d3a548382 100644
--- a/chip/npcx/pwm.c
+++ b/chip/npcx/pwm.c
@@ -101,6 +101,7 @@ void pwm_set_freq(enum pwm_channel ch, uint32_t freq, uint32_t res)
void pwm_enable(enum pwm_channel ch, int enabled)
{
int mdl = pwm_channels[ch].channel;
+
/* Start or close PWM module */
UPDATE_BIT(NPCX_PWMCTL(mdl), NPCX_PWMCTL_PWR, enabled);
}
@@ -189,7 +190,7 @@ void pwm_config(enum pwm_channel ch)
int mdl = pwm_channels[ch].channel;
/* Disable PWM for module configuration */
- pwm_enable(mdl, 0);
+ pwm_enable(ch, 0);
/* Set PWM heartbeat mode is no heartbeat */
SET_FIELD(NPCX_PWMCTL(mdl), NPCX_PWMCTL_HB_DC_CTL_FIELD,
@@ -220,9 +221,12 @@ void pwm_config(enum pwm_channel ch)
static void pwm_init(void)
{
int i;
+ uint8_t pd_mask = 0;
- /* Enable the PWM module and delay a few clocks */
- clock_enable_peripheral(CGC_OFFSET_PWM, CGC_PWM_MASK, CGC_MODE_ALL);
+ /* Take enabled PWMs out of power-down state */
+ for (i = 0; i < PWM_CH_COUNT; i++)
+ pd_mask |= (1 << pwm_channels[i].channel);
+ clock_enable_peripheral(CGC_OFFSET_PWM, pd_mask, CGC_MODE_ALL);
for (i = 0; i < PWM_CH_COUNT; i++)
pwm_config(i);
diff --git a/chip/npcx/registers.h b/chip/npcx/registers.h
index 3d5317f02c..011977d24e 100644
--- a/chip/npcx/registers.h
+++ b/chip/npcx/registers.h
@@ -774,12 +774,11 @@ enum NPCX_PMC_PWDWN_CTL_T {
NPCX_PMC_PWDWN_6 = 5,
};
+/* TODO: set PD masks based upon actual peripheral usage */
#define CGC_KBS_MASK (1 << NPCX_PWDWN_CTL1_KBS_PD)
#define CGC_UART_MASK (1 << NPCX_PWDWN_CTL1_UART_PD)
#define CGC_FAN_MASK (1 << NPCX_PWDWN_CTL1_MFT1_PD)
#define CGC_FIU_MASK (1 << NPCX_PWDWN_CTL1_FIU_PD)
-#define CGC_PWM_MASK ((1 << NPCX_PWDWN_CTL2_PWM0_PD) | \
- (1 << NPCX_PWDWN_CTL2_PWM1_PD))
#define CGC_I2C_MASK ((1 << NPCX_PWDWN_CTL3_SMB0_PD) | \
(1 << NPCX_PWDWN_CTL3_SMB1_PD) | \
(1 << NPCX_PWDWN_CTL3_SMB2_PD) | \