/**
* a basic function fo AnalogOpen, open analog power
* @param DeviceType analog part power
* @return status_t
*/
status_t AudioPlatformDevice::AnalogOpen(AudioAnalogType::DEVICE_TYPE DeviceType)
{
    ALOGD("AudioPlatformDevice AnalogOpen DeviceType = %s ", kAudioAnalogDeviceTypeName[DeviceType]);
    uint32 ulFreq, dlFreq;
    mLock.lock();
    if (mBlockAttribute[DeviceType].mEnable == true)
    {
        ALOGW("AudioPlatformDevice AnalogOpen bypass with DeviceType = %d", DeviceType);
        mLock.unlock();
        return NO_ERROR;;
    }
    mBlockAttribute[DeviceType].mEnable = true;
    // here to open pmic digital part
    ulFreq = GetULFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_IN_ADC]);
    dlFreq = GetDLFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_OUT_DAC]);

    switch (DeviceType)
    {
        case AudioAnalogType::DEVICE_OUT_EARPIECER:
        case AudioAnalogType::DEVICE_OUT_EARPIECEL:
#if 0
            mAudioAnalogReg->SetAnalogReg(TOP_CKPDN1_CLR, 0x0100, 0x0100);      // AUD 26M clock power down release
            mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON1 , GetDLFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_OUT_DAC]), 0x000f);
            mAudioAnalogReg->SetAnalogReg(AFE_PMIC_NEWIF_CFG0 , GetDLNewIFFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_OUT_DAC]) << 12, 0xf000);
            TopCtlChangeTrigger();
            mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON5 , 0x28, 0x003f); //Use Default SDM Gain 0x28/0x3f = 0.63
            mAudioAnalogReg->SetAnalogReg(ABB_AFE_TOP_CON0 , 0, 0xffff); //Use Normal Path
            mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON2 , 0, 0xffff); //Use Normal Path
            mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON0 , 1, 0x0001); //Enable DL path
            TopCtlChangeTrigger();
#else
            mAudioAnalogReg->SetAnalogReg(TOP_CKPDN1_CLR, 0x0100, 0x0100);      // AUD 26M clock power down release
            mAudioAnalogReg->SetAnalogReg(AFE_PMIC_NEWIF_CFG0, GetDLNewIFFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_OUT_DAC]) << 12 | 0x330, 0xffff); // config up8x_rxif
            mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON1, dlFreq, 0x000f); // DL sampling rate
            TopCtlChangeTrigger();
            mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON0, 0x0001, 0x0001);                       // turn on DL
#endif

            break;

        case AudioAnalogType::DEVICE_OUT_HEADSETR:
        case AudioAnalogType::DEVICE_OUT_HEADSETL:
#if 0
            mAudioAnalogReg->SetAnalogReg(TOP_CKPDN1_CLR, 0x0100, 0x0100);      // AUD 26M clock power down release
            mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON1 , GetDLFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_OUT_DAC]), 0x000f);
            mAudioAnalogReg->SetAnalogReg(AFE_PMIC_NEWIF_CFG0 , GetDLNewIFFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_OUT_DAC]) << 12, 0xf000);
            TopCtlChangeTrigger();
            mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON5 , 0x28, 0x003f); //Use Default SDM Gain 0x28/0x3f = 0.63
            mAudioAnalogReg->SetAnalogReg(ABB_AFE_TOP_CON0 , 0, 0xffff); //Use Normal Path
            mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON2 , 0, 0xffff); //Use Normal Path
            mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON0 , 1, 0x0001); //Enable DL path
            TopCtlChangeTrigger();
#else
            mAudioAnalogReg->SetAnalogReg(TOP_CKPDN1_CLR, 0x0100, 0x0100);      // AUD 26M clock power down release
            mAudioAnalogReg->SetAnalogReg(AFE_PMIC_NEWIF_CFG0, GetDLNewIFFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_OUT_DAC]) << 12 | 0x330, 0xffff); // config up8x_rxif
            mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON1, dlFreq, 0x000f); // DL sampling rate
            //DC compensation setting
            ALOGD("AnalogOpen mHpRightDcCalibration [0x%x] mHpLeftDcCalibration [0x%x]", mHpRightDcCalibration, mHpLeftDcCalibration);
            mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON3, mHpLeftDcCalibration, 0xffff); // LCH cpmpensation value
            mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON4, mHpRightDcCalibration, 0xffff); // RCH cpmpensation value
            mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON10, 0x0001, 0x0001); // enable DC cpmpensation
            DCChangeTrigger();//Trigger DC compensation
            TopCtlChangeTrigger();
            mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON0, 0x0001, 0x0001);  // turn on DL
