diff options
Diffstat (limited to 'sound/pci/oxygen/oxygen_lib.c')
| -rw-r--r-- | sound/pci/oxygen/oxygen_lib.c | 113 |
1 files changed, 67 insertions, 46 deletions
diff --git a/sound/pci/oxygen/oxygen_lib.c b/sound/pci/oxygen/oxygen_lib.c index 78c21155218e..897697d43506 100644 --- a/sound/pci/oxygen/oxygen_lib.c +++ b/sound/pci/oxygen/oxygen_lib.c | |||
| @@ -221,7 +221,8 @@ static void oxygen_init(struct oxygen *chip) | |||
| 221 | 221 | ||
| 222 | chip->dac_routing = 1; | 222 | chip->dac_routing = 1; |
| 223 | for (i = 0; i < 8; ++i) | 223 | for (i = 0; i < 8; ++i) |
| 224 | chip->dac_volume[i] = 0xff; | 224 | chip->dac_volume[i] = chip->model->dac_volume_min; |
| 225 | chip->dac_mute = 1; | ||
| 225 | chip->spdif_playback_enable = 1; | 226 | chip->spdif_playback_enable = 1; |
| 226 | chip->spdif_bits = OXYGEN_SPDIF_C | OXYGEN_SPDIF_ORIGINAL | | 227 | chip->spdif_bits = OXYGEN_SPDIF_C | OXYGEN_SPDIF_ORIGINAL | |
| 227 | (IEC958_AES1_CON_PCM_CODER << OXYGEN_SPDIF_CATEGORY_SHIFT); | 228 | (IEC958_AES1_CON_PCM_CODER << OXYGEN_SPDIF_CATEGORY_SHIFT); |
| @@ -240,12 +241,12 @@ static void oxygen_init(struct oxygen *chip) | |||
| 240 | chip->has_ac97_0 = (i & OXYGEN_AC97_CODEC_0) != 0; | 241 | chip->has_ac97_0 = (i & OXYGEN_AC97_CODEC_0) != 0; |
| 241 | chip->has_ac97_1 = (i & OXYGEN_AC97_CODEC_1) != 0; | 242 | chip->has_ac97_1 = (i & OXYGEN_AC97_CODEC_1) != 0; |
| 242 | 243 | ||
| 243 | oxygen_set_bits8(chip, OXYGEN_FUNCTION, | ||
| 244 | OXYGEN_FUNCTION_RESET_CODEC | | ||
| 245 | chip->model->function_flags); | ||
| 246 | oxygen_write8_masked(chip, OXYGEN_FUNCTION, | 244 | oxygen_write8_masked(chip, OXYGEN_FUNCTION, |
| 247 | OXYGEN_FUNCTION_SPI, | 245 | OXYGEN_FUNCTION_RESET_CODEC | |
| 248 | OXYGEN_FUNCTION_2WIRE_SPI_MASK); | 246 | chip->model->function_flags, |
| 247 | OXYGEN_FUNCTION_RESET_CODEC | | ||
| 248 | OXYGEN_FUNCTION_2WIRE_SPI_MASK | | ||
| 249 | OXYGEN_FUNCTION_ENABLE_SPI_4_5); | ||
| 249 | oxygen_write8(chip, OXYGEN_DMA_STATUS, 0); | 250 | oxygen_write8(chip, OXYGEN_DMA_STATUS, 0); |
| 250 | oxygen_write8(chip, OXYGEN_DMA_PAUSE, 0); | 251 | oxygen_write8(chip, OXYGEN_DMA_PAUSE, 0); |
| 251 | oxygen_write8(chip, OXYGEN_PLAY_CHANNELS, | 252 | oxygen_write8(chip, OXYGEN_PLAY_CHANNELS, |
| @@ -253,11 +254,13 @@ static void oxygen_init(struct oxygen *chip) | |||
| 253 | OXYGEN_DMA_A_BURST_8 | | 254 | OXYGEN_DMA_A_BURST_8 | |
| 254 | OXYGEN_DMA_MULTICH_BURST_8); | 255 | OXYGEN_DMA_MULTICH_BURST_8); |
| 255 | oxygen_write16(chip, OXYGEN_INTERRUPT_MASK, 0); | 256 | oxygen_write16(chip, OXYGEN_INTERRUPT_MASK, 0); |
| 256 | oxygen_write8_masked(chip, OXYGEN_MISC, 0, | 257 | oxygen_write8_masked(chip, OXYGEN_MISC, |
| 258 | chip->model->misc_flags, | ||
| 257 | OXYGEN_MISC_WRITE_PCI_SUBID | | 259 | OXYGEN_MISC_WRITE_PCI_SUBID | |
| 258 | OXYGEN_MISC_REC_C_FROM_SPDIF | | 260 | OXYGEN_MISC_REC_C_FROM_SPDIF | |
| 259 | OXYGEN_MISC_REC_B_FROM_AC97 | | 261 | OXYGEN_MISC_REC_B_FROM_AC97 | |
| 260 | OXYGEN_MISC_REC_A_FROM_MULTICH); | 262 | OXYGEN_MISC_REC_A_FROM_MULTICH | |
| 263 | OXYGEN_MISC_MIDI); | ||
| 261 | oxygen_write8(chip, OXYGEN_REC_FORMAT, | 264 | oxygen_write8(chip, OXYGEN_REC_FORMAT, |
| 262 | (OXYGEN_FORMAT_16 << OXYGEN_REC_FORMAT_A_SHIFT) | | 265 | (OXYGEN_FORMAT_16 << OXYGEN_REC_FORMAT_A_SHIFT) | |
| 263 | (OXYGEN_FORMAT_16 << OXYGEN_REC_FORMAT_B_SHIFT) | | 266 | (OXYGEN_FORMAT_16 << OXYGEN_REC_FORMAT_B_SHIFT) | |
| @@ -267,35 +270,49 @@ static void oxygen_init(struct oxygen *chip) | |||
| 267 | (OXYGEN_FORMAT_16 << OXYGEN_MULTICH_FORMAT_SHIFT)); | 270 | (OXYGEN_FORMAT_16 << OXYGEN_MULTICH_FORMAT_SHIFT)); |
| 268 | oxygen_write8(chip, OXYGEN_REC_CHANNELS, OXYGEN_REC_CHANNELS_2_2_2); | 271 | oxygen_write8(chip, OXYGEN_REC_CHANNELS, OXYGEN_REC_CHANNELS_2_2_2); |
| 269 | oxygen_write16(chip, OXYGEN_I2S_MULTICH_FORMAT, | 272 | oxygen_write16(chip, OXYGEN_I2S_MULTICH_FORMAT, |
| 270 | OXYGEN_RATE_48000 | OXYGEN_I2S_FORMAT_LJUST | | 273 | OXYGEN_RATE_48000 | chip->model->dac_i2s_format | |
| 271 | OXYGEN_I2S_MCLK_128 | OXYGEN_I2S_BITS_16 | | 274 | OXYGEN_I2S_MCLK_256 | OXYGEN_I2S_BITS_16 | |
| 272 | OXYGEN_I2S_MASTER | OXYGEN_I2S_BCLK_64); | ||
| 273 | oxygen_write16(chip, OXYGEN_I2S_A_FORMAT, | ||
| 274 | OXYGEN_RATE_48000 | OXYGEN_I2S_FORMAT_LJUST | | ||
| 275 | OXYGEN_I2S_MCLK_128 | OXYGEN_I2S_BITS_16 | | ||
| 276 | OXYGEN_I2S_MASTER | OXYGEN_I2S_BCLK_64); | ||
| 277 | oxygen_write16(chip, OXYGEN_I2S_B_FORMAT, | ||
| 278 | OXYGEN_RATE_48000 | OXYGEN_I2S_FORMAT_LJUST | | ||
| 279 | OXYGEN_I2S_MCLK_128 | OXYGEN_I2S_BITS_16 | | ||
| 280 | OXYGEN_I2S_MASTER | OXYGEN_I2S_BCLK_64); | 275 | OXYGEN_I2S_MASTER | OXYGEN_I2S_BCLK_64); |
| 276 | if (chip->model->pcm_dev_cfg & CAPTURE_0_FROM_I2S_1) | ||
| 277 | oxygen_write16(chip, OXYGEN_I2S_A_FORMAT, | ||
| 278 | OXYGEN_RATE_48000 | chip->model->adc_i2s_format | | ||
| 279 | OXYGEN_I2S_MCLK_256 | OXYGEN_I2S_BITS_16 | | ||
| 280 | OXYGEN_I2S_MASTER | OXYGEN_I2S_BCLK_64); | ||
| 281 | else | ||
| 282 | oxygen_write16(chip, OXYGEN_I2S_A_FORMAT, | ||
| 283 | OXYGEN_I2S_MASTER | OXYGEN_I2S_MUTE_MCLK); | ||
| 284 | if (chip->model->pcm_dev_cfg & (CAPTURE_0_FROM_I2S_2 | | ||
| 285 | CAPTURE_2_FROM_I2S_2)) | ||
| 286 | oxygen_write16(chip, OXYGEN_I2S_B_FORMAT, | ||
| 287 | OXYGEN_RATE_48000 | chip->model->adc_i2s_format | | ||
| 288 | OXYGEN_I2S_MCLK_256 | OXYGEN_I2S_BITS_16 | | ||
| 289 | OXYGEN_I2S_MASTER | OXYGEN_I2S_BCLK_64); | ||
| 290 | else | ||
| 291 | oxygen_write16(chip, OXYGEN_I2S_B_FORMAT, | ||
| 292 | OXYGEN_I2S_MASTER | OXYGEN_I2S_MUTE_MCLK); | ||
| 281 | oxygen_write16(chip, OXYGEN_I2S_C_FORMAT, | 293 | oxygen_write16(chip, OXYGEN_I2S_C_FORMAT, |
| 282 | OXYGEN_RATE_48000 | OXYGEN_I2S_FORMAT_LJUST | | 294 | OXYGEN_I2S_MASTER | OXYGEN_I2S_MUTE_MCLK); |
| 283 | OXYGEN_I2S_MCLK_128 | OXYGEN_I2S_BITS_16 | | 295 | oxygen_clear_bits32(chip, OXYGEN_SPDIF_CONTROL, |
| 284 | OXYGEN_I2S_MASTER | OXYGEN_I2S_BCLK_64); | 296 | OXYGEN_SPDIF_OUT_ENABLE | |
| 285 | oxygen_write32_masked(chip, OXYGEN_SPDIF_CONTROL, | 297 | OXYGEN_SPDIF_LOOPBACK); |
| 286 | OXYGEN_SPDIF_SENSE_MASK | | 298 | if (chip->model->pcm_dev_cfg & CAPTURE_1_FROM_SPDIF) |
| 287 | OXYGEN_SPDIF_LOCK_MASK | | 299 | oxygen_write32_masked(chip, OXYGEN_SPDIF_CONTROL, |
| 288 | OXYGEN_SPDIF_RATE_MASK | | 300 | OXYGEN_SPDIF_SENSE_MASK | |
| 289 | OXYGEN_SPDIF_LOCK_PAR | | 301 | OXYGEN_SPDIF_LOCK_MASK | |
| 290 | OXYGEN_SPDIF_IN_CLOCK_96, | 302 | OXYGEN_SPDIF_RATE_MASK | |
| 291 | OXYGEN_SPDIF_OUT_ENABLE | | 303 | OXYGEN_SPDIF_LOCK_PAR | |
| 292 | OXYGEN_SPDIF_LOOPBACK | | 304 | OXYGEN_SPDIF_IN_CLOCK_96, |
| 293 | OXYGEN_SPDIF_SENSE_MASK | | 305 | OXYGEN_SPDIF_SENSE_MASK | |
| 294 | OXYGEN_SPDIF_LOCK_MASK | | 306 | OXYGEN_SPDIF_LOCK_MASK | |
| 295 | OXYGEN_SPDIF_RATE_MASK | | 307 | OXYGEN_SPDIF_RATE_MASK | |
| 296 | OXYGEN_SPDIF_SENSE_PAR | | 308 | OXYGEN_SPDIF_SENSE_PAR | |
| 297 | OXYGEN_SPDIF_LOCK_PAR | | 309 | OXYGEN_SPDIF_LOCK_PAR | |
| 298 | OXYGEN_SPDIF_IN_CLOCK_MASK); | 310 | OXYGEN_SPDIF_IN_CLOCK_MASK); |
| 311 | else | ||
| 312 | oxygen_clear_bits32(chip, OXYGEN_SPDIF_CONTROL, | ||
| 313 | OXYGEN_SPDIF_SENSE_MASK | | ||
| 314 | OXYGEN_SPDIF_LOCK_MASK | | ||
| 315 | OXYGEN_SPDIF_RATE_MASK); | ||
| 299 | oxygen_write32(chip, OXYGEN_SPDIF_OUTPUT_BITS, chip->spdif_bits); | 316 | oxygen_write32(chip, OXYGEN_SPDIF_OUTPUT_BITS, chip->spdif_bits); |
| 300 | oxygen_clear_bits8(chip, OXYGEN_MPU401_CONTROL, OXYGEN_MPU401_LOOPBACK); | 317 | oxygen_clear_bits8(chip, OXYGEN_MPU401_CONTROL, OXYGEN_MPU401_LOOPBACK); |
| 301 | oxygen_write8(chip, OXYGEN_GPI_INTERRUPT_MASK, 0); | 318 | oxygen_write8(chip, OXYGEN_GPI_INTERRUPT_MASK, 0); |
| @@ -318,9 +335,12 @@ static void oxygen_init(struct oxygen *chip) | |||
| 318 | (2 << OXYGEN_A_MONITOR_ROUTE_2_SHIFT) | | 335 | (2 << OXYGEN_A_MONITOR_ROUTE_2_SHIFT) | |
| 319 | (3 << OXYGEN_A_MONITOR_ROUTE_3_SHIFT)); | 336 | (3 << OXYGEN_A_MONITOR_ROUTE_3_SHIFT)); |
| 320 | 337 | ||
| 321 | oxygen_write8(chip, OXYGEN_AC97_INTERRUPT_MASK, | 338 | if (chip->has_ac97_0 | chip->has_ac97_1) |
| 322 | OXYGEN_AC97_INT_READ_DONE | | 339 | oxygen_write8(chip, OXYGEN_AC97_INTERRUPT_MASK, |
| 323 | OXYGEN_AC97_INT_WRITE_DONE); | 340 | OXYGEN_AC97_INT_READ_DONE | |
| 341 | OXYGEN_AC97_INT_WRITE_DONE); | ||
| 342 | else | ||
| 343 | oxygen_write8(chip, OXYGEN_AC97_INTERRUPT_MASK, 0); | ||
| 324 | oxygen_write32(chip, OXYGEN_AC97_OUT_CONFIG, 0); | 344 | oxygen_write32(chip, OXYGEN_AC97_OUT_CONFIG, 0); |
| 325 | oxygen_write32(chip, OXYGEN_AC97_IN_CONFIG, 0); | 345 | oxygen_write32(chip, OXYGEN_AC97_IN_CONFIG, 0); |
| 326 | if (!(chip->has_ac97_0 | chip->has_ac97_1)) | 346 | if (!(chip->has_ac97_0 | chip->has_ac97_1)) |
| @@ -351,6 +371,8 @@ static void oxygen_init(struct oxygen *chip) | |||
| 351 | oxygen_write_ac97(chip, 0, AC97_REC_GAIN, 0x8000); | 371 | oxygen_write_ac97(chip, 0, AC97_REC_GAIN, 0x8000); |
| 352 | oxygen_write_ac97(chip, 0, AC97_CENTER_LFE_MASTER, 0x8080); | 372 | oxygen_write_ac97(chip, 0, AC97_CENTER_LFE_MASTER, 0x8080); |
| 353 | oxygen_write_ac97(chip, 0, AC97_SURROUND_MASTER, 0x8080); | 373 | oxygen_write_ac97(chip, 0, AC97_SURROUND_MASTER, 0x8080); |
| 374 | oxygen_ac97_clear_bits(chip, 0, CM9780_GPIO_STATUS, | ||
| 375 | CM9780_GPO0); | ||
| 354 | /* power down unused ADCs and DACs */ | 376 | /* power down unused ADCs and DACs */ |
| 355 | oxygen_ac97_set_bits(chip, 0, AC97_POWERDOWN, | 377 | oxygen_ac97_set_bits(chip, 0, AC97_POWERDOWN, |
| 356 | AC97_PD_PR0 | AC97_PD_PR1); | 378 | AC97_PD_PR0 | AC97_PD_PR1); |
| @@ -388,10 +410,8 @@ static void oxygen_card_free(struct snd_card *card) | |||
| 388 | oxygen_write16(chip, OXYGEN_DMA_STATUS, 0); | 410 | oxygen_write16(chip, OXYGEN_DMA_STATUS, 0); |
| 389 | oxygen_write16(chip, OXYGEN_INTERRUPT_MASK, 0); | 411 | oxygen_write16(chip, OXYGEN_INTERRUPT_MASK, 0); |
| 390 | spin_unlock_irq(&chip->reg_lock); | 412 | spin_unlock_irq(&chip->reg_lock); |
| 391 | if (chip->irq >= 0) { | 413 | if (chip->irq >= 0) |
| 392 | free_irq(chip->irq, chip); | 414 | free_irq(chip->irq, chip); |
| 393 | synchronize_irq(chip->irq); | ||
| 394 | } | ||
| 395 | flush_scheduled_work(); | 415 | flush_scheduled_work(); |
| 396 | chip->model->cleanup(chip); | 416 | chip->model->cleanup(chip); |
| 397 | mutex_destroy(&chip->mutex); | 417 | mutex_destroy(&chip->mutex); |
| @@ -400,7 +420,7 @@ static void oxygen_card_free(struct snd_card *card) | |||
| 400 | } | 420 | } |
| 401 | 421 | ||
| 402 | int oxygen_pci_probe(struct pci_dev *pci, int index, char *id, | 422 | int oxygen_pci_probe(struct pci_dev *pci, int index, char *id, |
| 403 | int midi, const struct oxygen_model *model) | 423 | const struct oxygen_model *model) |
| 404 | { | 424 | { |
| 405 | struct snd_card *card; | 425 | struct snd_card *card; |
| 406 | struct oxygen *chip; | 426 | struct oxygen *chip; |
| @@ -472,9 +492,7 @@ int oxygen_pci_probe(struct pci_dev *pci, int index, char *id, | |||
| 472 | if (err < 0) | 492 | if (err < 0) |
| 473 | goto err_card; | 493 | goto err_card; |
| 474 | 494 | ||
| 475 | oxygen_write8_masked(chip, OXYGEN_MISC, | 495 | if (model->misc_flags & OXYGEN_MISC_MIDI) { |
| 476 | midi ? OXYGEN_MISC_MIDI : 0, OXYGEN_MISC_MIDI); | ||
| 477 | if (midi) { | ||
| 478 | err = snd_mpu401_uart_new(card, 0, MPU401_HW_CMIPCI, | 496 | err = snd_mpu401_uart_new(card, 0, MPU401_HW_CMIPCI, |
| 479 | chip->addr + OXYGEN_MPU401, | 497 | chip->addr + OXYGEN_MPU401, |
| 480 | MPU401_INFO_INTEGRATED, 0, 0, | 498 | MPU401_INFO_INTEGRATED, 0, 0, |
| @@ -486,7 +504,10 @@ int oxygen_pci_probe(struct pci_dev *pci, int index, char *id, | |||
| 486 | oxygen_proc_init(chip); | 504 | oxygen_proc_init(chip); |
| 487 | 505 | ||
| 488 | spin_lock_irq(&chip->reg_lock); | 506 | spin_lock_irq(&chip->reg_lock); |
| 489 | chip->interrupt_mask |= OXYGEN_INT_SPDIF_IN_DETECT | OXYGEN_INT_AC97; | 507 | if (chip->model->pcm_dev_cfg & CAPTURE_1_FROM_SPDIF) |
| 508 | chip->interrupt_mask |= OXYGEN_INT_SPDIF_IN_DETECT; | ||
| 509 | if (chip->has_ac97_0 | chip->has_ac97_1) | ||
| 510 | chip->interrupt_mask |= OXYGEN_INT_AC97; | ||
| 490 | oxygen_write16(chip, OXYGEN_INTERRUPT_MASK, chip->interrupt_mask); | 511 | oxygen_write16(chip, OXYGEN_INTERRUPT_MASK, chip->interrupt_mask); |
| 491 | spin_unlock_irq(&chip->reg_lock); | 512 | spin_unlock_irq(&chip->reg_lock); |
| 492 | 513 | ||
