-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'pm-runtime' of ssh://master.kernel.org/pub/scm/linux/ke…
…rnel/git/khilman/linux-omap-pm into omap-for-linus
- Loading branch information
Showing
4 changed files
with
191 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,98 @@ | ||
/* | ||
* Runtime PM support code for OMAP1 | ||
* | ||
* Author: Kevin Hilman, Deep Root Systems, LLC | ||
* | ||
* Copyright (C) 2010 Texas Instruments, Inc. | ||
* | ||
* This file is licensed under the terms of the GNU General Public | ||
* License version 2. This program is licensed "as is" without any | ||
* warranty of any kind, whether express or implied. | ||
*/ | ||
#include <linux/init.h> | ||
#include <linux/kernel.h> | ||
#include <linux/io.h> | ||
#include <linux/pm_runtime.h> | ||
#include <linux/platform_device.h> | ||
#include <linux/mutex.h> | ||
#include <linux/clk.h> | ||
#include <linux/err.h> | ||
|
||
#include <plat/omap_device.h> | ||
#include <plat/omap-pm.h> | ||
|
||
#ifdef CONFIG_PM_RUNTIME | ||
static int omap1_pm_runtime_suspend(struct device *dev) | ||
{ | ||
struct clk *iclk, *fclk; | ||
int ret = 0; | ||
|
||
dev_dbg(dev, "%s\n", __func__); | ||
|
||
ret = pm_generic_runtime_suspend(dev); | ||
|
||
fclk = clk_get(dev, "fck"); | ||
if (!IS_ERR(fclk)) { | ||
clk_disable(fclk); | ||
clk_put(fclk); | ||
} | ||
|
||
iclk = clk_get(dev, "ick"); | ||
if (!IS_ERR(iclk)) { | ||
clk_disable(iclk); | ||
clk_put(iclk); | ||
} | ||
|
||
return 0; | ||
}; | ||
|
||
static int omap1_pm_runtime_resume(struct device *dev) | ||
{ | ||
int ret = 0; | ||
struct clk *iclk, *fclk; | ||
|
||
dev_dbg(dev, "%s\n", __func__); | ||
|
||
iclk = clk_get(dev, "ick"); | ||
if (!IS_ERR(iclk)) { | ||
clk_enable(iclk); | ||
clk_put(iclk); | ||
} | ||
|
||
fclk = clk_get(dev, "fck"); | ||
if (!IS_ERR(fclk)) { | ||
clk_enable(fclk); | ||
clk_put(fclk); | ||
} | ||
|
||
return pm_generic_runtime_resume(dev); | ||
}; | ||
|
||
static int __init omap1_pm_runtime_init(void) | ||
{ | ||
const struct dev_pm_ops *pm; | ||
struct dev_pm_ops *omap_pm; | ||
|
||
pm = platform_bus_get_pm_ops(); | ||
if (!pm) { | ||
pr_err("%s: unable to get dev_pm_ops from platform_bus\n", | ||
__func__); | ||
return -ENODEV; | ||
} | ||
|
||
omap_pm = kmemdup(pm, sizeof(struct dev_pm_ops), GFP_KERNEL); | ||
if (!omap_pm) { | ||
pr_err("%s: unable to alloc memory for new dev_pm_ops\n", | ||
__func__); | ||
return -ENOMEM; | ||
} | ||
|
||
omap_pm->runtime_suspend = omap1_pm_runtime_suspend; | ||
omap_pm->runtime_resume = omap1_pm_runtime_resume; | ||
|
||
platform_bus_set_pm_ops(omap_pm); | ||
|
||
return 0; | ||
} | ||
core_initcall(omap1_pm_runtime_init); | ||
#endif /* CONFIG_PM_RUNTIME */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
/* | ||
* Runtime PM support code for OMAP | ||
* | ||
* Author: Kevin Hilman, Deep Root Systems, LLC | ||
* | ||
* Copyright (C) 2010 Texas Instruments, Inc. | ||
* | ||
* This file is licensed under the terms of the GNU General Public | ||
* License version 2. This program is licensed "as is" without any | ||
* warranty of any kind, whether express or implied. | ||
*/ | ||
#include <linux/init.h> | ||
#include <linux/kernel.h> | ||
#include <linux/io.h> | ||
#include <linux/pm_runtime.h> | ||
#include <linux/platform_device.h> | ||
#include <linux/mutex.h> | ||
|
||
#include <plat/omap_device.h> | ||
#include <plat/omap-pm.h> | ||
|
||
#ifdef CONFIG_PM_RUNTIME | ||
int omap_pm_runtime_suspend(struct device *dev) | ||
{ | ||
struct platform_device *pdev = to_platform_device(dev); | ||
int r, ret = 0; | ||
|
||
dev_dbg(dev, "%s\n", __func__); | ||
|
||
ret = pm_generic_runtime_suspend(dev); | ||
|
||
if (!ret && dev->parent == &omap_device_parent) { | ||
r = omap_device_idle(pdev); | ||
WARN_ON(r); | ||
} | ||
|
||
return ret; | ||
}; | ||
|
||
int omap_pm_runtime_resume(struct device *dev) | ||
{ | ||
struct platform_device *pdev = to_platform_device(dev); | ||
int r; | ||
|
||
dev_dbg(dev, "%s\n", __func__); | ||
|
||
if (dev->parent == &omap_device_parent) { | ||
r = omap_device_enable(pdev); | ||
WARN_ON(r); | ||
} | ||
|
||
return pm_generic_runtime_resume(dev); | ||
}; | ||
#else | ||
#define omap_pm_runtime_suspend NULL | ||
#define omap_pm_runtime_resume NULL | ||
#endif /* CONFIG_PM_RUNTIME */ | ||
|
||
static int __init omap_pm_runtime_init(void) | ||
{ | ||
const struct dev_pm_ops *pm; | ||
struct dev_pm_ops *omap_pm; | ||
|
||
pm = platform_bus_get_pm_ops(); | ||
if (!pm) { | ||
pr_err("%s: unable to get dev_pm_ops from platform_bus\n", | ||
__func__); | ||
return -ENODEV; | ||
} | ||
|
||
omap_pm = kmemdup(pm, sizeof(struct dev_pm_ops), GFP_KERNEL); | ||
if (!omap_pm) { | ||
pr_err("%s: unable to alloc memory for new dev_pm_ops\n", | ||
__func__); | ||
return -ENOMEM; | ||
} | ||
|
||
omap_pm->runtime_suspend = omap_pm_runtime_suspend; | ||
omap_pm->runtime_resume = omap_pm_runtime_resume; | ||
|
||
platform_bus_set_pm_ops(omap_pm); | ||
|
||
return 0; | ||
} | ||
core_initcall(omap_pm_runtime_init); |