},
 };
 
-static inline bool intel_pmu_needs_lbr_smpl(struct perf_event *event)
-{
-       /* user explicitly requested branch sampling */
-       if (has_branch_stack(event))
-               return true;
-
-       /* implicit branch sampling to correct PEBS skid */
-       if (x86_pmu.intel_cap.pebs_trap && event->attr.precise_ip > 1 &&
-           x86_pmu.intel_cap.pebs_format < 2)
-               return true;
-
-       return false;
-}
-
 static void intel_pmu_disable_all(void)
 {
        struct cpu_hw_events *cpuc = this_cpu_ptr(&cpu_hw_events);
         * must disable before any actual event
         * because any event may be combined with LBR
         */
-       if (intel_pmu_needs_lbr_smpl(event))
+       if (needs_branch_stack(event))
                intel_pmu_lbr_disable(event);
 
        if (unlikely(hwc->config_base == MSR_ARCH_PERFMON_FIXED_CTR_CTRL)) {
         * must enabled before any actual event
         * because any event may be combined with LBR
         */
-       if (intel_pmu_needs_lbr_smpl(event))
+       if (needs_branch_stack(event))
                intel_pmu_lbr_enable(event);
 
        if (event->attr.exclude_host)
        if (event->attr.precise_ip && x86_pmu.pebs_aliases)
                x86_pmu.pebs_aliases(event);
 
-       if (intel_pmu_needs_lbr_smpl(event)) {
+       if (needs_branch_stack(event)) {
                ret = intel_pmu_setup_lbr_filter(event);
                if (ret)
                        return ret;
 
        return event->attr.sample_type & PERF_SAMPLE_BRANCH_STACK;
 }
 
+static inline bool needs_branch_stack(struct perf_event *event)
+{
+       return event->attr.branch_sample_type != 0;
+}
+
 extern int perf_output_begin(struct perf_output_handle *handle,
                             struct perf_event *event, unsigned int size);
 extern void perf_output_end(struct perf_output_handle *handle);