Skip to content

Commit 1afd01d

Browse files
ukleinekUwe Kleine-König
authored andcommitted
pwm: Add tracing for waveform callbacks
This adds trace events for the recently introduced waveform callbacks. With the introduction of some helper macros consistency among the different events is ensured. Signed-off-by: Uwe Kleine-König <[email protected]> Link: https://lore.kernel.org/r/1d71879b0de3bf01459c7a9d0f040d43eb5ace56.1726819463.git.u.kleine-koenig@baylibre.com Signed-off-by: Uwe Kleine-König <[email protected]>
1 parent 6c5126c commit 1afd01d

File tree

2 files changed

+146
-12
lines changed

2 files changed

+146
-12
lines changed

drivers/pwm/core.c

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -164,30 +164,46 @@ static int __pwm_round_waveform_tohw(struct pwm_chip *chip, struct pwm_device *p
164164
const struct pwm_waveform *wf, void *wfhw)
165165
{
166166
const struct pwm_ops *ops = chip->ops;
167+
int ret;
168+
169+
ret = ops->round_waveform_tohw(chip, pwm, wf, wfhw);
170+
trace_pwm_round_waveform_tohw(pwm, wf, wfhw, ret);
167171

168-
return ops->round_waveform_tohw(chip, pwm, wf, wfhw);
172+
return ret;
169173
}
170174

171175
static int __pwm_round_waveform_fromhw(struct pwm_chip *chip, struct pwm_device *pwm,
172176
const void *wfhw, struct pwm_waveform *wf)
173177
{
174178
const struct pwm_ops *ops = chip->ops;
179+
int ret;
180+
181+
ret = ops->round_waveform_fromhw(chip, pwm, wfhw, wf);
182+
trace_pwm_round_waveform_fromhw(pwm, wfhw, wf, ret);
175183

176-
return ops->round_waveform_fromhw(chip, pwm, wfhw, wf);
184+
return ret;
177185
}
178186

179187
static int __pwm_read_waveform(struct pwm_chip *chip, struct pwm_device *pwm, void *wfhw)
180188
{
181189
const struct pwm_ops *ops = chip->ops;
190+
int ret;
191+
192+
ret = ops->read_waveform(chip, pwm, wfhw);
193+
trace_pwm_read_waveform(pwm, wfhw, ret);
182194

183-
return ops->read_waveform(chip, pwm, wfhw);
195+
return ret;
184196
}
185197

186198
static int __pwm_write_waveform(struct pwm_chip *chip, struct pwm_device *pwm, const void *wfhw)
187199
{
188200
const struct pwm_ops *ops = chip->ops;
201+
int ret;
202+
203+
ret = ops->write_waveform(chip, pwm, wfhw);
204+
trace_pwm_write_waveform(pwm, wfhw, ret);
189205

190-
return ops->write_waveform(chip, pwm, wfhw);
206+
return ret;
191207
}
192208

193209
#define WFHWSIZE 20

include/trace/events/pwm.h

Lines changed: 126 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,34 +8,152 @@
88
#include <linux/pwm.h>
99
#include <linux/tracepoint.h>
1010

