summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOleksandr Suvorov <oleksandr.suvorov@toradex.com>2021-02-13 13:32:27 +0200
committerOleksandr Suvorov <oleksandr.suvorov@toradex.com>2021-02-18 12:37:41 +0200
commitb31d336c98967b34495cc844c6449c97aac5b85d (patch)
treedc86a7564fc9175f173f01990d0b481dca3a0226
parente0ffcaa2dd1c2712971836856afbe9f9ced60271 (diff)
drm: bridge: lt8912: fix NULL pointer dereference without ddc bus
If there is no ddc i2c bus registered and no display-timings defined in the bridge node, the driver tries to dereference NULL pointer, causing a kernel crash [1]. This patch fixes the kernel crash. [1] [ 3.528083] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000 ... [ 3.571677] Internal error: Oops: 96000004 [#1] PREEMPT SMP [ 3.579874] Modules linked in: [ 3.579885] CPU: 0 PID: 97 Comm: kworker/0:10 Not tainted 5.4.91-06307-g616ffa27a412-dirty #48 [ 3.579890] Hardware name: Toradex Apalis iMX8QXP/DX on Apalis Evaluation Board (DT) ... [ 3.652931] Call trace: [ 3.652942] lt8912_connector_get_modes+0xdc/0x1d8 [ 3.778792] drm_helper_probe_single_connector_modes+0x174/0x680 [ 3.784811] drm_client_modeset_probe+0x228/0xe70 [ 3.789527] __drm_fb_helper_initial_config_and_unlock+0x44/0x470 [ 3.795634] drm_fbdev_client_hotplug+0xd4/0x188 [ 3.800262] drm_fbdev_generic_setup+0x98/0x140 [ 3.804797] imx_drm_bind+0x100/0x150 ... [ 3.875067] Code: f942c300 f9413c00 97f9cf65 aa0003fc (b9400000) [ 3.881172] ---[ end trace b83fe35fbb72e05a ]--- Related-to: ELB-3426 Signed-off-by: Oleksandr Suvorov <oleksandr.suvorov@toradex.com>
-rw-r--r--drivers/gpu/drm/bridge/lt8912.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/drivers/gpu/drm/bridge/lt8912.c b/drivers/gpu/drm/bridge/lt8912.c
index aa407d09d319..6a278a0b4b3b 100644
--- a/drivers/gpu/drm/bridge/lt8912.c
+++ b/drivers/gpu/drm/bridge/lt8912.c
@@ -317,7 +317,7 @@ static int lt8912_connector_get_modes(struct drm_connector *connector)
} else { /* if not EDID, use dtb timings */
timings = of_get_display_timings(lt->dev->of_node);
- if (timings->num_timings == 0) {
+ if (!timings || timings->num_timings == 0) {
dev_err(lt->dev, "failed to get display timings from dtb\n");
return 0;
}