diff options
| -rw-r--r-- | MAINTAINERS | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/exynos/Kconfig | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_connector.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_encoder.c | 33 | ||||
| -rw-r--r-- | drivers/gpu/drm/exynos/exynos_mixer.c | 2 |
5 files changed, 21 insertions, 18 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index 1fa907441f8f..a6391ce40ccf 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -2507,6 +2507,7 @@ M: Joonyoung Shim <jy0922.shim@samsung.com> | |||
| 2507 | M: Seung-Woo Kim <sw0312.kim@samsung.com> | 2507 | M: Seung-Woo Kim <sw0312.kim@samsung.com> |
| 2508 | M: Kyungmin Park <kyungmin.park@samsung.com> | 2508 | M: Kyungmin Park <kyungmin.park@samsung.com> |
| 2509 | L: dri-devel@lists.freedesktop.org | 2509 | L: dri-devel@lists.freedesktop.org |
| 2510 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/daeinki/drm-exynos.git | ||
| 2510 | S: Supported | 2511 | S: Supported |
| 2511 | F: drivers/gpu/drm/exynos | 2512 | F: drivers/gpu/drm/exynos |
| 2512 | F: include/drm/exynos* | 2513 | F: include/drm/exynos* |
diff --git a/drivers/gpu/drm/exynos/Kconfig b/drivers/gpu/drm/exynos/Kconfig index 59a26e577b57..fc345d4ebb03 100644 --- a/drivers/gpu/drm/exynos/Kconfig +++ b/drivers/gpu/drm/exynos/Kconfig | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | config DRM_EXYNOS | 1 | config DRM_EXYNOS |
| 2 | tristate "DRM Support for Samsung SoC EXYNOS Series" | 2 | tristate "DRM Support for Samsung SoC EXYNOS Series" |
| 3 | depends on DRM && PLAT_SAMSUNG | 3 | depends on DRM && (PLAT_SAMSUNG || ARCH_MULTIPLATFORM) |
| 4 | select DRM_KMS_HELPER | 4 | select DRM_KMS_HELPER |
| 5 | select FB_CFB_FILLRECT | 5 | select FB_CFB_FILLRECT |
| 6 | select FB_CFB_COPYAREA | 6 | select FB_CFB_COPYAREA |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_connector.c b/drivers/gpu/drm/exynos/exynos_drm_connector.c index 18c271862ca8..0f68a2872673 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_connector.c +++ b/drivers/gpu/drm/exynos/exynos_drm_connector.c | |||
| @@ -374,6 +374,7 @@ struct drm_connector *exynos_drm_connector_create(struct drm_device *dev, | |||
| 374 | exynos_connector->encoder_id = encoder->base.id; | 374 | exynos_connector->encoder_id = encoder->base.id; |
| 375 | exynos_connector->manager = manager; | 375 | exynos_connector->manager = manager; |
| 376 | exynos_connector->dpms = DRM_MODE_DPMS_OFF; | 376 | exynos_connector->dpms = DRM_MODE_DPMS_OFF; |
| 377 | connector->dpms = DRM_MODE_DPMS_OFF; | ||
| 377 | connector->encoder = encoder; | 378 | connector->encoder = encoder; |
| 378 | 379 | ||
| 379 | err = drm_mode_connector_attach_encoder(connector, encoder); | 380 | err = drm_mode_connector_attach_encoder(connector, encoder); |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_encoder.c b/drivers/gpu/drm/exynos/exynos_drm_encoder.c index e51503fbaf2b..241ad1eeec64 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_encoder.c +++ b/drivers/gpu/drm/exynos/exynos_drm_encoder.c | |||
| @@ -43,12 +43,14 @@ | |||
| 43 | * @manager: specific encoder has its own manager to control a hardware | 43 | * @manager: specific encoder has its own manager to control a hardware |
| 44 | * appropriately and we can access a hardware drawing on this manager. | 44 | * appropriately and we can access a hardware drawing on this manager. |
| 45 | * @dpms: store the encoder dpms value. | 45 | * @dpms: store the encoder dpms value. |
| 46 | * @updated: indicate whether overlay data updating is needed or not. | ||
| 46 | */ | 47 | */ |
| 47 | struct exynos_drm_encoder { | 48 | struct exynos_drm_encoder { |
| 48 | struct drm_crtc *old_crtc; | 49 | struct drm_crtc *old_crtc; |
| 49 | struct drm_encoder drm_encoder; | 50 | struct drm_encoder drm_encoder; |
| 50 | struct exynos_drm_manager *manager; | 51 | struct exynos_drm_manager *manager; |
| 51 | int dpms; | 52 | int dpms; |
| 53 | bool updated; | ||
| 52 | }; | 54 | }; |
| 53 | 55 | ||
| 54 | static void exynos_drm_connector_power(struct drm_encoder *encoder, int mode) | 56 | static void exynos_drm_connector_power(struct drm_encoder *encoder, int mode) |
| @@ -85,7 +87,9 @@ static void exynos_drm_encoder_dpms(struct drm_encoder *encoder, int mode) | |||
| 85 | switch (mode) { | 87 | switch (mode) { |
| 86 | case DRM_MODE_DPMS_ON: | 88 | case DRM_MODE_DPMS_ON: |
| 87 | if (manager_ops && manager_ops->apply) | 89 | if (manager_ops && manager_ops->apply) |
| 88 | manager_ops->apply(manager->dev); | 90 | if (!exynos_encoder->updated) |
| 91 | manager_ops->apply(manager->dev); | ||
| 92 | |||
| 89 | exynos_drm_connector_power(encoder, mode); | 93 | exynos_drm_connector_power(encoder, mode); |
| 90 | exynos_encoder->dpms = mode; | 94 | exynos_encoder->dpms = mode; |
| 91 | break; | 95 | break; |
| @@ -94,6 +98,7 @@ static void exynos_drm_encoder_dpms(struct drm_encoder *encoder, int mode) | |||
| 94 | case DRM_MODE_DPMS_OFF: | 98 | case DRM_MODE_DPMS_OFF: |
| 95 | exynos_drm_connector_power(encoder, mode); | 99 | exynos_drm_connector_power(encoder, mode); |
| 96 | exynos_encoder->dpms = mode; | 100 | exynos_encoder->dpms = mode; |
| 101 | exynos_encoder->updated = false; | ||
| 97 | break; | 102 | break; |
| 98 | default: | 103 | default: |
| 99 | DRM_ERROR("unspecified mode %d\n", mode); | 104 | DRM_ERROR("unspecified mode %d\n", mode); |
| @@ -205,13 +210,22 @@ static void exynos_drm_encoder_prepare(struct drm_encoder *encoder) | |||
| 205 | 210 | ||
| 206 | static void exynos_drm_encoder_commit(struct drm_encoder *encoder) | 211 | static void exynos_drm_encoder_commit(struct drm_encoder *encoder) |
| 207 | { | 212 | { |
| 208 | struct exynos_drm_manager *manager = exynos_drm_get_manager(encoder); | 213 | struct exynos_drm_encoder *exynos_encoder = to_exynos_encoder(encoder); |
| 214 | struct exynos_drm_manager *manager = exynos_encoder->manager; | ||
| 209 | struct exynos_drm_manager_ops *manager_ops = manager->ops; | 215 | struct exynos_drm_manager_ops *manager_ops = manager->ops; |
| 210 | 216 | ||
| 211 | DRM_DEBUG_KMS("%s\n", __FILE__); | 217 | DRM_DEBUG_KMS("%s\n", __FILE__); |
| 212 | 218 | ||
| 213 | if (manager_ops && manager_ops->commit) | 219 | if (manager_ops && manager_ops->commit) |
| 214 | manager_ops->commit(manager->dev); | 220 | manager_ops->commit(manager->dev); |
| 221 | |||
| 222 | /* | ||
| 223 | * this will avoid one issue that overlay data is updated to | ||
| 224 | * real hardware two times. | ||
| 225 | * And this variable will be used to check if the data was | ||
| 226 | * already updated or not by exynos_drm_encoder_dpms function. | ||
| 227 | */ | ||
| 228 | exynos_encoder->updated = true; | ||
| 215 | } | 229 | } |
| 216 | 230 | ||
| 217 | static void exynos_drm_encoder_disable(struct drm_encoder *encoder) | 231 | static void exynos_drm_encoder_disable(struct drm_encoder *encoder) |
| @@ -401,19 +415,6 @@ void exynos_drm_encoder_crtc_dpms(struct drm_encoder *encoder, void *data) | |||
| 401 | manager_ops->dpms(manager->dev, mode); | 415 | manager_ops->dpms(manager->dev, mode); |
| 402 | 416 | ||
| 403 | /* | 417 | /* |
| 404 | * set current mode to new one so that data aren't updated into | ||
| 405 | * registers by drm_helper_connector_dpms two times. | ||
| 406 | * | ||
| 407 | * in case that drm_crtc_helper_set_mode() is called, | ||
| 408 | * overlay_ops->commit() and manager_ops->commit() callbacks | ||
| 409 | * can be called two times, first at drm_crtc_helper_set_mode() | ||
| 410 | * and second at drm_helper_connector_dpms(). | ||
| 411 | * so with this setting, when drm_helper_connector_dpms() is called | ||
| 412 | * encoder->funcs->dpms() will be ignored. | ||
| 413 | */ | ||
| 414 | exynos_encoder->dpms = mode; | ||
| 415 | |||
| 416 | /* | ||
| 417 | * if this condition is ok then it means that the crtc is already | 418 | * if this condition is ok then it means that the crtc is already |
| 418 | * detached from encoder and last function for detaching is properly | 419 | * detached from encoder and last function for detaching is properly |
| 419 | * done, so clear pipe from manager to prevent repeated call. | 420 | * done, so clear pipe from manager to prevent repeated call. |
diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c b/drivers/gpu/drm/exynos/exynos_mixer.c index 614b2e9ac462..e7fbb823fd8e 100644 --- a/drivers/gpu/drm/exynos/exynos_mixer.c +++ b/drivers/gpu/drm/exynos/exynos_mixer.c | |||
| @@ -1142,7 +1142,7 @@ static int __devinit mixer_probe(struct platform_device *pdev) | |||
| 1142 | const struct of_device_id *match; | 1142 | const struct of_device_id *match; |
| 1143 | match = of_match_node(of_match_ptr(mixer_match_types), | 1143 | match = of_match_node(of_match_ptr(mixer_match_types), |
| 1144 | pdev->dev.of_node); | 1144 | pdev->dev.of_node); |
| 1145 | drv = match->data; | 1145 | drv = (struct mixer_drv_data *)match->data; |
| 1146 | } else { | 1146 | } else { |
| 1147 | drv = (struct mixer_drv_data *) | 1147 | drv = (struct mixer_drv_data *) |
| 1148 | platform_get_device_id(pdev)->driver_data; | 1148 | platform_get_device_id(pdev)->driver_data; |
