mirror of https://gitee.com/openkylin/linux.git
drm/exynos: fix to set pipe of crtc
It is enough to set pipe of crtc to manager only when do mode_set of crtc. Signed-off-by: Joonyoung Shim <jy0922.shim@samsung.com> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com> Signed-off-by: Inki Dae <inki.dae@samsung.com>
This commit is contained in:
parent
aeb292245a
commit
d249ce024b
drivers/gpu/drm/exynos
|
@ -67,8 +67,7 @@ static void exynos_drm_crtc_apply(struct drm_crtc *crtc)
|
||||||
|
|
||||||
exynos_drm_fn_encoder(crtc, overlay,
|
exynos_drm_fn_encoder(crtc, overlay,
|
||||||
exynos_drm_encoder_crtc_mode_set);
|
exynos_drm_encoder_crtc_mode_set);
|
||||||
exynos_drm_fn_encoder(crtc, &exynos_crtc->pipe,
|
exynos_drm_fn_encoder(crtc, NULL, exynos_drm_encoder_crtc_commit);
|
||||||
exynos_drm_encoder_crtc_commit);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int exynos_drm_overlay_update(struct exynos_drm_overlay *overlay,
|
int exynos_drm_overlay_update(struct exynos_drm_overlay *overlay,
|
||||||
|
@ -231,8 +230,7 @@ static void exynos_drm_crtc_commit(struct drm_crtc *crtc)
|
||||||
exynos_drm_encoder_dpms_from_crtc);
|
exynos_drm_encoder_dpms_from_crtc);
|
||||||
}
|
}
|
||||||
|
|
||||||
exynos_drm_fn_encoder(crtc, &exynos_crtc->pipe,
|
exynos_drm_fn_encoder(crtc, NULL, exynos_drm_encoder_crtc_commit);
|
||||||
exynos_drm_encoder_crtc_commit);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
|
@ -253,6 +251,7 @@ exynos_drm_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mode,
|
||||||
{
|
{
|
||||||
struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc);
|
struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc);
|
||||||
struct exynos_drm_overlay *overlay = &exynos_crtc->overlay;
|
struct exynos_drm_overlay *overlay = &exynos_crtc->overlay;
|
||||||
|
int pipe = exynos_crtc->pipe;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
DRM_DEBUG_KMS("%s\n", __FILE__);
|
DRM_DEBUG_KMS("%s\n", __FILE__);
|
||||||
|
@ -268,6 +267,7 @@ exynos_drm_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mode,
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
exynos_drm_fn_encoder(crtc, overlay, exynos_drm_encoder_crtc_mode_set);
|
exynos_drm_fn_encoder(crtc, overlay, exynos_drm_encoder_crtc_mode_set);
|
||||||
|
exynos_drm_fn_encoder(crtc, &pipe, exynos_drm_encoder_crtc_pipe);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,6 @@
|
||||||
#include "drm_crtc_helper.h"
|
#include "drm_crtc_helper.h"
|
||||||
|
|
||||||
#include "exynos_drm_drv.h"
|
#include "exynos_drm_drv.h"
|
||||||
#include "exynos_drm_crtc.h"
|
|
||||||
#include "exynos_drm_encoder.h"
|
#include "exynos_drm_encoder.h"
|
||||||
|
|
||||||
#define to_exynos_encoder(x) container_of(x, struct exynos_drm_encoder,\
|
#define to_exynos_encoder(x) container_of(x, struct exynos_drm_encoder,\
|
||||||
|
@ -303,8 +302,8 @@ void exynos_drm_enable_vblank(struct drm_encoder *encoder, void *data)
|
||||||
struct exynos_drm_manager_ops *manager_ops = manager->ops;
|
struct exynos_drm_manager_ops *manager_ops = manager->ops;
|
||||||
int crtc = *(int *)data;
|
int crtc = *(int *)data;
|
||||||
|
|
||||||
if (manager->pipe == -1)
|
if (manager->pipe != crtc)
|
||||||
manager->pipe = crtc;
|
return;
|
||||||
|
|
||||||
if (manager_ops->enable_vblank)
|
if (manager_ops->enable_vblank)
|
||||||
manager_ops->enable_vblank(manager->dev);
|
manager_ops->enable_vblank(manager->dev);
|
||||||
|
@ -317,8 +316,8 @@ void exynos_drm_disable_vblank(struct drm_encoder *encoder, void *data)
|
||||||
struct exynos_drm_manager_ops *manager_ops = manager->ops;
|
struct exynos_drm_manager_ops *manager_ops = manager->ops;
|
||||||
int crtc = *(int *)data;
|
int crtc = *(int *)data;
|
||||||
|
|
||||||
if (manager->pipe == -1)
|
if (manager->pipe != crtc)
|
||||||
manager->pipe = crtc;
|
return;
|
||||||
|
|
||||||
if (manager_ops->disable_vblank)
|
if (manager_ops->disable_vblank)
|
||||||
manager_ops->disable_vblank(manager->dev);
|
manager_ops->disable_vblank(manager->dev);
|
||||||
|
@ -341,19 +340,10 @@ void exynos_drm_encoder_crtc_plane_commit(struct drm_encoder *encoder,
|
||||||
|
|
||||||
void exynos_drm_encoder_crtc_commit(struct drm_encoder *encoder, void *data)
|
void exynos_drm_encoder_crtc_commit(struct drm_encoder *encoder, void *data)
|
||||||
{
|
{
|
||||||
struct exynos_drm_manager *manager =
|
|
||||||
to_exynos_encoder(encoder)->manager;
|
|
||||||
int crtc = *(int *)data;
|
|
||||||
int zpos = DEFAULT_ZPOS;
|
int zpos = DEFAULT_ZPOS;
|
||||||
|
|
||||||
DRM_DEBUG_KMS("%s\n", __FILE__);
|
DRM_DEBUG_KMS("%s\n", __FILE__);
|
||||||
|
|
||||||
/*
|
|
||||||
* when crtc is detached from encoder, this pipe is used
|
|
||||||
* to select manager operation
|
|
||||||
*/
|
|
||||||
manager->pipe = crtc;
|
|
||||||
|
|
||||||
exynos_drm_encoder_crtc_plane_commit(encoder, &zpos);
|
exynos_drm_encoder_crtc_plane_commit(encoder, &zpos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -429,3 +419,18 @@ void exynos_drm_encoder_crtc_disable(struct drm_encoder *encoder, void *data)
|
||||||
if (overlay_ops && overlay_ops->disable)
|
if (overlay_ops && overlay_ops->disable)
|
||||||
overlay_ops->disable(manager->dev, zpos);
|
overlay_ops->disable(manager->dev, zpos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void exynos_drm_encoder_crtc_pipe(struct drm_encoder *encoder, void *data)
|
||||||
|
{
|
||||||
|
struct exynos_drm_manager *manager =
|
||||||
|
to_exynos_encoder(encoder)->manager;
|
||||||
|
int pipe = *(int *)data;
|
||||||
|
|
||||||
|
DRM_DEBUG_KMS("%s\n", __FILE__);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* when crtc is detached from encoder, this pipe is used
|
||||||
|
* to select manager operation
|
||||||
|
*/
|
||||||
|
manager->pipe = pipe;
|
||||||
|
}
|
||||||
|
|
|
@ -48,5 +48,6 @@ void exynos_drm_encoder_dpms_from_crtc(struct drm_encoder *encoder,
|
||||||
void exynos_drm_encoder_crtc_dpms(struct drm_encoder *encoder, void *data);
|
void exynos_drm_encoder_crtc_dpms(struct drm_encoder *encoder, void *data);
|
||||||
void exynos_drm_encoder_crtc_mode_set(struct drm_encoder *encoder, void *data);
|
void exynos_drm_encoder_crtc_mode_set(struct drm_encoder *encoder, void *data);
|
||||||
void exynos_drm_encoder_crtc_disable(struct drm_encoder *encoder, void *data);
|
void exynos_drm_encoder_crtc_disable(struct drm_encoder *encoder, void *data);
|
||||||
|
void exynos_drm_encoder_crtc_pipe(struct drm_encoder *encoder, void *data);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue