[PATCH 1/4] drm/panel: use fwnode based lookups for panel followers
Jani Nikula
jani.nikula at intel.com
Fri Jun 6 09:05:09 UTC 2025
Use firmware node based lookups for panel followers, to make the code
independent of OF and device tree, and make it work also for ACPI with
an appropriate _DSD.
ASL example:
Package (0x02)
{
"panel", \_SB.PCI0.GFX0.LCD0
}
Suggested-by: Heikki Krogerus <heikki.krogerus at linux.intel.com>
Cc: Neil Armstrong <neil.armstrong at linaro.org>
Cc: Jessica Zhang <jessica.zhang at oss.qualcomm.com>
Cc: Maxime Ripard <mripard at kernel.org>
Cc: Doug Anderson <dianders at chromium.org>
Cc: Lee Shawn C <shawn.c.lee at intel.com>
Signed-off-by: Jani Nikula <jani.nikula at intel.com>
---
drivers/gpu/drm/drm_panel.c | 39 +++++++++++++++++++++++++++++--------
1 file changed, 31 insertions(+), 8 deletions(-)
diff --git a/drivers/gpu/drm/drm_panel.c b/drivers/gpu/drm/drm_panel.c
index fee65dc65979..3eb0a615f7a9 100644
--- a/drivers/gpu/drm/drm_panel.c
+++ b/drivers/gpu/drm/drm_panel.c
@@ -473,17 +473,40 @@ int of_drm_get_panel_orientation(const struct device_node *np,
EXPORT_SYMBOL(of_drm_get_panel_orientation);
#endif
-static struct drm_panel *of_find_panel(struct device *follower_dev)
+/* Find panel by fwnode */
+static struct drm_panel *find_panel_by_fwnode(const struct fwnode_handle *fwnode)
{
- struct device_node *panel_np;
struct drm_panel *panel;
- panel_np = of_parse_phandle(follower_dev->of_node, "panel", 0);
- if (!panel_np)
+ if (!fwnode_device_is_available(fwnode))
return ERR_PTR(-ENODEV);
- panel = of_drm_find_panel(panel_np);
- of_node_put(panel_np);
+ mutex_lock(&panel_lock);
+
+ list_for_each_entry(panel, &panel_list, list) {
+ if (dev_fwnode(panel->dev) == fwnode) {
+ mutex_unlock(&panel_lock);
+ return panel;
+ }
+ }
+
+ mutex_unlock(&panel_lock);
+
+ return ERR_PTR(-EPROBE_DEFER);
+}
+
+/* Find panel by follower device */
+static struct drm_panel *find_panel_by_dev(struct device *follower_dev)
+{
+ struct fwnode_handle *fwnode;
+ struct drm_panel *panel;
+
+ fwnode = fwnode_find_reference(dev_fwnode(follower_dev), "panel", 0);
+ if (IS_ERR_OR_NULL(fwnode))
+ return ERR_PTR(-ENODEV);
+
+ panel = find_panel_by_fwnode(fwnode);
+ fwnode_handle_put(fwnode);
return panel;
}
@@ -506,7 +529,7 @@ bool drm_is_panel_follower(struct device *dev)
* don't bother trying to parse it here. We just need to know if the
* property is there.
*/
- return of_property_present(dev->of_node, "panel");
+ return device_property_present(dev, "panel");
}
EXPORT_SYMBOL(drm_is_panel_follower);
@@ -536,7 +559,7 @@ int drm_panel_add_follower(struct device *follower_dev,
struct drm_panel *panel;
int ret;
- panel = of_find_panel(follower_dev);
+ panel = find_panel_by_dev(follower_dev);
if (IS_ERR(panel))
return PTR_ERR(panel);
--
2.39.5
More information about the Intel-xe
mailing list