Skip to content

Commit e578365

Browse files
committed
[nrf fromtree] drivers: pwm: nrfx: Disable PWM peripheral when not used
Shim was not correctly disabling PWM when it was not used. Task STOP was triggered but PWM->ENABLE remained set which caused increased current. Added interrupt and enabled event handler in the nrfx driver to allow disabling PWM on STOPPED event. Signed-off-by: Krzysztof Chruściński <[email protected]> (cherry picked from commit c3a33cf)
1 parent b0c042a commit e578365

File tree

1 file changed

+12
-10
lines changed

1 file changed

+12
-10
lines changed

drivers/pwm/pwm_nrfx.c

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,13 @@ LOG_MODULE_REGISTER(pwm_nrfx, CONFIG_PWM_LOG_LEVEL);
2020
* to 0 or 1, hence the use of #if IS_ENABLED().
2121
*/
2222
#if IS_ENABLED(NRFX_PWM_NRF52_ANOMALY_109_WORKAROUND_ENABLED)
23-
#define ANOMALY_109_IRQ_CONNECT(...) IRQ_CONNECT(__VA_ARGS__)
2423
#define ANOMALY_109_EGU_IRQ_CONNECT(idx) _EGU_IRQ_CONNECT(idx)
2524
#define _EGU_IRQ_CONNECT(idx) \
2625
extern void nrfx_egu_##idx##_irq_handler(void); \
2726
IRQ_CONNECT(DT_IRQN(DT_NODELABEL(egu##idx)), \
2827
DT_IRQ(DT_NODELABEL(egu##idx), priority), \
2928
nrfx_isr, nrfx_egu_##idx##_irq_handler, 0)
3029
#else
31-
#define ANOMALY_109_IRQ_CONNECT(...)
3230
#define ANOMALY_109_EGU_IRQ_CONNECT(idx)
3331
#endif
3432

@@ -63,6 +61,12 @@ static uint16_t *seq_values_ptr_get(const struct device *dev)
6361
return (uint16_t *)config->seq.values.p_raw;
6462
}
6563

64+
static void pwm_handler(nrfx_pwm_evt_type_t event_type, void *p_context)
65+
{
66+
ARG_UNUSED(event_type);
67+
ARG_UNUSED(p_context);
68+
}
69+
6670
static bool pwm_period_check_and_set(const struct device *dev,
6771
uint32_t channel, uint32_t period_cycles)
6872
{
@@ -229,7 +233,8 @@ static int pwm_nrfx_set_cycles(const struct device *dev, uint32_t channel,
229233
* until another playback is requested (new values will be
230234
* loaded then) or the PWM peripheral is stopped.
231235
*/
232-
nrfx_pwm_simple_playback(&config->pwm, &config->seq, 1, 0);
236+
nrfx_pwm_simple_playback(&config->pwm, &config->seq, 1,
237+
NRFX_PWM_FLAG_NO_EVT_FINISHED);
233238
}
234239

235240
return 0;
@@ -256,6 +261,7 @@ static int pwm_nrfx_init(const struct device *dev)
256261
{
257262
const struct pwm_nrfx_config *config = dev->config;
258263
uint8_t initially_inverted = 0;
264+
nrfx_err_t result;
259265

260266
int ret = pinctrl_apply_state(config->pcfg, PINCTRL_STATE_DEFAULT);
261267

@@ -284,10 +290,7 @@ static int pwm_nrfx_init(const struct device *dev)
284290
seq_values_ptr_get(dev)[i] = PWM_NRFX_CH_VALUE(0, inverted);
285291
}
286292

287-
nrfx_err_t result = nrfx_pwm_init(&config->pwm,
288-
&config->initial_config,
289-
NULL,
290-
NULL);
293+
result = nrfx_pwm_init(&config->pwm, &config->initial_config, pwm_handler, dev->data);
291294
if (result != NRFX_SUCCESS) {
292295
LOG_ERR("Failed to initialize device: %s", dev->name);
293296
return -EBUSY;
@@ -377,9 +380,8 @@ static int pwm_nrfx_pm_action(const struct device *dev,
377380
}; \
378381
static int pwm_nrfx_init##idx(const struct device *dev) \
379382
{ \
380-
ANOMALY_109_IRQ_CONNECT( \
381-
DT_IRQN(PWM(idx)), DT_IRQ(PWM(idx), priority), \
382-
nrfx_isr, nrfx_pwm_##idx##_irq_handler, 0); \
383+
IRQ_CONNECT(DT_IRQN(PWM(idx)), DT_IRQ(PWM(idx), priority), \
384+
nrfx_isr, nrfx_pwm_##idx##_irq_handler, 0); \
383385
return pwm_nrfx_init(dev); \
384386
}; \
385387
PM_DEVICE_DT_DEFINE(PWM(idx), pwm_nrfx_pm_action); \

0 commit comments

Comments
 (0)