tizen 2.4 release
[kernel/u-boot-tm1.git] / arch / arm / include / asm / arch-sc8830 / 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 channel type
63 typedef enum _DMA_CHN_TYPE
64 {
65     DMA_CHN_TYPE_HARD = 0,
66     DMA_CHN_TYPE_SOFT,
67     DMA_CHN_TYPE_MAX
68 }
69 DMA_CHN_TYPE_E;
70
71 //DMA priority
72 typedef enum _DMA_CHN_PRIORITY
73 {
74     DMA_CHN_PRIORITY_0  = 0, // LOWEST PRI
75     DMA_CHN_PRIORITY_1,
76     DMA_CHN_PRIORITY_2,
77     DMA_CHN_PRIORITY_3,      // HIGHIST
78     DMA_CHN_PRIORITY_MAX
79 } DMA_CHN_PRIORITY_E;
80
81 //endian type
82 typedef enum _DMA_ENDIANTYPE
83 {
84     DMA_ENDIANTYPE_BIG = 0,
85     DMA_ENDIANTYPE_LITTLE,
86     DMA_ENDIANTYPE_MAX
87 } DMA_ENDIANTYPE_E;
88
89 //endian switch mode
90 typedef enum _DMA_ENDIANSWITCHMODE
91 {
92     DMA_ENDIANSWITCHMODE_UN = 0,
93     DMA_ENDIANSWITCHMODE_FULL,
94     DMA_ENDIANSWITCHMODE_MODE0,
95     DMA_ENDIANSWITCHMODE_MODE1,
96     DMA_ENDIANSWITCHMODE_MAX
97 } DMA_ENDIANSWITCHMODE_E;
98
99 //data width
100 typedef enum _DMA_DATAWIDTH
101 {
102     DMA_DATAWIDTH_BYTE = 0,
103     DMA_DATAWIDTH_HALFWORD,
104     DMA_DATAWIDTH_WORD,
105     DMA_DATAWIDTH_MAX
106 } DMA_DATAWIDTH_E;
107
108 //work mode
109 typedef enum _DMA_CHN_WORKMODE
110 {
111     DMA_CHN_WORKMODE_NORMAL = 0,
112     DMA_CHN_WORKMODE_LINKLIST,
113     DMA_CHN_WORKMODE_SOFTLIST,
114     DMA_CHN_WORKMODE_MAX
115 } DMA_CHN_WORKMODE_E;
116
117 //request mode
118 typedef enum _DMA_CHN_REQMODE
119 {
120     DMA_CHN_REQMODE_NORMAL = 0,
121     DMA_CHN_REQMODE_TRASACTION,
122     DMA_CHN_REQMODE_LIST,
123     DMA_CHN_REQMODE_INFINITE,
124     DMA_CHN_REQMODE_MAX
125 } DMA_CHN_REQMODE_E;
126
127 //burst mode
128 typedef enum _DMA_BLOCKMODE
129 {
130     DMA_BLOCKMODE_SINGLETRANS  = 0,
131     DMA_BLOCKMODE_INCR,
132     DMA_BLOCKMODE_INCR4,
133     DMA_BLOCKMODE_INCR8,
134     DMA_BLOCKMODE_INCR16,
135     DMA_BLOCKMODE_MAX
136 } DMA_BLOCKMODE_E;
137
138 //dma channel config struct
139 typedef struct _DMA_ChnCfg_Struct
140 {
141     // normal config param, these param maybe used in most scence
142     DMA_CHN_TYPE_E          type;              /* hardware or software         */
143     DMA_CHN_PRIORITY_E      priority;          /* dma channel priority         */
144     DMA_CHN_WORKMODE_E      workmode;          /* normal/linklist/soflist      */
145     DMA_DATAWIDTH_E         src_datawidth;     /* source data width            */
146     DMA_DATAWIDTH_E         dest_datawidth;    /* dest data width              */
147     uint32                  src_address;       /* src start address            */
148     uint32                  dest_address;      /* des start address            */
149     DMA_CHN_REQMODE_E       requestmode;       /* request mode                 */
150     uint16                  block_length;      /* block length                 */
151     uint32                  total_length;      /* total length                 */
152     int32                   src_step;          /* SrcElementPost-modification  */
153     int32                   dest_step;         /* DestElementPost-modification */
154     DMA_BLOCKMODE_E         src_blockmode;     /* INCR4,8m16                   */
155     DMA_BLOCKMODE_E         dest_blockmode;    /* INCR4,8m16                   */
156     int32                   src_blockstep ;    /* SrcBlockPost-modification    */
157     int32                   dest_blockstep;    /* SrcBlockPost-modification    */
158     BOOLEAN                 is_srcwrapen;      /* src wrap enable              */
159     BOOLEAN                 is_destwrapen;     /* dst wrap enable              */
160     uint32                  wrapstart_addr;    /* wrap start addr              */
161     uint32                  wrapend_addr;      /* wrap end addr                */
162     BOOLEAN                 is_ll_end;         /* linklist end flag            */
163     uint32                  ll_next;           /* point to next link list node */
164     DMA_ENDIANSWITCHMODE_E  endian_switchmode; /* endian switch mode           */
165     BOOLEAN                 is_noautoclose;    /* no auto close                */
166     DMA_ENDIANTYPE_E        endian_type;       /* endian selection             */
167     //uint8                   uid;               /* dma channel uid  0-31        */
168
169 } DMA_CHNCFG_T, *DMA_CHNCFG_PTR;
170
171 //DMA error type
172 typedef enum _DMA_ERR_TYPE_E
173 {
174     DMA_ERR_TYPE_NONE = 0,
175     DMA_ERR_TYPE_INVALID_CHNID,
176     DMA_ERR_TYPE_INVALID_PARAM,
177     DMA_ERR_TYPE_CHNTYPE_MISMATCHED,
178     DMA_ERR_TYPE_NOT_AVAILABLE,
179     DMA_ERR_TYPE_LIST_OVERRUN,
180     DMA_ERR_TYPE_LIST_NODATA,
181     DMA_ERR_TYPE_LIST_APPENDFAIL,
182     DMA_ERR_TYPE_MAX
183 } DMA_ERR_TYPE_E;
184
185
186 /**----------------------------------------------------------------------------*
187 **                         Public Function Prototype                          **
188 **----------------------------------------------------------------------------*/
189
190 /*****************************************************************************/
191 //  Description:    dma driver init
192 //  Global resource dependence:
193 //  Author:         Guofu.Huang
194 //  Note:
195 //  Return Value:   if success return DMA_ERR_TYPE_NONE
196 /*****************************************************************************/
197 PUBLIC void DMA_HAL_Init (void);
198
199 /*****************************************************************************/
200 //  Description:    set dma pause
201 //  Global resource dependence:
202 //  Author:         Guofu.Huang
203 //  Note:           s_pause:SCI_TRUE,pause dma; SCI_FALSE,resume dma
204 //  Return Value:   if success return DMA_ERR_TYPE_NONE
205 /*****************************************************************************/
206 PUBLIC void DMA_HAL_SetPause (BOOLEAN is_pause);
207
208 /*****************************************************************************/
209 //  Description:    alloc soft dma channel
210 //  Global resource dependence:
211 //  Author:         Guofu.Huang
212 //  Note:           if success return channel id, otherwise return DMA_CHANNELID_INVALID
213 /*****************************************************************************/
214 PUBLIC uint32 DMA_HAL_AllocSoftChn (void);
215
216 /*****************************************************************************/
217 //  Description:    release channel
218 //  Global resource dependence:
219 //  Author:         Guofu.Huang
220 //  Note:
221 //  Return Value:   if success return DMA_ERR_TYPE_NONE
222 /*****************************************************************************/
223 PUBLIC void DMA_HAL_FreeSoftChn (uint32 channel);
224
225 /*****************************************************************************/
226 //  Description:    configure a dma channel
227 //  Global resource dependence:
228 //  Author:         Guofu.Huang
229 //  Note:           channel:channel to be configured
230 //                  chncfgstruct:channel configure struct
231 //  Return Value:   if success return DMA_ERR_TYPE_NONE
232 /*****************************************************************************/
233 PUBLIC void DMA_HAL_ChnConfig (uint32 channel, DMA_CHNCFG_PTR chnparam);
234
235 /*****************************************************************************/
236 //  Description:    set dma priority
237 //  Global resource dependence:
238 //  Author:         Guofu.Huang
239 //  Note:           channel:dma channel number,0-31
240 //                  priority:channel priority,0-3
241 //  Return Value:   if success return DMA_ERR_TYPE_NONE
242 /*****************************************************************************/
243 PUBLIC void DMA_HAL_SetChnPriority (uint32 channel,DMA_CHN_PRIORITY_E priority);
244
245 /*****************************************************************************/
246 //  Description:    dma request enable/disable
247 //  Global resource dependence:
248 //  Author:         Guofu.Huang
249 //  Note:           channel :  channel No
250 //                  is_enable: enable/disable
251 //  Return Value:   if success return DMA_ERR_TYPE_NONE
252 /*****************************************************************************/
253 PUBLIC void DMA_HAL_ChnEnable (uint32 channel, BOOLEAN is_enable);
254
255 /*****************************************************************************/
256 //  Description:    get dma channel transdone 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_PollingTransDone (uint32 channel);
263
264 /*****************************************************************************/
265 //  Description:    get dma channel blockdone 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_PollingBlockDone (uint32 channel);
272
273 /*****************************************************************************/
274 //  Description:    get dma channel listdone interrupt raw status
275 //  Global resource dependence:
276 //  Author:         Guofu.Huang
277 //  Note:           channel:dma channel number,0-31
278 //  Return value:   return SCI_TRUE if the channel transfer finished,
279 /*****************************************************************************/
280 PUBLIC BOOLEAN DMA_HAL_PollingListDone (uint32 channel);
281
282 /*****************************************************************************/
283 //  Description:    configure dma channel interrupt
284 //  Global resource dependence:
285 //  Author:         Guofu.Huang
286 //  Note:           channel:dma channel number,0-31
287 //                  inttype:interrupt type,including all transfer done,burst done and link done.
288 //                  is_enable:SCI_TRUE,enable the interrupt, SCI_FALSE,disable the interrupt
289 //                  callback:interrupt service,if is_enable=SCI_FALSE, it is unuseful.
290 //  Return Value:   if success return DMA_ERR_TYPE_NONE
291 /*****************************************************************************/
292 PUBLIC void DMA_HAL_ChnIntConfig (uint32 channel, uint32 inttype, DMA_HAL_ISR_HANDLER callback);
293
294 /*****************************************************************************/
295 //  Description:    init a link transfer
296 //  Global resource dependence:
297 //  Author:         Guofu.Huang
298 //  Note:           channel:dma channel id
299 //  Return value:   if success return link list handle, otherwise return  DMA_LINKLIST_HANDLE_INVALID
300 /*****************************************************************************/
301 PUBLIC DMA_LINKLIST_HANDLE DMA_HAL_InitLinkList (uint32 channel);
302
303 /*****************************************************************************/
304 //  Description:    append a link element
305 //  Global resource dependence:
306 //  Author:         Guofu.Huang
307 //  Note:           linklisthandle:link list handle
308 //                  linklistelement:element to append
309 //  Return Value:   if success return DMA_ERR_TYPE_NONE
310 /*****************************************************************************/
311 PUBLIC DMA_ERR_TYPE_E DMA_HAL_AppendInitLinkList (DMA_LINKLIST_HANDLE linklisthandle,
312         DMA_CHNCFG_PTR param);
313
314 /*****************************************************************************/
315 //  Description:    submit a link list and start transfer
316 //  Global resource dependence:
317 //  Author:         Guofu.Huang
318 //  Note:           linklisthandle: link list handle
319 //                  is_int_used:polling or interrupt,if SCI_TRUE, intterrupt used
320 //                  callback: if interrupt used,callback need
321 //  Return Value:   if success return DMA_ERR_TYPE_NONE
322 /*****************************************************************************/
323 PUBLIC DMA_ERR_TYPE_E DMA_HAL_SubmitInitLinkList (DMA_LINKLIST_HANDLE linklisthandle);
324
325 /*****************************************************************************/
326 //  Description:    free link list
327 //  Global resource dependence:
328 //  Author:         Guofu.Huang
329 //  Note:           linklisthandle:link list to release
330 /*****************************************************************************/
331 PUBLIC void DMA_HAL_FreeLinkList (DMA_LINKLIST_HANDLE linklisthandle);
332
333 /*****************************************************************************/
334 // Description :    This function is used to enable or disable dma pause function.
335 //  Global resource dependence : s_dma_pause_disable_cnt
336 //  Author :
337 //  Note : is_enable :   TURE: enable dma pause function; FALSE: disable dma pause function
338 /*****************************************************************************/
339 PUBLIC void DMA_HAL_EnableDMAPause (BOOLEAN is_enable);
340
341 /*****************************************************************************/
342 // Description :    This function is used to get the function status of dma pause
343 // Global resource dependence : s_dma_pause_disable_cnt
344 // Author :
345 // Note : TURE: dma pause function is enabled; FALSE: dma pause function is disabled
346 /*****************************************************************************/
347 PUBLIC BOOLEAN DMA_HAL_IsEnableDMAPause (void);
348
349 /*****************************************************************************/
350 // Description :    This function is used to get the dma pause status
351 // Global resource dependence : s_is_dma_pause
352 // Author :
353 // Note : TURE: dma pause function is enabled; FALSE: dma pause function is disabled
354 /*****************************************************************************/
355 PUBLIC BOOLEAN DMA_HAL_IsDMAPause (void);
356 //
357 /**----------------------------------------------------------------------------*
358 **                         Compiler Flag                                      **
359 **----------------------------------------------------------------------------*/
360 #ifdef   __cplusplus
361 }
362 #endif
363 /**---------------------------------------------------------------------------*/
364 #endif //_DMA_DRV_INTERNAL_H_
365 // End of File
366