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,
|
int snd_hdac_ext_bus_link_get(struct hdac_bus *bus,
|
||||||
struct hdac_ext_link *link)
|
struct hdac_ext_link *link)
|
||||||
{
|
{
|
||||||
|
unsigned long codec_mask;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
mutex_lock(&bus->lock);
|
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
|
* HDA spec section 4.3 - Codec Discovery
|
||||||
*/
|
*/
|
||||||
udelay(521);
|
udelay(521);
|
||||||
bus->codec_mask = snd_hdac_chip_readw(bus, STATESTS);
|
codec_mask = snd_hdac_chip_readw(bus, STATESTS);
|
||||||
dev_dbg(bus->dev, "codec_mask = 0x%lx\n", bus->codec_mask);
|
dev_dbg(bus->dev, "codec_mask = 0x%lx\n", codec_mask);
|
||||||
snd_hdac_chip_writew(bus, STATESTS, bus->codec_mask);
|
snd_hdac_chip_writew(bus, STATESTS, codec_mask);
|
||||||
|
if (!bus->codec_mask)
|
||||||
|
bus->codec_mask = codec_mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_unlock(&bus->lock);
|
mutex_unlock(&bus->lock);
|
||||||
|
|
|
@ -10,11 +10,11 @@ config SND_ATMEL_SOC
|
||||||
if SND_ATMEL_SOC
|
if SND_ATMEL_SOC
|
||||||
|
|
||||||
config SND_ATMEL_SOC_PDC
|
config SND_ATMEL_SOC_PDC
|
||||||
tristate
|
bool
|
||||||
depends on HAS_DMA
|
depends on HAS_DMA
|
||||||
|
|
||||||
config SND_ATMEL_SOC_DMA
|
config SND_ATMEL_SOC_DMA
|
||||||
tristate
|
bool
|
||||||
select SND_SOC_GENERIC_DMAENGINE_PCM
|
select SND_SOC_GENERIC_DMAENGINE_PCM
|
||||||
|
|
||||||
config SND_ATMEL_SOC_SSC
|
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-atmel-i2s-objs := atmel-i2s.o
|
||||||
snd-soc-mchp-i2s-mcc-objs := mchp-i2s-mcc.o
|
snd-soc-mchp-i2s-mcc-objs := mchp-i2s-mcc.o
|
||||||
|
|
||||||
obj-$(CONFIG_SND_ATMEL_SOC_PDC) += snd-soc-atmel-pcm-pdc.o
|
# pdc and dma need to both be built-in if any user of
|
||||||
obj-$(CONFIG_SND_ATMEL_SOC_DMA) += snd-soc-atmel-pcm-dma.o
|
# 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_SSC) += snd-soc-atmel_ssc_dai.o
|
||||||
obj-$(CONFIG_SND_ATMEL_SOC_I2S) += snd-soc-atmel-i2s.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
|
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,
|
ret = devm_snd_soc_register_component(&pdev->dev, &fsl_component,
|
||||||
&fsl_sai_dai, 1);
|
&fsl_sai_dai, 1);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
goto err_pm_disable;
|
||||||
|
|
||||||
|
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;
|
return ret;
|
||||||
|
|
||||||
if (sai->soc_data->use_imx_pcm)
|
err_pm_disable:
|
||||||
return imx_pcm_dma_init(pdev, IMX_SAI_DMABUF_SIZE);
|
pm_runtime_disable(&pdev->dev);
|
||||||
else
|
|
||||||
return devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fsl_sai_remove(struct platform_device *pdev)
|
static int fsl_sai_remove(struct platform_device *pdev)
|
||||||
|
|
|
@ -174,9 +174,11 @@ void hda_codec_i915_display_power(struct snd_sof_dev *sdev, bool enable)
|
||||||
{
|
{
|
||||||
struct hdac_bus *bus = sof_to_bus(sdev);
|
struct hdac_bus *bus = sof_to_bus(sdev);
|
||||||
|
|
||||||
|
if (HDA_IDISP_CODEC(bus->codec_mask)) {
|
||||||
dev_dbg(bus->dev, "Turning i915 HDAC power %d\n", enable);
|
dev_dbg(bus->dev, "Turning i915 HDAC power %d\n", enable);
|
||||||
snd_hdac_display_power(bus, HDA_CODEC_IDX_CONTROLLER, 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);
|
EXPORT_SYMBOL_NS(hda_codec_i915_display_power, SND_SOC_SOF_HDA_AUDIO_CODEC_I915);
|
||||||
|
|
||||||
int hda_codec_i915_init(struct snd_sof_dev *sdev)
|
int hda_codec_i915_init(struct snd_sof_dev *sdev)
|
||||||
|
@ -189,7 +191,8 @@ int hda_codec_i915_init(struct snd_sof_dev *sdev)
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -200,7 +203,8 @@ int hda_codec_i915_exit(struct snd_sof_dev *sdev)
|
||||||
struct hdac_bus *bus = sof_to_bus(sdev);
|
struct hdac_bus *bus = sof_to_bus(sdev);
|
||||||
int ret;
|
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);
|
ret = snd_hdac_i915_exit(bus);
|
||||||
|
|
||||||
|
|
|
@ -593,6 +593,9 @@ static int hda_suspend(struct snd_sof_dev *sdev, bool runtime_suspend)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* display codec can powered off after link reset */
|
||||||
|
hda_codec_i915_display_power(sdev, false);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -604,6 +607,9 @@ static int hda_resume(struct snd_sof_dev *sdev, bool runtime_resume)
|
||||||
#endif
|
#endif
|
||||||
int ret;
|
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
|
* clear TCSEL to clear playback on some HD Audio
|
||||||
* codecs. PCI TCSEL is defined in the Intel manuals.
|
* 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 */
|
/* resume from D0I3 */
|
||||||
if (sdev->dsp_power_state.state == SOF_DSP_PM_D0) {
|
if (sdev->dsp_power_state.state == SOF_DSP_PM_D0) {
|
||||||
|
hda_codec_i915_display_power(sdev, true);
|
||||||
|
|
||||||
/* Set DSP power state */
|
/* Set DSP power state */
|
||||||
ret = hda_dsp_set_power_state(sdev, &target_state);
|
ret = hda_dsp_set_power_state(sdev, &target_state);
|
||||||
if (ret < 0) {
|
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);
|
cancel_delayed_work_sync(&hda->d0i3_work);
|
||||||
|
|
||||||
if (target_state == SOF_DSP_PM_D0) {
|
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 */
|
/* Set DSP power state */
|
||||||
ret = hda_dsp_set_power_state(sdev, &target_dsp_state);
|
ret = hda_dsp_set_power_state(sdev, &target_dsp_state);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
|
|
@ -286,6 +286,13 @@ static int hda_init(struct snd_sof_dev *sdev)
|
||||||
/* HDA base */
|
/* HDA base */
|
||||||
sdev->bar[HDA_DSP_HDA_BAR] = bus->remap_addr;
|
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 */
|
/* get controller capabilities */
|
||||||
ret = hda_dsp_ctrl_get_caps(sdev);
|
ret = hda_dsp_ctrl_get_caps(sdev);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
|
@ -353,15 +360,6 @@ static int hda_init_caps(struct snd_sof_dev *sdev)
|
||||||
if (bus->ppcap)
|
if (bus->ppcap)
|
||||||
dev_dbg(sdev->dev, "PP capability, will probe DSP later.\n");
|
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 */
|
/* Init HDA controller after i915 init */
|
||||||
ret = hda_dsp_ctrl_init_chip(sdev, true);
|
ret = hda_dsp_ctrl_init_chip(sdev, true);
|
||||||
if (ret < 0) {
|
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);
|
hda_codec_probe_bus(sdev, hda_codec_use_common_hdmi);
|
||||||
|
|
||||||
if (!HDA_IDISP_CODEC(bus->codec_mask))
|
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
|
* we are done probing so decrement link counts
|
||||||
|
@ -613,6 +611,7 @@ free_streams:
|
||||||
iounmap(sdev->bar[HDA_DSP_BAR]);
|
iounmap(sdev->bar[HDA_DSP_BAR]);
|
||||||
hdac_bus_unmap:
|
hdac_bus_unmap:
|
||||||
iounmap(bus->remap_addr);
|
iounmap(bus->remap_addr);
|
||||||
|
hda_codec_i915_exit(sdev);
|
||||||
err:
|
err:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче