drm/arm/hdlcd: use drmm_* to allocate driver structures
authorDanilo Krummrich <dakr@redhat.com>
Wed, 26 Oct 2022 15:34:28 +0000 (17:34 +0200)
committerLiviu Dudau <liviu.dudau@arm.com>
Mon, 7 Nov 2022 20:47:33 +0000 (20:47 +0000)
Use drm managed resources to allocate driver structures and get rid of
the deprecated drm_dev_alloc() call and replace it with
devm_drm_dev_alloc().

This also serves as preparation to get rid of drm_device->dev_private
and to fix use-after-free issues on driver unload.

Signed-off-by: Danilo Krummrich <dakr@redhat.com>
Signed-off-by: Liviu Dudau <liviu.dudau@arm.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20221026153431.72033-2-dakr@redhat.com
drivers/gpu/drm/arm/hdlcd_drv.c
drivers/gpu/drm/arm/hdlcd_drv.h

index 3219cc3..dade925 100644 (file)
@@ -247,13 +247,11 @@ static int hdlcd_drm_bind(struct device *dev)
        struct hdlcd_drm_private *hdlcd;
        int ret;
 
-       hdlcd = devm_kzalloc(dev, sizeof(*hdlcd), GFP_KERNEL);
-       if (!hdlcd)
-               return -ENOMEM;
+       hdlcd = devm_drm_dev_alloc(dev, &hdlcd_driver, typeof(*hdlcd), base);
+       if (IS_ERR(hdlcd))
+               return PTR_ERR(hdlcd);
 
-       drm = drm_dev_alloc(&hdlcd_driver, dev);
-       if (IS_ERR(drm))
-               return PTR_ERR(drm);
+       drm = &hdlcd->base;
 
        drm->dev_private = hdlcd;
        dev_set_drvdata(dev, drm);
@@ -319,7 +317,6 @@ err_unload:
 err_free:
        drm_mode_config_cleanup(drm);
        dev_set_drvdata(dev, NULL);
-       drm_dev_put(drm);
 
        return ret;
 }
@@ -344,7 +341,6 @@ static void hdlcd_drm_unbind(struct device *dev)
        drm_mode_config_cleanup(drm);
        drm->dev_private = NULL;
        dev_set_drvdata(dev, NULL);
-       drm_dev_put(drm);
 }
 
 static const struct component_master_ops hdlcd_master_ops = {
index 909c39c..3892b36 100644 (file)
@@ -7,6 +7,7 @@
 #define __HDLCD_DRV_H__
 
 struct hdlcd_drm_private {
+       struct drm_device               base;
        void __iomem                    *mmio;
        struct clk                      *clk;
        struct drm_crtc                 crtc;