€•N¿Œsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…””}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ$/translations/zh_CN/hwmon/pmbus-core”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/zh_TW/hwmon/pmbus-core”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/it_IT/hwmon/pmbus-core”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/ja_JP/hwmon/pmbus-core”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/ko_KR/hwmon/pmbus-core”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒPortuguese (Brazilian)”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/pt_BR/hwmon/pmbus-core”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ$/translations/sp_SP/hwmon/pmbus-core”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒ"PMBus core driver and internal API”h]”hŒ"PMBus core driver and internal API”…””}”(hh¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhh·h²hh³Œ>/var/lib/git/docbuild/linux/Documentation/hwmon/pmbus-core.rst”h´Kubh¶)”}”(hhh]”(h»)”}”(hŒ Introduction”h]”hŒ Introduction”…””}”(hhÎh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhhËh²hh³hÊh´KubhŒ paragraph”“”)”}”(hX [from pmbus.org] The Power Management Bus (PMBus) is an open standard power-management protocol with a fully defined command language that facilitates communication with power converters and other devices in a power system. The protocol is implemented over the industry-standard SMBus serial interface and enables programming, control, and real-time monitoring of compliant power conversion products. This flexible and highly versatile standard allows for communication between devices based on both analog and digital technologies, and provides true interoperability which will reduce design complexity and shorten time to market for power system designers. Pioneered by leading power supply and semiconductor companies, this open power system standard is maintained and promoted by the PMBus Implementers Forum (PMBus-IF), comprising 30+ adopters with the objective to provide support to, and facilitate adoption among, users.”h]”hX [from pmbus.org] The Power Management Bus (PMBus) is an open standard power-management protocol with a fully defined command language that facilitates communication with power converters and other devices in a power system. The protocol is implemented over the industry-standard SMBus serial interface and enables programming, control, and real-time monitoring of compliant power conversion products. This flexible and highly versatile standard allows for communication between devices based on both analog and digital technologies, and provides true interoperability which will reduce design complexity and shorten time to market for power system designers. Pioneered by leading power supply and semiconductor companies, this open power system standard is maintained and promoted by the PMBus Implementers Forum (PMBus-IF), comprising 30+ adopters with the objective to provide support to, and facilitate adoption among, users.”…””}”(hhÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KhhËh²hubhÝ)”}”(hXuUnfortunately, while PMBus commands are standardized, there are no mandatory commands, and manufacturers can add as many non-standard commands as they like. Also, different PMBUs devices act differently if non-supported commands are executed. Some devices return an error, some devices return 0xff or 0xffff and set a status error flag, and some devices may simply hang up.”h]”hXuUnfortunately, while PMBus commands are standardized, there are no mandatory commands, and manufacturers can add as many non-standard commands as they like. Also, different PMBUs devices act differently if non-supported commands are executed. Some devices return an error, some devices return 0xff or 0xffff and set a status error flag, and some devices may simply hang up.”…””}”(hhìh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KhhËh²hubhÝ)”}”(hXKDespite all those difficulties, a generic PMBus device driver is still useful and supported since kernel version 2.6.39. However, it was necessary to support device specific extensions in addition to the core PMBus driver, since it is simply unknown what new device specific functionality PMBus device developers come up with next.”h]”hXKDespite all those difficulties, a generic PMBus device driver is still useful and supported since kernel version 2.6.39. However, it was necessary to support device specific extensions in addition to the core PMBus driver, since it is simply unknown what new device specific functionality PMBus device developers come up with next.”…””}”(hhúh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KhhËh²hubhÝ)”}”(hXsTo make device specific extensions as scalable as possible, and to avoid having to modify the core PMBus driver repeatedly for new devices, the PMBus driver was split into core, generic, and device specific code. The core code (in pmbus_core.c) provides generic functionality. The generic code (in pmbus.c) provides support for generic PMBus devices. Device specific code is responsible for device specific initialization and, if needed, maps device specific functionality into generic functionality. This is to some degree comparable to PCI code, where generic code is augmented as needed with quirks for all kinds of devices.”h]”hXsTo make device specific extensions as scalable as possible, and to avoid having to modify the core PMBus driver repeatedly for new devices, the PMBus driver was split into core, generic, and device specific code. The core code (in pmbus_core.c) provides generic functionality. The generic code (in pmbus.c) provides support for generic PMBus devices. Device specific code is responsible for device specific initialization and, if needed, maps device specific functionality into generic functionality. This is to some degree comparable to PCI code, where generic code is augmented as needed with quirks for all kinds of devices.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K!hhËh²hubeh}”(h]”Œ introduction”ah ]”h"]”Œ introduction”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kubh¶)”}”(hhh]”(h»)”}”(hŒ(PMBus device capabilities auto-detection”h]”hŒ(PMBus device capabilities auto-detection”…””}”(hj!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjh²hh³hÊh´K,ubhÝ)”}”(hX‡For generic PMBus devices, code in pmbus.c attempts to auto-detect all supported PMBus commands. Auto-detection is somewhat limited, since there are simply too many variables to consider. For example, it is almost impossible to autodetect which PMBus commands are paged and which commands are replicated across all pages (see the PMBus specification for details on multi-page PMBus devices).”h]”hX‡For generic PMBus devices, code in pmbus.c attempts to auto-detect all supported PMBus commands. Auto-detection is somewhat limited, since there are simply too many variables to consider. For example, it is almost impossible to autodetect which PMBus commands are paged and which commands are replicated across all pages (see the PMBus specification for details on multi-page PMBus devices).”…””}”(hj/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K.hjh²hubhÝ)”}”(hŒïFor this reason, it often makes sense to provide a device specific driver if not all commands can be auto-detected. The data structures in this driver can be used to inform the core driver about functionality supported by individual chips.”h]”hŒïFor this reason, it often makes sense to provide a device specific driver if not all commands can be auto-detected. The data structures in this driver can be used to inform the core driver about functionality supported by individual chips.”…””}”(hj=h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K4hjh²hubhÝ)”}”(hX,Some commands are always auto-detected. This applies to all limit commands (lcrit, min, max, and crit attributes) as well as associated alarm attributes. Limits and alarm attributes are auto-detected because there are simply too many possible combinations to provide a manual configuration interface.”h]”hX,Some commands are always auto-detected. This applies to all limit commands (lcrit, min, max, and crit attributes) as well as associated alarm attributes. Limits and alarm attributes are auto-detected because there are simply too many possible combinations to provide a manual configuration interface.”…””}”(hjKh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K9hjh²hubeh}”(h]”Œ(pmbus-device-capabilities-auto-detection”ah ]”h"]”Œ(pmbus device capabilities auto-detection”ah$]”h&]”uh1hµhh·h²hh³hÊh´K,ubh¶)”}”(hhh]”(h»)”}”(hŒPMBus internal API”h]”hŒPMBus internal API”…””}”(hjdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjah²hh³hÊh´K?ubhÝ)”}”(hŒÃThe API between core and device specific PMBus code is defined in drivers/hwmon/pmbus/pmbus.h. In addition to the internal API, pmbus.h defines standard PMBus commands and virtual PMBus commands.”h]”hŒÃThe API between core and device specific PMBus code is defined in drivers/hwmon/pmbus/pmbus.h. In addition to the internal API, pmbus.h defines standard PMBus commands and virtual PMBus commands.”…””}”(hjrh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KAhjah²hubh¶)”}”(hhh]”(h»)”}”(hŒStandard PMBus commands”h]”hŒStandard PMBus commands”…””}”(hjƒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj€h²hh³hÊh´KFubhÝ)”}”(hŒ^Standard PMBus commands (commands values 0x00 to 0xff) are defined in the PMBUs specification.”h]”hŒ^Standard PMBus commands (commands values 0x00 to 0xff) are defined in the PMBUs specification.”…””}”(hj‘h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KHhj€h²hubeh}”(h]”Œstandard-pmbus-commands”ah ]”h"]”Œstandard pmbus commands”ah$]”h&]”uh1hµhjah²hh³hÊh´KFubh¶)”}”(hhh]”(h»)”}”(hŒVirtual PMBus commands”h]”hŒVirtual PMBus commands”…””}”(hjªh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj§h²hh³hÊh´KLubhÝ)”}”(hŒ©Virtual PMBus commands are provided to enable support for non-standard functionality which has been implemented by several chip vendors and is thus desirable to support.”h]”hŒ©Virtual PMBus commands are provided to enable support for non-standard functionality which has been implemented by several chip vendors and is thus desirable to support.”…””}”(hj¸h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KNhj§h²hubhÝ)”}”(hXVirtual PMBus commands start with command value 0x100 and can thus easily be distinguished from standard PMBus commands (which can not have values larger than 0xff). Support for virtual PMBus commands is device specific and thus has to be implemented in device specific code.”h]”hXVirtual PMBus commands start with command value 0x100 and can thus easily be distinguished from standard PMBus commands (which can not have values larger than 0xff). Support for virtual PMBus commands is device specific and thus has to be implemented in device specific code.”…””}”(hjÆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KRhj§h²hubhÝ)”}”(hŒnVirtual commands are named PMBUS_VIRT_xxx and start with PMBUS_VIRT_BASE. All virtual commands are word sized.”h]”hŒnVirtual commands are named PMBUS_VIRT_xxx and start with PMBUS_VIRT_BASE. All virtual commands are word sized.”…””}”(hjÔh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KWhj§h²hubhÝ)”}”(hŒ2There are currently two types of virtual commands.”h]”hŒ2There are currently two types of virtual commands.”…””}”(hjâh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KZhj§h²hubhŒ bullet_list”“”)”}”(hhh]”(hŒ list_item”“”)”}”(hŒJREAD commands are read-only; writes are either ignored or return an error.”h]”hÝ)”}”(hjùh]”hŒJREAD commands are read-only; writes are either ignored or return an error.”…””}”(hjûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K\hj÷ubah}”(h]”h ]”h"]”h$]”h&]”uh1jõhjòh²hh³hÊh´Nubjö)”}”(hŒ—RESET commands are read/write. Reading reset registers returns zero (used for detection), writing any value causes the associated history to be reset. ”h]”hÝ)”}”(hŒ–RESET commands are read/write. Reading reset registers returns zero (used for detection), writing any value causes the associated history to be reset.”h]”hŒ–RESET commands are read/write. Reading reset registers returns zero (used for detection), writing any value causes the associated history to be reset.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K]hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jõhjòh²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ-”uh1jðh³hÊh´K\hj§h²hubhÝ)”}”(hX7Virtual commands have to be handled in device specific driver code. Chip driver code returns non-negative values if a virtual command is supported, or a negative error code if not. The chip driver may return -ENODATA or any other Linux error code in this case, though an error code other than -ENODATA is handled more efficiently and thus preferred. Either case, the calling PMBus core code will abort if the chip driver returns an error code when reading or writing virtual registers (in other words, the PMBus core code will never send a virtual command to a chip).”h]”hX7Virtual commands have to be handled in device specific driver code. Chip driver code returns non-negative values if a virtual command is supported, or a negative error code if not. The chip driver may return -ENODATA or any other Linux error code in this case, though an error code other than -ENODATA is handled more efficiently and thus preferred. Either case, the calling PMBus core code will abort if the chip driver returns an error code when reading or writing virtual registers (in other words, the PMBus core code will never send a virtual command to a chip).”…””}”(hj.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kahj§h²hubeh}”(h]”Œvirtual-pmbus-commands”ah ]”h"]”Œvirtual pmbus commands”ah$]”h&]”uh1hµhjah²hh³hÊh´KLubh¶)”}”(hhh]”(h»)”}”(hŒPMBus driver information”h]”hŒPMBus driver information”…””}”(hjGh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjDh²hh³hÊh´KkubhÝ)”}”(hŒÏPMBus driver information, defined in struct pmbus_driver_info, is the main means for device specific drivers to pass information to the core PMBus driver. Specifically, it provides the following information.”h]”hŒÏPMBus driver information, defined in struct pmbus_driver_info, is the main means for device specific drivers to pass information to the core PMBus driver. Specifically, it provides the following information.”…””}”(hjUh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KmhjDh²hubjñ)”}”(hhh]”(jö)”}”(hŒÎFor devices supporting its data in Direct Data Format, it provides coefficients for converting register values into normalized data. This data is usually provided by chip manufacturers in device datasheets.”h]”hÝ)”}”(hŒÎFor devices supporting its data in Direct Data Format, it provides coefficients for converting register values into normalized data. This data is usually provided by chip manufacturers in device datasheets.”h]”hŒÎFor devices supporting its data in Direct Data Format, it provides coefficients for converting register values into normalized data. This data is usually provided by chip manufacturers in device datasheets.”…””}”(hjjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kqhjfubah}”(h]”h ]”h"]”h$]”h&]”uh1jõhjch²hh³hÊh´Nubjö)”}”(hŒÒSupported chip functionality can be provided to the core driver. This may be necessary for chips which react badly if non-supported commands are executed, and/or to speed up device detection and initialization.”h]”hÝ)”}”(hŒÒSupported chip functionality can be provided to the core driver. This may be necessary for chips which react badly if non-supported commands are executed, and/or to speed up device detection and initialization.”h]”hŒÒSupported chip functionality can be provided to the core driver. This may be necessary for chips which react badly if non-supported commands are executed, and/or to speed up device detection and initialization.”…””}”(hj‚h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kthj~ubah}”(h]”h ]”h"]”h$]”h&]”uh1jõhjch²hh³hÊh´Nubjö)”}”(hXSeveral function entry points are provided to support overriding and/or augmenting generic command execution. This functionality can be used to map non-standard PMBus commands to standard commands, or to augment standard command return values with device specific information. ”h]”hÝ)”}”(hXSeveral function entry points are provided to support overriding and/or augmenting generic command execution. This functionality can be used to map non-standard PMBus commands to standard commands, or to augment standard command return values with device specific information.”h]”hXSeveral function entry points are provided to support overriding and/or augmenting generic command execution. This functionality can be used to map non-standard PMBus commands to standard commands, or to augment standard command return values with device specific information.”…””}”(hjšh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kwhj–ubah}”(h]”h ]”h"]”h$]”h&]”uh1jõhjch²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j,j-uh1jðh³hÊh´KqhjDh²hubeh}”(h]”Œpmbus-driver-information”ah ]”h"]”Œpmbus driver information”ah$]”h&]”uh1hµhjah²hh³hÊh´Kkubeh}”(h]”Œpmbus-internal-api”ah ]”h"]”Œpmbus internal api”ah$]”h&]”uh1hµhh·h²hh³hÊh´K?ubh¶)”}”(hhh]”(h»)”}”(hŒ PEC Support”h]”hŒ PEC Support”…””}”(hjÇh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjÄh²hh³hÊh´K}ubhÝ)”}”(hXKMany PMBus devices support SMBus PEC (Packet Error Checking). If supported by both the I2C adapter and by the PMBus chip, it is by default enabled. If PEC is supported, the PMBus core driver adds an attribute named 'pec' to the I2C device. This attribute can be used to control PEC support in the communication with the PMBus chip.”h]”hXOMany PMBus devices support SMBus PEC (Packet Error Checking). If supported by both the I2C adapter and by the PMBus chip, it is by default enabled. If PEC is supported, the PMBus core driver adds an attribute named ‘pec’ to the I2C device. This attribute can be used to control PEC support in the communication with the PMBus chip.”…””}”(hjÕh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KhjÄh²hubeh}”(h]”Œ pec-support”ah ]”h"]”Œ pec support”ah$]”h&]”uh1hµhh·h²hh³hÊh´K}ubh¶)”}”(hhh]”(h»)”}”(hŒ API functions”h]”hŒ API functions”…””}”(hjîh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjëh²hh³hÊh´K†ubh¶)”}”(hhh]”(h»)”}”(hŒ!Functions provided by chip driver”h]”hŒ!Functions provided by chip driver”…””}”(hjÿh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjüh²hh³hÊh´K‰ubhÝ)”}”(hXyAll functions return the command return value (read) or zero (write) if successful. A return value of -ENODATA indicates that there is no manufacturer specific command, but that a standard PMBus command may exist. Any other negative return value indicates that the commands does not exist for this chip, and that no attempt should be made to read or write the standard command.”h]”hXyAll functions return the command return value (read) or zero (write) if successful. A return value of -ENODATA indicates that there is no manufacturer specific command, but that a standard PMBus command may exist. Any other negative return value indicates that the commands does not exist for this chip, and that no attempt should be made to read or write the standard command.”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K‹hjüh²hubhÝ)”}”(hŒ°As mentioned above, an exception to this rule applies to virtual commands, which *must* be handled in driver specific code. See "Virtual PMBus Commands" above for more details.”h]”(hŒQAs mentioned above, an exception to this rule applies to virtual commands, which ”…””}”(hjh²hh³Nh´NubhŒemphasis”“”)”}”(hŒ*must*”h]”hŒmust”…””}”(hj%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j#hjubhŒ] be handled in driver specific code. See “Virtual PMBus Commands†above for more details.”…””}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K’hjüh²hubhÝ)”}”(hŒ?Command execution in the core PMBus driver code is as follows::”h]”hŒ>Command execution in the core PMBus driver code is as follows:”…””}”(hj=h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K–hjüh²hubhŒ literal_block”“”)”}”(hŒýif (chip_access_function) { status = chip_access_function(); if (status != -ENODATA) return status; } if (command >= PMBUS_VIRT_BASE) /* For word commands/registers only */ return -EINVAL; return generic_access();”h]”hŒýif (chip_access_function) { status = chip_access_function(); if (status != -ENODATA) return status; } if (command >= PMBUS_VIRT_BASE) /* For word commands/registers only */ return -EINVAL; return generic_access();”…””}”hjMsbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1jKh³hÊh´K˜hjüh²hubhÝ)”}”(hŒuChip drivers may provide pointers to the following functions in struct pmbus_driver_info. All functions are optional.”h]”hŒuChip drivers may provide pointers to the following functions in struct pmbus_driver_info. All functions are optional.”…””}”(hj]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K¡hjüh²hubjL)”}”(hŒDint (*read_byte_data)(struct i2c_client *client, int page, int reg);”h]”hŒDint (*read_byte_data)(struct i2c_client *client, int page, int reg);”…””}”hjksbah}”(h]”h ]”h"]”h$]”h&]”j[j\uh1jKh³hÊh´K¦hjüh²hubhÝ)”}”(hŒYRead byte from page , register . may be -1, which means "current page".”h]”hŒ]Read byte from page , register . may be -1, which means “current pageâ€.”…””}”(hjyh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K¨hjüh²hubjL)”}”(hŒeint (*read_word_data)(struct i2c_client *client, int page, int phase, int reg);”h]”hŒeint (*read_word_data)(struct i2c_client *client, int page, int phase, int reg);”…””}”hj‡sbah}”(h]”h ]”h"]”h$]”h&]”j[j\uh1jKh³hÊh´K®hjüh²hubhÝ)”}”(hŒÞRead word from page , phase , register . If the chip does not support multiple phases, the phase parameter can be ignored. If the chip supports multiple phases, a phase value of 0xff indicates all phases.”h]”hŒÞRead word from page , phase , register . If the chip does not support multiple phases, the phase parameter can be ignored. If the chip supports multiple phases, a phase value of 0xff indicates all phases.”…””}”(hj•h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´K±hjüh²hubjL)”}”(hŒfint (*write_word_data)(struct i2c_client *client, int page, int reg, u16 word);”h]”hŒfint (*write_word_data)(struct i2c_client *client, int page, int reg, u16 word);”…””}”hj£sbah}”(h]”h ]”h"]”h$]”h&]”j[j\uh1jKh³hÊh´K·hjüh²hubhÝ)”}”(hŒ*Write word to page , register .”h]”hŒ*Write word to page , register .”…””}”(hj±h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kºhjüh²hubjL)”}”(hŒAint (*write_byte)(struct i2c_client *client, int page, u8 value);”h]”hŒAint (*write_byte)(struct i2c_client *client, int page, u8 value);”…””}”hj¿sbah}”(h]”h ]”h"]”h$]”h&]”j[j\uh1jKh³hÊh´K¾hjüh²hubhÝ)”}”(hŒXWrite byte to page , register . may be -1, which means "current page".”h]”hŒ\Write byte to page , register . may be -1, which means “current pageâ€.”…””}”(hjÍh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KÀhjüh²hubjL)”}”(hŒKint (*identify)(struct i2c_client *client, struct pmbus_driver_info *info);”h]”hŒKint (*identify)(struct i2c_client *client, struct pmbus_driver_info *info);”…””}”hjÛsbah}”(h]”h ]”h"]”h$]”h&]”j[j\uh1jKh³hÊh´KÅhjüh²hubhÝ)”}”(hŒåDetermine supported PMBus functionality. This function is only necessary if a chip driver supports multiple chips, and the chip functionality is not pre-determined. It is currently only used by the generic pmbus driver (pmbus.c).”h]”hŒåDetermine supported PMBus functionality. This function is only necessary if a chip driver supports multiple chips, and the chip functionality is not pre-determined. It is currently only used by the generic pmbus driver (pmbus.c).”…””}”(hjéh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KÇhjüh²hubeh}”(h]”Œ!functions-provided-by-chip-driver”ah ]”h"]”Œ!functions provided by chip driver”ah$]”h&]”uh1hµhjëh²hh³hÊh´K‰ubh¶)”}”(hhh]”(h»)”}”(hŒ!Functions exported by core driver”h]”hŒ!Functions exported by core driver”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjÿh²hh³hÊh´KÍubhÝ)”}”(hXŽChip drivers are expected to use the following functions to read or write PMBus registers. Chip drivers may also use direct I2C commands. If direct I2C commands are used, the chip driver code must not directly modify the current page, since the selected page is cached in the core driver and the core driver will assume that it is selected. Using pmbus_set_page() to select a new page is mandatory.”h]”hXŽChip drivers are expected to use the following functions to read or write PMBus registers. Chip drivers may also use direct I2C commands. If direct I2C commands are used, the chip driver code must not directly modify the current page, since the selected page is cached in the core driver and the core driver will assume that it is selected. Using pmbus_set_page() to select a new page is mandatory.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KÏhjÿh²hubjL)”}”(hŒAint pmbus_set_page(struct i2c_client *client, u8 page, u8 phase);”h]”hŒAint pmbus_set_page(struct i2c_client *client, u8 page, u8 phase);”…””}”hjsbah}”(h]”h ]”h"]”h$]”h&]”j[j\uh1jKh³hÊh´KØhjÿh²hubhÝ)”}”(hŒÉSet PMBus page register to and for subsequent commands. If the chip does not support multiple phases, the phase parameter is ignored. Otherwise, a phase value of 0xff selects all phases.”h]”hŒÉSet PMBus page register to and for subsequent commands. If the chip does not support multiple phases, the phase parameter is ignored. Otherwise, a phase value of 0xff selects all phases.”…””}”(hj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´KÚhjÿh²hubjL)”}”(hŒhint pmbus_read_word_data(struct i2c_client *client, u8 page, u8 phase, u8 reg);”h]”hŒhint pmbus_read_word_data(struct i2c_client *client, u8 page, u8 phase, u8 reg);”…””}”hj:sbah}”(h]”h ]”h"]”h$]”h&]”j[j\uh1jKh³hÊh´Kàhjÿh²hubhÝ)”}”(hŒ÷Read word data from , , . Similar to i2c_smbus_read_word_data(), but selects page and phase first. If the chip does not support multiple phases, the phase parameter is ignored. Otherwise, a phase value of 0xff selects all phases.”h]”hŒ÷Read word data from , , . Similar to i2c_smbus_read_word_data(), but selects page and phase first. If the chip does not support multiple phases, the phase parameter is ignored. Otherwise, a phase value of 0xff selects all phases.”…””}”(hjHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kãhjÿh²hubjL)”}”(hŒjint pmbus_write_word_data(struct i2c_client *client, u8 page, u8 reg, u16 word);”h]”hŒjint pmbus_write_word_data(struct i2c_client *client, u8 page, u8 reg, u16 word);”…””}”hjVsbah}”(h]”h ]”h"]”h$]”h&]”j[j\uh1jKh³hÊh´Kêhjÿh²hubhÝ)”}”(hŒaWrite word data to , . Similar to i2c_smbus_write_word_data(), but selects page first.”h]”hŒaWrite word data to , . Similar to i2c_smbus_write_word_data(), but selects page first.”…””}”(hjdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kíhjÿh²hubjL)”}”(hŒFint pmbus_read_byte_data(struct i2c_client *client, int page, u8 reg);”h]”hŒFint pmbus_read_byte_data(struct i2c_client *client, int page, u8 reg);”…””}”hjrsbah}”(h]”h ]”h"]”h$]”h&]”j[j\uh1jKh³hÊh´Kòhjÿh²hubhÝ)”}”(hŒRead byte data from , . Similar to i2c_smbus_read_byte_data(), but selects page first. may be -1, which means "current page".”h]”hŒ“Read byte data from , . Similar to i2c_smbus_read_byte_data(), but selects page first. may be -1, which means “current pageâ€.”…””}”(hj€h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kôhjÿh²hubjL)”}”(hŒDint pmbus_write_byte(struct i2c_client *client, int page, u8 value);”h]”hŒDint pmbus_write_byte(struct i2c_client *client, int page, u8 value);”…””}”hjŽsbah}”(h]”h ]”h"]”h$]”h&]”j[j\uh1jKh³hÊh´Kùhjÿh²hubhÝ)”}”(hŒŠWrite byte data to , . Similar to i2c_smbus_write_byte(), but selects page first. may be -1, which means "current page".”h]”hŒŽWrite byte data to , . Similar to i2c_smbus_write_byte(), but selects page first. may be -1, which means “current pageâ€.”…””}”(hjœh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Kûhjÿh²hubjL)”}”(hŒ3void pmbus_clear_faults(struct i2c_client *client);”h]”hŒ3void pmbus_clear_faults(struct i2c_client *client);”…””}”hjªsbah}”(h]”h ]”h"]”h$]”h&]”j[j\uh1jKh³hÊh´Mhjÿh²hubhÝ)”}”(hŒµExecute PMBus "Clear Fault" command on all chip pages. This function calls the device specific write_byte function if defined. Therefore, it must _not_ be called from that function.”h]”hŒ¹Execute PMBus “Clear Fault†command on all chip pages. This function calls the device specific write_byte function if defined. Therefore, it must _not_ be called from that function.”…””}”(hj¸h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhjÿh²hubjL)”}”(hŒMbool pmbus_check_byte_register(struct i2c_client *client, int page, int reg);”h]”hŒMbool pmbus_check_byte_register(struct i2c_client *client, int page, int reg);”…””}”hjÆsbah}”(h]”h ]”h"]”h$]”h&]”j[j\uh1jKh³hÊh´Mhjÿh²hubhÝ)”}”(hŒìCheck if byte register exists. Return true if the register exists, false otherwise. This function calls the device specific write_byte function if defined to obtain the chip status. Therefore, it must _not_ be called from that function.”h]”hŒìCheck if byte register exists. Return true if the register exists, false otherwise. This function calls the device specific write_byte function if defined to obtain the chip status. Therefore, it must _not_ be called from that function.”…””}”(hjÔh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M hjÿh²hubjL)”}”(hŒMbool pmbus_check_word_register(struct i2c_client *client, int page, int reg);”h]”hŒMbool pmbus_check_word_register(struct i2c_client *client, int page, int reg);”…””}”hjâsbah}”(h]”h ]”h"]”h$]”h&]”j[j\uh1jKh³hÊh´Mhjÿh²hubhÝ)”}”(hŒìCheck if word register exists. Return true if the register exists, false otherwise. This function calls the device specific write_byte function if defined to obtain the chip status. Therefore, it must _not_ be called from that function.”h]”hŒìCheck if word register exists. Return true if the register exists, false otherwise. This function calls the device specific write_byte function if defined to obtain the chip status. Therefore, it must _not_ be called from that function.”…””}”(hjðh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhjÿh²hubjL)”}”(hŒNint pmbus_do_probe(struct i2c_client *client, struct pmbus_driver_info *info);”h]”hŒNint pmbus_do_probe(struct i2c_client *client, struct pmbus_driver_info *info);”…””}”hjþsbah}”(h]”h ]”h"]”h$]”h&]”j[j\uh1jKh³hÊh´Mhjÿh²hubhÝ)”}”(hŒèExecute probe function. Similar to standard probe function for other drivers, with the pointer to struct pmbus_driver_info as additional argument. Calls identify function if supported. Must only be called from device probe function.”h]”hŒèExecute probe function. Similar to standard probe function for other drivers, with the pointer to struct pmbus_driver_info as additional argument. Calls identify function if supported. Must only be called from device probe function.”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhjÿh²hubjL)”}”(hŒWconst struct pmbus_driver_info *pmbus_get_driver_info(struct i2c_client *client);”h]”hŒWconst struct pmbus_driver_info *pmbus_get_driver_info(struct i2c_client *client);”…””}”hjsbah}”(h]”h ]”h"]”h$]”h&]”j[j\uh1jKh³hÊh´M#hjÿh²hubhÝ)”}”(hŒIReturn pointer to struct pmbus_driver_info as passed to pmbus_do_probe().”h]”hŒIReturn pointer to struct pmbus_driver_info as passed to pmbus_do_probe().”…””}”(hj(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M&hjÿh²hubeh}”(h]”Œ!functions-exported-by-core-driver”ah ]”h"]”Œ!functions exported by core driver”ah$]”h&]”uh1hµhjëh²hh³hÊh´KÍubeh}”(h]”Œ api-functions”ah ]”h"]”Œ api functions”ah$]”h&]”uh1hµhh·h²hh³hÊh´K†ubh¶)”}”(hhh]”(h»)”}”(hŒPMBus driver platform data”h]”hŒPMBus driver platform data”…””}”(hjIh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjFh²hh³hÊh´M*ubhÝ)”}”(hŒ}PMBus platform data is defined in include/linux/pmbus.h. Platform data currently provides a flags field with four bits used::”h]”hŒ|PMBus platform data is defined in include/linux/pmbus.h. Platform data currently provides a flags field with four bits used:”…””}”(hjWh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M,hjFh²hubjL)”}”(hX‹#define PMBUS_SKIP_STATUS_CHECK BIT(0) #define PMBUS_WRITE_PROTECTED BIT(1) #define PMBUS_NO_CAPABILITY BIT(2) #define PMBUS_READ_STATUS_AFTER_FAILED_CHECK BIT(3) #define PMBUS_NO_WRITE_PROTECT BIT(4) #define PMBUS_USE_COEFFICIENTS_CMD BIT(5) #define PMBUS_OP_PROTECTED BIT(6) #define PMBUS_VOUT_PROTECTED BIT(7) struct pmbus_platform_data { u32 flags; /* Device specific flags */ /* regulator support */ int num_regulators; struct regulator_init_data *reg_init_data; };”h]”hX‹#define PMBUS_SKIP_STATUS_CHECK BIT(0) #define PMBUS_WRITE_PROTECTED BIT(1) #define PMBUS_NO_CAPABILITY BIT(2) #define PMBUS_READ_STATUS_AFTER_FAILED_CHECK BIT(3) #define PMBUS_NO_WRITE_PROTECT BIT(4) #define PMBUS_USE_COEFFICIENTS_CMD BIT(5) #define PMBUS_OP_PROTECTED BIT(6) #define PMBUS_VOUT_PROTECTED BIT(7) struct pmbus_platform_data { u32 flags; /* Device specific flags */ /* regulator support */ int num_regulators; struct regulator_init_data *reg_init_data; };”…””}”hjesbah}”(h]”h ]”h"]”h$]”h&]”j[j\uh1jKh³hÊh´M/hjFh²hubh¶)”}”(hhh]”(h»)”}”(hŒFlags”h]”hŒFlags”…””}”(hjvh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjsh²hh³hÊh´MIubhÝ)”}”(hŒPMBUS_SKIP_STATUS_CHECK”h]”hŒPMBUS_SKIP_STATUS_CHECK”…””}”(hj„h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MKhjsh²hubhÝ)”}”(hŒaDuring register detection, skip checking the status register for communication or command errors.”h]”hŒaDuring register detection, skip checking the status register for communication or command errors.”…””}”(hj’h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MMhjsh²hubhÝ)”}”(hX{Some PMBus chips respond with valid data when trying to read an unsupported register. For such chips, checking the status register is mandatory when trying to determine if a chip register exists or not. Other PMBus chips don't support the STATUS_CML register, or report communication errors for no explicable reason. For such chips, checking the status register must be disabled.”h]”hX}Some PMBus chips respond with valid data when trying to read an unsupported register. For such chips, checking the status register is mandatory when trying to determine if a chip register exists or not. Other PMBus chips don’t support the STATUS_CML register, or report communication errors for no explicable reason. For such chips, checking the status register must be disabled.”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MPhjsh²hubhÝ)”}”(hŒäSome i2c controllers do not support single-byte commands (write commands with no data, i2c_smbus_write_byte()). With such controllers, clearing the status register is impossible, and the PMBUS_SKIP_STATUS_CHECK flag must be set.”h]”hŒäSome i2c controllers do not support single-byte commands (write commands with no data, i2c_smbus_write_byte()). With such controllers, clearing the status register is impossible, and the PMBUS_SKIP_STATUS_CHECK flag must be set.”…””}”(hj®h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MWhjsh²hubhÝ)”}”(hŒPMBUS_WRITE_PROTECTED”h]”hŒPMBUS_WRITE_PROTECTED”…””}”(hj¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M[hjsh²hubhÝ)”}”(hŒpSet if the chip is write protected and write protection is not determined by the standard WRITE_PROTECT command.”h]”hŒpSet if the chip is write protected and write protection is not determined by the standard WRITE_PROTECT command.”…””}”(hjÊh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M]hjsh²hubhÝ)”}”(hŒPMBUS_NO_CAPABILITY”h]”hŒPMBUS_NO_CAPABILITY”…””}”(hjØh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M`hjsh²hubhÝ)”}”(hŒÌSome PMBus chips don't respond with valid data when reading the CAPABILITY register. For such chips, this flag should be set so that the PMBus core driver doesn't use CAPABILITY to determine its behavior.”h]”hŒÐSome PMBus chips don’t respond with valid data when reading the CAPABILITY register. For such chips, this flag should be set so that the PMBus core driver doesn’t use CAPABILITY to determine its behavior.”…””}”(hjæh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mbhjsh²hubhÝ)”}”(hŒ$PMBUS_READ_STATUS_AFTER_FAILED_CHECK”h]”hŒ$PMBUS_READ_STATUS_AFTER_FAILED_CHECK”…””}”(hjôh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mfhjsh²hubhÝ)”}”(hŒ:Read the STATUS register after each failed register check.”h]”hŒ:Read the STATUS register after each failed register check.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhhjsh²hubhÝ)”}”(hX£Some PMBus chips end up in an undefined state when trying to read an unsupported register. For such chips, it is necessary to reset the chip pmbus controller to a known state after a failed register check. This can be done by reading a known register. By setting this flag the driver will try to read the STATUS register after each failed register check. This read may fail, but it will put the chip into a known state.”h]”hX£Some PMBus chips end up in an undefined state when trying to read an unsupported register. For such chips, it is necessary to reset the chip pmbus controller to a known state after a failed register check. This can be done by reading a known register. By setting this flag the driver will try to read the STATUS register after each failed register check. This read may fail, but it will put the chip into a known state.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mjhjsh²hubhÝ)”}”(hŒPMBUS_NO_WRITE_PROTECT”h]”hŒPMBUS_NO_WRITE_PROTECT”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mrhjsh²hubhÝ)”}”(hŒÚSome PMBus chips respond with invalid data when reading the WRITE_PROTECT register. For such chips, this flag should be set so that the PMBus core driver doesn't use the WRITE_PROTECT command to determine its behavior.”h]”hŒÜSome PMBus chips respond with invalid data when reading the WRITE_PROTECT register. For such chips, this flag should be set so that the PMBus core driver doesn’t use the WRITE_PROTECT command to determine its behavior.”…””}”(hj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mthjsh²hubhÝ)”}”(hŒPMBUS_USE_COEFFICIENTS_CMD”h]”hŒPMBUS_USE_COEFFICIENTS_CMD”…””}”(hj:h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mxhjsh²hubhÝ)”}”(hŒ‰When this flag is set the PMBus core driver will use the COEFFICIENTS register to initialize the coefficients for the direct mode format.”h]”hŒ‰When this flag is set the PMBus core driver will use the COEFFICIENTS register to initialize the coefficients for the direct mode format.”…””}”(hjHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mzhjsh²hubhÝ)”}”(hŒPMBUS_OP_PROTECTED”h]”hŒPMBUS_OP_PROTECTED”…””}”(hjVh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M}hjsh²hubhÝ)”}”(hŒvSet if the chip OPERATION command is protected and protection is not determined by the standard WRITE_PROTECT command.”h]”hŒvSet if the chip OPERATION command is protected and protection is not determined by the standard WRITE_PROTECT command.”…””}”(hjdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´Mhjsh²hubhÝ)”}”(hŒPMBUS_VOUT_PROTECTED”h]”hŒPMBUS_VOUT_PROTECTED”…””}”(hjrh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M‚hjsh²hubhÝ)”}”(hŒySet if the chip VOUT_COMMAND command is protected and protection is not determined by the standard WRITE_PROTECT command.”h]”hŒySet if the chip VOUT_COMMAND command is protected and protection is not determined by the standard WRITE_PROTECT command.”…””}”(hj€h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M„hjsh²hubeh}”(h]”Œflags”ah ]”h"]”Œflags”ah$]”h&]”uh1hµhjFh²hh³hÊh´MIubh¶)”}”(hhh]”(h»)”}”(hŒModule parameter”h]”hŒModule parameter”…””}”(hj™h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj–h²hh³hÊh´MˆubhÝ)”}”(hŒ.pmbus_core.wp: PMBus write protect forced mode”h]”hŒ.pmbus_core.wp: PMBus write protect forced mode”…””}”(hj§h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MŠhj–h²hubhÝ)”}”(hXaPMBus may come up with a variety of write protection configuration. 'pmbus_core.wp' may be used if a particular write protection is necessary. The ability to actually alter the protection may also depend on the chip so the actual runtime write protection configuration may differ from the requested one. pmbus_core currently support the following value:”h]”hXePMBus may come up with a variety of write protection configuration. ‘pmbus_core.wp’ may be used if a particular write protection is necessary. The ability to actually alter the protection may also depend on the chip so the actual runtime write protection configuration may differ from the requested one. pmbus_core currently support the following value:”…””}”(hjµh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´MŒhj–h²hubjñ)”}”(hhh]”(jö)”}”(hŒ0: write protection removed.”h]”hÝ)”}”(hjÈh]”hŒ0: write protection removed.”…””}”(hjÊh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M’hjÆubah}”(h]”h ]”h"]”h$]”h&]”uh1jõhjÃh²hh³hÊh´Nubjö)”}”(hŒl1: Disable all writes except to the WRITE_PROTECT, OPERATION, PAGE, ON_OFF_CONFIG and VOUT_COMMAND commands.”h]”hÝ)”}”(hŒl1: Disable all writes except to the WRITE_PROTECT, OPERATION, PAGE, ON_OFF_CONFIG and VOUT_COMMAND commands.”h]”hŒl1: Disable all writes except to the WRITE_PROTECT, OPERATION, PAGE, ON_OFF_CONFIG and VOUT_COMMAND commands.”…””}”(hjáh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M“hjÝubah}”(h]”h ]”h"]”h$]”h&]”uh1jõhjÃh²hh³hÊh´Nubjö)”}”(hŒO2: Disable all writes except to the WRITE_PROTECT, OPERATION and PAGE commands.”h]”hÝ)”}”(hŒO2: Disable all writes except to the WRITE_PROTECT, OPERATION and PAGE commands.”h]”hŒO2: Disable all writes except to the WRITE_PROTECT, OPERATION and PAGE commands.”…””}”(hjùh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M•hjõubah}”(h]”h ]”h"]”h$]”h&]”uh1jõhjÃh²hh³hÊh´Nubjö)”}”(hX 3: Disable all writes except to the WRITE_PROTECT command. Note that protection should include the PAGE register. This may be problematic for multi-page chips, if the chips strictly follows the PMBus specification, preventing the chip from changing the active page.”h]”hÝ)”}”(hX 3: Disable all writes except to the WRITE_PROTECT command. Note that protection should include the PAGE register. This may be problematic for multi-page chips, if the chips strictly follows the PMBus specification, preventing the chip from changing the active page.”h]”hX 3: Disable all writes except to the WRITE_PROTECT command. Note that protection should include the PAGE register. This may be problematic for multi-page chips, if the chips strictly follows the PMBus specification, preventing the chip from changing the active page.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÜh³hÊh´M—hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jõhjÃh²hh³hÊh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j,Œ*”uh1jðh³hÊh´M’hj–h²hubeh}”(h]”Œmodule-parameter”ah ]”h"]”Œmodule parameter”ah$]”h&]”uh1hµhjFh²hh³hÊh´Mˆubeh}”(h]”Œpmbus-driver-platform-data”ah ]”h"]”Œpmbus driver platform data”ah$]”h&]”uh1hµhh·h²hh³hÊh´M*ubeh}”(h]”Œ"pmbus-core-driver-and-internal-api”ah ]”h"]”Œ"pmbus core driver and internal api”ah$]”h&]”uh1hµhhh²hh³hÊh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÊuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)”}”(hºNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jgŒerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÊŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(jAj>jjj^j[jÁj¾j¤j¡jAj>j¹j¶jèjåjCj@jüjùj;j8j9j6j“jj1j.uŒ nametypes”}”(jA‰j‰j^‰jÁ‰j¤‰jA‰j¹‰jè‰jC‰jü‰j;‰j9‰j“‰j1‰uh}”(j>h·jhËj[jj¾jaj¡j€j>j§j¶jDjåjÄj@jëjùjüj8jÿj6jFjjsj.j–uŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.