|
@@ -61,6 +61,8 @@ static void exynos_drm_encoder_dpms(struct drm_encoder *encoder, int mode)
|
|
|
struct exynos_drm_display_ops *display_ops =
|
|
|
manager->display_ops;
|
|
|
|
|
|
+ DRM_DEBUG_KMS("connector[%d] dpms[%d]\n",
|
|
|
+ connector->base.id, mode);
|
|
|
if (display_ops && display_ops->power_on)
|
|
|
display_ops->power_on(manager->dev, mode);
|
|
|
}
|
|
@@ -117,15 +119,11 @@ static void exynos_drm_encoder_commit(struct drm_encoder *encoder)
|
|
|
{
|
|
|
struct exynos_drm_manager *manager = exynos_drm_get_manager(encoder);
|
|
|
struct exynos_drm_manager_ops *manager_ops = manager->ops;
|
|
|
- struct exynos_drm_overlay_ops *overlay_ops = manager->overlay_ops;
|
|
|
|
|
|
DRM_DEBUG_KMS("%s\n", __FILE__);
|
|
|
|
|
|
if (manager_ops && manager_ops->commit)
|
|
|
manager_ops->commit(manager->dev);
|
|
|
-
|
|
|
- if (overlay_ops && overlay_ops->commit)
|
|
|
- overlay_ops->commit(manager->dev);
|
|
|
}
|
|
|
|
|
|
static struct drm_crtc *
|
|
@@ -209,10 +207,23 @@ void exynos_drm_fn_encoder(struct drm_crtc *crtc, void *data,
|
|
|
{
|
|
|
struct drm_device *dev = crtc->dev;
|
|
|
struct drm_encoder *encoder;
|
|
|
+ struct exynos_drm_private *private = dev->dev_private;
|
|
|
+ struct exynos_drm_manager *manager;
|
|
|
|
|
|
list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
|
|
|
- if (encoder->crtc != crtc)
|
|
|
- continue;
|
|
|
+ /*
|
|
|
+ * if crtc is detached from encoder, check pipe,
|
|
|
+ * otherwise check crtc attached to encoder
|
|
|
+ */
|
|
|
+ if (!encoder->crtc) {
|
|
|
+ manager = to_exynos_encoder(encoder)->manager;
|
|
|
+ if (manager->pipe < 0 ||
|
|
|
+ private->crtc[manager->pipe] != crtc)
|
|
|
+ continue;
|
|
|
+ } else {
|
|
|
+ if (encoder->crtc != crtc)
|
|
|
+ continue;
|
|
|
+ }
|
|
|
|
|
|
fn(encoder, data);
|
|
|
}
|
|
@@ -251,8 +262,18 @@ void exynos_drm_encoder_crtc_commit(struct drm_encoder *encoder, void *data)
|
|
|
struct exynos_drm_manager *manager =
|
|
|
to_exynos_encoder(encoder)->manager;
|
|
|
struct exynos_drm_overlay_ops *overlay_ops = manager->overlay_ops;
|
|
|
+ int crtc = *(int *)data;
|
|
|
+
|
|
|
+ DRM_DEBUG_KMS("%s\n", __FILE__);
|
|
|
|
|
|
- overlay_ops->commit(manager->dev);
|
|
|
+ /*
|
|
|
+ * when crtc is detached from encoder, this pipe is used
|
|
|
+ * to select manager operation
|
|
|
+ */
|
|
|
+ manager->pipe = crtc;
|
|
|
+
|
|
|
+ if (overlay_ops && overlay_ops->commit)
|
|
|
+ overlay_ops->commit(manager->dev);
|
|
|
}
|
|
|
|
|
|
void exynos_drm_encoder_crtc_mode_set(struct drm_encoder *encoder, void *data)
|
|
@@ -265,6 +286,25 @@ void exynos_drm_encoder_crtc_mode_set(struct drm_encoder *encoder, void *data)
|
|
|
overlay_ops->mode_set(manager->dev, overlay);
|
|
|
}
|
|
|
|
|
|
+void exynos_drm_encoder_crtc_disable(struct drm_encoder *encoder, void *data)
|
|
|
+{
|
|
|
+ struct exynos_drm_manager *manager =
|
|
|
+ to_exynos_encoder(encoder)->manager;
|
|
|
+ struct exynos_drm_overlay_ops *overlay_ops = manager->overlay_ops;
|
|
|
+
|
|
|
+ DRM_DEBUG_KMS("\n");
|
|
|
+
|
|
|
+ overlay_ops->disable(manager->dev);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * crtc is already detached from encoder and last
|
|
|
+ * function for detaching is properly done, so
|
|
|
+ * clear pipe from manager to prevent repeated call
|
|
|
+ */
|
|
|
+ if (!encoder->crtc)
|
|
|
+ manager->pipe = -1;
|
|
|
+}
|
|
|
+
|
|
|
MODULE_AUTHOR("Inki Dae <inki.dae@samsung.com>");
|
|
|
MODULE_AUTHOR("Joonyoung Shim <jy0922.shim@samsung.com>");
|
|
|
MODULE_AUTHOR("Seung-Woo Kim <sw0312.kim@samsung.com>");
|