[PATCH 03/13] coresight: etm: let runtime PM handle core clock
Ulf Hansson
ulf.hansson at linaro.org
Fri Apr 17 02:06:46 PDT 2015
On 17 April 2015 at 10:58, Linus Walleij <linus.walleij at linaro.org> 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 <linus.walleij at linaro.org>
Reviewed-by: Ulf Hansson <ulf.hansson at linaro.org>
> ---
> 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 <linux/smp.h>
> #include <linux/sysfs.h>
> #include <linux/stat.h>
> -#include <linux/clk.h>
> +#include <linux/pm_runtime.h>
> #include <linux/cpu.h>
> #include <linux/of.h>
> #include <linux/coresight.h>
> @@ -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
>
More information about the linux-arm-kernel
mailing list