On 08/14/15 12:57, Russell King - ARM Linux wrote:
On Fri, Aug 14, 2015 at 12:30:41PM +0300, Jyri Sarha wrote:
+static int hdmi_codec_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params,
struct snd_soc_dai *dai)
+{
- struct hdmi_codec_priv *hcp = snd_soc_dai_get_drvdata(dai);
- struct hdmi_codec_params hp = {
.cea = { 0 },
Unnecessary initialisation - because you are initialising this structure, all unnamed fields will be zeroed.
True, I just tried to be explicit.
.iec = {
.status = {
IEC958_AES0_CON_NOT_COPYRIGHT,
IEC958_AES1_CON_GENERAL,
IEC958_AES2_CON_SOURCE_UNSPEC,
IEC958_AES3_CON_CLOCK_VARIABLE,
},
...
- hdmi_audio_infoframe_init(&hp.cea);
- hp.cea.coding_type = HDMI_AUDIO_CODING_TYPE_PCM;
Something tells me here that you haven't read the HDMI specification. HDMI says that the coding type will be zero (refer to stream header). The same goes for much of the CEA audio infoframe. Please see the Audio InfoFrame details in the HDMI specification.
Must admit, that I have not read it end to end. Obviously I have missed a relevant piece of information here. I'll fix that and check the related items too.
- hp.cea.channels = params_channels(params);
- switch (params_width(params)) {
- case 16:
hp.iec.status[4] |= IEC958_AES4_CON_WORDLEN_20_16;
hp.cea.sample_size = HDMI_AUDIO_SAMPLE_SIZE_16;
break;
- case 18:
hp.iec.status[4] |= IEC958_AES4_CON_WORDLEN_22_18;
hp.cea.sample_size = HDMI_AUDIO_SAMPLE_SIZE_20;
break;
- case 20:
hp.iec.status[4] |= IEC958_AES4_CON_WORDLEN_24_20;
hp.cea.sample_size = HDMI_AUDIO_SAMPLE_SIZE_20;
break;
- case 24:
- case 32:
hp.iec.status[4] |= IEC958_AES4_CON_MAX_WORDLEN_24 |
IEC958_AES4_CON_WORDLEN_24_20;
Why not use the generic code to generate the AES channel status bits? See sound/core/pcm_iec958.c.
Thanks, I did not know that exist. I'll make use of that.
Best regards, Jyri