diff options
-rw-r--r-- | sound/pci/oxygen/oxygen.c | 4 | ||||
-rw-r--r-- | sound/pci/oxygen/oxygen.h | 2 | ||||
-rw-r--r-- | sound/pci/oxygen/oxygen_pcm.c | 46 | ||||
-rw-r--r-- | sound/pci/oxygen/oxygen_regs.h | 16 | ||||
-rw-r--r-- | sound/pci/oxygen/virtuoso.c | 6 |
5 files changed, 44 insertions, 30 deletions
diff --git a/sound/pci/oxygen/oxygen.c b/sound/pci/oxygen/oxygen.c index f8e3fd39749d..e618cde7f9e4 100644 --- a/sound/pci/oxygen/oxygen.c +++ b/sound/pci/oxygen/oxygen.c | |||
@@ -285,6 +285,8 @@ static const struct oxygen_model model_generic = { | |||
285 | OXYGEN_CHANNEL_MULTICH | | 285 | OXYGEN_CHANNEL_MULTICH | |
286 | OXYGEN_CHANNEL_AC97, | 286 | OXYGEN_CHANNEL_AC97, |
287 | .function_flags = OXYGEN_FUNCTION_ENABLE_SPI_4_5, | 287 | .function_flags = OXYGEN_FUNCTION_ENABLE_SPI_4_5, |
288 | .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, | ||
289 | .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, | ||
288 | }; | 290 | }; |
289 | static const struct oxygen_model model_meridian = { | 291 | static const struct oxygen_model model_meridian = { |
290 | .shortname = "C-Media CMI8788", | 292 | .shortname = "C-Media CMI8788", |
@@ -304,6 +306,8 @@ static const struct oxygen_model model_meridian = { | |||
304 | OXYGEN_CHANNEL_MULTICH | | 306 | OXYGEN_CHANNEL_MULTICH | |
305 | OXYGEN_CHANNEL_AC97, | 307 | OXYGEN_CHANNEL_AC97, |
306 | .function_flags = OXYGEN_FUNCTION_ENABLE_SPI_4_5, | 308 | .function_flags = OXYGEN_FUNCTION_ENABLE_SPI_4_5, |
309 | .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, | ||
310 | .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, | ||
307 | }; | 311 | }; |
308 | 312 | ||
309 | static int __devinit generic_oxygen_probe(struct pci_dev *pci, | 313 | static int __devinit generic_oxygen_probe(struct pci_dev *pci, |
diff --git a/sound/pci/oxygen/oxygen.h b/sound/pci/oxygen/oxygen.h index 602105ce2947..98cccc6ce9dc 100644 --- a/sound/pci/oxygen/oxygen.h +++ b/sound/pci/oxygen/oxygen.h | |||
@@ -86,6 +86,8 @@ struct oxygen_model { | |||
86 | void (*update_dac_mute)(struct oxygen *chip); | 86 | void (*update_dac_mute)(struct oxygen *chip); |
87 | u8 used_channels; | 87 | u8 used_channels; |
88 | u8 function_flags; | 88 | u8 function_flags; |
89 | u16 dac_i2s_format; | ||
90 | u16 adc_i2s_format; | ||
89 | }; | 91 | }; |
90 | 92 | ||
91 | /* oxygen_lib.c */ | 93 | /* oxygen_lib.c */ |
diff --git a/sound/pci/oxygen/oxygen_pcm.c b/sound/pci/oxygen/oxygen_pcm.c index 5515c757ec4b..f24659af53d3 100644 --- a/sound/pci/oxygen/oxygen_pcm.c +++ b/sound/pci/oxygen/oxygen_pcm.c | |||
@@ -313,12 +313,12 @@ static unsigned int oxygen_i2s_magic2(struct snd_pcm_hw_params *hw_params) | |||
313 | return params_rate(hw_params) <= 96000 ? 0x10 : 0x00; | 313 | return params_rate(hw_params) <= 96000 ? 0x10 : 0x00; |
314 | } | 314 | } |
315 | 315 | ||
316 | static unsigned int oxygen_i2s_format(struct snd_pcm_hw_params *hw_params) | 316 | static unsigned int oxygen_i2s_bits(struct snd_pcm_hw_params *hw_params) |
317 | { | 317 | { |
318 | if (params_format(hw_params) == SNDRV_PCM_FORMAT_S32_LE) | 318 | if (params_format(hw_params) == SNDRV_PCM_FORMAT_S32_LE) |
319 | return OXYGEN_I2S_FORMAT_24; | 319 | return OXYGEN_I2S_BITS_24; |
320 | else | 320 | else |
321 | return OXYGEN_I2S_FORMAT_16; | 321 | return OXYGEN_I2S_BITS_16; |
322 | } | 322 | } |
323 | 323 | ||
324 | static unsigned int oxygen_play_channels(struct snd_pcm_hw_params *hw_params) | 324 | static unsigned int oxygen_play_channels(struct snd_pcm_hw_params *hw_params) |
@@ -386,13 +386,15 @@ static int oxygen_rec_a_hw_params(struct snd_pcm_substream *substream, | |||
386 | oxygen_write8_masked(chip, OXYGEN_REC_FORMAT, | 386 | oxygen_write8_masked(chip, OXYGEN_REC_FORMAT, |
387 | oxygen_format(hw_params) << OXYGEN_REC_FORMAT_A_SHIFT, | 387 | oxygen_format(hw_params) << OXYGEN_REC_FORMAT_A_SHIFT, |
388 | OXYGEN_REC_FORMAT_A_MASK); | 388 | OXYGEN_REC_FORMAT_A_MASK); |
389 | oxygen_write8_masked(chip, OXYGEN_I2S_A_FORMAT, | 389 | oxygen_write16_masked(chip, OXYGEN_I2S_A_FORMAT, |
390 | oxygen_rate(hw_params) | | 390 | oxygen_rate(hw_params) | |
391 | oxygen_i2s_magic2(hw_params) | | 391 | oxygen_i2s_magic2(hw_params) | |
392 | oxygen_i2s_format(hw_params), | 392 | chip->model->adc_i2s_format | |
393 | OXYGEN_I2S_RATE_MASK | | 393 | oxygen_i2s_bits(hw_params), |
394 | OXYGEN_I2S_MAGIC2_MASK | | 394 | OXYGEN_I2S_RATE_MASK | |
395 | OXYGEN_I2S_FORMAT_MASK); | 395 | OXYGEN_I2S_FORMAT_MASK | |
396 | OXYGEN_I2S_MAGIC2_MASK | | ||
397 | OXYGEN_I2S_BITS_MASK); | ||
396 | oxygen_clear_bits8(chip, OXYGEN_REC_ROUTING, 0x08); | 398 | oxygen_clear_bits8(chip, OXYGEN_REC_ROUTING, 0x08); |
397 | spin_unlock_irq(&chip->reg_lock); | 399 | spin_unlock_irq(&chip->reg_lock); |
398 | 400 | ||
@@ -416,13 +418,15 @@ static int oxygen_rec_b_hw_params(struct snd_pcm_substream *substream, | |||
416 | oxygen_write8_masked(chip, OXYGEN_REC_FORMAT, | 418 | oxygen_write8_masked(chip, OXYGEN_REC_FORMAT, |
417 | oxygen_format(hw_params) << OXYGEN_REC_FORMAT_B_SHIFT, | 419 | oxygen_format(hw_params) << OXYGEN_REC_FORMAT_B_SHIFT, |
418 | OXYGEN_REC_FORMAT_B_MASK); | 420 | OXYGEN_REC_FORMAT_B_MASK); |
419 | oxygen_write8_masked(chip, OXYGEN_I2S_B_FORMAT, | 421 | oxygen_write16_masked(chip, OXYGEN_I2S_B_FORMAT, |
420 | oxygen_rate(hw_params) | | 422 | oxygen_rate(hw_params) | |
421 | oxygen_i2s_magic2(hw_params) | | 423 | oxygen_i2s_magic2(hw_params) | |
422 | oxygen_i2s_format(hw_params), | 424 | chip->model->adc_i2s_format | |
423 | OXYGEN_I2S_RATE_MASK | | 425 | oxygen_i2s_bits(hw_params), |
424 | OXYGEN_I2S_MAGIC2_MASK | | 426 | OXYGEN_I2S_RATE_MASK | |
425 | OXYGEN_I2S_FORMAT_MASK); | 427 | OXYGEN_I2S_FORMAT_MASK | |
428 | OXYGEN_I2S_MAGIC2_MASK | | ||
429 | OXYGEN_I2S_BITS_MASK); | ||
426 | oxygen_clear_bits8(chip, OXYGEN_REC_ROUTING, 0x10); | 430 | oxygen_clear_bits8(chip, OXYGEN_REC_ROUTING, 0x10); |
427 | spin_unlock_irq(&chip->reg_lock); | 431 | spin_unlock_irq(&chip->reg_lock); |
428 | 432 | ||
@@ -493,8 +497,12 @@ static int oxygen_multich_hw_params(struct snd_pcm_substream *substream, | |||
493 | oxygen_format(hw_params) << OXYGEN_MULTICH_FORMAT_SHIFT, | 497 | oxygen_format(hw_params) << OXYGEN_MULTICH_FORMAT_SHIFT, |
494 | OXYGEN_MULTICH_FORMAT_MASK); | 498 | OXYGEN_MULTICH_FORMAT_MASK); |
495 | oxygen_write16_masked(chip, OXYGEN_I2S_MULTICH_FORMAT, | 499 | oxygen_write16_masked(chip, OXYGEN_I2S_MULTICH_FORMAT, |
496 | oxygen_rate(hw_params) | oxygen_i2s_format(hw_params), | 500 | oxygen_rate(hw_params) | |
497 | OXYGEN_I2S_RATE_MASK | OXYGEN_I2S_FORMAT_MASK); | 501 | chip->model->dac_i2s_format | |
502 | oxygen_i2s_bits(hw_params), | ||
503 | OXYGEN_I2S_RATE_MASK | | ||
504 | OXYGEN_I2S_FORMAT_MASK | | ||
505 | OXYGEN_I2S_BITS_MASK); | ||
498 | oxygen_clear_bits16(chip, OXYGEN_PLAY_ROUTING, 0x001f); | 506 | oxygen_clear_bits16(chip, OXYGEN_PLAY_ROUTING, 0x001f); |
499 | oxygen_update_dac_routing(chip); | 507 | oxygen_update_dac_routing(chip); |
500 | oxygen_update_spdif_source(chip); | 508 | oxygen_update_spdif_source(chip); |
diff --git a/sound/pci/oxygen/oxygen_regs.h b/sound/pci/oxygen/oxygen_regs.h index 7a4726d2b2cf..b3491f73c598 100644 --- a/sound/pci/oxygen/oxygen_regs.h +++ b/sound/pci/oxygen/oxygen_regs.h | |||
@@ -105,18 +105,20 @@ | |||
105 | #define OXYGEN_RATE_96000 0x0005 | 105 | #define OXYGEN_RATE_96000 0x0005 |
106 | #define OXYGEN_RATE_176400 0x0006 | 106 | #define OXYGEN_RATE_176400 0x0006 |
107 | #define OXYGEN_RATE_192000 0x0007 | 107 | #define OXYGEN_RATE_192000 0x0007 |
108 | #define OXYGEN_I2S_MAGIC1_MASK 0x0008 | 108 | #define OXYGEN_I2S_FORMAT_MASK 0x0008 |
109 | #define OXYGEN_I2S_FORMAT_I2S 0x0000 | ||
110 | #define OXYGEN_I2S_FORMAT_LJUST 0x0008 | ||
109 | #define OXYGEN_I2S_MAGIC2_MASK 0x0030 | 111 | #define OXYGEN_I2S_MAGIC2_MASK 0x0030 |
110 | #define OXYGEN_I2S_FORMAT_MASK 0x00c0 | 112 | #define OXYGEN_I2S_BITS_MASK 0x00c0 |
111 | #define OXYGEN_I2S_FORMAT_16 0x0000 | 113 | #define OXYGEN_I2S_BITS_16 0x0000 |
112 | #define OXYGEN_I2S_FORMAT_20 0x0040 | 114 | #define OXYGEN_I2S_BITS_20 0x0040 |
113 | #define OXYGEN_I2S_FORMAT_24 0x0080 | 115 | #define OXYGEN_I2S_BITS_24 0x0080 |
114 | #define OXYGEN_I2S_FORMAT_32 0x00c0 | 116 | #define OXYGEN_I2S_BITS_32 0x00c0 |
115 | 117 | ||
116 | #define OXYGEN_I2S_A_FORMAT 0x62 | 118 | #define OXYGEN_I2S_A_FORMAT 0x62 |
117 | #define OXYGEN_I2S_B_FORMAT 0x64 | 119 | #define OXYGEN_I2S_B_FORMAT 0x64 |
118 | #define OXYGEN_I2S_C_FORMAT 0x66 | 120 | #define OXYGEN_I2S_C_FORMAT 0x66 |
119 | /* OXYGEN_I2S_RATE_* and OXYGEN_I2S_FORMAT_* */ | 121 | /* like OXYGEN_I2S_MULTICH_FORMAT */ |
120 | 122 | ||
121 | #define OXYGEN_SPDIF_CONTROL 0x70 | 123 | #define OXYGEN_SPDIF_CONTROL 0x70 |
122 | #define OXYGEN_SPDIF_OUT_ENABLE 0x00000002 | 124 | #define OXYGEN_SPDIF_OUT_ENABLE 0x00000002 |
diff --git a/sound/pci/oxygen/virtuoso.c b/sound/pci/oxygen/virtuoso.c index bea34f10d447..83c2c43e7b85 100644 --- a/sound/pci/oxygen/virtuoso.c +++ b/sound/pci/oxygen/virtuoso.c | |||
@@ -102,10 +102,6 @@ static void xonar_init(struct oxygen *chip) | |||
102 | 102 | ||
103 | oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, 0x8c); | 103 | oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, 0x8c); |
104 | oxygen_write16_masked(chip, OXYGEN_GPIO_DATA, 0x00, 0x8c); | 104 | oxygen_write16_masked(chip, OXYGEN_GPIO_DATA, 0x00, 0x8c); |
105 | #if 0 | ||
106 | oxygen_clear_bits16(chip, OXYGEN_I2S_MULTICH_FORMAT, | ||
107 | OXYGEN_I2S_MAGIC1_MASK); | ||
108 | #endif | ||
109 | oxygen_ac97_set_bits(chip, 0, 0x62, 0x0080); | 105 | oxygen_ac97_set_bits(chip, 0, 0x62, 0x0080); |
110 | msleep(300); | 106 | msleep(300); |
111 | oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, 0x100); | 107 | oxygen_set_bits16(chip, OXYGEN_GPIO_CONTROL, 0x100); |
@@ -253,6 +249,8 @@ static const struct oxygen_model model_xonar = { | |||
253 | OXYGEN_CHANNEL_SPDIF | | 249 | OXYGEN_CHANNEL_SPDIF | |
254 | OXYGEN_CHANNEL_MULTICH, | 250 | OXYGEN_CHANNEL_MULTICH, |
255 | .function_flags = OXYGEN_FUNCTION_ENABLE_SPI_4_5, | 251 | .function_flags = OXYGEN_FUNCTION_ENABLE_SPI_4_5, |
252 | .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, | ||
253 | .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, | ||
256 | }; | 254 | }; |
257 | 255 | ||
258 | static int __devinit xonar_probe(struct pci_dev *pci, | 256 | static int __devinit xonar_probe(struct pci_dev *pci, |