clockdomain2xxx_3xxx.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. /*
  2. * OMAP2 and OMAP3 clockdomain control
  3. *
  4. * Copyright (C) 2008-2010 Texas Instruments, Inc.
  5. * Copyright (C) 2008-2010 Nokia Corporation
  6. *
  7. * Derived from mach-omap2/clockdomain.c written by Paul Walmsley
  8. * Rajendra Nayak <rnayak@ti.com>
  9. *
  10. * This program is free software; you can redistribute it and/or modify
  11. * it under the terms of the GNU General Public License version 2 as
  12. * published by the Free Software Foundation.
  13. */
  14. #include <linux/types.h>
  15. #include <plat/prcm.h>
  16. #include "prm.h"
  17. #include "prm2xxx_3xxx.h"
  18. #include "cm.h"
  19. #include "cm2xxx_3xxx.h"
  20. #include "cm-regbits-24xx.h"
  21. #include "cm-regbits-34xx.h"
  22. #include "clockdomain.h"
  23. static int omap2_clkdm_add_wkdep(struct clockdomain *clkdm1,
  24. struct clockdomain *clkdm2)
  25. {
  26. omap2_prm_set_mod_reg_bits((1 << clkdm2->dep_bit),
  27. clkdm1->pwrdm.ptr->prcm_offs, PM_WKDEP);
  28. return 0;
  29. }
  30. static int omap2_clkdm_del_wkdep(struct clockdomain *clkdm1,
  31. struct clockdomain *clkdm2)
  32. {
  33. omap2_prm_clear_mod_reg_bits((1 << clkdm2->dep_bit),
  34. clkdm1->pwrdm.ptr->prcm_offs, PM_WKDEP);
  35. return 0;
  36. }
  37. static int omap2_clkdm_read_wkdep(struct clockdomain *clkdm1,
  38. struct clockdomain *clkdm2)
  39. {
  40. return omap2_prm_read_mod_bits_shift(clkdm1->pwrdm.ptr->prcm_offs,
  41. PM_WKDEP, (1 << clkdm2->dep_bit));
  42. }
  43. static int omap2_clkdm_clear_all_wkdeps(struct clockdomain *clkdm)
  44. {
  45. struct clkdm_dep *cd;
  46. u32 mask = 0;
  47. for (cd = clkdm->wkdep_srcs; cd && cd->clkdm_name; cd++) {
  48. if (!omap_chip_is(cd->omap_chip))
  49. continue;
  50. if (!cd->clkdm)
  51. continue; /* only happens if data is erroneous */
  52. /* PRM accesses are slow, so minimize them */
  53. mask |= 1 << cd->clkdm->dep_bit;
  54. atomic_set(&cd->wkdep_usecount, 0);
  55. }
  56. omap2_prm_clear_mod_reg_bits(mask, clkdm->pwrdm.ptr->prcm_offs,
  57. PM_WKDEP);
  58. return 0;
  59. }
  60. static int omap3_clkdm_add_sleepdep(struct clockdomain *clkdm1,
  61. struct clockdomain *clkdm2)
  62. {
  63. omap2_cm_set_mod_reg_bits((1 << clkdm2->dep_bit),
  64. clkdm1->pwrdm.ptr->prcm_offs,
  65. OMAP3430_CM_SLEEPDEP);
  66. return 0;
  67. }
  68. static int omap3_clkdm_del_sleepdep(struct clockdomain *clkdm1,
  69. struct clockdomain *clkdm2)
  70. {
  71. omap2_cm_clear_mod_reg_bits((1 << clkdm2->dep_bit),
  72. clkdm1->pwrdm.ptr->prcm_offs,
  73. OMAP3430_CM_SLEEPDEP);
  74. return 0;
  75. }
  76. static int omap3_clkdm_read_sleepdep(struct clockdomain *clkdm1,
  77. struct clockdomain *clkdm2)
  78. {
  79. return omap2_prm_read_mod_bits_shift(clkdm1->pwrdm.ptr->prcm_offs,
  80. OMAP3430_CM_SLEEPDEP, (1 << clkdm2->dep_bit));
  81. }
  82. static int omap3_clkdm_clear_all_sleepdeps(struct clockdomain *clkdm)
  83. {
  84. struct clkdm_dep *cd;
  85. u32 mask = 0;
  86. for (cd = clkdm->sleepdep_srcs; cd && cd->clkdm_name; cd++) {
  87. if (!omap_chip_is(cd->omap_chip))
  88. continue;
  89. if (!cd->clkdm)
  90. continue; /* only happens if data is erroneous */
  91. /* PRM accesses are slow, so minimize them */
  92. mask |= 1 << cd->clkdm->dep_bit;
  93. atomic_set(&cd->sleepdep_usecount, 0);
  94. }
  95. omap2_prm_clear_mod_reg_bits(mask, clkdm->pwrdm.ptr->prcm_offs,
  96. OMAP3430_CM_SLEEPDEP);
  97. return 0;
  98. }
  99. struct clkdm_ops omap2_clkdm_operations = {
  100. .clkdm_add_wkdep = omap2_clkdm_add_wkdep,
  101. .clkdm_del_wkdep = omap2_clkdm_del_wkdep,
  102. .clkdm_read_wkdep = omap2_clkdm_read_wkdep,
  103. .clkdm_clear_all_wkdeps = omap2_clkdm_clear_all_wkdeps,
  104. };
  105. struct clkdm_ops omap3_clkdm_operations = {
  106. .clkdm_add_wkdep = omap2_clkdm_add_wkdep,
  107. .clkdm_del_wkdep = omap2_clkdm_del_wkdep,
  108. .clkdm_read_wkdep = omap2_clkdm_read_wkdep,
  109. .clkdm_clear_all_wkdeps = omap2_clkdm_clear_all_wkdeps,
  110. .clkdm_add_sleepdep = omap3_clkdm_add_sleepdep,
  111. .clkdm_del_sleepdep = omap3_clkdm_del_sleepdep,
  112. .clkdm_read_sleepdep = omap3_clkdm_read_sleepdep,
  113. .clkdm_clear_all_sleepdeps = omap3_clkdm_clear_all_sleepdeps,
  114. };