From mboxrd@z Thu Jan 1 00:00:00 1970 From: ulf.hansson@linaro.org (Ulf Hansson) Date: Fri, 17 Apr 2015 11:06:46 +0200 Subject: [PATCH 03/13] coresight: etm: let runtime PM handle core clock In-Reply-To: <1429261140-13910-4-git-send-email-linus.walleij@linaro.org> References: <1429261140-13910-1-git-send-email-linus.walleij@linaro.org> <1429261140-13910-4-git-send-email-linus.walleij@linaro.org> Message-ID: To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On 17 April 2015 at 10:58, Linus Walleij wrote: > This uses runtime PM to manage the PCLK ("amba_pclk") instead > of screwing around with the framework by going in and taking > a copy from the amba device. The amba bus core will uprepare > and disable the clock when the device is unused when > CONFIG_PM is selected, else the clock will be always on. > > Prior to this patch, as the AMBA primecell bus code enables > the PCLK, it would be left on after probe as > the clk_prepare_enable() and clk_disable_unprepare() was > called and thus just increase and decreas the refcount by > one, without it reaching zero and actually disabling the > clock. Now the runtime PM callbacks will make sure the PCLK > is properly disabled after probe. > > Signed-off-by: Linus Walleij Reviewed-by: Ulf Hansson > --- > drivers/coresight/coresight-etm.h | 2 -- > drivers/coresight/coresight-etm3x.c | 60 ++++++++++--------------------------- > 2 files changed, 16 insertions(+), 46 deletions(-) > > diff --git a/drivers/coresight/coresight-etm.h b/drivers/coresight/coresight-etm.h > index 501c5fac8a45..d1421e1f8b8a 100644 > --- a/drivers/coresight/coresight-etm.h > +++ b/drivers/coresight/coresight-etm.h > @@ -141,7 +141,6 @@ > * @base: memory mapped base address for this component. > * @dev: the device entity associated to this component. > * @csdev: component vitals needed by the framework. > - * @clk: the clock this component is associated to. > * @spinlock: only one at a time pls. > * @cpu: the cpu this component is affined to. > * @port_size: port size as reported by ETMCR bit 4-6 and 21. > @@ -193,7 +192,6 @@ struct etm_drvdata { > void __iomem *base; > struct device *dev; > struct coresight_device *csdev; > - struct clk *clk; > spinlock_t spinlock; > int cpu; > int port_size; > diff --git a/drivers/coresight/coresight-etm3x.c b/drivers/coresight/coresight-etm3x.c > index 66e210d5fddd..f0be12bd79e0 100644 > --- a/drivers/coresight/coresight-etm3x.c > +++ b/drivers/coresight/coresight-etm3x.c > @@ -23,7 +23,7 @@ > #include > #include > #include > -#include > +#include > #include > #include > #include > @@ -325,9 +325,7 @@ static int etm_trace_id(struct coresight_device *csdev) > > if (!drvdata->enable) > return drvdata->traceid; > - > - if (clk_prepare_enable(drvdata->clk)) > - goto out; > + pm_runtime_get_sync(csdev->dev.parent); > > spin_lock_irqsave(&drvdata->spinlock, flags); > > @@ -336,8 +334,8 @@ static int etm_trace_id(struct coresight_device *csdev) > CS_LOCK(drvdata->base); > > spin_unlock_irqrestore(&drvdata->spinlock, flags); > - clk_disable_unprepare(drvdata->clk); > -out: > + pm_runtime_put(csdev->dev.parent); > + > return trace_id; > } > > @@ -346,10 +344,7 @@ static int etm_enable(struct coresight_device *csdev) > struct etm_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); > int ret; > > - ret = clk_prepare_enable(drvdata->clk); > - if (ret) > - goto err_clk; > - > + pm_runtime_get_sync(csdev->dev.parent); > spin_lock(&drvdata->spinlock); > > /* > @@ -373,8 +368,7 @@ static int etm_enable(struct coresight_device *csdev) > return 0; > err: > spin_unlock(&drvdata->spinlock); > - clk_disable_unprepare(drvdata->clk); > -err_clk: > + pm_runtime_put(csdev->dev.parent); > return ret; > } > > @@ -423,8 +417,7 @@ static void etm_disable(struct coresight_device *csdev) > > spin_unlock(&drvdata->spinlock); > put_online_cpus(); > - > - clk_disable_unprepare(drvdata->clk); > + pm_runtime_put(csdev->dev.parent); > > dev_info(drvdata->dev, "ETM tracing disabled\n"); > } > @@ -474,14 +467,10 @@ static DEVICE_ATTR_RO(nr_ctxid_cmp); > static ssize_t etmsr_show(struct device *dev, > struct device_attribute *attr, char *buf) > { > - int ret; > unsigned long flags, val; > struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); > > - ret = clk_prepare_enable(drvdata->clk); > - if (ret) > - return ret; > - > + pm_runtime_get_sync(drvdata->dev); > spin_lock_irqsave(&drvdata->spinlock, flags); > CS_UNLOCK(drvdata->base); > > @@ -489,7 +478,7 @@ static ssize_t etmsr_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, "%#lx\n", val); > } > @@ -1317,7 +1306,6 @@ static DEVICE_ATTR_RW(seq_13_event); > static ssize_t seq_curr_state_show(struct device *dev, > struct device_attribute *attr, char *buf) > { > - int ret; > unsigned long val, flags; > struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); > > @@ -1326,9 +1314,7 @@ static ssize_t seq_curr_state_show(struct device *dev, > goto out; > } > > - ret = clk_prepare_enable(drvdata->clk); > - if (ret) > - return ret; > + pm_runtime_get_sync(drvdata->dev); > > spin_lock_irqsave(&drvdata->spinlock, flags); > > @@ -1337,7 +1323,7 @@ static ssize_t seq_curr_state_show(struct device *dev, > CS_LOCK(drvdata->base); > > spin_unlock_irqrestore(&drvdata->spinlock, flags); > - clk_disable_unprepare(drvdata->clk); > + pm_runtime_put(drvdata->dev); > out: > return sprintf(buf, "%#lx\n", val); > } > @@ -1521,10 +1507,7 @@ static ssize_t status_show(struct device *dev, > unsigned long flags; > struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); > > - ret = clk_prepare_enable(drvdata->clk); > - if (ret) > - return ret; > - > + pm_runtime_get_sync(drvdata->dev); > spin_lock_irqsave(&drvdata->spinlock, flags); > > CS_UNLOCK(drvdata->base); > @@ -1550,7 +1533,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 ret; > } > @@ -1559,7 +1542,6 @@ static DEVICE_ATTR_RO(status); > static ssize_t traceid_show(struct device *dev, > struct device_attribute *attr, char *buf) > { > - int ret; > unsigned long val, flags; > struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent); > > @@ -1568,10 +1550,7 @@ static ssize_t traceid_show(struct device *dev, > goto out; > } > > - ret = clk_prepare_enable(drvdata->clk); > - if (ret) > - return ret; > - > + pm_runtime_get_sync(drvdata->dev); > spin_lock_irqsave(&drvdata->spinlock, flags); > CS_UNLOCK(drvdata->base); > > @@ -1579,7 +1558,7 @@ static ssize_t traceid_show(struct device *dev, > > CS_LOCK(drvdata->base); > spin_unlock_irqrestore(&drvdata->spinlock, flags); > - clk_disable_unprepare(drvdata->clk); > + pm_runtime_put(drvdata->dev); > out: > return sprintf(buf, "%#lx\n", val); > } > @@ -1817,11 +1796,6 @@ static int etm_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; > - > drvdata->cpu = pdata ? pdata->cpu : 0; > > get_online_cpus(); > @@ -1845,8 +1819,6 @@ static int etm_probe(struct amba_device *adev, const struct amba_id *id) > } > etm_init_default_data(drvdata); > > - clk_disable_unprepare(drvdata->clk); > - > desc->type = CORESIGHT_DEV_TYPE_SOURCE; > desc->subtype.source_subtype = CORESIGHT_DEV_SUBTYPE_SOURCE_PROC; > desc->ops = &etm_cs_ops; > @@ -1859,6 +1831,7 @@ static int etm_probe(struct amba_device *adev, const struct amba_id *id) > goto err_arch_supported; > } > > + pm_runtime_put(&adev->dev); > dev_info(dev, "%s initialized\n", (char *)id->data); > > if (boot_enable) { > @@ -1869,7 +1842,6 @@ static int etm_probe(struct amba_device *adev, const struct amba_id *id) > return 0; > > err_arch_supported: > - clk_disable_unprepare(drvdata->clk); > if (--etm_count == 0) > unregister_hotcpu_notifier(&etm_cpu_notifier); > return ret; > -- > 1.9.3 >