return 0;
 }
 
-int analogix_dp_psr_supported(struct device *dev)
+int analogix_dp_psr_supported(struct analogix_dp_device *dp)
 {
-       struct analogix_dp_device *dp = dev_get_drvdata(dev);
 
        return dp->psr_support;
 }
 EXPORT_SYMBOL_GPL(analogix_dp_psr_supported);
 
-int analogix_dp_enable_psr(struct device *dev)
+int analogix_dp_enable_psr(struct analogix_dp_device *dp)
 {
-       struct analogix_dp_device *dp = dev_get_drvdata(dev);
        struct edp_vsc_psr psr_vsc;
 
        if (!dp->psr_support)
 }
 EXPORT_SYMBOL_GPL(analogix_dp_enable_psr);
 
-int analogix_dp_disable_psr(struct device *dev)
+int analogix_dp_disable_psr(struct analogix_dp_device *dp)
 {
-       struct analogix_dp_device *dp = dev_get_drvdata(dev);
        struct edp_vsc_psr psr_vsc;
        int ret;
 
        return analogix_dp_transfer(dp, msg);
 }
 
-int analogix_dp_bind(struct device *dev, struct drm_device *drm_dev,
-                    struct analogix_dp_plat_data *plat_data)
+struct analogix_dp_device *
+analogix_dp_bind(struct device *dev, struct drm_device *drm_dev,
+                struct analogix_dp_plat_data *plat_data)
 {
        struct platform_device *pdev = to_platform_device(dev);
        struct analogix_dp_device *dp;
 
        if (!plat_data) {
                dev_err(dev, "Invalided input plat_data\n");
-               return -EINVAL;
+               return ERR_PTR(-EINVAL);
        }
 
        dp = devm_kzalloc(dev, sizeof(struct analogix_dp_device), GFP_KERNEL);
        if (!dp)
-               return -ENOMEM;
-
-       dev_set_drvdata(dev, dp);
+               return ERR_PTR(-ENOMEM);
 
        dp->dev = &pdev->dev;
        dp->dpms_mode = DRM_MODE_DPMS_OFF;
 
        ret = analogix_dp_dt_parse_pdata(dp);
        if (ret)
-               return ret;
+               return ERR_PTR(ret);
 
        dp->phy = devm_phy_get(dp->dev, "dp");
        if (IS_ERR(dp->phy)) {
                        if (ret == -ENOSYS || ret == -ENODEV)
                                dp->phy = NULL;
                        else
-                               return ret;
+                               return ERR_PTR(ret);
                }
        }
 
        dp->clock = devm_clk_get(&pdev->dev, "dp");
        if (IS_ERR(dp->clock)) {
                dev_err(&pdev->dev, "failed to get clock\n");
-               return PTR_ERR(dp->clock);
+               return ERR_CAST(dp->clock);
        }
 
        clk_prepare_enable(dp->clock);
 
        dp->reg_base = devm_ioremap_resource(&pdev->dev, res);
        if (IS_ERR(dp->reg_base))
-               return PTR_ERR(dp->reg_base);
+               return ERR_CAST(dp->reg_base);
 
        dp->force_hpd = of_property_read_bool(dev->of_node, "force-hpd");
 
                                            "hpd_gpio");
                if (ret) {
                        dev_err(&pdev->dev, "failed to get hpd gpio\n");
-                       return ret;
+                       return ERR_PTR(ret);
                }
                dp->irq = gpio_to_irq(dp->hpd_gpio);
                irq_flags = IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING;
 
        if (dp->irq == -ENXIO) {
                dev_err(&pdev->dev, "failed to get irq\n");
-               return -ENODEV;
+               return ERR_PTR(-ENODEV);
        }
 
        pm_runtime_enable(dev);
        phy_power_off(dp->phy);
        pm_runtime_put(dev);
 
-       return 0;
+       return dp;
 
 err_disable_pm_runtime:
 
        pm_runtime_put(dev);
        pm_runtime_disable(dev);
 
-       return ret;
+       return ERR_PTR(ret);
 }
 EXPORT_SYMBOL_GPL(analogix_dp_bind);
 
