[Sound-open-firmware] [PATCH] [RFC]SOF: FIX: adjust the SSC3's TFT/RFT field in SSP
Actually I did not have full confidence about this patch. if someone can help do more test, that would be better. before this, do not accept this patch.
Incorrect TFT/RFT will cause DMA IRQ happened too frequently. the interval will be less than 1ms, which will cause XRUN easily.
The old code will has this issue in TDM4-s32le test.
Signed-off-by: Wu Zhigang zhigang.wu@linux.intel.com Acked-by: Pierre-Louis Bossart pierre-louis.bossart@linux.intel.com
--- Test with: APL-GPMRB with TDF8532 codec Linux sof-v4.14: 1d4a25d72d1e87c182f15a68d32c9599b734ea7b SOF master: 7c5dd8cfdf4f8ca1fa5cfdd7352b81cbfc8edb88 Tools master: 86fe688a2b4f68a1ce87e0951686be12a00f1a3c
Pass the Sanity test: BYT(Minnowboard Turbo) APL(UP^2) CNL(CNL-RVP) --- src/drivers/apl-ssp.c | 21 +++------------------ 1 file changed, 3 insertions(+), 18 deletions(-)
diff --git a/src/drivers/apl-ssp.c b/src/drivers/apl-ssp.c index a51f91c..5fb9b27 100644 --- a/src/drivers/apl-ssp.c +++ b/src/drivers/apl-ssp.c @@ -36,6 +36,7 @@ #include <sof/ssp.h> #include <sof/alloc.h> #include <sof/interrupt.h> +#include <sof/math/numbers.h> #include <config.h>
/* tracing */ @@ -496,24 +497,8 @@ static inline int ssp_set_config(struct dai *dai, /* bypass divider for MCLK */ mdivr = 0x00000fff;
- /* setting TFT and RFT */ - switch (config->ssp.sample_valid_bits) { - case 16: - /* use 2 bytes for each slot */ - tft = active_tx_slots * 2; - rft = active_rx_slots * 2; - break; - case 24: - case 32: - /* use 4 bytes for each slot */ - tft = active_tx_slots * 4; - rft = active_rx_slots * 4; - break; - default: - trace_ssp_error("ecd"); - ret = -EINVAL; - goto out; - } + tft = MIN(8, 2 * active_tx_slots); + rft = MIN(8, 2 * active_rx_slots);
sscr3 |= SSCR3_TX(tft) | SSCR3_RX(rft);
participants (1)
-
Wu Zhigang