cpuidle-kirkwood.c 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * CPU idle Marvell Kirkwood SoCs
  4. *
  5. * The cpu idle uses wait-for-interrupt and DDR self refresh in order
  6. * to implement two idle states -
  7. * #1 wait-for-interrupt
  8. * #2 wait-for-interrupt and DDR self refresh
  9. *
  10. * Maintainer: Jason Cooper <jason@lakedaemon.net>
  11. * Maintainer: Andrew Lunn <andrew@lunn.ch>
  12. */
  13. #include <linux/kernel.h>
  14. #include <linux/module.h>
  15. #include <linux/init.h>
  16. #include <linux/platform_device.h>
  17. #include <linux/cpuidle.h>
  18. #include <linux/io.h>
  19. #include <linux/export.h>
  20. #include <asm/cpuidle.h>
  21. #define KIRKWOOD_MAX_STATES 2
  22. static void __iomem *ddr_operation_base;
  23. /* Actual code that puts the SoC in different idle states */
  24. static int kirkwood_enter_idle(struct cpuidle_device *dev,
  25. struct cpuidle_driver *drv,
  26. int index)
  27. {
  28. writel(0x7, ddr_operation_base);
  29. cpu_do_idle();
  30. return index;
  31. }
  32. static struct cpuidle_driver kirkwood_idle_driver = {
  33. .name = "kirkwood_idle",
  34. .owner = THIS_MODULE,
  35. .states[0] = ARM_CPUIDLE_WFI_STATE,
  36. .states[1] = {
  37. .enter = kirkwood_enter_idle,
  38. .exit_latency = 10,
  39. .target_residency = 100000,
  40. .name = "DDR SR",
  41. .desc = "WFI and DDR Self Refresh",
  42. },
  43. .state_count = KIRKWOOD_MAX_STATES,
  44. };
  45. /* Initialize CPU idle by registering the idle states */
  46. static int kirkwood_cpuidle_probe(struct platform_device *pdev)
  47. {
  48. ddr_operation_base = devm_platform_ioremap_resource(pdev, 0);
  49. if (IS_ERR(ddr_operation_base))
  50. return PTR_ERR(ddr_operation_base);
  51. return cpuidle_register(&kirkwood_idle_driver, NULL);
  52. }
  53. static void kirkwood_cpuidle_remove(struct platform_device *pdev)
  54. {
  55. cpuidle_unregister(&kirkwood_idle_driver);
  56. }
  57. static struct platform_driver kirkwood_cpuidle_driver = {
  58. .probe = kirkwood_cpuidle_probe,
  59. .remove = kirkwood_cpuidle_remove,
  60. .driver = {
  61. .name = "kirkwood_cpuidle",
  62. },
  63. };
  64. module_platform_driver(kirkwood_cpuidle_driver);
  65. MODULE_AUTHOR("Andrew Lunn <andrew@lunn.ch>");
  66. MODULE_DESCRIPTION("Kirkwood cpu idle driver");
  67. MODULE_LICENSE("GPL v2");
  68. MODULE_ALIAS("platform:kirkwood-cpuidle");