]> err.no Git - linux-2.6/commitdiff
[ALSA] some fixes and cleanup for ICE1724 cards
authorPavel Hofman <dustin@seznam.cz>
Mon, 17 Mar 2008 07:45:33 +0000 (08:45 +0100)
committerTakashi Iwai <tiwai@suse.de>
Thu, 24 Apr 2008 10:00:25 +0000 (12:00 +0200)
* removing the hack with NON_AKM ak4xxx type
* support for card-specific flags in ak4114_stats
* definition of the flags for corresponding cards

Signed-off-by: Pavel Hofman <dustin@seznam.cz>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
include/sound/ak4114.h
include/sound/ak4xxx-adda.h
sound/i2c/other/ak4114.c
sound/i2c/other/ak4xxx-adda.c
sound/pci/ice1712/prodigy192.c
sound/pci/ice1712/revo.c

index 4e80d3fe738130c7cefad9673c771a756df2de8b..d293d36a66b86760fae36591ac0c9dbf032720ba 100644 (file)
@@ -182,6 +182,7 @@ struct ak4114 {
        unsigned char rcs0;
        unsigned char rcs1;
        struct delayed_work work;
+       unsigned int check_flags;
        void *change_callback_private;
        void (*change_callback)(struct ak4114 *ak4114, unsigned char c0, unsigned char c1);
 };
index 6153b91cdc3ea4f71e79f9ea44a7550f4995b54b..891cf1aea8b139db918705149a9e7ffb25760fd5 100644 (file)
@@ -68,7 +68,7 @@ struct snd_akm4xxx {
        enum {
                SND_AK4524, SND_AK4528, SND_AK4529,
                SND_AK4355, SND_AK4358, SND_AK4381,
-               SND_AK5365, NON_AKM
+               SND_AK5365
        } type;
 
        /* (array) information of combined codecs */
index 9a90e830c423d2128e459cad7b68632e05e9b0df..d20d893b3b60c1308694224c56c8838126a6f215 100644 (file)
@@ -612,7 +612,7 @@ static void ak4114_stats(struct work_struct *work)
        struct ak4114 *chip = container_of(work, struct ak4114, work.work);
 
        if (!chip->init)
-               snd_ak4114_check_rate_and_errors(chip, 0);
+               snd_ak4114_check_rate_and_errors(chip, chip->check_flags);
 
        schedule_delayed_work(&chip->work, HZ / 10);
 }
index 35fbbf2cb9fa84bb47241c2de5ce7c9c9941e323..288926d2e2054b2706d8749b6be8ff8290bd1911 100644 (file)
@@ -70,7 +70,8 @@ static void ak4524_reset(struct snd_akm4xxx *ak, int state)
 }
 
 /* reset procedure for AK4355 and AK4358 */
-static void ak4355_reset(struct snd_akm4xxx *ak, int state)
+static void ak435X_reset(struct snd_akm4xxx *ak, int state,
+               unsigned char total_regs)
 {
        unsigned char reg;
 
@@ -78,7 +79,7 @@ static void ak4355_reset(struct snd_akm4xxx *ak, int state)
                snd_akm4xxx_write(ak, 0, 0x01, 0x02); /* reset and soft-mute */
                return;
        }
-       for (reg = 0x00; reg < 0x0b; reg++)
+       for (reg = 0x00; reg < total_regs; reg++)
                if (reg != 0x01)
                        snd_akm4xxx_write(ak, 0, reg,
                                          snd_akm4xxx_get(ak, 0, reg));
@@ -118,8 +119,10 @@ void snd_akm4xxx_reset(struct snd_akm4xxx *ak, int state)
                /* FIXME: needed for ak4529? */
                break;
        case SND_AK4355:
+               ak435X_reset(ak, state, 0x0b);
+               break;
        case SND_AK4358:
-               ak4355_reset(ak, state);
+               ak435X_reset(ak, state, 0x10);
                break;
        case SND_AK4381:
                ak4381_reset(ak, state);
@@ -292,11 +295,6 @@ void snd_akm4xxx_init(struct snd_akm4xxx *ak)
        case SND_AK5365:
                /* FIXME: any init sequence? */
                return;
-       case NON_AKM:
-               /* fake value for non-akm codecs using akm infrastructure
-                * (e.g. of ice1724) - certainly FIXME
-                */
-               return;
        default:
                snd_BUG();
                return;
@@ -374,6 +372,8 @@ static int put_ak_reg(struct snd_kcontrol *kcontrol, int addr,
                nval = mask - nval;
        if (AK_GET_NEEDSMSB(kcontrol->private_value))
                nval |= 0x80;
+       /* printk(KERN_DEBUG "DEBUG - AK writing reg: chip %x addr %x,
+          nval %x\n", chip, addr, nval); */
        snd_akm4xxx_write(ak, chip, addr, nval);
        return 1;
 }
