#include <linux/io.h>
 #include <linux/module.h>
 #include <linux/of.h>
-#include <linux/of_device.h>
 #include <sound/dmaengine_pcm.h>
 #include <sound/pcm.h>
 #include <sound/pcm_params.h>
 {
        struct device_node *np = pdev->dev.of_node;
        struct snd_soc_dai_driver *kmb_i2s_dai;
-       const struct of_device_id *match;
        struct device *dev = &pdev->dev;
        struct kmb_i2s_info *kmb_i2s;
        struct resource *res;
        if (!kmb_i2s)
                return -ENOMEM;
 
-       kmb_i2s_dai = devm_kzalloc(dev, sizeof(*kmb_i2s_dai), GFP_KERNEL);
-       if (!kmb_i2s_dai)
-               return -ENOMEM;
-
-       match = of_match_device(kmb_plat_of_match, &pdev->dev);
-       if (!match) {
-               dev_err(&pdev->dev, "Error: No device match found\n");
-               return -ENODEV;
-       }
-       kmb_i2s_dai = (struct snd_soc_dai_driver *) match->data;
+       kmb_i2s_dai = (struct snd_soc_dai_driver *)device_get_match_data(&pdev->dev);
 
        /* Prepare the related clocks */
        kmb_i2s->clk_apb = devm_clk_get(dev, "apb_clk");
 
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/of.h>
-#include <linux/of_device.h>
 #include <linux/platform_device.h>
 #include <sound/pcm.h>
 #include <sound/pcm_params.h>
        struct resource *res;
        const struct lpass_variant *variant;
        struct device *dev = &pdev->dev;
-       const struct of_device_id *match;
        int ret, i, dai_id;
 
        dsp_of_node = of_parse_phandle(pdev->dev.of_node, "qcom,adsp", 0);
                return -ENOMEM;
        platform_set_drvdata(pdev, drvdata);
 
-       match = of_match_device(dev->driver->of_match_table, dev);
-       if (!match || !match->data)
+       variant = device_get_match_data(dev);
+       if (!variant)
                return -EINVAL;
 
-       if (of_device_is_compatible(dev->of_node, "qcom,lpass-cpu-apq8016")) {
-               dev_warn(dev, "%s compatible is deprecated\n",
-                        match->compatible);
-       }
+       if (of_device_is_compatible(dev->of_node, "qcom,lpass-cpu-apq8016"))
+               dev_warn(dev, "qcom,lpass-cpu-apq8016 compatible is deprecated\n");
 
-       drvdata->variant = (struct lpass_variant *)match->data;
-       variant = drvdata->variant;
+       drvdata->variant = variant;
 
        of_lpass_cpu_parse_dai_data(dev, drvdata);
 
 
 #include <linux/module.h>
 #include <linux/mfd/syscon.h>
 #include <linux/delay.h>
+#include <linux/of.h>
 #include <linux/of_gpio.h>
-#include <linux/of_device.h>
 #include <linux/clk.h>
 #include <linux/pinctrl/consumer.h>
 #include <linux/pm_runtime.h>
 static int rockchip_i2s_probe(struct platform_device *pdev)
 {
        struct device_node *node = pdev->dev.of_node;
-       const struct of_device_id *of_id;
        struct rk_i2s_dev *i2s;
        struct snd_soc_dai_driver *dai;
        struct resource *res;
 
        i2s->grf = syscon_regmap_lookup_by_phandle(node, "rockchip,grf");
        if (!IS_ERR(i2s->grf)) {
-               of_id = of_match_device(rockchip_i2s_match, &pdev->dev);
-               if (!of_id || !of_id->data)
+               i2s->pins = device_get_match_data(&pdev->dev);
+               if (!i2s->pins)
                        return -EINVAL;
 
-               i2s->pins = of_id->data;
        }
 
        /* try to prepare related clocks */
 
 #include <linux/delay.h>
 #include <linux/mfd/syscon.h>
 #include <linux/module.h>
-#include <linux/of_address.h>
-#include <linux/of_device.h>
-#include <linux/of_gpio.h>
+#include <linux/of.h>
 #include <linux/pm_runtime.h>
 #include <linux/regmap.h>
 #include <linux/reset.h>
        struct snd_dmaengine_dai_dma_data playback_dma_data;
        struct reset_control *tx_reset;
        struct reset_control *rx_reset;
-       struct rk_i2s_soc_data *soc_data;
+       const struct rk_i2s_soc_data *soc_data;
        bool is_master_mode;
        bool io_multiplex;
        bool mclk_calibrate;
        { 0xff800000, 0x10260, RV1126_I2S0_CLK_TXONLY, RV1126_I2S0_CLK_RXONLY },
 };
 
-static struct rk_i2s_soc_data px30_i2s_soc_data = {
+static const struct rk_i2s_soc_data px30_i2s_soc_data = {
        .softrst_offset = 0x0300,
        .configs = px30_txrx_config,
        .config_count = ARRAY_SIZE(px30_txrx_config),
        .init = common_soc_init,
 };
 
-static struct rk_i2s_soc_data rk1808_i2s_soc_data = {
+static const struct rk_i2s_soc_data rk1808_i2s_soc_data = {
        .softrst_offset = 0x0300,
        .configs = rk1808_txrx_config,
        .config_count = ARRAY_SIZE(rk1808_txrx_config),
        .init = common_soc_init,
 };
 
-static struct rk_i2s_soc_data rk3308_i2s_soc_data = {
+static const struct rk_i2s_soc_data rk3308_i2s_soc_data = {
        .softrst_offset = 0x0400,
        .grf_reg_offset = 0x0308,
        .grf_shift = 5,
        .init = common_soc_init,
 };
 
-static struct rk_i2s_soc_data rk3568_i2s_soc_data = {
+static const struct rk_i2s_soc_data rk3568_i2s_soc_data = {
        .softrst_offset = 0x0400,
        .configs = rk3568_txrx_config,
        .config_count = ARRAY_SIZE(rk3568_txrx_config),
        .init = common_soc_init,
 };
 
-static struct rk_i2s_soc_data rv1126_i2s_soc_data = {
+static const struct rk_i2s_soc_data rv1126_i2s_soc_data = {
        .softrst_offset = 0x0300,
        .configs = rv1126_txrx_config,
        .config_count = ARRAY_SIZE(rv1126_txrx_config),
 static int rockchip_i2s_tdm_probe(struct platform_device *pdev)
 {
        struct device_node *node = pdev->dev.of_node;
-       const struct of_device_id *of_id;
        struct rk_i2s_tdm_dev *i2s_tdm;
        struct resource *res;
        void __iomem *regs;
 
        i2s_tdm->dev = &pdev->dev;
 
-       of_id = of_match_device(rockchip_i2s_tdm_match, &pdev->dev);
-       if (!of_id)
-               return -EINVAL;
-
        spin_lock_init(&i2s_tdm->lock);
-       i2s_tdm->soc_data = (struct rk_i2s_soc_data *)of_id->data;
-
+       i2s_tdm->soc_data = device_get_match_data(&pdev->dev);
        i2s_tdm->frame_width = 64;
 
        i2s_tdm->clk_trcm = TRCM_TXRX;
 
 #include <linux/module.h>
 #include <linux/clk.h>
 #include <linux/of.h>
-#include <linux/of_device.h>
 #include <linux/pm_runtime.h>
 #include <linux/rational.h>
 #include <linux/regmap.h>
 static int rockchip_pdm_probe(struct platform_device *pdev)
 {
        struct device_node *node = pdev->dev.of_node;
-       const struct of_device_id *match;
        struct rk_pdm_dev *pdm;
        struct resource *res;
        void __iomem *regs;
        if (!pdm)
                return -ENOMEM;
 
-       match = of_match_device(rockchip_pdm_match, &pdev->dev);
-       if (match)
-               pdm->version = (uintptr_t)match->data;
-
+       pdm->version = (enum rk_pdm_version)device_get_match_data(&pdev->dev);
        if (pdm->version == RK_PDM_RK3308) {
                pdm->reset = devm_reset_control_get(&pdev->dev, "pdm-m");
                if (IS_ERR(pdm->reset))
 
 #include <sound/soc.h>
 #include <linux/module.h>
 #include <linux/of.h>
-#include <linux/of_device.h>
 
  /*
   * Default CFG switch settings to use this driver:
 /* SMDK has a 16.934MHZ crystal attached to WM8994 */
 #define SMDK_WM8994_FREQ 16934000
 
-struct smdk_wm8994_data {
-       int mclk1_rate;
-};
-
-/* Default SMDKs */
-static struct smdk_wm8994_data smdk_board_data = {
-       .mclk1_rate = SMDK_WM8994_FREQ,
-};
-
 static int smdk_hw_params(struct snd_pcm_substream *substream,
        struct snd_pcm_hw_params *params)
 {
        .num_links = ARRAY_SIZE(smdk_dai),
 };
 
-static const struct of_device_id samsung_wm8994_of_match[] __maybe_unused = {
-       { .compatible = "samsung,smdk-wm8994", .data = &smdk_board_data },
+static const struct of_device_id samsung_wm8994_of_match[] = {
+       { .compatible = "samsung,smdk-wm8994" },
        {},
 };
 MODULE_DEVICE_TABLE(of, samsung_wm8994_of_match);
        int ret;
        struct device_node *np = pdev->dev.of_node;
        struct snd_soc_card *card = &smdk;
-       struct smdk_wm8994_data *board;
-       const struct of_device_id *id;
 
        card->dev = &pdev->dev;
 
-       board = devm_kzalloc(&pdev->dev, sizeof(*board), GFP_KERNEL);
-       if (!board)
-               return -ENOMEM;
-
        if (np) {
                smdk_dai[0].cpus->dai_name = NULL;
                smdk_dai[0].cpus->of_node = of_parse_phandle(np,
                smdk_dai[0].platforms->of_node = smdk_dai[0].cpus->of_node;
        }
 
-       id = of_match_device(samsung_wm8994_of_match, &pdev->dev);
-       if (id)
-               *board = *((struct smdk_wm8994_data *)id->data);
-
-       platform_set_drvdata(pdev, board);
-
        ret = devm_snd_soc_register_card(&pdev->dev, card);
 
        if (ret)
 static struct platform_driver smdk_audio_driver = {
        .driver         = {
                .name   = "smdk-audio-wm8994",
-               .of_match_table = of_match_ptr(samsung_wm8994_of_match),
+               .of_match_table = samsung_wm8994_of_match,
                .pm     = &snd_soc_pm_ops,
        },
        .probe          = smdk_audio_probe,
 
                              struct stm32_i2s_data *i2s)
 {
        struct device_node *np = pdev->dev.of_node;
-       const struct of_device_id *of_id;
        struct reset_control *rst;
        struct resource *res;
        int irq, ret;
        if (!np)
                return -ENODEV;
 
-       of_id = of_match_device(stm32_i2s_ids, &pdev->dev);
-       if (of_id)
-               i2s->regmap_conf = (const struct regmap_config *)of_id->data;
-       else
+       i2s->regmap_conf = device_get_match_data(&pdev->dev);
+       if (!i2s->regmap_conf)
                return -EINVAL;
 
        i2s->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
 
 static int stm32_sai_probe(struct platform_device *pdev)
 {
        struct stm32_sai_data *sai;
+       const struct stm32_sai_conf *conf;
        struct reset_control *rst;
-       const struct of_device_id *of_id;
        u32 val;
        int ret;
 
        if (IS_ERR(sai->base))
                return PTR_ERR(sai->base);
 
-       of_id = of_match_device(stm32_sai_ids, &pdev->dev);
-       if (of_id)
-               memcpy(&sai->conf, (const struct stm32_sai_conf *)of_id->data,
+       conf = device_get_match_data(&pdev->dev);
+       if (conf)
+               memcpy(&sai->conf, (const struct stm32_sai_conf *)conf,
                       sizeof(struct stm32_sai_conf));
        else
                return -EINVAL;
 
 static int stm32_sai_sub_probe(struct platform_device *pdev)
 {
        struct stm32_sai_sub_data *sai;
-       const struct of_device_id *of_id;
        const struct snd_dmaengine_pcm_config *conf = &stm32_sai_pcm_config;
        int ret;
 
        if (!sai)
                return -ENOMEM;
 
-       of_id = of_match_device(stm32_sai_sub_ids, &pdev->dev);
-       if (!of_id)
-               return -EINVAL;
-       sai->id = (uintptr_t)of_id->data;
+       sai->id = (uintptr_t)device_get_match_data(&pdev->dev);
 
        sai->pdev = pdev;
        mutex_init(&sai->ctrl_lock);
 
                                  struct stm32_spdifrx_data *spdifrx)
 {
        struct device_node *np = pdev->dev.of_node;
-       const struct of_device_id *of_id;
        struct resource *res;
 
        if (!np)
                return -ENODEV;
 
-       of_id = of_match_device(stm32_spdifrx_ids, &pdev->dev);
-       if (of_id)
-               spdifrx->regmap_conf =
-                       (const struct regmap_config *)of_id->data;
-       else
+       spdifrx->regmap_conf = device_get_match_data(&pdev->dev);
+       if (!spdifrx->regmap_conf)
                return -EINVAL;
 
        spdifrx->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
 
 #include <linux/clk.h>
 #include <linux/device.h>
 #include <linux/io.h>
+#include <linux/mod_devicetable.h>
 #include <linux/module.h>
-#include <linux/of.h>
-#include <linux/of_device.h>
 #include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
 #include <linux/regmap.h>
        struct tegra210_amx *amx;
        void __iomem *regs;
        int err;
-       const struct of_device_id *match;
        struct tegra210_amx_soc_data *soc_data;
 
-       match = of_match_device(tegra210_amx_of_match, dev);
-
-       soc_data = (struct tegra210_amx_soc_data *)match->data;
-
        amx = devm_kzalloc(dev, sizeof(*amx), GFP_KERNEL);
        if (!amx)
                return -ENOMEM;
 
-       amx->soc_data = soc_data;
+       amx->soc_data = device_get_match_data(dev);
 
        dev_set_drvdata(dev, amx);
 
 
 static int davinci_evm_probe(struct platform_device *pdev)
 {
        struct device_node *np = pdev->dev.of_node;
-       const struct of_device_id *match;
        struct snd_soc_dai_link *dai;
        struct snd_soc_card_drvdata_davinci *drvdata = NULL;
        struct clk *mclk;
        int ret = 0;
 
-       match = of_match_device(of_match_ptr(davinci_evm_dt_ids), &pdev->dev);
-       if (!match) {
+       dai = (struct snd_soc_dai_link *) device_get_match_data(&pdev->dev);
+       if (!dai) {
                dev_err(&pdev->dev, "Error: No device match found\n");
                return -ENODEV;
        }
 
-       dai = (struct snd_soc_dai_link *) match->data;
-
        evm_soc_card.dai_link = dai;
 
        dai->codecs->of_node = of_parse_phandle(np, "ti,audio-codec", 0);
 
 #include <linux/clk.h>
 #include <linux/pm_runtime.h>
 #include <linux/of.h>
-#include <linux/of_platform.h>
-#include <linux/of_device.h>
 #include <linux/platform_data/davinci_asp.h>
 #include <linux/math64.h>
 #include <linux/bitmap.h>
 static int davinci_mcasp_get_config(struct davinci_mcasp *mcasp,
                                    struct platform_device *pdev)
 {
-       const struct of_device_id *match = of_match_device(mcasp_dt_ids, &pdev->dev);
        struct device_node *np = pdev->dev.of_node;
        struct davinci_mcasp_pdata *pdata = NULL;
+       const struct davinci_mcasp_pdata *match_pdata =
+               device_get_match_data(&pdev->dev);
        const u32 *of_serial_dir32;
        u32 val;
        int i;
                pdata = pdev->dev.platform_data;
                pdata->dismod = DISMOD_LOW;
                goto out;
-       } else if (match) {
-               pdata = devm_kmemdup(&pdev->dev, match->data, sizeof(*pdata),
+       } else if (match_pdata) {
+               pdata = devm_kmemdup(&pdev->dev, match_pdata, sizeof(*pdata),
                                     GFP_KERNEL);
                if (!pdata)
                        return -ENOMEM;
 
 #include <linux/device.h>
 #include <linux/pm_runtime.h>
 #include <linux/of.h>
-#include <linux/of_device.h>
 #include <sound/core.h>
 #include <sound/pcm.h>
 #include <sound/pcm_params.h>
 static int asoc_mcbsp_probe(struct platform_device *pdev)
 {
        struct omap_mcbsp_platform_data *pdata = dev_get_platdata(&pdev->dev);
+       const struct omap_mcbsp_platform_data *match_pdata =
+               device_get_match_data(&pdev->dev);
        struct omap_mcbsp *mcbsp;
-       const struct of_device_id *match;
        int ret;
 
-       match = of_match_device(omap_mcbsp_of_match, &pdev->dev);
-       if (match) {
+       if (match_pdata) {
                struct device_node *node = pdev->dev.of_node;
                struct omap_mcbsp_platform_data *pdata_quirk = pdata;
                int buffer_size;
 
-               pdata = devm_kzalloc(&pdev->dev,
+               pdata = devm_kmemdup(&pdev->dev, match_pdata,
                                     sizeof(struct omap_mcbsp_platform_data),
                                     GFP_KERNEL);
                if (!pdata)
                        return -ENOMEM;
 
-               memcpy(pdata, match->data, sizeof(*pdata));
                if (!of_property_read_u32(node, "ti,buffer-size", &buffer_size))
                        pdata->buffer_size = buffer_size;
                if (pdata_quirk)