#endif
            break;
        case AudioAnalogType::DEVICE_OUT_SPEAKERR:
        case AudioAnalogType::DEVICE_OUT_SPEAKERL:
#ifdef USING_EXTAMP_HP
            mLock.unlock();
            AnalogOpen(AudioAnalogType::DEVICE_OUT_HEADSETR);
            mLock.lock();
#else
            mLock.unlock();
            AnalogOpen(AudioAnalogType::DEVICE_OUT_EARPIECER);
            mLock.lock();
#endif

            break;
        case AudioAnalogType::DEVICE_OUT_SPEAKER_HEADSET_R:
        case AudioAnalogType::DEVICE_OUT_SPEAKER_HEADSET_L:
            mLock.unlock();
            AnalogOpen(AudioAnalogType::DEVICE_OUT_HEADSETR);
            mLock.lock();
            break;
        case AudioAnalogType::DEVICE_IN_ADC1:
        case AudioAnalogType::DEVICE_IN_ADC2:
            ALOGD("AudioPlatformDevice::DEVICE_IN_ADC2:");
#if 0
            mAudioAnalogReg->SetAnalogReg(TOP_CKPDN1_CLR, 0x0100, 0x0100);      // AUD 26M clock power down release
            mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON1 , GetULFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_IN_ADC]) << 4, 0x0010);
            mAudioAnalogReg->SetAnalogReg(AFE_PMIC_NEWIF_CFG2, 0x302F | (GetULNewIFFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_IN_ADC]) << 10), 0xffff); // config UL up8x_rxif adc voice mode
            TopCtlChangeTrigger();
            mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON0 , 0x02, 0x0002); //Enable UL path
            TopCtlChangeTrigger();
#else
            mAudioAnalogReg->SetAnalogReg(TOP_CKPDN1_CLR, 0x0100, 0x0100);      // AUD 26M clock power down release
            mAudioAnalogReg->SetAnalogReg(AFE_PMIC_NEWIF_CFG2, 0x302F | (GetULNewIFFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_IN_ADC]) << 10), 0xffff); // config UL up8x_rxif adc voice mode
            mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON1, GetULFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_IN_ADC]) << 4, 0x0010); // UL sampling rate
            TopCtlChangeTrigger();
            mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON0, 0x0002, 0x0002);  // turn on UL
#endif

            break;
        case AudioAnalogType::DEVICE_IN_DIGITAL_MIC:
#if 0
            mAudioAnalogReg->SetAnalogReg(TOP_CKPDN1_CLR, 0x0100, 0x0100);      // AUD 26M clock power down release
            mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON1 , GetULFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_IN_ADC]), 0x0010);
            mAudioAnalogReg->SetAnalogReg(AFE_PMIC_NEWIF_CFG2, 0x302F | (GetULNewIFFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_IN_ADC]) << 10), 0xffff); // config UL up8x_rxif adc voice mode
            TopCtlChangeTrigger();
            mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON9 , 0x0011, 0x0011); // enable digital mic, 3.25M clock rate
            mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON0 , 0x02, 0x0002); //Enable UL path
            TopCtlChangeTrigger();
#else
            mAudioAnalogReg->SetAnalogReg(TOP_CKPDN1_CLR, 0x0100, 0x0100);      // AUD 26M clock power down release
            mAudioAnalogReg->SetAnalogReg(AFE_PMIC_NEWIF_CFG2, 0x302F | (GetULNewIFFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_IN_ADC]) << 10), 0xffff); // config UL up8x_rxif adc voice mode
            mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON1, GetULFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_IN_ADC]) << 4, 0x0010); // UL sampling rate
            TopCtlChangeTrigger();
            mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON9, 0x0011, 0x0011);  // enable digital mic, 3.25M clock rate
            mAudioAnalogReg->SetAnalogReg(ABB_AFE_CON0, 0x0002, 0x0002);  // turn on UL
