diff options
Diffstat (limited to 'drivers/clk/at91/dt-compat.c')
-rw-r--r-- | drivers/clk/at91/dt-compat.c | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/drivers/clk/at91/dt-compat.c b/drivers/clk/at91/dt-compat.c index 85a964cb2d89..97f67e23ef80 100644 --- a/drivers/clk/at91/dt-compat.c +++ b/drivers/clk/at91/dt-compat.c @@ -493,18 +493,28 @@ of_at91_clk_periph_setup(struct device_node *np, u8 type) parent_name, id); } else { struct clk_range range = CLK_RANGE(0, 0); + unsigned long flags = 0; of_at91_get_clk_range(periphclknp, "atmel,clk-output-range", &range); + /* + * mpddr_clk feed DDR controller and is enabled by + * bootloader thus we need to keep it enabled in case + * there is no Linux consumer for it. + */ + if (!strcmp(periphclknp->name, "mpddr_clk")) + flags = CLK_IS_CRITICAL; + hw = at91_clk_register_sam9x5_peripheral(regmap, &pmc_pcr_lock, &dt_pcr_layout, name, parent_name, id, &range, - INT_MIN); + INT_MIN, + flags); } if (IS_ERR(hw)) @@ -879,6 +889,8 @@ static void __init of_at91rm9200_clk_sys_setup(struct device_node *np) return; for_each_child_of_node(np, sysclknp) { + unsigned long flags = 0; + if (of_property_read_u32(sysclknp, "reg", &id)) continue; @@ -887,7 +899,16 @@ static void __init of_at91rm9200_clk_sys_setup(struct device_node *np) parent_name = of_clk_get_parent_name(sysclknp, 0); - hw = at91_clk_register_system(regmap, name, parent_name, id); + /* + * ddrck feeds DDR controller and is enabled by bootloader thus + * we need to keep it enabled in case there is no Linux consumer + * for it. + */ + if (!strcmp(sysclknp->name, "ddrck")) + flags = CLK_IS_CRITICAL; + + hw = at91_clk_register_system(regmap, name, parent_name, id, + flags); if (IS_ERR(hw)) continue; |