Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[linux-2.6-block.git] / drivers / sh / pm_runtime.c
CommitLineData
f14c4f14 1/*
d03299ee 2 * Runtime PM support code
f14c4f14
MD
3 *
4 * Copyright (C) 2009-2010 Magnus Damm
5 *
6 * This file is subject to the terms and conditions of the GNU General Public
7 * License. See the file "COPYING" in the main directory of this archive
8 * for more details.
9 */
10
11#include <linux/init.h>
12#include <linux/kernel.h>
13#include <linux/io.h>
14#include <linux/pm_runtime.h>
79620414 15#include <linux/pm_domain.h>
b5e8d269 16#include <linux/pm_clock.h>
f14c4f14
MD
17#include <linux/platform_device.h>
18#include <linux/clk.h>
19#include <linux/sh_clk.h>
20#include <linux/bitmap.h>
1d2b71f6 21#include <linux/slab.h>
f14c4f14
MD
22
23#ifdef CONFIG_PM_RUNTIME
8255fe16
BD
24static int sh_pm_runtime_suspend(struct device *dev)
25{
26 int ret;
27
28 ret = pm_generic_runtime_suspend(dev);
29 if (ret) {
30 dev_err(dev, "failed to suspend device\n");
31 return ret;
32 }
33
34 ret = pm_clk_suspend(dev);
35 if (ret) {
36 dev_err(dev, "failed to suspend clock\n");
37 pm_generic_runtime_resume(dev);
38 return ret;
39 }
40
41 return 0;
42}
43
44static int sh_pm_runtime_resume(struct device *dev)
45{
46 int ret;
47
48 ret = pm_clk_resume(dev);
49 if (ret) {
50 dev_err(dev, "failed to resume clock\n");
51 return ret;
52 }
53
54 return pm_generic_runtime_resume(dev);
55}
56
564b905a 57static struct dev_pm_domain default_pm_domain = {
38ade3a1 58 .ops = {
8255fe16
BD
59 .runtime_suspend = sh_pm_runtime_suspend,
60 .runtime_resume = sh_pm_runtime_resume,
38ade3a1
RW
61 USE_PLATFORM_PM_SLEEP_OPS
62 },
63};
64
564b905a 65#define DEFAULT_PM_DOMAIN_PTR (&default_pm_domain)
1d2b71f6 66
85eb8c8d 67#else
f14c4f14 68
564b905a 69#define DEFAULT_PM_DOMAIN_PTR NULL
f14c4f14
MD
70
71#endif /* CONFIG_PM_RUNTIME */
72
85eb8c8d 73static struct pm_clk_notifier_block platform_bus_notifier = {
564b905a 74 .pm_domain = DEFAULT_PM_DOMAIN_PTR,
85eb8c8d 75 .con_ids = { NULL, },
f14c4f14
MD
76};
77
3c90c55d
GU
78static bool default_pm_on;
79
f14c4f14
MD
80static int __init sh_pm_runtime_init(void)
81{
3c90c55d
GU
82 if (IS_ENABLED(CONFIG_ARCH_SHMOBILE_MULTI)) {
83 if (!of_machine_is_compatible("renesas,emev2") &&
84 !of_machine_is_compatible("renesas,r7s72100") &&
85 !of_machine_is_compatible("renesas,r8a73a4") &&
86 !of_machine_is_compatible("renesas,r8a7740") &&
87 !of_machine_is_compatible("renesas,r8a7778") &&
88 !of_machine_is_compatible("renesas,r8a7779") &&
89 !of_machine_is_compatible("renesas,r8a7790") &&
90 !of_machine_is_compatible("renesas,r8a7791") &&
2f35fb3c
GU
91 !of_machine_is_compatible("renesas,r8a7792") &&
92 !of_machine_is_compatible("renesas,r8a7793") &&
93 !of_machine_is_compatible("renesas,r8a7794") &&
3c90c55d
GU
94 !of_machine_is_compatible("renesas,sh7372") &&
95 !of_machine_is_compatible("renesas,sh73a0"))
96 return 0;
97 }
98
99 default_pm_on = true;
3d5c3036 100 pm_clk_add_notifier(&platform_bus_type, &platform_bus_notifier);
f14c4f14
MD
101 return 0;
102}
103core_initcall(sh_pm_runtime_init);
999a4d2a 104
999a4d2a
MD
105static int __init sh_pm_runtime_late_init(void)
106{
3c90c55d
GU
107 if (default_pm_on)
108 pm_genpd_poweroff_unused();
999a4d2a
MD
109 return 0;
110}
111late_initcall(sh_pm_runtime_late_init);