sound fixes for 6.14-rc4
A slightly large collection of fixes, spread over various drivers. Almost all are small and device-specific fixes and quirks in ASoC SOF Intel and AMD, Renesas, Cirrus, HD-audio, in addition to a small fix for MIDI 2.0. -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEEIXTw5fNLNI7mMiVaLtJE4w1nLE8FAme0bwIOHHRpd2FpQHN1 c2UuZGUACgkQLtJE4w1nLE+6SQ//ZUPAzra8D1zIR9Gfk/ImULAPOpK2R9MK6Tg9 u6LIbFEUVZ1/A5MbsYWbW6bdndu0q/pWYHmOSNbpbWPpnxANu/SGTqex6KjkEUWw Co5P/Mv9ZQWflI1tXGNtneS1cAnJ888qKrkNF2JnzENa0TeuiVOUuCNUI0Ro/SQ+ nxGtd1239zgzXYyruSe+Gj8haetBR3RfFKD042cGYY9TNNsnVFd0Tlsi5OLZYSk1 E0w4mJ92E3kpL9slFDVC9xa+pPy4e39y+2xpXqwN15kh86J5Gvp2w+Z8fz0W7EaV 6yZwx2xlM+DDO71gXoX4XwMLn93b4gQbFMjPdssDhVP9dH8aA04lRFDmvnRpy2eq m8c7TLw8M/QNtz784GvmmgZavv4/twbL0x7HvZ1VvSenbFX9UxozPaYHnfh+Ev4T vwjq8S7DX35gKKu7rEk/euGDnQ2wHEfD+f7inCKf1fB1o0oj3q0yxD6Olld3/M3L 8ALiDWQ8Yx42kpYpEpeQvStR0Ocb1BRQ5DrAhG2/v/z78sAZMorXF58cpzLphmmS wSDlZm4rNe23AZ5GUh6BwrdUpQjttQEyakMZ97xm1T/KDZ4niY1i4f5SLi6MR0ak ErkSSD0idSKdnxuZwuJCh18NjAgZE5ve5qgOPOYnUPr47LbXZuq/nCQAZ2ibFzV5 QlHZDQQ= =F+UA -----END PGP SIGNATURE----- Merge tag 'sound-6.14-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "A slightly large collection of fixes, spread over various drivers. Almost all are small and device-specific fixes and quirks in ASoC SOF Intel and AMD, Renesas, Cirrus, HD-audio, in addition to a small fix for MIDI 2.0" * tag 'sound-6.14-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (41 commits) ALSA: seq: Drop UMP events when no UMP-conversion is set ALSA: hda/conexant: Add quirk for HP ProBook 450 G4 mute LED ALSA: hda/cirrus: Reduce codec resume time ALSA: hda/cirrus: Correct the full scale volume set logic virtio_snd.h: clarify that `controls` depends on VIRTIO_SND_F_CTLS ALSA: hda: Add error check for snd_ctl_rename_id() in snd_hda_create_dig_out_ctls() ALSA: hda/tas2781: Fix index issue in tas2781 hda SPI driver ASoC: imx-audmix: remove cpu_mclk which is from cpu dai device ALSA: hda/realtek: Fixup ALC225 depop procedure ALSA: hda/tas2781: Update tas2781 hda SPI driver ASoC: cs35l41: Fix acpi_device_hid() not found ASoC: SOF: amd: Add branch prediction hint in ACP IRQ handler ASoC: SOF: amd: Handle IPC replies before FW_BOOT_COMPLETE ASoC: SOF: amd: Drop unused includes from Vangogh driver ASoC: SOF: amd: Add post_fw_run_delay ACP quirk ASoC: Intel: soc-acpi-intel-ptl-match: revise typo of rt713_vb_l2_rt1320_l13 ASoC: Intel: soc-acpi-intel-ptl-match: revise typo of rt712_vb + rt1320 support ALSA: Switch to use hrtimer_setup() ALSA: hda: hda-intel: add Panther Lake-H support ASoC: SOF: Intel: pci-ptl: Add support for PTL-H ...
This commit is contained in:
commit
6537cfb395
44 changed files with 319 additions and 186 deletions
|
@ -3134,6 +3134,7 @@
|
|||
#define PCI_DEVICE_ID_INTEL_HDA_LNL_P 0xa828
|
||||
#define PCI_DEVICE_ID_INTEL_S21152BB 0xb152
|
||||
#define PCI_DEVICE_ID_INTEL_HDA_BMG 0xe2f7
|
||||
#define PCI_DEVICE_ID_INTEL_HDA_PTL_H 0xe328
|
||||
#define PCI_DEVICE_ID_INTEL_HDA_PTL 0xe428
|
||||
#define PCI_DEVICE_ID_INTEL_HDA_CML_R 0xf0c8
|
||||
#define PCI_DEVICE_ID_INTEL_HDA_RKL_S 0xf1c8
|
||||
|
|
|
@ -25,7 +25,7 @@ struct virtio_snd_config {
|
|||
__le32 streams;
|
||||
/* # of available channel maps */
|
||||
__le32 chmaps;
|
||||
/* # of available control elements */
|
||||
/* # of available control elements (if VIRTIO_SND_F_CTLS) */
|
||||
__le32 controls;
|
||||
};
|
||||
|
||||
|
|
|
@ -66,9 +66,8 @@ static int snd_hrtimer_open(struct snd_timer *t)
|
|||
stime = kzalloc(sizeof(*stime), GFP_KERNEL);
|
||||
if (!stime)
|
||||
return -ENOMEM;
|
||||
hrtimer_init(&stime->hrt, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
|
||||
stime->timer = t;
|
||||
stime->hrt.function = snd_hrtimer_callback;
|
||||
hrtimer_setup(&stime->hrt, snd_hrtimer_callback, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
|
||||
t->private_data = stime;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -678,12 +678,18 @@ static int snd_seq_deliver_single_event(struct snd_seq_client *client,
|
|||
dest_port->time_real);
|
||||
|
||||
#if IS_ENABLED(CONFIG_SND_SEQ_UMP)
|
||||
if (!(dest->filter & SNDRV_SEQ_FILTER_NO_CONVERT)) {
|
||||
if (snd_seq_ev_is_ump(event)) {
|
||||
if (snd_seq_ev_is_ump(event)) {
|
||||
if (!(dest->filter & SNDRV_SEQ_FILTER_NO_CONVERT)) {
|
||||
result = snd_seq_deliver_from_ump(client, dest, dest_port,
|
||||
event, atomic, hop);
|
||||
goto __skip;
|
||||
} else if (snd_seq_client_is_ump(dest)) {
|
||||
} else if (dest->type == USER_CLIENT &&
|
||||
!snd_seq_client_is_ump(dest)) {
|
||||
result = 0; // drop the event
|
||||
goto __skip;
|
||||
}
|
||||
} else if (snd_seq_client_is_ump(dest)) {
|
||||
if (!(dest->filter & SNDRV_SEQ_FILTER_NO_CONVERT)) {
|
||||
result = snd_seq_deliver_to_ump(client, dest, dest_port,
|
||||
event, atomic, hop);
|
||||
goto __skip;
|
||||
|
|
|
@ -457,8 +457,7 @@ static int dummy_hrtimer_create(struct snd_pcm_substream *substream)
|
|||
if (!dpcm)
|
||||
return -ENOMEM;
|
||||
substream->runtime->private_data = dpcm;
|
||||
hrtimer_init(&dpcm->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_SOFT);
|
||||
dpcm->timer.function = dummy_hrtimer_callback;
|
||||
hrtimer_setup(&dpcm->timer, dummy_hrtimer_callback, CLOCK_MONOTONIC, HRTIMER_MODE_REL_SOFT);
|
||||
dpcm->substream = substream;
|
||||
atomic_set(&dpcm->running, 0);
|
||||
return 0;
|
||||
|
|
|
@ -103,8 +103,7 @@ static int snd_card_pcsp_probe(int devnum, struct device *dev)
|
|||
if (devnum != 0)
|
||||
return -EINVAL;
|
||||
|
||||
hrtimer_init(&pcsp_chip.timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
|
||||
pcsp_chip.timer.function = pcsp_do_timer;
|
||||
hrtimer_setup(&pcsp_chip.timer, pcsp_do_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
|
||||
|
||||
err = snd_devm_card_new(dev, index, id, THIS_MODULE, 0, &card);
|
||||
if (err < 0)
|
||||
|
|
|
@ -539,6 +539,11 @@ static const struct config_entry config_table[] = {
|
|||
.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
|
||||
.device = PCI_DEVICE_ID_INTEL_HDA_PTL,
|
||||
},
|
||||
{
|
||||
.flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE,
|
||||
.device = PCI_DEVICE_ID_INTEL_HDA_PTL_H,
|
||||
},
|
||||
|
||||
#endif
|
||||
|
||||
};
|
||||
|
|
|
@ -2470,7 +2470,9 @@ int snd_hda_create_dig_out_ctls(struct hda_codec *codec,
|
|||
break;
|
||||
id = kctl->id;
|
||||
id.index = spdif_index;
|
||||
snd_ctl_rename_id(codec->card, &kctl->id, &id);
|
||||
err = snd_ctl_rename_id(codec->card, &kctl->id, &id);
|
||||
if (err < 0)
|
||||
return err;
|
||||
}
|
||||
bus->primary_dig_out_type = HDA_PCM_TYPE_HDMI;
|
||||
}
|
||||
|
|
|
@ -2496,6 +2496,8 @@ static const struct pci_device_id azx_ids[] = {
|
|||
{ PCI_DEVICE_DATA(INTEL, HDA_ARL, AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE) },
|
||||
/* Panther Lake */
|
||||
{ PCI_DEVICE_DATA(INTEL, HDA_PTL, AZX_DRIVER_SKL | AZX_DCAPS_INTEL_LNL) },
|
||||
/* Panther Lake-H */
|
||||
{ PCI_DEVICE_DATA(INTEL, HDA_PTL_H, AZX_DRIVER_SKL | AZX_DCAPS_INTEL_LNL) },
|
||||
/* Apollolake (Broxton-P) */
|
||||
{ PCI_DEVICE_DATA(INTEL, HDA_APL, AZX_DRIVER_SKL | AZX_DCAPS_INTEL_BROXTON) },
|
||||
/* Gemini-Lake */
|
||||
|
|
|
@ -1090,6 +1090,7 @@ static const struct hda_quirk cxt5066_fixups[] = {
|
|||
SND_PCI_QUIRK(0x103c, 0x814f, "HP ZBook 15u G3", CXT_FIXUP_MUTE_LED_GPIO),
|
||||
SND_PCI_QUIRK(0x103c, 0x8174, "HP Spectre x360", CXT_FIXUP_HP_SPECTRE),
|
||||
SND_PCI_QUIRK(0x103c, 0x822e, "HP ProBook 440 G4", CXT_FIXUP_MUTE_LED_GPIO),
|
||||
SND_PCI_QUIRK(0x103c, 0x8231, "HP ProBook 450 G4", CXT_FIXUP_MUTE_LED_GPIO),
|
||||
SND_PCI_QUIRK(0x103c, 0x828c, "HP EliteBook 840 G4", CXT_FIXUP_HP_DOCK),
|
||||
SND_PCI_QUIRK(0x103c, 0x8299, "HP 800 G3 SFF", CXT_FIXUP_HP_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x103c, 0x829a, "HP 800 G3 DM", CXT_FIXUP_HP_MIC_NO_PRESENCE),
|
||||
|
|
|
@ -121,7 +121,7 @@ static const struct cs8409_i2c_param cs42l42_init_reg_seq[] = {
|
|||
{ CS42L42_MIXER_CHA_VOL, 0x3F },
|
||||
{ CS42L42_MIXER_CHB_VOL, 0x3F },
|
||||
{ CS42L42_MIXER_ADC_VOL, 0x3f },
|
||||
{ CS42L42_HP_CTL, 0x03 },
|
||||
{ CS42L42_HP_CTL, 0x0D },
|
||||
{ CS42L42_MIC_DET_CTL1, 0xB6 },
|
||||
{ CS42L42_TIPSENSE_CTL, 0xC2 },
|
||||
{ CS42L42_HS_CLAMP_DISABLE, 0x01 },
|
||||
|
@ -131,7 +131,7 @@ static const struct cs8409_i2c_param cs42l42_init_reg_seq[] = {
|
|||
{ CS42L42_RSENSE_CTL3, 0x00 },
|
||||
{ CS42L42_TSENSE_CTL, 0x80 },
|
||||
{ CS42L42_HS_BIAS_CTL, 0xC0 },
|
||||
{ CS42L42_PWR_CTL1, 0x02 },
|
||||
{ CS42L42_PWR_CTL1, 0x02, 10000 },
|
||||
{ CS42L42_ADC_OVFL_INT_MASK, 0xff },
|
||||
{ CS42L42_MIXER_INT_MASK, 0xff },
|
||||
{ CS42L42_SRC_INT_MASK, 0xff },
|
||||
|
@ -315,7 +315,7 @@ static const struct cs8409_i2c_param dolphin_c0_init_reg_seq[] = {
|
|||
{ CS42L42_ASP_TX_SZ_EN, 0x01 },
|
||||
{ CS42L42_PWR_CTL1, 0x0A },
|
||||
{ CS42L42_PWR_CTL2, 0x84 },
|
||||
{ CS42L42_HP_CTL, 0x03 },
|
||||
{ CS42L42_HP_CTL, 0x0D },
|
||||
{ CS42L42_MIXER_CHA_VOL, 0x3F },
|
||||
{ CS42L42_MIXER_CHB_VOL, 0x3F },
|
||||
{ CS42L42_MIXER_ADC_VOL, 0x3f },
|
||||
|
@ -328,7 +328,7 @@ static const struct cs8409_i2c_param dolphin_c0_init_reg_seq[] = {
|
|||
{ CS42L42_RSENSE_CTL3, 0x00 },
|
||||
{ CS42L42_TSENSE_CTL, 0x80 },
|
||||
{ CS42L42_HS_BIAS_CTL, 0xC0 },
|
||||
{ CS42L42_PWR_CTL1, 0x02 },
|
||||
{ CS42L42_PWR_CTL1, 0x02, 10000 },
|
||||
{ CS42L42_ADC_OVFL_INT_MASK, 0xff },
|
||||
{ CS42L42_MIXER_INT_MASK, 0xff },
|
||||
{ CS42L42_SRC_INT_MASK, 0xff },
|
||||
|
@ -371,7 +371,7 @@ static const struct cs8409_i2c_param dolphin_c1_init_reg_seq[] = {
|
|||
{ CS42L42_ASP_TX_SZ_EN, 0x00 },
|
||||
{ CS42L42_PWR_CTL1, 0x0E },
|
||||
{ CS42L42_PWR_CTL2, 0x84 },
|
||||
{ CS42L42_HP_CTL, 0x01 },
|
||||
{ CS42L42_HP_CTL, 0x0D },
|
||||
{ CS42L42_MIXER_CHA_VOL, 0x3F },
|
||||
{ CS42L42_MIXER_CHB_VOL, 0x3F },
|
||||
{ CS42L42_MIXER_ADC_VOL, 0x3f },
|
||||
|
@ -384,7 +384,7 @@ static const struct cs8409_i2c_param dolphin_c1_init_reg_seq[] = {
|
|||
{ CS42L42_RSENSE_CTL3, 0x00 },
|
||||
{ CS42L42_TSENSE_CTL, 0x80 },
|
||||
{ CS42L42_HS_BIAS_CTL, 0xC0 },
|
||||
{ CS42L42_PWR_CTL1, 0x06 },
|
||||
{ CS42L42_PWR_CTL1, 0x06, 10000 },
|
||||
{ CS42L42_ADC_OVFL_INT_MASK, 0xff },
|
||||
{ CS42L42_MIXER_INT_MASK, 0xff },
|
||||
{ CS42L42_SRC_INT_MASK, 0xff },
|
||||
|
|
|
@ -346,6 +346,11 @@ static int cs8409_i2c_bulk_write(struct sub_codec *scodec, const struct cs8409_i
|
|||
|
||||
if (cs8409_i2c_wait_complete(codec) < 0)
|
||||
goto error;
|
||||
/* Certain use cases may require a delay
|
||||
* after a write operation before proceeding.
|
||||
*/
|
||||
if (seq[i].delay)
|
||||
fsleep(seq[i].delay);
|
||||
}
|
||||
|
||||
mutex_unlock(&spec->i2c_mux);
|
||||
|
@ -876,7 +881,7 @@ static void cs42l42_resume(struct sub_codec *cs42l42)
|
|||
{ CS42L42_DET_INT_STATUS2, 0x00 },
|
||||
{ CS42L42_TSRS_PLUG_STATUS, 0x00 },
|
||||
};
|
||||
int fsv_old, fsv_new;
|
||||
unsigned int fsv;
|
||||
|
||||
/* Bring CS42L42 out of Reset */
|
||||
spec->gpio_data = snd_hda_codec_read(codec, CS8409_PIN_AFG, 0, AC_VERB_GET_GPIO_DATA, 0);
|
||||
|
@ -888,18 +893,19 @@ static void cs42l42_resume(struct sub_codec *cs42l42)
|
|||
|
||||
/* Initialize CS42L42 companion codec */
|
||||
cs8409_i2c_bulk_write(cs42l42, cs42l42->init_seq, cs42l42->init_seq_num);
|
||||
msleep(CS42L42_INIT_TIMEOUT_MS);
|
||||
|
||||
/* Clear interrupts, by reading interrupt status registers */
|
||||
cs8409_i2c_bulk_read(cs42l42, irq_regs, ARRAY_SIZE(irq_regs));
|
||||
|
||||
fsv_old = cs8409_i2c_read(cs42l42, CS42L42_HP_CTL);
|
||||
if (cs42l42->full_scale_vol == CS42L42_FULL_SCALE_VOL_0DB)
|
||||
fsv_new = fsv_old & ~CS42L42_FULL_SCALE_VOL_MASK;
|
||||
else
|
||||
fsv_new = fsv_old & CS42L42_FULL_SCALE_VOL_MASK;
|
||||
if (fsv_new != fsv_old)
|
||||
cs8409_i2c_write(cs42l42, CS42L42_HP_CTL, fsv_new);
|
||||
fsv = cs8409_i2c_read(cs42l42, CS42L42_HP_CTL);
|
||||
if (cs42l42->full_scale_vol) {
|
||||
// Set the full scale volume bit
|
||||
fsv |= CS42L42_FULL_SCALE_VOL_MASK;
|
||||
cs8409_i2c_write(cs42l42, CS42L42_HP_CTL, fsv);
|
||||
}
|
||||
// Unmute analog channels A and B
|
||||
fsv = (fsv & ~CS42L42_ANA_MUTE_AB);
|
||||
cs8409_i2c_write(cs42l42, CS42L42_HP_CTL, fsv);
|
||||
|
||||
/* we have to explicitly allow unsol event handling even during the
|
||||
* resume phase so that the jack event is processed properly
|
||||
|
@ -920,7 +926,7 @@ static void cs42l42_suspend(struct sub_codec *cs42l42)
|
|||
{ CS42L42_MIXER_CHA_VOL, 0x3F },
|
||||
{ CS42L42_MIXER_ADC_VOL, 0x3F },
|
||||
{ CS42L42_MIXER_CHB_VOL, 0x3F },
|
||||
{ CS42L42_HP_CTL, 0x0F },
|
||||
{ CS42L42_HP_CTL, 0x0D },
|
||||
{ CS42L42_ASP_RX_DAI0_EN, 0x00 },
|
||||
{ CS42L42_ASP_CLK_CFG, 0x00 },
|
||||
{ CS42L42_PWR_CTL1, 0xFE },
|
||||
|
|
|
@ -229,10 +229,10 @@ enum cs8409_coefficient_index_registers {
|
|||
#define CS42L42_I2C_SLEEP_US (2000)
|
||||
#define CS42L42_PDN_TIMEOUT_US (250000)
|
||||
#define CS42L42_PDN_SLEEP_US (2000)
|
||||
#define CS42L42_INIT_TIMEOUT_MS (45)
|
||||
#define CS42L42_ANA_MUTE_AB (0x0C)
|
||||
#define CS42L42_FULL_SCALE_VOL_MASK (2)
|
||||
#define CS42L42_FULL_SCALE_VOL_0DB (1)
|
||||
#define CS42L42_FULL_SCALE_VOL_MINUS6DB (0)
|
||||
#define CS42L42_FULL_SCALE_VOL_0DB (0)
|
||||
#define CS42L42_FULL_SCALE_VOL_MINUS6DB (1)
|
||||
|
||||
/* Dell BULLSEYE / WARLOCK / CYBORG Specific Definitions */
|
||||
|
||||
|
@ -290,6 +290,7 @@ enum {
|
|||
struct cs8409_i2c_param {
|
||||
unsigned int addr;
|
||||
unsigned int value;
|
||||
unsigned int delay;
|
||||
};
|
||||
|
||||
struct cs8409_cir_param {
|
||||
|
|
|
@ -3788,6 +3788,7 @@ static void alc225_init(struct hda_codec *codec)
|
|||
AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
|
||||
|
||||
msleep(75);
|
||||
alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
|
||||
alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
|
||||
}
|
||||
}
|
||||
|
@ -11045,6 +11046,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1d72, 0x1945, "Redmi G", ALC256_FIXUP_ASUS_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1d72, 0x1947, "RedmiBook Air", ALC255_FIXUP_XIAOMI_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1f66, 0x0105, "Ayaneo Portable Game Player", ALC287_FIXUP_CS35L41_I2C_2),
|
||||
SND_PCI_QUIRK(0x2014, 0x800a, "Positivo ARN50", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
|
||||
SND_PCI_QUIRK(0x2782, 0x0214, "VAIO VJFE-CL", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
|
||||
SND_PCI_QUIRK(0x2782, 0x0228, "Infinix ZERO BOOK 13", ALC269VB_FIXUP_INFINIX_ZERO_BOOK_13),
|
||||
SND_PCI_QUIRK(0x2782, 0x0232, "CHUWI CoreBook XPro", ALC269VB_FIXUP_CHUWI_COREBOOK_XPRO),
|
||||
|
|
|
@ -912,7 +912,7 @@ static void tasdev_fw_ready(const struct firmware *fmw, void *context)
|
|||
struct tasdevice_priv *tas_priv = context;
|
||||
struct tas2781_hda *tas_hda = dev_get_drvdata(tas_priv->dev);
|
||||
struct hda_codec *codec = tas_priv->codec;
|
||||
int i, j, ret;
|
||||
int i, j, ret, val;
|
||||
|
||||
pm_runtime_get_sync(tas_priv->dev);
|
||||
guard(mutex)(&tas_priv->codec_lock);
|
||||
|
@ -981,13 +981,16 @@ static void tasdev_fw_ready(const struct firmware *fmw, void *context)
|
|||
|
||||
/* Perform AMP reset before firmware download. */
|
||||
tas_priv->rcabin.profile_cfg_id = TAS2781_PRE_POST_RESET_CFG;
|
||||
tasdevice_spi_tuning_switch(tas_priv, 0);
|
||||
tas2781_spi_reset(tas_priv);
|
||||
tas_priv->rcabin.profile_cfg_id = 0;
|
||||
tasdevice_spi_tuning_switch(tas_priv, 1);
|
||||
|
||||
tas_priv->fw_state = TASDEVICE_DSP_FW_ALL_OK;
|
||||
ret = tasdevice_spi_prmg_load(tas_priv, 0);
|
||||
ret = tasdevice_spi_dev_read(tas_priv, TAS2781_REG_CLK_CONFIG, &val);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
if (val == TAS2781_REG_CLK_CONFIG_RESET)
|
||||
ret = tasdevice_spi_prmg_load(tas_priv, 0);
|
||||
if (ret < 0) {
|
||||
dev_err(tas_priv->dev, "FW download failed = %d\n", ret);
|
||||
goto out;
|
||||
|
@ -1001,7 +1004,6 @@ static void tasdev_fw_ready(const struct firmware *fmw, void *context)
|
|||
* If calibrated data occurs error, dsp will still works with default
|
||||
* calibrated data inside algo.
|
||||
*/
|
||||
tas_priv->save_calibration(tas_priv);
|
||||
|
||||
out:
|
||||
if (fmw)
|
||||
|
@ -1160,7 +1162,8 @@ static int tas2781_runtime_suspend(struct device *dev)
|
|||
|
||||
guard(mutex)(&tas_hda->priv->codec_lock);
|
||||
|
||||
tasdevice_spi_tuning_switch(tas_hda->priv, 1);
|
||||
if (tas_hda->priv->playback_started)
|
||||
tasdevice_spi_tuning_switch(tas_hda->priv, 1);
|
||||
|
||||
tas_hda->priv->cur_book = -1;
|
||||
tas_hda->priv->cur_conf = -1;
|
||||
|
@ -1174,7 +1177,8 @@ static int tas2781_runtime_resume(struct device *dev)
|
|||
|
||||
guard(mutex)(&tas_hda->priv->codec_lock);
|
||||
|
||||
tasdevice_spi_tuning_switch(tas_hda->priv, 0);
|
||||
if (tas_hda->priv->playback_started)
|
||||
tasdevice_spi_tuning_switch(tas_hda->priv, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1189,12 +1193,9 @@ static int tas2781_system_suspend(struct device *dev)
|
|||
return ret;
|
||||
|
||||
/* Shutdown chip before system suspend */
|
||||
tasdevice_spi_tuning_switch(tas_hda->priv, 1);
|
||||
tas2781_spi_reset(tas_hda->priv);
|
||||
/*
|
||||
* Reset GPIO may be shared, so cannot reset here.
|
||||
* However beyond this point, amps may be powered down.
|
||||
*/
|
||||
if (tas_hda->priv->playback_started)
|
||||
tasdevice_spi_tuning_switch(tas_hda->priv, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
//
|
||||
// TAS2781 HDA SPI driver
|
||||
//
|
||||
// Copyright 2024 Texas Instruments, Inc.
|
||||
// Copyright 2024-2025 Texas Instruments, Inc.
|
||||
//
|
||||
// Author: Baojun Xu <baojun.xu@ti.com>
|
||||
|
||||
|
@ -771,19 +771,19 @@ static int tasdevice_process_block(void *context, unsigned char *data,
|
|||
switch (subblk_typ) {
|
||||
case TASDEVICE_CMD_SING_W:
|
||||
subblk_offset = tasdevice_single_byte_wr(tas_priv,
|
||||
dev_idx & 0x4f, data, sublocksize);
|
||||
dev_idx & 0x3f, data, sublocksize);
|
||||
break;
|
||||
case TASDEVICE_CMD_BURST:
|
||||
subblk_offset = tasdevice_burst_wr(tas_priv,
|
||||
dev_idx & 0x4f, data, sublocksize);
|
||||
dev_idx & 0x3f, data, sublocksize);
|
||||
break;
|
||||
case TASDEVICE_CMD_DELAY:
|
||||
subblk_offset = tasdevice_delay(tas_priv,
|
||||
dev_idx & 0x4f, data, sublocksize);
|
||||
dev_idx & 0x3f, data, sublocksize);
|
||||
break;
|
||||
case TASDEVICE_CMD_FIELD_W:
|
||||
subblk_offset = tasdevice_field_wr(tas_priv,
|
||||
dev_idx & 0x4f, data, sublocksize);
|
||||
dev_idx & 0x3f, data, sublocksize);
|
||||
break;
|
||||
default:
|
||||
subblk_offset = 2;
|
||||
|
|
|
@ -312,8 +312,7 @@ static int snd_sh_dac_create(struct snd_card *card,
|
|||
|
||||
chip->card = card;
|
||||
|
||||
hrtimer_init(&chip->hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
|
||||
chip->hrtimer.function = sh_dac_audio_timer;
|
||||
hrtimer_setup(&chip->hrtimer, sh_dac_audio_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
|
||||
|
||||
dac_audio_reset(chip);
|
||||
chip->rate = 8000;
|
||||
|
|
|
@ -967,7 +967,7 @@ int arizona_out_ev(struct snd_soc_dapm_widget *w,
|
|||
case ARIZONA_OUT3L_ENA_SHIFT:
|
||||
case ARIZONA_OUT3R_ENA_SHIFT:
|
||||
priv->out_up_pending++;
|
||||
priv->out_up_delay += 17;
|
||||
priv->out_up_delay += 17000;
|
||||
break;
|
||||
case ARIZONA_OUT4L_ENA_SHIFT:
|
||||
case ARIZONA_OUT4R_ENA_SHIFT:
|
||||
|
@ -977,7 +977,7 @@ int arizona_out_ev(struct snd_soc_dapm_widget *w,
|
|||
case WM8997:
|
||||
break;
|
||||
default:
|
||||
priv->out_up_delay += 10;
|
||||
priv->out_up_delay += 10000;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
@ -999,7 +999,7 @@ int arizona_out_ev(struct snd_soc_dapm_widget *w,
|
|||
if (!priv->out_up_pending && priv->out_up_delay) {
|
||||
dev_dbg(component->dev, "Power up delay: %d\n",
|
||||
priv->out_up_delay);
|
||||
msleep(priv->out_up_delay);
|
||||
fsleep(priv->out_up_delay);
|
||||
priv->out_up_delay = 0;
|
||||
}
|
||||
break;
|
||||
|
@ -1017,7 +1017,7 @@ int arizona_out_ev(struct snd_soc_dapm_widget *w,
|
|||
case ARIZONA_OUT3L_ENA_SHIFT:
|
||||
case ARIZONA_OUT3R_ENA_SHIFT:
|
||||
priv->out_down_pending++;
|
||||
priv->out_down_delay++;
|
||||
priv->out_down_delay += 1000;
|
||||
break;
|
||||
case ARIZONA_OUT4L_ENA_SHIFT:
|
||||
case ARIZONA_OUT4R_ENA_SHIFT:
|
||||
|
@ -1028,10 +1028,10 @@ int arizona_out_ev(struct snd_soc_dapm_widget *w,
|
|||
break;
|
||||
case WM8998:
|
||||
case WM1814:
|
||||
priv->out_down_delay += 5;
|
||||
priv->out_down_delay += 5000;
|
||||
break;
|
||||
default:
|
||||
priv->out_down_delay++;
|
||||
priv->out_down_delay += 1000;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
@ -1053,7 +1053,7 @@ int arizona_out_ev(struct snd_soc_dapm_widget *w,
|
|||
if (!priv->out_down_pending && priv->out_down_delay) {
|
||||
dev_dbg(component->dev, "Power down delay: %d\n",
|
||||
priv->out_down_delay);
|
||||
msleep(priv->out_down_delay);
|
||||
fsleep(priv->out_down_delay);
|
||||
priv->out_down_delay = 0;
|
||||
}
|
||||
break;
|
||||
|
|
|
@ -1148,21 +1148,31 @@ err_dsp:
|
|||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
static int cs35l41_acpi_get_name(struct cs35l41_private *cs35l41)
|
||||
{
|
||||
acpi_handle handle = ACPI_HANDLE(cs35l41->dev);
|
||||
struct acpi_device *adev = ACPI_COMPANION(cs35l41->dev);
|
||||
acpi_handle handle = acpi_device_handle(adev);
|
||||
const char *hid;
|
||||
const char *sub;
|
||||
|
||||
/* If there is no ACPI_HANDLE, there is no ACPI for this system, return 0 */
|
||||
if (!handle)
|
||||
/* If there is no acpi_device, there is no ACPI for this system, return 0 */
|
||||
if (!adev)
|
||||
return 0;
|
||||
|
||||
sub = acpi_get_subsystem_id(handle);
|
||||
if (IS_ERR(sub)) {
|
||||
/* If bad ACPI, return 0 and fallback to legacy firmware path, otherwise fail */
|
||||
if (PTR_ERR(sub) == -ENODATA)
|
||||
return 0;
|
||||
else
|
||||
/* If no _SUB, fallback to _HID, otherwise fail */
|
||||
if (PTR_ERR(sub) == -ENODATA) {
|
||||
hid = acpi_device_hid(adev);
|
||||
/* If dummy hid, return 0 and fallback to legacy firmware path */
|
||||
if (!strcmp(hid, "device"))
|
||||
return 0;
|
||||
sub = kstrdup(hid, GFP_KERNEL);
|
||||
if (!sub)
|
||||
sub = ERR_PTR(-ENOMEM);
|
||||
|
||||
} else
|
||||
return PTR_ERR(sub);
|
||||
}
|
||||
|
||||
|
@ -1171,6 +1181,12 @@ static int cs35l41_acpi_get_name(struct cs35l41_private *cs35l41)
|
|||
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
static int cs35l41_acpi_get_name(struct cs35l41_private *cs35l41)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_ACPI */
|
||||
|
||||
int cs35l41_probe(struct cs35l41_private *cs35l41, const struct cs35l41_hw_cfg *hw_cfg)
|
||||
{
|
||||
|
|
|
@ -2323,10 +2323,10 @@ int madera_out_ev(struct snd_soc_dapm_widget *w,
|
|||
case CS42L92:
|
||||
case CS47L92:
|
||||
case CS47L93:
|
||||
out_up_delay = 6;
|
||||
out_up_delay = 6000;
|
||||
break;
|
||||
default:
|
||||
out_up_delay = 17;
|
||||
out_up_delay = 17000;
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -2357,7 +2357,7 @@ int madera_out_ev(struct snd_soc_dapm_widget *w,
|
|||
case MADERA_OUT3R_ENA_SHIFT:
|
||||
priv->out_up_pending--;
|
||||
if (!priv->out_up_pending) {
|
||||
msleep(priv->out_up_delay);
|
||||
fsleep(priv->out_up_delay);
|
||||
priv->out_up_delay = 0;
|
||||
}
|
||||
break;
|
||||
|
@ -2376,7 +2376,7 @@ int madera_out_ev(struct snd_soc_dapm_widget *w,
|
|||
case MADERA_OUT3L_ENA_SHIFT:
|
||||
case MADERA_OUT3R_ENA_SHIFT:
|
||||
priv->out_down_pending++;
|
||||
priv->out_down_delay++;
|
||||
priv->out_down_delay += 1000;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -2393,7 +2393,7 @@ int madera_out_ev(struct snd_soc_dapm_widget *w,
|
|||
case MADERA_OUT3R_ENA_SHIFT:
|
||||
priv->out_down_pending--;
|
||||
if (!priv->out_down_pending) {
|
||||
msleep(priv->out_down_delay);
|
||||
fsleep(priv->out_down_delay);
|
||||
priv->out_down_delay = 0;
|
||||
}
|
||||
break;
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
//
|
||||
// ALSA SoC Texas Instruments TAS2563/TAS2781 Audio Smart Amplifier
|
||||
//
|
||||
// Copyright (C) 2022 - 2024 Texas Instruments Incorporated
|
||||
// Copyright (C) 2022 - 2025 Texas Instruments Incorporated
|
||||
// https://www.ti.com
|
||||
//
|
||||
// The TAS2563/TAS2781 driver implements a flexible and configurable
|
||||
|
@ -1260,8 +1260,6 @@ static int tasdevice_create_cali_ctrls(struct tasdevice_priv *priv)
|
|||
(cali_data->cali_dat_sz_per_dev + 1) + 1 + 15 + 1;
|
||||
priv->cali_data.total_sz = priv->ndev *
|
||||
(cali_data->cali_dat_sz_per_dev + 1);
|
||||
priv->cali_data.data = devm_kzalloc(priv->dev,
|
||||
ext_cali_data->max, GFP_KERNEL);
|
||||
cali_ctrls[i].name = cali_name;
|
||||
cali_ctrls[i].iface = SNDRV_CTL_ELEM_IFACE_MIXER;
|
||||
cali_ctrls[i].info = snd_soc_bytes_info_ext;
|
||||
|
|
|
@ -302,7 +302,7 @@ static int wm5110_hp_pre_enable(struct snd_soc_dapm_widget *w)
|
|||
} else {
|
||||
wseq = wm5110_no_dre_left_enable;
|
||||
nregs = ARRAY_SIZE(wm5110_no_dre_left_enable);
|
||||
priv->out_up_delay += 10;
|
||||
priv->out_up_delay += 10000;
|
||||
}
|
||||
break;
|
||||
case ARIZONA_OUT1R_ENA_SHIFT:
|
||||
|
@ -312,7 +312,7 @@ static int wm5110_hp_pre_enable(struct snd_soc_dapm_widget *w)
|
|||
} else {
|
||||
wseq = wm5110_no_dre_right_enable;
|
||||
nregs = ARRAY_SIZE(wm5110_no_dre_right_enable);
|
||||
priv->out_up_delay += 10;
|
||||
priv->out_up_delay += 10000;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
@ -338,7 +338,7 @@ static int wm5110_hp_pre_disable(struct snd_soc_dapm_widget *w)
|
|||
snd_soc_component_update_bits(component,
|
||||
ARIZONA_SPARE_TRIGGERS,
|
||||
ARIZONA_WS_TRG1, 0);
|
||||
priv->out_down_delay += 27;
|
||||
priv->out_down_delay += 27000;
|
||||
}
|
||||
break;
|
||||
case ARIZONA_OUT1R_ENA_SHIFT:
|
||||
|
@ -350,7 +350,7 @@ static int wm5110_hp_pre_disable(struct snd_soc_dapm_widget *w)
|
|||
snd_soc_component_update_bits(component,
|
||||
ARIZONA_SPARE_TRIGGERS,
|
||||
ARIZONA_WS_TRG2, 0);
|
||||
priv->out_down_delay += 27;
|
||||
priv->out_down_delay += 27000;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -183,6 +183,8 @@ static int micfil_set_quality(struct fsl_micfil *micfil)
|
|||
case QUALITY_VLOW2:
|
||||
qsel = MICFIL_QSEL_VLOW2_QUALITY;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return regmap_update_bits(micfil->regmap, REG_MICFIL_CTRL2,
|
||||
|
|
|
@ -23,7 +23,6 @@ struct imx_audmix {
|
|||
struct snd_soc_card card;
|
||||
struct platform_device *audmix_pdev;
|
||||
struct platform_device *out_pdev;
|
||||
struct clk *cpu_mclk;
|
||||
int num_dai;
|
||||
struct snd_soc_dai_link *dai;
|
||||
int num_dai_conf;
|
||||
|
@ -32,34 +31,11 @@ struct imx_audmix {
|
|||
struct snd_soc_dapm_route *dapm_routes;
|
||||
};
|
||||
|
||||
static const u32 imx_audmix_rates[] = {
|
||||
8000, 12000, 16000, 24000, 32000, 48000, 64000, 96000,
|
||||
};
|
||||
|
||||
static const struct snd_pcm_hw_constraint_list imx_audmix_rate_constraints = {
|
||||
.count = ARRAY_SIZE(imx_audmix_rates),
|
||||
.list = imx_audmix_rates,
|
||||
};
|
||||
|
||||
static int imx_audmix_fe_startup(struct snd_pcm_substream *substream)
|
||||
{
|
||||
struct snd_soc_pcm_runtime *rtd = snd_soc_substream_to_rtd(substream);
|
||||
struct imx_audmix *priv = snd_soc_card_get_drvdata(rtd->card);
|
||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
||||
struct device *dev = rtd->card->dev;
|
||||
unsigned long clk_rate = clk_get_rate(priv->cpu_mclk);
|
||||
int ret;
|
||||
|
||||
if (clk_rate % 24576000 == 0) {
|
||||
ret = snd_pcm_hw_constraint_list(runtime, 0,
|
||||
SNDRV_PCM_HW_PARAM_RATE,
|
||||
&imx_audmix_rate_constraints);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
} else {
|
||||
dev_warn(dev, "mclk may be not supported %lu\n", clk_rate);
|
||||
}
|
||||
|
||||
ret = snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_CHANNELS,
|
||||
1, 8);
|
||||
if (ret < 0)
|
||||
|
@ -323,13 +299,6 @@ static int imx_audmix_probe(struct platform_device *pdev)
|
|||
}
|
||||
put_device(&cpu_pdev->dev);
|
||||
|
||||
priv->cpu_mclk = devm_clk_get(&cpu_pdev->dev, "mclk1");
|
||||
if (IS_ERR(priv->cpu_mclk)) {
|
||||
ret = PTR_ERR(priv->cpu_mclk);
|
||||
dev_err(&cpu_pdev->dev, "failed to get DAI mclk1: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
priv->audmix_pdev = audmix_pdev;
|
||||
priv->out_pdev = cpu_pdev;
|
||||
|
||||
|
|
|
@ -1092,6 +1092,7 @@ int graph_util_parse_dai(struct device *dev, struct device_node *ep,
|
|||
args.np = ep;
|
||||
dai = snd_soc_get_dai_via_args(&args);
|
||||
if (dai) {
|
||||
dlc->of_node = node;
|
||||
dlc->dai_name = snd_soc_dai_name_get(dai);
|
||||
dlc->dai_args = snd_soc_copy_dai_args(dev, &args);
|
||||
if (!dlc->dai_args)
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include <linux/soundwire/sdw.h>
|
||||
#include <linux/soundwire/sdw_type.h>
|
||||
#include <linux/soundwire/sdw_intel.h>
|
||||
#include <sound/core.h>
|
||||
#include <sound/soc-acpi.h>
|
||||
#include "sof_sdw_common.h"
|
||||
#include "../../codecs/rt711.h"
|
||||
|
@ -748,9 +749,36 @@ static const struct dmi_system_id sof_sdw_quirk_table[] = {
|
|||
},
|
||||
.driver_data = (void *)(SOC_SDW_PCH_DMIC),
|
||||
},
|
||||
{
|
||||
.callback = sof_sdw_quirk_cb,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Google"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Fatcat"),
|
||||
},
|
||||
.driver_data = (void *)(SOC_SDW_PCH_DMIC |
|
||||
SOF_BT_OFFLOAD_SSP(2) |
|
||||
SOF_SSP_BT_OFFLOAD_PRESENT),
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
static const struct snd_pci_quirk sof_sdw_ssid_quirk_table[] = {
|
||||
SND_PCI_QUIRK(0x1043, 0x1e13, "ASUS Zenbook S14", SOC_SDW_CODEC_MIC),
|
||||
{}
|
||||
};
|
||||
|
||||
static void sof_sdw_check_ssid_quirk(const struct snd_soc_acpi_mach *mach)
|
||||
{
|
||||
const struct snd_pci_quirk *quirk_entry;
|
||||
|
||||
quirk_entry = snd_pci_quirk_lookup_id(mach->mach_params.subsystem_vendor,
|
||||
mach->mach_params.subsystem_device,
|
||||
sof_sdw_ssid_quirk_table);
|
||||
|
||||
if (quirk_entry)
|
||||
sof_sdw_quirk = quirk_entry->value;
|
||||
}
|
||||
|
||||
static struct snd_soc_dai_link_component platform_component[] = {
|
||||
{
|
||||
/* name might be overridden during probe */
|
||||
|
@ -1278,6 +1306,13 @@ static int mc_probe(struct platform_device *pdev)
|
|||
|
||||
snd_soc_card_set_drvdata(card, ctx);
|
||||
|
||||
if (mach->mach_params.subsystem_id_set) {
|
||||
snd_soc_card_set_pci_ssid(card,
|
||||
mach->mach_params.subsystem_vendor,
|
||||
mach->mach_params.subsystem_device);
|
||||
sof_sdw_check_ssid_quirk(mach);
|
||||
}
|
||||
|
||||
dmi_check_system(sof_sdw_quirk_table);
|
||||
|
||||
if (quirk_override != -1) {
|
||||
|
@ -1293,12 +1328,6 @@ static int mc_probe(struct platform_device *pdev)
|
|||
for (i = 0; i < ctx->codec_info_list_count; i++)
|
||||
codec_info_list[i].amp_num = 0;
|
||||
|
||||
if (mach->mach_params.subsystem_id_set) {
|
||||
snd_soc_card_set_pci_ssid(card,
|
||||
mach->mach_params.subsystem_vendor,
|
||||
mach->mach_params.subsystem_device);
|
||||
}
|
||||
|
||||
ret = sof_card_dai_links_create(card);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
|
|
@ -330,7 +330,7 @@ static const struct snd_soc_acpi_adr_device rt1316_3_single_adr[] = {
|
|||
|
||||
static const struct snd_soc_acpi_adr_device rt1318_1_single_adr[] = {
|
||||
{
|
||||
.adr = 0x000130025D131801,
|
||||
.adr = 0x000130025D131801ull,
|
||||
.num_endpoints = 1,
|
||||
.endpoints = &single_endpoint,
|
||||
.name_prefix = "rt1318-1"
|
||||
|
|
|
@ -251,7 +251,7 @@ static const struct snd_soc_acpi_link_adr ptl_rvp[] = {
|
|||
{}
|
||||
};
|
||||
|
||||
static const struct snd_soc_acpi_link_adr lnl_sdw_rt713_vb_l2_rt1320_l13[] = {
|
||||
static const struct snd_soc_acpi_link_adr ptl_sdw_rt713_vb_l2_rt1320_l13[] = {
|
||||
{
|
||||
.mask = BIT(2),
|
||||
.num_adr = ARRAY_SIZE(rt713_vb_2_adr),
|
||||
|
@ -270,7 +270,7 @@ static const struct snd_soc_acpi_link_adr lnl_sdw_rt713_vb_l2_rt1320_l13[] = {
|
|||
{}
|
||||
};
|
||||
|
||||
static const struct snd_soc_acpi_link_adr lnl_sdw_rt712_vb_l2_rt1320_l1[] = {
|
||||
static const struct snd_soc_acpi_link_adr ptl_sdw_rt712_vb_l2_rt1320_l1[] = {
|
||||
{
|
||||
.mask = BIT(2),
|
||||
.num_adr = ARRAY_SIZE(rt712_vb_2_group1_adr),
|
||||
|
@ -337,17 +337,17 @@ struct snd_soc_acpi_mach snd_soc_acpi_intel_ptl_sdw_machines[] = {
|
|||
},
|
||||
{
|
||||
.link_mask = BIT(1) | BIT(2),
|
||||
.links = lnl_sdw_rt712_vb_l2_rt1320_l1,
|
||||
.links = ptl_sdw_rt712_vb_l2_rt1320_l1,
|
||||
.drv_name = "sof_sdw",
|
||||
.machine_check = snd_soc_acpi_intel_sdca_is_device_rt712_vb,
|
||||
.sof_tplg_filename = "sof-lnl-rt712-l2-rt1320-l1.tplg"
|
||||
.sof_tplg_filename = "sof-ptl-rt712-l2-rt1320-l1.tplg"
|
||||
},
|
||||
{
|
||||
.link_mask = BIT(1) | BIT(2) | BIT(3),
|
||||
.links = lnl_sdw_rt713_vb_l2_rt1320_l13,
|
||||
.links = ptl_sdw_rt713_vb_l2_rt1320_l13,
|
||||
.drv_name = "sof_sdw",
|
||||
.machine_check = snd_soc_acpi_intel_sdca_is_device_rt712_vb,
|
||||
.sof_tplg_filename = "sof-lnl-rt713-l2-rt1320-l13.tplg"
|
||||
.sof_tplg_filename = "sof-ptl-rt713-l2-rt1320-l13.tplg"
|
||||
},
|
||||
{},
|
||||
};
|
||||
|
|
|
@ -658,25 +658,25 @@ static const struct snd_soc_acpi_endpoint cs35l56_7_fb_endpoints[] = {
|
|||
|
||||
static const struct snd_soc_acpi_adr_device cs35l56_sdw_eight_1_4_fb_adr[] = {
|
||||
{
|
||||
.adr = 0x00003301fa355601,
|
||||
.adr = 0x00003301fa355601ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_l_fb_endpoints),
|
||||
.endpoints = cs35l56_l_fb_endpoints,
|
||||
.name_prefix = "AMP1"
|
||||
},
|
||||
{
|
||||
.adr = 0x00003201fa355601,
|
||||
.adr = 0x00003201fa355601ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_2_fb_endpoints),
|
||||
.endpoints = cs35l56_2_fb_endpoints,
|
||||
.name_prefix = "AMP2"
|
||||
},
|
||||
{
|
||||
.adr = 0x00003101fa355601,
|
||||
.adr = 0x00003101fa355601ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_4_fb_endpoints),
|
||||
.endpoints = cs35l56_4_fb_endpoints,
|
||||
.name_prefix = "AMP3"
|
||||
},
|
||||
{
|
||||
.adr = 0x00003001fa355601,
|
||||
.adr = 0x00003001fa355601ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_6_fb_endpoints),
|
||||
.endpoints = cs35l56_6_fb_endpoints,
|
||||
.name_prefix = "AMP4"
|
||||
|
@ -685,25 +685,25 @@ static const struct snd_soc_acpi_adr_device cs35l56_sdw_eight_1_4_fb_adr[] = {
|
|||
|
||||
static const struct snd_soc_acpi_adr_device cs35l56_sdw_eight_5_8_fb_adr[] = {
|
||||
{
|
||||
.adr = 0x00013701fa355601,
|
||||
.adr = 0x00013701fa355601ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_r_fb_endpoints),
|
||||
.endpoints = cs35l56_r_fb_endpoints,
|
||||
.name_prefix = "AMP8"
|
||||
},
|
||||
{
|
||||
.adr = 0x00013601fa355601,
|
||||
.adr = 0x00013601fa355601ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_3_fb_endpoints),
|
||||
.endpoints = cs35l56_3_fb_endpoints,
|
||||
.name_prefix = "AMP7"
|
||||
},
|
||||
{
|
||||
.adr = 0x00013501fa355601,
|
||||
.adr = 0x00013501fa355601ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_5_fb_endpoints),
|
||||
.endpoints = cs35l56_5_fb_endpoints,
|
||||
.name_prefix = "AMP6"
|
||||
},
|
||||
{
|
||||
.adr = 0x00013401fa355601,
|
||||
.adr = 0x00013401fa355601ull,
|
||||
.num_endpoints = ARRAY_SIZE(cs35l56_7_fb_endpoints),
|
||||
.endpoints = cs35l56_7_fb_endpoints,
|
||||
.name_prefix = "AMP5"
|
||||
|
|
|
@ -1770,20 +1770,6 @@ int rsnd_kctrl_accept_anytime(struct rsnd_dai_stream *io)
|
|||
return 1;
|
||||
}
|
||||
|
||||
int rsnd_kctrl_accept_runtime(struct rsnd_dai_stream *io)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
|
||||
struct rsnd_priv *priv = rsnd_io_to_priv(io);
|
||||
struct device *dev = rsnd_priv_to_dev(priv);
|
||||
|
||||
if (!runtime) {
|
||||
dev_warn(dev, "Can't update kctrl when idle\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
struct rsnd_kctrl_cfg *rsnd_kctrl_init_m(struct rsnd_kctrl_cfg_m *cfg)
|
||||
{
|
||||
cfg->cfg.val = cfg->val;
|
||||
|
|
|
@ -742,7 +742,6 @@ struct rsnd_kctrl_cfg_s {
|
|||
#define rsnd_kctrl_vals(x) ((x).val) /* = (x).cfg.val[0] */
|
||||
|
||||
int rsnd_kctrl_accept_anytime(struct rsnd_dai_stream *io);
|
||||
int rsnd_kctrl_accept_runtime(struct rsnd_dai_stream *io);
|
||||
struct rsnd_kctrl_cfg *rsnd_kctrl_init_m(struct rsnd_kctrl_cfg_m *cfg);
|
||||
struct rsnd_kctrl_cfg *rsnd_kctrl_init_s(struct rsnd_kctrl_cfg_s *cfg);
|
||||
int rsnd_kctrl_new(struct rsnd_mod *mod,
|
||||
|
|
|
@ -35,6 +35,7 @@ struct rsnd_src {
|
|||
struct rsnd_mod *dma;
|
||||
struct rsnd_kctrl_cfg_s sen; /* sync convert enable */
|
||||
struct rsnd_kctrl_cfg_s sync; /* sync convert */
|
||||
u32 current_sync_rate;
|
||||
int irq;
|
||||
};
|
||||
|
||||
|
@ -100,7 +101,7 @@ static u32 rsnd_src_convert_rate(struct rsnd_dai_stream *io,
|
|||
if (!rsnd_src_sync_is_enabled(mod))
|
||||
return rsnd_io_converted_rate(io);
|
||||
|
||||
convert_rate = src->sync.val;
|
||||
convert_rate = src->current_sync_rate;
|
||||
|
||||
if (!convert_rate)
|
||||
convert_rate = rsnd_io_converted_rate(io);
|
||||
|
@ -201,13 +202,73 @@ static const u32 chan222222[] = {
|
|||
static void rsnd_src_set_convert_rate(struct rsnd_dai_stream *io,
|
||||
struct rsnd_mod *mod)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
|
||||
struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
|
||||
struct rsnd_src *src = rsnd_mod_to_src(mod);
|
||||
u32 fin, fout, new_rate;
|
||||
int inc, cnt, rate;
|
||||
u64 base, val;
|
||||
|
||||
if (!runtime)
|
||||
return;
|
||||
|
||||
if (!rsnd_src_sync_is_enabled(mod))
|
||||
return;
|
||||
|
||||
fin = rsnd_src_get_in_rate(priv, io);
|
||||
fout = rsnd_src_get_out_rate(priv, io);
|
||||
|
||||
new_rate = src->sync.val;
|
||||
|
||||
if (!new_rate)
|
||||
new_rate = fout;
|
||||
|
||||
/* Do nothing if no diff */
|
||||
if (new_rate == src->current_sync_rate)
|
||||
return;
|
||||
|
||||
/*
|
||||
* SRCm_IFSVR::INTIFS can change within 1%
|
||||
* see
|
||||
* SRCm_IFSVR::INTIFS Note
|
||||
*/
|
||||
inc = fout / 100;
|
||||
cnt = abs(new_rate - fout) / inc;
|
||||
if (fout > new_rate)
|
||||
inc *= -1;
|
||||
|
||||
/*
|
||||
* After start running SRC, we can update only SRC_IFSVR
|
||||
* for Synchronous Mode
|
||||
*/
|
||||
base = (u64)0x0400000 * fin;
|
||||
rate = fout;
|
||||
for (int i = 0; i < cnt; i++) {
|
||||
val = base;
|
||||
rate += inc;
|
||||
do_div(val, rate);
|
||||
|
||||
rsnd_mod_write(mod, SRC_IFSVR, val);
|
||||
}
|
||||
val = base;
|
||||
do_div(val, new_rate);
|
||||
|
||||
rsnd_mod_write(mod, SRC_IFSVR, val);
|
||||
|
||||
/* update current_sync_rate */
|
||||
src->current_sync_rate = new_rate;
|
||||
}
|
||||
|
||||
static void rsnd_src_init_convert_rate(struct rsnd_dai_stream *io,
|
||||
struct rsnd_mod *mod)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
|
||||
struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
|
||||
struct device *dev = rsnd_priv_to_dev(priv);
|
||||
struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
|
||||
int is_play = rsnd_io_is_play(io);
|
||||
int use_src = 0;
|
||||
u32 fin, fout;
|
||||
u32 ifscr, fsrate, adinr;
|
||||
u32 ifscr, adinr;
|
||||
u32 cr, route;
|
||||
u32 i_busif, o_busif, tmp;
|
||||
const u32 *bsdsr_table;
|
||||
|
@ -245,26 +306,15 @@ static void rsnd_src_set_convert_rate(struct rsnd_dai_stream *io,
|
|||
adinr = rsnd_get_adinr_bit(mod, io) | chan;
|
||||
|
||||
/*
|
||||
* SRC_IFSCR / SRC_IFSVR
|
||||
*/
|
||||
ifscr = 0;
|
||||
fsrate = 0;
|
||||
if (use_src) {
|
||||
u64 n;
|
||||
|
||||
ifscr = 1;
|
||||
n = (u64)0x0400000 * fin;
|
||||
do_div(n, fout);
|
||||
fsrate = n;
|
||||
}
|
||||
|
||||
/*
|
||||
* SRC_IFSCR
|
||||
* SRC_SRCCR / SRC_ROUTE_MODE0
|
||||
*/
|
||||
ifscr = 0;
|
||||
cr = 0x00011110;
|
||||
route = 0x0;
|
||||
if (use_src) {
|
||||
route = 0x1;
|
||||
ifscr = 0x1;
|
||||
|
||||
if (rsnd_src_sync_is_enabled(mod)) {
|
||||
cr |= 0x1;
|
||||
|
@ -335,7 +385,6 @@ static void rsnd_src_set_convert_rate(struct rsnd_dai_stream *io,
|
|||
rsnd_mod_write(mod, SRC_SRCIR, 1); /* initialize */
|
||||
rsnd_mod_write(mod, SRC_ADINR, adinr);
|
||||
rsnd_mod_write(mod, SRC_IFSCR, ifscr);
|
||||
rsnd_mod_write(mod, SRC_IFSVR, fsrate);
|
||||
rsnd_mod_write(mod, SRC_SRCCR, cr);
|
||||
rsnd_mod_write(mod, SRC_BSDSR, bsdsr_table[idx]);
|
||||
rsnd_mod_write(mod, SRC_BSISR, bsisr_table[idx]);
|
||||
|
@ -348,6 +397,9 @@ static void rsnd_src_set_convert_rate(struct rsnd_dai_stream *io,
|
|||
|
||||
rsnd_adg_set_src_timesel_gen2(mod, io, fin, fout);
|
||||
|
||||
/* update SRC_IFSVR */
|
||||
rsnd_src_set_convert_rate(io, mod);
|
||||
|
||||
return;
|
||||
|
||||
convert_rate_err:
|
||||
|
@ -467,7 +519,8 @@ static int rsnd_src_init(struct rsnd_mod *mod,
|
|||
int ret;
|
||||
|
||||
/* reset sync convert_rate */
|
||||
src->sync.val = 0;
|
||||
src->sync.val =
|
||||
src->current_sync_rate = 0;
|
||||
|
||||
ret = rsnd_mod_power_on(mod);
|
||||
if (ret < 0)
|
||||
|
@ -475,7 +528,7 @@ static int rsnd_src_init(struct rsnd_mod *mod,
|
|||
|
||||
rsnd_src_activation(mod);
|
||||
|
||||
rsnd_src_set_convert_rate(io, mod);
|
||||
rsnd_src_init_convert_rate(io, mod);
|
||||
|
||||
rsnd_src_status_clear(mod);
|
||||
|
||||
|
@ -493,7 +546,8 @@ static int rsnd_src_quit(struct rsnd_mod *mod,
|
|||
rsnd_mod_power_off(mod);
|
||||
|
||||
/* reset sync convert_rate */
|
||||
src->sync.val = 0;
|
||||
src->sync.val =
|
||||
src->current_sync_rate = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -531,6 +585,22 @@ static irqreturn_t rsnd_src_interrupt(int irq, void *data)
|
|||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int rsnd_src_kctrl_accept_runtime(struct rsnd_dai_stream *io)
|
||||
{
|
||||
struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
|
||||
|
||||
if (!runtime) {
|
||||
struct rsnd_priv *priv = rsnd_io_to_priv(io);
|
||||
struct device *dev = rsnd_priv_to_dev(priv);
|
||||
|
||||
dev_warn(dev, "\"SRC Out Rate\" can use during running\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int rsnd_src_probe_(struct rsnd_mod *mod,
|
||||
struct rsnd_dai_stream *io,
|
||||
struct rsnd_priv *priv)
|
||||
|
@ -585,7 +655,7 @@ static int rsnd_src_pcm_new(struct rsnd_mod *mod,
|
|||
"SRC Out Rate Switch" :
|
||||
"SRC In Rate Switch",
|
||||
rsnd_kctrl_accept_anytime,
|
||||
rsnd_src_set_convert_rate,
|
||||
rsnd_src_init_convert_rate,
|
||||
&src->sen, 1);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
@ -594,7 +664,7 @@ static int rsnd_src_pcm_new(struct rsnd_mod *mod,
|
|||
rsnd_io_is_play(io) ?
|
||||
"SRC Out Rate" :
|
||||
"SRC In Rate",
|
||||
rsnd_kctrl_accept_runtime,
|
||||
rsnd_src_kctrl_accept_runtime,
|
||||
rsnd_src_set_convert_rate,
|
||||
&src->sync, 192000);
|
||||
|
||||
|
|
|
@ -336,7 +336,8 @@ static int rsnd_ssi_master_clk_start(struct rsnd_mod *mod,
|
|||
return 0;
|
||||
|
||||
rate_err:
|
||||
dev_err(dev, "unsupported clock rate\n");
|
||||
dev_err(dev, "unsupported clock rate (%d)\n", rate);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -451,11 +451,11 @@ static int rockchip_i2s_tdm_set_fmt(struct snd_soc_dai *cpu_dai,
|
|||
break;
|
||||
case SND_SOC_DAIFMT_DSP_A:
|
||||
val = I2S_TXCR_TFS_TDM_PCM;
|
||||
tdm_val = TDM_SHIFT_CTRL(0);
|
||||
tdm_val = TDM_SHIFT_CTRL(2);
|
||||
break;
|
||||
case SND_SOC_DAIFMT_DSP_B:
|
||||
val = I2S_TXCR_TFS_TDM_PCM;
|
||||
tdm_val = TDM_SHIFT_CTRL(2);
|
||||
tdm_val = TDM_SHIFT_CTRL(4);
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
|
|
|
@ -165,8 +165,9 @@ irqreturn_t acp_sof_ipc_irq_thread(int irq, void *context)
|
|||
int dsp_msg, dsp_ack;
|
||||
unsigned int status;
|
||||
|
||||
if (sdev->first_boot && sdev->fw_state != SOF_FW_BOOT_COMPLETE) {
|
||||
if (unlikely(sdev->first_boot && sdev->fw_state != SOF_FW_BOOT_COMPLETE)) {
|
||||
acp_mailbox_read(sdev, sdev->dsp_box.offset, &status, sizeof(status));
|
||||
|
||||
if ((status & SOF_IPC_PANIC_MAGIC_MASK) == SOF_IPC_PANIC_MAGIC) {
|
||||
snd_sof_dsp_panic(sdev, sdev->dsp_box.offset + sizeof(status),
|
||||
true);
|
||||
|
@ -188,13 +189,21 @@ irqreturn_t acp_sof_ipc_irq_thread(int irq, void *context)
|
|||
|
||||
dsp_ack = snd_sof_dsp_read(sdev, ACP_DSP_BAR, ACP_SCRATCH_REG_0 + dsp_ack_write);
|
||||
if (dsp_ack) {
|
||||
spin_lock_irq(&sdev->ipc_lock);
|
||||
/* handle immediate reply from DSP core */
|
||||
acp_dsp_ipc_get_reply(sdev);
|
||||
snd_sof_ipc_reply(sdev, 0);
|
||||
/* set the done bit */
|
||||
acp_dsp_ipc_dsp_done(sdev);
|
||||
spin_unlock_irq(&sdev->ipc_lock);
|
||||
if (likely(sdev->fw_state == SOF_FW_BOOT_COMPLETE)) {
|
||||
spin_lock_irq(&sdev->ipc_lock);
|
||||
|
||||
/* handle immediate reply from DSP core */
|
||||
acp_dsp_ipc_get_reply(sdev);
|
||||
snd_sof_ipc_reply(sdev, 0);
|
||||
/* set the done bit */
|
||||
acp_dsp_ipc_dsp_done(sdev);
|
||||
|
||||
spin_unlock_irq(&sdev->ipc_lock);
|
||||
} else {
|
||||
dev_dbg_ratelimited(sdev->dev, "IPC reply before FW_BOOT_COMPLETE: %#x\n",
|
||||
dsp_ack);
|
||||
}
|
||||
|
||||
ipc_irq = true;
|
||||
}
|
||||
|
||||
|
|
|
@ -27,6 +27,7 @@ MODULE_PARM_DESC(enable_fw_debug, "Enable Firmware debug");
|
|||
static struct acp_quirk_entry quirk_valve_galileo = {
|
||||
.signed_fw_image = true,
|
||||
.skip_iram_dram_size_mod = true,
|
||||
.post_fw_run_delay = true,
|
||||
};
|
||||
|
||||
const struct dmi_system_id acp_sof_quirk_table[] = {
|
||||
|
|
|
@ -220,6 +220,7 @@ struct sof_amd_acp_desc {
|
|||
struct acp_quirk_entry {
|
||||
bool signed_fw_image;
|
||||
bool skip_iram_dram_size_mod;
|
||||
bool post_fw_run_delay;
|
||||
};
|
||||
|
||||
/* Common device data struct for ACP devices */
|
||||
|
|
|
@ -13,11 +13,9 @@
|
|||
|
||||
#include <linux/module.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <sound/sof.h>
|
||||
#include <sound/soc-acpi.h>
|
||||
|
||||
#include "../ops.h"
|
||||
#include "../sof-pci-dev.h"
|
||||
#include "../../amd/mach-config.h"
|
||||
#include "acp.h"
|
||||
|
|
|
@ -11,13 +11,10 @@
|
|||
* Hardware interface for Audio DSP on Vangogh platform
|
||||
*/
|
||||
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include "../ops.h"
|
||||
#include "../sof-audio.h"
|
||||
#include "acp.h"
|
||||
#include "acp-dsp-offset.h"
|
||||
|
||||
#define I2S_HS_INSTANCE 0
|
||||
#define I2S_BT_INSTANCE 1
|
||||
|
@ -136,6 +133,20 @@ static struct snd_soc_dai_driver vangogh_sof_dai[] = {
|
|||
},
|
||||
};
|
||||
|
||||
static int sof_vangogh_post_fw_run_delay(struct snd_sof_dev *sdev)
|
||||
{
|
||||
/*
|
||||
* Resuming from suspend in some cases my cause the DSP firmware
|
||||
* to enter an unrecoverable faulty state. Delaying a bit any host
|
||||
* to DSP transmission right after firmware boot completion seems
|
||||
* to resolve the issue.
|
||||
*/
|
||||
if (!sdev->first_boot)
|
||||
usleep_range(100, 150);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Vangogh ops */
|
||||
struct snd_sof_dsp_ops sof_vangogh_ops;
|
||||
EXPORT_SYMBOL_NS(sof_vangogh_ops, "SND_SOC_SOF_AMD_COMMON");
|
||||
|
@ -157,6 +168,9 @@ int sof_vangogh_ops_init(struct snd_sof_dev *sdev)
|
|||
|
||||
if (quirks->signed_fw_image)
|
||||
sof_vangogh_ops.load_firmware = acp_sof_load_signed_firmware;
|
||||
|
||||
if (quirks->post_fw_run_delay)
|
||||
sof_vangogh_ops.post_fw_run = sof_vangogh_post_fw_run_delay;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -454,6 +454,7 @@ int hda_codec_i915_exit(struct snd_sof_dev *sdev)
|
|||
}
|
||||
EXPORT_SYMBOL_NS_GPL(hda_codec_i915_exit, "SND_SOC_SOF_HDA_AUDIO_CODEC_I915");
|
||||
|
||||
MODULE_SOFTDEP("pre: snd-hda-codec-hdmi");
|
||||
#endif
|
||||
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
|
|
|
@ -50,6 +50,7 @@ static const struct sof_dev_desc ptl_desc = {
|
|||
/* PCI IDs */
|
||||
static const struct pci_device_id sof_pci_ids[] = {
|
||||
{ PCI_DEVICE_DATA(INTEL, HDA_PTL, &ptl_desc) }, /* PTL */
|
||||
{ PCI_DEVICE_DATA(INTEL, HDA_PTL_H, &ptl_desc) }, /* PTL-H */
|
||||
{ 0, }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, sof_pci_ids);
|
||||
|
|
|
@ -765,10 +765,16 @@ static int sof_ipc4_widget_setup_comp_dai(struct snd_sof_widget *swidget)
|
|||
}
|
||||
|
||||
list_for_each_entry(w, &sdev->widget_list, list) {
|
||||
if (w->widget->sname &&
|
||||
struct snd_sof_dai *alh_dai;
|
||||
|
||||
if (!WIDGET_IS_DAI(w->id) || !w->widget->sname ||
|
||||
strcmp(w->widget->sname, swidget->widget->sname))
|
||||
continue;
|
||||
|
||||
alh_dai = w->private;
|
||||
if (alh_dai->type != SOF_DAI_INTEL_ALH)
|
||||
continue;
|
||||
|
||||
blob->alh_cfg.device_count++;
|
||||
}
|
||||
|
||||
|
@ -2061,11 +2067,13 @@ sof_ipc4_prepare_copier_module(struct snd_sof_widget *swidget,
|
|||
list_for_each_entry(w, &sdev->widget_list, list) {
|
||||
u32 node_type;
|
||||
|
||||
if (w->widget->sname &&
|
||||
if (!WIDGET_IS_DAI(w->id) || !w->widget->sname ||
|
||||
strcmp(w->widget->sname, swidget->widget->sname))
|
||||
continue;
|
||||
|
||||
dai = w->private;
|
||||
if (dai->type != SOF_DAI_INTEL_ALH)
|
||||
continue;
|
||||
alh_copier = (struct sof_ipc4_copier *)dai->private;
|
||||
alh_data = &alh_copier->data;
|
||||
node_type = SOF_IPC4_GET_NODE_TYPE(alh_data->gtw_cfg.node_id);
|
||||
|
|
|
@ -511,6 +511,8 @@ static int sof_pcm_close(struct snd_soc_component *component,
|
|||
*/
|
||||
}
|
||||
|
||||
spcm->stream[substream->stream].substream = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -43,7 +43,7 @@ int sof_ipc_msg_data(struct snd_sof_dev *sdev,
|
|||
return -ESTRPIPE;
|
||||
|
||||
posn_offset = stream->posn_offset;
|
||||
} else {
|
||||
} else if (sps->cstream) {
|
||||
|
||||
struct sof_compr_stream *sstream = sps->cstream->runtime->private_data;
|
||||
|
||||
|
@ -51,6 +51,10 @@ int sof_ipc_msg_data(struct snd_sof_dev *sdev,
|
|||
return -ESTRPIPE;
|
||||
|
||||
posn_offset = sstream->posn_offset;
|
||||
|
||||
} else {
|
||||
dev_err(sdev->dev, "%s: No stream opened\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
snd_sof_dsp_mailbox_read(sdev, posn_offset, p, sz);
|
||||
|
|
Loading…
Add table
Reference in a new issue