pm-r8a7740.c 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. /*
  2. * r8a7740 power management support
  3. *
  4. * Copyright (C) 2012 Renesas Solutions Corp.
  5. * Copyright (C) 2012 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
  6. *
  7. * This file is subject to the terms and conditions of the GNU General Public
  8. * License. See the file "COPYING" in the main directory of this archive
  9. * for more details.
  10. */
  11. #include <linux/console.h>
  12. #include <linux/suspend.h>
  13. #include <mach/pm-rmobile.h>
  14. #include <mach/common.h>
  15. #ifdef CONFIG_PM
  16. static int r8a7740_pd_a4s_suspend(void)
  17. {
  18. /*
  19. * The A4S domain contains the CPU core and therefore it should
  20. * only be turned off if the CPU is in use.
  21. */
  22. return -EBUSY;
  23. }
  24. static int r8a7740_pd_a3sp_suspend(void)
  25. {
  26. /*
  27. * Serial consoles make use of SCIF hardware located in A3SP,
  28. * keep such power domain on if "no_console_suspend" is set.
  29. */
  30. return console_suspend_enabled ? 0 : -EBUSY;
  31. }
  32. static struct rmobile_pm_domain r8a7740_pm_domains[] = {
  33. {
  34. .genpd.name = "A4S",
  35. .bit_shift = 10,
  36. .gov = &pm_domain_always_on_gov,
  37. .no_debug = true,
  38. .suspend = r8a7740_pd_a4s_suspend,
  39. },
  40. {
  41. .genpd.name = "A3SP",
  42. .bit_shift = 11,
  43. .gov = &pm_domain_always_on_gov,
  44. .no_debug = true,
  45. .suspend = r8a7740_pd_a3sp_suspend,
  46. },
  47. {
  48. .genpd.name = "A4LC",
  49. .bit_shift = 1,
  50. },
  51. };
  52. void __init r8a7740_init_pm_domains(void)
  53. {
  54. rmobile_init_domains(r8a7740_pm_domains, ARRAY_SIZE(r8a7740_pm_domains));
  55. pm_genpd_add_subdomain_names("A4S", "A3SP");
  56. }
  57. #endif /* CONFIG_PM */
  58. #ifdef CONFIG_SUSPEND
  59. static int r8a7740_enter_suspend(suspend_state_t suspend_state)
  60. {
  61. cpu_do_idle();
  62. return 0;
  63. }
  64. static void r8a7740_suspend_init(void)
  65. {
  66. shmobile_suspend_ops.enter = r8a7740_enter_suspend;
  67. }
  68. #else
  69. static void r8a7740_suspend_init(void) {}
  70. #endif
  71. void __init r8a7740_pm_init(void)
  72. {
  73. r8a7740_suspend_init();
  74. }