ir, &ic);
 }
 
-static void rsnd_soc_hw_constraint(struct snd_pcm_runtime *runtime,
-                                  struct snd_soc_dai *dai)
+static struct snd_pcm_hardware rsnd_pcm_hardware = {
+       .info =         SNDRV_PCM_INFO_INTERLEAVED      |
+                       SNDRV_PCM_INFO_MMAP             |
+                       SNDRV_PCM_INFO_MMAP_VALID,
+       .buffer_bytes_max       = 64 * 1024,
+       .period_bytes_min       = 32,
+       .period_bytes_max       = 8192,
+       .periods_min            = 1,
+       .periods_max            = 32,
+       .fifo_size              = 256,
+};
+
+static int rsnd_soc_dai_startup(struct snd_pcm_substream *substream,
+                               struct snd_soc_dai *dai)
 {
        struct rsnd_dai *rdai = rsnd_dai_to_rdai(dai);
+       struct rsnd_priv *priv = rsnd_rdai_to_priv(rdai);
+       struct rsnd_dai_stream *io = rsnd_rdai_to_io(rdai, substream);
        struct snd_pcm_hw_constraint_list *constraint = &rdai->constraint;
+       struct snd_pcm_runtime *runtime = substream->runtime;
        unsigned int max_channels = rsnd_rdai_channels_get(rdai);
+       int ret;
        int i;
 
        /*
                constraint->count = i + 1;
        }
 
+       snd_soc_set_runtime_hwparams(substream, &rsnd_pcm_hardware);
+
        snd_pcm_hw_constraint_list(runtime, 0,
                                   SNDRV_PCM_HW_PARAM_CHANNELS, constraint);
 
+       snd_pcm_hw_constraint_integer(runtime,
+                                     SNDRV_PCM_HW_PARAM_PERIODS);
+
        /*
         * Sampling Rate / Channel Limitation
         * It depends on Clock Master Mode
         */
-       if (!rsnd_rdai_is_clk_master(rdai))
-               return;
-
-       snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
-                           rsnd_soc_hw_rule_rate, dai,
-                           SNDRV_PCM_HW_PARAM_CHANNELS, -1);
-       snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
-                           rsnd_soc_hw_rule_channels, dai,
-                           SNDRV_PCM_HW_PARAM_RATE, -1);
-}
-
-static int rsnd_soc_dai_startup(struct snd_pcm_substream *substream,
-                               struct snd_soc_dai *dai)
-{
-       struct rsnd_dai *rdai = rsnd_dai_to_rdai(dai);
-       struct rsnd_priv *priv = rsnd_rdai_to_priv(rdai);
-       struct rsnd_dai_stream *io = rsnd_rdai_to_io(rdai, substream);
-       int ret;
-
-       /* rsnd_io_to_runtime() is not yet enabled here */
-       rsnd_soc_hw_constraint(substream->runtime, dai);
+       if (rsnd_rdai_is_clk_master(rdai)) {
+               snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
+                                   rsnd_soc_hw_rule_rate, dai,
+                                   SNDRV_PCM_HW_PARAM_CHANNELS, -1);
+               snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
+                                   rsnd_soc_hw_rule_channels, dai,
+                                   SNDRV_PCM_HW_PARAM_RATE, -1);
+       }
 
        /*
         * call rsnd_dai_call without spinlock
 /*
  *             pcm ops
  */
-static struct snd_pcm_hardware rsnd_pcm_hardware = {
-       .info =         SNDRV_PCM_INFO_INTERLEAVED      |
-                       SNDRV_PCM_INFO_MMAP             |
-                       SNDRV_PCM_INFO_MMAP_VALID,
-       .buffer_bytes_max       = 64 * 1024,
-       .period_bytes_min       = 32,
-       .period_bytes_max       = 8192,
-       .periods_min            = 1,
-       .periods_max            = 32,
-       .fifo_size              = 256,
-};
-
-static int rsnd_pcm_open(struct snd_pcm_substream *substream)
-{
-       struct snd_pcm_runtime *runtime = substream->runtime;
-       int ret = 0;
-
-       snd_soc_set_runtime_hwparams(substream, &rsnd_pcm_hardware);
-
-       ret = snd_pcm_hw_constraint_integer(runtime,
-                                           SNDRV_PCM_HW_PARAM_PERIODS);
-
-       return ret;
-}
-
 static int rsnd_hw_params(struct snd_pcm_substream *substream,
                         struct snd_pcm_hw_params *hw_params)
 {
 }
 
 static struct snd_pcm_ops rsnd_pcm_ops = {
-       .open           = rsnd_pcm_open,
        .ioctl          = snd_pcm_lib_ioctl,
        .hw_params      = rsnd_hw_params,
        .hw_free        = snd_pcm_lib_free_pages,