Skip to content

Commit

Permalink
ALSA: hda - Clear dirty flag upon cache write
Browse files Browse the repository at this point in the history
When verbs or amps are actually written to the hardware, we can clear
dirty flag so that the later snd_hda_codec_resume_*() calls can skip
these verbs / amps.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
  • Loading branch information
Takashi Iwai committed Jan 12, 2013
1 parent 5fdaecd commit de1e37b
Showing 1 changed file with 7 additions and 6 deletions.
13 changes: 7 additions & 6 deletions sound/pci/hda/hda_codec.c
Original file line number Diff line number Diff line change
Expand Up @@ -1848,6 +1848,7 @@ static int codec_amp_update(struct hda_codec *codec, hda_nid_t nid, int ch,
bool init_only)
{
struct hda_amp_info *info;
unsigned int cache_only;

if (snd_BUG_ON(mask & ~0xff))
mask &= 0xff;
Expand All @@ -1865,10 +1866,9 @@ static int codec_amp_update(struct hda_codec *codec, hda_nid_t nid, int ch,
return 0;
}
info->vol[ch] = val;
if (codec->cached_write)
info->head.dirty = 1;
cache_only = info->head.dirty = codec->cached_write;
mutex_unlock(&codec->hash_mutex);
if (!codec->cached_write)
if (!cache_only)
put_vol_mute(codec, info, nid, ch, direction, idx, val);
return 1;
}
Expand Down Expand Up @@ -3450,8 +3450,10 @@ int snd_hda_codec_write_cache(struct hda_codec *codec, hda_nid_t nid,
int err;
struct hda_cache_head *c;
u32 key;
unsigned int cache_only;

if (!codec->cached_write) {
cache_only = codec->cached_write;
if (!cache_only) {
err = snd_hda_codec_write(codec, nid, direct, verb, parm);
if (err < 0)
return err;
Expand All @@ -3465,8 +3467,7 @@ int snd_hda_codec_write_cache(struct hda_codec *codec, hda_nid_t nid,
c = get_alloc_hash(&codec->cmd_cache, key);
if (c) {
c->val = parm;
if (codec->cached_write)
c->dirty = 1;
c->dirty = cache_only;
}
mutex_unlock(&codec->bus->cmd_mutex);
return 0;
Expand Down

0 comments on commit de1e37b

Please sign in to comment.