Merge branches 'acpi-resources', 'acpi-battery', 'acpi-doc' and 'acpi-pnp'
[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 22
300be5b9 23#ifdef CONFIG_PM
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 70
300be5b9 71#endif /* CONFIG_PM */
f14c4f14 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
78static int __init sh_pm_runtime_init(void)
79{
3c90c55d
GU
80 if (IS_ENABLED(CONFIG_ARCH_SHMOBILE_MULTI)) {
81 if (!of_machine_is_compatible("renesas,emev2") &&
82 !of_machine_is_compatible("renesas,r7s72100") &&
a5cb514f 83#ifndef CONFIG_PM_GENERIC_DOMAINS_OF
230f259f 84 !of_machine_is_compatible("renesas,r8a73a4") &&
3c90c55d 85 !of_machine_is_compatible("renesas,r8a7740") &&
41b4b3bc 86 !of_machine_is_compatible("renesas,sh73a0") &&
a5cb514f 87#endif
3c90c55d
GU
88 !of_machine_is_compatible("renesas,r8a7778") &&
89 !of_machine_is_compatible("renesas,r8a7779") &&
90 !of_machine_is_compatible("renesas,r8a7790") &&
91 !of_machine_is_compatible("renesas,r8a7791") &&
2f35fb3c
GU
92 !of_machine_is_compatible("renesas,r8a7792") &&
93 !of_machine_is_compatible("renesas,r8a7793") &&
00170528 94 !of_machine_is_compatible("renesas,r8a7794"))
3c90c55d
GU
95 return 0;
96 }
97
3d5c3036 98 pm_clk_add_notifier(&platform_bus_type, &platform_bus_notifier);
f14c4f14
MD
99 return 0;
100}
101core_initcall(sh_pm_runtime_init);