@@ -2383,6 +2383,18 @@ int drm_mode_connector_update_edid_property(struct drm_connector *connector,
}
EXPORT_SYMBOL(drm_mode_connector_update_edid_property);
+int drm_connector_set_dpms(struct drm_connector *connector, int mode)
+{
+ if (connector->funcs->dpms)
+ (*connector->funcs->dpms)(connector, mode);
+ connector->dpms = mode;
+ drm_connector_property_set_value(connector,
+ connector->dev->mode_config.dpms_property,
+ mode);
+ return 0;
+}
+EXPORT_SYMBOL(drm_connector_set_dpms);
+
int drm_mode_connector_property_set_ioctl(struct drm_device *dev,
void *data, struct drm_file *file_priv)
{
@@ -2440,15 +2452,14 @@ int drm_mode_connector_property_set_ioctl(struct drm_device *dev,
/* Do DPMS ourselves */
if (property == connector->dev->mode_config.dpms_property) {
- if (connector->funcs->dpms)
- (*connector->funcs->dpms)(connector, (int) out_resp->value);
+ drm_connector_set_dpms(connector, (int) out_resp->value);
ret = 0;
- } else if (connector->funcs->set_property)
+ } else if (connector->funcs->set_property) {
ret = connector->funcs->set_property(connector, property, out_resp->value);
-
- /* store the property value if successful */
- if (!ret)
- drm_connector_property_set_value(connector, property, out_resp->value);
+ /* store the property value if successful */
+ if (!ret)
+ drm_connector_property_set_value(connector, property, out_resp->value);
+ }
out:
mutex_unlock(&dev->mode_config.mutex);
return ret;
@@ -669,9 +669,10 @@ int drm_crtc_helper_set_config(struct drm_mode_set *set)
}
DRM_DEBUG_KMS("Setting connector DPMS state to on\n");
for (i = 0; i < set->num_connectors; i++) {
- DRM_DEBUG_KMS("\t[CONNECTOR:%d:%s] set DPMS on\n", set->connectors[i]->base.id,
- drm_get_connector_name(set->connectors[i]));
- set->connectors[i]->dpms = DRM_MODE_DPMS_ON;
+ struct drm_connector *connector = set->connectors[i];
+ DRM_DEBUG_KMS("\t[CONNECTOR:%d:%s] set DPMS on\n", connector->base.id,
+ drm_get_connector_name(connector));
+ drm_connector_set_dpms(connector, DRM_MODE_DPMS_ON);
}
kfree(save_connectors);
@@ -676,6 +676,7 @@ extern void drm_mode_set_crtcinfo(struct drm_display_mode *p,
extern void drm_mode_connector_list_update(struct drm_connector *connector);
extern int drm_mode_connector_update_edid_property(struct drm_connector *connector,
struct edid *edid);
+extern int drm_connector_set_dpms(struct drm_connector *connector, int mode);
extern int drm_connector_property_set_value(struct drm_connector *connector,
struct drm_property *property,
uint64_t value);