On Thu, Sep 17, 2015 at 11:10:41PM +0800, Chen-Yu Tsai wrote:
On Thu, Sep 17, 2015 at 9:31 PM, Maxime Ripard
.formats = SNDRV_PCM_FMTBIT_S16_LE |
SNDRV_PCM_FMTBIT_S32_LE,
.sig_bits = 24,
So presumably also S24_LE (ie, 24 bits packed into a 32 bit word)?
Hmm, probably yes, I'll test that.
IIRC when Emilio first wrote the driver, we tried 24 bit and no sound came out. Turns out it's an alignment issue. The codec's FIFO register is 32 bits wide, and takes the higher 24 bits as input when set to 24 bit mode. The internal FIFO is only 24 bits wide. A20 user manual P174 describes how the bits are copied.
So for 24 bit audio, you would actually send it 32 bit audio samples, and let it truncate or drop the least significant 8 bits. This is why we have SNDRV_PCM_FMTBIT_S32_LE with .sig_bits = 24.
I don't know if this is just a workaround, but a few other drivers do this as well, for example twl3040 and omap-mcpdm.
That's very common - it's essentially what S24_LE mode is.