Laurentiu Mihalcea [Thu, 28 Mar 2024 22:12:00 +0000 (00:12 +0200)]
ASoC: SOF: imx: drop usage of the imx8_*_clocks API
Currently, the driver has to keep track of all the clocks
it uses via an array of "struct clk_bulk_data", which doesn't
scale well and is unnecessary. As such, replace the usage of
the imx8_*_clocks with "devm_clk_bulk_get_all()" and friends.
Signed-off-by: Laurentiu Mihalcea <laurentiu.mihalcea@nxp.com> Reviewed-by: Iuliana Prodan <iuliana.prodan@nxp.com> Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Reviewed-by: Daniel Baluta <daniel.baluta@nxp.com> Link: https://msgid.link/r/20240328221201.24722-2-laurentiumihalcea111@gmail.com Signed-off-by: Mark Brown <broonie@kernel.org>
Mark Brown [Tue, 2 Apr 2024 21:19:33 +0000 (22:19 +0100)]
ASoC: SOF: Intel: improve SoundWire support for
Merge series from Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>:
This patchset contains important updates for SoundWire support.
We initially implemented support for multiple amplifiers on different
links using a single HDaudio DMA transfer. To align with the other OS,
the 'aggregation' is now supported by the firmware. This change in
directions has kernel impacts, since we now have multiple HDaudio DMAs
to program and start, but since there are no platforms released so far
there's no end-user impact.
In addition, the behavior in case of xruns is improved by clearing the
PCM states and better handling of the hw_free case.
Note that the hw_free support will compile but will only be functional
with the companion patch "soundwire: intel: add intel_free_stream() back"
already applied in the SoundWire tree.
Mark Brown [Tue, 2 Apr 2024 21:19:21 +0000 (22:19 +0100)]
ASoC: Use snd_ctl_find_id_mixer() instead of
Merge series from Richard Fitzgerald <rf@opensource.cirrus.com>:
The first two patches change snd_soc_card_get_kcontrol() to use the
core snd_ctl_find_id_mixer() functionality instead of open-coding its
own list walk.
The last patch adds a KUnit test for this, which was tested on the
original and modified code.
Also correct the 'dai-format' to 'format' in document.
For 'audio-routing', the items are not listed. Because
this fsl-asoc-card is generic driver, which supports several
codecs, if list all the items, there will be a long list.
ASoC: SOF: ipc4-topology: Save the ALH DAI index during hw_params
The node_id for multi-gateway ALH DAI's get overwritten with the
group_id during the DAI copier's ipc_prepare op. So, save the ALH
dai_index during the BE DAI hw_params in the dai_index field of struct
ipc4_copier and use that to set the device ID in the configuration blob.
This will avoid errors during copier init after an xrun.
Note that the dai_index is typically set in topology for DMIC/SSP, but
it's not used for ALH. Reclaiming this dai_index field to store the
node_id does not generate a conflict with topology-defined values.
Reviewed-by: Rander Wang <rander.wang@intel.com> Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com> Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Link: https://msgid.link/r/20240402151828.175002-18-pierre-louis.bossart@linux.intel.com Signed-off-by: Mark Brown <broonie@kernel.org>
ASoC: SOF: pcm: reset all PCM sources in case of xruns
With the delayed stops, the xrun handling is problematic: the
applications expects everything to be reset but the firmware and DMA
are still in a PAUSED state.
This patch makes sure the prepare while pending_stop is set is
special-cased.
Reviewed-by: Rander Wang <rander.wang@intel.com> Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com> Co-developed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Link: https://msgid.link/r/20240402151828.175002-17-pierre-louis.bossart@linux.intel.com Signed-off-by: Mark Brown <broonie@kernel.org>
Add a state variable to keep track of delayed stops, in case
pcm_ops->platform_stop_during_hw_free is set.
This patch should be iso-functionality, possibly removing no-op
cases. The main purpose of this new state variable is to prepare a
follow-up patch to reset all PCM and DMAs in case of stop/prepare xrun
sequences.
ASoC: SOF: Intel: hda: Clear Soundwire node ID during BE DAI hw_free
When an xrun happens, the BE DAI hw_params doesn't get invoked before
the stream restarts with a prepare. In this case, clearing the node ID
when the DAI widget is freed and unprepared will result in an error when
it is re-initialized. In order to avoid this, move the code to clear the
node ID to the BE DAI hw_free op to keep it balanced with the BE DAI
hw_params.
Reviewed-by: Rander Wang <rander.wang@intel.com> Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com> Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Link: https://msgid.link/r/20240402151828.175002-13-pierre-louis.bossart@linux.intel.com Signed-off-by: Mark Brown <broonie@kernel.org>
ASoC: SOF: Intel: hda-dai: set dma_stream_channel_map device
sof_ipc4_dma_config_tlv{} is required for ACE2.x. The patch follow the
convention to set the dma_stream_channel_map.mapping device as
"link_id << 8 | pdi_id".
And the mapping in sof_ipc4_alh_configuration_blob{} should be the same
as dma_stream_channel_map.mapping in sof_ipc4_dma_config{}.
The purposes of device id is to map DMA tlv.
The SoundWire aggregated solution was to use one DMA on multiple links.
But, the solution changed to use one DMA for each link. It means that
we should assign HDaudio stream_tag for each cpu_dai.
The existing code derives the channel map used to program the HDaudio
link DMA from the hw_params, but that is not quite right in the case
of aggregation. The code in soc-pcm.c splits the hw_params depending
on the codec_ch_map, and we need to reconstruct the channel-map to
insert the data in the right places.
This issue is seen only on amplifier feedback capture where the data
from the second amplifier was replaced by that of the first amplifier.
Note that the loop iterator of the macro for_each_rtd_cpu_dais() is
reused in a following loop. This is different to all existing usages
of that macro, hence the use of a boolean flag to avoid an access to
an uninitialized variable.
Fixes: 2960ee5c4814 ("ASoC: SOF: Intel: hda-dai: add helpers for SoundWire callbacks") Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com> Reviewed-by: Rander Wang <rander.wang@intel.com> Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Link: https://msgid.link/r/20240402151828.175002-2-pierre-louis.bossart@linux.intel.com Signed-off-by: Mark Brown <broonie@kernel.org>
ASoC: SOF: amd: acp-loader: abort firmware download on write error
cppcheck reports this issue:
sound/soc/sof/amd/acp-loader.c:299:6: style: Variable 'ret' is
reassigned a value before the old one has been
used. [redundantAssignment]
ret = request_firmware(&adata->fw_dbin, fw_filename, sdev->dev);
^
sound/soc/sof/amd/acp-loader.c:289:6: note: ret is assigned
ret = snd_sof_dsp_block_write(sdev, SOF_FW_BLK_TYPE_IRAM, 0,
^
sound/soc/sof/amd/acp-loader.c:299:6: note: ret is overwritten
ret = request_firmware(&adata->fw_dbin, fw_filename, sdev->dev);
^
This behavior is probably unintentional, there's no reason to return
an error for the DRAM but not the IRAM.
R-Car Gen1 and Gen4 doesn't have SCU, and current driver checks Gen1
(only) on each devices (A). But these drivers are assuming it might be
not enabled after that (B).
/* This driver doesn't support Gen1 at this point */
(A) if (rsnd_is_gen1(priv))
return 0;
(B) node = rsnd_src_of_node(priv);
if (!node)
return 0; /* not used is not error */
Gen4 DT doesn't have these device settings. (A) check doesn't work for
it, but (B) check handling it.
Gen1 DT doesn't have these device settings either, and (A) is handling
it, but (B) only is very enough. (A) is no longer needed.
Renesas Sound driver is using rsnd_is_genX() macro to handling
difference. We can use "grep rsnd_is_gen" to find-out difference for
each SoC today.
In general, driver uses flag to handling SoC difference. But in Renesas
Sound case, the differences are very specific, if you try to make it
general, the code will become be very complicated.
Some of them can use flag to handling, but we can find-out all diffence
by using "grep rsnd_is_gen" today. It is not so good, but not so bad so
far. So we will keep current style for a while.
This patch cares Gen1/Gen2 exception by using negative handling to makes no
more update for this part when we support Gen5 or later.
- if (rsnd_is_gen3() || rsnd_is_gen4() || rsnd_is_gen5() || ...)
+ if (!rsnd_is_gen1() && !rsnd_is_gen2())
ASoC: rsnd: rename rsnd_is_e3() to rsnd_is_gen3_e3()
Renesas Sound driver is using rsnd_is_genX() macro to handling
difference. We can use "grep rsnd_is_gen" to find-out difference for
each SoC except rsnd_is_e3(). Let's put same rule for E3 as well.
All SoC has reg-name, no need to support getting resource from ID
any more. Remove it. To get physical address for DMA settings,
it still need to know the index, but it is no longer fixed.
This patch tidyup it.
Gen4 calls rsnd_gen_regmap_init() for SDMC, but the address is calculated
by rsnd_gen4_dma_addr(). It needs physical address, but other info are
not needed. use NULL conf for it.
Richard Fitzgerald [Mon, 1 Apr 2024 10:02:09 +0000 (10:02 +0000)]
ASoC: soc-card: Use snd_ctl_find_id_mixer() instead of open-coding
Use the snd_ctl_find_id_mixer[_locked]() wrapper in
snd_soc_card_get_kcontrol[_locked]() instead of open-coding a custom
list walk of the card controls list.
Adds wrapper function snd_ctl_find_id_mixer_locked(). This is
identical to snd_ctl_find_id_mixer() except that it can be called
from code that is already holding controls_rwsem.
Mark Brown [Fri, 29 Mar 2024 01:32:01 +0000 (01:32 +0000)]
ASoC: Intel: boards: updates for 6.10 - part3
Merge series from Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>:
This last part is the continuation of Brent Lu's cleanups. Multiple
quirks have been removed to use "default" configurations and
ACPI-based detection of codecs and selection of topology files.
This cleanup has been done in multiple steps/phases since Fall 2023,
thanks Brent for this contribution!
Frank Li [Thu, 28 Mar 2024 14:51:35 +0000 (10:51 -0400)]
ASoC: dt-bindings: fsl-sai: allow only one dma-names
Some sai only connect one direction dma (rx/tx) in SOC. For example:
imx8qxp sai5 only connect tx dma channel. So allow only one "rx" or "tx"
for dma-names.
Remove description under dmas because no user use index to get dma channel.
All user use 'dma-names' to get correct dma channel. dma-names already in
'required' list.
Seven Lee [Wed, 27 Mar 2024 07:57:55 +0000 (15:57 +0800)]
ASoC: nau8325: new driver
The driver is for amplifiers NAU8325 of Nuvoton Technology Corporation.
The NAU8325 is a stereo high efficiency filter-free Class-D audio
amplifier, which is capable of driving a 4ohm load with up to 3W output
power.
Seven Lee [Wed, 27 Mar 2024 07:57:54 +0000 (15:57 +0800)]
ASoC: dt-bindings: Added schema for "nuvoton,nau8325"
Add a DT schema for describing nau8325 audio amplifiers. The key features
are as follows:
- Low SPK_VDD Quiescent Current
- Gain Setting with 2-wire interface
- Powerful Stereo Class-D Amplifier
- Low Output Noise
- Low Current Shutdown Mode
- Click-and Pop Suppression
More resources :
https://www.nuvoton.com/products/smart-home-audio/audio-amplifiers/class-d-series/nau8325yg/
Brent Lu [Wed, 27 Mar 2024 16:24:08 +0000 (11:24 -0500)]
ASoC: Intel: sof_cs42l42: add mtl_cs42l42_def for mtl boards
Add the board config mtl_cs42l42_def to cs42l42 machine driver for all
mtl boards using default SSP port allocation (headphone codec on SSP2,
speaker amplifiers on SSP0, and BT offload on SSP1).
Brent Lu [Wed, 27 Mar 2024 16:24:07 +0000 (11:24 -0500)]
ASoC: Intel: sof_cs42l42: add rpl_cs42l42_def for rpl boards
Add the board config rpl_cs42l42_def to cs42l42 machine driver for all
rpl boards using default SSP port allocation (headphone codec on SSP0,
speaker amplifiers on SSP1, and BT offload on SSP2).
Brent Lu [Wed, 27 Mar 2024 16:24:06 +0000 (11:24 -0500)]
ASoC: Intel: sof_cs42l42: mach cleanup for adl boards
Add a common entry in enumeration table for all cs42l42 boards
with/without speaker amplifier. All other adl_cs42l42_def entries
become redundant so get removed.
Brent Lu [Wed, 27 Mar 2024 16:24:04 +0000 (11:24 -0500)]
ASoC: Intel: sof_rt5682: mach cleanup for mtl boards
Add two common entries in enumeration table for all rt5682/rt5650
boards with/without speaker amplifier. All other mtl_rt5682_def
entries become redundant so get removed.
Brent Lu [Wed, 27 Mar 2024 16:24:03 +0000 (11:24 -0500)]
ASoC: Intel: sof_rt5682: mach cleanup for rpl boards
Add two common entries in enumeration table for all rt5682/rt5650
boards with/without speaker amplifier. All other rpl_rt5682_def
entries become redundant so get removed.
Brent Lu [Wed, 27 Mar 2024 16:24:02 +0000 (11:24 -0500)]
ASoC: Intel: sof_rt5682: mach cleanup for adl boards
Add two common entries in enumeration table for all rt5682/rt5650
boards with/without speaker amplifier. All other adl_rt5682_def
entries become redundant so get removed.
Brent Lu [Wed, 27 Mar 2024 16:24:01 +0000 (11:24 -0500)]
ASoC: Intel: sof_rt5682: mach cleanup for tgl boards
Add a common entry in enumeration table for all rt5682 boards
with/without speaker amplifier. All other tgl_rt5682_def entries
become redundant so get removed.
Brent Lu [Wed, 27 Mar 2024 16:24:00 +0000 (11:24 -0500)]
ASoC: Intel: sof_nau8825: add mtl_nau8825_def for mtl boards
Add the board config mtl_nau8825_def to nau8825 machine driver for all
mtl boards using default SSP port allocation (headphone codec on SSP2,
speaker amplifiers on SSP0, and BT offload on SSP1).
Brent Lu [Wed, 27 Mar 2024 16:23:59 +0000 (11:23 -0500)]
ASoC: Intel: sof_nau8825: mach cleanup for rpl boards
Add a common entry in enumeration table for all nau8825 boards
with/without speaker amplifier. All other rpl_nau8825_def entries
become redundant so get removed.
Brent Lu [Wed, 27 Mar 2024 16:23:58 +0000 (11:23 -0500)]
ASoC: Intel: sof_nau8825: mach cleanup for adl boards
Add a common entry in enumeration table for all nau8825 boards
with/without speaker amplifier. All other adl_nau8825_def entries
become redundant so get removed.
Brent Lu [Wed, 27 Mar 2024 16:23:57 +0000 (11:23 -0500)]
ASoC: SOF: Intel: support tplg suffix detection
Add new flags to tplg_quirk_mask to detect and append codec/amplifier
tplg suffix to topology file name at runtime. With this feature we
could implement an enumeration entry for all boards which implement
same headphone codec regardless the speaker amplifier type.
Brent Lu [Wed, 27 Mar 2024 16:23:56 +0000 (11:23 -0500)]
ASoC: Intel: ssp-common: get codec tplg suffix function
Add helper functions to get tplg suffix string for specific headphone
codec or speaker amplifier. The string could be used to compose the
default topology file name for specific headphone codec and speaker
amplifier combination.
Brent Lu [Wed, 27 Mar 2024 16:23:52 +0000 (11:23 -0500)]
ASoC: Intel: ssp-common: relocate header file
Moving ssp-common header file from sound/soc/intel/common directory to
include/sound directory and rename the file. Keep file content
unchanged for tracking purpose.
Brent Lu [Wed, 27 Mar 2024 16:23:51 +0000 (11:23 -0500)]
ASoC: Intel: ssp-common: relocate source file
Moving ssp-common source and header files from sound/soc/intel/boards
directory to sound/soc/intel/common directory and rename the source
file. Keep file content unchanged for tracking purpose.
Ondrej Jirman [Wed, 27 Mar 2024 08:05:34 +0000 (09:05 +0100)]
ASoC: sun8i-codec: Fix build with CONFIG_SND_JACK_INPUT_DEV disabled
When CONFIG_SND_JACK_INPUT_DEV is disabled, struct snd_jack doesn't
have 'type' field. We can't rely on this field being always present,
so store the jack_type in the codec driver itself.
Signed-off-by: Ondrej Jirman <megi@xff.cz> Reported-by: kernel test robot <lkp@intel.com> Closes: https://lore.kernel.org/oe-kbuild-all/202403261243.kcXCPAYs-lkp@intel.com/ Link: https://msgid.link/r/20240327080542.3649840-1-megi@xff.cz Signed-off-by: Mark Brown <broonie@kernel.org>
Charles Keepax [Tue, 26 Mar 2024 16:04:29 +0000 (11:04 -0500)]
ASoC: Intel: sof_sdw: Add support for cs42l43 optional speaker output
Add support for the optional speaker output on the cs42l43, this uses
the new SOF_CODEC_SPKR quirk to conditional include the speaker DAI
link. It is worth noting that currently no systems are included that
utilise this feature, but the feature is added as several systems are on
the horizon. As part of this SOF_SDW_MAX_DAI_NUM must be increased, it
is currently 3 but cs42l43 will now have 4 DAI links. This value is
increased to 8 to give some head room for future devices.
Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com> Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com> Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Link: https://msgid.link/r/20240326160429.13560-35-pierre-louis.bossart@linux.intel.com Signed-off-by: Mark Brown <broonie@kernel.org>
Charles Keepax [Tue, 26 Mar 2024 16:04:28 +0000 (11:04 -0500)]
ASoC: Intel: sof_sdw: Add quirk for optional codec speakers
Some codecs have speaker drivers that may or may not be used in a
given system. Add a quirk (SOF_CODEC_SPKR) that defines if a system
uses the codec speaker, this is kept generic such that any codec
with such a speaker DAI can reuse the quirk.
For implementation of this, add a quirk field into the
sof_sdw_dai_info structure. This field is not used to specify
if a system uses a particular quirk, that is still done through
the sof_sdw_quirk variable, this field is used to flag a DAI as
conditional on a certain quirk. This means the DAI will only be
included in the card if sof_sdw_quirk and the DAI quirk field have
a matching set bit.
Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com> Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com> Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Link: https://msgid.link/r/20240326160429.13560-34-pierre-louis.bossart@linux.intel.com Signed-off-by: Mark Brown <broonie@kernel.org>
Charles Keepax [Tue, 26 Mar 2024 16:04:26 +0000 (11:04 -0500)]
ASoC: Intel: sof_sdw: Don't pass acpi_link_adr to init functions
There is no need to pass the snd_soc_acpi_link_adr structure to the init
functions, it conveys no specific information about the codec. Remove
this parameter from the callbacks
Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com> Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com> Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Link: https://msgid.link/r/20240326160429.13560-32-pierre-louis.bossart@linux.intel.com Signed-off-by: Mark Brown <broonie@kernel.org>