1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 256ec1978SMark Brown #undef TRACE_SYSTEM 356ec1978SMark Brown #define TRACE_SYSTEM spi 456ec1978SMark Brown 556ec1978SMark Brown #if !defined(_TRACE_SPI_H) || defined(TRACE_HEADER_MULTI_READ) 656ec1978SMark Brown #define _TRACE_SPI_H 756ec1978SMark Brown 856ec1978SMark Brown #include <linux/ktime.h> 956ec1978SMark Brown #include <linux/tracepoint.h> 1056ec1978SMark Brown 118caab75fSGeert Uytterhoeven DECLARE_EVENT_CLASS(spi_controller, 1256ec1978SMark Brown 138caab75fSGeert Uytterhoeven TP_PROTO(struct spi_controller *controller), 1456ec1978SMark Brown 158caab75fSGeert Uytterhoeven TP_ARGS(controller), 1656ec1978SMark Brown 1756ec1978SMark Brown TP_STRUCT__entry( 1856ec1978SMark Brown __field( int, bus_num ) 1956ec1978SMark Brown ), 2056ec1978SMark Brown 2156ec1978SMark Brown TP_fast_assign( 228caab75fSGeert Uytterhoeven __entry->bus_num = controller->bus_num; 2356ec1978SMark Brown ), 2456ec1978SMark Brown 2556ec1978SMark Brown TP_printk("spi%d", (int)__entry->bus_num) 2656ec1978SMark Brown 2756ec1978SMark Brown ); 2856ec1978SMark Brown 298caab75fSGeert Uytterhoeven DEFINE_EVENT(spi_controller, spi_controller_idle, 3056ec1978SMark Brown 318caab75fSGeert Uytterhoeven TP_PROTO(struct spi_controller *controller), 3256ec1978SMark Brown 338caab75fSGeert Uytterhoeven TP_ARGS(controller) 3456ec1978SMark Brown 3556ec1978SMark Brown ); 3656ec1978SMark Brown 378caab75fSGeert Uytterhoeven DEFINE_EVENT(spi_controller, spi_controller_busy, 3856ec1978SMark Brown 398caab75fSGeert Uytterhoeven TP_PROTO(struct spi_controller *controller), 4056ec1978SMark Brown 418caab75fSGeert Uytterhoeven TP_ARGS(controller) 4256ec1978SMark Brown 4356ec1978SMark Brown ); 4456ec1978SMark Brown 455cb4e1f3SAndy Shevchenko TRACE_EVENT(spi_setup, 465cb4e1f3SAndy Shevchenko TP_PROTO(struct spi_device *spi, int status), 475cb4e1f3SAndy Shevchenko TP_ARGS(spi, status), 485cb4e1f3SAndy Shevchenko 495cb4e1f3SAndy Shevchenko TP_STRUCT__entry( 505cb4e1f3SAndy Shevchenko __field(int, bus_num) 515cb4e1f3SAndy Shevchenko __field(int, chip_select) 525cb4e1f3SAndy Shevchenko __field(unsigned long, mode) 535cb4e1f3SAndy Shevchenko __field(unsigned int, bits_per_word) 545cb4e1f3SAndy Shevchenko __field(unsigned int, max_speed_hz) 555cb4e1f3SAndy Shevchenko __field(int, status) 565cb4e1f3SAndy Shevchenko ), 575cb4e1f3SAndy Shevchenko 585cb4e1f3SAndy Shevchenko TP_fast_assign( 595cb4e1f3SAndy Shevchenko __entry->bus_num = spi->controller->bus_num; 609e264f3fSAmit Kumar Mahapatra via Alsa-devel __entry->chip_select = spi_get_chipselect(spi, 0); 615cb4e1f3SAndy Shevchenko __entry->mode = spi->mode; 625cb4e1f3SAndy Shevchenko __entry->bits_per_word = spi->bits_per_word; 635cb4e1f3SAndy Shevchenko __entry->max_speed_hz = spi->max_speed_hz; 645cb4e1f3SAndy Shevchenko __entry->status = status; 655cb4e1f3SAndy Shevchenko ), 665cb4e1f3SAndy Shevchenko 675cb4e1f3SAndy Shevchenko TP_printk("spi%d.%d setup mode %lu, %s%s%s%s%u bits/w, %u Hz max --> %d", 685cb4e1f3SAndy Shevchenko __entry->bus_num, __entry->chip_select, 695cb4e1f3SAndy Shevchenko (__entry->mode & SPI_MODE_X_MASK), 705cb4e1f3SAndy Shevchenko (__entry->mode & SPI_CS_HIGH) ? "cs_high, " : "", 715cb4e1f3SAndy Shevchenko (__entry->mode & SPI_LSB_FIRST) ? "lsb, " : "", 725cb4e1f3SAndy Shevchenko (__entry->mode & SPI_3WIRE) ? "3wire, " : "", 735cb4e1f3SAndy Shevchenko (__entry->mode & SPI_LOOP) ? "loopback, " : "", 745cb4e1f3SAndy Shevchenko __entry->bits_per_word, __entry->max_speed_hz, 755cb4e1f3SAndy Shevchenko __entry->status) 765cb4e1f3SAndy Shevchenko ); 775cb4e1f3SAndy Shevchenko 785cb4e1f3SAndy Shevchenko TRACE_EVENT(spi_set_cs, 795cb4e1f3SAndy Shevchenko TP_PROTO(struct spi_device *spi, bool enable), 805cb4e1f3SAndy Shevchenko TP_ARGS(spi, enable), 815cb4e1f3SAndy Shevchenko 825cb4e1f3SAndy Shevchenko TP_STRUCT__entry( 835cb4e1f3SAndy Shevchenko __field(int, bus_num) 845cb4e1f3SAndy Shevchenko __field(int, chip_select) 855cb4e1f3SAndy Shevchenko __field(unsigned long, mode) 865cb4e1f3SAndy Shevchenko __field(bool, enable) 875cb4e1f3SAndy Shevchenko ), 885cb4e1f3SAndy Shevchenko 895cb4e1f3SAndy Shevchenko TP_fast_assign( 905cb4e1f3SAndy Shevchenko __entry->bus_num = spi->controller->bus_num; 919e264f3fSAmit Kumar Mahapatra via Alsa-devel __entry->chip_select = spi_get_chipselect(spi, 0); 925cb4e1f3SAndy Shevchenko __entry->mode = spi->mode; 935cb4e1f3SAndy Shevchenko __entry->enable = enable; 945cb4e1f3SAndy Shevchenko ), 955cb4e1f3SAndy Shevchenko 965cb4e1f3SAndy Shevchenko TP_printk("spi%d.%d %s%s", 975cb4e1f3SAndy Shevchenko __entry->bus_num, __entry->chip_select, 985cb4e1f3SAndy Shevchenko __entry->enable ? "activate" : "deactivate", 995cb4e1f3SAndy Shevchenko (__entry->mode & SPI_CS_HIGH) ? ", cs_high" : "") 1005cb4e1f3SAndy Shevchenko ); 1015cb4e1f3SAndy Shevchenko 10256ec1978SMark Brown DECLARE_EVENT_CLASS(spi_message, 10356ec1978SMark Brown 10456ec1978SMark Brown TP_PROTO(struct spi_message *msg), 10556ec1978SMark Brown 10656ec1978SMark Brown TP_ARGS(msg), 10756ec1978SMark Brown 10856ec1978SMark Brown TP_STRUCT__entry( 10956ec1978SMark Brown __field( int, bus_num ) 11056ec1978SMark Brown __field( int, chip_select ) 11156ec1978SMark Brown __field( struct spi_message *, msg ) 11256ec1978SMark Brown ), 11356ec1978SMark Brown 11456ec1978SMark Brown TP_fast_assign( 1158caab75fSGeert Uytterhoeven __entry->bus_num = msg->spi->controller->bus_num; 1169e264f3fSAmit Kumar Mahapatra via Alsa-devel __entry->chip_select = spi_get_chipselect(msg->spi, 0); 11756ec1978SMark Brown __entry->msg = msg; 11856ec1978SMark Brown ), 11956ec1978SMark Brown 12056ec1978SMark Brown TP_printk("spi%d.%d %p", (int)__entry->bus_num, 12156ec1978SMark Brown (int)__entry->chip_select, 12256ec1978SMark Brown (struct spi_message *)__entry->msg) 12356ec1978SMark Brown ); 12456ec1978SMark Brown 12556ec1978SMark Brown DEFINE_EVENT(spi_message, spi_message_submit, 12656ec1978SMark Brown 12756ec1978SMark Brown TP_PROTO(struct spi_message *msg), 12856ec1978SMark Brown 12956ec1978SMark Brown TP_ARGS(msg) 13056ec1978SMark Brown 13156ec1978SMark Brown ); 13256ec1978SMark Brown 13356ec1978SMark Brown DEFINE_EVENT(spi_message, spi_message_start, 13456ec1978SMark Brown 13556ec1978SMark Brown TP_PROTO(struct spi_message *msg), 13656ec1978SMark Brown 13756ec1978SMark Brown TP_ARGS(msg) 13856ec1978SMark Brown 13956ec1978SMark Brown ); 14056ec1978SMark Brown 14131a2c46cSMark Brown TRACE_EVENT(spi_message_done, 14256ec1978SMark Brown 14356ec1978SMark Brown TP_PROTO(struct spi_message *msg), 14456ec1978SMark Brown 14531a2c46cSMark Brown TP_ARGS(msg), 14656ec1978SMark Brown 14731a2c46cSMark Brown TP_STRUCT__entry( 14831a2c46cSMark Brown __field( int, bus_num ) 14931a2c46cSMark Brown __field( int, chip_select ) 15031a2c46cSMark Brown __field( struct spi_message *, msg ) 15131a2c46cSMark Brown __field( unsigned, frame ) 15231a2c46cSMark Brown __field( unsigned, actual ) 15331a2c46cSMark Brown ), 15431a2c46cSMark Brown 15531a2c46cSMark Brown TP_fast_assign( 1568caab75fSGeert Uytterhoeven __entry->bus_num = msg->spi->controller->bus_num; 1579e264f3fSAmit Kumar Mahapatra via Alsa-devel __entry->chip_select = spi_get_chipselect(msg->spi, 0); 15831a2c46cSMark Brown __entry->msg = msg; 15931a2c46cSMark Brown __entry->frame = msg->frame_length; 16031a2c46cSMark Brown __entry->actual = msg->actual_length; 16131a2c46cSMark Brown ), 16231a2c46cSMark Brown 16331a2c46cSMark Brown TP_printk("spi%d.%d %p len=%u/%u", (int)__entry->bus_num, 16431a2c46cSMark Brown (int)__entry->chip_select, 16531a2c46cSMark Brown (struct spi_message *)__entry->msg, 16631a2c46cSMark Brown (unsigned)__entry->actual, (unsigned)__entry->frame) 16756ec1978SMark Brown ); 16856ec1978SMark Brown 1698d245475SUwe Kleine-König /* 170*702ca026SAndy Shevchenko * Consider a buffer valid if non-NULL and if it doesn't match the dummy buffer 1718d245475SUwe Kleine-König * that only exist to work with controllers that have SPI_CONTROLLER_MUST_TX or 1728d245475SUwe Kleine-König * SPI_CONTROLLER_MUST_RX. 1738d245475SUwe Kleine-König */ 1748d245475SUwe Kleine-König #define spi_valid_txbuf(msg, xfer) \ 1758d245475SUwe Kleine-König (xfer->tx_buf && xfer->tx_buf != msg->spi->controller->dummy_tx) 1768d245475SUwe Kleine-König #define spi_valid_rxbuf(msg, xfer) \ 1778d245475SUwe Kleine-König (xfer->rx_buf && xfer->rx_buf != msg->spi->controller->dummy_rx) 1788d245475SUwe Kleine-König 179b158935fSMark Brown DECLARE_EVENT_CLASS(spi_transfer, 180b158935fSMark Brown 181b158935fSMark Brown TP_PROTO(struct spi_message *msg, struct spi_transfer *xfer), 182b158935fSMark Brown 183b158935fSMark Brown TP_ARGS(msg, xfer), 184b158935fSMark Brown 185b158935fSMark Brown TP_STRUCT__entry( 186b158935fSMark Brown __field( int, bus_num ) 187b158935fSMark Brown __field( int, chip_select ) 188b158935fSMark Brown __field( struct spi_transfer *, xfer ) 189b158935fSMark Brown __field( int, len ) 1908d245475SUwe Kleine-König __dynamic_array(u8, rx_buf, 191ed86bf8eSNoralf Trønnes spi_valid_rxbuf(msg, xfer) ? 192ed86bf8eSNoralf Trønnes (xfer->len < 64 ? xfer->len : 64) : 0) 1938d245475SUwe Kleine-König __dynamic_array(u8, tx_buf, 194ed86bf8eSNoralf Trønnes spi_valid_txbuf(msg, xfer) ? 195ed86bf8eSNoralf Trønnes (xfer->len < 64 ? xfer->len : 64) : 0) 196b158935fSMark Brown ), 197b158935fSMark Brown 198b158935fSMark Brown TP_fast_assign( 1998caab75fSGeert Uytterhoeven __entry->bus_num = msg->spi->controller->bus_num; 2009e264f3fSAmit Kumar Mahapatra via Alsa-devel __entry->chip_select = spi_get_chipselect(msg->spi, 0); 201b158935fSMark Brown __entry->xfer = xfer; 202b158935fSMark Brown __entry->len = xfer->len; 2038d245475SUwe Kleine-König 2048d245475SUwe Kleine-König if (spi_valid_txbuf(msg, xfer)) 2058d245475SUwe Kleine-König memcpy(__get_dynamic_array(tx_buf), 206ed86bf8eSNoralf Trønnes xfer->tx_buf, __get_dynamic_array_len(tx_buf)); 2078d245475SUwe Kleine-König 2088d245475SUwe Kleine-König if (spi_valid_rxbuf(msg, xfer)) 2098d245475SUwe Kleine-König memcpy(__get_dynamic_array(rx_buf), 210ed86bf8eSNoralf Trønnes xfer->rx_buf, __get_dynamic_array_len(rx_buf)); 211b158935fSMark Brown ), 212b158935fSMark Brown 2138d245475SUwe Kleine-König TP_printk("spi%d.%d %p len=%d tx=[%*phD] rx=[%*phD]", 214983f6ae9SUwe Kleine-König __entry->bus_num, __entry->chip_select, 2158d245475SUwe Kleine-König __entry->xfer, __entry->len, 2168d245475SUwe Kleine-König __get_dynamic_array_len(tx_buf), __get_dynamic_array(tx_buf), 2178d245475SUwe Kleine-König __get_dynamic_array_len(rx_buf), __get_dynamic_array(rx_buf)) 218b158935fSMark Brown ); 219b158935fSMark Brown 220b158935fSMark Brown DEFINE_EVENT(spi_transfer, spi_transfer_start, 221b158935fSMark Brown 222b158935fSMark Brown TP_PROTO(struct spi_message *msg, struct spi_transfer *xfer), 223b158935fSMark Brown 224b158935fSMark Brown TP_ARGS(msg, xfer) 225b158935fSMark Brown 226b158935fSMark Brown ); 227b158935fSMark Brown 228b158935fSMark Brown DEFINE_EVENT(spi_transfer, spi_transfer_stop, 229b158935fSMark Brown 230b158935fSMark Brown TP_PROTO(struct spi_message *msg, struct spi_transfer *xfer), 231b158935fSMark Brown 232b158935fSMark Brown TP_ARGS(msg, xfer) 233b158935fSMark Brown 234b158935fSMark Brown ); 235b158935fSMark Brown 23656ec1978SMark Brown #endif /* _TRACE_POWER_H */ 23756ec1978SMark Brown 23856ec1978SMark Brown /* This part must be outside protection */ 23956ec1978SMark Brown #include <trace/define_trace.h> 240