dma.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. /* Wrapper for DMA channel allocator that starts clocks etc */
  2. #include <linux/kernel.h>
  3. #include <linux/spinlock.h>
  4. #include <asm/dma.h>
  5. #include <hwregs/reg_map.h>
  6. #include <hwregs/reg_rdwr.h>
  7. #include <hwregs/marb_defs.h>
  8. #include <hwregs/config_defs.h>
  9. #include <hwregs/strmux_defs.h>
  10. #include <linux/errno.h>
  11. #include <asm/system.h>
  12. #include <mach/arbiter.h>
  13. static char used_dma_channels[MAX_DMA_CHANNELS];
  14. static const char *used_dma_channels_users[MAX_DMA_CHANNELS];
  15. static DEFINE_SPINLOCK(dma_lock);
  16. int crisv32_request_dma(unsigned int dmanr, const char *device_id,
  17. unsigned options, unsigned int bandwidth,
  18. enum dma_owner owner)
  19. {
  20. unsigned long flags;
  21. reg_config_rw_clk_ctrl clk_ctrl;
  22. reg_strmux_rw_cfg strmux_cfg;
  23. if (crisv32_arbiter_allocate_bandwidth(dmanr,
  24. options & DMA_INT_MEM ?
  25. INT_REGION : EXT_REGION,
  26. bandwidth))
  27. return -ENOMEM;
  28. spin_lock_irqsave(&dma_lock, flags);
  29. if (used_dma_channels[dmanr]) {
  30. spin_unlock_irqrestore(&dma_lock, flags);
  31. if (options & DMA_VERBOSE_ON_ERROR) {
  32. printk(KERN_ERR "Failed to request DMA %i for %s, "
  33. "already allocated by %s\n",
  34. dmanr,
  35. device_id,
  36. used_dma_channels_users[dmanr]);
  37. }
  38. if (options & DMA_PANIC_ON_ERROR)
  39. panic("request_dma error!");
  40. spin_unlock_irqrestore(&dma_lock, flags);
  41. return -EBUSY;
  42. }
  43. clk_ctrl = REG_RD(config, regi_config, rw_clk_ctrl);
  44. strmux_cfg = REG_RD(strmux, regi_strmux, rw_cfg);
  45. switch (dmanr) {
  46. case 0:
  47. case 1:
  48. clk_ctrl.dma01_eth0 = 1;
  49. break;
  50. case 2:
  51. case 3:
  52. clk_ctrl.dma23 = 1;
  53. break;
  54. case 4:
  55. case 5:
  56. clk_ctrl.dma45 = 1;
  57. break;
  58. case 6:
  59. case 7:
  60. clk_ctrl.dma67 = 1;
  61. break;
  62. case 8:
  63. case 9:
  64. clk_ctrl.dma89_strcop = 1;
  65. break;
  66. #if MAX_DMA_CHANNELS-1 != 9
  67. #error Check dma.c
  68. #endif
  69. default:
  70. spin_unlock_irqrestore(&dma_lock, flags);
  71. if (options & DMA_VERBOSE_ON_ERROR) {
  72. printk(KERN_ERR "Failed to request DMA %i for %s, "
  73. "only 0-%i valid)\n",
  74. dmanr, device_id, MAX_DMA_CHANNELS - 1);
  75. }
  76. if (options & DMA_PANIC_ON_ERROR)
  77. panic("request_dma error!");
  78. return -EINVAL;
  79. }
  80. switch (owner) {
  81. case dma_eth0:
  82. if (dmanr == 0)
  83. strmux_cfg.dma0 = regk_strmux_eth0;
  84. else if (dmanr == 1)
  85. strmux_cfg.dma1 = regk_strmux_eth0;
  86. else
  87. panic("Invalid DMA channel for eth0\n");
  88. break;
  89. case dma_eth1:
  90. if (dmanr == 6)
  91. strmux_cfg.dma6 = regk_strmux_eth1;
  92. else if (dmanr == 7)
  93. strmux_cfg.dma7 = regk_strmux_eth1;
  94. else
  95. panic("Invalid DMA channel for eth1\n");
  96. break;
  97. case dma_iop0:
  98. if (dmanr == 2)
  99. strmux_cfg.dma2 = regk_strmux_iop0;
  100. else if (dmanr == 3)
  101. strmux_cfg.dma3 = regk_strmux_iop0;
  102. else
  103. panic("Invalid DMA channel for iop0\n");
  104. break;
  105. case dma_iop1:
  106. if (dmanr == 4)
  107. strmux_cfg.dma4 = regk_strmux_iop1;
  108. else if (dmanr == 5)
  109. strmux_cfg.dma5 = regk_strmux_iop1;
  110. else
  111. panic("Invalid DMA channel for iop1\n");
  112. break;
  113. case dma_ser0:
  114. if (dmanr == 6)
  115. strmux_cfg.dma6 = regk_strmux_ser0;
  116. else if (dmanr == 7)
  117. strmux_cfg.dma7 = regk_strmux_ser0;
  118. else
  119. panic("Invalid DMA channel for ser0\n");
  120. break;
  121. case dma_ser1:
  122. if (dmanr == 4)
  123. strmux_cfg.dma4 = regk_strmux_ser1;
  124. else if (dmanr == 5)
  125. strmux_cfg.dma5 = regk_strmux_ser1;
  126. else
  127. panic("Invalid DMA channel for ser1\n");
  128. break;
  129. case dma_ser2:
  130. if (dmanr == 2)
  131. strmux_cfg.dma2 = regk_strmux_ser2;
  132. else if (dmanr == 3)
  133. strmux_cfg.dma3 = regk_strmux_ser2;
  134. else
  135. panic("Invalid DMA channel for ser2\n");
  136. break;
  137. case dma_ser3:
  138. if (dmanr == 8)
  139. strmux_cfg.dma8 = regk_strmux_ser3;
  140. else if (dmanr == 9)
  141. strmux_cfg.dma9 = regk_strmux_ser3;
  142. else
  143. panic("Invalid DMA channel for ser3\n");
  144. break;
  145. case dma_sser0:
  146. if (dmanr == 4)
  147. strmux_cfg.dma4 = regk_strmux_sser0;
  148. else if (dmanr == 5)
  149. strmux_cfg.dma5 = regk_strmux_sser0;
  150. else
  151. panic("Invalid DMA channel for sser0\n");
  152. break;
  153. case dma_sser1:
  154. if (dmanr == 6)
  155. strmux_cfg.dma6 = regk_strmux_sser1;
  156. else if (dmanr == 7)
  157. strmux_cfg.dma7 = regk_strmux_sser1;
  158. else
  159. panic("Invalid DMA channel for sser1\n");
  160. break;
  161. case dma_ata:
  162. if (dmanr == 2)
  163. strmux_cfg.dma2 = regk_strmux_ata;
  164. else if (dmanr == 3)
  165. strmux_cfg.dma3 = regk_strmux_ata;
  166. else
  167. panic("Invalid DMA channel for ata\n");
  168. break;
  169. case dma_strp:
  170. if (dmanr == 8)
  171. strmux_cfg.dma8 = regk_strmux_strcop;
  172. else if (dmanr == 9)
  173. strmux_cfg.dma9 = regk_strmux_strcop;
  174. else
  175. panic("Invalid DMA channel for strp\n");
  176. break;
  177. case dma_ext0:
  178. if (dmanr == 6)
  179. strmux_cfg.dma6 = regk_strmux_ext0;
  180. else
  181. panic("Invalid DMA channel for ext0\n");
  182. break;
  183. case dma_ext1:
  184. if (dmanr == 7)
  185. strmux_cfg.dma7 = regk_strmux_ext1;
  186. else
  187. panic("Invalid DMA channel for ext1\n");
  188. break;
  189. case dma_ext2:
  190. if (dmanr == 2)
  191. strmux_cfg.dma2 = regk_strmux_ext2;
  192. else if (dmanr == 8)
  193. strmux_cfg.dma8 = regk_strmux_ext2;
  194. else
  195. panic("Invalid DMA channel for ext2\n");
  196. break;
  197. case dma_ext3:
  198. if (dmanr == 3)
  199. strmux_cfg.dma3 = regk_strmux_ext3;
  200. else if (dmanr == 9)
  201. strmux_cfg.dma9 = regk_strmux_ext2;
  202. else
  203. panic("Invalid DMA channel for ext2\n");
  204. break;
  205. }
  206. used_dma_channels[dmanr] = 1;
  207. used_dma_channels_users[dmanr] = device_id;
  208. REG_WR(config, regi_config, rw_clk_ctrl, clk_ctrl);
  209. REG_WR(strmux, regi_strmux, rw_cfg, strmux_cfg);
  210. spin_unlock_irqrestore(&dma_lock, flags);
  211. return 0;
  212. }
  213. void crisv32_free_dma(unsigned int dmanr)
  214. {
  215. spin_lock(&dma_lock);
  216. used_dma_channels[dmanr] = 0;
  217. spin_unlock(&dma_lock);
  218. }