static int tas5086_deemph[] = { 0, 32000, 44100, 48000 };
 
-static int tas5086_set_deemph(struct snd_soc_codec *codec)
+static int tas5086_set_deemph(struct snd_soc_component *component)
 {
-       struct tas5086_private *priv = snd_soc_codec_get_drvdata(codec);
+       struct tas5086_private *priv = snd_soc_component_get_drvdata(component);
        int i, val = 0;
 
        if (priv->deemph) {
 static int tas5086_get_deemph(struct snd_kcontrol *kcontrol,
                              struct snd_ctl_elem_value *ucontrol)
 {
-       struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
-       struct tas5086_private *priv = snd_soc_codec_get_drvdata(codec);
+       struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
+       struct tas5086_private *priv = snd_soc_component_get_drvdata(component);
 
        ucontrol->value.integer.value[0] = priv->deemph;
 
 static int tas5086_put_deemph(struct snd_kcontrol *kcontrol,
                              struct snd_ctl_elem_value *ucontrol)
 {
-       struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
-       struct tas5086_private *priv = snd_soc_codec_get_drvdata(codec);
+       struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
+       struct tas5086_private *priv = snd_soc_component_get_drvdata(component);
 
        priv->deemph = ucontrol->value.integer.value[0];
 
-       return tas5086_set_deemph(codec);
+       return tas5086_set_deemph(component);
 }
 
 
 static int tas5086_set_dai_sysclk(struct snd_soc_dai *codec_dai,
                                  int clk_id, unsigned int freq, int dir)
 {
-       struct snd_soc_codec *codec = codec_dai->codec;
-       struct tas5086_private *priv = snd_soc_codec_get_drvdata(codec);
+       struct snd_soc_component *component = codec_dai->component;
+       struct tas5086_private *priv = snd_soc_component_get_drvdata(component);
 
        switch (clk_id) {
        case TAS5086_CLK_IDX_MCLK:
 static int tas5086_set_dai_fmt(struct snd_soc_dai *codec_dai,
                               unsigned int format)
 {
-       struct snd_soc_codec *codec = codec_dai->codec;
-       struct tas5086_private *priv = snd_soc_codec_get_drvdata(codec);
+       struct snd_soc_component *component = codec_dai->component;
+       struct tas5086_private *priv = snd_soc_component_get_drvdata(component);
 
        /* The TAS5086 can only be slave to all clocks */
        if ((format & SND_SOC_DAIFMT_MASTER_MASK) != SND_SOC_DAIFMT_CBS_CFS) {
-               dev_err(codec->dev, "Invalid clocking mode\n");
+               dev_err(component->dev, "Invalid clocking mode\n");
                return -EINVAL;
        }
 
                             struct snd_pcm_hw_params *params,
                             struct snd_soc_dai *dai)
 {
-       struct snd_soc_codec *codec = dai->codec;
-       struct tas5086_private *priv = snd_soc_codec_get_drvdata(codec);
+       struct snd_soc_component *component = dai->component;
+       struct tas5086_private *priv = snd_soc_component_get_drvdata(component);
        int val;
        int ret;
 
                             ARRAY_SIZE(tas5086_sample_rates), priv->rate);
 
        if (val < 0) {
-               dev_err(codec->dev, "Invalid sample rate\n");
+               dev_err(component->dev, "Invalid sample rate\n");
                return -EINVAL;
        }
 
        val = index_in_array(tas5086_ratios, ARRAY_SIZE(tas5086_ratios),
                             priv->mclk / priv->rate);
        if (val < 0) {
-               dev_err(codec->dev, "Invalid MCLK / Fs ratio\n");
+               dev_err(component->dev, "Invalid MCLK / Fs ratio\n");
                return -EINVAL;
        }
 
                val = 0x06;
                break;
        default:
-               dev_err(codec->dev, "Invalid DAI format\n");
+               dev_err(component->dev, "Invalid DAI format\n");
                return -EINVAL;
        }
 
                val += 2;
                break;
        default:
-               dev_err(codec->dev, "Invalid bit width\n");
+               dev_err(component->dev, "Invalid bit width\n");
                return -EINVAL;
        }
 
        if (ret < 0)
                return ret;
 
-       return tas5086_set_deemph(codec);
+       return tas5086_set_deemph(component);
 }
 
 static int tas5086_mute_stream(struct snd_soc_dai *dai, int mute, int stream)
 {
-       struct snd_soc_codec *codec = dai->codec;
-       struct tas5086_private *priv = snd_soc_codec_get_drvdata(codec);
+       struct snd_soc_component *component = dai->component;
+       struct tas5086_private *priv = snd_soc_component_get_drvdata(component);
        unsigned int val = 0;
 
        if (mute)
 };
 
 #ifdef CONFIG_PM
-static int tas5086_soc_suspend(struct snd_soc_codec *codec)
+static int tas5086_soc_suspend(struct snd_soc_component *component)
 {
-       struct tas5086_private *priv = snd_soc_codec_get_drvdata(codec);
+       struct tas5086_private *priv = snd_soc_component_get_drvdata(component);
        int ret;
 
        /* Shut down all channels */
        return 0;
 }
 
-static int tas5086_soc_resume(struct snd_soc_codec *codec)
+static int tas5086_soc_resume(struct snd_soc_component *component)
 {
-       struct tas5086_private *priv = snd_soc_codec_get_drvdata(codec);
+       struct tas5086_private *priv = snd_soc_component_get_drvdata(component);
        int ret;
 
        ret = regulator_bulk_enable(ARRAY_SIZE(priv->supplies), priv->supplies);
        tas5086_reset(priv);
        regcache_mark_dirty(priv->regmap);
 
-       ret = tas5086_init(codec->dev, priv);
+       ret = tas5086_init(component->dev, priv);
        if (ret < 0)
                return ret;
 
 MODULE_DEVICE_TABLE(of, tas5086_dt_ids);
 #endif
 
-static int tas5086_probe(struct snd_soc_codec *codec)
+static int tas5086_probe(struct snd_soc_component *component)
 {
-       struct tas5086_private *priv = snd_soc_codec_get_drvdata(codec);
+       struct tas5086_private *priv = snd_soc_component_get_drvdata(component);
        int i, ret;
 
        ret = regulator_bulk_enable(ARRAY_SIZE(priv->supplies), priv->supplies);
        if (ret < 0) {
-               dev_err(codec->dev, "Failed to enable regulators: %d\n", ret);
+               dev_err(component->dev, "Failed to enable regulators: %d\n", ret);
                return ret;
        }
 
        priv->pwm_start_mid_z = 0;
        priv->charge_period = 1300000; /* hardware default is 1300 ms */
 
-       if (of_match_device(of_match_ptr(tas5086_dt_ids), codec->dev)) {
-               struct device_node *of_node = codec->dev->of_node;
+       if (of_match_device(of_match_ptr(tas5086_dt_ids), component->dev)) {
+               struct device_node *of_node = component->dev->of_node;
 
                of_property_read_u32(of_node, "ti,charge-period",
                                     &priv->charge_period);
        }
 
        tas5086_reset(priv);
-       ret = tas5086_init(codec->dev, priv);
+       ret = tas5086_init(component->dev, priv);
        if (ret < 0)
                goto exit_disable_regulators;
 
        return ret;
 }
 
-static int tas5086_remove(struct snd_soc_codec *codec)
+static void tas5086_remove(struct snd_soc_component *component)
 {
-       struct tas5086_private *priv = snd_soc_codec_get_drvdata(codec);
+       struct tas5086_private *priv = snd_soc_component_get_drvdata(component);
 
        if (gpio_is_valid(priv->gpio_nreset))
                /* Set codec to the reset state */
                gpio_set_value(priv->gpio_nreset, 0);
 
        regulator_bulk_disable(ARRAY_SIZE(priv->supplies), priv->supplies);
-
-       return 0;
 };
 
-static const struct snd_soc_codec_driver soc_codec_dev_tas5086 = {
+static const struct snd_soc_component_driver soc_component_dev_tas5086 = {
        .probe                  = tas5086_probe,
        .remove                 = tas5086_remove,
        .suspend                = tas5086_soc_suspend,
        .resume                 = tas5086_soc_resume,
-       .component_driver = {
-               .controls               = tas5086_controls,
-               .num_controls           = ARRAY_SIZE(tas5086_controls),
-               .dapm_widgets           = tas5086_dapm_widgets,
-               .num_dapm_widgets       = ARRAY_SIZE(tas5086_dapm_widgets),
-               .dapm_routes            = tas5086_dapm_routes,
-               .num_dapm_routes        = ARRAY_SIZE(tas5086_dapm_routes),
-       },
+       .controls               = tas5086_controls,
+       .num_controls           = ARRAY_SIZE(tas5086_controls),
+       .dapm_widgets           = tas5086_dapm_widgets,
+       .num_dapm_widgets       = ARRAY_SIZE(tas5086_dapm_widgets),
+       .dapm_routes            = tas5086_dapm_routes,
+       .num_dapm_routes        = ARRAY_SIZE(tas5086_dapm_routes),
+       .idle_bias_on           = 1,
+       .use_pmdown_time        = 1,
+       .endianness             = 1,
+       .non_legacy_dai_naming  = 1,
 };
 
 static const struct i2c_device_id tas5086_i2c_id[] = {
        regulator_bulk_disable(ARRAY_SIZE(priv->supplies), priv->supplies);
 
        if (ret == 0)
-               ret = snd_soc_register_codec(&i2c->dev, &soc_codec_dev_tas5086,
+               ret = devm_snd_soc_register_component(&i2c->dev,
+                                            &soc_component_dev_tas5086,
                                             &tas5086_dai, 1);
 
        return ret;
 
 static int tas5086_i2c_remove(struct i2c_client *i2c)
 {
-       snd_soc_unregister_codec(&i2c->dev);
        return 0;
 }