From 15a83fe0a0a5c1b59b030f5869e2461774ce5271 Mon Sep 17 00:00:00 2001 From: Grixa Yrev Date: Wed, 14 Dec 2022 22:37:00 +0300 Subject: [PATCH] drivers: pwm: pwm_mcux: Reload mode option DTS property "nxp,reload" selects how to load the buffered-registers with new values. Signed-off-by: Grixa Yrev --- drivers/pwm/pwm_mcux.c | 10 ++++++++-- dts/bindings/pwm/nxp,imx-pwm.yaml | 14 ++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/drivers/pwm/pwm_mcux.c b/drivers/pwm/pwm_mcux.c index 1f9f5da8358..9814f767679 100644 --- a/drivers/pwm/pwm_mcux.c +++ b/drivers/pwm/pwm_mcux.c @@ -25,6 +25,7 @@ struct pwm_mcux_config { const struct device *clock_dev; clock_control_subsys_t clock_subsys; pwm_clock_prescale_t prescale; + pwm_register_reload_t reload; pwm_mode_t mode; bool run_wait; bool run_debug; @@ -80,7 +81,7 @@ static int mcux_pwm_set_cycles(const struct device *dev, uint32_t channel, data->period_cycles[channel] = period_cycles; - LOG_DBG("SETUP dutycycle to %u\n", duty_cycle); + LOG_DBG("SETUP dutycycle to %u", duty_cycle); if (clock_control_get_rate(config->clock_dev, config->clock_subsys, &clock_freq)) { @@ -153,9 +154,12 @@ static int pwm_mcux_init(const struct device *dev) return err; } + LOG_DBG("Set prescaler %d, reload mode %d", + 1 << config->prescale, config->reload); + PWM_GetDefaultConfig(&pwm_config); pwm_config.prescale = config->prescale; - pwm_config.reloadLogic = kPWM_ReloadPwmFullCycle; + pwm_config.reloadLogic = config->reload; pwm_config.clockSource = kPWM_BusClock; pwm_config.enableDebugMode = config->run_debug; pwm_config.enableWait = config->run_wait; @@ -193,6 +197,8 @@ static const struct pwm_driver_api pwm_mcux_driver_api = { .index = DT_INST_PROP(n, index), \ .mode = kPWM_EdgeAligned, \ .prescale = _CONCAT(kPWM_Prescale_Divide_, DT_INST_PROP(n, nxp_prescaler)),\ + .reload = DT_ENUM_IDX_OR(DT_DRV_INST(n), nxp_reload,\ + kPWM_ReloadPwmFullCycle),\ .clock_dev = DEVICE_DT_GET(DT_INST_CLOCKS_CTLR(n)), \ .clock_subsys = (clock_control_subsys_t)DT_INST_CLOCKS_CELL(n, name),\ .run_wait = DT_INST_PROP(n, run_in_wait), \ diff --git a/dts/bindings/pwm/nxp,imx-pwm.yaml b/dts/bindings/pwm/nxp,imx-pwm.yaml index 1863054ac8a..c8730ac27f0 100644 --- a/dts/bindings/pwm/nxp,imx-pwm.yaml +++ b/dts/bindings/pwm/nxp,imx-pwm.yaml @@ -33,6 +33,20 @@ properties: description: | Clock prescaler at the input of the PWM. + nxp,reload: + type: string + enum: + - "immediate" + - "half-cycle" + - "full-cycle" + - "half-and-full-cycle" + description: | + Select how to load the buffered-registers with new values: + "immediate" - buffered-registers get loaded with new values as soon as LDOK bit is set; + "half-cycle" - registers loaded on a PWM half cycle; + "full-cycle" - registers loaded on a PWM full cycle; + "half-and-full-cycle" - registers loaded on a PWM half & full cycle. + "#pwm-cells": const: 2