mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2024-12-28 00:33:16 +00:00
sound fixes for 6.13-rc5
A collection of small fixes. Nothing really stands out, fortunately. - Follow-up fixes for the new compress offload API extension - A few ASoC SOF, AMD and Mediatek quirks and fixes - A regression fix in legacy SH driver cleanup - Fix DMA mapping error handling in the helper code - Fix kselftest dependency -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEEIXTw5fNLNI7mMiVaLtJE4w1nLE8FAmdtgNMOHHRpd2FpQHN1 c2UuZGUACgkQLtJE4w1nLE/hcA//faV801EX6Dp42M19SEm4LLQrWrkqYkg9h+ra dGlgcJWQwJrxX6kyFefBiAhu99DuwDuNpUgRZgtPfdGgA2jQaKjwbP+/TMifheh8 y9ljr1TBZ90IGBcIGa6GhKVkRK/3kRj61FBRXlev3HfXn1PqMY7092wzGjL1lHoc c/qxnHdRGlPSdFdXHeXm8VNJ3QYCZlK0nf6wljKTDlCZSj/NdjFttEhSQHQ5Rbg6 NMglvBuX6GUwJm1M/SiNNJ+8NBigxs4MF1Rgy1nuuC4gndozjDXPWjSIxHsSZCm7 jpk7giqU1D9nBjxG/7wN2sE42GHKx61oEvJVVS+53zRetXuBFSNbEgGNCJPsjWwS TUKMuUfyBfNwV9WKJ8/8IS50Vqdbgf+t1VLHUuGFMq7NkFFpnW+KGnfJL4ZSHyce 9bAVwkA26mX1YhBhsHq1R4DGOVIVmeIIKH6f6uazN7YNB2y5VFSJIiMUK6ih8OwQ NWqCdn5i3qfco/Gi/IZd5kAbT6xWsLViGEJ0rTCsjHJI3zu54i8Xyl5Fp0e8lLJj /rr/QzBwIiBLMlj+WcrEc0a+P0izqur/OhYJIeVJbtfVrJLtFv67NRjnaqeyJK1M 5UevtxAC0r5NrYmQpURW8GGTkMiu/litNiIbHrcCCCWYZhMz6ST4UdqBNW73bOMK bHaNyqk= =3ZF7 -----END PGP SIGNATURE----- Merge tag 'sound-6.13-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "A collection of small fixes. Nothing really stands out, fortunately. - Follow-up fixes for the new compress offload API extension - A few ASoC SOF, AMD and Mediatek quirks and fixes - A regression fix in legacy SH driver cleanup - Fix DMA mapping error handling in the helper code - Fix kselftest dependency" * tag 'sound-6.13-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: ALSA: sh: Fix wrong argument order for copy_from_iter() selftests/alsa: Fix circular dependency involving global-timer ALSA: memalloc: prefer dma_mapping_error() over explicit address checking ALSA: compress_offload: improve file descriptors installation for dma-buf ALSA: compress_offload: use safe list iteration in snd_compr_task_seq() ALSA: compress_offload: avoid 64-bit get_user() ALSA: compress_offload: import DMA_BUF namespace ASoC: mediatek: disable buffer pre-allocation ASoC: rt722: add delay time to wait for the calibration procedure ASoC: SOF: Intel: hda-dai: Do not release the link DMA on STOP ASoC: dt-bindings: realtek,rt5645: Fix CPVDD voltage comment ASoC: Intel: sof_sdw: Fix DMI match for Lenovo 21QA and 21QB ASoC: Intel: sof_sdw: Fix DMI match for Lenovo 21Q6 and 21Q7 ASoC: amd: ps: Fix for enabling DMIC on acp63 platform via _DSD entry
This commit is contained in:
commit
d6ef8b40d0
@ -51,7 +51,7 @@ properties:
|
||||
description: Power supply for AVDD, providing 1.8V.
|
||||
|
||||
cpvdd-supply:
|
||||
description: Power supply for CPVDD, providing 3.5V.
|
||||
description: Power supply for CPVDD, providing 1.8V.
|
||||
|
||||
hp-detect-gpios:
|
||||
description:
|
||||
|
@ -1025,7 +1025,7 @@ static u64 snd_compr_seqno_next(struct snd_compr_stream *stream)
|
||||
static int snd_compr_task_new(struct snd_compr_stream *stream, struct snd_compr_task *utask)
|
||||
{
|
||||
struct snd_compr_task_runtime *task;
|
||||
int retval;
|
||||
int retval, fd_i, fd_o;
|
||||
|
||||
if (stream->runtime->total_tasks >= stream->runtime->fragments)
|
||||
return -EBUSY;
|
||||
@ -1039,16 +1039,24 @@ static int snd_compr_task_new(struct snd_compr_stream *stream, struct snd_compr_
|
||||
retval = stream->ops->task_create(stream, task);
|
||||
if (retval < 0)
|
||||
goto cleanup;
|
||||
utask->input_fd = dma_buf_fd(task->input, O_WRONLY|O_CLOEXEC);
|
||||
if (utask->input_fd < 0) {
|
||||
retval = utask->input_fd;
|
||||
/* similar functionality as in dma_buf_fd(), but ensure that both
|
||||
file descriptors are allocated before fd_install() */
|
||||
if (!task->input || !task->input->file || !task->output || !task->output->file) {
|
||||
retval = -EINVAL;
|
||||
goto cleanup;
|
||||
}
|
||||
utask->output_fd = dma_buf_fd(task->output, O_RDONLY|O_CLOEXEC);
|
||||
if (utask->output_fd < 0) {
|
||||
retval = utask->output_fd;
|
||||
fd_i = get_unused_fd_flags(O_WRONLY|O_CLOEXEC);
|
||||
if (fd_i < 0)
|
||||
goto cleanup;
|
||||
fd_o = get_unused_fd_flags(O_RDONLY|O_CLOEXEC);
|
||||
if (fd_o < 0) {
|
||||
put_unused_fd(fd_i);
|
||||
goto cleanup;
|
||||
}
|
||||
fd_install(fd_i, task->input->file);
|
||||
fd_install(fd_o, task->output->file);
|
||||
utask->input_fd = fd_i;
|
||||
utask->output_fd = fd_o;
|
||||
/* keep dmabuf reference until freed with task free ioctl */
|
||||
dma_buf_get(utask->input_fd);
|
||||
dma_buf_get(utask->output_fd);
|
||||
@ -1174,18 +1182,18 @@ typedef void (*snd_compr_seq_func_t)(struct snd_compr_stream *stream,
|
||||
static int snd_compr_task_seq(struct snd_compr_stream *stream, unsigned long arg,
|
||||
snd_compr_seq_func_t fcn)
|
||||
{
|
||||
struct snd_compr_task_runtime *task;
|
||||
struct snd_compr_task_runtime *task, *temp;
|
||||
__u64 seqno;
|
||||
int retval;
|
||||
|
||||
if (stream->runtime->state != SNDRV_PCM_STATE_SETUP)
|
||||
return -EPERM;
|
||||
retval = get_user(seqno, (__u64 __user *)arg);
|
||||
if (retval < 0)
|
||||
return retval;
|
||||
retval = copy_from_user(&seqno, (__u64 __user *)arg, sizeof(seqno));
|
||||
if (retval)
|
||||
return -EFAULT;
|
||||
retval = 0;
|
||||
if (seqno == 0) {
|
||||
list_for_each_entry_reverse(task, &stream->runtime->tasks, list)
|
||||
list_for_each_entry_safe_reverse(task, temp, &stream->runtime->tasks, list)
|
||||
fcn(stream, task);
|
||||
} else {
|
||||
task = snd_compr_find_task(stream, seqno);
|
||||
@ -1247,6 +1255,7 @@ void snd_compr_task_finished(struct snd_compr_stream *stream,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_compr_task_finished);
|
||||
|
||||
MODULE_IMPORT_NS("DMA_BUF");
|
||||
#endif /* CONFIG_SND_COMPRESS_ACCEL */
|
||||
|
||||
static long snd_compr_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
|
||||
|
@ -505,7 +505,7 @@ static void *snd_dma_wc_alloc(struct snd_dma_buffer *dmab, size_t size)
|
||||
if (!p)
|
||||
return NULL;
|
||||
dmab->addr = dma_map_single(dmab->dev.dev, p, size, DMA_BIDIRECTIONAL);
|
||||
if (dmab->addr == DMA_MAPPING_ERROR) {
|
||||
if (dma_mapping_error(dmab->dev.dev, dmab->addr)) {
|
||||
do_free_pages(dmab->area, size, true);
|
||||
return NULL;
|
||||
}
|
||||
|
@ -163,7 +163,7 @@ static int snd_sh_dac_pcm_copy(struct snd_pcm_substream *substream,
|
||||
/* channel is not used (interleaved data) */
|
||||
struct snd_sh_dac *chip = snd_pcm_substream_chip(substream);
|
||||
|
||||
if (copy_from_iter(chip->data_buffer + pos, src, count) != count)
|
||||
if (copy_from_iter(chip->data_buffer + pos, count, src) != count)
|
||||
return -EFAULT;
|
||||
chip->buffer_end = chip->data_buffer + pos + count;
|
||||
|
||||
|
@ -375,11 +375,18 @@ static int get_acp63_device_config(struct pci_dev *pci, struct acp63_dev_data *a
|
||||
{
|
||||
struct acpi_device *pdm_dev;
|
||||
const union acpi_object *obj;
|
||||
acpi_handle handle;
|
||||
acpi_integer dmic_status;
|
||||
u32 config;
|
||||
bool is_dmic_dev = false;
|
||||
bool is_sdw_dev = false;
|
||||
bool wov_en, dmic_en;
|
||||
int ret;
|
||||
|
||||
/* IF WOV entry not found, enable dmic based on acp-audio-device-type entry*/
|
||||
wov_en = true;
|
||||
dmic_en = false;
|
||||
|
||||
config = readl(acp_data->acp63_base + ACP_PIN_CONFIG);
|
||||
switch (config) {
|
||||
case ACP_CONFIG_4:
|
||||
@ -412,10 +419,18 @@ static int get_acp63_device_config(struct pci_dev *pci, struct acp63_dev_data *a
|
||||
if (!acpi_dev_get_property(pdm_dev, "acp-audio-device-type",
|
||||
ACPI_TYPE_INTEGER, &obj) &&
|
||||
obj->integer.value == ACP_DMIC_DEV)
|
||||
is_dmic_dev = true;
|
||||
dmic_en = true;
|
||||
}
|
||||
|
||||
handle = ACPI_HANDLE(&pci->dev);
|
||||
ret = acpi_evaluate_integer(handle, "_WOV", NULL, &dmic_status);
|
||||
if (!ACPI_FAILURE(ret))
|
||||
wov_en = dmic_status;
|
||||
}
|
||||
|
||||
if (dmic_en && wov_en)
|
||||
is_dmic_dev = true;
|
||||
|
||||
if (acp_data->is_sdw_config) {
|
||||
ret = acp_scan_sdw_devices(&pci->dev, ACP63_SDW_ADDR);
|
||||
if (!ret && acp_data->info.link_mask)
|
||||
|
@ -1468,13 +1468,18 @@ static void rt722_sdca_jack_preset(struct rt722_sdca_priv *rt722)
|
||||
0x008d);
|
||||
/* check HP calibration FSM status */
|
||||
for (loop_check = 0; loop_check < chk_cnt; loop_check++) {
|
||||
usleep_range(10000, 11000);
|
||||
ret = rt722_sdca_index_read(rt722, RT722_VENDOR_CALI,
|
||||
RT722_DAC_DC_CALI_CTL3, &calib_status);
|
||||
if (ret < 0 || loop_check == chk_cnt)
|
||||
if (ret < 0)
|
||||
dev_dbg(&rt722->slave->dev, "calibration failed!, ret=%d\n", ret);
|
||||
if ((calib_status & 0x0040) == 0x0)
|
||||
break;
|
||||
}
|
||||
|
||||
if (loop_check == chk_cnt)
|
||||
dev_dbg(&rt722->slave->dev, "%s, calibration time-out!\n", __func__);
|
||||
|
||||
/* Set ADC09 power entity floating control */
|
||||
rt722_sdca_index_write(rt722, RT722_VENDOR_HDA_CTL, RT722_ADC0A_08_PDE_FLOAT_CTL,
|
||||
0x2a12);
|
||||
|
@ -632,7 +632,7 @@ static const struct dmi_system_id sof_sdw_quirk_table[] = {
|
||||
.callback = sof_sdw_quirk_cb,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "233C")
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "21QB")
|
||||
},
|
||||
/* Note this quirk excludes the CODEC mic */
|
||||
.driver_data = (void *)(SOC_SDW_CODEC_MIC),
|
||||
@ -641,9 +641,26 @@ static const struct dmi_system_id sof_sdw_quirk_table[] = {
|
||||
.callback = sof_sdw_quirk_cb,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "233B")
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "21QA")
|
||||
},
|
||||
.driver_data = (void *)(SOC_SDW_SIDECAR_AMPS),
|
||||
/* Note this quirk excludes the CODEC mic */
|
||||
.driver_data = (void *)(SOC_SDW_CODEC_MIC),
|
||||
},
|
||||
{
|
||||
.callback = sof_sdw_quirk_cb,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "21Q6")
|
||||
},
|
||||
.driver_data = (void *)(SOC_SDW_SIDECAR_AMPS | SOC_SDW_CODEC_MIC),
|
||||
},
|
||||
{
|
||||
.callback = sof_sdw_quirk_cb,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "21Q7")
|
||||
},
|
||||
.driver_data = (void *)(SOC_SDW_SIDECAR_AMPS | SOC_SDW_CODEC_MIC),
|
||||
},
|
||||
|
||||
/* ArrowLake devices */
|
||||
|
@ -120,8 +120,8 @@ int mtk_afe_pcm_new(struct snd_soc_component *component,
|
||||
struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
|
||||
|
||||
size = afe->mtk_afe_hardware->buffer_bytes_max;
|
||||
snd_pcm_set_managed_buffer_all(pcm, SNDRV_DMA_TYPE_DEV,
|
||||
afe->dev, size, size);
|
||||
snd_pcm_set_managed_buffer_all(pcm, SNDRV_DMA_TYPE_DEV, afe->dev, 0, size);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mtk_afe_pcm_new);
|
||||
|
@ -103,8 +103,10 @@ hda_dai_get_ops(struct snd_pcm_substream *substream, struct snd_soc_dai *cpu_dai
|
||||
return sdai->platform_private;
|
||||
}
|
||||
|
||||
int hda_link_dma_cleanup(struct snd_pcm_substream *substream, struct hdac_ext_stream *hext_stream,
|
||||
struct snd_soc_dai *cpu_dai)
|
||||
static int
|
||||
hda_link_dma_cleanup(struct snd_pcm_substream *substream,
|
||||
struct hdac_ext_stream *hext_stream,
|
||||
struct snd_soc_dai *cpu_dai, bool release)
|
||||
{
|
||||
const struct hda_dai_widget_dma_ops *ops = hda_dai_get_ops(substream, cpu_dai);
|
||||
struct sof_intel_hda_stream *hda_stream;
|
||||
@ -128,6 +130,17 @@ int hda_link_dma_cleanup(struct snd_pcm_substream *substream, struct hdac_ext_st
|
||||
snd_hdac_ext_bus_link_clear_stream_id(hlink, stream_tag);
|
||||
}
|
||||
|
||||
if (!release) {
|
||||
/*
|
||||
* Force stream reconfiguration without releasing the channel on
|
||||
* subsequent stream restart (without free), including LinkDMA
|
||||
* reset.
|
||||
* The stream is released via hda_dai_hw_free()
|
||||
*/
|
||||
hext_stream->link_prepared = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (ops->release_hext_stream)
|
||||
ops->release_hext_stream(sdev, cpu_dai, substream);
|
||||
|
||||
@ -211,7 +224,7 @@ static int __maybe_unused hda_dai_hw_free(struct snd_pcm_substream *substream,
|
||||
if (!hext_stream)
|
||||
return 0;
|
||||
|
||||
return hda_link_dma_cleanup(substream, hext_stream, cpu_dai);
|
||||
return hda_link_dma_cleanup(substream, hext_stream, cpu_dai, true);
|
||||
}
|
||||
|
||||
static int __maybe_unused hda_dai_hw_params_data(struct snd_pcm_substream *substream,
|
||||
@ -304,7 +317,8 @@ static int __maybe_unused hda_dai_trigger(struct snd_pcm_substream *substream, i
|
||||
switch (cmd) {
|
||||
case SNDRV_PCM_TRIGGER_STOP:
|
||||
case SNDRV_PCM_TRIGGER_SUSPEND:
|
||||
ret = hda_link_dma_cleanup(substream, hext_stream, dai);
|
||||
ret = hda_link_dma_cleanup(substream, hext_stream, dai,
|
||||
cmd == SNDRV_PCM_TRIGGER_STOP ? false : true);
|
||||
if (ret < 0) {
|
||||
dev_err(sdev->dev, "%s: failed to clean up link DMA\n", __func__);
|
||||
return ret;
|
||||
@ -660,8 +674,7 @@ static int hda_dai_suspend(struct hdac_bus *bus)
|
||||
}
|
||||
|
||||
ret = hda_link_dma_cleanup(hext_stream->link_substream,
|
||||
hext_stream,
|
||||
cpu_dai);
|
||||
hext_stream, cpu_dai, true);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
|
@ -1038,8 +1038,6 @@ const struct hda_dai_widget_dma_ops *
|
||||
hda_select_dai_widget_ops(struct snd_sof_dev *sdev, struct snd_sof_widget *swidget);
|
||||
int hda_dai_config(struct snd_soc_dapm_widget *w, unsigned int flags,
|
||||
struct snd_sof_dai_config_data *data);
|
||||
int hda_link_dma_cleanup(struct snd_pcm_substream *substream, struct hdac_ext_stream *hext_stream,
|
||||
struct snd_soc_dai *cpu_dai);
|
||||
|
||||
static inline struct snd_sof_dev *widget_to_sdev(struct snd_soc_dapm_widget *w)
|
||||
{
|
||||
|
@ -27,5 +27,5 @@ include ../lib.mk
|
||||
$(OUTPUT)/libatest.so: conf.c alsa-local.h
|
||||
$(CC) $(CFLAGS) -shared -fPIC $< $(LDLIBS) -o $@
|
||||
|
||||
$(OUTPUT)/%: %.c $(TEST_GEN_PROGS_EXTENDED) alsa-local.h
|
||||
$(OUTPUT)/%: %.c $(OUTPUT)/libatest.so alsa-local.h
|
||||
$(CC) $(CFLAGS) $< $(LDLIBS) -latest -o $@
|
||||
|
Loading…
Reference in New Issue
Block a user