diff options
-rw-r--r-- | drivers/gpu/drm/drm_crtc.c | 62 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_drv.c | 2 | ||||
-rw-r--r-- | include/drm/drm_crtc.h | 2 |
3 files changed, 48 insertions, 18 deletions
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index fc83bb9eb514..a6917645fb4a 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c | |||
@@ -186,29 +186,29 @@ static const struct drm_prop_enum_list drm_dirty_info_enum_list[] = { | |||
186 | struct drm_conn_prop_enum_list { | 186 | struct drm_conn_prop_enum_list { |
187 | int type; | 187 | int type; |
188 | const char *name; | 188 | const char *name; |
189 | int count; | 189 | struct ida ida; |
190 | }; | 190 | }; |
191 | 191 | ||
192 | /* | 192 | /* |
193 | * Connector and encoder types. | 193 | * Connector and encoder types. |
194 | */ | 194 | */ |
195 | static struct drm_conn_prop_enum_list drm_connector_enum_list[] = | 195 | static struct drm_conn_prop_enum_list drm_connector_enum_list[] = |
196 | { { DRM_MODE_CONNECTOR_Unknown, "Unknown", 0 }, | 196 | { { DRM_MODE_CONNECTOR_Unknown, "Unknown" }, |
197 | { DRM_MODE_CONNECTOR_VGA, "VGA", 0 }, | 197 | { DRM_MODE_CONNECTOR_VGA, "VGA" }, |
198 | { DRM_MODE_CONNECTOR_DVII, "DVI-I", 0 }, | 198 | { DRM_MODE_CONNECTOR_DVII, "DVI-I" }, |
199 | { DRM_MODE_CONNECTOR_DVID, "DVI-D", 0 }, | 199 | { DRM_MODE_CONNECTOR_DVID, "DVI-D" }, |
200 | { DRM_MODE_CONNECTOR_DVIA, "DVI-A", 0 }, | 200 | { DRM_MODE_CONNECTOR_DVIA, "DVI-A" }, |
201 | { DRM_MODE_CONNECTOR_Composite, "Composite", 0 }, | 201 | { DRM_MODE_CONNECTOR_Composite, "Composite" }, |
202 | { DRM_MODE_CONNECTOR_SVIDEO, "SVIDEO", 0 }, | 202 | { DRM_MODE_CONNECTOR_SVIDEO, "SVIDEO" }, |
203 | { DRM_MODE_CONNECTOR_LVDS, "LVDS", 0 }, | 203 | { DRM_MODE_CONNECTOR_LVDS, "LVDS" }, |
204 | { DRM_MODE_CONNECTOR_Component, "Component", 0 }, | 204 | { DRM_MODE_CONNECTOR_Component, "Component" }, |
205 | { DRM_MODE_CONNECTOR_9PinDIN, "DIN", 0 }, | 205 | { DRM_MODE_CONNECTOR_9PinDIN, "DIN" }, |
206 | { DRM_MODE_CONNECTOR_DisplayPort, "DP", 0 }, | 206 | { DRM_MODE_CONNECTOR_DisplayPort, "DP" }, |
207 | { DRM_MODE_CONNECTOR_HDMIA, "HDMI-A", 0 }, | 207 | { DRM_MODE_CONNECTOR_HDMIA, "HDMI-A" }, |
208 | { DRM_MODE_CONNECTOR_HDMIB, "HDMI-B", 0 }, | 208 | { DRM_MODE_CONNECTOR_HDMIB, "HDMI-B" }, |
209 | { DRM_MODE_CONNECTOR_TV, "TV", 0 }, | 209 | { DRM_MODE_CONNECTOR_TV, "TV" }, |
210 | { DRM_MODE_CONNECTOR_eDP, "eDP", 0 }, | 210 | { DRM_MODE_CONNECTOR_eDP, "eDP" }, |
211 | { DRM_MODE_CONNECTOR_VIRTUAL, "Virtual", 0}, | 211 | { DRM_MODE_CONNECTOR_VIRTUAL, "Virtual" }, |
212 | }; | 212 | }; |
213 | 213 | ||
214 | static const struct drm_prop_enum_list drm_encoder_enum_list[] = | 214 | static const struct drm_prop_enum_list drm_encoder_enum_list[] = |
@@ -220,6 +220,22 @@ static const struct drm_prop_enum_list drm_encoder_enum_list[] = | |||
220 | { DRM_MODE_ENCODER_VIRTUAL, "Virtual" }, | 220 | { DRM_MODE_ENCODER_VIRTUAL, "Virtual" }, |
221 | }; | 221 | }; |
222 | 222 | ||
223 | void drm_connector_ida_init(void) | ||
224 | { | ||
225 | int i; | ||
226 | |||
227 | for (i = 0; i < ARRAY_SIZE(drm_connector_enum_list); i++) | ||
228 | ida_init(&drm_connector_enum_list[i].ida); | ||
229 | } | ||
230 | |||
231 | void drm_connector_ida_destroy(void) | ||
232 | { | ||
233 | int i; | ||
234 | |||
235 | for (i = 0; i < ARRAY_SIZE(drm_connector_enum_list); i++) | ||
236 | ida_destroy(&drm_connector_enum_list[i].ida); | ||
237 | } | ||
238 | |||
223 | const char *drm_get_encoder_name(const struct drm_encoder *encoder) | 239 | const char *drm_get_encoder_name(const struct drm_encoder *encoder) |
224 | { | 240 | { |
225 | static char buf[32]; | 241 | static char buf[32]; |
@@ -711,6 +727,8 @@ int drm_connector_init(struct drm_device *dev, | |||
711 | int connector_type) | 727 | int connector_type) |
712 | { | 728 | { |
713 | int ret; | 729 | int ret; |
730 | struct ida *connector_ida = | ||
731 | &drm_connector_enum_list[connector_type].ida; | ||
714 | 732 | ||
715 | drm_modeset_lock_all(dev); | 733 | drm_modeset_lock_all(dev); |
716 | 734 | ||
@@ -723,7 +741,12 @@ int drm_connector_init(struct drm_device *dev, | |||
723 | connector->funcs = funcs; | 741 | connector->funcs = funcs; |
724 | connector->connector_type = connector_type; | 742 | connector->connector_type = connector_type; |
725 | connector->connector_type_id = | 743 | connector->connector_type_id = |
726 | ++drm_connector_enum_list[connector_type].count; /* TODO */ | 744 | ida_simple_get(connector_ida, 1, 0, GFP_KERNEL); |
745 | if (connector->connector_type_id < 0) { | ||
746 | ret = connector->connector_type_id; | ||
747 | drm_mode_object_put(dev, &connector->base); | ||
748 | goto out; | ||
749 | } | ||
727 | INIT_LIST_HEAD(&connector->probed_modes); | 750 | INIT_LIST_HEAD(&connector->probed_modes); |
728 | INIT_LIST_HEAD(&connector->modes); | 751 | INIT_LIST_HEAD(&connector->modes); |
729 | connector->edid_blob_ptr = NULL; | 752 | connector->edid_blob_ptr = NULL; |
@@ -764,6 +787,9 @@ void drm_connector_cleanup(struct drm_connector *connector) | |||
764 | list_for_each_entry_safe(mode, t, &connector->modes, head) | 787 | list_for_each_entry_safe(mode, t, &connector->modes, head) |
765 | drm_mode_remove(connector, mode); | 788 | drm_mode_remove(connector, mode); |
766 | 789 | ||
790 | ida_remove(&drm_connector_enum_list[connector->connector_type].ida, | ||
791 | connector->connector_type_id); | ||
792 | |||
767 | drm_mode_object_put(dev, &connector->base); | 793 | drm_mode_object_put(dev, &connector->base); |
768 | list_del(&connector->head); | 794 | list_del(&connector->head); |
769 | dev->mode_config.num_connector--; | 795 | dev->mode_config.num_connector--; |
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c index 5b949a736712..d97976cc51cd 100644 --- a/drivers/gpu/drm/drm_drv.c +++ b/drivers/gpu/drm/drm_drv.c | |||
@@ -226,6 +226,7 @@ static int __init drm_core_init(void) | |||
226 | int ret = -ENOMEM; | 226 | int ret = -ENOMEM; |
227 | 227 | ||
228 | drm_global_init(); | 228 | drm_global_init(); |
229 | drm_connector_ida_init(); | ||
229 | idr_init(&drm_minors_idr); | 230 | idr_init(&drm_minors_idr); |
230 | 231 | ||
231 | if (register_chrdev(DRM_MAJOR, "drm", &drm_stub_fops)) | 232 | if (register_chrdev(DRM_MAJOR, "drm", &drm_stub_fops)) |
@@ -273,6 +274,7 @@ static void __exit drm_core_exit(void) | |||
273 | 274 | ||
274 | unregister_chrdev(DRM_MAJOR, "drm"); | 275 | unregister_chrdev(DRM_MAJOR, "drm"); |
275 | 276 | ||
277 | drm_connector_ida_destroy(); | ||
276 | idr_destroy(&drm_minors_idr); | 278 | idr_destroy(&drm_minors_idr); |
277 | } | 279 | } |
278 | 280 | ||
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index 32e0820357e6..45f133228553 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h | |||
@@ -869,6 +869,8 @@ extern int drm_crtc_init(struct drm_device *dev, | |||
869 | const struct drm_crtc_funcs *funcs); | 869 | const struct drm_crtc_funcs *funcs); |
870 | extern void drm_crtc_cleanup(struct drm_crtc *crtc); | 870 | extern void drm_crtc_cleanup(struct drm_crtc *crtc); |
871 | 871 | ||
872 | extern void drm_connector_ida_init(void); | ||
873 | extern void drm_connector_ida_destroy(void); | ||
872 | extern int drm_connector_init(struct drm_device *dev, | 874 | extern int drm_connector_init(struct drm_device *dev, |
873 | struct drm_connector *connector, | 875 | struct drm_connector *connector, |
874 | const struct drm_connector_funcs *funcs, | 876 | const struct drm_connector_funcs *funcs, |