Skip to content

Commit 82ff5ab

Browse files
Kwiboobroonie
authored andcommitted
ASoC: hdmi-codec: reorder channel allocation list
The ordering in hdmi_codec_get_ch_alloc_table_idx() results in wrong channel allocation for a number of cases, e.g. when ELD reports FL|FR|LFE|FC|RL|RR or FL|FR|LFE|FC|RL|RR|RC|RLC|RRC: ca_id 0x01 with speaker mask FL|FR|LFE is selected instead of ca_id 0x03 with speaker mask FL|FR|LFE|FC for 4 channels and ca_id 0x04 with speaker mask FL|FR|RC gets selected instead of ca_id 0x0b with speaker mask FL|FR|LFE|FC|RL|RR for 6 channels Fix this by reordering the channel allocation list with most specific speaker masks at the top. Signed-off-by: Jonas Karlman <jonas@kwiboo.se> Signed-off-by: Christian Hewitt <christianshewitt@gmail.com> Link: https://patch.msgid.link/20241115044344.3510979-1-christianshewitt@gmail.com Signed-off-by: Mark Brown <broonie@kernel.org>
1 parent 9a5a75b commit 82ff5ab

File tree

1 file changed

+77
-63
lines changed

1 file changed

+77
-63
lines changed

sound/soc/codecs/hdmi-codec.c

