OSDN Git Service

clk: renesas: rcar-gen3: Restore R clock during resume
authorGeert Uytterhoeven <geert+renesas@glider.be>
Wed, 28 Jun 2017 19:15:49 +0000 (21:15 +0200)
committerGeert Uytterhoeven <geert+renesas@glider.be>
Fri, 20 Oct 2017 09:16:09 +0000 (11:16 +0200)
On R-Car Gen3 systems, PSCI system suspend powers down the SoC, losing
clock configuration.  Register a notifier to save/restore the RCKCR
register during system suspend/resume.

Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
Tested-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
drivers/clk/renesas/rcar-gen3-cpg.c

index 267b562..0904886 100644 (file)
@@ -373,18 +373,27 @@ struct clk * __init rcar_gen3_cpg_clk_register(struct device *dev,
 
        case CLK_TYPE_GEN3_R:
                if (cpg_quirks & RCKCR_CKSEL) {
+                       struct cpg_simple_notifier *csn;
+
+                       csn = kzalloc(sizeof(*csn), GFP_KERNEL);
+                       if (!csn)
+                               return ERR_PTR(-ENOMEM);
+
+                       csn->reg = base + CPG_RCKCR;
+
                        /*
                         * RINT is default.
                         * Only if EXTALR is populated, we switch to it.
                         */
-                       value = readl(base + CPG_RCKCR) & 0x3f;
+                       value = readl(csn->reg) & 0x3f;
 
                        if (clk_get_rate(clks[cpg_clk_extalr])) {
                                parent = clks[cpg_clk_extalr];
                                value |= BIT(15);
                        }
 
-                       writel(value, base + CPG_RCKCR);
+                       writel(value, csn->reg);
+                       cpg_simple_notifier_register(notifiers, csn);
                        break;
                }