drm: Add drm_mode_copy()
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Tue, 13 Mar 2012 10:35:51 +0000 (12:35 +0200)
committerDave Airlie <airlied@redhat.com>
Thu, 15 Mar 2012 09:52:51 +0000 (09:52 +0000)
Add a helper function to copy a display mode. Use it in
drm_mode_duplicate() and nouveau mode_fixup hooks.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/drm_modes.c
drivers/gpu/drm/nouveau/nv50_dac.c
drivers/gpu/drm/nouveau/nv50_sor.c
include/drm/drm_crtc.h

index 7ff13bc47ca26993f2123c3a337245dd077afbb4..b7adb4a967fd02b80eee0f0bd6e78b2d76c7e9b1 100644 (file)
@@ -713,6 +713,27 @@ void drm_mode_set_crtcinfo(struct drm_display_mode *p, int adjust_flags)
 EXPORT_SYMBOL(drm_mode_set_crtcinfo);
 
 
+/**
+ * drm_mode_copy - copy the mode
+ * @dst: mode to overwrite
+ * @src: mode to copy
+ *
+ * LOCKING:
+ * None.
+ *
+ * Copy an existing mode into another mode, preserving the object id
+ * of the destination mode.
+ */
+void drm_mode_copy(struct drm_display_mode *dst, const struct drm_display_mode *src)
+{
+       int id = dst->base.id;
+
+       *dst = *src;
+       dst->base.id = id;
+       INIT_LIST_HEAD(&dst->head);
+}
+EXPORT_SYMBOL(drm_mode_copy);
+
 /**
  * drm_mode_duplicate - allocate and duplicate an existing mode
  * @m: mode to duplicate
@@ -727,16 +748,13 @@ struct drm_display_mode *drm_mode_duplicate(struct drm_device *dev,
                                            const struct drm_display_mode *mode)
 {
        struct drm_display_mode *nmode;
-       int new_id;
 
        nmode = drm_mode_create(dev);
        if (!nmode)
                return NULL;
 
-       new_id = nmode->base.id;
-       *nmode = *mode;
-       nmode->base.id = new_id;
-       INIT_LIST_HEAD(&nmode->head);
+       drm_mode_copy(nmode, mode);
+
        return nmode;
 }
 EXPORT_SYMBOL(drm_mode_duplicate);
index a0f2bebf49e302e3990b89146523e84695c25d3d..55c56330be6d2a68bb78d6ad17cfa95f7fe6fb55 100644 (file)
@@ -190,11 +190,8 @@ nv50_dac_mode_fixup(struct drm_encoder *encoder, struct drm_display_mode *mode,
        }
 
        if (connector->scaling_mode != DRM_MODE_SCALE_NONE &&
-            connector->native_mode) {
-               int id = adjusted_mode->base.id;
-               *adjusted_mode = *connector->native_mode;
-               adjusted_mode->base.id = id;
-       }
+            connector->native_mode)
+               drm_mode_copy(adjusted_mode, connector->native_mode);
 
        return true;
 }
index 9a5c2c98658c3ba5511472fdca28bd88af351f62..a7844ab6a50cd5603b351eb026a62e763cb6a554 100644 (file)
@@ -342,11 +342,8 @@ nv50_sor_mode_fixup(struct drm_encoder *encoder, struct drm_display_mode *mode,
        }
 
        if (connector->scaling_mode != DRM_MODE_SCALE_NONE &&
-            connector->native_mode) {
-               int id = adjusted_mode->base.id;
-               *adjusted_mode = *connector->native_mode;
-               adjusted_mode->base.id = id;
-       }
+            connector->native_mode)
+               drm_mode_copy(adjusted_mode, connector->native_mode);
 
        return true;
 }
index 53cb49a13e17049900cac64559d5d47a46f914c4..9595c2c9adc77c3fb30b51611508294d53c1f6dd 100644 (file)
@@ -855,6 +855,7 @@ extern struct edid *drm_get_edid(struct drm_connector *connector,
 extern int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid);
 extern void drm_mode_probed_add(struct drm_connector *connector, struct drm_display_mode *mode);
 extern void drm_mode_remove(struct drm_connector *connector, struct drm_display_mode *mode);
+extern void drm_mode_copy(struct drm_display_mode *dst, const struct drm_display_mode *src);
 extern struct drm_display_mode *drm_mode_duplicate(struct drm_device *dev,
                                                   const struct drm_display_mode *mode);
 extern void drm_mode_debug_printmodeline(struct drm_display_mode *mode);