2bdbd8d1aedadc45c23c96311807ef1a56b9e114
[keystone-rtos/mcbsp-lld.git] / include / mcbsp_pvt.h
1 /*
2  * mcbsp_pvt.h
3  *
4  * McBSP Driver internal header file
5  *
6  * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
7  *
8  *
9  *  Redistribution and use in source and binary forms, with or without
10  *  modification, are permitted provided that the following conditions
11  *  are met:
12  *
13  *    Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  *
16  *    Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the
19  *    distribution.
20  *
21  *    Neither the name of Texas Instruments Incorporated nor the names of
22  *    its contributors may be used to endorse or promote products derived
23  *    from this software without specific prior written permission.
24  *
25  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28  *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29  *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30  *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31  *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32  *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33  *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35  *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36  *
37 */
38 /**
39  *  \file     mcbsp_pvt.h
40  *
41  *  \brief    Header file conataining the driver internal definitions and data
42  *            structures.
43  *
44  *            (C) Copyright 2012, Texas Instruments, Inc
45  *
46  */
48 #ifndef _MCBSP_PVT_H_
49 #define _MCBSP_PVT_H_
52 /*============================================================================*/
53 /*                        INCLUDE FILES                                       */
54 /*============================================================================*/
56 #ifdef __cplusplus
57 extern "C" {
58 #endif
60 /* MCBSP LLD includes */
61 #include <ti/csl/cslr_mcbsp.h>
62 #include <ti/sdo/edma3/drv/edma3_drv.h>
63 #include <ti/drv/mcbsp/mcbsp_drv.h>
65 /*============================================================================*/
66 /*                            MACRO DEFINTIONS                                */
67 /*============================================================================*/
69 #define Mcbsp_MAXLINKCNT               (2u)
70 /**<  Maximum number of EDMA jobs linked at a time (Must be 2).               */
72 #define Mcbsp_TXEVENTQUE               (1u)
73 /**<  Transmit EDMA channel event queue number                                */
75 #define Mcbsp_RXEVENTQUE               (2u)
76 /**<  Receive EDMA channel event queue number                                 */
78 #define Mcbsp_CNT_MAX_VAL              (0xFFFFu)
79 /**<  Max possible value of aCnt, bCnt and cCnt                               */
81 #define Mcbsp_STATUS_INVALID           (0xFFFF)
82 /**<  Generic invalidate status                                               */
84 #define Mcbsp_STATUS_VALID             (0x1)
85 /**<  Generic validate status                                                 */
87 #define Mcbsp_MAX_IOBUF_SIZE           (32768u)
88 /**< Maximum sixe of the I/O buffer programmable                              */
90 #define Mcbsp_FRAME_LENGTH             (127u)
91 /**< No of frames Max supported by the mcbsp                                  */
93 #ifndef CSL_MCBSP_PER_CNT
94 #define CSL_MCBSP_PER_CNT 1
95 #endif
96 /*============================================================================*/
97 /*                         ENUMERATED DATA TYPES                              */
98 /*============================================================================*/
100 /**
101  *  \brief Mcbsp driver state
102  *
103  *   Mcbsp driver state enums used to track the driver and channel state.
104  */
105 typedef enum Mcbsp_DriverState_t
107     Mcbsp_DriverState_DELETED,
108     Mcbsp_DriverState_CREATED,
109     Mcbsp_DriverState_INITIALIZED,
110     Mcbsp_DriverState_OPENED,
111     Mcbsp_DriverState_CLOSED,
112     Mcbsp_DriverState_DEINITIALIZED
113 }Mcbsp_DriverState;
114 /**< Mcbsp driver and channel states                              */
116 /**
117  * \brief Mcbsp SPCR control enums
118  *
119  *  These enums are used to control the settings of the SPCR register.
120  */
121 typedef enum Mcbsp_SpcrCtrl_t
123     Mcbsp_SpcrCtrl_RX_ENABLE   = (1u),
124     /**< To enable receiver in resetControl Function              */
126     Mcbsp_SpcrCtrl_TX_ENABLE   = (2u),
127     /**< To enable Transmitter in resetControl Function           */
129     Mcbsp_SpcrCtrl_RX_DISABLE  = (4u),
130     /**< To disable Receiver in resetControl Function             */
132     Mcbsp_SpcrCtrl_TX_DISABLE  = (8u),
133     /**< To disable Transmitter in resetControl Function          */
135     Mcbsp_SpcrCtrl_FSYNC_ENABLE = (16u),
136     /**< To enable Frame Sync Generation in resetControl Function */
138     Mcbsp_SpcrCtrl_SRG_ENABLE   = (32u),
139     /**< To enable Sample Rate Generator in resetControl Function */
141     Mcbsp_SpcrCtrl_FSYNC_DISABLE = (64u),
142     /**< To disable Frame Sync Generation in resetControl Function*/
144     Mcbsp_SpcrCtrl_SRG_DISABLE = (128u)
145     /**< To disable Sample Rate Generator in resetControl Function*/
146 }Mcbsp_SpcrCtrl;
147 /**< Mcbsp SPCR control enums                                     */
149 /*============================================================================*/
150 /*                              DATA STRUCTURES                               */
151 /*============================================================================*/
153 typedef struct Mcbsp_Object_t Mcbsp_Object;
155 /**
156  * \brief Mcbsp channel Object
157  *
158  *  This structure maintains the current channel state. It also holds
159  *  information on DMA channel being used and holds the application
160  *  callback function to be called in case of an interrupt.
161  *
162  *  This structure is initialized by mdCreateChan and a pointer to this
163  *  is passed down to all other channel related functions. Lifetime of
164  *  the data structure is from its creation by mdCreateChan till it
165  *  is invalidated by mdDeleteChan.each instance object will have two channel
166  *  object one for TX and one for the RX channel.
167  */
168 typedef struct Mcbsp_ChannelObj_t
170     uint16_t                    mode;
171     /**< Mode of operation of the channel (MCBSP_MODE_INPUT or MCBSP_MODE_OUTPUT)           */
173     Mcbsp_DriverState           chanState;
174     /**< operational state of the channel (opened/closed)                     */
176     Mcbsp_Object               *devHandle;
177     /**< Pointer to McBSP device driver instance object                       */
179     Mcbsp_CallbackFxn           cbFxn;
180     /**< Driver call back function to be called once a I/O buffer is processed*/
182     void*                       cbArg;
183     /**< Callback Function argument                                           */
185     void*                       edmaHandle;
186     /**< Handle to the EDMA3 driver(given by application)                     */
188     uint32_t                    edmaEventQue;
189     /**< EDMA event queue to be used by the channel                           */
191     EDMA3_RM_TccCallback        edmaCallback;
192     /**< Edma callback function pointer                                       */
194     uint32_t                    xferChan;
195     /**< eDMA  ChannelID                                                      */
197     uint32_t                    tcc ;
198     /**< EDMA transfer completion code                                        */
200     uint32_t                    pramTbl[Mcbsp_MAXLINKCNT];
201     /**< Logical channel numbers of EDMA, which are used for linking          */
203     uint32_t                    pramTblAddr[Mcbsp_MAXLINKCNT];
204     /**<  Physical address of logical channel numbers of EDMA, which          *
205      * are used for linking                                                   */
207     void*                       ptrQPendList;
208     /**< Queue to hold the pending I/O buffers received from the application  */
210     void*                       ptrQFloatList;
211     /**< Queue to manage floating I/O buffers in DMA                          */
213     Mcbsp_IOBuf                *tempIOBuf;
214     /**< Temporary I/O buffer holder                                          */
216     Mcbsp_IOBuf                *dataIOBuf;
217     /**< Temporary I/O buffer holder used to load the next buffer in to EDMA  */
219     uint32_t                    submitCount;
220     /**< Number of submit calls pending in the driver                         */
222     Mcbsp_BufferFormat          dataFormat;
223     /**< Application supplied buffer format                                   */
225     Bool                        nextFlag;
226     /**< Flag to indicate if the state machine can be stopped or not          */
228     volatile Bool               bMuteON;
229     /**< Flag to set the mute ON/OFF status                                   */
231     volatile Bool               paused;
232     /**< Flag to indicate if the audio is paused or not                       */
234     volatile Bool               flush;
235     /**< Flag to indicate if the Driver IO request flush is set               */
237     volatile Bool               isTempIOBufValid;
238     /**< Flag to indicate whether a valid buffer is available in tempIOBuf    */
240     Bool                        enableHwFifo;
241     /**< whether the FIFO has to be enabled for this channel                  */
243     Mcbsp_GblErrCallback        gblErrCbk;
244     /**< Callback to called in case an error occurs(supplied by application)  */
246     uint32_t                    userDataBufferSize;
247     /**< Size of the data buffer to be transferred                            */
249     void*                       loopJobBuffer;
250     /**< Buffer to be transferred when the loop job is running                */
252     uint16_t                    loopJobLength;
253     /**<Length of userloop job for each serialiser                            */
255     uint32_t                    userLoopJobLength;
256     /**< user specified loop job length to be used if supplied                */
258     uint32_t                    nextLinkParamSetToBeUpdated;
259     /**<  Used to store the next index of link param to be updated            */
261     volatile Bool               loopjobUpdatedinParamset;
262     /**< Used to prevent updating second paramset with loopjob for            *
263      * last dataIOBuf edma callback                                           */
265     uint16_t                    roundedWordWidth;
266     /**< Word length bytes to be transferred for DMA transaction              */
268     uint16_t                    currentDataSize;
269     /**< data buffer size of the currently transferring buffer                */
271     Mcbsp_DataConfig            chanConfig;
272     /**< settings to configure the TX or RX hardware sections                 */
274     Mcbsp_ClkSetup              clkSetup;
275     /**< clock setup for the RX or the TX section                             */
277     Bool                        userLoopJob;
278     /**< Option to indicate if the user loop job is used or driver loop job   */
280     int32_t                     currentError;
281     /**< Current I/O buffer error status                                      */
283     uint32_t                   numEnabledChannels;
284     /**<  Number of channels enabled with multichannel mode                   */
286 }Mcbsp_ChannelObj;
287 /**< Mcbsp channel Object                                                     */
289 /**
290  * \brief   Mcbsp instance Object
291  *
292  * \note    This data structure holds the information pertaining to an instance
293  *          of the Mcbsp device.it holds information like the current device
294  *          state, handle to the McBSP channels. The data structure is
295  *          initialized during "mdBindDev", which is called during DSP-BIOS
296  *          initialization, and is persistent till it is invalidated by
297  *          "mdUnBindDev".
298  */
299 typedef struct
301     Bool                        inUse;
302     /**< Variable to indicate if the instance is in use or not                */
304     int32_t                     instNum;
305     /**< Instance number of the current instance                              */
307     Mcbsp_DriverState           devState;
308     /**< operational state of the driver (created/deleted)                    */
310     Mcbsp_DevMode               mode;
311     /**< Operating mode of the Mcbsp driver(Mcbsp)                            */
313     Mcbsp_OpMode                opMode;
314     /**< Operational mode of the driver(INT/DMA/POLLING)                      */
316     Bool                        enablecache;
317     /**< Buffer operations to be performed by the driver or not               */
319     Mcbsp_HwInfo_Unpadded       hwInfo;
320     /**< McBSP handle for initial port configuration                          */
322     Bool                        stopSmFsXmt;
323     /**< TX state machine status(Stopped/Running)                             */
325     Bool                        stopSmFsRcv;
326     /**< RX state machine status(Stopped/Running)                             */
328     Mcbsp_ChannelObj            xmtObj;
329     /**< Transmit channel object                                              */
331     Mcbsp_ChannelObj            rcvObj;
332     /**< Receive channel object                                               */
334     Mcbsp_srgConfig             srgrConfig;
335     /**< configuration settings for the Sample rate generator                 */
337     Bool                        txSrgEnable;
338     /**< Flag to indicate if the TX section needs the sample rate generator to*
339      * be enabled                                                             */
341     Bool                        rxSrgEnable;
342     /**< Flag to indicate if the RX section needs the sample rate generator to*
343      * be enabled                                                             */
344     
345     Bool                        srgConfigured;
346     /**< Flag to indicate if the SRGR settings are configured or not          */
348     volatile Bool               srgEnabled;
349     /**< Flag to indicate if the sample rate generator is enabled and running */
351     Bool                        txFsgEnable;
352     /**< Flag to indicate if the TX section needs the frame sync generator to *
353      * be enabled                                                             */
355     Bool                        rxFsgEnable;
356     /**< Flag to indicate if the RX section needs the frame sync generator to *
357      * be enabled                                                             */
359     Bool                        fsgConfigured;
360     /**< Flag to indicate if the Framesync generator is configured or not     */
361     
362     volatile Bool               fsgEnabled;
363     /**< Flag to indicate if the frame sync generator is enabled and running  */
365     uint32_t                    retryCount;
366     /**< The retry count value to be used when waiting for the TX empty to be *
367      * set                                                                    */
369     Bool                        loopJobMode;
370     /**< Variable to check if the loop job mode is enabled or not             */
372 }Mcbsp_Object_Unpadded;
374 struct Mcbsp_Object_t
376     /** Data structure without padding, so sizeof() can compute padding */
377     Mcbsp_Object_Unpadded obj;
378     /** Pad out to end of MCBSP_MAX_CACHE_ALIGN bytes to prevent something else
379      * from being placed on same cache line as Mcbsp_Object. Note that pad[0]
380      * is illegal, so must add full MCBSP_MAX_CACHE_ALIGN if structure is
381      * already padded by chance. */
382     uint8_t                 pad[MCBSP_MAX_CACHE_ALIGN - 
383                             (sizeof(Mcbsp_Object_Unpadded) % MCBSP_MAX_CACHE_ALIGN)];
384 };
385 /**< Mcbsp instance Object                                                    */
388 int32_t Mcbsp_localResetCtrl(Mcbsp_Object_Unpadded *instHandle, uint32_t selectMask);
390 void Mcbsp_localCompleteCurrentIo(Mcbsp_ChannelObj *chanHandle);
392 void Mcbsp_localEdmaCallback(uint32_t tcc, EDMA3_RM_TccStatus status, void* data);
394 void Mcbsp_localAbortReset(Mcbsp_ChannelObj *chanHandle);
396 void Mcbsp_localGetNextIndex(uint32_t *index);
398 int32_t Mcbsp_localSetupEdmaDuringOpen(Mcbsp_ChannelObj *chanHandle);
400 int32_t Mcbsp_localSubmitIoctl(Mcbsp_ChannelObj *chanHandle,
401                              Mcbsp_IOCTL       cmd,
402                              void*               arg,
403                              void*               param);
405 int32_t Mcbsp_localUpdtDtPktToLnkPrms(Mcbsp_ChannelObj *chanHandle,
406                                     Mcbsp_IOBuf       *const ioBuf);
408 int32_t Mcbsp_localEdmaChanPaRAMsetup(Mcbsp_ChannelObj *chanHandle);
410 int32_t Mcbsp_localEdmaProcessPkt(Mcbsp_ChannelObj *chanHandle,
411                                 Mcbsp_IOBuf       *ioBuf);
413 void Mcbsp_localCancelAndAbortAllIo(Mcbsp_ChannelObj *chanHandle);
415 void Mcbsp_localAbortReset(Mcbsp_ChannelObj *chanHandle);
417 int32_t Mcbsp_localGetIndicesSyncType(Mcbsp_ChannelObj   *chanHandle,
418                                     volatile int16_t     *bIndex,
419                                     volatile int16_t     *cIndex,
420                                     volatile uint16_t    *aCnt,
421                                     volatile uint16_t    *bCnt,
422                                     volatile uint16_t    *cCnt,
423                                     EDMA3_DRV_SyncType *syncType,
424                                     Bool                forLoopJobBuf);
426 void Mcbsp_localGetNextIndex(uint32_t *index);
427 int32_t Mcbsp_localConfigureSrgr(Mcbsp_Object_Unpadded *instHandle,
428                                Mcbsp_ChannelObj *chanHandle);
429 int32_t Mcbsp_localConfigureRcvChannel(Mcbsp_Object_Unpadded *instHandle,
430                                      Mcbsp_ChanParams *params);
431 int32_t Mcbsp_localConfigureXmtChannel(Mcbsp_Object_Unpadded *instHandle,
432                                      Mcbsp_ChanParams *params);
433 void Mcbsp_localLoadPktToEdma(Mcbsp_ChannelObj *chanHandle,Mcbsp_IOBuf *ioBuf); 
434 int32_t Mcbsp_localModifySampleRate(Mcbsp_ChannelObj *chanHandle,void* arg);
436 #ifndef MCBSP_LOOPJOB_ENABLE
437 void Mcbsp_TxFifo(int32_t arg0,int32_t arg1);
438 #endif /* MCBSP_LOOPJOB_ENABLE */
440 #ifdef __cplusplus
442 #endif /* extern "C" */
444 #endif /* _MCBSP_PVT_H_ */
445 /*============================================================================*/
446 /*                         END OF FILE                                        */
447 /*============================================================================*/