|
@@ -327,6 +327,42 @@ static void mtk_crtc_ddp_hw_fini(struct mtk_drm_crtc *mtk_crtc)
|
|
|
pm_runtime_put(drm->dev);
|
|
|
}
|
|
|
|
|
|
+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];
|
|
|
+ unsigned int i;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * TODO: instead of updating the registers here, we should prepare
|
|
|
+ * working registers in atomic_commit and let the hardware command
|
|
|
+ * queue update module registers on vblank.
|
|
|
+ */
|
|
|
+ if (state->pending_config) {
|
|
|
+ mtk_ddp_comp_config(ovl, state->pending_width,
|
|
|
+ state->pending_height,
|
|
|
+ state->pending_vrefresh, 0);
|
|
|
+
|
|
|
+ state->pending_config = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (mtk_crtc->pending_planes) {
|
|
|
+ for (i = 0; i < OVL_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);
|
|
|
+ plane_state->pending.config = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ mtk_crtc->pending_planes = false;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static void mtk_drm_crtc_enable(struct drm_crtc *crtc)
|
|
|
{
|
|
|
struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);
|
|
@@ -403,6 +439,7 @@ static void mtk_drm_crtc_atomic_flush(struct drm_crtc *crtc,
|
|
|
struct drm_crtc_state *old_crtc_state)
|
|
|
{
|
|
|
struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);
|
|
|
+ struct mtk_drm_private *priv = crtc->dev->dev_private;
|
|
|
unsigned int pending_planes = 0;
|
|
|
int i;
|
|
|
|
|
@@ -424,6 +461,12 @@ static void mtk_drm_crtc_atomic_flush(struct drm_crtc *crtc,
|
|
|
if (crtc->state->color_mgmt_changed)
|
|
|
for (i = 0; i < mtk_crtc->ddp_comp_nr; i++)
|
|
|
mtk_ddp_gamma_set(mtk_crtc->ddp_comp[i], crtc->state);
|
|
|
+
|
|
|
+ if (priv->data->shadow_register) {
|
|
|
+ mtk_disp_mutex_acquire(mtk_crtc->mutex);
|
|
|
+ mtk_crtc_ddp_config(crtc);
|
|
|
+ mtk_disp_mutex_release(mtk_crtc->mutex);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static const struct drm_crtc_funcs mtk_crtc_funcs = {
|
|
@@ -471,36 +514,10 @@ err_cleanup_crtc:
|
|
|
void mtk_crtc_ddp_irq(struct drm_crtc *crtc, struct mtk_ddp_comp *ovl)
|
|
|
{
|
|
|
struct mtk_drm_crtc *mtk_crtc = to_mtk_crtc(crtc);
|
|
|
- struct mtk_crtc_state *state = to_mtk_crtc_state(mtk_crtc->base.state);
|
|
|
- unsigned int i;
|
|
|
+ struct mtk_drm_private *priv = crtc->dev->dev_private;
|
|
|
|
|
|
- /*
|
|
|
- * TODO: instead of updating the registers here, we should prepare
|
|
|
- * working registers in atomic_commit and let the hardware command
|
|
|
- * queue update module registers on vblank.
|
|
|
- */
|
|
|
- if (state->pending_config) {
|
|
|
- mtk_ddp_comp_config(ovl, state->pending_width,
|
|
|
- state->pending_height,
|
|
|
- state->pending_vrefresh, 0);
|
|
|
-
|
|
|
- state->pending_config = false;
|
|
|
- }
|
|
|
-
|
|
|
- if (mtk_crtc->pending_planes) {
|
|
|
- for (i = 0; i < OVL_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);
|
|
|
- plane_state->pending.config = false;
|
|
|
- }
|
|
|
- }
|
|
|
- mtk_crtc->pending_planes = false;
|
|
|
- }
|
|
|
+ if (!priv->data->shadow_register)
|
|
|
+ mtk_crtc_ddp_config(crtc);
|
|
|
|
|
|
mtk_drm_finish_page_flip(mtk_crtc);
|
|
|
}
|