summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/perf/fsl_imx8_ddr_perf.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/drivers/perf/fsl_imx8_ddr_perf.c b/drivers/perf/fsl_imx8_ddr_perf.c
index 4daa782c48df..b1b2a55de77f 100644
--- a/drivers/perf/fsl_imx8_ddr_perf.c
+++ b/drivers/perf/fsl_imx8_ddr_perf.c
@@ -102,7 +102,6 @@ struct ddr_pmu {
const struct fsl_ddr_devtype_data *devtype_data;
int irq;
int id;
- int active_counter;
};
static ssize_t ddr_perf_identifier_show(struct device *dev,
@@ -497,10 +496,6 @@ static void ddr_perf_event_start(struct perf_event *event, int flags)
ddr_perf_counter_enable(pmu, event->attr.config, counter, true);
- if (!pmu->active_counter++)
- ddr_perf_counter_enable(pmu, EVENT_CYCLES_ID,
- EVENT_CYCLES_COUNTER, true);
-
hwc->state = 0;
}
@@ -555,10 +550,6 @@ static void ddr_perf_event_stop(struct perf_event *event, int flags)
ddr_perf_counter_enable(pmu, event->attr.config, counter, false);
ddr_perf_event_update(event);
- if (!--pmu->active_counter)
- ddr_perf_counter_enable(pmu, EVENT_CYCLES_ID,
- EVENT_CYCLES_COUNTER, false);
-
hwc->state |= PERF_HES_STOPPED;
}
@@ -577,10 +568,25 @@ static void ddr_perf_event_del(struct perf_event *event, int flags)
static void ddr_perf_pmu_enable(struct pmu *pmu)
{
+ struct ddr_pmu *ddr_pmu = to_ddr_pmu(pmu);
+
+ /* enable cycle counter if cycle is not active event list */
+ if (ddr_pmu->events[EVENT_CYCLES_COUNTER] == NULL)
+ ddr_perf_counter_enable(ddr_pmu,
+ EVENT_CYCLES_ID,
+ EVENT_CYCLES_COUNTER,
+ true);
}
static void ddr_perf_pmu_disable(struct pmu *pmu)
{
+ struct ddr_pmu *ddr_pmu = to_ddr_pmu(pmu);
+
+ if (ddr_pmu->events[EVENT_CYCLES_COUNTER] == NULL)
+ ddr_perf_counter_enable(ddr_pmu,
+ EVENT_CYCLES_ID,
+ EVENT_CYCLES_COUNTER,
+ false);
}
static int ddr_perf_init(struct ddr_pmu *pmu, void __iomem *base,