[PATCH 1/4] drm/panel: use fwnode based lookups for panel followers
Jani Nikula
jani.nikula at intel.com
Tue Jun 10 09:36:32 UTC 2025
On Mon, 09 Jun 2025, Doug Anderson <dianders at chromium.org> wrote:
> Hi,
>
> On Fri, Jun 6, 2025 at 2:06 AM Jani Nikula <jani.nikula at 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.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)
>
> nit: It might be worth adding a comment that says it should be
> identical to of_drm_find_panel() since that has a much richer
> kerneldoc that talks about the corner cases.
Agreed.
I'm actually wondering if it would be possible to implement
of_drm_find_panel() like this (as a follow-up change):
struct drm_panel *of_drm_find_panel(const struct device_node *np)
{
const struct fwnode_handle *fwnode = of_fwnode_handle(np);
return find_panel_by_fwnode(fwnode);
}
But I'd rather leave that out for now.
>
>> {
>> - 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))
>
> nit: why IS_ERR_OR_NULL() instead of IS_ERR()? The kerneldoc for
> fwnode_find_reference() doesn't mention anything about it returning a
> NULL value in any cases...
Will fix.
> Other than the nits, this looks reasonable to me.
>
> Reviewed-by: Douglas Anderson <dianders at chromium.org>
>
> I no longer have any easy access to hardware where panel-follower is
> truly necessary, but I can at least see the panel-follower calls
> getting made on sc7180-trogdor-lazor, so the of->fwnode conversion
> stuff must be working.
>
> Tested-by: Douglas Anderson <dianders at chromium.org>
Thanks for the review and testing, much appreciated!
BR,
Jani.
--
Jani Nikula, Intel
More information about the Intel-gfx
mailing list