aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/drm_crtc.c62
-rw-r--r--drivers/gpu/drm/drm_drv.c2
-rw-r--r--include/drm/drm_crtc.h2
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[] = {
186struct drm_conn_prop_enum_list { 186struct 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 */
195static struct drm_conn_prop_enum_list drm_connector_enum_list[] = 195static 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
214static const struct drm_prop_enum_list drm_encoder_enum_list[] = 214static 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
223void 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
231void 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
223const char *drm_get_encoder_name(const struct drm_encoder *encoder) 239const 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);
870extern void drm_crtc_cleanup(struct drm_crtc *crtc); 870extern void drm_crtc_cleanup(struct drm_crtc *crtc);
871 871
872extern void drm_connector_ida_init(void);
873extern void drm_connector_ida_destroy(void);
872extern int drm_connector_init(struct drm_device *dev, 874extern 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,