PASDK-516:Several ASOT updates
authorFrank Livingston <frank-livingston@ti.com>
Wed, 14 Feb 2018 22:28:57 +0000 (16:28 -0600)
committerFrank Livingston <frank-livingston@ti.com>
Wed, 14 Feb 2018 22:28:57 +0000 (16:28 -0600)
- Add output frame length change in asopStartOutput()
- Move location of IO Phy priming
- Fix problems with Output SIO selection

pasdk/test_dsp/framework/audioStreamOutDec.c
pasdk/test_dsp/framework/audioStreamOutIo.c
pasdk/test_dsp/framework/audioStreamOutIo.h
pasdk/test_dsp/framework/audioStreamOutProc.c

index d7510c8c99f09f237d965863e614dbf62f91e816..5da02bdc32bfc01f7671c34384af739f8fdc4f67 100644 (file)
@@ -33,7 +33,7 @@ All rights reserved.
 *
 */
 /*
- *  ======== audioStreamOutProcDec.c ========
+ *  ======== audioStreamOutDec.c ========
  */
 
 #include <string.h> // for memset
@@ -227,9 +227,13 @@ Int asopDecOutProcInfo1(
         }
     }
     
-    // Start output transfer
-    // FL, New IO: API for single Output
-    asopPhyTransferStart(&pOut[zO]);
+    //// I/O physical layer prime operation required by McASP LLD
+    ////  FL, New IO: API for single Output
+    //asopIoPhyPrime(&pAsotCfg->pIoOut[zO]);
+    
+    //// Start output transfer
+    //// FL, New IO: API for single Output
+    //asopPhyTransferStart(&pOut[zO]);
     
     return status;
 } //asopDecOutProcInfo1
