On 22/11/2023 17:04, Sudeep Holla wrote:
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.
Thank you Sudeep for getting to the bottom of the problem !
Suzuki