]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
pwm: Emit native configuration in /sys/kernel/debug/pwm
authorUwe Kleine-König <u.kleine-koenig@baylibre.com>
Fri, 21 Nov 2025 10:49:48 +0000 (11:49 +0100)
committerUwe Kleine-König <ukleinek@kernel.org>
Tue, 20 Jan 2026 17:38:05 +0000 (18:38 +0100)
Currently there are two abstractions for PWM drivers. Use the waveform
representation for the drivers that support it as this is more
expressive and so tells more about the actual hardware state.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com>
Link: https://patch.msgid.link/20251121104947.2652013-2-u.kleine-koenig@baylibre.com
Signed-off-by: Uwe Kleine-König <ukleinek@kernel.org>
drivers/pwm/core.c

index ec8731515333a0484b0bbdfe6befcd69e82b5fa9..41fd3a9b288373491709b78e819260474d7d3926 100644 (file)
@@ -2638,10 +2638,10 @@ static void pwm_dbg_show(struct pwm_chip *chip, struct seq_file *s)
 
        for (i = 0; i < chip->npwm; i++) {
                struct pwm_device *pwm = &chip->pwms[i];
-               struct pwm_state state, hwstate;
+               struct pwm_state state;
+               int err;
 
                pwm_get_state(pwm, &state);
-               pwm_get_state_hw(pwm, &hwstate);
 
                seq_printf(s, " pwm-%-3d (%-20.20s):", i, pwm->label);
 
@@ -2657,9 +2657,26 @@ static void pwm_dbg_show(struct pwm_chip *chip, struct seq_file *s)
                        seq_puts(s, ", usage_power");
                seq_puts(s, "\n");
 
-               seq_printf(s, "  actual configuration:    %3sabled, %llu/%llu ns, %s polarity",
-                          hwstate.enabled ? "en" : "dis", hwstate.duty_cycle, hwstate.period,
-                          hwstate.polarity ? "inverse" : "normal");
+               if (pwmchip_supports_waveform(chip)) {
+                       struct pwm_waveform wf;
+
+                       err = pwm_get_waveform_might_sleep(pwm, &wf);
+                       if (!err)
+                               seq_printf(s, "  actual configuration: %lld/%lld [+%lld]",
+                                          wf.duty_length_ns, wf.period_length_ns, wf.duty_offset_ns);
+                       else
+                               seq_printf(s, "  actual configuration: read out error: %pe\n", ERR_PTR(err));
+               } else {
+                       struct pwm_state hwstate;
+
+                       err = pwm_get_state_hw(pwm, &hwstate);
+                       if (!err)
+                               seq_printf(s, "  actual configuration:    %3sabled, %llu/%llu ns, %s polarity",
+                                          hwstate.enabled ? "en" : "dis", hwstate.duty_cycle, hwstate.period,
+                                          hwstate.polarity ? "inverse" : "normal");
+                       else
+                               seq_printf(s, "  actual configuration: read out error: %pe", ERR_PTR(err));
+               }
 
                seq_puts(s, "\n");
        }