pmu.c 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /*
  2. * This program is free software; you can redistribute it and/or modify it
  3. * under the terms of the GNU General Public License version 2 as published
  4. * by the Free Software Foundation.
  5. *
  6. * Copyright (C) 2010 John Crispin <blogic@openwrt.org>
  7. */
  8. #include <linux/kernel.h>
  9. #include <linux/module.h>
  10. #include <linux/version.h>
  11. #include <linux/ioport.h>
  12. #include <lantiq_soc.h>
  13. /* PMU - the power management unit allows us to turn part of the core
  14. * on and off
  15. */
  16. /* the enable / disable registers */
  17. #define LTQ_PMU_PWDCR 0x1C
  18. #define LTQ_PMU_PWDSR 0x20
  19. #define ltq_pmu_w32(x, y) ltq_w32((x), ltq_pmu_membase + (y))
  20. #define ltq_pmu_r32(x) ltq_r32(ltq_pmu_membase + (x))
  21. static struct resource ltq_pmu_resource = {
  22. .name = "pmu",
  23. .start = LTQ_PMU_BASE_ADDR,
  24. .end = LTQ_PMU_BASE_ADDR + LTQ_PMU_SIZE - 1,
  25. .flags = IORESOURCE_MEM,
  26. };
  27. static void __iomem *ltq_pmu_membase;
  28. void ltq_pmu_enable(unsigned int module)
  29. {
  30. int err = 1000000;
  31. ltq_pmu_w32(ltq_pmu_r32(LTQ_PMU_PWDCR) & ~module, LTQ_PMU_PWDCR);
  32. do {} while (--err && (ltq_pmu_r32(LTQ_PMU_PWDSR) & module));
  33. if (!err)
  34. panic("activating PMU module failed!\n");
  35. }
  36. EXPORT_SYMBOL(ltq_pmu_enable);
  37. void ltq_pmu_disable(unsigned int module)
  38. {
  39. ltq_pmu_w32(ltq_pmu_r32(LTQ_PMU_PWDCR) | module, LTQ_PMU_PWDCR);
  40. }
  41. EXPORT_SYMBOL(ltq_pmu_disable);
  42. int __init ltq_pmu_init(void)
  43. {
  44. if (insert_resource(&iomem_resource, &ltq_pmu_resource) < 0)
  45. panic("Failed to insert pmu memory\n");
  46. if (request_mem_region(ltq_pmu_resource.start,
  47. resource_size(&ltq_pmu_resource), "pmu") < 0)
  48. panic("Failed to request pmu memory\n");
  49. ltq_pmu_membase = ioremap_nocache(ltq_pmu_resource.start,
  50. resource_size(&ltq_pmu_resource));
  51. if (!ltq_pmu_membase)
  52. panic("Failed to remap pmu memory\n");
  53. return 0;
  54. }
  55. core_initcall(ltq_pmu_init);