Commit 98ae9869 authored by Shawn Guo's avatar Shawn Guo

drm: zte: make zx_plane accessible from zx_vou driver

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: default avatarShawn Guo <shawn.guo@linaro.org>
Reviewed-by: default avatarSean Paul <seanpaul@chromium.org>
parent 83d71152
...@@ -21,16 +21,6 @@ ...@@ -21,16 +21,6 @@
#include "zx_plane_regs.h" #include "zx_plane_regs.h"
#include "zx_vou.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[] = { static const uint32_t gl_formats[] = {
DRM_FORMAT_ARGB8888, DRM_FORMAT_ARGB8888,
DRM_FORMAT_XRGB8888, DRM_FORMAT_XRGB8888,
...@@ -248,28 +238,16 @@ static void zx_plane_hbsc_init(struct zx_plane *zplane) ...@@ -248,28 +238,16 @@ static void zx_plane_hbsc_init(struct zx_plane *zplane)
zx_writel(hbsc + HBSC_THRESHOLD_COL3, (0x3c0 << 16) | 0x40); zx_writel(hbsc + HBSC_THRESHOLD_COL3, (0x3c0 << 16) | 0x40);
} }
struct drm_plane *zx_plane_init(struct drm_device *drm, struct device *dev, int zx_plane_init(struct drm_device *drm, struct zx_plane *zplane,
struct zx_layer_data *data, enum drm_plane_type type)
enum drm_plane_type type)
{ {
const struct drm_plane_helper_funcs *helper; const struct drm_plane_helper_funcs *helper;
struct zx_plane *zplane; struct drm_plane *plane = &zplane->plane;
struct drm_plane *plane; struct device *dev = zplane->dev;
const uint32_t *formats; const uint32_t *formats;
unsigned int format_count; unsigned int format_count;
int ret; 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); zx_plane_hbsc_init(zplane);
switch (type) { switch (type) {
...@@ -282,7 +260,7 @@ struct drm_plane *zx_plane_init(struct drm_device *drm, struct device *dev, ...@@ -282,7 +260,7 @@ struct drm_plane *zx_plane_init(struct drm_device *drm, struct device *dev,
/* TODO: add video layer (vl) support */ /* TODO: add video layer (vl) support */
break; break;
default: default:
return ERR_PTR(-ENODEV); return -ENODEV;
} }
ret = drm_universal_plane_init(drm, plane, VOU_CRTC_MASK, 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, ...@@ -290,10 +268,10 @@ struct drm_plane *zx_plane_init(struct drm_device *drm, struct device *dev,
type, NULL); type, NULL);
if (ret) { if (ret) {
DRM_DEV_ERROR(dev, "failed to init universal plane: %d\n", 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); drm_plane_helper_add(plane, helper);
return plane; return 0;
} }
...@@ -11,16 +11,19 @@ ...@@ -11,16 +11,19 @@
#ifndef __ZX_PLANE_H__ #ifndef __ZX_PLANE_H__
#define __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 *layer;
void __iomem *csc; void __iomem *csc;
void __iomem *hbsc; void __iomem *hbsc;
void __iomem *rsz; void __iomem *rsz;
}; };
struct drm_plane *zx_plane_init(struct drm_device *drm, struct device *dev, #define to_zx_plane(plane) container_of(plane, struct zx_plane, plane)
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);
void zx_plane_set_update(struct drm_plane *plane); void zx_plane_set_update(struct drm_plane *plane);
#endif /* __ZX_PLANE_H__ */ #endif /* __ZX_PLANE_H__ */
...@@ -303,7 +303,7 @@ static int zx_crtc_init(struct drm_device *drm, struct zx_vou_hw *vou, ...@@ -303,7 +303,7 @@ static int zx_crtc_init(struct drm_device *drm, struct zx_vou_hw *vou,
enum vou_chn_type chn_type) enum vou_chn_type chn_type)
{ {
struct device *dev = vou->dev; struct device *dev = vou->dev;
struct zx_layer_data data; struct zx_plane *zplane;
struct zx_crtc *zcrtc; struct zx_crtc *zcrtc;
int ret; int ret;
...@@ -314,19 +314,25 @@ static int zx_crtc_init(struct drm_device *drm, struct zx_vou_hw *vou, ...@@ -314,19 +314,25 @@ static int zx_crtc_init(struct drm_device *drm, struct zx_vou_hw *vou,
zcrtc->vou = vou; zcrtc->vou = vou;
zcrtc->chn_type = chn_type; 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) { if (chn_type == VOU_CHN_MAIN) {
data.layer = vou->osd + MAIN_GL_OFFSET; zplane->layer = vou->osd + MAIN_GL_OFFSET;
data.csc = vou->osd + MAIN_CSC_OFFSET; zplane->csc = vou->osd + MAIN_CSC_OFFSET;
data.hbsc = vou->osd + MAIN_HBSC_OFFSET; zplane->hbsc = vou->osd + MAIN_HBSC_OFFSET;
data.rsz = vou->otfppu + MAIN_RSZ_OFFSET; zplane->rsz = vou->otfppu + MAIN_RSZ_OFFSET;
zcrtc->chnreg = vou->osd + OSD_MAIN_CHN; zcrtc->chnreg = vou->osd + OSD_MAIN_CHN;
zcrtc->regs = &main_crtc_regs; zcrtc->regs = &main_crtc_regs;
zcrtc->bits = &main_crtc_bits; zcrtc->bits = &main_crtc_bits;
} else { } else {
data.layer = vou->osd + AUX_GL_OFFSET; zplane->layer = vou->osd + AUX_GL_OFFSET;
data.csc = vou->osd + AUX_CSC_OFFSET; zplane->csc = vou->osd + AUX_CSC_OFFSET;
data.hbsc = vou->osd + AUX_HBSC_OFFSET; zplane->hbsc = vou->osd + AUX_HBSC_OFFSET;
data.rsz = vou->otfppu + AUX_RSZ_OFFSET; zplane->rsz = vou->otfppu + AUX_RSZ_OFFSET;
zcrtc->chnreg = vou->osd + OSD_AUX_CHN; zcrtc->chnreg = vou->osd + OSD_AUX_CHN;
zcrtc->regs = &aux_crtc_regs; zcrtc->regs = &aux_crtc_regs;
zcrtc->bits = &aux_crtc_bits; zcrtc->bits = &aux_crtc_bits;
...@@ -340,13 +346,14 @@ static int zx_crtc_init(struct drm_device *drm, struct zx_vou_hw *vou, ...@@ -340,13 +346,14 @@ static int zx_crtc_init(struct drm_device *drm, struct zx_vou_hw *vou,
return ret; return ret;
} }
zcrtc->primary = zx_plane_init(drm, dev, &data, DRM_PLANE_TYPE_PRIMARY); ret = zx_plane_init(drm, zplane, DRM_PLANE_TYPE_PRIMARY);
if (IS_ERR(zcrtc->primary)) { if (ret) {
ret = PTR_ERR(zcrtc->primary);
DRM_DEV_ERROR(dev, "failed to init primary plane: %d\n", ret); DRM_DEV_ERROR(dev, "failed to init primary plane: %d\n", ret);
return ret; return ret;
} }
zcrtc->primary = &zplane->plane;
ret = drm_crtc_init_with_planes(drm, &zcrtc->crtc, zcrtc->primary, NULL, ret = drm_crtc_init_with_planes(drm, &zcrtc->crtc, zcrtc->primary, NULL,
&zx_crtc_funcs, NULL); &zx_crtc_funcs, NULL);
if (ret) { if (ret) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment