[PATCH] drm/rockchip: Cope with endpoints that haven't been registered yet
From: Jonathan McDowell <hidden>
Date: 2021-03-16 18:29:11
Also in:
dri-devel, linux-rockchip, lkml
Subsystem:
arm/rockchip soc support, drm drivers, drm drivers and misc gpu patches, drm drivers for rockchip, the rest · Maintainers:
Heiko Stuebner, David Airlie, Simona Vetter, Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, Sandy Huang, Heiko Stübner, Andy Yan, Linus Torvalds
The Rockchip RGB CRTC output driver attempts to avoid probing Rockchip
subdrivers to see if they're a connected panel or bridge. However part
of its checks assumes that if no OF platform device is found then it
can't be a valid bridge or panel. This causes issues with I2C controlled
bridges that have not yet been registered to the point they can be
found.
Change this to return EPROBE_DEFER instead of ENODEV and don't ignore
such devices. The subsequent call to drm_of_find_panel_or_bridge() will
return EPROBE_DEFER as well if there's actually a valid device we should
wait for.
Signed-off-by: Jonathan McDowell <redacted>
---
drivers/gpu/drm/rockchip/rockchip_drm_drv.c | 8 ++++++--
drivers/gpu/drm/rockchip/rockchip_rgb.c | 7 ++++---
2 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
index 212bd87c0c4a..b0d63a566501 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_drv.c
@@ -270,11 +270,15 @@ int rockchip_drm_endpoint_is_subdriver(struct device_node *ep)
if (!node)
return -ENODEV;
- /* status disabled will prevent creation of platform-devices */
+ /*
+ * status disabled will prevent creation of platform-devices,
+ * but equally we can't rely on the driver having been registered
+ * yet (e.g. I2C bridges).
+ */
pdev = of_find_device_by_node(node);
of_node_put(node);
if (!pdev)
- return -ENODEV;
+ return -EPROBE_DEFER;
/*
* All rockchip subdrivers have probed at this point, so
diff --git a/drivers/gpu/drm/rockchip/rockchip_rgb.c b/drivers/gpu/drm/rockchip/rockchip_rgb.c
index c079714477d8..989595087397 100644
--- a/drivers/gpu/drm/rockchip/rockchip_rgb.c
+++ b/drivers/gpu/drm/rockchip/rockchip_rgb.c
@@ -77,7 +77,7 @@ struct rockchip_rgb *rockchip_rgb_init(struct device *dev,
struct drm_encoder *encoder;
struct device_node *port, *endpoint;
u32 endpoint_id;
- int ret = 0, child_count = 0;
+ int subret, ret = 0, child_count = 0;
struct drm_panel *panel;
struct drm_bridge *bridge;
@@ -96,8 +96,9 @@ struct rockchip_rgb *rockchip_rgb_init(struct device *dev,
if (of_property_read_u32(endpoint, "reg", &endpoint_id))
endpoint_id = 0;
- /* if subdriver (> 0) or error case (< 0), ignore entry */
- if (rockchip_drm_endpoint_is_subdriver(endpoint) != 0)
+ /* if subdriver (> 0) or non-defer error case (< 0), ignore entry */
+ subret = rockchip_drm_endpoint_is_subdriver(endpoint);
+ if (subret != 0 && subret != -EPROBE_DEFER)
continue;
child_count++;
--
2.20.1
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel