Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ASoC: ti: davinci-i2s: Add S24_LE to supported formats

S24_LE is supported by McBSP but not by the driver.

Add S24_LE to driver's supported formats. Using it enables the sign
extension in DRR (Data Receive Register). The other formats are kept
with the zero extension in DRR.

Remove data_type table as it is no longer used.

Signed-off-by: Bastien Curutchet <bastien.curutchet@bootlin.com>
Acked-by: Peter Ujfalusi <peter.ujfalusi@gmail.com>
Link: https://msgid.link/r/20240402071213.11671-12-bastien.curutchet@bootlin.com
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Bastien Curutchet and committed by
Mark Brown
92e7bb2b 091b440f

+21 -13
+21 -13
sound/soc/ti/davinci-i2s.c
··· 61 61 62 62 #define DAVINCI_MCBSP_SPCR_RRST (1 << 0) 63 63 #define DAVINCI_MCBSP_SPCR_RINTM(v) ((v) << 4) 64 + #define DAVINCI_MCBSP_SPCR_RJUST(v) ((v) << 13) 65 + #define DAVINCI_MCBSP_SPCR_RJUST_Z_LE DAVINCI_MCBSP_SPCR_RJUST(0) 66 + #define DAVINCI_MCBSP_SPCR_RJUST_S_LE DAVINCI_MCBSP_SPCR_RJUST(1) 64 67 #define DAVINCI_MCBSP_SPCR_XRST (1 << 16) 65 68 #define DAVINCI_MCBSP_SPCR_XINTM(v) ((v) << 20) 66 69 #define DAVINCI_MCBSP_SPCR_GRST (1 << 22) ··· 110 107 DAVINCI_MCBSP_WORD_32, 111 108 }; 112 109 113 - static const unsigned char data_type[SNDRV_PCM_FORMAT_S32_LE + 1] = { 114 - [SNDRV_PCM_FORMAT_S8] = 1, 115 - [SNDRV_PCM_FORMAT_S16_LE] = 2, 116 - [SNDRV_PCM_FORMAT_S32_LE] = 4, 117 - }; 118 - 119 110 static const unsigned char asp_word_length[SNDRV_PCM_FORMAT_S32_LE + 1] = { 120 111 [SNDRV_PCM_FORMAT_S8] = DAVINCI_MCBSP_WORD_8, 121 112 [SNDRV_PCM_FORMAT_S16_LE] = DAVINCI_MCBSP_WORD_16, 113 + [SNDRV_PCM_FORMAT_S24_LE] = DAVINCI_MCBSP_WORD_24, 122 114 [SNDRV_PCM_FORMAT_S32_LE] = DAVINCI_MCBSP_WORD_32, 123 115 }; 124 116 ··· 465 467 snd_pcm_format_t fmt; 466 468 unsigned element_cnt = 1; 467 469 468 - /* general line settings */ 469 470 spcr = davinci_mcbsp_read_reg(dev, DAVINCI_MCBSP_SPCR_REG); 471 + 472 + /* Determine xfer data type */ 473 + fmt = params_format(params); 474 + switch (fmt) { 475 + case SNDRV_PCM_FORMAT_S16_LE: 476 + case SNDRV_PCM_FORMAT_S32_LE: 477 + break; 478 + case SNDRV_PCM_FORMAT_S24_LE: 479 + spcr |= DAVINCI_MCBSP_SPCR_RJUST_S_LE; 480 + break; 481 + default: 482 + dev_warn(dev->dev, "davinci-i2s: unsupported PCM format\n"); 483 + return -EINVAL; 484 + } 485 + 486 + /* general line settings */ 470 487 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { 471 488 spcr |= DAVINCI_MCBSP_SPCR_RINTM(3); 472 489 davinci_mcbsp_write_reg(dev, DAVINCI_MCBSP_SPCR_REG, spcr); ··· 578 565 } else { 579 566 rcr |= DAVINCI_MCBSP_RCR_RDATDLY(1); 580 567 xcr |= DAVINCI_MCBSP_XCR_XDATDLY(1); 581 - } 582 - /* Determine xfer data type */ 583 - fmt = params_format(params); 584 - if ((fmt > SNDRV_PCM_FORMAT_S32_LE) || !data_type[fmt]) { 585 - printk(KERN_WARNING "davinci-i2s: unsupported PCM format\n"); 586 - return -EINVAL; 587 568 } 588 569 589 570 if (params_channels(params) == 2) { ··· 717 710 718 711 #define DAVINCI_I2S_RATES SNDRV_PCM_RATE_8000_96000 719 712 #define DAVINCI_I2S_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \ 713 + SNDRV_PCM_FMTBIT_S24_LE | \ 720 714 SNDRV_PCM_FMTBIT_S32_LE) 721 715 722 716 static int davinci_i2s_dai_probe(struct snd_soc_dai *dai)