diff options
Diffstat (limited to 'drivers/gpu/drm/mediatek/mtk_drm_crtc.c')
| -rw-r--r-- | drivers/gpu/drm/mediatek/mtk_drm_crtc.c | 47 | 
1 files changed, 27 insertions, 20 deletions
| diff --git a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c index 2d6aa150a9ff..0b976dfd04df 100644 --- a/drivers/gpu/drm/mediatek/mtk_drm_crtc.c +++ b/drivers/gpu/drm/mediatek/mtk_drm_crtc.c @@ -45,7 +45,8 @@ struct mtk_drm_crtc {  	bool				pending_needs_vblank;  	struct drm_pending_vblank_event	*event; -	struct drm_plane		planes[OVL_LAYER_NR]; +	struct drm_plane		*planes; +	unsigned int			layer_nr;  	bool				pending_planes;  	void __iomem			*config_regs; @@ -171,9 +172,9 @@ static void mtk_drm_crtc_mode_set_nofb(struct drm_crtc *crtc)  static int mtk_drm_crtc_enable_vblank(struct drm_crtc *crtc)  {  	struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc); -	struct mtk_ddp_comp *ovl = mtk_crtc->ddp_comp[0]; +	struct mtk_ddp_comp *comp = mtk_crtc->ddp_comp[0]; -	mtk_ddp_comp_enable_vblank(ovl, &mtk_crtc->base); +	mtk_ddp_comp_enable_vblank(comp, &mtk_crtc->base);  	return 0;  } @@ -181,9 +182,9 @@ static int mtk_drm_crtc_enable_vblank(struct drm_crtc *crtc)  static void mtk_drm_crtc_disable_vblank(struct drm_crtc *crtc)  {  	struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc); -	struct mtk_ddp_comp *ovl = mtk_crtc->ddp_comp[0]; +	struct mtk_ddp_comp *comp = mtk_crtc->ddp_comp[0]; -	mtk_ddp_comp_disable_vblank(ovl); +	mtk_ddp_comp_disable_vblank(comp);  }  static int mtk_crtc_ddp_clk_enable(struct mtk_drm_crtc *mtk_crtc) @@ -286,7 +287,7 @@ static int mtk_crtc_ddp_hw_init(struct mtk_drm_crtc *mtk_crtc)  	}  	/* Initially configure all planes */ -	for (i = 0; i < OVL_LAYER_NR; i++) { +	for (i = 0; i < mtk_crtc->layer_nr; i++) {  		struct drm_plane *plane = &mtk_crtc->planes[i];  		struct mtk_plane_state *plane_state; @@ -334,7 +335,7 @@ static void mtk_crtc_ddp_config(struct drm_crtc *crtc)  {  	struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);  	struct mtk_crtc_state *state = to_mtk_crtc_state(mtk_crtc->base.state); -	struct mtk_ddp_comp *ovl = mtk_crtc->ddp_comp[0]; +	struct mtk_ddp_comp *comp = mtk_crtc->ddp_comp[0];  	unsigned int i;  	/* @@ -343,7 +344,7 @@ static void mtk_crtc_ddp_config(struct drm_crtc *crtc)  	 * queue update module registers on vblank.  	 */  	if (state->pending_config) { -		mtk_ddp_comp_config(ovl, state->pending_width, +		mtk_ddp_comp_config(comp, state->pending_width,  				    state->pending_height,  				    state->pending_vrefresh, 0); @@ -351,14 +352,14 @@ static void mtk_crtc_ddp_config(struct drm_crtc *crtc)  	}  	if (mtk_crtc->pending_planes) { -		for (i = 0; i < OVL_LAYER_NR; i++) { +		for (i = 0; i < mtk_crtc->layer_nr; i++) {  			struct drm_plane *plane = &mtk_crtc->planes[i];  			struct mtk_plane_state *plane_state;  			plane_state = to_mtk_plane_state(plane->state);  			if (plane_state->pending.config) { -				mtk_ddp_comp_layer_config(ovl, i, plane_state); +				mtk_ddp_comp_layer_config(comp, i, plane_state);  				plane_state->pending.config = false;  			}  		} @@ -370,12 +371,12 @@ static void mtk_drm_crtc_atomic_enable(struct drm_crtc *crtc,  				       struct drm_crtc_state *old_state)  {  	struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc); -	struct mtk_ddp_comp *ovl = mtk_crtc->ddp_comp[0]; +	struct mtk_ddp_comp *comp = mtk_crtc->ddp_comp[0];  	int ret;  	DRM_DEBUG_DRIVER("%s %d\n", __func__, crtc->base.id); -	ret = mtk_smi_larb_get(ovl->larb_dev); +	ret = mtk_smi_larb_get(comp->larb_dev);  	if (ret) {  		DRM_ERROR("Failed to get larb: %d\n", ret);  		return; @@ -383,7 +384,7 @@ static void mtk_drm_crtc_atomic_enable(struct drm_crtc *crtc,  	ret = mtk_crtc_ddp_hw_init(mtk_crtc);  	if (ret) { -		mtk_smi_larb_put(ovl->larb_dev); +		mtk_smi_larb_put(comp->larb_dev);  		return;  	} @@ -395,7 +396,7 @@ static void mtk_drm_crtc_atomic_disable(struct drm_crtc *crtc,  					struct drm_crtc_state *old_state)  {  	struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc); -	struct mtk_ddp_comp *ovl = mtk_crtc->ddp_comp[0]; +	struct mtk_ddp_comp *comp = mtk_crtc->ddp_comp[0];  	int i;  	DRM_DEBUG_DRIVER("%s %d\n", __func__, crtc->base.id); @@ -403,7 +404,7 @@ static void mtk_drm_crtc_atomic_disable(struct drm_crtc *crtc,  		return;  	/* Set all pending plane state to disabled */ -	for (i = 0; i < OVL_LAYER_NR; i++) { +	for (i = 0; i < mtk_crtc->layer_nr; i++) {  		struct drm_plane *plane = &mtk_crtc->planes[i];  		struct mtk_plane_state *plane_state; @@ -418,7 +419,7 @@ static void mtk_drm_crtc_atomic_disable(struct drm_crtc *crtc,  	drm_crtc_vblank_off(crtc);  	mtk_crtc_ddp_hw_fini(mtk_crtc); -	mtk_smi_larb_put(ovl->larb_dev); +	mtk_smi_larb_put(comp->larb_dev);  	mtk_crtc->enabled = false;  } @@ -450,7 +451,7 @@ static void mtk_drm_crtc_atomic_flush(struct drm_crtc *crtc,  	if (mtk_crtc->event)  		mtk_crtc->pending_needs_vblank = true; -	for (i = 0; i < OVL_LAYER_NR; i++) { +	for (i = 0; i < mtk_crtc->layer_nr; i++) {  		struct drm_plane *plane = &mtk_crtc->planes[i];  		struct mtk_plane_state *plane_state; @@ -516,7 +517,7 @@ err_cleanup_crtc:  	return ret;  } -void mtk_crtc_ddp_irq(struct drm_crtc *crtc, struct mtk_ddp_comp *ovl) +void mtk_crtc_ddp_irq(struct drm_crtc *crtc, struct mtk_ddp_comp *comp)  {  	struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);  	struct mtk_drm_private *priv = crtc->dev->dev_private; @@ -598,7 +599,12 @@ int mtk_drm_crtc_create(struct drm_device *drm_dev,  		mtk_crtc->ddp_comp[i] = comp;  	} -	for (zpos = 0; zpos < OVL_LAYER_NR; zpos++) { +	mtk_crtc->layer_nr = mtk_ddp_comp_layer_nr(mtk_crtc->ddp_comp[0]); +	mtk_crtc->planes = devm_kzalloc(dev, mtk_crtc->layer_nr * +					sizeof(struct drm_plane), +					GFP_KERNEL); + +	for (zpos = 0; zpos < mtk_crtc->layer_nr; zpos++) {  		type = (zpos == 0) ? DRM_PLANE_TYPE_PRIMARY :  				(zpos == 1) ? DRM_PLANE_TYPE_CURSOR :  						DRM_PLANE_TYPE_OVERLAY; @@ -609,7 +615,8 @@ int mtk_drm_crtc_create(struct drm_device *drm_dev,  	}  	ret = mtk_drm_crtc_init(drm_dev, mtk_crtc, &mtk_crtc->planes[0], -				&mtk_crtc->planes[1], pipe); +				mtk_crtc->layer_nr > 1 ? &mtk_crtc->planes[1] : +				NULL, pipe);  	if (ret < 0)  		goto unprepare;  	drm_mode_crtc_set_gamma_size(&mtk_crtc->base, MTK_LUT_SIZE); |