]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
clk: starfive: Make _clk_get become a common helper function
authorChanghuang Liang <changhuang.liang@starfivetech.com>
Tue, 14 Jan 2025 08:13:00 +0000 (00:13 -0800)
committerStephen Boyd <sboyd@kernel.org>
Tue, 14 Jan 2025 18:55:00 +0000 (10:55 -0800)
Introduce num_reg to store the number of clocks, this helps to make
_clk_get become a common helper function which called jh71x0_clk_get().
With this, it helps to simplify the code and extend the code in the
future.

Signed-off-by: Changhuang Liang <changhuang.liang@starfivetech.com>
Link: https://lore.kernel.org/r/20250114081300.36600-1-changhuang.liang@starfivetech.com
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
drivers/clk/starfive/clk-starfive-jh7100-audio.c
drivers/clk/starfive/clk-starfive-jh7110-aon.c
drivers/clk/starfive/clk-starfive-jh7110-isp.c
drivers/clk/starfive/clk-starfive-jh7110-stg.c
drivers/clk/starfive/clk-starfive-jh7110-sys.c
drivers/clk/starfive/clk-starfive-jh7110-vout.c
drivers/clk/starfive/clk-starfive-jh71x0.c
drivers/clk/starfive/clk-starfive-jh71x0.h

index 1fcf4e62f347db7410920c022cd9bc85f0a82ccc..7de23f6749aa9a64505ac86622aa1fb4f288788b 100644 (file)
@@ -84,17 +84,6 @@ static const struct jh71x0_clk_data jh7100_audclk_data[] = {
                    JH7100_AUDCLK_AUDIO_12288),
 };
 
-static struct clk_hw *jh7100_audclk_get(struct of_phandle_args *clkspec, void *data)
-{
-       struct jh71x0_clk_priv *priv = data;
-       unsigned int idx = clkspec->args[0];
-
-       if (idx < JH7100_AUDCLK_END)
-               return &priv->reg[idx].hw;
-
-       return ERR_PTR(-EINVAL);
-}
-
 static int jh7100_audclk_probe(struct platform_device *pdev)
 {
        struct jh71x0_clk_priv *priv;
@@ -106,6 +95,7 @@ static int jh7100_audclk_probe(struct platform_device *pdev)
                return -ENOMEM;
 
        spin_lock_init(&priv->rmw_lock);
+       priv->num_reg = JH7100_AUDCLK_END;
        priv->dev = &pdev->dev;
        priv->base = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(priv->base))
@@ -146,7 +136,7 @@ static int jh7100_audclk_probe(struct platform_device *pdev)
                        return ret;
        }
 
-       return devm_of_clk_add_hw_provider(priv->dev, jh7100_audclk_get, priv);
+       return devm_of_clk_add_hw_provider(priv->dev, jh71x0_clk_get, priv);
 }
 
 static const struct of_device_id jh7100_audclk_match[] = {
index 418efdad719b8714ea410191c73ee37e3b9cf9df..6f67587f4335ee481f6ba25b709e95c73e7660df 100644 (file)
@@ -54,17 +54,6 @@ static const struct jh71x0_clk_data jh7110_aonclk_data[] = {
        JH71X0_GATE(JH7110_AONCLK_RTC_CAL, "rtc_cal", 0, JH7110_AONCLK_OSC),
 };
 
-static struct clk_hw *jh7110_aonclk_get(struct of_phandle_args *clkspec, void *data)
-{
-       struct jh71x0_clk_priv *priv = data;
-       unsigned int idx = clkspec->args[0];
-
-       if (idx < JH7110_AONCLK_END)
-               return &priv->reg[idx].hw;
-
-       return ERR_PTR(-EINVAL);
-}
-
 static int jh7110_aoncrg_probe(struct platform_device *pdev)
 {
        struct jh71x0_clk_priv *priv;
@@ -78,6 +67,7 @@ static int jh7110_aoncrg_probe(struct platform_device *pdev)
                return -ENOMEM;
 
        spin_lock_init(&priv->rmw_lock);
+       priv->num_reg = JH7110_AONCLK_END;
        priv->dev = &pdev->dev;
        priv->base = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(priv->base))
@@ -127,7 +117,7 @@ static int jh7110_aoncrg_probe(struct platform_device *pdev)
                        return ret;
        }
 
