Hi, On mer., févr. 28 2018, Gregory CLEMENT <gregory.clem...@bootlin.com> wrote:
> Thanks to new documentation, we have a better view of the clock tree. > There were few mistakes in the first version of this driver, the main one > being the parental link between the clocks. Actually the tree is more > flat that we though. Most of the IP blocks require two clocks: one for > the IP itself and one for accessing the registers, and unlike what we > wrote there is no link between these two clocks. > > The other mistakes were about the name of the clocks: the root clock is > not the Audio PLL but the PLL0, and what we called the EIP clock is named > the x2 Core clock and is used by other IP block than the EIP ones. Do you have any feedback on this patch? I would like to have time to address them if you have any remark. Else do you want a Pull Request or could you apply it directly? The only other patch around the mvebu clocks was set a few days ago [1] and seems to be eventually a fix patch. That means that there would be only one patch in the Pull Request for 4.17, but I can do it if you prefer. Thanks, Gregory [1]: "[PATCH] clk: mvebu: armada-38x: add support for missing clocks" https://lkml.org/lkml/2018/3/8/812 > > Signed-off-by: Gregory CLEMENT <gregory.clem...@bootlin.com> > --- > drivers/clk/mvebu/cp110-system-controller.c | 94 > ++++++++++++----------------- > 1 file changed, 39 insertions(+), 55 deletions(-) > > diff --git a/drivers/clk/mvebu/cp110-system-controller.c > b/drivers/clk/mvebu/cp110-system-controller.c > index ca9a0a536174..75bf7b8f282f 100644 > --- a/drivers/clk/mvebu/cp110-system-controller.c > +++ b/drivers/clk/mvebu/cp110-system-controller.c > @@ -13,18 +13,17 @@ > /* > * CP110 has 6 core clocks: > * > - * - APLL (1 Ghz) > - * - PPv2 core (1/3 APLL) > - * - EIP (1/2 APLL) > - * - Core (1/2 EIP) > - * - SDIO (2/5 APLL) > + * - PLL0 (1 Ghz) > + * - PPv2 core (1/3 PLL0) > + * - x2 Core (1/2 PLL0) > + * - Core (1/2 x2 Core) > + * - SDIO (2/5 PLL0) > * > * - NAND clock, which is either: > * - Equal to SDIO clock > - * - 2/5 APLL > + * - 2/5 PLL0 > * > - * CP110 has 32 gatable clocks, for the various peripherals in the > - * IP. They have fairly complicated parent/child relationships. > + * CP110 has 32 gatable clocks, for the various peripherals in the IP. > */ > > #define pr_fmt(fmt) "cp110-system-controller: " fmt > @@ -53,9 +52,9 @@ enum { > #define CP110_CLK_NUM \ > (CP110_MAX_CORE_CLOCKS + CP110_MAX_GATABLE_CLOCKS) > > -#define CP110_CORE_APLL 0 > +#define CP110_CORE_PLL0 0 > #define CP110_CORE_PPV2 1 > -#define CP110_CORE_EIP 2 > +#define CP110_CORE_X2CORE 2 > #define CP110_CORE_CORE 3 > #define CP110_CORE_NAND 4 > #define CP110_CORE_SDIO 5 > @@ -237,7 +236,7 @@ static int cp110_syscon_common_probe(struct > platform_device *pdev, > struct regmap *regmap; > struct device *dev = &pdev->dev; > struct device_node *np = dev->of_node; > - const char *ppv2_name, *apll_name, *core_name, *eip_name, *nand_name, > + const char *ppv2_name, *pll0_name, *core_name, *x2core_name, *nand_name, > *sdio_name; > struct clk_hw_onecell_data *cp110_clk_data; > struct clk_hw *hw, **cp110_clks; > @@ -263,20 +262,20 @@ static int cp110_syscon_common_probe(struct > platform_device *pdev, > cp110_clks = cp110_clk_data->hws; > cp110_clk_data->num = CP110_CLK_NUM; > > - /* Register the APLL which is the root of the hw tree */ > - apll_name = cp110_unique_name(dev, syscon_node, "apll"); > - hw = clk_hw_register_fixed_rate(NULL, apll_name, NULL, 0, > + /* Register the PLL0 which is the root of the hw tree */ > + pll0_name = cp110_unique_name(dev, syscon_node, "pll0"); > + hw = clk_hw_register_fixed_rate(NULL, pll0_name, NULL, 0, > 1000 * 1000 * 1000); > if (IS_ERR(hw)) { > ret = PTR_ERR(hw); > - goto fail_apll; > + goto fail_pll0; > } > > - cp110_clks[CP110_CORE_APLL] = hw; > + cp110_clks[CP110_CORE_PLL0] = hw; > > - /* PPv2 is APLL/3 */ > + /* PPv2 is PLL0/3 */ > ppv2_name = cp110_unique_name(dev, syscon_node, "ppv2-core"); > - hw = clk_hw_register_fixed_factor(NULL, ppv2_name, apll_name, 0, 1, 3); > + hw = clk_hw_register_fixed_factor(NULL, ppv2_name, pll0_name, 0, 1, 3); > if (IS_ERR(hw)) { > ret = PTR_ERR(hw); > goto fail_ppv2; > @@ -284,30 +283,32 @@ static int cp110_syscon_common_probe(struct > platform_device *pdev, > > cp110_clks[CP110_CORE_PPV2] = hw; > > - /* EIP clock is APLL/2 */ > - eip_name = cp110_unique_name(dev, syscon_node, "eip"); > - hw = clk_hw_register_fixed_factor(NULL, eip_name, apll_name, 0, 1, 2); > + /* X2CORE clock is PLL0/2 */ > + x2core_name = cp110_unique_name(dev, syscon_node, "x2core"); > + hw = clk_hw_register_fixed_factor(NULL, x2core_name, pll0_name, > + 0, 1, 2); > if (IS_ERR(hw)) { > ret = PTR_ERR(hw); > goto fail_eip; > } > > - cp110_clks[CP110_CORE_EIP] = hw; > + cp110_clks[CP110_CORE_X2CORE] = hw; > > - /* Core clock is EIP/2 */ > + /* Core clock is X2CORE/2 */ > core_name = cp110_unique_name(dev, syscon_node, "core"); > - hw = clk_hw_register_fixed_factor(NULL, core_name, eip_name, 0, 1, 2); > + hw = clk_hw_register_fixed_factor(NULL, core_name, x2core_name, > + 0, 1, 2); > if (IS_ERR(hw)) { > ret = PTR_ERR(hw); > goto fail_core; > } > > cp110_clks[CP110_CORE_CORE] = hw; > - /* NAND can be either APLL/2.5 or core clock */ > + /* NAND can be either PLL0/2.5 or core clock */ > nand_name = cp110_unique_name(dev, syscon_node, "nand-core"); > if (nand_clk_ctrl & NF_CLOCK_SEL_400_MASK) > hw = clk_hw_register_fixed_factor(NULL, nand_name, > - apll_name, 0, 2, 5); > + pll0_name, 0, 2, 5); > else > hw = clk_hw_register_fixed_factor(NULL, nand_name, > core_name, 0, 1, 1); > @@ -318,10 +319,10 @@ static int cp110_syscon_common_probe(struct > platform_device *pdev, > > cp110_clks[CP110_CORE_NAND] = hw; > > - /* SDIO clock is APLL/2.5 */ > + /* SDIO clock is PLL0/2.5 */ > sdio_name = cp110_unique_name(dev, syscon_node, "sdio-core"); > hw = clk_hw_register_fixed_factor(NULL, sdio_name, > - apll_name, 0, 2, 5); > + pll0_name, 0, 2, 5); > if (IS_ERR(hw)) { > ret = PTR_ERR(hw); > goto fail_sdio; > @@ -341,40 +342,23 @@ static int cp110_syscon_common_probe(struct > platform_device *pdev, > continue; > > switch (i) { > - case CP110_GATE_AUDIO: > - case CP110_GATE_COMM_UNIT: > - case CP110_GATE_EIP150: > - case CP110_GATE_EIP197: > - case CP110_GATE_SLOW_IO: > - parent = gate_name[CP110_GATE_MAIN]; > - break; > - case CP110_GATE_MG: > - parent = gate_name[CP110_GATE_MG_CORE]; > - break; > case CP110_GATE_NAND: > parent = nand_name; > break; > + case CP110_GATE_MG: > + case CP110_GATE_GOP_DP: > case CP110_GATE_PPV2: > parent = ppv2_name; > break; > case CP110_GATE_SDIO: > parent = sdio_name; > break; > - case CP110_GATE_GOP_DP: > - parent = gate_name[CP110_GATE_SDMMC_GOP]; > - break; > - case CP110_GATE_XOR1: > - case CP110_GATE_XOR0: > - case CP110_GATE_PCIE_X1_0: > - case CP110_GATE_PCIE_X1_1: > + case CP110_GATE_MAIN: > + case CP110_GATE_PCIE_XOR: > case CP110_GATE_PCIE_X4: > - parent = gate_name[CP110_GATE_PCIE_XOR]; > - break; > - case CP110_GATE_SATA: > - case CP110_GATE_USB3H0: > - case CP110_GATE_USB3H1: > - case CP110_GATE_USB3DEV: > - parent = gate_name[CP110_GATE_SATA_USB]; > + case CP110_GATE_EIP150: > + case CP110_GATE_EIP197: > + parent = x2core_name; > break; > default: > parent = core_name; > @@ -413,12 +397,12 @@ static int cp110_syscon_common_probe(struct > platform_device *pdev, > fail_nand: > clk_hw_unregister_fixed_factor(cp110_clks[CP110_CORE_CORE]); > fail_core: > - clk_hw_unregister_fixed_factor(cp110_clks[CP110_CORE_EIP]); > + clk_hw_unregister_fixed_factor(cp110_clks[CP110_CORE_X2CORE]); > fail_eip: > clk_hw_unregister_fixed_factor(cp110_clks[CP110_CORE_PPV2]); > fail_ppv2: > - clk_hw_unregister_fixed_rate(cp110_clks[CP110_CORE_APLL]); > -fail_apll: > + clk_hw_unregister_fixed_rate(cp110_clks[CP110_CORE_PLL0]); > +fail_pll0: > return ret; > } > > -- > 2.16.1 > -- Gregory Clement, Bootlin (formerly Free Electrons) Embedded Linux and Kernel engineering http://bootlin.com