drm: zte: make zx_plane accessible from zx_vou driver
authorShawn Guo <shawn.guo@linaro.org>
Wed, 28 Dec 2016 06:41:37 +0000 (14:41 +0800)
committerShawn Guo <shawn.guo@linaro.org>
Sat, 28 Jan 2017 02:17:40 +0000 (10:17 +0800)
Move struct zx_plane from zx_plane.c to zx_plane.h, so that it can be
accessed from zx_vou driver, and we can save the use of struct
zx_layer_data completely.  More importantly, those additional data used
by VOU controller to enable/disable graphic and video layers can later
be added and accessed much more easily from zx_vou driver.

While at it, we make two changes to zx_plane_init() interface:

 - Encode struct device pointer in zx_plane, so that we do not need to
   pass it as a parameter.
 - Change return of zx_plane_init() from struct drm_plane pointer to
   error code, since we can get the pointer from zx_plane in zx_vou
   driver now.

Signed-off-by: Shawn Guo <shawn.guo@linaro.org>
Reviewed-by: Sean Paul <seanpaul@chromium.org>
drivers/gpu/drm/zte/zx_plane.c
drivers/gpu/drm/zte/zx_plane.h
drivers/gpu/drm/zte/zx_vou.c

index 546eb92a94e84ef3515234ba68c3cdebaedebba4..78d29b1db91cc18149e45c4299cd7b18fca2c49c 100644 (file)
 #include "zx_plane_regs.h"
 #include "zx_vou.h"
 
-struct zx_plane {
-       struct drm_plane plane;
-       void __iomem *layer;
-       void __iomem *csc;
-       void __iomem *hbsc;
-       void __iomem *rsz;
-};
-
-#define to_zx_plane(plane)     container_of(plane, struct zx_plane, plane)
-
 static const uint32_t gl_formats[] = {
        DRM_FORMAT_ARGB8888,
        DRM_FORMAT_XRGB8888,
@@ -248,28 +238,16 @@ static void zx_plane_hbsc_init(struct zx_plane *zplane)
        zx_writel(hbsc + HBSC_THRESHOLD_COL3, (0x3c0 << 16) | 0x40);
 }
 
