Skip to content

Commit

Permalink
drm/bridge: tc358767: copy the mode data, instead of storing the pointer
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Tomi Valkeinen authored and Andrzej Hajda committed May 31, 2019
1 parent 0cdb42f commit 46648a3
Showing 1 changed file with 4 additions and 4 deletions.
8 changes: 4 additions & 4 deletions drivers/gpu/drm/bridge/tc358767.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit 46648a3

Please sign in to comment.