dma.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:4k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * linux/include/asm-arm/arch-sa1100/dma.h
  3.  *
  4.  * Generic SA1100 DMA support
  5.  *
  6.  * Copyright (C) 2000 Nicolas Pitre
  7.  *
  8.  */
  9. #ifndef __ASM_ARCH_DMA_H
  10. #define __ASM_ARCH_DMA_H
  11. #include <linux/config.h>
  12. #include "hardware.h"
  13. /*
  14.  * This is the maximum DMA address that can be DMAd to.
  15.  */
  16. #define MAX_DMA_ADDRESS 0xffffffff
  17. /*
  18.  * The regular generic DMA interface is inappropriate for the
  19.  * SA1100 DMA model.  None of the SA1100 specific drivers using
  20.  * DMA are portable anyway so it's pointless to try to twist the
  21.  * regular DMA API to accommodate them.
  22.  */
  23. #define MAX_DMA_CHANNELS 0
  24. /*
  25.  * The SA1100 has six internal DMA channels.
  26.  */
  27. #define SA1100_DMA_CHANNELS     6
  28. /*
  29.  * The SA-1111 SAC has two DMA channels.
  30.  */
  31. #define SA1111_SAC_DMA_CHANNELS 2
  32. #define SA1111_SAC_XMT_CHANNEL  0
  33. #define SA1111_SAC_RCV_CHANNEL  1
  34. /*
  35.  * The SA-1111 SAC channels will reside in the same index space as
  36.  * the built-in SA-1100 channels, and will take on the next available
  37.  * identifiers after the 1100.
  38.  */
  39. #define SA1111_SAC_DMA_BASE     SA1100_DMA_CHANNELS
  40. #ifdef CONFIG_SA1111
  41. # define MAX_SA1100_DMA_CHANNELS (SA1100_DMA_CHANNELS + SA1111_SAC_DMA_CHANNELS)
  42. #else
  43. # define MAX_SA1100_DMA_CHANNELS SA1100_DMA_CHANNELS
  44. #endif
  45. /*
  46.  * All possible SA1100 devices a DMA channel can be attached to.
  47.  */
  48. typedef enum {
  49. DMA_Ser0UDCWr  = DDAR_Ser0UDCWr,   /* Ser. port 0 UDC Write */
  50. DMA_Ser0UDCRd  = DDAR_Ser0UDCRd,   /* Ser. port 0 UDC Read */
  51. DMA_Ser1UARTWr = DDAR_Ser1UARTWr,  /* Ser. port 1 UART Write */
  52. DMA_Ser1UARTRd = DDAR_Ser1UARTRd,  /* Ser. port 1 UART Read */
  53. DMA_Ser1SDLCWr = DDAR_Ser1SDLCWr,  /* Ser. port 1 SDLC Write */
  54. DMA_Ser1SDLCRd = DDAR_Ser1SDLCRd,  /* Ser. port 1 SDLC Read */
  55. DMA_Ser2UARTWr = DDAR_Ser2UARTWr,  /* Ser. port 2 UART Write */
  56. DMA_Ser2UARTRd = DDAR_Ser2UARTRd,  /* Ser. port 2 UART Read */
  57. DMA_Ser2HSSPWr = DDAR_Ser2HSSPWr,  /* Ser. port 2 HSSP Write */
  58. DMA_Ser2HSSPRd = DDAR_Ser2HSSPRd,  /* Ser. port 2 HSSP Read */
  59. DMA_Ser3UARTWr = DDAR_Ser3UARTWr,  /* Ser. port 3 UART Write */
  60. DMA_Ser3UARTRd = DDAR_Ser3UARTRd,  /* Ser. port 3 UART Read */
  61. DMA_Ser4MCP0Wr = DDAR_Ser4MCP0Wr,  /* Ser. port 4 MCP 0 Write (audio) */
  62. DMA_Ser4MCP0Rd = DDAR_Ser4MCP0Rd,  /* Ser. port 4 MCP 0 Read (audio) */
  63. DMA_Ser4MCP1Wr = DDAR_Ser4MCP1Wr,  /* Ser. port 4 MCP 1 Write */
  64. DMA_Ser4MCP1Rd = DDAR_Ser4MCP1Rd,  /* Ser. port 4 MCP 1 Read */
  65. DMA_Ser4SSPWr  = DDAR_Ser4SSPWr,   /* Ser. port 4 SSP Write (16 bits) */
  66. DMA_Ser4SSPRd  = DDAR_Ser4SSPRd    /* Ser. port 4 SSP Read (16 bits) */
  67. } dma_device_t;
  68. typedef void (*dma_callback_t)( void *buf_id, int size );
  69. /* SA1100 DMA API */
  70. extern int sa1100_request_dma( dmach_t *channel, const char *device_id,
  71.        dma_device_t device );
  72. extern int sa1100_dma_set_callback( dmach_t channel, dma_callback_t cb );
  73. extern int sa1100_dma_set_spin( dmach_t channel, dma_addr_t addr, int size );
  74. extern int sa1100_dma_queue_buffer( dmach_t channel, void *buf_id,
  75.     dma_addr_t data, int size );
  76. extern int sa1100_dma_get_current( dmach_t channel, void **buf_id, dma_addr_t *addr );
  77. extern int sa1100_dma_stop( dmach_t channel );
  78. extern int sa1100_dma_resume( dmach_t channel );
  79. extern int sa1100_dma_flush_all( dmach_t channel );
  80. extern void sa1100_free_dma( dmach_t channel );
  81. extern int sa1100_dma_sleep( dmach_t channel );
  82. extern int sa1100_dma_wakeup( dmach_t channel );
  83. /* Sa1111 DMA interface (all but registration uses the above) */
  84. extern int sa1111_sac_request_dma( dmach_t *channel, const char *device_id,
  85.    unsigned int direction );
  86. extern int sa1111_check_dma_bug( dma_addr_t addr );
  87. #ifdef CONFIG_SA1111
  88. static inline void
  89. __arch_adjust_zones(int node, unsigned long *size, unsigned long *holes)
  90. {
  91. unsigned int sz = 256;
  92. if (node != 0)
  93. sz = 0;
  94. size[1] = size[0] - sz;
  95. size[0] = sz;
  96. }
  97. #define arch_adjust_zones(node,size,holes) __arch_adjust_zones(node,size,holes)
  98. #endif
  99. #endif /* _ASM_ARCH_DMA_H */