diff options
author | Stephen Boyd <sboyd@codeaurora.org> | 2014-03-21 20:59:37 -0400 |
---|---|---|
committer | Mike Turquette <mturquette@linaro.org> | 2014-04-30 14:51:51 -0400 |
commit | 49fc825f0cc221768c5711b8ec6a71bd49f2663e (patch) | |
tree | 4c358a9db39a28e9ba79d77a021a13a59637eefb /drivers/clk/qcom/gcc-msm8960.c | |
parent | 63589e92c2d975cc63222e5bd4a9a1fa2a1187ac (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.c | 77 |
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 | ||
2879 | static 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 | |||
2878 | static const struct of_device_id gcc_msm8960_match_table[] = { | 2887 | static const struct of_device_id gcc_msm8960_match_table[] = { |
2879 | { .compatible = "qcom,gcc-msm8960" }, | 2888 | { .compatible = "qcom,gcc-msm8960" }, |
2880 | { } | 2889 | { } |
2881 | }; | 2890 | }; |
2882 | MODULE_DEVICE_TABLE(of, gcc_msm8960_match_table); | 2891 | MODULE_DEVICE_TABLE(of, gcc_msm8960_match_table); |
2883 | 2892 | ||
2884 | struct qcom_cc { | ||
2885 | struct qcom_reset_controller reset; | ||
2886 | struct clk_onecell_data data; | ||
2887 | struct clk *clks[]; | ||
2888 | }; | ||
2889 | |||
2890 | static int gcc_msm8960_probe(struct platform_device *pdev) | 2893 | static 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 | ||
2962 | static int gcc_msm8960_remove(struct platform_device *pdev) | 2910 | static 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 | ||