io.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. /*
  2. * Common io.c file
  3. * This file is created by Russell King <rmk+kernel@arm.linux.org.uk>
  4. *
  5. * Copyright (C) 2009 Texas Instruments
  6. * Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.com>
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License version 2 as
  10. * published by the Free Software Foundation.
  11. */
  12. #include <linux/module.h>
  13. #include <linux/io.h>
  14. #include <linux/mm.h>
  15. #include <plat/omap7xx.h>
  16. #include <plat/omap1510.h>
  17. #include <plat/omap16xx.h>
  18. #include <plat/omap24xx.h>
  19. #include <plat/omap34xx.h>
  20. #include <plat/omap44xx.h>
  21. #define BETWEEN(p,st,sz) ((p) >= (st) && (p) < ((st) + (sz)))
  22. #define XLATE(p,pst,vst) ((void __iomem *)((p) - (pst) + (vst)))
  23. /*
  24. * Intercept ioremap() requests for addresses in our fixed mapping regions.
  25. */
  26. void __iomem *omap_ioremap(unsigned long p, size_t size, unsigned int type)
  27. {
  28. #ifdef CONFIG_ARCH_OMAP1
  29. if (cpu_class_is_omap1()) {
  30. if (BETWEEN(p, OMAP1_IO_PHYS, OMAP1_IO_SIZE))
  31. return XLATE(p, OMAP1_IO_PHYS, OMAP1_IO_VIRT);
  32. }
  33. if (cpu_is_omap7xx()) {
  34. if (BETWEEN(p, OMAP7XX_DSP_BASE, OMAP7XX_DSP_SIZE))
  35. return XLATE(p, OMAP7XX_DSP_BASE, OMAP7XX_DSP_START);
  36. if (BETWEEN(p, OMAP7XX_DSPREG_BASE, OMAP7XX_DSPREG_SIZE))
  37. return XLATE(p, OMAP7XX_DSPREG_BASE,
  38. OMAP7XX_DSPREG_START);
  39. }
  40. if (cpu_is_omap15xx()) {
  41. if (BETWEEN(p, OMAP1510_DSP_BASE, OMAP1510_DSP_SIZE))
  42. return XLATE(p, OMAP1510_DSP_BASE, OMAP1510_DSP_START);
  43. if (BETWEEN(p, OMAP1510_DSPREG_BASE, OMAP1510_DSPREG_SIZE))
  44. return XLATE(p, OMAP1510_DSPREG_BASE,
  45. OMAP1510_DSPREG_START);
  46. }
  47. if (cpu_is_omap16xx()) {
  48. if (BETWEEN(p, OMAP16XX_DSP_BASE, OMAP16XX_DSP_SIZE))
  49. return XLATE(p, OMAP16XX_DSP_BASE, OMAP16XX_DSP_START);
  50. if (BETWEEN(p, OMAP16XX_DSPREG_BASE, OMAP16XX_DSPREG_SIZE))
  51. return XLATE(p, OMAP16XX_DSPREG_BASE,
  52. OMAP16XX_DSPREG_START);
  53. }
  54. #endif
  55. #ifdef CONFIG_ARCH_OMAP2
  56. if (cpu_is_omap24xx()) {
  57. if (BETWEEN(p, L3_24XX_PHYS, L3_24XX_SIZE))
  58. return XLATE(p, L3_24XX_PHYS, L3_24XX_VIRT);
  59. if (BETWEEN(p, L4_24XX_PHYS, L4_24XX_SIZE))
  60. return XLATE(p, L4_24XX_PHYS, L4_24XX_VIRT);
  61. }
  62. if (cpu_is_omap2420()) {
  63. if (BETWEEN(p, DSP_MEM_2420_PHYS, DSP_MEM_2420_SIZE))
  64. return XLATE(p, DSP_MEM_2420_PHYS, DSP_MEM_2420_VIRT);
  65. if (BETWEEN(p, DSP_IPI_2420_PHYS, DSP_IPI_2420_SIZE))
  66. return XLATE(p, DSP_IPI_2420_PHYS, DSP_IPI_2420_SIZE);
  67. if (BETWEEN(p, DSP_MMU_2420_PHYS, DSP_MMU_2420_SIZE))
  68. return XLATE(p, DSP_MMU_2420_PHYS, DSP_MMU_2420_VIRT);
  69. }
  70. if (cpu_is_omap2430()) {
  71. if (BETWEEN(p, L4_WK_243X_PHYS, L4_WK_243X_SIZE))
  72. return XLATE(p, L4_WK_243X_PHYS, L4_WK_243X_VIRT);
  73. if (BETWEEN(p, OMAP243X_GPMC_PHYS, OMAP243X_GPMC_SIZE))
  74. return XLATE(p, OMAP243X_GPMC_PHYS, OMAP243X_GPMC_VIRT);
  75. if (BETWEEN(p, OMAP243X_SDRC_PHYS, OMAP243X_SDRC_SIZE))
  76. return XLATE(p, OMAP243X_SDRC_PHYS, OMAP243X_SDRC_VIRT);
  77. if (BETWEEN(p, OMAP243X_SMS_PHYS, OMAP243X_SMS_SIZE))
  78. return XLATE(p, OMAP243X_SMS_PHYS, OMAP243X_SMS_VIRT);
  79. }
  80. #endif
  81. #ifdef CONFIG_ARCH_OMAP3
  82. if (cpu_is_omap34xx()) {
  83. if (BETWEEN(p, L3_34XX_PHYS, L3_34XX_SIZE))
  84. return XLATE(p, L3_34XX_PHYS, L3_34XX_VIRT);
  85. if (BETWEEN(p, L4_34XX_PHYS, L4_34XX_SIZE))
  86. return XLATE(p, L4_34XX_PHYS, L4_34XX_VIRT);
  87. if (BETWEEN(p, OMAP34XX_GPMC_PHYS, OMAP34XX_GPMC_SIZE))
  88. return XLATE(p, OMAP34XX_GPMC_PHYS, OMAP34XX_GPMC_VIRT);
  89. if (BETWEEN(p, OMAP343X_SMS_PHYS, OMAP343X_SMS_SIZE))
  90. return XLATE(p, OMAP343X_SMS_PHYS, OMAP343X_SMS_VIRT);
  91. if (BETWEEN(p, OMAP343X_SDRC_PHYS, OMAP343X_SDRC_SIZE))
  92. return XLATE(p, OMAP343X_SDRC_PHYS, OMAP343X_SDRC_VIRT);
  93. if (BETWEEN(p, L4_PER_34XX_PHYS, L4_PER_34XX_SIZE))
  94. return XLATE(p, L4_PER_34XX_PHYS, L4_PER_34XX_VIRT);
  95. if (BETWEEN(p, L4_EMU_34XX_PHYS, L4_EMU_34XX_SIZE))
  96. return XLATE(p, L4_EMU_34XX_PHYS, L4_EMU_34XX_VIRT);
  97. }
  98. #endif
  99. #ifdef CONFIG_ARCH_OMAP4
  100. if (cpu_is_omap44xx()) {
  101. if (BETWEEN(p, L3_44XX_PHYS, L3_44XX_SIZE))
  102. return XLATE(p, L3_44XX_PHYS, L3_44XX_VIRT);
  103. if (BETWEEN(p, L4_44XX_PHYS, L4_44XX_SIZE))
  104. return XLATE(p, L4_44XX_PHYS, L4_44XX_VIRT);
  105. if (BETWEEN(p, OMAP44XX_GPMC_PHYS, OMAP44XX_GPMC_SIZE))
  106. return XLATE(p, OMAP44XX_GPMC_PHYS, OMAP44XX_GPMC_VIRT);
  107. if (BETWEEN(p, OMAP44XX_EMIF1_PHYS, OMAP44XX_EMIF1_SIZE))
  108. return XLATE(p, OMAP44XX_EMIF1_PHYS, \
  109. OMAP44XX_EMIF1_VIRT);
  110. if (BETWEEN(p, OMAP44XX_EMIF2_PHYS, OMAP44XX_EMIF2_SIZE))
  111. return XLATE(p, OMAP44XX_EMIF2_PHYS, \
  112. OMAP44XX_EMIF2_VIRT);
  113. if (BETWEEN(p, OMAP44XX_DMM_PHYS, OMAP44XX_DMM_SIZE))
  114. return XLATE(p, OMAP44XX_DMM_PHYS, OMAP44XX_DMM_VIRT);
  115. if (BETWEEN(p, L4_PER_44XX_PHYS, L4_PER_44XX_SIZE))
  116. return XLATE(p, L4_PER_44XX_PHYS, L4_PER_44XX_VIRT);
  117. if (BETWEEN(p, L4_EMU_44XX_PHYS, L4_EMU_44XX_SIZE))
  118. return XLATE(p, L4_EMU_44XX_PHYS, L4_EMU_44XX_VIRT);
  119. }
  120. #endif
  121. return __arm_ioremap_caller(p, size, type, __builtin_return_address(0));
  122. }
  123. EXPORT_SYMBOL(omap_ioremap);
  124. void omap_iounmap(volatile void __iomem *addr)
  125. {
  126. unsigned long virt = (unsigned long)addr;
  127. if (virt >= VMALLOC_START && virt < VMALLOC_END)
  128. __iounmap(addr);
  129. }
  130. EXPORT_SYMBOL(omap_iounmap);
  131. /*
  132. * NOTE: Please use ioremap + __raw_read/write where possible instead of these
  133. */
  134. u8 omap_readb(u32 pa)
  135. {
  136. if (cpu_class_is_omap1())
  137. return __raw_readb(OMAP1_IO_ADDRESS(pa));
  138. else
  139. return __raw_readb(OMAP2_L4_IO_ADDRESS(pa));
  140. }
  141. EXPORT_SYMBOL(omap_readb);
  142. u16 omap_readw(u32 pa)
  143. {
  144. if (cpu_class_is_omap1())
  145. return __raw_readw(OMAP1_IO_ADDRESS(pa));
  146. else
  147. return __raw_readw(OMAP2_L4_IO_ADDRESS(pa));
  148. }
  149. EXPORT_SYMBOL(omap_readw);
  150. u32 omap_readl(u32 pa)
  151. {
  152. if (cpu_class_is_omap1())
  153. return __raw_readl(OMAP1_IO_ADDRESS(pa));
  154. else
  155. return __raw_readl(OMAP2_L4_IO_ADDRESS(pa));
  156. }
  157. EXPORT_SYMBOL(omap_readl);
  158. void omap_writeb(u8 v, u32 pa)
  159. {
  160. if (cpu_class_is_omap1())
  161. __raw_writeb(v, OMAP1_IO_ADDRESS(pa));
  162. else
  163. __raw_writeb(v, OMAP2_L4_IO_ADDRESS(pa));
  164. }
  165. EXPORT_SYMBOL(omap_writeb);
  166. void omap_writew(u16 v, u32 pa)
  167. {
  168. if (cpu_class_is_omap1())
  169. __raw_writew(v, OMAP1_IO_ADDRESS(pa));
  170. else
  171. __raw_writew(v, OMAP2_L4_IO_ADDRESS(pa));
  172. }
  173. EXPORT_SYMBOL(omap_writew);
  174. void omap_writel(u32 v, u32 pa)
  175. {
  176. if (cpu_class_is_omap1())
  177. __raw_writel(v, OMAP1_IO_ADDRESS(pa));
  178. else
  179. __raw_writel(v, OMAP2_L4_IO_ADDRESS(pa));
  180. }
  181. EXPORT_SYMBOL(omap_writel);