coresight: tmc: making prepare/unprepare functions generic
authorMathieu Poirier <mathieu.poirier@linaro.org>
Tue, 3 May 2016 17:33:51 +0000 (11:33 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 3 May 2016 21:59:30 +0000 (14:59 -0700)
Dealing with HW related matters in tmc_read_prepare/unprepare
becomes convoluted when many cases need to be handled distinctively.

As such moving processing related to HW setup to individual driver
files and keep the core driver generic.

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

index 467d19221f7b40fabe0a72815c6db659c35d172a..91e43572ce9f53f92b5bbeac1f47f22ec778b0a3 100644 (file)
@@ -71,7 +71,7 @@ static void tmc_etb_dump_hw(struct tmc_drvdata *drvdata)
        }
 }
 
-void tmc_etb_disable_hw(struct tmc_drvdata *drvdata)
+static void tmc_etb_disable_hw(struct tmc_drvdata *drvdata)
 {
        CS_UNLOCK(drvdata->base);
 
@@ -202,3 +202,63 @@ const struct coresight_ops tmc_etf_cs_ops = {
        .sink_ops       = &tmc_etf_sink_ops,
        .link_ops       = &tmc_etf_link_ops,
 };
+
+int tmc_read_prepare_etb(struct tmc_drvdata *drvdata)
+{
+       enum tmc_mode mode;
+       int ret = 0;
+       unsigned long flags;
+
+       /* config types are set a boot time and never change */
+       if (WARN_ON_ONCE(drvdata->config_type != TMC_CONFIG_TYPE_ETB &&
+                        drvdata->config_type != TMC_CONFIG_TYPE_ETF))
+               return -EINVAL;
+
+       spin_lock_irqsave(&drvdata->spinlock, flags);
+
+       /* There is no point in reading a TMC in HW FIFO mode */
+       mode = readl_relaxed(drvdata->base + TMC_MODE);
+       if (mode != TMC_MODE_CIRCULAR_BUFFER) {
+               ret = -EINVAL;
+               goto out;
+       }
+
+       /* Disable the TMC if need be */
+       if (drvdata->enable)
+               tmc_etb_disable_hw(drvdata);
+
+       drvdata->reading = true;
+out:
+       spin_unlock_irqrestore(&drvdata->spinlock, flags);
+
+       return ret;
+}
+
+int tmc_read_unprepare_etb(struct tmc_drvdata *drvdata)
+{
+       enum tmc_mode mode;
+       unsigned long flags;
+
+       /* config types are set a boot time and never change */
+       if (WARN_ON_ONCE(drvdata->config_type != TMC_CONFIG_TYPE_ETB &&
+                        drvdata->config_type != TMC_CONFIG_TYPE_ETF))
+               return -EINVAL;
+
+       spin_lock_irqsave(&drvdata->spinlock, flags);
+
+       /* There is no point in reading a TMC in HW FIFO mode */
+       mode = readl_relaxed(drvdata->base + TMC_MODE);
+       if (mode != TMC_MODE_CIRCULAR_BUFFER) {
+               spin_unlock_irqrestore(&drvdata->spinlock, flags);
+               return -EINVAL;
+       }
+
+       /* Re-enable the TMC if need be */
+       if (drvdata->enable)
+               tmc_etb_enable_hw(drvdata);
+
+       drvdata->reading = false;
+       spin_unlock_irqrestore(&drvdata->spinlock, flags);
+
+       return 0;
+}
index 5d9333ec49ae4ca0ecd44ee6c88ad97abfa56a63..3483d139a4ac24d6cd2182e7c661e54637150fa8 100644 (file)
@@ -70,7 +70,7 @@ static void tmc_etr_dump_hw(struct tmc_drvdata *drvdata)
                drvdata->buf = drvdata->vaddr;
 }
 