#endif

            break;
        case AudioAnalogType::DEVICE_2IN1_SPK:
            if (IsAudioSupportFeature(AUDIO_SUPPORT_2IN1_SPEAKER))
            {
                mLock.unlock();
                AnalogOpen(AudioAnalogType::DEVICE_OUT_EARPIECER);
                mLock.lock();
            }
            break;
    }
    mLock.unlock();
    return NO_ERROR;
}
/**
* a basic function fo AnalogOpen, open analog power
* @param DeviceType analog part power
* @return status_t
*/
status_t AudioPlatformDevice::AnalogOpen(AudioAnalogType::DEVICE_TYPE DeviceType)
{
    ALOGD("AudioPlatformDevice DeviceType = %s", kAudioAnalogDeviceTypeName[DeviceType]);
    mLock.lock ();
    if(mBlockAttribute[DeviceType].mEnable == true)
    {
        ALOGW("AudioPlatformDevice AnalogOpen with DeviceType = %d",DeviceType);
        mLock.unlock ();
        return NO_ERROR;;
    }
    mBlockAttribute[DeviceType].mEnable = true;

    switch(DeviceType)
    {
        case AudioAnalogType::DEVICE_OUT_EARPIECER:
        case AudioAnalogType::DEVICE_OUT_EARPIECEL:
            mAudioAnalogReg->SetAnalogReg(0x0106 ,0x0003,0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4038 ,0x0006,0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4034 ,0xc3a1,0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4038 ,0x0003,0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4038 ,0x000b,0xffff);
            mAudioAnalogReg->SetAnalogReg(0x400C , 0x001e, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4002 , 0x0300 | GetDLFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_OUT_DAC]), 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4000 , 0x007f, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4004 , 0x1801, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4006 , 0x0000, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4012 , 0x00e1, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4024 , 0x0000, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4022 , 0x004f, 0xffff);
            break;

        case AudioAnalogType::DEVICE_OUT_HEADSETR:
        case AudioAnalogType::DEVICE_OUT_HEADSETL:
            mAudioAnalogReg->SetAnalogReg(0x0106 , 0x0003, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4038 , 0x0006, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4034 , 0xc3a1, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4038 , 0x0003, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4038 , 0x000b, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x400C , 0x001e, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4002 , 0x0300 | GetDLFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_OUT_DAC]), 0x0ffff);
            mAudioAnalogReg->SetAnalogReg(0x4000 , 0x007f, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4004 , 0x1801, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4006 , 0x0000, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4012 , 0x00e1, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4024 , 0x0000, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4022 , 0x004f, 0xffff);

            break;
        case AudioAnalogType::DEVICE_OUT_SPEAKERR:
        case AudioAnalogType::DEVICE_OUT_SPEAKERL:
            #ifdef USING_EXTAMP_HP
            mLock.unlock ();
            AnalogOpen(AudioAnalogType::DEVICE_OUT_HEADSETR);
            mLock.lock ();

            #else
            mAudioAnalogReg->SetAnalogReg(0x0106 , 0x0607, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4038 , 0x0006, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4034 , 0xc3a1, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4038 , 0x0003, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4038 , 0x000b, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x400C , 0x001e, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4002 , 0x0300 | GetDLFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_OUT_DAC]), 0x0ffff);
            mAudioAnalogReg->SetAnalogReg(0x4000 , 0x007f, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4004 , 0x1801, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4006 , 0x0000, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4012 , 0x00e1, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4024 , 0x0000, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4022 , 0x004f, 0xffff);
            #endif

            break;
        case AudioAnalogType::DEVICE_OUT_SPEAKER_HEADSET_R:
        case AudioAnalogType::DEVICE_OUT_SPEAKER_HEADSET_L:
            mAudioAnalogReg->SetAnalogReg(0x0106 , 0x0607, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4038 , 0x0006, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4034 , 0xc3a1, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4038 , 0x0003, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4038 , 0x000b, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x400C , 0x001e, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4002 , 0x0300 | GetDLFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_OUT_DAC]), 0x0ffff);
            mAudioAnalogReg->SetAnalogReg(0x4000 , 0x007f, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4004 , 0x1801, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4006 , 0x0000, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4012 , 0x00e1, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4024 , 0x0000, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4022 , 0x004f, 0xffff);
            break;
        case AudioAnalogType::DEVICE_IN_ADC1:
        case AudioAnalogType::DEVICE_IN_ADC2:
            ALOGD("AudioPlatformDevice::DEVICE_IN_ADC2:");
            mAudioAnalogReg->SetAnalogReg(0x0106 ,0x0003,0xffff);

            mAudioAnalogReg->SetAnalogReg(0x0712 ,0x0000,0x0002);
            mAudioAnalogReg->SetAnalogReg(0x4010 ,0x0000,0xffff);
            mAudioAnalogReg->SetAnalogReg(0x0712 ,0x0002,0x0002);

            mAudioAnalogReg->SetAnalogReg(0x4026 ,0x0000,0xffff);
            mAudioAnalogReg->SetAnalogReg(0x400e ,0x0000|GetULFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_IN_ADC]),0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4000 ,0x007f,0xffff);
