diff options
author | Takashi Iwai <tiwai@suse.de> | 2007-08-10 11:09:26 -0400 |
---|---|---|
committer | Jaroslav Kysela <perex@perex.cz> | 2007-10-16 09:58:43 -0400 |
commit | 82beb8fd365afe3891b277c46425083f13e23c56 (patch) | |
tree | a564d7228b59170aa490d4fc9284b5fa4442adb0 /sound/pci/hda/patch_si3054.c | |
parent | b3ac56364126f78cae94eb2a75b72d9ea85aca9d (diff) |
[ALSA] hda-codec - optimize resume using caches
So far, the driver looked the table of snd_kcontrol_new used for creating
mixer elements and forces to call each of its put callbacks in PM resume
code. This is too ugly and hackish.
Now, the resume is simplified using the codec amp and command register
caches. The driver simply restores the values that have been written
in the cache table. With this simplification, most codec support codes
don't require any special resume callback.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jaroslav Kysela <perex@suse.cz>
Diffstat (limited to 'sound/pci/hda/patch_si3054.c')
-rw-r--r-- | sound/pci/hda/patch_si3054.c | 10 |
1 files changed, 4 insertions, 6 deletions
diff --git a/sound/pci/hda/patch_si3054.c b/sound/pci/hda/patch_si3054.c index 9838eac9ab59..2a4b9609aa5c 100644 --- a/sound/pci/hda/patch_si3054.c +++ b/sound/pci/hda/patch_si3054.c | |||
@@ -78,6 +78,8 @@ | |||
78 | /* si3054 codec registers (nodes) access macros */ | 78 | /* si3054 codec registers (nodes) access macros */ |
79 | #define GET_REG(codec,reg) (snd_hda_codec_read(codec,reg,0,SI3054_VERB_READ_NODE,0)) | 79 | #define GET_REG(codec,reg) (snd_hda_codec_read(codec,reg,0,SI3054_VERB_READ_NODE,0)) |
80 | #define SET_REG(codec,reg,val) (snd_hda_codec_write(codec,reg,0,SI3054_VERB_WRITE_NODE,val)) | 80 | #define SET_REG(codec,reg,val) (snd_hda_codec_write(codec,reg,0,SI3054_VERB_WRITE_NODE,val)) |
81 | #define SET_REG_CACHE(codec,reg,val) \ | ||
82 | snd_hda_codec_write_cache(codec,reg,0,SI3054_VERB_WRITE_NODE,val) | ||
81 | 83 | ||
82 | 84 | ||
83 | struct si3054_spec { | 85 | struct si3054_spec { |
@@ -113,9 +115,9 @@ static int si3054_switch_put(struct snd_kcontrol *kcontrol, | |||
113 | u16 reg = PRIVATE_REG(kcontrol->private_value); | 115 | u16 reg = PRIVATE_REG(kcontrol->private_value); |
114 | u16 mask = PRIVATE_MASK(kcontrol->private_value); | 116 | u16 mask = PRIVATE_MASK(kcontrol->private_value); |
115 | if (uvalue->value.integer.value[0]) | 117 | if (uvalue->value.integer.value[0]) |
116 | SET_REG(codec, reg, (GET_REG(codec, reg)) | mask); | 118 | SET_REG_CACHE(codec, reg, (GET_REG(codec, reg)) | mask); |
117 | else | 119 | else |
118 | SET_REG(codec, reg, (GET_REG(codec, reg)) & ~mask); | 120 | SET_REG_CACHE(codec, reg, (GET_REG(codec, reg)) & ~mask); |
119 | return 0; | 121 | return 0; |
120 | } | 122 | } |
121 | 123 | ||
@@ -267,10 +269,6 @@ static struct hda_codec_ops si3054_patch_ops = { | |||
267 | .build_pcms = si3054_build_pcms, | 269 | .build_pcms = si3054_build_pcms, |
268 | .init = si3054_init, | 270 | .init = si3054_init, |
269 | .free = si3054_free, | 271 | .free = si3054_free, |
270 | #ifdef CONFIG_PM | ||
271 | //.suspend = si3054_suspend, | ||
272 | .resume = si3054_init, | ||
273 | #endif | ||
274 | }; | 272 | }; |
275 | 273 | ||
276 | static int patch_si3054(struct hda_codec *codec) | 274 | static int patch_si3054(struct hda_codec *codec) |