解释一下高通DRM显示框架的这段代码struct drm_panel *of_drm_find_panel(const struct device_node *np) { struct drm_panel *panel; if (!of_device_is_available(np)) { printk("find panel 1 failed --------wxy\n"); return ERR_PTR(-ENODEV); } mutex_lock(&panel_lock); list_for_each_entry(panel, &panel_list, list) { if (panel->dev->of_node == np) { printk("find panel 2 success--------wxy\n"); mutex_unlock(&panel_lock); return panel; } } mutex_unlock(&panel_lock); return ERR_PTR(-EPROBE_DEFER); }
时间: 2024-02-14 13:36:12 浏览: 220
drm.zip_DRM_VYHJ_duringgbk_linux drm headers_msm_drm.
这段代码实现了一个函数 `of_drm_find_panel`,它的作用是在DRM系统中寻找并返回一个与给定设备节点(`np`)对应的DRM面板(`struct drm_panel`)。具体实现如下:
- 首先检查给定设备节点是否可用(`of_device_is_available(np)`),如果不可用则返回一个错误指针并打印一条错误信息。
- 获取全局互斥锁(`panel_lock`),以防止多个线程同时对DRM面板列表进行访问。
- 遍历DRM面板列表(`panel_list`),对于每个DRM面板:
- 判断该面板的设备节点是否与给定设备节点相同(`panel->dev->of_node == np`)。
- 如果相同,则返回该面板,并释放全局互斥锁。
- 如果不同,则继续寻找下一个DRM面板。
- 遍历完整个DRM面板列表后,仍未找到与给定设备节点对应的DRM面板,则释放全局互斥锁并返回一个错误指针,表示该设备节点对应的DRM面板还没有被探测到。
其中,打印的调试信息主要是为了方便开发者调试使用,可以根据需要进行删除或修改。
阅读全文