summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJesse Barnes <jbarnes@jbarnes-t61.(none)>2008-04-09 11:30:15 -0700
committerJesse Barnes <jbarnes@jbarnes-t61.(none)>2008-04-09 11:30:15 -0700
commitfa116081a919e716eb95fcfa421d93f10f6f0a4f (patch)
tree01e89a10b30d5c17b494335f815a9c3b8e8818a9
parente3c7a0fcb0122400e5b5035125ad4fa88599f28a (diff)
Fixup sysfs output registration
Put off registering new outputs with sysfs until they're properly configured, or we may get duplicates if the type hasn't been set yet (as is the case with SDVO initialization). This also means moving de-registration into the cleanup function instead of output destroy, since the latter occurs during the normal course of setup when an output isn't found (and therefore not registered with sysfs yet.
-rw-r--r--linux-core/drm_crtc.c5
-rw-r--r--linux-core/drm_sysfs.c2
-rw-r--r--linux-core/intel_crt.c2
-rw-r--r--linux-core/intel_lvds.c1
-rw-r--r--linux-core/intel_sdvo.c2
-rw-r--r--linux-core/intel_tv.c2
6 files changed, 10 insertions, 4 deletions
diff --git a/linux-core/drm_crtc.c b/linux-core/drm_crtc.c
index 19155e1f..f54ceb76 100644
--- a/linux-core/drm_crtc.c
+++ b/linux-core/drm_crtc.c
@@ -651,8 +651,6 @@ struct drm_output *drm_output_create(struct drm_device *dev,
/* output_set_monitor(output)? */
/* check for output_ignored(output)? */
- drm_sysfs_output_add(output);
-
mutex_lock(&dev->mode_config.mutex);
list_add_tail(&output->head, &dev->mode_config.output_list);
dev->mode_config.num_output++;
@@ -683,8 +681,6 @@ void drm_output_destroy(struct drm_output *output)
struct drm_device *dev = output->dev;
struct drm_display_mode *mode, *t;
- drm_sysfs_output_remove(output);
-
if (*output->funcs->cleanup)
(*output->funcs->cleanup)(output);
@@ -1080,6 +1076,7 @@ void drm_mode_config_cleanup(struct drm_device *dev)
struct drm_property *property, *pt;
list_for_each_entry_safe(output, ot, &dev->mode_config.output_list, head) {
+ drm_sysfs_output_remove(output);
drm_output_destroy(output);
}
diff --git a/linux-core/drm_sysfs.c b/linux-core/drm_sysfs.c
index 3e682c99..427a2e54 100644
--- a/linux-core/drm_sysfs.c
+++ b/linux-core/drm_sysfs.c
@@ -287,6 +287,7 @@ err_out_files:
out:
return ret;
}
+EXPORT_SYMBOL(drm_sysfs_output_add);
/**
* drm_sysfs_output_remove - remove an output device from sysfs
@@ -306,6 +307,7 @@ void drm_sysfs_output_remove(struct drm_output *output)
sysfs_remove_bin_file(&output->kdev.kobj, &edid_attr);
device_unregister(&output->kdev);
}
+EXPORT_SYMBOL(drm_sysfs_output_remove);
/**
* drm_sysfs_hotplug_event - generate a DRM uevent
diff --git a/linux-core/intel_crt.c b/linux-core/intel_crt.c
index 915e430d..ef40871e 100644
--- a/linux-core/intel_crt.c
+++ b/linux-core/intel_crt.c
@@ -261,5 +261,7 @@ void intel_crt_init(struct drm_device *dev)
output->interlace_allowed = 0;
output->doublescan_allowed = 0;
+ drm_sysfs_output_add(output);
+
drm_output_attach_property(output, dev->mode_config.connector_type_property, ConnectorVGA);
}
diff --git a/linux-core/intel_lvds.c b/linux-core/intel_lvds.c
index 80f77af6..378ce457 100644
--- a/linux-core/intel_lvds.c
+++ b/linux-core/intel_lvds.c
@@ -500,6 +500,7 @@ void intel_lvds_init(struct drm_device *dev)
#endif
out:
+ drm_sysfs_output_add(output);
drm_output_attach_property(output, dev->mode_config.connector_type_property, ConnectorLVDS);
return;
diff --git a/linux-core/intel_sdvo.c b/linux-core/intel_sdvo.c
index a8441d8f..4fb3f21c 100644
--- a/linux-core/intel_sdvo.c
+++ b/linux-core/intel_sdvo.c
@@ -1123,6 +1123,8 @@ void intel_sdvo_init(struct drm_device *dev, int output_device)
output->output_type = output_type;
output->output_type_id = output_id;
+ drm_sysfs_output_add(output);
+
/* Set the input timing to the screen. Assume always input 0. */
intel_sdvo_set_target_input(output, true, false);
diff --git a/linux-core/intel_tv.c b/linux-core/intel_tv.c
index 0edbdbac..cc50f8c1 100644
--- a/linux-core/intel_tv.c
+++ b/linux-core/intel_tv.c
@@ -1760,4 +1760,6 @@ intel_tv_init(struct drm_device *dev)
output->driver_private = intel_output;
output->interlace_allowed = FALSE;
output->doublescan_allowed = FALSE;
+
+ drm_sysfs_output_add(output);
}