index 48cf40a8f32a1b0c0f9c763bdd31feb2e83f0bc9..25ceb67a9c168edb640d5209a1a7defa5daf2ef0 100644 (file)
@@ -319,12 +319,11 @@ static int stac9460_mic_sw_put(struct snd_kcontrol *kcontrol,
 /*
  * Handler for setting correct codec rate - called when rate change is detected
  */
-static void stac9460_set_rate_val(struct snd_akm4xxx *ak, unsigned int rate)
+static void stac9460_set_rate_val(struct snd_ice1712 *ice, unsigned int rate)
 {
        unsigned char old, new;
        int idx;
        unsigned char changed[7];
-       struct snd_ice1712 *ice = ak->private_data[0];
        struct prodigy192_spec *spec = ice->spec;
 
        if (rate == 0)  /* no hint - S/PDIF input is master, simply return */
@@ -357,16 +356,6 @@ static void stac9460_set_rate_val(struct snd_akm4xxx *ak, unsigned int rate)
        mutex_unlock(&spec->mute_mutex);
 }
 
-/* using akm infrastructure for setting rate of the codec */
-static struct snd_akm4xxx akmlike_stac9460 __devinitdata = {
-       .type = NON_AKM,        /* special value */
-       .num_adcs = 6,          /* not used in any way, just for completeness */
-       .num_dacs = 2,
-       .ops = {
-               .set_rate_val = stac9460_set_rate_val
-       }
-};
-
 
 static const DECLARE_TLV_DB_SCALE(db_scale_dac, -19125, 75, 0);
 static const DECLARE_TLV_DB_SCALE(db_scale_adc, 0, 150, 0);
@@ -642,12 +631,19 @@ static int prodigy192_ak4114_init(struct snd_ice1712 *ice)
                0x41, 0x02, 0x2c, 0x00, 0x00
        };
        struct prodigy192_spec *spec = ice->spec;
+       int err;
 
-       return snd_ak4114_create(ice->card,
+       err = snd_ak4114_create(ice->card,
                                 prodigy192_ak4114_read,
                                 prodigy192_ak4114_write,
                                 ak4114_init_vals, ak4114_init_txcsb,
                                 ice, &spec->ak4114);
+       if (err < 0)
+               return err;
+       /* AK4114 in Prodigy192 cannot detect external rate correctly.
+        * No reason to stop capture stream due to incorrect checks */
+       spec->ak4114->check_flags = AK4114_CHECK_NO_RATE;
+       return 0;
 }
 
 static void stac9460_proc_regs_read(struct snd_info_entry *entry,
@@ -743,7 +739,6 @@ static int __devinit prodigy192_init(struct snd_ice1712 *ice)
        };
        const unsigned short *p;
        int err = 0;
-       struct snd_akm4xxx *ak;
        struct prodigy192_spec *spec;
 
        /* prodigy 192 */
@@ -761,15 +756,7 @@ static int __devinit prodigy192_init(struct snd_ice1712 *ice)
        p = stac_inits_prodigy;
        for (; *p != (unsigned short)-1; p += 2)
                stac9460_put(ice, p[0], p[1]);
-       /* reusing the akm codecs infrastructure,
-        * for setting rate on stac9460 */
-       ak = ice->akm = kmalloc(sizeof(struct snd_akm4xxx), GFP_KERNEL);
-       if (!ak)
-               return -ENOMEM;
-       ice->akm_codecs = 1;
-       err = snd_ice1712_akm4xxx_init(ak, &akmlike_stac9460, NULL, ice);
-       if (err < 0)
-               return err;
+       ice->gpio.set_pro_rate = stac9460_set_rate_val;
 
        /* MI/ODI/O add on card with AK4114 */
        if (prodigy192_miodio_exists(ice)) {
index 7c930cc05f1d6b40286e4c0b66c023239be55778..dba93d8efbe04f6bea876f5d4f25b05039a134eb 100644 (file)
@@ -488,6 +488,10 @@ static int __devinit ap192_ak4114_init(struct snd_ice1712 *ice)
                                 ap192_ak4114_write,
                                 ak4114_init_vals, ak4114_init_txcsb,
                                 ice, &ak);
+       /* AK4114 in Revo cannot detect external rate correctly.
+        * No reason to stop capture stream due to incorrect checks */
+       ak->check_flags = AK4114_CHECK_NO_RATE;
+
        return 0; /* error ignored; it's no fatal error */
 }