summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichal Simek <michal.simek@amd.com>2026-06-23 11:01:27 +0200
committerXu Yilun <yilun.xu@linux.intel.com>2026-07-07 11:13:23 +0800
commit08303f16480e24705dc4ffc7f2d89c2afbd33a58 (patch)
tree8debdd3b1446bfb149ea03901c788b3c5941c9f9
parentdc59e4fea9d83f03bad6bddf3fa2e52491777482 (diff)
downloadlinux-08303f16480e24705dc4ffc7f2d89c2afbd33a58.tar.gz
linux-08303f16480e24705dc4ffc7f2d89c2afbd33a58.zip
fpga: xilinx-pr-decoupler: Use devm_clk_get_prepared()
The driver keeps the "aclk" clock prepared but disabled in its idle state, toggling only the atomic clk_enable()/clk_disable() around register accesses in the bridge enable_set/enable_show callbacks. At probe time this was open-coded as clk_prepare_enable() immediately followed by clk_disable(), leaving the clock prepared, with a matching clk_unprepare() in the error path and in remove(). devm_clk_get_prepared() expresses exactly this: it gets and prepares the clock and unprepares it automatically on driver detach. Use it to drop the manual prepare/disable dance, the error-path unprepare, and the now-empty clock teardown in remove(). Signed-off-by: Michal Simek <michal.simek@amd.com> Reviewed-by: Radhey Shyam Pandey <radhey.shyam.pandey@amd.com> Reviewed-by: Xu Yilun <yilun.xu@intel.com> Link: https://lore.kernel.org/r/8ca8ee5ba720b608a41f842d2b743302e5500ad0.1782205286.git.michal.simek@amd.com Signed-off-by: Xu Yilun <yilun.xu@linux.intel.com>
-rw-r--r--drivers/fpga/xilinx-pr-decoupler.c20
1 files changed, 2 insertions, 18 deletions
diff --git a/drivers/fpga/xilinx-pr-decoupler.c b/drivers/fpga/xilinx-pr-decoupler.c
index 6994d68e9036..45b65a3264af 100644
--- a/drivers/fpga/xilinx-pr-decoupler.c
+++ b/drivers/fpga/xilinx-pr-decoupler.c
@@ -118,46 +118,30 @@ static int xlnx_pr_decoupler_probe(struct platform_device *pdev)
if (IS_ERR(priv->io_base))
return PTR_ERR(priv->io_base);
- priv->clk = devm_clk_get(&pdev->dev, "aclk");
+ priv->clk = devm_clk_get_prepared(&pdev->dev, "aclk");
if (IS_ERR(priv->clk))
return dev_err_probe(&pdev->dev, PTR_ERR(priv->clk),
"input clock not found\n");
- err = clk_prepare_enable(priv->clk);
- if (err) {
- dev_err(&pdev->dev, "unable to enable clock\n");
- return err;
- }
-
- clk_disable(priv->clk);
-
br = fpga_bridge_register(&pdev->dev, priv->ipconfig->name,
&xlnx_pr_decoupler_br_ops, priv);
if (IS_ERR(br)) {
err = PTR_ERR(br);
dev_err(&pdev->dev, "unable to register %s",
priv->ipconfig->name);
- goto err_clk;
+ return err;
}
platform_set_drvdata(pdev, br);
return 0;
-
-err_clk:
- clk_unprepare(priv->clk);
-
- return err;
}
static void xlnx_pr_decoupler_remove(struct platform_device *pdev)
{
struct fpga_bridge *bridge = platform_get_drvdata(pdev);
- struct xlnx_pr_decoupler_data *p = bridge->priv;
fpga_bridge_unregister(bridge);
-
- clk_unprepare(p->clk);
}
static struct platform_driver xlnx_pr_decoupler_driver = {