{ "Mic1", NULL, "VMIC" },
 };
 
-static const struct snd_soc_codec_driver sun4i_codec_codec = {
-       .component_driver = {
-               .controls               = sun4i_codec_controls,
-               .num_controls           = ARRAY_SIZE(sun4i_codec_controls),
-               .dapm_widgets           = sun4i_codec_codec_dapm_widgets,
-               .num_dapm_widgets       = ARRAY_SIZE(sun4i_codec_codec_dapm_widgets),
-               .dapm_routes            = sun4i_codec_codec_dapm_routes,
-               .num_dapm_routes        = ARRAY_SIZE(sun4i_codec_codec_dapm_routes),
-       },
+static const struct snd_soc_component_driver sun4i_codec_codec = {
+       .controls               = sun4i_codec_controls,
+       .num_controls           = ARRAY_SIZE(sun4i_codec_controls),
+       .dapm_widgets           = sun4i_codec_codec_dapm_widgets,
+       .num_dapm_widgets       = ARRAY_SIZE(sun4i_codec_codec_dapm_widgets),
+       .dapm_routes            = sun4i_codec_codec_dapm_routes,
+       .num_dapm_routes        = ARRAY_SIZE(sun4i_codec_codec_dapm_routes),
+       .idle_bias_on           = 1,
+       .use_pmdown_time        = 1,
+       .endianness             = 1,
+       .non_legacy_dai_naming  = 1,
 };
 
 /*** sun6i Codec ***/
        { "Right ADC", NULL, "Right ADC Mixer" },
 };
 
-static const struct snd_soc_codec_driver sun6i_codec_codec = {
-       .component_driver = {
-               .controls               = sun6i_codec_codec_widgets,
-               .num_controls           = ARRAY_SIZE(sun6i_codec_codec_widgets),
-               .dapm_widgets           = sun6i_codec_codec_dapm_widgets,
-               .num_dapm_widgets       = ARRAY_SIZE(sun6i_codec_codec_dapm_widgets),
-               .dapm_routes            = sun6i_codec_codec_dapm_routes,
-               .num_dapm_routes        = ARRAY_SIZE(sun6i_codec_codec_dapm_routes),
-       },
+static const struct snd_soc_component_driver sun6i_codec_codec = {
+       .controls               = sun6i_codec_codec_widgets,
+       .num_controls           = ARRAY_SIZE(sun6i_codec_codec_widgets),
+       .dapm_widgets           = sun6i_codec_codec_dapm_widgets,
+       .num_dapm_widgets       = ARRAY_SIZE(sun6i_codec_codec_dapm_widgets),
+       .dapm_routes            = sun6i_codec_codec_dapm_routes,
+       .num_dapm_routes        = ARRAY_SIZE(sun6i_codec_codec_dapm_routes),
+       .idle_bias_on           = 1,
+       .use_pmdown_time        = 1,
+       .endianness             = 1,
+       .non_legacy_dai_naming  = 1,
 };
 
 /* sun8i A23 codec */
 
 };
 
-static const struct snd_soc_codec_driver sun8i_a23_codec_codec = {
-       .component_driver = {
-               .controls               = sun8i_a23_codec_codec_controls,
-               .num_controls           = ARRAY_SIZE(sun8i_a23_codec_codec_controls),
-               .dapm_widgets           = sun8i_a23_codec_codec_widgets,
-               .num_dapm_widgets       = ARRAY_SIZE(sun8i_a23_codec_codec_widgets),
-       },
+static const struct snd_soc_component_driver sun8i_a23_codec_codec = {
+       .controls               = sun8i_a23_codec_codec_controls,
+       .num_controls           = ARRAY_SIZE(sun8i_a23_codec_codec_controls),
+       .dapm_widgets           = sun8i_a23_codec_codec_widgets,
+       .num_dapm_widgets       = ARRAY_SIZE(sun8i_a23_codec_codec_widgets),
+       .idle_bias_on           = 1,
+       .use_pmdown_time        = 1,
+       .endianness             = 1,
+       .non_legacy_dai_naming  = 1,
 };
 
 static const struct snd_soc_component_driver sun4i_codec_component = {
 
 struct sun4i_codec_quirks {
        const struct regmap_config *regmap_config;
-       const struct snd_soc_codec_driver *codec;
+       const struct snd_soc_component_driver *codec;
        struct snd_soc_card * (*create_card)(struct device *dev);
        struct reg_field reg_adc_fifoc; /* used for regmap_field */
        unsigned int reg_dac_txdata;    /* TX FIFO offset for DMA config */
        scodec->capture_dma_data.maxburst = 8;
        scodec->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES;
 
-       ret = snd_soc_register_codec(&pdev->dev, quirks->codec,
+       ret = devm_snd_soc_register_component(&pdev->dev, quirks->codec,
                                     &sun4i_codec_dai, 1);
        if (ret) {
                dev_err(&pdev->dev, "Failed to register our codec\n");
                                              &dummy_cpu_dai, 1);
        if (ret) {
                dev_err(&pdev->dev, "Failed to register our DAI\n");
-               goto err_unregister_codec;
+               goto err_assert_reset;
        }
 
        ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
        if (ret) {
                dev_err(&pdev->dev, "Failed to register against DMAEngine\n");
-               goto err_unregister_codec;
+               goto err_assert_reset;
        }
 
        card = quirks->create_card(&pdev->dev);
        if (IS_ERR(card)) {
                ret = PTR_ERR(card);
                dev_err(&pdev->dev, "Failed to create our card\n");
-               goto err_unregister_codec;
+               goto err_assert_reset;
        }
 
        snd_soc_card_set_drvdata(card, scodec);
        ret = snd_soc_register_card(card);
        if (ret) {
                dev_err(&pdev->dev, "Failed to register our card\n");
-               goto err_unregister_codec;
+               goto err_assert_reset;
        }
 
        return 0;
 
-err_unregister_codec:
-       snd_soc_unregister_codec(&pdev->dev);
 err_assert_reset:
        if (scodec->rst)
                reset_control_assert(scodec->rst);
        struct sun4i_codec *scodec = snd_soc_card_get_drvdata(card);
 
        snd_soc_unregister_card(card);
-       snd_soc_unregister_codec(&pdev->dev);
        if (scodec->rst)
                reset_control_assert(scodec->rst);
        clk_disable_unprepare(scodec->clk_apb);