/*============================================================================*/ 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 setHwRegister ( tmHdmiTxobject_t *pDis, UInt16 regShadPageAddr, UInt8 regValue ) { 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 register shadow index, page index and address */ regShad = SPA2SHAD(regShadPageAddr); regPage = SPA2PAGE(regShadPageAddr); regAddr = SPA2ADDR(regShadPageAddr); newRegPage = kPageIndexToPage[regPage]; /* Set page register if required */ 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; } /* Set shadow copy */ if (regShad != E_SNONE) { pDis->shadowReg[regShad] = regValue; } /* Write to I2C - all non-OK results are errors */ sysArgs.slaveAddr = pDis->uHwAddress; sysArgs.firstRegister = regAddr; sysArgs.lenData = 1; sysArgs.pData = ®Value; 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 setHwRegisterMsbLsb ( tmHdmiTxobject_t *pDis, UInt16 regShadPageAddr, UInt16 regWord ) { tmErrorCode_t err; /* Error code */ 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 */ UInt8 msbLsb[2]; /* The bytes from regWord */ tmbslHdmiTxSysArgs_t sysArgs; /* Arguments passed to system function */ /* Unpack register shadow index, page index and address */ regPage = SPA2PAGE(regShadPageAddr); regAddr = SPA2ADDR(regShadPageAddr); newRegPage = kPageIndexToPage[regPage]; /* Unpack regWord bytes, MSB first */ msbLsb[0] = (UInt8)(regWord >> 8); msbLsb[1] = (UInt8)(regWord & 0xFF); /* Set page register if required */ 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; } /* No word registers are shadowed */ /* Write to I2C - all non-OK results are errors */ sysArgs.slaveAddr = pDis->uHwAddress; sysArgs.firstRegister = regAddr; sysArgs.lenData = 2; sysArgs.pData = &msbLsb[0]; 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 getHwRegister ( tmHdmiTxobject_t *pDis, UInt16 regShadPageAddr, UInt8 *pRegValue ) { 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 register shadow index, page index and address */ regShad = SPA2SHAD(regShadPageAddr); regPage = SPA2PAGE(regShadPageAddr); regAddr = SPA2ADDR(regShadPageAddr); newRegPage = kPageIndexToPage[regPage]; /* Set page register if required */ 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; } if ((regShad != E_SNONE) && (regShadPageAddr != E_REG_P00_INT_FLAGS_0_RW) && (regShadPageAddr != E_REG_P00_INT_FLAGS_1_RW) && (regShadPageAddr != E_REG_P00_INT_FLAGS_2_RW)) { /* Get shadow copy - shadowed registers can't be read */ /* Don't read shadow copy of interrupt status flags! */ *pRegValue = pDis->shadowReg[regShad]; return TM_OK; } else { /* Get I2C register - all non-OK results are errors */ sysArgs.slaveAddr = pDis->uHwAddress; sysArgs.firstRegister = regAddr; sysArgs.lenData = 1; sysArgs.pData = pRegValue; err = pDis->sysFuncRead(&sysArgs); return (err == TM_OK) ? TM_OK : TMBSL_ERR_HDMI_I2C_READ; } }
/*============================================================================*/ tmErrorCode_t setHwRegisterField ( tmHdmiTxobject_t *pDis, UInt16 regShadPageAddr, UInt8 fieldMask, UInt8 fieldValue ) { 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 */ UInt8 regValue; /* The register's current value */ tmbslHdmiTxSysArgs_t sysArgs; /* Arguments passed to system function */ /* Unpack register shadow index, page index and address */ regShad = SPA2SHAD(regShadPageAddr); regPage = SPA2PAGE(regShadPageAddr); regAddr = SPA2ADDR(regShadPageAddr); newRegPage = kPageIndexToPage[regPage]; /* Set page register if required */ 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; } if (regShad != E_SNONE) { /* Get shadow copy */ regValue = pDis->shadowReg[regShad]; } else { /* Read I2C register value. * All bitfield registers are either shadowed or can be read. */ sysArgs.slaveAddr = pDis->uHwAddress; sysArgs.firstRegister = regAddr; sysArgs.lenData = 1; sysArgs.pData = ®Value; err = pDis->sysFuncRead(&sysArgs); RETIF(err != TM_OK, TMBSL_ERR_HDMI_I2C_READ) } /* Reset register bits that are set in the mask */ regValue = regValue & (UInt8)(~fieldMask); /* Shift the field value left to align its bits with the mask */ fieldValue <<= kMaskToShift[fieldMask]; /* Reset shifted field bits that are not set in the mask */ fieldValue &= fieldMask; /* Set the shifted bitfield */ regValue |= fieldValue; /* Set shadow copy */ if (regShad != E_SNONE) { pDis->shadowReg[regShad] = regValue; } /* Write to I2C - all non-OK results are errors */ sysArgs.slaveAddr = pDis->uHwAddress; sysArgs.firstRegister = regAddr; sysArgs.lenData = 1; sysArgs.pData = ®Value; err = pDis->sysFuncWrite(&sysArgs); return (err == TM_OK) ? TM_OK : TMBSL_ERR_HDMI_I2C_WRITE; }