adma.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * platform device definitions for the iop3xx dma/xor engines
  4. * Copyright © 2006, Intel Corporation.
  5. */
  6. #include <linux/platform_device.h>
  7. #include <linux/dma-mapping.h>
  8. #include <linux/platform_data/dma-iop32x.h>
  9. #include "iop3xx.h"
  10. #include "irqs.h"
  11. #define IRQ_DMA0_EOT IRQ_IOP32X_DMA0_EOT
  12. #define IRQ_DMA0_EOC IRQ_IOP32X_DMA0_EOC
  13. #define IRQ_DMA0_ERR IRQ_IOP32X_DMA0_ERR
  14. #define IRQ_DMA1_EOT IRQ_IOP32X_DMA1_EOT
  15. #define IRQ_DMA1_EOC IRQ_IOP32X_DMA1_EOC
  16. #define IRQ_DMA1_ERR IRQ_IOP32X_DMA1_ERR
  17. #define IRQ_AA_EOT IRQ_IOP32X_AA_EOT
  18. #define IRQ_AA_EOC IRQ_IOP32X_AA_EOC
  19. #define IRQ_AA_ERR IRQ_IOP32X_AA_ERR
  20. /* AAU and DMA Channels */
  21. static struct resource iop3xx_dma_0_resources[] = {
  22. [0] = {
  23. .start = IOP3XX_DMA_PHYS_BASE(0),
  24. .end = IOP3XX_DMA_UPPER_PA(0),
  25. .flags = IORESOURCE_MEM,
  26. },
  27. [1] = {
  28. .start = IRQ_DMA0_EOT,
  29. .end = IRQ_DMA0_EOT,
  30. .flags = IORESOURCE_IRQ
  31. },
  32. [2] = {
  33. .start = IRQ_DMA0_EOC,
  34. .end = IRQ_DMA0_EOC,
  35. .flags = IORESOURCE_IRQ
  36. },
  37. [3] = {
  38. .start = IRQ_DMA0_ERR,
  39. .end = IRQ_DMA0_ERR,
  40. .flags = IORESOURCE_IRQ
  41. }
  42. };
  43. static struct resource iop3xx_dma_1_resources[] = {
  44. [0] = {
  45. .start = IOP3XX_DMA_PHYS_BASE(1),
  46. .end = IOP3XX_DMA_UPPER_PA(1),
  47. .flags = IORESOURCE_MEM,
  48. },
  49. [1] = {
  50. .start = IRQ_DMA1_EOT,
  51. .end = IRQ_DMA1_EOT,
  52. .flags = IORESOURCE_IRQ
  53. },
  54. [2] = {
  55. .start = IRQ_DMA1_EOC,
  56. .end = IRQ_DMA1_EOC,
  57. .flags = IORESOURCE_IRQ
  58. },
  59. [3] = {
  60. .start = IRQ_DMA1_ERR,
  61. .end = IRQ_DMA1_ERR,
  62. .flags = IORESOURCE_IRQ
  63. }
  64. };
  65. static struct resource iop3xx_aau_resources[] = {
  66. [0] = {
  67. .start = IOP3XX_AAU_PHYS_BASE,
  68. .end = IOP3XX_AAU_UPPER_PA,
  69. .flags = IORESOURCE_MEM,
  70. },
  71. [1] = {
  72. .start = IRQ_AA_EOT,
  73. .end = IRQ_AA_EOT,
  74. .flags = IORESOURCE_IRQ
  75. },
  76. [2] = {
  77. .start = IRQ_AA_EOC,
  78. .end = IRQ_AA_EOC,
  79. .flags = IORESOURCE_IRQ
  80. },
  81. [3] = {
  82. .start = IRQ_AA_ERR,
  83. .end = IRQ_AA_ERR,
  84. .flags = IORESOURCE_IRQ
  85. }
  86. };
  87. static u64 iop3xx_adma_dmamask = DMA_BIT_MASK(32);
  88. static struct iop_adma_platform_data iop3xx_dma_0_data = {
  89. .hw_id = DMA0_ID,
  90. .pool_size = PAGE_SIZE,
  91. };
  92. static struct iop_adma_platform_data iop3xx_dma_1_data = {
  93. .hw_id = DMA1_ID,
  94. .pool_size = PAGE_SIZE,
  95. };
  96. static struct iop_adma_platform_data iop3xx_aau_data = {
  97. .hw_id = AAU_ID,
  98. .pool_size = 3 * PAGE_SIZE,
  99. };
  100. struct platform_device iop3xx_dma_0_channel = {
  101. .name = "iop-adma",
  102. .id = 0,
  103. .num_resources = 4,
  104. .resource = iop3xx_dma_0_resources,
  105. .dev = {
  106. .dma_mask = &iop3xx_adma_dmamask,
  107. .coherent_dma_mask = DMA_BIT_MASK(32),
  108. .platform_data = (void *) &iop3xx_dma_0_data,
  109. },
  110. };
  111. struct platform_device iop3xx_dma_1_channel = {
  112. .name = "iop-adma",
  113. .id = 1,
  114. .num_resources = 4,
  115. .resource = iop3xx_dma_1_resources,
  116. .dev = {
  117. .dma_mask = &iop3xx_adma_dmamask,
  118. .coherent_dma_mask = DMA_BIT_MASK(32),
  119. .platform_data = (void *) &iop3xx_dma_1_data,
  120. },
  121. };
  122. struct platform_device iop3xx_aau_channel = {
  123. .name = "iop-adma",
  124. .id = 2,
  125. .num_resources = 4,
  126. .resource = iop3xx_aau_resources,
  127. .dev = {
  128. .dma_mask = &iop3xx_adma_dmamask,
  129. .coherent_dma_mask = DMA_BIT_MASK(32),
  130. .platform_data = (void *) &iop3xx_aau_data,
  131. },
  132. };
  133. static int __init iop3xx_adma_cap_init(void)
  134. {
  135. dma_cap_set(DMA_MEMCPY, iop3xx_dma_0_data.cap_mask);
  136. dma_cap_set(DMA_INTERRUPT, iop3xx_dma_0_data.cap_mask);
  137. dma_cap_set(DMA_MEMCPY, iop3xx_dma_1_data.cap_mask);
  138. dma_cap_set(DMA_INTERRUPT, iop3xx_dma_1_data.cap_mask);
  139. dma_cap_set(DMA_XOR, iop3xx_aau_data.cap_mask);
  140. dma_cap_set(DMA_INTERRUPT, iop3xx_aau_data.cap_mask);
  141. return 0;
  142. }
  143. arch_initcall(iop3xx_adma_cap_init);