cpuidle-calxeda.c 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright 2012 Calxeda, Inc.
  4. *
  5. * Based on arch/arm/plat-mxc/cpuidle.c: #v3.7
  6. * Copyright 2012 Freescale Semiconductor, Inc.
  7. * Copyright 2012 Linaro Ltd.
  8. *
  9. * Maintainer: Rob Herring <rob.herring@calxeda.com>
  10. */
  11. #include <linux/cpuidle.h>
  12. #include <linux/cpu_pm.h>
  13. #include <linux/init.h>
  14. #include <linux/mm.h>
  15. #include <linux/platform_device.h>
  16. #include <linux/psci.h>
  17. #include <asm/cpuidle.h>
  18. #include <asm/suspend.h>
  19. #include <uapi/linux/psci.h>
  20. #define CALXEDA_IDLE_PARAM \
  21. ((0 << PSCI_0_2_POWER_STATE_ID_SHIFT) | \
  22. (0 << PSCI_0_2_POWER_STATE_AFFL_SHIFT) | \
  23. (PSCI_POWER_STATE_TYPE_POWER_DOWN << PSCI_0_2_POWER_STATE_TYPE_SHIFT))
  24. static int calxeda_idle_finish(unsigned long val)
  25. {
  26. return psci_ops.cpu_suspend(CALXEDA_IDLE_PARAM, __pa(cpu_resume));
  27. }
  28. static int calxeda_pwrdown_idle(struct cpuidle_device *dev,
  29. struct cpuidle_driver *drv,
  30. int index)
  31. {
  32. cpu_pm_enter();
  33. cpu_suspend(0, calxeda_idle_finish);
  34. cpu_pm_exit();
  35. return index;
  36. }
  37. static struct cpuidle_driver calxeda_idle_driver = {
  38. .name = "calxeda_idle",
  39. .states = {
  40. ARM_CPUIDLE_WFI_STATE,
  41. {
  42. .name = "PG",
  43. .desc = "Power Gate",
  44. .exit_latency = 30,
  45. .power_usage = 50,
  46. .target_residency = 200,
  47. .enter = calxeda_pwrdown_idle,
  48. },
  49. },
  50. .state_count = 2,
  51. };
  52. static int calxeda_cpuidle_probe(struct platform_device *pdev)
  53. {
  54. return cpuidle_register(&calxeda_idle_driver, NULL);
  55. }
  56. static struct platform_driver calxeda_cpuidle_plat_driver = {
  57. .driver = {
  58. .name = "cpuidle-calxeda",
  59. },
  60. .probe = calxeda_cpuidle_probe,
  61. };
  62. builtin_platform_driver(calxeda_cpuidle_plat_driver);