diff options
author | Clemens Ladisch <clemens@ladisch.de> | 2008-05-13 03:20:51 -0400 |
---|---|---|
committer | Jaroslav Kysela <perex@perex.cz> | 2008-05-19 07:19:16 -0400 |
commit | e58aee95806c9d2bbcfc84cb85ce958e360165ef (patch) | |
tree | 8385cb486591002e7a9ddefff9a9477b9f9bf679 /sound/pci/oxygen/virtuoso.c | |
parent | c13650079ba3bed1c0bdd9bf4a13274be7676ff6 (diff) |
[ALSA] oxygen: save register writes
Save the written values of all CMI8788 and AC97 registers and of some of
the DAC/ADC registers so that it is possible to restore the register
state later.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Diffstat (limited to 'sound/pci/oxygen/virtuoso.c')
-rw-r--r-- | sound/pci/oxygen/virtuoso.c | 54 |
1 files changed, 29 insertions, 25 deletions
diff --git a/sound/pci/oxygen/virtuoso.c b/sound/pci/oxygen/virtuoso.c index 4618a622a296..110786b2e3b8 100644 --- a/sound/pci/oxygen/virtuoso.c +++ b/sound/pci/oxygen/virtuoso.c | |||
@@ -132,6 +132,9 @@ struct xonar_data { | |||
132 | u8 ext_power_int_reg; | 132 | u8 ext_power_int_reg; |
133 | u8 ext_power_bit; | 133 | u8 ext_power_bit; |
134 | u8 has_power; | 134 | u8 has_power; |
135 | u8 pcm1796_oversampling; | ||
136 | u8 cs4398_fm; | ||
137 | u8 cs4362a_fm; | ||
135 | }; | 138 | }; |
136 | 139 | ||
137 | static void pcm1796_write(struct oxygen *chip, unsigned int codec, | 140 | static void pcm1796_write(struct oxygen *chip, unsigned int codec, |
@@ -186,12 +189,13 @@ static void xonar_d2_init(struct oxygen *chip) | |||
186 | 189 | ||
187 | data->anti_pop_delay = 300; | 190 | data->anti_pop_delay = 300; |
188 | data->output_enable_bit = GPIO_D2_OUTPUT_ENABLE; | 191 | data->output_enable_bit = GPIO_D2_OUTPUT_ENABLE; |
192 | data->pcm1796_oversampling = PCM1796_OS_64; | ||
189 | 193 | ||
190 | for (i = 0; i < 4; ++i) { | 194 | for (i = 0; i < 4; ++i) { |
191 | pcm1796_write(chip, i, 18, PCM1796_MUTE | PCM1796_DMF_DISABLED | | 195 | pcm1796_write(chip, i, 18, PCM1796_MUTE | PCM1796_DMF_DISABLED | |
192 | PCM1796_FMT_24_LJUST | PCM1796_ATLD); | 196 | PCM1796_FMT_24_LJUST | PCM1796_ATLD); |
193 | pcm1796_write(chip, i, 19, PCM1796_FLT_SHARP | PCM1796_ATS_1); | 197 | pcm1796_write(chip, i, 19, PCM1796_FLT_SHARP | PCM1796_ATS_1); |
194 | pcm1796_write(chip, i, 20, PCM1796_OS_64); | 198 | pcm1796_write(chip, i, 20, data->pcm1796_oversampling); |
195 | pcm1796_write(chip, i, 21, 0); | 199 | pcm1796_write(chip, i, 21, 0); |
196 | pcm1796_write(chip, i, 16, 0x0f); /* set ATL/ATR after ATLD */ | 200 | pcm1796_write(chip, i, 16, 0x0f); /* set ATL/ATR after ATLD */ |
197 | pcm1796_write(chip, i, 17, 0x0f); | 201 | pcm1796_write(chip, i, 17, 0x0f); |
@@ -226,6 +230,9 @@ static void xonar_dx_init(struct oxygen *chip) | |||
226 | data->ext_power_reg = OXYGEN_GPI_DATA; | 230 | data->ext_power_reg = OXYGEN_GPI_DATA; |
227 | data->ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK; | 231 | data->ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK; |
228 | data->ext_power_bit = GPI_DX_EXT_POWER; | 232 | data->ext_power_bit = GPI_DX_EXT_POWER; |
233 | data->cs4398_fm = CS4398_FM_SINGLE | CS4398_DEM_NONE | CS4398_DIF_LJUST; | ||
234 | data->cs4362a_fm = CS4362A_FM_SINGLE | | ||
235 | CS4362A_ATAPI_B_R | CS4362A_ATAPI_A_L; | ||
229 | 236 | ||
230 | oxygen_write16(chip, OXYGEN_2WIRE_BUS_STATUS, | 237 | oxygen_write16(chip, OXYGEN_2WIRE_BUS_STATUS, |
231 | OXYGEN_2WIRE_LENGTH_8 | | 238 | OXYGEN_2WIRE_LENGTH_8 | |
@@ -236,8 +243,7 @@ static void xonar_dx_init(struct oxygen *chip) | |||
236 | cs4398_write(chip, 8, CS4398_CPEN | CS4398_PDN); | 243 | cs4398_write(chip, 8, CS4398_CPEN | CS4398_PDN); |
237 | cs4362a_write(chip, 0x01, CS4362A_PDN | CS4362A_CPEN); | 244 | cs4362a_write(chip, 0x01, CS4362A_PDN | CS4362A_CPEN); |
238 | /* configure */ | 245 | /* configure */ |
239 | cs4398_write(chip, 2, CS4398_FM_SINGLE | | 246 | cs4398_write(chip, 2, data->cs4398_fm); |
240 | CS4398_DEM_NONE | CS4398_DIF_LJUST); | ||
241 | cs4398_write(chip, 3, CS4398_ATAPI_B_R | CS4398_ATAPI_A_L); | 247 | cs4398_write(chip, 3, CS4398_ATAPI_B_R | CS4398_ATAPI_A_L); |
242 | cs4398_write(chip, 4, CS4398_MUTEP_LOW | CS4398_PAMUTE); | 248 | cs4398_write(chip, 4, CS4398_MUTEP_LOW | CS4398_PAMUTE); |
243 | cs4398_write(chip, 5, 0xfe); | 249 | cs4398_write(chip, 5, 0xfe); |
@@ -249,16 +255,13 @@ static void xonar_dx_init(struct oxygen *chip) | |||
249 | CS4362A_RMP_UP | CS4362A_ZERO_CROSS | CS4362A_SOFT_RAMP); | 255 | CS4362A_RMP_UP | CS4362A_ZERO_CROSS | CS4362A_SOFT_RAMP); |
250 | cs4362a_write(chip, 0x04, CS4362A_RMP_DN | CS4362A_DEM_NONE); | 256 | cs4362a_write(chip, 0x04, CS4362A_RMP_DN | CS4362A_DEM_NONE); |
251 | cs4362a_write(chip, 0x05, 0); | 257 | cs4362a_write(chip, 0x05, 0); |
252 | cs4362a_write(chip, 0x06, CS4362A_FM_SINGLE | | 258 | cs4362a_write(chip, 0x06, data->cs4362a_fm); |
253 | CS4362A_ATAPI_B_R | CS4362A_ATAPI_A_L); | ||
254 | cs4362a_write(chip, 0x07, 0x7f | CS4362A_MUTE); | 259 | cs4362a_write(chip, 0x07, 0x7f | CS4362A_MUTE); |
255 | cs4362a_write(chip, 0x08, 0x7f | CS4362A_MUTE); | 260 | cs4362a_write(chip, 0x08, 0x7f | CS4362A_MUTE); |
256 | cs4362a_write(chip, 0x09, CS4362A_FM_SINGLE | | 261 | cs4362a_write(chip, 0x09, data->cs4362a_fm); |
257 | CS4362A_ATAPI_B_R | CS4362A_ATAPI_A_L); | ||
258 | cs4362a_write(chip, 0x0a, 0x7f | CS4362A_MUTE); | 262 | cs4362a_write(chip, 0x0a, 0x7f | CS4362A_MUTE); |
259 | cs4362a_write(chip, 0x0b, 0x7f | CS4362A_MUTE); | 263 | cs4362a_write(chip, 0x0b, 0x7f | CS4362A_MUTE); |
260 | cs4362a_write(chip, 0x0c, CS4362A_FM_SINGLE | | 264 | cs4362a_write(chip, 0x0c, data->cs4362a_fm); |
261 | CS4362A_ATAPI_B_R | CS4362A_ATAPI_A_L); | ||
262 | cs4362a_write(chip, 0x0d, 0x7f | CS4362A_MUTE); | 265 | cs4362a_write(chip, 0x0d, 0x7f | CS4362A_MUTE); |
263 | cs4362a_write(chip, 0x0e, 0x7f | CS4362A_MUTE); | 266 | cs4362a_write(chip, 0x0e, 0x7f | CS4362A_MUTE); |
264 | /* clear power down */ | 267 | /* clear power down */ |
@@ -294,12 +297,13 @@ static void xonar_dx_cleanup(struct oxygen *chip) | |||
294 | static void set_pcm1796_params(struct oxygen *chip, | 297 | static void set_pcm1796_params(struct oxygen *chip, |
295 | struct snd_pcm_hw_params *params) | 298 | struct snd_pcm_hw_params *params) |
296 | { | 299 | { |
300 | struct xonar_data *data = chip->model_data; | ||
297 | unsigned int i; | 301 | unsigned int i; |
298 | u8 value; | ||
299 | 302 | ||
300 | value = params_rate(params) >= 96000 ? PCM1796_OS_32 : PCM1796_OS_64; | 303 | data->pcm1796_oversampling = |
304 | params_rate(params) >= 96000 ? PCM1796_OS_32 : PCM1796_OS_64; | ||
301 | for (i = 0; i < 4; ++i) | 305 | for (i = 0; i < 4; ++i) |
302 | pcm1796_write(chip, i, 20, value); | 306 | pcm1796_write(chip, i, 20, data->pcm1796_oversampling); |
303 | } | 307 | } |
304 | 308 | ||
305 | static void update_pcm1796_volume(struct oxygen *chip) | 309 | static void update_pcm1796_volume(struct oxygen *chip) |
@@ -342,24 +346,24 @@ static void set_cs53x1_params(struct oxygen *chip, | |||
342 | static void set_cs43xx_params(struct oxygen *chip, | 346 | static void set_cs43xx_params(struct oxygen *chip, |
343 | struct snd_pcm_hw_params *params) | 347 | struct snd_pcm_hw_params *params) |
344 | { | 348 | { |
345 | u8 fm_cs4398, fm_cs4362a; | 349 | struct xonar_data *data = chip->model_data; |
346 | 350 | ||
347 | fm_cs4398 = CS4398_DEM_NONE | CS4398_DIF_LJUST; | 351 | data->cs4398_fm = CS4398_DEM_NONE | CS4398_DIF_LJUST; |
348 | fm_cs4362a = CS4362A_ATAPI_B_R | CS4362A_ATAPI_A_L; | 352 | data->cs4362a_fm = CS4362A_ATAPI_B_R | CS4362A_ATAPI_A_L; |
349 | if (params_rate(params) <= 50000) { | 353 | if (params_rate(params) <= 50000) { |
350 | fm_cs4398 |= CS4398_FM_SINGLE; | 354 | data->cs4398_fm |= CS4398_FM_SINGLE; |
351 | fm_cs4362a |= CS4362A_FM_SINGLE; | 355 | data->cs4362a_fm |= CS4362A_FM_SINGLE; |
352 | } else if (params_rate(params) <= 100000) { | 356 | } else if (params_rate(params) <= 100000) { |
353 | fm_cs4398 |= CS4398_FM_DOUBLE; | 357 | data->cs4398_fm |= CS4398_FM_DOUBLE; |
354 | fm_cs4362a |= CS4362A_FM_DOUBLE; | 358 | data->cs4362a_fm |= CS4362A_FM_DOUBLE; |
355 | } else { | 359 | } else { |
356 | fm_cs4398 |= CS4398_FM_QUAD; | 360 | data->cs4398_fm |= CS4398_FM_QUAD; |
357 | fm_cs4362a |= CS4362A_FM_QUAD; | 361 | data->cs4362a_fm |= CS4362A_FM_QUAD; |
358 | } | 362 | } |
359 | cs4398_write(chip, 2, fm_cs4398); | 363 | cs4398_write(chip, 2, data->cs4398_fm); |
360 | cs4362a_write(chip, 0x06, fm_cs4362a); | 364 | cs4362a_write(chip, 0x06, data->cs4362a_fm); |
361 | cs4362a_write(chip, 0x09, fm_cs4362a); | 365 | cs4362a_write(chip, 0x09, data->cs4362a_fm); |
362 | cs4362a_write(chip, 0x0c, fm_cs4362a); | 366 | cs4362a_write(chip, 0x0c, data->cs4362a_fm); |
363 | } | 367 | } |
364 | 368 | ||
365 | static void update_cs4362a_volumes(struct oxygen *chip) | 369 | static void update_cs4362a_volumes(struct oxygen *chip) |