static int pcm512x_overclock_pll_get(struct snd_kcontrol *kcontrol,
                                     struct snd_ctl_elem_value *ucontrol)
 {
-       struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
-       struct pcm512x_priv *pcm512x = snd_soc_codec_get_drvdata(codec);
+       struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
+       struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
 
        ucontrol->value.integer.value[0] = pcm512x->overclock_pll;
        return 0;
 static int pcm512x_overclock_pll_put(struct snd_kcontrol *kcontrol,
                                     struct snd_ctl_elem_value *ucontrol)
 {
-       struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
-       struct pcm512x_priv *pcm512x = snd_soc_codec_get_drvdata(codec);
+       struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
+       struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
 
-       switch (snd_soc_codec_get_bias_level(codec)) {
+       switch (snd_soc_component_get_bias_level(component)) {
        case SND_SOC_BIAS_OFF:
        case SND_SOC_BIAS_STANDBY:
                break;
 static int pcm512x_overclock_dsp_get(struct snd_kcontrol *kcontrol,
                                     struct snd_ctl_elem_value *ucontrol)
 {
-       struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
-       struct pcm512x_priv *pcm512x = snd_soc_codec_get_drvdata(codec);
+       struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
+       struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
 
        ucontrol->value.integer.value[0] = pcm512x->overclock_dsp;
        return 0;
 static int pcm512x_overclock_dsp_put(struct snd_kcontrol *kcontrol,
                                     struct snd_ctl_elem_value *ucontrol)
 {
-       struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
-       struct pcm512x_priv *pcm512x = snd_soc_codec_get_drvdata(codec);
+       struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
+       struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
 
-       switch (snd_soc_codec_get_bias_level(codec)) {
+       switch (snd_soc_component_get_bias_level(component)) {
        case SND_SOC_BIAS_OFF:
        case SND_SOC_BIAS_STANDBY:
                break;
 static int pcm512x_overclock_dac_get(struct snd_kcontrol *kcontrol,
                                     struct snd_ctl_elem_value *ucontrol)
 {
-       struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
-       struct pcm512x_priv *pcm512x = snd_soc_codec_get_drvdata(codec);
+       struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
+       struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
 
        ucontrol->value.integer.value[0] = pcm512x->overclock_dac;
        return 0;
 static int pcm512x_overclock_dac_put(struct snd_kcontrol *kcontrol,
                                     struct snd_ctl_elem_value *ucontrol)
 {
-       struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
-       struct pcm512x_priv *pcm512x = snd_soc_codec_get_drvdata(codec);
+       struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
+       struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
 
-       switch (snd_soc_codec_get_bias_level(codec)) {
+       switch (snd_soc_component_get_bias_level(component)) {
        case SND_SOC_BIAS_OFF:
        case SND_SOC_BIAS_STANDBY:
                break;
 static int pcm512x_dai_startup_master(struct snd_pcm_substream *substream,
                                      struct snd_soc_dai *dai)
 {
-       struct snd_soc_codec *codec = dai->codec;
-       struct pcm512x_priv *pcm512x = snd_soc_codec_get_drvdata(codec);
+       struct snd_soc_component *component = dai->component;
+       struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
        struct device *dev = dai->dev;
        struct snd_pcm_hw_constraint_ratnums *constraints_no_pll;
        struct snd_ratnum *rats_no_pll;
 static int pcm512x_dai_startup_slave(struct snd_pcm_substream *substream,
                                     struct snd_soc_dai *dai)
 {
-       struct snd_soc_codec *codec = dai->codec;
-       struct pcm512x_priv *pcm512x = snd_soc_codec_get_drvdata(codec);
+       struct snd_soc_component *component = dai->component;
+       struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
        struct device *dev = dai->dev;
        struct regmap *regmap = pcm512x->regmap;
 
 static int pcm512x_dai_startup(struct snd_pcm_substream *substream,
                               struct snd_soc_dai *dai)
 {
-       struct snd_soc_codec *codec = dai->codec;
-       struct pcm512x_priv *pcm512x = snd_soc_codec_get_drvdata(codec);
+       struct snd_soc_component *component = dai->component;
+       struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
 
        switch (pcm512x->fmt & SND_SOC_DAIFMT_MASTER_MASK) {
        case SND_SOC_DAIFMT_CBM_CFM:
        }
 }
 
-static int pcm512x_set_bias_level(struct snd_soc_codec *codec,
+static int pcm512x_set_bias_level(struct snd_soc_component *component,
                                  enum snd_soc_bias_level level)
 {
-       struct pcm512x_priv *pcm512x = dev_get_drvdata(codec->dev);
+       struct pcm512x_priv *pcm512x = dev_get_drvdata(component->dev);
        int ret;
 
        switch (level) {
                ret = regmap_update_bits(pcm512x->regmap, PCM512x_POWER,
                                         PCM512x_RQST, 0);
                if (ret != 0) {
-                       dev_err(codec->dev, "Failed to remove standby: %d\n",
+                       dev_err(component->dev, "Failed to remove standby: %d\n",
                                ret);
                        return ret;
                }
                ret = regmap_update_bits(pcm512x->regmap, PCM512x_POWER,
                                         PCM512x_RQST, PCM512x_RQST);
                if (ret != 0) {
-                       dev_err(codec->dev, "Failed to request standby: %d\n",
+                       dev_err(component->dev, "Failed to request standby: %d\n",
                                ret);
                        return ret;
                }
                                      unsigned long bclk_rate)
 {
        struct device *dev = dai->dev;
-       struct snd_soc_codec *codec = dai->codec;
-       struct pcm512x_priv *pcm512x = snd_soc_codec_get_drvdata(codec);
+       struct snd_soc_component *component = dai->component;
+       struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
        unsigned long sck_rate;
        int pow2;
 
                                  unsigned long pll_rate)
 {
        struct device *dev = dai->dev;
-       struct snd_soc_codec *codec = dai->codec;
-       struct pcm512x_priv *pcm512x = snd_soc_codec_get_drvdata(codec);
+       struct snd_soc_component *component = dai->component;
+       struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
        unsigned long common;
        int R, J, D, P;
        unsigned long K; /* 10000 * J.D */
                                            unsigned long osr_rate,
                                            unsigned long pllin_rate)
 {
-       struct snd_soc_codec *codec = dai->codec;
-       struct pcm512x_priv *pcm512x = snd_soc_codec_get_drvdata(codec);
+       struct snd_soc_component *component = dai->component;
+       struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
        unsigned long dac_rate;
 
        if (!pcm512x->pll_out)
                                struct snd_pcm_hw_params *params)
 {
        struct device *dev = dai->dev;
-       struct snd_soc_codec *codec = dai->codec;
-       struct pcm512x_priv *pcm512x = snd_soc_codec_get_drvdata(codec);
+       struct snd_soc_component *component = dai->component;
+       struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
        unsigned long pllin_rate = 0;
        unsigned long pll_rate;
        unsigned long sck_rate;
                ret = regmap_update_bits(pcm512x->regmap, PCM512x_DAC_REF,
                                         PCM512x_SDAC, PCM512x_SDAC_GPIO);
                if (ret != 0) {
-                       dev_err(codec->dev,
+                       dev_err(component->dev,
                                "Failed to set gpio as dacref: %d\n", ret);
                        return ret;
                }
                ret = regmap_update_bits(pcm512x->regmap, PCM512x_GPIO_DACIN,
                                         PCM512x_GREF, gpio);
                if (ret != 0) {
-                       dev_err(codec->dev,
+                       dev_err(component->dev,
                                "Failed to set gpio %d as dacin: %d\n",
                                pcm512x->pll_in, ret);
                        return ret;
                ret = regmap_update_bits(pcm512x->regmap, PCM512x_DAC_REF,
                                         PCM512x_SDAC, PCM512x_SDAC_SCK);
                if (ret != 0) {
-                       dev_err(codec->dev,
+                       dev_err(component->dev,
                                "Failed to set sck as dacref: %d\n", ret);
                        return ret;
                }
        ret = regmap_update_bits(pcm512x->regmap, PCM512x_FS_SPEED_MODE,
                                 PCM512x_FSSP, fssp);
        if (ret != 0) {
-               dev_err(codec->dev, "Failed to set fs speed: %d\n", ret);
+               dev_err(component->dev, "Failed to set fs speed: %d\n", ret);
                return ret;
        }
 
-       dev_dbg(codec->dev, "DSP divider %d\n", dsp_div);
-       dev_dbg(codec->dev, "DAC divider %d\n", dac_div);
-       dev_dbg(codec->dev, "NCP divider %d\n", ncp_div);
-       dev_dbg(codec->dev, "OSR divider %d\n", osr_div);
-       dev_dbg(codec->dev, "BCK divider %d\n", bclk_div);
-       dev_dbg(codec->dev, "LRCK divider %d\n", lrclk_div);
-       dev_dbg(codec->dev, "IDAC %d\n", idac);
-       dev_dbg(codec->dev, "1<<FSSP %d\n", 1 << fssp);
+       dev_dbg(component->dev, "DSP divider %d\n", dsp_div);
+       dev_dbg(component->dev, "DAC divider %d\n", dac_div);
+       dev_dbg(component->dev, "NCP divider %d\n", ncp_div);
+       dev_dbg(component->dev, "OSR divider %d\n", osr_div);
+       dev_dbg(component->dev, "BCK divider %d\n", bclk_div);
+       dev_dbg(component->dev, "LRCK divider %d\n", lrclk_div);
+       dev_dbg(component->dev, "IDAC %d\n", idac);
+       dev_dbg(component->dev, "1<<FSSP %d\n", 1 << fssp);
 
        return 0;
 }
                             struct snd_pcm_hw_params *params,
                             struct snd_soc_dai *dai)
 {
-       struct snd_soc_codec *codec = dai->codec;
-       struct pcm512x_priv *pcm512x = snd_soc_codec_get_drvdata(codec);
+       struct snd_soc_component *component = dai->component;
+       struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
        int alen;
        int gpio;
        int clock_output;
        int master_mode;
        int ret;
 
-       dev_dbg(codec->dev, "hw_params %u Hz, %u channels\n",
+       dev_dbg(component->dev, "hw_params %u Hz, %u channels\n",
                params_rate(params),
                params_channels(params));
 
                alen = PCM512x_ALEN_32;
                break;
        default:
-               dev_err(codec->dev, "Bad frame size: %d\n",
+               dev_err(component->dev, "Bad frame size: %d\n",
                        params_width(params));
                return -EINVAL;
        }
                                         | PCM512x_BCKO | PCM512x_LRKO,
                                         0);
                if (ret != 0) {
-                       dev_err(codec->dev,
+                       dev_err(component->dev,
                                "Failed to enable slave mode: %d\n", ret);
                        return ret;
                }
                ret = regmap_update_bits(pcm512x->regmap, PCM512x_ERROR_DETECT,
                                         PCM512x_DCAS, 0);
                if (ret != 0) {
-                       dev_err(codec->dev,
+                       dev_err(component->dev,
                                "Failed to enable clock divider autoset: %d\n",
                                ret);
                        return ret;
        ret = regmap_update_bits(pcm512x->regmap, PCM512x_I2S_1,
                                 PCM512x_ALEN, alen);
        if (ret != 0) {
-               dev_err(codec->dev, "Failed to set frame size: %d\n", ret);
+               dev_err(component->dev, "Failed to set frame size: %d\n", ret);
                return ret;
        }
 
        if (pcm512x->pll_out) {
                ret = regmap_write(pcm512x->regmap, PCM512x_FLEX_A, 0x11);
                if (ret != 0) {
-                       dev_err(codec->dev, "Failed to set FLEX_A: %d\n", ret);
+                       dev_err(component->dev, "Failed to set FLEX_A: %d\n", ret);
                        return ret;
                }
 
                ret = regmap_write(pcm512x->regmap, PCM512x_FLEX_B, 0xff);
                if (ret != 0) {
-                       dev_err(codec->dev, "Failed to set FLEX_B: %d\n", ret);
+                       dev_err(component->dev, "Failed to set FLEX_B: %d\n", ret);
                        return ret;
                }
 
                                         | PCM512x_IDSK | PCM512x_IDCH
                                         | PCM512x_DCAS);
                if (ret != 0) {
-                       dev_err(codec->dev,
+                       dev_err(component->dev,
                                "Failed to ignore auto-clock failures: %d\n",
                                ret);
                        return ret;
                                         | PCM512x_IDSK | PCM512x_IDCH
                                         | PCM512x_DCAS | PCM512x_IPLK);
                if (ret != 0) {
-                       dev_err(codec->dev,
+                       dev_err(component->dev,
                                "Failed to ignore auto-clock failures: %d\n",
                                ret);
                        return ret;
                ret = regmap_update_bits(pcm512x->regmap, PCM512x_PLL_EN,
                                         PCM512x_PLLE, 0);
                if (ret != 0) {
-                       dev_err(codec->dev, "Failed to disable pll: %d\n", ret);
+                       dev_err(component->dev, "Failed to disable pll: %d\n", ret);
                        return ret;
                }
        }
                ret = regmap_update_bits(pcm512x->regmap, PCM512x_PLL_REF,
                                         PCM512x_SREF, PCM512x_SREF_GPIO);
                if (ret != 0) {
-                       dev_err(codec->dev,
+                       dev_err(component->dev,
                                "Failed to set gpio as pllref: %d\n", ret);
                        return ret;
                }
                ret = regmap_update_bits(pcm512x->regmap, PCM512x_GPIO_PLLIN,
                                         PCM512x_GREF, gpio);
                if (ret != 0) {
-                       dev_err(codec->dev,
+                       dev_err(component->dev,
                                "Failed to set gpio %d as pllin: %d\n",
                                pcm512x->pll_in, ret);
                        return ret;
                ret = regmap_update_bits(pcm512x->regmap, PCM512x_PLL_EN,
                                         PCM512x_PLLE, PCM512x_PLLE);
                if (ret != 0) {
-                       dev_err(codec->dev, "Failed to enable pll: %d\n", ret);
+                       dev_err(component->dev, "Failed to enable pll: %d\n", ret);
                        return ret;
                }
        }
                                 PCM512x_BCKP | PCM512x_BCKO | PCM512x_LRKO,
                                 clock_output);
        if (ret != 0) {
-               dev_err(codec->dev, "Failed to enable clock output: %d\n", ret);
+               dev_err(component->dev, "Failed to enable clock output: %d\n", ret);
                return ret;
        }
 
                                 PCM512x_RLRK | PCM512x_RBCK,
                                 master_mode);
        if (ret != 0) {
-               dev_err(codec->dev, "Failed to enable master mode: %d\n", ret);
+               dev_err(component->dev, "Failed to enable master mode: %d\n", ret);
                return ret;
        }
 
                ret = regmap_update_bits(pcm512x->regmap, PCM512x_GPIO_EN,
                                         gpio, gpio);
                if (ret != 0) {
-                       dev_err(codec->dev, "Failed to enable gpio %d: %d\n",
+                       dev_err(component->dev, "Failed to enable gpio %d: %d\n",
                                pcm512x->pll_out, ret);
                        return ret;
                }
                ret = regmap_update_bits(pcm512x->regmap, gpio,
                                         PCM512x_GxSL, PCM512x_GxSL_PLLCK);
                if (ret != 0) {
-                       dev_err(codec->dev, "Failed to output pll on %d: %d\n",
+                       dev_err(component->dev, "Failed to output pll on %d: %d\n",
                                ret, pcm512x->pll_out);
                        return ret;
                }
        ret = regmap_update_bits(pcm512x->regmap, PCM512x_SYNCHRONIZE,
                                 PCM512x_RQSY, PCM512x_RQSY_HALT);
        if (ret != 0) {
-               dev_err(codec->dev, "Failed to halt clocks: %d\n", ret);
+               dev_err(component->dev, "Failed to halt clocks: %d\n", ret);
                return ret;
        }
 
        ret = regmap_update_bits(pcm512x->regmap, PCM512x_SYNCHRONIZE,
                                 PCM512x_RQSY, PCM512x_RQSY_RESUME);
        if (ret != 0) {
-               dev_err(codec->dev, "Failed to resume clocks: %d\n", ret);
+               dev_err(component->dev, "Failed to resume clocks: %d\n", ret);
                return ret;
        }
 
 
 static int pcm512x_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
 {
-       struct snd_soc_codec *codec = dai->codec;
-       struct pcm512x_priv *pcm512x = snd_soc_codec_get_drvdata(codec);
+       struct snd_soc_component *component = dai->component;
+       struct pcm512x_priv *pcm512x = snd_soc_component_get_drvdata(component);
 
        pcm512x->fmt = fmt;
 
        .ops = &pcm512x_dai_ops,
 };
 
-static const struct snd_soc_codec_driver pcm512x_codec_driver = {
-       .set_bias_level = pcm512x_set_bias_level,
-       .idle_bias_off = true,
-
-       .component_driver = {
-               .controls               = pcm512x_controls,
-               .num_controls           = ARRAY_SIZE(pcm512x_controls),
-               .dapm_widgets           = pcm512x_dapm_widgets,
-               .num_dapm_widgets       = ARRAY_SIZE(pcm512x_dapm_widgets),
-               .dapm_routes            = pcm512x_dapm_routes,
-               .num_dapm_routes        = ARRAY_SIZE(pcm512x_dapm_routes),
-       },
+static const struct snd_soc_component_driver pcm512x_component_driver = {
+       .set_bias_level         = pcm512x_set_bias_level,
+       .controls               = pcm512x_controls,
+       .num_controls           = ARRAY_SIZE(pcm512x_controls),
+       .dapm_widgets           = pcm512x_dapm_widgets,
+       .num_dapm_widgets       = ARRAY_SIZE(pcm512x_dapm_widgets),
+       .dapm_routes            = pcm512x_dapm_routes,
+       .num_dapm_routes        = ARRAY_SIZE(pcm512x_dapm_routes),
+       .use_pmdown_time        = 1,
+       .endianness             = 1,
+       .non_legacy_dai_naming  = 1,
 };
 
 static const struct regmap_range_cfg pcm512x_range = {
        }
 #endif
 
-       ret = snd_soc_register_codec(dev, &pcm512x_codec_driver,
+       ret = devm_snd_soc_register_component(dev, &pcm512x_component_driver,
                                    &pcm512x_dai, 1);
        if (ret != 0) {
                dev_err(dev, "Failed to register CODEC: %d\n", ret);
 {
        struct pcm512x_priv *pcm512x = dev_get_drvdata(dev);
 
-       snd_soc_unregister_codec(dev);
        pm_runtime_disable(dev);
        if (!IS_ERR(pcm512x->sclk))
                clk_disable_unprepare(pcm512x->sclk);