// SPDX-License-Identifier: GPL-2.0 // Copyright (c) 2011-2017, The Linux Foundation. All rights reserved. // Copyright (c) 2018, Linaro Limited #include "q6dsp-common.h" #include <linux/kernel.h> #include <linux/module.h> #include <linux/string.h> #include <linux/errno.h> int q6dsp_map_channels(u8 ch_map[PCM_MAX_NUM_CHANNEL], int ch) { memset(ch_map, 0, PCM_MAX_NUM_CHANNEL); switch (ch) { case 1: ch_map[0] = PCM_CHANNEL_FC; break; case 2: ch_map[0] = PCM_CHANNEL_FL; ch_map[1] = PCM_CHANNEL_FR; break; case 3: ch_map[0] = PCM_CHANNEL_FL; ch_map[1] = PCM_CHANNEL_FR; ch_map[2] = PCM_CHANNEL_FC; break; case 4: ch_map[0] = PCM_CHANNEL_FL; ch_map[1] = PCM_CHANNEL_FR; ch_map[2] = PCM_CHANNEL_LS; ch_map[3] = PCM_CHANNEL_RS; break; case 5: ch_map[0] = PCM_CHANNEL_FL; ch_map[1] = PCM_CHANNEL_FR; ch_map[2] = PCM_CHANNEL_FC; ch_map[3] = PCM_CHANNEL_LS; ch_map[4] = PCM_CHANNEL_RS; break; case 6: ch_map[0] = PCM_CHANNEL_FL; ch_map[1] = PCM_CHANNEL_FR; ch_map[2] = PCM_CHANNEL_LFE; ch_map[3] = PCM_CHANNEL_FC; ch_map[4] = PCM_CHANNEL_LS; ch_map[5] = PCM_CHANNEL_RS; break; case 8: ch_map[0] = PCM_CHANNEL_FL; ch_map[1] = PCM_CHANNEL_FR; ch_map[2] = PCM_CHANNEL_LFE; ch_map[3] = PCM_CHANNEL_FC; ch_map[4] = PCM_CHANNEL_LS; ch_map[5] = PCM_CHANNEL_RS; ch_map[6] = PCM_CHANNEL_LB; ch_map[7] = PCM_CHANNEL_RB; break; default: return -EINVAL; } return 0; } EXPORT_SYMBOL_GPL(q6dsp_map_channels); int q6dsp_get_channel_allocation(int channels) { int channel_allocation; /* HDMI spec CEA-861-E: Table 28 Audio InfoFrame Data Byte 4 */ switch (channels) { case 2: channel_allocation = 0; break; case 3: channel_allocation = 0x02; break; case 4: channel_allocation = 0x06; break; case 5: channel_allocation = 0x0A; break; case 6: channel_allocation = 0x0B; break; case 7: channel_allocation = 0x12; break; case 8: channel_allocation = 0x13; break; default: return -EINVAL; } return channel_allocation; } EXPORT_SYMBOL_GPL(q6dsp_get_channel_allocation); MODULE_DESCRIPTION("ASoC MSM QDSP6 helper functions"); MODULE_LICENSE("GPL v2");