Loading asoc/msm-dai-fe.c +36 −36 Original line number Diff line number Diff line Loading @@ -91,7 +91,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 16, .channels_max = 32, .rate_min = 8000, .rate_max = 384000, }, Loading @@ -105,7 +105,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 16, .channels_max = 32, .rate_min = 8000, .rate_max = 48000, }, Loading @@ -124,7 +124,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 384000, }, Loading @@ -138,7 +138,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 48000, }, Loading Loading @@ -184,7 +184,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 6, .channels_max = 32, .rate_min = 8000, .rate_max = 384000, }, Loading @@ -198,7 +198,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 48000, }, Loading @@ -217,7 +217,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 384000, }, Loading @@ -237,7 +237,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 384000, }, Loading @@ -251,7 +251,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 48000, }, Loading @@ -270,7 +270,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 384000, }, Loading @@ -284,7 +284,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 48000, }, Loading @@ -303,7 +303,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 16, .channels_max = 32, .rate_min = 8000, .rate_max = 384000, }, Loading @@ -323,7 +323,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 384000, }, Loading @@ -337,7 +337,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 48000, }, Loading Loading @@ -2140,7 +2140,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S24_3LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 384000, }, Loading @@ -2151,7 +2151,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_RATE_KNOT), .formats = SNDRV_PCM_FMTBIT_S16_LE, .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 48000, }, Loading Loading @@ -2332,7 +2332,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 384000, }, Loading Loading @@ -2364,7 +2364,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 384000, }, Loading @@ -2384,7 +2384,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 384000, }, Loading @@ -2404,7 +2404,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 384000, }, Loading @@ -2424,7 +2424,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 384000, }, Loading @@ -2444,7 +2444,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 384000, }, Loading @@ -2464,7 +2464,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 384000, }, Loading @@ -2478,7 +2478,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 48000, }, Loading Loading @@ -2546,7 +2546,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S24_3LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 192000, }, Loading @@ -2565,7 +2565,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S24_3LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 192000, }, Loading @@ -2584,7 +2584,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S24_3LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 192000, }, Loading @@ -2604,7 +2604,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 384000, }, Loading @@ -2618,7 +2618,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 48000, }, Loading @@ -2637,7 +2637,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 384000, }, Loading @@ -2651,7 +2651,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 48000, }, Loading Loading @@ -2708,7 +2708,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S24_3LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 192000, }, Loading @@ -2727,7 +2727,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S24_3LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 192000, }, Loading asoc/msm-dai-q6-v2.c +168 −51 Original line number Diff line number Diff line Loading @@ -8144,6 +8144,9 @@ static int msm_dai_q6_tdm_set_tdm_slot(struct snd_soc_dai *dai, case 16: cap_mask = 0xFFFF; break; case 32: cap_mask = 0xFFFFFFFF; break; default: dev_err(dai->dev, "%s: invalid slots %d\n", __func__, slots); Loading Loading @@ -8293,6 +8296,8 @@ static int msm_dai_q6_tdm_set_channel_map(struct snd_soc_dai *dai, dev_get_drvdata(dai->dev); struct afe_param_id_slot_mapping_cfg *slot_mapping = &dai_data->port_cfg.slot_mapping; struct afe_param_id_slot_mapping_cfg_v2 *slot_mapping_v2 = &dai_data->port_cfg.slot_mapping_v2; int i = 0; dev_dbg(dai->dev, "%s: dai id = 0x%x\n", __func__, dai->id); Loading Loading @@ -8346,12 +8351,37 @@ static int msm_dai_q6_tdm_set_channel_map(struct snd_soc_dai *dai, case AFE_PORT_ID_SENARY_TDM_RX_5: case AFE_PORT_ID_SENARY_TDM_RX_6: case AFE_PORT_ID_SENARY_TDM_RX_7: if (q6core_get_avcs_api_version_per_service( APRV2_IDS_SERVICE_ID_ADSP_AFE_V) >= AFE_API_VERSION_V3) { if (!rx_slot) { dev_err(dai->dev, "%s: rx slot not found\n", __func__); return -EINVAL; } if (rx_num > AFE_PORT_MAX_AUDIO_CHAN_CNT_V2) { dev_err(dai->dev, "%s: invalid rx num %d\n", __func__, rx_num); return -EINVAL; } for (i = 0; i < rx_num; i++) slot_mapping_v2->offset[i] = rx_slot[i]; for (i = rx_num; i < AFE_PORT_MAX_AUDIO_CHAN_CNT_V2; i++) slot_mapping_v2->offset[i] = AFE_SLOT_MAPPING_OFFSET_INVALID; slot_mapping_v2->num_channel = rx_num; } else { if (!rx_slot) { dev_err(dai->dev, "%s: rx slot not found\n", __func__); dev_err(dai->dev, "%s: rx slot not found\n", __func__); return -EINVAL; } if (rx_num > AFE_PORT_MAX_AUDIO_CHAN_CNT) { dev_err(dai->dev, "%s: invalid rx num %d\n", __func__, dev_err(dai->dev, "%s: invalid rx num %d\n", __func__, rx_num); return -EINVAL; } Loading @@ -8363,6 +8393,7 @@ static int msm_dai_q6_tdm_set_channel_map(struct snd_soc_dai *dai, AFE_SLOT_MAPPING_OFFSET_INVALID; slot_mapping->num_channel = rx_num; } break; case AFE_PORT_ID_PRIMARY_TDM_TX: case AFE_PORT_ID_PRIMARY_TDM_TX_1: Loading Loading @@ -8412,12 +8443,37 @@ static int msm_dai_q6_tdm_set_channel_map(struct snd_soc_dai *dai, case AFE_PORT_ID_SENARY_TDM_TX_5: case AFE_PORT_ID_SENARY_TDM_TX_6: case AFE_PORT_ID_SENARY_TDM_TX_7: if (q6core_get_avcs_api_version_per_service( APRV2_IDS_SERVICE_ID_ADSP_AFE_V) >= AFE_API_VERSION_V3) { if (!tx_slot) { dev_err(dai->dev, "%s: tx slot not found\n", __func__); dev_err(dai->dev, "%s: tx slot not found\n", __func__); return -EINVAL; } if (tx_num > AFE_PORT_MAX_AUDIO_CHAN_CNT_V2) { dev_err(dai->dev, "%s: invalid tx num %d\n", __func__, tx_num); return -EINVAL; } for (i = 0; i < tx_num; i++) slot_mapping_v2->offset[i] = tx_slot[i]; for (i = tx_num; i < AFE_PORT_MAX_AUDIO_CHAN_CNT_V2; i++) slot_mapping_v2->offset[i] = AFE_SLOT_MAPPING_OFFSET_INVALID; slot_mapping_v2->num_channel = tx_num; } else { if (!tx_slot) { dev_err(dai->dev, "%s: tx slot not found\n", __func__); return -EINVAL; } if (tx_num > AFE_PORT_MAX_AUDIO_CHAN_CNT) { dev_err(dai->dev, "%s: invalid tx num %d\n", __func__, dev_err(dai->dev, "%s: invalid tx num %d\n", __func__, tx_num); return -EINVAL; } Loading @@ -8429,6 +8485,7 @@ static int msm_dai_q6_tdm_set_channel_map(struct snd_soc_dai *dai, AFE_SLOT_MAPPING_OFFSET_INVALID; slot_mapping->num_channel = tx_num; } break; default: dev_err(dai->dev, "%s: invalid dai id 0x%x\n", Loading @@ -8452,6 +8509,8 @@ static int msm_dai_q6_tdm_hw_params(struct snd_pcm_substream *substream, &dai_data->port_cfg.tdm; struct afe_param_id_slot_mapping_cfg *slot_mapping = &dai_data->port_cfg.slot_mapping; struct afe_param_id_slot_mapping_cfg_v2 *slot_mapping_v2 = &dai_data->port_cfg.slot_mapping_v2; struct afe_param_id_custom_tdm_header_cfg *custom_tdm_header = &dai_data->port_cfg.custom_tdm_header; Loading @@ -8459,7 +8518,7 @@ static int msm_dai_q6_tdm_hw_params(struct snd_pcm_substream *substream, __func__, dev_name(dai->dev)); if ((params_channels(params) == 0) || (params_channels(params) > 8)) { (params_channels(params) > 32)) { dev_err(dai->dev, "%s: invalid param channels %d\n", __func__, params_channels(params)); return -EINVAL; Loading Loading @@ -8561,7 +8620,63 @@ static int msm_dai_q6_tdm_hw_params(struct snd_pcm_substream *substream, tdm->ctrl_data_out_enable, tdm->ctrl_invert_sync_pulse, tdm->ctrl_sync_data_delay); if (q6core_get_avcs_api_version_per_service( APRV2_IDS_SERVICE_ID_ADSP_AFE_V) >= AFE_API_VERSION_V3) { /* * update slot mapping v2 config param * NOTE: channels/rate/bitwidth are per stream property */ slot_mapping_v2->bitwidth = dai_data->bitwidth; pr_debug("%s: SLOT MAPPING_V2:\n" "num_channel=%d bitwidth=%d data_align=0x%x\n", __func__, slot_mapping_v2->num_channel, slot_mapping_v2->bitwidth, slot_mapping_v2->data_align_type); pr_debug("%s: SLOT MAPPING V2:\n" "offset[0]=0x%x offset[1]=0x%x offset[2]=0x%x offset[3]=0x%x\n" "offset[4]=0x%x offset[5]=0x%x offset[6]=0x%x offset[7]=0x%x\n" "offset[8]=0x%x offset[9]=0x%x offset[10]=0x%x offset[11]=0x%x\n" "offset[12]=0x%x offset[13]=0x%x offset[14]=0x%x offset[15]=0x%x\n" "offset[16]=0x%x offset[17]=0x%x offset[18]=0x%x offset[19]=0x%x\n" "offset[20]=0x%x offset[21]=0x%x offset[22]=0x%x offset[23]=0x%x\n" "offset[24]=0x%x offset[25]=0x%x offset[26]=0x%x offset[27]=0x%x\n" "offset[28]=0x%x offset[29]=0x%x offset[30]=0x%x offset[31]=0x%x\n", __func__, slot_mapping_v2->offset[0], slot_mapping_v2->offset[1], slot_mapping_v2->offset[2], slot_mapping_v2->offset[3], slot_mapping_v2->offset[4], slot_mapping_v2->offset[5], slot_mapping_v2->offset[6], slot_mapping_v2->offset[7], slot_mapping_v2->offset[8], slot_mapping_v2->offset[9], slot_mapping_v2->offset[10], slot_mapping_v2->offset[11], slot_mapping_v2->offset[12], slot_mapping_v2->offset[13], slot_mapping_v2->offset[14], slot_mapping_v2->offset[15], slot_mapping_v2->offset[16], slot_mapping_v2->offset[17], slot_mapping_v2->offset[18], slot_mapping_v2->offset[19], slot_mapping_v2->offset[20], slot_mapping_v2->offset[21], slot_mapping_v2->offset[22], slot_mapping_v2->offset[23], slot_mapping_v2->offset[24], slot_mapping_v2->offset[25], slot_mapping_v2->offset[26], slot_mapping_v2->offset[27], slot_mapping_v2->offset[28], slot_mapping_v2->offset[29], slot_mapping_v2->offset[30], slot_mapping_v2->offset[31]); } else { /* * update slot mapping config param * NOTE: channels/rate/bitwidth are per stream property Loading @@ -8586,7 +8701,7 @@ static int msm_dai_q6_tdm_hw_params(struct snd_pcm_substream *substream, slot_mapping->offset[5], slot_mapping->offset[6], slot_mapping->offset[7]); } /* * update custom header config param * NOTE: channels/rate/bitwidth are per playback stream property. Loading Loading @@ -10922,6 +11037,8 @@ static int msm_dai_q6_tdm_dev_probe(struct platform_device *pdev) /* TDM SLOT MAPPING CFG -- set default */ dai_data->port_cfg.slot_mapping.minor_version = AFE_API_VERSION_SLOT_MAPPING_CONFIG; dai_data->port_cfg.slot_mapping_v2.minor_version = AFE_API_VERSION_SLOT_MAPPING_CONFIG_V2; /* CUSTOM TDM HEADER CFG */ custom_tdm_header = &dai_data->port_cfg.custom_tdm_header; Loading dsp/q6adm.c +66 −0 Original line number Diff line number Diff line Loading @@ -2686,6 +2686,39 @@ static int adm_arrange_mch_map_v8( ep_payload->dev_channel_mapping[13] = PCM_CHANNEL_FRC; ep_payload->dev_channel_mapping[14] = PCM_CHANNEL_RLC; ep_payload->dev_channel_mapping[15] = PCM_CHANNEL_RRC; } else if (channel_mode == 32) { ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_LFE; ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_FC; ep_payload->dev_channel_mapping[4] = PCM_CHANNEL_LS; ep_payload->dev_channel_mapping[5] = PCM_CHANNEL_RS; ep_payload->dev_channel_mapping[6] = PCM_CHANNEL_LB; ep_payload->dev_channel_mapping[7] = PCM_CHANNEL_RB; ep_payload->dev_channel_mapping[8] = PCM_CHANNEL_CS; ep_payload->dev_channel_mapping[9] = PCM_CHANNEL_TS; ep_payload->dev_channel_mapping[10] = PCM_CHANNEL_CVH; ep_payload->dev_channel_mapping[11] = PCM_CHANNEL_MS; ep_payload->dev_channel_mapping[12] = PCM_CHANNEL_FLC; ep_payload->dev_channel_mapping[13] = PCM_CHANNEL_FRC; ep_payload->dev_channel_mapping[14] = PCM_CHANNEL_RLC; ep_payload->dev_channel_mapping[15] = PCM_CHANNEL_RRC; ep_payload->dev_channel_mapping[16] = PCM_CHANNEL_LFE2; ep_payload->dev_channel_mapping[17] = PCM_CHANNEL_SL; ep_payload->dev_channel_mapping[18] = PCM_CHANNEL_SR; ep_payload->dev_channel_mapping[19] = PCM_CHANNEL_TFL; ep_payload->dev_channel_mapping[20] = PCM_CHANNEL_TFR; ep_payload->dev_channel_mapping[21] = PCM_CHANNEL_TC; ep_payload->dev_channel_mapping[22] = PCM_CHANNEL_TBL; ep_payload->dev_channel_mapping[23] = PCM_CHANNEL_TBR; ep_payload->dev_channel_mapping[24] = PCM_CHANNEL_TSL; ep_payload->dev_channel_mapping[25] = PCM_CHANNEL_TSR; ep_payload->dev_channel_mapping[26] = PCM_CHANNEL_TBC; ep_payload->dev_channel_mapping[27] = PCM_CHANNEL_BFC; ep_payload->dev_channel_mapping[28] = PCM_CHANNEL_BFL; ep_payload->dev_channel_mapping[29] = PCM_CHANNEL_BFR; ep_payload->dev_channel_mapping[30] = PCM_CHANNEL_LW; ep_payload->dev_channel_mapping[31] = PCM_CHANNEL_RW; } else { pr_err("%s: invalid num_chan %d\n", __func__, channel_mode); Loading Loading @@ -2785,6 +2818,39 @@ static int adm_arrange_mch_ep2_map_v8( ep_payload->dev_channel_mapping[13] = PCM_CHANNEL_FRC; ep_payload->dev_channel_mapping[14] = PCM_CHANNEL_RLC; ep_payload->dev_channel_mapping[15] = PCM_CHANNEL_RRC; } else if (channel_mode == 32) { ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_LFE; ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_FC; ep_payload->dev_channel_mapping[4] = PCM_CHANNEL_LS; ep_payload->dev_channel_mapping[5] = PCM_CHANNEL_RS; ep_payload->dev_channel_mapping[6] = PCM_CHANNEL_LB; ep_payload->dev_channel_mapping[7] = PCM_CHANNEL_RB; ep_payload->dev_channel_mapping[8] = PCM_CHANNEL_CS; ep_payload->dev_channel_mapping[9] = PCM_CHANNEL_TS; ep_payload->dev_channel_mapping[10] = PCM_CHANNEL_CVH; ep_payload->dev_channel_mapping[11] = PCM_CHANNEL_MS; ep_payload->dev_channel_mapping[12] = PCM_CHANNEL_FLC; ep_payload->dev_channel_mapping[13] = PCM_CHANNEL_FRC; ep_payload->dev_channel_mapping[14] = PCM_CHANNEL_RLC; ep_payload->dev_channel_mapping[15] = PCM_CHANNEL_RRC; ep_payload->dev_channel_mapping[16] = PCM_CHANNEL_LFE2; ep_payload->dev_channel_mapping[17] = PCM_CHANNEL_SL; ep_payload->dev_channel_mapping[18] = PCM_CHANNEL_SR; ep_payload->dev_channel_mapping[19] = PCM_CHANNEL_TFL; ep_payload->dev_channel_mapping[20] = PCM_CHANNEL_TFR; ep_payload->dev_channel_mapping[21] = PCM_CHANNEL_TC; ep_payload->dev_channel_mapping[22] = PCM_CHANNEL_TBL; ep_payload->dev_channel_mapping[23] = PCM_CHANNEL_TBR; ep_payload->dev_channel_mapping[24] = PCM_CHANNEL_TSL; ep_payload->dev_channel_mapping[25] = PCM_CHANNEL_TSR; ep_payload->dev_channel_mapping[26] = PCM_CHANNEL_TBC; ep_payload->dev_channel_mapping[27] = PCM_CHANNEL_BFC; ep_payload->dev_channel_mapping[28] = PCM_CHANNEL_BFL; ep_payload->dev_channel_mapping[29] = PCM_CHANNEL_BFR; ep_payload->dev_channel_mapping[30] = PCM_CHANNEL_LW; ep_payload->dev_channel_mapping[31] = PCM_CHANNEL_RW; } else { pr_err("%s: invalid num_chan %d\n", __func__, channel_mode); Loading dsp/q6afe.c +39 −2 Original line number Diff line number Diff line Loading @@ -3364,6 +3364,36 @@ int afe_send_slot_mapping_cfg( return ret; } int afe_send_slot_mapping_cfg_v2( struct afe_param_id_slot_mapping_cfg_v2 *slot_mapping_cfg, u16 port_id) { struct param_hdr_v3 param_hdr; int ret = 0; if (!slot_mapping_cfg) { pr_err("%s: Error, no configuration data\n", __func__); return -EINVAL; } pr_debug("%s: port id: 0x%x\n", __func__, port_id); memset(¶m_hdr, 0, sizeof(param_hdr)); param_hdr.module_id = AFE_MODULE_TDM; param_hdr.instance_id = INSTANCE_ID_0; param_hdr.param_id = AFE_PARAM_ID_PORT_SLOT_MAPPING_CONFIG; param_hdr.param_size = sizeof(struct afe_param_id_slot_mapping_cfg_v2); ret = q6afe_pack_and_set_param_in_band(port_id, q6audio_get_port_index(port_id), param_hdr, (u8 *) slot_mapping_cfg); if (ret < 0) pr_err("%s: AFE send slot mapping for port 0x%x failed ret = %d\n", __func__, port_id, ret); return ret; } int afe_send_custom_tdm_header_cfg( struct afe_param_id_custom_tdm_header_cfg *custom_tdm_header_cfg, u16 port_id) Loading Loading @@ -3503,8 +3533,15 @@ int afe_tdm_port_start(u16 port_id, struct afe_tdm_port_config *tdm_port, goto fail_cmd; } ret = afe_send_slot_mapping_cfg(&tdm_port->slot_mapping, if (q6core_get_avcs_api_version_per_service( APRV2_IDS_SERVICE_ID_ADSP_AFE_V) >= AFE_API_VERSION_V3) ret = afe_send_slot_mapping_cfg_v2( &tdm_port->slot_mapping_v2, port_id); else ret = afe_send_slot_mapping_cfg( &tdm_port->slot_mapping, port_id); if (ret < 0) { pr_err("%s: afe send failed %d\n", __func__, ret); goto fail_cmd; Loading dsp/q6asm.c +33 −0 Original line number Diff line number Diff line Loading @@ -5775,6 +5775,39 @@ int q6asm_map_channels(u8 *channel_mapping, uint32_t channels, lchannel_mapping[13] = PCM_CHANNEL_FRC; lchannel_mapping[14] = PCM_CHANNEL_RLC; lchannel_mapping[15] = PCM_CHANNEL_RRC; } else if (channels == 32) { lchannel_mapping[0] = PCM_CHANNEL_FL; lchannel_mapping[1] = PCM_CHANNEL_FR; lchannel_mapping[2] = PCM_CHANNEL_LFE; lchannel_mapping[3] = PCM_CHANNEL_FC; lchannel_mapping[4] = PCM_CHANNEL_LS; lchannel_mapping[5] = PCM_CHANNEL_RS; lchannel_mapping[6] = PCM_CHANNEL_LB; lchannel_mapping[7] = PCM_CHANNEL_RB; lchannel_mapping[8] = PCM_CHANNEL_CS; lchannel_mapping[9] = PCM_CHANNEL_TS; lchannel_mapping[10] = PCM_CHANNEL_CVH; lchannel_mapping[11] = PCM_CHANNEL_MS; lchannel_mapping[12] = PCM_CHANNEL_FLC; lchannel_mapping[13] = PCM_CHANNEL_FRC; lchannel_mapping[14] = PCM_CHANNEL_RLC; lchannel_mapping[15] = PCM_CHANNEL_RRC; lchannel_mapping[16] = PCM_CHANNEL_LFE2; lchannel_mapping[17] = PCM_CHANNEL_SL; lchannel_mapping[18] = PCM_CHANNEL_SR; lchannel_mapping[19] = PCM_CHANNEL_TFL; lchannel_mapping[20] = PCM_CHANNEL_TFR; lchannel_mapping[21] = PCM_CHANNEL_TC; lchannel_mapping[22] = PCM_CHANNEL_TBL; lchannel_mapping[23] = PCM_CHANNEL_TBR; lchannel_mapping[24] = PCM_CHANNEL_TSL; lchannel_mapping[25] = PCM_CHANNEL_TSR; lchannel_mapping[26] = PCM_CHANNEL_TBC; lchannel_mapping[27] = PCM_CHANNEL_BFC; lchannel_mapping[28] = PCM_CHANNEL_BFL; lchannel_mapping[29] = PCM_CHANNEL_BFR; lchannel_mapping[30] = PCM_CHANNEL_LW; lchannel_mapping[31] = PCM_CHANNEL_RW; } else { pr_err("%s: ERROR.unsupported num_ch = %u\n", __func__, channels); Loading Loading
asoc/msm-dai-fe.c +36 −36 Original line number Diff line number Diff line Loading @@ -91,7 +91,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 16, .channels_max = 32, .rate_min = 8000, .rate_max = 384000, }, Loading @@ -105,7 +105,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 16, .channels_max = 32, .rate_min = 8000, .rate_max = 48000, }, Loading @@ -124,7 +124,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 384000, }, Loading @@ -138,7 +138,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 48000, }, Loading Loading @@ -184,7 +184,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 6, .channels_max = 32, .rate_min = 8000, .rate_max = 384000, }, Loading @@ -198,7 +198,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 48000, }, Loading @@ -217,7 +217,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 384000, }, Loading @@ -237,7 +237,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 384000, }, Loading @@ -251,7 +251,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 48000, }, Loading @@ -270,7 +270,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 384000, }, Loading @@ -284,7 +284,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 48000, }, Loading @@ -303,7 +303,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 16, .channels_max = 32, .rate_min = 8000, .rate_max = 384000, }, Loading @@ -323,7 +323,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 384000, }, Loading @@ -337,7 +337,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 48000, }, Loading Loading @@ -2140,7 +2140,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S24_3LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 384000, }, Loading @@ -2151,7 +2151,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_RATE_KNOT), .formats = SNDRV_PCM_FMTBIT_S16_LE, .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 48000, }, Loading Loading @@ -2332,7 +2332,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 384000, }, Loading Loading @@ -2364,7 +2364,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 384000, }, Loading @@ -2384,7 +2384,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 384000, }, Loading @@ -2404,7 +2404,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 384000, }, Loading @@ -2424,7 +2424,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 384000, }, Loading @@ -2444,7 +2444,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 384000, }, Loading @@ -2464,7 +2464,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 384000, }, Loading @@ -2478,7 +2478,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 48000, }, Loading Loading @@ -2546,7 +2546,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S24_3LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 192000, }, Loading @@ -2565,7 +2565,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S24_3LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 192000, }, Loading @@ -2584,7 +2584,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S24_3LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 192000, }, Loading @@ -2604,7 +2604,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 384000, }, Loading @@ -2618,7 +2618,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 48000, }, Loading @@ -2637,7 +2637,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 384000, }, Loading @@ -2651,7 +2651,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 48000, }, Loading Loading @@ -2708,7 +2708,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S24_3LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 192000, }, Loading @@ -2727,7 +2727,7 @@ static struct snd_soc_dai_driver msm_fe_dais[] = { SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S24_3LE), .channels_min = 1, .channels_max = 8, .channels_max = 32, .rate_min = 8000, .rate_max = 192000, }, Loading
asoc/msm-dai-q6-v2.c +168 −51 Original line number Diff line number Diff line Loading @@ -8144,6 +8144,9 @@ static int msm_dai_q6_tdm_set_tdm_slot(struct snd_soc_dai *dai, case 16: cap_mask = 0xFFFF; break; case 32: cap_mask = 0xFFFFFFFF; break; default: dev_err(dai->dev, "%s: invalid slots %d\n", __func__, slots); Loading Loading @@ -8293,6 +8296,8 @@ static int msm_dai_q6_tdm_set_channel_map(struct snd_soc_dai *dai, dev_get_drvdata(dai->dev); struct afe_param_id_slot_mapping_cfg *slot_mapping = &dai_data->port_cfg.slot_mapping; struct afe_param_id_slot_mapping_cfg_v2 *slot_mapping_v2 = &dai_data->port_cfg.slot_mapping_v2; int i = 0; dev_dbg(dai->dev, "%s: dai id = 0x%x\n", __func__, dai->id); Loading Loading @@ -8346,12 +8351,37 @@ static int msm_dai_q6_tdm_set_channel_map(struct snd_soc_dai *dai, case AFE_PORT_ID_SENARY_TDM_RX_5: case AFE_PORT_ID_SENARY_TDM_RX_6: case AFE_PORT_ID_SENARY_TDM_RX_7: if (q6core_get_avcs_api_version_per_service( APRV2_IDS_SERVICE_ID_ADSP_AFE_V) >= AFE_API_VERSION_V3) { if (!rx_slot) { dev_err(dai->dev, "%s: rx slot not found\n", __func__); return -EINVAL; } if (rx_num > AFE_PORT_MAX_AUDIO_CHAN_CNT_V2) { dev_err(dai->dev, "%s: invalid rx num %d\n", __func__, rx_num); return -EINVAL; } for (i = 0; i < rx_num; i++) slot_mapping_v2->offset[i] = rx_slot[i]; for (i = rx_num; i < AFE_PORT_MAX_AUDIO_CHAN_CNT_V2; i++) slot_mapping_v2->offset[i] = AFE_SLOT_MAPPING_OFFSET_INVALID; slot_mapping_v2->num_channel = rx_num; } else { if (!rx_slot) { dev_err(dai->dev, "%s: rx slot not found\n", __func__); dev_err(dai->dev, "%s: rx slot not found\n", __func__); return -EINVAL; } if (rx_num > AFE_PORT_MAX_AUDIO_CHAN_CNT) { dev_err(dai->dev, "%s: invalid rx num %d\n", __func__, dev_err(dai->dev, "%s: invalid rx num %d\n", __func__, rx_num); return -EINVAL; } Loading @@ -8363,6 +8393,7 @@ static int msm_dai_q6_tdm_set_channel_map(struct snd_soc_dai *dai, AFE_SLOT_MAPPING_OFFSET_INVALID; slot_mapping->num_channel = rx_num; } break; case AFE_PORT_ID_PRIMARY_TDM_TX: case AFE_PORT_ID_PRIMARY_TDM_TX_1: Loading Loading @@ -8412,12 +8443,37 @@ static int msm_dai_q6_tdm_set_channel_map(struct snd_soc_dai *dai, case AFE_PORT_ID_SENARY_TDM_TX_5: case AFE_PORT_ID_SENARY_TDM_TX_6: case AFE_PORT_ID_SENARY_TDM_TX_7: if (q6core_get_avcs_api_version_per_service( APRV2_IDS_SERVICE_ID_ADSP_AFE_V) >= AFE_API_VERSION_V3) { if (!tx_slot) { dev_err(dai->dev, "%s: tx slot not found\n", __func__); dev_err(dai->dev, "%s: tx slot not found\n", __func__); return -EINVAL; } if (tx_num > AFE_PORT_MAX_AUDIO_CHAN_CNT_V2) { dev_err(dai->dev, "%s: invalid tx num %d\n", __func__, tx_num); return -EINVAL; } for (i = 0; i < tx_num; i++) slot_mapping_v2->offset[i] = tx_slot[i]; for (i = tx_num; i < AFE_PORT_MAX_AUDIO_CHAN_CNT_V2; i++) slot_mapping_v2->offset[i] = AFE_SLOT_MAPPING_OFFSET_INVALID; slot_mapping_v2->num_channel = tx_num; } else { if (!tx_slot) { dev_err(dai->dev, "%s: tx slot not found\n", __func__); return -EINVAL; } if (tx_num > AFE_PORT_MAX_AUDIO_CHAN_CNT) { dev_err(dai->dev, "%s: invalid tx num %d\n", __func__, dev_err(dai->dev, "%s: invalid tx num %d\n", __func__, tx_num); return -EINVAL; } Loading @@ -8429,6 +8485,7 @@ static int msm_dai_q6_tdm_set_channel_map(struct snd_soc_dai *dai, AFE_SLOT_MAPPING_OFFSET_INVALID; slot_mapping->num_channel = tx_num; } break; default: dev_err(dai->dev, "%s: invalid dai id 0x%x\n", Loading @@ -8452,6 +8509,8 @@ static int msm_dai_q6_tdm_hw_params(struct snd_pcm_substream *substream, &dai_data->port_cfg.tdm; struct afe_param_id_slot_mapping_cfg *slot_mapping = &dai_data->port_cfg.slot_mapping; struct afe_param_id_slot_mapping_cfg_v2 *slot_mapping_v2 = &dai_data->port_cfg.slot_mapping_v2; struct afe_param_id_custom_tdm_header_cfg *custom_tdm_header = &dai_data->port_cfg.custom_tdm_header; Loading @@ -8459,7 +8518,7 @@ static int msm_dai_q6_tdm_hw_params(struct snd_pcm_substream *substream, __func__, dev_name(dai->dev)); if ((params_channels(params) == 0) || (params_channels(params) > 8)) { (params_channels(params) > 32)) { dev_err(dai->dev, "%s: invalid param channels %d\n", __func__, params_channels(params)); return -EINVAL; Loading Loading @@ -8561,7 +8620,63 @@ static int msm_dai_q6_tdm_hw_params(struct snd_pcm_substream *substream, tdm->ctrl_data_out_enable, tdm->ctrl_invert_sync_pulse, tdm->ctrl_sync_data_delay); if (q6core_get_avcs_api_version_per_service( APRV2_IDS_SERVICE_ID_ADSP_AFE_V) >= AFE_API_VERSION_V3) { /* * update slot mapping v2 config param * NOTE: channels/rate/bitwidth are per stream property */ slot_mapping_v2->bitwidth = dai_data->bitwidth; pr_debug("%s: SLOT MAPPING_V2:\n" "num_channel=%d bitwidth=%d data_align=0x%x\n", __func__, slot_mapping_v2->num_channel, slot_mapping_v2->bitwidth, slot_mapping_v2->data_align_type); pr_debug("%s: SLOT MAPPING V2:\n" "offset[0]=0x%x offset[1]=0x%x offset[2]=0x%x offset[3]=0x%x\n" "offset[4]=0x%x offset[5]=0x%x offset[6]=0x%x offset[7]=0x%x\n" "offset[8]=0x%x offset[9]=0x%x offset[10]=0x%x offset[11]=0x%x\n" "offset[12]=0x%x offset[13]=0x%x offset[14]=0x%x offset[15]=0x%x\n" "offset[16]=0x%x offset[17]=0x%x offset[18]=0x%x offset[19]=0x%x\n" "offset[20]=0x%x offset[21]=0x%x offset[22]=0x%x offset[23]=0x%x\n" "offset[24]=0x%x offset[25]=0x%x offset[26]=0x%x offset[27]=0x%x\n" "offset[28]=0x%x offset[29]=0x%x offset[30]=0x%x offset[31]=0x%x\n", __func__, slot_mapping_v2->offset[0], slot_mapping_v2->offset[1], slot_mapping_v2->offset[2], slot_mapping_v2->offset[3], slot_mapping_v2->offset[4], slot_mapping_v2->offset[5], slot_mapping_v2->offset[6], slot_mapping_v2->offset[7], slot_mapping_v2->offset[8], slot_mapping_v2->offset[9], slot_mapping_v2->offset[10], slot_mapping_v2->offset[11], slot_mapping_v2->offset[12], slot_mapping_v2->offset[13], slot_mapping_v2->offset[14], slot_mapping_v2->offset[15], slot_mapping_v2->offset[16], slot_mapping_v2->offset[17], slot_mapping_v2->offset[18], slot_mapping_v2->offset[19], slot_mapping_v2->offset[20], slot_mapping_v2->offset[21], slot_mapping_v2->offset[22], slot_mapping_v2->offset[23], slot_mapping_v2->offset[24], slot_mapping_v2->offset[25], slot_mapping_v2->offset[26], slot_mapping_v2->offset[27], slot_mapping_v2->offset[28], slot_mapping_v2->offset[29], slot_mapping_v2->offset[30], slot_mapping_v2->offset[31]); } else { /* * update slot mapping config param * NOTE: channels/rate/bitwidth are per stream property Loading @@ -8586,7 +8701,7 @@ static int msm_dai_q6_tdm_hw_params(struct snd_pcm_substream *substream, slot_mapping->offset[5], slot_mapping->offset[6], slot_mapping->offset[7]); } /* * update custom header config param * NOTE: channels/rate/bitwidth are per playback stream property. Loading Loading @@ -10922,6 +11037,8 @@ static int msm_dai_q6_tdm_dev_probe(struct platform_device *pdev) /* TDM SLOT MAPPING CFG -- set default */ dai_data->port_cfg.slot_mapping.minor_version = AFE_API_VERSION_SLOT_MAPPING_CONFIG; dai_data->port_cfg.slot_mapping_v2.minor_version = AFE_API_VERSION_SLOT_MAPPING_CONFIG_V2; /* CUSTOM TDM HEADER CFG */ custom_tdm_header = &dai_data->port_cfg.custom_tdm_header; Loading
dsp/q6adm.c +66 −0 Original line number Diff line number Diff line Loading @@ -2686,6 +2686,39 @@ static int adm_arrange_mch_map_v8( ep_payload->dev_channel_mapping[13] = PCM_CHANNEL_FRC; ep_payload->dev_channel_mapping[14] = PCM_CHANNEL_RLC; ep_payload->dev_channel_mapping[15] = PCM_CHANNEL_RRC; } else if (channel_mode == 32) { ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_LFE; ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_FC; ep_payload->dev_channel_mapping[4] = PCM_CHANNEL_LS; ep_payload->dev_channel_mapping[5] = PCM_CHANNEL_RS; ep_payload->dev_channel_mapping[6] = PCM_CHANNEL_LB; ep_payload->dev_channel_mapping[7] = PCM_CHANNEL_RB; ep_payload->dev_channel_mapping[8] = PCM_CHANNEL_CS; ep_payload->dev_channel_mapping[9] = PCM_CHANNEL_TS; ep_payload->dev_channel_mapping[10] = PCM_CHANNEL_CVH; ep_payload->dev_channel_mapping[11] = PCM_CHANNEL_MS; ep_payload->dev_channel_mapping[12] = PCM_CHANNEL_FLC; ep_payload->dev_channel_mapping[13] = PCM_CHANNEL_FRC; ep_payload->dev_channel_mapping[14] = PCM_CHANNEL_RLC; ep_payload->dev_channel_mapping[15] = PCM_CHANNEL_RRC; ep_payload->dev_channel_mapping[16] = PCM_CHANNEL_LFE2; ep_payload->dev_channel_mapping[17] = PCM_CHANNEL_SL; ep_payload->dev_channel_mapping[18] = PCM_CHANNEL_SR; ep_payload->dev_channel_mapping[19] = PCM_CHANNEL_TFL; ep_payload->dev_channel_mapping[20] = PCM_CHANNEL_TFR; ep_payload->dev_channel_mapping[21] = PCM_CHANNEL_TC; ep_payload->dev_channel_mapping[22] = PCM_CHANNEL_TBL; ep_payload->dev_channel_mapping[23] = PCM_CHANNEL_TBR; ep_payload->dev_channel_mapping[24] = PCM_CHANNEL_TSL; ep_payload->dev_channel_mapping[25] = PCM_CHANNEL_TSR; ep_payload->dev_channel_mapping[26] = PCM_CHANNEL_TBC; ep_payload->dev_channel_mapping[27] = PCM_CHANNEL_BFC; ep_payload->dev_channel_mapping[28] = PCM_CHANNEL_BFL; ep_payload->dev_channel_mapping[29] = PCM_CHANNEL_BFR; ep_payload->dev_channel_mapping[30] = PCM_CHANNEL_LW; ep_payload->dev_channel_mapping[31] = PCM_CHANNEL_RW; } else { pr_err("%s: invalid num_chan %d\n", __func__, channel_mode); Loading Loading @@ -2785,6 +2818,39 @@ static int adm_arrange_mch_ep2_map_v8( ep_payload->dev_channel_mapping[13] = PCM_CHANNEL_FRC; ep_payload->dev_channel_mapping[14] = PCM_CHANNEL_RLC; ep_payload->dev_channel_mapping[15] = PCM_CHANNEL_RRC; } else if (channel_mode == 32) { ep_payload->dev_channel_mapping[0] = PCM_CHANNEL_FL; ep_payload->dev_channel_mapping[1] = PCM_CHANNEL_FR; ep_payload->dev_channel_mapping[2] = PCM_CHANNEL_LFE; ep_payload->dev_channel_mapping[3] = PCM_CHANNEL_FC; ep_payload->dev_channel_mapping[4] = PCM_CHANNEL_LS; ep_payload->dev_channel_mapping[5] = PCM_CHANNEL_RS; ep_payload->dev_channel_mapping[6] = PCM_CHANNEL_LB; ep_payload->dev_channel_mapping[7] = PCM_CHANNEL_RB; ep_payload->dev_channel_mapping[8] = PCM_CHANNEL_CS; ep_payload->dev_channel_mapping[9] = PCM_CHANNEL_TS; ep_payload->dev_channel_mapping[10] = PCM_CHANNEL_CVH; ep_payload->dev_channel_mapping[11] = PCM_CHANNEL_MS; ep_payload->dev_channel_mapping[12] = PCM_CHANNEL_FLC; ep_payload->dev_channel_mapping[13] = PCM_CHANNEL_FRC; ep_payload->dev_channel_mapping[14] = PCM_CHANNEL_RLC; ep_payload->dev_channel_mapping[15] = PCM_CHANNEL_RRC; ep_payload->dev_channel_mapping[16] = PCM_CHANNEL_LFE2; ep_payload->dev_channel_mapping[17] = PCM_CHANNEL_SL; ep_payload->dev_channel_mapping[18] = PCM_CHANNEL_SR; ep_payload->dev_channel_mapping[19] = PCM_CHANNEL_TFL; ep_payload->dev_channel_mapping[20] = PCM_CHANNEL_TFR; ep_payload->dev_channel_mapping[21] = PCM_CHANNEL_TC; ep_payload->dev_channel_mapping[22] = PCM_CHANNEL_TBL; ep_payload->dev_channel_mapping[23] = PCM_CHANNEL_TBR; ep_payload->dev_channel_mapping[24] = PCM_CHANNEL_TSL; ep_payload->dev_channel_mapping[25] = PCM_CHANNEL_TSR; ep_payload->dev_channel_mapping[26] = PCM_CHANNEL_TBC; ep_payload->dev_channel_mapping[27] = PCM_CHANNEL_BFC; ep_payload->dev_channel_mapping[28] = PCM_CHANNEL_BFL; ep_payload->dev_channel_mapping[29] = PCM_CHANNEL_BFR; ep_payload->dev_channel_mapping[30] = PCM_CHANNEL_LW; ep_payload->dev_channel_mapping[31] = PCM_CHANNEL_RW; } else { pr_err("%s: invalid num_chan %d\n", __func__, channel_mode); Loading
dsp/q6afe.c +39 −2 Original line number Diff line number Diff line Loading @@ -3364,6 +3364,36 @@ int afe_send_slot_mapping_cfg( return ret; } int afe_send_slot_mapping_cfg_v2( struct afe_param_id_slot_mapping_cfg_v2 *slot_mapping_cfg, u16 port_id) { struct param_hdr_v3 param_hdr; int ret = 0; if (!slot_mapping_cfg) { pr_err("%s: Error, no configuration data\n", __func__); return -EINVAL; } pr_debug("%s: port id: 0x%x\n", __func__, port_id); memset(¶m_hdr, 0, sizeof(param_hdr)); param_hdr.module_id = AFE_MODULE_TDM; param_hdr.instance_id = INSTANCE_ID_0; param_hdr.param_id = AFE_PARAM_ID_PORT_SLOT_MAPPING_CONFIG; param_hdr.param_size = sizeof(struct afe_param_id_slot_mapping_cfg_v2); ret = q6afe_pack_and_set_param_in_band(port_id, q6audio_get_port_index(port_id), param_hdr, (u8 *) slot_mapping_cfg); if (ret < 0) pr_err("%s: AFE send slot mapping for port 0x%x failed ret = %d\n", __func__, port_id, ret); return ret; } int afe_send_custom_tdm_header_cfg( struct afe_param_id_custom_tdm_header_cfg *custom_tdm_header_cfg, u16 port_id) Loading Loading @@ -3503,8 +3533,15 @@ int afe_tdm_port_start(u16 port_id, struct afe_tdm_port_config *tdm_port, goto fail_cmd; } ret = afe_send_slot_mapping_cfg(&tdm_port->slot_mapping, if (q6core_get_avcs_api_version_per_service( APRV2_IDS_SERVICE_ID_ADSP_AFE_V) >= AFE_API_VERSION_V3) ret = afe_send_slot_mapping_cfg_v2( &tdm_port->slot_mapping_v2, port_id); else ret = afe_send_slot_mapping_cfg( &tdm_port->slot_mapping, port_id); if (ret < 0) { pr_err("%s: afe send failed %d\n", __func__, ret); goto fail_cmd; Loading
dsp/q6asm.c +33 −0 Original line number Diff line number Diff line Loading @@ -5775,6 +5775,39 @@ int q6asm_map_channels(u8 *channel_mapping, uint32_t channels, lchannel_mapping[13] = PCM_CHANNEL_FRC; lchannel_mapping[14] = PCM_CHANNEL_RLC; lchannel_mapping[15] = PCM_CHANNEL_RRC; } else if (channels == 32) { lchannel_mapping[0] = PCM_CHANNEL_FL; lchannel_mapping[1] = PCM_CHANNEL_FR; lchannel_mapping[2] = PCM_CHANNEL_LFE; lchannel_mapping[3] = PCM_CHANNEL_FC; lchannel_mapping[4] = PCM_CHANNEL_LS; lchannel_mapping[5] = PCM_CHANNEL_RS; lchannel_mapping[6] = PCM_CHANNEL_LB; lchannel_mapping[7] = PCM_CHANNEL_RB; lchannel_mapping[8] = PCM_CHANNEL_CS; lchannel_mapping[9] = PCM_CHANNEL_TS; lchannel_mapping[10] = PCM_CHANNEL_CVH; lchannel_mapping[11] = PCM_CHANNEL_MS; lchannel_mapping[12] = PCM_CHANNEL_FLC; lchannel_mapping[13] = PCM_CHANNEL_FRC; lchannel_mapping[14] = PCM_CHANNEL_RLC; lchannel_mapping[15] = PCM_CHANNEL_RRC; lchannel_mapping[16] = PCM_CHANNEL_LFE2; lchannel_mapping[17] = PCM_CHANNEL_SL; lchannel_mapping[18] = PCM_CHANNEL_SR; lchannel_mapping[19] = PCM_CHANNEL_TFL; lchannel_mapping[20] = PCM_CHANNEL_TFR; lchannel_mapping[21] = PCM_CHANNEL_TC; lchannel_mapping[22] = PCM_CHANNEL_TBL; lchannel_mapping[23] = PCM_CHANNEL_TBR; lchannel_mapping[24] = PCM_CHANNEL_TSL; lchannel_mapping[25] = PCM_CHANNEL_TSR; lchannel_mapping[26] = PCM_CHANNEL_TBC; lchannel_mapping[27] = PCM_CHANNEL_BFC; lchannel_mapping[28] = PCM_CHANNEL_BFL; lchannel_mapping[29] = PCM_CHANNEL_BFR; lchannel_mapping[30] = PCM_CHANNEL_LW; lchannel_mapping[31] = PCM_CHANNEL_RW; } else { pr_err("%s: ERROR.unsupported num_ch = %u\n", __func__, channels); Loading