*     .fields                 = LIST_HEAD_INIT(event_class_##call.fields),
  *     .raw_init               = trace_event_raw_init,
  *     .probe                  = ftrace_raw_event_##call,
+ *     .reg                    = ftrace_event_reg,
  * };
  *
  * static struct ftrace_event_call __used
        .fields                 = LIST_HEAD_INIT(event_class_##call.fields),\
        .raw_init               = trace_event_raw_init,                 \
        .probe                  = ftrace_raw_event_##call,              \
+       .reg                    = ftrace_event_reg,                     \
        _TRACE_PERF_INIT(call)                                          \
 };
 
 
                }
        }
 
-       if (tp_event->class->reg)
-               ret = tp_event->class->reg(tp_event, TRACE_REG_PERF_REGISTER);
-       else
-               ret = tracepoint_probe_register(tp_event->name,
-                                               tp_event->class->perf_probe,
-                                               tp_event);
-
+       ret = tp_event->class->reg(tp_event, TRACE_REG_PERF_REGISTER);
        if (ret)
                goto fail;
 
        mutex_lock(&event_mutex);
        list_for_each_entry(tp_event, &ftrace_events, list) {
                if (tp_event->event.type == event_id &&
-                   tp_event->class &&
-                   (tp_event->class->perf_probe ||
-                    tp_event->class->reg) &&
+                   tp_event->class && tp_event->class->reg &&
                    try_module_get(tp_event->mod)) {
                        ret = perf_trace_event_init(tp_event, p_event);
                        break;
        if (--tp_event->perf_refcount > 0)
                goto out;
 
-       if (tp_event->class->reg)
-               tp_event->class->reg(tp_event, TRACE_REG_PERF_UNREGISTER);
-       else
-               tracepoint_probe_unregister(tp_event->name,
-                                           tp_event->class->perf_probe,
-                                           tp_event);
+       tp_event->class->reg(tp_event, TRACE_REG_PERF_UNREGISTER);
 
        /*
         * Ensure our callback won't be called anymore. See
 
 }
 EXPORT_SYMBOL_GPL(trace_event_raw_init);
 
+int ftrace_event_reg(struct ftrace_event_call *call, enum trace_reg type)
+{
+       switch (type) {
+       case TRACE_REG_REGISTER:
+               return tracepoint_probe_register(call->name,
+                                                call->class->probe,
+                                                call);
+       case TRACE_REG_UNREGISTER:
+               tracepoint_probe_unregister(call->name,
+                                           call->class->probe,
+                                           call);
+               return 0;
+
+#ifdef CONFIG_PERF_EVENTS
+       case TRACE_REG_PERF_REGISTER:
+               return tracepoint_probe_register(call->name,
+                                                call->class->perf_probe,
+                                                call);
+       case TRACE_REG_PERF_UNREGISTER:
+               tracepoint_probe_unregister(call->name,
+                                           call->class->perf_probe,
+                                           call);
+               return 0;
+#endif
+       }
+       return 0;
+}
+EXPORT_SYMBOL_GPL(ftrace_event_reg);
+
 static int ftrace_event_enable_disable(struct ftrace_event_call *call,
                                        int enable)
 {
                if (call->flags & TRACE_EVENT_FL_ENABLED) {
                        call->flags &= ~TRACE_EVENT_FL_ENABLED;
                        tracing_stop_cmdline_record();
-                       if (call->class->reg)
-                               call->class->reg(call, TRACE_REG_UNREGISTER);
-                       else
-                               tracepoint_probe_unregister(call->name,
-                                                           call->class->probe,
-                                                           call);
+                       call->class->reg(call, TRACE_REG_UNREGISTER);
                }
                break;
        case 1:
                if (!(call->flags & TRACE_EVENT_FL_ENABLED)) {
                        tracing_start_cmdline_record();
-                       if (call->class->reg)
-                               ret = call->class->reg(call, TRACE_REG_REGISTER);
-                       else
-                               ret = tracepoint_probe_register(call->name,
-                                                               call->class->probe,
-                                                               call);
+                       ret = call->class->reg(call, TRACE_REG_REGISTER);
                        if (ret) {
                                tracing_stop_cmdline_record();
                                pr_info("event trace: Could not enable event "
        mutex_lock(&event_mutex);
        list_for_each_entry(call, &ftrace_events, list) {
 
-               if (!call->name || !call->class ||
-                   (!call->class->probe && !call->class->reg))
+               if (!call->name || !call->class || !call->class->reg)
                        continue;
 
                if (match &&
                 * The ftrace subsystem is for showing formats only.
                 * They can not be enabled or disabled via the event files.
                 */
-               if (call->class && (call->class->probe || call->class->reg))
+               if (call->class && call->class->reg)
                        return call;
        }
 
 
        mutex_lock(&event_mutex);
        list_for_each_entry(call, &ftrace_events, list) {
-               if (!call->name || !call->class ||
-                   (!call->class->probe && !call->class->reg))
+               if (!call->name || !call->class || !call->class->reg)
                        continue;
 
                if (system && strcmp(call->class->system, system) != 0)
                return -1;
        }
 
-       if (call->class->probe || call->class->reg)
+       if (call->class->reg)
                trace_create_file("enable", 0644, call->dir, call,
                                  enable);
 
 #ifdef CONFIG_PERF_EVENTS
-       if (call->event.type && (call->class->perf_probe || call->class->reg))
+       if (call->event.type && call->class->reg)
                trace_create_file("id", 0444, call->dir, call,
                                  id);
 #endif