Merge branch 'drm-tda998x-mali' of git://git.armlinux.org.uk/~rmk/linux-arm into...
[linux-2.6-microblaze.git] / drivers / gpu / drm / arm / malidp_drv.c
index 79bfc13..32f746e 100644 (file)
@@ -42,6 +42,7 @@ static int malidp_set_and_wait_config_valid(struct drm_device *drm)
        struct malidp_hw_device *hwdev = malidp->dev;
        int ret;
 
+       atomic_set(&malidp->config_valid, 0);
        hwdev->set_config_valid(hwdev);
        /* don't wait for config_valid flag if we are in config mode */
        if (hwdev->in_config_mode(hwdev))
@@ -91,7 +92,7 @@ static void malidp_atomic_commit_tail(struct drm_atomic_state *state)
 
        drm_atomic_helper_commit_modeset_disables(drm, state);
        drm_atomic_helper_commit_modeset_enables(drm, state);
-       drm_atomic_helper_commit_planes(drm, state, true);
+       drm_atomic_helper_commit_planes(drm, state, 0);
 
        malidp_atomic_commit_hw_done(state);
 
@@ -154,6 +155,12 @@ static int malidp_init(struct drm_device *drm)
        return 0;
 }
 
+static void malidp_fini(struct drm_device *drm)
+{
+       malidp_de_planes_destroy(drm);
+       drm_mode_config_cleanup(drm);
+}
+
 static int malidp_irq_init(struct platform_device *pdev)
 {
        int irq_de, irq_se, ret = 0;
@@ -196,9 +203,7 @@ static const struct file_operations fops = {
        .open = drm_open,
        .release = drm_release,
        .unlocked_ioctl = drm_ioctl,
-#ifdef CONFIG_COMPAT
        .compat_ioctl = drm_compat_ioctl,
-#endif
        .poll = drm_poll,
        .read = drm_read,
        .llseek = noop_llseek,
@@ -310,8 +315,8 @@ static int malidp_bind(struct device *dev)
                return ret;
 
        drm = drm_dev_alloc(&malidp_driver, dev);
-       if (!drm) {
-               ret = -ENOMEM;
+       if (IS_ERR(drm)) {
+               ret = PTR_ERR(drm);
                goto alloc_fail;
        }
 
@@ -372,6 +377,8 @@ static int malidp_bind(struct device *dev)
        if (ret < 0)
                goto irq_init_fail;
 
+       drm->irq_enabled = true;
+
        ret = drm_vblank_init(drm, drm->mode_config.num_crtc);
        if (ret < 0) {
                DRM_ERROR("failed to initialise vblank\n");
@@ -407,14 +414,14 @@ fbdev_fail:
 vblank_fail:
        malidp_se_irq_fini(drm);
        malidp_de_irq_fini(drm);
+       drm->irq_enabled = false;
 irq_init_fail:
        component_unbind_all(dev, drm);
 bind_fail:
        of_node_put(malidp->crtc.port);
        malidp->crtc.port = NULL;
 port_fail:
-       malidp_de_planes_destroy(drm);
-       drm_mode_config_cleanup(drm);
+       malidp_fini(drm);
 init_fail:
        drm->dev_private = NULL;
        dev_set_drvdata(dev, NULL);
@@ -447,8 +454,7 @@ static void malidp_unbind(struct device *dev)
        component_unbind_all(dev, drm);
        of_node_put(malidp->crtc.port);
        malidp->crtc.port = NULL;
-       malidp_de_planes_destroy(drm);
-       drm_mode_config_cleanup(drm);
+       malidp_fini(drm);
        drm->dev_private = NULL;
        dev_set_drvdata(dev, NULL);
        clk_disable_unprepare(hwdev->mclk);
@@ -496,7 +502,9 @@ static int malidp_platform_probe(struct platform_device *pdev)
                return -EAGAIN;
        }
 
-       component_match_add(&pdev->dev, &match, malidp_compare_dev, port);
+       drm_of_component_match_add(&pdev->dev, &match, malidp_compare_dev,
+                                  port);
+       of_node_put(port);
        return component_master_add_with_match(&pdev->dev, &malidp_master_ops,
                                               match);
 }