-void analogix_dp_unbind(struct device *dev, struct device *master,
-                       void *data)
+void analogix_dp_unbind(struct analogix_dp_device *dp)
 {
-       struct analogix_dp_device *dp = dev_get_drvdata(dev);
-
        analogix_dp_bridge_disable(dp->bridge);
        dp->connector.funcs->destroy(&dp->connector);
        dp->encoder->funcs->destroy(dp->encoder);
        }
 
        drm_dp_aux_unregister(&dp->aux);
-       pm_runtime_disable(dev);
+       pm_runtime_disable(dp->dev);
        clk_disable_unprepare(dp->clock);
 }
 EXPORT_SYMBOL_GPL(analogix_dp_unbind);
 
 #ifdef CONFIG_PM
-int analogix_dp_suspend(struct device *dev)
+int analogix_dp_suspend(struct analogix_dp_device *dp)
 {
-       struct analogix_dp_device *dp = dev_get_drvdata(dev);
-
        clk_disable_unprepare(dp->clock);
 
        if (dp->plat_data->panel) {
 }
 EXPORT_SYMBOL_GPL(analogix_dp_suspend);
 
-int analogix_dp_resume(struct device *dev)
+int analogix_dp_resume(struct analogix_dp_device *dp)
 {
-       struct analogix_dp_device *dp = dev_get_drvdata(dev);
        int ret;
 
        ret = clk_prepare_enable(dp->clock);
 
        struct device              *dev;
 
        struct videomode           vm;
+       struct analogix_dp_device *adp;
        struct analogix_dp_plat_data plat_data;
 };
 
        struct drm_device *drm_dev = data;
        int ret;
 
-       /*
-        * Just like the probe function said, we don't need the
-        * device drvrate anymore, we should leave the charge to
-        * analogix dp driver, set the device drvdata to NULL.
-        */
-       dev_set_drvdata(dev, NULL);
-
        dp->dev = dev;
        dp->drm_dev = drm_dev;
 
 
        dp->plat_data.encoder = encoder;
 
-       return analogix_dp_bind(dev, dp->drm_dev, &dp->plat_data);
+       dp->adp = analogix_dp_bind(dev, dp->drm_dev, &dp->plat_data);
+       if (IS_ERR(dp->adp))
+               return PTR_ERR(dp->adp);
+
+       return 0;
 }
 
 static void exynos_dp_unbind(struct device *dev, struct device *master,
                             void *data)
 {
-       return analogix_dp_unbind(dev, master, data);
+       struct exynos_dp_device *dp = dev_get_drvdata(dev);
+
+       return analogix_dp_unbind(dp->adp);
 }
 
 static const struct component_ops exynos_dp_ops = {
 #ifdef CONFIG_PM
 static int exynos_dp_suspend(struct device *dev)
 {
-       return analogix_dp_suspend(dev);
+       struct exynos_dp_device *dp = dev_get_drvdata(dev);
+
+       return analogix_dp_suspend(dp->adp);
 }
 
 static int exynos_dp_resume(struct device *dev)
 {
-       return analogix_dp_resume(dev);
+       struct exynos_dp_device *dp = dev_get_drvdata(dev);
+
+       return analogix_dp_resume(dp->adp);
 }
 #endif
 
 
 
        const struct rockchip_dp_chip_data *data;
 
+       struct analogix_dp_device *adp;
        struct analogix_dp_plat_data plat_data;
 };
 
 {
        struct rockchip_dp_device *dp = to_dp(encoder);
 
-       if (!analogix_dp_psr_supported(dp->dev))
+       if (!analogix_dp_psr_supported(dp->adp))
                return;
 
        DRM_DEV_DEBUG(dp->dev, "%s PSR...\n", enabled ? "Entry" : "Exit");
 
        mutex_lock(&dp->psr_lock);
        if (dp->psr_state == EDP_VSC_PSR_STATE_ACTIVE)
-               analogix_dp_enable_psr(dp->dev);
+               analogix_dp_enable_psr(dp->adp);
        else
-               analogix_dp_disable_psr(dp->dev);
+               analogix_dp_disable_psr(dp->adp);
        mutex_unlock(&dp->psr_lock);
 }
 
        struct drm_device *drm_dev = data;
        int ret;
 
