drm/aspeed: Use devm_drm_dev_alloc
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Wed, 15 Apr 2020 07:40:30 +0000 (09:40 +0200)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Tue, 28 Apr 2020 14:13:03 +0000 (16:13 +0200)
As usual, we can drop the drm_dev_put() and need to embed the
drm_device. Since it's so few, also go right ahead and leave
drm_device->dev_private set to NULL, so that we always use the
container_of() upcast, which is faster anyway.

Acked-by: Sam Ravnborg <sam@ravnborg.org>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Cc: Joel Stanley <joel@jms.id.au>
Cc: Andrew Jeffery <andrew@aj.id.au>
Cc: linux-aspeed@lists.ozlabs.org
Cc: linux-arm-kernel@lists.infradead.org
Link: https://patchwork.freedesktop.org/patch/msgid/20200415074034.175360-56-daniel.vetter@ffwll.ch
drivers/gpu/drm/aspeed/aspeed_gfx.h
drivers/gpu/drm/aspeed/aspeed_gfx_crtc.c
drivers/gpu/drm/aspeed/aspeed_gfx_drv.c
drivers/gpu/drm/aspeed/aspeed_gfx_out.c

index adc0294..e7ca958 100644 (file)
@@ -5,6 +5,7 @@
 #include <drm/drm_simple_kms_helper.h>
 
 struct aspeed_gfx {
+       struct drm_device               drm;
        void __iomem                    *base;
        struct clk                      *clk;
        struct reset_control            *rst;
@@ -13,6 +14,7 @@ struct aspeed_gfx {
        struct drm_simple_display_pipe  pipe;
        struct drm_connector            connector;
 };
+#define to_aspeed_gfx(x) container_of(x, struct aspeed_gfx, drm)
 
 int aspeed_gfx_create_pipe(struct drm_device *drm);
 int aspeed_gfx_create_output(struct drm_device *drm);
index 2184b8b..e54686c 100644 (file)
@@ -231,7 +231,7 @@ static const uint32_t aspeed_gfx_formats[] = {
 
 int aspeed_gfx_create_pipe(struct drm_device *drm)
 {
-       struct aspeed_gfx *priv = drm->dev_private;
+       struct aspeed_gfx *priv = to_aspeed_gfx(drm);
 
        return drm_simple_display_pipe_init(drm, &priv->pipe, &aspeed_gfx_funcs,
                                            aspeed_gfx_formats,
index ada2f6a..6b27242 100644 (file)
@@ -77,7 +77,7 @@ static void aspeed_gfx_setup_mode_config(struct drm_device *drm)
 static irqreturn_t aspeed_gfx_irq_handler(int irq, void *data)
 {
        struct drm_device *drm = data;
-       struct aspeed_gfx *priv = drm->dev_private;
+       struct aspeed_gfx *priv = to_aspeed_gfx(drm);
        u32 reg;
 
        reg = readl(priv->base + CRT_CTRL1);
@@ -96,15 +96,10 @@ static irqreturn_t aspeed_gfx_irq_handler(int irq, void *data)
 static int aspeed_gfx_load(struct drm_device *drm)
 {
        struct platform_device *pdev = to_platform_device(drm->dev);
-       struct aspeed_gfx *priv;
+       struct aspeed_gfx *priv = to_aspeed_gfx(drm);
        struct resource *res;
        int ret;
 
-       priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
-       if (!priv)
-               return -ENOMEM;
-       drm->dev_private = priv;
-
        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        priv->base = devm_ioremap_resource(drm->dev, res);
        if (IS_ERR(priv->base))
@@ -187,8 +182,6 @@ static void aspeed_gfx_unload(struct drm_device *drm)
 {
        drm_kms_helper_poll_fini(drm);
        drm_mode_config_cleanup(drm);
-
-       drm->dev_private = NULL;
 }
 
 DEFINE_DRM_GEM_CMA_FOPS(fops);
@@ -216,27 +209,26 @@ static const struct of_device_id aspeed_gfx_match[] = {
 
 static int aspeed_gfx_probe(struct platform_device *pdev)
 {
-       struct drm_device *drm;
+       struct aspeed_gfx *priv;
        int ret;
 
-       drm = drm_dev_alloc(&aspeed_gfx_driver, &pdev->dev);
-       if (IS_ERR(drm))
-               return PTR_ERR(drm);
+       priv = devm_drm_dev_alloc(&pdev->dev, &aspeed_gfx_driver,
+                                 struct aspeed_gfx, drm);
+       if (IS_ERR(priv))
+               return PTR_ERR(priv);
 
-       ret = aspeed_gfx_load(drm);
+       ret = aspeed_gfx_load(&priv->drm);
        if (ret)
-               goto err_free;
+               return ret;
 
-       ret = drm_dev_register(drm, 0);
+       ret = drm_dev_register(&priv->drm, 0);
        if (ret)
                goto err_unload;
 
        return 0;
 
 err_unload:
-       aspeed_gfx_unload(drm);
-err_free:
-       drm_dev_put(drm);
+       aspeed_gfx_unload(&priv->drm);
 
        return ret;
 }
@@ -247,7 +239,6 @@ static int aspeed_gfx_remove(struct platform_device *pdev)
 
        drm_dev_unregister(drm);
        aspeed_gfx_unload(drm);
-       drm_dev_put(drm);
 
        return 0;
 }
index 67ee5fa..6759cb8 100644 (file)
@@ -28,7 +28,7 @@ static const struct drm_connector_funcs aspeed_gfx_connector_funcs = {
 
 int aspeed_gfx_create_output(struct drm_device *drm)
 {
-       struct aspeed_gfx *priv = drm->dev_private;
+       struct aspeed_gfx *priv = to_aspeed_gfx(drm);
        int ret;
 
        priv->connector.dpms = DRM_MODE_DPMS_OFF;