@@ -513,11 +517,15 @@ Int asopDecOutProcEncode(
                 
             TRACE_GEN2("asopDecodeEncode: AS%d: processing frame %d -- idle", as+zS, frame);
 
-#if 0 // FL NEWIO: add similar thing to be figured out
+#if 0 // FL, New IO: add similar thing to be figured out
             ioPhyCtl.code = IOPHY_CTL_FRAME_SIZE;
             ioPhyCtl.params.xferFrameSize = pAstCfg->xOut[z].outBufConfig.lengthofFrame
                                                * ASOP_OUTBUF_STRIDE * ASOP_NUM_BYTES_PCM_SAMPLE;
             ioPhyControl(pOut[z].hIoPhy, &ioPhyCtl);
+            // Update framework transfer size to IO Phy transfer size
+            pOut[z].phyXferSize = ioPhyCtl.params.xferFrameSize;
+            // Update IO Buff delay to match IO Phy transfer size
+            ioBuffAdjustDelay(pOut[z].hIoBuff, ioPhyCtl.params.xferFrameSize * (NUM_PRIME_XFERS+1));
 
             errno = SIO_reclaim(pAstCfg->xOut[z].hTxSio,(Ptr *) &pAstCfg->xOut[z].pOutBuf, NULL);
             if (errno < 0)
index 336c2915d45c06a79a0779b86c0305bbb12198b7..e0ad21d00140d1b872e0659f2aefdae6a6fc11ca 100644 (file)
@@ -199,6 +199,7 @@ Int asopStartOutput(
     Int zMD;
     PAF_SIO_IALG_Obj    *pObj;
     PAF_SIO_IALG_Config *pAlgConfig;
+    ioPhyCtl_t ioPhyCtl;
 
 
     pAstCfg = pAsotCfg->pAstCfg; // get pointer to common (shared) configuration
@@ -248,6 +249,17 @@ Int asopStartOutput(
             pAstCfg->xOut[z].outBufConfig.lengthofFrame =
                 pAstCfg->xEnc[zE].encodeInStruct.pAudioFrame->sampleCount;
 
+#if 1 // FL New IO: add similar thing to be figured out
+            ioPhyCtl.code = IOPHY_CTL_FRAME_SIZE;
+            ioPhyCtl.params.xferFrameSize = pAstCfg->xOut[z].outBufConfig.lengthofFrame
+                                               * OUTPUT_STRIDE * WORD_SIZE_PCM;
+            ioPhyControl(pOut[z].hIoPhy, &ioPhyCtl);
+            // Update framework transfer size to IO Phy transfer size
+            pOut[z].phyXferSize = ioPhyCtl.params.xferFrameSize;
+            // Update IO Buff delay to match IO Phy transfer size
+            ioBuffAdjustDelay(pOut[z].hIoBuff, ioPhyCtl.params.xferFrameSize * (NUM_PRIME_XFERS+1));
+#endif            
+                
             if (pAstCfg->xOut[z].outBufStatus.markerMode == PAF_OB_MARKER_ENABLED)
             {
                 pObj = (PAF_SIO_IALG_Obj *) pAstCfg->xOut[z].outChainData.head->alg;
@@ -494,6 +506,17 @@ Void asopIoPhyPrime(
 } /* asipIoPhyPrime */
 
 
+/*======================================================================================
+ *  This function checks whether the I/O physical layer has been initialized
+ *====================================================================================*/
+Bool asopIoPhyCheckInit(Void)
+{
+    if (!d10Initialized)
+        return FALSE;
+    else 
+        return TRUE;
+}
+
 /*======================================================================================
  *  This function starts an I/O PHY transfer for output
  *====================================================================================*/
@@ -559,11 +582,34 @@ Int asopWriteOpBuffers(
     return 0;
 }
 
-// Check if at least one Output device SIO selection changed
-Int checkOutDevSelUpdate(
+// Check if Output device SIO selection changed
+Int checkOutDevSioSelUpdate(
+    const PAF_ASOT_Params *pP, 
+    PAF_ASOT_Config *pAsotCfg,
+    Int z, 
+    Bool *pOutDevSelUpdate
+)
+{
+    PAF_AST_Config *pAstCfg;
+    
+    pAstCfg = pAsotCfg->pAstCfg; // get pointer to AST common (shared) configuration
+
+    if ((z < OUTPUT1) || (z >= OUTPUTN))
+    {
+        *pOutDevSelUpdate = FALSE;
+        return -1;
+    }
+    
+    *pOutDevSelUpdate = (Bool)(pAstCfg->xOut[z].outBufStatus.sioSelect >= 0);
+
+    return 0;
+}
+
+// Check if any Output device SIO selection changed
+Int checkAnyOutDevSioSelUpdate(
     const PAF_ASOT_Params *pP, 
     PAF_ASOT_Config *pAsotCfg,
-    Int *pOutDevSelUpdate
+    Bool *pOutDevSelUpdate
 )
 {
     PAF_AST_Config *pAstCfg;
@@ -572,12 +618,12 @@ Int checkOutDevSelUpdate(
     
     pAstCfg = pAsotCfg->pAstCfg; // get pointer to AST common (shared) configuration
 
-    outDevSelUpdate = 0;
+    outDevSelUpdate = FALSE;
     for (z=OUTPUT1; z < OUTPUTN; z++) 
     {
         if (pAstCfg->xOut[z].outBufStatus.sioSelect >= 0)
         {
-            outDevSelUpdate = 1;
+            outDevSelUpdate = TRUE;
             break;
         }
     }
index df3b489328b301d3c0476bfbce1965aae61592da..7459de4d98eae5c120e2fa0318cead891d1264f8 100644 (file)
@@ -77,6 +77,9 @@ Int asopIoCompsInit(
     PAF_AST_IoOut *pOutIo
 );
 
+// Check I/O physical layer initialized
+Bool asopIoPhyCheckInit(Void);
+
 // I/O physical layer prime operation required by McASP LLD
 Void asopIoPhyPrime(
     PAF_AST_IoOut *pOut
@@ -93,11 +96,19 @@ Int asopWriteOpBuffers(
     PAF_AST_IoOut *pOut
 );
 
-// Check if at least one Output device SIO selection changed
-Int checkOutDevSelUpdate(
+// Check if Output device SIO selection changed
+Int checkOutDevSioSelUpdate(
+    const PAF_ASOT_Params *pP, 
+    PAF_ASOT_Config *pAsotCfg,
+    Int z, 
+    Bool *pOutDevSelUpdate
+);
+
+// Check if any Output device SIO selection changed
+Int checkAnyOutDevSioSelUpdate(
     const PAF_ASOT_Params *pP, 
     PAF_ASOT_Config *pAsotCfg,
-    Int *pOutDevSelUpdate
+    Bool *pOutDevSelUpdate
 );
 
 
index 90e43ac7aa05c1aa35b31b4ab9d3cf54a7e2f9bb..51c045ed2d2af3dd56266d918256ec1c42eaf9c2 100644 (file)
@@ -116,7 +116,7 @@ All rights reserved.
 #define __TASK_NAME__  "TaskAsop"
 
 // status codes
-// Output FSM
+// ASOT FSM
 #define ASOP_SOK_INITSYNC_NOTREADY              (   1 ) // ok, init-sync not ready
 #define ASOP_SOK                                (   0 ) // ok
 #define ASOP_ERR_FORWARD_ERR                    (  -1 ) // error, forward (ASIT) error
@@ -139,11 +139,16 @@ enum
     ASOT_STATE_INITSYNC_RESYNC
 };
 
-// Check if at least one output selected
+// Check if Output device selected
 static Int checkOutDevSel(
+    PAF_AST_IoOut *pOut,
+    Bool *pOutDevSel);
+    
+// Check if any Output device selected
+static Int checkAnyOutDevSel(
     const PAF_ASOT_Params *pP,
-    PAF_ASOT_Config *pAsotCfg,
-    Bool *pOutSel);
+    PAF_AST_IoOut *pOut,
+    Bool *pOutDevSel);
 
 // ASOT SM function
 //   Purpose:   Audio Stream Output Task Function for selecting the devices used
@@ -269,6 +274,8 @@ PAF_ASOT_Config gPAF_ASOT_config = {
 /* ASOT event handle - to put in structure */
 Event_Handle asotEvt;
 
+extern Int d10Initialized;
+
 // For writeDECCommandRestart
 extern volatile UInt32 gCommandOutputTask_SYNC;
 extern volatile UInt32 gCommandOutputTask_ACK;
@@ -282,27 +289,27 @@ Int asopLoopCount;
 #endif
 
 // Debug event-in-state counters
-UInt32 gSelOutDevState_EvtWakeTimer_cnt             = 0; // Select Output state, Wake Timer event count
-UInt32 gSelOutDevState_EvtTxMcaspEdma_invCnt        = 0; // Select Output state, invalid Tx McASP EDMA event count
-UInt32 gSelOutDevState_Evt_invCnt                   = 0; // Select Output state, invalid other event count
-UInt32 gResetOutProcState_EvtWakeTimer_cnt          = 0; // Select Output state, Wake Timer event count
-UInt32 gResetOutProcState_EvtTxMcaspEdma_cnt        = 0; // Reset Output Processing state, Tx McASP EDMA event count
-UInt32 gResetOutProcState_Evt_invCnt                = 0; // Reset Output Processing state, invalid other event count
-UInt32 gInitSyncDecInfo1State_EvtWakeTimer_cnt      = 0; // Init-Sync Dec Info1 state, Wake Timer event count
-UInt32 gInitSyncDecInfo1State_EvtTxMcaspEdma_cnt    = 0; // Init-Sync Dec Info1 state, Tx McASP EDMA event count
-UInt32 gInitSyncDecInfo1State_Evt_invCnt            = 0; // Init-Sync Dec Info1 state, invalid other event count
-UInt32 gInitSyncDecDecode1State_EvtWakeTimer_cnt    = 0; // Init-Sync Dec Decode1 state, Wake Timer event count
-UInt32 gInitSyncDecDecode1State_EvtTxMcaspEdma_cnt  = 0; // Init-Sync Dec Decode1 state, Tx McASP EDMA event count
-UInt32 gInitSyncDecDecode1State_Evt_invCnt          = 0; // Init-Sync Dec Decode1 state, invalid other event count
-UInt32 gProcDecOutState_EvtWakeTimer_cnt            = 0; // Process Output state, Wake Timer event count 
-UInt32 gProcDecOutState_EvtTxMcaspEdma_cnt          = 0; // Process Output state, Tx McASP EDMA event count
-UInt32 gProcDecOutState_Evt_invCnt                  = 0; // Process Output state, invalid other event count
-UInt32 gReselOutDevState_EvtWakeTimer_cnt           = 0; // Process Output state, Wake Timer event count 
-UInt32 gReselOutDevState_EvtTxMcaspEdma_invCnt      = 0; // Re-select Output state, invalid other event count
-UInt32 gReselOutDevState_Evt_invCnt                 = 0; // Re-select Output state, invalid other event count
+UInt32 gSelOutDevState_EvtWakeTimer_cnt                 = 0; // Select Output state, Wake Timer event count
+UInt32 gSelOutDevState_EvtTxMcaspEdma_invCnt            = 0; // Select Output state, invalid Tx McASP EDMA event count
+UInt32 gSelOutDevState_Evt_invCnt                       = 0; // Select Output state, invalid other event count
+UInt32 gResetOutProcState_EvtWakeTimer_cnt              = 0; // Select Output state, Wake Timer event count
+UInt32 gResetOutProcState_EvtTxMcaspEdma_invCnt         = 0; // Reset Output Processing state, invalid Tx McASP EDMA event count
+UInt32 gResetOutProcState_Evt_invCnt                    = 0; // Reset Output Processing state, invalid other event count
+UInt32 gInitSyncDecInfo1State_EvtWakeTimer_cnt          = 0; // Init-Sync Dec Info1 state, Wake Timer event count
+UInt32 gInitSyncDecInfo1State_EvtTxMcaspEdma_invCnt     = 0; // Init-Sync Dec Info1 state, invalid Tx McASP EDMA event count
+UInt32 gInitSyncDecInfo1State_Evt_invCnt                = 0; // Init-Sync Dec Info1 state, invalid other event count
+UInt32 gInitSyncDecDecode1State_EvtWakeTimer_cnt        = 0; // Init-Sync Dec Decode1 state, Wake Timer event count
+UInt32 gInitSyncDecDecode1State_EvtTxMcaspEdma_invCnt   = 0; // Init-Sync Dec Decode1 state, invalid Tx McASP EDMA event count
+UInt32 gInitSyncDecDecode1State_Evt_invCnt              = 0; // Init-Sync Dec Decode1 state, invalid other event count
+UInt32 gProcDecOutState_EvtWakeTimer_cnt                = 0; // Process Output state, Wake Timer event count 
+UInt32 gProcDecOutState_EvtTxMcaspEdma_cnt              = 0; // Process Output state, Tx McASP EDMA event count
+UInt32 gProcDecOutState_Evt_invCnt                      = 0; // Process Output state, invalid other event count
+UInt32 gReselOutDevState_EvtWakeTimer_cnt               = 0; // Process Output state, Wake Timer event count 
+UInt32 gReselOutDevState_EvtTxMcaspEdma_invCnt          = 0; // Re-select Output state, invalid other event count
+UInt32 gReselOutDevState_Evt_invCnt                     = 0; // Re-select Output state, invalid other event count
 // Debug state counters
-UInt32 gAsotInitSyncResyncState_Cnt                 = 0; // Init-Sync Re-sync (Local error) state execution count
-UInt32 gAsotInvState_Cnt                            = 0; // invalid state count
+UInt32 gAsotInitSyncResyncState_Cnt                     = 0; // Init-Sync Re-sync (Local error) state execution count
+UInt32 gAsotInvState_Cnt                                = 0; // invalid state count
 
 
 /*
@@ -397,8 +404,8 @@ Void taskAsopFxn(
                     }
                     else
                     {
-                        // No output device selected (outDevSel == FALSE)
-                        // Staying in same state.
+                        // No output device selected (outDevSel == FALSE).
+                        // Remain in current state.
                         ;
                     }
                 }
@@ -456,15 +463,24 @@ Void taskAsopFxn(
                     if (status < 0)
                     {
                         // FL, New IO: 
-                        //Tx status==error message to ASDT;   // feedback message ASOT -> ASDT
+                        //Tx status==error message to ASDT; // feedback message ASOT -> ASDT
                         
-                        pAsotCfg->state = ASOT_STATE_SEL_OUT_DEV;          // starting over with Output device selection in case of error
+                        pAsotCfg->state = ASOT_STATE_SEL_OUT_DEV;   // starting over with Output device selection in case of error
                         break;
                     }
+                    else if (status == ASOP_SOK_INITSYNC_NOTREADY)
+                    {
+                        // FL, New IO: this is only necessary for Wake Timer, POLLING Init-Sync
+                        // FL, New IO: can be removed once Rx ASDT messages are implemented for Init-Sync
+                        
+                        // Dec Reset Init-Sync not ready.
+                        // Remain in current state.
+                        ;
+                    }
                     else
                     {
                         // FL, New IO: 
-                        //Tx status==ok message to ASDT;      // feedback message ASOT -> ASDT
+                        //Tx status==ok message to ASDT; // feedback message ASOT -> ASDT
                         
                         pAsotCfg->state = ASOT_STATE_INITSYNC_DEC_INFO1;
                     }
@@ -473,7 +489,7 @@ Void taskAsopFxn(
                 // Check for unexpected Tx McASP EDMA event
                 if (events & Evt_Id_AsotTxMcaspEdma)
                 {
-                    gResetOutProcState_EvtTxMcaspEdma_cnt++; // log event count in state
+                    gResetOutProcState_EvtTxMcaspEdma_invCnt++; // log invalid event count in state
                     TRACE_TERSE2("TaskAsop: Tx McASP EDMA event, state=%u, events=%u", pAsotCfg->state, events);
                     events &= ~Evt_Id_AsotTxMcaspEdma; // clear event
                 }
@@ -507,6 +523,15 @@ Void taskAsopFxn(
                         pAsotCfg->state = ASOT_STATE_SEL_OUT_DEV;          // starting over with Output device selection in case of error
                         break;
                     }
+                    else if (status == ASOP_SOK_INITSYNC_NOTREADY)
+                    {
+                        // FL, New IO: this is only necessary for Wake Timer, POLLING Init-Sync
+                        // FL, New IO: can be removed once Rx ASDT messages are implemented for Init-Sync
+                        
+                        // Dec Reset Init-Sync not ready.
+                        // Remain in current state.
+                        ;
+                    }
                     else
                     {
                         // FL, New IO: 
@@ -519,7 +544,7 @@ Void taskAsopFxn(
                 // Check for unexpected Tx McASP EDMA event
                 if (events & Evt_Id_AsotTxMcaspEdma)
                 {
-                    gInitSyncDecInfo1State_EvtTxMcaspEdma_cnt++; // log event count in state
+                    gInitSyncDecInfo1State_EvtTxMcaspEdma_invCnt++; // log invalid event count in state
                     TRACE_TERSE2("TaskAsop: Tx McASP EDMA event, state=%u, events=%u", pAsotCfg->state, events);
                     events &= ~Evt_Id_AsotTxMcaspEdma; // clear event
                 }
@@ -553,6 +578,15 @@ Void taskAsopFxn(
                         pAsotCfg->state = ASOT_STATE_SEL_OUT_DEV;          // starting over with Output device selection in case of error
                         break;
                     }
+                    else if (status == ASOP_SOK_INITSYNC_NOTREADY)
+                    {
+                        // FL, New IO: this is only necessary for Wake Timer, POLLING Init-Sync
+                        // FL, New IO: can be removed once Rx ASDT messages are implemented for Init-Sync
+                        
+                        // Dec Reset Init-Sync not ready.
+                        // Remain in current state.
+                        ;
+                    }
                     else
                     {
                         // FL, New IO: 
@@ -566,7 +600,7 @@ Void taskAsopFxn(
                 // Check for unexpected Tx McASP EDMA event
                 if (events & Evt_Id_AsotTxMcaspEdma)
                 {
-                    gInitSyncDecDecode1State_EvtTxMcaspEdma_cnt++; // log event count in state
+                    gInitSyncDecDecode1State_EvtTxMcaspEdma_invCnt++; // log invalid event count in state
                     TRACE_TERSE2("TaskAsop: Tx McASP EDMA event, state=%u, events=%u", pAsotCfg->state, events);
                     events &= ~Evt_Id_AsotTxMcaspEdma; // clear event
                 }
@@ -665,7 +699,7 @@ Void taskAsopFxn(
                     else
                     {
                         // No output device selected (outDevSel == FALSE).
-                        // Staying in same state
+                        // Remain in current state.
                         ;                
                     }
                 }
@@ -798,30 +832,38 @@ static Void resetAfPointers(
     }
 }
 
-// Check if at least one output selected
-Int checkOutDevSel(
+// Check if Output device selected
+static Int checkOutDevSel(
+    PAF_AST_IoOut *pOut,
+    Bool *pOutDevSel
+)
+{
+    *pOutDevSel = (Bool)(pOut->hMcaspChan != NULL);
+    
+    return ASOP_SOK;
+}
+
+// Check if any Output device selected
+static Int checkAnyOutDevSel(
     const PAF_ASOT_Params *pP,
-    PAF_ASOT_Config *pAsotCfg,
-    Bool *pOutSel
+    PAF_AST_IoOut *pOut, 
+    Bool *pOutDevSel
 )
 {
-    PAF_AST_IoOut  *pOut;
-    Int outSel;
+    Bool outDevSel;
     Int z;
 
-    pOut = pAsotCfg->pIoOut; // get pointer to ASOT IO configuration
-
-    outSel = 0;
+    outDevSel = FALSE;
     for (z=OUTPUT1; z < OUTPUTN; z++)
     {
-        if (pOut[z].hIoPhy)
+        if (pOut[z].hMcaspChan)
         {
-            outSel = 1;
+            outDevSel = TRUE;
             break;
         }
     }
 
-    *pOutSel = outSel;
+    *pOutDevSel = outDevSel;
 
     return ASOP_SOK;
 }
@@ -844,7 +886,9 @@ static Int PAF_ASOT_selectDevices(
     PAF_AST_Config *pAstCfg;        // Common (shared) configuration pointer
     Int z;
     Int zS, zO;
+    Int device;
     Int status;
+    Bool ioPhyInit;
     
     pAstCfg = pAsotCfg->pAstCfg;        // get pointer to AST common (shared) configuration
 
@@ -861,33 +905,51 @@ static Int PAF_ASOT_selectDevices(
         }
     }
     
-    // Select Output Devices
-    //  FL, New IO: Placeholder function, this will be reorganized moving forward.
-    //  FL: New IO: API for single Output.
-    //  FL: New IO: Doesn't update Output SIO select.
-    status = asopSelectDevices(&pAsotCfg->pIoOut[zO]);
-    if (status < 0)
-    {
-        *pOutDevSel = FALSE;
-        return status;
-    }
-    
-    // Reset IO Buff & IO Phy
-    //  FL, New IO: API for single Output
-    status = asopIoCompsInit(&pAstCfg->xOut[zO], &pAsotCfg->pIoOut[zO]);
-    if (status < 0)
+    ioPhyInit = asopIoPhyCheckInit(); // check if IO Phy is initialized
+    device = pAstCfg->xOut[zO].outBufStatus.sioSelect; // obtain SIO select for Output
+    if ((ioPhyInit == TRUE) && (device >= 0))
     {
-        *pOutDevSel = FALSE;
-        return status;
-    }
+        // check for valid index into device array
+        if (device >= pQ->devout->n)
+        {
+            device = 0; // treat as device None
+        }
         
-    // I/O physical layer prime operation required by McASP LLD
-    //  FL, New IO: API for single Output
-    asopIoPhyPrime(&pAsotCfg->pIoOut[zO]);
+        if (device > 0)
+        {
+            // Select Output Devices
+            //  FL, New IO: Placeholder function, this will be reorganized moving forward.
+            //  FL: New IO: API for single Output.
+            //  FL: New IO: Doesn't (re-)configure Output driver.
+            status = asopSelectDevices(&pAsotCfg->pIoOut[zO]);
+            if (status < 0)
+            {
+                pAstCfg->xOut[zO].outBufStatus.sioSelect = 0x80;
+                *pOutDevSel = FALSE;
+                return status;
+            }
+            
+            // Reset IO Buff & IO Phy
+            //  FL, New IO: API for single Output
+            status = asopIoCompsInit(&pAstCfg->xOut[zO], &pAsotCfg->pIoOut[zO]);
+            if (status < 0)
+            {
+                pAstCfg->xOut[zO].outBufStatus.sioSelect = 0x80;
+                *pOutDevSel = FALSE;
+                return status;
+            }
+                
+            //// I/O physical layer prime operation required by McASP LLD
+            ////  FL, New IO: API for single Output
+            //asopIoPhyPrime(&pAsotCfg->pIoOut[zO]);
+        }
 
+        pAstCfg->xOut[zO].outBufStatus.sioSelect = device | 0x80;
+    }
+    
     // Check if Output device selected
-    //  FL, New IO: API for multiple Outputs
-    status = checkOutDevSel(pP, pAsotCfg, pOutDevSel);
+    //  FL, New IO: API for single Output
+    status = checkOutDevSel(&pAsotCfg->pIoOut[zO], pOutDevSel);
     if (status < 0)
     {
         *pOutDevSel = FALSE;
@@ -1110,6 +1172,8 @@ static Int PAF_ASOT_initSyncDecDecode1(
     Int zMD;                            // Dec Master index
     PAF_AST_OutInitSyncCtl *pOutIsCtl;  // Output Init-Sync control
     Int8 decFlag;                       // dec stage flag
+    Int z;
+    Int zS, zO;
     Int status;                         // status code
 
     pAstCfg = pAsotCfg->pAstCfg;
@@ -1131,6 +1195,27 @@ static Int PAF_ASOT_initSyncDecDecode1(
     }
     else
     {
+        // Find first Output associated with Master Stream
+        zO = OUTPUT1;
+        for (z=ENCODE1; z < ENCODEN; z++)
+        {
+            zS = pP->streamsFromEncodes[z]; // get Stream associated with Encoder
+            if (zS == pAstCfg->masterStr)
+            {
+                // This Encoder is associated with Master Stream.
+                // Note other Encoder can also be associated with Master Stream.
+                zO = pP->outputsFromEncodes[z]; // get Output associated with Encoder
+            }
+        }
+
+        // FL, New IO: assumption here is Output frame size (output frame size)
+        //             & McASP Tx clock dividers are set correctly (stream)
+        //             before IO prime, i.e. IO prime is not set to default
+        
+        // I/O physical layer prime operation required by McASP LLD
+        //  FL, New IO: API for single Output
+        asopIoPhyPrime(&pAsotCfg->pIoOut[zO]);        
+        
         return ASOP_SOK;
     }
 }
@@ -1145,12 +1230,12 @@ static Int PAF_ASOT_procDecOut(
     Int frame
 )
 {
-    PAF_AST_Config *pAstCfg;            // ASIT/ASOT/ASDT shared configuration
-    Int outDevSelUpdate;    // indicates whether Output SIO selection has changed
+    PAF_AST_Config *pAstCfg;    // ASIT/ASOT/ASDT shared configuration
+    Bool outDevSioSelUpdate;    // indicates whether Output SIO selection has changed
     Int zO, zS;
-    Int z;                  // decode/encode counter
-    Int errno;              // error number
-    Int status;             // status code
+    Int z;                      // decode/encode counter
+    Int errno;                  // error number
+    Int status;                 // status code
     
     status = ASOP_SOK;
     pAstCfg = pAsotCfg->pAstCfg;
@@ -1194,13 +1279,13 @@ static Int PAF_ASOT_procDecOut(
     
     if (status == ASOP_SOK)
     {
-        // Check if at least one Output device SIO selection changed
-        errno = checkOutDevSelUpdate(pP, pAsotCfg, &outDevSelUpdate);
+        // Check if Output device SIO selection changed
+        errno = checkOutDevSioSelUpdate(pP, pAsotCfg, zO, &outDevSioSelUpdate);
         if (errno)
         {
             status = ASOP_ERR_PROCDECOUT_CHKOUTDEVSELUPD;
         }
-        else if (outDevSelUpdate == TRUE)
+        else if (outDevSioSelUpdate == TRUE)
         {
             status = ASOP_ERR_PROCDECOUT_OUTDEVSELUPD;
         }