Thanks Pierre for your inputs,
On 20/01/2021 22:15, Pierre-Louis Bossart wrote:
On 1/20/21 12:01 PM, Srinivas Kandagatla wrote:
Some of the soundwire controllers can have static functions assigned
to each port, like some ports can only do PCM or PDM. This is the
situation
with some of the Qualcomm Controllers.
In such cases its not correct to assign/map any free port on master
during streaming.
So, this patch provides a way to pass mapped port number along
with the port config, so that master can assign correct ports based
on the provided static mapping.
I am not sure I understand the problem or what's different between Intel
and Qualcomm.
On the Intel side we also have fixed-function ports, some for PDM and
some for PCM. They are not interchangeable, and they are also dedicated
for each link.
That is good to know!
We don't dynamically allocate ports on the master side, the mapping is
defined by the dai->id and is static. There is a 1:1 relationship
between dai->id and port_number. See intel_register_dai() and
intel_hw_params() in drivers/soundwire/intel.c
In the machine driver we make use of specific master DAIs in the dailink
definitions, just like regular ASoC solutions, so which DAIs you use in
the machine driver defines what ports end-up being used. There is
nothing fancy or dynamic here, the dai/port allocation is defined by the
dailinks. This is a static/worst-case allocation, we don't reassign
ports depending on use-cases, etc.
The only thing that is dynamic is that the programming of each port is
handled based on the bandwidth needs of that port, i.e if you play 16 or
24 bits you'd get fewer or more bitSlots allocated to that dai/port, and
the DPn registers are updated if you have concurrent streaming on other
ports. If you only have a fixed set of payloads, as in the existing
amplifier cases, you can hard-code this allocation as well.
Yes, it will work for the existing WSA881x amplifier case.
Am preparing patches for a new QCOM codec driver WCD938x (TX and RX)
connected via Soundwire,
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!
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.
But if we have a static mapping table of the ports then this will
provide more flexibility to codec driver! And we can dynamically select
ports based on the usecase or active dapm path!
--srini
[1]:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/soundwire/stream.c?h=v5.11-rc4#n1294