summaryrefslogtreecommitdiff
path: root/linux-core/drm_crtc.c
diff options
context:
space:
mode:
authorJesse Barnes <jbarnes@nietzche.virtuousgeek.org>2008-04-08 12:42:23 -0700
committerJesse Barnes <jbarnes@nietzche.virtuousgeek.org>2008-04-08 12:42:23 -0700
commit5a3ce06f3a3dfa9412b9660c1e1f35d24c815dbb (patch)
tree0f6ca1b7e7be62776ea71135fa3272751a28f969 /linux-core/drm_crtc.c
parent09e637848a6afa54a091c4c70fdfbfbdce7ac805 (diff)
Improved DRM sysfs support
This patch ties outputs, output properties and hotplug events into the DRM core. Each output has a corresponding directory under the primary DRM device (usually card0) containing dpms, edid, modes, and connection status files. New hotplug change events occur when outputs are added or hotplug events are detected.
Diffstat (limited to 'linux-core/drm_crtc.c')
-rw-r--r--linux-core/drm_crtc.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/linux-core/drm_crtc.c b/linux-core/drm_crtc.c
index 0cd0ebd0..19155e1f 100644
--- a/linux-core/drm_crtc.c
+++ b/linux-core/drm_crtc.c
@@ -47,6 +47,18 @@ static struct drm_prop_enum_list drm_dpms_enum_list[] =
{ DPMSModeSuspend, "Suspend" },
{ DPMSModeOff, "Off" }
};
+
+char *drm_get_dpms_name(int val)
+{
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(drm_dpms_enum_list); i++)
+ if (drm_dpms_enum_list[i].type == val)
+ return drm_dpms_enum_list[i].name;
+
+ return "unknown";
+}
+
static struct drm_prop_enum_list drm_conn_enum_list[] =
{ { ConnectorUnknown, "Unknown" },
{ ConnectorVGA, "VGA" },
@@ -79,6 +91,16 @@ char *drm_get_output_name(struct drm_output *output)
return buf;
}
+char *drm_get_output_status_name(enum drm_output_status status)
+{
+ if (status == output_status_connected)
+ return "connected";
+ else if (status == output_status_disconnected)
+ return "disconnected";
+ else
+ return "unknown";
+}
+
/**
* drm_idr_get - allocate a new identifier
* @dev: DRM device
@@ -629,6 +651,8 @@ 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++;
@@ -659,6 +683,8 @@ 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);
@@ -1226,6 +1252,8 @@ int drm_hotplug_stage_two(struct drm_device *dev, struct drm_output *output,
DRM_ERROR("failed to set mode after hotplug\n");
}
+ drm_sysfs_hotplug_event(dev);
+
drm_disable_unused_functions(dev);
return 0;
@@ -2223,6 +2251,24 @@ int drm_output_property_set_value(struct drm_output *output,
}
EXPORT_SYMBOL(drm_output_property_set_value);
+int drm_output_property_get_value(struct drm_output *output,
+ struct drm_property *property, uint64_t *val)
+{
+ int i;
+
+ for (i = 0; i < DRM_OUTPUT_MAX_PROPERTY; i++) {
+ if (output->property_ids[i] == property->id) {
+ *val = output->property_values[i];
+ break;
+ }
+ }
+
+ if (i == DRM_OUTPUT_MAX_PROPERTY)
+ return -EINVAL;
+ return 0;
+}
+EXPORT_SYMBOL(drm_output_property_get_value);
+
int drm_mode_getproperty_ioctl(struct drm_device *dev,
void *data, struct drm_file *file_priv)
{