diff options
Diffstat (limited to 'sound/pci/emu10k1/emumixer.c')
-rw-r--r-- | sound/pci/emu10k1/emumixer.c | 86 |
1 files changed, 52 insertions, 34 deletions
diff --git a/sound/pci/emu10k1/emumixer.c b/sound/pci/emu10k1/emumixer.c index 7b2c1dcc5337..54a2034d8edd 100644 --- a/sound/pci/emu10k1/emumixer.c +++ b/sound/pci/emu10k1/emumixer.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) by Jaroslav Kysela <perex@suse.cz>, | 2 | * Copyright (c) by Jaroslav Kysela <perex@perex.cz>, |
3 | * Takashi Iwai <tiwai@suse.de> | 3 | * Takashi Iwai <tiwai@suse.de> |
4 | * Creative Labs, Inc. | 4 | * Creative Labs, Inc. |
5 | * Routines for control of EMU10K1 chips / mixer routines | 5 | * Routines for control of EMU10K1 chips / mixer routines |
@@ -400,15 +400,7 @@ static struct snd_kcontrol_new snd_emu1010_input_enum_ctls[] __devinitdata = { | |||
400 | 400 | ||
401 | 401 | ||
402 | 402 | ||
403 | 403 | #define snd_emu1010_adc_pads_info snd_ctl_boolean_mono_info | |
404 | static int snd_emu1010_adc_pads_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) | ||
405 | { | ||
406 | uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; | ||
407 | uinfo->count = 1; | ||
408 | uinfo->value.integer.min = 0; | ||
409 | uinfo->value.integer.max = 1; | ||
410 | return 0; | ||
411 | } | ||
412 | 404 | ||
413 | static int snd_emu1010_adc_pads_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) | 405 | static int snd_emu1010_adc_pads_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
414 | { | 406 | { |
@@ -456,14 +448,7 @@ static struct snd_kcontrol_new snd_emu1010_adc_pads[] __devinitdata = { | |||
456 | EMU1010_ADC_PADS("ADC1 14dB PAD 0202 Capture Switch", EMU_HANA_0202_ADC_PAD1), | 448 | EMU1010_ADC_PADS("ADC1 14dB PAD 0202 Capture Switch", EMU_HANA_0202_ADC_PAD1), |
457 | }; | 449 | }; |
458 | 450 | ||
459 | static int snd_emu1010_dac_pads_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) | 451 | #define snd_emu1010_dac_pads_info snd_ctl_boolean_mono_info |
460 | { | ||
461 | uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; | ||
462 | uinfo->count = 1; | ||
463 | uinfo->value.integer.min = 0; | ||
464 | uinfo->value.integer.max = 1; | ||
465 | return 0; | ||
466 | } | ||
467 | 452 | ||
468 | static int snd_emu1010_dac_pads_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) | 453 | static int snd_emu1010_dac_pads_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) |
469 | { | 454 | { |
@@ -516,17 +501,19 @@ static struct snd_kcontrol_new snd_emu1010_dac_pads[] __devinitdata = { | |||
516 | static int snd_emu1010_internal_clock_info(struct snd_kcontrol *kcontrol, | 501 | static int snd_emu1010_internal_clock_info(struct snd_kcontrol *kcontrol, |
517 | struct snd_ctl_elem_info *uinfo) | 502 | struct snd_ctl_elem_info *uinfo) |
518 | { | 503 | { |
519 | static char *texts[2] = { | 504 | static char *texts[4] = { |
520 | "44100", "48000" | 505 | "44100", "48000", "SPDIF", "ADAT" |
521 | }; | 506 | }; |
522 | 507 | ||
523 | uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; | 508 | uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED; |
524 | uinfo->count = 1; | 509 | uinfo->count = 1; |
525 | uinfo->value.enumerated.items = 2; | 510 | uinfo->value.enumerated.items = 4; |
526 | if (uinfo->value.enumerated.item > 1) | 511 | if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items) |
527 | uinfo->value.enumerated.item = 1; | 512 | uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1; |
528 | strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]); | 513 | strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]); |
529 | return 0; | 514 | return 0; |
515 | |||
516 | |||
530 | } | 517 | } |
531 | 518 | ||
532 | static int snd_emu1010_internal_clock_get(struct snd_kcontrol *kcontrol, | 519 | static int snd_emu1010_internal_clock_get(struct snd_kcontrol *kcontrol, |
@@ -584,6 +571,44 @@ static int snd_emu1010_internal_clock_put(struct snd_kcontrol *kcontrol, | |||
584 | /* Unmute all */ | 571 | /* Unmute all */ |
585 | snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE ); | 572 | snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE ); |
586 | break; | 573 | break; |
574 | |||
575 | case 2: /* Take clock from S/PDIF IN */ | ||
576 | /* Mute all */ | ||
577 | snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_MUTE ); | ||
578 | /* Default fallback clock 48kHz */ | ||
579 | snd_emu1010_fpga_write(emu, EMU_HANA_DEFCLOCK, EMU_HANA_DEFCLOCK_48K ); | ||
580 | /* Word Clock source, sync to S/PDIF input */ | ||
581 | snd_emu1010_fpga_write(emu, EMU_HANA_WCLOCK, | ||
582 | EMU_HANA_WCLOCK_HANA_SPDIF_IN | EMU_HANA_WCLOCK_1X ); | ||
583 | /* Set LEDs on Audio Dock */ | ||
584 | snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_LEDS_2, | ||
585 | EMU_HANA_DOCK_LEDS_2_EXT | EMU_HANA_DOCK_LEDS_2_LOCK ); | ||
586 | /* FIXME: We should set EMU_HANA_DOCK_LEDS_2_LOCK only when clock signal is present and valid */ | ||
587 | /* Allow DLL to settle */ | ||
588 | msleep(10); | ||
589 | /* Unmute all */ | ||
590 | snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE ); | ||
591 | break; | ||
592 | |||
593 | case 3: | ||
594 | /* Take clock from ADAT IN */ | ||
595 | /* Mute all */ | ||
596 | snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_MUTE ); | ||
597 | /* Default fallback clock 48kHz */ | ||
598 | snd_emu1010_fpga_write(emu, EMU_HANA_DEFCLOCK, EMU_HANA_DEFCLOCK_48K ); | ||
599 | /* Word Clock source, sync to ADAT input */ | ||
600 | snd_emu1010_fpga_write(emu, EMU_HANA_WCLOCK, | ||
601 | EMU_HANA_WCLOCK_HANA_ADAT_IN | EMU_HANA_WCLOCK_1X ); | ||
602 | /* Set LEDs on Audio Dock */ | ||
603 | snd_emu1010_fpga_write(emu, EMU_HANA_DOCK_LEDS_2, EMU_HANA_DOCK_LEDS_2_EXT | EMU_HANA_DOCK_LEDS_2_LOCK ); | ||
604 | /* FIXME: We should set EMU_HANA_DOCK_LEDS_2_LOCK only when clock signal is present and valid */ | ||
605 | /* Allow DLL to settle */ | ||
606 | msleep(10); | ||
607 | /* Unmute all */ | ||
608 | snd_emu1010_fpga_write(emu, EMU_HANA_UNMUTE, EMU_UNMUTE ); | ||
609 | |||
610 | |||
611 | break; | ||
587 | } | 612 | } |
588 | } | 613 | } |
589 | return change; | 614 | return change; |
@@ -871,7 +896,7 @@ static struct snd_kcontrol_new snd_emu10k1_spdif_mask_control = | |||
871 | .access = SNDRV_CTL_ELEM_ACCESS_READ, | 896 | .access = SNDRV_CTL_ELEM_ACCESS_READ, |
872 | .iface = SNDRV_CTL_ELEM_IFACE_PCM, | 897 | .iface = SNDRV_CTL_ELEM_IFACE_PCM, |
873 | .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,MASK), | 898 | .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,MASK), |
874 | .count = 4, | 899 | .count = 3, |
875 | .info = snd_emu10k1_spdif_info, | 900 | .info = snd_emu10k1_spdif_info, |
876 | .get = snd_emu10k1_spdif_get_mask | 901 | .get = snd_emu10k1_spdif_get_mask |
877 | }; | 902 | }; |
@@ -880,7 +905,7 @@ static struct snd_kcontrol_new snd_emu10k1_spdif_control = | |||
880 | { | 905 | { |
881 | .iface = SNDRV_CTL_ELEM_IFACE_PCM, | 906 | .iface = SNDRV_CTL_ELEM_IFACE_PCM, |
882 | .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,DEFAULT), | 907 | .name = SNDRV_CTL_NAME_IEC958("",PLAYBACK,DEFAULT), |
883 | .count = 4, | 908 | .count = 3, |
884 | .info = snd_emu10k1_spdif_info, | 909 | .info = snd_emu10k1_spdif_info, |
885 | .get = snd_emu10k1_spdif_get, | 910 | .get = snd_emu10k1_spdif_get, |
886 | .put = snd_emu10k1_spdif_put | 911 | .put = snd_emu10k1_spdif_put |
@@ -1326,14 +1351,7 @@ static struct snd_kcontrol_new snd_emu10k1_efx_attn_control = | |||
1326 | .put = snd_emu10k1_efx_attn_put | 1351 | .put = snd_emu10k1_efx_attn_put |
1327 | }; | 1352 | }; |
1328 | 1353 | ||
1329 | static int snd_emu10k1_shared_spdif_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) | 1354 | #define snd_emu10k1_shared_spdif_info snd_ctl_boolean_mono_info |
1330 | { | ||
1331 | uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; | ||
1332 | uinfo->count = 1; | ||
1333 | uinfo->value.integer.min = 0; | ||
1334 | uinfo->value.integer.max = 1; | ||
1335 | return 0; | ||
1336 | } | ||
1337 | 1355 | ||
1338 | static int snd_emu10k1_shared_spdif_get(struct snd_kcontrol *kcontrol, | 1356 | static int snd_emu10k1_shared_spdif_get(struct snd_kcontrol *kcontrol, |
1339 | struct snd_ctl_elem_value *ucontrol) | 1357 | struct snd_ctl_elem_value *ucontrol) |