[PATCH 03/14] staging: clocking-wizard: Split probe function
James Kelly
jamespeterkelly at gmail.com
Mon May 7 01:20:29 UTC 2018
Split probe function so that we can add more code in future patches
without it becoming too big.
Signed-off-by: James Kelly <jamespeterkelly at gmail.com>
---
.../clocking-wizard/clk-xlnx-clock-wizard.c | 63 +++++++++++++++++-----
1 file changed, 51 insertions(+), 12 deletions(-)
diff --git a/drivers/staging/clocking-wizard/clk-xlnx-clock-wizard.c b/drivers/staging/clocking-wizard/clk-xlnx-clock-wizard.c
index 1d42eabdd956..4dec1bfc303a 100644
--- a/drivers/staging/clocking-wizard/clk-xlnx-clock-wizard.c
+++ b/drivers/staging/clocking-wizard/clk-xlnx-clock-wizard.c
@@ -180,14 +180,12 @@ static int __maybe_unused clk_wzrd_resume(struct device *dev)
static SIMPLE_DEV_PM_OPS(clk_wzrd_dev_pm_ops, clk_wzrd_suspend,
clk_wzrd_resume);
-static int clk_wzrd_probe(struct platform_device *pdev)
+static int clk_wzrd_get_device_tree_data(struct device *dev)
{
- int i, ret;
- u32 reg;
+ int ret;
unsigned long rate;
- const char *clk_name;
struct clk_wzrd *clk_wzrd;
- struct resource *mem;
+ struct platform_device *pdev = to_platform_device(dev);
struct device_node *np = pdev->dev.of_node;
clk_wzrd = devm_kzalloc(&pdev->dev, sizeof(*clk_wzrd), GFP_KERNEL);
@@ -195,11 +193,6 @@ static int clk_wzrd_probe(struct platform_device *pdev)
return -ENOMEM;
platform_set_drvdata(pdev, clk_wzrd);
- mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- clk_wzrd->base = devm_ioremap_resource(&pdev->dev, mem);
- if (IS_ERR(clk_wzrd->base))
- return PTR_ERR(clk_wzrd->base);
-
ret = of_property_read_u32(np, "speed-grade", &clk_wzrd->speed_grade);
if (!ret) {
if (clk_wzrd->speed_grade < 1 || clk_wzrd->speed_grade > 3) {
@@ -231,10 +224,36 @@ static int clk_wzrd_probe(struct platform_device *pdev)
if (rate > WZRD_ACLK_MAX_FREQ) {
dev_err(&pdev->dev, "s_axi_aclk frequency (%lu) too high\n",
rate);
- ret = -EINVAL;
- goto err_disable_clk;
+ clk_disable_unprepare(clk_wzrd->axi_clk);
+ return -EINVAL;
}
+ return 0;
+}
+
+static int clk_wzrd_regmap_alloc(struct device *dev)
+{
+ struct resource *mem;
+ struct clk_wzrd *clk_wzrd = dev_get_drvdata(dev);
+ struct platform_device *pdev = to_platform_device(dev);
+
+ mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ clk_wzrd->base = devm_ioremap_resource(&pdev->dev, mem);
+ if (IS_ERR(clk_wzrd->base))
+ return PTR_ERR(clk_wzrd->base);
+
+ return 0;
+}
+
+static int clk_wzrd_register_ccf(struct device *dev)
+{
+ int i, ret;
+ u32 reg;
+ const char *clk_name;
+ struct platform_device *pdev = to_platform_device(dev);
+ struct clk_wzrd *clk_wzrd = dev_get_drvdata(dev);
+ struct device_node *np = pdev->dev.of_node;
+
/* we don't support fractional div/mul yet */
reg = readl(clk_wzrd->base + WZRD_CLK_CFG_REG(0)) &
WZRD_CLKFBOUT_FRAC_EN;
@@ -342,6 +361,26 @@ static int clk_wzrd_probe(struct platform_device *pdev)
return ret;
}
+static int clk_wzrd_probe(struct platform_device *pdev)
+{
+ int ret;
+ struct device *dev = &pdev->dev;
+
+ ret = clk_wzrd_get_device_tree_data(dev);
+ if (ret)
+ return ret;
+
+ ret = clk_wzrd_regmap_alloc(dev);
+ if (ret)
+ return ret;
+
+ ret = clk_wzrd_register_ccf(dev);
+ if (ret)
+ return ret;
+
+ return 0;
+}
+
static int clk_wzrd_remove(struct platform_device *pdev)
{
int i;
--
2.15.1 (Apple Git-101)
More information about the devel
mailing list