source: svn/newcon3bcm2_21bu/magnum/portinginterface/ape/7552/bape_i2s_input.c

Last change on this file was 76, checked in by megakiss, 10 years ago

1W 대기전력을 만족시키기 위하여 POWEROFF시 튜너를 Standby 상태로 함

  • Property svn:executable set to *
File size: 24.1 KB
Line 
1/***************************************************************************
2 *     Copyright (c) 2006-2012, Broadcom Corporation
3 *     All Rights Reserved
4 *     Confidential Property of Broadcom Corporation
5 *
6 *  THIS SOFTWARE MAY ONLY BE USED SUBJECT TO AN EXECUTED SOFTWARE LICENSE
7 *  AGREEMENT  BETWEEN THE USER AND BROADCOM.  YOU HAVE NO RIGHT TO USE OR
8 *  EXPLOIT THIS MATERIAL EXCEPT SUBJECT TO THE TERMS OF SUCH AN AGREEMENT.
9 *
10 * $brcm_Workfile: bape_i2s_input.c $
11 * $brcm_Revision: Hydra_Software_Devel/20 $
12 * $brcm_Date: 3/6/12 2:53p $
13 *
14 * Module Description: Audio Decoder Interface
15 *
16 * Revision History:
17 *
18 * $brcm_Log: /magnum/portinginterface/ape/7422/bape_i2s_input.c $
19 *
20 * Hydra_Software_Devel/20   3/6/12 2:53p gskerl
21 * SW7425-2570: Renamed InputPortObject substruct from connector to
22 * inputPort.
23 *
24 * Hydra_Software_Devel/19   3/5/12 9:22a jgarrett
25 * SW7425-2455: Removing ADC and RF Inputs
26 *
27 * Hydra_Software_Devel/18   11/14/11 3:38p gskerl
28 * SW7429-18: Merging 7429 changes back to main branch.
29 *
30 * Hydra_Software_Devel/SW7429-18/2   10/26/11 4:09p jgarrett
31 * SW7429-18: Adding I2S Input for 7429
32 *
33 * Hydra_Software_Devel/SW7429-18/1   10/21/11 6:29p jgarrett
34 * SW7429-18: Initial compileable version for 7429
35 *
36 * Hydra_Software_Devel/17   10/6/11 6:39p gskerl
37 * SW7231-129: Added stub functions for when BAPE_CHIP_MAX_RF_INPUTS is
38 * zero.
39 *
40 * Hydra_Software_Devel/16   10/6/11 6:15p gskerl
41 * SW7231-129: Added support for recovering hardware state after power
42 * standby/resume.
43 *
44 * Hydra_Software_Devel/15   4/16/11 12:15p jgarrett
45 * SW7425-371: Removing tab characters
46 *
47 * Hydra_Software_Devel/14   4/11/11 5:54p jgarrett
48 * SWDTV-6305: Adding ADC/RF Inputs for DTV
49 *
50 * Hydra_Software_Devel/13   4/6/11 1:24a jgarrett
51 * SW35330-35: Merge to main branch
52 *
53 * Hydra_Software_Devel/SW35330-35/1   4/5/11 7:13p jgarrett
54 * SW35330-35: PCM Playback working on 35230
55 *
56 * Hydra_Software_Devel/12   3/22/11 3:07p gskerl
57 * SW7422-146: Reverted last checkin
58 *
59 * Hydra_Software_Devel/11   3/22/11 3:02p gskerl
60 * SW7422-146: Changed audio output connector callbacks to take the output
61 * connector as an argument
62 *
63 * Hydra_Software_Devel/10   3/21/11 7:08p jgarrett
64 * SW7422-356: Adding MuxOutput
65 *
66 * Hydra_Software_Devel/9   3/18/11 6:06p gskerl
67 * SW7422-146: Changed audio input connector callbacks to take the connect
68 * handle as an argument
69 *
70 * Hydra_Software_Devel/8   3/11/11 3:55p gskerl
71 * SW7422-146: Added test code that will change the 7422/7425 pinmux
72 * settings in order to route
73 * pins to the I2S input signals.  The test code must be enabled by
74 * defining
75 * SETUP_PINMUX_FOR_I2S_IN_ON_7422.
76 *
77 * Hydra_Software_Devel/7   3/3/11 6:31p jgarrett
78 * SW7422-146: Adding SRC and DSOLA and path review feedback
79 *
80 * Hydra_Software_Devel/6   3/1/11 3:26p jgarrett
81 * SW7422-146: Moving samlpe rate to input port from input capture
82 *
83 * Hydra_Software_Devel/5   2/22/11 5:43p jgarrett
84 * SW7422-146: Implemented type renaming based on filter graph review
85 * comments
86 *
87 * Hydra_Software_Devel/4   1/26/11 5:38p piyushg
88 * SW7422-146: Add capture configuration settings in Input
89 * enable/disable.
90 *
91 * Hydra_Software_Devel/3   1/21/11 7:32p piyushg
92 * SW7422-146: Initial checkin for I2S input.
93 *
94 * Hydra_Software_Devel/2   1/18/11 11:04a jgarrett
95 * SW7422-146: Adding handle to input open routines
96 *
97 * Hydra_Software_Devel/1   1/12/11 4:24p jgarrett
98 * SW7422-146: Adding additional APIs
99 *
100 ***************************************************************************/
101
102#include "bape.h"
103#include "bape_priv.h"
104
105BDBG_MODULE(bape_i2s_input);
106
107BDBG_OBJECT_ID(BAPE_I2sInput);
108
109typedef struct BAPE_I2sInput
110{
111    BDBG_OBJECT(BAPE_I2sInput)
112    BAPE_Handle deviceHandle;
113    BAPE_I2sInputSettings settings;
114    unsigned index;                 
115    BAPE_InputPortObject inputPort;
116    uint32_t offset; 
117    bool enable;
118    char name[14];   /* I2S Input %d */
119} BAPE_I2sInput;
120
121
122#ifdef BCHP_AUD_FMM_IOP_IN_I2S_STEREO_0_REG_START
123    #include "bchp_aud_fmm_iop_in_i2s_stereo_0.h"
124    #ifdef BCHP_AUD_FMM_IOP_IN_I2S_STEREO_1_REG_START
125        #include "bchp_aud_fmm_iop_in_i2s_stereo_0.h"
126        #define GET_I2S_INPUT_OFFSET(idx) (idx*(BCHP_AUD_FMM_IOP_IN_I2S_STEREO_1_REG_START-BCHP_AUD_FMM_IOP_IN_I2S_STEREO_0_REG_START))
127    #else
128        #define GET_I2S_INPUT_OFFSET(idx) (0)
129    #endif
130#else
131    #ifdef BCHP_AUD_FMM_IOP_CTRL_I2SIN_CFG1
132        #define GET_I2S_INPUT_OFFSET(idx) (idx*(BCHP_AUD_FMM_IOP_CTRL_I2SIN_CFG1-BCHP_AUD_FMM_IOP_CTRL_I2SIN_CFG0))
133    #else
134        #define GET_I2S_INPUT_OFFSET(idx) (0)
135    #endif
136#endif
137
138#if BAPE_CHIP_MAX_I2S_INPUTS > 0
139/* Static function prototypes */
140#if defined BCHP_AUD_FMM_IOP_IN_I2S_STEREO_0_REG_START
141/* 7429 style of registers */
142static void BAPE_I2sInput_P_Enable_IopOut(BAPE_InputPort inputPort);
143static void BAPE_I2sInput_P_Disable_IopOut(BAPE_InputPort inputPort);
144static BERR_Code BAPE_I2sInput_P_ApplySettings_IopOut(BAPE_I2sInputHandle handle, const BAPE_I2sInputSettings *pSettings);
145
146#elif defined BCHP_AUD_FMM_IOP_CTRL_I2SIN_CFG0
147/* Legacy style of registers */
148static void BAPE_I2sInput_P_Enable_Legacy(BAPE_InputPort inputPort);
149static void BAPE_I2sInput_P_Disable_Legacy(BAPE_InputPort inputPort);
150static BERR_Code BAPE_I2sInput_P_ApplySettings_Legacy(BAPE_I2sInputHandle handle, const BAPE_I2sInputSettings *pSettings);
151
152#endif
153
154/* Input port callbacks */
155static void BAPE_I2sInput_P_Enable(BAPE_InputPort inputPort);
156static void BAPE_I2sInput_P_Disable(BAPE_InputPort inputPort);
157#endif
158
159/****  #define SETUP_PINMUX_FOR_I2S_IN_ON_7422   Only defined for testing... changes pinmux settings. */
160#ifdef  SETUP_PINMUX_FOR_I2S_IN_ON_7422
161    static void BAPE_I2sInput_P_SetupPinmuxForI2sTesting( BAPE_Handle deviceHandle );
162    #warning "Compiling with special pinmux code to enable I2S input"
163#endif /* SETUP_PINMUX_FOR_I2S_IN_ON_7422 */
164
165
166/***************************************************************************
167        Public APIs: From bape_input.h
168***************************************************************************/
169void BAPE_I2sInput_GetDefaultSettings(
170    BAPE_I2sInputSettings *pSettings        /* [out] */
171    )
172{
173    BDBG_ASSERT(NULL != pSettings);
174    BKNI_Memset(pSettings, 0, sizeof(*pSettings));
175
176    pSettings->sampleRate = 48000;
177    pSettings->bitsPerSample = 0;
178    pSettings->lrPolarity = BAPE_I2sLRClockPolarity_eLeftLow;
179    pSettings->sclkPolarity = BAPE_I2sSclkPolarity_eFalling;
180    pSettings->dataAlignment = BAPE_I2sDataAlignment_eDelayed;
181    pSettings->justification = BAPE_I2sJustification_eMsbFirst;
182}
183
184/**************************************************************************/
185
186BERR_Code BAPE_I2sInput_Open(
187    BAPE_Handle deviceHandle,
188    unsigned index,
189    const BAPE_I2sInputSettings *pSettings,
190    BAPE_I2sInputHandle *pHandle             /* [out] */
191    )
192{
193#if BAPE_CHIP_MAX_I2S_INPUTS > 0
194    BERR_Code errCode;
195    BAPE_I2sInputHandle handle;
196    BAPE_I2sInputSettings defaultSettings;
197
198    BDBG_OBJECT_ASSERT(deviceHandle, BAPE_Device);
199    BDBG_ASSERT(NULL != pHandle);
200   
201    BDBG_MSG(("%s: Opening I2S Input: %u", __FUNCTION__, index));
202
203    *pHandle = NULL;
204
205    if ( index >= BAPE_CHIP_MAX_I2S_INPUTS )
206    {
207        BDBG_ERR(("Request to open I2S input %d but chip only has %u I2S inputs", index, BAPE_CHIP_MAX_I2S_INPUTS));
208        return BERR_TRACE(BERR_INVALID_PARAMETER);
209    }
210
211    if ( deviceHandle->i2sInputs[index] )
212    {
213        BDBG_ERR(("I2S input %d already open", index));
214        return BERR_TRACE(BERR_INVALID_PARAMETER);
215    }
216
217    #ifdef  SETUP_PINMUX_FOR_I2S_IN_ON_7422
218        BAPE_I2sInput_P_SetupPinmuxForI2sTesting(deviceHandle);
219    #endif /* SETUP_PINMUX_FOR_I2S_IN_ON_7422 */
220
221    /* Allocate the device structure, then fill in all the fields. */
222    handle = BKNI_Malloc(sizeof(BAPE_I2sInput));
223    if ( NULL == handle )
224    {
225        return BERR_TRACE(BERR_OUT_OF_SYSTEM_MEMORY);
226    }
227
228    BKNI_Memset(handle, 0, sizeof(BAPE_I2sInput));
229    BDBG_OBJECT_SET(handle, BAPE_I2sInput);
230    handle->deviceHandle = deviceHandle;
231    handle->index = index;
232    handle->offset = GET_I2S_INPUT_OFFSET(index);
233    BAPE_P_InitInputPort(&handle->inputPort, BAPE_InputPortType_eI2s, index, handle);
234#if defined BCHP_AUD_FMM_IOP_IN_I2S_STEREO_0_REG_START
235    {
236        uint32_t regVal;
237        regVal = BAPE_Reg_P_Read(deviceHandle, handle->offset + BCHP_AUD_FMM_IOP_IN_I2S_STEREO_0_CAPTURE_FCI_ID_TABLE);
238        handle->inputPort.streamId[BAPE_ChannelPair_eLeftRight] = BCHP_GET_FIELD_DATA(regVal, AUD_FMM_IOP_IN_I2S_STEREO_0_CAPTURE_FCI_ID_TABLE, START_FCI_ID);
239    }
240#else
241    handle->inputPort.streamId[BAPE_ChannelPair_eLeftRight] = 4+index;
242#endif
243    handle->inputPort.enable = BAPE_I2sInput_P_Enable;
244    handle->inputPort.disable = BAPE_I2sInput_P_Disable;
245    handle->inputPort.numChannelPairs = 1;
246    handle->inputPort.sampleRate = 48000;
247    BKNI_Snprintf(handle->name, sizeof(handle->name), "I2S Input %u", index);
248    handle->inputPort.pName = handle->name;
249
250
251    /* Init to specified settings */
252    if ( NULL == pSettings )
253    {
254        BAPE_I2sInput_GetDefaultSettings(&defaultSettings);
255        pSettings = &defaultSettings;
256    }
257
258    errCode = BAPE_I2sInput_SetSettings(handle, pSettings);
259    if ( errCode )
260    {
261        BAPE_I2sInput_Close(handle);
262        return BERR_TRACE(errCode);
263    }
264
265    *pHandle = handle;
266    handle->deviceHandle->i2sInputs[index] = handle;
267    return BERR_SUCCESS;
268#else
269    BSTD_UNUSED(deviceHandle);
270    BSTD_UNUSED(index);
271    BSTD_UNUSED(pSettings);
272    BDBG_ASSERT(NULL != pHandle);
273    *pHandle = NULL;
274    return BERR_TRACE(BERR_NOT_SUPPORTED);
275#endif   
276}
277
278/**************************************************************************/
279
280void BAPE_I2sInput_Close(
281    BAPE_I2sInputHandle handle
282    )
283{
284#if BAPE_CHIP_MAX_I2S_INPUTS > 0
285    BDBG_OBJECT_ASSERT(handle, BAPE_I2sInput);
286
287    /* Make sure we're not still connected to anything */
288    if ( handle->inputPort.pConsumer )
289    {
290        BDBG_ERR(("Cannot close I2S input %p (%d), still connected to %s", handle, handle->index, handle->inputPort.pConsumer->pName));
291        BDBG_ASSERT(NULL == handle->inputPort.pConsumer);
292        return;
293    }
294
295    handle->deviceHandle->i2sInputs[handle->index] = NULL;
296    BDBG_OBJECT_DESTROY(handle, BAPE_I2sInput);
297    BKNI_Free(handle);   
298#else
299    BSTD_UNUSED(handle);
300#endif
301}
302
303/**************************************************************************/
304
305void BAPE_I2sInput_GetSettings(
306    BAPE_I2sInputHandle handle,
307    BAPE_I2sInputSettings *pSettings        /* [out] */
308    )
309{
310#if BAPE_CHIP_MAX_I2S_INPUTS > 0
311    BDBG_OBJECT_ASSERT(handle, BAPE_I2sInput);
312    BDBG_ASSERT(NULL != pSettings);
313    *pSettings = handle->settings;
314#else
315    BSTD_UNUSED(handle);
316    BSTD_UNUSED(pSettings);
317#endif
318}
319
320/**************************************************************************/
321
322BERR_Code BAPE_I2sInput_SetSettings(
323    BAPE_I2sInputHandle handle,
324    const BAPE_I2sInputSettings *pSettings
325    )
326{
327#if BAPE_CHIP_MAX_I2S_INPUTS > 0   
328    BERR_Code errCode;
329
330    #if BCHP_AUD_FMM_IOP_IN_I2S_STEREO_0_REG_START
331    errCode = BAPE_I2sInput_P_ApplySettings_IopOut(handle, pSettings);
332    #else
333    errCode = BAPE_I2sInput_P_ApplySettings_Legacy(handle, pSettings);
334    #endif
335    if ( errCode )
336    {
337        return BERR_TRACE(errCode);
338    }
339
340    handle->settings = *pSettings;
341
342    /* Did the sample rate change? */
343    if ( handle->settings.sampleRate != handle->inputPort.sampleRate )
344    {
345        BKNI_EnterCriticalSection();
346        handle->inputPort.sampleRate = handle->settings.sampleRate;
347        BAPE_InputPort_P_FormatChanged_isr(&handle->inputPort);
348        BKNI_LeaveCriticalSection();
349    }
350
351    return BERR_SUCCESS;
352#else
353    BSTD_UNUSED(handle);
354    BSTD_UNUSED(pSettings);
355    return BERR_TRACE(BERR_NOT_SUPPORTED);
356#endif
357}
358
359/**************************************************************************/
360
361void BAPE_I2sInput_GetInputPort(
362    BAPE_I2sInputHandle handle,
363    BAPE_InputPort *pInputPort
364    )
365{
366    BDBG_OBJECT_ASSERT(handle, BAPE_I2sInput);
367    BDBG_ASSERT(NULL != pInputPort);
368    *pInputPort = &handle->inputPort;
369}
370
371/***************************************************************************
372        BAPE Internal APIs: From bape_fmm_priv.h
373***************************************************************************/
374
375BERR_Code BAPE_I2sInput_P_ResumeFromStandby(BAPE_Handle bapeHandle)
376{
377    BERR_Code   errCode = BERR_SUCCESS;
378#if BAPE_CHIP_MAX_I2S_INPUTS > 0
379    unsigned    i2sInputIndex;
380
381    BDBG_OBJECT_ASSERT(bapeHandle, BAPE_Device);
382
383    /* For each opened I2sInput, call the functions necessary to restore the hardware to it's appropriate state. */
384    for ( i2sInputIndex=0 ; i2sInputIndex<BAPE_CHIP_MAX_I2S_INPUTS ; i2sInputIndex++ )
385    {
386        if ( bapeHandle->i2sInputs[i2sInputIndex] )       /* If this I2sInput is open... */
387        {
388            BAPE_I2sInputHandle hI2sInput = bapeHandle->i2sInputs[i2sInputIndex];
389
390            /* Put the HW into the generic open state. */
391                /* Nothing to do here for I2sInput. */
392           
393            /* Now apply changes for the settings struct. */
394            errCode = BAPE_I2sInput_SetSettings(hI2sInput, &hI2sInput->settings);
395            if ( errCode ) return BERR_TRACE(errCode);
396
397            /* Now restore the dynamic stuff from the values saved in the device struct. */
398                /* And nothing to do here either. */
399        }
400    }
401#else
402    BSTD_UNUSED(bapeHandle);
403#endif
404    return errCode;
405}
406
407/***************************************************************************
408        Private callbacks: Protyped above
409***************************************************************************/
410#if BAPE_CHIP_MAX_I2S_INPUTS > 0
411static void BAPE_I2sInput_P_Enable(BAPE_InputPort inputPort)
412{
413#if defined BCHP_AUD_FMM_IOP_IN_I2S_STEREO_0_REG_START
414    BAPE_I2sInput_P_Enable_IopOut(inputPort);
415#else
416    BAPE_I2sInput_P_Enable_Legacy(inputPort);
417#endif
418}
419
420/**************************************************************************/
421
422static void BAPE_I2sInput_P_Disable(BAPE_InputPort inputPort)
423{
424#if defined BCHP_AUD_FMM_IOP_IN_I2S_STEREO_0_REG_START
425    BAPE_I2sInput_P_Disable_IopOut(inputPort);
426#else
427    BAPE_I2sInput_P_Disable_Legacy(inputPort);
428#endif
429}
430
431#if defined BCHP_AUD_FMM_IOP_IN_I2S_STEREO_0_REG_START
432/* 7429 style of registers */
433static void BAPE_I2sInput_P_Enable_IopOut(BAPE_InputPort inputPort)
434{
435    BAPE_I2sInputHandle handle;
436
437    handle = inputPort->pHandle;
438    BDBG_OBJECT_ASSERT(handle, BAPE_I2sInput);
439    BDBG_ASSERT(false == handle->enable);
440
441    BDBG_MSG(("Enabling %s", handle->name));
442
443    BAPE_Reg_P_UpdateField(handle->deviceHandle, 
444                           BCHP_AUD_FMM_IOP_IN_I2S_STEREO_0_CAP_STREAM_CFG_0 + handle->offset,
445                           AUD_FMM_IOP_IN_I2S_STEREO_0_CAP_STREAM_CFG_0,
446                           CAP_ENA,
447                           1);
448
449    handle->enable = true;
450}
451
452static void BAPE_I2sInput_P_Disable_IopOut(BAPE_InputPort inputPort)
453{
454    BAPE_I2sInputHandle handle;
455
456    handle = inputPort->pHandle;
457    BDBG_OBJECT_ASSERT(handle, BAPE_I2sInput);
458    BDBG_ASSERT(true == handle->enable);
459
460    BDBG_MSG(("Disabling %s", handle->name));
461
462    BAPE_Reg_P_UpdateField(handle->deviceHandle, 
463                           BCHP_AUD_FMM_IOP_IN_I2S_STEREO_0_CAP_STREAM_CFG_0 + handle->offset,
464                           AUD_FMM_IOP_IN_I2S_STEREO_0_CAP_STREAM_CFG_0,
465                           CAP_ENA,
466                           0);
467
468    handle->enable = false;
469}
470
471static BERR_Code BAPE_I2sInput_P_ApplySettings_IopOut(BAPE_I2sInputHandle handle, const BAPE_I2sInputSettings *pSettings)
472{
473    BAPE_Reg_P_FieldList regFieldList;
474    uint32_t regAddr;
475
476    BDBG_OBJECT_ASSERT(handle, BAPE_I2sInput);
477    BDBG_ASSERT(NULL != pSettings);
478
479    regAddr = BCHP_AUD_FMM_IOP_IN_I2S_STEREO_0_I2S_IN_CFG + handle->offset;
480    BAPE_Reg_P_InitFieldList(handle->deviceHandle, &regFieldList);
481    BAPE_Reg_P_AddToFieldList(&regFieldList, AUD_FMM_IOP_IN_I2S_STEREO_0_I2S_IN_CFG, BITS_PER_SAMPLE, pSettings->bitsPerSample);
482
483    switch ( pSettings->dataAlignment )
484    {
485    case BAPE_I2sDataAlignment_eAligned:
486        BAPE_Reg_P_AddEnumToFieldList(&regFieldList, AUD_FMM_IOP_IN_I2S_STEREO_0_I2S_IN_CFG, DATA_ALIGNMENT, Aligned);
487        break;
488    case BAPE_I2sDataAlignment_eDelayed:
489        BAPE_Reg_P_AddEnumToFieldList(&regFieldList, AUD_FMM_IOP_IN_I2S_STEREO_0_I2S_IN_CFG, DATA_ALIGNMENT, Delayed);
490        break;
491    default:
492        BDBG_ERR(("Invalid Data Alignment type %d", pSettings->dataAlignment));
493        return BERR_TRACE(BERR_INVALID_PARAMETER);
494    }
495
496    switch ( pSettings->justification )
497    {
498    case BAPE_I2sJustification_eLsbFirst:
499        BAPE_Reg_P_AddEnumToFieldList(&regFieldList, AUD_FMM_IOP_IN_I2S_STEREO_0_I2S_IN_CFG, DATA_JUSTIFICATION, LSB);
500        break;
501    case BAPE_I2sJustification_eMsbFirst:
502        BAPE_Reg_P_AddEnumToFieldList(&regFieldList, AUD_FMM_IOP_IN_I2S_STEREO_0_I2S_IN_CFG, DATA_JUSTIFICATION, MSB);
503        break;
504    default:
505        BDBG_ERR(("Invalid Data Justification type %d", pSettings->justification));
506        return BERR_TRACE(BERR_INVALID_PARAMETER);
507    }
508
509    switch ( pSettings->lrPolarity )
510    {
511    case BAPE_I2sLRClockPolarity_eLeftHigh:
512        BAPE_Reg_P_AddEnumToFieldList(&regFieldList, AUD_FMM_IOP_IN_I2S_STEREO_0_I2S_IN_CFG, LRCK_POLARITY, High_for_left);
513        break;
514    case BAPE_I2sLRClockPolarity_eLeftLow:
515        BAPE_Reg_P_AddEnumToFieldList(&regFieldList, AUD_FMM_IOP_IN_I2S_STEREO_0_I2S_IN_CFG, LRCK_POLARITY, Low_for_left);
516        break;
517    default:
518        BDBG_ERR(("Invalid polarity of the left/right clock %d", pSettings->lrPolarity));
519        return BERR_TRACE(BERR_INVALID_PARAMETER);
520    }
521
522    switch ( pSettings->sclkPolarity )
523    {
524    case BAPE_I2sSclkPolarity_eRising:
525        BAPE_Reg_P_AddEnumToFieldList(&regFieldList, AUD_FMM_IOP_IN_I2S_STEREO_0_I2S_IN_CFG, SCLK_POLARITY, Rising_aligned_with_sdata);
526        break;
527    case BAPE_I2sSclkPolarity_eFalling:
528        BAPE_Reg_P_AddEnumToFieldList(&regFieldList, AUD_FMM_IOP_IN_I2S_STEREO_0_I2S_IN_CFG, SCLK_POLARITY, Falling_aligned_with_sdata);
529        break;
530    default:
531        BDBG_ERR(("Invalid polarity of serial bit clock %d", pSettings->lrPolarity));
532        return BERR_TRACE(BERR_INVALID_PARAMETER);
533    }
534
535    BAPE_Reg_P_ApplyFieldList(&regFieldList, regAddr);
536
537    return BERR_SUCCESS;
538}
539
540#elif defined BCHP_AUD_FMM_IOP_CTRL_I2SIN_CFG0
541/* Legacy style of registers */
542static void BAPE_I2sInput_P_Enable_Legacy(BAPE_InputPort inputPort)
543{
544    BAPE_I2sInputHandle handle;
545    BERR_Code errCode;
546
547    handle = inputPort->pHandle;
548    BDBG_OBJECT_ASSERT(handle, BAPE_I2sInput);
549    BDBG_ASSERT(false == handle->enable);
550
551    BDBG_MSG(("Enabling %s", handle->name));
552
553    errCode = BAPE_Iop_P_EnableCapture(handle->deviceHandle, inputPort->streamId[0], 1);
554    BDBG_ASSERT(BERR_SUCCESS == errCode);
555
556    handle->enable = true;
557}
558
559static void BAPE_I2sInput_P_Disable_Legacy(BAPE_InputPort inputPort)
560{
561    BAPE_I2sInputHandle handle;
562
563    handle = inputPort->pHandle;
564    BDBG_OBJECT_ASSERT(handle, BAPE_I2sInput);
565    BDBG_ASSERT(true == handle->enable);
566
567    BDBG_MSG(("Disabling %s", handle->name));
568
569    BAPE_Iop_P_DisableCapture(handle->deviceHandle, inputPort->streamId[0], 1);
570
571    handle->enable = false;
572}
573
574static BERR_Code BAPE_I2sInput_P_ApplySettings_Legacy(BAPE_I2sInputHandle handle, const BAPE_I2sInputSettings *pSettings)
575{
576    uint32_t regVal, regAddr;
577
578    BDBG_OBJECT_ASSERT(handle, BAPE_I2sInput);
579    BDBG_ASSERT(NULL != pSettings);
580
581    regAddr = BCHP_AUD_FMM_IOP_CTRL_I2SIN_CFG0 + handle->offset;
582    regVal = BREG_Read32(handle->deviceHandle->regHandle, regAddr);
583    regVal &= ~(BCHP_MASK(AUD_FMM_IOP_CTRL_I2SIN_CFG0, DATA_JUSTIFICATION) |
584                BCHP_MASK(AUD_FMM_IOP_CTRL_I2SIN_CFG0, DATA_ALIGNMENT) |
585                BCHP_MASK(AUD_FMM_IOP_CTRL_I2SIN_CFG0, SCLK_POLARITY) |
586                BCHP_MASK(AUD_FMM_IOP_CTRL_I2SIN_CFG0, LRCK_POLARITY) |
587                BCHP_MASK(AUD_FMM_IOP_CTRL_I2SIN_CFG0, BITS_PER_SAMPLE));
588
589    regVal |= BCHP_FIELD_DATA(AUD_FMM_IOP_CTRL_I2SIN_CFG0, BITS_PER_SAMPLE, pSettings->bitsPerSample);
590
591    switch ( pSettings->dataAlignment )
592    {
593    case BAPE_I2sDataAlignment_eAligned:
594        regVal |= BCHP_FIELD_ENUM(AUD_FMM_IOP_CTRL_I2SIN_CFG0, DATA_ALIGNMENT, Aligned);
595        break;
596    case BAPE_I2sDataAlignment_eDelayed:
597        regVal |= BCHP_FIELD_ENUM(AUD_FMM_IOP_CTRL_I2SIN_CFG0, DATA_ALIGNMENT, Delayed);
598        break;
599    default:
600        BDBG_ERR(("Invalid Data Alignment type %d", pSettings->dataAlignment));
601        return BERR_TRACE(BERR_INVALID_PARAMETER);
602    }
603
604    switch ( pSettings->justification )
605    {
606    case BAPE_I2sJustification_eLsbFirst:
607        regVal |= BCHP_FIELD_ENUM(AUD_FMM_IOP_CTRL_I2SIN_CFG0, DATA_JUSTIFICATION, LSB);
608        break;
609    case BAPE_I2sJustification_eMsbFirst:
610        regVal |= BCHP_FIELD_ENUM(AUD_FMM_IOP_CTRL_I2SIN_CFG0, DATA_JUSTIFICATION, MSB);
611        break;
612    default:
613        BDBG_ERR(("Invalid Data Justification type %d", pSettings->justification));
614        return BERR_TRACE(BERR_INVALID_PARAMETER);
615    }
616
617    switch ( pSettings->lrPolarity )
618    {
619    case BAPE_I2sLRClockPolarity_eLeftHigh:
620        regVal |= BCHP_FIELD_ENUM(AUD_FMM_IOP_CTRL_I2SIN_CFG0, LRCK_POLARITY, High_for_left);
621        break;
622    case BAPE_I2sLRClockPolarity_eLeftLow:
623        regVal |= BCHP_FIELD_ENUM(AUD_FMM_IOP_CTRL_I2SIN_CFG0, LRCK_POLARITY, Low_for_left);
624        break;
625    default:
626        BDBG_ERR(("Invalid polarity of the left/right clock %d", pSettings->lrPolarity));
627        return BERR_TRACE(BERR_INVALID_PARAMETER);
628    }
629
630    switch ( pSettings->sclkPolarity )
631    {
632    case BAPE_I2sSclkPolarity_eRising:
633        regVal |= BCHP_FIELD_ENUM(AUD_FMM_IOP_CTRL_I2SIN_CFG0, SCLK_POLARITY, Rising_aligned_with_sdata);
634        break;
635    case BAPE_I2sSclkPolarity_eFalling:
636        regVal |= BCHP_FIELD_ENUM(AUD_FMM_IOP_CTRL_I2SIN_CFG0, SCLK_POLARITY, Falling_aligned_with_sdata);
637        break;
638    default:
639        BDBG_ERR(("Invalid polarity of serial bit clock %d", pSettings->lrPolarity));
640        return BERR_TRACE(BERR_INVALID_PARAMETER);
641    }
642
643    BREG_Write32(handle->deviceHandle->regHandle, regAddr, regVal);
644
645    return BERR_SUCCESS;
646}
647
648#endif
649
650#endif
651
652/***************************************************************************
653        Test code to support I2S testing
654***************************************************************************/
655#ifdef  SETUP_PINMUX_FOR_I2S_IN_ON_7422
656
657#include "bchp_aon_pin_ctrl.h"
658#include "bchp_sun_top_ctrl.h"
659
660static void BAPE_I2sInput_P_SetupPinmuxForI2sTesting( BAPE_Handle deviceHandle )
661{
662    uint32_t    reg;
663
664    /* First, route the I2S0 inputs from somewhere that we can attach to them. It seems that we should be able to get
665     * them from either aon_gpio pins 01,02,03, or aon_gpio pins 10,11,12.
666     */
667    #if 1
668        reg = BREG_Read32(deviceHandle->regHandle,BCHP_AON_PIN_CTRL_PIN_MUX_CTRL_1);
669   
670        reg &=~(    BCHP_MASK(AON_PIN_CTRL_PIN_MUX_CTRL_1, aon_gpio_10 ) |
671                    BCHP_MASK(AON_PIN_CTRL_PIN_MUX_CTRL_1, aon_gpio_11 ) |
672                    BCHP_MASK(AON_PIN_CTRL_PIN_MUX_CTRL_1, aon_gpio_12 ) );
673   
674        reg |=(    BCHP_FIELD_DATA(AON_PIN_CTRL_PIN_MUX_CTRL_1, aon_gpio_10, 4 ) |  /* I2S_CLK0_IN  on J2303/14 (Front panel i/f connector) */
675                   BCHP_FIELD_DATA(AON_PIN_CTRL_PIN_MUX_CTRL_1, aon_gpio_11, 4 ) |  /* I2S_DATA0_IN on J2303/15 (Front panel i/f connector) */
676                   BCHP_FIELD_DATA(AON_PIN_CTRL_PIN_MUX_CTRL_1, aon_gpio_12, 4 ) ); /* I2S_LR0_IN   on J2303/16 (Front panel i/f connector) */
677   
678        BREG_Write32 (deviceHandle->regHandle, BCHP_AON_PIN_CTRL_PIN_MUX_CTRL_1, reg);
679    #else
680        reg = BREG_Read32(deviceHandle->regHandle,BCHP_AON_PIN_CTRL_PIN_MUX_CTRL_0);
681   
682        reg &=~(    BCHP_MASK(AON_PIN_CTRL_PIN_MUX_CTRL_0, aon_gpio_01 ) |
683                    BCHP_MASK(AON_PIN_CTRL_PIN_MUX_CTRL_0, aon_gpio_02 ) |
684                    BCHP_MASK(AON_PIN_CTRL_PIN_MUX_CTRL_0, aon_gpio_03 ) );
685   
686        reg |=(    BCHP_FIELD_DATA(AON_PIN_CTRL_PIN_MUX_CTRL_0, aon_gpio_01, 2 ) |  /* I2S_CLK0_IN  on J2303/10 (Front panel i/f connector) */
687                   BCHP_FIELD_DATA(AON_PIN_CTRL_PIN_MUX_CTRL_0, aon_gpio_02, 2 ) |  /* I2S_DATA0_IN on J2303/11 (Front panel i/f connector) */
688                   BCHP_FIELD_DATA(AON_PIN_CTRL_PIN_MUX_CTRL_0, aon_gpio_03, 2 ) ); /* I2S_LR0_IN   on J2303/12 (Front panel i/f connector) */
689   
690        BREG_Write32 (deviceHandle->regHandle, BCHP_AON_PIN_CTRL_PIN_MUX_CTRL_0, reg);
691    #endif
692}
693#endif /* SETUP_PINMUX_FOR_I2S_IN_ON_7422 */
694
Note: See TracBrowser for help on using the repository browser.