dma.h 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. /*
  2. * arch/arm/mach-pnx4008/include/mach/dma.h
  3. *
  4. * PNX4008 DMA header file
  5. *
  6. * Author: Vitaly Wool
  7. * Copyright: MontaVista Software Inc. (c) 2005
  8. *
  9. * This program is free software; you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License version 2 as
  11. * published by the Free Software Foundation.
  12. */
  13. #ifndef __ASM_ARCH_DMA_H
  14. #define __ASM_ARCH_DMA_H
  15. #include "platform.h"
  16. #define MAX_DMA_ADDRESS 0xffffffff
  17. #define MAX_DMA_CHANNELS 8
  18. #define DMAC_BASE IO_ADDRESS(PNX4008_DMA_CONFIG_BASE)
  19. #define DMAC_INT_STAT (DMAC_BASE + 0x0000)
  20. #define DMAC_INT_TC_STAT (DMAC_BASE + 0x0004)
  21. #define DMAC_INT_TC_CLEAR (DMAC_BASE + 0x0008)
  22. #define DMAC_INT_ERR_STAT (DMAC_BASE + 0x000c)
  23. #define DMAC_INT_ERR_CLEAR (DMAC_BASE + 0x0010)
  24. #define DMAC_SOFT_SREQ (DMAC_BASE + 0x0024)
  25. #define DMAC_CONFIG (DMAC_BASE + 0x0030)
  26. #define DMAC_Cx_SRC_ADDR(c) (DMAC_BASE + 0x0100 + (c) * 0x20)
  27. #define DMAC_Cx_DEST_ADDR(c) (DMAC_BASE + 0x0104 + (c) * 0x20)
  28. #define DMAC_Cx_LLI(c) (DMAC_BASE + 0x0108 + (c) * 0x20)
  29. #define DMAC_Cx_CONTROL(c) (DMAC_BASE + 0x010c + (c) * 0x20)
  30. #define DMAC_Cx_CONFIG(c) (DMAC_BASE + 0x0110 + (c) * 0x20)
  31. enum {
  32. WIDTH_BYTE = 0,
  33. WIDTH_HWORD,
  34. WIDTH_WORD
  35. };
  36. enum {
  37. FC_MEM2MEM_DMA,
  38. FC_MEM2PER_DMA,
  39. FC_PER2MEM_DMA,
  40. FC_PER2PER_DMA,
  41. FC_PER2PER_DPER,
  42. FC_MEM2PER_PER,
  43. FC_PER2MEM_PER,
  44. FC_PER2PER_SPER
  45. };
  46. enum {
  47. DMA_INT_UNKNOWN = 0,
  48. DMA_ERR_INT = 1,
  49. DMA_TC_INT = 2,
  50. };
  51. enum {
  52. DMA_BUFFER_ALLOCATED = 1,
  53. DMA_HAS_LL = 2,
  54. };
  55. enum {
  56. PER_CAM_DMA_1 = 0,
  57. PER_NDF_FLASH = 1,
  58. PER_MBX_SLAVE_FIFO = 2,
  59. PER_SPI2_REC_XMIT = 3,
  60. PER_MS_SD_RX_XMIT = 4,
  61. PER_HS_UART_1_XMIT = 5,
  62. PER_HS_UART_1_RX = 6,
  63. PER_HS_UART_2_XMIT = 7,
  64. PER_HS_UART_2_RX = 8,
  65. PER_HS_UART_7_XMIT = 9,
  66. PER_HS_UART_7_RX = 10,
  67. PER_SPI1_REC_XMIT = 11,
  68. PER_MLC_NDF_SREC = 12,
  69. PER_CAM_DMA_2 = 13,
  70. PER_PRNG_INFIFO = 14,
  71. PER_PRNG_OUTFIFO = 15,
  72. };
  73. struct pnx4008_dma_ch_ctrl {
  74. int tc_mask;
  75. int cacheable;
  76. int bufferable;
  77. int priv_mode;
  78. int di;
  79. int si;
  80. int dest_ahb1;
  81. int src_ahb1;
  82. int dwidth;
  83. int swidth;
  84. int dbsize;
  85. int sbsize;
  86. int tr_size;
  87. };
  88. struct pnx4008_dma_ch_config {
  89. int halt;
  90. int active;
  91. int lock;
  92. int itc;
  93. int ie;
  94. int flow_cntrl;
  95. int dest_per;
  96. int src_per;
  97. };
  98. struct pnx4008_dma_ll {
  99. unsigned long src_addr;
  100. unsigned long dest_addr;
  101. u32 next_dma;
  102. unsigned long ch_ctrl;
  103. struct pnx4008_dma_ll *next;
  104. int flags;
  105. void *alloc_data;
  106. int (*free) (void *);
  107. };
  108. struct pnx4008_dma_config {
  109. int is_ll;
  110. unsigned long src_addr;
  111. unsigned long dest_addr;
  112. unsigned long ch_ctrl;
  113. unsigned long ch_cfg;
  114. struct pnx4008_dma_ll *ll;
  115. u32 ll_dma;
  116. int flags;
  117. void *alloc_data;
  118. int (*free) (void *);
  119. };
  120. extern struct pnx4008_dma_ll *pnx4008_alloc_ll_entry(dma_addr_t *);
  121. extern void pnx4008_free_ll_entry(struct pnx4008_dma_ll *, dma_addr_t);
  122. extern void pnx4008_free_ll(u32 ll_dma, struct pnx4008_dma_ll *);
  123. extern int pnx4008_request_channel(char *, int,
  124. void (*)(int, int, void *),
  125. void *);
  126. extern void pnx4008_free_channel(int);
  127. extern int pnx4008_config_dma(int, int, int);
  128. extern int pnx4008_dma_pack_control(const struct pnx4008_dma_ch_ctrl *,
  129. unsigned long *);
  130. extern int pnx4008_dma_parse_control(unsigned long,
  131. struct pnx4008_dma_ch_ctrl *);
  132. extern int pnx4008_dma_pack_config(const struct pnx4008_dma_ch_config *,
  133. unsigned long *);
  134. extern int pnx4008_dma_parse_config(unsigned long,
  135. struct pnx4008_dma_ch_config *);
  136. extern int pnx4008_config_channel(int, struct pnx4008_dma_config *);
  137. extern int pnx4008_channel_get_config(int, struct pnx4008_dma_config *);
  138. extern int pnx4008_dma_ch_enable(int);
  139. extern int pnx4008_dma_ch_disable(int);
  140. extern int pnx4008_dma_ch_enabled(int);
  141. extern void pnx4008_dma_split_head_entry(struct pnx4008_dma_config *,
  142. struct pnx4008_dma_ch_ctrl *);
  143. extern void pnx4008_dma_split_ll_entry(struct pnx4008_dma_ll *,
  144. struct pnx4008_dma_ch_ctrl *);
  145. #endif /* _ASM_ARCH_DMA_H */