diff options
author | Bin Liu <b-liu@ti.com> | 2016-06-30 13:12:24 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2016-07-16 19:23:57 -0400 |
commit | c74173fdd4fba23f237af48dff95f613f011cee3 (patch) | |
tree | ed3800e7250aeadb11c488e57061e59f24b16780 | |
parent | 086b288282884437cd588893d4501a8bbe4eb78c (diff) |
usb: musb: add tracepoints for register access
This adds tracepoints to musb register read/write wrappers to get
trace log for register access.
The default tacepoint log prefix here would be musb_readX/writeX(),
which is not much helpful. So this patch let the tracepoints use
__buildin_return_address(0) to print the caller funciton name to
provide more context of the register access.
Signed-off-by: Bin Liu <b-liu@ti.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | drivers/usb/musb/musb_core.c | 19 | ||||
-rw-r--r-- | drivers/usb/musb/musb_trace.h | 87 |
2 files changed, 103 insertions, 3 deletions
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c index d2bc45cf96a8..c0c81ae6e6ed 100644 --- a/drivers/usb/musb/musb_core.c +++ b/drivers/usb/musb/musb_core.c | |||
@@ -102,6 +102,7 @@ | |||
102 | #include <linux/usb.h> | 102 | #include <linux/usb.h> |
103 | 103 | ||
104 | #include "musb_core.h" | 104 | #include "musb_core.h" |
105 | #include "musb_trace.h" | ||
105 | 106 | ||
106 | #define TA_WAIT_BCON(m) max_t(int, (m)->a_wait_bcon, OTG_TIME_A_WAIT_BCON) | 107 | #define TA_WAIT_BCON(m) max_t(int, (m)->a_wait_bcon, OTG_TIME_A_WAIT_BCON) |
107 | 108 | ||
@@ -258,31 +259,43 @@ static u32 musb_default_busctl_offset(u8 epnum, u16 offset) | |||
258 | 259 | ||
259 | static u8 musb_default_readb(const void __iomem *addr, unsigned offset) | 260 | static u8 musb_default_readb(const void __iomem *addr, unsigned offset) |
260 | { | 261 | { |
261 | return __raw_readb(addr + offset); | 262 | u8 data = __raw_readb(addr + offset); |
263 | |||
264 | trace_musb_readb(__builtin_return_address(0), addr, offset, data); | ||
265 | return data; | ||
262 | } | 266 | } |
263 | 267 | ||
264 | static void musb_default_writeb(void __iomem *addr, unsigned offset, u8 data) | 268 | static void musb_default_writeb(void __iomem *addr, unsigned offset, u8 data) |
265 | { | 269 | { |
270 | trace_musb_writeb(__builtin_return_address(0), addr, offset, data); | ||
266 | __raw_writeb(data, addr + offset); | 271 | __raw_writeb(data, addr + offset); |
267 | } | 272 | } |
268 | 273 | ||
269 | static u16 musb_default_readw(const void __iomem *addr, unsigned offset) | 274 | static u16 musb_default_readw(const void __iomem *addr, unsigned offset) |
270 | { | 275 | { |
271 | return __raw_readw(addr + offset); | 276 | u16 data = __raw_readw(addr + offset); |
277 | |||
278 | trace_musb_readw(__builtin_return_address(0), addr, offset, data); | ||
279 | return data; | ||
272 | } | 280 | } |
273 | 281 | ||
274 | static void musb_default_writew(void __iomem *addr, unsigned offset, u16 data) | 282 | static void musb_default_writew(void __iomem *addr, unsigned offset, u16 data) |
275 | { | 283 | { |
284 | trace_musb_writew(__builtin_return_address(0), addr, offset, data); | ||
276 | __raw_writew(data, addr + offset); | 285 | __raw_writew(data, addr + offset); |
277 | } | 286 | } |
278 | 287 | ||
279 | static u32 musb_default_readl(const void __iomem *addr, unsigned offset) | 288 | static u32 musb_default_readl(const void __iomem *addr, unsigned offset) |
280 | { | 289 | { |
281 | return __raw_readl(addr + offset); | 290 | u32 data = __raw_readl(addr + offset); |
291 | |||
292 | trace_musb_readl(__builtin_return_address(0), addr, offset, data); | ||
293 | return data; | ||
282 | } | 294 | } |
283 | 295 | ||
284 | static void musb_default_writel(void __iomem *addr, unsigned offset, u32 data) | 296 | static void musb_default_writel(void __iomem *addr, unsigned offset, u32 data) |
285 | { | 297 | { |
298 | trace_musb_writel(__builtin_return_address(0), addr, offset, data); | ||
286 | __raw_writel(data, addr + offset); | 299 | __raw_writel(data, addr + offset); |
287 | } | 300 | } |
288 | 301 | ||
diff --git a/drivers/usb/musb/musb_trace.h b/drivers/usb/musb/musb_trace.h index c6c593ec3aa7..c974f48ee5d8 100644 --- a/drivers/usb/musb/musb_trace.h +++ b/drivers/usb/musb/musb_trace.h | |||
@@ -41,6 +41,93 @@ TRACE_EVENT(musb_log, | |||
41 | TP_printk("%s: %s", __get_str(name), __get_str(msg)) | 41 | TP_printk("%s: %s", __get_str(name), __get_str(msg)) |
42 | ); | 42 | ); |
43 | 43 | ||
44 | DECLARE_EVENT_CLASS(musb_regb, | ||
45 | TP_PROTO(void *caller, const void *addr, unsigned int offset, u8 data), | ||
46 | TP_ARGS(caller, addr, offset, data), | ||
47 | TP_STRUCT__entry( | ||
48 | __field(void *, caller) | ||
49 | __field(const void *, addr) | ||
50 | __field(unsigned int, offset) | ||
51 | __field(u8, data) | ||
52 | ), | ||
53 | TP_fast_assign( | ||
54 | __entry->caller = caller; | ||
55 | __entry->addr = addr; | ||
56 | __entry->offset = offset; | ||
57 | __entry->data = data; | ||
58 | ), | ||
59 | TP_printk("%pS: %p + %04x: %02x", | ||
60 | __entry->caller, __entry->addr, __entry->offset, __entry->data) | ||
61 | ); | ||
62 | |||
63 | DEFINE_EVENT(musb_regb, musb_readb, | ||
64 | TP_PROTO(void *caller, const void *addr, unsigned int offset, u8 data), | ||
65 | TP_ARGS(caller, addr, offset, data) | ||
66 | ); | ||
67 | |||
68 | DEFINE_EVENT(musb_regb, musb_writeb, | ||
69 | TP_PROTO(void *caller, const void *addr, unsigned int offset, u8 data), | ||
70 | TP_ARGS(caller, addr, offset, data) | ||
71 | ); | ||
72 | |||
73 | DECLARE_EVENT_CLASS(musb_regw, | ||
74 | TP_PROTO(void *caller, const void *addr, unsigned int offset, u16 data), | ||
75 | TP_ARGS(caller, addr, offset, data), | ||
76 | TP_STRUCT__entry( | ||
77 | __field(void *, caller) | ||
78 | __field(const void *, addr) | ||
79 | __field(unsigned int, offset) | ||
80 | __field(u16, data) | ||
81 | ), | ||
82 | TP_fast_assign( | ||
83 | __entry->caller = caller; | ||
84 | __entry->addr = addr; | ||
85 | __entry->offset = offset; | ||
86 | __entry->data = data; | ||
87 | ), | ||
88 | TP_printk("%pS: %p + %04x: %04x", | ||
89 | __entry->caller, __entry->addr, __entry->offset, __entry->data) | ||
90 | ); | ||
91 | |||
92 | DEFINE_EVENT(musb_regw, musb_readw, | ||
93 | TP_PROTO(void *caller, const void *addr, unsigned int offset, u16 data), | ||
94 | TP_ARGS(caller, addr, offset, data) | ||
95 | ); | ||
96 | |||
97 | DEFINE_EVENT(musb_regw, musb_writew, | ||
98 | TP_PROTO(void *caller, const void *addr, unsigned int offset, u16 data), | ||
99 | TP_ARGS(caller, addr, offset, data) | ||
100 | ); | ||
101 | |||
102 | DECLARE_EVENT_CLASS(musb_regl, | ||
103 | TP_PROTO(void *caller, const void *addr, unsigned int offset, u32 data), | ||
104 | TP_ARGS(caller, addr, offset, data), | ||
105 | TP_STRUCT__entry( | ||
106 | __field(void *, caller) | ||
107 | __field(const void *, addr) | ||
108 | __field(unsigned int, offset) | ||
109 | __field(u32, data) | ||
110 | ), | ||
111 | TP_fast_assign( | ||
112 | __entry->caller = caller; | ||
113 | __entry->addr = addr; | ||
114 | __entry->offset = offset; | ||
115 | __entry->data = data; | ||
116 | ), | ||
117 | TP_printk("%pS: %p + %04x: %08x", | ||
118 | __entry->caller, __entry->addr, __entry->offset, __entry->data) | ||
119 | ); | ||
120 | |||
121 | DEFINE_EVENT(musb_regl, musb_readl, | ||
122 | TP_PROTO(void *caller, const void *addr, unsigned int offset, u32 data), | ||
123 | TP_ARGS(caller, addr, offset, data) | ||
124 | ); | ||
125 | |||
126 | DEFINE_EVENT(musb_regl, musb_writel, | ||
127 | TP_PROTO(void *caller, const void *addr, unsigned int offset, u32 data), | ||
128 | TP_ARGS(caller, addr, offset, data) | ||
129 | ); | ||
130 | |||
44 | #endif /* __MUSB_TRACE_H */ | 131 | #endif /* __MUSB_TRACE_H */ |
45 | 132 | ||
46 | /* this part has to be here */ | 133 | /* this part has to be here */ |