# Copyright (c) 2023 SLB # SPDX-License-Identifier: Apache-2.0 description: | Infineon XMC4XXX PWM Capture Compare Unit 8 (CCU8) module The PWM CCU8 module can automatically generate a high-side and a low-side PWM signal, where the two signals are complementary to each other. The module supports adding a dead time between the high-side and low-side PWM signals. The dead time ensures that there is a delay before the PWM state transitions from 0 to 1, preventing the high-side and low-side switches from being on simultaneously. There are two CCU8 modules with DTS node labels: pwm_ccu80 and pwm_ccu81. Each module has four slices, and each slice has two channels. A channel consists of a corresponding high-side and low-side PWM signal. The CCU8 modules use the CCU clock source. Each slice applies a separate prescaler to divide the clock. The clock divider is defined by the 'slice-prescaler' property. Additionally, each slice has a dead time prescaler, which divides the slice clock for the dead time counter. Device tree example: A node can define a 'pwm' field, usually referenced in a 'pwms' property, where the entries include the PWM module phandle, channel number, pulse period (in nanoseconds or set using PWM_XX() macros), and a channel flag (PWM_POLARITY_NORMAL/PWM_POLARITY_INVERTED). The 'pwm_ccu8' node must define the following fields: &pwm_ccu80 { slice-prescaler = <15 15 15 15>; slice-deadtime-prescaler = <3 3 3 3>; channel-deadtime-high = <0 0 0 0 PWM_MSEC(100) 0 0 0>; channel-deadtime-low = <0 0 0 0 PWM_MSEC(100) 0 0 0>; pinctrl-0 = <&pwm_out_p5_9_ccu80_ch4_high &pwm_out_p0_0_ccu80_ch4_low>; pinctrl-names = "default"; }; This will configure channel 4 with a 100msec deadtime on the high and low side PWM signals. Another node can reference the PWM as follows: &test_node { ... pwms = <&pwm_ccu80 0 PWM_SEC(1) PWM_POLARITY_NORMAL>; ... }; The 'pwm_out_p{PORT}_{PIN}_ccu8{MODULE_IDX}_ch{CHANNEL_IDX}_{HIGH_LOW}' format is used for CCU8 pinctrl nodes. 'MODULE_IDX' and 'CHANNEL_IDX' refer to a specific 'pwm_ccu8x' module and channel, respectively. 'PORT/PIN' defines the GPIO that the channel connects to. 'HIGH_LOW' indicates whether the pin is for the high or low-side signal. It's not necessary to specify both the high and low pinctrls. Only the low-side signal can, for example, be used as PWM, but note that the duty cycle of the low signal will be (1 - duty) as set via the API. Note that a slice has two channels. Channels 0/1 are in slice 0, channels 2/3 are in slice 1, and so on. Each channel can have its own duty cycle and high/low dead times. But the pulse duration applies to both channels. Thus, when using the PWM control api to modify the pulse width on a channel 0, it will also be updated for channel 1 since they are in the same slice. compatible: "infineon,xmc4xxx-ccu8-pwm" include: - name: base.yaml - name: pwm-controller.yaml - name: pinctrl-device.yaml properties: reg: required: true pinctrl-0: required: true pinctrl-names: required: true slice-prescaler: type: array required: true description: | Defines the clock divider for each slice. The entry in the array will divide CCU clock by (2 << value). The range for the prescaler values is [0, 15]. Reducing prescaler value will improve resolution but decrease the maximum period. slice-deadtime-prescaler: type: array required: true description: | Defines the clock divider for dead time counter for each slice. The range for the values is [0, 3]. Reducing prescaler value will improve dead time resolution but decrease the maximum dead time. channel-deadtime-high: type: array required: true description: | Defines the dead time in nanoseconds for the high-side PWM signal for each channel. channel-deadtime-low: type: array required: true description: | Defines the dead time in nanoseconds for the low-side PWM signal for each channel. "#pwm-cells": const: 3 pwm-cells: - channel - period - flags