* set some private fields that will be used by the main at runtime.
  */
 static int stmmac_probe_config_dt(struct platform_device *pdev,
-                                 struct plat_stmmacenet_data *plat,
+                                 struct plat_stmmacenet_data **plat_dat,
                                  const char **mac)
 {
        struct device_node *np = pdev->dev.of_node;
+       struct plat_stmmacenet_data *plat;
        const struct stmmac_of_data *data;
        struct stmmac_dma_cfg *dma_cfg;
 
+       plat = devm_kzalloc(&pdev->dev, sizeof(*plat), GFP_KERNEL);
+       if (!plat)
+               return -ENOMEM;
+
+       *plat_dat = plat;
+
        data = of_device_get_match_data(&pdev->dev);
        if (data) {
                plat->has_gmac = data->has_gmac;
         */
        plat->maxmtu = JUMBO_LEN;
 
+       /* Set default value for multicast hash bins */
+       plat->multicast_filter_bins = HASH_TABLE_SIZE;
+
+       /* Set default value for unicast filter entries */
+       plat->unicast_filter_entries = 1;
+
        /*
         * Currently only the properties needed on SPEAr600
         * are provided. All other properties should be added
 }
 #else
 static int stmmac_probe_config_dt(struct platform_device *pdev,
-                                 struct plat_stmmacenet_data *plat,
+                                 struct plat_stmmacenet_data **plat,
                                  const char **mac)
 {
        return -ENOSYS;
        if (IS_ERR(stmmac_res.addr))
                return PTR_ERR(stmmac_res.addr);
 
-       plat_dat = dev_get_platdata(&pdev->dev);
-
-       if (!plat_dat)
-               plat_dat = devm_kzalloc(&pdev->dev,
-                                       sizeof(struct plat_stmmacenet_data),
-                                       GFP_KERNEL);
-       if (!plat_dat) {
-               pr_err("%s: ERROR: no memory", __func__);
-               return  -ENOMEM;
-       }
-
-       /* Set default value for multicast hash bins */
-       plat_dat->multicast_filter_bins = HASH_TABLE_SIZE;
-
-       /* Set default value for unicast filter entries */
-       plat_dat->unicast_filter_entries = 1;
-
        if (pdev->dev.of_node) {
-               ret = stmmac_probe_config_dt(pdev, plat_dat, &stmmac_res.mac);
+               ret = stmmac_probe_config_dt(pdev, &plat_dat, &stmmac_res.mac);
                if (ret) {
-                       pr_err("%s: main dt probe failed", __func__);
+                       dev_err(&pdev->dev, "dt configuration failed\n");
                        return ret;
                }
+       } else {
+               plat_dat = dev_get_platdata(&pdev->dev);
+               if (!plat_dat) {
+                       dev_err(&pdev->dev, "no platform data provided\n");
+                       return  -EINVAL;
+               }
+
+               /* Set default value for multicast hash bins */
+               plat_dat->multicast_filter_bins = HASH_TABLE_SIZE;
+
+               /* Set default value for unicast filter entries */
+               plat_dat->unicast_filter_entries = 1;
        }
 
        /* Custom setup (if needed) */