[PATCH V3] watchdog: of_xilinx_wdt: Remove unnecessary clock disable call in the remove path
Marion & Christophe JAILLET
christophe.jaillet at wanadoo.fr
Mon Aug 28 11:05:27 PDT 2023
Le 28/08/2023 à 12:08, Guenter Roeck a écrit :
> On 8/28/23 02:50, Srinivas Neeli wrote:
>> There is a mismatch in axi clock enable and disable calls.
>> The axi clock is enabled and disabled by the probe function,
>> then it is again disabled in the remove path.
>> So observed the call trace while removing the module.
>> Use the clk_enable() and devm_clk_get_prepared() functions
>> instead of devm_clk_get_enable() to avoid an extra clock disable
>> call from the remove path.
>>
>> Call trace:
>> clk_core_disable+0xb0/0xc0
>> clk_disable+0x30/0x4c
>> clk_disable_unprepare+0x18/0x30
>> devm_clk_release+0x24/0x40
>> devres_release_all+0xc8/0x190
>> device_unbind_cleanup+0x18/0x6c
>> device_release_driver_internal+0x20c/0x250
>> device_release_driver+0x18/0x24
>> bus_remove_device+0x124/0x130
>> device_del+0x174/0x440
>>
>> Fixes: 4de0224c6fbe ("watchdog: of_xilinx_wdt: Use
>> devm_clk_get_enabled() helper")
>> Signed-off-by: Srinivas Neeli <srinivas.neeli at amd.com>
>
> Reviewed-by: Guenter Roeck <linux at roeck-us.net>
>
Hi, I'm not sure the Fixes tag is correct.
This issue was there before it.
Commit 4de0224c6fbe is just a clean-up and shouldn't change the behavior
of the code.
I think that the issue was introduced in 2017 in b6bc41645547. (should
the bellow patch be backported in older stable kernels)
CJ
>> ---
>> Changes in V3:
>> -> Added "clk_disable() in xwdt_selftest() error path.
>> Changes in V2:
>> -> Fixed typo in "To" list(linux at roeck-us.net).
>> ---
>> drivers/watchdog/of_xilinx_wdt.c | 13 ++++++++++---
>> 1 file changed, 10 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/watchdog/of_xilinx_wdt.c
>> b/drivers/watchdog/of_xilinx_wdt.c
>> index 05657dc1d36a..352853e6fe71 100644
>> --- a/drivers/watchdog/of_xilinx_wdt.c
>> +++ b/drivers/watchdog/of_xilinx_wdt.c
>> @@ -187,7 +187,7 @@ static int xwdt_probe(struct platform_device *pdev)
>> watchdog_set_nowayout(xilinx_wdt_wdd, enable_once);
>> - xdev->clk = devm_clk_get_enabled(dev, NULL);
>> + xdev->clk = devm_clk_get_prepared(dev, NULL);
>> if (IS_ERR(xdev->clk)) {
>> if (PTR_ERR(xdev->clk) != -ENOENT)
>> return PTR_ERR(xdev->clk);
>> @@ -218,18 +218,25 @@ static int xwdt_probe(struct platform_device
>> *pdev)
>> spin_lock_init(&xdev->spinlock);
>> watchdog_set_drvdata(xilinx_wdt_wdd, xdev);
>> + rc = clk_enable(xdev->clk);
>> + if (rc) {
>> + dev_err(dev, "unable to enable clock\n");
>> + return rc;
>> + }
>> +
>> rc = xwdt_selftest(xdev);
>> if (rc == XWT_TIMER_FAILED) {
>> dev_err(dev, "SelfTest routine error\n");
>> + clk_disable(xdev->clk);
>> return rc;
>> }
>> + clk_disable(xdev->clk);
>> +
>> rc = devm_watchdog_register_device(dev, xilinx_wdt_wdd);
>> if (rc)
>> return rc;
>> - clk_disable(xdev->clk);
>> -
>> dev_info(dev, "Xilinx Watchdog Timer with timeout %ds\n",
>> xilinx_wdt_wdd->timeout);
>
More information about the linux-arm-kernel
mailing list