}
 
 /* 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;
 
                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));
                /* 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);
        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;
                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;
 }
 
 /*
  * 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 */
        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);
                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,
        };
        const unsigned short *p;
        int err = 0;
-       struct snd_akm4xxx *ak;
        struct prodigy192_spec *spec;
 
        /* prodigy 192 */
        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)) {