aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2015-06-29 22:58:44 -0400
committerStephen Boyd <sboyd@codeaurora.org>2015-07-06 18:54:13 -0400
commit7b2a4635b84b4dbb07c93201a8c0aea82ed65e4f (patch)
tree296f06eec28ac8e4c439bd64bf1b0ea93c4cf37c
parent3be6d8ce639d92e60d144fb99dd74a53fe3799bb (diff)
clk: mediatek: mt8173: Fix enabling of critical clocks
On the MT8173 the clocks are provided by different units. To enable the critical clocks we must be sure that all parent clocks are already registered, otherwise the parents of the critical clocks end up being unused and get disabled later. To find a place where all parents are registered we try each time after we've registered some clocks if all known providers are present now and only then we enable the critical clocks Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de> Signed-off-by: James Liao <jamesjj.liao@mediatek.com> [sboyd@codeaurora.org: Marked function and data __init] Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
-rw-r--r--drivers/clk/mediatek/clk-mt8173.c26
1 files changed, 21 insertions, 5 deletions
diff --git a/drivers/clk/mediatek/clk-mt8173.c b/drivers/clk/mediatek/clk-mt8173.c
index 4b9e04cdf7e8..8b6523d15fb8 100644
--- a/drivers/clk/mediatek/clk-mt8173.c
+++ b/drivers/clk/mediatek/clk-mt8173.c
@@ -700,6 +700,22 @@ static const struct mtk_composite peri_clks[] __initconst = {
700 MUX(CLK_PERI_UART3_SEL, "uart3_ck_sel", uart_ck_sel_parents, 0x40c, 3, 1), 700 MUX(CLK_PERI_UART3_SEL, "uart3_ck_sel", uart_ck_sel_parents, 0x40c, 3, 1),
701}; 701};
702 702
703static struct clk_onecell_data *mt8173_top_clk_data __initdata;
704static struct clk_onecell_data *mt8173_pll_clk_data __initdata;
705
706static void __init mtk_clk_enable_critical(void)
707{
708 if (!mt8173_top_clk_data || !mt8173_pll_clk_data)
709 return;
710
711 clk_prepare_enable(mt8173_pll_clk_data->clks[CLK_APMIXED_ARMCA15PLL]);
712 clk_prepare_enable(mt8173_pll_clk_data->clks[CLK_APMIXED_ARMCA7PLL]);
713 clk_prepare_enable(mt8173_top_clk_data->clks[CLK_TOP_MEM_SEL]);
714 clk_prepare_enable(mt8173_top_clk_data->clks[CLK_TOP_DDRPHYCFG_SEL]);
715 clk_prepare_enable(mt8173_top_clk_data->clks[CLK_TOP_CCI400_SEL]);
716 clk_prepare_enable(mt8173_top_clk_data->clks[CLK_TOP_RTC_SEL]);
717}
718
703static void __init mtk_topckgen_init(struct device_node *node) 719static void __init mtk_topckgen_init(struct device_node *node)
704{ 720{
705 struct clk_onecell_data *clk_data; 721 struct clk_onecell_data *clk_data;
@@ -712,19 +728,19 @@ static void __init mtk_topckgen_init(struct device_node *node)
712 return; 728 return;
713 } 729 }
714 730
715 clk_data = mtk_alloc_clk_data(CLK_TOP_NR_CLK); 731 mt8173_top_clk_data = clk_data = mtk_alloc_clk_data(CLK_TOP_NR_CLK);
716 732
717 mtk_clk_register_factors(root_clk_alias, ARRAY_SIZE(root_clk_alias), clk_data); 733 mtk_clk_register_factors(root_clk_alias, ARRAY_SIZE(root_clk_alias), clk_data);
718 mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), clk_data); 734 mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), clk_data);
719 mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base, 735 mtk_clk_register_composites(top_muxes, ARRAY_SIZE(top_muxes), base,
720 &mt8173_clk_lock, clk_data); 736 &mt8173_clk_lock, clk_data);
721 737
722 clk_prepare_enable(clk_data->clks[CLK_TOP_CCI400_SEL]);
723
724 r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); 738 r = of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
725 if (r) 739 if (r)
726 pr_err("%s(): could not register clock provider: %d\n", 740 pr_err("%s(): could not register clock provider: %d\n",
727 __func__, r); 741 __func__, r);
742
743 mtk_clk_enable_critical();
728} 744}
729CLK_OF_DECLARE(mtk_topckgen, "mediatek,mt8173-topckgen", mtk_topckgen_init); 745CLK_OF_DECLARE(mtk_topckgen, "mediatek,mt8173-topckgen", mtk_topckgen_init);
730 746
@@ -818,13 +834,13 @@ static void __init mtk_apmixedsys_init(struct device_node *node)
818{ 834{
819 struct clk_onecell_data *clk_data; 835 struct clk_onecell_data *clk_data;
820 836
821 clk_data = mtk_alloc_clk_data(CLK_APMIXED_NR_CLK); 837 mt8173_pll_clk_data = clk_data = mtk_alloc_clk_data(CLK_APMIXED_NR_CLK);
822 if (!clk_data) 838 if (!clk_data)
823 return; 839 return;
824 840
825 mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls), clk_data); 841 mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls), clk_data);
826 842
827 clk_prepare_enable(clk_data->clks[CLK_APMIXED_ARMCA15PLL]); 843 mtk_clk_enable_critical();
828} 844}
829CLK_OF_DECLARE(mtk_apmixedsys, "mediatek,mt8173-apmixedsys", 845CLK_OF_DECLARE(mtk_apmixedsys, "mediatek,mt8173-apmixedsys",
830 mtk_apmixedsys_init); 846 mtk_apmixedsys_init);