io.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. /* arch/arm/mach-msm/io.c
  2. *
  3. * MSM7K, QSD io support
  4. *
  5. * Copyright (C) 2007 Google, Inc.
  6. * Copyright (c) 2008-2011, Code Aurora Forum. All rights reserved.
  7. * Author: Brian Swetland <swetland@google.com>
  8. *
  9. * This software is licensed under the terms of the GNU General Public
  10. * License version 2, as published by the Free Software Foundation, and
  11. * may be copied, distributed, and modified under those terms.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. */
  19. #include <linux/kernel.h>
  20. #include <linux/init.h>
  21. #include <linux/io.h>
  22. #include <linux/export.h>
  23. #include <mach/hardware.h>
  24. #include <asm/page.h>
  25. #include <mach/msm_iomap.h>
  26. #include <asm/mach/map.h>
  27. #include <mach/board.h>
  28. #define MSM_CHIP_DEVICE(name, chip) { \
  29. .virtual = (unsigned long) MSM_##name##_BASE, \
  30. .pfn = __phys_to_pfn(chip##_##name##_PHYS), \
  31. .length = chip##_##name##_SIZE, \
  32. .type = MT_DEVICE_NONSHARED, \
  33. }
  34. #define MSM_DEVICE(name) MSM_CHIP_DEVICE(name, MSM)
  35. #if defined(CONFIG_ARCH_MSM7X00A) || defined(CONFIG_ARCH_MSM7X27) \
  36. || defined(CONFIG_ARCH_MSM7X25)
  37. static struct map_desc msm_io_desc[] __initdata = {
  38. MSM_DEVICE(VIC),
  39. MSM_CHIP_DEVICE(CSR, MSM7X00),
  40. MSM_DEVICE(DMOV),
  41. MSM_CHIP_DEVICE(GPIO1, MSM7X00),
  42. MSM_CHIP_DEVICE(GPIO2, MSM7X00),
  43. MSM_DEVICE(CLK_CTL),
  44. #if defined(CONFIG_DEBUG_MSM_UART1) || defined(CONFIG_DEBUG_MSM_UART2) || \
  45. defined(CONFIG_DEBUG_MSM_UART3)
  46. MSM_DEVICE(DEBUG_UART),
  47. #endif
  48. #ifdef CONFIG_ARCH_MSM7X30
  49. MSM_DEVICE(GCC),
  50. #endif
  51. {
  52. .virtual = (unsigned long) MSM_SHARED_RAM_BASE,
  53. .pfn = __phys_to_pfn(MSM_SHARED_RAM_PHYS),
  54. .length = MSM_SHARED_RAM_SIZE,
  55. .type = MT_DEVICE,
  56. },
  57. };
  58. void __init msm_map_common_io(void)
  59. {
  60. /* Make sure the peripheral register window is closed, since
  61. * we will use PTE flags (TEX[1]=1,B=0,C=1) to determine which
  62. * pages are peripheral interface or not.
  63. */
  64. asm("mcr p15, 0, %0, c15, c2, 4" : : "r" (0));
  65. iotable_init(msm_io_desc, ARRAY_SIZE(msm_io_desc));
  66. }
  67. #endif
  68. #ifdef CONFIG_ARCH_QSD8X50
  69. static struct map_desc qsd8x50_io_desc[] __initdata = {
  70. MSM_DEVICE(VIC),
  71. MSM_CHIP_DEVICE(CSR, QSD8X50),
  72. MSM_DEVICE(DMOV),
  73. MSM_CHIP_DEVICE(GPIO1, QSD8X50),
  74. MSM_CHIP_DEVICE(GPIO2, QSD8X50),
  75. MSM_DEVICE(CLK_CTL),
  76. MSM_DEVICE(SIRC),
  77. MSM_DEVICE(SCPLL),
  78. MSM_DEVICE(AD5),
  79. MSM_DEVICE(MDC),
  80. #if defined(CONFIG_DEBUG_MSM_UART1) || defined(CONFIG_DEBUG_MSM_UART2) || \
  81. defined(CONFIG_DEBUG_MSM_UART3)
  82. MSM_DEVICE(DEBUG_UART),
  83. #endif
  84. {
  85. .virtual = (unsigned long) MSM_SHARED_RAM_BASE,
  86. .pfn = __phys_to_pfn(MSM_SHARED_RAM_PHYS),
  87. .length = MSM_SHARED_RAM_SIZE,
  88. .type = MT_DEVICE,
  89. },
  90. };
  91. void __init msm_map_qsd8x50_io(void)
  92. {
  93. iotable_init(qsd8x50_io_desc, ARRAY_SIZE(qsd8x50_io_desc));
  94. }
  95. #endif /* CONFIG_ARCH_QSD8X50 */
  96. #ifdef CONFIG_ARCH_MSM8X60
  97. static struct map_desc msm8x60_io_desc[] __initdata = {
  98. MSM_CHIP_DEVICE(QGIC_DIST, MSM8X60),
  99. MSM_CHIP_DEVICE(QGIC_CPU, MSM8X60),
  100. MSM_CHIP_DEVICE(TMR, MSM8X60),
  101. MSM_CHIP_DEVICE(TMR0, MSM8X60),
  102. MSM_DEVICE(ACC),
  103. MSM_DEVICE(GCC),
  104. #ifdef CONFIG_DEBUG_MSM8660_UART
  105. MSM_DEVICE(DEBUG_UART),
  106. #endif
  107. };
  108. void __init msm_map_msm8x60_io(void)
  109. {
  110. iotable_init(msm8x60_io_desc, ARRAY_SIZE(msm8x60_io_desc));
  111. }
  112. #endif /* CONFIG_ARCH_MSM8X60 */
  113. #ifdef CONFIG_ARCH_MSM8960
  114. static struct map_desc msm8960_io_desc[] __initdata = {
  115. MSM_CHIP_DEVICE(QGIC_DIST, MSM8960),
  116. MSM_CHIP_DEVICE(QGIC_CPU, MSM8960),
  117. MSM_CHIP_DEVICE(TMR, MSM8960),
  118. MSM_CHIP_DEVICE(TMR0, MSM8960),
  119. #ifdef CONFIG_DEBUG_MSM8960_UART
  120. MSM_DEVICE(DEBUG_UART),
  121. #endif
  122. };
  123. void __init msm_map_msm8960_io(void)
  124. {
  125. iotable_init(msm8960_io_desc, ARRAY_SIZE(msm8960_io_desc));
  126. }
  127. #endif /* CONFIG_ARCH_MSM8960 */
  128. #ifdef CONFIG_ARCH_MSM7X30
  129. static struct map_desc msm7x30_io_desc[] __initdata = {
  130. MSM_DEVICE(VIC),
  131. MSM_CHIP_DEVICE(CSR, MSM7X30),
  132. MSM_DEVICE(DMOV),
  133. MSM_CHIP_DEVICE(GPIO1, MSM7X30),
  134. MSM_CHIP_DEVICE(GPIO2, MSM7X30),
  135. MSM_DEVICE(CLK_CTL),
  136. MSM_DEVICE(CLK_CTL_SH2),
  137. MSM_DEVICE(AD5),
  138. MSM_DEVICE(MDC),
  139. MSM_DEVICE(ACC),
  140. MSM_DEVICE(SAW),
  141. MSM_DEVICE(GCC),
  142. MSM_DEVICE(TCSR),
  143. #if defined(CONFIG_DEBUG_MSM_UART1) || defined(CONFIG_DEBUG_MSM_UART2) || \
  144. defined(CONFIG_DEBUG_MSM_UART3)
  145. MSM_DEVICE(DEBUG_UART),
  146. #endif
  147. {
  148. .virtual = (unsigned long) MSM_SHARED_RAM_BASE,
  149. .pfn = __phys_to_pfn(MSM_SHARED_RAM_PHYS),
  150. .length = MSM_SHARED_RAM_SIZE,
  151. .type = MT_DEVICE,
  152. },
  153. };
  154. void __init msm_map_msm7x30_io(void)
  155. {
  156. iotable_init(msm7x30_io_desc, ARRAY_SIZE(msm7x30_io_desc));
  157. }
  158. #endif /* CONFIG_ARCH_MSM7X30 */
  159. void __iomem *__msm_ioremap_caller(unsigned long phys_addr, size_t size,
  160. unsigned int mtype, void *caller)
  161. {
  162. if (mtype == MT_DEVICE) {
  163. /* The peripherals in the 88000000 - D0000000 range
  164. * are only accessible by type MT_DEVICE_NONSHARED.
  165. * Adjust mtype as necessary to make this "just work."
  166. */
  167. if ((phys_addr >= 0x88000000) && (phys_addr < 0xD0000000))
  168. mtype = MT_DEVICE_NONSHARED;
  169. }
  170. return __arm_ioremap_caller(phys_addr, size, mtype, caller);
  171. }