VT1724_BUFFER_ALIGN);
        snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES,
                                   VT1724_BUFFER_ALIGN);
+       if (ice->spdif.ops.open)
+               ice->spdif.ops.open(ice, substream);
        return 0;
 }
 
        if (PRO_RATE_RESET)
                snd_vt1724_set_pro_rate(ice, PRO_RATE_DEFAULT, 0);
        ice->playback_con_substream = NULL;
+       if (ice->spdif.ops.close)
+               ice->spdif.ops.close(ice, substream);
 
        return 0;
 }
                                   VT1724_BUFFER_ALIGN);
        snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES,
                                   VT1724_BUFFER_ALIGN);
+       if (ice->spdif.ops.open)
+               ice->spdif.ops.open(ice, substream);
        return 0;
 }
 
        if (PRO_RATE_RESET)
                snd_vt1724_set_pro_rate(ice, PRO_RATE_DEFAULT, 0);
        ice->capture_con_substream = NULL;
+       if (ice->spdif.ops.close)
+               ice->spdif.ops.close(ice, substream);
 
        return 0;
 }
 
        return snd_vt1724_read_i2c((struct snd_ice1712 *)private_data, AK4114_ADDR, reg);
 }
 
+static void juli_spdif_in_open(struct snd_ice1712 *ice,
+                              struct snd_pcm_substream *substream)
+{
+       struct juli_spec *spec = ice->spec;
+       struct snd_pcm_runtime *runtime = substream->runtime;
+       int rate;
+
+       if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
+               return;
+       rate = snd_ak4114_external_rate(spec->ak4114);
+       if (rate >= runtime->hw.rate_min && rate <= runtime->hw.rate_max) {
+               runtime->hw.rate_min = rate;
+               runtime->hw.rate_max = rate;
+       }
+}
+
 /*
  * AK4358 section
  */
                        return err;
        }
        
+       ice->spdif.ops.open = juli_spdif_in_open;
        return 0;
 }