dma.h 3.8 KB

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