drm: When adding probed modes, preserve duplicate mode types
authorKeith Packard <keithp@keithp.com>
Mon, 20 Jul 2009 21:49:17 +0000 (14:49 -0700)
committerDave Airlie <airlied@redhat.com>
Sun, 9 Aug 2009 02:22:53 +0000 (12:22 +1000)
The code which takes probed modes and adds them to a connector eliminates
duplicate modes by comparing them using drm_mode_equal. That function
doesn't consider the type bits, which means that any modes which differ only
in the type field will be lost.

One of the bits in the mode->type field is the DRM_MODE_TYPE_PREFERRED bit.
If the mode with that bit is lost, then higher level code will not know
which mode to select, causing a random mode to be used instead.

This patch simply merges the two mode type bits together; that seems
reasonable to me, but perhaps only a subset of the bits should be used? None
of these can be user defined as they all come from looking at just the
hardware.

Signed-off-by: Keith Packard <keithp@keithp.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/drm_modes.c

index 54f492a488a93c68387bc388a6579c92edb7f988..7914097b09c61b5cad674dfdf7c98dc485fd82f2 100644 (file)
@@ -566,6 +566,8 @@ void drm_mode_connector_list_update(struct drm_connector *connector)
                                found_it = 1;
                                /* if equal delete the probed mode */
                                mode->status = pmode->status;
+                               /* Merge type bits together */
+                               mode->type |= pmode->type;
                                list_del(&pmode->head);
                                drm_mode_destroy(connector->dev, pmode);
                                break;