From 5b8efdc115a62698b030194933606cf3563e96f9 Mon Sep 17 00:00:00 2001 From: Nikodem Kastelik Date: Tue, 23 Apr 2024 11:46:34 +0200 Subject: [PATCH 1/4] [nrf fromtree] dts: bindings: pwm: nordic: add memory-region support This property will allow PWM driver allocate data buffer in appropriate memory region. Signed-off-by: Nikodem Kastelik (cherry picked from commit a6f57fae0b14992474ab1c757b2aee4fc1cefe82) --- dts/bindings/pwm/nordic,nrf-pwm.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dts/bindings/pwm/nordic,nrf-pwm.yaml b/dts/bindings/pwm/nordic,nrf-pwm.yaml index 9f2c21d2b35..e634cdee6d0 100644 --- a/dts/bindings/pwm/nordic,nrf-pwm.yaml +++ b/dts/bindings/pwm/nordic,nrf-pwm.yaml @@ -2,7 +2,7 @@ description: nRF PWM compatible: "nordic,nrf-pwm" -include: [pwm-controller.yaml, base.yaml, pinctrl-device.yaml] +include: [pwm-controller.yaml, base.yaml, pinctrl-device.yaml, memory-region.yaml] properties: reg: From ea441e43b841d2fa377ae687a0396ee999c9fb68 Mon Sep 17 00:00:00 2001 From: Nikodem Kastelik Date: Tue, 23 Apr 2024 11:48:22 +0200 Subject: [PATCH 2/4] [nrf fromtree] drivers: pwm_nrfx: place data buf in correct mem reg Some devices (like nRF54H20) must have PWM data buffer stored in appropriate location. Signed-off-by: Nikodem Kastelik (cherry picked from commit e0b98dccd1df710e1e4bfe0a475273508a01bd6d) --- drivers/pwm/pwm_nrfx.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/drivers/pwm/pwm_nrfx.c b/drivers/pwm/pwm_nrfx.c index 9feacb2c10b..f6312535c7e 100644 --- a/drivers/pwm/pwm_nrfx.c +++ b/drivers/pwm/pwm_nrfx.c @@ -10,6 +10,7 @@ #include #include #include +#include #include @@ -45,7 +46,6 @@ struct pwm_nrfx_config { struct pwm_nrfx_data { uint32_t period_cycles; - uint16_t seq_values[NRF_PWM_CHANNEL_COUNT]; /* Bit mask indicating channels that need the PWM generation. */ uint8_t pwm_needed; uint8_t prescaler; @@ -56,6 +56,12 @@ struct pwm_nrfx_data { #error "Current implementation supports maximum 8 channels." #endif +static uint16_t *seq_values_ptr_get(const struct device *dev) +{ + const struct pwm_nrfx_config *config = dev->config; + + return (uint16_t *)config->seq.values.p_raw; +} static bool pwm_period_check_and_set(const struct device *dev, uint32_t channel, uint32_t period_cycles) @@ -164,7 +170,7 @@ static int pwm_nrfx_set_cycles(const struct device *dev, uint32_t channel, needs_pwm = true; } - data->seq_values[channel] = PWM_NRFX_CH_VALUE(compare_value, inverted); + seq_values_ptr_get(dev)[channel] = PWM_NRFX_CH_VALUE(compare_value, inverted); LOG_DBG("channel %u, pulse %u, period %u, prescaler: %u.", channel, pulse_cycles, period_cycles, data->prescaler); @@ -249,7 +255,6 @@ static const struct pwm_driver_api pwm_nrfx_drv_api_funcs = { static int pwm_nrfx_init(const struct device *dev) { const struct pwm_nrfx_config *config = dev->config; - struct pwm_nrfx_data *data = dev->data; uint8_t initially_inverted = 0; int ret = pinctrl_apply_state(config->pcfg, PINCTRL_STATE_DEFAULT); @@ -260,7 +265,7 @@ static int pwm_nrfx_init(const struct device *dev) return ret; } - for (size_t i = 0; i < ARRAY_SIZE(data->seq_values); i++) { + for (size_t i = 0; i < NRF_PWM_CHANNEL_COUNT; i++) { uint32_t psel; if (channel_psel_get(i, &psel, config)) { @@ -273,10 +278,10 @@ static int pwm_nrfx_init(const struct device *dev) } } - for (size_t i = 0; i < ARRAY_SIZE(data->seq_values); i++) { + for (size_t i = 0; i < NRF_PWM_CHANNEL_COUNT; i++) { bool inverted = initially_inverted & BIT(i); - data->seq_values[i] = PWM_NRFX_CH_VALUE(0, inverted); + seq_values_ptr_get(dev)[i] = PWM_NRFX_CH_VALUE(0, inverted); } nrfx_err_t result = nrfx_pwm_init(&config->pwm, @@ -339,10 +344,19 @@ static int pwm_nrfx_pm_action(const struct device *dev, #define PWM(dev_idx) DT_NODELABEL(pwm##dev_idx) #define PWM_PROP(dev_idx, prop) DT_PROP(PWM(dev_idx), prop) +#define PWM_HAS_PROP(idx, prop) DT_NODE_HAS_PROP(PWM(idx), prop) + +#define PWM_MEMORY_SECTION(idx) \ + COND_CODE_1(PWM_HAS_PROP(idx, memory_regions), \ + (__attribute__((__section__(LINKER_DT_NODE_REGION_NAME( \ + DT_PHANDLE(PWM(idx), memory_regions)))))), \ + ()) #define PWM_NRFX_DEVICE(idx) \ NRF_DT_CHECK_NODE_HAS_PINCTRL_SLEEP(PWM(idx)); \ static struct pwm_nrfx_data pwm_nrfx_##idx##_data; \ + static uint16_t pwm_##idx##_seq_values[NRF_PWM_CHANNEL_COUNT] \ + PWM_MEMORY_SECTION(idx); \ PINCTRL_DT_DEFINE(PWM(idx)); \ static const struct pwm_nrfx_config pwm_nrfx_##idx##_config = { \ .pwm = NRFX_PWM_INSTANCE(idx), \ @@ -357,7 +371,7 @@ static int pwm_nrfx_pm_action(const struct device *dev, .load_mode = NRF_PWM_LOAD_INDIVIDUAL, \ .step_mode = NRF_PWM_STEP_TRIGGERED, \ }, \ - .seq.values.p_raw = pwm_nrfx_##idx##_data.seq_values, \ + .seq.values.p_raw = pwm_##idx##_seq_values, \ .seq.length = NRF_PWM_CHANNEL_COUNT, \ .pcfg = PINCTRL_DT_DEV_CONFIG_GET(PWM(idx)), \ }; \ From ca508dabe536cc60f0a50a9d24e0b42301d57d3b Mon Sep 17 00:00:00 2001 From: Nikodem Kastelik Date: Tue, 23 Apr 2024 11:50:01 +0200 Subject: [PATCH 3/4] [nrf fromtree] tests: drivers: pwm: nrf54h20dk: add memory-region prop This property will ensure that PWM driver allocates data buffer in appropriate location. Signed-off-by: Nikodem Kastelik (cherry picked from commit 539a428032aa6bcb27d3de721adf0c74a6c7c0e7) --- .../pwm/pwm_api/boards/nrf54h20dk_nrf54h20_cpuapp.overlay | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/drivers/pwm/pwm_api/boards/nrf54h20dk_nrf54h20_cpuapp.overlay b/tests/drivers/pwm/pwm_api/boards/nrf54h20dk_nrf54h20_cpuapp.overlay index c483d27f569..6944718f64d 100644 --- a/tests/drivers/pwm/pwm_api/boards/nrf54h20dk_nrf54h20_cpuapp.overlay +++ b/tests/drivers/pwm/pwm_api/boards/nrf54h20dk_nrf54h20_cpuapp.overlay @@ -17,4 +17,5 @@ pinctrl-0 = <&pwm_default>; pinctrl-1 = <&pwm_sleep>; pinctrl-names = "default", "sleep"; + memory-regions = <&cpuapp_dma_region>; }; From f9d1bc28c755587eb3cd2befe3df1df0156b1bdc Mon Sep 17 00:00:00 2001 From: Nikodem Kastelik Date: Thu, 25 Apr 2024 08:57:08 +0200 Subject: [PATCH 4/4] [nrf fromtree] boards: nordic: nrf54h20: add PWM to supported features PWM is now supported on nRF54H20 board. Signed-off-by: Nikodem Kastelik (cherry picked from commit 82db5d3adbadcebc6bb979f8da9c1d47cbe868f4) --- boards/nordic/nrf54h20dk/nrf54h20dk_nrf54h20_cpuapp.yaml | 1 + boards/nordic/nrf54h20dk/nrf54h20dk_nrf54h20_cpuppr.yaml | 1 + boards/nordic/nrf54h20dk/nrf54h20dk_nrf54h20_cpurad.yaml | 1 + 3 files changed, 3 insertions(+) diff --git a/boards/nordic/nrf54h20dk/nrf54h20dk_nrf54h20_cpuapp.yaml b/boards/nordic/nrf54h20dk/nrf54h20dk_nrf54h20_cpuapp.yaml index 0ba6bfe3ba2..6ecde2cfdb1 100644 --- a/boards/nordic/nrf54h20dk/nrf54h20dk_nrf54h20_cpuapp.yaml +++ b/boards/nordic/nrf54h20dk/nrf54h20dk_nrf54h20_cpuapp.yaml @@ -13,3 +13,4 @@ ram: 256 flash: 512 supported: - gpio + - pwm diff --git a/boards/nordic/nrf54h20dk/nrf54h20dk_nrf54h20_cpuppr.yaml b/boards/nordic/nrf54h20dk/nrf54h20dk_nrf54h20_cpuppr.yaml index b986a456623..190d835f580 100644 --- a/boards/nordic/nrf54h20dk/nrf54h20dk_nrf54h20_cpuppr.yaml +++ b/boards/nordic/nrf54h20dk/nrf54h20dk_nrf54h20_cpuppr.yaml @@ -11,3 +11,4 @@ ram: 62 flash: 62 supported: - gpio + - pwm diff --git a/boards/nordic/nrf54h20dk/nrf54h20dk_nrf54h20_cpurad.yaml b/boards/nordic/nrf54h20dk/nrf54h20dk_nrf54h20_cpurad.yaml index 420d854cbca..b199f65385f 100644 --- a/boards/nordic/nrf54h20dk/nrf54h20dk_nrf54h20_cpurad.yaml +++ b/boards/nordic/nrf54h20dk/nrf54h20dk_nrf54h20_cpurad.yaml @@ -13,3 +13,4 @@ ram: 192 flash: 256 supported: - gpio + - pwm