mirror of
https://github.com/torvalds/linux.git
synced 2024-11-21 19:41:42 +00:00
sound fixes for 6.10-rc2
Lots of small fixes. - A race fix for debugfs handling in ALSA core - A series of corrections for MIDI2 core format conversions - ASoC Intel fixes for 16 bit DMIC config - Updates for missing module parameters in ASoC code - HD-audio quirk, Cirrus codec fix, etc minor fixes -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEEIXTw5fNLNI7mMiVaLtJE4w1nLE8FAmZZiIgOHHRpd2FpQHN1 c2UuZGUACgkQLtJE4w1nLE9UmxAAqEHl2rFbpYzdO+j3XEwf5u1cOJnLxNe28V+y f6NhEQQ0sXcXEt7yWfhHTscvxWJgWPyznpc87E/90wnZPCmAocFqloyLdkfZNNAa uc6kKKtVuX1qSSDGroqoNz6awEdRiuHmlQDZRk0l3VEOt69TFJevXqDcxItU//KK fTrvOn8ZPlL03V07s4lBSXb76ePF5Y+cU1sokpHOuvIbGVra4JNXMIyW+cFBW1Vf exoCYHsLec+KBaHW79/jreaeMJ8Gc8P8j5K4HnCzkoIS6hixfFYj8sb9pWVydfC2 H90yknHWiAMOnk5dkHP4GqJhyQ7YHgD6YIfTvwbBUrtmVYxSsIO18OLlRCbXgXft SSbDWxGTez8ga+Oi3f5r/nkpbFNJec+i74FIWqonIjE3txCQgBQj+Y/APce3g8o+ n/WZsmEWoVBXgufqx5/IxKfOFmA7d5hC4O7YfKGldah+Zd1PZ+uJF6b786uZ1w+/ wIf2h6FoAl1C4WgjRwZ7zS98niUxac6FINHWP5WD3rg7kNXOjyEEymyUH9RD1Ddf LHqHVCIeEvhSn/LfZUpnQCPRyeuLJrTvVaoEMKY1uq7Sr6FJUF3ocrmGfNuJFc6N vsSm7/PTiB+1KdL4TfbF5tlqi/RqyCqvjzdj38biqNR1+hor2KxolmNizd5IJD9y fucvEeI= =EI0R -----END PGP SIGNATURE----- Merge tag 'sound-6.10-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "Lots of small fixes: - A race fix for debugfs handling in ALSA core - A series of corrections for MIDI2 core format conversions - ASoC Intel fixes for 16 bit DMIC config - Updates for missing module parameters in ASoC code - HD-audio quirk, Cirrus codec fix, etc minor fixes" * tag 'sound-6.10-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (26 commits) ALSA: seq: ump: Fix swapped song position pointer data ASoC: SOF: ipc4-topology: Adjust the params based on DAI formats ASoC: SOF: ipc4-topology: Improve readability of sof_ipc4_prepare_dai_copier() ASoC: SOF: ipc4-topology/pcm: Rename sof_ipc4_copier_is_single_format() ASoC: SOF: ipc4-topology: Print out the channel count in sof_ipc4_dbg_audio_format ASoC: SOF: ipc4-topology: Add support for NHLT with 16-bit only DMIC blob ALSA: seq: Fix yet another spot for system message conversion ALSA: ump: Set default protocol when not given explicitly ALSA: ump: Don't accept an invalid UMP protocol number ASoC: SOF: ipc4-topology: Fix input format query of process modules without base extension ASoC: Intel: sof-sdw: fix missing SPI_MASTER dependency ALSA: pcm: fix typo in comment ALSA: ump: Don't clear bank selection after sending a program change ALSA: seq: Fix incorrect UMP type for system messages ALSA/hda: intel-dsp-config: reduce log verbosity ALSA: seq: Don't clear bank selection at event -> UMP MIDI2 conversion ALSA: seq: Fix missing bank setup between MIDI1/MIDI2 UMP conversion ASoC: SOF: add missing MODULE_DESCRIPTION() ASoC: SOF: reorder MODULE_ definitions ASoC: SOF: AMD: group all module related information ...
This commit is contained in:
commit
7d88cc8ecc
@ -5188,7 +5188,6 @@ F: Documentation/devicetree/bindings/media/i2c/chrontel,ch7322.yaml
|
||||
F: drivers/media/cec/i2c/ch7322.c
|
||||
|
||||
CIRRUS LOGIC AUDIO CODEC DRIVERS
|
||||
M: James Schulman <james.schulman@cirrus.com>
|
||||
M: David Rhodes <david.rhodes@cirrus.com>
|
||||
M: Richard Fitzgerald <rf@opensource.cirrus.com>
|
||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||
|
@ -124,7 +124,7 @@ struct snd_pcm_ops {
|
||||
#define SNDRV_PCM_RATE_768000 (1U<<16) /* 768000Hz */
|
||||
|
||||
#define SNDRV_PCM_RATE_CONTINUOUS (1U<<30) /* continuous range */
|
||||
#define SNDRV_PCM_RATE_KNOT (1U<<31) /* supports more non-continuos rates */
|
||||
#define SNDRV_PCM_RATE_KNOT (1U<<31) /* supports more non-continuous rates */
|
||||
|
||||
#define SNDRV_PCM_RATE_8000_44100 (SNDRV_PCM_RATE_8000|SNDRV_PCM_RATE_11025|\
|
||||
SNDRV_PCM_RATE_16000|SNDRV_PCM_RATE_22050|\
|
||||
|
@ -537,6 +537,11 @@ void snd_card_disconnect(struct snd_card *card)
|
||||
synchronize_irq(card->sync_irq);
|
||||
|
||||
snd_info_card_disconnect(card);
|
||||
#ifdef CONFIG_SND_DEBUG
|
||||
debugfs_remove(card->debugfs_root);
|
||||
card->debugfs_root = NULL;
|
||||
#endif
|
||||
|
||||
if (card->registered) {
|
||||
device_del(&card->card_dev);
|
||||
card->registered = false;
|
||||
@ -586,10 +591,6 @@ static int snd_card_do_free(struct snd_card *card)
|
||||
dev_warn(card->dev, "unable to free card info\n");
|
||||
/* Not fatal error */
|
||||
}
|
||||
#ifdef CONFIG_SND_DEBUG
|
||||
debugfs_remove(card->debugfs_root);
|
||||
card->debugfs_root = NULL;
|
||||
#endif
|
||||
if (card->release_completion)
|
||||
complete(card->release_completion);
|
||||
if (!card->managed)
|
||||
|
@ -37,11 +37,15 @@ static const int jack_switch_types[SND_JACK_SWITCH_TYPES] = {
|
||||
};
|
||||
#endif /* CONFIG_SND_JACK_INPUT_DEV */
|
||||
|
||||
static void snd_jack_remove_debugfs(struct snd_jack *jack);
|
||||
|
||||
static int snd_jack_dev_disconnect(struct snd_device *device)
|
||||
{
|
||||
#ifdef CONFIG_SND_JACK_INPUT_DEV
|
||||
struct snd_jack *jack = device->device_data;
|
||||
|
||||
snd_jack_remove_debugfs(jack);
|
||||
|
||||
#ifdef CONFIG_SND_JACK_INPUT_DEV
|
||||
guard(mutex)(&jack->input_dev_lock);
|
||||
if (!jack->input_dev)
|
||||
return 0;
|
||||
@ -381,10 +385,14 @@ static int snd_jack_debugfs_add_inject_node(struct snd_jack *jack,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void snd_jack_debugfs_clear_inject_node(struct snd_jack_kctl *jack_kctl)
|
||||
static void snd_jack_remove_debugfs(struct snd_jack *jack)
|
||||
{
|
||||
debugfs_remove(jack_kctl->jack_debugfs_root);
|
||||
jack_kctl->jack_debugfs_root = NULL;
|
||||
struct snd_jack_kctl *jack_kctl;
|
||||
|
||||
list_for_each_entry(jack_kctl, &jack->kctl_list, list) {
|
||||
debugfs_remove(jack_kctl->jack_debugfs_root);
|
||||
jack_kctl->jack_debugfs_root = NULL;
|
||||
}
|
||||
}
|
||||
#else /* CONFIG_SND_JACK_INJECTION_DEBUG */
|
||||
static int snd_jack_debugfs_add_inject_node(struct snd_jack *jack,
|
||||
@ -393,7 +401,7 @@ static int snd_jack_debugfs_add_inject_node(struct snd_jack *jack,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void snd_jack_debugfs_clear_inject_node(struct snd_jack_kctl *jack_kctl)
|
||||
static void snd_jack_remove_debugfs(struct snd_jack *jack)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_SND_JACK_INJECTION_DEBUG */
|
||||
@ -404,7 +412,6 @@ static void snd_jack_kctl_private_free(struct snd_kcontrol *kctl)
|
||||
|
||||
jack_kctl = kctl->private_data;
|
||||
if (jack_kctl) {
|
||||
snd_jack_debugfs_clear_inject_node(jack_kctl);
|
||||
list_del(&jack_kctl->list);
|
||||
kfree(jack_kctl);
|
||||
}
|
||||
@ -497,8 +504,8 @@ int snd_jack_new(struct snd_card *card, const char *id, int type,
|
||||
.dev_free = snd_jack_dev_free,
|
||||
#ifdef CONFIG_SND_JACK_INPUT_DEV
|
||||
.dev_register = snd_jack_dev_register,
|
||||
.dev_disconnect = snd_jack_dev_disconnect,
|
||||
#endif /* CONFIG_SND_JACK_INPUT_DEV */
|
||||
.dev_disconnect = snd_jack_dev_disconnect,
|
||||
};
|
||||
|
||||
if (initial_kctl) {
|
||||
|
@ -157,7 +157,7 @@ static void ump_system_to_one_param_ev(const union snd_ump_midi1_msg *val,
|
||||
static void ump_system_to_songpos_ev(const union snd_ump_midi1_msg *val,
|
||||
struct snd_seq_event *ev)
|
||||
{
|
||||
ev->data.control.value = (val->system.parm1 << 7) | val->system.parm2;
|
||||
ev->data.control.value = (val->system.parm2 << 7) | val->system.parm1;
|
||||
}
|
||||
|
||||
/* Encoders for 0xf0 - 0xff */
|
||||
@ -368,6 +368,7 @@ static int cvt_ump_midi1_to_midi2(struct snd_seq_client *dest,
|
||||
struct snd_seq_ump_event ev_cvt;
|
||||
const union snd_ump_midi1_msg *midi1 = (const union snd_ump_midi1_msg *)event->ump;
|
||||
union snd_ump_midi2_msg *midi2 = (union snd_ump_midi2_msg *)ev_cvt.ump;
|
||||
struct snd_seq_ump_midi2_bank *cc;
|
||||
|
||||
ev_cvt = *event;
|
||||
memset(&ev_cvt.ump, 0, sizeof(ev_cvt.ump));
|
||||
@ -387,11 +388,29 @@ static int cvt_ump_midi1_to_midi2(struct snd_seq_client *dest,
|
||||
midi2->paf.data = upscale_7_to_32bit(midi1->paf.data);
|
||||
break;
|
||||
case UMP_MSG_STATUS_CC:
|
||||
cc = &dest_port->midi2_bank[midi1->note.channel];
|
||||
switch (midi1->cc.index) {
|
||||
case UMP_CC_BANK_SELECT:
|
||||
cc->bank_set = 1;
|
||||
cc->cc_bank_msb = midi1->cc.data;
|
||||
return 0; // skip
|
||||
case UMP_CC_BANK_SELECT_LSB:
|
||||
cc->bank_set = 1;
|
||||
cc->cc_bank_lsb = midi1->cc.data;
|
||||
return 0; // skip
|
||||
}
|
||||
midi2->cc.index = midi1->cc.index;
|
||||
midi2->cc.data = upscale_7_to_32bit(midi1->cc.data);
|
||||
break;
|
||||
case UMP_MSG_STATUS_PROGRAM:
|
||||
midi2->pg.program = midi1->pg.program;
|
||||
cc = &dest_port->midi2_bank[midi1->note.channel];
|
||||
if (cc->bank_set) {
|
||||
midi2->pg.bank_valid = 1;
|
||||
midi2->pg.bank_msb = cc->cc_bank_msb;
|
||||
midi2->pg.bank_lsb = cc->cc_bank_lsb;
|
||||
cc->bank_set = 0;
|
||||
}
|
||||
break;
|
||||
case UMP_MSG_STATUS_CHANNEL_PRESSURE:
|
||||
midi2->caf.data = upscale_7_to_32bit(midi1->caf.data);
|
||||
@ -419,6 +438,7 @@ static int cvt_ump_midi2_to_midi1(struct snd_seq_client *dest,
|
||||
struct snd_seq_ump_event ev_cvt;
|
||||
union snd_ump_midi1_msg *midi1 = (union snd_ump_midi1_msg *)ev_cvt.ump;
|
||||
const union snd_ump_midi2_msg *midi2 = (const union snd_ump_midi2_msg *)event->ump;
|
||||
int err;
|
||||
u16 v;
|
||||
|
||||
ev_cvt = *event;
|
||||
@ -443,6 +463,24 @@ static int cvt_ump_midi2_to_midi1(struct snd_seq_client *dest,
|
||||
midi1->cc.data = downscale_32_to_7bit(midi2->cc.data);
|
||||
break;
|
||||
case UMP_MSG_STATUS_PROGRAM:
|
||||
if (midi2->pg.bank_valid) {
|
||||
midi1->cc.status = UMP_MSG_STATUS_CC;
|
||||
midi1->cc.index = UMP_CC_BANK_SELECT;
|
||||
midi1->cc.data = midi2->pg.bank_msb;
|
||||
err = __snd_seq_deliver_single_event(dest, dest_port,
|
||||
(struct snd_seq_event *)&ev_cvt,
|
||||
atomic, hop);
|
||||
if (err < 0)
|
||||
return err;
|
||||
midi1->cc.index = UMP_CC_BANK_SELECT_LSB;
|
||||
midi1->cc.data = midi2->pg.bank_lsb;
|
||||
err = __snd_seq_deliver_single_event(dest, dest_port,
|
||||
(struct snd_seq_event *)&ev_cvt,
|
||||
atomic, hop);
|
||||
if (err < 0)
|
||||
return err;
|
||||
midi1->note.status = midi2->note.status;
|
||||
}
|
||||
midi1->pg.program = midi2->pg.program;
|
||||
break;
|
||||
case UMP_MSG_STATUS_CHANNEL_PRESSURE:
|
||||
@ -691,6 +729,7 @@ static int system_ev_to_ump_midi1(const struct snd_seq_event *event,
|
||||
union snd_ump_midi1_msg *data,
|
||||
unsigned char status)
|
||||
{
|
||||
data->system.type = UMP_MSG_TYPE_SYSTEM; // override
|
||||
data->system.status = status;
|
||||
return 1;
|
||||
}
|
||||
@ -701,6 +740,7 @@ static int system_1p_ev_to_ump_midi1(const struct snd_seq_event *event,
|
||||
union snd_ump_midi1_msg *data,
|
||||
unsigned char status)
|
||||
{
|
||||
data->system.type = UMP_MSG_TYPE_SYSTEM; // override
|
||||
data->system.status = status;
|
||||
data->system.parm1 = event->data.control.value & 0x7f;
|
||||
return 1;
|
||||
@ -712,9 +752,10 @@ static int system_2p_ev_to_ump_midi1(const struct snd_seq_event *event,
|
||||
union snd_ump_midi1_msg *data,
|
||||
unsigned char status)
|
||||
{
|
||||
data->system.type = UMP_MSG_TYPE_SYSTEM; // override
|
||||
data->system.status = status;
|
||||
data->system.parm1 = (event->data.control.value >> 7) & 0x7f;
|
||||
data->system.parm2 = event->data.control.value & 0x7f;
|
||||
data->system.parm1 = event->data.control.value & 0x7f;
|
||||
data->system.parm2 = (event->data.control.value >> 7) & 0x7f;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -854,7 +895,6 @@ static int pgm_ev_to_ump_midi2(const struct snd_seq_event *event,
|
||||
data->pg.bank_msb = cc->cc_bank_msb;
|
||||
data->pg.bank_lsb = cc->cc_bank_lsb;
|
||||
cc->bank_set = 0;
|
||||
cc->cc_bank_msb = cc->cc_bank_lsb = 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
@ -685,10 +685,17 @@ static void seq_notify_protocol(struct snd_ump_endpoint *ump)
|
||||
*/
|
||||
int snd_ump_switch_protocol(struct snd_ump_endpoint *ump, unsigned int protocol)
|
||||
{
|
||||
unsigned int type;
|
||||
|
||||
protocol &= ump->info.protocol_caps;
|
||||
if (protocol == ump->info.protocol)
|
||||
return 0;
|
||||
|
||||
type = protocol & SNDRV_UMP_EP_INFO_PROTO_MIDI_MASK;
|
||||
if (type != SNDRV_UMP_EP_INFO_PROTO_MIDI1 &&
|
||||
type != SNDRV_UMP_EP_INFO_PROTO_MIDI2)
|
||||
return 0;
|
||||
|
||||
ump->info.protocol = protocol;
|
||||
ump_dbg(ump, "New protocol = %x (caps = %x)\n",
|
||||
protocol, ump->info.protocol_caps);
|
||||
@ -960,6 +967,14 @@ int snd_ump_parse_endpoint(struct snd_ump_endpoint *ump)
|
||||
if (err < 0)
|
||||
ump_dbg(ump, "Unable to get UMP EP stream config\n");
|
||||
|
||||
/* If no protocol is set by some reason, assume the valid one */
|
||||
if (!(ump->info.protocol & SNDRV_UMP_EP_INFO_PROTO_MIDI_MASK)) {
|
||||
if (ump->info.protocol_caps & SNDRV_UMP_EP_INFO_PROTO_MIDI2)
|
||||
ump->info.protocol |= SNDRV_UMP_EP_INFO_PROTO_MIDI2;
|
||||
else if (ump->info.protocol_caps & SNDRV_UMP_EP_INFO_PROTO_MIDI1)
|
||||
ump->info.protocol |= SNDRV_UMP_EP_INFO_PROTO_MIDI1;
|
||||
}
|
||||
|
||||
/* Query and create blocks from Function Blocks */
|
||||
for (blk = 0; blk < ump->info.num_blocks; blk++) {
|
||||
err = create_block_from_fb_info(ump, blk);
|
||||
|
@ -404,7 +404,6 @@ static int cvt_legacy_cmd_to_ump(struct ump_cvt_to_ump *cvt,
|
||||
midi2->pg.bank_msb = cc->cc_bank_msb;
|
||||
midi2->pg.bank_lsb = cc->cc_bank_lsb;
|
||||
cc->bank_set = 0;
|
||||
cc->cc_bank_msb = cc->cc_bank_lsb = 0;
|
||||
}
|
||||
break;
|
||||
case UMP_MSG_STATUS_CHANNEL_PRESSURE:
|
||||
|
@ -668,7 +668,7 @@ int snd_intel_dsp_driver_probe(struct pci_dev *pci)
|
||||
return SND_INTEL_DSP_DRIVER_LEGACY;
|
||||
}
|
||||
|
||||
dev_info(&pci->dev, "DSP detected with PCI class/subclass/prog-if info 0x%06x\n", pci->class);
|
||||
dev_dbg(&pci->dev, "DSP detected with PCI class/subclass/prog-if info 0x%06x\n", pci->class);
|
||||
|
||||
/* find the configuration for the specific device */
|
||||
cfg = snd_intel_dsp_find_config(pci, config_table, ARRAY_SIZE(config_table));
|
||||
@ -678,12 +678,12 @@ int snd_intel_dsp_driver_probe(struct pci_dev *pci)
|
||||
if (cfg->flags & FLAG_SOF) {
|
||||
if (cfg->flags & FLAG_SOF_ONLY_IF_SOUNDWIRE &&
|
||||
snd_intel_dsp_check_soundwire(pci) > 0) {
|
||||
dev_info(&pci->dev, "SoundWire enabled on CannonLake+ platform, using SOF driver\n");
|
||||
dev_info_once(&pci->dev, "SoundWire enabled on CannonLake+ platform, using SOF driver\n");
|
||||
return SND_INTEL_DSP_DRIVER_SOF;
|
||||
}
|
||||
if (cfg->flags & FLAG_SOF_ONLY_IF_DMIC &&
|
||||
snd_intel_dsp_check_dmic(pci)) {
|
||||
dev_info(&pci->dev, "Digital mics found on Skylake+ platform, using SOF driver\n");
|
||||
dev_info_once(&pci->dev, "Digital mics found on Skylake+ platform, using SOF driver\n");
|
||||
return SND_INTEL_DSP_DRIVER_SOF;
|
||||
}
|
||||
if (!(cfg->flags & FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE))
|
||||
@ -694,7 +694,7 @@ int snd_intel_dsp_driver_probe(struct pci_dev *pci)
|
||||
if (cfg->flags & FLAG_SST) {
|
||||
if (cfg->flags & FLAG_SST_ONLY_IF_DMIC) {
|
||||
if (snd_intel_dsp_check_dmic(pci)) {
|
||||
dev_info(&pci->dev, "Digital mics found on Skylake+ platform, using SST driver\n");
|
||||
dev_info_once(&pci->dev, "Digital mics found on Skylake+ platform, using SST driver\n");
|
||||
return SND_INTEL_DSP_DRIVER_SST;
|
||||
}
|
||||
} else {
|
||||
|
@ -10310,7 +10310,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2),
|
||||
SND_PCI_QUIRK(0x1043, 0x3a20, "ASUS G614JZR", ALC245_FIXUP_CS35L41_SPI_2),
|
||||
SND_PCI_QUIRK(0x1043, 0x3a30, "ASUS G814JVR/JIR", ALC245_FIXUP_CS35L41_SPI_2),
|
||||
SND_PCI_QUIRK(0x1043, 0x3a40, "ASUS G814JZR", ALC245_FIXUP_CS35L41_SPI_2),
|
||||
SND_PCI_QUIRK(0x1043, 0x3a40, "ASUS G814JZR", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),
|
||||
SND_PCI_QUIRK(0x1043, 0x3a50, "ASUS G834JYR/JZR", ALC245_FIXUP_CS35L41_SPI_2),
|
||||
SND_PCI_QUIRK(0x1043, 0x3a60, "ASUS G634JYR/JZR", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),
|
||||
SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC),
|
||||
|
@ -310,8 +310,9 @@ static int cs42l43_startup(struct snd_pcm_substream *substream, struct snd_soc_d
|
||||
struct snd_soc_component *component = dai->component;
|
||||
struct cs42l43_codec *priv = snd_soc_component_get_drvdata(component);
|
||||
struct cs42l43 *cs42l43 = priv->core;
|
||||
int provider = !!regmap_test_bits(cs42l43->regmap, CS42L43_ASP_CLK_CONFIG2,
|
||||
CS42L43_ASP_MASTER_MODE_MASK);
|
||||
int provider = !dai->id || !!regmap_test_bits(cs42l43->regmap,
|
||||
CS42L43_ASP_CLK_CONFIG2,
|
||||
CS42L43_ASP_MASTER_MODE_MASK);
|
||||
|
||||
if (provider)
|
||||
priv->constraint.mask = CS42L43_PROVIDER_RATE_MASK;
|
||||
|
@ -2085,5 +2085,6 @@ static const struct cs_dsp_client_ops wm_adsp2_client_ops = {
|
||||
.watchdog_expired = wm_adsp_fatal_error,
|
||||
};
|
||||
|
||||
MODULE_DESCRIPTION("Cirrus Logic ASoC DSP Support");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_IMPORT_NS(FW_CS_DSP);
|
||||
|
@ -652,7 +652,7 @@ if SND_SOC_SOF_INTEL_SOUNDWIRE
|
||||
|
||||
config SND_SOC_INTEL_SOUNDWIRE_SOF_MACH
|
||||
tristate "SoundWire generic machine driver"
|
||||
depends on I2C && ACPI
|
||||
depends on I2C && SPI_MASTER && ACPI
|
||||
depends on MFD_INTEL_LPSS || COMPILE_TEST
|
||||
depends on SND_SOC_INTEL_USER_FRIENDLY_LONG_NAMES || COMPILE_TEST
|
||||
depends on SOUNDWIRE
|
||||
|
@ -258,8 +258,8 @@ const struct snd_sof_dsp_ops sof_acp_common_ops = {
|
||||
};
|
||||
EXPORT_SYMBOL_NS(sof_acp_common_ops, SND_SOC_SOF_AMD_COMMON);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_DESCRIPTION("ACP SOF COMMON Driver");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_AMD_COMMON);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_XTENSA);
|
||||
MODULE_IMPORT_NS(SOUNDWIRE_AMD_INIT);
|
||||
MODULE_DESCRIPTION("ACP SOF COMMON Driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -801,7 +801,7 @@ void amd_sof_acp_remove(struct snd_sof_dev *sdev)
|
||||
}
|
||||
EXPORT_SYMBOL_NS(amd_sof_acp_remove, SND_SOC_SOF_AMD_COMMON);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_DESCRIPTION("AMD ACP sof driver");
|
||||
MODULE_IMPORT_NS(SOUNDWIRE_AMD_INIT);
|
||||
MODULE_IMPORT_NS(SND_AMD_SOUNDWIRE_ACPI);
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -140,7 +140,3 @@ int sof_acp63_ops_init(struct snd_sof_dev *sdev)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_AMD_COMMON);
|
||||
MODULE_DESCRIPTION("ACP63 SOF Driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -109,5 +109,6 @@ static struct pci_driver snd_sof_pci_amd_acp63_driver = {
|
||||
module_pci_driver(snd_sof_pci_amd_acp63_driver);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_DESCRIPTION("ACP63 SOF Driver");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_AMD_COMMON);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_PCI_DEV);
|
||||
|
@ -99,5 +99,6 @@ static struct pci_driver snd_sof_pci_amd_rmb_driver = {
|
||||
module_pci_driver(snd_sof_pci_amd_rmb_driver);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_DESCRIPTION("REMBRANDT SOF Driver");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_AMD_COMMON);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_PCI_DEV);
|
||||
|
@ -103,5 +103,6 @@ static struct pci_driver snd_sof_pci_amd_rn_driver = {
|
||||
module_pci_driver(snd_sof_pci_amd_rn_driver);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_DESCRIPTION("RENOIR SOF Driver");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_AMD_COMMON);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_PCI_DEV);
|
||||
|
@ -101,5 +101,6 @@ static struct pci_driver snd_sof_pci_amd_vgh_driver = {
|
||||
module_pci_driver(snd_sof_pci_amd_vgh_driver);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_DESCRIPTION("VANGOGH SOF Driver");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_AMD_COMMON);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_PCI_DEV);
|
||||
|
@ -140,7 +140,3 @@ int sof_rembrandt_ops_init(struct snd_sof_dev *sdev)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_AMD_COMMON);
|
||||
MODULE_DESCRIPTION("REMBRANDT SOF Driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -115,7 +115,3 @@ int sof_renoir_ops_init(struct snd_sof_dev *sdev)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_AMD_COMMON);
|
||||
MODULE_DESCRIPTION("RENOIR SOF Driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -161,7 +161,3 @@ int sof_vangogh_ops_init(struct snd_sof_dev *sdev)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_AMD_COMMON);
|
||||
MODULE_DESCRIPTION("VANGOGH SOF Driver");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -769,7 +769,7 @@ void sof_machine_unregister(struct snd_sof_dev *sdev, void *pdata)
|
||||
EXPORT_SYMBOL(sof_machine_unregister);
|
||||
|
||||
MODULE_AUTHOR("Liam Girdwood");
|
||||
MODULE_DESCRIPTION("Sound Open Firmware (SOF) Core");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_DESCRIPTION("Sound Open Firmware (SOF) Core");
|
||||
MODULE_ALIAS("platform:sof-audio");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_CLIENT);
|
||||
|
@ -75,3 +75,4 @@ void imx8_dump(struct snd_sof_dev *sdev, u32 flags)
|
||||
EXPORT_SYMBOL(imx8_dump);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_DESCRIPTION("SOF helpers for IMX platforms");
|
||||
|
@ -667,5 +667,6 @@ static struct platform_driver snd_sof_of_imx8_driver = {
|
||||
};
|
||||
module_platform_driver(snd_sof_of_imx8_driver);
|
||||
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_XTENSA);
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_DESCRIPTION("SOF support for IMX8 platforms");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_XTENSA);
|
||||
|
@ -514,5 +514,6 @@ static struct platform_driver snd_sof_of_imx8m_driver = {
|
||||
};
|
||||
module_platform_driver(snd_sof_of_imx8m_driver);
|
||||
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_XTENSA);
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_DESCRIPTION("SOF support for IMX8M platforms");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_XTENSA);
|
||||
|
@ -516,5 +516,6 @@ static struct platform_driver snd_sof_of_imx8ulp_driver = {
|
||||
};
|
||||
module_platform_driver(snd_sof_of_imx8ulp_driver);
|
||||
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_XTENSA);
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_DESCRIPTION("SOF support for IMX8ULP platforms");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_XTENSA);
|
||||
|
@ -418,3 +418,4 @@ void atom_set_mach_params(struct snd_soc_acpi_mach *mach,
|
||||
EXPORT_SYMBOL_NS(atom_set_mach_params, SND_SOC_SOF_INTEL_ATOM_HIFI_EP);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_DESCRIPTION("SOF support for Atom platforms");
|
||||
|
@ -694,6 +694,7 @@ static struct platform_driver snd_sof_acpi_intel_bdw_driver = {
|
||||
module_platform_driver(snd_sof_acpi_intel_bdw_driver);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_DESCRIPTION("SOF support for Broadwell platforms");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_INTEL_HIFI_EP_IPC);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_XTENSA);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_ACPI_DEV);
|
||||
|
@ -475,6 +475,7 @@ static struct platform_driver snd_sof_acpi_intel_byt_driver = {
|
||||
module_platform_driver(snd_sof_acpi_intel_byt_driver);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_DESCRIPTION("SOF support for Baytrail/Cherrytrail");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_INTEL_HIFI_EP_IPC);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_XTENSA);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_ACPI_DEV);
|
||||
|
@ -457,3 +457,4 @@ EXPORT_SYMBOL_NS_GPL(hda_codec_i915_exit, SND_SOC_SOF_HDA_AUDIO_CODEC_I915);
|
||||
#endif
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_DESCRIPTION("SOF support for HDaudio codecs");
|
||||
|
@ -328,6 +328,7 @@ void hda_dsp_ctrl_stop_chip(struct snd_sof_dev *sdev)
|
||||
}
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_DESCRIPTION("SOF helpers for HDaudio platforms");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_HDA_MLINK);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_HDA_AUDIO_CODEC);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_HDA_AUDIO_CODEC_I915);
|
||||
|
@ -972,3 +972,4 @@ EXPORT_SYMBOL_NS(hdac_bus_eml_enable_offload, SND_SOC_SOF_HDA_MLINK);
|
||||
#endif
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_DESCRIPTION("SOF support for HDaudio multi-link");
|
||||
|
@ -1522,6 +1522,7 @@ void hda_unregister_clients(struct snd_sof_dev *sdev)
|
||||
}
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_DESCRIPTION("SOF support for HDaudio platforms");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_PCI_DEV);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_HDA_AUDIO_CODEC);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_HDA_AUDIO_CODEC_I915);
|
||||
|
@ -105,6 +105,7 @@ static struct pci_driver snd_sof_pci_intel_apl_driver = {
|
||||
module_pci_driver(snd_sof_pci_intel_apl_driver);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_DESCRIPTION("SOF support for ApolloLake platforms");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_INTEL_HDA_GENERIC);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_PCI_DEV);
|
||||
|
@ -143,6 +143,7 @@ static struct pci_driver snd_sof_pci_intel_cnl_driver = {
|
||||
module_pci_driver(snd_sof_pci_intel_cnl_driver);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_DESCRIPTION("SOF support for CannonLake platforms");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_INTEL_HDA_GENERIC);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_PCI_DEV);
|
||||
|
@ -108,6 +108,7 @@ static struct pci_driver snd_sof_pci_intel_icl_driver = {
|
||||
module_pci_driver(snd_sof_pci_intel_icl_driver);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_DESCRIPTION("SOF support for IceLake platforms");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_INTEL_HDA_GENERIC);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_INTEL_CNL);
|
||||
|
@ -70,6 +70,7 @@ static struct pci_driver snd_sof_pci_intel_lnl_driver = {
|
||||
module_pci_driver(snd_sof_pci_intel_lnl_driver);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_DESCRIPTION("SOF support for LunarLake platforms");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_INTEL_HDA_GENERIC);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_INTEL_MTL);
|
||||
|
@ -133,6 +133,7 @@ static struct pci_driver snd_sof_pci_intel_mtl_driver = {
|
||||
module_pci_driver(snd_sof_pci_intel_mtl_driver);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_DESCRIPTION("SOF support for MeteorLake platforms");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_INTEL_HDA_GENERIC);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_PCI_DEV);
|
||||
|
@ -89,6 +89,7 @@ static struct pci_driver snd_sof_pci_intel_skl_driver = {
|
||||
module_pci_driver(snd_sof_pci_intel_skl_driver);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_DESCRIPTION("SOF support for SkyLake platforms");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_INTEL_HDA_GENERIC);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_PCI_DEV);
|
||||
|
@ -317,6 +317,7 @@ static struct pci_driver snd_sof_pci_intel_tgl_driver = {
|
||||
module_pci_driver(snd_sof_pci_intel_tgl_driver);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_DESCRIPTION("SOF support for TigerLake platforms");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_INTEL_HDA_GENERIC);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_INTEL_HDA_COMMON);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_INTEL_CNL);
|
||||
|
@ -244,6 +244,7 @@ static struct pci_driver snd_sof_pci_intel_tng_driver = {
|
||||
module_pci_driver(snd_sof_pci_intel_tng_driver);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_DESCRIPTION("SOF support for Tangier platforms");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_INTEL_HIFI_EP_IPC);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_XTENSA);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_PCI_DEV);
|
||||
|
@ -650,7 +650,7 @@ static int sof_ipc4_pcm_dai_link_fixup(struct snd_soc_pcm_runtime *rtd,
|
||||
struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(rtd, 0);
|
||||
struct sof_ipc4_audio_format *ipc4_fmt;
|
||||
struct sof_ipc4_copier *ipc4_copier;
|
||||
bool single_fmt = false;
|
||||
bool single_bitdepth = false;
|
||||
u32 valid_bits = 0;
|
||||
int dir, ret;
|
||||
|
||||
@ -682,18 +682,18 @@ static int sof_ipc4_pcm_dai_link_fixup(struct snd_soc_pcm_runtime *rtd,
|
||||
return 0;
|
||||
|
||||
if (dir == SNDRV_PCM_STREAM_PLAYBACK) {
|
||||
if (sof_ipc4_copier_is_single_format(sdev,
|
||||
if (sof_ipc4_copier_is_single_bitdepth(sdev,
|
||||
available_fmt->output_pin_fmts,
|
||||
available_fmt->num_output_formats)) {
|
||||
ipc4_fmt = &available_fmt->output_pin_fmts->audio_fmt;
|
||||
single_fmt = true;
|
||||
single_bitdepth = true;
|
||||
}
|
||||
} else {
|
||||
if (sof_ipc4_copier_is_single_format(sdev,
|
||||
if (sof_ipc4_copier_is_single_bitdepth(sdev,
|
||||
available_fmt->input_pin_fmts,
|
||||
available_fmt->num_input_formats)) {
|
||||
ipc4_fmt = &available_fmt->input_pin_fmts->audio_fmt;
|
||||
single_fmt = true;
|
||||
single_bitdepth = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -703,7 +703,7 @@ static int sof_ipc4_pcm_dai_link_fixup(struct snd_soc_pcm_runtime *rtd,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (single_fmt) {
|
||||
if (single_bitdepth) {
|
||||
snd_mask_none(fmt);
|
||||
valid_bits = SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH(ipc4_fmt->fmt_cfg);
|
||||
dev_dbg(component->dev, "Set %s to %d bit format\n", dai->name, valid_bits);
|
||||
|
@ -195,9 +195,10 @@ static void sof_ipc4_dbg_audio_format(struct device *dev, struct sof_ipc4_pin_fo
|
||||
for (i = 0; i < num_formats; i++) {
|
||||
struct sof_ipc4_audio_format *fmt = &pin_fmt[i].audio_fmt;
|
||||
dev_dbg(dev,
|
||||
"Pin index #%d: %uHz, %ubit (ch_map %#x ch_cfg %u interleaving_style %u fmt_cfg %#x) buffer size %d\n",
|
||||
pin_fmt[i].pin_index, fmt->sampling_frequency, fmt->bit_depth, fmt->ch_map,
|
||||
fmt->ch_cfg, fmt->interleaving_style, fmt->fmt_cfg,
|
||||
"Pin index #%d: %uHz, %ubit, %luch (ch_map %#x ch_cfg %u interleaving_style %u fmt_cfg %#x) buffer size %d\n",
|
||||
pin_fmt[i].pin_index, fmt->sampling_frequency, fmt->bit_depth,
|
||||
SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT(fmt->fmt_cfg),
|
||||
fmt->ch_map, fmt->ch_cfg, fmt->interleaving_style, fmt->fmt_cfg,
|
||||
pin_fmt[i].buffer_size);
|
||||
}
|
||||
}
|
||||
@ -217,6 +218,14 @@ sof_ipc4_get_input_pin_audio_fmt(struct snd_sof_widget *swidget, int pin_index)
|
||||
}
|
||||
|
||||
process = swidget->private;
|
||||
|
||||
/*
|
||||
* For process modules without base config extension, base module config
|
||||
* format is used for all input pins
|
||||
*/
|
||||
if (process->init_config != SOF_IPC4_MODULE_INIT_CONFIG_TYPE_BASE_CFG_WITH_EXT)
|
||||
return &process->base_config.audio_fmt;
|
||||
|
||||
base_cfg_ext = process->base_config_ext;
|
||||
|
||||
/*
|
||||
@ -1422,7 +1431,7 @@ static int snd_sof_get_hw_config_params(struct snd_sof_dev *sdev, struct snd_sof
|
||||
|
||||
static int
|
||||
snd_sof_get_nhlt_endpoint_data(struct snd_sof_dev *sdev, struct snd_sof_dai *dai,
|
||||
bool single_format,
|
||||
bool single_bitdepth,
|
||||
struct snd_pcm_hw_params *params, u32 dai_index,
|
||||
u32 linktype, u8 dir, u32 **dst, u32 *len)
|
||||
{
|
||||
@ -1445,7 +1454,7 @@ snd_sof_get_nhlt_endpoint_data(struct snd_sof_dev *sdev, struct snd_sof_dai *dai
|
||||
* Look for 32-bit blob first instead of 16-bit if copier
|
||||
* supports multiple formats
|
||||
*/
|
||||
if (bit_depth == 16 && !single_format) {
|
||||
if (bit_depth == 16 && !single_bitdepth) {
|
||||
dev_dbg(sdev->dev, "Looking for 32-bit blob first for DMIC\n");
|
||||
format_change = true;
|
||||
bit_depth = 32;
|
||||
@ -1483,6 +1492,8 @@ snd_sof_get_nhlt_endpoint_data(struct snd_sof_dev *sdev, struct snd_sof_dai *dai
|
||||
dir, dev_type);
|
||||
|
||||
if (!cfg) {
|
||||
bool get_new_blob = false;
|
||||
|
||||
if (format_change) {
|
||||
/*
|
||||
* The 32-bit blob was not found in NHLT table, try to
|
||||
@ -1490,7 +1501,20 @@ snd_sof_get_nhlt_endpoint_data(struct snd_sof_dev *sdev, struct snd_sof_dai *dai
|
||||
*/
|
||||
bit_depth = params_width(params);
|
||||
format_change = false;
|
||||
get_new_blob = true;
|
||||
} else if (linktype == SOF_DAI_INTEL_DMIC && !single_bitdepth) {
|
||||
/*
|
||||
* The requested 32-bit blob (no format change for the
|
||||
* blob request) was not found in NHLT table, try to
|
||||
* look for 16-bit blob if the copier supports multiple
|
||||
* formats
|
||||
*/
|
||||
bit_depth = 16;
|
||||
format_change = true;
|
||||
get_new_blob = true;
|
||||
}
|
||||
|
||||
if (get_new_blob) {
|
||||
cfg = intel_nhlt_get_endpoint_blob(sdev->dev, ipc4_data->nhlt,
|
||||
dai_index, nhlt_type,
|
||||
bit_depth, bit_depth,
|
||||
@ -1513,8 +1537,8 @@ out:
|
||||
|
||||
if (format_change) {
|
||||
/*
|
||||
* Update the params to reflect that we have loaded 32-bit blob
|
||||
* instead of the 16-bit.
|
||||
* Update the params to reflect that different blob was loaded
|
||||
* instead of the requested bit depth (16 -> 32 or 32 -> 16).
|
||||
* This information is going to be used by the caller to find
|
||||
* matching copier format on the dai side.
|
||||
*/
|
||||
@ -1522,7 +1546,11 @@ out:
|
||||
|
||||
m = hw_param_mask(params, SNDRV_PCM_HW_PARAM_FORMAT);
|
||||
snd_mask_none(m);
|
||||
snd_mask_set_format(m, SNDRV_PCM_FORMAT_S32_LE);
|
||||
if (bit_depth == 16)
|
||||
snd_mask_set_format(m, SNDRV_PCM_FORMAT_S16_LE);
|
||||
else
|
||||
snd_mask_set_format(m, SNDRV_PCM_FORMAT_S32_LE);
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -1530,7 +1558,7 @@ out:
|
||||
#else
|
||||
static int
|
||||
snd_sof_get_nhlt_endpoint_data(struct snd_sof_dev *sdev, struct snd_sof_dai *dai,
|
||||
bool single_format,
|
||||
bool single_bitdepth,
|
||||
struct snd_pcm_hw_params *params, u32 dai_index,
|
||||
u32 linktype, u8 dir, u32 **dst, u32 *len)
|
||||
{
|
||||
@ -1538,9 +1566,9 @@ snd_sof_get_nhlt_endpoint_data(struct snd_sof_dev *sdev, struct snd_sof_dai *dai
|
||||
}
|
||||
#endif
|
||||
|
||||
bool sof_ipc4_copier_is_single_format(struct snd_sof_dev *sdev,
|
||||
struct sof_ipc4_pin_format *pin_fmts,
|
||||
u32 pin_fmts_size)
|
||||
bool sof_ipc4_copier_is_single_bitdepth(struct snd_sof_dev *sdev,
|
||||
struct sof_ipc4_pin_format *pin_fmts,
|
||||
u32 pin_fmts_size)
|
||||
{
|
||||
struct sof_ipc4_audio_format *fmt;
|
||||
u32 valid_bits;
|
||||
@ -1563,6 +1591,55 @@ bool sof_ipc4_copier_is_single_format(struct snd_sof_dev *sdev,
|
||||
return true;
|
||||
}
|
||||
|
||||
static int
|
||||
sof_ipc4_adjust_params_to_dai_format(struct snd_sof_dev *sdev,
|
||||
struct snd_pcm_hw_params *params,
|
||||
struct sof_ipc4_pin_format *pin_fmts,
|
||||
u32 pin_fmts_size)
|
||||
{
|
||||
u32 params_mask = BIT(SNDRV_PCM_HW_PARAM_RATE) |
|
||||
BIT(SNDRV_PCM_HW_PARAM_CHANNELS) |
|
||||
BIT(SNDRV_PCM_HW_PARAM_FORMAT);
|
||||
struct sof_ipc4_audio_format *fmt;
|
||||
u32 rate, channels, valid_bits;
|
||||
int i;
|
||||
|
||||
fmt = &pin_fmts[0].audio_fmt;
|
||||
rate = fmt->sampling_frequency;
|
||||
channels = SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT(fmt->fmt_cfg);
|
||||
valid_bits = SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH(fmt->fmt_cfg);
|
||||
|
||||
/* check if parameters in topology defined formats are the same */
|
||||
for (i = 1; i < pin_fmts_size; i++) {
|
||||
u32 val;
|
||||
|
||||
fmt = &pin_fmts[i].audio_fmt;
|
||||
|
||||
if (params_mask & BIT(SNDRV_PCM_HW_PARAM_RATE)) {
|
||||
val = fmt->sampling_frequency;
|
||||
if (val != rate)
|
||||
params_mask &= ~BIT(SNDRV_PCM_HW_PARAM_RATE);
|
||||
}
|
||||
if (params_mask & BIT(SNDRV_PCM_HW_PARAM_CHANNELS)) {
|
||||
val = SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT(fmt->fmt_cfg);
|
||||
if (val != channels)
|
||||
params_mask &= ~BIT(SNDRV_PCM_HW_PARAM_CHANNELS);
|
||||
}
|
||||
if (params_mask & BIT(SNDRV_PCM_HW_PARAM_FORMAT)) {
|
||||
val = SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH(fmt->fmt_cfg);
|
||||
if (val != valid_bits)
|
||||
params_mask &= ~BIT(SNDRV_PCM_HW_PARAM_FORMAT);
|
||||
}
|
||||
}
|
||||
|
||||
if (params_mask)
|
||||
return sof_ipc4_update_hw_params(sdev, params,
|
||||
&pin_fmts[0].audio_fmt,
|
||||
params_mask);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
sof_ipc4_prepare_dai_copier(struct snd_sof_dev *sdev, struct snd_sof_dai *dai,
|
||||
struct snd_pcm_hw_params *params, int dir)
|
||||
@ -1570,8 +1647,10 @@ sof_ipc4_prepare_dai_copier(struct snd_sof_dev *sdev, struct snd_sof_dai *dai,
|
||||
struct sof_ipc4_available_audio_format *available_fmt;
|
||||
struct snd_pcm_hw_params dai_params = *params;
|
||||
struct sof_ipc4_copier_data *copier_data;
|
||||
struct sof_ipc4_pin_format *pin_fmts;
|
||||
struct sof_ipc4_copier *ipc4_copier;
|
||||
bool single_format;
|
||||
bool single_bitdepth;
|
||||
u32 num_pin_fmts;
|
||||
int ret;
|
||||
|
||||
ipc4_copier = dai->private;
|
||||
@ -1579,40 +1658,26 @@ sof_ipc4_prepare_dai_copier(struct snd_sof_dev *sdev, struct snd_sof_dai *dai,
|
||||
available_fmt = &ipc4_copier->available_fmt;
|
||||
|
||||
/*
|
||||
* If the copier on the DAI side supports only single bit depth then
|
||||
* this depth (format) should be used to look for the NHLT blob (if
|
||||
* needed) and in case of capture this should be used for the input
|
||||
* format lookup
|
||||
* Fixup the params based on the format parameters of the DAI. If any
|
||||
* of the RATE, CHANNELS, bit depth is static among the formats then
|
||||
* narrow the params to only allow that specific parameter value.
|
||||
*/
|
||||
if (dir == SNDRV_PCM_STREAM_PLAYBACK) {
|
||||
single_format = sof_ipc4_copier_is_single_format(sdev,
|
||||
available_fmt->output_pin_fmts,
|
||||
available_fmt->num_output_formats);
|
||||
|
||||
/* Update the dai_params with the only supported format */
|
||||
if (single_format) {
|
||||
ret = sof_ipc4_update_hw_params(sdev, &dai_params,
|
||||
&available_fmt->output_pin_fmts[0].audio_fmt,
|
||||
BIT(SNDRV_PCM_HW_PARAM_FORMAT));
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
pin_fmts = available_fmt->output_pin_fmts;
|
||||
num_pin_fmts = available_fmt->num_output_formats;
|
||||
} else {
|
||||
single_format = sof_ipc4_copier_is_single_format(sdev,
|
||||
available_fmt->input_pin_fmts,
|
||||
available_fmt->num_input_formats);
|
||||
|
||||
/* Update the dai_params with the only supported format */
|
||||
if (single_format) {
|
||||
ret = sof_ipc4_update_hw_params(sdev, &dai_params,
|
||||
&available_fmt->input_pin_fmts[0].audio_fmt,
|
||||
BIT(SNDRV_PCM_HW_PARAM_FORMAT));
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
pin_fmts = available_fmt->input_pin_fmts;
|
||||
num_pin_fmts = available_fmt->num_input_formats;
|
||||
}
|
||||
|
||||
ret = snd_sof_get_nhlt_endpoint_data(sdev, dai, single_format,
|
||||
ret = sof_ipc4_adjust_params_to_dai_format(sdev, &dai_params, pin_fmts,
|
||||
num_pin_fmts);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
single_bitdepth = sof_ipc4_copier_is_single_bitdepth(sdev, pin_fmts,
|
||||
num_pin_fmts);
|
||||
ret = snd_sof_get_nhlt_endpoint_data(sdev, dai, single_bitdepth,
|
||||
&dai_params,
|
||||
ipc4_copier->dai_index,
|
||||
ipc4_copier->dai_type, dir,
|
||||
@ -1647,7 +1712,7 @@ sof_ipc4_prepare_copier_module(struct snd_sof_widget *swidget,
|
||||
u32 out_ref_rate, out_ref_channels;
|
||||
u32 deep_buffer_dma_ms = 0;
|
||||
int output_fmt_index;
|
||||
bool single_output_format;
|
||||
bool single_output_bitdepth;
|
||||
int i;
|
||||
|
||||
dev_dbg(sdev->dev, "copier %s, type %d", swidget->widget->name, swidget->id);
|
||||
@ -1784,9 +1849,9 @@ sof_ipc4_prepare_copier_module(struct snd_sof_widget *swidget,
|
||||
return ret;
|
||||
|
||||
/* set the reference params for output format selection */
|
||||
single_output_format = sof_ipc4_copier_is_single_format(sdev,
|
||||
available_fmt->output_pin_fmts,
|
||||
available_fmt->num_output_formats);
|
||||
single_output_bitdepth = sof_ipc4_copier_is_single_bitdepth(sdev,
|
||||
available_fmt->output_pin_fmts,
|
||||
available_fmt->num_output_formats);
|
||||
switch (swidget->id) {
|
||||
case snd_soc_dapm_aif_in:
|
||||
case snd_soc_dapm_dai_out:
|
||||
@ -1798,7 +1863,7 @@ sof_ipc4_prepare_copier_module(struct snd_sof_widget *swidget,
|
||||
out_ref_rate = in_fmt->sampling_frequency;
|
||||
out_ref_channels = SOF_IPC4_AUDIO_FORMAT_CFG_CHANNELS_COUNT(in_fmt->fmt_cfg);
|
||||
|
||||
if (!single_output_format)
|
||||
if (!single_output_bitdepth)
|
||||
out_ref_valid_bits =
|
||||
SOF_IPC4_AUDIO_FORMAT_CFG_V_BIT_DEPTH(in_fmt->fmt_cfg);
|
||||
break;
|
||||
@ -1807,7 +1872,7 @@ sof_ipc4_prepare_copier_module(struct snd_sof_widget *swidget,
|
||||
case snd_soc_dapm_dai_in:
|
||||
out_ref_rate = params_rate(fe_params);
|
||||
out_ref_channels = params_channels(fe_params);
|
||||
if (!single_output_format) {
|
||||
if (!single_output_bitdepth) {
|
||||
out_ref_valid_bits = sof_ipc4_get_valid_bits(sdev, fe_params);
|
||||
if (out_ref_valid_bits < 0)
|
||||
return out_ref_valid_bits;
|
||||
@ -1825,7 +1890,7 @@ sof_ipc4_prepare_copier_module(struct snd_sof_widget *swidget,
|
||||
* if the output format is the same across all available output formats, choose
|
||||
* that as the reference.
|
||||
*/
|
||||
if (single_output_format) {
|
||||
if (single_output_bitdepth) {
|
||||
struct sof_ipc4_audio_format *out_fmt;
|
||||
|
||||
out_fmt = &available_fmt->output_pin_fmts[0].audio_fmt;
|
||||
|
@ -476,7 +476,7 @@ struct sof_ipc4_process {
|
||||
u32 init_config;
|
||||
};
|
||||
|
||||
bool sof_ipc4_copier_is_single_format(struct snd_sof_dev *sdev,
|
||||
struct sof_ipc4_pin_format *pin_fmts,
|
||||
u32 pin_fmts_size);
|
||||
bool sof_ipc4_copier_is_single_bitdepth(struct snd_sof_dev *sdev,
|
||||
struct sof_ipc4_pin_format *pin_fmts,
|
||||
u32 pin_fmts_size);
|
||||
#endif
|
||||
|
@ -666,6 +666,7 @@ static struct platform_driver snd_sof_of_mt8186_driver = {
|
||||
};
|
||||
module_platform_driver(snd_sof_of_mt8186_driver);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_DESCRIPTION("SOF support for MT8186/MT8188 platforms");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_XTENSA);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_MTK_COMMON);
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -619,6 +619,7 @@ static struct platform_driver snd_sof_of_mt8195_driver = {
|
||||
};
|
||||
module_platform_driver(snd_sof_of_mt8195_driver);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_DESCRIPTION("SOF support for MTL 8195 platforms");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_XTENSA);
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_MTK_COMMON);
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -82,3 +82,4 @@ void mtk_adsp_dump(struct snd_sof_dev *sdev, u32 flags)
|
||||
EXPORT_SYMBOL(mtk_adsp_dump);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_DESCRIPTION("SOF helpers for MTK ADSP platforms");
|
||||
|
@ -110,7 +110,7 @@ static struct platform_driver sof_nocodec_audio = {
|
||||
};
|
||||
module_platform_driver(sof_nocodec_audio)
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_DESCRIPTION("ASoC sof nocodec");
|
||||
MODULE_AUTHOR("Liam Girdwood");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_ALIAS("platform:sof-nocodec");
|
||||
|
@ -100,3 +100,4 @@ void sof_acpi_remove(struct platform_device *pdev)
|
||||
EXPORT_SYMBOL_NS(sof_acpi_remove, SND_SOC_SOF_ACPI_DEV);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_DESCRIPTION("SOF support for ACPI platforms");
|
||||
|
@ -394,6 +394,6 @@ static struct auxiliary_driver sof_ipc_flood_client_drv = {
|
||||
|
||||
module_auxiliary_driver(sof_ipc_flood_client_drv);
|
||||
|
||||
MODULE_DESCRIPTION("SOF IPC Flood Test Client Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION("SOF IPC Flood Test Client Driver");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_CLIENT);
|
||||
|
@ -157,6 +157,6 @@ static struct auxiliary_driver sof_msg_inject_client_drv = {
|
||||
|
||||
module_auxiliary_driver(sof_msg_inject_client_drv);
|
||||
|
||||
MODULE_DESCRIPTION("SOF IPC Kernel Injector Client Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION("SOF IPC Kernel Injector Client Driver");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_CLIENT);
|
||||
|
@ -335,6 +335,6 @@ static struct auxiliary_driver sof_msg_inject_client_drv = {
|
||||
|
||||
module_auxiliary_driver(sof_msg_inject_client_drv);
|
||||
|
||||
MODULE_DESCRIPTION("SOF IPC Message Injector Client Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION("SOF IPC Message Injector Client Driver");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_CLIENT);
|
||||
|
@ -540,6 +540,6 @@ static struct auxiliary_driver sof_probes_client_drv = {
|
||||
|
||||
module_auxiliary_driver(sof_probes_client_drv);
|
||||
|
||||
MODULE_DESCRIPTION("SOF Probes Client Driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
MODULE_DESCRIPTION("SOF Probes Client Driver");
|
||||
MODULE_IMPORT_NS(SND_SOC_SOF_CLIENT);
|
||||
|
@ -93,3 +93,4 @@ void sof_of_shutdown(struct platform_device *pdev)
|
||||
EXPORT_SYMBOL(sof_of_shutdown);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_DESCRIPTION("SOF support for OF/DT platforms");
|
||||
|
@ -304,3 +304,4 @@ void sof_pci_shutdown(struct pci_dev *pci)
|
||||
EXPORT_SYMBOL_NS(sof_pci_shutdown, SND_SOC_SOF_PCI_DEV);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_DESCRIPTION("SOF support for PCI platforms");
|
||||
|
@ -73,3 +73,4 @@ int snd_sof_create_page_table(struct device *dev,
|
||||
EXPORT_SYMBOL(snd_sof_create_page_table);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_DESCRIPTION("SOF utils");
|
||||
|
@ -125,5 +125,3 @@ int sof_stream_pcm_close(struct snd_sof_dev *sdev,
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(sof_stream_pcm_close);
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
@ -151,5 +151,5 @@ const struct dsp_arch_ops sof_xtensa_arch_ops = {
|
||||
};
|
||||
EXPORT_SYMBOL_NS(sof_xtensa_arch_ops, SND_SOC_SOF_XTENSA);
|
||||
|
||||
MODULE_DESCRIPTION("SOF Xtensa DSP support");
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
MODULE_DESCRIPTION("SOF Xtensa DSP support");
|
||||
|
Loading…
Reference in New Issue
Block a user