coresight: etmx: Claim devices before use
authorSuzuki K Poulose <suzuki.poulose@arm.com>
Thu, 20 Sep 2018 19:18:12 +0000 (13:18 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 25 Sep 2018 18:09:19 +0000 (20:09 +0200)
Use the CLAIM tags to grab the device for self-hosted usage.

Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/hwtracing/coresight/coresight-etm3x.c
drivers/hwtracing/coresight/coresight-etm4x.c

index 206c2381a11a1e6f636023b82a846e30e58d1a35..fd5c4cca7db5879f767027f3f636ee39a78a99c7 100644 (file)
@@ -357,7 +357,7 @@ static int etm_parse_event_config(struct etm_drvdata *drvdata,
 
 static int etm_enable_hw(struct etm_drvdata *drvdata)
 {
-       int i;
+       int i, rc;
        u32 etmcr;
        struct etm_config *config = &drvdata->config;
 
@@ -369,6 +369,9 @@ static int etm_enable_hw(struct etm_drvdata *drvdata)
        etm_set_pwrup(drvdata);
        /* Make sure all registers are accessible */
        etm_os_unlock(drvdata);
+       rc = coresight_claim_device_unlocked(drvdata->base);
+       if (rc)
+               goto done;
 
        etm_set_prog(drvdata);
 
@@ -417,10 +420,15 @@ static int etm_enable_hw(struct etm_drvdata *drvdata)
        etm_writel(drvdata, 0x0, ETMVMIDCVR);
 
        etm_clr_prog(drvdata);
+
+done:
+       if (rc)
+               etm_set_pwrdwn(drvdata);
        CS_LOCK(drvdata->base);
 
-       dev_dbg(drvdata->dev, "cpu: %d enable smp call done\n", drvdata->cpu);
-       return 0;
+       dev_dbg(drvdata->dev, "cpu: %d enable smp call done: %d\n",
+               drvdata->cpu, rc);
+       return rc;
 }
 
 struct etm_enable_arg {
@@ -569,6 +577,8 @@ static void etm_disable_hw(void *info)
        for (i = 0; i < drvdata->nr_cntr; i++)
                config->cntr_val[i] = etm_readl(drvdata, ETMCNTVRn(i));
 
+       coresight_disclaim_device_unlocked(drvdata->base);
+
        etm_set_pwrdwn(drvdata);
        CS_LOCK(drvdata->base);
 
index 064e0bfaefd0650365ca25d97b82b52470adaa55..53e2fb6e86f66a26bec7edb918bd5658ba60b513 100644 (file)
@@ -85,13 +85,17 @@ struct etm4_enable_arg {
 
 static int etm4_enable_hw(struct etmv4_drvdata *drvdata)
 {
-       int i;
+       int i, rc;
        struct etmv4_config *config = &drvdata->config;
 
        CS_UNLOCK(drvdata->base);
 
        etm4_os_unlock(drvdata);
 
+       rc = coresight_claim_device_unlocked(drvdata->base);
+       if (rc)
+               goto done;
+
        /* Disable the trace unit before programming trace registers */
        writel_relaxed(0, drvdata->base + TRCPRGCTLR);
 
@@ -179,10 +183,12 @@ static int etm4_enable_hw(struct etmv4_drvdata *drvdata)
                dev_err(drvdata->dev,
                        "timeout while waiting for Idle Trace Status\n");
 
+done:
        CS_LOCK(drvdata->base);
 
-       dev_dbg(drvdata->dev, "cpu: %d enable smp call done\n", drvdata->cpu);
-       return 0;
+       dev_dbg(drvdata->dev, "cpu: %d enable smp call done: %d\n",
+               drvdata->cpu, rc);
+       return rc;
 }
 
 static void etm4_enable_hw_smp_call(void *info)
@@ -342,6 +348,8 @@ static void etm4_disable_hw(void *info)
        isb();
        writel_relaxed(control, drvdata->base + TRCPRGCTLR);
 
+       coresight_disclaim_device_unlocked(drvdata->base);
+
        CS_LOCK(drvdata->base);
 
        dev_dbg(drvdata->dev, "cpu: %d disable smp call done\n", drvdata->cpu);