解释一下高通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 浏览: 191
这段代码实现了一个函数 `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面板还没有被探测到。
其中,打印的调试信息主要是为了方便开发者调试使用,可以根据需要进行删除或修改。
相关问题
解释一下这段代码int drm_of_find_panel_or_bridge(const struct device_node *np, int port, int endpoint, struct drm_panel **panel, struct drm_bridge **bridge) { int ret = -EPROBE_DEFER; struct device_node *remote; if (!panel && !bridge) return -EINVAL; if (panel) *panel = NULL; /* * of_graph_get_remote_node() produces a noisy error message if port * node isn't found and the absence of the port is a legit case here, * so at first we silently check whether graph presents in the * device-tree node. */ if (!of_graph_is_present(np)) return -ENODEV; remote = of_graph_get_remote_node(np, port, endpoint); if (!remote) return -ENODEV; if (panel) { *panel = of_drm_find_panel(remote); if (!IS_ERR(*panel)) ret = 0; else *panel = NULL; } /* No panel found yet, check for a bridge next. */ if (bridge) { if (ret) { *bridge = of_drm_find_bridge(remote); if (*bridge) ret = 0; } else { *bridge = NULL; } } of_node_put(remote); return ret; }
这段代码是 Linux 内核 DRM 子系统中的函数 `drm_of_find_panel_or_bridge` 的实现代码,该函数用于查找设备树节点下的面板或桥接器。
该函数的参数 `np` 是一个指向设备树节点的指针,`port` 和 `endpoint` 是设备树节点的端口和端点号,`panel` 和 `bridge` 分别是指向 drm_panel 和 drm_bridge 结构体指针的指针。函数返回一个整数值,表示查找结果。
在函数实现中,首先判断传入的参数 `panel` 和 `bridge` 是否都为空指针,如果是则返回 -EINVAL。接着,使用 `of_graph_is_present` 函数判断设备树节点中是否存在 graph 节点,如果不存在则返回 -ENODEV。然后,调用 `of_graph_get_remote_node` 函数获取指定端口和端点号的远程节点,如果获取失败则返回 -ENODEV。
接着,如果 `panel` 不为空,则调用 `of_drm_find_panel` 函数查找面板节点并将结果存入 `panel` 指针中,如果查找成功则将返回值 `ret` 设为 0,否则将 `panel` 指针设为 NULL。如果 `panel` 为空,则不查找面板节点。
如果没有找到面板节点,则继续查找桥接器节点。如果 `bridge` 不为空,则先判断 `ret` 的值,如果不为 0,则调用 `of_drm_find_bridge` 函数查找桥接器节点并将结果存入 `bridge` 指针中,如果查找成功则将返回值 `ret` 设为 0,否则将 `bridge` 指针设为 NULL。如果 `bridge` 为空,则不查找桥接器节点。
最后,使用 `of_node_put` 函数释放获取到的远程节点,最终返回查找结果。
高通DRMi显示框架中的这段代码怎么解释struct device_node *of_graph_get_endpoint_by_regs( const struct device_node *parent, int port_reg, int reg) { struct of_endpoint endpoint; struct device_node *node = NULL; for_each_endpoint_of_node(parent, node) { of_graph_parse_endpoint(node, &endpoint); if (((port_reg == -1) || (endpoint.port == port_reg)) && ((reg == -1) || (endpoint.id == reg))) return node; } return NULL; }
这段代码是一个函数实现,用于在设备树中查找指定的输出端点。
函数名是of_graph_get_endpoint_by_regs,接受三个参数: parent、port_reg 和 reg。其中,parent是设备树中一个节点的父节点,port_reg和reg是用来查找输出端点的寄存器值。
函数实现的主要逻辑如下:
1. 定义一个of_endpoint类型的结构体变量endpoint和一个device_node类型的指针变量node,用于解析和遍历设备树的输出端点。
2. 调用for_each_endpoint_of_node宏,遍历parent节点的所有输出端点。
3. 对于每个输出端点,调用of_graph_parse_endpoint函数,解析该节点的endpoint属性,获取输出端点的信息。
4. 判断输出端点的port属性和id属性是否与指定的port_reg和reg相等。
5. 如果相等,则返回该输出端点的device_node指针;否则继续遍历其他输出端点。
6. 如果遍历完所有的输出端点都没有找到匹配的节点,则返回NULL。
该函数应用于DRM驱动程序中,用于查找指定的输出端点,例如查找指定分辨率的输出端点,然后将显示器的分辨率设置为符合要求的输出端点。
阅读全文