1ce9dcb87SKevin Hilman /*
2ce9dcb87SKevin Hilman  * Runtime PM support code for DaVinci
3ce9dcb87SKevin Hilman  *
4ce9dcb87SKevin Hilman  * Author: Kevin Hilman
5ce9dcb87SKevin Hilman  *
6ce9dcb87SKevin Hilman  * Copyright (C) 2012 Texas Instruments, Inc.
7ce9dcb87SKevin Hilman  *
8ce9dcb87SKevin Hilman  * This file is licensed under the terms of the GNU General Public
9ce9dcb87SKevin Hilman  * License version 2. This program is licensed "as is" without any
10ce9dcb87SKevin Hilman  * warranty of any kind, whether express or implied.
11ce9dcb87SKevin Hilman  */
12ce9dcb87SKevin Hilman #include <linux/init.h>
13ce9dcb87SKevin Hilman #include <linux/pm_runtime.h>
14ce9dcb87SKevin Hilman #include <linux/pm_clock.h>
15ce9dcb87SKevin Hilman #include <linux/platform_device.h>
16ce9dcb87SKevin Hilman 
17ce9dcb87SKevin Hilman #ifdef CONFIG_PM_RUNTIME
18ce9dcb87SKevin Hilman static int davinci_pm_runtime_suspend(struct device *dev)
19ce9dcb87SKevin Hilman {
20ce9dcb87SKevin Hilman 	int ret;
21ce9dcb87SKevin Hilman 
22ce9dcb87SKevin Hilman 	dev_dbg(dev, "%s\n", __func__);
23ce9dcb87SKevin Hilman 
24ce9dcb87SKevin Hilman 	ret = pm_generic_runtime_suspend(dev);
25ce9dcb87SKevin Hilman 	if (ret)
26ce9dcb87SKevin Hilman 		return ret;
27ce9dcb87SKevin Hilman 
28ce9dcb87SKevin Hilman 	ret = pm_clk_suspend(dev);
29ce9dcb87SKevin Hilman 	if (ret) {
30ce9dcb87SKevin Hilman 		pm_generic_runtime_resume(dev);
31ce9dcb87SKevin Hilman 		return ret;
32ce9dcb87SKevin Hilman 	}
33ce9dcb87SKevin Hilman 
34ce9dcb87SKevin Hilman 	return 0;
35ce9dcb87SKevin Hilman }
36ce9dcb87SKevin Hilman 
37ce9dcb87SKevin Hilman static int davinci_pm_runtime_resume(struct device *dev)
38ce9dcb87SKevin Hilman {
39ce9dcb87SKevin Hilman 	dev_dbg(dev, "%s\n", __func__);
40ce9dcb87SKevin Hilman 
41ce9dcb87SKevin Hilman 	pm_clk_resume(dev);
42ce9dcb87SKevin Hilman 	return pm_generic_runtime_resume(dev);
43ce9dcb87SKevin Hilman }
44ce9dcb87SKevin Hilman #endif
45ce9dcb87SKevin Hilman 
46ce9dcb87SKevin Hilman static struct dev_pm_domain davinci_pm_domain = {
47ce9dcb87SKevin Hilman 	.ops = {
48ce9dcb87SKevin Hilman 		SET_RUNTIME_PM_OPS(davinci_pm_runtime_suspend,
49ce9dcb87SKevin Hilman 				   davinci_pm_runtime_resume, NULL)
50ce9dcb87SKevin Hilman 		USE_PLATFORM_PM_SLEEP_OPS
51ce9dcb87SKevin Hilman 	},
52ce9dcb87SKevin Hilman };
53ce9dcb87SKevin Hilman 
54ce9dcb87SKevin Hilman static struct pm_clk_notifier_block platform_bus_notifier = {
55ce9dcb87SKevin Hilman 	.pm_domain = &davinci_pm_domain,
569a3e89b1SLad, Prabhakar 	.con_ids = { "fck", "master", "slave", NULL },
57ce9dcb87SKevin Hilman };
58ce9dcb87SKevin Hilman 
59ce9dcb87SKevin Hilman static int __init davinci_pm_runtime_init(void)
60ce9dcb87SKevin Hilman {
61ce9dcb87SKevin Hilman 	pm_clk_add_notifier(&platform_bus_type, &platform_bus_notifier);
62ce9dcb87SKevin Hilman 
63ce9dcb87SKevin Hilman 	return 0;
64ce9dcb87SKevin Hilman }
65ce9dcb87SKevin Hilman core_initcall(davinci_pm_runtime_init);
66