pm.c 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * loongson-specific suspend support
  4. *
  5. * Copyright (C) 2009 Lemote Inc.
  6. * Author: Wu Zhangjin <wuzhangjin@gmail.com>
  7. */
  8. #include <linux/suspend.h>
  9. #include <linux/pm.h>
  10. #include <asm/mipsregs.h>
  11. #include <loongson.h>
  12. asmlinkage void loongson_lefi_sleep(unsigned long sleep_addr);
  13. static int lefi_pm_enter(suspend_state_t state)
  14. {
  15. switch (state) {
  16. case PM_SUSPEND_MEM:
  17. pm_set_suspend_via_firmware();
  18. loongson_lefi_sleep(loongson_sysconf.suspend_addr);
  19. pm_set_resume_via_firmware();
  20. return 0;
  21. default:
  22. return -EINVAL;
  23. }
  24. }
  25. static int lefi_pm_valid_state(suspend_state_t state)
  26. {
  27. switch (state) {
  28. case PM_SUSPEND_MEM:
  29. return !!loongson_sysconf.suspend_addr;
  30. default:
  31. return 0;
  32. }
  33. }
  34. static const struct platform_suspend_ops lefi_pm_ops = {
  35. .valid = lefi_pm_valid_state,
  36. .enter = lefi_pm_enter,
  37. };
  38. static int __init loongson_pm_init(void)
  39. {
  40. if (loongson_sysconf.fw_interface == LOONGSON_LEFI)
  41. suspend_set_ops(&lefi_pm_ops);
  42. return 0;
  43. }
  44. arch_initcall(loongson_pm_init);