I'm testing the 3.18 kernel for i.MX28 EVK, which has an SGTL5000 CODEC. I notice that audio cannot be output at 8 kHz or 11.025 kHz, although the SGTL5000 data sheet table 8 indicates this should be possible.
If I try to play or record at 8 kHz or 11.025 kHz, I get an error message:
# aplay test_8k.wav [ 6168.910201] mxs_evk_startup: Skipped programming wolfson codec Playing WAVE 'test_8k.wav' : Signed 16 bit Little Endian, Rate 8000 Hz, Mono [ 6168.941211] sgtl5000 0-000a: Invalid mclk frequency: 4.096MHz [ 6168.947047] mxs-sgtl5000 sound.11: ASoC: machine hw_params failed: -22 aplay: set_params:1145: Unable to install hw params: ...
For an 8 kHz sample rate, I get
Invalid mclk frequency: 4.096MHz
For 11.025 kHz sample rate, I get
Invalid mclk frequency: 5.644MHz
Looking in the code (/sound/soc/mxs/mxs-sgtl5000c), I see:
/* Sgtl5000 sysclk should be >= 8MHz and <= 27M */ if (mclk < 8000000 || mclk > 27000000) { dev_err(codec_dai->dev, "Invalid mclk frequency: %u.%03uMHz\n", mclk / 1000000, mclk / 1000 % 1000); return -EINVAL; }
But a sysclk constraint of 8 to 27 MHz only applies if the supplied clock is asynchronous to the frame clock, and the internal clock is being generated by PLL (which it's not in this case). So I tried removing this constraint. But I found that from codecs/sgtl5000.c, I would get the error "PLL not supported in slave mode". I tried changing the switch (sgtl5000->sysclk / sys_fs) to switch (sgtl5000->sysclk / frame_rate), on the basis of the SGTL5000 data sheet table 8. But the resulting audio sounds funny (frequency shifted).
Looking in the SGTL5000 data sheet table 18, it seems unclear whether the MCLK_FREQ field is a multiple of the sample rate (Fs) or the internal system sample rate SYS_FS. It seems that there is some inconsistency in the interpretation of this in codecs/sgtl5000.c compared to mxs/mxs-sgtl5000.c.
What is the correct interpretation of the SGTL5000 data sheet MCLK_FREQ field, and can the mxs-sgtl5000 driver be fixed to support 8 kHz and 11.025 kHz sample rates?