mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-02-17 11:21:05 -05:00
coresight: catu: Support atclk
The atclk is an optional clock for the CoreSight CATU, but the driver
misses to initialize it.
This change enables atclk in probe of the CATU driver, and dynamically
control the clock during suspend and resume.
The checks for driver data and clocks in suspend and resume are not
needed, remove them. Add error handling in the resume function.
Fixes: fcacb5c154 ("coresight: Introduce support for Coresight Address Translation Unit")
Reviewed-by: Anshuman Khandual <anshuman.khandual@arm.com>
Reviewed-by: Yeoreum Yun <yeoreum.yun@arm.com>
Tested-by: James Clark <james.clark@linaro.org>
Signed-off-by: Leo Yan <leo.yan@arm.com>
Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Link: https://lore.kernel.org/r/20250731-arm_cs_fix_clock_v4-v6-2-1dfe10bb3f6f@arm.com
This commit is contained in:
committed by
Suzuki K Poulose
parent
8a79026926
commit
5483624eff
@@ -520,6 +520,10 @@ static int __catu_probe(struct device *dev, struct resource *res)
|
||||
struct coresight_platform_data *pdata = NULL;
|
||||
void __iomem *base;
|
||||
|
||||
drvdata->atclk = devm_clk_get_optional_enabled(dev, "atclk");
|
||||
if (IS_ERR(drvdata->atclk))
|
||||
return PTR_ERR(drvdata->atclk);
|
||||
|
||||
catu_desc.name = coresight_alloc_device_name(&catu_devs, dev);
|
||||
if (!catu_desc.name)
|
||||
return -ENOMEM;
|
||||
@@ -668,18 +672,26 @@ static int catu_runtime_suspend(struct device *dev)
|
||||
{
|
||||
struct catu_drvdata *drvdata = dev_get_drvdata(dev);
|
||||
|
||||
if (drvdata && !IS_ERR_OR_NULL(drvdata->pclk))
|
||||
clk_disable_unprepare(drvdata->pclk);
|
||||
clk_disable_unprepare(drvdata->atclk);
|
||||
clk_disable_unprepare(drvdata->pclk);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int catu_runtime_resume(struct device *dev)
|
||||
{
|
||||
struct catu_drvdata *drvdata = dev_get_drvdata(dev);
|
||||
int ret;
|
||||
|
||||
if (drvdata && !IS_ERR_OR_NULL(drvdata->pclk))
|
||||
clk_prepare_enable(drvdata->pclk);
|
||||
return 0;
|
||||
ret = clk_prepare_enable(drvdata->pclk);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = clk_prepare_enable(drvdata->atclk);
|
||||
if (ret)
|
||||
clk_disable_unprepare(drvdata->pclk);
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -62,6 +62,7 @@
|
||||
|
||||
struct catu_drvdata {
|
||||
struct clk *pclk;
|
||||
struct clk *atclk;
|
||||
void __iomem *base;
|
||||
struct coresight_device *csdev;
|
||||
int irq;
|
||||
|
||||
Reference in New Issue
Block a user