]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
coresight: catu: Support atclk
authorLeo Yan <leo.yan@arm.com>
Thu, 31 Jul 2025 12:23:38 +0000 (13:23 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 15 Oct 2025 10:00:15 +0000 (12:00 +0200)
[ Upstream commit 5483624effea2e893dc0df6248253a6a2a085451 ]

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: fcacb5c154ba ("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
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/hwtracing/coresight/coresight-catu.c
drivers/hwtracing/coresight/coresight-catu.h

index 25fd02955c38d608cebd80a64aeea47d014c5a0f..abfff42b20c9317b6c91d0110478d9dc9c39796b 100644 (file)
@@ -521,6 +521,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
 
index 755776cd19c5bb724845ca586ace1e0b29e72556..6e6b7aac206dcae9ff062355e50179637b4d1703 100644 (file)
@@ -62,6 +62,7 @@
 
 struct catu_drvdata {
        struct clk *pclk;
+       struct clk *atclk;
        void __iomem *base;
        struct coresight_device *csdev;
        int irq;