diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2016-08-29 04:27:49 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2016-08-29 09:37:03 -0400 |
commit | 321a95ae35f2ec4f58c4cda28d3606cc6f2b97d1 (patch) | |
tree | 2f765ea3ec7aaf732e5bf4fb0fc23144709c9521 /drivers/gpu/drm/drm_crtc.c | |
parent | 749cc6f7ed509e1be04e9c26d9cdc3c1f0dd13b4 (diff) |
drm: Extract drm_encoder.[hc]
Same treatment as before. Only hiccup is drm_crtc_mask, which
unfortunately can't be resolved until drm_crtc.h is less of a monster.
Untangle the header loop with a forward declaration for that static
inline.
Reviewed-by: Archit Taneja <architt@codeaurora.org>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20160829082757.17913-1-daniel.vetter@ffwll.ch
Diffstat (limited to 'drivers/gpu/drm/drm_crtc.c')
-rw-r--r-- | drivers/gpu/drm/drm_crtc.c | 193 |
1 files changed, 0 insertions, 193 deletions
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index 7f2510524f09..219cd4ee23b7 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c | |||
@@ -54,18 +54,6 @@ static const struct drm_prop_enum_list drm_plane_type_enum_list[] = { | |||
54 | { DRM_PLANE_TYPE_CURSOR, "Cursor" }, | 54 | { DRM_PLANE_TYPE_CURSOR, "Cursor" }, |
55 | }; | 55 | }; |
56 | 56 | ||
57 | static const struct drm_prop_enum_list drm_encoder_enum_list[] = { | ||
58 | { DRM_MODE_ENCODER_NONE, "None" }, | ||
59 | { DRM_MODE_ENCODER_DAC, "DAC" }, | ||
60 | { DRM_MODE_ENCODER_TMDS, "TMDS" }, | ||
61 | { DRM_MODE_ENCODER_LVDS, "LVDS" }, | ||
62 | { DRM_MODE_ENCODER_TVDAC, "TV" }, | ||
63 | { DRM_MODE_ENCODER_VIRTUAL, "Virtual" }, | ||
64 | { DRM_MODE_ENCODER_DSI, "DSI" }, | ||
65 | { DRM_MODE_ENCODER_DPMST, "DP MST" }, | ||
66 | { DRM_MODE_ENCODER_DPI, "DPI" }, | ||
67 | }; | ||
68 | |||
69 | /* | 57 | /* |
70 | * Optional properties | 58 | * Optional properties |
71 | */ | 59 | */ |
@@ -419,117 +407,6 @@ void drm_crtc_cleanup(struct drm_crtc *crtc) | |||
419 | } | 407 | } |
420 | EXPORT_SYMBOL(drm_crtc_cleanup); | 408 | EXPORT_SYMBOL(drm_crtc_cleanup); |
421 | 409 | ||
422 | static int drm_encoder_register_all(struct drm_device *dev) | ||
423 | { | ||
424 | struct drm_encoder *encoder; | ||
425 | int ret = 0; | ||
426 | |||
427 | drm_for_each_encoder(encoder, dev) { | ||
428 | if (encoder->funcs->late_register) | ||
429 | ret = encoder->funcs->late_register(encoder); | ||
430 | if (ret) | ||
431 | return ret; | ||
432 | } | ||
433 | |||
434 | return 0; | ||
435 | } | ||
436 | |||
437 | static void drm_encoder_unregister_all(struct drm_device *dev) | ||
438 | { | ||
439 | struct drm_encoder *encoder; | ||
440 | |||
441 | drm_for_each_encoder(encoder, dev) { | ||
442 | if (encoder->funcs->early_unregister) | ||
443 | encoder->funcs->early_unregister(encoder); | ||
444 | } | ||
445 | } | ||
446 | |||
447 | /** | ||
448 | * drm_encoder_init - Init a preallocated encoder | ||
449 | * @dev: drm device | ||
450 | * @encoder: the encoder to init | ||
451 | * @funcs: callbacks for this encoder | ||
452 | * @encoder_type: user visible type of the encoder | ||
453 | * @name: printf style format string for the encoder name, or NULL for default name | ||
454 | * | ||
455 | * Initialises a preallocated encoder. Encoder should be | ||
456 | * subclassed as part of driver encoder objects. | ||
457 | * | ||
458 | * Returns: | ||
459 | * Zero on success, error code on failure. | ||
460 | */ | ||
461 | int drm_encoder_init(struct drm_device *dev, | ||
462 | struct drm_encoder *encoder, | ||
463 | const struct drm_encoder_funcs *funcs, | ||
464 | int encoder_type, const char *name, ...) | ||
465 | { | ||
466 | int ret; | ||
467 | |||
468 | drm_modeset_lock_all(dev); | ||
469 | |||
470 | ret = drm_mode_object_get(dev, &encoder->base, DRM_MODE_OBJECT_ENCODER); | ||
471 | if (ret) | ||
472 | goto out_unlock; | ||
473 | |||
474 | encoder->dev = dev; | ||
475 | encoder->encoder_type = encoder_type; | ||
476 | encoder->funcs = funcs; | ||
477 | if (name) { | ||
478 | va_list ap; | ||
479 | |||
480 | va_start(ap, name); | ||
481 | encoder->name = kvasprintf(GFP_KERNEL, name, ap); | ||
482 | va_end(ap); | ||
483 | } else { | ||
484 | encoder->name = kasprintf(GFP_KERNEL, "%s-%d", | ||
485 | drm_encoder_enum_list[encoder_type].name, | ||
486 | encoder->base.id); | ||
487 | } | ||
488 | if (!encoder->name) { | ||
489 | ret = -ENOMEM; | ||
490 | goto out_put; | ||
491 | } | ||
492 | |||
493 | list_add_tail(&encoder->head, &dev->mode_config.encoder_list); | ||
494 | encoder->index = dev->mode_config.num_encoder++; | ||
495 | |||
496 | out_put: | ||
497 | if (ret) | ||
498 | drm_mode_object_unregister(dev, &encoder->base); | ||
499 | |||
500 | out_unlock: | ||
501 | drm_modeset_unlock_all(dev); | ||
502 | |||
503 | return ret; | ||
504 | } | ||
505 | EXPORT_SYMBOL(drm_encoder_init); | ||
506 | |||
507 | /** | ||
508 | * drm_encoder_cleanup - cleans up an initialised encoder | ||
509 | * @encoder: encoder to cleanup | ||
510 | * | ||
511 | * Cleans up the encoder but doesn't free the object. | ||
512 | */ | ||
513 | void drm_encoder_cleanup(struct drm_encoder *encoder) | ||
514 | { | ||
515 | struct drm_device *dev = encoder->dev; | ||
516 | |||
517 | /* Note that the encoder_list is considered to be static; should we | ||
518 | * remove the drm_encoder at runtime we would have to decrement all | ||
519 | * the indices on the drm_encoder after us in the encoder_list. | ||
520 | */ | ||
521 | |||
522 | drm_modeset_lock_all(dev); | ||
523 | drm_mode_object_unregister(dev, &encoder->base); | ||
524 | kfree(encoder->name); | ||
525 | list_del(&encoder->head); | ||
526 | dev->mode_config.num_encoder--; | ||
527 | drm_modeset_unlock_all(dev); | ||
528 | |||
529 | memset(encoder, 0, sizeof(*encoder)); | ||
530 | } | ||
531 | EXPORT_SYMBOL(drm_encoder_cleanup); | ||
532 | |||
533 | static unsigned int drm_num_planes(struct drm_device *dev) | 410 | static unsigned int drm_num_planes(struct drm_device *dev) |
534 | { | 411 | { |
535 | unsigned int num = 0; | 412 | unsigned int num = 0; |
@@ -1172,76 +1049,6 @@ int drm_mode_object_get_properties(struct drm_mode_object *obj, bool atomic, | |||
1172 | return 0; | 1049 | return 0; |
1173 | } | 1050 | } |
1174 | 1051 | ||
1175 | static struct drm_crtc *drm_encoder_get_crtc(struct drm_encoder *encoder) | ||
1176 | { | ||
1177 | struct drm_connector *connector; | ||
1178 | struct drm_device *dev = encoder->dev; | ||
1179 | bool uses_atomic = false; | ||
1180 | |||
1181 | /* For atomic drivers only state objects are synchronously updated and | ||
1182 | * protected by modeset locks, so check those first. */ | ||
1183 | drm_for_each_connector(connector, dev) { | ||
1184 | if (!connector->state) | ||
1185 | continue; | ||
1186 | |||
1187 | uses_atomic = true; | ||
1188 | |||
1189 | if (connector->state->best_encoder != encoder) | ||
1190 | continue; | ||
1191 | |||
1192 | return connector->state->crtc; | ||
1193 | } | ||
1194 | |||
1195 | /* Don't return stale data (e.g. pending async disable). */ | ||
1196 | if (uses_atomic) | ||
1197 | return NULL; | ||
1198 | |||
1199 | return encoder->crtc; | ||
1200 | } | ||
1201 | |||
1202 | /** | ||
1203 | * drm_mode_getencoder - get encoder configuration | ||
1204 | * @dev: drm device for the ioctl | ||
1205 | * @data: data pointer for the ioctl | ||
1206 | * @file_priv: drm file for the ioctl call | ||
1207 | * | ||
1208 | * Construct a encoder configuration structure to return to the user. | ||
1209 | * | ||
1210 | * Called by the user via ioctl. | ||
1211 | * | ||
1212 | * Returns: | ||
1213 | * Zero on success, negative errno on failure. | ||
1214 | */ | ||
1215 | int drm_mode_getencoder(struct drm_device *dev, void *data, | ||
1216 | struct drm_file *file_priv) | ||
1217 | { | ||
1218 | struct drm_mode_get_encoder *enc_resp = data; | ||
1219 | struct drm_encoder *encoder; | ||
1220 | struct drm_crtc *crtc; | ||
1221 | |||
1222 | if (!drm_core_check_feature(dev, DRIVER_MODESET)) | ||
1223 | return -EINVAL; | ||
1224 | |||
1225 | encoder = drm_encoder_find(dev, enc_resp->encoder_id); | ||
1226 | if (!encoder) | ||
1227 | return -ENOENT; | ||
1228 | |||
1229 | drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); | ||
1230 | crtc = drm_encoder_get_crtc(encoder); | ||
1231 | if (crtc) | ||
1232 | enc_resp->crtc_id = crtc->base.id; | ||
1233 | else | ||
1234 | enc_resp->crtc_id = 0; | ||
1235 | drm_modeset_unlock(&dev->mode_config.connection_mutex); | ||
1236 | |||
1237 | enc_resp->encoder_type = encoder->encoder_type; | ||
1238 | enc_resp->encoder_id = encoder->base.id; | ||
1239 | enc_resp->possible_crtcs = encoder->possible_crtcs; | ||
1240 | enc_resp->possible_clones = encoder->possible_clones; | ||
1241 | |||
1242 | return 0; | ||
1243 | } | ||
1244 | |||
1245 | /** | 1052 | /** |
1246 | * drm_mode_getplane_res - enumerate all plane resources | 1053 | * drm_mode_getplane_res - enumerate all plane resources |
1247 | * @dev: DRM device | 1054 | * @dev: DRM device |