Merge branch 'for-linus' into for-next
Sync 5.5-devel branch once again for applying the HD-audio fixes. Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
		
						commit
						3cdca6d62b
					
				| @ -363,7 +363,6 @@ static const struct regmap_config hda_regmap_cfg = { | ||||
| 	.reg_write = hda_reg_write, | ||||
| 	.use_single_read = true, | ||||
| 	.use_single_write = true, | ||||
| 	.disable_locking = true, | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  | ||||
| @ -125,7 +125,7 @@ static char *patch[SNDRV_CARDS]; | ||||
| static bool beep_mode[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS-1)] = | ||||
| 					CONFIG_SND_HDA_INPUT_BEEP_MODE}; | ||||
| #endif | ||||
| static bool dsp_driver = 1; | ||||
| static bool dmic_detect = 1; | ||||
| 
 | ||||
| module_param_array(index, int, NULL, 0444); | ||||
| MODULE_PARM_DESC(index, "Index value for Intel HD audio interface."); | ||||
| @ -160,9 +160,10 @@ module_param_array(beep_mode, bool, NULL, 0444); | ||||
| MODULE_PARM_DESC(beep_mode, "Select HDA Beep registration mode " | ||||
| 			    "(0=off, 1=on) (default=1)."); | ||||
| #endif | ||||
| module_param(dsp_driver, bool, 0444); | ||||
| MODULE_PARM_DESC(dsp_driver, "Allow DSP driver selection (bypass this driver) " | ||||
| 			     "(0=off, 1=on) (default=1)"); | ||||
| module_param(dmic_detect, bool, 0444); | ||||
| MODULE_PARM_DESC(dmic_detect, "Allow DSP driver selection (bypass this driver) " | ||||
| 			     "(0=off, 1=on) (default=1); " | ||||
| 		 "deprecated, use snd-intel-dspcfg.dsp_driver option instead"); | ||||
| 
 | ||||
| #ifdef CONFIG_PM | ||||
| static int param_set_xint(const char *val, const struct kernel_param *kp); | ||||
| @ -2101,11 +2102,13 @@ static int azx_probe(struct pci_dev *pci, | ||||
| 	/*
 | ||||
| 	 * stop probe if another Intel's DSP driver should be activated | ||||
| 	 */ | ||||
| 	if (dsp_driver) { | ||||
| 	if (dmic_detect) { | ||||
| 		err = snd_intel_dsp_driver_probe(pci); | ||||
| 		if (err != SND_INTEL_DSP_DRIVER_ANY && | ||||
| 		    err != SND_INTEL_DSP_DRIVER_LEGACY) | ||||
| 			return -ENODEV; | ||||
| 	} else { | ||||
| 		dev_warn(&pci->dev, "dmic_detect option is deprecated, pass snd-intel-dspcfg.dsp_driver=1 option instead\n"); | ||||
| 	} | ||||
| 
 | ||||
| 	err = snd_card_new(&pci->dev, index[dev], id[dev], THIS_MODULE, | ||||
|  | ||||
| @ -412,6 +412,7 @@ static void alc_fill_eapd_coef(struct hda_codec *codec) | ||||
| 	case 0x10ec0672: | ||||
| 		alc_update_coef_idx(codec, 0xd, 0, 1<<14); /* EAPD Ctrl */ | ||||
| 		break; | ||||
| 	case 0x10ec0222: | ||||
| 	case 0x10ec0623: | ||||
| 		alc_update_coef_idx(codec, 0x19, 1<<13, 0); | ||||
| 		break; | ||||
| @ -7267,6 +7268,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | ||||
| 	SND_PCI_QUIRK(0x17aa, 0x224c, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), | ||||
| 	SND_PCI_QUIRK(0x17aa, 0x224d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK), | ||||
| 	SND_PCI_QUIRK(0x17aa, 0x225d, "Thinkpad T480", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), | ||||
| 	SND_PCI_QUIRK(0x17aa, 0x2292, "Thinkpad X1 Yoga 7th", ALC285_FIXUP_SPEAKER2_TO_DAC1), | ||||
| 	SND_PCI_QUIRK(0x17aa, 0x2293, "Thinkpad X1 Carbon 7th", ALC285_FIXUP_SPEAKER2_TO_DAC1), | ||||
| 	SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), | ||||
| 	SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), | ||||
|  | ||||
| @ -505,15 +505,20 @@ static int fsl_audmix_probe(struct platform_device *pdev) | ||||
| 					      ARRAY_SIZE(fsl_audmix_dai)); | ||||
| 	if (ret) { | ||||
| 		dev_err(dev, "failed to register ASoC DAI\n"); | ||||
| 		return ret; | ||||
| 		goto err_disable_pm; | ||||
| 	} | ||||
| 
 | ||||
