162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci// Copyright (c) 2011-2017, The Linux Foundation. All rights reserved.
362306a36Sopenharmony_ci// Copyright (c) 2018, Linaro Limited
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include "q6dsp-common.h"
662306a36Sopenharmony_ci#include <linux/kernel.h>
762306a36Sopenharmony_ci#include <linux/module.h>
862306a36Sopenharmony_ci#include <linux/string.h>
962306a36Sopenharmony_ci#include <linux/errno.h>
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ciint q6dsp_map_channels(u8 ch_map[PCM_MAX_NUM_CHANNEL], int ch)
1262306a36Sopenharmony_ci{
1362306a36Sopenharmony_ci	memset(ch_map, 0, PCM_MAX_NUM_CHANNEL);
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci	switch (ch) {
1662306a36Sopenharmony_ci	case 1:
1762306a36Sopenharmony_ci		ch_map[0] = PCM_CHANNEL_FC;
1862306a36Sopenharmony_ci		break;
1962306a36Sopenharmony_ci	case 2:
2062306a36Sopenharmony_ci		ch_map[0] = PCM_CHANNEL_FL;
2162306a36Sopenharmony_ci		ch_map[1] = PCM_CHANNEL_FR;
2262306a36Sopenharmony_ci		break;
2362306a36Sopenharmony_ci	case 3:
2462306a36Sopenharmony_ci		ch_map[0] = PCM_CHANNEL_FL;
2562306a36Sopenharmony_ci		ch_map[1] = PCM_CHANNEL_FR;
2662306a36Sopenharmony_ci		ch_map[2] = PCM_CHANNEL_FC;
2762306a36Sopenharmony_ci		break;
2862306a36Sopenharmony_ci	case 4:
2962306a36Sopenharmony_ci		ch_map[0] = PCM_CHANNEL_FL;
3062306a36Sopenharmony_ci		ch_map[1] = PCM_CHANNEL_FR;
3162306a36Sopenharmony_ci		ch_map[2] = PCM_CHANNEL_LS;
3262306a36Sopenharmony_ci		ch_map[3] = PCM_CHANNEL_RS;
3362306a36Sopenharmony_ci		break;
3462306a36Sopenharmony_ci	case 5:
3562306a36Sopenharmony_ci		ch_map[0] = PCM_CHANNEL_FL;
3662306a36Sopenharmony_ci		ch_map[1] = PCM_CHANNEL_FR;
3762306a36Sopenharmony_ci		ch_map[2] = PCM_CHANNEL_FC;
3862306a36Sopenharmony_ci		ch_map[3] = PCM_CHANNEL_LS;
3962306a36Sopenharmony_ci		ch_map[4] = PCM_CHANNEL_RS;
4062306a36Sopenharmony_ci		break;
4162306a36Sopenharmony_ci	case 6:
4262306a36Sopenharmony_ci		ch_map[0] = PCM_CHANNEL_FL;
4362306a36Sopenharmony_ci		ch_map[1] = PCM_CHANNEL_FR;
4462306a36Sopenharmony_ci		ch_map[2] = PCM_CHANNEL_LFE;
4562306a36Sopenharmony_ci		ch_map[3] = PCM_CHANNEL_FC;
4662306a36Sopenharmony_ci		ch_map[4] = PCM_CHANNEL_LS;
4762306a36Sopenharmony_ci		ch_map[5] = PCM_CHANNEL_RS;
4862306a36Sopenharmony_ci		break;
4962306a36Sopenharmony_ci	case 8:
5062306a36Sopenharmony_ci		ch_map[0] = PCM_CHANNEL_FL;
5162306a36Sopenharmony_ci		ch_map[1] = PCM_CHANNEL_FR;
5262306a36Sopenharmony_ci		ch_map[2] = PCM_CHANNEL_LFE;
5362306a36Sopenharmony_ci		ch_map[3] = PCM_CHANNEL_FC;
5462306a36Sopenharmony_ci		ch_map[4] = PCM_CHANNEL_LS;
5562306a36Sopenharmony_ci		ch_map[5] = PCM_CHANNEL_RS;
5662306a36Sopenharmony_ci		ch_map[6] = PCM_CHANNEL_LB;
5762306a36Sopenharmony_ci		ch_map[7] = PCM_CHANNEL_RB;
5862306a36Sopenharmony_ci		break;
5962306a36Sopenharmony_ci	default:
6062306a36Sopenharmony_ci		return -EINVAL;
6162306a36Sopenharmony_ci	}
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci	return 0;
6462306a36Sopenharmony_ci}
6562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(q6dsp_map_channels);
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ciint q6dsp_get_channel_allocation(int channels)
6862306a36Sopenharmony_ci{
6962306a36Sopenharmony_ci	int channel_allocation;
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci	/* HDMI spec CEA-861-E: Table 28 Audio InfoFrame Data Byte 4 */
7262306a36Sopenharmony_ci	switch (channels) {
7362306a36Sopenharmony_ci	case 2:
7462306a36Sopenharmony_ci		channel_allocation = 0;
7562306a36Sopenharmony_ci		break;
7662306a36Sopenharmony_ci	case 3:
7762306a36Sopenharmony_ci		channel_allocation = 0x02;
7862306a36Sopenharmony_ci		break;
7962306a36Sopenharmony_ci	case 4:
8062306a36Sopenharmony_ci		channel_allocation = 0x06;
8162306a36Sopenharmony_ci		break;
8262306a36Sopenharmony_ci	case 5:
8362306a36Sopenharmony_ci		channel_allocation = 0x0A;
8462306a36Sopenharmony_ci		break;
8562306a36Sopenharmony_ci	case 6:
8662306a36Sopenharmony_ci		channel_allocation = 0x0B;
8762306a36Sopenharmony_ci		break;
8862306a36Sopenharmony_ci	case 7:
8962306a36Sopenharmony_ci		channel_allocation = 0x12;
9062306a36Sopenharmony_ci		break;
9162306a36Sopenharmony_ci	case 8:
9262306a36Sopenharmony_ci		channel_allocation = 0x13;
9362306a36Sopenharmony_ci		break;
9462306a36Sopenharmony_ci	default:
9562306a36Sopenharmony_ci		return -EINVAL;
9662306a36Sopenharmony_ci	}
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci	return channel_allocation;
9962306a36Sopenharmony_ci}
10062306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(q6dsp_get_channel_allocation);
10162306a36Sopenharmony_ciMODULE_LICENSE("GPL v2");
102