Re: [PATCH 1/3] clk: at91: mark ddr clocks as critical

From: Claudiu.Beznea
Date: Thu Jan 12 2023 - 05:33:32 EST


On 08.12.2022 13:45, Claudiu Beznea wrote:
> Mark DDR clocks as critical for AT91 devices. These clocks are enabled
> by bootloader when initializing DDR and needs to stay enabled. Up to
> this patch the DDR clocks were requested from drivers/memory/atmel-sdramc.c
> which does only clock request and enable. There is no need to have
> a separate driver just for this, thus the atmel-sdramc.c will be deleted
> in a subsequent patch.
>
> Signed-off-by: Claudiu Beznea <claudiu.beznea@xxxxxxxxxxxxx>

Applied to clk-microchip, thanks!

> ---
> drivers/clk/at91/at91rm9200.c | 2 +-
> drivers/clk/at91/at91sam9260.c | 2 +-
> drivers/clk/at91/at91sam9g45.c | 10 ++++++++--
> drivers/clk/at91/at91sam9n12.c | 12 +++++++++---
> drivers/clk/at91/at91sam9rl.c | 2 +-
> drivers/clk/at91/at91sam9x5.c | 17 ++++++++++++-----
> drivers/clk/at91/clk-peripheral.c | 8 ++++----
> drivers/clk/at91/clk-system.c | 4 ++--
> drivers/clk/at91/dt-compat.c | 25 +++++++++++++++++++++++--
> drivers/clk/at91/pmc.h | 4 ++--
> drivers/clk/at91/sam9x60.c | 20 ++++++++++++++++----
> drivers/clk/at91/sama5d2.c | 22 +++++++++++++++++-----
> drivers/clk/at91/sama5d3.c | 20 ++++++++++++++++----
> drivers/clk/at91/sama5d4.c | 22 +++++++++++++++++-----
> drivers/clk/at91/sama7g5.c | 4 ++--
> 15 files changed, 131 insertions(+), 43 deletions(-)
>
> diff --git a/drivers/clk/at91/at91rm9200.c b/drivers/clk/at91/at91rm9200.c
> index 16870943a13e..0b860126d589 100644
> --- a/drivers/clk/at91/at91rm9200.c
> +++ b/drivers/clk/at91/at91rm9200.c
> @@ -183,7 +183,7 @@ static void __init at91rm9200_pmc_setup(struct device_node *np)
> for (i = 0; i < ARRAY_SIZE(at91rm9200_systemck); i++) {
> hw = at91_clk_register_system(regmap, at91rm9200_systemck[i].n,
> at91rm9200_systemck[i].p,
> - at91rm9200_systemck[i].id);
> + at91rm9200_systemck[i].id, 0);
> if (IS_ERR(hw))
> goto err_free;
>
> diff --git a/drivers/clk/at91/at91sam9260.c b/drivers/clk/at91/at91sam9260.c
> index 11550e50cd9f..b521f470428f 100644
> --- a/drivers/clk/at91/at91sam9260.c
> +++ b/drivers/clk/at91/at91sam9260.c
> @@ -460,7 +460,7 @@ static void __init at91sam926x_pmc_setup(struct device_node *np,
> for (i = 0; i < data->num_sck; i++) {
> hw = at91_clk_register_system(regmap, data->sck[i].n,
> data->sck[i].p,
> - data->sck[i].id);
> + data->sck[i].id, 0);
> if (IS_ERR(hw))
> goto err_free;
>
> diff --git a/drivers/clk/at91/at91sam9g45.c b/drivers/clk/at91/at91sam9g45.c
> index 8c9344451f46..5099669ddcbd 100644
> --- a/drivers/clk/at91/at91sam9g45.c
> +++ b/drivers/clk/at91/at91sam9g45.c
> @@ -40,9 +40,14 @@ static const struct clk_pll_characteristics plla_characteristics = {
> static const struct {
> char *n;
> char *p;
> + unsigned long flags;
> u8 id;
> } at91sam9g45_systemck[] = {
> - { .n = "ddrck", .p = "masterck_div", .id = 2 },
> + /*
> + * 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.
> + */
> + { .n = "ddrck", .p = "masterck_div", .id = 2, .flags = CLK_IS_CRITICAL },
> { .n = "uhpck", .p = "usbck", .id = 6 },
> { .n = "pck0", .p = "prog0", .id = 8 },
> { .n = "pck1", .p = "prog1", .id = 9 },
> @@ -198,7 +203,8 @@ static void __init at91sam9g45_pmc_setup(struct device_node *np)
> for (i = 0; i < ARRAY_SIZE(at91sam9g45_systemck); i++) {
> hw = at91_clk_register_system(regmap, at91sam9g45_systemck[i].n,
> at91sam9g45_systemck[i].p,
> - at91sam9g45_systemck[i].id);
> + at91sam9g45_systemck[i].id,
> + at91sam9g45_systemck[i].flags);
> if (IS_ERR(hw))
> goto err_free;
>
> diff --git a/drivers/clk/at91/at91sam9n12.c b/drivers/clk/at91/at91sam9n12.c
> index 0bb19400d199..08a10e12d08d 100644
> --- a/drivers/clk/at91/at91sam9n12.c
> +++ b/drivers/clk/at91/at91sam9n12.c
> @@ -54,9 +54,14 @@ static const struct clk_pll_characteristics pllb_characteristics = {
> static const struct {
> char *n;
> char *p;
> + unsigned long flags;
> u8 id;
> } at91sam9n12_systemck[] = {
> - { .n = "ddrck", .p = "masterck_div", .id = 2 },
> + /*
> + * 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.
> + */
> + { .n = "ddrck", .p = "masterck_div", .id = 2, .flags = CLK_IS_CRITICAL },
> { .n = "lcdck", .p = "masterck_div", .id = 3 },
> { .n = "uhpck", .p = "usbck", .id = 6 },
> { .n = "udpck", .p = "usbck", .id = 7 },
> @@ -223,7 +228,8 @@ static void __init at91sam9n12_pmc_setup(struct device_node *np)
> for (i = 0; i < ARRAY_SIZE(at91sam9n12_systemck); i++) {
> hw = at91_clk_register_system(regmap, at91sam9n12_systemck[i].n,
> at91sam9n12_systemck[i].p,
> - at91sam9n12_systemck[i].id);
> + at91sam9n12_systemck[i].id,
> + at91sam9n12_systemck[i].flags);
> if (IS_ERR(hw))
> goto err_free;
>
> @@ -236,7 +242,7 @@ static void __init at91sam9n12_pmc_setup(struct device_node *np)
> at91sam9n12_periphck[i].n,
> "masterck_div",
> at91sam9n12_periphck[i].id,
> - &range, INT_MIN);
> + &range, INT_MIN, 0);
> if (IS_ERR(hw))
> goto err_free;
>
> diff --git a/drivers/clk/at91/at91sam9rl.c b/drivers/clk/at91/at91sam9rl.c
> index b992137bab02..1a1b6b2bb0e3 100644
> --- a/drivers/clk/at91/at91sam9rl.c
> +++ b/drivers/clk/at91/at91sam9rl.c
> @@ -160,7 +160,7 @@ static void __init at91sam9rl_pmc_setup(struct device_node *np)
> for (i = 0; i < ARRAY_SIZE(at91sam9rl_systemck); i++) {
> hw = at91_clk_register_system(regmap, at91sam9rl_systemck[i].n,
> at91sam9rl_systemck[i].p,
> - at91sam9rl_systemck[i].id);
> + at91sam9rl_systemck[i].id, 0);
> if (IS_ERR(hw))
> goto err_free;
>
> diff --git a/drivers/clk/at91/at91sam9x5.c b/drivers/clk/at91/at91sam9x5.c
> index 3857db2e144b..13e589c95907 100644
> --- a/drivers/clk/at91/at91sam9x5.c
> +++ b/drivers/clk/at91/at91sam9x5.c
> @@ -41,9 +41,14 @@ static const struct clk_pll_characteristics plla_characteristics = {
> static const struct {
> char *n;
> char *p;
> + unsigned long flags;
> u8 id;
> } at91sam9x5_systemck[] = {
> - { .n = "ddrck", .p = "masterck_div", .id = 2 },
> + /*
> + * 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.
> + */
> + { .n = "ddrck", .p = "masterck_div", .id = 2, .flags = CLK_IS_CRITICAL },
> { .n = "smdck", .p = "smdclk", .id = 4 },
> { .n = "uhpck", .p = "usbck", .id = 6 },
> { .n = "udpck", .p = "usbck", .id = 7 },
> @@ -248,7 +253,8 @@ static void __init at91sam9x5_pmc_setup(struct device_node *np,
> for (i = 0; i < ARRAY_SIZE(at91sam9x5_systemck); i++) {
> hw = at91_clk_register_system(regmap, at91sam9x5_systemck[i].n,
> at91sam9x5_systemck[i].p,
> - at91sam9x5_systemck[i].id);
> + at91sam9x5_systemck[i].id,
> + at91sam9x5_systemck[i].flags);
> if (IS_ERR(hw))
> goto err_free;
>
> @@ -256,7 +262,8 @@ static void __init at91sam9x5_pmc_setup(struct device_node *np,
> }
>
> if (has_lcdck) {
> - hw = at91_clk_register_system(regmap, "lcdck", "masterck_div", 3);
> + hw = at91_clk_register_system(regmap, "lcdck", "masterck_div",
> + 3, 0);
> if (IS_ERR(hw))
> goto err_free;
>
> @@ -269,7 +276,7 @@ static void __init at91sam9x5_pmc_setup(struct device_node *np,
> at91sam9x5_periphck[i].n,
> "masterck_div",
> at91sam9x5_periphck[i].id,
> - &range, INT_MIN);
> + &range, INT_MIN, 0);
> if (IS_ERR(hw))
> goto err_free;
>
> @@ -282,7 +289,7 @@ static void __init at91sam9x5_pmc_setup(struct device_node *np,
> extra_pcks[i].n,
> "masterck_div",
> extra_pcks[i].id,
> - &range, INT_MIN);
> + &range, INT_MIN, 0);
> if (IS_ERR(hw))
> goto err_free;
>
> diff --git a/drivers/clk/at91/clk-peripheral.c b/drivers/clk/at91/clk-peripheral.c
> index 5104d4025484..93ea685e27f6 100644
> --- a/drivers/clk/at91/clk-peripheral.c
> +++ b/drivers/clk/at91/clk-peripheral.c
> @@ -445,7 +445,7 @@ at91_clk_register_sam9x5_peripheral(struct regmap *regmap, spinlock_t *lock,
> const struct clk_pcr_layout *layout,
> const char *name, const char *parent_name,
> u32 id, const struct clk_range *range,
> - int chg_pid)
> + int chg_pid, unsigned long flags)
> {
> struct clk_sam9x5_peripheral *periph;
> struct clk_init_data init;
> @@ -462,12 +462,12 @@ at91_clk_register_sam9x5_peripheral(struct regmap *regmap, spinlock_t *lock,
> init.name = name;
> init.parent_names = &parent_name;
> init.num_parents = 1;
> + init.flags = flags;
> if (chg_pid < 0) {
> - init.flags = 0;
> init.ops = &sam9x5_peripheral_ops;
> } else {
> - init.flags = CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE |
> - CLK_SET_RATE_PARENT;
> + init.flags |= CLK_SET_RATE_GATE | CLK_SET_PARENT_GATE |
> + CLK_SET_RATE_PARENT;
> init.ops = &sam9x5_peripheral_chg_ops;
> }
>
> diff --git a/drivers/clk/at91/clk-system.c b/drivers/clk/at91/clk-system.c
> index 80720fd1a9cf..10193650429e 100644
> --- a/drivers/clk/at91/clk-system.c
> +++ b/drivers/clk/at91/clk-system.c
> @@ -105,7 +105,7 @@ static const struct clk_ops system_ops = {
>
> struct clk_hw * __init
> at91_clk_register_system(struct regmap *regmap, const char *name,
> - const char *parent_name, u8 id)
> + const char *parent_name, u8 id, unsigned long flags)
> {
> struct clk_system *sys;
> struct clk_hw *hw;
> @@ -123,7 +123,7 @@ at91_clk_register_system(struct regmap *regmap, const char *name,
> init.ops = &system_ops;
> init.parent_names = &parent_name;
> init.num_parents = 1;
> - init.flags = CLK_SET_RATE_PARENT;
> + init.flags = CLK_SET_RATE_PARENT | flags;
>
> sys->id = id;
> sys->hw.init = &init;
> 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;
>
> diff --git a/drivers/clk/at91/pmc.h b/drivers/clk/at91/pmc.h
> index efe4975bddc3..1b3ca7dd9b57 100644
> --- a/drivers/clk/at91/pmc.h
> +++ b/drivers/clk/at91/pmc.h
> @@ -199,7 +199,7 @@ at91_clk_register_sam9x5_peripheral(struct regmap *regmap, spinlock_t *lock,
> const struct clk_pcr_layout *layout,
> const char *name, const char *parent_name,
> u32 id, const struct clk_range *range,
> - int chg_pid);
> + int chg_pid, unsigned long flags);
>
> struct clk_hw * __init
> at91_clk_register_pll(struct regmap *regmap, const char *name,
> @@ -242,7 +242,7 @@ at91sam9x5_clk_register_smd(struct regmap *regmap, const char *name,
>
> struct clk_hw * __init
> at91_clk_register_system(struct regmap *regmap, const char *name,
> - const char *parent_name, u8 id);
> + const char *parent_name, u8 id, unsigned long flags);
>
> struct clk_hw * __init
> at91sam9x5_clk_register_usb(struct regmap *regmap, const char *name,
> diff --git a/drivers/clk/at91/sam9x60.c b/drivers/clk/at91/sam9x60.c
> index 9ea4ce501bad..ac070db58195 100644
> --- a/drivers/clk/at91/sam9x60.c
> +++ b/drivers/clk/at91/sam9x60.c
> @@ -75,9 +75,14 @@ static const struct clk_pcr_layout sam9x60_pcr_layout = {
> static const struct {
> char *n;
> char *p;
> + unsigned long flags;
> u8 id;
> } sam9x60_systemck[] = {
> - { .n = "ddrck", .p = "masterck_div", .id = 2 },
> + /*
> + * 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.
> + */
> + { .n = "ddrck", .p = "masterck_div", .id = 2, .flags = CLK_IS_CRITICAL },
> { .n = "uhpck", .p = "usbck", .id = 6 },
> { .n = "pck0", .p = "prog0", .id = 8 },
> { .n = "pck1", .p = "prog1", .id = 9 },
> @@ -86,6 +91,7 @@ static const struct {
>
> static const struct {
> char *n;
> + unsigned long flags;
> u8 id;
> } sam9x60_periphck[] = {
> { .n = "pioA_clk", .id = 2, },
> @@ -132,7 +138,11 @@ static const struct {
> { .n = "pioD_clk", .id = 44, },
> { .n = "tcb1_clk", .id = 45, },
> { .n = "dbgu_clk", .id = 47, },
> - { .n = "mpddr_clk", .id = 49, },
> + /*
> + * mpddr_clk feeds DDR controller and is enabled by bootloader thus we
> + * need to keep it enabled in case there is no Linux consumer for it.
> + */
> + { .n = "mpddr_clk", .id = 49, .flags = CLK_IS_CRITICAL },
> };
>
> static const struct {
> @@ -315,7 +325,8 @@ static void __init sam9x60_pmc_setup(struct device_node *np)
> for (i = 0; i < ARRAY_SIZE(sam9x60_systemck); i++) {
> hw = at91_clk_register_system(regmap, sam9x60_systemck[i].n,
> sam9x60_systemck[i].p,
> - sam9x60_systemck[i].id);
> + sam9x60_systemck[i].id,
> + sam9x60_systemck[i].flags);
> if (IS_ERR(hw))
> goto err_free;
>
> @@ -328,7 +339,8 @@ static void __init sam9x60_pmc_setup(struct device_node *np)
> sam9x60_periphck[i].n,
> "masterck_div",
> sam9x60_periphck[i].id,
> - &range, INT_MIN);
> + &range, INT_MIN,
> + sam9x60_periphck[i].flags);
> if (IS_ERR(hw))
> goto err_free;
>
> diff --git a/drivers/clk/at91/sama5d2.c b/drivers/clk/at91/sama5d2.c
> index 84156dc52bff..c0e3e1a4bbf3 100644
> --- a/drivers/clk/at91/sama5d2.c
> +++ b/drivers/clk/at91/sama5d2.c
> @@ -40,9 +40,14 @@ static const struct clk_pcr_layout sama5d2_pcr_layout = {
> static const struct {
> char *n;
> char *p;
> + unsigned long flags;
> u8 id;
> } sama5d2_systemck[] = {
> - { .n = "ddrck", .p = "masterck_div", .id = 2 },
> + /*
> + * 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.
> + */
> + { .n = "ddrck", .p = "masterck_div", .id = 2, .flags = CLK_IS_CRITICAL },
> { .n = "lcdck", .p = "masterck_div", .id = 3 },
> { .n = "uhpck", .p = "usbck", .id = 6 },
> { .n = "udpck", .p = "usbck", .id = 7 },
> @@ -97,6 +102,7 @@ static const struct {
>
> static const struct {
> char *n;
> + unsigned long flags;
> u8 id;
> } sama5d2_periphck[] = {
> { .n = "dma0_clk", .id = 6, },
> @@ -104,7 +110,11 @@ static const struct {
> { .n = "aes_clk", .id = 9, },
> { .n = "aesb_clk", .id = 10, },
> { .n = "sha_clk", .id = 12, },
> - { .n = "mpddr_clk", .id = 13, },
> + /*
> + * mpddr_clk feeds DDR controller and is enabled by bootloader thus we
> + * need to keep it enabled in case there is no Linux consumer for it.
> + */
> + { .n = "mpddr_clk", .id = 13, .flags = CLK_IS_CRITICAL },
> { .n = "matrix0_clk", .id = 15, },
> { .n = "sdmmc0_hclk", .id = 31, },
> { .n = "sdmmc1_hclk", .id = 32, },
> @@ -302,7 +312,8 @@ static void __init sama5d2_pmc_setup(struct device_node *np)
> for (i = 0; i < ARRAY_SIZE(sama5d2_systemck); i++) {
> hw = at91_clk_register_system(regmap, sama5d2_systemck[i].n,
> sama5d2_systemck[i].p,
> - sama5d2_systemck[i].id);
> + sama5d2_systemck[i].id,
> + sama5d2_systemck[i].flags);
> if (IS_ERR(hw))
> goto err_free;
>
> @@ -315,7 +326,8 @@ static void __init sama5d2_pmc_setup(struct device_node *np)
> sama5d2_periphck[i].n,
> "masterck_div",
> sama5d2_periphck[i].id,
> - &range, INT_MIN);
> + &range, INT_MIN,
> + sama5d2_periphck[i].flags);
> if (IS_ERR(hw))
> goto err_free;
>
> @@ -329,7 +341,7 @@ static void __init sama5d2_pmc_setup(struct device_node *np)
> "h32mxck",
> sama5d2_periph32ck[i].id,
> &sama5d2_periph32ck[i].r,
> - INT_MIN);
> + INT_MIN, 0);
> if (IS_ERR(hw))
> goto err_free;
>
> diff --git a/drivers/clk/at91/sama5d3.c b/drivers/clk/at91/sama5d3.c
> index 7e93c6edf305..ad6068b884de 100644
> --- a/drivers/clk/at91/sama5d3.c
> +++ b/drivers/clk/at91/sama5d3.c
> @@ -40,9 +40,14 @@ static const struct clk_pcr_layout sama5d3_pcr_layout = {
> static const struct {
> char *n;
> char *p;
> + unsigned long flags;
> u8 id;
> } sama5d3_systemck[] = {
> - { .n = "ddrck", .p = "masterck_div", .id = 2 },
> + /*
> + * 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.
> + */
> + { .n = "ddrck", .p = "masterck_div", .id = 2, .flags = CLK_IS_CRITICAL },
> { .n = "lcdck", .p = "masterck_div", .id = 3 },
> { .n = "smdck", .p = "smdclk", .id = 4 },
> { .n = "uhpck", .p = "usbck", .id = 6 },
> @@ -56,6 +61,7 @@ static const struct {
> char *n;
> u8 id;
> struct clk_range r;
> + unsigned long flags;
> } sama5d3_periphck[] = {
> { .n = "dbgu_clk", .id = 2, },
> { .n = "hsmc_clk", .id = 5, },
> @@ -99,7 +105,11 @@ static const struct {
> { .n = "tdes_clk", .id = 44, },
> { .n = "trng_clk", .id = 45, },
> { .n = "fuse_clk", .id = 48, },
> - { .n = "mpddr_clk", .id = 49, },
> + /*
> + * mpddr_clk feeds DDR controller and is enabled by bootloader thus we
> + * need to keep it enabled in case there is no Linux consumer for it.
> + */
> + { .n = "mpddr_clk", .id = 49, .flags = CLK_IS_CRITICAL },
> };
>
> static void __init sama5d3_pmc_setup(struct device_node *np)
> @@ -222,7 +232,8 @@ static void __init sama5d3_pmc_setup(struct device_node *np)
> for (i = 0; i < ARRAY_SIZE(sama5d3_systemck); i++) {
> hw = at91_clk_register_system(regmap, sama5d3_systemck[i].n,
> sama5d3_systemck[i].p,
> - sama5d3_systemck[i].id);
> + sama5d3_systemck[i].id,
> + sama5d3_systemck[i].flags);
> if (IS_ERR(hw))
> goto err_free;
>
> @@ -236,7 +247,8 @@ static void __init sama5d3_pmc_setup(struct device_node *np)
> "masterck_div",
> sama5d3_periphck[i].id,
> &sama5d3_periphck[i].r,
> - INT_MIN);
> + INT_MIN,
> + sama5d3_periphck[i].flags);
> if (IS_ERR(hw))
> goto err_free;
>
> diff --git a/drivers/clk/at91/sama5d4.c b/drivers/clk/at91/sama5d4.c
> index 1a14a9bce308..e876ec971a39 100644
> --- a/drivers/clk/at91/sama5d4.c
> +++ b/drivers/clk/at91/sama5d4.c
> @@ -39,9 +39,14 @@ static const struct clk_pcr_layout sama5d4_pcr_layout = {
> static const struct {
> char *n;
> char *p;
> + unsigned long flags;
> u8 id;
> } sama5d4_systemck[] = {
> - { .n = "ddrck", .p = "masterck_div", .id = 2 },
> + /*
> + * 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.
> + */
> + { .n = "ddrck", .p = "masterck_div", .id = 2, .flags = CLK_IS_CRITICAL },
> { .n = "lcdck", .p = "masterck_div", .id = 3 },
> { .n = "smdck", .p = "smdclk", .id = 4 },
> { .n = "uhpck", .p = "usbck", .id = 6 },
> @@ -103,12 +108,17 @@ static const struct {
>
> static const struct {
> char *n;
> + unsigned long flags;
> u8 id;
> } sama5d4_periphck[] = {
> { .n = "dma0_clk", .id = 8 },
> { .n = "cpkcc_clk", .id = 10 },
> { .n = "aesb_clk", .id = 13 },
> - { .n = "mpddr_clk", .id = 16 },
> + /*
> + * mpddr_clk feeds DDR controller and is enabled by bootloader thus we
> + * need to keep it enabled in case there is no Linux consumer for it.
> + */
> + { .n = "mpddr_clk", .id = 16, .flags = CLK_IS_CRITICAL },
> { .n = "matrix0_clk", .id = 18 },
> { .n = "vdec_clk", .id = 19 },
> { .n = "dma1_clk", .id = 50 },
> @@ -245,7 +255,8 @@ static void __init sama5d4_pmc_setup(struct device_node *np)
> for (i = 0; i < ARRAY_SIZE(sama5d4_systemck); i++) {
> hw = at91_clk_register_system(regmap, sama5d4_systemck[i].n,
> sama5d4_systemck[i].p,
> - sama5d4_systemck[i].id);
> + sama5d4_systemck[i].id,
> + sama5d4_systemck[i].flags);
> if (IS_ERR(hw))
> goto err_free;
>
> @@ -258,7 +269,8 @@ static void __init sama5d4_pmc_setup(struct device_node *np)
> sama5d4_periphck[i].n,
> "masterck_div",
> sama5d4_periphck[i].id,
> - &range, INT_MIN);
> + &range, INT_MIN,
> + sama5d4_periphck[i].flags);
> if (IS_ERR(hw))
> goto err_free;
>
> @@ -271,7 +283,7 @@ static void __init sama5d4_pmc_setup(struct device_node *np)
> sama5d4_periph32ck[i].n,
> "h32mxck",
> sama5d4_periph32ck[i].id,
> - &range, INT_MIN);
> + &range, INT_MIN, 0);
> if (IS_ERR(hw))
> goto err_free;
>
> diff --git a/drivers/clk/at91/sama7g5.c b/drivers/clk/at91/sama7g5.c
> index 9a213ba9e58b..f135b662f1ff 100644
> --- a/drivers/clk/at91/sama7g5.c
> +++ b/drivers/clk/at91/sama7g5.c
> @@ -1068,7 +1068,7 @@ static void __init sama7g5_pmc_setup(struct device_node *np)
> for (i = 0; i < ARRAY_SIZE(sama7g5_systemck); i++) {
> hw = at91_clk_register_system(regmap, sama7g5_systemck[i].n,
> sama7g5_systemck[i].p,
> - sama7g5_systemck[i].id);
> + sama7g5_systemck[i].id, 0);
> if (IS_ERR(hw))
> goto err_free;
>
> @@ -1083,7 +1083,7 @@ static void __init sama7g5_pmc_setup(struct device_node *np)
> sama7g5_periphck[i].id,
> &sama7g5_periphck[i].r,
> sama7g5_periphck[i].chgp ? 0 :
> - INT_MIN);
> + INT_MIN, 0);
> if (IS_ERR(hw))
> goto err_free;
>