@@ -10,8 +10,13 @@
* for more details.
*/
+#include <linux/cpuidle.h>
#include <linux/kernel.h>
#include <linux/smp.h>
+#include <linux/platform_data/renesas-cpuidle.h>
+#include <linux/pm.h>
+#include <asm/cpuidle.h>
+#include <asm/cputype.h>
#include <asm/io.h>
#include "common.h"
#include "pm-rcar.h"
@@ -48,6 +53,46 @@ static inline void r8a7790_sysc_init(void) {}
#endif /* CONFIG_SMP */
+static struct cpuidle_driver r8a7790_ca15_cpuidle_driver = {
+ .name = "rcar_r8a7790_ca15_cpuidle",
+ .owner = THIS_MODULE,
+ .states = {
+ [0] = ARM_CPUIDLE_WFI_STATE,
+ [1] = {
+ .name = "Core-Standby",
+ .desc = "Core Standby Mode",
+ .exit_latency = 3000,
+ .target_residency = 3000,
+ .enter = shmobile_smp_apmu_enter_cpuidle,
+ },
+ },
+ .state_count = 2,
+};
+
+static struct cpuidle_driver r8a7790_ca7_cpuidle_driver = {
+ .name = "rcar_r8a7790_ca7_cpuidle",
+ .owner = THIS_MODULE,
+ .states[0] = ARM_CPUIDLE_WFI_STATE,
+ .safe_state_index = 0, /* C1 */
+ .state_count = 1,
+};
+
+static struct renesas_cpuidle_driver r8a7790_cpuidle[] = {
+ [0] = {
+ .target_cpu = ARM_CPU_PART_CORTEX_A15,
+ .renesas_drv = &r8a7790_ca15_cpuidle_driver,
+ },
+ [1] = {
+ .target_cpu = ARM_CPU_PART_CORTEX_A7,
+ .renesas_drv = &r8a7790_ca7_cpuidle_driver,
+ },
+};
+
+static struct renesas_cpuidle r8a7790_data = {
+ .num_drvs = ARRAY_SIZE(r8a7790_cpuidle),
+ .rcd = r8a7790_cpuidle,
+};
+
void __init r8a7790_pm_init(void)
{
void __iomem *p;
@@ -79,4 +124,6 @@ void __init r8a7790_pm_init(void)
r8a7790_sysc_init();
shmobile_smp_apmu_suspend_init();
+ if (IS_ENABLED(CONFIG_ARM_RENESAS_CPUIDLE))
+ shmobile_cpuidle_set_driver(&r8a7790_data);
}
Add the CPUIdle support power state support for the r8a7790 SoC. This patch add the wfi and Core-Standby for CPUIdle power states support for the Cortex-A15 and add the wfi power state support for the Cortex-A7. Signed-off-by: Keita Kobayashi <keita.kobayashi.ym@renesas.com> --- arch/arm/mach-shmobile/pm-r8a7790.c | 47 +++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+)