return drvdata->trcid;
 }
 
-static void etm4_enable_hw(void *info)
+struct etm4_enable_arg {
+       struct etmv4_drvdata *drvdata;
+       int rc;
+};
+
+static int etm4_enable_hw(struct etmv4_drvdata *drvdata)
 {
        int i;
-       struct etmv4_drvdata *drvdata = info;
        struct etmv4_config *config = &drvdata->config;
 
        CS_UNLOCK(drvdata->base);
        CS_LOCK(drvdata->base);
 
        dev_dbg(drvdata->dev, "cpu: %d enable smp call done\n", drvdata->cpu);
+       return 0;
+}
+
+static void etm4_enable_hw_smp_call(void *info)
+{
+       struct etm4_enable_arg *arg = info;
+
+       if (WARN_ON(!arg))
+               return;
+       arg->rc = etm4_enable_hw(arg->drvdata);
 }
 
 static int etm4_parse_event_config(struct etmv4_drvdata *drvdata,
        if (ret)
                goto out;
        /* And enable it */
-       etm4_enable_hw(drvdata);
+       ret = etm4_enable_hw(drvdata);
 
 out:
        return ret;
 static int etm4_enable_sysfs(struct coresight_device *csdev)
 {
        struct etmv4_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent);
+       struct etm4_enable_arg arg = { 0 };
        int ret;
 
        spin_lock(&drvdata->spinlock);
         * Executing etm4_enable_hw on the cpu whose ETM is being enabled
         * ensures that register writes occur when cpu is powered.
         */
+       arg.drvdata = drvdata;
        ret = smp_call_function_single(drvdata->cpu,
-                                      etm4_enable_hw, drvdata, 1);
-       if (ret)
-               goto err;
-
-       drvdata->sticky_enable = true;
+                                      etm4_enable_hw_smp_call, &arg, 1);
+       if (!ret)
+               ret = arg.rc;
+       if (!ret)
+               drvdata->sticky_enable = true;
        spin_unlock(&drvdata->spinlock);
 
-       dev_dbg(drvdata->dev, "ETM tracing enabled\n");
-       return 0;
-
-err:
-       spin_unlock(&drvdata->spinlock);
+       if (!ret)
+               dev_dbg(drvdata->dev, "ETM tracing enabled\n");
        return ret;
 }