/* * 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 #include #include #include #include #include #include #include #include #include #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 */