diff options
-rw-r--r-- | drivers/gpu/drm/drm_crtc.c | 31 | ||||
-rw-r--r-- | include/drm/drm_crtc.h | 2 |
2 files changed, 19 insertions, 14 deletions
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index 293eb4c24f35..37a3e0791ddf 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c | |||
@@ -257,21 +257,11 @@ void drm_connector_ida_destroy(void) | |||
257 | 257 | ||
258 | /** | 258 | /** |
259 | * drm_get_encoder_name - return a string for encoder | 259 | * drm_get_encoder_name - return a string for encoder |
260 | * @encoder: encoder to compute name of | 260 | * @encoder: the encoder to get name for |
261 | * | ||
262 | * Note that the buffer used by this function is globally shared and owned by | ||
263 | * the function itself. | ||
264 | * | ||
265 | * FIXME: This isn't really multithreading safe. | ||
266 | */ | 261 | */ |
267 | const char *drm_get_encoder_name(const struct drm_encoder *encoder) | 262 | const char *drm_get_encoder_name(const struct drm_encoder *encoder) |
268 | { | 263 | { |
269 | static char buf[32]; | 264 | return encoder->name; |
270 | |||
271 | snprintf(buf, 32, "%s-%d", | ||
272 | drm_encoder_enum_list[encoder->encoder_type].name, | ||
273 | encoder->base.id); | ||
274 | return buf; | ||
275 | } | 265 | } |
276 | EXPORT_SYMBOL(drm_get_encoder_name); | 266 | EXPORT_SYMBOL(drm_get_encoder_name); |
277 | 267 | ||
@@ -986,16 +976,27 @@ int drm_encoder_init(struct drm_device *dev, | |||
986 | 976 | ||
987 | ret = drm_mode_object_get(dev, &encoder->base, DRM_MODE_OBJECT_ENCODER); | 977 | ret = drm_mode_object_get(dev, &encoder->base, DRM_MODE_OBJECT_ENCODER); |
988 | if (ret) | 978 | if (ret) |
989 | goto out; | 979 | goto out_unlock; |
990 | 980 | ||
991 | encoder->dev = dev; | 981 | encoder->dev = dev; |
992 | encoder->encoder_type = encoder_type; | 982 | encoder->encoder_type = encoder_type; |
993 | encoder->funcs = funcs; | 983 | encoder->funcs = funcs; |
984 | encoder->name = kasprintf(GFP_KERNEL, "%s-%d", | ||
985 | drm_encoder_enum_list[encoder_type].name, | ||
986 | encoder->base.id); | ||
987 | if (!encoder->name) { | ||
988 | ret = -ENOMEM; | ||
989 | goto out_put; | ||
990 | } | ||
994 | 991 | ||
995 | list_add_tail(&encoder->head, &dev->mode_config.encoder_list); | 992 | list_add_tail(&encoder->head, &dev->mode_config.encoder_list); |
996 | dev->mode_config.num_encoder++; | 993 | dev->mode_config.num_encoder++; |
997 | 994 | ||
998 | out: | 995 | out_put: |
996 | if (ret) | ||
997 | drm_mode_object_put(dev, &encoder->base); | ||
998 | |||
999 | out_unlock: | ||
999 | drm_modeset_unlock_all(dev); | 1000 | drm_modeset_unlock_all(dev); |
1000 | 1001 | ||
1001 | return ret; | 1002 | return ret; |
@@ -1013,6 +1014,8 @@ void drm_encoder_cleanup(struct drm_encoder *encoder) | |||
1013 | struct drm_device *dev = encoder->dev; | 1014 | struct drm_device *dev = encoder->dev; |
1014 | drm_modeset_lock_all(dev); | 1015 | drm_modeset_lock_all(dev); |
1015 | drm_mode_object_put(dev, &encoder->base); | 1016 | drm_mode_object_put(dev, &encoder->base); |
1017 | kfree(encoder->name); | ||
1018 | encoder->name = NULL; | ||
1016 | list_del(&encoder->head); | 1019 | list_del(&encoder->head); |
1017 | dev->mode_config.num_encoder--; | 1020 | dev->mode_config.num_encoder--; |
1018 | drm_modeset_unlock_all(dev); | 1021 | drm_modeset_unlock_all(dev); |
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index b5c97d5b2654..5c1c31cc11cd 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h | |||
@@ -400,6 +400,7 @@ struct drm_encoder_funcs { | |||
400 | * @dev: parent DRM device | 400 | * @dev: parent DRM device |
401 | * @head: list management | 401 | * @head: list management |
402 | * @base: base KMS object | 402 | * @base: base KMS object |
403 | * @name: encoder name | ||
403 | * @encoder_type: one of the %DRM_MODE_ENCODER_<foo> types in drm_mode.h | 404 | * @encoder_type: one of the %DRM_MODE_ENCODER_<foo> types in drm_mode.h |
404 | * @possible_crtcs: bitmask of potential CRTC bindings | 405 | * @possible_crtcs: bitmask of potential CRTC bindings |
405 | * @possible_clones: bitmask of potential sibling encoders for cloning | 406 | * @possible_clones: bitmask of potential sibling encoders for cloning |
@@ -416,6 +417,7 @@ struct drm_encoder { | |||
416 | struct list_head head; | 417 | struct list_head head; |
417 | 418 | ||
418 | struct drm_mode_object base; | 419 | struct drm_mode_object base; |
420 | char *name; | ||
419 | int encoder_type; | 421 | int encoder_type; |
420 | uint32_t possible_crtcs; | 422 | uint32_t possible_crtcs; |
421 | uint32_t possible_clones; | 423 | uint32_t possible_clones; |