void vSetHdmiHighBitrate(u8 fgHighBitRate)
{
  u8 bData;
  MT8193_AUDIO_FUNC();
  if(fgHighBitRate ==TRUE)
  {
  	bData=bReadByteHdmiGRL(GRL_AOUT_BNUM_SEL);
    bData |= HIGH_BIT_RATE_PACKET_ALIGN;
    vWriteByteHdmiGRL(GRL_AOUT_BNUM_SEL, bData);
     udelay(100);//1ms
    bData=bReadByteHdmiGRL(GRL_AUDIO_CFG);
    bData |= HIGH_BIT_RATE;
    vWriteByteHdmiGRL(GRL_AUDIO_CFG, bData);
  }
  else
  {
  	bData=bReadByteHdmiGRL(GRL_AOUT_BNUM_SEL);
    bData &= ~HIGH_BIT_RATE_PACKET_ALIGN;
    vWriteByteHdmiGRL(GRL_AOUT_BNUM_SEL, bData);
    
  	bData=bReadByteHdmiGRL(GRL_AUDIO_CFG);
    bData &= ~HIGH_BIT_RATE;
    vWriteByteHdmiGRL(GRL_AUDIO_CFG, bData);
  }	
	
	
}	
void vSetHdmiIecI2s(u8 bIn)
{
  u8 bData;	
  MT8193_AUDIO_FUNC();
  if(bIn == SV_SPDIF)	
  {

    bData=bReadByteHdmiGRL(GRL_CFG1);

    if((bData&CFG1_SPDIF)==0)
    {
      bData |= CFG1_SPDIF;
      vWriteByteHdmiGRL(GRL_CFG1, bData);
    }
  }
  else
  {
     bData=bReadByteHdmiGRL(GRL_CFG1);
     if(bData&CFG1_SPDIF)
     {
        bData &= ~CFG1_SPDIF;
        vWriteByteHdmiGRL(GRL_CFG1, bData);
      }
      bData=bReadByteHdmiGRL(GRL_CFG1);
  }	
}	
void vEnableNotice(u8 bOn)
{
	u8 bData;
	MT8193_VIDEO_FUNC();
	if (bOn == TRUE) {
		bData = bReadByteHdmiGRL(GRL_CFG2);
		bData |= 0x40;	/* temp. solve 720p issue. to avoid audio packet jitter problem */
		vWriteByteHdmiGRL(GRL_CFG2, bData);
	} else {
		bData = bReadByteHdmiGRL(GRL_CFG2);
		bData &= ~0x40;
		vWriteByteHdmiGRL(GRL_CFG2, bData);
	}
}
void vEnableHdmiMode(u8 bOn)
{
	u8 bData;
	MT8193_DRV_FUNC();
	if (bOn == TRUE) {
		bData = bReadByteHdmiGRL(GRL_CFG1);
		bData &= ~CFG1_DVI;	/* enable HDMI mode */
		vWriteByteHdmiGRL(GRL_CFG1, bData);
	} else {
		bData = bReadByteHdmiGRL(GRL_CFG1);
		bData |= CFG1_DVI;	/* disable HDMI mode */
		vWriteByteHdmiGRL(GRL_CFG1, bData);
	}

}
void vMiAnUpdateOrFix(u8 bUpdate)
{
	u8 bTemp;
	MT8193_HDCP_FUNC();
	if (bUpdate == TRUE) {
		bTemp = bReadByteHdmiGRL(GRL_CFG1);
		bTemp |= CFG1_HDCP_DEBUG;
		vWriteByteHdmiGRL(GRL_CFG1, bTemp);
	} else {
		bTemp = bReadByteHdmiGRL(GRL_CFG1);
		bTemp &= ~CFG1_HDCP_DEBUG;
		vWriteByteHdmiGRL(GRL_CFG1, bTemp);
	}

}
void vDSTNormalDouble(u8 fgEnable)
{
	u8 bData;
	MT8193_AUDIO_FUNC();
	if (fgEnable) {
		bData = bReadByteHdmiGRL(GRL_AUDIO_CFG);
		bData |= DST_NORMAL_DOUBLE;
		vWriteByteHdmiGRL(GRL_AUDIO_CFG, bData);
	} else {
		bData = bReadByteHdmiGRL(GRL_AUDIO_CFG);
		bData &= ~DST_NORMAL_DOUBLE;
		vWriteByteHdmiGRL(GRL_AUDIO_CFG, bData);
	}

}
void vEnableDSTConfig(u8 fgEnable)
{
	u8 bData;
	MT8193_AUDIO_FUNC();
	if (fgEnable) {
		bData = bReadByteHdmiGRL(GRL_AUDIO_CFG);
		bData |= SACD_DST;
		vWriteByteHdmiGRL(GRL_AUDIO_CFG, bData);
	} else {
		bData = bReadByteHdmiGRL(GRL_AUDIO_CFG);
		bData &= ~SACD_DST;
		vWriteByteHdmiGRL(GRL_AUDIO_CFG, bData);
	}

}
void bReadDataHdmiGRL(u8 bAddr, u8 bCount, u8 *bVal)
{
	u8 i;
	MT8193_HDCP_FUNC();
	for (i = 0; i < bCount; i++)
		*(bVal + i) = bReadByteHdmiGRL(bAddr + i * 4);
}
u8 fgIsISRC2Enable(void)
{
	if (bReadByteHdmiGRL(GRL_ACP_ISRC_CTRL) & ISRC2_EN)
		return TRUE;
	else
		return FALSE;
}
void vHalHDCPReset(void) 
{
  u8 bTemp;
  MT8193_HDCP_FUNC();

  if (fgHostKey())
  {
    bTemp = HDCP_CTL_CP_RSTB | HDCP_CTL_HOST_KEY;
  }
  else
  {
    bTemp = HDCP_CTL_CP_RSTB;
  }
  
  vWriteByteHdmiGRL(GRL_HDCP_CTL, bTemp);
  
  for(bTemp=0; bTemp<5; bTemp++) 
  {                               
    udelay(255);
  } 
 
  bTemp=bReadByteHdmiGRL(GRL_HDCP_CTL);
  bTemp &= (~HDCP_CTL_CP_RSTB);
  
  vWriteByteHdmiGRL(GRL_HDCP_CTL, bTemp);
  
  vSetCTL0BeZero(FALSE);
}
void vTxSignalOnOff(u8 bOn)
{
	u8 bData1;

	MT8193_PLL_FUNC();

	bData1 = bReadByteHdmiGRL(GRL_INT) & INT_MDI;

	if (bOn) {
		vWriteHdmiSYSMsk(HDMI_SYS_AMPCTRL, 0, RG_SET_DTXST);
		/* the 5ms delay time after pll setting , resolve CTS 7-6 can't find trigger and result fail */
		mdelay(5);

		vWriteHdmiSYSMsk(HDMI_SYS_PLLCTRL6, 0, ABIST_MODE_SET_MSK);
		vWriteHdmiSYSMsk(HDMI_SYS_PLLCTRL6, 0, ABIST_MODE_EN | ABIST_LV_EN);

		udelay(20);
		vWriteHdmiSYSMsk(HDMI_SYS_PLLCTRL2, 0, POW_HDMITX | POW_PLL_L);
		udelay(20);
		vWriteHdmiSYSMsk(HDMI_SYS_PLLCTRL2, POW_HDMITX, POW_HDMITX | POW_PLL_L);
		udelay(20);
		vWriteHdmiSYSMsk(HDMI_SYS_PLLCTRL2, POW_HDMITX | POW_PLL_L, POW_HDMITX | POW_PLL_L);
	} else {
		vWriteHdmiSYSMsk(HDMI_SYS_AMPCTRL, 0, RG_SET_DTXST);
		vWriteHdmiSYSMsk(HDMI_SYS_PLLCTRL1, 0, RG_ENCKST);
		vWriteHdmiSYSMsk(HDMI_SYS_PLLCTRL6, ABIST_MODE_SET, ABIST_MODE_SET_MSK);
		vWriteHdmiSYSMsk(HDMI_SYS_PLLCTRL6, ABIST_MODE_EN | ABIST_LV_EN,
				 ABIST_MODE_EN | ABIST_LV_EN);
		vWriteHdmiSYSMsk(HDMI_SYS_PLLCTRL7, 0, TX_DRV_ENABLE_MSK);
	}
	if ((bData1 != INT_MDI))
		bClearGRLInt(INT_MDI);
}
void MuteHDMIAudio(void)
{
	u8 bData;
	MT8193_AUDIO_FUNC();
	bData = bReadByteHdmiGRL(GRL_AUDIO_CFG);
	bData |= AUDIO_ZERO;
	vWriteByteHdmiGRL(GRL_AUDIO_CFG, bData);
}
void vEnableIecTxRaw(void)
{
	u8 bData;
	MT8193_AUDIO_FUNC();
	bData = bReadByteHdmiGRL(GRL_MIX_CTRL);
	bData |= MIX_CTRL_FLAT;
	vWriteByteHdmiGRL(GRL_MIX_CTRL, bData);
}
u8 bReadHdmiIntMask(void)
{
	u8 bMask;
	MT8193_HDCP_FUNC();
	bMask = bReadByteHdmiGRL(GRL_INT_MASK);
	return bMask;

}
u8 bReadHDCPStatus(void)
{
	u8 bTemp;
	MT8193_HDCP_FUNC();
	bTemp = bReadByteHdmiGRL(GRL_HDCP_STA);

	return bTemp;
}
void vEnableHashHardwrae(void)
{
	u8 bData;
	MT8193_HDCP_FUNC();
	bData = bReadByteHdmiGRL(GRL_HDCP_CTL);
	bData |= HDCP_CTL_SHA_EN;
	vWriteByteHdmiGRL(GRL_HDCP_CTL, bData);
}
void vSetCTL0BeZero(u8 fgBeZero)
{
	u8 bTemp;

	MT8193_VIDEO_FUNC();

	if (fgBeZero == TRUE) {
		bTemp = bReadByteHdmiGRL(GRL_CFG1);
		bTemp |= (1 << 4);
		vWriteByteHdmiGRL(GRL_CFG1, bTemp);
	} else {
		bTemp = bReadByteHdmiGRL(GRL_CFG1);
		bTemp &= ~(1 << 4);
		vWriteByteHdmiGRL(GRL_CFG1, bTemp);
	}

}
void vStopAn(void)
{
	u8 bTemp;
	MT8193_HDCP_FUNC();
	bTemp = bReadByteHdmiGRL(GRL_HDCP_CTL);
	bTemp |= HDCP_CTL_AN_STOP;
	vWriteByteHdmiGRL(GRL_HDCP_CTL, bTemp);

}
void vEnableEncrpt(void)
{
	u8 bTemp;
	MT8193_HDCP_FUNC();
	bTemp = bReadByteHdmiGRL(GRL_HDCP_CTL);
	bTemp |= HDCP_CTL_ENC_EN;
	vWriteByteHdmiGRL(GRL_HDCP_CTL, bTemp);

}
void vDisableDsdConfig(void)
{
	u8 bData;
	MT8193_AUDIO_FUNC();
	bData = bReadByteHdmiGRL(GRL_AUDIO_CFG);
	bData &= ~SACD_SEL;
	vWriteByteHdmiGRL(GRL_AUDIO_CFG, bData);

}
u8 bReadGRLInt(void)
{
	u8 bStatus;
	MT8193_DRV_FUNC();

	bStatus = bReadByteHdmiGRL(GRL_INT);

	return bStatus;
}
void vEnableNCTSAutoWrite(void)
{
	u8 bData;
	MT8193_AUDIO_FUNC();
	bData = bReadByteHdmiGRL(GRL_DIVN);
	bData |= NCTS_WRI_ANYTIME;	/* enabel N-CTS can be written in any time */
	vWriteByteHdmiGRL(GRL_DIVN, bData);

}
u8 fgHostKey(void)
{
	u8 bTemp;

	MT8193_HDCP_FUNC();
	bTemp = bReadByteHdmiGRL(GRL_HDCP_CTL);
	vWriteByteHdmiGRL(GRL_HDCP_CTL, bTemp | HDCP_CTL_HOST_KEY);
	return TRUE;
}
void UnMuteHDMIAudio(void)
{
	BYTE bData;
	MT8193_AUDIO_FUNC();

	bData = bReadByteHdmiGRL(GRL_AUDIO_CFG);
	bData &= ~AUDIO_ZERO;
	vWriteByteHdmiGRL(GRL_AUDIO_CFG, bData);
}
u8 vIsDviMode(void)
{
	u8 bData;

	bData = bReadByteHdmiGRL(GRL_CFG1);
	if (bData & CFG1_DVI)
		return TRUE;
	else
		return FALSE;
}
void vReadAksvFromReg(BYTE *PrBuff)
{
	u8 bTemp, i;
	MT8193_HDCP_FUNC();
	for (i = 0; i < 5; i++)	/* AKSV count 5 bytes */
	{
		bTemp = bReadByteHdmiGRL(GRL_RD_AKSV0 + i * 4);
		*(PrBuff + i) = bTemp;
	}
}
void vEnableAuthHardware(void)
{
	u8 bTemp;
	MT8193_HDCP_FUNC();
	bTemp = bReadByteHdmiGRL(GRL_HDCP_CTL);
	bTemp |= HDCP_CTL_AUTHEN_EN;

	vWriteByteHdmiGRL(GRL_HDCP_CTL, bTemp);

}
u8 bCheckStatus(u8 bMode)
{
	u8 bStatus = 0;
	MT8193_PLUG_FUNC();
	bStatus = bReadByteHdmiGRL(GRL_STATUS);

	if ((bStatus & bMode) == bMode) {
		return TRUE;
	} else {
		return FALSE;
	}
}
void vAudioPacketOff(u8 bOn)
{
	u8 bData;
	MT8193_AUDIO_FUNC();
	bData = bReadByteHdmiGRL(GRL_SHIFT_R2);
	if (bOn)
		bData |= 0x40;
	else
		bData &= ~0x40;

	vWriteByteHdmiGRL(GRL_SHIFT_R2, bData);
}
u8 bCheckHDCPStatus(u8 bMode)
{
	u8 bStatus = 0;
	MT8193_HDCP_FUNC();
	bStatus = bReadByteHdmiGRL(GRL_HDCP_STA);

	bStatus &= bMode;
	if (bStatus) {
		vWriteByteHdmiGRL(GRL_HDCP_STA, bMode);
		return TRUE;
	} else {
		return FALSE;
	}
}