change source file mode to 0644 instead of 0755
[profile/mobile/platform/kernel/u-boot-tm1.git] / arch / arm / include / asm / arch-sc8825 / dma_drv_internal.h
1 /******************************************************************************
2  ** File Name:    dma_drv_internal.h                                          *
3  ** Author:       Guofu.Huang                                                 *
4  ** DATE:         2010-2-28                                                   *
5  ** Copyright:    2010 Spreatrum, Incoporated. All Rights Reserved.           *
6  ** Description:  dma driver infterface specfication                          *
7  **               Note:In DMA7, data blcok in DMA9 was named busrt,           *
8  **               Here we all used block.*
9  **               any advice, please fell free to contact me.                 *
10  ******************************************************************************/
11 /******************************************************************************
12  **                   Edit    History                                         *
13  **---------------------------------------------------------------------------*
14  ** DATE          NAME            DESCRIPTION                                 *
15  ** 2010-2-9      Guofu.Huang     Created, Rewrite dma driver                 *
16  ******************************************************************************/
17 #ifndef _DMA_DRV_INTERNAL_H_
18 #define _DMA_DRV_INTERNAL_H_
19 /*----------------------------------------------------------------------------*
20  **                         Dependencies                                      *
21  **-------------------------------------------------------------------------- */
22 /**---------------------------------------------------------------------------*
23  **                             Compiler Flag                                 *
24  **---------------------------------------------------------------------------*/
25 #ifdef   __cplusplus
26 extern   "C"
27 {
28 #endif
29 /**----------------------------------------------------------------------------*
30 **                               Micro Define                                 **
31 **----------------------------------------------------------------------------*/
32 #define DMA_CHANNELID_MAX                   (DMA_CH_NUM-1)//0 - 31
33 #define DMA_CHANNELID_INVALID               (0xFFFFFFFF)
34 #define DMA_LINKLIST_HANDLE_INVALID         (0xFFFFFFFF)
35 #define DMA_UID_SOFT                        (0)
36 #define DMA_UID_MAX                         (32)
37
38 #define DMA_LIST_SIZE_MAX (64)//max length used in both linklist and soflist mode
39
40 //---------------------------------------------------------------------------
41 // INT type macros
42 //
43 //int status BIT: 3bits value
44 #define DMA_INT_BIT_BLOCK  0   // bit 0
45 #define DMA_INT_BIT_TRANS  1   // bit 1
46 #define DMA_INT_BIT_LIST   2   // bit 2
47
48 #define DMA_CHN_INT_TYPE_NONE               0
49 #define DMA_CHN_INT_TYPE_BLOCKDONE          (1<<DMA_INT_BIT_BLOCK)
50 #define DMA_CHN_INT_TYPE_TRANSDONE          (1<<DMA_INT_BIT_TRANS)
51 #define DMA_CHN_INT_TYPE_LISTDONE           (1<<DMA_INT_BIT_LIST)
52
53 /**----------------------------------------------------------------------------*
54 **                             Data Prototype                                 **
55 **----------------------------------------------------------------------------*/
56 //int status type: 3bits value
57 //DMA_CHN_INT_TYPE_BLOCKDONE | DMA_CHN_INT_TYPE_TRANSDONE | DMA_CHN_INT_TYPE_LISTDONE
58 typedef void (*DMA_HAL_ISR_HANDLER) (uint32 inttype);
59
60 typedef uint32 DMA_LINKLIST_HANDLE;
61
62 //DMA priority
63 typedef enum _DMA_CHN_PRIORITY
64 {
65     DMA_CHN_PRIORITY_0  = 0, // LOWEST PRI
66     DMA_CHN_PRIORITY_1,
67     DMA_CHN_PRIORITY_2,
68     DMA_CHN_PRIORITY_3,      // HIGHIST
69     DMA_CHN_PRIORITY_MAX
70 } DMA_CHN_PRIORITY_E;
71
72 //endian type
73 typedef enum _DMA_ENDIANTYPE
74 {
75     DMA_ENDIANTYPE_BIG = 0,
76     DMA_ENDIANTYPE_LITTLE,
77     DMA_ENDIANTYPE_MAX
78 } DMA_ENDIANTYPE_E;
79
80 //endian switch mode
81 typedef enum _DMA_ENDIANSWITCHMODE
82 {
83     DMA_ENDIANSWITCHMODE_UN = 0,
84     DMA_ENDIANSWITCHMODE_FULL,
85     DMA_ENDIANSWITCHMODE_MODE0,
86     DMA_ENDIANSWITCHMODE_MODE1,
87     DMA_ENDIANSWITCHMODE_MAX
88 } DMA_ENDIANSWITCHMODE_E;
89
90 //data width
91 typedef enum _DMA_DATAWIDTH
92 {
93     DMA_DATAWIDTH_BYTE = 0,
94     DMA_DATAWIDTH_HALFWORD,
95     DMA_DATAWIDTH_WORD,
96     DMA_DATAWIDTH_MAX
97 } DMA_DATAWIDTH_E;
98
99 //work mode
100 typedef enum _DMA_CHN_WORKMODE
101 {
102     DMA_CHN_WORKMODE_NORMAL = 0,
103     DMA_CHN_WORKMODE_LINKLIST,
104     DMA_CHN_WORKMODE_SOFTLIST,
105     DMA_CHN_WORKMODE_MAX
106 } DMA_CHN_WORKMODE_E;
107
108 //request mode
109 typedef enum _DMA_CHN_REQMODE
110 {
111     DMA_CHN_REQMODE_NORMAL = 0,
112     DMA_CHN_REQMODE_TRASACTION,
113     DMA_CHN_REQMODE_LIST,
114     DMA_CHN_REQMODE_INFINITE,
115     DMA_CHN_REQMODE_MAX
116 } DMA_CHN_REQMODE_E;
117
118 //burst mode
119 typedef enum _DMA_BLOCKMODE
120 {
121     DMA_BLOCKMODE_SINGLETRANS  = 0,
122     DMA_BLOCKMODE_INCR,
123     DMA_BLOCKMODE_INCR4,
124     DMA_BLOCKMODE_INCR8,
125     DMA_BLOCKMODE_INCR16,
126     DMA_BLOCKMODE_MAX
127 } DMA_BLOCKMODE_E;
128
129 //dma channel config struct
130 typedef struct _DMA_ChnCfg_Struct
131 {
132     // normal config param, these param maybe used in most scence
133     DMA_CHN_TYPE_E          type;              /* hardware or software         */
134     DMA_CHN_PRIORITY_E      priority;          /* dma channel priority         */
135     DMA_CHN_WORKMODE_E      workmode;          /* normal/linklist/soflist      */
136     DMA_DATAWIDTH_E         src_datawidth;     /* source data width            */
137     DMA_DATAWIDTH_E         dest_datawidth;    /* dest data width              */
138     uint32                  src_address;       /* src start address            */
139     uint32                  dest_address;      /* des start address            */
140     DMA_CHN_REQMODE_E       requestmode;       /* request mode                 */
141     uint16                  block_length;      /* block length                 */
142     uint32                  total_length;      /* total length                 */
143     int32                   src_step;          /* SrcElementPost-modification  */
144     int32                   dest_step;         /* DestElementPost-modification */
145     DMA_BLOCKMODE_E         src_blockmode;     /* INCR4,8m16                   */
146     DMA_BLOCKMODE_E         dest_blockmode;    /* INCR4,8m16                   */
147     int32                   src_blockstep ;    /* SrcBlockPost-modification    */
148     int32                   dest_blockstep;    /* SrcBlockPost-modification    */
149     BOOLEAN                 is_srcwrapen;      /* src wrap enable              */
150     BOOLEAN                 is_destwrapen;     /* dst wrap enable              */
151     uint32                  wrapstart_addr;    /* wrap start addr              */
152     uint32                  wrapend_addr;      /* wrap end addr                */
153     BOOLEAN                 is_ll_end;         /* linklist end flag            */
154     uint32                  ll_next;           /* point to next link list node */
155     DMA_ENDIANSWITCHMODE_E  endian_switchmode; /* endian switch mode           */
156     BOOLEAN                 is_noautoclose;    /* no auto close                */
157     DMA_ENDIANTYPE_E        endian_type;       /* endian selection             */
158     //uint8                   uid;               /* dma channel uid  0-31        */
159
160 } DMA_CHNCFG_T, *DMA_CHNCFG_PTR;
161
162 //DMA error type
163 typedef enum _DMA_ERR_TYPE_E
164 {
165     DMA_ERR_TYPE_NONE = 0,
166     DMA_ERR_TYPE_INVALID_CHNID,
167     DMA_ERR_TYPE_INVALID_PARAM,
168     DMA_ERR_TYPE_CHNTYPE_MISMATCHED,
169     DMA_ERR_TYPE_NOT_AVAILABLE,
170     DMA_ERR_TYPE_LIST_OVERRUN,
171     DMA_ERR_TYPE_LIST_NODATA,
172     DMA_ERR_TYPE_LIST_APPENDFAIL,
173     DMA_ERR_TYPE_MAX
174 } DMA_ERR_TYPE_E;
175
176
177 /**----------------------------------------------------------------------------*
178 **                         Public Function Prototype                          **
179 **----------------------------------------------------------------------------*/
180
181 /*****************************************************************************/
182 //  Description:    dma driver init
183 //  Global resource dependence:
184 //  Author:         Guofu.Huang
185 //  Note:
186 //  Return Value:   if success return DMA_ERR_TYPE_NONE
187 /*****************************************************************************/
188 PUBLIC void DMA_HAL_Init (void);
189
190 /*****************************************************************************/
191 //  Description:    set dma pause
192 //  Global resource dependence:
193 //  Author:         Guofu.Huang
194 //  Note:           s_pause:SCI_TRUE,pause dma; SCI_FALSE,resume dma
195 //  Return Value:   if success return DMA_ERR_TYPE_NONE
196 /*****************************************************************************/
197 PUBLIC void DMA_HAL_SetPause (BOOLEAN is_pause);
198
199 /*****************************************************************************/
200 //  Description:    alloc soft dma channel
201 //  Global resource dependence:
202 //  Author:         Guofu.Huang
203 //  Note:           if success return channel id, otherwise return DMA_CHANNELID_INVALID
204 /*****************************************************************************/
205 PUBLIC uint32 DMA_HAL_AllocSoftChn (void);
206
207 /*****************************************************************************/
208 //  Description:    release channel
209 //  Global resource dependence:
210 //  Author:         Guofu.Huang
211 //  Note:
212 //  Return Value:   if success return DMA_ERR_TYPE_NONE
213 /*****************************************************************************/
214 PUBLIC void DMA_HAL_FreeSoftChn (uint32 channel);
215
216 /*****************************************************************************/
217 //  Description:    configure a dma channel
218 //  Global resource dependence:
219 //  Author:         Guofu.Huang
220 //  Note:           channel:channel to be configured
221 //                  chncfgstruct:channel configure struct
222 //  Return Value:   if success return DMA_ERR_TYPE_NONE
223 /*****************************************************************************/
224 PUBLIC void DMA_HAL_ChnConfig (uint32 channel, DMA_CHNCFG_PTR chnparam);
225
226 /*****************************************************************************/
227 //  Description:    set dma priority
228 //  Global resource dependence:
229 //  Author:         Guofu.Huang
230 //  Note:           channel:dma channel number,0-31
231 //                  priority:channel priority,0-3
232 //  Return Value:   if success return DMA_ERR_TYPE_NONE
233 /*****************************************************************************/
234 PUBLIC void DMA_HAL_SetChnPriority (uint32 channel,DMA_CHN_PRIORITY_E priority);
235
236 /*****************************************************************************/
237 //  Description:    dma request enable/disable
238 //  Global resource dependence:
239 //  Author:         Guofu.Huang
240 //  Note:           channel :  channel No
241 //                  is_enable: enable/disable
242 //  Return Value:   if success return DMA_ERR_TYPE_NONE
243 /*****************************************************************************/
244 PUBLIC void DMA_HAL_ChnEnable (uint32 channel, BOOLEAN is_enable);
245
246 /*****************************************************************************/
247 //  Description:    get dma channel transdone interrupt raw status
248 //  Global resource dependence:
249 //  Author:         Guofu.Huang
250 //  Note:           channel:dma channel number,0-31
251 //  Return value:   return SCI_TRUE if the channel transfer finished,
252 /*****************************************************************************/
253 PUBLIC BOOLEAN DMA_HAL_PollingTransDone (uint32 channel);
254
255 /*****************************************************************************/
256 //  Description:    get dma channel blockdone interrupt raw status
257 //  Global resource dependence:
258 //  Author:         Guofu.Huang
259 //  Note:           channel:dma channel number,0-31
260 //  Return value:   return SCI_TRUE if the channel transfer finished,
261 /*****************************************************************************/
262 PUBLIC BOOLEAN DMA_HAL_PollingBlockDone (uint32 channel);
263
264 /*****************************************************************************/
265 //  Description:    get dma channel listdone interrupt raw status
266 //  Global resource dependence:
267 //  Author:         Guofu.Huang
268 //  Note:           channel:dma channel number,0-31
269 //  Return value:   return SCI_TRUE if the channel transfer finished,
270 /*****************************************************************************/
271 PUBLIC BOOLEAN DMA_HAL_PollingListDone (uint32 channel);
272
273 /*****************************************************************************/
274 //  Description:    configure dma channel interrupt
275 //  Global resource dependence:
276 //  Author:         Guofu.Huang
277 //  Note:           channel:dma channel number,0-31
278 //                  inttype:interrupt type,including all transfer done,burst done and link done.
279 //                  is_enable:SCI_TRUE,enable the interrupt, SCI_FALSE,disable the interrupt
280 //                  callback:interrupt service,if is_enable=SCI_FALSE, it is unuseful.
281 //  Return Value:   if success return DMA_ERR_TYPE_NONE
282 /*****************************************************************************/
283 PUBLIC void DMA_HAL_ChnIntConfig (uint32 channel, uint32 inttype, DMA_HAL_ISR_HANDLER callback);
284
285 /*****************************************************************************/
286 //  Description:    init a link transfer
287 //  Global resource dependence:
288 //  Author:         Guofu.Huang
289 //  Note:           channel:dma channel id
290 //  Return value:   if success return link list handle, otherwise return  DMA_LINKLIST_HANDLE_INVALID
291 /*****************************************************************************/
292 PUBLIC DMA_LINKLIST_HANDLE DMA_HAL_InitLinkList (uint32 channel);
293
294 /*****************************************************************************/
295 //  Description:    append a link element
296 //  Global resource dependence:
297 //  Author:         Guofu.Huang
298 //  Note:           linklisthandle:link list handle
299 //                  linklistelement:element to append
300 //  Return Value:   if success return DMA_ERR_TYPE_NONE
301 /*****************************************************************************/
302 PUBLIC DMA_ERR_TYPE_E DMA_HAL_AppendInitLinkList (DMA_LINKLIST_HANDLE linklisthandle,
303         DMA_CHNCFG_PTR param);
304
305 /*****************************************************************************/
306 //  Description:    submit a link list and start transfer
307 //  Global resource dependence:
308 //  Author:         Guofu.Huang
309 //  Note:           linklisthandle: link list handle
310 //                  is_int_used:polling or interrupt,if SCI_TRUE, intterrupt used
311 //                  callback: if interrupt used,callback need
312 //  Return Value:   if success return DMA_ERR_TYPE_NONE
313 /*****************************************************************************/
314 PUBLIC DMA_ERR_TYPE_E DMA_HAL_SubmitInitLinkList (DMA_LINKLIST_HANDLE linklisthandle);
315
316 /*****************************************************************************/
317 //  Description:    free link list
318 //  Global resource dependence:
319 //  Author:         Guofu.Huang
320 //  Note:           linklisthandle:link list to release
321 /*****************************************************************************/
322 PUBLIC void DMA_HAL_FreeLinkList (DMA_LINKLIST_HANDLE linklisthandle);
323
324 /*****************************************************************************/
325 // Description :    This function is used to enable or disable dma pause function.
326 //  Global resource dependence : s_dma_pause_disable_cnt
327 //  Author :
328 //  Note : is_enable :   TURE: enable dma pause function; FALSE: disable dma pause function
329 /*****************************************************************************/
330 PUBLIC void DMA_HAL_EnableDMAPause (BOOLEAN is_enable);
331
332 /*****************************************************************************/
333 // Description :    This function is used to get the function status of dma pause
334 // Global resource dependence : s_dma_pause_disable_cnt
335 // Author :
336 // Note : TURE: dma pause function is enabled; FALSE: dma pause function is disabled
337 /*****************************************************************************/
338 PUBLIC BOOLEAN DMA_HAL_IsEnableDMAPause (void);
339
340 /*****************************************************************************/
341 // Description :    This function is used to get the dma pause status
342 // Global resource dependence : s_is_dma_pause
343 // Author :
344 // Note : TURE: dma pause function is enabled; FALSE: dma pause function is disabled
345 /*****************************************************************************/
346 PUBLIC BOOLEAN DMA_HAL_IsDMAPause (void);
347 //
348 /**----------------------------------------------------------------------------*
349 **                         Compiler Flag                                      **
350 **----------------------------------------------------------------------------*/
351 #ifdef   __cplusplus
352 }
353 #endif
354 /**---------------------------------------------------------------------------*/
355 #endif //_DMA_DRV_INTERNAL_H_
356 // End of File
357