These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / hwtracing / coresight / coresight-tmc.c
index 7147f3d..a57c7ec 100644 (file)
@@ -23,7 +23,7 @@
 #include <linux/slab.h>
 #include <linux/dma-mapping.h>
 #include <linux/spinlock.h>
-#include <linux/clk.h>
+#include <linux/pm_runtime.h>
 #include <linux/of.h>
 #include <linux/coresight.h>
 #include <linux/amba/bus.h>
@@ -104,7 +104,6 @@ enum tmc_mem_intf_width {
  * @dev:       the device entity associated to this component.
  * @csdev:     component vitals needed by the framework.
  * @miscdev:   specifics to handle "/dev/xyz.tmc" entry.
- * @clk:       the clock this component is associated to.
  * @spinlock:  only one at a time pls.
  * @read_count:        manages preparation of buffer for reading.
  * @buf:       area of memory where trace data get sent.
@@ -120,7 +119,6 @@ struct tmc_drvdata {
        struct device           *dev;
        struct coresight_device *csdev;
        struct miscdevice       miscdev;
-       struct clk              *clk;
        spinlock_t              spinlock;
        int                     read_count;
        bool                    reading;
@@ -242,17 +240,14 @@ static void tmc_etf_enable_hw(struct tmc_drvdata *drvdata)
 
 static int tmc_enable(struct tmc_drvdata *drvdata, enum tmc_mode mode)
 {
-       int ret;
        unsigned long flags;
 
-       ret = clk_prepare_enable(drvdata->clk);
-       if (ret)
-               return ret;
+       pm_runtime_get_sync(drvdata->dev);
 
        spin_lock_irqsave(&drvdata->spinlock, flags);
        if (drvdata->reading) {
                spin_unlock_irqrestore(&drvdata->spinlock, flags);
-               clk_disable_unprepare(drvdata->clk);
+               pm_runtime_put(drvdata->dev);
                return -EBUSY;
        }
 
@@ -386,7 +381,7 @@ out:
        drvdata->enable = false;
        spin_unlock_irqrestore(&drvdata->spinlock, flags);
 
-       clk_disable_unprepare(drvdata->clk);
+       pm_runtime_put(drvdata->dev);
 
        dev_info(drvdata->dev, "TMC disabled\n");
 }
@@ -568,17 +563,13 @@ static const struct file_operations tmc_fops = {
 static ssize_t status_show(struct device *dev,
                           struct device_attribute *attr, char *buf)
 {
-       int ret;
        unsigned long flags;
        u32 tmc_rsz, tmc_sts, tmc_rrp, tmc_rwp, tmc_trg;
        u32 tmc_ctl, tmc_ffsr, tmc_ffcr, tmc_mode, tmc_pscr;
        u32 devid;
        struct tmc_drvdata *drvdata = dev_get_drvdata(dev->parent);
 
-       ret = clk_prepare_enable(drvdata->clk);
-       if (ret)
-               goto out;
-
+       pm_runtime_get_sync(drvdata->dev);
        spin_lock_irqsave(&drvdata->spinlock, flags);
        CS_UNLOCK(drvdata->base);
 
@@ -596,8 +587,7 @@ static ssize_t status_show(struct device *dev,
 
        CS_LOCK(drvdata->base);
        spin_unlock_irqrestore(&drvdata->spinlock, flags);
-
-       clk_disable_unprepare(drvdata->clk);
+       pm_runtime_put(drvdata->dev);
 
        return sprintf(buf,
                       "Depth:\t\t0x%x\n"
@@ -613,7 +603,7 @@ static ssize_t status_show(struct device *dev,
                       "DEVID:\t\t0x%x\n",
                        tmc_rsz, tmc_sts, tmc_rrp, tmc_rwp, tmc_trg,
                        tmc_ctl, tmc_ffsr, tmc_ffcr, tmc_mode, tmc_pscr, devid);
-out:
+
        return -EINVAL;
 }
 static DEVICE_ATTR_RO(status);
@@ -700,11 +690,6 @@ static int tmc_probe(struct amba_device *adev, const struct amba_id *id)
 
        spin_lock_init(&drvdata->spinlock);
 
-       drvdata->clk = adev->pclk;
-       ret = clk_prepare_enable(drvdata->clk);
-       if (ret)
-               return ret;
-
        devid = readl_relaxed(drvdata->base + CORESIGHT_DEVID);
        drvdata->config_type = BMVAL(devid, 6, 7);
 
@@ -719,7 +704,7 @@ static int tmc_probe(struct amba_device *adev, const struct amba_id *id)
                drvdata->size = readl_relaxed(drvdata->base + TMC_RSZ) * 4;
        }
 
-       clk_disable_unprepare(drvdata->clk);
+       pm_runtime_put(&adev->dev);
 
        if (drvdata->config_type == TMC_CONFIG_TYPE_ETR) {
                drvdata->vaddr = dma_alloc_coherent(dev, drvdata->size,