3c90c55dcd
If the kernel is built to support multi-ARM configuration with shmobile support built in, then drivers/sh is not built. This contains the PM runtime code in drivers/sh/pm_runtime.c, which implicitly enables the module clocks for all devices, and thus is quite essential. Without this, the state of clocks depends on implicit reset state, or on the bootloader. If ARCH_SHMOBILE_MULTI then build the drivers/sh directory, but ensure that bits that may conflict (drivers/sh/clk if the common clock framework is enabled) or are not used (drivers/sh/intc), are not built. Also, only enable the PM runtime code when actually running on a shmobile SoCs that needs it. ARCH_SHMOBILE_MULTI was added a while ago by commitefacfce5f8
("ARM: shmobile: Introduce ARCH_SHMOBILE_MULTI"), but drivers/sh was compiled for both ARCH_SHMOBILE_LEGACY and ARCH_SHMOBILE_MULTI until commitbf98c1eac1
("ARM: Rename ARCH_SHMOBILE to ARCH_SHMOBILE_LEGACY"). Inspired by a patch from Ben Dooks <ben.dooks@codethink.co.uk>. Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be> Signed-off-by: Simon Horman <horms+renesas@verge.net.au>
83 lines
2.1 KiB
C
83 lines
2.1 KiB
C
/*
|
|
* Runtime PM support code
|
|
*
|
|
* Copyright (C) 2009-2010 Magnus Damm
|
|
*
|
|
* This file is subject to the terms and conditions of the GNU General Public
|
|
* License. See the file "COPYING" in the main directory of this archive
|
|
* for more details.
|
|
*/
|
|
|
|
#include <linux/init.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/io.h>
|
|
#include <linux/pm_runtime.h>
|
|
#include <linux/pm_domain.h>
|
|
#include <linux/pm_clock.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/clk.h>
|
|
#include <linux/sh_clk.h>
|
|
#include <linux/bitmap.h>
|
|
#include <linux/slab.h>
|
|
|
|
#ifdef CONFIG_PM_RUNTIME
|
|
|
|
static int default_platform_runtime_idle(struct device *dev)
|
|
{
|
|
/* suspend synchronously to disable clocks immediately */
|
|
return 0;
|
|
}
|
|
|
|
static struct dev_pm_domain default_pm_domain = {
|
|
.ops = {
|
|
.runtime_suspend = pm_clk_suspend,
|
|
.runtime_resume = pm_clk_resume,
|
|
.runtime_idle = default_platform_runtime_idle,
|
|
USE_PLATFORM_PM_SLEEP_OPS
|
|
},
|
|
};
|
|
|
|
#define DEFAULT_PM_DOMAIN_PTR (&default_pm_domain)
|
|
|
|
#else
|
|
|
|
#define DEFAULT_PM_DOMAIN_PTR NULL
|
|
|
|
#endif /* CONFIG_PM_RUNTIME */
|
|
|
|
static struct pm_clk_notifier_block platform_bus_notifier = {
|
|
.pm_domain = DEFAULT_PM_DOMAIN_PTR,
|
|
.con_ids = { NULL, },
|
|
};
|
|
|
|
static bool default_pm_on;
|
|
|
|
static int __init sh_pm_runtime_init(void)
|
|
{
|
|
if (IS_ENABLED(CONFIG_ARCH_SHMOBILE_MULTI)) {
|
|
if (!of_machine_is_compatible("renesas,emev2") &&
|
|
!of_machine_is_compatible("renesas,r7s72100") &&
|
|
!of_machine_is_compatible("renesas,r8a73a4") &&
|
|
!of_machine_is_compatible("renesas,r8a7740") &&
|
|
!of_machine_is_compatible("renesas,r8a7778") &&
|
|
!of_machine_is_compatible("renesas,r8a7779") &&
|
|
!of_machine_is_compatible("renesas,r8a7790") &&
|
|
!of_machine_is_compatible("renesas,r8a7791") &&
|
|
!of_machine_is_compatible("renesas,sh7372") &&
|
|
!of_machine_is_compatible("renesas,sh73a0"))
|
|
return 0;
|
|
}
|
|
|
|
default_pm_on = true;
|
|
pm_clk_add_notifier(&platform_bus_type, &platform_bus_notifier);
|
|
return 0;
|
|
}
|
|
core_initcall(sh_pm_runtime_init);
|
|
|
|
static int __init sh_pm_runtime_late_init(void)
|
|
{
|
|
if (default_pm_on)
|
|
pm_genpd_poweroff_unused();
|
|
return 0;
|
|
}
|
|
late_initcall(sh_pm_runtime_late_init);
|