if (!pdev->dev.of_node)
                return -ENODEV;
 
-       hdmi = devm_kzalloc(&pdev->dev, sizeof(*hdmi), GFP_KERNEL);
-       if (!hdmi)
-               return -ENOMEM;
+       hdmi = dev_get_drvdata(dev);
+       memset(hdmi, 0, sizeof(*hdmi));
 
        match = of_match_node(dw_hdmi_imx_dt_ids, pdev->dev.of_node);
        plat_data = match->data;
        drm_encoder_helper_add(encoder, &dw_hdmi_imx_encoder_helper_funcs);
        drm_simple_encoder_init(drm, encoder, DRM_MODE_ENCODER_TMDS);
 
-       platform_set_drvdata(pdev, hdmi);
-
        hdmi->hdmi = dw_hdmi_bind(pdev, encoder, plat_data);
 
        /*
 
 static int dw_hdmi_imx_probe(struct platform_device *pdev)
 {
+       struct imx_hdmi *hdmi;
+
+       hdmi = devm_kzalloc(&pdev->dev, sizeof(*hdmi), GFP_KERNEL);
+       if (!hdmi)
+               return -ENOMEM;
+
+       platform_set_drvdata(pdev, hdmi);
+
        return component_add(&pdev->dev, &dw_hdmi_imx_ops);
 }
 
 
 
        drm_kms_helper_poll_fini(drm);
 
+       component_unbind_all(drm->dev, drm);
+
        drm_mode_config_cleanup(drm);
 
-       component_unbind_all(drm->dev, drm);
        dev_set_drvdata(dev, NULL);
 
        drm_dev_put(drm);
 
        int ret;
        int i;
 
-       imx_ldb = devm_kzalloc(dev, sizeof(*imx_ldb), GFP_KERNEL);
-       if (!imx_ldb)
-               return -ENOMEM;
+       imx_ldb = dev_get_drvdata(dev);
+       memset(imx_ldb, 0, sizeof(*imx_ldb));
 
        imx_ldb->regmap = syscon_regmap_lookup_by_phandle(np, "gpr");
        if (IS_ERR(imx_ldb->regmap)) {
                }
        }
 
-       dev_set_drvdata(dev, imx_ldb);
-
        return 0;
 
 free_child:
 
 static int imx_ldb_probe(struct platform_device *pdev)
 {
+       struct imx_ldb *imx_ldb;
+
+       imx_ldb = devm_kzalloc(&pdev->dev, sizeof(*imx_ldb), GFP_KERNEL);
+       if (!imx_ldb)
+               return -ENOMEM;
+
+       platform_set_drvdata(pdev, imx_ldb);
+
        return component_add(&pdev->dev, &imx_ldb_ops);
 }
 
 
        int irq;
        int ret;
 
-       tve = devm_kzalloc(dev, sizeof(*tve), GFP_KERNEL);
-       if (!tve)
-               return -ENOMEM;
+       tve = dev_get_drvdata(dev);
+       memset(tve, 0, sizeof(*tve));
 
        tve->dev = dev;
        spin_lock_init(&tve->lock);
        if (ret)
                return ret;
 
-       dev_set_drvdata(dev, tve);
-
        return 0;
 }
 
 
 static int imx_tve_probe(struct platform_device *pdev)
 {
+       struct imx_tve *tve;
+
+       tve = devm_kzalloc(&pdev->dev, sizeof(*tve), GFP_KERNEL);
+       if (!tve)
+               return -ENOMEM;
+
+       platform_set_drvdata(pdev, tve);
+
        return component_add(&pdev->dev, &imx_tve_ops);
 }
 
 
        struct ipu_client_platformdata *pdata = dev->platform_data;
        struct drm_device *drm = data;
        struct ipu_crtc *ipu_crtc;
-       int ret;
 
-       ipu_crtc = devm_kzalloc(dev, sizeof(*ipu_crtc), GFP_KERNEL);
-       if (!ipu_crtc)
-               return -ENOMEM;
+       ipu_crtc = dev_get_drvdata(dev);
+       memset(ipu_crtc, 0, sizeof(*ipu_crtc));
 
        ipu_crtc->dev = dev;
 
-       ret = ipu_crtc_init(ipu_crtc, pdata, drm);
-       if (ret)
-               return ret;
-
-       dev_set_drvdata(dev, ipu_crtc);
-
-       return 0;
+       return ipu_crtc_init(ipu_crtc, pdata, drm);
 }
 
 static void ipu_drm_unbind(struct device *dev, struct device *master,
 static int ipu_drm_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
+       struct ipu_crtc *ipu_crtc;
        int ret;
 
        if (!dev->platform_data)
        if (ret)
                return ret;
 
+       ipu_crtc = devm_kzalloc(dev, sizeof(*ipu_crtc), GFP_KERNEL);
+       if (!ipu_crtc)
+               return -ENOMEM;
+
+       dev_set_drvdata(dev, ipu_crtc);
+
        return component_add(dev, &ipu_crtc_ops);
 }
 
 
        u32 bus_format = 0;
        const char *fmt;
 
-       imxpd = devm_kzalloc(dev, sizeof(*imxpd), GFP_KERNEL);
-       if (!imxpd)
-               return -ENOMEM;
+       imxpd = dev_get_drvdata(dev);
+       memset(imxpd, 0, sizeof(*imxpd));
 
        edidp = of_get_property(np, "edid", &imxpd->edid_len);
        if (edidp)
        if (ret)
                return ret;
 
-       dev_set_drvdata(dev, imxpd);
-
        return 0;
 }
 
 
 static int imx_pd_probe(struct platform_device *pdev)
 {
+       struct imx_parallel_display *imxpd;
+
+       imxpd = devm_kzalloc(&pdev->dev, sizeof(*imxpd), GFP_KERNEL);
+       if (!imxpd)
+               return -ENOMEM;
+
+       platform_set_drvdata(pdev, imxpd);
+
        return component_add(&pdev->dev, &imx_pd_ops);
 }