Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc
[linux-2.6-block.git] / drivers / gpu / drm / tilcdc / tilcdc_drv.c
index d96083d62e1134009bafb1acc3b47c7d88894faa..709bc903524d6d618aacec36cc8b1754f6b9295e 100644 (file)
@@ -143,9 +143,6 @@ static int tilcdc_unload(struct drm_device *dev)
 
        pm_runtime_disable(dev->dev);
 
-       kfree(priv->saved_register);
-       kfree(priv);
-
        return 0;
 }
 
@@ -161,13 +158,12 @@ static int tilcdc_load(struct drm_device *dev, unsigned long flags)
        u32 bpp = 0;
        int ret;
 
-       priv = kzalloc(sizeof(*priv), GFP_KERNEL);
+       priv = devm_kzalloc(dev->dev, sizeof(*priv), GFP_KERNEL);
        if (priv)
-               priv->saved_register = kcalloc(tilcdc_num_regs(),
-                                              sizeof(*priv->saved_register),
-                                              GFP_KERNEL);
+               priv->saved_register =
+                       devm_kcalloc(dev->dev, tilcdc_num_regs(),
+                                    sizeof(*priv->saved_register), GFP_KERNEL);
        if (!priv || !priv->saved_register) {
-               kfree(priv);
                dev_err(dev->dev, "failed to allocate private data\n");
                return -ENOMEM;
        }
@@ -180,7 +176,7 @@ static int tilcdc_load(struct drm_device *dev, unsigned long flags)
        priv->wq = alloc_ordered_workqueue("tilcdc", 0);
        if (!priv->wq) {
                ret = -ENOMEM;
-               goto fail_free_priv;
+               goto fail_unset_priv;
        }
 
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -346,10 +342,9 @@ fail_free_wq:
        flush_workqueue(priv->wq);
        destroy_workqueue(priv->wq);
 
-fail_free_priv:
+fail_unset_priv:
        dev->dev_private = NULL;
-       kfree(priv->saved_register);
-       kfree(priv);
+
        return ret;
 }
 
@@ -382,7 +377,7 @@ static int tilcdc_irq_postinstall(struct drm_device *dev)
                tilcdc_write(dev, LCDC_INT_ENABLE_SET_REG,
                           LCDC_V2_UNDERFLOW_INT_ENA |
                           LCDC_V2_END_OF_FRAME0_INT_ENA |
-                          LCDC_FRAME_DONE);
+                          LCDC_FRAME_DONE | LCDC_SYNC_LOST);
        }
 
        return 0;
@@ -401,7 +396,7 @@ static void tilcdc_irq_uninstall(struct drm_device *dev)
                tilcdc_write(dev, LCDC_INT_ENABLE_CLR_REG,
                        LCDC_V2_UNDERFLOW_INT_ENA | LCDC_V2_PL_INT_ENA |
                        LCDC_V2_END_OF_FRAME0_INT_ENA |
-                       LCDC_FRAME_DONE);
+                       LCDC_FRAME_DONE | LCDC_SYNC_LOST);
        }
 }