summaryrefslogtreecommitdiff
path: root/drivers/misc/tegra-profiler/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/misc/tegra-profiler/main.c')
-rw-r--r--drivers/misc/tegra-profiler/main.c38
1 files changed, 21 insertions, 17 deletions
diff --git a/drivers/misc/tegra-profiler/main.c b/drivers/misc/tegra-profiler/main.c
index b737f9910cfd..f9d7d4bcdd9b 100644
--- a/drivers/misc/tegra-profiler/main.c
+++ b/drivers/misc/tegra-profiler/main.c
@@ -85,14 +85,14 @@ static int start(void)
return -EBUSY;
}
- preempt_disable();
-
if (!atomic_cmpxchg(&ctx.started, 0, 1)) {
+ preempt_disable();
+
if (ctx.pmu) {
err = ctx.pmu->enable();
if (err) {
pr_err("error: pmu enable\n");
- goto errout;
+ goto errout_preempt;
}
}
@@ -100,46 +100,48 @@ static int start(void)
err = ctx.pl310->enable();
if (err) {
pr_err("error: pl310 enable\n");
- goto errout;
+ goto errout_preempt;
}
}
ctx.comm->reset();
- err = quadd_power_clk_start();
- if (err < 0) {
- pr_err("error: power_clk start\n");
- goto errout;
- }
-
err = quadd_hrt_start();
if (err) {
pr_err("error: hrt start\n");
+ goto errout_preempt;
+ }
+
+ preempt_enable();
+
+ err = quadd_power_clk_start();
+ if (err < 0) {
+ pr_err("error: power_clk start\n");
goto errout;
}
}
- preempt_enable();
return 0;
+errout_preempt:
+ preempt_enable();
+
errout:
atomic_set(&ctx.started, 0);
tegra_profiler_unlock();
- preempt_enable();
return err;
}
static void stop(void)
{
- preempt_disable();
-
if (atomic_cmpxchg(&ctx.started, 1, 0)) {
+ preempt_disable();
+
quadd_hrt_stop();
ctx.comm->reset();
- quadd_power_clk_stop();
quadd_unwind_stop();
if (ctx.pmu)
@@ -149,9 +151,11 @@ static void stop(void)
ctx.pl310->disable();
tegra_profiler_unlock();
- }
- preempt_enable();
+ preempt_enable();
+
+ quadd_power_clk_stop();
+ }
}
static inline int is_event_supported(struct source_info *si, int event)