clk: qcom: Fix MN frequency tables, parent map, and jpegd
[sfrench/cifs-2.6.git] / drivers / clk / qcom / mmcc-msm8960.c
index f9b59c7e48e9c7fc2201ae4759e4e7eee4b2660a..b050433af38eab3c9454d3845cb41f27dc03ff5f 100644 (file)
@@ -26,6 +26,7 @@
 #include <dt-bindings/clock/qcom,mmcc-msm8960.h>
 #include <dt-bindings/reset/qcom,mmcc-msm8960.h>
 
+#include "common.h"
 #include "clk-regmap.h"
 #include "clk-pll.h"
 #include "clk-rcg.h"
@@ -37,6 +38,8 @@
 #define P_PLL2 2
 #define P_PLL3 3
 
+#define F_MN(f, s, _m, _n) { .freq = f, .src = s, .m = _m, .n = _n }
+
 static u8 mmcc_pxo_pll8_pll2_map[] = {
        [P_PXO]         = 0,
        [P_PLL8]        = 2,
@@ -58,8 +61,8 @@ static u8 mmcc_pxo_pll8_pll2_pll3_map[] = {
 
 static const char *mmcc_pxo_pll8_pll2_pll3[] = {
        "pxo",
-       "pll2",
        "pll8_vote",
+       "pll2",
        "pll3",
 };
 
@@ -709,18 +712,18 @@ static struct clk_branch csiphy2_timer_clk = {
 };
 
 static struct freq_tbl clk_tbl_gfx2d[] = {
-       {  27000000, P_PXO,  1,  0 },
-       {  48000000, P_PLL8, 1,  8 },
-       {  54857000, P_PLL8, 1,  7 },
-       {  64000000, P_PLL8, 1,  6 },
-       {  76800000, P_PLL8, 1,  5 },
-       {  96000000, P_PLL8, 1,  4 },
-       { 128000000, P_PLL8, 1,  3 },
-       { 145455000, P_PLL2, 2, 11 },
-       { 160000000, P_PLL2, 1,  5 },
-       { 177778000, P_PLL2, 2,  9 },
-       { 200000000, P_PLL2, 1,  4 },
-       { 228571000, P_PLL2, 2,  7 },
+       F_MN( 27000000, P_PXO,  1,  0),
+       F_MN( 48000000, P_PLL8, 1,  8),
+       F_MN( 54857000, P_PLL8, 1,  7),
+       F_MN( 64000000, P_PLL8, 1,  6),
+       F_MN( 76800000, P_PLL8, 1,  5),
+       F_MN( 96000000, P_PLL8, 1,  4),
+       F_MN(128000000, P_PLL8, 1,  3),
+       F_MN(145455000, P_PLL2, 2, 11),
+       F_MN(160000000, P_PLL2, 1,  5),
+       F_MN(177778000, P_PLL2, 2,  9),
+       F_MN(200000000, P_PLL2, 1,  4),
+       F_MN(228571000, P_PLL2, 2,  7),
        { }
 };
 
@@ -841,22 +844,22 @@ static struct clk_branch gfx2d1_clk = {
 };
 
 static struct freq_tbl clk_tbl_gfx3d[] = {
-       {  27000000, P_PXO,  1,  0 },
-       {  48000000, P_PLL8, 1,  8 },
-       {  54857000, P_PLL8, 1,  7 },
-       {  64000000, P_PLL8, 1,  6 },
-       {  76800000, P_PLL8, 1,  5 },
-       {  96000000, P_PLL8, 1,  4 },
-       { 128000000, P_PLL8, 1,  3 },
-       { 145455000, P_PLL2, 2, 11 },
-       { 160000000, P_PLL2, 1,  5 },
-       { 177778000, P_PLL2, 2,  9 },
-       { 200000000, P_PLL2, 1,  4 },
-       { 228571000, P_PLL2, 2,  7 },
-       { 266667000, P_PLL2, 1,  3 },
-       { 300000000, P_PLL3, 1,  4 },
-       { 320000000, P_PLL2, 2,  5 },
-       { 400000000, P_PLL2, 1,  2 },
+       F_MN( 27000000, P_PXO,  1,  0),
+       F_MN( 48000000, P_PLL8, 1,  8),
+       F_MN( 54857000, P_PLL8, 1,  7),
+       F_MN( 64000000, P_PLL8, 1,  6),
+       F_MN( 76800000, P_PLL8, 1,  5),
+       F_MN( 96000000, P_PLL8, 1,  4),
+       F_MN(128000000, P_PLL8, 1,  3),
+       F_MN(145455000, P_PLL2, 2, 11),
+       F_MN(160000000, P_PLL2, 1,  5),
+       F_MN(177778000, P_PLL2, 2,  9),
+       F_MN(200000000, P_PLL2, 1,  4),
+       F_MN(228571000, P_PLL2, 2,  7),
+       F_MN(266667000, P_PLL2, 1,  3),
+       F_MN(300000000, P_PLL3, 1,  4),
+       F_MN(320000000, P_PLL2, 2,  5),
+       F_MN(400000000, P_PLL2, 1,  2),
        { }
 };
 
@@ -896,7 +899,7 @@ static struct clk_dyn_rcg gfx3d_src = {
                .hw.init = &(struct clk_init_data){
                        .name = "gfx3d_src",
                        .parent_names = mmcc_pxo_pll8_pll2_pll3,
-                       .num_parents = 3,
+                       .num_parents = 4,
                        .ops = &clk_dyn_rcg_ops,
                },
        },
@@ -994,7 +997,7 @@ static struct clk_rcg jpegd_src = {
        .ns_reg = 0x00ac,
        .p = {
                .pre_div_shift = 12,
-               .pre_div_width = 2,
+               .pre_div_width = 4,
        },
        .s = {
                .src_sel_shift = 0,
@@ -1217,12 +1220,7 @@ static const char *mmcc_pxo_hdmi[] = {
 };
 
 static struct freq_tbl clk_tbl_tv[] = {
-       {  25200000, P_HDMI_PLL, 1, 0, 0 },
-       {  27000000, P_HDMI_PLL, 1, 0, 0 },
-       {  27030000, P_HDMI_PLL, 1, 0, 0 },
-       {  74250000, P_HDMI_PLL, 1, 0, 0 },
-       { 108000000, P_HDMI_PLL, 1, 0, 0 },
-       { 148500000, P_HDMI_PLL, 1, 0, 0 },
+       {  .src = P_HDMI_PLL, .pre_div = 1 },
        { }
 };
 
@@ -1253,7 +1251,7 @@ static struct clk_rcg tv_src = {
                        .name = "tv_src",
                        .parent_names = mmcc_pxo_hdmi,
                        .num_parents = 2,
-                       .ops = &clk_rcg_ops,
+                       .ops = &clk_rcg_bypass_ops,
                        .flags = CLK_SET_RATE_PARENT,
                },
        },
@@ -1341,15 +1339,15 @@ static struct clk_branch hdmi_app_clk = {
 };
 
 static struct freq_tbl clk_tbl_vcodec[] = {
-       {  27000000, P_PXO,  1,  0 },
-       {  32000000, P_PLL8, 1, 12 },
-       {  48000000, P_PLL8, 1,  8 },
-       {  54860000, P_PLL8, 1,  7 },
-       {  96000000, P_PLL8, 1,  4 },
-       { 133330000, P_PLL2, 1,  6 },
-       { 200000000, P_PLL2, 1,  4 },
-       { 228570000, P_PLL2, 2,  7 },
-       { 266670000, P_PLL2, 1,  3 },
+       F_MN( 27000000, P_PXO,  1,  0),
+       F_MN( 32000000, P_PLL8, 1, 12),
+       F_MN( 48000000, P_PLL8, 1,  8),
+       F_MN( 54860000, P_PLL8, 1,  7),
+       F_MN( 96000000, P_PLL8, 1,  4),
+       F_MN(133330000, P_PLL2, 1,  6),
+       F_MN(200000000, P_PLL2, 1,  4),
+       F_MN(228570000, P_PLL2, 2,  7),
+       F_MN(266670000, P_PLL2, 1,  3),
        { }
 };
 
@@ -2222,85 +2220,28 @@ static const struct regmap_config mmcc_msm8960_regmap_config = {
        .fast_io        = true,
 };
 
+static const struct qcom_cc_desc mmcc_msm8960_desc = {
+       .config = &mmcc_msm8960_regmap_config,
+       .clks = mmcc_msm8960_clks,
+       .num_clks = ARRAY_SIZE(mmcc_msm8960_clks),
+       .resets = mmcc_msm8960_resets,
+       .num_resets = ARRAY_SIZE(mmcc_msm8960_resets),
+};
+
 static const struct of_device_id mmcc_msm8960_match_table[] = {
        { .compatible = "qcom,mmcc-msm8960" },
        { }
 };
 MODULE_DEVICE_TABLE(of, mmcc_msm8960_match_table);
 
-struct qcom_cc {
-       struct qcom_reset_controller reset;
-       struct clk_onecell_data data;
-       struct clk *clks[];
-};
-
 static int mmcc_msm8960_probe(struct platform_device *pdev)
 {
-       void __iomem *base;
-       struct resource *res;
-       int i, ret;
-       struct device *dev = &pdev->dev;
-       struct clk *clk;
-       struct clk_onecell_data *data;
-       struct clk **clks;
-       struct regmap *regmap;
-       size_t num_clks;
-       struct qcom_reset_controller *reset;
-       struct qcom_cc *cc;
-
-       res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       base = devm_ioremap_resource(dev, res);
-       if (IS_ERR(base))
-               return PTR_ERR(base);
-
-       regmap = devm_regmap_init_mmio(dev, base, &mmcc_msm8960_regmap_config);
-       if (IS_ERR(regmap))
-               return PTR_ERR(regmap);
-
-       num_clks = ARRAY_SIZE(mmcc_msm8960_clks);
-       cc = devm_kzalloc(dev, sizeof(*cc) + sizeof(*clks) * num_clks,
-                         GFP_KERNEL);
-       if (!cc)
-               return -ENOMEM;
-
-       clks = cc->clks;
-       data = &cc->data;
-       data->clks = clks;
-       data->clk_num = num_clks;
-
-       for (i = 0; i < num_clks; i++) {
-               if (!mmcc_msm8960_clks[i])
-                       continue;
-               clk = devm_clk_register_regmap(dev, mmcc_msm8960_clks[i]);
-               if (IS_ERR(clk))
-                       return PTR_ERR(clk);
-               clks[i] = clk;
-       }
-
-       ret = of_clk_add_provider(dev->of_node, of_clk_src_onecell_get, data);
-       if (ret)
-               return ret;
-
-       reset = &cc->reset;
-       reset->rcdev.of_node = dev->of_node;
-       reset->rcdev.ops = &qcom_reset_ops,
-       reset->rcdev.owner = THIS_MODULE,
-       reset->rcdev.nr_resets = ARRAY_SIZE(mmcc_msm8960_resets),
-       reset->regmap = regmap;
-       reset->reset_map = mmcc_msm8960_resets,
-       platform_set_drvdata(pdev, &reset->rcdev);
-
-       ret = reset_controller_register(&reset->rcdev);
-       if (ret)
-               of_clk_del_provider(dev->of_node);
-
-       return ret;
+       return qcom_cc_probe(pdev, &mmcc_msm8960_desc);
 }
 
 static int mmcc_msm8960_remove(struct platform_device *pdev)
 {
-       of_clk_del_provider(pdev->dev.of_node);
-       reset_controller_unregister(platform_get_drvdata(pdev));
+       qcom_cc_remove(pdev);
        return 0;
 }