Skip to content
This repository has been archived by the owner on Dec 14, 2022. It is now read-only.

Commit

Permalink
coresight: etm: retrieve and handle atclk
Browse files Browse the repository at this point in the history
As can be seen from the datasheet of the CoreSight
Components, DDI0401C A.1.1 the ETM has a clock signal
apart from the AHB interconnect ("amba_pclk", that we're
already handling) called ATCLK, ARM Trace Clock, that SoC
implementers may provide from an entirely different clock
source. So to model this correctly create an optional
path for handling ATCLK alongside the PCLK so we don't
break old platforms that only define PCLK ("amba_pclk") but
still makes it possible for SoCs that have both clock signals
(such as the DB8500) to fetch and prepare/enable/disable/
unprepare both clocks.

The ATCLK is enabled and disabled using the runtime PM
callbacks.

Reviewed-by: Ulf Hansson <[email protected]>
Signed-off-by: Linus Walleij <[email protected]>
Signed-off-by: Mathieu Poirier <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
  • Loading branch information
linusw authored and gregkh committed May 24, 2015
1 parent 32398ef commit d1839e6
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 1 deletion.
2 changes: 2 additions & 0 deletions drivers/hwtracing/coresight/coresight-etm.h
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@
* struct etm_drvdata - specifics associated to an ETM component
* @base: memory mapped base address for this component.
* @dev: the device entity associated to this component.
* @atclk: optional clock for the core parts of the ETM.
* @csdev: component vitals needed by the framework.
* @spinlock: only one at a time pls.
* @cpu: the cpu this component is affined to.
Expand Down Expand Up @@ -191,6 +192,7 @@
struct etm_drvdata {
void __iomem *base;
struct device *dev;
struct clk *atclk;
struct coresight_device *csdev;
spinlock_t spinlock;
int cpu;
Expand Down
36 changes: 35 additions & 1 deletion drivers/hwtracing/coresight/coresight-etm3x.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
#include <linux/amba/bus.h>
#include <linux/seq_file.h>
#include <linux/uaccess.h>
#include <linux/clk.h>
#include <asm/sections.h>

#include "coresight-etm.h"
Expand Down Expand Up @@ -1315,7 +1316,6 @@ static ssize_t seq_curr_state_show(struct device *dev,
}

pm_runtime_get_sync(drvdata->dev);

spin_lock_irqsave(&drvdata->spinlock, flags);

CS_UNLOCK(drvdata->base);
Expand Down Expand Up @@ -1796,6 +1796,13 @@ static int etm_probe(struct amba_device *adev, const struct amba_id *id)

spin_lock_init(&drvdata->spinlock);

drvdata->atclk = devm_clk_get(&adev->dev, "atclk"); /* optional */
if (!IS_ERR(drvdata->atclk)) {
ret = clk_prepare_enable(drvdata->atclk);
if (ret)
return ret;
}

drvdata->cpu = pdata ? pdata->cpu : 0;

get_online_cpus();
Expand Down Expand Up @@ -1858,6 +1865,32 @@ static int etm_remove(struct amba_device *adev)
return 0;
}

#ifdef CONFIG_PM
static int etm_runtime_suspend(struct device *dev)
{
struct etm_drvdata *drvdata = dev_get_drvdata(dev);

if (drvdata && !IS_ERR(drvdata->atclk))
clk_disable_unprepare(drvdata->atclk);

return 0;
}

static int etm_runtime_resume(struct device *dev)
{
struct etm_drvdata *drvdata = dev_get_drvdata(dev);

if (drvdata && !IS_ERR(drvdata->atclk))
clk_prepare_enable(drvdata->atclk);

return 0;
}
#endif

static const struct dev_pm_ops etm_dev_pm_ops = {
SET_RUNTIME_PM_OPS(etm_runtime_suspend, etm_runtime_resume, NULL)
};

static struct amba_id etm_ids[] = {
{ /* ETM 3.3 */
.id = 0x0003b921,
Expand Down Expand Up @@ -1886,6 +1919,7 @@ static struct amba_driver etm_driver = {
.drv = {
.name = "coresight-etm3x",
.owner = THIS_MODULE,
.pm = &etm_dev_pm_ops,
},
.probe = etm_probe,
.remove = etm_remove,
Expand Down

0 comments on commit d1839e6

Please sign in to comment.