Lines changed: 77 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -185,84 +185,97 @@ static const struct snd_pcm_chmap_elem hdmi_codec_8ch_chmaps[] = {
185185
/*
186186
* hdmi_codec_channel_alloc: speaker configuration available for CEA
187187
*
188-
* This is an ordered list that must match with hdmi_codec_8ch_chmaps struct
188+
* This is an ordered list where ca_id must exist in hdmi_codec_8ch_chmaps
189189
* The preceding ones have better chances to be selected by
190190
* hdmi_codec_get_ch_alloc_table_idx().
191191
*/
192192
static const struct hdmi_codec_cea_spk_alloc hdmi_codec_channel_alloc[] = {
193193
{ .ca_id = 0x00, .n_ch = 2,
194-
.mask = FL | FR},
195-
/* 2.1 */
196-
{ .ca_id = 0x01, .n_ch = 4,
197-
.mask = FL | FR | LFE},
198-
/* Dolby Surround */
194+
.mask = FL | FR },
195+
{ .ca_id = 0x03, .n_ch = 4,
196+
.mask = FL | FR | LFE | FC },
199197
{ .ca_id = 0x02, .n_ch = 4,
200198
.mask = FL | FR | FC },
201-
/* surround51 */
199+
{ .ca_id = 0x01, .n_ch = 4,
200+
.mask = FL | FR | LFE },
202201
{ .ca_id = 0x0b, .n_ch = 6,
203-
.mask = FL | FR | LFE | FC | RL | RR},
204-
/* surround40 */
205-
{ .ca_id = 0x08, .n_ch = 6,
206-
.mask = FL | FR | RL | RR },
207-
/* surround41 */
208-
{ .ca_id = 0x09, .n_ch = 6,
209-
.mask = FL | FR | LFE | RL | RR },
210-
/* surround50 */
202+
.mask = FL | FR | LFE | FC | RL | RR },
211203
{ .ca_id = 0x0a, .n_ch = 6,
212204
.mask = FL | FR | FC | RL | RR },
213-
/* 6.1 */
214-
{ .ca_id = 0x0f, .n_ch = 8,
215-
.mask = FL | FR | LFE | FC | RL | RR | RC },
216-
/* surround71 */
205+
{ .ca_id = 0x09, .n_ch = 6,
206+
.mask = FL | FR | LFE | RL | RR },
207+
{ .ca_id = 0x08, .n_ch = 6,
208+
.mask = FL | FR | RL | RR },
209+
{ .ca_id = 0x07, .n_ch = 6,
210+
.mask = FL | FR | LFE | FC | RC },
211+
{ .ca_id = 0x06, .n_ch = 6,
212+
.mask = FL | FR | FC | RC },
213+
{ .ca_id = 0x05, .n_ch = 6,
214+
.mask = FL | FR | LFE | RC },
215+
{ .ca_id = 0x04, .n_ch = 6,
216+
.mask = FL | FR | RC },
217217
{ .ca_id = 0x13, .n_ch = 8,
218218
.mask = FL | FR | LFE | FC | RL | RR | RLC | RRC },
219-
/* others */
220-
{ .ca_id = 0x03, .n_ch = 8,
221-
.mask = FL | FR | LFE | FC },
222-
{ .ca_id = 0x04, .n_ch = 8,
223-
.mask = FL | FR | RC},
224-
{ .ca_id = 0x05, .n_ch = 8,
225-
.mask = FL | FR | LFE | RC },
226-
{ .ca_id = 0x06, .n_ch = 8,
227-
.mask = FL | FR | FC | RC },
228-
{ .ca_id = 0x07, .n_ch = 8,
229-
.mask = FL | FR | LFE | FC | RC },
230-
{ .ca_id = 0x0c, .n_ch = 8,
231-
.mask = FL | FR | RC | RL | RR },
232-
{ .ca_id = 0x0d, .n_ch = 8,
233-
.mask = FL | FR | LFE | RL | RR | RC },
234-
{ .ca_id = 0x0e, .n_ch = 8,
235-
.mask = FL | FR | FC | RL | RR | RC },
236-
{ .ca_id = 0x10, .n_ch = 8,
237-
.mask = FL | FR | RL | RR | RLC | RRC },
238-
{ .ca_id = 0x11, .n_ch = 8,
239-
.mask = FL | FR | LFE | RL | RR | RLC | RRC },
219+
{ .ca_id = 0x1f, .n_ch = 8,
220+
.mask = FL | FR | LFE | FC | RL | RR | FLC | FRC },
240221
{ .ca_id = 0x12, .n_ch = 8,
241222
.mask = FL | FR | FC | RL | RR | RLC | RRC },
242-
{ .ca_id = 0x14, .n_ch = 8,
243-
.mask = FL | FR | FLC | FRC },
244-
{ .ca_id = 0x15, .n_ch = 8,
245-
.mask = FL | FR | LFE | FLC | FRC },
246-
{ .ca_id = 0x16, .n_ch = 8,
247-
.mask = FL | FR | FC | FLC | FRC },
248-
{ .ca_id = 0x17, .n_ch = 8,
249-
.mask = FL | FR | LFE | FC | FLC | FRC },
250-
{ .ca_id = 0x18, .n_ch = 8,
251-
.mask = FL | FR | RC | FLC | FRC },
252-
{ .ca_id = 0x19, .n_ch = 8,
253-
.mask = FL | FR | LFE | RC | FLC | FRC },
254-
{ .ca_id = 0x1a, .n_ch = 8,
255-
.mask = FL | FR | RC | FC | FLC | FRC },
256-
{ .ca_id = 0x1b, .n_ch = 8,
257-
.mask = FL | FR | LFE | RC | FC | FLC | FRC },
258-
{ .ca_id = 0x1c, .n_ch = 8,
259-
.mask = FL | FR | RL | RR | FLC | FRC },
260-
{ .ca_id = 0x1d, .n_ch = 8,
261-
.mask = FL | FR | LFE | RL | RR | FLC | FRC },
262223
{ .ca_id = 0x1e, .n_ch = 8,
263224
.mask = FL | FR | FC | RL | RR | FLC | FRC },
264-
{ .ca_id = 0x1f, .n_ch = 8,
265-
.mask = FL | FR | LFE | FC | RL | RR | FLC | FRC },
225+
{ .ca_id = 0x11, .n_ch = 8,
226+
.mask = FL | FR | LFE | RL | RR | RLC | RRC },
227+
{ .ca_id = 0x1d, .n_ch = 8,
228+
.mask = FL | FR | LFE | RL | RR | FLC | FRC },
229+
{ .ca_id = 0x10, .n_ch = 8,
230+
.mask = FL | FR | RL | RR | RLC | RRC },
231+
{ .ca_id = 0x1c, .n_ch = 8,
232+
.mask = FL | FR | RL | RR | FLC | FRC },
233+
{ .ca_id = 0x0f, .n_ch = 8,
234+
.mask = FL | FR | LFE | FC | RL | RR | RC },
235+
{ .ca_id = 0x1b, .n_ch = 8,
236+
.mask = FL | FR | LFE | RC | FC | FLC | FRC },
237+
{ .ca_id = 0x0e, .n_ch = 8,
238+
.mask = FL | FR | FC | RL | RR | RC },
239+
{ .ca_id = 0x1a, .n_ch = 8,
240+
.mask = FL | FR | RC | FC | FLC | FRC },
241+
{ .ca_id = 0x0d, .n_ch = 8,
242+
.mask = FL | FR | LFE | RL | RR | RC },
243+
{ .ca_id = 0x19, .n_ch = 8,
244+
.mask = FL | FR | LFE | RC | FLC | FRC },
245+
{ .ca_id = 0x0c, .n_ch = 8,
246+
.mask = FL | FR | RC | RL | RR },
247+
{ .ca_id = 0x18, .n_ch = 8,
248+
.mask = FL | FR | RC | FLC | FRC },
249+
{ .ca_id = 0x17, .n_ch = 8,
250+
.mask = FL | FR | LFE | FC | FLC | FRC },
251+
{ .ca_id = 0x16, .n_ch = 8,
252+
.mask = FL | FR | FC | FLC | FRC },
253+
{ .ca_id = 0x15, .n_ch = 8,
254+
.mask = FL | FR | LFE | FLC | FRC },
255+
{ .ca_id = 0x14, .n_ch = 8,
256+
.mask = FL | FR | FLC | FRC },
257+
{ .ca_id = 0x0b, .n_ch = 8,
258+
.mask = FL | FR | LFE | FC | RL | RR },
259+
{ .ca_id = 0x0a, .n_ch = 8,
260+
.mask = FL | FR | FC | RL | RR },
261+
{ .ca_id = 0x09, .n_ch = 8,
262+
.mask = FL | FR | LFE | RL | RR },
263+
{ .ca_id = 0x08, .n_ch = 8,
264+
.mask = FL | FR | RL | RR },
265+
{ .ca_id = 0x07, .n_ch = 8,
266+
.mask = FL | FR | LFE | FC | RC },
267+
{ .ca_id = 0x06, .n_ch = 8,
268+
.mask = FL | FR | FC | RC },
269+
{ .ca_id = 0x05, .n_ch = 8,
270+
.mask = FL | FR | LFE | RC },
271+
{ .ca_id = 0x04, .n_ch = 8,
272+
.mask = FL | FR | RC },
273+
{ .ca_id = 0x03, .n_ch = 8,
274+
.mask = FL | FR | LFE | FC },
275+
{ .ca_id = 0x02, .n_ch = 8,
276+
.mask = FL | FR | FC },
277+
{ .ca_id = 0x01, .n_ch = 8,
278+
.mask = FL | FR | LFE },
266279
};
267280

268281
struct hdmi_codec_priv {
@@ -371,7 +384,8 @@ static int hdmi_codec_chmap_ctl_get(struct snd_kcontrol *kcontrol,
371384
struct snd_pcm_chmap *info = snd_kcontrol_chip(kcontrol);
372385
struct hdmi_codec_priv *hcp = info->private_data;
373386

374-
map = info->chmap[hcp->chmap_idx].map;
387+
if (hcp->chmap_idx != HDMI_CODEC_CHMAP_IDX_UNKNOWN)
388+
map = info->chmap[hcp->chmap_idx].map;
375389

376390
for (i = 0; i < info->max_channels; i++) {
377391
if (hcp->chmap_idx == HDMI_CODEC_CHMAP_IDX_UNKNOWN)

0 commit comments

Comments
 (0)