1 | // SPDX-License-Identifier: GPL-2.0 |
---|---|
2 | /* |
3 | * Copyright (C) 2019 Paul Cercueil <paul@crapouillou.net> |
4 | */ |
5 | |
6 | #include "cgu.h" |
7 | #include "pm.h" |
8 | |
9 | #include <linux/io.h> |
10 | #include <linux/syscore_ops.h> |
11 | |
12 | #define CGU_REG_LCR 0x04 |
13 | |
14 | #define LCR_LOW_POWER_MODE BIT(0) |
15 | |
16 | static void __iomem * __maybe_unused ingenic_cgu_base; |
17 | |
18 | static int __maybe_unused ingenic_cgu_pm_suspend(void) |
19 | { |
20 | u32 val = readl(addr: ingenic_cgu_base + CGU_REG_LCR); |
21 | |
22 | writel(val: val | LCR_LOW_POWER_MODE, addr: ingenic_cgu_base + CGU_REG_LCR); |
23 | |
24 | return 0; |
25 | } |
26 | |
27 | static void __maybe_unused ingenic_cgu_pm_resume(void) |
28 | { |
29 | u32 val = readl(addr: ingenic_cgu_base + CGU_REG_LCR); |
30 | |
31 | writel(val: val & ~LCR_LOW_POWER_MODE, addr: ingenic_cgu_base + CGU_REG_LCR); |
32 | } |
33 | |
34 | static struct syscore_ops __maybe_unused ingenic_cgu_pm_ops = { |
35 | .suspend = ingenic_cgu_pm_suspend, |
36 | .resume = ingenic_cgu_pm_resume, |
37 | }; |
38 | |
39 | void ingenic_cgu_register_syscore_ops(struct ingenic_cgu *cgu) |
40 | { |
41 | if (IS_ENABLED(CONFIG_PM_SLEEP)) { |
42 | ingenic_cgu_base = cgu->base; |
43 | register_syscore_ops(ops: &ingenic_cgu_pm_ops); |
44 | } |
45 | } |
46 |