aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_crtc.c
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2016-08-29 04:27:49 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2016-08-29 09:37:03 -0400
commit321a95ae35f2ec4f58c4cda28d3606cc6f2b97d1 (patch)
tree2f765ea3ec7aaf732e5bf4fb0fc23144709c9521 /drivers/gpu/drm/drm_crtc.c
parent749cc6f7ed509e1be04e9c26d9cdc3c1f0dd13b4 (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.c193
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
57static 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}
420EXPORT_SYMBOL(drm_crtc_cleanup); 408EXPORT_SYMBOL(drm_crtc_cleanup);
421 409
422static 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
437static 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 */
461int 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
496out_put:
497 if (ret)
498 drm_mode_object_unregister(dev, &encoder->base);
499
500out_unlock:
501 drm_modeset_unlock_all(dev);
502
503 return ret;
504}
505EXPORT_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 */
513void 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}
531EXPORT_SYMBOL(drm_encoder_cleanup);
532
533static unsigned int drm_num_planes(struct drm_device *dev) 410static 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
1175static 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 */
1215int 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