spi: Enable tracing of the SPI setup CS selection
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Wed, 26 May 2021 19:56:55 +0000 (22:56 +0300)
committerMark Brown <broonie@kernel.org>
Wed, 26 May 2021 20:22:13 +0000 (21:22 +0100)
It is helpful to see what state of CS signal was during one
or another SPI operation. All the same for SPI setup.

Enable tracing of the SPI setup and CS selection.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Message-Id: <20210526195655.75691-1-andriy.shevchenko@linux.intel.com>
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/spi/spi.c
include/trace/events/spi.h

index 956dce3aafcad72608a58f024b79bbe69659b212..20932752a7ef83346682acb6756448421351cb06 100644 (file)
@@ -804,6 +804,8 @@ static void spi_set_cs(struct spi_device *spi, bool enable, bool force)
            (spi->controller->last_cs_mode_high == (spi->mode & SPI_CS_HIGH)))
                return;
 
+       trace_spi_set_cs(spi, activate);
+
        spi->controller->last_cs_enable = enable;
        spi->controller->last_cs_mode_high = spi->mode & SPI_CS_HIGH;
 
@@ -3441,6 +3443,8 @@ int spi_setup(struct spi_device *spi)
                spi_set_thread_rt(spi->controller);
        }
 
+       trace_spi_setup(spi, status);
+
        dev_dbg(&spi->dev, "setup mode %lu, %s%s%s%s%u bits/w, %u Hz max --> %d\n",
                        spi->mode & SPI_MODE_X_MASK,
                        (spi->mode & SPI_CS_HIGH) ? "cs_high, " : "",
index 0dd9171d2ad8e34a617d22bd8c6adc8a5c4432ab..c0d9844befd7ad643fca0561cd01530bf96135c9 100644 (file)
@@ -42,6 +42,63 @@ DEFINE_EVENT(spi_controller, spi_controller_busy,
 
 );
 
+TRACE_EVENT(spi_setup,
+       TP_PROTO(struct spi_device *spi, int status),
+       TP_ARGS(spi, status),
+
+       TP_STRUCT__entry(
+               __field(int, bus_num)
+               __field(int, chip_select)
+               __field(unsigned long, mode)
+               __field(unsigned int, bits_per_word)
+               __field(unsigned int, max_speed_hz)
+               __field(int, status)
+       ),
+
+       TP_fast_assign(
+               __entry->bus_num = spi->controller->bus_num;
+               __entry->chip_select = spi->chip_select;
+               __entry->mode = spi->mode;
+               __entry->bits_per_word = spi->bits_per_word;
+               __entry->max_speed_hz = spi->max_speed_hz;
+               __entry->status = status;
+       ),
+
+       TP_printk("spi%d.%d setup mode %lu, %s%s%s%s%u bits/w, %u Hz max --> %d",
+                 __entry->bus_num, __entry->chip_select,
+                 (__entry->mode & SPI_MODE_X_MASK),
+                 (__entry->mode & SPI_CS_HIGH) ? "cs_high, " : "",
+                 (__entry->mode & SPI_LSB_FIRST) ? "lsb, " : "",
+                 (__entry->mode & SPI_3WIRE) ? "3wire, " : "",
+                 (__entry->mode & SPI_LOOP) ? "loopback, " : "",
+                 __entry->bits_per_word, __entry->max_speed_hz,
+                 __entry->status)
+);
+
+TRACE_EVENT(spi_set_cs,
+       TP_PROTO(struct spi_device *spi, bool enable),
+       TP_ARGS(spi, enable),
+
+       TP_STRUCT__entry(
+               __field(int, bus_num)
+               __field(int, chip_select)
+               __field(unsigned long, mode)
+               __field(bool, enable)
+       ),
+
+       TP_fast_assign(
+               __entry->bus_num = spi->controller->bus_num;
+               __entry->chip_select = spi->chip_select;
+               __entry->mode = spi->mode;
+               __entry->enable = enable;
+       ),
+
+       TP_printk("spi%d.%d %s%s",
+                 __entry->bus_num, __entry->chip_select,
+                 __entry->enable ? "activate" : "deactivate",
+                 (__entry->mode & SPI_CS_HIGH) ? ", cs_high" : "")
+);
+
 DECLARE_EVENT_CLASS(spi_message,
 
        TP_PROTO(struct spi_message *msg),