forked from Minki/linux
drm/bridge: tc358767: copy the mode data, instead of storing the pointer
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
This commit is contained in:
parent
0cdb42f313
commit
46648a3cec
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user