Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ea66b9f5 authored by Rohit kumar's avatar Rohit kumar
Browse files

dsp: adm: Add support for port specific channel map



Add multi channel map support per afe port.

Change-Id: Ib032d1c81d918417f516131f11c500e4f6668b39
Signed-off-by: default avatarRohit kumar <rohitkr@codeaurora.org>
parent a1ba8305
Loading
Loading
Loading
Loading
+56 −15
Original line number Diff line number Diff line
@@ -132,6 +132,8 @@ static struct adm_multi_ch_map multi_ch_maps[2] = {
			}
};

static struct adm_multi_ch_map port_channel_map[AFE_MAX_PORTS];

static int adm_get_parameters[MAX_COPPS_PER_PORT * ADM_GET_PARAMETER_LENGTH];
static int adm_module_topo_list[MAX_COPPS_PER_PORT *
				ADM_GET_TOPO_MODULE_INSTANCE_LIST_LENGTH];
@@ -1349,6 +1351,31 @@ int adm_get_multi_ch_map(char *channel_map, int path)
}
EXPORT_SYMBOL(adm_get_multi_ch_map);

/**
 * adm_set_port_multi_ch_map -
 *        Update port specific channel map info
 *
 * @channel_map: pointer with channel map info
 * @port_id: port for which chmap is set
 */
void adm_set_port_multi_ch_map(char *channel_map, int port_id)
{
	int port_idx;

	port_id = q6audio_convert_virtual_to_portid(port_id);
	port_idx = adm_validate_and_get_port_index(port_id);

	if (port_idx < 0) {
		pr_err("%s: Invalid port_id 0x%x\n", __func__, port_id);
		return;
	}

	memcpy(port_channel_map[port_idx].channel_mapping, channel_map,
			PCM_FORMAT_MAX_NUM_CHANNEL_V8);
	port_channel_map[port_idx].set_channel_map = true;
}
EXPORT_SYMBOL(adm_set_port_multi_ch_map);

static int adm_process_get_param_response(u32 opcode, u32 idx, u32 *payload,
					  u32 payload_size)
{
@@ -2411,7 +2438,7 @@ int adm_connect_afe_port(int mode, int session_id, int port_id)
EXPORT_SYMBOL(adm_connect_afe_port);

int adm_arrange_mch_map(struct adm_cmd_device_open_v5 *open, int path,
			 int channel_mode)
			 int channel_mode, int port_idx)
{
	int rc = 0, idx;

@@ -2429,7 +2456,15 @@ int adm_arrange_mch_map(struct adm_cmd_device_open_v5 *open, int path,
	default:
		goto non_mch_path;
	};
	if ((open->dev_num_channel > 2) && multi_ch_maps[idx].set_channel_map) {

	if ((open->dev_num_channel > 2) &&
		(port_channel_map[port_idx].set_channel_map ||
		 multi_ch_maps[idx].set_channel_map)) {
		if (port_channel_map[port_idx].set_channel_map)
			memcpy(open->dev_channel_mapping,
				port_channel_map[port_idx].channel_mapping,
				PCM_FORMAT_MAX_NUM_CHANNEL);
		else
			memcpy(open->dev_channel_mapping,
				multi_ch_maps[idx].channel_mapping,
				PCM_FORMAT_MAX_NUM_CHANNEL);
@@ -2546,8 +2581,7 @@ int adm_arrange_mch_ep2_map(struct adm_cmd_device_open_v6 *open_v6,

static int adm_arrange_mch_map_v8(
		struct adm_device_endpoint_payload *ep_payload,
		int path,
		int channel_mode)
		int path, int channel_mode, int port_idx)
{
	int rc = 0, idx;

@@ -2566,7 +2600,13 @@ static int adm_arrange_mch_map_v8(
	};

	if ((ep_payload->dev_num_channel > 2) &&
			multi_ch_maps[idx].set_channel_map) {
		(port_channel_map[port_idx].set_channel_map ||
		 multi_ch_maps[idx].set_channel_map)) {
		if (port_channel_map[port_idx].set_channel_map)
			memcpy(ep_payload->dev_channel_mapping,
				port_channel_map[port_idx].channel_mapping,
				PCM_FORMAT_MAX_NUM_CHANNEL_V8);
		else
			memcpy(ep_payload->dev_channel_mapping,
				multi_ch_maps[idx].channel_mapping,
				PCM_FORMAT_MAX_NUM_CHANNEL_V8);
@@ -2971,7 +3011,7 @@ int adm_open(int port_id, int path, int rate, int channel_mode, int topology,
			ep1_payload.bit_width = bit_width;
			ep1_payload.sample_rate  = rate;
			ret = adm_arrange_mch_map_v8(&ep1_payload, path,
					channel_mode);
					channel_mode, port_idx);
			if (ret)
				return ret;

@@ -3085,8 +3125,8 @@ int adm_open(int port_id, int path, int rate, int channel_mode, int topology,
				(rate != ULL_SUPPORTED_SAMPLE_RATE));
			open.sample_rate  = rate;

			ret = adm_arrange_mch_map(&open, path, channel_mode);

			ret = adm_arrange_mch_map(&open, path, channel_mode,
						  port_idx);
			if (ret)
				return ret;

@@ -3217,7 +3257,7 @@ void adm_copp_mfc_cfg(int port_id, int copp_idx, int dst_sample_rate)
		atomic_read(&this_adm.copp.channels[port_idx][copp_idx]);

	rc = adm_arrange_mch_map(&open, ADM_PATH_PLAYBACK,
		mfc_cfg.num_channels);
		mfc_cfg.num_channels, port_idx);
	if (rc < 0) {
		pr_err("%s: unable to get channal map\n", __func__);
		goto fail_cmd;
@@ -3528,6 +3568,7 @@ int adm_close(int port_id, int perf_mode, int copp_idx)
		return -EINVAL;
	}

	port_channel_map[port_idx].set_channel_map = false;
	if (this_adm.copp.adm_delay[port_idx][copp_idx] && perf_mode
		== LEGACY_PCM_MODE) {
		atomic_set(&this_adm.copp.adm_delay_stat[port_idx][copp_idx],
+3 −1
Original line number Diff line number Diff line
/* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved.
/* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
@@ -141,6 +141,8 @@ int adm_set_multi_ch_map(char *channel_map, int path);

int adm_get_multi_ch_map(char *channel_map, int path);

void adm_set_port_multi_ch_map(char *channel_map, int port_id);

int adm_validate_and_get_port_index(int port_id);

int adm_get_default_copp_idx(int port_id);