pmu.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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/ioport.h>
  11. #include <lantiq_soc.h>
  12. /* PMU - the power management unit allows us to turn part of the core
  13. * on and off
  14. */
  15. /* the enable / disable registers */
  16. #define LTQ_PMU_PWDCR 0x1C
  17. #define LTQ_PMU_PWDSR 0x20
  18. #define ltq_pmu_w32(x, y) ltq_w32((x), ltq_pmu_membase + (y))
  19. #define ltq_pmu_r32(x) ltq_r32(ltq_pmu_membase + (x))
  20. static struct resource ltq_pmu_resource = {
  21. .name = "pmu",
  22. .start = LTQ_PMU_BASE_ADDR,
  23. .end = LTQ_PMU_BASE_ADDR + LTQ_PMU_SIZE - 1,
  24. .flags = IORESOURCE_MEM,
  25. };
  26. static void __iomem *ltq_pmu_membase;
  27. void ltq_pmu_enable(unsigned int module)
  28. {
  29. int err = 1000000;
  30. ltq_pmu_w32(ltq_pmu_r32(LTQ_PMU_PWDCR) & ~module, LTQ_PMU_PWDCR);
  31. do {} while (--err && (ltq_pmu_r32(LTQ_PMU_PWDSR) & module));
  32. if (!err)
  33. panic("activating PMU module failed!");
  34. }
  35. EXPORT_SYMBOL(ltq_pmu_enable);
  36. void ltq_pmu_disable(unsigned int module)
  37. {
  38. ltq_pmu_w32(ltq_pmu_r32(LTQ_PMU_PWDCR) | module, LTQ_PMU_PWDCR);
  39. }
  40. EXPORT_SYMBOL(ltq_pmu_disable);
  41. int __init ltq_pmu_init(void)
  42. {
  43. if (insert_resource(&iomem_resource, &ltq_pmu_resource) < 0)
  44. panic("Failed to insert pmu memory");
  45. if (request_mem_region(ltq_pmu_resource.start,
  46. resource_size(&ltq_pmu_resource), "pmu") < 0)
  47. panic("Failed to request pmu memory");
  48. ltq_pmu_membase = ioremap_nocache(ltq_pmu_resource.start,
  49. resource_size(&ltq_pmu_resource));
  50. if (!ltq_pmu_membase)
  51. panic("Failed to remap pmu memory");
  52. return 0;
  53. }
  54. core_initcall(ltq_pmu_init);