static int evea_get_switch_lin(struct snd_kcontrol *kcontrol,
                               struct snd_ctl_elem_value *ucontrol)
 {
-       struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
-       struct evea_priv *evea = snd_soc_codec_get_drvdata(codec);
+       struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
+       struct evea_priv *evea = snd_soc_component_get_drvdata(component);
 
        ucontrol->value.integer.value[0] = evea->switch_lin;
 
 static int evea_set_switch_lin(struct snd_kcontrol *kcontrol,
                               struct snd_ctl_elem_value *ucontrol)
 {
-       struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
-       struct evea_priv *evea = snd_soc_codec_get_drvdata(codec);
+       struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
+       struct evea_priv *evea = snd_soc_component_get_drvdata(component);
 
        if (evea->switch_lin == ucontrol->value.integer.value[0])
                return 0;
 static int evea_get_switch_lo(struct snd_kcontrol *kcontrol,
                              struct snd_ctl_elem_value *ucontrol)
 {
-       struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
-       struct evea_priv *evea = snd_soc_codec_get_drvdata(codec);
+       struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
+       struct evea_priv *evea = snd_soc_component_get_drvdata(component);
 
        ucontrol->value.integer.value[0] = evea->switch_lo;
 
 static int evea_set_switch_lo(struct snd_kcontrol *kcontrol,
                              struct snd_ctl_elem_value *ucontrol)
 {
-       struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
-       struct evea_priv *evea = snd_soc_codec_get_drvdata(codec);
+       struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
+       struct evea_priv *evea = snd_soc_component_get_drvdata(component);
 
        if (evea->switch_lo == ucontrol->value.integer.value[0])
                return 0;
 static int evea_get_switch_hp(struct snd_kcontrol *kcontrol,
                              struct snd_ctl_elem_value *ucontrol)
 {
-       struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
-       struct evea_priv *evea = snd_soc_codec_get_drvdata(codec);
+       struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
+       struct evea_priv *evea = snd_soc_component_get_drvdata(component);
 
        ucontrol->value.integer.value[0] = evea->switch_hp;
 
 static int evea_set_switch_hp(struct snd_kcontrol *kcontrol,
                              struct snd_ctl_elem_value *ucontrol)
 {
-       struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
-       struct evea_priv *evea = snd_soc_codec_get_drvdata(codec);
+       struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
+       struct evea_priv *evea = snd_soc_component_get_drvdata(component);
 
        if (evea->switch_hp == ucontrol->value.integer.value[0])
                return 0;
                            evea_get_switch_hp, evea_set_switch_hp),
 };
 
-static int evea_codec_probe(struct snd_soc_codec *codec)
+static int evea_codec_probe(struct snd_soc_component *component)
 {
-       struct evea_priv *evea = snd_soc_codec_get_drvdata(codec);
+       struct evea_priv *evea = snd_soc_component_get_drvdata(component);
 
        evea->switch_lin = 1;
        evea->switch_lo = 1;
        return 0;
 }
 
-static int evea_codec_suspend(struct snd_soc_codec *codec)
+static int evea_codec_suspend(struct snd_soc_component *component)
 {
-       struct evea_priv *evea = snd_soc_codec_get_drvdata(codec);
+       struct evea_priv *evea = snd_soc_component_get_drvdata(component);
 
        evea_set_power_state_off(evea);
 
        return 0;
 }
 
-static int evea_codec_resume(struct snd_soc_codec *codec)
+static int evea_codec_resume(struct snd_soc_component *component)
 {
-       struct evea_priv *evea = snd_soc_codec_get_drvdata(codec);
+       struct evea_priv *evea = snd_soc_component_get_drvdata(component);
        int ret;
 
        ret = clk_prepare_enable(evea->clk);
        return ret;
 }
 
-static struct snd_soc_codec_driver soc_codec_evea = {
-       .probe   = evea_codec_probe,
-       .suspend = evea_codec_suspend,
-       .resume  = evea_codec_resume,
-
-       .component_driver = {
-               .dapm_widgets = evea_widgets,
-               .num_dapm_widgets = ARRAY_SIZE(evea_widgets),
-               .dapm_routes = evea_routes,
-               .num_dapm_routes = ARRAY_SIZE(evea_routes),
-               .controls = eva_controls,
-               .num_controls = ARRAY_SIZE(eva_controls),
-       },
+static struct snd_soc_component_driver soc_codec_evea = {
+       .probe                  = evea_codec_probe,
+       .suspend                = evea_codec_suspend,
+       .resume                 = evea_codec_resume,
+       .dapm_widgets           = evea_widgets,
+       .num_dapm_widgets       = ARRAY_SIZE(evea_widgets),
+       .dapm_routes            = evea_routes,
+       .num_dapm_routes        = ARRAY_SIZE(evea_routes),
+       .controls               = eva_controls,
+       .num_controls           = ARRAY_SIZE(eva_controls),
+       .idle_bias_on           = 1,
+       .use_pmdown_time        = 1,
+       .endianness             = 1,
+       .non_legacy_dai_naming  = 1,
 };
 
 static struct snd_soc_dai_driver soc_dai_evea[] = {
 
        platform_set_drvdata(pdev, evea);
 
-       ret = snd_soc_register_codec(&pdev->dev, &soc_codec_evea,
+       ret = devm_snd_soc_register_component(&pdev->dev, &soc_codec_evea,
                                     soc_dai_evea, ARRAY_SIZE(soc_dai_evea));
        if (ret)
                goto err_out_reset_adamv;
 {
        struct evea_priv *evea = platform_get_drvdata(pdev);
 
-       snd_soc_unregister_codec(&pdev->dev);
-
        reset_control_assert(evea->rst_adamv);
        reset_control_assert(evea->rst_exiv);
        reset_control_assert(evea->rst);