summaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorAdrien Grassein <adrien.grassein@gmail.com>2021-03-31 15:33:13 +0200
committerRobert Foss <robert.foss@linaro.org>2021-04-16 17:12:51 +0200
commit5a7bd25992e48aacdbd73c09a54f15cd163e92cd (patch)
tree766376225aea31c5c44b2756c1b3230cdb3f7108 /drivers/gpu
parentad085b3a712a89e4a48472121b231add7a8362e4 (diff)
downloadlinux-5a7bd25992e48aacdbd73c09a54f15cd163e92cd.tar.bz2
drm/bridge: lt8912b: fix incorrect handling of of_* return values
A static analysis shows several issues in the driver code at probing time. DT parsing errors were bad handled and could lead to bugs: - Bad error detection; - Bad release of resources Fixes: 30e2ae943c26 ("drm/bridge: Introduce LT8912B DSI to HDMI bridge") Reported-by: Dan Carpenter <dan.carpenter@oracle.com> Suggested-by: Dan Carpenter <dan.carpenter@oracle.com> Signed-off-by: Adrien Grassein <adrien.grassein@gmail.com> Reviewed-by: Andrzej Hajda <a.hajda@samsung.com> Reviewed-by: Dan Carpenter <dan.carpenter@oracle.com> Link: https://patchwork.freedesktop.org/patch/msgid/20210415183639.1487-1-rdunlap@infradead.org Signed-off-by: Robert Foss <robert.foss@linaro.org>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/bridge/lontium-lt8912b.c32
1 files changed, 17 insertions, 15 deletions
diff --git a/drivers/gpu/drm/bridge/lontium-lt8912b.c b/drivers/gpu/drm/bridge/lontium-lt8912b.c
index 61491615bad0..55d8aa22c882 100644
--- a/drivers/gpu/drm/bridge/lontium-lt8912b.c
+++ b/drivers/gpu/drm/bridge/lontium-lt8912b.c
@@ -621,7 +621,8 @@ static int lt8912_parse_dt(struct lt8912 *lt)
{
struct gpio_desc *gp_reset;
struct device *dev = lt->dev;
- int ret = 0;
+ int ret;
+ int data_lanes;
struct device_node *port_node;
struct device_node *endpoint;
@@ -635,19 +636,21 @@ static int lt8912_parse_dt(struct lt8912 *lt)
lt->gp_reset = gp_reset;
endpoint = of_graph_get_endpoint_by_regs(dev->of_node, 0, -1);
- if (IS_ERR(endpoint)) {
- ret = PTR_ERR(endpoint);
- goto end;
- }
+ if (!endpoint)
+ return -ENODEV;
- lt->data_lanes = of_property_count_u32_elems(endpoint, "data-lanes");
+ data_lanes = of_property_count_u32_elems(endpoint, "data-lanes");
of_node_put(endpoint);
+ if (data_lanes < 0) {
+ dev_err(lt->dev, "%s: Bad data-lanes property\n", __func__);
+ return data_lanes;
+ }
+ lt->data_lanes = data_lanes;
lt->host_node = of_graph_get_remote_node(dev->of_node, 0, -1);
if (!lt->host_node) {
dev_err(lt->dev, "%s: Failed to get remote port\n", __func__);
- ret = -ENODEV;
- goto end;
+ return -ENODEV;
}
port_node = of_graph_get_remote_node(dev->of_node, 1, -1);
@@ -658,24 +661,23 @@ static int lt8912_parse_dt(struct lt8912 *lt)
}
lt->hdmi_port = of_drm_find_bridge(port_node);
- if (IS_ERR(lt->hdmi_port)) {
+ if (!lt->hdmi_port) {
dev_err(lt->dev, "%s: Failed to get hdmi port\n", __func__);
- ret = PTR_ERR(lt->hdmi_port);
- of_node_put(lt->host_node);
- goto end;
+ ret = -ENODEV;
+ goto err_free_host_node;
}
if (!of_device_is_compatible(port_node, "hdmi-connector")) {
dev_err(lt->dev, "%s: Failed to get hdmi port\n", __func__);
ret = -EINVAL;
+ goto err_free_host_node;
}
of_node_put(port_node);
-
-end:
- return ret;
+ return 0;
err_free_host_node:
+ of_node_put(port_node);
of_node_put(lt->host_node);
return ret;
}