aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/i2c/i2c-core.c
diff options
context:
space:
mode:
authorDavid Howells <dhowells@redhat.com>2014-03-06 08:36:06 -0500
committerWolfram Sang <wsa@the-dreams.de>2014-03-13 17:15:07 -0400
commit8a325997d95d446206b204b7859e055a0315e4fa (patch)
treec14cb0b0af6cd80229a6fea12b0b5ca76a1ecaac /drivers/i2c/i2c-core.c
parentd9a83d62b326574fb4831b64317a82a42642a9a2 (diff)
i2c: Add message transfer tracepoints for SMBUS [ver #2]
The SMBUS tracepoints can be enabled thusly: echo 1 >/sys/kernel/debug/tracing/events/i2c/enable and will dump messages that can be viewed in /sys/kernel/debug/tracing/trace that look like: ... smbus_read: i2c-0 a=051 f=0000 c=fa BYTE_DATA ... smbus_reply: i2c-0 a=051 f=0000 c=fa BYTE_DATA l=1 [39] ... smbus_result: i2c-0 a=051 f=0000 c=fa BYTE_DATA rd res=0 formatted as: i2c-<adapter-nr> a=<addr> f=<flags> c=<command> <protocol-name> <rd|wr> res=<result> l=<data-len> [<data-block>] The adapters to be traced can be selected by something like: echo adapter_nr==1 >/sys/kernel/debug/tracing/events/i2c/filter Note that this shares the same filter and enablement as i2c. Signed-off-by: David Howells <dhowells@redhat.com> Reviewed-by: Steven Rostedt <rostedt@goodmis.org> Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
Diffstat (limited to 'drivers/i2c/i2c-core.c')
-rw-r--r--drivers/i2c/i2c-core.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c
index bdedbee85c01..7c7f4b856bad 100644
--- a/drivers/i2c/i2c-core.c
+++ b/drivers/i2c/i2c-core.c
@@ -2565,6 +2565,14 @@ s32 i2c_smbus_xfer(struct i2c_adapter *adapter, u16 addr, unsigned short flags,
2565 int try; 2565 int try;
2566 s32 res; 2566 s32 res;
2567 2567
2568 /* If enabled, the following two tracepoints are conditional on
2569 * read_write and protocol.
2570 */
2571 trace_smbus_write(adapter, addr, flags, read_write,
2572 command, protocol, data);
2573 trace_smbus_read(adapter, addr, flags, read_write,
2574 command, protocol);
2575
2568 flags &= I2C_M_TEN | I2C_CLIENT_PEC | I2C_CLIENT_SCCB; 2576 flags &= I2C_M_TEN | I2C_CLIENT_PEC | I2C_CLIENT_SCCB;
2569 2577
2570 if (adapter->algo->smbus_xfer) { 2578 if (adapter->algo->smbus_xfer) {
@@ -2585,15 +2593,24 @@ s32 i2c_smbus_xfer(struct i2c_adapter *adapter, u16 addr, unsigned short flags,
2585 i2c_unlock_adapter(adapter); 2593 i2c_unlock_adapter(adapter);
2586 2594
2587 if (res != -EOPNOTSUPP || !adapter->algo->master_xfer) 2595 if (res != -EOPNOTSUPP || !adapter->algo->master_xfer)
2588 return res; 2596 goto trace;
2589 /* 2597 /*
2590 * Fall back to i2c_smbus_xfer_emulated if the adapter doesn't 2598 * Fall back to i2c_smbus_xfer_emulated if the adapter doesn't
2591 * implement native support for the SMBus operation. 2599 * implement native support for the SMBus operation.
2592 */ 2600 */
2593 } 2601 }
2594 2602
2595 return i2c_smbus_xfer_emulated(adapter, addr, flags, read_write, 2603 res = i2c_smbus_xfer_emulated(adapter, addr, flags, read_write,
2596 command, protocol, data); 2604 command, protocol, data);
2605
2606trace:
2607 /* If enabled, the reply tracepoint is conditional on read_write. */
2608 trace_smbus_reply(adapter, addr, flags, read_write,
2609 command, protocol, data);
2610 trace_smbus_result(adapter, addr, flags, read_write,
2611 command, protocol, res);
2612
2613 return res;
2597} 2614}
2598EXPORT_SYMBOL(i2c_smbus_xfer); 2615EXPORT_SYMBOL(i2c_smbus_xfer);
2599 2616