-       /*
-        * Just like the probe function said, we don't need the
-        * device drvrate anymore, we should leave the charge to
-        * analogix dp driver, set the device drvdata to NULL.
-        */
-       dev_set_drvdata(dev, NULL);
-
        dp_data = of_device_get_match_data(dev);
        if (!dp_data)
                return -ENODEV;
 
        rockchip_drm_psr_register(&dp->encoder, analogix_dp_psr_set);
 
-       return analogix_dp_bind(dev, dp->drm_dev, &dp->plat_data);
+       dp->adp = analogix_dp_bind(dev, dp->drm_dev, &dp->plat_data);
+       if (IS_ERR(dp->adp))
+               return PTR_ERR(dp->adp);
+
+       return 0;
 }
 
 static void rockchip_dp_unbind(struct device *dev, struct device *master,
        struct rockchip_dp_device *dp = dev_get_drvdata(dev);
 
        rockchip_drm_psr_unregister(&dp->encoder);
-
-       analogix_dp_unbind(dev, master, data);
+       analogix_dp_unbind(dp->adp);
 }
 
 static const struct component_ops rockchip_dp_component_ops = {
        if (ret < 0)
                return ret;
 
-       /*
-        * We just use the drvdata until driver run into component
-        * add function, and then we would set drvdata to null, so
-        * that analogix dp driver could take charge of the drvdata.
-        */
        platform_set_drvdata(pdev, dp);
 
        return component_add(dev, &rockchip_dp_component_ops);
        return 0;
 }
 
+#ifdef CONFIG_PM_SLEEP
+static int rockchip_dp_suspend(struct device *dev)
+{
+       struct rockchip_dp_device *dp = dev_get_drvdata(dev);
+
+       return analogix_dp_suspend(dp->adp);
+}
+
+static int rockchip_dp_resume(struct device *dev)
+{
+       struct rockchip_dp_device *dp = dev_get_drvdata(dev);
+
+       return analogix_dp_resume(dp->adp);
+}
+#endif
+
 static const struct dev_pm_ops rockchip_dp_pm_ops = {
 #ifdef CONFIG_PM_SLEEP
-       .suspend = analogix_dp_suspend,
-       .resume_early = analogix_dp_resume,
+       .suspend = rockchip_dp_suspend,
+       .resume_early = rockchip_dp_resume,
 #endif
 };
 
 
 
 #include <drm/drm_crtc.h>
 
+struct analogix_dp_device;
+
 enum analogix_dp_devtype {
        EXYNOS_DP,
        RK3288_DP,
                         struct drm_connector *);
 };
 
-int analogix_dp_psr_supported(struct device *dev);
-int analogix_dp_enable_psr(struct device *dev);
-int analogix_dp_disable_psr(struct device *dev);
+int analogix_dp_psr_supported(struct analogix_dp_device *dp);
+int analogix_dp_enable_psr(struct analogix_dp_device *dp);
+int analogix_dp_disable_psr(struct analogix_dp_device *dp);
 
-int analogix_dp_resume(struct device *dev);
-int analogix_dp_suspend(struct device *dev);
+int analogix_dp_resume(struct analogix_dp_device *dp);
+int analogix_dp_suspend(struct analogix_dp_device *dp);
 
-int analogix_dp_bind(struct device *dev, struct drm_device *drm_dev,
-                    struct analogix_dp_plat_data *plat_data);
-void analogix_dp_unbind(struct device *dev, struct device *master, void *data);
+struct analogix_dp_device *
+analogix_dp_bind(struct device *dev, struct drm_device *drm_dev,
+                struct analogix_dp_plat_data *plat_data);
+void analogix_dp_unbind(struct analogix_dp_device *dp);
 
 int analogix_dp_start_crc(struct drm_connector *connector);
 int analogix_dp_stop_crc(struct drm_connector *connector);