{ "TX", NULL, "Playback" },
 };
 
-static const struct snd_soc_codec_driver vc4_hdmi_audio_codec_drv = {
-       .component_driver = {
-               .controls = vc4_hdmi_audio_controls,
-               .num_controls = ARRAY_SIZE(vc4_hdmi_audio_controls),
-               .dapm_widgets = vc4_hdmi_audio_widgets,
-               .num_dapm_widgets = ARRAY_SIZE(vc4_hdmi_audio_widgets),
-               .dapm_routes = vc4_hdmi_audio_routes,
-               .num_dapm_routes = ARRAY_SIZE(vc4_hdmi_audio_routes),
-       },
+static const struct snd_soc_component_driver vc4_hdmi_audio_component_drv = {
+       .controls               = vc4_hdmi_audio_controls,
+       .num_controls           = ARRAY_SIZE(vc4_hdmi_audio_controls),
+       .dapm_widgets           = vc4_hdmi_audio_widgets,
+       .num_dapm_widgets       = ARRAY_SIZE(vc4_hdmi_audio_widgets),
+       .dapm_routes            = vc4_hdmi_audio_routes,
+       .num_dapm_routes        = ARRAY_SIZE(vc4_hdmi_audio_routes),
+       .idle_bias_on           = 1,
+       .use_pmdown_time        = 1,
+       .endianness             = 1,
+       .non_legacy_dai_naming  = 1,
 };
 
 static const struct snd_soc_dai_ops vc4_hdmi_audio_dai_ops = {
                return ret;
        }
 
-       /* register codec and codec dai */
-       ret = snd_soc_register_codec(dev, &vc4_hdmi_audio_codec_drv,
+       /* register component and codec dai */
+       ret = devm_snd_soc_register_component(dev, &vc4_hdmi_audio_component_drv,
                                     &vc4_hdmi_audio_codec_dai_drv, 1);
        if (ret) {
-               dev_err(dev, "Could not register codec: %d\n", ret);
+               dev_err(dev, "Could not register component: %d\n", ret);
                return ret;
        }
 
         */
        snd_soc_card_set_drvdata(card, hdmi);
        ret = devm_snd_soc_register_card(dev, card);
-       if (ret) {
+       if (ret)
                dev_err(dev, "Could not register sound card: %d\n", ret);
-               goto unregister_codec;
-       }
-
-       return 0;
-
-unregister_codec:
-       snd_soc_unregister_codec(dev);
 
        return ret;
-}
-
-static void vc4_hdmi_audio_cleanup(struct vc4_hdmi *hdmi)
-{
-       struct device *dev = &hdmi->pdev->dev;
 
-       /*
-        * If drvdata is not set this means the audio card was not
-        * registered, just skip codec unregistration in this case.
-        */
-       if (dev_get_drvdata(dev))
-               snd_soc_unregister_codec(dev);
 }
 
 #ifdef CONFIG_DRM_VC4_HDMI_CEC
        struct vc4_dev *vc4 = drm->dev_private;
        struct vc4_hdmi *hdmi = vc4->hdmi;
 
-       vc4_hdmi_audio_cleanup(hdmi);
        cec_unregister_adapter(hdmi->cec_adap);
        vc4_hdmi_connector_destroy(hdmi->connector);
        vc4_hdmi_encoder_destroy(hdmi->encoder);