--- /dev/null
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM i2c
+
+#if !defined(LTTNG_TRACE_I2C_H) || defined(TRACE_HEADER_MULTI_READ)
+#define LTTNG_TRACE_I2C_H
+
+#include <probes/lttng-tracepoint-event.h>
+
+/*
+ * __i2c_transfer() write request
+ */
+LTTNG_TRACEPOINT_EVENT_CODE(i2c_write,
+
+ TP_PROTO(const struct i2c_adapter *adap, const struct i2c_msg *msg,
+ int num),
+
+ TP_ARGS(adap, msg, num),
+
+ TP_locvar(
+ int extract_sensitive_payload;
+ ),
+
+ TP_code_pre(
+ tp_locvar->extract_sensitive_payload =
+ ACCESS_ONCE(extract_sensitive_payload);
+ ),
+
+ TP_FIELDS(
+ ctf_integer(int, adapter_nr, adap->nr)
+ ctf_integer(__u16, msg_nr, num)
+ ctf_integer(__u16, addr, msg->addr)
+ ctf_integer(__u16, flags, msg->flags)
+ ctf_integer(__u16, len, msg->len)
+ ctf_sequence_hex(__u8, buf,
+ tp_locvar->extract_sensitive_payload ?
+ msg->buf : NULL,
+ __u16,
+ tp_locvar->extract_sensitive_payload ?
+ msg->len : 0)
+ ),
+
+ TP_code_post()
+)
+
+/*
+ * __i2c_transfer() read request
+ */
+LTTNG_TRACEPOINT_EVENT(i2c_read,
+
+ TP_PROTO(const struct i2c_adapter *adap, const struct i2c_msg *msg,
+ int num),
+
+ TP_ARGS(adap, msg, num),
+
+ TP_FIELDS(
+ ctf_integer(int, adapter_nr, adap->nr)
+ ctf_integer(__u16, msg_nr, num)
+ ctf_integer(__u16, addr, msg->addr)
+ ctf_integer(__u16, flags, msg->flags)
+ ctf_integer(__u16, len, msg->len)
+ )
+)
+
+/*
+ * __i2c_transfer() read reply
+ */
+LTTNG_TRACEPOINT_EVENT_CODE(i2c_reply,
+
+ TP_PROTO(const struct i2c_adapter *adap, const struct i2c_msg *msg,
+ int num),
+
+ TP_ARGS(adap, msg, num),
+
+ TP_locvar(
+ int extract_sensitive_payload;
+ ),
+
+ TP_code_pre(
+ tp_locvar->extract_sensitive_payload =
+ ACCESS_ONCE(extract_sensitive_payload);
+ ),
+
+ TP_FIELDS(
+ ctf_integer(int, adapter_nr, adap->nr)
+ ctf_integer(__u16, msg_nr, num)
+ ctf_integer(__u16, addr, msg->addr)
+ ctf_integer(__u16, flags, msg->flags)
+ ctf_integer(__u16, len, msg->len)
+ ctf_sequence_hex(__u8, buf,
+ tp_locvar->extract_sensitive_payload ?
+ msg->buf : NULL,
+ __u16,
+ tp_locvar->extract_sensitive_payload ?
+ msg->len : 0)
+ ),
+
+ TP_code_post()
+)
+
+/*
+ * __i2c_transfer() result
+ */
+LTTNG_TRACEPOINT_EVENT(i2c_result,
+
+ TP_PROTO(const struct i2c_adapter *adap, int num, int ret),
+
+ TP_ARGS(adap, num, ret),
+
+ TP_FIELDS(
+ ctf_integer(int, adapter_nr, adap->nr)
+ ctf_integer(__u16, nr_msgs, num)
+ ctf_integer(__s16, ret, ret)
+ )
+)
+
+#endif /* LTTNG_TRACE_I2C_H */
+
+/* This part must be outside protection */
+#include <probes/define_trace.h>
--- /dev/null
+/*
+ * probes/lttng-probe-i2c.c
+ *
+ * LTTng i2c probes.
+ *
+ * Copyright (C) 2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+ * Copyright (C) 2016 Simon Marchi <simon.marchi@ericsson.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; only
+ * version 2.1 of the License.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <linux/module.h>
+#include <linux/moduleparam.h>
+#include <lttng-tracer.h>
+
+/*
+ * Create the tracepoint static inlines from the kernel to validate that our
+ * trace event macros match the kernel we run on.
+ */
+#include <trace/events/i2c.h>
+
+/*
+ * Create LTTng tracepoint probes.
+ */
+#define LTTNG_PACKAGE_BUILD
+#define CREATE_TRACE_POINTS
+#define TRACE_INCLUDE_PATH instrumentation/events/lttng-module
+
+static int extract_sensitive_payload;
+module_param(extract_sensitive_payload, int, 0644);
+MODULE_PARM_DESC(extract_sensitive_payload,
+ "Whether to extract possibly sensitive data from events (i2c "
+ "buffer contents) or not (1 or 0, default: 0).");
+
+#include <instrumentation/events/lttng-module/i2c.h>
+
+MODULE_LICENSE("GPL and additional rights");
+MODULE_AUTHOR("Simon Marchi <simon.marchi@ericsson.com>");
+MODULE_DESCRIPTION("LTTng i2c probes");
+MODULE_VERSION(__stringify(LTTNG_MODULES_MAJOR_VERSION) "."
+ __stringify(LTTNG_MODULES_MINOR_VERSION) "."
+ __stringify(LTTNG_MODULES_PATCHLEVEL_VERSION)
+ LTTNG_MODULES_EXTRAVERSION);