drm/arc: Embedded a drm_simple_display_pipe
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Tue, 12 Jan 2021 08:43:47 +0000 (09:43 +0100)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Thu, 25 Feb 2021 11:03:13 +0000 (12:03 +0100)
This is a prep step to convert arc over to the simple kms helpers, for
now we just use this as an embedding container to drop all the various
allocations. Big change is the removal of the various devm_kzalloc,
which have the wrong lifetimes anyway.

Acked-by: Sam Ravnborg <sam@ravnborg.org>
Acked-by: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Cc: Alexey Brodkin <abrodkin@synopsys.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210112084358.2771527-4-daniel.vetter@ffwll.ch
drivers/gpu/drm/arc/arcpgu.h
drivers/gpu/drm/arc/arcpgu_crtc.c
drivers/gpu/drm/arc/arcpgu_drv.c
drivers/gpu/drm/arc/arcpgu_hdmi.c
drivers/gpu/drm/arc/arcpgu_sim.c

index ed77dd5dd5cb26c599a707f07941d537cc06e856..52afd638a4d2b458800347334546f9f07976692d 100644 (file)
@@ -8,17 +8,18 @@
 #ifndef _ARCPGU_H_
 #define _ARCPGU_H_
 
+#include <drm/drm_simple_kms_helper.h>
+
 struct arcpgu_drm_private {
        struct drm_device       drm;
        void __iomem            *regs;
        struct clk              *clk;
-       struct drm_crtc         crtc;
-       struct drm_plane        *plane;
+       struct drm_simple_display_pipe pipe;
 };
 
 #define dev_to_arcpgu(x) container_of(x, struct arcpgu_drm_private, drm)
 
-#define crtc_to_arcpgu_priv(x) container_of(x, struct arcpgu_drm_private, crtc)
+#define crtc_to_arcpgu_priv(x) container_of(x, struct arcpgu_drm_private, pipe.crtc)
 
 static inline void arc_pgu_write(struct arcpgu_drm_private *arcpgu,
                                 unsigned int reg, u32 value)
index 2254421cceb3845cb8b7861b547315316c054a31..bcf3c3f077a64e7bb1e933c68ef041d22e5fe724 100644 (file)
@@ -180,9 +180,7 @@ static struct drm_plane *arc_pgu_plane_init(struct drm_device *drm)
        struct drm_plane *plane = NULL;
        int ret;
 
-       plane = devm_kzalloc(drm->dev, sizeof(*plane), GFP_KERNEL);
-       if (!plane)
-               return ERR_PTR(-ENOMEM);
+       plane = &arcpgu->pipe.plane;
 
        ret = drm_universal_plane_init(drm, plane, 0xff, &arc_pgu_plane_funcs,
                                       arc_pgu_supported_formats,
@@ -193,7 +191,6 @@ static struct drm_plane *arc_pgu_plane_init(struct drm_device *drm)
                return ERR_PTR(ret);
 
        drm_plane_helper_add(plane, &arc_pgu_plane_helper_funcs);
-       arcpgu->plane = plane;
 
        return plane;
 }
@@ -208,13 +205,13 @@ int arc_pgu_setup_crtc(struct drm_device *drm)
        if (IS_ERR(primary))
                return PTR_ERR(primary);
 
-       ret = drm_crtc_init_with_planes(drm, &arcpgu->crtc, primary, NULL,
+       ret = drm_crtc_init_with_planes(drm, &arcpgu->pipe.crtc, primary, NULL,
                                        &arc_pgu_crtc_funcs, NULL);
        if (ret) {
                drm_plane_cleanup(primary);
                return ret;
        }
 
-       drm_crtc_helper_add(&arcpgu->crtc, &arc_pgu_crtc_helper_funcs);
+       drm_crtc_helper_add(&arcpgu->pipe.crtc, &arc_pgu_crtc_helper_funcs);
        return 0;
 }
index cc63c14b33d9262e752e2cdcd606f87bca6f1568..832f0e516094f7f2d65310ecf28a3bea6c15275e 100644 (file)
@@ -120,7 +120,7 @@ static int arcpgu_show_pxlclock(struct seq_file *m, void *arg)
        struct drm_device *drm = node->minor->dev;
        struct arcpgu_drm_private *arcpgu = dev_to_arcpgu(drm);
        unsigned long clkrate = clk_get_rate(arcpgu->clk);
-       unsigned long mode_clock = arcpgu->crtc.mode.crtc_clock * 1000;
+       unsigned long mode_clock = arcpgu->pipe.crtc.mode.crtc_clock * 1000;
 
        seq_printf(m, "hw  : %lu\n", clkrate);
        seq_printf(m, "mode: %lu\n", mode_clock);
index 52839934f2fb52304d92a63fe0670a8e2f2f1e1a..dbad2c9237fe8f5c06efeec082918e3d6bfd5c16 100644 (file)
@@ -18,14 +18,13 @@ static struct drm_encoder_funcs arcpgu_drm_encoder_funcs = {
 
 int arcpgu_drm_hdmi_init(struct drm_device *drm, struct device_node *np)
 {
+       struct arcpgu_drm_private *arcpgu = dev_to_arcpgu(drm);
        struct drm_encoder *encoder;
        struct drm_bridge *bridge;
 
        int ret = 0;
 
-       encoder = devm_kzalloc(drm->dev, sizeof(*encoder), GFP_KERNEL);
-       if (encoder == NULL)
-               return -ENOMEM;
+       encoder = &arcpgu->pipe.encoder;
 
        /* Locate drm bridge from the hdmi encoder DT node */
        bridge = of_drm_find_bridge(np);
index 37d961668dfec9e5fb9a156208190d1f38202730..134afb9fa6258e41dcfd7be6311a8b1cae7ba993 100644 (file)
@@ -56,14 +56,13 @@ static struct drm_encoder_funcs arcpgu_drm_encoder_funcs = {
 
 int arcpgu_drm_sim_init(struct drm_device *drm, struct device_node *np)
 {
+       struct arcpgu_drm_private *arcpgu = dev_to_arcpgu(drm);
        struct arcpgu_drm_connector *arcpgu_connector;
        struct drm_encoder *encoder;
        struct drm_connector *connector;
        int ret;
 
-       encoder = devm_kzalloc(drm->dev, sizeof(*encoder), GFP_KERNEL);
-       if (encoder == NULL)
-               return -ENOMEM;
+       encoder = &arcpgu->pipe.encoder;
 
        encoder->possible_crtcs = 1;
        encoder->possible_clones = 0;