summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/bridge
diff options
context:
space:
mode:
authorTomi Valkeinen <tomi.valkeinen@ti.com>2019-05-28 11:27:43 +0300
committerAndrzej Hajda <a.hajda@samsung.com>2019-05-31 15:41:29 +0200
commit46648a3cec2d5e1bf6af1919f5f79505fcbf3af8 (patch)
tree7b9f8bfbc2908c66fd4b7a274b5c22ff57484a2b /drivers/gpu/drm/bridge
parent0cdb42f313e0c6fa928d2ba55f6d200f615005bc (diff)
downloadlinux-46648a3cec2d5e1bf6af1919f5f79505fcbf3af8.tar.bz2
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
Diffstat (limited to 'drivers/gpu/drm/bridge')
-rw-r--r--drivers/gpu/drm/bridge/tc358767.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c
index 83cb43af60e5..ffcbecf69d40 100644
--- a/drivers/gpu/drm/bridge/tc358767.c
+++ b/drivers/gpu/drm/bridge/tc358767.c
@@ -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)