/* * wait until calibration impedance is ok * operate on all devices that have a handle open */ static void waitCalibration(Tfa98xx_handle_t handle, float *pRe25) { Tfa98xx_Error_t err; int calibrateDone, count = 500; assert(pRe25 != NULL); err = Tfa98xx_DspReadMem(handle, 231, 1, &calibrateDone); assert(err == Tfa98xx_Error_Ok); while ((calibrateDone == 0) && (count-- > 0)) // TODO protect loop with timeout? { err = Tfa98xx_DspReadMem(handle, 231, 1, &calibrateDone); assert(err == Tfa98xx_Error_Ok); } err = Tfa98xx_DspGetCalibrationImpedance(handle, pRe25); assert(err == Tfa98xx_Error_Ok); }
static void waitCalibration(Tfa98xx_handle_t handle, int *calibrateDone) { enum Tfa98xx_Error err; int tries = 0; unsigned short mtp; unsigned short spkrCalibration; #define WAIT_TRIES 1000 err = Tfa98xx_ReadRegister16(handle, TFA98XX_MTP, &mtp); /* in case of calibrate once wait for MTPEX */ if (mtp & TFA98XX_MTP_MTPOTC) { while ((*calibrateDone == 0) && (tries < WAIT_TRIES)) { err = Tfa98xx_ReadRegister16(handle, TFA98XX_MTP, &mtp); /* check MTP bit1 (MTPEX) */ *calibrateDone = (mtp & TFA98XX_MTP_MTPEX); tries++; } } else { /* poll xmem for calibrate always */ while ((*calibrateDone == 0) && (tries < WAIT_TRIES)) { /* TODO optimise with wait estimation */ err = Tfa98xx_DspReadMem(handle, 231, 1, calibrateDone); tries++; } if (tries == WAIT_TRIES) pr_err("%s: calibrateDone 231 timedout\n", __func__); } err = Tfa98xx_ReadRegister16(handle, TFA98XX_SPKR_CALIBRATION, &spkrCalibration); if (err != Tfa98xx_Error_Ok) { pr_err("%s: Tfa98xx_ReadRegister16 failed %d\n", __func__, err); return; } spkrCalibration &= ~(TFA98XX_SPKR_CALIBRATION_TROS_MSK); err = Tfa98xx_WriteRegister16(handle, TFA98XX_SPKR_CALIBRATION, spkrCalibration); if (err != Tfa98xx_Error_Ok) { pr_err("%s: Tfa98xx_WriteRegister16 failed %d\n", __func__, err); return; } }