drm/radeon: add dpms connector functions
authorDave Airlie <airlied@redhat.com>
Mon, 10 Nov 2008 05:37:16 +0000 (15:37 +1000)
committerDave Airlie <airlied@redhat.com>
Mon, 10 Nov 2008 05:37:16 +0000 (15:37 +1000)
linux-core/drm_crtc.c
linux-core/drm_crtc_helper.c
linux-core/drm_crtc_helper.h
linux-core/radeon_connectors.c

index 2f80ec0..bc385dc 100644 (file)
@@ -1423,7 +1423,7 @@ int drm_mode_setcrtc(struct drm_device *dev,
        set.mode = mode;
        set.connectors = connector_set;
        set.num_connectors = crtc_req->count_connectors;
-       set.fb =fb;
+       set.fb = fb;
        ret = crtc->funcs->set_config(&set);
 
 out:
index 58163e5..ebb4479 100644 (file)
@@ -804,3 +804,30 @@ int drm_helper_resume_force_mode(struct drm_device *dev)
        return 0;
 }
 EXPORT_SYMBOL(drm_helper_resume_force_mode);
+
+void drm_helper_set_connector_dpms(struct drm_connector *connector,
+                                 int dpms_mode)
+{
+       int i = 0;
+       struct drm_encoder *encoder;
+       struct drm_encoder_helper_funcs *encoder_funcs;
+       struct drm_mode_object *obj;
+
+       for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
+               if (connector->encoder_ids[i] == 0)
+                       break;
+               
+               obj = drm_mode_object_find(connector->dev,
+                                          connector->encoder_ids[i],
+                                          DRM_MODE_OBJECT_ENCODER);
+               if (!obj)
+                       continue;
+               
+               encoder = obj_to_encoder(obj);
+               encoder_funcs = encoder->helper_private;
+               if (encoder_funcs->dpms)
+                       encoder_funcs->dpms(encoder, dpms_mode);
+                       
+       }
+}
+EXPORT_SYMBOL(drm_helper_set_connector_dpms);
index c071915..a0dd667 100644 (file)
@@ -93,4 +93,6 @@ static inline void drm_connector_helper_add(struct drm_connector *connector, con
 }
 
 extern int drm_helper_resume_force_mode(struct drm_device *dev);
+extern void drm_helper_set_connector_dpms(struct drm_connector *connector,
+                                         int dpms_mode);
 #endif
index 18873f0..be1dbae 100644 (file)
@@ -77,6 +77,22 @@ static struct drm_display_mode *radeon_fp_native_mode(struct drm_encoder *encode
        return mode;
 }
 
+int radeon_connector_set_property(struct drm_connector *connector, struct drm_property *property,
+                                 uint64_t val)
+{
+       struct drm_device *dev = connector->dev;
+               
+       if (property == dev->mode_config.dpms_property) {
+               if (val > 3)
+                       return -EINVAL;
+               
+               drm_helper_set_connector_dpms(connector, val);
+
+       }
+       return 0;
+}
+
+
 static int radeon_lvds_get_modes(struct drm_connector *connector)
 {
        struct radeon_connector *radeon_connector = to_radeon_connector(connector);
@@ -146,6 +162,7 @@ struct drm_connector_funcs radeon_lvds_connector_funcs = {
        .detect = radeon_lvds_detect,
        .fill_modes = drm_helper_probe_single_connector_modes,
        .destroy = radeon_connector_destroy,
+       .set_property = radeon_connector_set_property,
 };
 
 static int radeon_vga_get_modes(struct drm_connector *connector)
@@ -197,6 +214,7 @@ struct drm_connector_funcs radeon_vga_connector_funcs = {
        .detect = radeon_vga_detect,
        .fill_modes = drm_helper_probe_single_connector_modes,
        .destroy = radeon_connector_destroy,
+       .set_property = radeon_connector_set_property,
 };
 
 
@@ -289,6 +307,7 @@ struct drm_connector_helper_funcs radeon_dvi_connector_helper_funcs = {
 struct drm_connector_funcs radeon_dvi_connector_funcs = {
        .detect = radeon_dvi_detect,
        .fill_modes = drm_helper_probe_single_connector_modes,
+       .set_property = radeon_connector_set_property,
        .destroy = radeon_connector_destroy,
 };