drm/bridge: tc358767: copy the mode data, instead of storing the pointer
authorTomi Valkeinen <tomi.valkeinen@ti.com>
Tue, 28 May 2019 08:27:43 +0000 (11:27 +0300)
committerAndrzej Hajda <a.hajda@samsung.com>
Fri, 31 May 2019 13:41:29 +0000 (15:41 +0200)
In tc_bridge_mode_set callback, we store the pointer to the given
drm_display_mode, and use the mode later. Storing a pointer in such a
way looks very suspicious to me, and I have observed odd issues where
the timings were apparently (at least mostly) zero.

Do a copy of the drm_display_mode instead to ensure we don't refer to
freed/modified data.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>
Signed-off-by: Andrzej Hajda <a.hajda@samsung.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190528082747.3631-21-tomi.valkeinen@ti.com
drivers/gpu/drm/bridge/tc358767.c

index 83cb43a..ffcbecf 100644 (file)
@@ -205,7 +205,7 @@ struct tc_data {
        /* display edid */
        struct edid             *edid;
        /* current mode */
-       const struct drm_display_mode   *mode;
+       struct drm_display_mode mode;
 
        u32                     rev;
        u8                      assr;
@@ -1032,12 +1032,12 @@ static int tc_stream_enable(struct tc_data *tc)
        /* PXL PLL setup */
        if (tc_test_pattern) {
                ret = tc_pxl_pll_en(tc, clk_get_rate(tc->refclk),
-                                   1000 * tc->mode->clock);
+                                   1000 * tc->mode.clock);
                if (ret)
                        goto err;
        }
 
-       ret = tc_set_video_mode(tc, tc->mode);
+       ret = tc_set_video_mode(tc, &tc->mode);
        if (ret)
                return ret;
 
@@ -1180,7 +1180,7 @@ static void tc_bridge_mode_set(struct drm_bridge *bridge,
 {
        struct tc_data *tc = bridge_to_tc(bridge);
 
-       tc->mode = mode;
+       tc->mode = *mode;
 }
 
 static int tc_connector_get_modes(struct drm_connector *connector)