#include <linux/ktime.h>
 #include <linux/tracepoint.h>
 
+struct snd_soc_jack;
 struct snd_soc_codec;
 struct snd_soc_card;
 struct snd_soc_dapm_widget;
 
 );
 
+TRACE_EVENT(snd_soc_jack_irq,
+
+       TP_PROTO(const char *name),
+
+       TP_ARGS(name),
+
+       TP_STRUCT__entry(
+               __string(       name,   name            )
+       ),
+
+       TP_fast_assign(
+               __assign_str(name, name);
+       ),
+
+       TP_printk("%s", __get_str(name))
+);
+
+TRACE_EVENT(snd_soc_jack_report,
+
+       TP_PROTO(struct snd_soc_jack *jack, int mask, int val),
+
+       TP_ARGS(jack, mask, val),
+
+       TP_STRUCT__entry(
+               __string(       name,           jack->jack->name        )
+               __field(        int,            mask                    )
+               __field(        int,            val                     )
+       ),
+
+       TP_fast_assign(
+               __assign_str(name, jack->jack->name);
+               __entry->mask = mask;
+               __entry->val = val;
+       ),
+
+       TP_printk("jack=%s %x/%x", __get_str(name), (int)__entry->val,
+                 (int)__entry->mask)
+);
+
+TRACE_EVENT(snd_soc_jack_notify,
+
+       TP_PROTO(struct snd_soc_jack *jack, int val),
+
+       TP_ARGS(jack, val),
+
+       TP_STRUCT__entry(
+               __string(       name,           jack->jack->name        )
+               __field(        int,            val                     )
+       ),
+
+       TP_fast_assign(
+               __assign_str(name, jack->jack->name);
+               __entry->val = val;
+       ),
+
+       TP_printk("jack=%s %x", __get_str(name), (int)__entry->val)
+);
+
 #endif /* _TRACE_ASOC_H */
 
 /* This part must be outside protection */
 
 #include <linux/interrupt.h>
 #include <linux/workqueue.h>
 #include <linux/delay.h>
+#include <trace/events/asoc.h>
 
 /**
  * snd_soc_jack_new - Create a new jack
        int enable;
        int oldstatus;
 
+       trace_snd_soc_jack_report(jack, mask, status);
+
        if (!jack)
                return;
 
        if (mask && (jack->status == oldstatus))
                goto out;
 
+       trace_snd_soc_jack_notify(jack, status);
+
        list_for_each_entry(pin, &jack->pins, list) {
                enable = pin->mask & jack->status;
 
        struct snd_soc_jack_gpio *gpio = data;
        struct device *dev = gpio->jack->codec->card->dev;
 
+       trace_snd_soc_jack_irq(gpio->name);
+
        if (device_may_wakeup(dev))
                pm_wakeup_event(dev, gpio->debounce_time + 50);