diff options
author | Jeeja KP <jeeja.kp@intel.com> | 2017-01-02 12:44:28 +0530 |
---|---|---|
committer | Mark Brown <broonie@kernel.org> | 2017-01-06 18:16:10 +0000 |
commit | 09a8bf812c662c833621f19955a1d3fa495801bc (patch) | |
tree | 55123b1f66e053db7218ca8846eae13fe4d35b95 | |
parent | a5de5b74a50113564a1e0850e2da96c37c35e55d (diff) | |
download | linux-09a8bf812c662c833621f19955a1d3fa495801bc.tar.bz2 |
ALSA: hda: check stream decoupled register state
Check stream decoupled register value with requested value
before decoupling/coupling the stream.
Signed-off-by: Jeeja KP <jeeja.kp@intel.com>
Acked-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Mark Brown <broonie@kernel.org>
-rw-r--r-- | sound/hda/ext/hdac_ext_stream.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/sound/hda/ext/hdac_ext_stream.c b/sound/hda/ext/hdac_ext_stream.c index 3be051ab5533..c96d7a7a36af 100644 --- a/sound/hda/ext/hdac_ext_stream.c +++ b/sound/hda/ext/hdac_ext_stream.c @@ -128,14 +128,17 @@ void snd_hdac_ext_stream_decouple(struct hdac_ext_bus *ebus, { struct hdac_stream *hstream = &stream->hstream; struct hdac_bus *bus = &ebus->bus; + u32 val; + int mask = AZX_PPCTL_PROCEN(hstream->index); spin_lock_irq(&bus->reg_lock); - if (decouple) - snd_hdac_updatel(bus->ppcap, AZX_REG_PP_PPCTL, 0, - AZX_PPCTL_PROCEN(hstream->index)); - else - snd_hdac_updatel(bus->ppcap, AZX_REG_PP_PPCTL, - AZX_PPCTL_PROCEN(hstream->index), 0); + val = readw(bus->ppcap + AZX_REG_PP_PPCTL) & mask; + + if (decouple && !val) + snd_hdac_updatel(bus->ppcap, AZX_REG_PP_PPCTL, mask, mask); + else if (!decouple && val) + snd_hdac_updatel(bus->ppcap, AZX_REG_PP_PPCTL, mask, 0); + stream->decoupled = decouple; spin_unlock_irq(&bus->reg_lock); } |