Commit 4b28dca86066596721a6243c94611dab41970079

Authored by Krzysztof Helt
Committed by Takashi Iwai
1 parent bec145ae6f

ALSA: cs4236: add dB scale for all volume controls

Use db scale for all volume controls according to Crystal's datasheets.

Signed-off-by: Krzysztof Helt <krzysztof.h1@wp.pl>
Signed-off-by: Takashi Iwai <tiwai@suse.de>

Showing 1 changed file with 108 additions and 44 deletions Side-by-side Diff

sound/isa/cs423x/cs4236_lib.c
... ... @@ -88,6 +88,7 @@
88 88 #include <sound/wss.h>
89 89 #include <sound/asoundef.h>
90 90 #include <sound/initval.h>
  91 +#include <sound/tlv.h>
91 92  
92 93 /*
93 94 *
... ... @@ -399,6 +400,14 @@
399 400 .get = snd_cs4236_get_single, .put = snd_cs4236_put_single, \
400 401 .private_value = reg | (shift << 8) | (mask << 16) | (invert << 24) }
401 402  
  403 +#define CS4236_SINGLE_TLV(xname, xindex, reg, shift, mask, invert, xtlv) \
  404 +{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
  405 + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ, \
  406 + .info = snd_cs4236_info_single, \
  407 + .get = snd_cs4236_get_single, .put = snd_cs4236_put_single, \
  408 + .private_value = reg | (shift << 8) | (mask << 16) | (invert << 24), \
  409 + .tlv = { .p = (xtlv) } }
  410 +
402 411 static int snd_cs4236_info_single(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
403 412 {
404 413 int mask = (kcontrol->private_value >> 16) & 0xff;
... ... @@ -502,6 +511,16 @@
502 511 .get = snd_cs4236_get_double, .put = snd_cs4236_put_double, \
503 512 .private_value = left_reg | (right_reg << 8) | (shift_left << 16) | (shift_right << 19) | (mask << 24) | (invert << 22) }
504 513  
  514 +#define CS4236_DOUBLE_TLV(xname, xindex, left_reg, right_reg, shift_left, \
  515 + shift_right, mask, invert, xtlv) \
  516 +{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
  517 + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ, \
  518 + .info = snd_cs4236_info_double, \
  519 + .get = snd_cs4236_get_double, .put = snd_cs4236_put_double, \
  520 + .private_value = left_reg | (right_reg << 8) | (shift_left << 16) | \
  521 + (shift_right << 19) | (mask << 24) | (invert << 22), \
  522 + .tlv = { .p = (xtlv) } }
  523 +
505 524 static int snd_cs4236_info_double(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
506 525 {
507 526 int mask = (kcontrol->private_value >> 24) & 0xff;
508 527  
... ... @@ -572,12 +591,23 @@
572 591 return change;
573 592 }
574 593  
575   -#define CS4236_DOUBLE1(xname, xindex, left_reg, right_reg, shift_left, shift_right, mask, invert) \
  594 +#define CS4236_DOUBLE1(xname, xindex, left_reg, right_reg, shift_left, \
  595 + shift_right, mask, invert) \
576 596 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
577 597 .info = snd_cs4236_info_double, \
578 598 .get = snd_cs4236_get_double1, .put = snd_cs4236_put_double1, \
579 599 .private_value = left_reg | (right_reg << 8) | (shift_left << 16) | (shift_right << 19) | (mask << 24) | (invert << 22) }
580 600  
  601 +#define CS4236_DOUBLE1_TLV(xname, xindex, left_reg, right_reg, shift_left, \
  602 + shift_right, mask, invert, xtlv) \
  603 +{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
  604 + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ, \
  605 + .info = snd_cs4236_info_double, \
  606 + .get = snd_cs4236_get_double1, .put = snd_cs4236_put_double1, \
  607 + .private_value = left_reg | (right_reg << 8) | (shift_left << 16) | \
  608 + (shift_right << 19) | (mask << 24) | (invert << 22), \
  609 + .tlv = { .p = (xtlv) } }
  610 +
581 611 static int snd_cs4236_get_double1(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
582 612 {
583 613 struct snd_wss *chip = snd_kcontrol_chip(kcontrol);
584 614  
585 615  
586 616  
... ... @@ -631,16 +661,18 @@
631 661 return change;
632 662 }
633 663  
634   -#define CS4236_MASTER_DIGITAL(xname, xindex) \
  664 +#define CS4236_MASTER_DIGITAL(xname, xindex, xtlv) \
635 665 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
  666 + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ, \
636 667 .info = snd_cs4236_info_double, \
637 668 .get = snd_cs4236_get_master_digital, .put = snd_cs4236_put_master_digital, \
638   - .private_value = 71 << 24 }
  669 + .private_value = 71 << 24, \
  670 + .tlv = { .p = (xtlv) } }
639 671  
640 672 static inline int snd_cs4236_mixer_master_digital_invert_volume(int vol)
641 673 {
642 674 return (vol < 64) ? 63 - vol : 64 + (71 - vol);
643   -}
  675 +}
644 676  
645 677 static int snd_cs4236_get_master_digital(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
646 678 {
647 679  
648 680  
... ... @@ -673,11 +705,13 @@
673 705 return change;
674 706 }
675 707  
676   -#define CS4235_OUTPUT_ACCU(xname, xindex) \
  708 +#define CS4235_OUTPUT_ACCU(xname, xindex, xtlv) \
677 709 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
  710 + .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | SNDRV_CTL_ELEM_ACCESS_TLV_READ, \
678 711 .info = snd_cs4236_info_double, \
679 712 .get = snd_cs4235_get_output_accu, .put = snd_cs4235_put_output_accu, \
680   - .private_value = 3 << 24 }
  713 + .private_value = 3 << 24, \
  714 + .tlv = { .p = (xtlv) } }
681 715  
682 716 static inline int snd_cs4235_mixer_output_accu_get_volume(int vol)
683 717 {
684 718  
685 719  
686 720  
687 721  
688 722  
689 723  
690 724  
... ... @@ -732,41 +766,56 @@
732 766 return change;
733 767 }
734 768  
  769 +static const DECLARE_TLV_DB_SCALE(db_scale_7bit, -9450, 150, 0);
  770 +static const DECLARE_TLV_DB_SCALE(db_scale_6bit, -9450, 150, 0);
  771 +static const DECLARE_TLV_DB_SCALE(db_scale_6bit_12db_max, -8250, 150, 0);
  772 +static const DECLARE_TLV_DB_SCALE(db_scale_5bit_12db_max, -3450, 150, 0);
  773 +static const DECLARE_TLV_DB_SCALE(db_scale_5bit_22db_max, -2400, 150, 0);
  774 +static const DECLARE_TLV_DB_SCALE(db_scale_4bit, -4500, 300, 0);
  775 +static const DECLARE_TLV_DB_SCALE(db_scale_2bit, -1800, 600, 0);
  776 +static const DECLARE_TLV_DB_SCALE(db_scale_rec_gain, 0, 150, 0);
  777 +
735 778 static struct snd_kcontrol_new snd_cs4236_controls[] = {
736 779  
737 780 CS4236_DOUBLE("Master Digital Playback Switch", 0,
738 781 CS4236_LEFT_MASTER, CS4236_RIGHT_MASTER, 7, 7, 1, 1),
739 782 CS4236_DOUBLE("Master Digital Capture Switch", 0,
740 783 CS4236_DAC_MUTE, CS4236_DAC_MUTE, 7, 6, 1, 1),
741   -CS4236_MASTER_DIGITAL("Master Digital Volume", 0),
  784 +CS4236_MASTER_DIGITAL("Master Digital Volume", 0, db_scale_7bit),
742 785  
743   -CS4236_DOUBLE("Capture Boost Volume", 0,
744   - CS4236_LEFT_MIX_CTRL, CS4236_RIGHT_MIX_CTRL, 5, 5, 3, 1),
  786 +CS4236_DOUBLE_TLV("Capture Boost Volume", 0,
  787 + CS4236_LEFT_MIX_CTRL, CS4236_RIGHT_MIX_CTRL, 5, 5, 3, 1,
  788 + db_scale_2bit),
745 789  
746 790 WSS_DOUBLE("PCM Playback Switch", 0,
747 791 CS4231_LEFT_OUTPUT, CS4231_RIGHT_OUTPUT, 7, 7, 1, 1),
748   -WSS_DOUBLE("PCM Playback Volume", 0,
749   - CS4231_LEFT_OUTPUT, CS4231_RIGHT_OUTPUT, 0, 0, 63, 1),
  792 +WSS_DOUBLE_TLV("PCM Playback Volume", 0,
  793 + CS4231_LEFT_OUTPUT, CS4231_RIGHT_OUTPUT, 0, 0, 63, 1,
  794 + db_scale_6bit),
750 795  
751 796 CS4236_DOUBLE("DSP Playback Switch", 0,
752 797 CS4236_LEFT_DSP, CS4236_RIGHT_DSP, 7, 7, 1, 1),
753   -CS4236_DOUBLE("DSP Playback Volume", 0,
754   - CS4236_LEFT_DSP, CS4236_RIGHT_DSP, 0, 0, 63, 1),
  798 +CS4236_DOUBLE_TLV("DSP Playback Volume", 0,
  799 + CS4236_LEFT_DSP, CS4236_RIGHT_DSP, 0, 0, 63, 1,
  800 + db_scale_6bit),
755 801  
756 802 CS4236_DOUBLE("FM Playback Switch", 0,
757 803 CS4236_LEFT_FM, CS4236_RIGHT_FM, 7, 7, 1, 1),
758   -CS4236_DOUBLE("FM Playback Volume", 0,
759   - CS4236_LEFT_FM, CS4236_RIGHT_FM, 0, 0, 63, 1),
  804 +CS4236_DOUBLE_TLV("FM Playback Volume", 0,
  805 + CS4236_LEFT_FM, CS4236_RIGHT_FM, 0, 0, 63, 1,
  806 + db_scale_6bit),
760 807  
761 808 CS4236_DOUBLE("Wavetable Playback Switch", 0,
762 809 CS4236_LEFT_WAVE, CS4236_RIGHT_WAVE, 7, 7, 1, 1),
763   -CS4236_DOUBLE("Wavetable Playback Volume", 0,
764   - CS4236_LEFT_WAVE, CS4236_RIGHT_WAVE, 0, 0, 63, 1),
  810 +CS4236_DOUBLE_TLV("Wavetable Playback Volume", 0,
  811 + CS4236_LEFT_WAVE, CS4236_RIGHT_WAVE, 0, 0, 63, 1,
  812 + db_scale_6bit_12db_max),
765 813  
766 814 WSS_DOUBLE("Synth Playback Switch", 0,
767 815 CS4231_LEFT_LINE_IN, CS4231_RIGHT_LINE_IN, 7, 7, 1, 1),
768   -WSS_DOUBLE("Synth Volume", 0,
769   - CS4231_LEFT_LINE_IN, CS4231_RIGHT_LINE_IN, 0, 0, 31, 1),
  816 +WSS_DOUBLE_TLV("Synth Volume", 0,
  817 + CS4231_LEFT_LINE_IN, CS4231_RIGHT_LINE_IN, 0, 0, 31, 1,
  818 + db_scale_5bit_12db_max),
770 819 WSS_DOUBLE("Synth Capture Switch", 0,
771 820 CS4231_LEFT_LINE_IN, CS4231_RIGHT_LINE_IN, 6, 6, 1, 1),
772 821 WSS_DOUBLE("Synth Capture Bypass", 0,
773 822  
... ... @@ -776,14 +825,16 @@
776 825 CS4236_LEFT_MIC, CS4236_RIGHT_MIC, 6, 6, 1, 1),
777 826 CS4236_DOUBLE("Mic Capture Switch", 0,
778 827 CS4236_LEFT_MIC, CS4236_RIGHT_MIC, 7, 7, 1, 1),
779   -CS4236_DOUBLE("Mic Volume", 0, CS4236_LEFT_MIC, CS4236_RIGHT_MIC, 0, 0, 31, 1),
  828 +CS4236_DOUBLE_TLV("Mic Volume", 0, CS4236_LEFT_MIC, CS4236_RIGHT_MIC,
  829 + 0, 0, 31, 1, db_scale_5bit_22db_max),
780 830 CS4236_DOUBLE("Mic Playback Boost (+20dB)", 0,
781 831 CS4236_LEFT_MIC, CS4236_RIGHT_MIC, 5, 5, 1, 0),
782 832  
783 833 WSS_DOUBLE("Line Playback Switch", 0,
784 834 CS4231_AUX1_LEFT_INPUT, CS4231_AUX1_RIGHT_INPUT, 7, 7, 1, 1),
785   -WSS_DOUBLE("Line Volume", 0,
786   - CS4231_AUX1_LEFT_INPUT, CS4231_AUX1_RIGHT_INPUT, 0, 0, 31, 1),
  835 +WSS_DOUBLE_TLV("Line Volume", 0,
  836 + CS4231_AUX1_LEFT_INPUT, CS4231_AUX1_RIGHT_INPUT, 0, 0, 31, 1,
  837 + db_scale_5bit_12db_max),
787 838 WSS_DOUBLE("Line Capture Switch", 0,
788 839 CS4231_AUX1_LEFT_INPUT, CS4231_AUX1_RIGHT_INPUT, 6, 6, 1, 1),
789 840 WSS_DOUBLE("Line Capture Bypass", 0,
... ... @@ -791,8 +842,9 @@
791 842  
792 843 WSS_DOUBLE("CD Playback Switch", 0,
793 844 CS4231_AUX2_LEFT_INPUT, CS4231_AUX2_RIGHT_INPUT, 7, 7, 1, 1),
794   -WSS_DOUBLE("CD Volume", 0,
795   - CS4231_AUX2_LEFT_INPUT, CS4231_AUX2_RIGHT_INPUT, 0, 0, 31, 1),
  845 +WSS_DOUBLE_TLV("CD Volume", 0,
  846 + CS4231_AUX2_LEFT_INPUT, CS4231_AUX2_RIGHT_INPUT, 0, 0, 31, 1,
  847 + db_scale_5bit_12db_max),
796 848 WSS_DOUBLE("CD Capture Switch", 0,
797 849 CS4231_AUX2_LEFT_INPUT, CS4231_AUX2_RIGHT_INPUT, 6, 6, 1, 1),
798 850  
799 851  
800 852  
801 853  
802 854  
803 855  
804 856  
805 857  
806 858  
... ... @@ -800,44 +852,53 @@
800 852 CS4231_MONO_CTRL, CS4236_RIGHT_MIX_CTRL, 6, 7, 1, 1),
801 853 CS4236_DOUBLE1("Beep Playback Switch", 0,
802 854 CS4231_MONO_CTRL, CS4236_LEFT_MIX_CTRL, 7, 7, 1, 1),
803   -WSS_SINGLE("Beep Playback Volume", 0, CS4231_MONO_CTRL, 0, 15, 1),
  855 +WSS_SINGLE_TLV("Beep Playback Volume", 0, CS4231_MONO_CTRL, 0, 15, 1,
  856 + db_scale_4bit),
804 857 WSS_SINGLE("Beep Bypass Playback Switch", 0, CS4231_MONO_CTRL, 5, 1, 0),
805 858  
806   -WSS_DOUBLE("Capture Volume", 0,
807   - CS4231_LEFT_INPUT, CS4231_RIGHT_INPUT, 0, 0, 15, 0),
  859 +WSS_DOUBLE_TLV("Capture Volume", 0, CS4231_LEFT_INPUT, CS4231_RIGHT_INPUT,
  860 + 0, 0, 15, 0, db_scale_rec_gain),
808 861 WSS_DOUBLE("Analog Loopback Capture Switch", 0,
809 862 CS4231_LEFT_INPUT, CS4231_RIGHT_INPUT, 7, 7, 1, 0),
810 863  
811   -WSS_SINGLE("Digital Loopback Playback Switch", 0, CS4231_LOOPBACK, 0, 1, 0),
812   -CS4236_DOUBLE1("Digital Loopback Playback Volume", 0,
813   - CS4231_LOOPBACK, CS4236_RIGHT_LOOPBACK, 2, 0, 63, 1)
  864 +WSS_SINGLE("Loopback Digital Playback Switch", 0, CS4231_LOOPBACK, 0, 1, 0),
  865 +CS4236_DOUBLE1_TLV("Loopback Digital Playback Volume", 0,
  866 + CS4231_LOOPBACK, CS4236_RIGHT_LOOPBACK, 2, 0, 63, 1,
  867 + db_scale_6bit),
814 868 };
815 869  
  870 +static const DECLARE_TLV_DB_SCALE(db_scale_5bit_6db_max, -5600, 200, 0);
  871 +static const DECLARE_TLV_DB_SCALE(db_scale_2bit_16db_max, -2400, 800, 0);
  872 +
816 873 static struct snd_kcontrol_new snd_cs4235_controls[] = {
817 874  
818 875 WSS_DOUBLE("Master Playback Switch", 0,
819 876 CS4235_LEFT_MASTER, CS4235_RIGHT_MASTER, 7, 7, 1, 1),
820   -WSS_DOUBLE("Master Playback Volume", 0,
821   - CS4235_LEFT_MASTER, CS4235_RIGHT_MASTER, 0, 0, 31, 1),
  877 +WSS_DOUBLE_TLV("Master Playback Volume", 0,
  878 + CS4235_LEFT_MASTER, CS4235_RIGHT_MASTER, 0, 0, 31, 1,
  879 + db_scale_5bit_6db_max),
822 880  
823   -CS4235_OUTPUT_ACCU("Playback Volume", 0),
  881 +CS4235_OUTPUT_ACCU("Playback Volume", 0, db_scale_2bit_16db_max),
824 882  
825 883 WSS_DOUBLE("Synth Playback Switch", 1,
826 884 CS4231_LEFT_LINE_IN, CS4231_RIGHT_LINE_IN, 7, 7, 1, 1),
827 885 WSS_DOUBLE("Synth Capture Switch", 1,
828 886 CS4231_LEFT_LINE_IN, CS4231_RIGHT_LINE_IN, 6, 6, 1, 1),
829   -WSS_DOUBLE("Synth Volume", 1,
830   - CS4231_LEFT_LINE_IN, CS4231_RIGHT_LINE_IN, 0, 0, 31, 1),
  887 +WSS_DOUBLE_TLV("Synth Volume", 1,
  888 + CS4231_LEFT_LINE_IN, CS4231_RIGHT_LINE_IN, 0, 0, 31, 1,
  889 + db_scale_5bit_12db_max),
831 890  
832   -CS4236_DOUBLE("Capture Volume", 0,
833   - CS4236_LEFT_MIX_CTRL, CS4236_RIGHT_MIX_CTRL, 5, 5, 3, 1),
  891 +CS4236_DOUBLE_TLV("Capture Volume", 0,
  892 + CS4236_LEFT_MIX_CTRL, CS4236_RIGHT_MIX_CTRL, 5, 5, 3, 1,
  893 + db_scale_2bit),
834 894  
835 895 WSS_DOUBLE("PCM Playback Switch", 0,
836 896 CS4231_LEFT_OUTPUT, CS4231_RIGHT_OUTPUT, 7, 7, 1, 1),
837 897 WSS_DOUBLE("PCM Capture Switch", 0,
838 898 CS4236_DAC_MUTE, CS4236_DAC_MUTE, 7, 6, 1, 1),
839   -WSS_DOUBLE("PCM Volume", 0,
840   - CS4231_LEFT_OUTPUT, CS4231_RIGHT_OUTPUT, 0, 0, 63, 1),
  899 +WSS_DOUBLE_TLV("PCM Volume", 0,
  900 + CS4231_LEFT_OUTPUT, CS4231_RIGHT_OUTPUT, 0, 0, 63, 1,
  901 + db_scale_6bit),
841 902  
842 903 CS4236_DOUBLE("DSP Switch", 0, CS4236_LEFT_DSP, CS4236_RIGHT_DSP, 7, 7, 1, 1),
843 904  
844 905  
845 906  
... ... @@ -850,22 +911,25 @@
850 911 CS4236_LEFT_MIC, CS4236_RIGHT_MIC, 7, 7, 1, 1),
851 912 CS4236_DOUBLE("Mic Playback Switch", 0,
852 913 CS4236_LEFT_MIC, CS4236_RIGHT_MIC, 6, 6, 1, 1),
853   -CS4236_SINGLE("Mic Volume", 0, CS4236_LEFT_MIC, 0, 31, 1),
  914 +CS4236_SINGLE_TLV("Mic Volume", 0, CS4236_LEFT_MIC, 0, 31, 1,
  915 + db_scale_5bit_22db_max),
854 916 CS4236_SINGLE("Mic Boost (+20dB)", 0, CS4236_LEFT_MIC, 5, 1, 0),
855 917  
856 918 WSS_DOUBLE("Line Playback Switch", 0,
857 919 CS4231_AUX1_LEFT_INPUT, CS4231_AUX1_RIGHT_INPUT, 7, 7, 1, 1),
858 920 WSS_DOUBLE("Line Capture Switch", 0,
859 921 CS4231_AUX1_LEFT_INPUT, CS4231_AUX1_RIGHT_INPUT, 6, 6, 1, 1),
860   -WSS_DOUBLE("Line Volume", 0,
861   - CS4231_AUX1_LEFT_INPUT, CS4231_AUX1_RIGHT_INPUT, 0, 0, 31, 1),
  922 +WSS_DOUBLE_TLV("Line Volume", 0,
  923 + CS4231_AUX1_LEFT_INPUT, CS4231_AUX1_RIGHT_INPUT, 0, 0, 31, 1,
  924 + db_scale_5bit_12db_max),
862 925  
863 926 WSS_DOUBLE("CD Playback Switch", 1,
864 927 CS4231_AUX2_LEFT_INPUT, CS4231_AUX2_RIGHT_INPUT, 7, 7, 1, 1),
865 928 WSS_DOUBLE("CD Capture Switch", 1,
866 929 CS4231_AUX2_LEFT_INPUT, CS4231_AUX2_RIGHT_INPUT, 6, 6, 1, 1),
867   -WSS_DOUBLE("CD Volume", 1,
868   - CS4231_AUX2_LEFT_INPUT, CS4231_AUX2_RIGHT_INPUT, 0, 0, 31, 1),
  930 +WSS_DOUBLE_TLV("CD Volume", 1,
  931 + CS4231_AUX2_LEFT_INPUT, CS4231_AUX2_RIGHT_INPUT, 0, 0, 31, 1,
  932 + db_scale_5bit_12db_max),
869 933  
870 934 CS4236_DOUBLE1("Beep Playback Switch", 0,
871 935 CS4231_MONO_CTRL, CS4236_LEFT_MIX_CTRL, 7, 7, 1, 1),