static int jz4740_i2s_dai_probe(struct snd_soc_dai *dai)
 {
        struct jz4740_i2s *i2s = snd_soc_dai_get_drvdata(dai);
-       int ret;
-
-       ret = clk_prepare_enable(i2s->clk_aic);
-       if (ret)
-               return ret;
 
        snd_soc_dai_init_dma_data(dai, &i2s->playback_dma_data,
                &i2s->capture_dma_data);
 
-       regmap_write(i2s->regmap, JZ_REG_AIC_CONF, JZ_AIC_CONF_RESET);
-
-       regmap_write(i2s->regmap, JZ_REG_AIC_CONF,
-                    JZ_AIC_CONF_OVERFLOW_PLAY_LAST |
-                    JZ_AIC_CONF_I2S | JZ_AIC_CONF_INTERNAL_CODEC);
-
-       regmap_field_write(i2s->field_rx_fifo_thresh, 7);
-       regmap_field_write(i2s->field_tx_fifo_thresh, 8);
-
-       return 0;
-}
-
-static int jz4740_i2s_dai_remove(struct snd_soc_dai *dai)
-{
-       struct jz4740_i2s *i2s = snd_soc_dai_get_drvdata(dai);
-
-       clk_disable_unprepare(i2s->clk_aic);
        return 0;
 }
 
 
 static struct snd_soc_dai_driver jz4740_i2s_dai = {
        .probe = jz4740_i2s_dai_probe,
-       .remove = jz4740_i2s_dai_remove,
        .playback = {
                .channels_min = 1,
                .channels_max = 2,
 
 static struct snd_soc_dai_driver jz4770_i2s_dai = {
        .probe = jz4740_i2s_dai_probe,
-       .remove = jz4740_i2s_dai_remove,
        .playback = {
                .channels_min = 1,
                .channels_max = 2,
        return 0;
 }
 
+static int jz4740_i2s_probe(struct snd_soc_component *component)
+{
+       struct jz4740_i2s *i2s = snd_soc_component_get_drvdata(component);
+       int ret;
+
+       ret = clk_prepare_enable(i2s->clk_aic);
+       if (ret)
+               return ret;
+
+       regmap_write(i2s->regmap, JZ_REG_AIC_CONF, JZ_AIC_CONF_RESET);
+
+       regmap_write(i2s->regmap, JZ_REG_AIC_CONF,
+                    JZ_AIC_CONF_OVERFLOW_PLAY_LAST |
+                    JZ_AIC_CONF_I2S | JZ_AIC_CONF_INTERNAL_CODEC);
+
+       regmap_field_write(i2s->field_rx_fifo_thresh, 7);
+       regmap_field_write(i2s->field_tx_fifo_thresh, 8);
+
+       return 0;
+}
+
+static void jz4740_i2s_remove(struct snd_soc_component *component)
+{
+       struct jz4740_i2s *i2s = snd_soc_component_get_drvdata(component);
+
+       clk_disable_unprepare(i2s->clk_aic);
+}
+
 static const struct snd_soc_component_driver jz4740_i2s_component = {
        .name                   = "jz4740-i2s",
+       .probe                  = jz4740_i2s_probe,
+       .remove                 = jz4740_i2s_remove,
        .suspend                = jz4740_i2s_suspend,
        .resume                 = jz4740_i2s_resume,
        .legacy_dai_naming      = 1,