lkml.org 
[lkml]   [2021]   [Mar]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 353/663] clk: qcom: gcc-msm8998: Fix Alpha PLL type for all GPLLs
    Date
    From: AngeloGioacchino Del Regno <angelogioacchino.delregno@somainline.org>

    [ Upstream commit 292f75ecff07e8a07fe2e3e19b4b567d0b698842 ]

    All of the GPLLs in the MSM8998 Global Clock Controller are Fabia PLLs
    and not generic alphas: this was producing bad effects over the entire
    clock tree of MSM8998, where any GPLL child clock was declaring a false
    clock rate, due to their parent also showing the same.

    The issue resides in the calculation of the clock rate for the specific
    Alpha PLL type, where Fabia has a different register layout; switching
    the MSM8998 GPLLs to the correct Alpha Fabia PLL type fixes the rate
    (calculation) reading. While at it, also make these PLLs fixed since
    their rate is supposed to *never* be changed while the system runs, as
    this would surely crash the entire SoC.

    Now all the children of all the PLLs are also complying with their
    specified clock table and system stability is improved.

    Fixes: b5f5f525c547 ("clk: qcom: Add MSM8998 Global Clock Control (GCC) driver")
    Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@somainline.org>
    Link: https://lore.kernel.org/r/20210114221059.483390-7-angelogioacchino.delregno@somainline.org
    Signed-off-by: Stephen Boyd <sboyd@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/clk/qcom/gcc-msm8998.c | 100 ++++++++++++++++-----------------
    1 file changed, 50 insertions(+), 50 deletions(-)

    diff --git a/drivers/clk/qcom/gcc-msm8998.c b/drivers/clk/qcom/gcc-msm8998.c
    index 9d7016bcd6800..b8dcfe62312bb 100644
    --- a/drivers/clk/qcom/gcc-msm8998.c
    +++ b/drivers/clk/qcom/gcc-msm8998.c
    @@ -135,7 +135,7 @@ static struct pll_vco fabia_vco[] = {

    static struct clk_alpha_pll gpll0 = {
    .offset = 0x0,
    - .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
    + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
    .vco_table = fabia_vco,
    .num_vco = ARRAY_SIZE(fabia_vco),
    .clkr = {
    @@ -145,58 +145,58 @@ static struct clk_alpha_pll gpll0 = {
    .name = "gpll0",
    .parent_names = (const char *[]){ "xo" },
    .num_parents = 1,
    - .ops = &clk_alpha_pll_ops,
    + .ops = &clk_alpha_pll_fixed_fabia_ops,
    }
    },
    };

    static struct clk_alpha_pll_postdiv gpll0_out_even = {
    .offset = 0x0,
    - .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
    + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
    .clkr.hw.init = &(struct clk_init_data){
    .name = "gpll0_out_even",
    .parent_names = (const char *[]){ "gpll0" },
    .num_parents = 1,
    - .ops = &clk_alpha_pll_postdiv_ops,
    + .ops = &clk_alpha_pll_postdiv_fabia_ops,
    },
    };

    static struct clk_alpha_pll_postdiv gpll0_out_main = {
    .offset = 0x0,
    - .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
    + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
    .clkr.hw.init = &(struct clk_init_data){
    .name = "gpll0_out_main",
    .parent_names = (const char *[]){ "gpll0" },
    .num_parents = 1,
    - .ops = &clk_alpha_pll_postdiv_ops,
    + .ops = &clk_alpha_pll_postdiv_fabia_ops,
    },
    };

    static struct clk_alpha_pll_postdiv gpll0_out_odd = {
    .offset = 0x0,
    - .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
    + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
    .clkr.hw.init = &(struct clk_init_data){
    .name = "gpll0_out_odd",
    .parent_names = (const char *[]){ "gpll0" },
    .num_parents = 1,
    - .ops = &clk_alpha_pll_postdiv_ops,
    + .ops = &clk_alpha_pll_postdiv_fabia_ops,
    },
    };

    static struct clk_alpha_pll_postdiv gpll0_out_test = {
    .offset = 0x0,
    - .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
    + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
    .clkr.hw.init = &(struct clk_init_data){
    .name = "gpll0_out_test",
    .parent_names = (const char *[]){ "gpll0" },
    .num_parents = 1,
    - .ops = &clk_alpha_pll_postdiv_ops,
    + .ops = &clk_alpha_pll_postdiv_fabia_ops,
    },
    };

    static struct clk_alpha_pll gpll1 = {
    .offset = 0x1000,
    - .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
    + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
    .vco_table = fabia_vco,
    .num_vco = ARRAY_SIZE(fabia_vco),
    .clkr = {
    @@ -206,58 +206,58 @@ static struct clk_alpha_pll gpll1 = {
    .name = "gpll1",
    .parent_names = (const char *[]){ "xo" },
    .num_parents = 1,
    - .ops = &clk_alpha_pll_ops,
    + .ops = &clk_alpha_pll_fixed_fabia_ops,
    }
    },
    };

    static struct clk_alpha_pll_postdiv gpll1_out_even = {
    .offset = 0x1000,
    - .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
    + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
    .clkr.hw.init = &(struct clk_init_data){
    .name = "gpll1_out_even",
    .parent_names = (const char *[]){ "gpll1" },
    .num_parents = 1,
    - .ops = &clk_alpha_pll_postdiv_ops,
    + .ops = &clk_alpha_pll_postdiv_fabia_ops,
    },
    };

    static struct clk_alpha_pll_postdiv gpll1_out_main = {
    .offset = 0x1000,
    - .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
    + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
    .clkr.hw.init = &(struct clk_init_data){
    .name = "gpll1_out_main",
    .parent_names = (const char *[]){ "gpll1" },
    .num_parents = 1,
    - .ops = &clk_alpha_pll_postdiv_ops,
    + .ops = &clk_alpha_pll_postdiv_fabia_ops,
    },
    };

    static struct clk_alpha_pll_postdiv gpll1_out_odd = {
    .offset = 0x1000,
    - .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
    + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
    .clkr.hw.init = &(struct clk_init_data){
    .name = "gpll1_out_odd",
    .parent_names = (const char *[]){ "gpll1" },
    .num_parents = 1,
    - .ops = &clk_alpha_pll_postdiv_ops,
    + .ops = &clk_alpha_pll_postdiv_fabia_ops,
    },
    };

    static struct clk_alpha_pll_postdiv gpll1_out_test = {
    .offset = 0x1000,
    - .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
    + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
    .clkr.hw.init = &(struct clk_init_data){
    .name = "gpll1_out_test",
    .parent_names = (const char *[]){ "gpll1" },
    .num_parents = 1,
    - .ops = &clk_alpha_pll_postdiv_ops,
    + .ops = &clk_alpha_pll_postdiv_fabia_ops,
    },
    };

    static struct clk_alpha_pll gpll2 = {
    .offset = 0x2000,
    - .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
    + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
    .vco_table = fabia_vco,
    .num_vco = ARRAY_SIZE(fabia_vco),
    .clkr = {
    @@ -267,58 +267,58 @@ static struct clk_alpha_pll gpll2 = {
    .name = "gpll2",
    .parent_names = (const char *[]){ "xo" },
    .num_parents = 1,
    - .ops = &clk_alpha_pll_ops,
    + .ops = &clk_alpha_pll_fixed_fabia_ops,
    }
    },
    };

    static struct clk_alpha_pll_postdiv gpll2_out_even = {
    .offset = 0x2000,
    - .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
    + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
    .clkr.hw.init = &(struct clk_init_data){
    .name = "gpll2_out_even",
    .parent_names = (const char *[]){ "gpll2" },
    .num_parents = 1,
    - .ops = &clk_alpha_pll_postdiv_ops,
    + .ops = &clk_alpha_pll_postdiv_fabia_ops,
    },
    };

    static struct clk_alpha_pll_postdiv gpll2_out_main = {
    .offset = 0x2000,
    - .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
    + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
    .clkr.hw.init = &(struct clk_init_data){
    .name = "gpll2_out_main",
    .parent_names = (const char *[]){ "gpll2" },
    .num_parents = 1,
    - .ops = &clk_alpha_pll_postdiv_ops,
    + .ops = &clk_alpha_pll_postdiv_fabia_ops,
    },
    };

    static struct clk_alpha_pll_postdiv gpll2_out_odd = {
    .offset = 0x2000,
    - .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
    + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
    .clkr.hw.init = &(struct clk_init_data){
    .name = "gpll2_out_odd",
    .parent_names = (const char *[]){ "gpll2" },
    .num_parents = 1,
    - .ops = &clk_alpha_pll_postdiv_ops,
    + .ops = &clk_alpha_pll_postdiv_fabia_ops,
    },
    };

    static struct clk_alpha_pll_postdiv gpll2_out_test = {
    .offset = 0x2000,
    - .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
    + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
    .clkr.hw.init = &(struct clk_init_data){
    .name = "gpll2_out_test",
    .parent_names = (const char *[]){ "gpll2" },
    .num_parents = 1,
    - .ops = &clk_alpha_pll_postdiv_ops,
    + .ops = &clk_alpha_pll_postdiv_fabia_ops,
    },
    };

    static struct clk_alpha_pll gpll3 = {
    .offset = 0x3000,
    - .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
    + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
    .vco_table = fabia_vco,
    .num_vco = ARRAY_SIZE(fabia_vco),
    .clkr = {
    @@ -328,58 +328,58 @@ static struct clk_alpha_pll gpll3 = {
    .name = "gpll3",
    .parent_names = (const char *[]){ "xo" },
    .num_parents = 1,
    - .ops = &clk_alpha_pll_ops,
    + .ops = &clk_alpha_pll_fixed_fabia_ops,
    }
    },
    };

    static struct clk_alpha_pll_postdiv gpll3_out_even = {
    .offset = 0x3000,
    - .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
    + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
    .clkr.hw.init = &(struct clk_init_data){
    .name = "gpll3_out_even",
    .parent_names = (const char *[]){ "gpll3" },
    .num_parents = 1,
    - .ops = &clk_alpha_pll_postdiv_ops,
    + .ops = &clk_alpha_pll_postdiv_fabia_ops,
    },
    };

    static struct clk_alpha_pll_postdiv gpll3_out_main = {
    .offset = 0x3000,
    - .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
    + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
    .clkr.hw.init = &(struct clk_init_data){
    .name = "gpll3_out_main",
    .parent_names = (const char *[]){ "gpll3" },
    .num_parents = 1,
    - .ops = &clk_alpha_pll_postdiv_ops,
    + .ops = &clk_alpha_pll_postdiv_fabia_ops,
    },
    };

    static struct clk_alpha_pll_postdiv gpll3_out_odd = {
    .offset = 0x3000,
    - .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
    + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
    .clkr.hw.init = &(struct clk_init_data){
    .name = "gpll3_out_odd",
    .parent_names = (const char *[]){ "gpll3" },
    .num_parents = 1,
    - .ops = &clk_alpha_pll_postdiv_ops,
    + .ops = &clk_alpha_pll_postdiv_fabia_ops,
    },
    };

    static struct clk_alpha_pll_postdiv gpll3_out_test = {
    .offset = 0x3000,
    - .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
    + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
    .clkr.hw.init = &(struct clk_init_data){
    .name = "gpll3_out_test",
    .parent_names = (const char *[]){ "gpll3" },
    .num_parents = 1,
    - .ops = &clk_alpha_pll_postdiv_ops,
    + .ops = &clk_alpha_pll_postdiv_fabia_ops,
    },
    };

    static struct clk_alpha_pll gpll4 = {
    .offset = 0x77000,
    - .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
    + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
    .vco_table = fabia_vco,
    .num_vco = ARRAY_SIZE(fabia_vco),
    .clkr = {
    @@ -389,52 +389,52 @@ static struct clk_alpha_pll gpll4 = {
    .name = "gpll4",
    .parent_names = (const char *[]){ "xo" },
    .num_parents = 1,
    - .ops = &clk_alpha_pll_ops,
    + .ops = &clk_alpha_pll_fixed_fabia_ops,
    }
    },
    };

    static struct clk_alpha_pll_postdiv gpll4_out_even = {
    .offset = 0x77000,
    - .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
    + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
    .clkr.hw.init = &(struct clk_init_data){
    .name = "gpll4_out_even",
    .parent_names = (const char *[]){ "gpll4" },
    .num_parents = 1,
    - .ops = &clk_alpha_pll_postdiv_ops,
    + .ops = &clk_alpha_pll_postdiv_fabia_ops,
    },
    };

    static struct clk_alpha_pll_postdiv gpll4_out_main = {
    .offset = 0x77000,
    - .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
    + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
    .clkr.hw.init = &(struct clk_init_data){
    .name = "gpll4_out_main",
    .parent_names = (const char *[]){ "gpll4" },
    .num_parents = 1,
    - .ops = &clk_alpha_pll_postdiv_ops,
    + .ops = &clk_alpha_pll_postdiv_fabia_ops,
    },
    };

    static struct clk_alpha_pll_postdiv gpll4_out_odd = {
    .offset = 0x77000,
    - .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
    + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
    .clkr.hw.init = &(struct clk_init_data){
    .name = "gpll4_out_odd",
    .parent_names = (const char *[]){ "gpll4" },
    .num_parents = 1,
    - .ops = &clk_alpha_pll_postdiv_ops,
    + .ops = &clk_alpha_pll_postdiv_fabia_ops,
    },
    };

    static struct clk_alpha_pll_postdiv gpll4_out_test = {
    .offset = 0x77000,
    - .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_DEFAULT],
    + .regs = clk_alpha_pll_regs[CLK_ALPHA_PLL_TYPE_FABIA],
    .clkr.hw.init = &(struct clk_init_data){
    .name = "gpll4_out_test",
    .parent_names = (const char *[]){ "gpll4" },
    .num_parents = 1,
    - .ops = &clk_alpha_pll_postdiv_ops,
    + .ops = &clk_alpha_pll_postdiv_fabia_ops,
    },
    };

    --
    2.27.0


    \
     
     \ /
      Last update: 2021-03-02 02:10    [W:4.048 / U:0.276 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site