11+
#define TP_PROTO_pwm(args...) \
12+
TP_PROTO(struct pwm_device *pwm, args)
13+
14+
#define TP_ARGS_pwm(args...) \
15+
TP_ARGS(pwm, args)
16+
17+
#define TP_STRUCT__entry_pwm(args...) \
18+
TP_STRUCT__entry( \
19+
__field(unsigned int, chipid) \
20+
__field(unsigned int, hwpwm) \
21+
args)
22+
23+
#define TP_fast_assign_pwm(args...) \
24+
TP_fast_assign( \
25+
__entry->chipid = pwm->chip->id; \
26+
__entry->hwpwm = pwm->hwpwm; \
27+
args)
28+
29+
#define TP_printk_pwm(fmt, args...) \
30+
TP_printk("pwmchip%u.%u: " fmt, __entry->chipid, __entry->hwpwm, args)
31+
32+
#define __field_pwmwf(wf) \
33+
__field(u64, wf ## _period_length_ns) \
34+
__field(u64, wf ## _duty_length_ns) \
35+
__field(u64, wf ## _duty_offset_ns) \
36+
37+
#define fast_assign_pwmwf(wf) \
38+
__entry->wf ## _period_length_ns = wf->period_length_ns; \
39+
__entry->wf ## _duty_length_ns = wf->duty_length_ns; \
40+
__entry->wf ## _duty_offset_ns = wf->duty_offset_ns
41+
42+
#define printk_pwmwf_format(wf) \
43+
"%lld/%lld [+%lld]"
44+
45+
#define printk_pwmwf_formatargs(wf) \
46+
__entry->wf ## _duty_length_ns, __entry->wf ## _period_length_ns, __entry->wf ## _duty_offset_ns
47+
48+
TRACE_EVENT(pwm_round_waveform_tohw,
49+
50+
TP_PROTO_pwm(const struct pwm_waveform *wf, void *wfhw, int err),
51+
52+
TP_ARGS_pwm(wf, wfhw, err),
53+
54+
TP_STRUCT__entry_pwm(
55+
__field_pwmwf(wf)
56+
__field(void *, wfhw)
57+
__field(int, err)
58+
),
59+
60+
TP_fast_assign_pwm(
61+
fast_assign_pwmwf(wf);
62+
__entry->wfhw = wfhw;
63+
__entry->err = err;
64+
),
65+
66+
TP_printk_pwm(printk_pwmwf_format(wf) " > %p err=%d",
67+
printk_pwmwf_formatargs(wf), __entry->wfhw, __entry->err)
68+
);
69+
70+
TRACE_EVENT(pwm_round_waveform_fromhw,
71+
72+
TP_PROTO_pwm(const void *wfhw, struct pwm_waveform *wf, int err),
73+
74+
TP_ARGS_pwm(wfhw, wf, err),
75+
76+
TP_STRUCT__entry_pwm(
77+
__field(const void *, wfhw)
78+
__field_pwmwf(wf)
79+
__field(int, err)
80+
),
81+
82+
TP_fast_assign_pwm(
83+
__entry->wfhw = wfhw;
84+
fast_assign_pwmwf(wf);
85+
__entry->err = err;
86+
),
87+
88+
TP_printk_pwm("%p > " printk_pwmwf_format(wf) " err=%d",
89+
__entry->wfhw, printk_pwmwf_formatargs(wf), __entry->err)
90+
);
91+
92+
TRACE_EVENT(pwm_read_waveform,
93+
94+
TP_PROTO_pwm(void *wfhw, int err),
95+
96+
TP_ARGS_pwm(wfhw, err),
97+
98+
TP_STRUCT__entry_pwm(
99+
__field(void *, wfhw)
100+
__field(int, err)
101+
),
102+
103+
TP_fast_assign_pwm(
104+
__entry->wfhw = wfhw;
105+
__entry->err = err;
106+
),
107+
108+
TP_printk_pwm("%p err=%d",
109+
__entry->wfhw, __entry->err)
110+
);
111+
112+
TRACE_EVENT(pwm_write_waveform,
113+
114+
TP_PROTO_pwm(const void *wfhw, int err),
115+
116+
TP_ARGS_pwm(wfhw, err),
117+
118+
TP_STRUCT__entry_pwm(
119+
__field(const void *, wfhw)
120+
__field(int, err)
121+
),
122+
123+
TP_fast_assign_pwm(
124+
__entry->wfhw = wfhw;
125+
__entry->err = err;
126+
),
127+
128+
TP_printk_pwm("%p err=%d",
129+
__entry->wfhw, __entry->err)
130+
);
131+
132+
11133
DECLARE_EVENT_CLASS(pwm,
12134

13135
TP_PROTO(struct pwm_device *pwm, const struct pwm_state *state, int err),
14136

15137
TP_ARGS(pwm, state, err),
16138

17-
TP_STRUCT__entry(
18-
__field(unsigned int, chipid)
19-
__field(unsigned int, hwpwm)
139+
TP_STRUCT__entry_pwm(
20140
__field(u64, period)
21141
__field(u64, duty_cycle)
22142
__field(enum pwm_polarity, polarity)
23143
__field(bool, enabled)
24144
__field(int, err)
25145
),
26146

27-
TP_fast_assign(
28-
__entry->chipid = pwm->chip->id;
29-
__entry->hwpwm = pwm->hwpwm;
147+
TP_fast_assign_pwm(
30148
__entry->period = state->period;
31149
__entry->duty_cycle = state->duty_cycle;
32150
__entry->polarity = state->polarity;
33151
__entry->enabled = state->enabled;
34152
__entry->err = err;
35153
),
36154

37-
TP_printk("pwmchip%u.%u: period=%llu duty_cycle=%llu polarity=%d enabled=%d err=%d",
38-
__entry->chipid, __entry->hwpwm, __entry->period, __entry->duty_cycle,
155+
TP_printk_pwm("period=%llu duty_cycle=%llu polarity=%d enabled=%d err=%d",
156+
__entry->period, __entry->duty_cycle,
39157
__entry->polarity, __entry->enabled, __entry->err)
40158

41159
);

0 commit comments

Comments
 (0)