aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sound/pci/oxygen/oxygen.c4
-rw-r--r--sound/pci/oxygen/oxygen.h2
-rw-r--r--sound/pci/oxygen/oxygen_pcm.c46
-rw-r--r--sound/pci/oxygen/oxygen_regs.h16
-rw-r--r--sound/pci/oxygen/virtuoso.c6
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};
289static const struct oxygen_model model_meridian = { 291static 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
309static int __devinit generic_oxygen_probe(struct pci_dev *pci, 313static 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
316static unsigned int oxygen_i2s_format(struct snd_pcm_hw_params *hw_params) 316static 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
324static unsigned int oxygen_play_channels(struct snd_pcm_hw_params *hw_params) 324static 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
258static int __devinit xonar_probe(struct pci_dev *pci, 256static int __devinit xonar_probe(struct pci_dev *pci,