diff --git a/drivers/pwm/pwm_nrf5_sw.c b/drivers/pwm/pwm_nrf5_sw.c index b48db8dd7cb..6e3cbb5fdd9 100644 --- a/drivers/pwm/pwm_nrf5_sw.c +++ b/drivers/pwm/pwm_nrf5_sw.c @@ -16,11 +16,22 @@ #include LOG_MODULE_REGISTER(pwm_nrf5_sw); +BUILD_ASSERT(DT_INST_NODE_HAS_PROP(0, timer_instance) != + DT_INST_NODE_HAS_PROP(0, generator), + "Please define either the timer-instance or generator property, but not both"); + +#if DT_INST_NODE_HAS_PROP(0, timer_instance) +#define GENERATOR_ADDR _CONCAT(NRF_TIMER, DT_INST_PROP(0, timer_instance)) +#define GENERATOR_CC_NUM \ + _CONCAT(_CONCAT(TIMER, DT_INST_PROP(0, timer_instance)), _CC_NUM) +#else /* DT_INST_NODE_HAS_PROP(0, timer_instance) */ +#define GENERATOR_NODE DT_PHANDLE(DT_DRV_INST(0), generator) +#define GENERATOR_ADDR ((NRF_TIMER_Type *) DT_REG_ADDR(GENERATOR_NODE)) +#define GENERATOR_CC_NUM DT_PROP(GENERATOR_NODE, cc_num) +#endif /* DT_INST_NODE_HAS_PROP(0, timer_instance) */ + /* One compare channel is needed to set the PWM period, hence +1. */ -#if ((DT_INST_PROP(0, channel_count) + 1) > \ - (_CONCAT( \ - _CONCAT(TIMER, DT_INST_PROP(0, timer_instance)), \ - _CC_NUM))) +#if ((DT_INST_PROP(0, channel_count) + 1) > GENERATOR_CC_NUM) #error "Invalid number of PWM channels configured." #endif #define PWM_0_MAP_SIZE DT_INST_PROP(0, channel_count) @@ -257,7 +268,7 @@ static int pwm_nrf5_sw_init(const struct device *dev) } static const struct pwm_config pwm_nrf5_sw_0_config = { - .timer = _CONCAT(NRF_TIMER, DT_INST_PROP(0, timer_instance)), + .timer = GENERATOR_ADDR, .ppi_base = DT_INST_PROP(0, ppi_base), .gpiote_base = DT_INST_PROP(0, gpiote_base), .map_size = PWM_0_MAP_SIZE, diff --git a/dts/arm/nordic/nrf51822.dtsi b/dts/arm/nordic/nrf51822.dtsi index 4d5e0bdd047..5ff092a6adb 100644 --- a/dts/arm/nordic/nrf51822.dtsi +++ b/dts/arm/nordic/nrf51822.dtsi @@ -231,7 +231,7 @@ &sw_pwm { - timer-instance = <1>; + generator = <&timer1>; channel-count = <3>; clock-prescaler = <0>; ppi-base = <7>; diff --git a/dts/arm/nordic/nrf52805.dtsi b/dts/arm/nordic/nrf52805.dtsi index f16c892274d..c1bfd3541da 100644 --- a/dts/arm/nordic/nrf52805.dtsi +++ b/dts/arm/nordic/nrf52805.dtsi @@ -219,7 +219,7 @@ }; &sw_pwm { - timer-instance = <2>; + generator = <&timer2>; channel-count = <3>; clock-prescaler = <0>; ppi-base = <7>; diff --git a/dts/arm/nordic/nrf52810.dtsi b/dts/arm/nordic/nrf52810.dtsi index ec289234ab9..7030a266ba0 100644 --- a/dts/arm/nordic/nrf52810.dtsi +++ b/dts/arm/nordic/nrf52810.dtsi @@ -221,7 +221,7 @@ }; &sw_pwm { - timer-instance = <2>; + generator = <&timer2>; channel-count = <3>; clock-prescaler = <0>; ppi-base = <14>; diff --git a/dts/arm/nordic/nrf52811.dtsi b/dts/arm/nordic/nrf52811.dtsi index a3337488ecf..6e764d8337c 100644 --- a/dts/arm/nordic/nrf52811.dtsi +++ b/dts/arm/nordic/nrf52811.dtsi @@ -244,7 +244,7 @@ }; &sw_pwm { - timer-instance = <2>; + generator = <&timer2>; channel-count = <3>; clock-prescaler = <0>; ppi-base = <14>; diff --git a/dts/arm/nordic/nrf52820.dtsi b/dts/arm/nordic/nrf52820.dtsi index 765dc88aeb2..2ce680ee757 100644 --- a/dts/arm/nordic/nrf52820.dtsi +++ b/dts/arm/nordic/nrf52820.dtsi @@ -255,7 +255,7 @@ }; &sw_pwm { - timer-instance = <2>; + generator = <&timer2>; channel-count = <3>; clock-prescaler = <0>; ppi-base = <14>; diff --git a/dts/arm/nordic/nrf52832.dtsi b/dts/arm/nordic/nrf52832.dtsi index 04a5f9f2dfc..b230753a94f 100644 --- a/dts/arm/nordic/nrf52832.dtsi +++ b/dts/arm/nordic/nrf52832.dtsi @@ -319,7 +319,7 @@ }; &sw_pwm { - timer-instance = <2>; + generator = <&timer2>; channel-count = <3>; clock-prescaler = <0>; ppi-base = <14>; diff --git a/dts/arm/nordic/nrf52833.dtsi b/dts/arm/nordic/nrf52833.dtsi index e9d0ff4fd10..b9c6c6804f2 100644 --- a/dts/arm/nordic/nrf52833.dtsi +++ b/dts/arm/nordic/nrf52833.dtsi @@ -375,7 +375,7 @@ }; &sw_pwm { - timer-instance = <2>; + generator = <&timer2>; channel-count = <3>; clock-prescaler = <0>; ppi-base = <14>; diff --git a/dts/arm/nordic/nrf52840.dtsi b/dts/arm/nordic/nrf52840.dtsi index 956ec7bbc8d..dcd3f151aa9 100644 --- a/dts/arm/nordic/nrf52840.dtsi +++ b/dts/arm/nordic/nrf52840.dtsi @@ -396,7 +396,7 @@ }; &sw_pwm { - timer-instance = <2>; + generator = <&timer2>; channel-count = <3>; clock-prescaler = <0>; ppi-base = <14>; diff --git a/dts/bindings/pwm/nordic,nrf-sw-pwm.yaml b/dts/bindings/pwm/nordic,nrf-sw-pwm.yaml index 4ac833b2fe5..04b7e688990 100644 --- a/dts/bindings/pwm/nordic,nrf-sw-pwm.yaml +++ b/dts/bindings/pwm/nordic,nrf-sw-pwm.yaml @@ -5,10 +5,18 @@ compatible: "nordic,nrf-sw-pwm" include: [pwm-controller.yaml, base.yaml] properties: + generator: + type: phandle + description: Reference to TIMER instance for generating PWM output signals + required: false + timer-instance: type: int - description: Timer instance to use for generating the PWM output signals - required: true + description: | + Timer instance to use for generating the PWM output signals. Deprecated + in favour of 'generator' property. + required: false + deprecated: true channel-count: type: int