1// SPDX-License-Identifier: GPL-2.0
2// Copyright (c) 2011-2017, The Linux Foundation. All rights reserved.
3// Copyright (c) 2018, Linaro Limited
4
5#include "q6dsp-common.h"
6#include <linux/kernel.h>
7#include <linux/module.h>
8#include <linux/string.h>
9#include <linux/errno.h>
10
11int q6dsp_map_channels(u8 ch_map[PCM_MAX_NUM_CHANNEL], int ch)
12{
13	memset(ch_map, 0, PCM_MAX_NUM_CHANNEL);
14
15	switch (ch) {
16	case 1:
17		ch_map[0] = PCM_CHANNEL_FC;
18		break;
19	case 2:
20		ch_map[0] = PCM_CHANNEL_FL;
21		ch_map[1] = PCM_CHANNEL_FR;
22		break;
23	case 3:
24		ch_map[0] = PCM_CHANNEL_FL;
25		ch_map[1] = PCM_CHANNEL_FR;
26		ch_map[2] = PCM_CHANNEL_FC;
27		break;
28	case 4:
29		ch_map[0] = PCM_CHANNEL_FL;
30		ch_map[1] = PCM_CHANNEL_FR;
31		ch_map[2] = PCM_CHANNEL_LS;
32		ch_map[3] = PCM_CHANNEL_RS;
33		break;
34	case 5:
35		ch_map[0] = PCM_CHANNEL_FL;
36		ch_map[1] = PCM_CHANNEL_FR;
37		ch_map[2] = PCM_CHANNEL_FC;
38		ch_map[3] = PCM_CHANNEL_LS;
39		ch_map[4] = PCM_CHANNEL_RS;
40		break;
41	case 6:
42		ch_map[0] = PCM_CHANNEL_FL;
43		ch_map[1] = PCM_CHANNEL_FR;
44		ch_map[2] = PCM_CHANNEL_LFE;
45		ch_map[3] = PCM_CHANNEL_FC;
46		ch_map[4] = PCM_CHANNEL_LS;
47		ch_map[5] = PCM_CHANNEL_RS;
48		break;
49	case 8:
50		ch_map[0] = PCM_CHANNEL_FL;
51		ch_map[1] = PCM_CHANNEL_FR;
52		ch_map[2] = PCM_CHANNEL_LFE;
53		ch_map[3] = PCM_CHANNEL_FC;
54		ch_map[4] = PCM_CHANNEL_LS;
55		ch_map[5] = PCM_CHANNEL_RS;
56		ch_map[6] = PCM_CHANNEL_LB;
57		ch_map[7] = PCM_CHANNEL_RB;
58		break;
59	default:
60		return -EINVAL;
61	}
62
63	return 0;
64}
65EXPORT_SYMBOL_GPL(q6dsp_map_channels);
66
67int q6dsp_get_channel_allocation(int channels)
68{
69	int channel_allocation;
70
71	/* HDMI spec CEA-861-E: Table 28 Audio InfoFrame Data Byte 4 */
72	switch (channels) {
73	case 2:
74		channel_allocation = 0;
75		break;
76	case 3:
77		channel_allocation = 0x02;
78		break;
79	case 4:
80		channel_allocation = 0x06;
81		break;
82	case 5:
83		channel_allocation = 0x0A;
84		break;
85	case 6:
86		channel_allocation = 0x0B;
87		break;
88	case 7:
89		channel_allocation = 0x12;
90		break;
91	case 8:
92		channel_allocation = 0x13;
93		break;
94	default:
95		return -EINVAL;
96	}
97
98	return channel_allocation;
99}
100EXPORT_SYMBOL_GPL(q6dsp_get_channel_allocation);
101MODULE_LICENSE("GPL v2");
102