Merge branch 'for-5.6' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into asoc-5.7
This commit is contained in:
Коммит
7b94ace7ec
|
@ -254,6 +254,7 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_bus_link_power_down_all);
|
|||
int snd_hdac_ext_bus_link_get(struct hdac_bus *bus,
|
||||
struct hdac_ext_link *link)
|
||||
{
|
||||
unsigned long codec_mask;
|
||||
int ret = 0;
|
||||
|
||||
mutex_lock(&bus->lock);
|
||||
|
@ -280,9 +281,11 @@ int snd_hdac_ext_bus_link_get(struct hdac_bus *bus,
|
|||
* HDA spec section 4.3 - Codec Discovery
|
||||
*/
|
||||
udelay(521);
|
||||
bus->codec_mask = snd_hdac_chip_readw(bus, STATESTS);
|
||||
dev_dbg(bus->dev, "codec_mask = 0x%lx\n", bus->codec_mask);
|
||||
snd_hdac_chip_writew(bus, STATESTS, bus->codec_mask);
|
||||
codec_mask = snd_hdac_chip_readw(bus, STATESTS);
|
||||
dev_dbg(bus->dev, "codec_mask = 0x%lx\n", codec_mask);
|
||||
snd_hdac_chip_writew(bus, STATESTS, codec_mask);
|
||||
if (!bus->codec_mask)
|
||||
bus->codec_mask = codec_mask;
|
||||
}
|
||||
|
||||
mutex_unlock(&bus->lock);
|
||||
|
|
|
@ -10,11 +10,11 @@ config SND_ATMEL_SOC
|
|||
if SND_ATMEL_SOC
|
||||
|
||||
config SND_ATMEL_SOC_PDC
|
||||
tristate
|
||||
bool
|
||||
depends on HAS_DMA
|
||||
|
||||
config SND_ATMEL_SOC_DMA
|
||||
tristate
|
||||
bool
|
||||
select SND_SOC_GENERIC_DMAENGINE_PCM
|
||||
|
||||
config SND_ATMEL_SOC_SSC
|
||||
|
|
|
@ -6,8 +6,14 @@ snd-soc-atmel_ssc_dai-objs := atmel_ssc_dai.o
|
|||
snd-soc-atmel-i2s-objs := atmel-i2s.o
|
||||
snd-soc-mchp-i2s-mcc-objs := mchp-i2s-mcc.o
|
||||
|
||||
obj-$(CONFIG_SND_ATMEL_SOC_PDC) += snd-soc-atmel-pcm-pdc.o
|
||||
obj-$(CONFIG_SND_ATMEL_SOC_DMA) += snd-soc-atmel-pcm-dma.o
|
||||
# pdc and dma need to both be built-in if any user of
|
||||
# ssc is built-in.
|
||||
ifdef CONFIG_SND_ATMEL_SOC_PDC
|
||||
obj-$(CONFIG_SND_ATMEL_SOC_SSC) += snd-soc-atmel-pcm-pdc.o
|
||||
endif
|
||||
ifdef CONFIG_SND_ATMEL_SOC_DMA
|
||||
obj-$(CONFIG_SND_ATMEL_SOC_SSC) += snd-soc-atmel-pcm-dma.o
|
||||
endif
|
||||
obj-$(CONFIG_SND_ATMEL_SOC_SSC) += snd-soc-atmel_ssc_dai.o
|
||||
obj-$(CONFIG_SND_ATMEL_SOC_I2S) += snd-soc-atmel-i2s.o
|
||||
obj-$(CONFIG_SND_MCHP_SOC_I2S_MCC) += snd-soc-mchp-i2s-mcc.o
|
||||
|
|
|
@ -1020,12 +1020,24 @@ static int fsl_sai_probe(struct platform_device *pdev)
|
|||
ret = devm_snd_soc_register_component(&pdev->dev, &fsl_component,
|
||||
&fsl_sai_dai, 1);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err_pm_disable;
|
||||
|
||||
if (sai->soc_data->use_imx_pcm)
|
||||
return imx_pcm_dma_init(pdev, IMX_SAI_DMABUF_SIZE);
|
||||
else
|
||||
return devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
|
||||
if (sai->soc_data->use_imx_pcm) {
|
||||
ret = imx_pcm_dma_init(pdev, IMX_SAI_DMABUF_SIZE);
|
||||
if (ret)
|
||||
goto err_pm_disable;
|
||||
} else {
|
||||
ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
|
||||
if (ret)
|
||||
goto err_pm_disable;
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
err_pm_disable:
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int fsl_sai_remove(struct platform_device *pdev)
|
||||
|
|
|
@ -174,8 +174,10 @@ void hda_codec_i915_display_power(struct snd_sof_dev *sdev, bool enable)
|
|||
{
|
||||
struct hdac_bus *bus = sof_to_bus(sdev);
|
||||
|
||||
dev_dbg(bus->dev, "Turning i915 HDAC power %d\n", enable);
|
||||
snd_hdac_display_power(bus, HDA_CODEC_IDX_CONTROLLER, enable);
|
||||
if (HDA_IDISP_CODEC(bus->codec_mask)) {
|
||||
dev_dbg(bus->dev, "Turning i915 HDAC power %d\n", enable);
|
||||
snd_hdac_display_power(bus, HDA_CODEC_IDX_CONTROLLER, enable);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_NS(hda_codec_i915_display_power, SND_SOC_SOF_HDA_AUDIO_CODEC_I915);
|
||||
|
||||
|
@ -189,7 +191,8 @@ int hda_codec_i915_init(struct snd_sof_dev *sdev)
|
|||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
hda_codec_i915_display_power(sdev, true);
|
||||
/* codec_mask not yet known, power up for probe */
|
||||
snd_hdac_display_power(bus, HDA_CODEC_IDX_CONTROLLER, true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -200,7 +203,8 @@ int hda_codec_i915_exit(struct snd_sof_dev *sdev)
|
|||
struct hdac_bus *bus = sof_to_bus(sdev);
|
||||
int ret;
|
||||
|
||||
hda_codec_i915_display_power(sdev, false);
|
||||
/* power down unconditionally */
|
||||
snd_hdac_display_power(bus, HDA_CODEC_IDX_CONTROLLER, false);
|
||||
|
||||
ret = snd_hdac_i915_exit(bus);
|
||||
|
||||
|
|
|
@ -593,6 +593,9 @@ static int hda_suspend(struct snd_sof_dev *sdev, bool runtime_suspend)
|
|||
return ret;
|
||||
}
|
||||
|
||||
/* display codec can powered off after link reset */
|
||||
hda_codec_i915_display_power(sdev, false);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -604,6 +607,9 @@ static int hda_resume(struct snd_sof_dev *sdev, bool runtime_resume)
|
|||
#endif
|
||||
int ret;
|
||||
|
||||
/* display codec must be powered before link reset */
|
||||
hda_codec_i915_display_power(sdev, true);
|
||||
|
||||
/*
|
||||
* clear TCSEL to clear playback on some HD Audio
|
||||
* codecs. PCI TCSEL is defined in the Intel manuals.
|
||||
|
@ -653,6 +659,8 @@ int hda_dsp_resume(struct snd_sof_dev *sdev)
|
|||
|
||||
/* resume from D0I3 */
|
||||
if (sdev->dsp_power_state.state == SOF_DSP_PM_D0) {
|
||||
hda_codec_i915_display_power(sdev, true);
|
||||
|
||||
/* Set DSP power state */
|
||||
ret = hda_dsp_set_power_state(sdev, &target_state);
|
||||
if (ret < 0) {
|
||||
|
@ -741,6 +749,9 @@ int hda_dsp_suspend(struct snd_sof_dev *sdev, u32 target_state)
|
|||
cancel_delayed_work_sync(&hda->d0i3_work);
|
||||
|
||||
if (target_state == SOF_DSP_PM_D0) {
|
||||
/* we can't keep a wakeref to display driver at suspend */
|
||||
hda_codec_i915_display_power(sdev, false);
|
||||
|
||||
/* Set DSP power state */
|
||||
ret = hda_dsp_set_power_state(sdev, &target_dsp_state);
|
||||
if (ret < 0) {
|
||||
|
|
|
@ -286,6 +286,13 @@ static int hda_init(struct snd_sof_dev *sdev)
|
|||
/* HDA base */
|
||||
sdev->bar[HDA_DSP_HDA_BAR] = bus->remap_addr;
|
||||
|
||||
/* init i915 and HDMI codecs */
|
||||
ret = hda_codec_i915_init(sdev);
|
||||
if (ret < 0) {
|
||||
dev_err(sdev->dev, "error: init i915 and HDMI codec failed\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* get controller capabilities */
|
||||
ret = hda_dsp_ctrl_get_caps(sdev);
|
||||
if (ret < 0)
|
||||
|
@ -353,15 +360,6 @@ static int hda_init_caps(struct snd_sof_dev *sdev)
|
|||
if (bus->ppcap)
|
||||
dev_dbg(sdev->dev, "PP capability, will probe DSP later.\n");
|
||||
|
||||
#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA)
|
||||
/* init i915 and HDMI codecs */
|
||||
ret = hda_codec_i915_init(sdev);
|
||||
if (ret < 0) {
|
||||
dev_err(sdev->dev, "error: init i915 and HDMI codec failed\n");
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Init HDA controller after i915 init */
|
||||
ret = hda_dsp_ctrl_init_chip(sdev, true);
|
||||
if (ret < 0) {
|
||||
|
@ -381,7 +379,7 @@ static int hda_init_caps(struct snd_sof_dev *sdev)
|
|||
hda_codec_probe_bus(sdev, hda_codec_use_common_hdmi);
|
||||
|
||||
if (!HDA_IDISP_CODEC(bus->codec_mask))
|
||||
hda_codec_i915_display_power(sdev, false);
|
||||
hda_codec_i915_exit(sdev);
|
||||
|
||||
/*
|
||||
* we are done probing so decrement link counts
|
||||
|
@ -613,6 +611,7 @@ free_streams:
|
|||
iounmap(sdev->bar[HDA_DSP_BAR]);
|
||||
hdac_bus_unmap:
|
||||
iounmap(bus->remap_addr);
|
||||
hda_codec_i915_exit(sdev);
|
||||
err:
|
||||
return ret;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче