diff options
Diffstat (limited to 'drivers/sh/pm_runtime.c')
| -rw-r--r-- | drivers/sh/pm_runtime.c | 60 | 
1 files changed, 53 insertions, 7 deletions
diff --git a/drivers/sh/pm_runtime.c b/drivers/sh/pm_runtime.c index 8afa5a4589f..72f63817a1a 100644 --- a/drivers/sh/pm_runtime.c +++ b/drivers/sh/pm_runtime.c @@ -21,18 +21,43 @@  #include <linux/slab.h>  #ifdef CONFIG_PM_RUNTIME - -static int default_platform_runtime_idle(struct device *dev) +static int sh_pm_runtime_suspend(struct device *dev)  { -	/* suspend synchronously to disable clocks immediately */ +	int ret; + +	ret = pm_generic_runtime_suspend(dev); +	if (ret) { +		dev_err(dev, "failed to suspend device\n"); +		return ret; +	} + +	ret = pm_clk_suspend(dev); +	if (ret) { +		dev_err(dev, "failed to suspend clock\n"); +		pm_generic_runtime_resume(dev); +		return ret; +	} +  	return 0;  } +static int sh_pm_runtime_resume(struct device *dev) +{ +	int ret; + +	ret = pm_clk_resume(dev); +	if (ret) { +		dev_err(dev, "failed to resume clock\n"); +		return ret; +	} + +	return pm_generic_runtime_resume(dev); +} +  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, +		.runtime_suspend = sh_pm_runtime_suspend, +		.runtime_resume = sh_pm_runtime_resume,  		USE_PLATFORM_PM_SLEEP_OPS  	},  }; @@ -50,8 +75,28 @@ static struct pm_clk_notifier_block platform_bus_notifier = {  	.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,r8a7792") && +		    !of_machine_is_compatible("renesas,r8a7793") && +		    !of_machine_is_compatible("renesas,r8a7794") && +		    !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;  } @@ -59,7 +104,8 @@ core_initcall(sh_pm_runtime_init);  static int __init sh_pm_runtime_late_init(void)  { -	pm_genpd_poweroff_unused(); +	if (default_pm_on) +		pm_genpd_poweroff_unused();  	return 0;  }  late_initcall(sh_pm_runtime_late_init);  | 