-       ret = devm_of_clk_add_hw_provider(&pdev->dev, jh7110_aonclk_get, priv);
+       ret = devm_of_clk_add_hw_provider(&pdev->dev, jh71x0_clk_get, priv);
        if (ret)
                return ret;
 
index 8c4c3a958a9f4aaa1226d1ee9f95b50774517993..f3fa069db193e3ebfd12402fb092ffda7448f5c3 100644 (file)
@@ -75,17 +75,6 @@ static inline int jh7110_isp_top_rst_init(struct jh71x0_clk_priv *priv)
        return reset_control_deassert(top_rsts);
 }
 
-static struct clk_hw *jh7110_ispclk_get(struct of_phandle_args *clkspec, void *data)
-{
-       struct jh71x0_clk_priv *priv = data;
-       unsigned int idx = clkspec->args[0];
-
-       if (idx < JH7110_ISPCLK_END)
-               return &priv->reg[idx].hw;
-
-       return ERR_PTR(-EINVAL);
-}
-
 #ifdef CONFIG_PM
 static int jh7110_ispcrg_suspend(struct device *dev)
 {
@@ -126,6 +115,7 @@ static int jh7110_ispcrg_probe(struct platform_device *pdev)
                return -ENOMEM;
 
        spin_lock_init(&priv->rmw_lock);
+       priv->num_reg = JH7110_ISPCLK_END;
        priv->dev = &pdev->dev;
        priv->base = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(priv->base))
@@ -186,7 +176,7 @@ static int jh7110_ispcrg_probe(struct platform_device *pdev)
                        goto err_exit;
        }
 
-       ret = devm_of_clk_add_hw_provider(&pdev->dev, jh7110_ispclk_get, priv);
+       ret = devm_of_clk_add_hw_provider(&pdev->dev, jh71x0_clk_get, priv);
        if (ret)
                goto err_exit;
 
index dafcb71905922830716158f1848c4bf3551742d5..2a5ad0e07d1d00f69cbe12fe0bfcb58f48d9231b 100644 (file)
@@ -75,17 +75,6 @@ static const struct jh71x0_clk_data jh7110_stgclk_data[] = {
        JH71X0_GATE(JH7110_STGCLK_DMA1P_AHB, "dma1p_ahb", 0, JH7110_STGCLK_STG_AXIAHB),
 };
 
-static struct clk_hw *jh7110_stgclk_get(struct of_phandle_args *clkspec, void *data)
-{
-       struct jh71x0_clk_priv *priv = data;
-       unsigned int idx = clkspec->args[0];
-
-       if (idx < JH7110_STGCLK_END)
-               return &priv->reg[idx].hw;
-
-       return ERR_PTR(-EINVAL);
-}
-
 static int jh7110_stgcrg_probe(struct platform_device *pdev)
 {
        struct jh71x0_clk_priv *priv;
@@ -98,6 +87,7 @@ static int jh7110_stgcrg_probe(struct platform_device *pdev)
                return -ENOMEM;
 
        spin_lock_init(&priv->rmw_lock);
+       priv->num_reg = JH7110_STGCLK_END;
        priv->dev = &pdev->dev;
        priv->base = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(priv->base))
@@ -145,7 +135,7 @@ static int jh7110_stgcrg_probe(struct platform_device *pdev)
                        return ret;
        }
 
-       ret = devm_of_clk_add_hw_provider(&pdev->dev, jh7110_stgclk_get, priv);
+       ret = devm_of_clk_add_hw_provider(&pdev->dev, jh71x0_clk_get, priv);
        if (ret)
                return ret;
 
index 17325f17696f6440dfa5b575bb91f37ffc73d2e9..e9d8168d02b83296d757ba918e842d515916bb99 100644 (file)
@@ -323,17 +323,6 @@ static const struct jh71x0_clk_data jh7110_sysclk_data[] __initconst = {
                    JH7110_SYSCLK_OSC),
 };
 