| 	priv->pdev = platform_device_register_data(dev, mdrv, 0, NULL, 0); | ||||
| 	if (IS_ERR(priv->pdev)) { | ||||
| 		ret = PTR_ERR(priv->pdev); | ||||
| 		dev_err(dev, "failed to register platform %s: %d\n", mdrv, ret); | ||||
| 		goto err_disable_pm; | ||||
| 	} | ||||
| 
 | ||||
| 	return 0; | ||||
| 
 | ||||
| err_disable_pm: | ||||
| 	pm_runtime_disable(dev); | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| @ -521,6 +526,8 @@ static int fsl_audmix_remove(struct platform_device *pdev) | ||||
| { | ||||
| 	struct fsl_audmix *priv = dev_get_drvdata(&pdev->dev); | ||||
| 
 | ||||
| 	pm_runtime_disable(&pdev->dev); | ||||
| 
 | ||||
| 	if (priv->pdev) | ||||
| 		platform_device_unregister(priv->pdev); | ||||
| 
 | ||||
|  | ||||
| @ -11,7 +11,6 @@ | ||||
| #include <linux/clk.h> | ||||
| #include <linux/dmi.h> | ||||
| #include <linux/slab.h> | ||||
| #include <asm/cpu_device_id.h> | ||||
| #include <linux/acpi.h> | ||||
| #include <sound/core.h> | ||||
| #include <sound/jack.h> | ||||
|  | ||||
| @ -479,6 +479,12 @@ static struct snd_soc_pcm_runtime *soc_new_pcm_runtime( | ||||
| 		goto free_rtd; | ||||
| 
 | ||||
| 	rtd->dev = dev; | ||||
| 	INIT_LIST_HEAD(&rtd->list); | ||||
| 	INIT_LIST_HEAD(&rtd->component_list); | ||||
| 	INIT_LIST_HEAD(&rtd->dpcm[SNDRV_PCM_STREAM_PLAYBACK].be_clients); | ||||
| 	INIT_LIST_HEAD(&rtd->dpcm[SNDRV_PCM_STREAM_CAPTURE].be_clients); | ||||
| 	INIT_LIST_HEAD(&rtd->dpcm[SNDRV_PCM_STREAM_PLAYBACK].fe_clients); | ||||
| 	INIT_LIST_HEAD(&rtd->dpcm[SNDRV_PCM_STREAM_CAPTURE].fe_clients); | ||||
| 	dev_set_drvdata(dev, rtd); | ||||
| 	INIT_DELAYED_WORK(&rtd->delayed_work, close_delayed_work); | ||||
| 
 | ||||
| @ -494,12 +500,6 @@ static struct snd_soc_pcm_runtime *soc_new_pcm_runtime( | ||||
| 	/*
 | ||||
| 	 * rtd remaining settings | ||||
| 	 */ | ||||
| 	INIT_LIST_HEAD(&rtd->component_list); | ||||
| 	INIT_LIST_HEAD(&rtd->dpcm[SNDRV_PCM_STREAM_PLAYBACK].be_clients); | ||||
| 	INIT_LIST_HEAD(&rtd->dpcm[SNDRV_PCM_STREAM_CAPTURE].be_clients); | ||||
| 	INIT_LIST_HEAD(&rtd->dpcm[SNDRV_PCM_STREAM_PLAYBACK].fe_clients); | ||||
| 	INIT_LIST_HEAD(&rtd->dpcm[SNDRV_PCM_STREAM_CAPTURE].fe_clients); | ||||
| 
 | ||||
| 	rtd->card = card; | ||||
| 	rtd->dai_link = dai_link; | ||||
| 	if (!rtd->dai_link->ops) | ||||
| @ -1871,6 +1871,8 @@ match: | ||||
| 
 | ||||
| 			/* convert non BE into BE */ | ||||
| 			dai_link->no_pcm = 1; | ||||
| 			dai_link->dpcm_playback = 1; | ||||
| 			dai_link->dpcm_capture = 1; | ||||
| 
 | ||||
| 			/* override any BE fixups */ | ||||
| 			dai_link->be_hw_params_fixup = | ||||
|  | ||||
| @ -548,12 +548,12 @@ static void remove_link(struct snd_soc_component *comp, | ||||
| 	if (dobj->ops && dobj->ops->link_unload) | ||||
| 		dobj->ops->link_unload(comp, dobj); | ||||
| 
 | ||||
| 	list_del(&dobj->list); | ||||
| 	snd_soc_remove_dai_link(comp->card, link); | ||||
| 
 | ||||
| 	kfree(link->name); | ||||
| 	kfree(link->stream_name); | ||||
| 	kfree(link->cpus->dai_name); | ||||
| 
 | ||||
| 	list_del(&dobj->list); | ||||
| 	snd_soc_remove_dai_link(comp->card, link); | ||||
| 	kfree(link); | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -209,7 +209,7 @@ static int imx8_probe(struct snd_sof_dev *sdev) | ||||
| 
 | ||||
| 	priv->pd_dev = devm_kmalloc_array(&pdev->dev, priv->num_domains, | ||||
| 					  sizeof(*priv->pd_dev), GFP_KERNEL); | ||||
| 	if (!priv) | ||||
| 	if (!priv->pd_dev) | ||||
| 		return -ENOMEM; | ||||
| 
 | ||||
| 	priv->link = devm_kmalloc_array(&pdev->dev, priv->num_domains, | ||||
| @ -304,6 +304,9 @@ static int imx8_probe(struct snd_sof_dev *sdev) | ||||
| 	} | ||||
| 	sdev->mailbox_bar = SOF_FW_BLK_TYPE_SRAM; | ||||
| 
 | ||||
| 	/* set default mailbox offset for FW ready message */ | ||||
| 	sdev->dsp_box.offset = MBOX_OFFSET; | ||||
| 
 | ||||
| 	return 0; | ||||
| 
 | ||||
| exit_pdev_unregister: | ||||
|  | ||||
| @ -216,6 +216,8 @@ static int hda_link_hw_params(struct snd_pcm_substream *substream, | ||||
| 		link_dev = hda_link_stream_assign(bus, substream); | ||||
| 		if (!link_dev) | ||||
| 			return -EBUSY; | ||||
| 
 | ||||
| 		snd_soc_dai_set_dma_data(dai, substream, (void *)link_dev); | ||||
| 	} | ||||
| 
 | ||||
| 	stream_tag = hdac_stream(link_dev)->stream_tag; | ||||
| @ -228,8 +230,6 @@ static int hda_link_hw_params(struct snd_pcm_substream *substream, | ||||
| 	if (ret < 0) | ||||
| 		return ret; | ||||
| 
 | ||||
| 	snd_soc_dai_set_dma_data(dai, substream, (void *)link_dev); | ||||
| 
 | ||||
| 	link = snd_hdac_ext_bus_get_link(bus, codec_dai->component->name); | ||||
| 	if (!link) | ||||
| 		return -EINVAL; | ||||
| @ -361,6 +361,13 @@ static int hda_link_hw_free(struct snd_pcm_substream *substream, | ||||
| 	bus = hstream->bus; | ||||
| 	rtd = snd_pcm_substream_chip(substream); | ||||
| 	link_dev = snd_soc_dai_get_dma_data(dai, substream); | ||||
| 
 | ||||
| 	if (!link_dev) { | ||||
| 		dev_dbg(dai->dev, | ||||
| 			"%s: link_dev is not assigned\n", __func__); | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
| 
 | ||||
| 	hda_stream = hstream_to_sof_hda_stream(link_dev); | ||||
| 
 | ||||
| 	/* free the link DMA channel in the FW */ | ||||
|  | ||||
| @ -826,6 +826,9 @@ void snd_sof_ipc_free(struct snd_sof_dev *sdev) | ||||
| { | ||||
| 	struct snd_sof_ipc *ipc = sdev->ipc; | ||||
| 
 | ||||
| 	if (!ipc) | ||||
| 		return; | ||||
| 
 | ||||
| 	/* disable sending of ipc's */ | ||||
| 	mutex_lock(&ipc->tx_mutex); | ||||
| 	ipc->disable_ipc_tx = true; | ||||
|  | ||||
| @ -12,7 +12,6 @@ | ||||
| #include <linux/delay.h> | ||||
| #include <linux/module.h> | ||||
| #include <linux/of_platform.h> | ||||
| #include <linux/pinctrl/consumer.h> | ||||
| #include <linux/regmap.h> | ||||
| #include <linux/reset.h> | ||||
| 
 | ||||
| @ -220,6 +219,7 @@ | ||||
|  * @slave_config: dma slave channel runtime config pointer | ||||
|  * @phys_addr: SPDIFRX registers physical base address | ||||
|  * @lock: synchronization enabling lock | ||||
|  * @irq_lock: prevent race condition with IRQ on stream state | ||||
|  * @cs: channel status buffer | ||||
|  * @ub: user data buffer | ||||
|  * @irq: SPDIFRX interrupt line | ||||
| @ -240,6 +240,7 @@ struct stm32_spdifrx_data { | ||||
| 	struct dma_slave_config slave_config; | ||||
| 	dma_addr_t phys_addr; | ||||
| 	spinlock_t lock;  /* Sync enabling lock */ | ||||
| 	spinlock_t irq_lock; /* Prevent race condition on stream state */ | ||||
| 	unsigned char cs[SPDIFRX_CS_BYTES_NB]; | ||||
| 	unsigned char ub[SPDIFRX_UB_BYTES_NB]; | ||||
| 	int irq; | ||||
| @ -320,6 +321,7 @@ static void stm32_spdifrx_dma_ctrl_stop(struct stm32_spdifrx_data *spdifrx) | ||||
| static int stm32_spdifrx_start_sync(struct stm32_spdifrx_data *spdifrx) | ||||
| { | ||||
| 	int cr, cr_mask, imr, ret; | ||||
| 	unsigned long flags; | ||||
| 
 | ||||
| 	/* Enable IRQs */ | ||||
| 	imr = SPDIFRX_IMR_IFEIE | SPDIFRX_IMR_SYNCDIE | SPDIFRX_IMR_PERRIE; | ||||
| @ -327,7 +329,7 @@ static int stm32_spdifrx_start_sync(struct stm32_spdifrx_data *spdifrx) | ||||
| 	if (ret) | ||||
| 		return ret; | ||||
| 
 | ||||
| 	spin_lock(&spdifrx->lock); | ||||
| 	spin_lock_irqsave(&spdifrx->lock, flags); | ||||
| 
 | ||||
| 	spdifrx->refcount++; | ||||
| 
 | ||||
| @ -362,7 +364,7 @@ static int stm32_spdifrx_start_sync(struct stm32_spdifrx_data *spdifrx) | ||||
| 				"Failed to start synchronization\n"); | ||||
| 	} | ||||
| 
 | ||||
| 	spin_unlock(&spdifrx->lock); | ||||
| 	spin_unlock_irqrestore(&spdifrx->lock, flags); | ||||
| 
 | ||||
| 	return ret; | ||||
| } | ||||
| @ -370,11 +372,12 @@ static int stm32_spdifrx_start_sync(struct stm32_spdifrx_data *spdifrx) | ||||
| static void stm32_spdifrx_stop(struct stm32_spdifrx_data *spdifrx) | ||||
| { | ||||
| 	int cr, cr_mask, reg; | ||||
| 	unsigned long flags; | ||||
| 
 | ||||
| 	spin_lock(&spdifrx->lock); | ||||
| 	spin_lock_irqsave(&spdifrx->lock, flags); | ||||
| 
 | ||||
| 	if (--spdifrx->refcount) { | ||||
| 		spin_unlock(&spdifrx->lock); | ||||
| 		spin_unlock_irqrestore(&spdifrx->lock, flags); | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| @ -393,7 +396,7 @@ static void stm32_spdifrx_stop(struct stm32_spdifrx_data *spdifrx) | ||||
| 	regmap_read(spdifrx->regmap, STM32_SPDIFRX_DR, ®); | ||||
| 	regmap_read(spdifrx->regmap, STM32_SPDIFRX_CSR, ®); | ||||
| 
 | ||||
| 	spin_unlock(&spdifrx->lock); | ||||
| 	spin_unlock_irqrestore(&spdifrx->lock, flags); | ||||
| } | ||||
| 
 | ||||
| static int stm32_spdifrx_dma_ctrl_register(struct device *dev, | ||||
| @ -480,8 +483,6 @@ static int stm32_spdifrx_get_ctrl_data(struct stm32_spdifrx_data *spdifrx) | ||||
| 	memset(spdifrx->cs, 0, SPDIFRX_CS_BYTES_NB); | ||||
| 	memset(spdifrx->ub, 0, SPDIFRX_UB_BYTES_NB); | ||||
| 
 | ||||
| 	pinctrl_pm_select_default_state(&spdifrx->pdev->dev); | ||||
| 
 | ||||
| 	ret = stm32_spdifrx_dma_ctrl_start(spdifrx); | ||||
| 	if (ret < 0) | ||||
| 		return ret; | ||||
| @ -513,7 +514,6 @@ static int stm32_spdifrx_get_ctrl_data(struct stm32_spdifrx_data *spdifrx) | ||||
| 
 | ||||
| end: | ||||
| 	clk_disable_unprepare(spdifrx->kclk); | ||||
| 	pinctrl_pm_select_sleep_state(&spdifrx->pdev->dev); | ||||
| 
 | ||||
| 	return ret; | ||||
| } | ||||
| @ -665,7 +665,6 @@ static const struct regmap_config stm32_h7_spdifrx_regmap_conf = { | ||||
| static irqreturn_t stm32_spdifrx_isr(int irq, void *devid) | ||||
| { | ||||
| 	struct stm32_spdifrx_data *spdifrx = (struct stm32_spdifrx_data *)devid; | ||||
| 	struct snd_pcm_substream *substream = spdifrx->substream; | ||||
| 	struct platform_device *pdev = spdifrx->pdev; | ||||
| 	unsigned int cr, mask, sr, imr; | ||||
| 	unsigned int flags, sync_state; | ||||
| @ -745,14 +744,19 @@ static irqreturn_t stm32_spdifrx_isr(int irq, void *devid) | ||||
| 			return IRQ_HANDLED; | ||||
| 		} | ||||
| 
 | ||||
| 		if (substream) | ||||
| 			snd_pcm_stop(substream, SNDRV_PCM_STATE_DISCONNECTED); | ||||
| 		spin_lock(&spdifrx->irq_lock); | ||||
| 		if (spdifrx->substream) | ||||
| 			snd_pcm_stop(spdifrx->substream, | ||||
| 				     SNDRV_PCM_STATE_DISCONNECTED); | ||||
| 		spin_unlock(&spdifrx->irq_lock); | ||||
| 
 | ||||
| 		return IRQ_HANDLED; | ||||
| 	} | ||||
| 
 | ||||
| 	if (err_xrun && substream) | ||||
| 		snd_pcm_stop_xrun(substream); | ||||
| 	spin_lock(&spdifrx->irq_lock); | ||||
| 	if (err_xrun && spdifrx->substream) | ||||
| 		snd_pcm_stop_xrun(spdifrx->substream); | ||||
| 	spin_unlock(&spdifrx->irq_lock); | ||||
| 
 | ||||
| 	return IRQ_HANDLED; | ||||
| } | ||||
| @ -761,9 +765,12 @@ static int stm32_spdifrx_startup(struct snd_pcm_substream *substream, | ||||
| 				 struct snd_soc_dai *cpu_dai) | ||||
| { | ||||
| 	struct stm32_spdifrx_data *spdifrx = snd_soc_dai_get_drvdata(cpu_dai); | ||||
| 	unsigned long flags; | ||||
| 	int ret; | ||||
| 
 | ||||
| 	spin_lock_irqsave(&spdifrx->irq_lock, flags); | ||||
| 	spdifrx->substream = substream; | ||||
| 	spin_unlock_irqrestore(&spdifrx->irq_lock, flags); | ||||
| 
 | ||||
| 	ret = clk_prepare_enable(spdifrx->kclk); | ||||
| 	if (ret) | ||||
| @ -839,8 +846,12 @@ static void stm32_spdifrx_shutdown(struct snd_pcm_substream *substream, | ||||
| 				   struct snd_soc_dai *cpu_dai) | ||||
| { | ||||
| 	struct stm32_spdifrx_data *spdifrx = snd_soc_dai_get_drvdata(cpu_dai); | ||||
| 	unsigned long flags; | ||||
| 
 | ||||
| 	spin_lock_irqsave(&spdifrx->irq_lock, flags); | ||||
| 	spdifrx->substream = NULL; | ||||
| 	spin_unlock_irqrestore(&spdifrx->irq_lock, flags); | ||||
| 
 | ||||
| 	clk_disable_unprepare(spdifrx->kclk); | ||||
| } | ||||
| 
 | ||||
| @ -944,6 +955,7 @@ static int stm32_spdifrx_probe(struct platform_device *pdev) | ||||
| 	spdifrx->pdev = pdev; | ||||
| 	init_completion(&spdifrx->cs_completion); | ||||
| 	spin_lock_init(&spdifrx->lock); | ||||
| 	spin_lock_init(&spdifrx->irq_lock); | ||||
| 
 | ||||
| 	platform_set_drvdata(pdev, spdifrx); | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user