-void tmc_etr_disable_hw(struct tmc_drvdata *drvdata)
+static void tmc_etr_disable_hw(struct tmc_drvdata *drvdata)
 {
        CS_UNLOCK(drvdata->base);
 
@@ -126,3 +126,43 @@ static const struct coresight_ops_sink tmc_etr_sink_ops = {
 const struct coresight_ops tmc_etr_cs_ops = {
        .sink_ops       = &tmc_etr_sink_ops,
 };
+
+int tmc_read_prepare_etr(struct tmc_drvdata *drvdata)
+{
+       unsigned long flags;
+
+       /* config types are set a boot time and never change */
+       if (WARN_ON_ONCE(drvdata->config_type != TMC_CONFIG_TYPE_ETR))
+               return -EINVAL;
+
+       spin_lock_irqsave(&drvdata->spinlock, flags);
+
+       /* Disable the TMC if need be */
+       if (drvdata->enable)
+               tmc_etr_disable_hw(drvdata);
+
+       drvdata->reading = true;
+       spin_unlock_irqrestore(&drvdata->spinlock, flags);
+
+       return 0;
+}
+
+int tmc_read_unprepare_etr(struct tmc_drvdata *drvdata)
+{
+       unsigned long flags;
+
+       /* config types are set a boot time and never change */
+       if (WARN_ON_ONCE(drvdata->config_type != TMC_CONFIG_TYPE_ETR))
+               return -EINVAL;
+
+       spin_lock_irqsave(&drvdata->spinlock, flags);
+
+       /* RE-enable the TMC if need be */
+       if (drvdata->enable)
+               tmc_etr_enable_hw(drvdata);
+
+       drvdata->reading = false;
+       spin_unlock_irqrestore(&drvdata->spinlock, flags);
+
+       return 0;
+}
index 8d7f6d54c9b0cbf01542cfe8e5bcda8f8bd70cf9..63f8e55116a61244f7a42a82121809b2bc5c57e5 100644 (file)
@@ -76,76 +76,43 @@ void tmc_disable_hw(struct tmc_drvdata *drvdata)
 static int tmc_read_prepare(struct tmc_drvdata *drvdata)
 {
        int ret = 0;
-       unsigned long flags;
-       enum tmc_mode mode;
-
-       spin_lock_irqsave(&drvdata->spinlock, flags);
-       if (!drvdata->enable)
-               goto out;
 
        switch (drvdata->config_type) {
        case TMC_CONFIG_TYPE_ETB:
-               tmc_etb_disable_hw(drvdata);
-               break;
        case TMC_CONFIG_TYPE_ETF:
-               /* There is no point in reading a TMC in HW FIFO mode */
-               mode = readl_relaxed(drvdata->base + TMC_MODE);
-               if (mode != TMC_MODE_CIRCULAR_BUFFER) {
-                       ret = -EINVAL;
-                       goto err;
-               }
-
-               tmc_etb_disable_hw(drvdata);
+               ret = tmc_read_prepare_etb(drvdata);
                break;
        case TMC_CONFIG_TYPE_ETR:
-               tmc_etr_disable_hw(drvdata);
+               ret = tmc_read_prepare_etr(drvdata);
                break;
        default:
                ret = -EINVAL;
-               goto err;
        }
 
-out:
-       drvdata->reading = true;
-       dev_info(drvdata->dev, "TMC read start\n");
-err:
-       spin_unlock_irqrestore(&drvdata->spinlock, flags);
+       if (!ret)
+               dev_info(drvdata->dev, "TMC read start\n");
+
        return ret;
 }
 
 static void tmc_read_unprepare(struct tmc_drvdata *drvdata)
 {
-       unsigned long flags;
-       enum tmc_mode mode;
-
-       spin_lock_irqsave(&drvdata->spinlock, flags);
-       if (!drvdata->enable)
-               goto out;
+       int ret = 0;
 
        switch (drvdata->config_type) {
        case TMC_CONFIG_TYPE_ETB:
-               tmc_etb_enable_hw(drvdata);
-               break;
        case TMC_CONFIG_TYPE_ETF:
-               /* Make sure we don't re-enable a TMC in HW FIFO mode */
-               mode = readl_relaxed(drvdata->base + TMC_MODE);
-               if (mode != TMC_MODE_CIRCULAR_BUFFER)
-                       goto err;
-
-               tmc_etb_enable_hw(drvdata);
+               ret = tmc_read_unprepare_etb(drvdata);
                break;
        case TMC_CONFIG_TYPE_ETR:
-               tmc_etr_disable_hw(drvdata);
+               ret = tmc_read_unprepare_etr(drvdata);
                break;
        default:
-               goto err;
+               ret = -EINVAL;
        }
 
-out:
-       drvdata->reading = false;
-       dev_info(drvdata->dev, "TMC read end\n");
-err:
-       spin_unlock_irqrestore(&drvdata->spinlock, flags);
+       if (!ret)
+               dev_info(drvdata->dev, "TMC read end\n");
 }
 
 static int tmc_open(struct inode *inode, struct file *file)
index b3017e115c4db46d415dced296053d4cba3c029c..df661903f83cf0e8a2d8d6be9c264ecc19785b4c 100644 (file)
@@ -127,13 +127,13 @@ void tmc_enable_hw(struct tmc_drvdata *drvdata);
 void tmc_disable_hw(struct tmc_drvdata *drvdata);
 
 /* ETB/ETF functions */
-void tmc_etb_enable_hw(struct tmc_drvdata *drvdata);
-void tmc_etb_disable_hw(struct tmc_drvdata *drvdata);
+int tmc_read_prepare_etb(struct tmc_drvdata *drvdata);
+int tmc_read_unprepare_etb(struct tmc_drvdata *drvdata);
 extern const struct coresight_ops tmc_etb_cs_ops;
 extern const struct coresight_ops tmc_etf_cs_ops;
 
 /* ETR functions */
-void tmc_etr_enable_hw(struct tmc_drvdata *drvdata);
-void tmc_etr_disable_hw(struct tmc_drvdata *drvdata);
+int tmc_read_prepare_etr(struct tmc_drvdata *drvdata);
+int tmc_read_unprepare_etr(struct tmc_drvdata *drvdata);
 extern const struct coresight_ops tmc_etr_cs_ops;
 #endif