On 21/01/2021 14:56, Pierre-Louis Bossart wrote:
Port allocations are something like this:
RX: (Simple)
Port 1 -> HPH L/R
Port 2 -> CLASS H Amp
Port 3 -> COMP
Port 4 -> DSD.
TX: (This get bit more complicated)
Port 1: PCM
Port 2: ADC 1 & 2
Port 3: ADC 3 & 4
Port 4: DMIC-0, DMIC-1, DIMC-2 , DMIC-3 and MBHC
Port 5: DMIC-4, DMIC-5, DMIC-6 and DMIC-7
We handle the port allocation dynamically based on mixer and dapm
widgets in my code! Also channel allocations are different for each
function!
Sorry, I am not following here. What is dynamic here and use-case
dependent? And is this a mapping on the master or the codec sides that
you want to modify?
[SLAVE]-------[MASTER]
NA-------------Port 1: PCM
Port 1---------Port 2: ADC 1 & 2
Port 2---------Port 3: ADC 3 & 4
Port 3---------Port 4: DMIC-0, DMIC-1, DIMC-2 , DMIC-3 and MBHC
Port 4---------Port 5: DMIC-4, DMIC-5, DMIC-6 and DMIC-7
Mapping is still static however Number of ports selection and channel
mask will be dynamic here.
Example: for Headset MIC usecase we will be using Slv Port1, Slv Port3
along with Mstr Port2 and Master Port4
Similarly for usecases like Digital MIC or other Analog MICs.
Does this help and can you align on what Intel started with?
Firstly, This is where the issue comes, if we go with the
suggested(dai->id) solution, we would end up with a long list of
dai-links with different combinations of both inputs/output
connections and usecases. Again we have to deal with limited DSP
resources too!
Secondly, The check [1] in stream.c will not allow more than one
master port config to be added to master runtime. Ex: RX Port 1, 2, 3
is used for Headset Playback.
I am confused here, we do have examples in existing codec drivers where
we use multiple ports for a single stream, e.g. for IV feedback we use 2
ports.
Is this on multi_link? which is why it might be working for you.
Currently we have below check in sdw_stream_add_master().
if (!bus->multi_link && stream->m_rt_count > 0) {
dev_err(bus->dev, "Multilink not supported, link %d\n", bus->link_id);
ret = -EINVAL;
goto unlock;
}
If we have single master(like my case) and dai-links which have more
then one port will be calling sdw_stream_add_master() for each port,
so m_rt_count above check will fail for the second call!
In your "RX Port 1, 2, 3" example, are you referring to the codec or the
master side? If it's for the codec, it's already supported, see e.g.
Master side.
https://github.com/thesofproject/linux/pull/2514, we use DP2 and DP4 for
This fine on slave side! Issue is on the master side!
the same stream. This is done with the port_config capability.