dev-sysmmu.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. /* linux/arch/arm/mach-exynos4/dev-sysmmu.c
  2. *
  3. * Copyright (c) 2010 Samsung Electronics Co., Ltd.
  4. * http://www.samsung.com
  5. *
  6. * EXYNOS4 - System MMU support
  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/platform_device.h>
  13. #include <linux/dma-mapping.h>
  14. #include <linux/export.h>
  15. #include <mach/map.h>
  16. #include <mach/irqs.h>
  17. #include <mach/sysmmu.h>
  18. #include <plat/s5p-clock.h>
  19. /* These names must be equal to the clock names in mach-exynos4/clock.c */
  20. const char *sysmmu_ips_name[EXYNOS4_SYSMMU_TOTAL_IPNUM] = {
  21. "SYSMMU_MDMA" ,
  22. "SYSMMU_SSS" ,
  23. "SYSMMU_FIMC0" ,
  24. "SYSMMU_FIMC1" ,
  25. "SYSMMU_FIMC2" ,
  26. "SYSMMU_FIMC3" ,
  27. "SYSMMU_JPEG" ,
  28. "SYSMMU_FIMD0" ,
  29. "SYSMMU_FIMD1" ,
  30. "SYSMMU_PCIe" ,
  31. "SYSMMU_G2D" ,
  32. "SYSMMU_ROTATOR",
  33. "SYSMMU_MDMA2" ,
  34. "SYSMMU_TV" ,
  35. "SYSMMU_MFC_L" ,
  36. "SYSMMU_MFC_R" ,
  37. };
  38. static struct resource exynos4_sysmmu_resource[] = {
  39. [0] = {
  40. .start = EXYNOS4_PA_SYSMMU_MDMA,
  41. .end = EXYNOS4_PA_SYSMMU_MDMA + SZ_64K - 1,
  42. .flags = IORESOURCE_MEM,
  43. },
  44. [1] = {
  45. .start = IRQ_SYSMMU_MDMA0_0,
  46. .end = IRQ_SYSMMU_MDMA0_0,
  47. .flags = IORESOURCE_IRQ,
  48. },
  49. [2] = {
  50. .start = EXYNOS4_PA_SYSMMU_SSS,
  51. .end = EXYNOS4_PA_SYSMMU_SSS + SZ_64K - 1,
  52. .flags = IORESOURCE_MEM,
  53. },
  54. [3] = {
  55. .start = IRQ_SYSMMU_SSS_0,
  56. .end = IRQ_SYSMMU_SSS_0,
  57. .flags = IORESOURCE_IRQ,
  58. },
  59. [4] = {
  60. .start = EXYNOS4_PA_SYSMMU_FIMC0,
  61. .end = EXYNOS4_PA_SYSMMU_FIMC0 + SZ_64K - 1,
  62. .flags = IORESOURCE_MEM,
  63. },
  64. [5] = {
  65. .start = IRQ_SYSMMU_FIMC0_0,
  66. .end = IRQ_SYSMMU_FIMC0_0,
  67. .flags = IORESOURCE_IRQ,
  68. },
  69. [6] = {
  70. .start = EXYNOS4_PA_SYSMMU_FIMC1,
  71. .end = EXYNOS4_PA_SYSMMU_FIMC1 + SZ_64K - 1,
  72. .flags = IORESOURCE_MEM,
  73. },
  74. [7] = {
  75. .start = IRQ_SYSMMU_FIMC1_0,
  76. .end = IRQ_SYSMMU_FIMC1_0,
  77. .flags = IORESOURCE_IRQ,
  78. },
  79. [8] = {
  80. .start = EXYNOS4_PA_SYSMMU_FIMC2,
  81. .end = EXYNOS4_PA_SYSMMU_FIMC2 + SZ_64K - 1,
  82. .flags = IORESOURCE_MEM,
  83. },
  84. [9] = {
  85. .start = IRQ_SYSMMU_FIMC2_0,
  86. .end = IRQ_SYSMMU_FIMC2_0,
  87. .flags = IORESOURCE_IRQ,
  88. },
  89. [10] = {
  90. .start = EXYNOS4_PA_SYSMMU_FIMC3,
  91. .end = EXYNOS4_PA_SYSMMU_FIMC3 + SZ_64K - 1,
  92. .flags = IORESOURCE_MEM,
  93. },
  94. [11] = {
  95. .start = IRQ_SYSMMU_FIMC3_0,
  96. .end = IRQ_SYSMMU_FIMC3_0,
  97. .flags = IORESOURCE_IRQ,
  98. },
  99. [12] = {
  100. .start = EXYNOS4_PA_SYSMMU_JPEG,
  101. .end = EXYNOS4_PA_SYSMMU_JPEG + SZ_64K - 1,
  102. .flags = IORESOURCE_MEM,
  103. },
  104. [13] = {
  105. .start = IRQ_SYSMMU_JPEG_0,
  106. .end = IRQ_SYSMMU_JPEG_0,
  107. .flags = IORESOURCE_IRQ,
  108. },
  109. [14] = {
  110. .start = EXYNOS4_PA_SYSMMU_FIMD0,
  111. .end = EXYNOS4_PA_SYSMMU_FIMD0 + SZ_64K - 1,
  112. .flags = IORESOURCE_MEM,
  113. },
  114. [15] = {
  115. .start = IRQ_SYSMMU_LCD0_M0_0,
  116. .end = IRQ_SYSMMU_LCD0_M0_0,
  117. .flags = IORESOURCE_IRQ,
  118. },
  119. [16] = {
  120. .start = EXYNOS4_PA_SYSMMU_FIMD1,
  121. .end = EXYNOS4_PA_SYSMMU_FIMD1 + SZ_64K - 1,
  122. .flags = IORESOURCE_MEM,
  123. },
  124. [17] = {
  125. .start = IRQ_SYSMMU_LCD1_M1_0,
  126. .end = IRQ_SYSMMU_LCD1_M1_0,
  127. .flags = IORESOURCE_IRQ,
  128. },
  129. [18] = {
  130. .start = EXYNOS4_PA_SYSMMU_PCIe,
  131. .end = EXYNOS4_PA_SYSMMU_PCIe + SZ_64K - 1,
  132. .flags = IORESOURCE_MEM,
  133. },
  134. [19] = {
  135. .start = IRQ_SYSMMU_PCIE_0,
  136. .end = IRQ_SYSMMU_PCIE_0,
  137. .flags = IORESOURCE_IRQ,
  138. },
  139. [20] = {
  140. .start = EXYNOS4_PA_SYSMMU_G2D,
  141. .end = EXYNOS4_PA_SYSMMU_G2D + SZ_64K - 1,
  142. .flags = IORESOURCE_MEM,
  143. },
  144. [21] = {
  145. .start = IRQ_SYSMMU_2D_0,
  146. .end = IRQ_SYSMMU_2D_0,
  147. .flags = IORESOURCE_IRQ,
  148. },
  149. [22] = {
  150. .start = EXYNOS4_PA_SYSMMU_ROTATOR,
  151. .end = EXYNOS4_PA_SYSMMU_ROTATOR + SZ_64K - 1,
  152. .flags = IORESOURCE_MEM,
  153. },
  154. [23] = {
  155. .start = IRQ_SYSMMU_ROTATOR_0,
  156. .end = IRQ_SYSMMU_ROTATOR_0,
  157. .flags = IORESOURCE_IRQ,
  158. },
  159. [24] = {
  160. .start = EXYNOS4_PA_SYSMMU_MDMA2,
  161. .end = EXYNOS4_PA_SYSMMU_MDMA2 + SZ_64K - 1,
  162. .flags = IORESOURCE_MEM,
  163. },
  164. [25] = {
  165. .start = IRQ_SYSMMU_MDMA1_0,
  166. .end = IRQ_SYSMMU_MDMA1_0,
  167. .flags = IORESOURCE_IRQ,
  168. },
  169. [26] = {
  170. .start = EXYNOS4_PA_SYSMMU_TV,
  171. .end = EXYNOS4_PA_SYSMMU_TV + SZ_64K - 1,
  172. .flags = IORESOURCE_MEM,
  173. },
  174. [27] = {
  175. .start = IRQ_SYSMMU_TV_M0_0,
  176. .end = IRQ_SYSMMU_TV_M0_0,
  177. .flags = IORESOURCE_IRQ,
  178. },
  179. [28] = {
  180. .start = EXYNOS4_PA_SYSMMU_MFC_L,
  181. .end = EXYNOS4_PA_SYSMMU_MFC_L + SZ_64K - 1,
  182. .flags = IORESOURCE_MEM,
  183. },
  184. [29] = {
  185. .start = IRQ_SYSMMU_MFC_M0_0,
  186. .end = IRQ_SYSMMU_MFC_M0_0,
  187. .flags = IORESOURCE_IRQ,
  188. },
  189. [30] = {
  190. .start = EXYNOS4_PA_SYSMMU_MFC_R,
  191. .end = EXYNOS4_PA_SYSMMU_MFC_R + SZ_64K - 1,
  192. .flags = IORESOURCE_MEM,
  193. },
  194. [31] = {
  195. .start = IRQ_SYSMMU_MFC_M1_0,
  196. .end = IRQ_SYSMMU_MFC_M1_0,
  197. .flags = IORESOURCE_IRQ,
  198. },
  199. };
  200. struct platform_device exynos4_device_sysmmu = {
  201. .name = "s5p-sysmmu",
  202. .id = 32,
  203. .num_resources = ARRAY_SIZE(exynos4_sysmmu_resource),
  204. .resource = exynos4_sysmmu_resource,
  205. };
  206. EXPORT_SYMBOL(exynos4_device_sysmmu);
  207. static struct clk *sysmmu_clk[S5P_SYSMMU_TOTAL_IPNUM];
  208. void sysmmu_clk_init(struct device *dev, sysmmu_ips ips)
  209. {
  210. sysmmu_clk[ips] = clk_get(dev, sysmmu_ips_name[ips]);
  211. if (IS_ERR(sysmmu_clk[ips]))
  212. sysmmu_clk[ips] = NULL;
  213. else
  214. clk_put(sysmmu_clk[ips]);
  215. }
  216. void sysmmu_clk_enable(sysmmu_ips ips)
  217. {
  218. if (sysmmu_clk[ips])
  219. clk_enable(sysmmu_clk[ips]);
  220. }
  221. void sysmmu_clk_disable(sysmmu_ips ips)
  222. {
  223. if (sysmmu_clk[ips])
  224. clk_disable(sysmmu_clk[ips]);
  225. }