On June 6, 2025, 9:05, Jani Nikula <jani.nik...@intel.com> wrote: >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.kroge...@linux.intel.com> >Cc: Neil Armstrong <neil.armstr...@linaro.org> >Cc: Jessica Zhang <jessica.zh...@oss.qualcomm.com> >Cc: Maxime Ripard <mrip...@kernel.org> >Cc: Doug Anderson <diand...@chromium.org> >Cc: Lee Shawn C <shawn.c....@intel.com> >Signed-off-by: Jani Nikula <jani.nik...@intel.com>
This patch series was tested on my local device. And panel follower works well. Tested-by: Lee Shawn C <shawn.c....@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 >