-static struct clk_hw *jh7110_sysclk_get(struct of_phandle_args *clkspec, void *data)
-{
-       struct jh71x0_clk_priv *priv = data;
-       unsigned int idx = clkspec->args[0];
-
-       if (idx < JH7110_SYSCLK_END)
-               return &priv->reg[idx].hw;
-
-       return ERR_PTR(-EINVAL);
-}
-
 static void jh7110_reset_unregister_adev(void *_adev)
 {
        struct auxiliary_device *adev = _adev;
@@ -425,6 +414,7 @@ static int __init jh7110_syscrg_probe(struct platform_device *pdev)
                return -ENOMEM;
 
        spin_lock_init(&priv->rmw_lock);
+       priv->num_reg = JH7110_SYSCLK_END;
        priv->dev = &pdev->dev;
        priv->base = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(priv->base))
@@ -526,7 +516,7 @@ static int __init jh7110_syscrg_probe(struct platform_device *pdev)
                        return ret;
        }
 
-       ret = devm_of_clk_add_hw_provider(&pdev->dev, jh7110_sysclk_get, priv);
+       ret = devm_of_clk_add_hw_provider(&pdev->dev, jh71x0_clk_get, priv);
        if (ret)
                return ret;
 
index 04eeed199087f64ffca7bd4160584218afbffb43..bad20d5d794a72f071b4d547b7304786a8ba9afa 100644 (file)
@@ -80,17 +80,6 @@ static int jh7110_vout_top_rst_init(struct jh71x0_clk_priv *priv)
        return reset_control_deassert(top_rst);
 }
 
-static struct clk_hw *jh7110_voutclk_get(struct of_phandle_args *clkspec, void *data)
-{
-       struct jh71x0_clk_priv *priv = data;
-       unsigned int idx = clkspec->args[0];
-
-       if (idx < JH7110_VOUTCLK_END)
-               return &priv->reg[idx].hw;
-
-       return ERR_PTR(-EINVAL);
-}
-
 #ifdef CONFIG_PM
 static int jh7110_voutcrg_suspend(struct device *dev)
 {
@@ -131,6 +120,7 @@ static int jh7110_voutcrg_probe(struct platform_device *pdev)
                return -ENOMEM;
 
        spin_lock_init(&priv->rmw_lock);
+       priv->num_reg = JH7110_VOUTCLK_END;
        priv->dev = &pdev->dev;
        priv->base = devm_platform_ioremap_resource(pdev, 0);
        if (IS_ERR(priv->base))
@@ -193,7 +183,7 @@ static int jh7110_voutcrg_probe(struct platform_device *pdev)
                        goto err_exit;
        }
 
-       ret = devm_of_clk_add_hw_provider(&pdev->dev, jh7110_voutclk_get, priv);
+       ret = devm_of_clk_add_hw_provider(&pdev->dev, jh71x0_clk_get, priv);
        if (ret)
                goto err_exit;
 
index aebc99264a0b730f1ddf2980f930cf0c90f56c27..80e9157347eb214442e23e20045042088d5ff324 100644 (file)
@@ -325,3 +325,15 @@ const struct clk_ops *starfive_jh71x0_clk_ops(u32 max)
        return &jh71x0_clk_inv_ops;
 }
 EXPORT_SYMBOL_GPL(starfive_jh71x0_clk_ops);
+
+struct clk_hw *jh71x0_clk_get(struct of_phandle_args *clkspec, void *data)
+{
+       struct jh71x0_clk_priv *priv = data;
+       unsigned int idx = clkspec->args[0];
+
+       if (idx < priv->num_reg)
+               return &priv->reg[idx].hw;
+
+       return ERR_PTR(-EINVAL);
+}
+EXPORT_SYMBOL_GPL(jh71x0_clk_get);
index e3f441393e48f5edc38cf54281e9cc32e2d667e1..9d5dec1d5cd1c814bf6a16cc81fd8855dd5ebd22 100644 (file)
@@ -117,9 +117,11 @@ struct jh71x0_clk_priv {
        struct clk *original_clk;
        struct notifier_block pll_clk_nb;
        struct clk_hw *pll[3];
-       struct jh71x0_clk reg[];
+       unsigned int num_reg;
+       struct jh71x0_clk reg[] __counted_by(num_reg);
 };
 
 const struct clk_ops *starfive_jh71x0_clk_ops(u32 max);
+struct clk_hw *jh71x0_clk_get(struct of_phandle_args *clkspec, void *data);
 
 #endif