#ifdef MTK_AUDIO_HD_REC_SUPPORT
            mAudioAnalogReg->SetAnalogReg(0x4010 ,0x0201,0xffff);
#else
            mAudioAnalogReg->SetAnalogReg(0x4010 ,0x0601,0xffff);
#endif
            mAudioAnalogReg->SetAnalogReg(0x4020 ,0x004f,0xffff);

            usleep(600);
            mAudioAnalogReg->SetAnalogReg(0x400e ,0x0000,0xffff);
            usleep(600);
            mAudioAnalogReg->SetAnalogReg(0x400e ,0x0000|GetULFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_IN_ADC]),0xffff);
            usleep(600);
            mAudioAnalogReg->SetAnalogReg(0x4010 ,0x0000,0xffff);
            usleep(600);

#ifdef MTK_AUDIO_HD_REC_SUPPORT
            mAudioAnalogReg->SetAnalogReg(0x4010 ,0x0201,0xffff);
#else
            mAudioAnalogReg->SetAnalogReg(0x4010 ,0x0601,0xffff);
#endif
            break;
        case AudioAnalogType::DEVICE_IN_DIGITAL_MIC:
            mAudioAnalogReg->SetAnalogReg(0x0106 ,0x0003,0xffff);
            mAudioAnalogReg->SetAnalogReg(0x0712 ,0x0000,0x0002);
            mAudioAnalogReg->SetAnalogReg(0x4010 ,0x0000,0xffff);

            mAudioAnalogReg->SetAnalogReg(0x4026 ,0x0000,0xffff);
            mAudioAnalogReg->SetAnalogReg(0x400e ,0x00e0|GetULFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_IN_ADC]),0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4000 , 0x007f, 0xffff);
#ifdef MTK_AUDIO_HD_REC_SUPPORT
            mAudioAnalogReg->SetAnalogReg(0x4010 ,0x0023,0xffff);
#else
            mAudioAnalogReg->SetAnalogReg(0x4010 ,0x0423,0xffff);
#endif
            mAudioAnalogReg->SetAnalogReg(0x4020 ,0x004f,0xffff);

            // reset to default samplerate
            usleep(600);
            mAudioAnalogReg->SetAnalogReg(0x400e ,0x00e0,0xffff);
            usleep(600);
            mAudioAnalogReg->SetAnalogReg(0x400e ,0x00e0|GetULFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_IN_ADC]),0xffff);
            usleep(600);

            break;
        case AudioAnalogType::DEVICE_2IN1_SPK:
            mAudioAnalogReg->SetAnalogReg(0x0106 , 0x0607, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4038 , 0x0006, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4034 , 0xc3a1, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4038 , 0x0003, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4038 , 0x000b, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x400C , 0x001e, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4002 , 0x0300 | GetDLFrequency(mBlockSampleRate[AudioAnalogType::DEVICE_OUT_DAC]), 0x0ffff);
            mAudioAnalogReg->SetAnalogReg(0x4000 , 0x007f, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4004 , 0x1801, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4006 , 0x0000, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4012 , 0x00e1, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4024 , 0x0000, 0xffff);
            mAudioAnalogReg->SetAnalogReg(0x4022 , 0x004f, 0xffff);
            break;
    }
    mLock.unlock ();
    return NO_ERROR;
}