/*============================================================================*/ tmErrorCode_t setHwRegisters ( tmHdmiTxobject_t *pDis, UInt16 regShadPageAddr, UInt8 *pData, UInt16 lenData ) { tmErrorCode_t err; /* Error code */ UInt8 regShad; /* The index to the register's shadow copy */ UInt8 regPage; /* The index to the register's page */ UInt8 regAddr; /* The register's address on the page */ UInt8 newRegPage; /* The register's new page number */ tmbslHdmiTxSysArgs_t sysArgs; /* Arguments passed to system function */ /* Unpack 1st register's shadow index, page index and address */ regShad = SPA2SHAD(regShadPageAddr); regPage = SPA2PAGE(regShadPageAddr); regAddr = SPA2ADDR(regShadPageAddr); newRegPage = kPageIndexToPage[regPage]; /* Check length does not overflow page */ RETIF_BADPARAM((regAddr+lenData) > E_REG_CURPAGE_ADR_W) /* Check 1st reg does not have a shadow - whole range assumed likewise */ RETIF_BADPARAM(regShad != E_SNONE) /* Set page register if required - whole range is on same page */ if (pDis->curRegPage != newRegPage) { /* All non-OK results are errors */ sysArgs.slaveAddr = pDis->uHwAddress; sysArgs.firstRegister = E_REG_CURPAGE_ADR_W; sysArgs.lenData = 1; sysArgs.pData = &newRegPage; err = pDis->sysFuncWrite(&sysArgs); RETIF(err != TM_OK, TMBSL_ERR_HDMI_I2C_WRITE) pDis->curRegPage = newRegPage; } /* Write to I2C register range - all non-OK results are errors */ sysArgs.slaveAddr = pDis->uHwAddress; sysArgs.firstRegister = regAddr; sysArgs.lenData = (UInt8)lenData; sysArgs.pData = pData; err = pDis->sysFuncWrite(&sysArgs); if (err == TM_OK) { return TM_OK; } else { printk(KERN_ERR "[HDMI] TMBSL_ERR_HDMI_I2C_WRITE %s %d\n",__func__,__LINE__); return TMBSL_ERR_HDMI_I2C_WRITE; } }
/*============================================================================*/ tmErrorCode_t tmbslTDA9989EdidGetAudioCapabilities (tmUnitSelect_t txUnit, tmbslHdmiTxEdidSad_t *pEdidAFmts, UInt aFmtLength, UInt *pAFmtsAvail, UInt8 *pAudioFlags) { tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ tmErrorCode_t err; /* Error code */ UInt i; /* Loop index */ /* Check unit parameter and point to TX unit object */ err = checkUnitSetDis(txUnit, &pDis); RETIF(err != TM_OK, err) /* Check remaining parameter(s) */ RETIF_BADPARAM(pEdidAFmts == Null) RETIF_BADPARAM(aFmtLength < 1) RETIF_BADPARAM(pAFmtsAvail == Null) RETIF_BADPARAM(pAudioFlags == Null) if ((pDis->EdidStatus == HDMITX_EDID_READ) || (pDis->EdidStatus == HDMITX_EDID_ERROR_CHK)) { /* allow if edid are read or if there are a chk error on an other block than block 0 */ /* Copy the Device Instance Structure EdidAFmts descriptors to * pEdidAFmts until we run out or no more space in structure. */ if (pDis->EdidSadCnt > 0) { for (i = 0; (i < (UInt) pDis->EdidSadCnt) && (i < aFmtLength); i++) { pEdidAFmts[i].ModeChans = pDis->EdidAFmts[i].ModeChans; pEdidAFmts[i].Freqs = pDis->EdidAFmts[i].Freqs; pEdidAFmts[i].Byte3 = pDis->EdidAFmts[i].Byte3; } } else { /* No pEdidAFmts to copy so set a zero format to be safe */ pEdidAFmts[0].ModeChans = 0; pEdidAFmts[0].Freqs = 0; pEdidAFmts[0].Byte3 = 0; } /* Fill Audio Flags parameter */ *pAudioFlags = ((pDis->EdidCeaFlags & 0x40) << 1); /* Basic audio */ if (pDis->EdidSinkAi == True) { *pAudioFlags += 0x40; /* Mask in AI support */ } /* Fill number of SADs available parameter */ *pAFmtsAvail = pDis->EdidSadCnt; } else { /* Not allowed if EdidStatus value is not valid */ err = TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE; } return err; }
/*============================================================================*/ tmErrorCode_t lmemcpy ( void *pTable1, const void * pTable2, UInt Size ) { char *ptrSource = (char*) pTable1; char *endSource = (char*)pTable1 + Size; char *ptrDest = (char *)pTable2; RETIF_BADPARAM(pTable1 == Null) RETIF_BADPARAM(pTable2 == Null) while (endSource > ptrSource) { *(ptrSource++) = *(ptrDest++); } return TM_OK; }
/*============================================================================*/ tmErrorCode_t tmbslTDA9989EdidGetStatus(tmUnitSelect_t txUnit, UInt8 *puEdidStatus) { tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ tmErrorCode_t err; /* Error code */ /* Check unit parameter and point to TX unit object */ err = checkUnitSetDis(txUnit, &pDis); RETIF(err != TM_OK, err) /* Check remaining parameter(s) */ RETIF_BADPARAM(puEdidStatus == Null) if (puEdidStatus) { *puEdidStatus = pDis->EdidStatus; } return err; }
/*============================================================================*/ tmErrorCode_t tmbslTDA9989EdidGetBlockCount(tmUnitSelect_t txUnit, UInt8 *puEdidBlockCount) { tmHdmiTxobject_t *pDis; /* Pointer to Device Instance Structure */ tmErrorCode_t err; /* Error code */ /* Check unit parameter and point to TX unit object */ err = checkUnitSetDis(txUnit, &pDis); RETIF(err != TM_OK, err) /* Check remaining parameter(s) */ RETIF_BADPARAM(puEdidBlockCount == Null) if ((pDis->EdidStatus == HDMITX_EDID_READ) || (pDis->EdidStatus == HDMITX_EDID_ERROR_CHK)) { /* allow if edid are read or if there are a chk error on an other block than block 0 */ *puEdidBlockCount = pDis->EdidBlockCnt; } else { /* Not allowed if EdidStatus value is not valid */ err = TMBSL_ERR_HDMI_RESOURCE_NOT_AVAILABLE; } return err; }
/*============================================================================*/ tmErrorCode_t tmbslTDA9989HwGetCapabilities (tmUnitSelect_t txUnit, tmbslHdmiTxHwFeature_t deviceCapability, Bool *pFeatureSupported) { tmHdmiTxobject_t *pDis; tmErrorCode_t err = TM_OK; /* Check unit parameter and point to its object */ err = checkUnitSetDis(txUnit, &pDis); RETIF(err != TM_OK, err) RETIF_BADPARAM(pFeatureSupported == Null) * pFeatureSupported = False; switch (deviceCapability) { case HDMITX_FEATURE_HW_HDCP: if ((pDis->uDeviceFeatures & E_MASKREG_P00_VERSION_not_h) == 0) { *pFeatureSupported = True; } break; case HDMITX_FEATURE_HW_SCALER: if ((pDis->uDeviceFeatures & E_MASKREG_P00_VERSION_not_s) == 0) { *pFeatureSupported = True; } break; case HDMITX_FEATURE_HW_AUDIO_OBA: *pFeatureSupported = True; break; case HDMITX_FEATURE_HW_AUDIO_DST: *pFeatureSupported = False; break; case HDMITX_FEATURE_HW_AUDIO_HBR: *pFeatureSupported = False; break; case HDMITX_FEATURE_HW_HDMI_1_1: *pFeatureSupported = True; break; case HDMITX_FEATURE_HW_HDMI_1_2A: *pFeatureSupported = True; break; case HDMITX_FEATURE_HW_HDMI_1_3A: *pFeatureSupported = False; break; case HDMITX_FEATURE_HW_DEEP_COLOR_30: *pFeatureSupported = False; break; case HDMITX_FEATURE_HW_DEEP_COLOR_36: *pFeatureSupported = False; break; case HDMITX_FEATURE_HW_DEEP_COLOR_48: *pFeatureSupported = False; break; case HDMITX_FEATURE_HW_UPSAMPLER: *pFeatureSupported = True; break; case HDMITX_FEATURE_HW_DOWNSAMPLER: *pFeatureSupported = True; break; case HDMITX_FEATURE_HW_COLOR_CONVERSION: *pFeatureSupported = True; break; default: *pFeatureSupported = False; break; } return err; }