-struct drm_plane *zx_plane_init(struct drm_device *drm, struct device *dev,
-                               struct zx_layer_data *data,
-                               enum drm_plane_type type)
+int zx_plane_init(struct drm_device *drm, struct zx_plane *zplane,
+                 enum drm_plane_type type)
 {
        const struct drm_plane_helper_funcs *helper;
-       struct zx_plane *zplane;
-       struct drm_plane *plane;
+       struct drm_plane *plane = &zplane->plane;
+       struct device *dev = zplane->dev;
        const uint32_t *formats;
        unsigned int format_count;
        int ret;
 
-       zplane = devm_kzalloc(dev, sizeof(*zplane), GFP_KERNEL);
-       if (!zplane)
-               return ERR_PTR(-ENOMEM);
-
-       plane = &zplane->plane;
-
-       zplane->layer = data->layer;
-       zplane->hbsc = data->hbsc;
-       zplane->csc = data->csc;
-       zplane->rsz = data->rsz;
-
        zx_plane_hbsc_init(zplane);
 
        switch (type) {
@@ -282,7 +260,7 @@ struct drm_plane *zx_plane_init(struct drm_device *drm, struct device *dev,
                /* TODO: add video layer (vl) support */
                break;
        default:
-               return ERR_PTR(-ENODEV);
+               return -ENODEV;
        }
 
        ret = drm_universal_plane_init(drm, plane, VOU_CRTC_MASK,
@@ -290,10 +268,10 @@ struct drm_plane *zx_plane_init(struct drm_device *drm, struct device *dev,
                                       type, NULL);
        if (ret) {
                DRM_DEV_ERROR(dev, "failed to init universal plane: %d\n", ret);
-               return ERR_PTR(ret);
+               return ret;
        }
 
        drm_plane_helper_add(plane, helper);
 
-       return plane;
+       return 0;
 }
index 2b82cd558d9d9774fc12d5684f6515019e0b01cd..264a92e0b532c95c51a6cf69224c21f44f9620b3 100644 (file)
 #ifndef __ZX_PLANE_H__
 #define __ZX_PLANE_H__
 
-struct zx_layer_data {
+struct zx_plane {
+       struct drm_plane plane;
+       struct device *dev;
        void __iomem *layer;
        void __iomem *csc;
        void __iomem *hbsc;
        void __iomem *rsz;
 };
 
-struct drm_plane *zx_plane_init(struct drm_device *drm, struct device *dev,
-                               struct zx_layer_data *data,
-                               enum drm_plane_type type);
+#define to_zx_plane(plane) container_of(plane, struct zx_plane, plane)
+
+int zx_plane_init(struct drm_device *drm, struct zx_plane *zplane,
+                 enum drm_plane_type type);
 void zx_plane_set_update(struct drm_plane *plane);
 
 #endif /* __ZX_PLANE_H__ */
index f89ad7f72fdbd7dd2ff9480ed51ed2769a92b3f6..1bc8f8762956f1c444a578449c872fb6582942a6 100644 (file)
@@ -303,7 +303,7 @@ static int zx_crtc_init(struct drm_device *drm, struct zx_vou_hw *vou,
                        enum vou_chn_type chn_type)
 {
        struct device *dev = vou->dev;
-       struct zx_layer_data data;
+       struct zx_plane *zplane;
        struct zx_crtc *zcrtc;
        int ret;
 
@@ -314,19 +314,25 @@ static int zx_crtc_init(struct drm_device *drm, struct zx_vou_hw *vou,
        zcrtc->vou = vou;
        zcrtc->chn_type = chn_type;
 
+       zplane = devm_kzalloc(dev, sizeof(*zplane), GFP_KERNEL);
+       if (!zplane)
+               return -ENOMEM;
+
+       zplane->dev = dev;
+
        if (chn_type == VOU_CHN_MAIN) {
-               data.layer = vou->osd + MAIN_GL_OFFSET;
-               data.csc = vou->osd + MAIN_CSC_OFFSET;
-               data.hbsc = vou->osd + MAIN_HBSC_OFFSET;
-               data.rsz = vou->otfppu + MAIN_RSZ_OFFSET;
+               zplane->layer = vou->osd + MAIN_GL_OFFSET;
+               zplane->csc = vou->osd + MAIN_CSC_OFFSET;
+               zplane->hbsc = vou->osd + MAIN_HBSC_OFFSET;
+               zplane->rsz = vou->otfppu + MAIN_RSZ_OFFSET;
                zcrtc->chnreg = vou->osd + OSD_MAIN_CHN;
                zcrtc->regs = &main_crtc_regs;
                zcrtc->bits = &main_crtc_bits;
        } else {
-               data.layer = vou->osd + AUX_GL_OFFSET;
-               data.csc = vou->osd + AUX_CSC_OFFSET;
-               data.hbsc = vou->osd + AUX_HBSC_OFFSET;
-               data.rsz = vou->otfppu + AUX_RSZ_OFFSET;
+               zplane->layer = vou->osd + AUX_GL_OFFSET;
+               zplane->csc = vou->osd + AUX_CSC_OFFSET;
+               zplane->hbsc = vou->osd + AUX_HBSC_OFFSET;
+               zplane->rsz = vou->otfppu + AUX_RSZ_OFFSET;
                zcrtc->chnreg = vou->osd + OSD_AUX_CHN;
                zcrtc->regs = &aux_crtc_regs;
                zcrtc->bits = &aux_crtc_bits;
@@ -340,13 +346,14 @@ static int zx_crtc_init(struct drm_device *drm, struct zx_vou_hw *vou,
                return ret;
        }
 
-       zcrtc->primary = zx_plane_init(drm, dev, &data, DRM_PLANE_TYPE_PRIMARY);
-       if (IS_ERR(zcrtc->primary)) {
-               ret = PTR_ERR(zcrtc->primary);
+       ret = zx_plane_init(drm, zplane, DRM_PLANE_TYPE_PRIMARY);
+       if (ret) {
                DRM_DEV_ERROR(dev, "failed to init primary plane: %d\n", ret);
                return ret;
        }
 
+       zcrtc->primary = &zplane->plane;
+
        ret = drm_crtc_init_with_planes(drm, &zcrtc->crtc, zcrtc->primary, NULL,
                                        &zx_crtc_funcs, NULL);
        if (ret) {