lkml.org 
[lkml]   [2021]   [Sep]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.13 72/88] MIPS: ingenic: Unconditionally enable clock of CPU #0
    Date
    From: Paul Cercueil <paul@crapouillou.net>

    [ Upstream commit 71f8817c28e2e1e5549138e2aef68c2fd784e162 ]

    Make sure that the PLL that feeds the CPU won't be stopped while the
    kernel is running.

    This fixes a problem on JZ4760 (and probably others) where under very
    specific conditions, the main PLL would be turned OFF when the kernel
    was shutting down, causing the shutdown process to fail.

    Signed-off-by: Paul Cercueil <paul@crapouillou.net>
    Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/mips/generic/board-ingenic.c | 28 ++++++++++++++++++++++++++++
    1 file changed, 28 insertions(+)

    diff --git a/arch/mips/generic/board-ingenic.c b/arch/mips/generic/board-ingenic.c
    index 0cec0bea13d6..11387a93867b 100644
    --- a/arch/mips/generic/board-ingenic.c
    +++ b/arch/mips/generic/board-ingenic.c
    @@ -7,6 +7,8 @@
    * Copyright (C) 2020 Paul Cercueil <paul@crapouillou.net>
    */

    +#include <linux/clk.h>
    +#include <linux/of.h>
    #include <linux/of_address.h>
    #include <linux/of_fdt.h>
    #include <linux/pm.h>
    @@ -108,10 +110,36 @@ static const struct platform_suspend_ops ingenic_pm_ops __maybe_unused = {

    static int __init ingenic_pm_init(void)
    {
    + struct device_node *cpu_node;
    + struct clk *cpu0_clk;
    + int ret;
    +
    if (boot_cpu_type() == CPU_XBURST) {
    if (IS_ENABLED(CONFIG_PM_SLEEP))
    suspend_set_ops(&ingenic_pm_ops);
    _machine_halt = ingenic_halt;
    +
    + /*
    + * Unconditionally enable the clock for the first CPU.
    + * This makes sure that the PLL that feeds the CPU won't be
    + * stopped while the kernel is running.
    + */
    + cpu_node = of_get_cpu_node(0, NULL);
    + if (!cpu_node) {
    + pr_err("Unable to get CPU node\n");
    + } else {
    + cpu0_clk = of_clk_get(cpu_node, 0);
    + if (IS_ERR(cpu0_clk)) {
    + pr_err("Unable to get CPU0 clock\n");
    + return PTR_ERR(cpu0_clk);
    + }
    +
    + ret = clk_prepare_enable(cpu0_clk);
    + if (ret) {
    + pr_err("Unable to enable CPU0 clock\n");
    + return ret;
    + }
    + }
    }

    return 0;
    --
    2.30.2
    \
     
     \ /
      Last update: 2021-09-10 02:53    [W:2.942 / U:0.072 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site