mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-04-10 21:48:45 -04:00
PCI: rockchip: Simplify clock handling by using clk_bulk*() functions
Currently, the driver acquires clocks and prepare/enable/disable/unprepare the clocks individually thereby making the driver complex to read. The driver can be simplified by using the clk_bulk*() APIs. Use: - devm_clk_bulk_get_all() API to acquire all the clocks - clk_bulk_prepare_enable() to prepare/enable clocks - clk_bulk_disable_unprepare() APIs to disable/unprepare them in bulk Link: https://lore.kernel.org/r/20241202151150.7393-2-linux.amoon@gmail.com Signed-off-by: Anand Moon <linux.amoon@gmail.com> Signed-off-by: Lorenzo Pieralisi <lpieralisi@kernel.org> [bhelgaas: squash error handling fix from https://lore.kernel.org/r/20250106153041.55267-1-linux.amoon@gmail.com] Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
This commit is contained in:
committed by
Bjorn Helgaas
parent
fd46bc0e0b
commit
abdd4c8ea7
@@ -129,29 +129,10 @@ int rockchip_pcie_parse_dt(struct rockchip_pcie *rockchip)
|
||||
return dev_err_probe(dev, PTR_ERR(rockchip->perst_gpio),
|
||||
"failed to get PERST# GPIO\n");
|
||||
|
||||
rockchip->aclk_pcie = devm_clk_get(dev, "aclk");
|
||||
if (IS_ERR(rockchip->aclk_pcie)) {
|
||||
dev_err(dev, "aclk clock not found\n");
|
||||
return PTR_ERR(rockchip->aclk_pcie);
|
||||
}
|
||||
|
||||
rockchip->aclk_perf_pcie = devm_clk_get(dev, "aclk-perf");
|
||||
if (IS_ERR(rockchip->aclk_perf_pcie)) {
|
||||
dev_err(dev, "aclk_perf clock not found\n");
|
||||
return PTR_ERR(rockchip->aclk_perf_pcie);
|
||||
}
|
||||
|
||||
rockchip->hclk_pcie = devm_clk_get(dev, "hclk");
|
||||
if (IS_ERR(rockchip->hclk_pcie)) {
|
||||
dev_err(dev, "hclk clock not found\n");
|
||||
return PTR_ERR(rockchip->hclk_pcie);
|
||||
}
|
||||
|
||||
rockchip->clk_pcie_pm = devm_clk_get(dev, "pm");
|
||||
if (IS_ERR(rockchip->clk_pcie_pm)) {
|
||||
dev_err(dev, "pm clock not found\n");
|
||||
return PTR_ERR(rockchip->clk_pcie_pm);
|
||||
}
|
||||
rockchip->num_clks = devm_clk_bulk_get_all(dev, &rockchip->clks);
|
||||
if (rockchip->num_clks < 0)
|
||||
return dev_err_probe(dev, rockchip->num_clks,
|
||||
"failed to get clocks\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -375,39 +356,11 @@ int rockchip_pcie_enable_clocks(struct rockchip_pcie *rockchip)
|
||||
struct device *dev = rockchip->dev;
|
||||
int err;
|
||||
|
||||
err = clk_prepare_enable(rockchip->aclk_pcie);
|
||||
if (err) {
|
||||
dev_err(dev, "unable to enable aclk_pcie clock\n");
|
||||
return err;
|
||||
}
|
||||
|
||||
err = clk_prepare_enable(rockchip->aclk_perf_pcie);
|
||||
if (err) {
|
||||
dev_err(dev, "unable to enable aclk_perf_pcie clock\n");
|
||||
goto err_aclk_perf_pcie;
|
||||
}
|
||||
|
||||
err = clk_prepare_enable(rockchip->hclk_pcie);
|
||||
if (err) {
|
||||
dev_err(dev, "unable to enable hclk_pcie clock\n");
|
||||
goto err_hclk_pcie;
|
||||
}
|
||||
|
||||
err = clk_prepare_enable(rockchip->clk_pcie_pm);
|
||||
if (err) {
|
||||
dev_err(dev, "unable to enable clk_pcie_pm clock\n");
|
||||
goto err_clk_pcie_pm;
|
||||
}
|
||||
err = clk_bulk_prepare_enable(rockchip->num_clks, rockchip->clks);
|
||||
if (err)
|
||||
return dev_err_probe(dev, err, "failed to enable clocks\n");
|
||||
|
||||
return 0;
|
||||
|
||||
err_clk_pcie_pm:
|
||||
clk_disable_unprepare(rockchip->hclk_pcie);
|
||||
err_hclk_pcie:
|
||||
clk_disable_unprepare(rockchip->aclk_perf_pcie);
|
||||
err_aclk_perf_pcie:
|
||||
clk_disable_unprepare(rockchip->aclk_pcie);
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rockchip_pcie_enable_clocks);
|
||||
|
||||
@@ -415,10 +368,7 @@ void rockchip_pcie_disable_clocks(void *data)
|
||||
{
|
||||
struct rockchip_pcie *rockchip = data;
|
||||
|
||||
clk_disable_unprepare(rockchip->clk_pcie_pm);
|
||||
clk_disable_unprepare(rockchip->hclk_pcie);
|
||||
clk_disable_unprepare(rockchip->aclk_perf_pcie);
|
||||
clk_disable_unprepare(rockchip->aclk_pcie);
|
||||
clk_bulk_disable_unprepare(rockchip->num_clks, rockchip->clks);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rockchip_pcie_disable_clocks);
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#ifndef _PCIE_ROCKCHIP_H
|
||||
#define _PCIE_ROCKCHIP_H
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/pci-ecam.h>
|
||||
@@ -321,10 +322,8 @@ struct rockchip_pcie {
|
||||
struct reset_control *pm_rst;
|
||||
struct reset_control *aclk_rst;
|
||||
struct reset_control *pclk_rst;
|
||||
struct clk *aclk_pcie;
|
||||
struct clk *aclk_perf_pcie;
|
||||
struct clk *hclk_pcie;
|
||||
struct clk *clk_pcie_pm;
|
||||
struct clk_bulk_data *clks;
|
||||
int num_clks;
|
||||
struct regulator *vpcie12v; /* 12V power supply */
|
||||
struct regulator *vpcie3v3; /* 3.3V power supply */
|
||||
struct regulator *vpcie1v8; /* 1.8V power supply */
|
||||
|
||||
Reference in New Issue
Block a user