blob: 0b8a2ffc674ac435dbb4c4f015645504cfdf6eb1 [file] [log] [blame]
# 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.