1 /* SPDX-License-Identifier: GPL-2.0 */
3 #define TRACE_SYSTEM spi
5 #if !defined(_TRACE_SPI_H) || defined(TRACE_HEADER_MULTI_READ)
8 #include <linux/ktime.h>
9 #include <linux/tracepoint.h>
11 DECLARE_EVENT_CLASS(spi_controller
,
13 TP_PROTO(struct spi_controller
*controller
),
18 __field( int, bus_num
)
22 __entry
->bus_num
= controller
->bus_num
;
25 TP_printk("spi%d", (int)__entry
->bus_num
)
29 DEFINE_EVENT(spi_controller
, spi_controller_idle
,
31 TP_PROTO(struct spi_controller
*controller
),
37 DEFINE_EVENT(spi_controller
, spi_controller_busy
,
39 TP_PROTO(struct spi_controller
*controller
),
45 TRACE_EVENT(spi_setup
,
46 TP_PROTO(struct spi_device
*spi
, int status
),
51 __field(int, chip_select
)
52 __field(unsigned long, mode
)
53 __field(unsigned int, bits_per_word
)
54 __field(unsigned int, max_speed_hz
)
59 __entry
->bus_num
= spi
->controller
->bus_num
;
60 __entry
->chip_select
= spi_get_chipselect(spi
, 0);
61 __entry
->mode
= spi
->mode
;
62 __entry
->bits_per_word
= spi
->bits_per_word
;
63 __entry
->max_speed_hz
= spi
->max_speed_hz
;
64 __entry
->status
= status
;
67 TP_printk("spi%d.%d setup mode %lu, %s%s%s%s%u bits/w, %u Hz max --> %d",
68 __entry
->bus_num
, __entry
->chip_select
,
69 (__entry
->mode
& SPI_MODE_X_MASK
),
70 (__entry
->mode
& SPI_CS_HIGH
) ? "cs_high, " : "",
71 (__entry
->mode
& SPI_LSB_FIRST
) ? "lsb, " : "",
72 (__entry
->mode
& SPI_3WIRE
) ? "3wire, " : "",
73 (__entry
->mode
& SPI_LOOP
) ? "loopback, " : "",
74 __entry
->bits_per_word
, __entry
->max_speed_hz
,
78 TRACE_EVENT(spi_set_cs
,
79 TP_PROTO(struct spi_device
*spi
, bool enable
),
84 __field(int, chip_select
)
85 __field(unsigned long, mode
)
90 __entry
->bus_num
= spi
->controller
->bus_num
;
91 __entry
->chip_select
= spi_get_chipselect(spi
, 0);
92 __entry
->mode
= spi
->mode
;
93 __entry
->enable
= enable
;
96 TP_printk("spi%d.%d %s%s",
97 __entry
->bus_num
, __entry
->chip_select
,
98 __entry
->enable
? "activate" : "deactivate",
99 (__entry
->mode
& SPI_CS_HIGH
) ? ", cs_high" : "")
102 DECLARE_EVENT_CLASS(spi_message
,
104 TP_PROTO(struct spi_message
*msg
),
109 __field( int, bus_num
)
110 __field( int, chip_select
)
111 __field( struct spi_message
*, msg
)
115 __entry
->bus_num
= msg
->spi
->controller
->bus_num
;
116 __entry
->chip_select
= spi_get_chipselect(msg
->spi
, 0);
120 TP_printk("spi%d.%d %p", (int)__entry
->bus_num
,
121 (int)__entry
->chip_select
,
122 (struct spi_message
*)__entry
->msg
)
125 DEFINE_EVENT(spi_message
, spi_message_submit
,
127 TP_PROTO(struct spi_message
*msg
),
133 DEFINE_EVENT(spi_message
, spi_message_start
,
135 TP_PROTO(struct spi_message
*msg
),
141 TRACE_EVENT(spi_message_done
,
143 TP_PROTO(struct spi_message
*msg
),
148 __field( int, bus_num
)
149 __field( int, chip_select
)
150 __field( struct spi_message
*, msg
)
151 __field( unsigned, frame
)
152 __field( unsigned, actual
)
156 __entry
->bus_num
= msg
->spi
->controller
->bus_num
;
157 __entry
->chip_select
= spi_get_chipselect(msg
->spi
, 0);
159 __entry
->frame
= msg
->frame_length
;
160 __entry
->actual
= msg
->actual_length
;
163 TP_printk("spi%d.%d %p len=%u/%u", (int)__entry
->bus_num
,
164 (int)__entry
->chip_select
,
165 (struct spi_message
*)__entry
->msg
,
166 (unsigned)__entry
->actual
, (unsigned)__entry
->frame
)
170 * Consider a buffer valid if non-NULL and if it doesn't match the dummy buffer
171 * that only exist to work with controllers that have SPI_CONTROLLER_MUST_TX or
172 * SPI_CONTROLLER_MUST_RX.
174 #define spi_valid_txbuf(msg, xfer) \
175 (xfer->tx_buf && xfer->tx_buf != msg->spi->controller->dummy_tx)
176 #define spi_valid_rxbuf(msg, xfer) \
177 (xfer->rx_buf && xfer->rx_buf != msg->spi->controller->dummy_rx)
179 DECLARE_EVENT_CLASS(spi_transfer
,
181 TP_PROTO(struct spi_message
*msg
, struct spi_transfer
*xfer
),
186 __field( int, bus_num
)
187 __field( int, chip_select
)
188 __field( struct spi_transfer
*, xfer
)
190 __dynamic_array(u8
, rx_buf
,
191 spi_valid_rxbuf(msg
, xfer
) ?
192 (xfer
->len
< 64 ? xfer
->len
: 64) : 0)
193 __dynamic_array(u8
, tx_buf
,
194 spi_valid_txbuf(msg
, xfer
) ?
195 (xfer
->len
< 64 ? xfer
->len
: 64) : 0)
199 __entry
->bus_num
= msg
->spi
->controller
->bus_num
;
200 __entry
->chip_select
= spi_get_chipselect(msg
->spi
, 0);
201 __entry
->xfer
= xfer
;
202 __entry
->len
= xfer
->len
;
204 if (spi_valid_txbuf(msg
, xfer
))
205 memcpy(__get_dynamic_array(tx_buf
),
206 xfer
->tx_buf
, __get_dynamic_array_len(tx_buf
));
208 if (spi_valid_rxbuf(msg
, xfer
))
209 memcpy(__get_dynamic_array(rx_buf
),
210 xfer
->rx_buf
, __get_dynamic_array_len(rx_buf
));
213 TP_printk("spi%d.%d %p len=%d tx=[%*phD] rx=[%*phD]",
214 __entry
->bus_num
, __entry
->chip_select
,
215 __entry
->xfer
, __entry
->len
,
216 __get_dynamic_array_len(tx_buf
), __get_dynamic_array(tx_buf
),
217 __get_dynamic_array_len(rx_buf
), __get_dynamic_array(rx_buf
))
220 DEFINE_EVENT(spi_transfer
, spi_transfer_start
,
222 TP_PROTO(struct spi_message
*msg
, struct spi_transfer
*xfer
),
228 DEFINE_EVENT(spi_transfer
, spi_transfer_stop
,
230 TP_PROTO(struct spi_message
*msg
, struct spi_transfer
*xfer
),
236 #endif /* _TRACE_POWER_H */
238 /* This part must be outside protection */
239 #include <trace/define_trace.h>