03a7f34a3f9b602ed4862268788e581cbb9fe469
[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 /*============================================================================*/
94 /*                         ENUMERATED DATA TYPES                              */
95 /*============================================================================*/
97 /**
98  *  \brief Mcbsp driver state
99  *
100  *   Mcbsp driver state enums used to track the driver and channel state.
101  */
102 typedef enum Mcbsp_DriverState_t
104     Mcbsp_DriverState_DELETED,
105     Mcbsp_DriverState_CREATED,
106     Mcbsp_DriverState_INITIALIZED,
107     Mcbsp_DriverState_OPENED,
108     Mcbsp_DriverState_CLOSED,
109     Mcbsp_DriverState_DEINITIALIZED
110 }Mcbsp_DriverState;
111 /**< Mcbsp driver and channel states                              */
113 /**
114  * \brief Mcbsp SPCR control enums
115  *
116  *  These enums are used to control the settings of the SPCR register.
117  */
118 typedef enum Mcbsp_SpcrCtrl_t
120     Mcbsp_SpcrCtrl_RX_ENABLE   = (1u),
121     /**< To enable receiver in resetControl Function              */
123     Mcbsp_SpcrCtrl_TX_ENABLE   = (2u),
124     /**< To enable Transmitter in resetControl Function           */
126     Mcbsp_SpcrCtrl_RX_DISABLE  = (4u),
127     /**< To disable Receiver in resetControl Function             */
129     Mcbsp_SpcrCtrl_TX_DISABLE  = (8u),
130     /**< To disable Transmitter in resetControl Function          */
132     Mcbsp_SpcrCtrl_FSYNC_ENABLE = (16u),
133     /**< To enable Frame Sync Generation in resetControl Function */
135     Mcbsp_SpcrCtrl_SRG_ENABLE   = (32u),
136     /**< To enable Sample Rate Generator in resetControl Function */
138     Mcbsp_SpcrCtrl_FSYNC_DISABLE = (64u),
139     /**< To disable Frame Sync Generation in resetControl Function*/
141     Mcbsp_SpcrCtrl_SRG_DISABLE = (128u)
142     /**< To disable Sample Rate Generator in resetControl Function*/
143 }Mcbsp_SpcrCtrl;
144 /**< Mcbsp SPCR control enums                                     */
146 /*============================================================================*/
147 /*                              DATA STRUCTURES                               */
148 /*============================================================================*/
150 typedef struct Mcbsp_Object_t Mcbsp_Object;
152 /**
153  * \brief Mcbsp channel Object
154  *
155  *  This structure maintains the current channel state. It also holds
156  *  information on DMA channel being used and holds the application
157  *  callback function to be called in case of an interrupt.
158  *
159  *  This structure is initialized by mdCreateChan and a pointer to this
160  *  is passed down to all other channel related functions. Lifetime of
161  *  the data structure is from its creation by mdCreateChan till it
162  *  is invalidated by mdDeleteChan.each instance object will have two channel
163  *  object one for TX and one for the RX channel.
164  */
165 typedef struct Mcbsp_ChannelObj_t
167     uint16_t                    mode;
168     /**< Mode of operation of the channel (MCBSP_MODE_INPUT or MCBSP_MODE_OUTPUT)           */
170     Mcbsp_DriverState           chanState;
171     /**< operational state of the channel (opened/closed)                     */
173     Mcbsp_Object               *devHandle;
174     /**< Pointer to McBSP device driver instance object                       */
176     Mcbsp_CallbackFxn           cbFxn;
177     /**< Driver call back function to be called once a I/O buffer is processed*/
179     void*                       cbArg;
180     /**< Callback Function argument                                           */
182     void*                       edmaHandle;
183     /**< Handle to the EDMA3 driver(given by application)                     */
185     uint32_t                    edmaEventQue;
186     /**< EDMA event queue to be used by the channel                           */
188     EDMA3_RM_TccCallback        edmaCallback;
189     /**< Edma callback function pointer                                       */
191     uint32_t                    xferChan;
192     /**< eDMA  ChannelID                                                      */
194     uint32_t                    tcc ;
195     /**< EDMA transfer completion code                                        */
197     uint32_t                    pramTbl[Mcbsp_MAXLINKCNT];
198     /**< Logical channel numbers of EDMA, which are used for linking          */
200     uint32_t                    pramTblAddr[Mcbsp_MAXLINKCNT];
201     /**<  Physical address of logical channel numbers of EDMA, which          *
202      * are used for linking                                                   */
204     void*                       ptrQPendList;
205     /**< Queue to hold the pending I/O buffers received from the application  */
207     void*                       ptrQFloatList;
208     /**< Queue to manage floating I/O buffers in DMA                          */
210     Mcbsp_IOBuf                *tempIOBuf;
211     /**< Temporary I/O buffer holder                                          */
213     Mcbsp_IOBuf                *dataIOBuf;
214     /**< Temporary I/O buffer holder used to load the next buffer in to EDMA  */
216     uint32_t                    submitCount;
217     /**< Number of submit calls pending in the driver                         */
219     Mcbsp_BufferFormat          dataFormat;
220     /**< Application supplied buffer format                                   */
222     Bool                        nextFlag;
223     /**< Flag to indicate if the state machine can be stopped or not          */
225     volatile Bool               bMuteON;
226     /**< Flag to set the mute ON/OFF status                                   */
228     volatile Bool               paused;
229     /**< Flag to indicate if the audio is paused or not                       */
231     volatile Bool               flush;
232     /**< Flag to indicate if the Driver IO request flush is set               */
234     volatile Bool               isTempIOBufValid;
235     /**< Flag to indicate whether a valid buffer is available in tempIOBuf    */
237     Bool                        enableHwFifo;
238     /**< whether the FIFO has to be enabled for this channel                  */
240     Mcbsp_GblErrCallback        gblErrCbk;
241     /**< Callback to called in case an error occurs(supplied by application)  */
243     uint32_t                    userDataBufferSize;
244     /**< Size of the data buffer to be transferred                            */
246     void*                       loopJobBuffer;
247     /**< Buffer to be transferred when the loop job is running                */
249     uint16_t                    loopJobLength;
250     /**<Length of userloop job for each serialiser                            */
252     uint32_t                    userLoopJobLength;
253     /**< user specified loop job length to be used if supplied                */
255     uint32_t                    nextLinkParamSetToBeUpdated;
256     /**<  Used to store the next index of link param to be updated            */
258     volatile Bool               loopjobUpdatedinParamset;
259     /**< Used to prevent updating second paramset with loopjob for            *
260      * last dataIOBuf edma callback                                           */
262     uint16_t                    roundedWordWidth;
263     /**< Word length bytes to be transferred for DMA transaction              */
265     uint16_t                    currentDataSize;
266     /**< data buffer size of the currently transferring buffer                */
268     Mcbsp_DataConfig            chanConfig;
269     /**< settings to configure the TX or RX hardware sections                 */
271     Mcbsp_ClkSetup              clkSetup;
272     /**< clock setup for the RX or the TX section                             */
274     Bool                        userLoopJob;
275     /**< Option to indicate if the user loop job is used or driver loop job   */
277     int32_t                     currentError;
278     /**< Current I/O buffer error status                                      */
280     uint32_t                   numEnabledChannels;
281     /**<  Number of channels enabled with multichannel mode                   */
283 }Mcbsp_ChannelObj;
284 /**< Mcbsp channel Object                                                     */
286 /**
287  * \brief   Mcbsp instance Object
288  *
289  * \note    This data structure holds the information pertaining to an instance
290  *          of the Mcbsp device.it holds information like the current device
291  *          state, handle to the McBSP channels. The data structure is
292  *          initialized during "mdBindDev", which is called during DSP-BIOS
293  *          initialization, and is persistent till it is invalidated by
294  *          "mdUnBindDev".
295  */
296 typedef struct
298     Bool                        inUse;
299     /**< Variable to indicate if the instance is in use or not                */
301     int32_t                     instNum;
302     /**< Instance number of the current instance                              */
304     Mcbsp_DriverState           devState;
305     /**< operational state of the driver (created/deleted)                    */
307     Mcbsp_DevMode               mode;
308     /**< Operating mode of the Mcbsp driver(Mcbsp)                            */
310     Mcbsp_OpMode                opMode;
311     /**< Operational mode of the driver(INT/DMA/POLLING)                      */
313     Bool                        enablecache;
314     /**< Buffer operations to be performed by the driver or not               */
316     Mcbsp_HwInfo_Unpadded       hwInfo;
317     /**< McBSP handle for initial port configuration                          */
319     Bool                        stopSmFsXmt;
320     /**< TX state machine status(Stopped/Running)                             */
322     Bool                        stopSmFsRcv;
323     /**< RX state machine status(Stopped/Running)                             */
325     Mcbsp_ChannelObj            xmtObj;
326     /**< Transmit channel object                                              */
328     Mcbsp_ChannelObj            rcvObj;
329     /**< Receive channel object                                               */
331     Mcbsp_srgConfig             srgrConfig;
332     /**< configuration settings for the Sample rate generator                 */
334     Bool                        txSrgEnable;
335     /**< Flag to indicate if the TX section needs the sample rate generator to*
336      * be enabled                                                             */
338     Bool                        rxSrgEnable;
339     /**< Flag to indicate if the RX section needs the sample rate generator to*
340      * be enabled                                                             */
341     
342     Bool                        srgConfigured;
343     /**< Flag to indicate if the SRGR settings are configured or not          */
345     volatile Bool               srgEnabled;
346     /**< Flag to indicate if the sample rate generator is enabled and running */
348     Bool                        txFsgEnable;
349     /**< Flag to indicate if the TX section needs the frame sync generator to *
350      * be enabled                                                             */
352     Bool                        rxFsgEnable;
353     /**< Flag to indicate if the RX section needs the frame sync generator to *
354      * be enabled                                                             */
356     Bool                        fsgConfigured;
357     /**< Flag to indicate if the Framesync generator is configured or not     */
358     
359     volatile Bool               fsgEnabled;
360     /**< Flag to indicate if the frame sync generator is enabled and running  */
362     uint32_t                    retryCount;
363     /**< The retry count value to be used when waiting for the TX empty to be *
364      * set                                                                    */
366     Bool                        loopJobMode;
367     /**< Variable to check if the loop job mode is enabled or not             */
369 }Mcbsp_Object_Unpadded;
371 struct Mcbsp_Object_t
373     /** Data structure without padding, so sizeof() can compute padding */
374     Mcbsp_Object_Unpadded obj;
375     /** Pad out to end of MCBSP_MAX_CACHE_ALIGN bytes to prevent something else
376      * from being placed on same cache line as Mcbsp_Object. Note that pad[0]
377      * is illegal, so must add full MCBSP_MAX_CACHE_ALIGN if structure is
378      * already padded by chance. */
379     uint8_t                 pad[MCBSP_MAX_CACHE_ALIGN - 
380                             (sizeof(Mcbsp_Object_Unpadded) % MCBSP_MAX_CACHE_ALIGN)];
381 };
382 /**< Mcbsp instance Object                                                    */
385 int32_t Mcbsp_localResetCtrl(Mcbsp_Object_Unpadded *instHandle, uint32_t selectMask);
387 void Mcbsp_localCompleteCurrentIo(Mcbsp_ChannelObj *chanHandle);
389 void Mcbsp_localEdmaCallback(uint32_t tcc, EDMA3_RM_TccStatus status, void* data);
391 void Mcbsp_localAbortReset(Mcbsp_ChannelObj *chanHandle);
393 void Mcbsp_localGetNextIndex(uint32_t *index);
395 int32_t Mcbsp_localSetupEdmaDuringOpen(Mcbsp_ChannelObj *chanHandle);
397 int32_t Mcbsp_localSubmitIoctl(Mcbsp_ChannelObj *chanHandle,
398                              Mcbsp_IOCTL       cmd,
399                              void*               arg,
400                              void*               param);
402 int32_t Mcbsp_localUpdtDtPktToLnkPrms(Mcbsp_ChannelObj *chanHandle,
403                                     Mcbsp_IOBuf       *const ioBuf);
405 int32_t Mcbsp_localEdmaChanPaRAMsetup(Mcbsp_ChannelObj *chanHandle);
407 int32_t Mcbsp_localEdmaProcessPkt(Mcbsp_ChannelObj *chanHandle,
408                                 Mcbsp_IOBuf       *ioBuf);
410 void Mcbsp_localCancelAndAbortAllIo(Mcbsp_ChannelObj *chanHandle);
412 void Mcbsp_localAbortReset(Mcbsp_ChannelObj *chanHandle);
414 int32_t Mcbsp_localGetIndicesSyncType(Mcbsp_ChannelObj   *chanHandle,
415                                     volatile int16_t     *bIndex,
416                                     volatile int16_t     *cIndex,
417                                     volatile uint16_t    *aCnt,
418                                     volatile uint16_t    *bCnt,
419                                     volatile uint16_t    *cCnt,
420                                     EDMA3_DRV_SyncType *syncType,
421                                     Bool                forLoopJobBuf);
423 void Mcbsp_localGetNextIndex(uint32_t *index);
424 int32_t Mcbsp_localConfigureSrgr(Mcbsp_Object_Unpadded *instHandle,
425                                Mcbsp_ChannelObj *chanHandle);
426 int32_t Mcbsp_localConfigureRcvChannel(Mcbsp_Object_Unpadded *instHandle,
427                                      Mcbsp_ChanParams *params);
428 int32_t Mcbsp_localConfigureXmtChannel(Mcbsp_Object_Unpadded *instHandle,
429                                      Mcbsp_ChanParams *params);
430 void Mcbsp_localLoadPktToEdma(Mcbsp_ChannelObj *chanHandle,Mcbsp_IOBuf *ioBuf); 
431 int32_t Mcbsp_localModifySampleRate(Mcbsp_ChannelObj *chanHandle,void* arg);
433 #ifndef MCBSP_LOOPJOB_ENABLE
434 void Mcbsp_TxFifo(int32_t arg0,int32_t arg1);
435 #endif /* MCBSP_LOOPJOB_ENABLE */
437 #ifdef __cplusplus
439 #endif /* extern "C" */
441 #endif /* _MCBSP_PVT_H_ */
442 /*============================================================================*/
443 /*                         END OF FILE                                        */
444 /*============================================================================*/