On 12/4/23 16:24, James Clark wrote: > > > On 01/12/2023 06:20, 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. >> > [...] >> -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; >> + >> + dev_set_drvdata(&pdev->dev, drvdata); >> + pm_runtime_get_noresume(&pdev->dev); >> + pm_runtime_set_active(&pdev->dev); >> + pm_runtime_enable(&pdev->dev); >> + >> + ret = __tmc_probe(&pdev->dev, res, NULL); >> + if (ret) { >> + pm_runtime_put_noidle(&pdev->dev); >> + pm_runtime_disable(&pdev->dev); >> + } > > I'm not sure if these pm_runtime()s are right because there is already a > put inside of __tmc_probe() if it fails. If you unload and then reload Actually there is a pm_runtime_put() on the success path, not when it fails. So pm_runtime_put() gets called when __tmc_probe() returns 0. __tmc_probe() { .... ret = misc_register(&drvdata->miscdev); if (ret) coresight_unregister(drvdata->csdev); else pm_runtime_put(dev); out: return ret; } tmc_platform_probe() { .... pm_runtime_get_noresume(&pdev->dev); pm_runtime_set_active(&pdev->dev); pm_runtime_enable(&pdev->dev); ret = __tmc_probe(&pdev->dev, res, NULL); if (ret) { pm_runtime_put_noidle(&pdev->dev); pm_runtime_disable(&pdev->dev); } return ret; } tmc_probe() { .... return __tmc_probe(&adev->dev, &adev->res, coresight_get_uci_data(id)); } Currently pm_runtime_put() gets called - In success path both for AMBA and platform drivers - In error path only for platform driver Although the problem might be with pm_runtime_disable() instead - pm_runtime_disable() is not required in the platform driver probe() path - But might be required in tmc_platform_remove() along with a clk_put() > all the coresight modules with these patches you get these errors which > are new: > > coresight-tpiu-platform ARMHC979:00: Unbalanced pm_runtime_enable! The code is similar in TPIU platform driver as well. > CSCFG registered etm0 > coresight etm0: CPU0: etm v4.2 initialized > CSCFG registered etm1 > coresight etm1: CPU1: etm v4.2 initialized > CSCFG registered etm2 > coresight etm2: CPU2: etm v4.2 initialized > CSCFG registered etm3 > coresight etm3: CPU3: etm v4.2 initialized > coresight-tmc-platform ARMHC97C:00: Unbalanced pm_runtime_enable! > coresight-tmc-platform ARMHC97C:01: Unbalanced pm_runtime_enable! > coresight-tmc-platform ARMHC97C:02: Unbalanced pm_runtime_enable! > coresight-tmc-platform ARMHC97C:03: Unbalanced pm_runtime_enable! > > It might be worth testing all of these pm_runtime()s, including the > error case ones, because loading and unloading the modules doesn't even > include the error scenarios, so there are probably more bad ones in > there too. The code is very similar in CATU, STM as well but debug_platform_remove() seems to be doing this right. I am not very familiar with all the power management aspects in coresight, please do let me know if I missing something here.