diff options
-rw-r--r-- | chip/npcx/pwm.c | 24 | ||||
-rw-r--r-- | chip/npcx/pwm_chip.h | 3 | ||||
-rw-r--r-- | include/pwm.h | 6 |
3 files changed, 12 insertions, 21 deletions
diff --git a/chip/npcx/pwm.c b/chip/npcx/pwm.c index b452b00beb..13af516bb9 100644 --- a/chip/npcx/pwm.c +++ b/chip/npcx/pwm.c @@ -55,7 +55,7 @@ enum npcx_pwm_heartbeat_mode { * @param freq desired PWM frequency * @notes changed when initialization */ -void pwm_set_freq(enum pwm_channel ch, uint32_t freq) +static void pwm_set_freq(enum pwm_channel ch, uint32_t freq) { int mdl = pwm_channels[ch].channel; uint32_t clock; @@ -78,8 +78,11 @@ void pwm_set_freq(enum pwm_channel ch, uint32_t freq) /* Calculate prescaler */ pre = DIV_ROUND_UP(clock, (0xffff * freq)); - /* Calculate maximum resolution for the given freq. and prescaler */ - pwm_res[ch] = (clock / pre) / freq; + /* + * Calculate maximum resolution for the given freq. and prescaler. And + * prevent it exceed the resolution of CTR/DCR registers. + */ + pwm_res[ch] = MIN((clock / pre) / freq, NPCX_PWM_MAX_RAW_DUTY); /* Set PWM prescaler. */ NPCX_PRSC(mdl) = pre - 1; @@ -96,7 +99,6 @@ void pwm_set_freq(enum pwm_channel ch, uint32_t freq) * * @param ch operation channel * @param enabled enabled flag - * @return none */ void pwm_enable(enum pwm_channel ch, int enabled) { @@ -123,7 +125,6 @@ int pwm_get_enabled(enum pwm_channel ch) * * @param ch operation channel * @param percent duty cycle percent - * @return none */ void pwm_set_duty(enum pwm_channel ch, int percent) { @@ -136,7 +137,6 @@ void pwm_set_duty(enum pwm_channel ch, int percent) * * @param ch operation channel * @param duty cycle duty - * @return none */ void pwm_set_raw_duty(enum pwm_channel ch, uint16_t duty) { @@ -155,10 +155,8 @@ void pwm_set_raw_duty(enum pwm_channel ch, uint16_t duty) /* duty ranges from 0 - 0xffff, so scale down to 0 - pwm_res[ch] */ sd = DIV_ROUND_NEAREST(duty * pwm_res[ch], EC_PWM_MAX_DUTY); - /* Set the duty cycle */ - NPCX_DCR(mdl) = (uint16_t)sd; - - pwm_enable(ch, !!duty); + /* Set the duty cycle. If it is zero, set DCR > CTR */ + NPCX_DCR(mdl) = sd ? sd : NPCX_PWM_MAX_RAW_DUTY + 1; } /** @@ -184,7 +182,7 @@ uint16_t pwm_get_raw_duty(enum pwm_channel ch) int mdl = pwm_channels[ch].channel; /* Return duty */ - if (!pwm_get_enabled(ch)) + if (NPCX_DCR(mdl) > NPCX_CTR(mdl)) return 0; else /* @@ -199,7 +197,6 @@ uint16_t pwm_get_raw_duty(enum pwm_channel ch) * PWM configuration. * * @param ch operation channel - * @return none */ void pwm_config(enum pwm_channel ch) { @@ -233,9 +230,6 @@ void pwm_config(enum pwm_channel ch) /** * PWM initial. - * - * @param none - * @return none */ static void pwm_init(void) { diff --git a/chip/npcx/pwm_chip.h b/chip/npcx/pwm_chip.h index c73855916f..3a658f5d62 100644 --- a/chip/npcx/pwm_chip.h +++ b/chip/npcx/pwm_chip.h @@ -21,4 +21,7 @@ struct pwm_t { extern const struct pwm_t pwm_channels[]; void pwm_config(enum pwm_channel ch); +/* Npcx PWM maximum duty cycle value */ +#define NPCX_PWM_MAX_RAW_DUTY (UINT16_MAX - 1) + #endif /* __CROS_EC_PWM_CHIP_H */ diff --git a/include/pwm.h b/include/pwm.h index 24b89332fc..15413c537c 100644 --- a/include/pwm.h +++ b/include/pwm.h @@ -20,12 +20,6 @@ void pwm_enable(enum pwm_channel ch, int enabled); int pwm_get_enabled(enum pwm_channel ch); /** - * Set PWM channel frequency (Hz). - * PWM will be disabled until the duty is set. - */ -void pwm_set_freq(enum pwm_channel ch, uint32_t freq); - -/** * Set PWM channel duty cycle (0-65535). */ void pwm_set_raw_duty(enum pwm_channel ch, uint16_t duty); |