| /* |
| * r8a7740 power management support |
| * |
| * Copyright (C) 2012 Renesas Solutions Corp. |
| * Copyright (C) 2012 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> |
| * |
| * 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/console.h> |
| #include <linux/io.h> |
| #include <linux/suspend.h> |
| |
| #include "common.h" |
| #include "pm-rmobile.h" |
| |
| #define SYSC_BASE IOMEM(0xe6180000) |
| |
| #if defined(CONFIG_PM) && !defined(CONFIG_ARCH_MULTIPLATFORM) |
| static int r8a7740_pd_a3sm_suspend(void) |
| { |
| /* |
| * The A3SM domain contains the CPU core and therefore it should |
| * only be turned off if the CPU is not in use. |
| */ |
| return -EBUSY; |
| } |
| |
| static int r8a7740_pd_a3sp_suspend(void) |
| { |
| /* |
| * Serial consoles make use of SCIF hardware located in A3SP, |
| * keep such power domain on if "no_console_suspend" is set. |
| */ |
| return console_suspend_enabled ? 0 : -EBUSY; |
| } |
| |
| static int r8a7740_pd_d4_suspend(void) |
| { |
| /* |
| * The D4 domain contains the Coresight-ETM hardware block and |
| * therefore it should only be turned off if the debug module is |
| * not in use. |
| */ |
| return -EBUSY; |
| } |
| |
| static struct rmobile_pm_domain r8a7740_pm_domains[] = { |
| { |
| .genpd.name = "A4LC", |
| .base = SYSC_BASE, |
| .bit_shift = 1, |
| }, { |
| .genpd.name = "A4MP", |
| .base = SYSC_BASE, |
| .bit_shift = 2, |
| }, { |
| .genpd.name = "D4", |
| .base = SYSC_BASE, |
| .bit_shift = 3, |
| .gov = &pm_domain_always_on_gov, |
| .suspend = r8a7740_pd_d4_suspend, |
| }, { |
| .genpd.name = "A4R", |
| .base = SYSC_BASE, |
| .bit_shift = 5, |
| }, { |
| .genpd.name = "A3RV", |
| .base = SYSC_BASE, |
| .bit_shift = 6, |
| }, { |
| .genpd.name = "A4S", |
| .base = SYSC_BASE, |
| .bit_shift = 10, |
| .no_debug = true, |
| }, { |
| .genpd.name = "A3SP", |
| .base = SYSC_BASE, |
| .bit_shift = 11, |
| .gov = &pm_domain_always_on_gov, |
| .no_debug = true, |
| .suspend = r8a7740_pd_a3sp_suspend, |
| }, { |
| .genpd.name = "A3SM", |
| .base = SYSC_BASE, |
| .bit_shift = 12, |
| .gov = &pm_domain_always_on_gov, |
| .suspend = r8a7740_pd_a3sm_suspend, |
| }, { |
| .genpd.name = "A3SG", |
| .base = SYSC_BASE, |
| .bit_shift = 13, |
| }, { |
| .genpd.name = "A4SU", |
| .base = SYSC_BASE, |
| .bit_shift = 20, |
| }, |
| }; |
| |
| void __init r8a7740_init_pm_domains(void) |
| { |
| rmobile_init_domains(r8a7740_pm_domains, ARRAY_SIZE(r8a7740_pm_domains)); |
| pm_genpd_add_subdomain_names("A4R", "A3RV"); |
| pm_genpd_add_subdomain_names("A4S", "A3SP"); |
| pm_genpd_add_subdomain_names("A4S", "A3SM"); |
| pm_genpd_add_subdomain_names("A4S", "A3SG"); |
| } |
| #endif /* CONFIG_PM && !CONFIG_ARCH_MULTIPLATFORM */ |
| |
| #ifdef CONFIG_SUSPEND |
| static int r8a7740_enter_suspend(suspend_state_t suspend_state) |
| { |
| cpu_do_idle(); |
| return 0; |
| } |
| |
| static void r8a7740_suspend_init(void) |
| { |
| shmobile_suspend_ops.enter = r8a7740_enter_suspend; |
| } |
| #else |
| static void r8a7740_suspend_init(void) {} |
| #endif |
| |
| void __init r8a7740_pm_init(void) |
| { |
| r8a7740_suspend_init(); |
| } |