`wsphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextEnglish}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget/driver-api/phy/phymodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/zh_TW/driver-api/phy/phymodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/it_IT/driver-api/phy/phymodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/ja_JP/driver-api/phy/phymodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/ko_KR/driver-api/phy/phymodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget&/translations/sp_SP/driver-api/phy/phymodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageChinese (Simplified)uh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhS/var/lib/git/docbuild/linux/Documentation/translations/zh_CN/driver-api/phy/phy.rsthKubhnote)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]h paragraph)}(hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。h]hX{此文件的目的是为让中文读者更容易阅读和理解,而不是作为一个分支。 因此, 如果您对此文件有任何意见或更新,请先尝试更新原始英文文件。 如果您发现本文档与原始文件有任何不同或者有翻译问题,请发建议或者补丁给 该文件的译者,或者请求中文文档维护者和审阅者的帮助。}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hh5Documentation/translations/zh_CN/disclaimer-zh_CN.rsthKhhubah}(h]h ]h"]h$]h&]uh1hhhhhhhhNubh field_list)}(hhh](hfield)}(hhh](h field_name)}(hOriginalh]hOriginal}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhKubh field_body)}(h%Documentation/driver-api/phy/phy.rst h]h)}(h$Documentation/driver-api/phy/phy.rsth]h$Documentation/driver-api/phy/phy.rst}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhubah}(h]h ]h"]h$]h&]uh1hhhubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h翻译h]h翻译}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhKubh)}(h-司延腾 Yanteng Si h]h)}(h,司延腾 Yanteng Si h](h司延腾 Yanteng Si <}(hj hhhNhNubh reference)}(hsiyanteng@loongson.cnh]hsiyanteng@loongson.cn}(hj*hhhNhNubah}(h]h ]h"]h$]h&]refurimailto:siyanteng@loongson.cnuh1j(hj ubh>}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhj ubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubeh}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhsection)}(hhh](htitle)}(h PHY子系统h]h PHY子系统}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1j[hjXhhhhhK ubh)}(hhh]h)}(hhh](h)}(h作者h]h作者}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjnhhhKubh)}(h'Kishon Vijay Abraham I h]h)}(h&Kishon Vijay Abraham I h](hKishon Vijay Abraham I <}(hjhhhNhNubj))}(h kishon@ti.comh]h kishon@ti.com}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurimailto:kishon@ti.comuh1j(hjubh>}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhjnubeh}(h]h ]h"]h$]h&]uh1hhhhKhjkhhubah}(h]h ]h"]h$]h&]uh1hhjXhhhhhKubh)}(hM本文档解释了 PHY 的通用框架和提供的API,以及使用方法。h]hM本文档解释了 PHY 的通用框架和提供的API,以及使用方法。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjXhhubjW)}(hhh](j\)}(h简介h]h简介}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j[hjhhhhhKubh)}(hX*PHY* 是物理层的缩写,它被用来把设备连接到一个物理媒介,例如USB控制器 有一个提供序列化、反序列化、编码、解码和负责获取所需的数据传输速率的 PHY。 注意,有些USB控制器内嵌了 PHY 的功能,其它的则使用了一个外置的PHY,此外 使用 PHY 的设备还有无线网、以太网、SATA等(控制器)。h](hemphasis)}(h*PHY*h]hPHY}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhX~ 是物理层的缩写,它被用来把设备连接到一个物理媒介,例如USB控制器 有一个提供序列化、反序列化、编码、解码和负责获取所需的数据传输速率的 PHY。 注意,有些USB控制器内嵌了 PHY 的功能,其它的则使用了一个外置的PHY,此外 使用 PHY 的设备还有无线网、以太网、SATA等(控制器)。}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(h创建这个框架的目的是将遍布 Linux 内核的 PHY 驱动程序融入到 drivers/phy, 以增加代码的可复用性,进而提高代码的可维护性。h]h创建这个框架的目的是将遍布 Linux 内核的 PHY 驱动程序融入到 drivers/phy, 以增加代码的可复用性,进而提高代码的可维护性。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hV该框架仅适用于使用外部 PHY(PHY 功能未嵌入控制器内)的设备。h]hV该框架仅适用于使用外部 PHY(PHY 功能未嵌入控制器内)的设备。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]id1ah ]h"]简介ah$]h&]uh1jVhjXhhhhhKubjW)}(hhh](j\)}(h注册/注销PHY providerh]h注册/注销PHY provider}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j[hjhhhhhK ubh)}(hX?PHY provider是指实现一个或多个 PHY 实例的实体。对于 PHY provider 仅 实现单个 PHY 实例的简单情况,框架在 of_phy_simple_xlate 中提供其自己 的 of_xlate 实现。如果 PHY provider 实现多个实例,则应提供其自己的 of_xlate 实现。of_xlate 仅用于 dt 启动情况。h]hX?PHY provider是指实现一个或多个 PHY 实例的实体。对于 PHY provider 仅 实现单个 PHY 实例的简单情况,框架在 of_phy_simple_xlate 中提供其自己 的 of_xlate 实现。如果 PHY provider 实现多个实例,则应提供其自己的 of_xlate 实现。of_xlate 仅用于 dt 启动情况。}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK"hjhhubh literal_block)}(hX%#define of_phy_provider_register(dev, xlate) \ __of_phy_provider_register((dev), NULL, THIS_MODULE, (xlate)) #define devm_of_phy_provider_register(dev, xlate) \ __devm_of_phy_provider_register((dev), NULL, THIS_MODULE, (xlate))h]hX%#define of_phy_provider_register(dev, xlate) \ __of_phy_provider_register((dev), NULL, THIS_MODULE, (xlate)) #define devm_of_phy_provider_register(dev, xlate) \ __devm_of_phy_provider_register((dev), NULL, THIS_MODULE, (xlate))}hj9sbah}(h]h ]h"]h$]h&]hhuh1j7hhhK)hjhhubh)}(hof_phy_provider_register 和 devm_of_phy_provider_register 宏 可用于注册 phy_provider,它以 device 和 of_xlate 作为参数。对于 dt 启动情况,所有 PHY provider 都应使用上述两个宏之一来注册 PHY provider。h]hof_phy_provider_register 和 devm_of_phy_provider_register 宏 可用于注册 phy_provider,它以 device 和 of_xlate 作为参数。对于 dt 启动情况,所有 PHY provider 都应使用上述两个宏之一来注册 PHY provider。}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK0hjhhubh)}(hXe与 PHY provider 关联的设备树节点通常包含一组子节点,每个子节点代表一个 PHY。某些绑定可能会为了上下文和可扩展性将子节点嵌套在特别的层级中,在这种 情况下,可以使用低级别的 of_phy_provider_register_full() 和 devm_of_phy_provider_register_full() 宏来覆盖包含子节点的节点。h]hXe与 PHY provider 关联的设备树节点通常包含一组子节点,每个子节点代表一个 PHY。某些绑定可能会为了上下文和可扩展性将子节点嵌套在特别的层级中,在这种 情况下,可以使用低级别的 of_phy_provider_register_full() 和 devm_of_phy_provider_register_full() 宏来覆盖包含子节点的节点。}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK4hjhhubj8)}(hX#define of_phy_provider_register_full(dev, children, xlate) \ __of_phy_provider_register(dev, children, THIS_MODULE, xlate) #define devm_of_phy_provider_register_full(dev, children, xlate) \ __devm_of_phy_provider_register_full(dev, children, THIS_MODULE, xlate) void devm_of_phy_provider_unregister(struct device *dev, struct phy_provider *phy_provider); void of_phy_provider_unregister(struct phy_provider *phy_provider);h]hX#define of_phy_provider_register_full(dev, children, xlate) \ __of_phy_provider_register(dev, children, THIS_MODULE, xlate) #define devm_of_phy_provider_register_full(dev, children, xlate) \ __devm_of_phy_provider_register_full(dev, children, THIS_MODULE, xlate) void devm_of_phy_provider_unregister(struct device *dev, struct phy_provider *phy_provider); void of_phy_provider_unregister(struct phy_provider *phy_provider);}hjcsbah}(h]h ]h"]h$]h&]hhuh1j7hhhK;hjhhubh)}(hXdevm_of_phy_provider_unregister 和 of_phy_provider_unregister 可以被用来注销PHY.h]hXdevm_of_phy_provider_unregister 和 of_phy_provider_unregister 可以被用来注销PHY.}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKFhjhhubeh}(h] phy-providerah ]h"]注册/注销phy providerah$]h&]uh1jVhjXhhhhhK ubjW)}(hhh](j\)}(h 创建PHYh]h 创建PHY}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j[hjhhhhhKJubh)}(hPHY 驱动程序应创建 PHY,以便其他外围(芯片)控制器能够使用它。PHY 框架 提供了 2 个 API 来创建 PHY。h]hPHY 驱动程序应创建 PHY,以便其他外围(芯片)控制器能够使用它。PHY 框架 提供了 2 个 API 来创建 PHY。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKLhjhhubj8)}(hXstruct phy *phy_create(struct device *dev, struct device_node *node, const struct phy_ops *ops); struct phy *devm_phy_create(struct device *dev, struct device_node *node, const struct phy_ops *ops);h]hXstruct phy *phy_create(struct device *dev, struct device_node *node, const struct phy_ops *ops); struct phy *devm_phy_create(struct device *dev, struct device_node *node, const struct phy_ops *ops);}hjsbah}(h]h ]h"]h$]h&]hhuh1j7hhhKQhjhhubh)}(hjPHY 驱动程序可以使用上述两个 API 之一,通过传递设备指针和 phy_ops 来创建 PHY。h]hjPHY 驱动程序可以使用上述两个 API 之一,通过传递设备指针和 phy_ops 来创建 PHY。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKWhjhhubh)}(hkphy_ops 是一组用于执行 PHY 操作(例如 init、exit、power_on 和 power_off)的函数指针。h]hkphy_ops 是一组用于执行 PHY 操作(例如 init、exit、power_on 和 power_off)的函数指针。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKZhjhhubh)}(h在 phy_ops 中,PHY provider驱动程序在创建 PHY 后使用 phy_set_drvdata() 设置私有数据,使用 phy_get_drvdata() 获取私有数据。h]h在 phy_ops 中,PHY provider驱动程序在创建 PHY 后使用 phy_set_drvdata() 设置私有数据,使用 phy_get_drvdata() 获取私有数据。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK]hjhhubeh}(h]id2ah ]h"] 创建phyah$]h&]uh1jVhjXhhhhhKJubjW)}(hhh](j\)}(h获取对 PHY 的引用h]h获取对 PHY 的引用}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j[hjhhhhhKaubh)}(h|控制器必须先获取对 PHY 的引用,然后才能使用 PHY。此框架提供以下 API 来获取对 PHY 的引用。h]h|控制器必须先获取对 PHY 的引用,然后才能使用 PHY。此框架提供以下 API 来获取对 PHY 的引用。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKchjhhubj8)}(hXstruct phy *phy_get(struct device *dev, const char *string); struct phy *devm_phy_get(struct device *dev, const char *string); struct phy *devm_phy_optional_get(struct device *dev, const char *string); struct phy *devm_of_phy_get(struct device *dev, struct device_node *np, const char *con_id); struct phy *devm_of_phy_optional_get(struct device *dev, struct device_node *np, const char *con_id); struct phy *devm_of_phy_get_by_index(struct device *dev, struct device_node *np, int index);h]hXstruct phy *phy_get(struct device *dev, const char *string); struct phy *devm_phy_get(struct device *dev, const char *string); struct phy *devm_phy_optional_get(struct device *dev, const char *string); struct phy *devm_of_phy_get(struct device *dev, struct device_node *np, const char *con_id); struct phy *devm_of_phy_optional_get(struct device *dev, struct device_node *np, const char *con_id); struct phy *devm_of_phy_get_by_index(struct device *dev, struct device_node *np, int index);}hjsbah}(h]h ]h"]h$]h&]hhuh1j7hhhKhhjhhubh)}(hXphy_get、devm_phy_get 和 devm_phy_optional_get 可用于在 dt 启动的情况下获取 PHY,字符串参数应包含 dt 数据中给出的 phy 名称,在 非 dt 启动的情况下,它应包含 PHY 的标签。两个 devm_phy_get 在成功 获取 PHY 后使用 devres 将设备与 PHY 关联。在驱动程序分离时,将在 devres 数据上调用 release 函数并释放 devres 数据。当 phy 是可选 的时,应使用 _optional_get 变体。这些函数永远不会返回 -ENODEV,而 是在找不到 phy 时返回 NULL。一些通用驱动程序(例如 ehci)可能使用 多个 phy。在这种情况下,devm_of_phy_get 或 devm_of_phy_get_by_index 用于根据名称或索引获取 phy 引用。h]hXphy_get、devm_phy_get 和 devm_phy_optional_get 可用于在 dt 启动的情况下获取 PHY,字符串参数应包含 dt 数据中给出的 phy 名称,在 非 dt 启动的情况下,它应包含 PHY 的标签。两个 devm_phy_get 在成功 获取 PHY 后使用 devres 将设备与 PHY 关联。在驱动程序分离时,将在 devres 数据上调用 release 函数并释放 devres 数据。当 phy 是可选 的时,应使用 _optional_get 变体。这些函数永远不会返回 -ENODEV,而 是在找不到 phy 时返回 NULL。一些通用驱动程序(例如 ehci)可能使用 多个 phy。在这种情况下,devm_of_phy_get 或 devm_of_phy_get_by_index 用于根据名称或索引获取 phy 引用。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKuhjhhubh)}(hX?需要注意的是,NULL 是有效的 phy 引用。NULL phy 上的所有 phy 使用 者调用都将成为 NOP。也就是说释放调用,当应用于 NULL phy 时,release 调用、phy_init()/phy_exit() 调用、phy_power_on()/phy_power_off() 调用都是 NOP。NULL phy 在处理可选的 phy 设备中很有用。h]hX?需要注意的是,NULL 是有效的 phy 引用。NULL phy 上的所有 phy 使用 者调用都将成为 NOP。也就是说释放调用,当应用于 NULL phy 时,release 调用、phy_init()/phy_exit() 调用、phy_power_on()/phy_power_off() 调用都是 NOP。NULL phy 在处理可选的 phy 设备中很有用。}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]id3ah ]h"]获取对 phy 的引用ah$]h&]uh1jVhjXhhhhhKaubjW)}(hhh](j\)}(hAPI的调用顺序h]hAPI的调用顺序}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1j[hj7hhhhhKubh)}(h 通常,调用顺序应该是::h]h通常,调用顺序应该是:}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj7hhubj8)}(hv[devm_][of_]phy_get() phy_init() phy_power_on() [phy_set_mode[_ext]()] ... phy_power_off() phy_exit() [[of_]phy_put()]h]hv[devm_][of_]phy_get() phy_init() phy_power_on() [phy_set_mode[_ext]()] ... phy_power_off() phy_exit() [[of_]phy_put()]}hjVsbah}(h]h ]h"]h$]h&]hhuh1j7hhhKhj7hhubh)}(hX一些PHY驱动可能没有实现 :c:func:`phy_init` 或 :c:func:`phy_power_on`, 但是控制器应该总是调用这些函数以兼容其它PHY,有些PHY可能要求 :c:func:`phy_set_mode ` 而其他 PHY 可能使用 默认模式(通常通过设备树或其他固件配置)。出于兼容性考虑,如果您知道将 使用哪种模式,则应始终调用此函数。通常,应在 :c:func:`phy_power_on` 之后调用此函数,尽管某些 PHY 驱动程序可能随时允许调用它。h](h"一些PHY驱动可能没有实现 }(hjdhhhNhNubh)}(h:c:func:`phy_init`h]hliteral)}(hjnh]h phy_init()}(hjrhhhNhNubah}(h]h ](xrefcc-funceh"]h$]h&]uh1jphjlubah}(h]h ]h"]h$]h&]refdoc%translations/zh_CN/driver-api/phy/phy refdomainj}reftypefunc refexplicitrefwarn reftargetphy_inituh1hhhhKhjdubh 或 }(hjdhhhNhNubh)}(h:c:func:`phy_power_on`h]jq)}(hjh]hphy_power_on()}(hjhhhNhNubah}(h]h ](j|j}c-funceh"]h$]h&]uh1jphjubah}(h]h ]h"]h$]h&]refdocj refdomainj}reftypefunc refexplicitrefwarnj phy_power_onuh1hhhhKhjdubhZ, 但是控制器应该总是调用这些函数以兼容其它PHY,有些PHY可能要求 }(hjdhhhNhNubh)}(h):c:func:`phy_set_mode `h]jq)}(hjh]h phy_set_mode}(hjhhhNhNubah}(h]h ](j|j}c-funceh"]h$]h&]uh1jphjubah}(h]h ]h"]h$]h&]refdocj refdomainj}reftypefunc refexplicitrefwarnjphy_set_mode_extuh1hhhhKhjdubh 而其他 PHY 可能使用 默认模式(通常通过设备树或其他固件配置)。出于兼容性考虑,如果您知道将 使用哪种模式,则应始终调用此函数。通常,应在 }(hjdhhhNhNubh)}(h:c:func:`phy_power_on`h]jq)}(hjh]hphy_power_on()}(hjhhhNhNubah}(h]h ](j|j}c-funceh"]h$]h&]uh1jphjubah}(h]h ]h"]h$]h&]refdocj refdomainj}reftypefunc refexplicitrefwarnj phy_power_onuh1hhhhKhjdubhT 之后调用此函数,尽管某些 PHY 驱动程序可能随时允许调用它。}(hjdhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhj7hhubeh}(h]apiah ]h"]api的调用顺序ah$]h&]uh1jVhjXhhhhhKubjW)}(hhh](j\)}(h释放对 PHY 的引用h]h释放对 PHY 的引用}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j[hj hhhhhKubh)}(h当控制器不再需要 PHY 时,它必须使用上一节中提到的 API 释放对已获得 的 PHY 的引用。PHY 框架提供了 2 个 API 来释放对 PHY 的引用。h]h当控制器不再需要 PHY 时,它必须使用上一节中提到的 API 释放对已获得 的 PHY 的引用。PHY 框架提供了 2 个 API 来释放对 PHY 的引用。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubj8)}(hVvoid phy_put(struct phy *phy); void devm_phy_put(struct device *dev, struct phy *phy);h]hVvoid phy_put(struct phy *phy); void devm_phy_put(struct device *dev, struct phy *phy);}hj+sbah}(h]h ]h"]h$]h&]hhuh1j7hhhKhj hhubh)}(hq这两个 API 都用于释放对 PHY 的引用,并且 devm_phy_put 会销毁与此 PHY 关联的设备资源。h]hq这两个 API 都用于释放对 PHY 的引用,并且 devm_phy_put 会销毁与此 PHY 关联的设备资源。}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubeh}(h]id4ah ]h"]释放对 phy 的引用ah$]h&]uh1jVhjXhhhhhKubjW)}(hhh](j\)}(h 销毁 PHYh]h 销毁 PHY}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1j[hjOhhhhhKubh)}(hk当创建 PHY 的驱动程序被卸载时,它应该使用以下 2 个 API 之一销毁其创 建的 PHY::h]hj当创建 PHY 的驱动程序被卸载时,它应该使用以下 2 个 API 之一销毁其创 建的 PHY:}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjOhhubj8)}(h^void phy_destroy(struct phy *phy); void devm_phy_destroy(struct device *dev, struct phy *phy);h]h^void phy_destroy(struct phy *phy); void devm_phy_destroy(struct device *dev, struct phy *phy);}hjnsbah}(h]h ]h"]h$]h&]hhuh1j7hhhKhjOhhubh)}(ha这两个 API 都会销毁 PHY,并且 devm_phy_destroy 会销毁与此 PHY 关 联的 devres。h]ha这两个 API 都会销毁 PHY,并且 devm_phy_destroy 会销毁与此 PHY 关 联的 devres。}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjOhhubeh}(h]id5ah ]h"] 销毁 phyah$]h&]uh1jVhjXhhhhhKubjW)}(hhh](j\)}(h PM Runtimeh]h PM Runtime}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j[hjhhhhhKubh)}(hX2这个子系统启用了pm runtime。 所以,在创建PHY 时,将调用此子系统创建的 phy 设备的 pm_runtime_enable 函数,在销毁 PHY 时,将调用 pm_runtime_disable。请注意,此子系统创建的 phy 设备将是调用 phy_create (PHY provider 设备)的设备的子设备。h]hX2这个子系统启用了pm runtime。 所以,在创建PHY 时,将调用此子系统创建的 phy 设备的 pm_runtime_enable 函数,在销毁 PHY 时,将调用 pm_runtime_disable。请注意,此子系统创建的 phy 设备将是调用 phy_create (PHY provider 设备)的设备的子设备。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hX因此,由于父子关系,此子系统创建的 phy_device 的 pm_runtime_get_sync 调用 PHY provider 设备的 pm_runtime_get_sync。还应注意, phy_power_on 和 phy_power_off 分别执行 phy_pm_runtime_get_sync 和 phy_pm_runtime_put。有导出的 API,如 phy_pm_runtime_get、 phy_pm_runtime_get_sync、phy_pm_runtime_put、phy_pm_runtime_put_sync、 phy_pm_runtime_allow 和 phy_pm_runtime_forbid,用于执行 PM 操作。h]hX因此,由于父子关系,此子系统创建的 phy_device 的 pm_runtime_get_sync 调用 PHY provider 设备的 pm_runtime_get_sync。还应注意, phy_power_on 和 phy_power_off 分别执行 phy_pm_runtime_get_sync 和 phy_pm_runtime_put。有导出的 API,如 phy_pm_runtime_get、 phy_pm_runtime_get_sync、phy_pm_runtime_put、phy_pm_runtime_put_sync、 phy_pm_runtime_allow 和 phy_pm_runtime_forbid,用于执行 PM 操作。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h] pm-runtimeah ]h"] pm runtimeah$]h&]uh1jVhjXhhhhhKubjW)}(hhh](j\)}(h PHY映射h]h PHY映射}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j[hjhhhhhKubh)}(h为了在没有 DeviceTree 帮助的情况下获取对 PHY 的引用,框架提供了可与 clkdev 进行比较的查找,允许将 clk 结构体绑定到设备。当 struct phy 的 句柄已存在时,可以在运行时进行查找。h]h为了在没有 DeviceTree 帮助的情况下获取对 PHY 的引用,框架提供了可与 clkdev 进行比较的查找,允许将 clk 结构体绑定到设备。当 struct phy 的 句柄已存在时,可以在运行时进行查找。}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(h7该框架提供以下 API 用于注册和注销查找::h]h6该框架提供以下 API 用于注册和注销查找:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj8)}(hint phy_create_lookup(struct phy *phy, const char *con_id, const char *dev_id); void phy_remove_lookup(struct phy *phy, const char *con_id, const char *dev_id);h]hint phy_create_lookup(struct phy *phy, const char *con_id, const char *dev_id); void phy_remove_lookup(struct phy *phy, const char *con_id, const char *dev_id);}hjsbah}(h]h ]h"]h$]h&]hhuh1j7hhhKhjhhubeh}(h]id6ah ]h"] phy映射ah$]h&]uh1jVhjXhhhhhKubjW)}(hhh](j\)}(hDeviceTree绑定h]hDeviceTree绑定}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j[hj hhhhhKubh)}(hjPHY dt 绑定的文档可以在以下位置找到 @ Documentation/devicetree/bindings/phy/phy-bindings.txth]hjPHY dt 绑定的文档可以在以下位置找到 @ Documentation/devicetree/bindings/phy/phy-bindings.txt}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj hhubeh}(h] devicetreeah ]h"]devicetree绑定ah$]h&]uh1jVhjXhhhhhKubeh}(h]phyah ]h"] phy子系统ah$]h&]uh1jVhhhhhhhK ubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(j[N generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerj\error_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(j6j3jjjjjjj4j1j jjLjIjjjjjjj.j+u nametypes}(j6jjjj4j jLjjjj.uh}(j3jXjjjjjjj1jjj7jIj jjOjjjjj+j u footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}jjKsRparse_messages]transform_messages] transformerN include_log]7Documentation/translations/zh_CN/driver-api/phy/phy.rst(NNNNta decorationNhhub.