[PATCH v3 1/3] drm: zte: make zx_plane accessible from zx_vou driver
Sean Paul
seanpaul at chromium.org
Wed Jan 4 23:26:39 PST 2017
On Wed, Dec 28, 2016 at 9:37 PM, Shawn Guo <shawnguo at kernel.org> wrote:
> From: Shawn Guo <shawn.guo at linaro.org>
>
> 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.
>
Reviewed-by: Sean Paul <seanpaul at chromium.org>
> Signed-off-by: Shawn Guo <shawn.guo at linaro.org>
> ---
> drivers/gpu/drm/zte/zx_plane.c | 36 +++++++-----------------------------
> drivers/gpu/drm/zte/zx_plane.h | 11 +++++++----
> drivers/gpu/drm/zte/zx_vou.c | 31 +++++++++++++++++++------------
> 3 files changed, 33 insertions(+), 45 deletions(-)
>
> diff --git a/drivers/gpu/drm/zte/zx_plane.c b/drivers/gpu/drm/zte/zx_plane.c
> index 546eb92a94e8..78d29b1db91c 100644
> --- a/drivers/gpu/drm/zte/zx_plane.c
> +++ b/drivers/gpu/drm/zte/zx_plane.c
> @@ -21,16 +21,6 @@
> #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;
> }
> diff --git a/drivers/gpu/drm/zte/zx_plane.h b/drivers/gpu/drm/zte/zx_plane.h
> index 2b82cd558d9d..264a92e0b532 100644
> --- a/drivers/gpu/drm/zte/zx_plane.h
> +++ b/drivers/gpu/drm/zte/zx_plane.h
> @@ -11,16 +11,19 @@
> #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__ */
> diff --git a/drivers/gpu/drm/zte/zx_vou.c b/drivers/gpu/drm/zte/zx_vou.c
> index 73fe15c17c32..d5c801f6f97b 100644
> --- a/drivers/gpu/drm/zte/zx_vou.c
> +++ b/drivers/gpu/drm/zte/zx_vou.c
> @@ -294,7 +294,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;
>
> @@ -305,19 +305,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;
> @@ -331,13 +337,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) {
> --
> 1.9.1
>
--
Sean Paul, Software Engineer, Google / Chromium OS
More information about the linux-arm-kernel
mailing list