diff options
| -rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_core.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_drv.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_encoder.c | 34 | ||||
| -rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_encoder.h | 1 |
4 files changed, 42 insertions, 0 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_core.c b/drivers/gpu/drm/exynos/exynos_drm_core.c index 661a03571d0c..d08a55896d50 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_core.c +++ b/drivers/gpu/drm/exynos/exynos_drm_core.c | |||
| @@ -193,6 +193,9 @@ int exynos_drm_subdrv_register(struct exynos_drm_subdrv *subdrv) | |||
| 193 | return err; | 193 | return err; |
| 194 | } | 194 | } |
| 195 | 195 | ||
| 196 | /* setup possible_clones. */ | ||
| 197 | exynos_drm_encoder_setup(drm_dev); | ||
| 198 | |||
| 196 | /* | 199 | /* |
| 197 | * if any specific driver such as fimd or hdmi driver called | 200 | * if any specific driver such as fimd or hdmi driver called |
| 198 | * exynos_drm_subdrv_register() later than drm_load(), | 201 | * exynos_drm_subdrv_register() later than drm_load(), |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c index 2ef12aa30303..76a111f54ccb 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c | |||
| @@ -33,6 +33,7 @@ | |||
| 33 | 33 | ||
| 34 | #include "exynos_drm_drv.h" | 34 | #include "exynos_drm_drv.h" |
| 35 | #include "exynos_drm_crtc.h" | 35 | #include "exynos_drm_crtc.h" |
| 36 | #include "exynos_drm_encoder.h" | ||
| 36 | #include "exynos_drm_fbdev.h" | 37 | #include "exynos_drm_fbdev.h" |
| 37 | #include "exynos_drm_fb.h" | 38 | #include "exynos_drm_fb.h" |
| 38 | #include "exynos_drm_gem.h" | 39 | #include "exynos_drm_gem.h" |
| @@ -99,6 +100,9 @@ static int exynos_drm_load(struct drm_device *dev, unsigned long flags) | |||
| 99 | if (ret) | 100 | if (ret) |
| 100 | goto err_vblank; | 101 | goto err_vblank; |
| 101 | 102 | ||
| 103 | /* setup possible_clones. */ | ||
| 104 | exynos_drm_encoder_setup(dev); | ||
| 105 | |||
| 102 | /* | 106 | /* |
| 103 | * create and configure fb helper and also exynos specific | 107 | * create and configure fb helper and also exynos specific |
| 104 | * fbdev object. | 108 | * fbdev object. |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_encoder.c b/drivers/gpu/drm/exynos/exynos_drm_encoder.c index 86b93dde219a..ef4754f1519b 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_encoder.c +++ b/drivers/gpu/drm/exynos/exynos_drm_encoder.c | |||
| @@ -195,6 +195,40 @@ static struct drm_encoder_funcs exynos_encoder_funcs = { | |||
| 195 | .destroy = exynos_drm_encoder_destroy, | 195 | .destroy = exynos_drm_encoder_destroy, |
| 196 | }; | 196 | }; |
| 197 | 197 | ||
| 198 | static unsigned int exynos_drm_encoder_clones(struct drm_encoder *encoder) | ||
| 199 | { | ||
| 200 | struct drm_encoder *clone; | ||
| 201 | struct drm_device *dev = encoder->dev; | ||
| 202 | struct exynos_drm_encoder *exynos_encoder = to_exynos_encoder(encoder); | ||
| 203 | struct exynos_drm_display_ops *display_ops = | ||
| 204 | exynos_encoder->manager->display_ops; | ||
| 205 | unsigned int clone_mask = 0; | ||
| 206 | int cnt = 0; | ||
| 207 | |||
| 208 | list_for_each_entry(clone, &dev->mode_config.encoder_list, head) { | ||
| 209 | switch (display_ops->type) { | ||
| 210 | case EXYNOS_DISPLAY_TYPE_LCD: | ||
| 211 | case EXYNOS_DISPLAY_TYPE_HDMI: | ||
| 212 | clone_mask |= (1 << (cnt++)); | ||
| 213 | break; | ||
| 214 | default: | ||
| 215 | continue; | ||
| 216 | } | ||
| 217 | } | ||
| 218 | |||
| 219 | return clone_mask; | ||
| 220 | } | ||
| 221 | |||
| 222 | void exynos_drm_encoder_setup(struct drm_device *dev) | ||
| 223 | { | ||
| 224 | struct drm_encoder *encoder; | ||
| 225 | |||
| 226 | DRM_DEBUG_KMS("%s\n", __FILE__); | ||
| 227 | |||
| 228 | list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) | ||
| 229 | encoder->possible_clones = exynos_drm_encoder_clones(encoder); | ||
| 230 | } | ||
| 231 | |||
| 198 | struct drm_encoder * | 232 | struct drm_encoder * |
| 199 | exynos_drm_encoder_create(struct drm_device *dev, | 233 | exynos_drm_encoder_create(struct drm_device *dev, |
| 200 | struct exynos_drm_manager *manager, | 234 | struct exynos_drm_manager *manager, |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_encoder.h b/drivers/gpu/drm/exynos/exynos_drm_encoder.h index 97b087a51cb6..eb7d2316847e 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_encoder.h +++ b/drivers/gpu/drm/exynos/exynos_drm_encoder.h | |||
| @@ -30,6 +30,7 @@ | |||
| 30 | 30 | ||
| 31 | struct exynos_drm_manager; | 31 | struct exynos_drm_manager; |
| 32 | 32 | ||
| 33 | void exynos_drm_encoder_setup(struct drm_device *dev); | ||
| 33 | struct drm_encoder *exynos_drm_encoder_create(struct drm_device *dev, | 34 | struct drm_encoder *exynos_drm_encoder_create(struct drm_device *dev, |
| 34 | struct exynos_drm_manager *mgr, | 35 | struct exynos_drm_manager *mgr, |
| 35 | unsigned int possible_crtcs); | 36 | unsigned int possible_crtcs); |
