0001
0002
0003
0004
0005
0006
0007 #undef TRACE_SYSTEM
0008 #define TRACE_SYSTEM i2c_slave
0009
0010 #if !defined(_TRACE_I2C_SLAVE_H) || defined(TRACE_HEADER_MULTI_READ)
0011 #define _TRACE_I2C_SLAVE_H
0012
0013 #include <linux/i2c.h>
0014 #include <linux/tracepoint.h>
0015
0016 TRACE_DEFINE_ENUM(I2C_SLAVE_READ_REQUESTED);
0017 TRACE_DEFINE_ENUM(I2C_SLAVE_WRITE_REQUESTED);
0018 TRACE_DEFINE_ENUM(I2C_SLAVE_READ_PROCESSED);
0019 TRACE_DEFINE_ENUM(I2C_SLAVE_WRITE_RECEIVED);
0020 TRACE_DEFINE_ENUM(I2C_SLAVE_STOP);
0021
0022 #define show_event_type(type) \
0023 __print_symbolic(type, \
0024 { I2C_SLAVE_READ_REQUESTED, "RD_REQ" }, \
0025 { I2C_SLAVE_WRITE_REQUESTED, "WR_REQ" }, \
0026 { I2C_SLAVE_READ_PROCESSED, "RD_PRO" }, \
0027 { I2C_SLAVE_WRITE_RECEIVED, "WR_RCV" }, \
0028 { I2C_SLAVE_STOP, " STOP" })
0029
0030 TRACE_EVENT(i2c_slave,
0031 TP_PROTO(const struct i2c_client *client, enum i2c_slave_event event,
0032 __u8 *val, int cb_ret),
0033 TP_ARGS(client, event, val, cb_ret),
0034 TP_STRUCT__entry(
0035 __field(int, adapter_nr )
0036 __field(int, ret )
0037 __field(__u16, addr )
0038 __field(__u16, len )
0039 __field(enum i2c_slave_event, event )
0040 __array(__u8, buf, 1) ),
0041
0042 TP_fast_assign(
0043 __entry->adapter_nr = client->adapter->nr;
0044 __entry->addr = client->addr;
0045 __entry->event = event;
0046 __entry->ret = cb_ret;
0047 switch (event) {
0048 case I2C_SLAVE_READ_REQUESTED:
0049 case I2C_SLAVE_READ_PROCESSED:
0050 case I2C_SLAVE_WRITE_RECEIVED:
0051 __entry->len = 1;
0052 memcpy(__entry->buf, val, __entry->len);
0053 break;
0054 default:
0055 __entry->len = 0;
0056 break;
0057 }
0058 ),
0059 TP_printk("i2c-%d a=%03x ret=%d %s [%*phD]",
0060 __entry->adapter_nr, __entry->addr, __entry->ret,
0061 show_event_type(__entry->event), __entry->len, __entry->buf
0062 ));
0063
0064 #endif
0065
0066
0067 #include <trace/define_trace.h>