aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/clk/qcom/gcc-msm8960.c
diff options
context:
space:
mode:
authorStephen Boyd <sboyd@codeaurora.org>2014-03-21 20:59:37 -0400
committerMike Turquette <mturquette@linaro.org>2014-04-30 14:51:51 -0400
commit49fc825f0cc221768c5711b8ec6a71bd49f2663e (patch)
tree4c358a9db39a28e9ba79d77a021a13a59637eefb /drivers/clk/qcom/gcc-msm8960.c
parent63589e92c2d975cc63222e5bd4a9a1fa2a1187ac (diff)
clk: qcom: Consolidate common probe code
Most of the probe code is the same between all the different clock controllers. Consolidate the code into a common.c file. This makes changes to the common probe parts easier and reduces chances for bugs. Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> Signed-off-by: Mike Turquette <mturquette@linaro.org>
Diffstat (limited to 'drivers/clk/qcom/gcc-msm8960.c')
-rw-r--r--drivers/clk/qcom/gcc-msm8960.c77
1 files changed, 12 insertions, 65 deletions
diff --git a/drivers/clk/qcom/gcc-msm8960.c b/drivers/clk/qcom/gcc-msm8960.c
index fd446ab2fd98..633b019891bb 100644
--- a/drivers/clk/qcom/gcc-msm8960.c
+++ b/drivers/clk/qcom/gcc-msm8960.c
@@ -25,6 +25,7 @@
25#include <dt-bindings/clock/qcom,gcc-msm8960.h> 25#include <dt-bindings/clock/qcom,gcc-msm8960.h>
26#include <dt-bindings/reset/qcom,gcc-msm8960.h> 26#include <dt-bindings/reset/qcom,gcc-msm8960.h>
27 27
28#include "common.h"
28#include "clk-regmap.h" 29#include "clk-regmap.h"
29#include "clk-pll.h" 30#include "clk-pll.h"
30#include "clk-rcg.h" 31#include "clk-rcg.h"
@@ -2875,51 +2876,24 @@ static const struct regmap_config gcc_msm8960_regmap_config = {
2875 .fast_io = true, 2876 .fast_io = true,
2876}; 2877};
2877 2878
2879static const struct qcom_cc_desc gcc_msm8960_desc = {
2880 .config = &gcc_msm8960_regmap_config,
2881 .clks = gcc_msm8960_clks,
2882 .num_clks = ARRAY_SIZE(gcc_msm8960_clks),
2883 .resets = gcc_msm8960_resets,
2884 .num_resets = ARRAY_SIZE(gcc_msm8960_resets),
2885};
2886
2878static const struct of_device_id gcc_msm8960_match_table[] = { 2887static const struct of_device_id gcc_msm8960_match_table[] = {
2879 { .compatible = "qcom,gcc-msm8960" }, 2888 { .compatible = "qcom,gcc-msm8960" },
2880 { } 2889 { }
2881}; 2890};
2882MODULE_DEVICE_TABLE(of, gcc_msm8960_match_table); 2891MODULE_DEVICE_TABLE(of, gcc_msm8960_match_table);
2883 2892
2884struct qcom_cc {
2885 struct qcom_reset_controller reset;
2886 struct clk_onecell_data data;
2887 struct clk *clks[];
2888};
2889
2890static int gcc_msm8960_probe(struct platform_device *pdev) 2893static int gcc_msm8960_probe(struct platform_device *pdev)
2891{ 2894{
2892 void __iomem *base;
2893 struct resource *res;
2894 int i, ret;
2895 struct device *dev = &pdev->dev;
2896 struct clk *clk; 2895 struct clk *clk;
2897 struct clk_onecell_data *data; 2896 struct device *dev = &pdev->dev;
2898 struct clk **clks;
2899 struct regmap *regmap;
2900 size_t num_clks;
2901 struct qcom_reset_controller *reset;
2902 struct qcom_cc *cc;
2903
2904 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
2905 base = devm_ioremap_resource(dev, res);
2906 if (IS_ERR(base))
2907 return PTR_ERR(base);
2908
2909 regmap = devm_regmap_init_mmio(dev, base, &gcc_msm8960_regmap_config);
2910 if (IS_ERR(regmap))
2911 return PTR_ERR(regmap);
2912
2913 num_clks = ARRAY_SIZE(gcc_msm8960_clks);
2914 cc = devm_kzalloc(dev, sizeof(*cc) + sizeof(*clks) * num_clks,
2915 GFP_KERNEL);
2916 if (!cc)
2917 return -ENOMEM;
2918
2919 clks = cc->clks;
2920 data = &cc->data;
2921 data->clks = clks;
2922 data->clk_num = num_clks;
2923 2897
2924 /* Temporary until RPM clocks supported */ 2898 /* Temporary until RPM clocks supported */
2925 clk = clk_register_fixed_rate(dev, "cxo", NULL, CLK_IS_ROOT, 19200000); 2899 clk = clk_register_fixed_rate(dev, "cxo", NULL, CLK_IS_ROOT, 19200000);
@@ -2930,39 +2904,12 @@ static int gcc_msm8960_probe(struct platform_device *pdev)
2930 if (IS_ERR(clk)) 2904 if (IS_ERR(clk))
2931 return PTR_ERR(clk); 2905 return PTR_ERR(clk);
2932 2906
2933 for (i = 0; i < num_clks; i++) { 2907 return qcom_cc_probe(pdev, &gcc_msm8960_desc);
2934 if (!gcc_msm8960_clks[i])
2935 continue;
2936 clk = devm_clk_register_regmap(dev, gcc_msm8960_clks[i]);
2937 if (IS_ERR(clk))
2938 return PTR_ERR(clk);
2939 clks[i] = clk;
2940 }
2941
2942 ret = of_clk_add_provider(dev->of_node, of_clk_src_onecell_get, data);
2943 if (ret)
2944 return ret;
2945
2946 reset = &cc->reset;
2947 reset->rcdev.of_node = dev->of_node;
2948 reset->rcdev.ops = &qcom_reset_ops,
2949 reset->rcdev.owner = THIS_MODULE,
2950 reset->rcdev.nr_resets = ARRAY_SIZE(gcc_msm8960_resets),
2951 reset->regmap = regmap;
2952 reset->reset_map = gcc_msm8960_resets,
2953 platform_set_drvdata(pdev, &reset->rcdev);
2954
2955 ret = reset_controller_register(&reset->rcdev);
2956 if (ret)
2957 of_clk_del_provider(dev->of_node);
2958
2959 return ret;
2960} 2908}
2961 2909
2962static int gcc_msm8960_remove(struct platform_device *pdev) 2910static int gcc_msm8960_remove(struct platform_device *pdev)
2963{ 2911{
2964 of_clk_del_provider(pdev->dev.of_node); 2912 qcom_cc_remove(pdev);
2965 reset_controller_unregister(platform_get_drvdata(pdev));
2966 return 0; 2913 return 0;
2967} 2914}
2968 2915