mirror of https://gitee.com/openkylin/linux.git
sound fixes for 4.19-rc3
Just a few small fixes: - a fix for the recursive work cancellation in a specific HD-audio operation mode - a fix for potentially uninitialized memory access via rawmidi - the register bit access fixes for ASoC HD-audio -----BEGIN PGP SIGNATURE----- iQJCBAABCAAsFiEEIXTw5fNLNI7mMiVaLtJE4w1nLE8FAluRUPIOHHRpd2FpQHN1 c2UuZGUACgkQLtJE4w1nLE+Ocg/+IyPtFzekuBO5zqp9PtDAz0stpvYiUerRYzUL PUZzKq4RoIpcZb5wk5wNATAlVGXhQEDzPdjYHQCW639Osj9s6429EufoKXqL9U29 UrKDMJBCmha3CAe6GJsBTNC/Lt8Zp60nV9HYfT9EU0LPRhQ9kw+gX2I7HyFxE5aw 7Ik5jOpiC+cR7gSuROL0ZzPQ4mG3YWSe6OWXYpoefuuDRQ7NpG4GIn/KQlJMoUlx 41GABCvLu2PIApczXzgZUGhTq4C+/0xZuYF4qf4iM5bDFhPxOC1u2eQftiXL5jGI +ZWnCjw7005FmH3Yvwrc3S1vpdI26Kzd7Zg5F4xb5vSOybRLmajbnGq1jzqm7bDh TcyET4VnX2gkL3DYq5fgwI5gqJPqkd8K8NC1L+YtqzAMb1GN2qDj/0FebGnY1Jpn Zufu25bnX+3JKAYB37c/TSzdkKFch6w0Z2TtsmlYjpmTz0m1AyiwdyQ2HcTr+KBx a1b1YU5+pvgRFpmgQUpGgXgyoG6+51np4oYf7Memc3gR1Fq8vht18hStgCP0qpuP b4uvgOtSKMxJVDxflAbOHE+nhX1O9RciXR7Mep4haDtOTm8bW931L+GlkH1mRRYg e4PAo4TmfzcQCyRATWMaA9i4l2hwRyhpndjAP81lyCVba3WBZa7xnLPaDLFFmSuT b0h9hi4= =nuWw -----END PGP SIGNATURE----- Merge tag 'sound-4.19-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound Pull sound fixes from Takashi Iwai: "Just a few small fixes: - a fix for the recursive work cancellation in a specific HD-audio operation mode - a fix for potentially uninitialized memory access via rawmidi - the register bit access fixes for ASoC HD-audio" * tag 'sound-4.19-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: ALSA: hda: Fix several mismatch for register mask and value ALSA: rawmidi: Initialize allocated buffers ALSA: hda - Fix cancel_work_sync() stall from jackpoll work
This commit is contained in:
commit
69ddce94e3
|
@ -129,7 +129,7 @@ static int snd_rawmidi_runtime_create(struct snd_rawmidi_substream *substream)
|
|||
runtime->avail = 0;
|
||||
else
|
||||
runtime->avail = runtime->buffer_size;
|
||||
runtime->buffer = kvmalloc(runtime->buffer_size, GFP_KERNEL);
|
||||
runtime->buffer = kvzalloc(runtime->buffer_size, GFP_KERNEL);
|
||||
if (!runtime->buffer) {
|
||||
kfree(runtime);
|
||||
return -ENOMEM;
|
||||
|
@ -655,7 +655,7 @@ static int resize_runtime_buffer(struct snd_rawmidi_runtime *runtime,
|
|||
if (params->avail_min < 1 || params->avail_min > params->buffer_size)
|
||||
return -EINVAL;
|
||||
if (params->buffer_size != runtime->buffer_size) {
|
||||
newbuf = kvmalloc(params->buffer_size, GFP_KERNEL);
|
||||
newbuf = kvzalloc(params->buffer_size, GFP_KERNEL);
|
||||
if (!newbuf)
|
||||
return -ENOMEM;
|
||||
spin_lock_irq(&runtime->lock);
|
||||
|
|
|
@ -146,7 +146,8 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_stream_decouple);
|
|||
*/
|
||||
void snd_hdac_ext_link_stream_start(struct hdac_ext_stream *stream)
|
||||
{
|
||||
snd_hdac_updatel(stream->pplc_addr, AZX_REG_PPLCCTL, 0, AZX_PPLCCTL_RUN);
|
||||
snd_hdac_updatel(stream->pplc_addr, AZX_REG_PPLCCTL,
|
||||
AZX_PPLCCTL_RUN, AZX_PPLCCTL_RUN);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hdac_ext_link_stream_start);
|
||||
|
||||
|
@ -171,7 +172,8 @@ void snd_hdac_ext_link_stream_reset(struct hdac_ext_stream *stream)
|
|||
|
||||
snd_hdac_ext_link_stream_clear(stream);
|
||||
|
||||
snd_hdac_updatel(stream->pplc_addr, AZX_REG_PPLCCTL, 0, AZX_PPLCCTL_STRST);
|
||||
snd_hdac_updatel(stream->pplc_addr, AZX_REG_PPLCCTL,
|
||||
AZX_PPLCCTL_STRST, AZX_PPLCCTL_STRST);
|
||||
udelay(3);
|
||||
timeout = 50;
|
||||
do {
|
||||
|
@ -242,7 +244,7 @@ EXPORT_SYMBOL_GPL(snd_hdac_ext_link_set_stream_id);
|
|||
void snd_hdac_ext_link_clear_stream_id(struct hdac_ext_link *link,
|
||||
int stream)
|
||||
{
|
||||
snd_hdac_updatew(link->ml_addr, AZX_REG_ML_LOSIDV, 0, (1 << stream));
|
||||
snd_hdac_updatew(link->ml_addr, AZX_REG_ML_LOSIDV, (1 << stream), 0);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_hdac_ext_link_clear_stream_id);
|
||||
|
||||
|
@ -415,7 +417,6 @@ void snd_hdac_ext_stream_spbcap_enable(struct hdac_bus *bus,
|
|||
bool enable, int index)
|
||||
{
|
||||
u32 mask = 0;
|
||||
u32 register_mask = 0;
|
||||
|
||||
if (!bus->spbcap) {
|
||||
dev_err(bus->dev, "Address of SPB capability is NULL\n");
|
||||
|
@ -424,12 +425,8 @@ void snd_hdac_ext_stream_spbcap_enable(struct hdac_bus *bus,
|
|||
|
||||
mask |= (1 << index);
|
||||
|
||||
register_mask = readl(bus->spbcap + AZX_REG_SPB_SPBFCCTL);
|
||||
|
||||
mask |= register_mask;
|
||||
|
||||
if (enable)
|
||||
snd_hdac_updatel(bus->spbcap, AZX_REG_SPB_SPBFCCTL, 0, mask);
|
||||
snd_hdac_updatel(bus->spbcap, AZX_REG_SPB_SPBFCCTL, mask, mask);
|
||||
else
|
||||
snd_hdac_updatel(bus->spbcap, AZX_REG_SPB_SPBFCCTL, mask, 0);
|
||||
}
|
||||
|
@ -503,7 +500,6 @@ void snd_hdac_ext_stream_drsm_enable(struct hdac_bus *bus,
|
|||
bool enable, int index)
|
||||
{
|
||||
u32 mask = 0;
|
||||
u32 register_mask = 0;
|
||||
|
||||
if (!bus->drsmcap) {
|
||||
dev_err(bus->dev, "Address of DRSM capability is NULL\n");
|
||||
|
@ -512,12 +508,8 @@ void snd_hdac_ext_stream_drsm_enable(struct hdac_bus *bus,
|
|||
|
||||
mask |= (1 << index);
|
||||
|
||||
register_mask = readl(bus->drsmcap + AZX_REG_SPB_SPBFCCTL);
|
||||
|
||||
mask |= register_mask;
|
||||
|
||||
if (enable)
|
||||
snd_hdac_updatel(bus->drsmcap, AZX_REG_DRSM_CTL, 0, mask);
|
||||
snd_hdac_updatel(bus->drsmcap, AZX_REG_DRSM_CTL, mask, mask);
|
||||
else
|
||||
snd_hdac_updatel(bus->drsmcap, AZX_REG_DRSM_CTL, mask, 0);
|
||||
}
|
||||
|
|
|
@ -3935,7 +3935,8 @@ void snd_hda_bus_reset_codecs(struct hda_bus *bus)
|
|||
|
||||
list_for_each_codec(codec, bus) {
|
||||
/* FIXME: maybe a better way needed for forced reset */
|
||||
cancel_delayed_work_sync(&codec->jackpoll_work);
|
||||
if (current_work() != &codec->jackpoll_work.work)
|
||||
cancel_delayed_work_sync(&codec->jackpoll_work);
|
||||
#ifdef CONFIG_PM
|
||||
if (hda_codec_is_power_on(codec)) {
|
||||
hda_call_codec_suspend(codec);
|
||||
|
|
Loading…
Reference in New Issue