# Copyright 2023 NXP # SPDX-License-Identifier: Apache-2.0 description: | NXP S32 eMIOS PWM node for S32 SoCs. Each channel in eMIOS can be configured to use for PWM operation. There are several PWM modes supported by this module, some modes only support on channels that have internal counter, some modes require to use a reference timebase from a master bus. For example to configuring eMIOS instance 0 with: - Channel 0 for mode OPWFMB - Channel 1 for mode OPWMB - Channel 2 for mode OPWMCB with deadtime inserted at leading edge - Channel 3 for mode SAIC, use internal timebase with input filter = 2 eMIOS clock emios0_pwm: pwm { pwm_0 { channel = <0>; pwm-mode = "OPWFMB"; prescaler = <8>; period = <65534>; duty-cycle = <32768>; polarity = "ACTIVE_HIGH"; }; pwm_1 { channel = <1>; master-bus = <&emios1_bus_a>; pwm-mode = "OPWMB"; duty-cycle = <32768>; phase-shift = <100>; polarity = "ACTIVE_LOW"; }; pwm_2 { channel = <2>; master-bus = <&emios1_bus_b>; pwm-mode = "OPWMCB_LEAD_EDGE"; duty-cycle = <32768>; dead-time = <100>; polarity = "ACTIVE_LOW"; }; pwm_3 { channel = <3>; pwm-mode = "SAIC"; prescaler = <8>; input-filter = <2>; }; }; OPWMB and OPWMCB modes use reference timebase, the master bus is chosen over phandle 'master-bus'. For OPWMB mode, PWM's period is master bus's period and is 2 * master bus's period - 2 for OPWMCB mode. Please notice that the devicetree node for master bus should be enabled and configured for using, please see 'nxp,s32-emios' bindings. compatible: "nxp,s32-emios-pwm" include: [pwm-controller.yaml, base.yaml, pinctrl-device.yaml] properties: pinctrl-0: required: true pinctrl-names: required: true "#pwm-cells": const: 3 pwm-cells: - channel # Period in terms of nanoseconds - period - flags child-binding: description: | eMIOS PWM channel configuration. properties: channel: type: int required: true description: eMIOS PWM channel master-bus: type: phandle description: | A phandle to master-bus node that will be used as external timebase for current channel, this can be bypassed if internal counter is used for PWM operation. A master bus must be used exclusively, such as if is used as a timebase for a channel in SAIC mode, do not use that master bus as a timebase for generate PWM pulse. pwm-mode: type: string required: true description: | Select PWM mode: - OPWFMB: provides waveforms with variable duty cycle and frequency, this mode uses internal counter. - OPWMB: generate pulses with programmable leading and trailing edge placement. The period is determined by period of an external counter driven in MCB Up Mode. Changing PWM period at runtime will impact to all channels share the same timebase. The new period and cycle take effect in next period boundary. - OPWMCB: generates a center aligned PWM with dead time insertion to the leading or trailing edge. The period is determined by period of an external counter driven in MCB Up Down Mode. Changing PWM period at runtime will impact to all channels share the same timebase, The new period and cycle take effect in next period boundary. - SAIC: single action input capture mode, the eMIOS captures events as soon as they occur. The value of latest captured event is stored and can be read by software. enum: - "OPWFMB" - "OPWMB" - "OPWMCB_TRAIL_EDGE" - "OPWMCB_LEAD_EDGE" - "SAIC" polarity: type: string description: | Output polarity for PWM channel. enum: - "ACTIVE_LOW" - "ACTIVE_HIGH" duty-cycle: type: int description: | Duty-cycle (in ticks) for PWM channel at boot time. period: type: int description: | Period (in ticks) for OPWFMB at boot time. Period for the rest of PWM mode depends on period's master bus. Must be in range [2 ... 65535]. freeze: type: boolean description: Freeze individual internal counter when the chip enters Debug mode. prescaler-src: type: string default: "PRESCALED_CLOCK" description: | Select clock source for internal counter prescaler. enum: - "PRESCALED_CLOCK" # Clock source = eMIOS clock / (global prescaler) - "MODULE_CLOCK" # Clock source = eMIOS clock prescaler: type: int description: | The clock divider for internal counter prescaler. enum: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] dead-time: type: int default: 0 description: | Dead time (in ticks) for PWM channel in OPWMCB mode. phase-shift: type: int default: 0 description: | Phase Shift (in ticks) for PWM channel in OPWMB mode. input-filter: type: int default: 0 enum: [0, 2, 4, 8, 16] description: | Select the minimum input pulse width, in filter clock cycles that can pass through the input filter. The filter latency - the difference in time between the input and the response is three clock edges. Default 0 means the filter is bypassed. The clock source for programmable input filter is eMIOS clock.