mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-16 13:34:30 +00:00
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
This commit is contained in:
commit
bbbc571c9c
@ -51,7 +51,7 @@ properties:
|
|||||||
description: Power supply for AVDD, providing 1.8V.
|
description: Power supply for AVDD, providing 1.8V.
|
||||||
|
|
||||||
cpvdd-supply:
|
cpvdd-supply:
|
||||||
description: Power supply for CPVDD, providing 3.5V.
|
description: Power supply for CPVDD, providing 1.8V.
|
||||||
|
|
||||||
hp-detect-gpios:
|
hp-detect-gpios:
|
||||||
description:
|
description:
|
||||||
|
@ -375,11 +375,18 @@ static int get_acp63_device_config(struct pci_dev *pci, struct acp63_dev_data *a
|
|||||||
{
|
{
|
||||||
struct acpi_device *pdm_dev;
|
struct acpi_device *pdm_dev;
|
||||||
const union acpi_object *obj;
|
const union acpi_object *obj;
|
||||||
|
acpi_handle handle;
|
||||||
|
acpi_integer dmic_status;
|
||||||
u32 config;
|
u32 config;
|
||||||
bool is_dmic_dev = false;
|
bool is_dmic_dev = false;
|
||||||
bool is_sdw_dev = false;
|
bool is_sdw_dev = false;
|
||||||
|
bool wov_en, dmic_en;
|
||||||
int ret;
|
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);
|
config = readl(acp_data->acp63_base + ACP_PIN_CONFIG);
|
||||||
switch (config) {
|
switch (config) {
|
||||||
case ACP_CONFIG_4:
|
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",
|
if (!acpi_dev_get_property(pdm_dev, "acp-audio-device-type",
|
||||||
ACPI_TYPE_INTEGER, &obj) &&
|
ACPI_TYPE_INTEGER, &obj) &&
|
||||||
obj->integer.value == ACP_DMIC_DEV)
|
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) {
|
if (acp_data->is_sdw_config) {
|
||||||
ret = acp_scan_sdw_devices(&pci->dev, ACP63_SDW_ADDR);
|
ret = acp_scan_sdw_devices(&pci->dev, ACP63_SDW_ADDR);
|
||||||
if (!ret && acp_data->info.link_mask)
|
if (!ret && acp_data->info.link_mask)
|
||||||
|
@ -1468,13 +1468,18 @@ static void rt722_sdca_jack_preset(struct rt722_sdca_priv *rt722)
|
|||||||
0x008d);
|
0x008d);
|
||||||
/* check HP calibration FSM status */
|
/* check HP calibration FSM status */
|
||||||
for (loop_check = 0; loop_check < chk_cnt; loop_check++) {
|
for (loop_check = 0; loop_check < chk_cnt; loop_check++) {
|
||||||
|
usleep_range(10000, 11000);
|
||||||
ret = rt722_sdca_index_read(rt722, RT722_VENDOR_CALI,
|
ret = rt722_sdca_index_read(rt722, RT722_VENDOR_CALI,
|
||||||
RT722_DAC_DC_CALI_CTL3, &calib_status);
|
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);
|
dev_dbg(&rt722->slave->dev, "calibration failed!, ret=%d\n", ret);
|
||||||
if ((calib_status & 0x0040) == 0x0)
|
if ((calib_status & 0x0040) == 0x0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (loop_check == chk_cnt)
|
||||||
|
dev_dbg(&rt722->slave->dev, "%s, calibration time-out!\n", __func__);
|
||||||
|
|
||||||
/* Set ADC09 power entity floating control */
|
/* Set ADC09 power entity floating control */
|
||||||
rt722_sdca_index_write(rt722, RT722_VENDOR_HDA_CTL, RT722_ADC0A_08_PDE_FLOAT_CTL,
|
rt722_sdca_index_write(rt722, RT722_VENDOR_HDA_CTL, RT722_ADC0A_08_PDE_FLOAT_CTL,
|
||||||
0x2a12);
|
0x2a12);
|
||||||
|
@ -632,7 +632,7 @@ static const struct dmi_system_id sof_sdw_quirk_table[] = {
|
|||||||
.callback = sof_sdw_quirk_cb,
|
.callback = sof_sdw_quirk_cb,
|
||||||
.matches = {
|
.matches = {
|
||||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
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 */
|
/* Note this quirk excludes the CODEC mic */
|
||||||
.driver_data = (void *)(SOC_SDW_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,
|
.callback = sof_sdw_quirk_cb,
|
||||||
.matches = {
|
.matches = {
|
||||||
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
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 */
|
/* 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);
|
struct mtk_base_afe *afe = snd_soc_component_get_drvdata(component);
|
||||||
|
|
||||||
size = afe->mtk_afe_hardware->buffer_bytes_max;
|
size = afe->mtk_afe_hardware->buffer_bytes_max;
|
||||||
snd_pcm_set_managed_buffer_all(pcm, SNDRV_DMA_TYPE_DEV,
|
snd_pcm_set_managed_buffer_all(pcm, SNDRV_DMA_TYPE_DEV, afe->dev, 0, size);
|
||||||
afe->dev, size, size);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(mtk_afe_pcm_new);
|
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;
|
return sdai->platform_private;
|
||||||
}
|
}
|
||||||
|
|
||||||
int hda_link_dma_cleanup(struct snd_pcm_substream *substream, struct hdac_ext_stream *hext_stream,
|
static int
|
||||||
struct snd_soc_dai *cpu_dai)
|
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);
|
const struct hda_dai_widget_dma_ops *ops = hda_dai_get_ops(substream, cpu_dai);
|
||||||
struct sof_intel_hda_stream *hda_stream;
|
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);
|
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)
|
if (ops->release_hext_stream)
|
||||||
ops->release_hext_stream(sdev, cpu_dai, substream);
|
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)
|
if (!hext_stream)
|
||||||
return 0;
|
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,
|
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) {
|
switch (cmd) {
|
||||||
case SNDRV_PCM_TRIGGER_STOP:
|
case SNDRV_PCM_TRIGGER_STOP:
|
||||||
case SNDRV_PCM_TRIGGER_SUSPEND:
|
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) {
|
if (ret < 0) {
|
||||||
dev_err(sdev->dev, "%s: failed to clean up link DMA\n", __func__);
|
dev_err(sdev->dev, "%s: failed to clean up link DMA\n", __func__);
|
||||||
return ret;
|
return ret;
|
||||||
@ -660,8 +674,7 @@ static int hda_dai_suspend(struct hdac_bus *bus)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ret = hda_link_dma_cleanup(hext_stream->link_substream,
|
ret = hda_link_dma_cleanup(hext_stream->link_substream,
|
||||||
hext_stream,
|
hext_stream, cpu_dai, true);
|
||||||
cpu_dai);
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
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);
|
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,
|
int hda_dai_config(struct snd_soc_dapm_widget *w, unsigned int flags,
|
||||||
struct snd_sof_dai_config_data *data);
|
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)
|
static inline struct snd_sof_dev *widget_to_sdev(struct snd_soc_dapm_widget *w)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user