On Fri, Oct 27, 2023 at 12:59:41PM +0530, Anshuman Khandual wrote:
Add support for the tmc devices in the platform driver, which can then be
used on ACPI based platforms. This change would now allow runtime power
management for ACPI based systems. The driver would try to enable the APB
clock if available.
Cc: Lorenzo Pieralisi lpieralisi@kernel.org
Cc: Sudeep Holla sudeep.holla@arm.com
Cc: Suzuki K Poulose suzuki.poulose@arm.com
Cc: Mike Leach mike.leach@linaro.org
Cc: James Clark james.clark@arm.com
Cc: linux-acpi@vger.kernel.org
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-kernel@vger.kernel.org
Cc: coresight@lists.linaro.org
Signed-off-by: Anshuman Khandual anshuman.khandual@arm.com
drivers/acpi/arm64/amba.c | 2 -
.../hwtracing/coresight/coresight-tmc-core.c | 127 +++++++++++++++---
drivers/hwtracing/coresight/coresight-tmc.h | 1 +
3 files changed, 113 insertions(+), 17 deletions(-)
[...]
diff --git a/drivers/hwtracing/coresight/coresight-tmc-core.c b/drivers/hwtracing/coresight/coresight-tmc-core.c
index 7ec5365e2b64..618bc0b7a1a5 100644
--- a/drivers/hwtracing/coresight/coresight-tmc-core.c
+++ b/drivers/hwtracing/coresight/coresight-tmc-core.c
[...]
@@ -573,9 +579,9 @@ static void tmc_shutdown(struct amba_device *adev)
spin_unlock_irqrestore(&drvdata->spinlock, flags);
}
-static void tmc_remove(struct amba_device *adev)
+static void __tmc_remove(struct device *dev)
{
- struct tmc_drvdata *drvdata = dev_get_drvdata(&adev->dev);
- struct tmc_drvdata *drvdata = dev_get_drvdata(dev);
/*
* Since misc_open() holds a refcount on the f_ops, which is
@@ -586,6 +592,11 @@ static void tmc_remove(struct amba_device *adev)
coresight_unregister(drvdata->csdev);
}
+static void tmc_remove(struct amba_device *adev)
+{
- __tmc_remove(&adev->dev);
+}
- static const struct amba_id tmc_ids[] = {
CS_AMBA_ID(0x000bb961),
/* Coresight SoC 600 TMC-ETR/ETS */
@@ -613,6 +624,92 @@ static struct amba_driver tmc_driver = {
module_amba_driver(tmc_driver);
+static int tmc_platform_probe(struct platform_device *pdev)
+{
- struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- struct tmc_drvdata *drvdata;
- int ret = 0;
- drvdata = devm_kzalloc(&pdev->dev, sizeof(*drvdata), GFP_KERNEL);
- if (!drvdata)
return -ENOMEM;
- drvdata->pclk = coresight_get_enable_apb_pclk(&pdev->dev);
- if (IS_ERR(drvdata->pclk))
return -ENODEV;
--->8
- if (res) {
drvdata->base = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(drvdata->base)) {
clk_put(drvdata->pclk);
return PTR_ERR(drvdata->base);
}
- }
You need drop the above hunk as _tmc_probe() already takes care of that.
This is the root cause for the issue I reported in the other thread. Also
sorry for the confusion, I had to refer to coresight-tmc-core.c and post
the patch to unify module_init/exit but completely mixed up the file/patch
and referred coresight-tpiu-core.c instead as that patch was dealing with
it.