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
>

Reply via email to