]> pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
[ALSA] ac97 - Add support of static resolution tables
authorTakashi Iwai <tiwai@suse.de>
Thu, 9 Feb 2006 10:45:20 +0000 (11:45 +0100)
committerJaroslav Kysela <perex@suse.cz>
Wed, 22 Mar 2006 09:28:34 +0000 (10:28 +0100)
Modules: AC97 Codec

Added the support of static resolution table support for codecs
that the driver cannot probe the volume resolution properly.

The table pointer should be set in each codec patch.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
include/sound/ac97_codec.h
sound/pci/ac97/ac97_codec.c

index ad3fe046f6cf81bc882e48a085bbf6c8526046d0..9036d25e1baca39913974e3894a53f29cb1dff36 100644 (file)
@@ -444,6 +444,12 @@ struct snd_ac97_template {
        DECLARE_BITMAP(reg_accessed, 0x80); /* bit flags */
 };
 
+/* static resolution table */
+struct snd_ac97_res_table {
+       unsigned short reg;     /* register */
+       unsigned short bits;    /* resolution bitmask */
+};
+
 struct snd_ac97 {
        /* -- lowlevel (hardware) driver specific -- */
        struct snd_ac97_build_ops * build_ops;
@@ -464,6 +470,7 @@ struct snd_ac97 {
        unsigned short caps;    /* capabilities (register 0) */
        unsigned short ext_id;  /* extended feature identification (register 28) */
        unsigned short ext_mid; /* extended modem ID (register 3C) */
+       const struct snd_ac97_res_table *res_table;     /* static resolution */
        unsigned int scaps;     /* driver capabilities */
        unsigned int flags;     /* specific code */
        unsigned int rates[6];  /* see AC97_RATES_* defines */
index 6108cdc5efb6554f26f7e7f9ba1e7f65e94d0788..124c1bc4cb92724c0b757a4afbef89e71f1d5796 100644 (file)
@@ -1030,6 +1030,18 @@ static void check_volume_resolution(struct snd_ac97 *ac97, int reg, unsigned cha
        unsigned char max[3] = { 63, 31, 15 };
        int i;
 
+       /* first look up the static resolution table */
+       if (ac97->res_table) {
+               const struct snd_ac97_res_table *tbl;
+               for (tbl = ac97->res_table; tbl->reg; tbl++) {
+                       if (tbl->reg == reg) {
+                               *lo_max = tbl->bits & 0xff;
+                               *hi_max = (tbl->bits >> 8) & 0xff;
+                               return;
+                       }
+               }
+       }
+
        *lo_max = *hi_max = 0;
        for (i = 0 ; i < ARRAY_SIZE(cbit); i++) {
                unsigned short val;