mirror of https://gitee.com/openkylin/linux.git
sound fixes for 5.0-rc7
It's a bit of surprising that we've got more changes than hoped at this late stage, but the all don't look too scaring but small fixes. One change in ALSA core side is again the PCM regression fix that was partially addressed for OSS, but now the all relevant change is reverted instead. Also, a few ASoC core fixes for UAF and OOB are included, while the rest are usual random device-specific fixes. -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEEIXTw5fNLNI7mMiVaLtJE4w1nLE8FAlxhn2AOHHRpd2FpQHN1 c2UuZGUACgkQLtJE4w1nLE9VHg/+LYWUmEcC5jpJrknCMu9SGvvjK8BZahEB/vUH NR+Dcy61SszIng4Wc2rtKdQscmKXf4XZmHejiu2oJDYk7KWaU0eQnL06NLIdHCRg 4Vu302dhnG7THBzG99CtE2cWjTA3YLW93H/WgG7gQEKBNGjkUz4OpAbjYmJle/GO TyH6c2a9vFia/+8h4LX+HJrLysrbdK0mpibDQ/kRqcRxwd1i1becf3CDXj8KfMdE KS+RpimxgMOF8PokjdhzaomnIGgcf0OrIN6iSXOAxwBWRcIhyWFE6npIz2+vxJ3f Di69z7z8Oju3PvfXwUyLbSWjhhle6Mrm3qOOs4sPmAu45uuMFtxClo6WzOmT0OQt 5bVw60ITLE06U/Za9bR4W/uWbdb6I4Q2I5yG50KzoIfqsmk9sejd1975MJUaz5WL HrGxBGqT3wXvbq8tCdctRl0q+jQotSRDrQS+S5vqvSzSNLyYevJkWAYchdnbXPxU UVXGLWSBM4yM+KX4fYzi33cQaIIST2m9kWwgs3R+PYxoSMAIrYVBOQDn3aU7xmdF 9O6Sm3xnf7Eo+HUC5gnZ6FOTJJJHqaXN9E019bhUieS60pUoMfwsfSaEddkf46KI eIttfY6RNyOvL9tuQj+XoP6lJTy1xwe29ZzpH0zlgp1q79DIOeizB3/bNf4j97DX 8mRzg4I= =NQQX -----END PGP SIGNATURE----- Merge tag 'sound-5.0-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "It's a bit of surprising that we've got more changes than hoped at this late stage, but they all don't look too scary but small fixes. One change in ALSA core side is again the PCM regression fix that was partially addressed for OSS, but now the all relevant change is reverted instead. Also, a few ASoC core fixes for UAF and OOB are included, while the rest are usual random device-specific fixes" * tag 'sound-5.0-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: ALSA: pcm: Revert capture stream behavior change in blocking mode ALSA: usb-audio: Fix implicit fb endpoint setup by quirk ALSA: hda - Add quirk for HP EliteBook 840 G5 ASoC: samsung: Prevent clk_get_rate() calls in atomic context ASoC: rsnd: ssiu: correct shift bit for ssiu9 ASoC: rsnd: fixup rsnd_ssi_master_clk_start() user count check ASoC: dapm: fix out-of-bounds accesses to DAPM lookup tables ASoC: topology: fix oops/use-after-free case with dai driver ASoC: rsnd: fixup MIX kctrl registration ASoC: core: Allow soc_find_component lookups to match parent of_node ASoC: rt5682: Correct the setting while select ASRC clk for AD/DA filter ASoC: MAINTAINERS: fsl: Change Fabio's email address ASoC: hdmi-codec: fix oops on re-probe
This commit is contained in:
commit
1d110257c2
|
@ -6151,7 +6151,7 @@ FREESCALE SOC SOUND DRIVERS
|
|||
M: Timur Tabi <timur@kernel.org>
|
||||
M: Nicolin Chen <nicoleotsuka@gmail.com>
|
||||
M: Xiubo Li <Xiubo.Lee@gmail.com>
|
||||
R: Fabio Estevam <fabio.estevam@nxp.com>
|
||||
R: Fabio Estevam <festevam@gmail.com>
|
||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||
L: linuxppc-dev@lists.ozlabs.org
|
||||
S: Maintained
|
||||
|
@ -10898,7 +10898,7 @@ F: include/linux/nvmem-consumer.h
|
|||
F: include/linux/nvmem-provider.h
|
||||
|
||||
NXP SGTL5000 DRIVER
|
||||
M: Fabio Estevam <fabio.estevam@nxp.com>
|
||||
M: Fabio Estevam <festevam@gmail.com>
|
||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/sound/sgtl5000.txt
|
||||
|
|
|
@ -2112,13 +2112,6 @@ int pcm_lib_apply_appl_ptr(struct snd_pcm_substream *substream,
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* allow waiting for a capture stream that hasn't been started */
|
||||
#if IS_ENABLED(CONFIG_SND_PCM_OSS)
|
||||
#define wait_capture_start(substream) ((substream)->oss.oss)
|
||||
#else
|
||||
#define wait_capture_start(substream) false
|
||||
#endif
|
||||
|
||||
/* the common loop for read/write data */
|
||||
snd_pcm_sframes_t __snd_pcm_lib_xfer(struct snd_pcm_substream *substream,
|
||||
void *data, bool interleaved,
|
||||
|
@ -2184,16 +2177,11 @@ snd_pcm_sframes_t __snd_pcm_lib_xfer(struct snd_pcm_substream *substream,
|
|||
snd_pcm_update_hw_ptr(substream);
|
||||
|
||||
if (!is_playback &&
|
||||
runtime->status->state == SNDRV_PCM_STATE_PREPARED) {
|
||||
if (size >= runtime->start_threshold) {
|
||||
err = snd_pcm_start(substream);
|
||||
if (err < 0)
|
||||
goto _end_unlock;
|
||||
} else if (!wait_capture_start(substream)) {
|
||||
/* nothing to do */
|
||||
err = 0;
|
||||
runtime->status->state == SNDRV_PCM_STATE_PREPARED &&
|
||||
size >= runtime->start_threshold) {
|
||||
err = snd_pcm_start(substream);
|
||||
if (err < 0)
|
||||
goto _end_unlock;
|
||||
}
|
||||
}
|
||||
|
||||
avail = snd_pcm_avail(substream);
|
||||
|
|
|
@ -924,6 +924,7 @@ static const struct snd_pci_quirk cxt5066_fixups[] = {
|
|||
SND_PCI_QUIRK(0x103c, 0x807C, "HP EliteBook 820 G3", CXT_FIXUP_HP_DOCK),
|
||||
SND_PCI_QUIRK(0x103c, 0x80FD, "HP ProBook 640 G2", CXT_FIXUP_HP_DOCK),
|
||||
SND_PCI_QUIRK(0x103c, 0x828c, "HP EliteBook 840 G4", CXT_FIXUP_HP_DOCK),
|
||||
SND_PCI_QUIRK(0x103c, 0x83b2, "HP EliteBook 840 G5", CXT_FIXUP_HP_DOCK),
|
||||
SND_PCI_QUIRK(0x103c, 0x83b3, "HP EliteBook 830 G5", CXT_FIXUP_HP_DOCK),
|
||||
SND_PCI_QUIRK(0x103c, 0x83d3, "HP ProBook 640 G4", CXT_FIXUP_HP_DOCK),
|
||||
SND_PCI_QUIRK(0x103c, 0x8174, "HP Spectre x360", CXT_FIXUP_HP_SPECTRE),
|
||||
|
|
|
@ -795,6 +795,8 @@ static int hdmi_codec_probe(struct platform_device *pdev)
|
|||
if (hcd->spdif)
|
||||
hcp->daidrv[i] = hdmi_spdif_dai;
|
||||
|
||||
dev_set_drvdata(dev, hcp);
|
||||
|
||||
ret = devm_snd_soc_register_component(dev, &hdmi_driver, hcp->daidrv,
|
||||
dai_count);
|
||||
if (ret) {
|
||||
|
@ -802,8 +804,6 @@ static int hdmi_codec_probe(struct platform_device *pdev)
|
|||
__func__, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
dev_set_drvdata(dev, hcp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -1778,7 +1778,9 @@ static const struct snd_soc_dapm_route rt5682_dapm_routes[] = {
|
|||
{"ADC Stereo1 Filter", NULL, "ADC STO1 ASRC", is_using_asrc},
|
||||
{"DAC Stereo1 Filter", NULL, "DAC STO1 ASRC", is_using_asrc},
|
||||
{"ADC STO1 ASRC", NULL, "AD ASRC"},
|
||||
{"ADC STO1 ASRC", NULL, "DA ASRC"},
|
||||
{"ADC STO1 ASRC", NULL, "CLKDET"},
|
||||
{"DAC STO1 ASRC", NULL, "AD ASRC"},
|
||||
{"DAC STO1 ASRC", NULL, "DA ASRC"},
|
||||
{"DAC STO1 ASRC", NULL, "CLKDET"},
|
||||
|
||||
|
|
|
@ -700,6 +700,7 @@ static int i2s_hw_params(struct snd_pcm_substream *substream,
|
|||
{
|
||||
struct i2s_dai *i2s = to_info(dai);
|
||||
u32 mod, mask = 0, val = 0;
|
||||
struct clk *rclksrc;
|
||||
unsigned long flags;
|
||||
|
||||
WARN_ON(!pm_runtime_active(dai->dev));
|
||||
|
@ -782,6 +783,10 @@ static int i2s_hw_params(struct snd_pcm_substream *substream,
|
|||
|
||||
i2s->frmclk = params_rate(params);
|
||||
|
||||
rclksrc = i2s->clk_table[CLK_I2S_RCLK_SRC];
|
||||
if (rclksrc && !IS_ERR(rclksrc))
|
||||
i2s->rclk_srcrate = clk_get_rate(rclksrc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -886,11 +891,6 @@ static int config_setup(struct i2s_dai *i2s)
|
|||
return 0;
|
||||
|
||||
if (!(i2s->quirks & QUIRK_NO_MUXPSR)) {
|
||||
struct clk *rclksrc = i2s->clk_table[CLK_I2S_RCLK_SRC];
|
||||
|
||||
if (rclksrc && !IS_ERR(rclksrc))
|
||||
i2s->rclk_srcrate = clk_get_rate(rclksrc);
|
||||
|
||||
psr = i2s->rclk_srcrate / i2s->frmclk / rfs;
|
||||
writel(((psr - 1) << 8) | PSR_PSREN, i2s->addr + I2SPSR);
|
||||
dev_dbg(&i2s->pdev->dev,
|
||||
|
|
|
@ -1526,14 +1526,14 @@ int rsnd_kctrl_new(struct rsnd_mod *mod,
|
|||
int ret;
|
||||
|
||||
/*
|
||||
* 1) Avoid duplicate register (ex. MIXer case)
|
||||
* 2) re-register if card was rebinded
|
||||
* 1) Avoid duplicate register for DVC with MIX case
|
||||
* 2) Allow duplicate register for MIX
|
||||
* 3) re-register if card was rebinded
|
||||
*/
|
||||
list_for_each_entry(kctrl, &card->controls, list) {
|
||||
struct rsnd_kctrl_cfg *c = kctrl->private_data;
|
||||
|
||||
if (strcmp(kctrl->id.name, name) == 0 &&
|
||||
c->mod == mod)
|
||||
if (c == cfg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -286,7 +286,7 @@ static int rsnd_ssi_master_clk_start(struct rsnd_mod *mod,
|
|||
if (rsnd_ssi_is_multi_slave(mod, io))
|
||||
return 0;
|
||||
|
||||
if (ssi->usrcnt > 1) {
|
||||
if (ssi->usrcnt > 0) {
|
||||
if (ssi->rate != rate) {
|
||||
dev_err(dev, "SSI parent/child should use same rate\n");
|
||||
return -EINVAL;
|
||||
|
|
|
@ -79,7 +79,7 @@ static int rsnd_ssiu_init(struct rsnd_mod *mod,
|
|||
break;
|
||||
case 9:
|
||||
for (i = 0; i < 4; i++)
|
||||
rsnd_mod_write(mod, SSI_SYS_STATUS((i * 2) + 1), 0xf << (id * 4));
|
||||
rsnd_mod_write(mod, SSI_SYS_STATUS((i * 2) + 1), 0xf << 4);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -735,12 +735,17 @@ static struct snd_soc_component *soc_find_component(
|
|||
const struct device_node *of_node, const char *name)
|
||||
{
|
||||
struct snd_soc_component *component;
|
||||
struct device_node *component_of_node;
|
||||
|
||||
lockdep_assert_held(&client_mutex);
|
||||
|
||||
for_each_component(component) {
|
||||
if (of_node) {
|
||||
if (component->dev->of_node == of_node)
|
||||
component_of_node = component->dev->of_node;
|
||||
if (!component_of_node && component->dev->parent)
|
||||
component_of_node = component->dev->parent->of_node;
|
||||
|
||||
if (component_of_node == of_node)
|
||||
return component;
|
||||
} else if (name && strcmp(component->name, name) == 0) {
|
||||
return component;
|
||||
|
@ -951,7 +956,7 @@ static void soc_remove_dai(struct snd_soc_dai *dai, int order)
|
|||
{
|
||||
int err;
|
||||
|
||||
if (!dai || !dai->probed ||
|
||||
if (!dai || !dai->probed || !dai->driver ||
|
||||
dai->driver->remove_order != order)
|
||||
return;
|
||||
|
||||
|
|
|
@ -70,12 +70,16 @@ static int dapm_up_seq[] = {
|
|||
[snd_soc_dapm_clock_supply] = 1,
|
||||
[snd_soc_dapm_supply] = 2,
|
||||
[snd_soc_dapm_micbias] = 3,
|
||||
[snd_soc_dapm_vmid] = 3,
|
||||
[snd_soc_dapm_dai_link] = 2,
|
||||
[snd_soc_dapm_dai_in] = 4,
|
||||
[snd_soc_dapm_dai_out] = 4,
|
||||
[snd_soc_dapm_aif_in] = 4,
|
||||
[snd_soc_dapm_aif_out] = 4,
|
||||
[snd_soc_dapm_mic] = 5,
|
||||
[snd_soc_dapm_siggen] = 5,
|
||||
[snd_soc_dapm_input] = 5,
|
||||
[snd_soc_dapm_output] = 5,
|
||||
[snd_soc_dapm_mux] = 6,
|
||||
[snd_soc_dapm_demux] = 6,
|
||||
[snd_soc_dapm_dac] = 7,
|
||||
|
@ -83,11 +87,19 @@ static int dapm_up_seq[] = {
|
|||
[snd_soc_dapm_mixer] = 8,
|
||||
[snd_soc_dapm_mixer_named_ctl] = 8,
|
||||
[snd_soc_dapm_pga] = 9,
|
||||
[snd_soc_dapm_buffer] = 9,
|
||||
[snd_soc_dapm_scheduler] = 9,
|
||||
[snd_soc_dapm_effect] = 9,
|
||||
[snd_soc_dapm_src] = 9,
|
||||
[snd_soc_dapm_asrc] = 9,
|
||||
[snd_soc_dapm_encoder] = 9,
|
||||
[snd_soc_dapm_decoder] = 9,
|
||||
[snd_soc_dapm_adc] = 10,
|
||||
[snd_soc_dapm_out_drv] = 11,
|
||||
[snd_soc_dapm_hp] = 11,
|
||||
[snd_soc_dapm_spk] = 11,
|
||||
[snd_soc_dapm_line] = 11,
|
||||
[snd_soc_dapm_sink] = 11,
|
||||
[snd_soc_dapm_kcontrol] = 12,
|
||||
[snd_soc_dapm_post] = 13,
|
||||
};
|
||||
|
@ -100,13 +112,25 @@ static int dapm_down_seq[] = {
|
|||
[snd_soc_dapm_spk] = 3,
|
||||
[snd_soc_dapm_line] = 3,
|
||||
[snd_soc_dapm_out_drv] = 3,
|
||||
[snd_soc_dapm_sink] = 3,
|
||||
[snd_soc_dapm_pga] = 4,
|
||||
[snd_soc_dapm_buffer] = 4,
|
||||
[snd_soc_dapm_scheduler] = 4,
|
||||
[snd_soc_dapm_effect] = 4,
|
||||
[snd_soc_dapm_src] = 4,
|
||||
[snd_soc_dapm_asrc] = 4,
|
||||
[snd_soc_dapm_encoder] = 4,
|
||||
[snd_soc_dapm_decoder] = 4,
|
||||
[snd_soc_dapm_switch] = 5,
|
||||
[snd_soc_dapm_mixer_named_ctl] = 5,
|
||||
[snd_soc_dapm_mixer] = 5,
|
||||
[snd_soc_dapm_dac] = 6,
|
||||
[snd_soc_dapm_mic] = 7,
|
||||
[snd_soc_dapm_siggen] = 7,
|
||||
[snd_soc_dapm_input] = 7,
|
||||
[snd_soc_dapm_output] = 7,
|
||||
[snd_soc_dapm_micbias] = 8,
|
||||
[snd_soc_dapm_vmid] = 8,
|
||||
[snd_soc_dapm_mux] = 9,
|
||||
[snd_soc_dapm_demux] = 9,
|
||||
[snd_soc_dapm_aif_in] = 10,
|
||||
|
|
|
@ -502,6 +502,7 @@ static void remove_dai(struct snd_soc_component *comp,
|
|||
{
|
||||
struct snd_soc_dai_driver *dai_drv =
|
||||
container_of(dobj, struct snd_soc_dai_driver, dobj);
|
||||
struct snd_soc_dai *dai;
|
||||
|
||||
if (pass != SOC_TPLG_PASS_PCM_DAI)
|
||||
return;
|
||||
|
@ -509,6 +510,10 @@ static void remove_dai(struct snd_soc_component *comp,
|
|||
if (dobj->ops && dobj->ops->dai_unload)
|
||||
dobj->ops->dai_unload(comp, dobj);
|
||||
|
||||
list_for_each_entry(dai, &comp->dai_list, list)
|
||||
if (dai->driver == dai_drv)
|
||||
dai->driver = NULL;
|
||||
|
||||
kfree(dai_drv->name);
|
||||
list_del(&dobj->list);
|
||||
kfree(dai_drv);
|
||||
|
|
|
@ -314,6 +314,9 @@ static int search_roland_implicit_fb(struct usb_device *dev, int ifnum,
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* Setup an implicit feedback endpoint from a quirk. Returns 0 if no quirk
|
||||
* applies. Returns 1 if a quirk was found.
|
||||
*/
|
||||
static int set_sync_ep_implicit_fb_quirk(struct snd_usb_substream *subs,
|
||||
struct usb_device *dev,
|
||||
struct usb_interface_descriptor *altsd,
|
||||
|
@ -384,7 +387,7 @@ static int set_sync_ep_implicit_fb_quirk(struct snd_usb_substream *subs,
|
|||
|
||||
subs->data_endpoint->sync_master = subs->sync_endpoint;
|
||||
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int set_sync_endpoint(struct snd_usb_substream *subs,
|
||||
|
@ -423,6 +426,10 @@ static int set_sync_endpoint(struct snd_usb_substream *subs,
|
|||
if (err < 0)
|
||||
return err;
|
||||
|
||||
/* endpoint set by quirk */
|
||||
if (err > 0)
|
||||
return 0;
|
||||
|
||||
if (altsd->bNumEndpoints < 2)
|
||||
return 0;
|
||||
|
||||
|
|
Loading…
Reference in New Issue