sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget4/translations/zh_CN/driver-api/i3c/master-driver-apimodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget4/translations/zh_TW/driver-api/i3c/master-driver-apimodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget4/translations/it_IT/driver-api/i3c/master-driver-apimodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget4/translations/ja_JP/driver-api/i3c/master-driver-apimodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget4/translations/ko_KR/driver-api/i3c/master-driver-apimodnameN classnameN refexplicituh1hhh ubh)}(hhh]hPortuguese (Brazilian)}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget4/translations/pt_BR/driver-api/i3c/master-driver-apimodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget4/translations/sp_SP/driver-api/i3c/master-driver-apimodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhN/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api.rsthKubhsection)}(hhh](htitle)}(h I3C master controller driver APIh]h I3C master controller driver API}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhindex)}(hhh]h}(h]h ]h"]h$]h&]entries](single%i3c_bus_maintenance_lock (C function)c.i3c_bus_maintenance_lockhNtauh1hhhhhhNhNubhdesc)}(hhh](hdesc_signature)}(h3void i3c_bus_maintenance_lock (struct i3c_bus *bus)h]hdesc_signature_line)}(h2void i3c_bus_maintenance_lock(struct i3c_bus *bus)h](hdesc_sig_keyword_type)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]ktah"]h$]h&]uh1hhhhhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chK ubhdesc_sig_space)}(h h]h }(hjhhhNhNubah}(h]h ]wah"]h$]h&]uh1jhhhhhjhK ubh desc_name)}(hi3c_bus_maintenance_lockh]h desc_sig_name)}(hi3c_bus_maintenance_lockh]hi3c_bus_maintenance_lock}(hj*hhhNhNubah}(h]h ]nah"]h$]h&]uh1j(hj$ubah}(h]h ](sig-namedescnameeh"]h$]h&]hhuh1j"hhhhhjhK ubhdesc_parameterlist)}(h(struct i3c_bus *bus)h]hdesc_parameter)}(hstruct i3c_bus *bush](hdesc_sig_keyword)}(hstructh]hstruct}(hjOhhhNhNubah}(h]h ]kah"]h$]h&]uh1jMhjIubj)}(h h]h }(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubh)}(hhh]j))}(hi3c_bush]hi3c_bus}(hjohhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjlubah}(h]h ]h"]h$]h&] refdomaincreftype identifier reftargetjqmodnameN classnameN c:parent_keysphinx.domains.c LookupKey)}data]j ASTIdentifier)}jj,sbc.i3c_bus_maintenance_lockasbuh1hhjIubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjIubhdesc_sig_punctuation)}(h*h]h*}(hjhhhNhNubah}(h]h ]pah"]h$]h&]uh1jhjIubj))}(hbush]hbus}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjIubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjCubah}(h]h ]h"]h$]h&]hhuh1jAhhhhhjhK ubeh}(h]h ]h"]h$]h&]hhƌ add_permalinkuh1hsphinx_line_type declaratorhhhhhjhK ubah}(h]hah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1hhjhK hhhhubh desc_content)}(hhh]h paragraph)}(h(Lock the bus for a maintenance operationh]h(Lock the bus for a maintenance operation}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chK hjhhubah}(h]h ]h"]h$]h&]uh1jhhhhhjhK ubeh}(h]h ](jfunctioneh"]h$]h&]domainjobjtypejdesctypejnoindex noindexentrynocontentsentryuh1hhhhhhNhNubh container)}(hX**Parameters** ``struct i3c_bus *bus`` I3C bus to take the lock on **Description** This function takes the bus lock so that no other operations can occur on the bus. This is needed for all kind of bus maintenance operation, like - enabling/disabling slave events - re-triggering DAA - changing the dynamic address of a device - relinquishing mastership - ... The reason for this kind of locking is that we don't want drivers and core logic to rely on I3C device information that could be changed behind their back.h](j)}(h**Parameters**h]hstrong)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chK$hjubhdefinition_list)}(hhh]hdefinition_list_item)}(h4``struct i3c_bus *bus`` I3C bus to take the lock on h](hterm)}(h``struct i3c_bus *bus``h]hliteral)}(hj>h]hstruct i3c_bus *bus}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj<ubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chK!hj6ubh definition)}(hhh]j)}(hI3C bus to take the lock onh]hI3C bus to take the lock on}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUhK!hjXubah}(h]h ]h"]h$]h&]uh1jVhj6ubeh}(h]h ]h"]h$]h&]uh1j4hjUhK!hj1ubah}(h]h ]h"]h$]h&]uh1j/hjubj)}(h**Description**h]j)}(hj}h]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chK#hjubj)}(hXThis function takes the bus lock so that no other operations can occur on the bus. This is needed for all kind of bus maintenance operation, like - enabling/disabling slave events - re-triggering DAA - changing the dynamic address of a device - relinquishing mastership - ...h]hXThis function takes the bus lock so that no other operations can occur on the bus. This is needed for all kind of bus maintenance operation, like - enabling/disabling slave events - re-triggering DAA - changing the dynamic address of a device - relinquishing mastership - ...}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chK"hjubj)}(hThe reason for this kind of locking is that we don't want drivers and core logic to rely on I3C device information that could be changed behind their back.h]hThe reason for this kind of locking is that we don’t want drivers and core logic to rely on I3C device information that could be changed behind their back.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chK*hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h'i3c_bus_maintenance_unlock (C function)c.i3c_bus_maintenance_unlockhNtauh1hhhhhhNhNubh)}(hhh](h)}(h5void i3c_bus_maintenance_unlock (struct i3c_bus *bus)h]h)}(h4void i3c_bus_maintenance_unlock(struct i3c_bus *bus)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjhhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chK5ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhK5ubj#)}(hi3c_bus_maintenance_unlockh]j))}(hi3c_bus_maintenance_unlockh]hi3c_bus_maintenance_unlock}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hjhhhjhK5ubjB)}(h(struct i3c_bus *bus)h]jH)}(hstruct i3c_bus *bush](jN)}(hjQh]hstruct}(hjhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhj ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hhh]j))}(hi3c_bush]hi3c_bus}(hj,hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj)ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj.modnameN classnameNjj)}j]j)}jjsbc.i3c_bus_maintenance_unlockasbuh1hhj ubj)}(h h]h }(hjLhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hjh]h*}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj))}(hbush]hbus}(hjghhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjubah}(h]h ]h"]h$]h&]hhuh1jAhjhhhjhK5ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjhhhjhK5ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhK5hjhhubj)}(hhh]j)}(h2Release the bus lock after a maintenance operationh]h2Release the bus lock after a maintenance operation}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chK5hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhK5ubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1hhhhhhNhNubj)}(h**Parameters** ``struct i3c_bus *bus`` I3C bus to release the lock on **Description** Should be called when the bus maintenance operation is done. See i3c_bus_maintenance_lock() for more details on what these maintenance operations are.h](j)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chK9hjubj0)}(hhh]j5)}(h7``struct i3c_bus *bus`` I3C bus to release the lock on h](j;)}(h``struct i3c_bus *bus``h]jA)}(hjh]hstruct i3c_bus *bus}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chK7hjubjW)}(hhh]j)}(hI3C bus to release the lock onh]hI3C bus to release the lock on}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhK7hjubah}(h]h ]h"]h$]h&]uh1jVhjubeh}(h]h ]h"]h$]h&]uh1j4hjhK7hjubah}(h]h ]h"]h$]h&]uh1j/hjubj)}(h**Description**h]j)}(hj h]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chK9hjubj)}(hShould be called when the bus maintenance operation is done. See i3c_bus_maintenance_lock() for more details on what these maintenance operations are.h]hShould be called when the bus maintenance operation is done. See i3c_bus_maintenance_lock() for more details on what these maintenance operations are.}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chK8hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h#i3c_bus_normaluse_lock (C function)c.i3c_bus_normaluse_lockhNtauh1hhhhhhNhNubh)}(hhh](h)}(h1void i3c_bus_normaluse_lock (struct i3c_bus *bus)h]h)}(h0void i3c_bus_normaluse_lock(struct i3c_bus *bus)h](j)}(hvoidh]hvoid}(hjRhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjNhhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chKCubj)}(h h]h }(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNhhhj`hKCubj#)}(hi3c_bus_normaluse_lockh]j))}(hi3c_bus_normaluse_lockh]hi3c_bus_normaluse_lock}(hjshhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjoubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hjNhhhj`hKCubjB)}(h(struct i3c_bus *bus)h]jH)}(hstruct i3c_bus *bush](jN)}(hjQh]hstruct}(hjhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j))}(hi3c_bush]hi3c_bus}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjusbc.i3c_bus_normaluse_lockasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj))}(hbush]hbus}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjubah}(h]h ]h"]h$]h&]hhuh1jAhjNhhhj`hKCubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjJhhhj`hKCubah}(h]jEah ](jjeh"]h$]h&]jj)jhuh1hhj`hKChjGhhubj)}(hhh]j)}(h#Lock the bus for a normal operationh]h#Lock the bus for a normal operation}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chKChjhhubah}(h]h ]h"]h$]h&]uh1jhjGhhhj`hKCubeh}(h]h ](jfunctioneh"]h$]h&]j jj j*j j*j j juh1hhhhhhNhNubj)}(hX**Parameters** ``struct i3c_bus *bus`` I3C bus to take the lock on **Description** This function takes the bus lock for any operation that is not a maintenance operation (see i3c_bus_maintenance_lock() for a non-exhaustive list of maintenance operations). Basically all communications with I3C devices are normal operations (HDR, SDR transfers or CCC commands that do not change bus state or I3C dynamic address). Note that this lock is not guaranteeing serialization of normal operations. In other words, transfer requests passed to the I3C master can be submitted in parallel and I3C master drivers have to use their own locking to make sure two different communications are not inter-mixed, or access to the output/input queue is not done while the engine is busy.h](j)}(h**Parameters**h]j)}(hj4h]h Parameters}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chKGhj.ubj0)}(hhh]j5)}(h4``struct i3c_bus *bus`` I3C bus to take the lock on h](j;)}(h``struct i3c_bus *bus``h]jA)}(hjSh]hstruct i3c_bus *bus}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjQubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chKDhjMubjW)}(hhh]j)}(hI3C bus to take the lock onh]hI3C bus to take the lock on}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhKDhjiubah}(h]h ]h"]h$]h&]uh1jVhjMubeh}(h]h ]h"]h$]h&]uh1j4hjhhKDhjJubah}(h]h ]h"]h$]h&]uh1j/hj.ubj)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chKFhj.ubj)}(hXJThis function takes the bus lock for any operation that is not a maintenance operation (see i3c_bus_maintenance_lock() for a non-exhaustive list of maintenance operations). Basically all communications with I3C devices are normal operations (HDR, SDR transfers or CCC commands that do not change bus state or I3C dynamic address).h]hXJThis function takes the bus lock for any operation that is not a maintenance operation (see i3c_bus_maintenance_lock() for a non-exhaustive list of maintenance operations). Basically all communications with I3C devices are normal operations (HDR, SDR transfers or CCC commands that do not change bus state or I3C dynamic address).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chKEhj.ubj)}(hXaNote that this lock is not guaranteeing serialization of normal operations. In other words, transfer requests passed to the I3C master can be submitted in parallel and I3C master drivers have to use their own locking to make sure two different communications are not inter-mixed, or access to the output/input queue is not done while the engine is busy.h]hXaNote that this lock is not guaranteeing serialization of normal operations. In other words, transfer requests passed to the I3C master can be submitted in parallel and I3C master drivers have to use their own locking to make sure two different communications are not inter-mixed, or access to the output/input queue is not done while the engine is busy.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chKKhj.ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h%i3c_bus_normaluse_unlock (C function)c.i3c_bus_normaluse_unlockhNtauh1hhhhhhNhNubh)}(hhh](h)}(h3void i3c_bus_normaluse_unlock (struct i3c_bus *bus)h]h)}(h2void i3c_bus_normaluse_unlock(struct i3c_bus *bus)h](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjhhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chKXubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhKXubj#)}(hi3c_bus_normaluse_unlockh]j))}(hi3c_bus_normaluse_unlockh]hi3c_bus_normaluse_unlock}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hjhhhjhKXubjB)}(h(struct i3c_bus *bus)h]jH)}(hstruct i3c_bus *bush](jN)}(hjQh]hstruct}(hjhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjubj)}(h h]h }(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j))}(hi3c_bush]hi3c_bus}(hj=hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj:ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj?modnameN classnameNjj)}j]j)}jjsbc.i3c_bus_normaluse_unlockasbuh1hhjubj)}(h h]h }(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjkhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj))}(hbush]hbus}(hjxhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjubah}(h]h ]h"]h$]h&]hhuh1jAhjhhhjhKXubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjhhhjhKXubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhKXhjhhubj)}(hhh]j)}(h-Release the bus lock after a normal operationh]h-Release the bus lock after a normal operation}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chKXhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKXubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1hhhhhhNhNubj)}(h**Parameters** ``struct i3c_bus *bus`` I3C bus to release the lock on **Description** Should be called when a normal operation is done. See i3c_bus_normaluse_lock() for more details on what these normal operations are.h](j)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chK\hjubj0)}(hhh]j5)}(h7``struct i3c_bus *bus`` I3C bus to release the lock on h](j;)}(h``struct i3c_bus *bus``h]jA)}(hjh]hstruct i3c_bus *bus}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chKYhjubjW)}(hhh]j)}(hI3C bus to release the lock onh]hI3C bus to release the lock on}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKYhjubah}(h]h ]h"]h$]h&]uh1jVhjubeh}(h]h ]h"]h$]h&]uh1j4hjhKYhjubah}(h]h ]h"]h$]h&]uh1j/hjubj)}(h**Description**h]j)}(hjh]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chK[hjubj)}(hShould be called when a normal operation is done. See i3c_bus_normaluse_lock() for more details on what these normal operations are.h]hShould be called when a normal operation is done. See i3c_bus_normaluse_lock() for more details on what these normal operations are.}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chKZhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h%i3c_master_queue_hotjoin (C function)c.i3c_master_queue_hotjoinhNtauh1hhhhhhNhNubh)}(hhh](h)}(hDvoid i3c_master_queue_hotjoin (struct i3c_master_controller *master)h]h)}(hCvoid i3c_master_queue_hotjoin(struct i3c_master_controller *master)h](j)}(hvoidh]hvoid}(hjchhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj_hhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMubj)}(h h]h }(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_hhhjqhMubj#)}(hi3c_master_queue_hotjoinh]j))}(hi3c_master_queue_hotjoinh]hi3c_master_queue_hotjoin}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hj_hhhjqhMubjB)}(h&(struct i3c_master_controller *master)h]jH)}(h$struct i3c_master_controller *masterh](jN)}(hjQh]hstruct}(hjhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j))}(hi3c_master_controllerh]hi3c_master_controller}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjsbc.i3c_master_queue_hotjoinasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj))}(hmasterh]hmaster}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjubah}(h]h ]h"]h$]h&]hhuh1jAhj_hhhjqhMubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj[hhhjqhMubah}(h]jVah ](jjeh"]h$]h&]jj)jhuh1hhjqhMhjXhhubj)}(hhh]j)}(h+Queue DAA processing after a Hot-Join eventh]h+Queue DAA processing after a Hot-Join event}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj hhubah}(h]h ]h"]h$]h&]uh1jhjXhhhjqhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj j;j j;j j juh1hhhhhhNhNubj)}(h**Parameters** ``struct i3c_master_controller *master`` I3C master object **Description** Queue the hot-join worker on the master's workqueue.h](j)}(h**Parameters**h]j)}(hjEh]h Parameters}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj?ubj0)}(hhh]j5)}(h;``struct i3c_master_controller *master`` I3C master object h](j;)}(h(``struct i3c_master_controller *master``h]jA)}(hjdh]h$struct i3c_master_controller *master}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjbubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj^ubjW)}(hhh]j)}(hI3C master objecth]hI3C master object}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyhMhjzubah}(h]h ]h"]h$]h&]uh1jVhj^ubeh}(h]h ]h"]h$]h&]uh1j4hjyhMhj[ubah}(h]h ]h"]h$]h&]uh1j/hj?ubj)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj?ubj)}(h4Queue the hot-join worker on the master's workqueue.h]h6Queue the hot-join worker on the master’s workqueue.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj?ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h+i3c_master_send_ccc_cmd_locked (C function) c.i3c_master_send_ccc_cmd_lockedhNtauh1hhhhhhNhNubh)}(hhh](h)}(hbint i3c_master_send_ccc_cmd_locked (struct i3c_master_controller *master, struct i3c_ccc_cmd *cmd)h]h)}(haint i3c_master_send_ccc_cmd_locked(struct i3c_master_controller *master, struct i3c_ccc_cmd *cmd)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjhhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj#)}(hi3c_master_send_ccc_cmd_lockedh]j))}(hi3c_master_send_ccc_cmd_lockedh]hi3c_master_send_ccc_cmd_locked}(hj hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj ubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hjhhhjhMubjB)}(h?(struct i3c_master_controller *master, struct i3c_ccc_cmd *cmd)h](jH)}(h$struct i3c_master_controller *masterh](jN)}(hjQh]hstruct}(hj! hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhj ubj)}(h h]h }(hj. hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hhh]j))}(hi3c_master_controllerh]hi3c_master_controller}(hj? hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj< ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjA modnameN classnameNjj)}j]j)}jj sb c.i3c_master_send_ccc_cmd_lockedasbuh1hhj ubj)}(h h]h }(hj_ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hjh]h*}(hjm hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj))}(hmasterh]hmaster}(hjz hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhj ubjH)}(hstruct i3c_ccc_cmd *cmdh](jN)}(hjQh]hstruct}(hj hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hhh]j))}(h i3c_ccc_cmdh]h i3c_ccc_cmd}(hj hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjj)}j]j[ c.i3c_master_send_ccc_cmd_lockedasbuh1hhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj))}(hcmdh]hcmd}(hj hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhj ubeh}(h]h ]h"]h$]h&]hhuh1jAhjhhhjhMubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhMhjhhubj)}(hhh]j)}(h!send a CCC (Common Command Codes)h]h!send a CCC (Common Command Codes)}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj j, j j, j j juh1hhhhhhNhNubj)}(hX**Parameters** ``struct i3c_master_controller *master`` master used to send frames on the bus ``struct i3c_ccc_cmd *cmd`` command to send **Return** 0 in case of success, or a negative error code otherwise. I3C Mx error codes are stored in cmd->err.h](j)}(h**Parameters**h]j)}(hj6 h]h Parameters}(hj8 hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4 ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj0 ubj0)}(hhh](j5)}(hO``struct i3c_master_controller *master`` master used to send frames on the bus h](j;)}(h(``struct i3c_master_controller *master``h]jA)}(hjU h]h$struct i3c_master_controller *master}(hjW hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjS ubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjO ubjW)}(hhh]j)}(h%master used to send frames on the bush]h%master used to send frames on the bus}(hjn hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjj hMhjk ubah}(h]h ]h"]h$]h&]uh1jVhjO ubeh}(h]h ]h"]h$]h&]uh1j4hjj hMhjL ubj5)}(h,``struct i3c_ccc_cmd *cmd`` command to send h](j;)}(h``struct i3c_ccc_cmd *cmd``h]jA)}(hj h]hstruct i3c_ccc_cmd *cmd}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj ubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj ubjW)}(hhh]j)}(hcommand to sendh]hcommand to send}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj hMhj ubah}(h]h ]h"]h$]h&]uh1jVhj ubeh}(h]h ]h"]h$]h&]uh1j4hj hMhjL ubeh}(h]h ]h"]h$]h&]uh1j/hj0 ubj)}(h **Return**h]j)}(hj h]hReturn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj0 ubj)}(hd0 in case of success, or a negative error code otherwise. I3C Mx error codes are stored in cmd->err.h]hd0 in case of success, or a negative error code otherwise. I3C Mx error codes are stored in cmd->err.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj0 ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h%i3c_master_get_free_addr (C function)c.i3c_master_get_free_addrhNtauh1hhhhhhNhNubh)}(hhh](h)}(hRint i3c_master_get_free_addr (struct i3c_master_controller *master, u8 start_addr)h]h)}(hQint i3c_master_get_free_addr(struct i3c_master_controller *master, u8 start_addr)h](j)}(hinth]hint}(hj hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj hhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhj hMubj#)}(hi3c_master_get_free_addrh]j))}(hi3c_master_get_free_addrh]hi3c_master_get_free_addr}(hj/ hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj+ ubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hj hhhj hMubjB)}(h5(struct i3c_master_controller *master, u8 start_addr)h](jH)}(h$struct i3c_master_controller *masterh](jN)}(hjQh]hstruct}(hjK hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjG ubj)}(h h]h }(hjX hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjG ubh)}(hhh]j))}(hi3c_master_controllerh]hi3c_master_controller}(hji hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjf ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjk modnameN classnameNjj)}j]j)}jj1 sbc.i3c_master_get_free_addrasbuh1hhjG ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjG ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjG ubj))}(hmasterh]hmaster}(hj hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjG ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjC ubjH)}(h u8 start_addrh](h)}(hhh]j))}(hu8h]hu8}(hj hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjj)}j]j c.i3c_master_get_free_addrasbuh1hhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj))}(h start_addrh]h start_addr}(hj hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjC ubeh}(h]h ]h"]h$]h&]hhuh1jAhj hhhj hMubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj hhhj hMubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1hhj hMhj hhubj)}(hhh]j)}(hget a free address on the bush]hget a free address on the bus}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hMubeh}(h]h ](jfunctioneh"]h$]h&]j jj j. j j. j j juh1hhhhhhNhNubj)}(hXJ**Parameters** ``struct i3c_master_controller *master`` I3C master object ``u8 start_addr`` where to start searching **Description** This function must be called with the bus lock held in write mode. **Return** the first free address starting at **start_addr** (included) or -ENOMEM if there's no more address available.h](j)}(h**Parameters**h]j)}(hj8 h]h Parameters}(hj: hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6 ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj2 ubj0)}(hhh](j5)}(h;``struct i3c_master_controller *master`` I3C master object h](j;)}(h(``struct i3c_master_controller *master``h]jA)}(hjW h]h$struct i3c_master_controller *master}(hjY hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjU ubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjQ ubjW)}(hhh]j)}(hI3C master objecth]hI3C master object}(hjp hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjl hMhjm ubah}(h]h ]h"]h$]h&]uh1jVhjQ ubeh}(h]h ]h"]h$]h&]uh1j4hjl hMhjN ubj5)}(h+``u8 start_addr`` where to start searching h](j;)}(h``u8 start_addr``h]jA)}(hj h]h u8 start_addr}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj ubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj ubjW)}(hhh]j)}(hwhere to start searchingh]hwhere to start searching}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj hMhj ubah}(h]h ]h"]h$]h&]uh1jVhj ubeh}(h]h ]h"]h$]h&]uh1j4hj hMhjN ubeh}(h]h ]h"]h$]h&]uh1j/hj2 ubj)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj2 ubj)}(hBThis function must be called with the bus lock held in write mode.h]hBThis function must be called with the bus lock held in write mode.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj2 ubj)}(h **Return**h]j)}(hj h]hReturn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj2 ubj)}(hmthe first free address starting at **start_addr** (included) or -ENOMEM if there's no more address available.h](h#the first free address starting at }(hj hhhNhNubj)}(h**start_addr**h]h start_addr}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh> (included) or -ENOMEM if there’s no more address available.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj2 ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h%i3c_master_entdaa_locked (C function)c.i3c_master_entdaa_lockedhNtauh1hhhhhhNhNubh)}(hhh](h)}(hCint i3c_master_entdaa_locked (struct i3c_master_controller *master)h]h)}(hBint i3c_master_entdaa_locked(struct i3c_master_controller *master)h](j)}(hinth]hint}(hjI hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjE hhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMOubj)}(h h]h }(hjX hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjE hhhjW hMOubj#)}(hi3c_master_entdaa_lockedh]j))}(hi3c_master_entdaa_lockedh]hi3c_master_entdaa_locked}(hjj hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjf ubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hjE hhhjW hMOubjB)}(h&(struct i3c_master_controller *master)h]jH)}(h$struct i3c_master_controller *masterh](jN)}(hjQh]hstruct}(hj hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hhh]j))}(hi3c_master_controllerh]hi3c_master_controller}(hj hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjj)}j]j)}jjl sbc.i3c_master_entdaa_lockedasbuh1hhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj))}(hmasterh]hmaster}(hj hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhj~ ubah}(h]h ]h"]h$]h&]hhuh1jAhjE hhhjW hMOubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjA hhhjW hMOubah}(h]j< ah ](jjeh"]h$]h&]jj)jhuh1hhjW hMOhj> hhubj)}(hhh]j)}(h2start a DAA (Dynamic Address Assignment) procedureh]h2start a DAA (Dynamic Address Assignment) procedure}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMOhjhhubah}(h]h ]h"]h$]h&]uh1jhj> hhhjW hMOubeh}(h]h ](jfunctioneh"]h$]h&]j jj j!j j!j j juh1hhhhhhNhNubj)}(hX**Parameters** ``struct i3c_master_controller *master`` master used to send frames on the bus **Description** Send a ENTDAA CCC command to start a DAA procedure. Note that this function only sends the ENTDAA CCC command, all the logic behind dynamic address assignment has to be handled in the I3C master driver. This function must be called with the bus lock held in write mode. **Return** 0 in case of success, or a negative error code otherwise.h](j)}(h**Parameters**h]j)}(hj+h]h Parameters}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMShj%ubj0)}(hhh]j5)}(hO``struct i3c_master_controller *master`` master used to send frames on the bus h](j;)}(h(``struct i3c_master_controller *master``h]jA)}(hjJh]h$struct i3c_master_controller *master}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjHubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMQhjDubjW)}(hhh]j)}(h%master used to send frames on the bush]h%master used to send frames on the bus}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_hMQhj`ubah}(h]h ]h"]h$]h&]uh1jVhjDubeh}(h]h ]h"]h$]h&]uh1j4hj_hMQhjAubah}(h]h ]h"]h$]h&]uh1j/hj%ubj)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMShj%ubj)}(h3Send a ENTDAA CCC command to start a DAA procedure.h]h3Send a ENTDAA CCC command to start a DAA procedure.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMRhj%ubj)}(hNote that this function only sends the ENTDAA CCC command, all the logic behind dynamic address assignment has to be handled in the I3C master driver.h]hNote that this function only sends the ENTDAA CCC command, all the logic behind dynamic address assignment has to be handled in the I3C master driver.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMThj%ubj)}(hBThis function must be called with the bus lock held in write mode.h]hBThis function must be called with the bus lock held in write mode.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMXhj%ubj)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMZhj%ubj)}(h90 in case of success, or a negative error code otherwise.h]h90 in case of success, or a negative error code otherwise.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM[hj%ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h)i3c_master_enec_disec_locked (C function)c.i3c_master_enec_disec_lockedhNtauh1hhhhhhNhNubh)}(hhh](h)}(hxint i3c_master_enec_disec_locked (struct i3c_master_controller *master, u8 addr, bool enable, u8 evts, bool suppress_m2)h]h)}(hwint i3c_master_enec_disec_locked(struct i3c_master_controller *master, u8 addr, bool enable, u8 evts, bool suppress_m2)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj hhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMqubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhjhMqubj#)}(hi3c_master_enec_disec_lockedh]j))}(hi3c_master_enec_disec_lockedh]hi3c_master_enec_disec_locked}(hj0hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj,ubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hj hhhjhMqubjB)}(hW(struct i3c_master_controller *master, u8 addr, bool enable, u8 evts, bool suppress_m2)h](jH)}(h$struct i3c_master_controller *masterh](jN)}(hjQh]hstruct}(hjLhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjHubj)}(h h]h }(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubh)}(hhh]j))}(hi3c_master_controllerh]hi3c_master_controller}(hjjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjgubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjlmodnameN classnameNjj)}j]j)}jj2sbc.i3c_master_enec_disec_lockedasbuh1hhjHubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubj))}(hmasterh]hmaster}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjHubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjDubjH)}(hu8 addrh](h)}(hhh]j))}(hu8h]hu8}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jc.i3c_master_enec_disec_lockedasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj))}(haddrh]haddr}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjDubjH)}(h bool enableh](j)}(hboolh]hbool}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj))}(henableh]henable}(hj"hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjDubjH)}(hu8 evtsh](h)}(hhh]j))}(hu8h]hu8}(hj>hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj;ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj@modnameN classnameNjj)}j]jc.i3c_master_enec_disec_lockedasbuh1hhj7ubj)}(h h]h }(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7ubj))}(hevtsh]hevts}(hjjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj7ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjDubjH)}(hbool suppress_m2h](j)}(hjh]hbool}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj))}(h suppress_m2h]h suppress_m2}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjDubeh}(h]h ]h"]h$]h&]hhuh1jAhj hhhjhMqubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjhhhjhMqubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhMqhjhhubj)}(hhh]j)}(h!send an ENEC or DISEC CCC commandh]h!send an ENEC or DISEC CCC command}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMqhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMqubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1hhhhhhNhNubj)}(hX**Parameters** ``struct i3c_master_controller *master`` master used to send frames on the bus ``u8 addr`` a valid I3C slave address or ``I3C_BROADCAST_ADDR`` ``bool enable`` true to send ENEC, false to send DISEC ``u8 evts`` events to enable or disable ``bool suppress_m2`` if true, treat an M2 (NACK) error from the CCC as success **Description** Send an ENEC or DISEC CCC command to enable or disable some or all events coming from a specific slave, or all devices if **addr** is ``I3C_BROADCAST_ADDR``. When **suppress_m2** is true, a NACK of the broadcast (which can happen when no devices are present on the bus) is not reported as an error. This is useful for callers that want to configure event reporting unconditionally, regardless of whether any devices are currently on the bus. This function must be called with the bus lock held in write mode. **Return** 0 in case of success, or a negative error code otherwise.h](j)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMuhjubj0)}(hhh](j5)}(hO``struct i3c_master_controller *master`` master used to send frames on the bus h](j;)}(h(``struct i3c_master_controller *master``h]jA)}(hj h]h$struct i3c_master_controller *master}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMrhjubjW)}(hhh]j)}(h%master used to send frames on the bush]h%master used to send frames on the bus}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMrhjubah}(h]h ]h"]h$]h&]uh1jVhjubeh}(h]h ]h"]h$]h&]uh1j4hjhMrhjubj5)}(h@``u8 addr`` a valid I3C slave address or ``I3C_BROADCAST_ADDR`` h](j;)}(h ``u8 addr``h]jA)}(hjBh]hu8 addr}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj@ubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMshj<ubjW)}(hhh]j)}(h3a valid I3C slave address or ``I3C_BROADCAST_ADDR``h](ha valid I3C slave address or }(hj[hhhNhNubjA)}(h``I3C_BROADCAST_ADDR``h]hI3C_BROADCAST_ADDR}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj[ubeh}(h]h ]h"]h$]h&]uh1jhjWhMshjXubah}(h]h ]h"]h$]h&]uh1jVhj<ubeh}(h]h ]h"]h$]h&]uh1j4hjWhMshjubj5)}(h7``bool enable`` true to send ENEC, false to send DISEC h](j;)}(h``bool enable``h]jA)}(hjh]h bool enable}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMthjubjW)}(hhh]j)}(h&true to send ENEC, false to send DISECh]h&true to send ENEC, false to send DISEC}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMthjubah}(h]h ]h"]h$]h&]uh1jVhjubeh}(h]h ]h"]h$]h&]uh1j4hjhMthjubj5)}(h(``u8 evts`` events to enable or disable h](j;)}(h ``u8 evts``h]jA)}(hjh]hu8 evts}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMuhjubjW)}(hhh]j)}(hevents to enable or disableh]hevents to enable or disable}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMuhjubah}(h]h ]h"]h$]h&]uh1jVhjubeh}(h]h ]h"]h$]h&]uh1j4hjhMuhjubj5)}(hO``bool suppress_m2`` if true, treat an M2 (NACK) error from the CCC as success h](j;)}(h``bool suppress_m2``h]jA)}(hjh]hbool suppress_m2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMvhjubjW)}(hhh]j)}(h9if true, treat an M2 (NACK) error from the CCC as successh]h9if true, treat an M2 (NACK) error from the CCC as success}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMvhjubah}(h]h ]h"]h$]h&]uh1jVhjubeh}(h]h ]h"]h$]h&]uh1j4hjhMvhjubeh}(h]h ]h"]h$]h&]uh1j/hjubj)}(h**Description**h]j)}(hj6h]h Description}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMxhjubj)}(hSend an ENEC or DISEC CCC command to enable or disable some or all events coming from a specific slave, or all devices if **addr** is ``I3C_BROADCAST_ADDR``.h](hzSend an ENEC or DISEC CCC command to enable or disable some or all events coming from a specific slave, or all devices if }(hjLhhhNhNubj)}(h**addr**h]haddr}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubh is }(hjLhhhNhNubjA)}(h``I3C_BROADCAST_ADDR``h]hI3C_BROADCAST_ADDR}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjLubh.}(hjLhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMwhjubj)}(hXWhen **suppress_m2** is true, a NACK of the broadcast (which can happen when no devices are present on the bus) is not reported as an error. This is useful for callers that want to configure event reporting unconditionally, regardless of whether any devices are currently on the bus.h](hWhen }(hjhhhNhNubj)}(h**suppress_m2**h]h suppress_m2}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhX is true, a NACK of the broadcast (which can happen when no devices are present on the bus) is not reported as an error. This is useful for callers that want to configure event reporting unconditionally, regardless of whether any devices are currently on the bus.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM{hjubj)}(hBThis function must be called with the bus lock held in write mode.h]hBThis function must be called with the bus lock held in write mode.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubj)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubj)}(h90 in case of success, or a negative error code otherwise.h]h90 in case of success, or a negative error code otherwise.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h$i3c_master_disec_locked (C function)c.i3c_master_disec_lockedhNtauh1hhhhhhNhNubh)}(hhh](h)}(hTint i3c_master_disec_locked (struct i3c_master_controller *master, u8 addr, u8 evts)h]h)}(hSint i3c_master_disec_locked(struct i3c_master_controller *master, u8 addr, u8 evts)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjhhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj#)}(hi3c_master_disec_lockedh]j))}(hi3c_master_disec_lockedh]hi3c_master_disec_locked}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hjhhhjhMubjB)}(h8(struct i3c_master_controller *master, u8 addr, u8 evts)h](jH)}(h$struct i3c_master_controller *masterh](jN)}(hjQh]hstruct}(hj3hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhj/ubj)}(h h]h }(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubh)}(hhh]j))}(hi3c_master_controllerh]hi3c_master_controller}(hjQhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjNubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjSmodnameN classnameNjj)}j]j)}jjsbc.i3c_master_disec_lockedasbuh1hhj/ubj)}(h h]h }(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubj))}(hmasterh]hmaster}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj/ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhj+ubjH)}(hu8 addrh](h)}(hhh]j))}(hu8h]hu8}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jmc.i3c_master_disec_lockedasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj))}(haddrh]haddr}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhj+ubjH)}(hu8 evtsh](h)}(hhh]j))}(hu8h]hu8}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jmc.i3c_master_disec_lockedasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj))}(hevtsh]hevts}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhj+ubeh}(h]h ]h"]h$]h&]hhuh1jAhjhhhjhMubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhMhjhhubj)}(hhh]j)}(hsend a DISEC CCC commandh]hsend a DISEC CCC command}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjChhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](j:functioneh"]h$]h&]j jj j^j j^j j juh1hhhhhhNhNubj)}(hX**Parameters** ``struct i3c_master_controller *master`` master used to send frames on the bus ``u8 addr`` a valid I3C slave address or ``I3C_BROADCAST_ADDR`` ``u8 evts`` events to disable **Description** Send a DISEC CCC command to disable some or all events coming from a specific slave, or all devices if **addr** is ``I3C_BROADCAST_ADDR``. This function must be called with the bus lock held in write mode. **Return** 0 in case of success, or a negative error code otherwise.h](j)}(h**Parameters**h]j)}(hjhh]h Parameters}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjbubj0)}(hhh](j5)}(hO``struct i3c_master_controller *master`` master used to send frames on the bus h](j;)}(h(``struct i3c_master_controller *master``h]jA)}(hjh]h$struct i3c_master_controller *master}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubjW)}(hhh]j)}(h%master used to send frames on the bush]h%master used to send frames on the bus}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jVhjubeh}(h]h ]h"]h$]h&]uh1j4hjhMhj~ubj5)}(h@``u8 addr`` a valid I3C slave address or ``I3C_BROADCAST_ADDR`` h](j;)}(h ``u8 addr``h]jA)}(hjh]hu8 addr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubjW)}(hhh]j)}(h3a valid I3C slave address or ``I3C_BROADCAST_ADDR``h](ha valid I3C slave address or }(hjhhhNhNubjA)}(h``I3C_BROADCAST_ADDR``h]hI3C_BROADCAST_ADDR}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jVhjubeh}(h]h ]h"]h$]h&]uh1j4hjhMhj~ubj5)}(h``u8 evts`` events to disable h](j;)}(h ``u8 evts``h]jA)}(hjh]hu8 evts}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubjW)}(hhh]j)}(hevents to disableh]hevents to disable}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jVhjubeh}(h]h ]h"]h$]h&]uh1j4hjhMhj~ubeh}(h]h ]h"]h$]h&]uh1j/hjbubj)}(h**Description**h]j)}(hjBh]h Description}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjbubj)}(hSend a DISEC CCC command to disable some or all events coming from a specific slave, or all devices if **addr** is ``I3C_BROADCAST_ADDR``.h](hgSend a DISEC CCC command to disable some or all events coming from a specific slave, or all devices if }(hjXhhhNhNubj)}(h**addr**h]haddr}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubh is }(hjXhhhNhNubjA)}(h``I3C_BROADCAST_ADDR``h]hI3C_BROADCAST_ADDR}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjXubh.}(hjXhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjbubj)}(hBThis function must be called with the bus lock held in write mode.h]hBThis function must be called with the bus lock held in write mode.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjbubj)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjbubj)}(h90 in case of success, or a negative error code otherwise.h]h90 in case of success, or a negative error code otherwise.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjbubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h#i3c_master_enec_locked (C function)c.i3c_master_enec_lockedhNtauh1hhhhhhNhNubh)}(hhh](h)}(hSint i3c_master_enec_locked (struct i3c_master_controller *master, u8 addr, u8 evts)h]h)}(hRint i3c_master_enec_locked(struct i3c_master_controller *master, u8 addr, u8 evts)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjhhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj#)}(hi3c_master_enec_lockedh]j))}(hi3c_master_enec_lockedh]hi3c_master_enec_locked}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hjhhhjhMubjB)}(h8(struct i3c_master_controller *master, u8 addr, u8 evts)h](jH)}(h$struct i3c_master_controller *masterh](jN)}(hjQh]hstruct}(hjhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjubj)}(h h]h }(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j))}(hi3c_master_controllerh]hi3c_master_controller}(hj<hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj9ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj>modnameN classnameNjj)}j]j)}jjsbc.i3c_master_enec_lockedasbuh1hhjubj)}(h h]h }(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj))}(hmasterh]hmaster}(hjwhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjubjH)}(hu8 addrh](h)}(hhh]j))}(hu8h]hu8}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jXc.i3c_master_enec_lockedasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj))}(haddrh]haddr}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjubjH)}(hu8 evtsh](h)}(hhh]j))}(hu8h]hu8}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jXc.i3c_master_enec_lockedasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj))}(hevtsh]hevts}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjubeh}(h]h ]h"]h$]h&]hhuh1jAhjhhhjhMubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhMhjhhubj)}(hhh]j)}(hsend an ENEC CCC commandh]hsend an ENEC CCC command}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj.hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jIj jIj j juh1hhhhhhNhNubj)}(hX**Parameters** ``struct i3c_master_controller *master`` master used to send frames on the bus ``u8 addr`` a valid I3C slave address or ``I3C_BROADCAST_ADDR`` ``u8 evts`` events to disable **Description** Sends an ENEC CCC command to enable some or all events coming from a specific slave, or all devices if **addr** is ``I3C_BROADCAST_ADDR``. This function must be called with the bus lock held in write mode. **Return** 0 in case of success, or a negative error code otherwise.h](j)}(h**Parameters**h]j)}(hjSh]h Parameters}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjMubj0)}(hhh](j5)}(hO``struct i3c_master_controller *master`` master used to send frames on the bus h](j;)}(h(``struct i3c_master_controller *master``h]jA)}(hjrh]h$struct i3c_master_controller *master}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjpubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjlubjW)}(hhh]j)}(h%master used to send frames on the bush]h%master used to send frames on the bus}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jVhjlubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjiubj5)}(h@``u8 addr`` a valid I3C slave address or ``I3C_BROADCAST_ADDR`` h](j;)}(h ``u8 addr``h]jA)}(hjh]hu8 addr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubjW)}(hhh]j)}(h3a valid I3C slave address or ``I3C_BROADCAST_ADDR``h](ha valid I3C slave address or }(hjhhhNhNubjA)}(h``I3C_BROADCAST_ADDR``h]hI3C_BROADCAST_ADDR}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jVhjubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjiubj5)}(h``u8 evts`` events to disable h](j;)}(h ``u8 evts``h]jA)}(hjh]hu8 evts}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubjW)}(hhh]j)}(hevents to disableh]hevents to disable}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jVhjubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjiubeh}(h]h ]h"]h$]h&]uh1j/hjMubj)}(h**Description**h]j)}(hj-h]h Description}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjMubj)}(hSends an ENEC CCC command to enable some or all events coming from a specific slave, or all devices if **addr** is ``I3C_BROADCAST_ADDR``.h](hgSends an ENEC CCC command to enable some or all events coming from a specific slave, or all devices if }(hjChhhNhNubj)}(h**addr**h]haddr}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubh is }(hjChhhNhNubjA)}(h``I3C_BROADCAST_ADDR``h]hI3C_BROADCAST_ADDR}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjCubh.}(hjChhhNhNubeh}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjMubj)}(hBThis function must be called with the bus lock held in write mode.h]hBThis function must be called with the bus lock held in write mode.}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjMubj)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjMubj)}(h90 in case of success, or a negative error code otherwise.h]h90 in case of success, or a negative error code otherwise.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjMubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h&i3c_master_defslvs_locked (C function)c.i3c_master_defslvs_lockedhNtauh1hhhhhhNhNubh)}(hhh](h)}(hDint i3c_master_defslvs_locked (struct i3c_master_controller *master)h]h)}(hCint i3c_master_defslvs_locked(struct i3c_master_controller *master)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjhhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj#)}(hi3c_master_defslvs_lockedh]j))}(hi3c_master_defslvs_lockedh]hi3c_master_defslvs_locked}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hjhhhjhMubjB)}(h&(struct i3c_master_controller *master)h]jH)}(h$struct i3c_master_controller *masterh](jN)}(hjQh]hstruct}(hj hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j))}(hi3c_master_controllerh]hi3c_master_controller}(hj'hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj$ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj)modnameN classnameNjj)}j]j)}jjsbc.i3c_master_defslvs_lockedasbuh1hhjubj)}(h h]h }(hjGhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj))}(hmasterh]hmaster}(hjbhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjubah}(h]h ]h"]h$]h&]hhuh1jAhjhhhjhMubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhMhjhhubj)}(hhh]j)}(hsend a DEFSLVS CCC commandh]hsend a DEFSLVS CCC command}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1hhhhhhNhNubj)}(hX**Parameters** ``struct i3c_master_controller *master`` master used to send frames on the bus **Description** Send a DEFSLVS CCC command containing all the devices known to the **master**. This is useful when you have secondary masters on the bus to propagate device information. This should be called after all I3C devices have been discovered (in other words, after the DAA procedure has finished) and instantiated in :c:type:`i3c_master_controller_ops->bus_init\(\) `. It should also be called if a master ACKed an Hot-Join request and assigned a dynamic address to the device joining the bus. This function must be called with the bus lock held in write mode. **Return** 0 in case of success, or a negative error code otherwise.h](j)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubj0)}(hhh]j5)}(hO``struct i3c_master_controller *master`` master used to send frames on the bus h](j;)}(h(``struct i3c_master_controller *master``h]jA)}(hjh]h$struct i3c_master_controller *master}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubjW)}(hhh]j)}(h%master used to send frames on the bush]h%master used to send frames on the bus}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jVhjubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjubah}(h]h ]h"]h$]h&]uh1j/hjubj)}(h**Description**h]j)}(hjh]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubj)}(hSend a DEFSLVS CCC command containing all the devices known to the **master**. This is useful when you have secondary masters on the bus to propagate device information.h](hCSend a DEFSLVS CCC command containing all the devices known to the }(hjhhhNhNubj)}(h **master**h]hmaster}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh\. This is useful when you have secondary masters on the bus to propagate device information.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubj)}(hXWThis should be called after all I3C devices have been discovered (in other words, after the DAA procedure has finished) and instantiated in :c:type:`i3c_master_controller_ops->bus_init\(\) `. It should also be called if a master ACKed an Hot-Join request and assigned a dynamic address to the device joining the bus.h](hThis should be called after all I3C devices have been discovered (in other words, after the DAA procedure has finished) and instantiated in }(hj?hhhNhNubh)}(hM:c:type:`i3c_master_controller_ops->bus_init\(\) `h]jA)}(hjIh]h%i3c_master_controller_ops->bus_init()}(hjKhhhNhNubah}(h]h ](xrefjc-typeeh"]h$]h&]uh1j@hjGubah}(h]h ]h"]h$]h&]refdoc driver-api/i3c/master-driver-api refdomainjreftypetype refexplicitrefwarnjj)}j]sb reftargeti3c_master_controller_opsuh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj?ubh~. It should also be called if a master ACKed an Hot-Join request and assigned a dynamic address to the device joining the bus.}(hj?hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjlhMhjubj)}(hBThis function must be called with the bus lock held in write mode.h]hBThis function must be called with the bus lock held in write mode.}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubj)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubj)}(h90 in case of success, or a negative error code otherwise.h]h90 in case of success, or a negative error code otherwise.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h/i3c_master_reattach_i3c_dev_locked (C function)$c.i3c_master_reattach_i3c_dev_lockedhNtauh1hhhhhhNhNubh)}(hhh](h)}(hRint i3c_master_reattach_i3c_dev_locked (struct i3c_dev_desc *dev, u8 old_dyn_addr)h]h)}(hQint i3c_master_reattach_i3c_dev_locked(struct i3c_dev_desc *dev, u8 old_dyn_addr)h](j)}(hinth]hint}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjhhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj#)}(h"i3c_master_reattach_i3c_dev_lockedh]j))}(h"i3c_master_reattach_i3c_dev_lockedh]h"i3c_master_reattach_i3c_dev_locked}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hjhhhjhMubjB)}(h+(struct i3c_dev_desc *dev, u8 old_dyn_addr)h](jH)}(hstruct i3c_dev_desc *devh](jN)}(hjQh]hstruct}(hj hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j))}(h i3c_dev_desch]h i3c_dev_desc}(hj(hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj%ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj*modnameN classnameNjj)}j]j)}jjsb$c.i3c_master_reattach_i3c_dev_lockedasbuh1hhjubj)}(h h]h }(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj))}(hdevh]hdev}(hjchhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjubjH)}(hu8 old_dyn_addrh](h)}(hhh]j))}(hu8h]hu8}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj|ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jD$c.i3c_master_reattach_i3c_dev_lockedasbuh1hhjxubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjxubj))}(h old_dyn_addrh]h old_dyn_addr}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjxubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjubeh}(h]h ]h"]h$]h&]hhuh1jAhjhhhjhMubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhMhjhhubj)}(hhh]j)}(h)reattach an I3C device with a new addressh]h)reattach an I3C device with a new address}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj j juh1hhhhhhNhNubj)}(hXh**Parameters** ``struct i3c_dev_desc *dev`` I3C device descriptor to reattach ``u8 old_dyn_addr`` previous dynamic address of the device **Description** This function reattaches an existing I3C device to the bus when its dynamic address has changed. It updates the bus address slot status accordingly: - Marks the new dynamic address as occupied by an I3C device. - Frees the old dynamic address slot if applicable. This function must be called with the bus lock held in write mode. **Return** 0 on success, or a negative error code if reattachment fails (e.g. -EBUSY if the new address slot is not free).h](j)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubj0)}(hhh](j5)}(h?``struct i3c_dev_desc *dev`` I3C device descriptor to reattach h](j;)}(h``struct i3c_dev_desc *dev``h]jA)}(hjh]hstruct i3c_dev_desc *dev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubjW)}(hhh]j)}(h!I3C device descriptor to reattachh]h!I3C device descriptor to reattach}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+hMhj,ubah}(h]h ]h"]h$]h&]uh1jVhjubeh}(h]h ]h"]h$]h&]uh1j4hj+hMhj ubj5)}(h;``u8 old_dyn_addr`` previous dynamic address of the device h](j;)}(h``u8 old_dyn_addr``h]jA)}(hjOh]hu8 old_dyn_addr}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjMubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjIubjW)}(hhh]j)}(h&previous dynamic address of the deviceh]h&previous dynamic address of the device}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdhMhjeubah}(h]h ]h"]h$]h&]uh1jVhjIubeh}(h]h ]h"]h$]h&]uh1j4hjdhMhj ubeh}(h]h ]h"]h$]h&]uh1j/hjubj)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubj)}(hXThis function reattaches an existing I3C device to the bus when its dynamic address has changed. It updates the bus address slot status accordingly: - Marks the new dynamic address as occupied by an I3C device. - Frees the old dynamic address slot if applicable.h]hXThis function reattaches an existing I3C device to the bus when its dynamic address has changed. It updates the bus address slot status accordingly: - Marks the new dynamic address as occupied by an I3C device. - Frees the old dynamic address slot if applicable.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubj)}(hBThis function must be called with the bus lock held in write mode.h]hBThis function must be called with the bus lock held in write mode.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubj)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubj)}(ho0 on success, or a negative error code if reattachment fails (e.g. -EBUSY if the new address slot is not free).h]ho0 on success, or a negative error code if reattachment fails (e.g. -EBUSY if the new address slot is not free).}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h&i3c_master_dma_map_single (C function)c.i3c_master_dma_map_singlehNtauh1hhhhhhNhNubh)}(hhh](h)}(hstruct i3c_dma * i3c_master_dma_map_single (struct device *dev, void *buf, size_t len, bool force_bounce, enum dma_data_direction dir)h]h)}(hstruct i3c_dma *i3c_master_dma_map_single(struct device *dev, void *buf, size_t len, bool force_bounce, enum dma_data_direction dir)h](jN)}(hjQh]hstruct}(hjhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjhhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubh)}(hhh]j))}(hi3c_dmah]hi3c_dma}(hj$hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj!ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj&modnameN classnameNjj)}j]j)}ji3c_master_dma_map_singlesbc.i3c_master_dma_map_singleasbuh1hhjhhhjhMubj)}(h h]h }(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj)}(hjh]h*}(hjShhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj#)}(hi3c_master_dma_map_singleh]j))}(hjBh]hi3c_master_dma_map_single}(hjdhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj`ubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hjhhhjhMubjB)}(h[(struct device *dev, void *buf, size_t len, bool force_bounce, enum dma_data_direction dir)h](jH)}(hstruct device *devh](jN)}(hjQh]hstruct}(hjhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhj{ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubh)}(hhh]j))}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j@c.i3c_master_dma_map_singleasbuh1hhj{ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj{ubj))}(hdevh]hdev}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj{ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjwubjH)}(h void *bufh](j)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj))}(hbufh]hbuf}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjwubjH)}(h size_t lenh](h)}(hhh]j))}(hsize_th]hsize_t}(hj4hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj1ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj6modnameN classnameNjj)}j]j@c.i3c_master_dma_map_singleasbuh1hhj-ubj)}(h h]h }(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubj))}(hlenh]hlen}(hj`hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj-ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjwubjH)}(hbool force_bounceh](j)}(hjh]hbool}(hjyhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjuubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubj))}(h force_bounceh]h force_bounce}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjuubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjwubjH)}(henum dma_data_direction dirh](jN)}(henumh]henum}(hjhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j))}(hdma_data_directionh]hdma_data_direction}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j@c.i3c_master_dma_map_singleasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj))}(hdirh]hdir}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjwubeh}(h]h ]h"]h$]h&]hhuh1jAhjhhhjhMubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhMhjhhubj)}(hhh]j)}(h"Map buffer for single DMA transferh]h"Map buffer for single DMA transfer}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]j jj j:j j:j j juh1hhhhhhNhNubj)}(hX**Parameters** ``struct device *dev`` device object of a device doing DMA ``void *buf`` destination/source buffer for DMA ``size_t len`` length of transfer ``bool force_bounce`` true, force to use a bounce buffer, false, function will auto check is a bounce buffer required ``enum dma_data_direction dir`` DMA direction **Description** Map buffer for a DMA transfer and allocate a bounce buffer if required. **Return** I3C DMA transfer descriptor or NULL in case of error.h](j)}(h**Parameters**h]j)}(hjDh]h Parameters}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj>ubj0)}(hhh](j5)}(h;``struct device *dev`` device object of a device doing DMA h](j;)}(h``struct device *dev``h]jA)}(hjch]hstruct device *dev}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjaubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj]ubjW)}(hhh]j)}(h#device object of a device doing DMAh]h#device object of a device doing DMA}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxhMhjyubah}(h]h ]h"]h$]h&]uh1jVhj]ubeh}(h]h ]h"]h$]h&]uh1j4hjxhMhjZubj5)}(h0``void *buf`` destination/source buffer for DMA h](j;)}(h ``void *buf``h]jA)}(hjh]h void *buf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubjW)}(hhh]j)}(h!destination/source buffer for DMAh]h!destination/source buffer for DMA}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jVhjubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjZubj5)}(h"``size_t len`` length of transfer h](j;)}(h``size_t len``h]jA)}(hjh]h size_t len}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubjW)}(hhh]j)}(hlength of transferh]hlength of transfer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jVhjubeh}(h]h ]h"]h$]h&]uh1j4hjhMhjZubj5)}(hv``bool force_bounce`` true, force to use a bounce buffer, false, function will auto check is a bounce buffer required h](j;)}(h``bool force_bounce``h]jA)}(hj h]hbool force_bounce}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj ubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj ubjW)}(hhh]j)}(h_true, force to use a bounce buffer, false, function will auto check is a bounce buffer requiredh]h_true, force to use a bounce buffer, false, function will auto check is a bounce buffer required}(hj' hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj$ ubah}(h]h ]h"]h$]h&]uh1jVhj ubeh}(h]h ]h"]h$]h&]uh1j4hj# hMhjZubj5)}(h.``enum dma_data_direction dir`` DMA direction h](j;)}(h``enum dma_data_direction dir``h]jA)}(hjH h]henum dma_data_direction dir}(hjJ hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjF ubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjB ubjW)}(hhh]j)}(h DMA directionh]h DMA direction}(hja hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj] hMhj^ ubah}(h]h ]h"]h$]h&]uh1jVhjB ubeh}(h]h ]h"]h$]h&]uh1j4hj] hMhjZubeh}(h]h ]h"]h$]h&]uh1j/hj>ubj)}(h**Description**h]j)}(hj h]h Description}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj>ubj)}(hGMap buffer for a DMA transfer and allocate a bounce buffer if required.h]hGMap buffer for a DMA transfer and allocate a bounce buffer if required.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj>ubj)}(h **Return**h]j)}(hj h]hReturn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj>ubj)}(h5I3C DMA transfer descriptor or NULL in case of error.h]h5I3C DMA transfer descriptor or NULL in case of error.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj>ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h(i3c_master_dma_unmap_single (C function)c.i3c_master_dma_unmap_singlehNtauh1hhhhhhNhNubh)}(hhh](h)}(h;void i3c_master_dma_unmap_single (struct i3c_dma *dma_xfer)h]h)}(h:void i3c_master_dma_unmap_single(struct i3c_dma *dma_xfer)h](j)}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj hhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhj hMubj#)}(hi3c_master_dma_unmap_singleh]j))}(hi3c_master_dma_unmap_singleh]hi3c_master_dma_unmap_single}(hj!hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj !ubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hj hhhj hMubjB)}(h(struct i3c_dma *dma_xfer)h]jH)}(hstruct i3c_dma *dma_xferh](jN)}(hjQh]hstruct}(hj,!hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhj(!ubj)}(h h]h }(hj9!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(!ubh)}(hhh]j))}(hi3c_dmah]hi3c_dma}(hjJ!hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjG!ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjL!modnameN classnameNjj)}j]j)}jj!sbc.i3c_master_dma_unmap_singleasbuh1hhj(!ubj)}(h h]h }(hjj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(!ubj)}(hjh]h*}(hjx!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(!ubj))}(hdma_xferh]hdma_xfer}(hj!hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj(!ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhj$!ubah}(h]h ]h"]h$]h&]hhuh1jAhj hhhj hMubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj hhhj hMubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1hhj hMhj hhubj)}(hhh]j)}(hUnmap buffer after DMAh]hUnmap buffer after DMA}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj!hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hMubeh}(h]h ](jfunctioneh"]h$]h&]j jj j!j j!j j juh1hhhhhhNhNubj)}(h**Parameters** ``struct i3c_dma *dma_xfer`` DMA transfer and mapping descriptor **Description** Unmap buffer and cleanup DMA transfer descriptor.h](j)}(h**Parameters**h]j)}(hj!h]h Parameters}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj!ubj0)}(hhh]j5)}(hA``struct i3c_dma *dma_xfer`` DMA transfer and mapping descriptor h](j;)}(h``struct i3c_dma *dma_xfer``h]jA)}(hj!h]hstruct i3c_dma *dma_xfer}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj!ubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj!ubjW)}(hhh]j)}(h#DMA transfer and mapping descriptorh]h#DMA transfer and mapping descriptor}(hj "hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"hMhj"ubah}(h]h ]h"]h$]h&]uh1jVhj!ubeh}(h]h ]h"]h$]h&]uh1j4hj"hMhj!ubah}(h]h ]h"]h$]h&]uh1j/hj!ubj)}(h**Description**h]j)}(hj+"h]h Description}(hj-"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)"ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj!ubj)}(h1Unmap buffer and cleanup DMA transfer descriptor.h]h1Unmap buffer and cleanup DMA transfer descriptor.}(hjA"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj!ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h i3c_master_set_info (C function)c.i3c_master_set_infohNtauh1hhhhhhNhNubh)}(hhh](h)}(hbint i3c_master_set_info (struct i3c_master_controller *master, const struct i3c_device_info *info)h]h)}(haint i3c_master_set_info(struct i3c_master_controller *master, const struct i3c_device_info *info)h](j)}(hinth]hint}(hjp"hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjl"hhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMubj)}(h h]h }(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjl"hhhj~"hMubj#)}(hi3c_master_set_infoh]j))}(hi3c_master_set_infoh]hi3c_master_set_info}(hj"hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj"ubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hjl"hhhj~"hMubjB)}(hJ(struct i3c_master_controller *master, const struct i3c_device_info *info)h](jH)}(h$struct i3c_master_controller *masterh](jN)}(hjQh]hstruct}(hj"hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhj"ubj)}(h h]h }(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubh)}(hhh]j))}(hi3c_master_controllerh]hi3c_master_controller}(hj"hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj"ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj"modnameN classnameNjj)}j]j)}jj"sbc.i3c_master_set_infoasbuh1hhj"ubj)}(h h]h }(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubj)}(hjh]h*}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubj))}(hmasterh]hmaster}(hj#hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj"ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhj"ubjH)}(h"const struct i3c_device_info *infoh](jN)}(hconsth]hconst}(hj#hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhj#ubj)}(h h]h }(hj-#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubjN)}(hjQh]hstruct}(hj;#hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhj#ubj)}(h h]h }(hjH#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubh)}(hhh]j))}(hi3c_device_infoh]hi3c_device_info}(hjY#hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjV#ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj[#modnameN classnameNjj)}j]j"c.i3c_master_set_infoasbuh1hhj#ubj)}(h h]h }(hjw#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubj)}(hjh]h*}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#ubj))}(hinfoh]hinfo}(hj#hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj#ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhj"ubeh}(h]h ]h"]h$]h&]hhuh1jAhjl"hhhj~"hMubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjh"hhhj~"hMubah}(h]jc"ah ](jjeh"]h$]h&]jj)jhuh1hhj~"hMhje"hhubj)}(hhh]j)}(hset master device informationh]hset master device information}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj#hhubah}(h]h ]h"]h$]h&]uh1jhje"hhhj~"hMubeh}(h]h ](jfunctioneh"]h$]h&]j jj j#j j#j j juh1hhhhhhNhNubj)}(hX1**Parameters** ``struct i3c_master_controller *master`` master used to send frames on the bus ``const struct i3c_device_info *info`` I3C device information **Description** Set master device info. This should be called from :c:type:`i3c_master_controller_ops->bus_init\(\) `. Not all :c:type:`i3c_device_info` fields are meaningful for a master device. Here is a list of fields that should be properly filled: - :c:type:`i3c_device_info->dyn_addr ` - :c:type:`i3c_device_info->bcr ` - :c:type:`i3c_device_info->dcr ` - :c:type:`i3c_device_info->pid ` - :c:type:`i3c_device_info->hdr_cap ` if ``I3C_BCR_HDR_CAP`` bit is set in :c:type:`i3c_device_info->bcr ` This function must be called with the bus lock held in maintenance mode. **Return** 0 if **info** contains valid information (not every piece of information can be checked, but we can at least make sure **info->dyn_addr** and **info->bcr** are correct), -EINVAL otherwise.h](j)}(h**Parameters**h]j)}(hj#h]h Parameters}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj#ubj0)}(hhh](j5)}(hO``struct i3c_master_controller *master`` master used to send frames on the bus h](j;)}(h(``struct i3c_master_controller *master``h]jA)}(hj#h]h$struct i3c_master_controller *master}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj#ubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj#ubjW)}(hhh]j)}(h%master used to send frames on the bush]h%master used to send frames on the bus}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj$hMhj$ubah}(h]h ]h"]h$]h&]uh1jVhj#ubeh}(h]h ]h"]h$]h&]uh1j4hj$hMhj#ubj5)}(h>``const struct i3c_device_info *info`` I3C device information h](j;)}(h&``const struct i3c_device_info *info``h]jA)}(hj6$h]h"const struct i3c_device_info *info}(hj8$hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj4$ubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj0$ubjW)}(hhh]j)}(hI3C device informationh]hI3C device information}(hjO$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjK$hMhjL$ubah}(h]h ]h"]h$]h&]uh1jVhj0$ubeh}(h]h ]h"]h$]h&]uh1j4hjK$hMhj#ubeh}(h]h ]h"]h$]h&]uh1j/hj#ubj)}(h**Description**h]j)}(hjq$h]h Description}(hjs$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjo$ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj#ubj)}(hSet master device info. This should be called from :c:type:`i3c_master_controller_ops->bus_init\(\) `.h](h3Set master device info. This should be called from }(hj$hhhNhNubh)}(hM:c:type:`i3c_master_controller_ops->bus_init\(\) `h]jA)}(hj$h]h%i3c_master_controller_ops->bus_init()}(hj$hhhNhNubah}(h]h ](jUjc-typeeh"]h$]h&]uh1j@hj$ubah}(h]h ]h"]h$]h&]refdocja refdomainjreftypetype refexplicitrefwarnjjgjji3c_master_controller_opsuh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj$ubh.}(hj$hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj$hMhj#ubj)}(hNot all :c:type:`i3c_device_info` fields are meaningful for a master device. Here is a list of fields that should be properly filled:h](hNot all }(hj$hhhNhNubh)}(h:c:type:`i3c_device_info`h]jA)}(hj$h]hi3c_device_info}(hj$hhhNhNubah}(h]h ](jUjc-typeeh"]h$]h&]uh1j@hj$ubah}(h]h ]h"]h$]h&]refdocja refdomainjreftypetype refexplicitrefwarnjjgjji3c_device_infouh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj$ubhd fields are meaningful for a master device. Here is a list of fields that should be properly filled:}(hj$hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj$hMhj#ubh bullet_list)}(hhh](h list_item)}(h5:c:type:`i3c_device_info->dyn_addr `h]j)}(hj$h]h)}(hj$h]jA)}(hj$h]hi3c_device_info->dyn_addr}(hj$hhhNhNubah}(h]h ](jUjc-typeeh"]h$]h&]uh1j@hj$ubah}(h]h ]h"]h$]h&]refdocja refdomainjreftypetype refexplicitrefwarnjjgjji3c_device_infouh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj$ubah}(h]h ]h"]h$]h&]uh1jhj%hMhj$ubah}(h]h ]h"]h$]h&]uh1j$hj$ubj$)}(h0:c:type:`i3c_device_info->bcr `h]j)}(hj&%h]h)}(hj&%h]jA)}(hj&%h]hi3c_device_info->bcr}(hj.%hhhNhNubah}(h]h ](jUjc-typeeh"]h$]h&]uh1j@hj+%ubah}(h]h ]h"]h$]h&]refdocja refdomainjreftypetype refexplicitrefwarnjjgjji3c_device_infouh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj(%ubah}(h]h ]h"]h$]h&]uh1jhjI%hMhj$%ubah}(h]h ]h"]h$]h&]uh1j$hj$ubj$)}(h0:c:type:`i3c_device_info->dcr `h]j)}(hjX%h]h)}(hjX%h]jA)}(hjX%h]hi3c_device_info->dcr}(hj`%hhhNhNubah}(h]h ](jUjc-typeeh"]h$]h&]uh1j@hj]%ubah}(h]h ]h"]h$]h&]refdocja refdomainjreftypetype refexplicitrefwarnjjgjji3c_device_infouh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjZ%ubah}(h]h ]h"]h$]h&]uh1jhj{%hMhjV%ubah}(h]h ]h"]h$]h&]uh1j$hj$ubj$)}(h0:c:type:`i3c_device_info->pid `h]j)}(hj%h]h)}(hj%h]jA)}(hj%h]hi3c_device_info->pid}(hj%hhhNhNubah}(h]h ](jUjc-typeeh"]h$]h&]uh1j@hj%ubah}(h]h ]h"]h$]h&]refdocja refdomainjreftypetype refexplicitrefwarnjjgjji3c_device_infouh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj%ubah}(h]h ]h"]h$]h&]uh1jhj%hMhj%ubah}(h]h ]h"]h$]h&]uh1j$hj$ubj$)}(h:c:type:`i3c_device_info->hdr_cap ` if ``I3C_BCR_HDR_CAP`` bit is set in :c:type:`i3c_device_info->bcr ` h]j)}(h:c:type:`i3c_device_info->hdr_cap ` if ``I3C_BCR_HDR_CAP`` bit is set in :c:type:`i3c_device_info->bcr `h](h)}(h4:c:type:`i3c_device_info->hdr_cap `h]jA)}(hj%h]hi3c_device_info->hdr_cap}(hj%hhhNhNubah}(h]h ](jUjc-typeeh"]h$]h&]uh1j@hj%ubah}(h]h ]h"]h$]h&]refdocja refdomainjreftypetype refexplicitrefwarnjjgjji3c_device_infouh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj%ubh if }(hj%hhhNhNubjA)}(h``I3C_BCR_HDR_CAP``h]hI3C_BCR_HDR_CAP}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj%ubh bit is set in }(hj%hhhNhNubh)}(h0:c:type:`i3c_device_info->bcr `h]jA)}(hj%h]hi3c_device_info->bcr}(hj%hhhNhNubah}(h]h ](jUjc-typeeh"]h$]h&]uh1j@hj%ubah}(h]h ]h"]h$]h&]refdocja refdomainjreftypetype refexplicitrefwarnjjgjji3c_device_infouh1hhj%hMhj%ubeh}(h]h ]h"]h$]h&]uh1jhj%hMhj%ubah}(h]h ]h"]h$]h&]uh1j$hj$ubeh}(h]h ]h"]h$]h&]bullet-uh1j$hj%hMhj#ubj)}(hHThis function must be called with the bus lock held in maintenance mode.h]hHThis function must be called with the bus lock held in maintenance mode.}(hj+&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj#ubj)}(h **Return**h]j)}(hj<&h]hReturn}(hj>&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:&ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj#ubj)}(h0 if **info** contains valid information (not every piece of information can be checked, but we can at least make sure **info->dyn_addr** and **info->bcr** are correct), -EINVAL otherwise.h](h0 if }(hjR&hhhNhNubj)}(h**info**h]hinfo}(hjZ&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjR&ubhj contains valid information (not every piece of information can be checked, but we can at least make sure }(hjR&hhhNhNubj)}(h**info->dyn_addr**h]hinfo->dyn_addr}(hjl&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjR&ubh and }(hjR&hhhNhNubj)}(h **info->bcr**h]h info->bcr}(hj~&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjR&ubh! are correct), -EINVAL otherwise.}(hjR&hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj#ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h i3c_master_bus_init (C function)c.i3c_master_bus_inithNtauh1hhhhhhNhNubh)}(hhh](h)}(h>int i3c_master_bus_init (struct i3c_master_controller *master)h]h)}(h=int i3c_master_bus_init(struct i3c_master_controller *master)h](j)}(hinth]hint}(hj&hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj&hhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM@ubj)}(h h]h }(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&hhhj&hM@ubj#)}(hi3c_master_bus_inith]j))}(hi3c_master_bus_inith]hi3c_master_bus_init}(hj&hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj&ubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hj&hhhj&hM@ubjB)}(h&(struct i3c_master_controller *master)h]jH)}(h$struct i3c_master_controller *masterh](jN)}(hjQh]hstruct}(hj&hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhj&ubj)}(h h]h }(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubh)}(hhh]j))}(hi3c_master_controllerh]hi3c_master_controller}(hj'hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj'ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj'modnameN classnameNjj)}j]j)}jj&sbc.i3c_master_bus_initasbuh1hhj&ubj)}(h h]h }(hj2'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj)}(hjh]h*}(hj@'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj))}(hmasterh]hmaster}(hjM'hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj&ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhj&ubah}(h]h ]h"]h$]h&]hhuh1jAhj&hhhj&hM@ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj&hhhj&hM@ubah}(h]j&ah ](jjeh"]h$]h&]jj)jhuh1hhj&hM@hj&hhubj)}(hhh]j)}(hinitialize an I3C bush]hinitialize an I3C bus}(hjw'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM@hjt'hhubah}(h]h ]h"]h$]h&]uh1jhj&hhhj&hM@ubeh}(h]h ](jfunctioneh"]h$]h&]j jj j'j j'j j juh1hhhhhhNhNubj)}(hX**Parameters** ``struct i3c_master_controller *master`` main master initializing the bus **Description** This function is following all initialisation steps described in the I3C specification: 1. Attach I2C devs to the master so that the master can fill its internal device table appropriately 2. Call :c:type:`i3c_master_controller_ops->bus_init\(\) ` method to initialize the master controller. That's usually where the bus mode is selected (pure bus or mixed fast/slow bus) 3. Instruct all devices on the bus to drop their dynamic address. This is particularly important when the bus was previously configured by someone else (for example the bootloader) 4. Disable all slave events. 5. Reserve address slots for I3C devices with init_dyn_addr. And if devices also have static_addr, try to pre-assign dynamic addresses requested by the FW with SETDASA and attach corresponding statically defined I3C devices to the master. 6. Do a DAA (Dynamic Address Assignment) to assign dynamic addresses to all remaining I3C devices Once this is done, all I3C and I2C devices should be usable. **Return** a 0 in case of success, an negative error code otherwise.h](j)}(h**Parameters**h]j)}(hj'h]h Parameters}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMDhj'ubj0)}(hhh]j5)}(hJ``struct i3c_master_controller *master`` main master initializing the bus h](j;)}(h(``struct i3c_master_controller *master``h]jA)}(hj'h]h$struct i3c_master_controller *master}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj'ubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMAhj'ubjW)}(hhh]j)}(h main master initializing the bush]h main master initializing the bus}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'hMAhj'ubah}(h]h ]h"]h$]h&]uh1jVhj'ubeh}(h]h ]h"]h$]h&]uh1j4hj'hMAhj'ubah}(h]h ]h"]h$]h&]uh1j/hj'ubj)}(h**Description**h]j)}(hj'h]h Description}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMChj'ubj)}(hWThis function is following all initialisation steps described in the I3C specification:h]hWThis function is following all initialisation steps described in the I3C specification:}(hj (hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMBhj'ubhenumerated_list)}(hhh](j$)}(hbAttach I2C devs to the master so that the master can fill its internal device table appropriately h]j)}(haAttach I2C devs to the master so that the master can fill its internal device table appropriatelyh]haAttach I2C devs to the master so that the master can fill its internal device table appropriately}(hj!(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMEhj(ubah}(h]h ]h"]h$]h&]uh1j$hj(ubj$)}(hCall :c:type:`i3c_master_controller_ops->bus_init\(\) ` method to initialize the master controller. That's usually where the bus mode is selected (pure bus or mixed fast/slow bus) h]j)}(hCall :c:type:`i3c_master_controller_ops->bus_init\(\) ` method to initialize the master controller. That's usually where the bus mode is selected (pure bus or mixed fast/slow bus)h](hCall }(hj:(hhhNhNubh)}(hM:c:type:`i3c_master_controller_ops->bus_init\(\) `h]jA)}(hjD(h]h%i3c_master_controller_ops->bus_init()}(hjF(hhhNhNubah}(h]h ](jUjc-typeeh"]h$]h&]uh1j@hjB(ubah}(h]h ]h"]h$]h&]refdocja refdomainjreftypetype refexplicitrefwarnjjgjji3c_master_controller_opsuh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMHhj:(ubh~ method to initialize the master controller. That’s usually where the bus mode is selected (pure bus or mixed fast/slow bus)}(hj:(hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhja(hMHhj6(ubah}(h]h ]h"]h$]h&]uh1j$hj(ubj$)}(hInstruct all devices on the bus to drop their dynamic address. This is particularly important when the bus was previously configured by someone else (for example the bootloader) h]j)}(hInstruct all devices on the bus to drop their dynamic address. This is particularly important when the bus was previously configured by someone else (for example the bootloader)h]hInstruct all devices on the bus to drop their dynamic address. This is particularly important when the bus was previously configured by someone else (for example the bootloader)}(hjv(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMLhjr(ubah}(h]h ]h"]h$]h&]uh1j$hj(ubj$)}(hDisable all slave events. h]j)}(hDisable all slave events.h]hDisable all slave events.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMPhj(ubah}(h]h ]h"]h$]h&]uh1j$hj(ubj$)}(hReserve address slots for I3C devices with init_dyn_addr. And if devices also have static_addr, try to pre-assign dynamic addresses requested by the FW with SETDASA and attach corresponding statically defined I3C devices to the master. h]j)}(hReserve address slots for I3C devices with init_dyn_addr. And if devices also have static_addr, try to pre-assign dynamic addresses requested by the FW with SETDASA and attach corresponding statically defined I3C devices to the master.h]hReserve address slots for I3C devices with init_dyn_addr. And if devices also have static_addr, try to pre-assign dynamic addresses requested by the FW with SETDASA and attach corresponding statically defined I3C devices to the master.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMRhj(ubah}(h]h ]h"]h$]h&]uh1j$hj(ubj$)}(h_Do a DAA (Dynamic Address Assignment) to assign dynamic addresses to all remaining I3C devices h]j)}(h^Do a DAA (Dynamic Address Assignment) to assign dynamic addresses to all remaining I3C devicesh]h^Do a DAA (Dynamic Address Assignment) to assign dynamic addresses to all remaining I3C devices}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMWhj(ubah}(h]h ]h"]h$]h&]uh1j$hj(ubeh}(h]h ]h"]h$]h&]enumtypearabicprefixhsuffix.uh1j(hj'ubj)}(h,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj)}(hjh]h*}(hjL,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+ubj))}(hmasterh]hmaster}(hjY,hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj+ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhj+ubjH)}(hu8 addrh](h)}(hhh]j))}(hu8h]hu8}(hju,hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjr,ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjw,modnameN classnameNjj)}j]j:,c.i3c_master_add_i3c_dev_lockedasbuh1hhjn,ubj)}(h h]h }(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjn,ubj))}(haddrh]haddr}(hj,hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjn,ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhj+ubeh}(h]h ]h"]h$]h&]hhuh1jAhj+hhhj+hM ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj+hhhj+hM ubah}(h]j+ah ](jjeh"]h$]h&]jj)jhuh1hhj+hM hj+hhubj)}(hhh]j)}(hadd an I3C slave to the bush]hadd an I3C slave to the bus}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj,hhubah}(h]h ]h"]h$]h&]uh1jhj+hhhj+hM ubeh}(h]h ](jfunctioneh"]h$]h&]j jj j,j j,j j juh1hhhhhhNhNubj)}(hX**Parameters** ``struct i3c_master_controller *master`` master used to send frames on the bus ``u8 addr`` I3C slave dynamic address assigned to the device **Description** This function instantiates an I3C device object and adds it to the I3C device list. All device information is automatically retrieved using standard CCC commands. This function must be called with the bus lock held in write mode.h](j)}(h**Parameters**h]j)}(hj,h]h Parameters}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj,ubj0)}(hhh](j5)}(hO``struct i3c_master_controller *master`` master used to send frames on the bus h](j;)}(h(``struct i3c_master_controller *master``h]jA)}(hj -h]h$struct i3c_master_controller *master}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj -ubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj-ubjW)}(hhh]j)}(h%master used to send frames on the bush]h%master used to send frames on the bus}(hj%-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!-hM hj"-ubah}(h]h ]h"]h$]h&]uh1jVhj-ubeh}(h]h ]h"]h$]h&]uh1j4hj!-hM hj-ubj5)}(h=``u8 addr`` I3C slave dynamic address assigned to the device h](j;)}(h ``u8 addr``h]jA)}(hjE-h]hu8 addr}(hjG-hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjC-ubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj?-ubjW)}(hhh]j)}(h0I3C slave dynamic address assigned to the deviceh]h0I3C slave dynamic address assigned to the device}(hj^-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZ-hM hj[-ubah}(h]h ]h"]h$]h&]uh1jVhj?-ubeh}(h]h ]h"]h$]h&]uh1j4hjZ-hM hj-ubeh}(h]h ]h"]h$]h&]uh1j/hj,ubj)}(h**Description**h]j)}(hj-h]h Description}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj~-ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj,ubj)}(hThis function instantiates an I3C device object and adds it to the I3C device list. All device information is automatically retrieved using standard CCC commands.h]hThis function instantiates an I3C device object and adds it to the I3C device list. All device information is automatically retrieved using standard CCC commands.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj,ubj)}(hBThis function must be called with the bus lock held in write mode.h]hBThis function must be called with the bus lock held in write mode.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj,ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h"i3c_master_do_daa_ext (C function)c.i3c_master_do_daa_exthNtauh1hhhhhhNhNubh)}(hhh](h)}(hMint i3c_master_do_daa_ext (struct i3c_master_controller *master, bool rstdaa)h]h)}(hLint i3c_master_do_daa_ext(struct i3c_master_controller *master, bool rstdaa)h](j)}(hinth]hint}(hj-hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj-hhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM ubj)}(h h]h }(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-hhhj-hM ubj#)}(hi3c_master_do_daa_exth]j))}(hi3c_master_do_daa_exth]hi3c_master_do_daa_ext}(hj-hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj-ubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hj-hhhj-hM ubjB)}(h3(struct i3c_master_controller *master, bool rstdaa)h](jH)}(h$struct i3c_master_controller *masterh](jN)}(hjQh]hstruct}(hj.hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhj .ubj)}(h h]h }(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj .ubh)}(hhh]j))}(hi3c_master_controllerh]hi3c_master_controller}(hj/.hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj,.ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj1.modnameN classnameNjj)}j]j)}jj-sbc.i3c_master_do_daa_extasbuh1hhj .ubj)}(h h]h }(hjO.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj .ubj)}(hjh]h*}(hj].hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj .ubj))}(hmasterh]hmaster}(hjj.hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj .ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhj .ubjH)}(h bool rstdaah](j)}(hjh]hbool}(hj.hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj.ubj)}(h h]h }(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj))}(hrstdaah]hrstdaa}(hj.hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj.ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhj .ubeh}(h]h ]h"]h$]h&]hhuh1jAhj-hhhj-hM ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj-hhhj-hM ubah}(h]j-ah ](jjeh"]h$]h&]jj)jhuh1hhj-hM hj-hhubj)}(hhh]j)}(h-Dynamic Address Assignment (extended version)h]h-Dynamic Address Assignment (extended version)}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj.hhubah}(h]h ]h"]h$]h&]uh1jhj-hhhj-hM ubeh}(h]h ](jfunctioneh"]h$]h&]j jj j.j j.j j juh1hhhhhhNhNubj)}(hX**Parameters** ``struct i3c_master_controller *master`` controller ``bool rstdaa`` whether to first perform Reset of Dynamic Addresses (RSTDAA) **Description** Perform Dynamic Address Assignment with optional support for System Hibernation (**rstdaa** is true). After System Hibernation, Dynamic Addresses can have been reassigned at boot time to different values. A simple strategy is followed to handle that. Perform a Reset of Dynamic Addresses (RSTDAA) followed by the normal DAA procedure which has provision for reassigning addresses that differ from the previously recorded addresses. **Return** a 0 in case of success, an negative error code otherwise.h](j)}(h**Parameters**h]j)}(hj.h]h Parameters}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj.ubj0)}(hhh](j5)}(h4``struct i3c_master_controller *master`` controller h](j;)}(h(``struct i3c_master_controller *master``h]jA)}(hj /h]h$struct i3c_master_controller *master}(hj /hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj/ubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj/ubjW)}(hhh]j)}(h controllerh]h controller}(hj"/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/hM hj/ubah}(h]h ]h"]h$]h&]uh1jVhj/ubeh}(h]h ]h"]h$]h&]uh1j4hj/hM hj/ubj5)}(hM``bool rstdaa`` whether to first perform Reset of Dynamic Addresses (RSTDAA) h](j;)}(h``bool rstdaa``h]jA)}(hjB/h]h bool rstdaa}(hjD/hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj@/ubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj``struct i3c_master_controller *master`` master doing the DAA h](j;)}(h(``struct i3c_master_controller *master``h]jA)}(hj 1h]h$struct i3c_master_controller *master}(hj 1hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj 1ubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM. hj1ubjW)}(hhh]j)}(hmaster doing the DAAh]hmaster doing the DAA}(hj$1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj 1hM. hj!1ubah}(h]h ]h"]h$]h&]uh1jVhj1ubeh}(h]h ]h"]h$]h&]uh1j4hj 1hM. hj1ubah}(h]h ]h"]h$]h&]uh1j/hj0ubj)}(h**Description**h]j)}(hjF1h]h Description}(hjH1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjD1ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM0 hj0ubj)}(hThis function instantiates I3C device objects and adds them to the I3C device list. All device information is automatically retrieved using standard CCC commands.h]hThis function instantiates I3C device objects and adds them to the I3C device list. All device information is automatically retrieved using standard CCC commands.}(hj\1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM/ hj0ubj)}(h **Return**h]j)}(hjm1h]hReturn}(hjo1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjk1ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM3 hj0ubj)}(h9a 0 in case of success, an negative error code otherwise.h]h9a 0 in case of success, an negative error code otherwise.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM4 hj0ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!i3c_master_queue_ibi (C function)c.i3c_master_queue_ibihNtauh1hhhhhhNhNubh)}(hhh](h)}(hOvoid i3c_master_queue_ibi (struct i3c_dev_desc *dev, struct i3c_ibi_slot *slot)h]h)}(hNvoid i3c_master_queue_ibi(struct i3c_dev_desc *dev, struct i3c_ibi_slot *slot)h](j)}(hvoidh]hvoid}(hj1hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj1hhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM ubj)}(h h]h }(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1hhhj1hM ubj#)}(hi3c_master_queue_ibih]j))}(hi3c_master_queue_ibih]hi3c_master_queue_ibi}(hj1hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj1ubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hj1hhhj1hM ubjB)}(h5(struct i3c_dev_desc *dev, struct i3c_ibi_slot *slot)h](jH)}(hstruct i3c_dev_desc *devh](jN)}(hjQh]hstruct}(hj1hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhj1ubj)}(h h]h }(hj1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubh)}(hhh]j))}(h i3c_dev_desch]h i3c_dev_desc}(hj 2hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj 2ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj2modnameN classnameNjj)}j]j)}jj1sbc.i3c_master_queue_ibiasbuh1hhj1ubj)}(h h]h }(hj-2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubj)}(hjh]h*}(hj;2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1ubj))}(hdevh]hdev}(hjH2hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj1ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhj1ubjH)}(hstruct i3c_ibi_slot *sloth](jN)}(hjQh]hstruct}(hja2hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhj]2ubj)}(h h]h }(hjn2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]2ubh)}(hhh]j))}(h i3c_ibi_sloth]h i3c_ibi_slot}(hj2hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj|2ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj2modnameN classnameNjj)}j]j)2c.i3c_master_queue_ibiasbuh1hhj]2ubj)}(h h]h }(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]2ubj)}(hjh]h*}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]2ubj))}(hsloth]hslot}(hj2hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj]2ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhj1ubeh}(h]h ]h"]h$]h&]hhuh1jAhj1hhhj1hM ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj1hhhj1hM ubah}(h]j1ah ](jjeh"]h$]h&]jj)jhuh1hhj1hM hj1hhubj)}(hhh]j)}(h Queue an IBIh]h Queue an IBI}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj2hhubah}(h]h ]h"]h$]h&]uh1jhj1hhhj1hM ubeh}(h]h ](jfunctioneh"]h$]h&]j jj j2j j2j j juh1hhhhhhNhNubj)}(hX"**Parameters** ``struct i3c_dev_desc *dev`` the device this IBI is coming from ``struct i3c_ibi_slot *slot`` the IBI slot used to store the payload **Description** Queue an IBI to the controller workqueue. The IBI handler attached to the dev will be called from a workqueue context.h](j)}(h**Parameters**h]j)}(hj3h]h Parameters}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj2ubj0)}(hhh](j5)}(h@``struct i3c_dev_desc *dev`` the device this IBI is coming from h](j;)}(h``struct i3c_dev_desc *dev``h]jA)}(hj#3h]hstruct i3c_dev_desc *dev}(hj%3hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj!3ubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj3ubjW)}(hhh]j)}(h"the device this IBI is coming fromh]h"the device this IBI is coming from}(hj<3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj83hM hj93ubah}(h]h ]h"]h$]h&]uh1jVhj3ubeh}(h]h ]h"]h$]h&]uh1j4hj83hM hj3ubj5)}(hE``struct i3c_ibi_slot *slot`` the IBI slot used to store the payload h](j;)}(h``struct i3c_ibi_slot *slot``h]jA)}(hj\3h]hstruct i3c_ibi_slot *slot}(hj^3hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjZ3ubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjV3ubjW)}(hhh]j)}(h&the IBI slot used to store the payloadh]h&the IBI slot used to store the payload}(hju3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjq3hM hjr3ubah}(h]h ]h"]h$]h&]uh1jVhjV3ubeh}(h]h ]h"]h$]h&]uh1j4hjq3hM hj3ubeh}(h]h ]h"]h$]h&]uh1j/hj2ubj)}(h**Description**h]j)}(hj3h]h Description}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj2ubj)}(hvQueue an IBI to the controller workqueue. The IBI handler attached to the dev will be called from a workqueue context.h]hvQueue an IBI to the controller workqueue. The IBI handler attached to the dev will be called from a workqueue context.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj2ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h&i3c_generic_ibi_free_pool (C function)c.i3c_generic_ibi_free_poolhNtauh1hhhhhhNhNubh)}(hhh](h)}(hBvoid i3c_generic_ibi_free_pool (struct i3c_generic_ibi_pool *pool)h]h)}(hAvoid i3c_generic_ibi_free_pool(struct i3c_generic_ibi_pool *pool)h](j)}(hvoidh]hvoid}(hj3hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj3hhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM ubj)}(h h]h }(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3hhhj3hM ubj#)}(hi3c_generic_ibi_free_poolh]j))}(hi3c_generic_ibi_free_poolh]hi3c_generic_ibi_free_pool}(hj3hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj3ubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hj3hhhj3hM ubjB)}(h#(struct i3c_generic_ibi_pool *pool)h]jH)}(h!struct i3c_generic_ibi_pool *poolh](jN)}(hjQh]hstruct}(hj4hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhj4ubj)}(h h]h }(hj&4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubh)}(hhh]j))}(hi3c_generic_ibi_poolh]hi3c_generic_ibi_pool}(hj74hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj44ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj94modnameN classnameNjj)}j]j)}jj3sbc.i3c_generic_ibi_free_poolasbuh1hhj4ubj)}(h h]h }(hjW4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubj)}(hjh]h*}(hje4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj4ubj))}(hpoolh]hpool}(hjr4hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj4ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhj4ubah}(h]h ]h"]h$]h&]hhuh1jAhj3hhhj3hM ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj3hhhj3hM ubah}(h]j3ah ](jjeh"]h$]h&]jj)jhuh1hhj3hM hj3hhubj)}(hhh]j)}(hFree a generic IBI poolh]hFree a generic IBI pool}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj4hhubah}(h]h ]h"]h$]h&]uh1jhj3hhhj3hM ubeh}(h]h ](jfunctioneh"]h$]h&]j jj j4j j4j j juh1hhhhhhNhNubj)}(h**Parameters** ``struct i3c_generic_ibi_pool *pool`` the IBI pool to free **Description** Free all IBI slots allated by a generic IBI pool.h](j)}(h**Parameters**h]j)}(hj4h]h Parameters}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj4ubj0)}(hhh]j5)}(h;``struct i3c_generic_ibi_pool *pool`` the IBI pool to free h](j;)}(h%``struct i3c_generic_ibi_pool *pool``h]jA)}(hj4h]h!struct i3c_generic_ibi_pool *pool}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj4ubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj4ubjW)}(hhh]j)}(hthe IBI pool to freeh]hthe IBI pool to free}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4hM hj4ubah}(h]h ]h"]h$]h&]uh1jVhj4ubeh}(h]h ]h"]h$]h&]uh1j4hj4hM hj4ubah}(h]h ]h"]h$]h&]uh1j/hj4ubj)}(h**Description**h]j)}(hj5h]h Description}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj4ubj)}(h1Free all IBI slots allated by a generic IBI pool.h]h1Free all IBI slots allated by a generic IBI pool.}(hj.5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj4ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h'i3c_generic_ibi_alloc_pool (C function)c.i3c_generic_ibi_alloc_poolhNtauh1hhhhhhNhNubh)}(hhh](h)}(htstruct i3c_generic_ibi_pool * i3c_generic_ibi_alloc_pool (struct i3c_dev_desc *dev, const struct i3c_ibi_setup *req)h]h)}(hrstruct i3c_generic_ibi_pool *i3c_generic_ibi_alloc_pool(struct i3c_dev_desc *dev, const struct i3c_ibi_setup *req)h](jN)}(hjQh]hstruct}(hj]5hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjY5hhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM ubj)}(h h]h }(hjk5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjY5hhhjj5hM ubh)}(hhh]j))}(hi3c_generic_ibi_poolh]hi3c_generic_ibi_pool}(hj|5hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjy5ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj~5modnameN classnameNjj)}j]j)}ji3c_generic_ibi_alloc_poolsbc.i3c_generic_ibi_alloc_poolasbuh1hhjY5hhhjj5hM ubj)}(h h]h }(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjY5hhhjj5hM ubj)}(hjh]h*}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjY5hhhjj5hM ubj#)}(hi3c_generic_ibi_alloc_poolh]j))}(hj5h]hi3c_generic_ibi_alloc_pool}(hj5hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj5ubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hjY5hhhjj5hM ubjB)}(h;(struct i3c_dev_desc *dev, const struct i3c_ibi_setup *req)h](jH)}(hstruct i3c_dev_desc *devh](jN)}(hjQh]hstruct}(hj5hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhj5ubj)}(h h]h }(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubh)}(hhh]j))}(h i3c_dev_desch]h i3c_dev_desc}(hj5hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj5ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj5modnameN classnameNjj)}j]j5c.i3c_generic_ibi_alloc_poolasbuh1hhj5ubj)}(h h]h }(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubj)}(hjh]h*}(hj!6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5ubj))}(hdevh]hdev}(hj.6hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj5ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhj5ubjH)}(hconst struct i3c_ibi_setup *reqh](jN)}(hj!#h]hconst}(hjG6hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjC6ubj)}(h h]h }(hjT6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjC6ubjN)}(hjQh]hstruct}(hjb6hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjC6ubj)}(h h]h }(hjo6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjC6ubh)}(hhh]j))}(h i3c_ibi_setuph]h i3c_ibi_setup}(hj6hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj}6ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj6modnameN classnameNjj)}j]j5c.i3c_generic_ibi_alloc_poolasbuh1hhjC6ubj)}(h h]h }(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjC6ubj)}(hjh]h*}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjC6ubj))}(hreqh]hreq}(hj6hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjC6ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhj5ubeh}(h]h ]h"]h$]h&]hhuh1jAhjY5hhhjj5hM ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjU5hhhjj5hM ubah}(h]jP5ah ](jjeh"]h$]h&]jj)jhuh1hhjj5hM hjR5hhubj)}(hhh]j)}(hCreate a generic IBI poolh]hCreate a generic IBI pool}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj6hhubah}(h]h ]h"]h$]h&]uh1jhjR5hhhjj5hM ubeh}(h]h ](jfunctioneh"]h$]h&]j jj j6j j6j j juh1hhhhhhNhNubj)}(hX[**Parameters** ``struct i3c_dev_desc *dev`` the device this pool will be used for ``const struct i3c_ibi_setup *req`` IBI setup request describing what the device driver expects **Description** Create a generic IBI pool based on the information provided in **req**. **Return** a valid IBI pool in case of success, an ERR_PTR() otherwise.h](j)}(h**Parameters**h]j)}(hj7h]h Parameters}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj6ubj0)}(hhh](j5)}(hC``struct i3c_dev_desc *dev`` the device this pool will be used for h](j;)}(h``struct i3c_dev_desc *dev``h]jA)}(hj$7h]hstruct i3c_dev_desc *dev}(hj&7hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj"7ubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj7ubjW)}(hhh]j)}(h%the device this pool will be used forh]h%the device this pool will be used for}(hj=7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj97hM hj:7ubah}(h]h ]h"]h$]h&]uh1jVhj7ubeh}(h]h ]h"]h$]h&]uh1j4hj97hM hj7ubj5)}(h```const struct i3c_ibi_setup *req`` IBI setup request describing what the device driver expects h](j;)}(h#``const struct i3c_ibi_setup *req``h]jA)}(hj]7h]hconst struct i3c_ibi_setup *req}(hj_7hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj[7ubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjW7ubjW)}(hhh]j)}(h;IBI setup request describing what the device driver expectsh]h;IBI setup request describing what the device driver expects}(hjv7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjr7hM hjs7ubah}(h]h ]h"]h$]h&]uh1jVhjW7ubeh}(h]h ]h"]h$]h&]uh1j4hjr7hM hj7ubeh}(h]h ]h"]h$]h&]uh1j/hj6ubj)}(h**Description**h]j)}(hj7h]h Description}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj6ubj)}(hGCreate a generic IBI pool based on the information provided in **req**.h](h?Create a generic IBI pool based on the information provided in }(hj7hhhNhNubj)}(h**req**h]hreq}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubh.}(hj7hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj6ubj)}(h **Return**h]j)}(hj7h]hReturn}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj6ubj)}(h hjL9ubjW)}(hhh]j)}(h the pool to query an IBI slot onh]h the pool to query an IBI slot on}(hjk9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjg9hM> hjh9ubah}(h]h ]h"]h$]h&]uh1jVhjL9ubeh}(h]h ]h"]h$]h&]uh1j4hjg9hM> hjI9ubah}(h]h ]h"]h$]h&]uh1j/hj-9ubj)}(h**Description**h]j)}(hj9h]h Description}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM@ hj-9ubj)}(hSearch for a free slot in a generic IBI pool. The slot should be returned to the pool using i3c_generic_ibi_recycle_slot() when it's no longer needed.h]hSearch for a free slot in a generic IBI pool. The slot should be returned to the pool using i3c_generic_ibi_recycle_slot() when it’s no longer needed.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM? hj-9ubj)}(h **Return**h]j)}(hj9h]hReturn}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMC hj-9ubj)}(hDa pointer to a free slot, or NULL if there's no free slot available.h]hFa pointer to a free slot, or NULL if there’s no free slot available.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMD hj-9ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h)i3c_generic_ibi_recycle_slot (C function)c.i3c_generic_ibi_recycle_slothNtauh1hhhhhhNhNubh)}(hhh](h)}(h]void i3c_generic_ibi_recycle_slot (struct i3c_generic_ibi_pool *pool, struct i3c_ibi_slot *s)h]h)}(h\void i3c_generic_ibi_recycle_slot(struct i3c_generic_ibi_pool *pool, struct i3c_ibi_slot *s)h](j)}(hvoidh]hvoid}(hj9hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj9hhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMX ubj)}(h h]h }(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9hhhj:hMX ubj#)}(hi3c_generic_ibi_recycle_sloth]j))}(hi3c_generic_ibi_recycle_sloth]hi3c_generic_ibi_recycle_slot}(hj:hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj:ubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hj9hhhj:hMX ubjB)}(h;(struct i3c_generic_ibi_pool *pool, struct i3c_ibi_slot *s)h](jH)}(h!struct i3c_generic_ibi_pool *poolh](jN)}(hjQh]hstruct}(hj6:hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhj2:ubj)}(h h]h }(hjC:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2:ubh)}(hhh]j))}(hi3c_generic_ibi_poolh]hi3c_generic_ibi_pool}(hjT:hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjQ:ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjV:modnameN classnameNjj)}j]j)}jj:sbc.i3c_generic_ibi_recycle_slotasbuh1hhj2:ubj)}(h h]h }(hjt:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2:ubj)}(hjh]h*}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2:ubj))}(hpoolh]hpool}(hj:hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj2:ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhj.:ubjH)}(hstruct i3c_ibi_slot *sh](jN)}(hjQh]hstruct}(hj:hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhj:ubj)}(h h]h }(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubh)}(hhh]j))}(h i3c_ibi_sloth]h i3c_ibi_slot}(hj:hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj:ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj:modnameN classnameNjj)}j]jp:c.i3c_generic_ibi_recycle_slotasbuh1hhj:ubj)}(h h]h }(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj)}(hjh]h*}(hj:hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:ubj))}(hsh]hs}(hj:hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj:ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhj.:ubeh}(h]h ]h"]h$]h&]hhuh1jAhj9hhhj:hMX ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj9hhhj:hMX ubah}(h]j9ah ](jjeh"]h$]h&]jj)jhuh1hhj:hMX hj9hhubj)}(hhh]j)}(h#Return a slot to a generic IBI poolh]h#Return a slot to a generic IBI pool}(hj);hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMX hj&;hhubah}(h]h ]h"]h$]h&]uh1jhj9hhhj:hMX ubeh}(h]h ](jfunctioneh"]h$]h&]j jj jA;j jA;j j juh1hhhhhhNhNubj)}(hX(**Parameters** ``struct i3c_generic_ibi_pool *pool`` the pool to return the IBI slot to ``struct i3c_ibi_slot *s`` IBI slot to recycle **Description** Add an IBI slot back to its generic IBI pool. Should be called from the master driver struct_master_controller_ops->recycle_ibi() method.h](j)}(h**Parameters**h]j)}(hjK;h]h Parameters}(hjM;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjI;ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM\ hjE;ubj0)}(hhh](j5)}(hI``struct i3c_generic_ibi_pool *pool`` the pool to return the IBI slot to h](j;)}(h%``struct i3c_generic_ibi_pool *pool``h]jA)}(hjj;h]h!struct i3c_generic_ibi_pool *pool}(hjl;hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjh;ubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMY hjd;ubjW)}(hhh]j)}(h"the pool to return the IBI slot toh]h"the pool to return the IBI slot to}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;hMY hj;ubah}(h]h ]h"]h$]h&]uh1jVhjd;ubeh}(h]h ]h"]h$]h&]uh1j4hj;hMY hja;ubj5)}(h/``struct i3c_ibi_slot *s`` IBI slot to recycle h](j;)}(h``struct i3c_ibi_slot *s``h]jA)}(hj;h]hstruct i3c_ibi_slot *s}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj;ubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMZ hj;ubjW)}(hhh]j)}(hIBI slot to recycleh]hIBI slot to recycle}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;hMZ hj;ubah}(h]h ]h"]h$]h&]uh1jVhj;ubeh}(h]h ]h"]h$]h&]uh1j4hj;hMZ hja;ubeh}(h]h ]h"]h$]h&]uh1j/hjE;ubj)}(h**Description**h]j)}(hj;h]h Description}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubahm}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM\ hjE;ubj)}(hAdd an IBI slot back to its generic IBI pool. Should be called from the master driver struct_master_controller_ops->recycle_ibi() method.h]hAdd an IBI slot back to its generic IBI pool. Should be called from the master driver struct_master_controller_ops->recycle_ibi() method.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM[ hjE;ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h i3c_master_register (C function)c.i3c_master_registerhNtauh1hhhhhhNhNubh)}(hhh](h)}(hint i3c_master_register (struct i3c_master_controller *master, struct device *parent, const struct i3c_master_controller_ops *ops, bool secondary)h]h)}(hint i3c_master_register(struct i3c_master_controller *master, struct device *parent, const struct i3c_master_controller_ops *ops, bool secondary)h](j)}(hinth]hint}(hj#<hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj<hhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM~ ubj)}(h h]h }(hj2<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<hhhj1<hM~ ubj#)}(hi3c_master_registerh]j))}(hi3c_master_registerh]hi3c_master_register}(hjD<hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj@<ubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hj<hhhj1<hM~ ubjB)}(hz(struct i3c_master_controller *master, struct device *parent, const struct i3c_master_controller_ops *ops, bool secondary)h](jH)}(h$struct i3c_master_controller *masterh](jN)}(hjQh]hstruct}(hj`<hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhj\<ubj)}(h h]h }(hjm<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\<ubh)}(hhh]j))}(hi3c_master_controllerh]hi3c_master_controller}(hj~<hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj{<ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj<modnameN classnameNjj)}j]j)}jjF<sbc.i3c_master_registerasbuh1hhj\<ubj)}(h h]h }(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\<ubj)}(hjh]h*}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\<ubj))}(hmasterh]hmaster}(hj<hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj\<ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjX<ubjH)}(hstruct device *parenth](jN)}(hjQh]hstruct}(hj<hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhj<ubj)}(h h]h }(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubh)}(hhh]j))}(hdeviceh]hdevice}(hj<hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj<ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj<modnameN classnameNjj)}j]j<c.i3c_master_registerasbuh1hhj<ubj)}(h h]h }(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubj)}(hjh]h*}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubj))}(hparenth]hparent}(hj)=hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj<ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjX<ubjH)}(h+const struct i3c_master_controller_ops *opsh](jN)}(hj!#h]hconst}(hjB=hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhj>=ubj)}(h h]h }(hjO=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>=ubjN)}(hjQh]hstruct}(hj]=hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhj>=ubj)}(h h]h }(hjj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>=ubh)}(hhh]j))}(hi3c_master_controller_opsh]hi3c_master_controller_ops}(hj{=hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjx=ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj}=modnameN classnameNjj)}j]j<c.i3c_master_registerasbuh1hhj>=ubj)}(h h]h }(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>=ubj)}(hjh]h*}(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj>=ubj))}(hopsh]hops}(hj=hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj>=ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjX<ubjH)}(hbool secondaryh](j)}(hjh]hbool}(hj=hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj=ubj)}(h h]h }(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj=ubj))}(h secondaryh]h secondary}(hj=hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj=ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjX<ubeh}(h]h ]h"]h$]h&]hhuh1jAhj<hhhj1<hM~ ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj<hhhj1<hM~ ubah}(h]j<ah ](jjeh"]h$]h&]jj)jhuh1hhj1<hM~ hj<hhubj)}(hhh]j)}(hregister an I3C masterh]hregister an I3C master}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM~ hj>hhubah}(h]h ]h"]h$]h&]uh1jhj<hhhj1<hM~ ubeh}(h]h ](jfunctioneh"]h$]h&]j jj j*>j j*>j j juh1hhhhhhNhNubj)}(hX2**Parameters** ``struct i3c_master_controller *master`` master used to send frames on the bus ``struct device *parent`` the parent device (the one that provides this I3C master controller) ``const struct i3c_master_controller_ops *ops`` the master controller operations ``bool secondary`` true if you are registering a secondary master. Will return -EOPNOTSUPP if set to true since secondary masters are not yet supported **Description** This function takes care of everything for you: - creates and initializes the I3C bus - populates the bus with static I2C devs if **parent->of_node** is not NULL - registers all I3C devices added by the controller during bus initialization - registers the I2C adapter and all I2C devices **Return** 0 in case of success, a negative error code otherwise.h](j)}(h**Parameters**h]j)}(hj4>h]h Parameters}(hj6>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2>ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj.>ubj0)}(hhh](j5)}(hO``struct i3c_master_controller *master`` master used to send frames on the bus h](j;)}(h(``struct i3c_master_controller *master``h]jA)}(hjS>h]h$struct i3c_master_controller *master}(hjU>hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjQ>ubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjM>ubjW)}(hhh]j)}(h%master used to send frames on the bush]h%master used to send frames on the bus}(hjl>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjh>hM hji>ubah}(h]h ]h"]h$]h&]uh1jVhjM>ubeh}(h]h ]h"]h$]h&]uh1j4hjh>hM hjJ>ubj5)}(h_``struct device *parent`` the parent device (the one that provides this I3C master controller) h](j;)}(h``struct device *parent``h]jA)}(hj>h]hstruct device *parent}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj>ubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj>ubjW)}(hhh]j)}(hDthe parent device (the one that provides this I3C master controller)h]hDthe parent device (the one that provides this I3C master controller)}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj>ubah}(h]h ]h"]h$]h&]uh1jVhj>ubeh}(h]h ]h"]h$]h&]uh1j4hj>hM hjJ>ubj5)}(hQ``const struct i3c_master_controller_ops *ops`` the master controller operations h](j;)}(h/``const struct i3c_master_controller_ops *ops``h]jA)}(hj>h]h+const struct i3c_master_controller_ops *ops}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj>ubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj>ubjW)}(hhh]j)}(h the master controller operationsh]h the master controller operations}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>hM hj>ubah}(h]h ]h"]h$]h&]uh1jVhj>ubeh}(h]h ]h"]h$]h&]uh1j4hj>hM hjJ>ubj5)}(h``bool secondary`` true if you are registering a secondary master. Will return -EOPNOTSUPP if set to true since secondary masters are not yet supported h](j;)}(h``bool secondary``h]jA)}(hj>h]hbool secondary}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj>ubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj>ubjW)}(hhh]j)}(htrue if you are registering a secondary master. Will return -EOPNOTSUPP if set to true since secondary masters are not yet supportedh]htrue if you are registering a secondary master. Will return -EOPNOTSUPP if set to true since secondary masters are not yet supported}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj?ubah}(h]h ]h"]h$]h&]uh1jVhj>ubeh}(h]h ]h"]h$]h&]uh1j4hj?hM hjJ>ubeh}(h]h ]h"]h$]h&]uh1j/hj.>ubj)}(h**Description**h]j)}(hj;?h]h Description}(hj=?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9?ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj.>ubj)}(h/This function takes care of everything for you:h]h/This function takes care of everything for you:}(hjQ?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj.>ubj$)}(hhh](j$)}(h#creates and initializes the I3C bush]j)}(hje?h]h#creates and initializes the I3C bus}(hjg?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjc?ubah}(h]h ]h"]h$]h&]uh1j$hj`?ubj$)}(hIpopulates the bus with static I2C devs if **parent->of_node** is not NULLh]j)}(hIpopulates the bus with static I2C devs if **parent->of_node** is not NULLh](h*populates the bus with static I2C devs if }(hj?hhhNhNubj)}(h**parent->of_node**h]hparent->of_node}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubh is not NULL}(hj?hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj{?ubah}(h]h ]h"]h$]h&]uh1j$hj`?ubj$)}(hKregisters all I3C devices added by the controller during bus initializationh]j)}(hKregisters all I3C devices added by the controller during bus initializationh]hKregisters all I3C devices added by the controller during bus initialization}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj?ubah}(h]h ]h"]h$]h&]uh1j$hj`?ubj$)}(h.registers the I2C adapter and all I2C devices h]j)}(h-registers the I2C adapter and all I2C devicesh]h-registers the I2C adapter and all I2C devices}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj?ubah}(h]h ]h"]h$]h&]uh1j$hj`?ubeh}(h]h ]h"]h$]h&]j)&j*&uh1j$hjt?hM hj.>ubj)}(h **Return**h]j)}(hj?h]hReturn}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj.>ubj)}(h60 in case of success, a negative error code otherwise.h]h60 in case of success, a negative error code otherwise.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj.>ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h"i3c_master_unregister (C function)c.i3c_master_unregisterhNtauh1hhhhhhNhNubh)}(hhh](h)}(hAvoid i3c_master_unregister (struct i3c_master_controller *master)h]h)}(h@void i3c_master_unregister(struct i3c_master_controller *master)h](j)}(hvoidh]hvoid}(hj%@hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj!@hhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM ubj)}(h h]h }(hj4@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!@hhhj3@hM ubj#)}(hi3c_master_unregisterh]j))}(hi3c_master_unregisterh]hi3c_master_unregister}(hjF@hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjB@ubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hj!@hhhj3@hM ubjB)}(h&(struct i3c_master_controller *master)h]jH)}(h$struct i3c_master_controller *masterh](jN)}(hjQh]hstruct}(hjb@hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhj^@ubj)}(h h]h }(hjo@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^@ubh)}(hhh]j))}(hi3c_master_controllerh]hi3c_master_controller}(hj@hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj}@ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj@modnameN classnameNjj)}j]j)}jjH@sbc.i3c_master_unregisterasbuh1hhj^@ubj)}(h h]h }(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^@ubj)}(hjh]h*}(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^@ubj))}(hmasterh]hmaster}(hj@hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj^@ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjZ@ubah}(h]h ]h"]h$]h&]hhuh1jAhj!@hhhj3@hM ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj@hhhj3@hM ubah}(h]j@ah ](jjeh"]h$]h&]jj)jhuh1hhj3@hM hj@hhubj)}(hhh]j)}(hunregister an I3C masterh]hunregister an I3C master}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj@hhubah}(h]h ]h"]h$]h&]uh1jhj@hhhj3@hM ubeh}(h]h ](jfunctioneh"]h$]h&]j jj j@j j@j j juh1hhhhhhNhNubj)}(h**Parameters** ``struct i3c_master_controller *master`` master used to send frames on the bus **Description** Basically undo everything done in i3c_master_register().h](j)}(h**Parameters**h]j)}(hjAh]h Parameters}(hj AhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM" hjAubj0)}(hhh]j5)}(hO``struct i3c_master_controller *master`` master used to send frames on the bus h](j;)}(h(``struct i3c_master_controller *master``h]jA)}(hj&Ah]h$struct i3c_master_controller *master}(hj(AhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj$Aubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj AubjW)}(hhh]j)}(h%master used to send frames on the bush]h%master used to send frames on the bus}(hj?AhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;AhM hjdesc `->ibi_lock) held. **Return** 0 in case of success, a negative error core otherwise.h](j)}(h**Parameters**h]j)}(hjBh]h Parameters}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM] hjBubj0)}(hhh]j5)}(hE``struct i3c_dev_desc *dev`` device on which IBIs should be disabled h](j;)}(h``struct i3c_dev_desc *dev``h]jA)}(hjBh]hstruct i3c_dev_desc *dev}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjBubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMZ hjBubjW)}(hhh]j)}(h'device on which IBIs should be disabledh]h'device on which IBIs should be disabled}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBhMZ hjBubah}(h]h ]h"]h$]h&]uh1jVhjBubeh}(h]h ]h"]h$]h&]uh1j4hjBhMZ hjBubah}(h]h ]h"]h$]h&]uh1j/hjBubj)}(h**Description**h]j)}(hjBh]h Description}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM\ hjBubj)}(hgThis function disable IBIs coming from a specific device and wait for all pending IBIs to be processed.h]hgThis function disable IBIs coming from a specific device and wait for all pending IBIs to be processed.}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM[ hjBubj)}(h **Context**h]j)}(hj Ch]hContext}(hj ChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM^ hjBubj)}(hIMust be called with mutex_lock(:c:type:`dev->desc `->ibi_lock) held.h](hMust be called with mutex_lock(}(hjChhhNhNubh)}(h:c:type:`dev->desc `h]jA)}(hj)Ch]h dev->desc}(hj+ChhhNhNubah}(h]h ](jUjc-typeeh"]h$]h&]uh1j@hj'Cubah}(h]h ]h"]h$]h&]refdocja refdomainjreftypetype refexplicitrefwarnjjgjjdevuh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM_ hjCubh->ibi_lock) held.}(hjChhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjFChM_ hjBubj)}(h **Return**h]j)}(hjSCh]hReturn}(hjUChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQCubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMa hjBubj)}(h60 in case of success, a negative error core otherwise.h]h60 in case of success, a negative error core otherwise.}(hjiChhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM` hjBubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h&i3c_dev_enable_ibi_locked (C function)c.i3c_dev_enable_ibi_lockedhNtauh1hhhhhhNhNubh)}(hhh](h)}(h8int i3c_dev_enable_ibi_locked (struct i3c_dev_desc *dev)h]h)}(h7int i3c_dev_enable_ibi_locked(struct i3c_dev_desc *dev)h](j)}(hinth]hint}(hjChhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjChhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMz ubj)}(h h]h }(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjChhhjChMz ubj#)}(hi3c_dev_enable_ibi_lockedh]j))}(hi3c_dev_enable_ibi_lockedh]hi3c_dev_enable_ibi_locked}(hjChhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjCubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hjChhhjChMz ubjB)}(h(struct i3c_dev_desc *dev)h]jH)}(hstruct i3c_dev_desc *devh](jN)}(hjQh]hstruct}(hjChhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjCubj)}(h h]h }(hjChhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubh)}(hhh]j))}(h i3c_dev_desch]h i3c_dev_desc}(hjChhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjCubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjCmodnameN classnameNjj)}j]j)}jjCsbc.i3c_dev_enable_ibi_lockedasbuh1hhjCubj)}(h h]h }(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj)}(hjh]h*}(hj!DhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj))}(hdevh]hdev}(hj.DhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjCubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjCubah}(h]h ]h"]h$]h&]hhuh1jAhjChhhjChMz ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjChhhjChMz ubah}(h]jCah ](jjeh"]h$]h&]jj)jhuh1hhjChMz hjChhubj)}(hhh]j)}(h.Enable IBIs from a specific device (lock held)h]h.Enable IBIs from a specific device (lock held)}(hjXDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMz hjUDhhubah}(h]h ]h"]h$]h&]uh1jhjChhhjChMz ubeh}(h]h ](jfunctioneh"]h$]h&]j jj jpDj jpDj j juh1hhhhhhNhNubj)}(hX**Parameters** ``struct i3c_dev_desc *dev`` device on which IBIs should be enabled **Description** This function enable IBIs coming from a specific device and wait for all pending IBIs to be processed. This should be called on a device where i3c_device_request_ibi() has succeeded. Note that IBIs from this device might be received before this function returns to its caller. **Context** Must be called with mutex_lock(:c:type:`dev->desc `->ibi_lock) held. **Return** 0 on success, or a negative error code on failure.h](j)}(h**Parameters**h]j)}(hjzDh]h Parameters}(hj|DhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxDubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM~ hjtDubj0)}(hhh]j5)}(hD``struct i3c_dev_desc *dev`` device on which IBIs should be enabled h](j;)}(h``struct i3c_dev_desc *dev``h]jA)}(hjDh]hstruct i3c_dev_desc *dev}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjDubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM{ hjDubjW)}(hhh]j)}(h&device on which IBIs should be enabledh]h&device on which IBIs should be enabled}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDhM{ hjDubah}(h]h ]h"]h$]h&]uh1jVhjDubeh}(h]h ]h"]h$]h&]uh1j4hjDhM{ hjDubah}(h]h ]h"]h$]h&]uh1j/hjtDubj)}(h**Description**h]j)}(hjDh]h Description}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM} hjtDubj)}(hThis function enable IBIs coming from a specific device and wait for all pending IBIs to be processed. This should be called on a device where i3c_device_request_ibi() has succeeded.h]hThis function enable IBIs coming from a specific device and wait for all pending IBIs to be processed. This should be called on a device where i3c_device_request_ibi() has succeeded.}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM| hjtDubj)}(h]Note that IBIs from this device might be received before this function returns to its caller.h]h]Note that IBIs from this device might be received before this function returns to its caller.}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjtDubj)}(h **Context**h]j)}(hj Eh]hContext}(hj EhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjtDubj)}(hIMust be called with mutex_lock(:c:type:`dev->desc `->ibi_lock) held.h](hMust be called with mutex_lock(}(hj EhhhNhNubh)}(h:c:type:`dev->desc `h]jA)}(hj*Eh]h dev->desc}(hj,EhhhNhNubah}(h]h ](jUjc-typeeh"]h$]h&]uh1j@hj(Eubah}(h]h ]h"]h$]h&]refdocja refdomainjreftypetype refexplicitrefwarnjjgjjdevuh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj Eubh->ibi_lock) held.}(hj EhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjGEhM hjtDubj)}(h **Return**h]j)}(hjTEh]hReturn}(hjVEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjREubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjtDubj)}(h20 on success, or a negative error code on failure.h]h20 on success, or a negative error code on failure.}(hjjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjtDubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h'i3c_dev_request_ibi_locked (C function)c.i3c_dev_request_ibi_lockedhNtauh1hhhhhhNhNubh)}(hhh](h)}(hZint i3c_dev_request_ibi_locked (struct i3c_dev_desc *dev, const struct i3c_ibi_setup *req)h]h)}(hYint i3c_dev_request_ibi_locked(struct i3c_dev_desc *dev, const struct i3c_ibi_setup *req)h](j)}(hinth]hint}(hjEhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjEhhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM ubj)}(h h]h }(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEhhhjEhM ubj#)}(hi3c_dev_request_ibi_lockedh]j))}(hi3c_dev_request_ibi_lockedh]hi3c_dev_request_ibi_locked}(hjEhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjEubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hjEhhhjEhM ubjB)}(h;(struct i3c_dev_desc *dev, const struct i3c_ibi_setup *req)h](jH)}(hstruct i3c_dev_desc *devh](jN)}(hjQh]hstruct}(hjEhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjEubj)}(h h]h }(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubh)}(hhh]j))}(h i3c_dev_desch]h i3c_dev_desc}(hjEhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjEubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjEmodnameN classnameNjj)}j]j)}jjEsbc.i3c_dev_request_ibi_lockedasbuh1hhjEubj)}(h h]h }(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubj)}(hjh]h*}(hj"FhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjEubj))}(hdevh]hdev}(hj/FhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjEubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjEubjH)}(hconst struct i3c_ibi_setup *reqh](jN)}(hj!#h]hconst}(hjHFhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjDFubj)}(h h]h }(hjUFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDFubjN)}(hjQh]hstruct}(hjcFhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjDFubj)}(h h]h }(hjpFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDFubh)}(hhh]j))}(h i3c_ibi_setuph]h i3c_ibi_setup}(hjFhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj~Fubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjFmodnameN classnameNjj)}j]jFc.i3c_dev_request_ibi_lockedasbuh1hhjDFubj)}(h h]h }(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDFubj)}(hjh]h*}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDFubj))}(hreqh]hreq}(hjFhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjDFubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjEubeh}(h]h ]h"]h$]h&]hhuh1jAhjEhhhjEhM ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjEhhhjEhM ubah}(h]jEah ](jjeh"]h$]h&]jj)jhuh1hhjEhM hjEhhubj)}(hhh]j)}(hRequest an IBIh]hRequest an IBI}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjFhhubah}(h]h ]h"]h$]h&]uh1jhjEhhhjEhM ubeh}(h]h ](jfunctioneh"]h$]h&]j jj jFj jFj j juh1hhhhhhNhNubj)}(hX **Parameters** ``struct i3c_dev_desc *dev`` device for which we should enable IBIs ``const struct i3c_ibi_setup *req`` setup requested for this IBI **Description** This function is responsible for pre-allocating all resources needed to process IBIs coming from **dev**. When this function returns, the IBI is not enabled until i3c_device_enable_ibi() is called. **Context** Must be called with mutex_lock(:c:type:`dev->desc `->ibi_lock) held. **Return** 0 in case of success, a negative error core otherwise.h](j)}(h**Parameters**h]j)}(hjGh]h Parameters}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjGubj0)}(hhh](j5)}(hD``struct i3c_dev_desc *dev`` device for which we should enable IBIs h](j;)}(h``struct i3c_dev_desc *dev``h]jA)}(hj%Gh]hstruct i3c_dev_desc *dev}(hj'GhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj#Gubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjGubjW)}(hhh]j)}(h&device for which we should enable IBIsh]h&device for which we should enable IBIs}(hj>GhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:GhM hj;Gubah}(h]h ]h"]h$]h&]uh1jVhjGubeh}(h]h ]h"]h$]h&]uh1j4hj:GhM hjGubj5)}(hA``const struct i3c_ibi_setup *req`` setup requested for this IBI h](j;)}(h#``const struct i3c_ibi_setup *req``h]jA)}(hj^Gh]hconst struct i3c_ibi_setup *req}(hj`GhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj\Gubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjXGubjW)}(hhh]j)}(hsetup requested for this IBIh]hsetup requested for this IBI}(hjwGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjsGhM hjtGubah}(h]h ]h"]h$]h&]uh1jVhjXGubeh}(h]h ]h"]h$]h&]uh1j4hjsGhM hjGubeh}(h]h ]h"]h$]h&]uh1j/hjGubj)}(h**Description**h]j)}(hjGh]h Description}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjGubj)}(hThis function is responsible for pre-allocating all resources needed to process IBIs coming from **dev**. When this function returns, the IBI is not enabled until i3c_device_enable_ibi() is called.h](haThis function is responsible for pre-allocating all resources needed to process IBIs coming from }(hjGhhhNhNubj)}(h**dev**h]hdev}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubh]. When this function returns, the IBI is not enabled until i3c_device_enable_ibi() is called.}(hjGhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjGubj)}(h **Context**h]j)}(hjGh]hContext}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjGubj)}(hIMust be called with mutex_lock(:c:type:`dev->desc `->ibi_lock) held.h](hMust be called with mutex_lock(}(hjGhhhNhNubh)}(h:c:type:`dev->desc `h]jA)}(hjGh]h dev->desc}(hjGhhhNhNubah}(h]h ](jUjc-typeeh"]h$]h&]uh1j@hjGubah}(h]h ]h"]h$]h&]refdocja refdomainjreftypetype refexplicitrefwarnjjgjjdevuh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjGubh->ibi_lock) held.}(hjGhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjHhM hjGubj)}(h **Return**h]j)}(hjHh]hReturn}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjGubj)}(h60 in case of success, a negative error core otherwise.h]h60 in case of success, a negative error core otherwise.}(hj2HhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjGubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h$i3c_dev_free_ibi_locked (C function)c.i3c_dev_free_ibi_lockedhNtauh1hhhhhhNhNubh)}(hhh](h)}(h7void i3c_dev_free_ibi_locked (struct i3c_dev_desc *dev)h]h)}(h6void i3c_dev_free_ibi_locked(struct i3c_dev_desc *dev)h](j)}(hvoidh]hvoid}(hjaHhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj]Hhhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM ubj)}(h h]h }(hjpHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]HhhhjoHhM ubj#)}(hi3c_dev_free_ibi_lockedh]j))}(hi3c_dev_free_ibi_lockedh]hi3c_dev_free_ibi_locked}(hjHhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj~Hubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hj]HhhhjoHhM ubjB)}(h(struct i3c_dev_desc *dev)h]jH)}(hstruct i3c_dev_desc *devh](jN)}(hjQh]hstruct}(hjHhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjHubj)}(h h]h }(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubh)}(hhh]j))}(h i3c_dev_desch]h i3c_dev_desc}(hjHhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjHubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjHmodnameN classnameNjj)}j]j)}jjHsbc.i3c_dev_free_ibi_lockedasbuh1hhjHubj)}(h h]h }(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubj)}(hjh]h*}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjHubj))}(hdevh]hdev}(hjHhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjHubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjHubah}(h]h ]h"]h$]h&]hhuh1jAhj]HhhhjoHhM ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjYHhhhjoHhM ubah}(h]jTHah ](jjeh"]h$]h&]jj)jhuh1hhjoHhM hjVHhhubj)}(hhh]j)}(h*Free all resources needed for IBI handlingh]h*Free all resources needed for IBI handling}(hj!IhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjIhhubah}(h]h ]h"]h$]h&]uh1jhjVHhhhjoHhM ubeh}(h]h ](jfunctioneh"]h$]h&]j jj j9Ij j9Ij j juh1hhhhhhNhNubj)}(hX}**Parameters** ``struct i3c_dev_desc *dev`` device on which you want to release IBI resources **Description** This function is responsible for de-allocating resources previously allocated by i3c_device_request_ibi(). It should be called after disabling IBIs with i3c_device_disable_ibi(). **Context** Must be called with mutex_lock(:c:type:`dev->desc `->ibi_lock) held.h](j)}(h**Parameters**h]j)}(hjCIh]h Parameters}(hjEIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAIubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj=Iubj0)}(hhh]j5)}(hO``struct i3c_dev_desc *dev`` device on which you want to release IBI resources h](j;)}(h``struct i3c_dev_desc *dev``h]jA)}(hjbIh]hstruct i3c_dev_desc *dev}(hjdIhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj`Iubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj\IubjW)}(hhh]j)}(h1device on which you want to release IBI resourcesh]h1device on which you want to release IBI resources}(hj{IhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwIhM hjxIubah}(h]h ]h"]h$]h&]uh1jVhj\Iubeh}(h]h ]h"]h$]h&]uh1j4hjwIhM hjYIubah}(h]h ]h"]h$]h&]uh1j/hj=Iubj)}(h**Description**h]j)}(hjIh]h Description}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj=Iubj)}(hThis function is responsible for de-allocating resources previously allocated by i3c_device_request_ibi(). It should be called after disabling IBIs with i3c_device_disable_ibi().h]hThis function is responsible for de-allocating resources previously allocated by i3c_device_request_ibi(). It should be called after disabling IBIs with i3c_device_disable_ibi().}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj=Iubj)}(h **Context**h]j)}(hjIh]hContext}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj=Iubj)}(hIMust be called with mutex_lock(:c:type:`dev->desc `->ibi_lock) held.h](hMust be called with mutex_lock(}(hjIhhhNhNubh)}(h:c:type:`dev->desc `h]jA)}(hjIh]h dev->desc}(hjIhhhNhNubah}(h]h ](jUjc-typeeh"]h$]h&]uh1j@hjIubah}(h]h ]h"]h$]h&]refdocja refdomainjreftypetype refexplicitrefwarnjjgjjdevuh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjIubh->ibi_lock) held.}(hjIhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjJhM hj=Iubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hi3c_i2c_dev_desc (C struct)c.i3c_i2c_dev_deschNtauh1hhhhhhNhNubh)}(hhh](h)}(hi3c_i2c_dev_desch]h)}(hstruct i3c_i2c_dev_desch](jN)}(hjQh]hstruct}(hj,JhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhj(Jhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKubj)}(h h]h }(hj:JhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(Jhhhj9JhKubj#)}(hi3c_i2c_dev_desch]j))}(hj&Jh]hi3c_i2c_dev_desc}(hjLJhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjHJubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hj(Jhhhj9JhKubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj$Jhhhj9JhKubah}(h]jJah ](jjeh"]h$]h&]jj)jhuh1hhj9JhKhj!Jhhubj)}(hhh]j)}(h,Common part of the I3C/I2C device descriptorh]h,Common part of the I3C/I2C device descriptor}(hjnJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK'hjkJhhubah}(h]h ]h"]h$]h&]uh1jhj!Jhhhj9JhKubeh}(h]h ](jstructeh"]h$]h&]j jj jJj jJj j juh1hhhhhhNhNubj)}(hX**Definition**:: struct i3c_i2c_dev_desc { struct list_head node; struct i3c_master_controller *master; void *master_priv; }; **Members** ``node`` node element used to insert the slot into the I2C or I3C device list ``master`` I3C master that instantiated this device. Will be used to do I2C/I3C transfers ``master_priv`` master private data assigned to the device. Can be used to add master specific informationh](j)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubh:}(hjJhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK+hjJubh literal_block)}(hxstruct i3c_i2c_dev_desc { struct list_head node; struct i3c_master_controller *master; void *master_priv; };h]hxstruct i3c_i2c_dev_desc { struct list_head node; struct i3c_master_controller *master; void *master_priv; };}hjJsbah}(h]h ]h"]h$]h&]hhuh1jJhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK-hjJubj)}(h **Members**h]j)}(hjJh]hMembers}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK3hjJubj0)}(hhh](j5)}(hN``node`` node element used to insert the slot into the I2C or I3C device list h](j;)}(h``node``h]jA)}(hjJh]hnode}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjJubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK*hjJubjW)}(hhh]j)}(hDnode element used to insert the slot into the I2C or I3C device listh]hDnode element used to insert the slot into the I2C or I3C device list}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK)hjJubah}(h]h ]h"]h$]h&]uh1jVhjJubeh}(h]h ]h"]h$]h&]uh1j4hjJhK*hjJubj5)}(hZ``master`` I3C master that instantiated this device. Will be used to do I2C/I3C transfers h](j;)}(h ``master``h]jA)}(hjKh]hmaster}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjKubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK,hjKubjW)}(hhh]j)}(hNI3C master that instantiated this device. Will be used to do I2C/I3C transfersh]hNI3C master that instantiated this device. Will be used to do I2C/I3C transfers}(hj0KhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK+hj-Kubah}(h]h ]h"]h$]h&]uh1jVhjKubeh}(h]h ]h"]h$]h&]uh1j4hj,KhK,hjJubj5)}(hj``master_priv`` master private data assigned to the device. Can be used to add master specific informationh](j;)}(h``master_priv``h]jA)}(hjQKh]h master_priv}(hjSKhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjOKubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK-hjKKubjW)}(hhh]j)}(hZmaster private data assigned to the device. Can be used to add master specific informationh]hZmaster private data assigned to the device. Can be used to add master specific information}(hjjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfKhK-hjgKubah}(h]h ]h"]h$]h&]uh1jVhjKKubeh}(h]h ]h"]h$]h&]uh1j4hjfKhK-hjJubeh}(h]h ]h"]h$]h&]uh1j/hjJubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hjKh]h Description}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK1hhhhubj)}(hhjLhhubah}(h]h ]h"]h$]h&]uh1jhjKhhhjKhK3ubeh}(h]h ](jstructeh"]h$]h&]j jj j+Lj j+Lj j juh1hhhhhhNhNubj)}(hXl**Definition**:: struct i2c_dev_boardinfo { struct list_head node; struct i2c_board_info base; u8 lvr; }; **Members** ``node`` used to insert the boardinfo object in the I2C boardinfo list ``base`` regular I2C board information ``lvr`` LVR (Legacy Virtual Register) needed by the I3C core to know about the I2C device limitationsh](j)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hj7LhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3Lubh:}(hj3LhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKBhj/LubjJ)}(hdstruct i2c_dev_boardinfo { struct list_head node; struct i2c_board_info base; u8 lvr; };h]hdstruct i2c_dev_boardinfo { struct list_head node; struct i2c_board_info base; u8 lvr; };}hjPLsbah}(h]h ]h"]h$]h&]hhuh1jJhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKDhj/Lubj)}(h **Members**h]j)}(hjaLh]hMembers}(hjcLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_Lubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKJhj/Lubj0)}(hhh](j5)}(hG``node`` used to insert the boardinfo object in the I2C boardinfo list h](j;)}(h``node``h]jA)}(hjLh]hnode}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj~Lubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK@hjzLubjW)}(hhh]j)}(h=used to insert the boardinfo object in the I2C boardinfo listh]h=used to insert the boardinfo object in the I2C boardinfo list}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLhK@hjLubah}(h]h ]h"]h$]h&]uh1jVhjzLubeh}(h]h ]h"]h$]h&]uh1j4hjLhK@hjwLubj5)}(h'``base`` regular I2C board information h](j;)}(h``base``h]jA)}(hjLh]hbase}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjLubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKAhjLubjW)}(hhh]j)}(hregular I2C board informationh]hregular I2C board information}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLhKAhjLubah}(h]h ]h"]h$]h&]uh1jVhjLubeh}(h]h ]h"]h$]h&]uh1j4hjLhKAhjwLubj5)}(he``lvr`` LVR (Legacy Virtual Register) needed by the I3C core to know about the I2C device limitationsh](j;)}(h``lvr``h]jA)}(hjLh]hlvr}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjLubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKBhjLubjW)}(hhh]j)}(h]LVR (Legacy Virtual Register) needed by the I3C core to know about the I2C device limitationsh]h]LVR (Legacy Virtual Register) needed by the I3C core to know about the I2C device limitations}(hj MhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMhKBhjMubah}(h]h ]h"]h$]h&]uh1jVhjLubeh}(h]h ]h"]h$]h&]uh1j4hjMhKBhjwLubeh}(h]h ]h"]h$]h&]uh1j/hj/Lubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hj4Mh]h Description}(hj6MhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2Mubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKFhhhhubj)}(hThis structure is used to attach board-level information to an I2C device. Each I2C device connected on the I3C bus should have one.h]hThis structure is used to attach board-level information to an I2C device. Each I2C device connected on the I3C bus should have one.}(hjJMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKChhhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hi2c_dev_desc (C struct)c.i2c_dev_deschNtauh1hhhhhhNhNubh)}(hhh](h)}(h i2c_dev_desch]h)}(hstruct i2c_dev_desch](jN)}(hjQh]hstruct}(hjrMhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjnMhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKIubj)}(h h]h }(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjnMhhhjMhKIubj#)}(h i2c_dev_desch]j))}(hjlMh]h i2c_dev_desc}(hjMhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjMubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hjnMhhhjMhKIubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjjMhhhjMhKIubah}(h]jeMah ](jjeh"]h$]h&]jj)jhuh1hhjMhKIhjgMhhubj)}(hhh]j)}(hI2C device descriptorh]hI2C device descriptor}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKNhjMhhubah}(h]h ]h"]h$]h&]uh1jhjgMhhhjMhKIubeh}(h]h ](jstructeh"]h$]h&]j jj jMj jMj j juh1hhhhhhNhNubj)}(hX**Definition**:: struct i2c_dev_desc { struct i3c_i2c_dev_desc common; struct i2c_client *dev; u16 addr; u8 lvr; }; **Members** ``common`` common part of the I2C device descriptor ``dev`` I2C device object registered to the I2C framework ``addr`` I2C device address ``lvr`` LVR (Legacy Virtual Register) needed by the I3C core to know about the I2C device limitationsh](j)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubh:}(hjMhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKRhjMubjJ)}(hrstruct i2c_dev_desc { struct i3c_i2c_dev_desc common; struct i2c_client *dev; u16 addr; u8 lvr; };h]hrstruct i2c_dev_desc { struct i3c_i2c_dev_desc common; struct i2c_client *dev; u16 addr; u8 lvr; };}hjMsbah}(h]h ]h"]h$]h&]hhuh1jJhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKThjMubj)}(h **Members**h]j)}(hjNh]hMembers}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK[hjMubj0)}(hhh](j5)}(h4``common`` common part of the I2C device descriptor h](j;)}(h ``common``h]jA)}(hj!Nh]hcommon}(hj#NhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjNubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKPhjNubjW)}(hhh]j)}(h(common part of the I2C device descriptorh]h(common part of the I2C device descriptor}(hj:NhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6NhKPhj7Nubah}(h]h ]h"]h$]h&]uh1jVhjNubeh}(h]h ]h"]h$]h&]uh1j4hj6NhKPhjNubj5)}(h:``dev`` I2C device object registered to the I2C framework h](j;)}(h``dev``h]jA)}(hjZNh]hdev}(hj\NhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjXNubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKQhjTNubjW)}(hhh]j)}(h1I2C device object registered to the I2C frameworkh]h1I2C device object registered to the I2C framework}(hjsNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoNhKQhjpNubah}(h]h ]h"]h$]h&]uh1jVhjTNubeh}(h]h ]h"]h$]h&]uh1j4hjoNhKQhjNubj5)}(h``addr`` I2C device address h](j;)}(h``addr``h]jA)}(hjNh]haddr}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjNubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKRhjNubjW)}(hhh]j)}(hI2C device addressh]hI2C device address}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNhKRhjNubah}(h]h ]h"]h$]h&]uh1jVhjNubeh}(h]h ]h"]h$]h&]uh1j4hjNhKRhjNubj5)}(he``lvr`` LVR (Legacy Virtual Register) needed by the I3C core to know about the I2C device limitationsh](j;)}(h``lvr``h]jA)}(hjNh]hlvr}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjNubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKShjNubjW)}(hhh]j)}(h]LVR (Legacy Virtual Register) needed by the I3C core to know about the I2C device limitationsh]h]LVR (Legacy Virtual Register) needed by the I3C core to know about the I2C device limitations}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNhKShjNubah}(h]h ]h"]h$]h&]uh1jVhjNubeh}(h]h ]h"]h$]h&]uh1j4hjNhKShjNubeh}(h]h ]h"]h$]h&]uh1j/hjMubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hjOh]h Description}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Oubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKWhhhhubj)}(hEach I2C device connected on the bus will have an i2c_dev_desc. This object is created by the core and later attached to the controller using :c:type:`struct_i3c_master_controller->ops `->attach_i2c_dev().h](hEach I2C device connected on the bus will have an i2c_dev_desc. This object is created by the core and later attached to the controller using }(hj$OhhhNhNubh)}(hJ:c:type:`struct_i3c_master_controller->ops `h]jA)}(hj.Oh]h!struct_i3c_master_controller->ops}(hj0OhhhNhNubah}(h]h ](jUjc-typeeh"]h$]h&]uh1j@hj,Oubah}(h]h ]h"]h$]h&]refdocja refdomainjreftypetype refexplicitrefwarnjjgjjstruct_i3c_master_controlleruh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKThj$Oubh->attach_i2c_dev().}(hj$OhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjKOhKThhhhubj)}(h:c:type:`struct_i2c_dev_desc <_i2c_dev_desc>` is the internal representation of an I2C device connected on an I3C bus. This object is also passed to all :c:type:`struct_i3c_master_controller_ops <_i3c_master_controller_ops>` hooks.h](h)}(h-:c:type:`struct_i2c_dev_desc <_i2c_dev_desc>`h]jA)}(hj\Oh]hstruct_i2c_dev_desc}(hj^OhhhNhNubah}(h]h ](jUjc-typeeh"]h$]h&]uh1j@hjZOubah}(h]h ]h"]h$]h&]refdocja refdomainjreftypetype refexplicitrefwarnjjgjj _i2c_dev_descuh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKXhjVOubhl is the internal representation of an I2C device connected on an I3C bus. This object is also passed to all }(hjVOhhhNhNubh)}(hG:c:type:`struct_i3c_master_controller_ops <_i3c_master_controller_ops>`h]jA)}(hjOh]h struct_i3c_master_controller_ops}(hjOhhhNhNubah}(h]h ](jUjc-typeeh"]h$]h&]uh1j@hj~Oubah}(h]h ]h"]h$]h&]refdocja refdomainjreftypetype refexplicitrefwarnjjgjj_i3c_master_controller_opsuh1hhjyOhKXhjVOubh hooks.}(hjVOhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjyOhKXhhhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hi3c_ibi_slot (C struct)c.i3c_ibi_slothNtauh1hhhhhhNhNubh)}(hhh](h)}(h i3c_ibi_sloth]h)}(hstruct i3c_ibi_sloth](jN)}(hjQh]hstruct}(hjOhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjOhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK_ubj)}(h h]h }(hjOhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOhhhjOhK_ubj#)}(h i3c_ibi_sloth]j))}(hjOh]h i3c_ibi_slot}(hjOhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjOubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hjOhhhjOhK_ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjOhhhjOhK_ubah}(h]jOah ](jjeh"]h$]h&]jj)jhuh1hhjOhK_hjOhhubj)}(hhh]j)}(h I3C IBI (In-Band Interrupt) sloth]h I3C IBI (In-Band Interrupt) slot}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKehjOhhubah}(h]h ]h"]h$]h&]uh1jhjOhhhjOhK_ubeh}(h]h ](jstructeh"]h$]h&]j jj jPj jPj j juh1hhhhhhNhNubj)}(hX**Definition**:: struct i3c_ibi_slot { struct work_struct work; struct i3c_dev_desc *dev; unsigned int len; void *data; }; **Members** ``work`` work associated to this slot. The IBI handler will be called from there ``dev`` the I3C device that has generated this IBI ``len`` length of the payload associated to this IBI ``data`` payload bufferh](j)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hj&PhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"Pubh:}(hj"PhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKihjPubjJ)}(hystruct i3c_ibi_slot { struct work_struct work; struct i3c_dev_desc *dev; unsigned int len; void *data; };h]hystruct i3c_ibi_slot { struct work_struct work; struct i3c_dev_desc *dev; unsigned int len; void *data; };}hj?Psbah}(h]h ]h"]h$]h&]hhuh1jJhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKkhjPubj)}(h **Members**h]j)}(hjPPh]hMembers}(hjRPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNPubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKrhjPubj0)}(hhh](j5)}(hQ``work`` work associated to this slot. The IBI handler will be called from there h](j;)}(h``work``h]jA)}(hjoPh]hwork}(hjqPhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjmPubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhhjiPubjW)}(hhh]j)}(hGwork associated to this slot. The IBI handler will be called from thereh]hGwork associated to this slot. The IBI handler will be called from there}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKghjPubah}(h]h ]h"]h$]h&]uh1jVhjiPubeh}(h]h ]h"]h$]h&]uh1j4hjPhKhhjfPubj5)}(h3``dev`` the I3C device that has generated this IBI h](j;)}(h``dev``h]jA)}(hjPh]hdev}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjPubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKihjPubjW)}(hhh]j)}(h*the I3C device that has generated this IBIh]h*the I3C device that has generated this IBI}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPhKihjPubah}(h]h ]h"]h$]h&]uh1jVhjPubeh}(h]h ]h"]h$]h&]uh1j4hjPhKihjfPubj5)}(h5``len`` length of the payload associated to this IBI h](j;)}(h``len``h]jA)}(hjPh]hlen}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjPubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKjhjPubjW)}(hhh]j)}(h,length of the payload associated to this IBIh]h,length of the payload associated to this IBI}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPhKjhjPubah}(h]h ]h"]h$]h&]uh1jVhjPubeh}(h]h ]h"]h$]h&]uh1j4hjPhKjhjfPubj5)}(h``data`` payload bufferh](j;)}(h``data``h]jA)}(hjQh]hdata}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjQubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKjhjQubjW)}(hhh]j)}(hpayload bufferh]hpayload buffer}(hj4QhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKkhj1Qubah}(h]h ]h"]h$]h&]uh1jVhjQubeh}(h]h ]h"]h$]h&]uh1j4hj0QhKjhjfPubeh}(h]h ]h"]h$]h&]uh1j/hjPubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hj^Qh]h Description}(hj`QhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\Qubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKnhhhhubj)}(hXAn IBI slot is an object pre-allocated by the controller and used when an IBI comes in. Every time an IBI comes in, the I3C master driver should find a free IBI slot in its IBI slot pool, retrieve the IBI payload and queue the IBI using i3c_master_queue_ibi().h]hXAn IBI slot is an object pre-allocated by the controller and used when an IBI comes in. Every time an IBI comes in, the I3C master driver should find a free IBI slot in its IBI slot pool, retrieve the IBI payload and queue the IBI using i3c_master_queue_ibi().}(hjtQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKkhhhhubj)}(hHow IBI slots are allocated is left to the I3C master driver, though, for simple kmalloc-based allocation, the generic IBI slot pool can be used.h]hHow IBI slots are allocated is left to the I3C master driver, though, for simple kmalloc-based allocation, the generic IBI slot pool can be used.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKqhhhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hi3c_device_ibi_info (C struct)c.i3c_device_ibi_infohNtauh1hhhhhhNhNubh)}(hhh](h)}(hi3c_device_ibi_infoh]h)}(hstruct i3c_device_ibi_infoh](jN)}(hjQh]hstruct}(hjQhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjQhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKwubj)}(h h]h }(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjQhhhjQhKwubj#)}(hi3c_device_ibi_infoh]j))}(hjQh]hi3c_device_ibi_info}(hjQhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjQubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hjQhhhjQhKwubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjQhhhjQhKwubah}(h]jQah ](jjeh"]h$]h&]jj)jhuh1hhjQhKwhjQhhubj)}(hhh]j)}(h-IBI information attached to a specific deviceh]h-IBI information attached to a specific device}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK}hjQhhubah}(h]h ]h"]h$]h&]uh1jhjQhhhjQhKwubeh}(h]h ](jstructeh"]h$]h&]j jj jRj jRj j juh1hhhhhhNhNubj)}(hX**Definition**:: struct i3c_device_ibi_info { struct completion all_ibis_handled; atomic_t pending_ibis; unsigned int max_payload_len; unsigned int num_slots; unsigned int enabled; struct workqueue_struct *wq; void (*handler)(struct i3c_device *dev, const struct i3c_ibi_payload *payload); }; **Members** ``all_ibis_handled`` used to be informed when no more IBIs are waiting to be processed. Used by i3c_device_disable_ibi() to wait for all IBIs to be dequeued ``pending_ibis`` count the number of pending IBIs. Each pending IBI has its work element queued to the controller workqueue ``max_payload_len`` maximum payload length for an IBI coming from this device. this value is specified when calling i3c_device_request_ibi() and should not change at run time. All messages IBIs exceeding this limit should be rejected by the master ``num_slots`` number of IBI slots reserved for this device ``enabled`` reflect the IBI status ``wq`` workqueue used to execute IBI handlers. ``handler`` IBI handler specified at i3c_device_request_ibi() call time. This handler will be called from the controller workqueue, and as such is allowed to sleep (though it is recommended to process the IBI as fast as possible to not stall processing of other IBIs queued on the same workqueue). New I3C messages can be sent from the IBI handlerh](j)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Rubh:}(hj RhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj RubjJ)}(hX/struct i3c_device_ibi_info { struct completion all_ibis_handled; atomic_t pending_ibis; unsigned int max_payload_len; unsigned int num_slots; unsigned int enabled; struct workqueue_struct *wq; void (*handler)(struct i3c_device *dev, const struct i3c_ibi_payload *payload); };h]hX/struct i3c_device_ibi_info { struct completion all_ibis_handled; atomic_t pending_ibis; unsigned int max_payload_len; unsigned int num_slots; unsigned int enabled; struct workqueue_struct *wq; void (*handler)(struct i3c_device *dev, const struct i3c_ibi_payload *payload); };}hj*Rsbah}(h]h ]h"]h$]h&]hhuh1jJhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj Rubj)}(h **Members**h]j)}(hj;Rh]hMembers}(hj=RhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9Rubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj Rubj0)}(hhh](j5)}(h``all_ibis_handled`` used to be informed when no more IBIs are waiting to be processed. Used by i3c_device_disable_ibi() to wait for all IBIs to be dequeued h](j;)}(h``all_ibis_handled``h]jA)}(hjZRh]hall_ibis_handled}(hj\RhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjXRubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjTRubjW)}(hhh]j)}(hused to be informed when no more IBIs are waiting to be processed. Used by i3c_device_disable_ibi() to wait for all IBIs to be dequeuedh]hused to be informed when no more IBIs are waiting to be processed. Used by i3c_device_disable_ibi() to wait for all IBIs to be dequeued}(hjsRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjpRubah}(h]h ]h"]h$]h&]uh1jVhjTRubeh}(h]h ]h"]h$]h&]uh1j4hjoRhKhjQRubj5)}(h|``pending_ibis`` count the number of pending IBIs. Each pending IBI has its work element queued to the controller workqueue h](j;)}(h``pending_ibis``h]jA)}(hjRh]h pending_ibis}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjRubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjRubjW)}(hhh]j)}(hjcount the number of pending IBIs. Each pending IBI has its work element queued to the controller workqueueh]hjcount the number of pending IBIs. Each pending IBI has its work element queued to the controller workqueue}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjRubah}(h]h ]h"]h$]h&]uh1jVhjRubeh}(h]h ]h"]h$]h&]uh1j4hjRhKhjQRubj5)}(h``max_payload_len`` maximum payload length for an IBI coming from this device. this value is specified when calling i3c_device_request_ibi() and should not change at run time. All messages IBIs exceeding this limit should be rejected by the master h](j;)}(h``max_payload_len``h]jA)}(hjRh]hmax_payload_len}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjRubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjRubjW)}(hhh]j)}(hmaximum payload length for an IBI coming from this device. this value is specified when calling i3c_device_request_ibi() and should not change at run time. All messages IBIs exceeding this limit should be rejected by the masterh]hmaximum payload length for an IBI coming from this device. this value is specified when calling i3c_device_request_ibi() and should not change at run time. All messages IBIs exceeding this limit should be rejected by the master}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjRubah}(h]h ]h"]h$]h&]uh1jVhjRubeh}(h]h ]h"]h$]h&]uh1j4hjRhKhjQRubj5)}(h;``num_slots`` number of IBI slots reserved for this device h](j;)}(h ``num_slots``h]jA)}(hjSh]h num_slots}(hj ShhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjSubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjSubjW)}(hhh]j)}(h,number of IBI slots reserved for this deviceh]h,number of IBI slots reserved for this device}(hj!ShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjShKhjSubah}(h]h ]h"]h$]h&]uh1jVhjSubeh}(h]h ]h"]h$]h&]uh1j4hjShKhjQRubj5)}(h#``enabled`` reflect the IBI status h](j;)}(h ``enabled``h]jA)}(hjASh]henabled}(hjCShhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj?Subah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj;SubjW)}(hhh]j)}(hreflect the IBI statush]hreflect the IBI status}(hjZShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVShKhjWSubah}(h]h ]h"]h$]h&]uh1jVhj;Subeh}(h]h ]h"]h$]h&]uh1j4hjVShKhjQRubj5)}(h/``wq`` workqueue used to execute IBI handlers. h](j;)}(h``wq``h]jA)}(hjzSh]hwq}(hj|ShhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjxSubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjtSubjW)}(hhh]j)}(h'workqueue used to execute IBI handlers.h]h'workqueue used to execute IBI handlers.}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjShKhjSubah}(h]h ]h"]h$]h&]uh1jVhjtSubeh}(h]h ]h"]h$]h&]uh1j4hjShKhjQRubj5)}(hX[``handler`` IBI handler specified at i3c_device_request_ibi() call time. This handler will be called from the controller workqueue, and as such is allowed to sleep (though it is recommended to process the IBI as fast as possible to not stall processing of other IBIs queued on the same workqueue). New I3C messages can be sent from the IBI handlerh](j;)}(h ``handler``h]jA)}(hjSh]hhandler}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjSubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjSubjW)}(hhh]j)}(hXOIBI handler specified at i3c_device_request_ibi() call time. This handler will be called from the controller workqueue, and as such is allowed to sleep (though it is recommended to process the IBI as fast as possible to not stall processing of other IBIs queued on the same workqueue). New I3C messages can be sent from the IBI handlerh]hXOIBI handler specified at i3c_device_request_ibi() call time. This handler will be called from the controller workqueue, and as such is allowed to sleep (though it is recommended to process the IBI as fast as possible to not stall processing of other IBIs queued on the same workqueue). New I3C messages can be sent from the IBI handler}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjSubah}(h]h ]h"]h$]h&]uh1jVhjSubeh}(h]h ]h"]h$]h&]uh1j4hjShKhjQRubeh}(h]h ]h"]h$]h&]uh1j/hj Rubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hjSh]h Description}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjSubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhhhhubj)}(hThe :c:type:`struct_i3c_device_ibi_info <_i3c_device_ibi_info>` object is allocated when i3c_device_request_ibi() is called and attached to a specific device. This object is here to manage IBIs coming from a specific I3C device.h](hThe }(hj ThhhNhNubh)}(h;:c:type:`struct_i3c_device_ibi_info <_i3c_device_ibi_info>`h]jA)}(hjTh]hstruct_i3c_device_ibi_info}(hjThhhNhNubah}(h]h ](jUjc-typeeh"]h$]h&]uh1j@hjTubah}(h]h ]h"]h$]h&]refdocja refdomainjreftypetype refexplicitrefwarnjjgjj_i3c_device_ibi_infouh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj Tubh object is allocated when i3c_device_request_ibi() is called and attached to a specific device. This object is here to manage IBIs coming from a specific I3C device.}(hj ThhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj3ThKhhhhubj)}(hNote that this structure is the generic view of the IBI management infrastructure. I3C master drivers may have their own internal representation which they can associate to the device using controller-private data.h]hNote that this structure is the generic view of the IBI management infrastructure. I3C master drivers may have their own internal representation which they can associate to the device using controller-private data.}(hj>ThhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhhhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hi3c_dev_boardinfo (C struct)c.i3c_dev_boardinfohNtauh1hhhhhhNhNubh)}(hhh](h)}(hi3c_dev_boardinfoh]h)}(hstruct i3c_dev_boardinfoh](jN)}(hjQh]hstruct}(hjfThhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjbThhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKubj)}(h h]h }(hjtThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjbThhhjsThKubj#)}(hi3c_dev_boardinfoh]j))}(hj`Th]hi3c_dev_boardinfo}(hjThhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjTubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hjbThhhjsThKubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj^ThhhjsThKubah}(h]jYTah ](jjeh"]h$]h&]jj)jhuh1hhjsThKhj[Thhubj)}(hhh]j)}(hI3C device board informationh]hI3C device board information}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjThhubah}(h]h ]h"]h$]h&]uh1jhj[ThhhjsThKubeh}(h]h ](jstructeh"]h$]h&]j jj jTj jTj j juh1hhhhhhNhNubj)}(hX**Definition**:: struct i3c_dev_boardinfo { struct list_head node; u8 init_dyn_addr; u8 static_addr; u64 pid; struct device_node *of_node; }; **Members** ``node`` used to insert the boardinfo object in the I3C boardinfo list ``init_dyn_addr`` initial dynamic address requested by the FW. We provide no guarantee that the device will end up using this address, but try our best to assign this specific address to the device ``static_addr`` static address the I3C device listen on before it's been assigned a dynamic address by the master. Will be used during bus initialization to assign it a specific dynamic address before starting DAA (Dynamic Address Assignment) ``pid`` I3C Provisioned ID exposed by the device. This is a unique identifier that may be used to attach boardinfo to i3c_dev_desc when the device does not have a static address ``of_node`` optional DT node in case the device has been described in the DTh](j)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubh:}(hjThhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjTubjJ)}(hstruct i3c_dev_boardinfo { struct list_head node; u8 init_dyn_addr; u8 static_addr; u64 pid; struct device_node *of_node; };h]hstruct i3c_dev_boardinfo { struct list_head node; u8 init_dyn_addr; u8 static_addr; u64 pid; struct device_node *of_node; };}hjTsbah}(h]h ]h"]h$]h&]hhuh1jJhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjTubj)}(h **Members**h]j)}(hjTh]hMembers}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjTubj0)}(hhh](j5)}(hG``node`` used to insert the boardinfo object in the I3C boardinfo list h](j;)}(h``node``h]jA)}(hjUh]hnode}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjUubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjUubjW)}(hhh]j)}(h=used to insert the boardinfo object in the I3C boardinfo listh]h=used to insert the boardinfo object in the I3C boardinfo list}(hj.UhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*UhKhj+Uubah}(h]h ]h"]h$]h&]uh1jVhjUubeh}(h]h ]h"]h$]h&]uh1j4hj*UhKhj Uubj5)}(h``init_dyn_addr`` initial dynamic address requested by the FW. We provide no guarantee that the device will end up using this address, but try our best to assign this specific address to the device h](j;)}(h``init_dyn_addr``h]jA)}(hjNUh]h init_dyn_addr}(hjPUhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjLUubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjHUubjW)}(hhh]j)}(hinitial dynamic address requested by the FW. We provide no guarantee that the device will end up using this address, but try our best to assign this specific address to the deviceh]hinitial dynamic address requested by the FW. We provide no guarantee that the device will end up using this address, but try our best to assign this specific address to the device}(hjgUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjdUubah}(h]h ]h"]h$]h&]uh1jVhjHUubeh}(h]h ]h"]h$]h&]uh1j4hjcUhKhj Uubj5)}(h``static_addr`` static address the I3C device listen on before it's been assigned a dynamic address by the master. Will be used during bus initialization to assign it a specific dynamic address before starting DAA (Dynamic Address Assignment) h](j;)}(h``static_addr``h]jA)}(hjUh]h static_addr}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjUubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjUubjW)}(hhh]j)}(hstatic address the I3C device listen on before it's been assigned a dynamic address by the master. Will be used during bus initialization to assign it a specific dynamic address before starting DAA (Dynamic Address Assignment)h]hstatic address the I3C device listen on before it’s been assigned a dynamic address by the master. Will be used during bus initialization to assign it a specific dynamic address before starting DAA (Dynamic Address Assignment)}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjUubah}(h]h ]h"]h$]h&]uh1jVhjUubeh}(h]h ]h"]h$]h&]uh1j4hjUhKhj Uubj5)}(h``pid`` I3C Provisioned ID exposed by the device. This is a unique identifier that may be used to attach boardinfo to i3c_dev_desc when the device does not have a static address h](j;)}(h``pid``h]jA)}(hjUh]hpid}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjUubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjUubjW)}(hhh]j)}(hI3C Provisioned ID exposed by the device. This is a unique identifier that may be used to attach boardinfo to i3c_dev_desc when the device does not have a static addressh]hI3C Provisioned ID exposed by the device. This is a unique identifier that may be used to attach boardinfo to i3c_dev_desc when the device does not have a static address}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjUubah}(h]h ]h"]h$]h&]uh1jVhjUubeh}(h]h ]h"]h$]h&]uh1j4hjUhKhj Uubj5)}(hL``of_node`` optional DT node in case the device has been described in the DTh](j;)}(h ``of_node``h]jA)}(hjUh]hof_node}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjUubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjUubjW)}(hhh]j)}(h@optional DT node in case the device has been described in the DTh]h@optional DT node in case the device has been described in the DT}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjVubah}(h]h ]h"]h$]h&]uh1jVhjUubeh}(h]h ]h"]h$]h&]uh1j4hjVhKhj Uubeh}(h]h ]h"]h$]h&]uh1j/hjTubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hj?Vh]h Description}(hjAVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=Vubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhhhhubj)}(hThis structure is used to attach board-level information to an I3C device. Not all I3C devices connected on the bus will have a boardinfo. It's only needed if you want to attach extra resources to a device or assign it a specific dynamic address.h]hThis structure is used to attach board-level information to an I3C device. Not all I3C devices connected on the bus will have a boardinfo. It’s only needed if you want to attach extra resources to a device or assign it a specific dynamic address.}(hjUVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhhhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hi3c_dev_desc (C struct)c.i3c_dev_deschNtauh1hhhhhhNhNubh)}(hhh](h)}(h i3c_dev_desch]h)}(hstruct i3c_dev_desch](jN)}(hjQh]hstruct}(hj}VhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjyVhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKubj)}(h h]h }(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyVhhhjVhKubj#)}(h i3c_dev_desch]j))}(hjwVh]h i3c_dev_desc}(hjVhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjVubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hjyVhhhjVhKubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjuVhhhjVhKubah}(h]jpVah ](jjeh"]h$]h&]jj)jhuh1hhjVhKhjrVhhubj)}(hhh]j)}(hI3C device descriptorh]hI3C device descriptor}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjVhhubah}(h]h ]h"]h$]h&]uh1jhjrVhhhjVhKubeh}(h]h ](jstructeh"]h$]h&]j jj jVj jVj j juh1hhhhhhNhNubj)}(hX**Definition**:: struct i3c_dev_desc { struct i3c_i2c_dev_desc common; struct i3c_device_info info; struct mutex ibi_lock; struct i3c_device_ibi_info *ibi; struct i3c_device *dev; const struct i3c_dev_boardinfo *boardinfo; }; **Members** ``common`` common part of the I3C device descriptor ``info`` I3C device information. Will be automatically filled when you create your device with i3c_master_add_i3c_dev_locked() ``ibi_lock`` lock used to protect the :c:type:`struct_i3c_device->ibi ` ``ibi`` IBI info attached to a device. Should be NULL until i3c_device_request_ibi() is called ``dev`` pointer to the I3C device object exposed to I3C device drivers. This should never be accessed from I3C master controller drivers. Only core code should manipulate it in when updating the dev <-> desc link or when propagating IBI events to the driver ``boardinfo`` pointer to the boardinfo attached to this I3C deviceh](j)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubh:}(hjVhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjVubjJ)}(hstruct i3c_dev_desc { struct i3c_i2c_dev_desc common; struct i3c_device_info info; struct mutex ibi_lock; struct i3c_device_ibi_info *ibi; struct i3c_device *dev; const struct i3c_dev_boardinfo *boardinfo; };h]hstruct i3c_dev_desc { struct i3c_i2c_dev_desc common; struct i3c_device_info info; struct mutex ibi_lock; struct i3c_device_ibi_info *ibi; struct i3c_device *dev; const struct i3c_dev_boardinfo *boardinfo; };}hjVsbah}(h]h ]h"]h$]h&]hhuh1jJhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjVubj)}(h **Members**h]j)}(hj Wh]hMembers}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj Wubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjVubj0)}(hhh](j5)}(h4``common`` common part of the I3C device descriptor h](j;)}(h ``common``h]jA)}(hj,Wh]hcommon}(hj.WhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj*Wubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj&WubjW)}(hhh]j)}(h(common part of the I3C device descriptorh]h(common part of the I3C device descriptor}(hjEWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAWhKhjBWubah}(h]h ]h"]h$]h&]uh1jVhj&Wubeh}(h]h ]h"]h$]h&]uh1j4hjAWhKhj#Wubj5)}(h``info`` I3C device information. Will be automatically filled when you create your device with i3c_master_add_i3c_dev_locked() h](j;)}(h``info``h]jA)}(hjeWh]hinfo}(hjgWhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjcWubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj_WubjW)}(hhh]j)}(huI3C device information. Will be automatically filled when you create your device with i3c_master_add_i3c_dev_locked()h]huI3C device information. Will be automatically filled when you create your device with i3c_master_add_i3c_dev_locked()}(hj~WhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj{Wubah}(h]h ]h"]h$]h&]uh1jVhj_Wubeh}(h]h ]h"]h$]h&]uh1j4hjzWhKhj#Wubj5)}(h[``ibi_lock`` lock used to protect the :c:type:`struct_i3c_device->ibi ` h](j;)}(h ``ibi_lock``h]jA)}(hjWh]hibi_lock}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjWubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjWubjW)}(hhh]j)}(hMlock used to protect the :c:type:`struct_i3c_device->ibi `h](hlock used to protect the }(hjWhhhNhNubh)}(h4:c:type:`struct_i3c_device->ibi `h]jA)}(hjWh]hstruct_i3c_device->ibi}(hjWhhhNhNubah}(h]h ](jUjc-typeeh"]h$]h&]uh1j@hjWubah}(h]h ]h"]h$]h&]refdocja refdomainjreftypetype refexplicitrefwarnjjgjjstruct_i3c_deviceuh1hhjWhKhjWubeh}(h]h ]h"]h$]h&]uh1jhjWhKhjWubah}(h]h ]h"]h$]h&]uh1jVhjWubeh}(h]h ]h"]h$]h&]uh1j4hjWhKhj#Wubj5)}(h_``ibi`` IBI info attached to a device. Should be NULL until i3c_device_request_ibi() is called h](j;)}(h``ibi``h]jA)}(hjWh]hibi}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjWubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjWubjW)}(hhh]j)}(hVIBI info attached to a device. Should be NULL until i3c_device_request_ibi() is calledh]hVIBI info attached to a device. Should be NULL until i3c_device_request_ibi() is called}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj Xubah}(h]h ]h"]h$]h&]uh1jVhjWubeh}(h]h ]h"]h$]h&]uh1j4hj XhKhj#Wubj5)}(hX``dev`` pointer to the I3C device object exposed to I3C device drivers. This should never be accessed from I3C master controller drivers. Only core code should manipulate it in when updating the dev <-> desc link or when propagating IBI events to the driver h](j;)}(h``dev``h]jA)}(hj1Xh]hdev}(hj3XhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj/Xubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj+XubjW)}(hhh]j)}(hpointer to the I3C device object exposed to I3C device drivers. This should never be accessed from I3C master controller drivers. Only core code should manipulate it in when updating the dev <-> desc link or when propagating IBI events to the driverh]hpointer to the I3C device object exposed to I3C device drivers. This should never be accessed from I3C master controller drivers. Only core code should manipulate it in when updating the dev <-> desc link or when propagating IBI events to the driver}(hjJXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjGXubah}(h]h ]h"]h$]h&]uh1jVhj+Xubeh}(h]h ]h"]h$]h&]uh1j4hjFXhKhj#Wubj5)}(hB``boardinfo`` pointer to the boardinfo attached to this I3C deviceh](j;)}(h ``boardinfo``h]jA)}(hjkXh]h boardinfo}(hjmXhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjiXubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjeXubjW)}(hhh]j)}(h4pointer to the boardinfo attached to this I3C deviceh]h4pointer to the boardinfo attached to this I3C device}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjXubah}(h]h ]h"]h$]h&]uh1jVhjeXubeh}(h]h ]h"]h$]h&]uh1j4hjXhKhj#Wubeh}(h]h ]h"]h$]h&]uh1j/hjVubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hjXh]h Description}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhhhhubj)}(hXXInternal representation of an I3C device. This object is only used by the core and passed to I3C master controller drivers when they're requested to do some operations on the device. The core maintains the link between the internal I3C dev descriptor and the object exposed to the I3C device drivers (:c:type:`struct_i3c_device <_i3c_device>`).h](hX/Internal representation of an I3C device. This object is only used by the core and passed to I3C master controller drivers when they’re requested to do some operations on the device. The core maintains the link between the internal I3C dev descriptor and the object exposed to the I3C device drivers (}(hjXhhhNhNubh)}(h):c:type:`struct_i3c_device <_i3c_device>`h]jA)}(hjXh]hstruct_i3c_device}(hjXhhhNhNubah}(h]h ](jUjc-typeeh"]h$]h&]uh1j@hjXubah}(h]h ]h"]h$]h&]refdocja refdomainjreftypetype refexplicitrefwarnjjgjj _i3c_deviceuh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjXubh).}(hjXhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjXhKhhhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hi3c_device (C struct) c.i3c_devicehNtauh1hhhhhhNhNubh)}(hhh](h)}(h i3c_deviceh]h)}(hstruct i3c_deviceh](jN)}(hjQh]hstruct}(hjYhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhj Yhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKubj)}(h h]h }(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj YhhhjYhKubj#)}(h i3c_deviceh]j))}(hj Yh]h i3c_device}(hj/YhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj+Yubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hj YhhhjYhKubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjYhhhjYhKubah}(h]jYah ](jjeh"]h$]h&]jj)jhuh1hhjYhKhjYhhubj)}(hhh]j)}(hI3C device objecth]hI3C device object}(hjQYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjNYhhubah}(h]h ]h"]h$]h&]uh1jhjYhhhjYhKubeh}(h]h ](jstructeh"]h$]h&]j jj jiYj jiYj j juh1hhhhhhNhNubj)}(hX**Definition**:: struct i3c_device { struct device dev; struct i3c_dev_desc *desc; struct i3c_bus *bus; }; **Members** ``dev`` device object to register the I3C dev to the device model ``desc`` pointer to an i3c device descriptor object. This link is updated every time the I3C device is rediscovered with a different dynamic address assigned ``bus`` I3C bus this device is attached toh](j)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjuYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqYubh:}(hjqYhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjmYubjJ)}(hestruct i3c_device { struct device dev; struct i3c_dev_desc *desc; struct i3c_bus *bus; };h]hestruct i3c_device { struct device dev; struct i3c_dev_desc *desc; struct i3c_bus *bus; };}hjYsbah}(h]h ]h"]h$]h&]hhuh1jJhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjmYubj)}(h **Members**h]j)}(hjYh]hMembers}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjmYubj0)}(hhh](j5)}(hB``dev`` device object to register the I3C dev to the device model h](j;)}(h``dev``h]jA)}(hjYh]hdev}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjYubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjYubjW)}(hhh]j)}(h9device object to register the I3C dev to the device modelh]h9device object to register the I3C dev to the device model}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYhKhjYubah}(h]h ]h"]h$]h&]uh1jVhjYubeh}(h]h ]h"]h$]h&]uh1j4hjYhKhjYubj5)}(h``desc`` pointer to an i3c device descriptor object. This link is updated every time the I3C device is rediscovered with a different dynamic address assigned h](j;)}(h``desc``h]jA)}(hjYh]hdesc}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjYubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjYubjW)}(hhh]j)}(hpointer to an i3c device descriptor object. This link is updated every time the I3C device is rediscovered with a different dynamic address assignedh]hpointer to an i3c device descriptor object. This link is updated every time the I3C device is rediscovered with a different dynamic address assigned}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj Zubah}(h]h ]h"]h$]h&]uh1jVhjYubeh}(h]h ]h"]h$]h&]uh1j4hj ZhKhjYubj5)}(h*``bus`` I3C bus this device is attached toh](j;)}(h``bus``h]jA)}(hj1Zh]hbus}(hj3ZhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj/Zubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj+ZubjW)}(hhh]j)}(h"I3C bus this device is attached toh]h"I3C bus this device is attached to}(hjJZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjGZubah}(h]h ]h"]h$]h&]uh1jVhj+Zubeh}(h]h ]h"]h$]h&]uh1j4hjFZhKhjYubeh}(h]h ]h"]h$]h&]uh1j/hjmYubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hjtZh]h Description}(hjvZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrZubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhhhhubj)}(hX0I3C device object exposed to I3C device drivers. The takes care of linking this object to the relevant :c:type:`struct_i3c_dev_desc <_i3c_dev_desc>` one. All I3C devs on the I3C bus are represented, including I3C masters. For each of them, we have an instance of :c:type:`struct i3c_device `.h](hgI3C device object exposed to I3C device drivers. The takes care of linking this object to the relevant }(hjZhhhNhNubh)}(h-:c:type:`struct_i3c_dev_desc <_i3c_dev_desc>`h]jA)}(hjZh]hstruct_i3c_dev_desc}(hjZhhhNhNubah}(h]h ](jUjc-typeeh"]h$]h&]uh1j@hjZubah}(h]h ]h"]h$]h&]refdocja refdomainjreftypetype refexplicitrefwarnjjgjj _i3c_dev_descuh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjZubhs one. All I3C devs on the I3C bus are represented, including I3C masters. For each of them, we have an instance of }(hjZhhhNhNubh)}(h(:c:type:`struct i3c_device `h]jA)}(hjZh]hstruct i3c_device}(hjZhhhNhNubah}(h]h ](jUjc-typeeh"]h$]h&]uh1j@hjZubah}(h]h ]h"]h$]h&]refdocja refdomainjreftypetype refexplicitrefwarnjjgjj i3c_deviceuh1hhjZhKhjZubh.}(hjZhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjZhKhhhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hi3c_bus_mode (C enum)c.i3c_bus_modehNtauh1hhhhhhNhNubh)}(hhh](h)}(h i3c_bus_modeh]h)}(henum i3c_bus_modeh](jN)}(hjh]henum}(hjZhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjZhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKubj)}(h h]h }(hj[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZhhhj[hKubj#)}(h i3c_bus_modeh]j))}(hjZh]h i3c_bus_mode}(hj[hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj[ubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hjZhhhj[hKubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjZhhhj[hKubah}(h]jZah ](jjeh"]h$]h&]jj)jhuh1hhj[hKhjZhhubj)}(hhh]j)}(h I3C bus modeh]h I3C bus mode}(hj:[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj7[hhubah}(h]h ]h"]h$]h&]uh1jhjZhhhj[hKubeh}(h]h ](jenumeh"]h$]h&]j jj jR[j jR[j j juh1hhhhhhNhNubj)}(hXX**Constants** ``I3C_BUS_MODE_PURE`` only I3C devices are connected to the bus. No limitation expected ``I3C_BUS_MODE_MIXED_FAST`` I2C devices with 50ns spike filter are present on the bus. The only impact in this mode is that the high SCL pulse has to stay below 50ns to trick I2C devices when transmitting I3C frames ``I3C_BUS_MODE_MIXED_LIMITED`` I2C devices without 50ns spike filter are present on the bus. However they allow compliance up to the maximum SDR SCL clock frequency. ``I3C_BUS_MODE_MIXED_SLOW`` I2C devices without 50ns spike filter are present on the bush](j)}(h **Constants**h]j)}(hj\[h]h Constants}(hj^[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZ[ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM hjV[ubj0)}(hhh](j5)}(hX``I3C_BUS_MODE_PURE`` only I3C devices are connected to the bus. No limitation expected h](j;)}(h``I3C_BUS_MODE_PURE``h]jA)}(hj{[h]hI3C_BUS_MODE_PURE}(hj}[hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjy[ubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhju[ubjW)}(hhh]j)}(hAonly I3C devices are connected to the bus. No limitation expectedh]hAonly I3C devices are connected to the bus. No limitation expected}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj[ubah}(h]h ]h"]h$]h&]uh1jVhju[ubeh}(h]h ]h"]h$]h&]uh1j4hj[hMhjr[ubj5)}(h``I3C_BUS_MODE_MIXED_FAST`` I2C devices with 50ns spike filter are present on the bus. The only impact in this mode is that the high SCL pulse has to stay below 50ns to trick I2C devices when transmitting I3C frames h](j;)}(h``I3C_BUS_MODE_MIXED_FAST``h]jA)}(hj[h]hI3C_BUS_MODE_MIXED_FAST}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj[ubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj[ubjW)}(hhh]j)}(hI2C devices with 50ns spike filter are present on the bus. The only impact in this mode is that the high SCL pulse has to stay below 50ns to trick I2C devices when transmitting I3C framesh]hI2C devices with 50ns spike filter are present on the bus. The only impact in this mode is that the high SCL pulse has to stay below 50ns to trick I2C devices when transmitting I3C frames}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj[ubah}(h]h ]h"]h$]h&]uh1jVhj[ubeh}(h]h ]h"]h$]h&]uh1j4hj[hMhjr[ubj5)}(h``I3C_BUS_MODE_MIXED_LIMITED`` I2C devices without 50ns spike filter are present on the bus. However they allow compliance up to the maximum SDR SCL clock frequency. h](j;)}(h``I3C_BUS_MODE_MIXED_LIMITED``h]jA)}(hj[h]hI3C_BUS_MODE_MIXED_LIMITED}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj[ubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj[ubjW)}(hhh]j)}(hI2C devices without 50ns spike filter are present on the bus. However they allow compliance up to the maximum SDR SCL clock frequency.h]hI2C devices without 50ns spike filter are present on the bus. However they allow compliance up to the maximum SDR SCL clock frequency.}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj\ubah}(h]h ]h"]h$]h&]uh1jVhj[ubeh}(h]h ]h"]h$]h&]uh1j4hj\hMhjr[ubj5)}(hX``I3C_BUS_MODE_MIXED_SLOW`` I2C devices without 50ns spike filter are present on the bush](j;)}(h``I3C_BUS_MODE_MIXED_SLOW``h]jA)}(hj)\h]hI3C_BUS_MODE_MIXED_SLOW}(hj+\hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj'\ubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj#\ubjW)}(hhh]j)}(h\hMhj?\ubah}(h]h ]h"]h$]h&]uh1jVhj#\ubeh}(h]h ]h"]h$]h&]uh1j4hj>\hMhjr[ubeh}(h]h ]h"]h$]h&]uh1j/hjV[ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hi3c_open_drain_speed (C enum)c.i3c_open_drain_speedhNtauh1hhhhhhNhNubh)}(hhh](h)}(hi3c_open_drain_speedh]h)}(henum i3c_open_drain_speedh](jN)}(hjh]henum}(hj\hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhj~\hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM%ubj)}(h h]h }(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj~\hhhj\hM%ubj#)}(hi3c_open_drain_speedh]j))}(hj|\h]hi3c_open_drain_speed}(hj\hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj\ubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hj~\hhhj\hM%ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjz\hhhj\hM%ubah}(h]ju\ah ](jjeh"]h$]h&]jj)jhuh1hhj\hM%hjw\hhubj)}(hhh]j)}(hI3C open-drain speedh]hI3C open-drain speed}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj\hhubah}(h]h ]h"]h$]h&]uh1jhjw\hhhj\hM%ubeh}(h]h ](jenumeh"]h$]h&]j jj j\j j\j j juh1hhhhhhNhNubj)}(hXy**Constants** ``I3C_OPEN_DRAIN_SLOW_SPEED`` Slow open-drain speed for sending the first broadcast address. The first broadcast address at this speed will be visible to all devices on the I3C bus. I3C devices working in I2C mode will turn off their spike filter when switching into I3C mode. ``I3C_OPEN_DRAIN_NORMAL_SPEED`` Normal open-drain speed in I3C bus mode.h](j)}(h **Constants**h]j)}(hj\h]h Constants}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM"hj\ubj0)}(hhh](j5)}(hX``I3C_OPEN_DRAIN_SLOW_SPEED`` Slow open-drain speed for sending the first broadcast address. The first broadcast address at this speed will be visible to all devices on the I3C bus. I3C devices working in I2C mode will turn off their spike filter when switching into I3C mode. h](j;)}(h``I3C_OPEN_DRAIN_SLOW_SPEED``h]jA)}(hj]h]hI3C_OPEN_DRAIN_SLOW_SPEED}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj]ubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM)hj\ubjW)}(hhh]j)}(hSlow open-drain speed for sending the first broadcast address. The first broadcast address at this speed will be visible to all devices on the I3C bus. I3C devices working in I2C mode will turn off their spike filter when switching into I3C mode.h]hSlow open-drain speed for sending the first broadcast address. The first broadcast address at this speed will be visible to all devices on the I3C bus. I3C devices working in I2C mode will turn off their spike filter when switching into I3C mode.}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM%hj]ubah}(h]h ]h"]h$]h&]uh1jVhj\ubeh}(h]h ]h"]h$]h&]uh1j4hj]hM)hj\ubj5)}(hH``I3C_OPEN_DRAIN_NORMAL_SPEED`` Normal open-drain speed in I3C bus mode.h](j;)}(h``I3C_OPEN_DRAIN_NORMAL_SPEED``h]jA)}(hj?]h]hI3C_OPEN_DRAIN_NORMAL_SPEED}(hjA]hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj=]ubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM+hj9]ubjW)}(hhh]j)}(h(Normal open-drain speed in I3C bus mode.h]h(Normal open-drain speed in I3C bus mode.}(hjX]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM,hjU]ubah}(h]h ]h"]h$]h&]uh1jVhj9]ubeh}(h]h ]h"]h$]h&]uh1j4hjT]hM+hj\ubeh}(h]h ]h"]h$]h&]uh1j/hj\ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hi3c_addr_slot_status (C enum)c.i3c_addr_slot_statushNtauh1hhhhhhNhNubh)}(hhh](h)}(hi3c_addr_slot_statush]h)}(henum i3c_addr_slot_statush](jN)}(hjh]henum}(hj]hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhj]hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM1ubj)}(h h]h }(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj]hhhj]hM1ubj#)}(hi3c_addr_slot_statush]j))}(hj]h]hi3c_addr_slot_status}(hj]hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj]ubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hj]hhhj]hM1ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj]hhhj]hM1ubah}(h]j]ah ](jjeh"]h$]h&]jj)jhuh1hhj]hM1hj]hhubj)}(hhh]j)}(hI3C address slot statush]hI3C address slot status}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM,hj]hhubah}(h]h ]h"]h$]h&]uh1jhj]hhhj]hM1ubeh}(h]h ](jenumeh"]h$]h&]j jj j]j j]j j juh1hhhhhhNhNubj)}(hX**Constants** ``I3C_ADDR_SLOT_FREE`` address is free ``I3C_ADDR_SLOT_RSVD`` address is reserved ``I3C_ADDR_SLOT_I2C_DEV`` address is assigned to an I2C device ``I3C_ADDR_SLOT_I3C_DEV`` address is assigned to an I3C device ``I3C_ADDR_SLOT_STATUS_MASK`` address slot mask ``I3C_ADDR_SLOT_EXT_STATUS_MASK`` address slot mask with extended information ``I3C_ADDR_SLOT_EXT_DESIRED`` the bitmask represents addresses that are preferred by some devices, such as the "assigned-address" property in a device tree source. On an I3C bus, addresses are assigned dynamically, and we need to know which addresses are free to use and which ones are already assigned.h](j)}(h **Constants**h]j)}(hj]h]h Constants}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM0hj]ubj0)}(hhh](j5)}(h'``I3C_ADDR_SLOT_FREE`` address is free h](j;)}(h``I3C_ADDR_SLOT_FREE``h]jA)}(hj^h]hI3C_ADDR_SLOT_FREE}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj^ubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM3hj^ubjW)}(hhh]j)}(haddress is freeh]haddress is free}(hj5^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1^hM3hj2^ubah}(h]h ]h"]h$]h&]uh1jVhj^ubeh}(h]h ]h"]h$]h&]uh1j4hj1^hM3hj^ubj5)}(h+``I3C_ADDR_SLOT_RSVD`` address is reserved h](j;)}(h``I3C_ADDR_SLOT_RSVD``h]jA)}(hjU^h]hI3C_ADDR_SLOT_RSVD}(hjW^hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjS^ubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM6hjO^ubjW)}(hhh]j)}(haddress is reservedh]haddress is reserved}(hjn^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjj^hM6hjk^ubah}(h]h ]h"]h$]h&]uh1jVhjO^ubeh}(h]h ]h"]h$]h&]uh1j4hjj^hM6hj^ubj5)}(h?``I3C_ADDR_SLOT_I2C_DEV`` address is assigned to an I2C device h](j;)}(h``I3C_ADDR_SLOT_I2C_DEV``h]jA)}(hj^h]hI3C_ADDR_SLOT_I2C_DEV}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj^ubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM9hj^ubjW)}(hhh]j)}(h$address is assigned to an I2C deviceh]h$address is assigned to an I2C device}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^hM9hj^ubah}(h]h ]h"]h$]h&]uh1jVhj^ubeh}(h]h ]h"]h$]h&]uh1j4hj^hM9hj^ubj5)}(h?``I3C_ADDR_SLOT_I3C_DEV`` address is assigned to an I3C device h](j;)}(h``I3C_ADDR_SLOT_I3C_DEV``h]jA)}(hj^h]hI3C_ADDR_SLOT_I3C_DEV}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj^ubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM<hj^ubjW)}(hhh]j)}(h$address is assigned to an I3C deviceh]h$address is assigned to an I3C device}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^hM<hj^ubah}(h]h ]h"]h$]h&]uh1jVhj^ubeh}(h]h ]h"]h$]h&]uh1j4hj^hM<hj^ubj5)}(h0``I3C_ADDR_SLOT_STATUS_MASK`` address slot mask h](j;)}(h``I3C_ADDR_SLOT_STATUS_MASK``h]jA)}(hj_h]hI3C_ADDR_SLOT_STATUS_MASK}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj^ubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM?hj^ubjW)}(hhh]j)}(haddress slot maskh]haddress slot mask}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_hM?hj_ubah}(h]h ]h"]h$]h&]uh1jVhj^ubeh}(h]h ]h"]h$]h&]uh1j4hj_hM?hj^ubj5)}(hN``I3C_ADDR_SLOT_EXT_STATUS_MASK`` address slot mask with extended information h](j;)}(h!``I3C_ADDR_SLOT_EXT_STATUS_MASK``h]jA)}(hj9_h]hI3C_ADDR_SLOT_EXT_STATUS_MASK}(hj;_hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj7_ubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMBhj3_ubjW)}(hhh]j)}(h+address slot mask with extended informationh]h+address slot mask with extended information}(hjR_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjN_hMBhjO_ubah}(h]h ]h"]h$]h&]uh1jVhj3_ubeh}(h]h ]h"]h$]h&]uh1j4hjN_hMBhj^ubj5)}(hX/``I3C_ADDR_SLOT_EXT_DESIRED`` the bitmask represents addresses that are preferred by some devices, such as the "assigned-address" property in a device tree source. On an I3C bus, addresses are assigned dynamically, and we need to know which addresses are free to use and which ones are already assigned.h](j;)}(h``I3C_ADDR_SLOT_EXT_DESIRED``h]jA)}(hjr_h]hI3C_ADDR_SLOT_EXT_DESIRED}(hjt_hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjp_ubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMGhjl_ubjW)}(hhh]j)}(hXthe bitmask represents addresses that are preferred by some devices, such as the "assigned-address" property in a device tree source. On an I3C bus, addresses are assigned dynamically, and we need to know which addresses are free to use and which ones are already assigned.h]hXthe bitmask represents addresses that are preferred by some devices, such as the “assigned-address” property in a device tree source. On an I3C bus, addresses are assigned dynamically, and we need to know which addresses are free to use and which ones are already assigned.}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMEhj_ubah}(h]h ]h"]h$]h&]uh1jVhjl_ubeh}(h]h ]h"]h$]h&]uh1j4hj_hMGhj^ubeh}(h]h ]h"]h$]h&]uh1j/hj]ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hj_h]h Description}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMJhhhhubj)}(h]Addresses marked as reserved are those reserved by the I3C protocol (broadcast address, ...).h]h]Addresses marked as reserved are those reserved by the I3C protocol (broadcast address, ...).}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM7hhhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hi3c_bus (C struct) c.i3c_bushNtauh1hhhhhhNhNubh)}(hhh](h)}(hi3c_bush]h)}(hstruct i3c_bush](jN)}(hjQh]hstruct}(hj_hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhj_hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM=ubj)}(h h]h }(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_hhhj`hM=ubj#)}(hi3c_bush]j))}(hj_h]hi3c_bus}(hj`hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj`ubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hj_hhhj`hM=ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj_hhhj`hM=ubah}(h]j_ah ](jjeh"]h$]h&]jj)jhuh1hhj`hM=hj_hhubj)}(hhh]j)}(hI3C bus objecth]hI3C bus object}(hj5`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMHhj2`hhubah}(h]h ]h"]h$]h&]uh1jhj_hhhj`hM=ubeh}(h]h ](jstructeh"]h$]h&]j jj jM`j jM`j j juh1hhhhhhNhNubj)}(hX**Definition**:: struct i3c_bus { struct i3c_dev_desc *cur_master; int id; unsigned long addrslots[((I2C_MAX_ADDR + 1) * I3C_ADDR_SLOT_STATUS_BITS) / BITS_PER_LONG]; enum i3c_bus_mode mode; struct { unsigned long i3c; unsigned long i2c; } scl_rate; struct { struct list_head i3c; struct list_head i2c; } devs; struct rw_semaphore lock; }; **Members** ``cur_master`` I3C master currently driving the bus. Since I3C is multi-master this can change over the time. Will be used to let a master know whether it needs to request bus ownership before sending a frame or not ``id`` bus ID. Assigned by the framework when register the bus ``addrslots`` a bitmap with 2-bits per-slot to encode the address status and ease the DAA (Dynamic Address Assignment) procedure (see :c:type:`enum i3c_addr_slot_status `) ``mode`` bus mode (see :c:type:`enum i3c_bus_mode `) ``scl_rate`` SCL signal rate for I3C and I2C mode ``scl_rate.i3c`` maximum rate for the clock signal when doing I3C SDR/priv transfers ``scl_rate.i2c`` maximum rate for the clock signal when doing I2C transfers ``devs`` 2 lists containing all I3C/I2C devices connected to the bus ``devs.i3c`` contains a list of I3C device descriptors representing I3C devices connected on the bus and successfully attached to the I3C master ``devs.i2c`` contains a list of I2C device descriptors representing I2C devices connected on the bus and successfully attached to the I3C master ``lock`` read/write lock on the bus. This is needed to protect against operations that have an impact on the whole bus and the devices connected to it. For example, when asking slaves to drop their dynamic address (RSTDAA CCC), we need to make sure no one is trying to send I3C frames to these devices. Note that this lock does not protect against concurrency between devices: several drivers can send different I3C/I2C frames through the same master in parallel. This is the responsibility of the master to guarantee that frames are actually sent sequentially and not interlacedh](j)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjY`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjU`ubh:}(hjU`hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMLhjQ`ubjJ)}(hXstruct i3c_bus { struct i3c_dev_desc *cur_master; int id; unsigned long addrslots[((I2C_MAX_ADDR + 1) * I3C_ADDR_SLOT_STATUS_BITS) / BITS_PER_LONG]; enum i3c_bus_mode mode; struct { unsigned long i3c; unsigned long i2c; } scl_rate; struct { struct list_head i3c; struct list_head i2c; } devs; struct rw_semaphore lock; };h]hXstruct i3c_bus { struct i3c_dev_desc *cur_master; int id; unsigned long addrslots[((I2C_MAX_ADDR + 1) * I3C_ADDR_SLOT_STATUS_BITS) / BITS_PER_LONG]; enum i3c_bus_mode mode; struct { unsigned long i3c; unsigned long i2c; } scl_rate; struct { struct list_head i3c; struct list_head i2c; } devs; struct rw_semaphore lock; };}hjr`sbah}(h]h ]h"]h$]h&]hhuh1jJhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMNhjQ`ubj)}(h **Members**h]j)}(hj`h]hMembers}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM^hjQ`ubj0)}(hhh](j5)}(h``cur_master`` I3C master currently driving the bus. Since I3C is multi-master this can change over the time. Will be used to let a master know whether it needs to request bus ownership before sending a frame or not h](j;)}(h``cur_master``h]jA)}(hj`h]h cur_master}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj`ubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMMhj`ubjW)}(hhh]j)}(hI3C master currently driving the bus. Since I3C is multi-master this can change over the time. Will be used to let a master know whether it needs to request bus ownership before sending a frame or noth]hI3C master currently driving the bus. Since I3C is multi-master this can change over the time. Will be used to let a master know whether it needs to request bus ownership before sending a frame or not}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMJhj`ubah}(h]h ]h"]h$]h&]uh1jVhj`ubeh}(h]h ]h"]h$]h&]uh1j4hj`hMMhj`ubj5)}(h?``id`` bus ID. Assigned by the framework when register the bus h](j;)}(h``id``h]jA)}(hj`h]hid}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj`ubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMNhj`ubjW)}(hhh]j)}(h7bus ID. Assigned by the framework when register the bush]h7bus ID. Assigned by the framework when register the bus}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`hMNhj`ubah}(h]h ]h"]h$]h&]uh1jVhj`ubeh}(h]h ]h"]h$]h&]uh1j4hj`hMNhj`ubj5)}(h``addrslots`` a bitmap with 2-bits per-slot to encode the address status and ease the DAA (Dynamic Address Assignment) procedure (see :c:type:`enum i3c_addr_slot_status `) h](j;)}(h ``addrslots``h]jA)}(hjah]h addrslots}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjaubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMQhjaubjW)}(hhh]j)}(ha bitmap with 2-bits per-slot to encode the address status and ease the DAA (Dynamic Address Assignment) procedure (see :c:type:`enum i3c_addr_slot_status `)h](hxa bitmap with 2-bits per-slot to encode the address status and ease the DAA (Dynamic Address Assignment) procedure (see }(hj.ahhhNhNubh)}(h::c:type:`enum i3c_addr_slot_status `h]jA)}(hj8ah]henum i3c_addr_slot_status}(hj:ahhhNhNubah}(h]h ](jUjc-typeeh"]h$]h&]uh1j@hj6aubah}(h]h ]h"]h$]h&]refdocja refdomainjreftypetype refexplicitrefwarnjjgjji3c_addr_slot_statusuh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMOhj.aubh)}(hj.ahhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjUahMOhj+aubah}(h]h ]h"]h$]h&]uh1jVhjaubeh}(h]h ]h"]h$]h&]uh1j4hj*ahMQhj`ubj5)}(hC``mode`` bus mode (see :c:type:`enum i3c_bus_mode `) h](j;)}(h``mode``h]jA)}(hjrah]hmode}(hjtahhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjpaubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMRhjlaubjW)}(hhh]j)}(h9bus mode (see :c:type:`enum i3c_bus_mode `)h](hbus mode (see }(hjahhhNhNubh)}(h*:c:type:`enum i3c_bus_mode `h]jA)}(hjah]henum i3c_bus_mode}(hjahhhNhNubah}(h]h ](jUjc-typeeh"]h$]h&]uh1j@hjaubah}(h]h ]h"]h$]h&]refdocja refdomainjreftypetype refexplicitrefwarnjjgjj i3c_bus_modeuh1hhjahMRhjaubh)}(hjahhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjahMRhjaubah}(h]h ]h"]h$]h&]uh1jVhjlaubeh}(h]h ]h"]h$]h&]uh1j4hjahMRhj`ubj5)}(h2``scl_rate`` SCL signal rate for I3C and I2C mode h](j;)}(h ``scl_rate``h]jA)}(hjah]hscl_rate}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjaubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMVhjaubjW)}(hhh]j)}(h$SCL signal rate for I3C and I2C modeh]h$SCL signal rate for I3C and I2C mode}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjahMVhjaubah}(h]h ]h"]h$]h&]uh1jVhjaubeh}(h]h ]h"]h$]h&]uh1j4hjahMVhj`ubj5)}(hU``scl_rate.i3c`` maximum rate for the clock signal when doing I3C SDR/priv transfers h](j;)}(h``scl_rate.i3c``h]jA)}(hjbh]h scl_rate.i3c}(hj bhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjbubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMThjbubjW)}(hhh]j)}(hCmaximum rate for the clock signal when doing I3C SDR/priv transfersh]hCmaximum rate for the clock signal when doing I3C SDR/priv transfers}(hj bhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMShjbubah}(h]h ]h"]h$]h&]uh1jVhjbubeh}(h]h ]h"]h$]h&]uh1j4hjbhMThj`ubj5)}(hL``scl_rate.i2c`` maximum rate for the clock signal when doing I2C transfers h](j;)}(h``scl_rate.i2c``h]jA)}(hjAbh]h scl_rate.i2c}(hjCbhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj?bubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMUhj;bubjW)}(hhh]j)}(h:maximum rate for the clock signal when doing I2C transfersh]h:maximum rate for the clock signal when doing I2C transfers}(hjZbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVbhMUhjWbubah}(h]h ]h"]h$]h&]uh1jVhj;bubeh}(h]h ]h"]h$]h&]uh1j4hjVbhMUhj`ubj5)}(hE``devs`` 2 lists containing all I3C/I2C devices connected to the bus h](j;)}(h``devs``h]jA)}(hjzbh]hdevs}(hj|bhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjxbubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM]hjtbubjW)}(hhh]j)}(h;2 lists containing all I3C/I2C devices connected to the bush]h;2 lists containing all I3C/I2C devices connected to the bus}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjbhM]hjbubah}(h]h ]h"]h$]h&]uh1jVhjtbubeh}(h]h ]h"]h$]h&]uh1j4hjbhM]hj`ubj5)}(h``devs.i3c`` contains a list of I3C device descriptors representing I3C devices connected on the bus and successfully attached to the I3C master h](j;)}(h ``devs.i3c``h]jA)}(hjbh]hdevs.i3c}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjbubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMYhjbubjW)}(hhh]j)}(hcontains a list of I3C device descriptors representing I3C devices connected on the bus and successfully attached to the I3C masterh]hcontains a list of I3C device descriptors representing I3C devices connected on the bus and successfully attached to the I3C master}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMWhjbubah}(h]h ]h"]h$]h&]uh1jVhjbubeh}(h]h ]h"]h$]h&]uh1j4hjbhMYhj`ubj5)}(h``devs.i2c`` contains a list of I2C device descriptors representing I2C devices connected on the bus and successfully attached to the I3C master h](j;)}(h ``devs.i2c``h]jA)}(hjbh]hdevs.i2c}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjbubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM\hjbubjW)}(hhh]j)}(hcontains a list of I2C device descriptors representing I2C devices connected on the bus and successfully attached to the I3C masterh]hcontains a list of I2C device descriptors representing I2C devices connected on the bus and successfully attached to the I3C master}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMZhjcubah}(h]h ]h"]h$]h&]uh1jVhjbubeh}(h]h ]h"]h$]h&]uh1j4hjchM\hj`ubj5)}(hXC``lock`` read/write lock on the bus. This is needed to protect against operations that have an impact on the whole bus and the devices connected to it. For example, when asking slaves to drop their dynamic address (RSTDAA CCC), we need to make sure no one is trying to send I3C frames to these devices. Note that this lock does not protect against concurrency between devices: several drivers can send different I3C/I2C frames through the same master in parallel. This is the responsibility of the master to guarantee that frames are actually sent sequentially and not interlacedh](j;)}(h``lock``h]jA)}(hj'ch]hlock}(hj)chhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj%cubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMfhj!cubjW)}(hhh]j)}(hX:read/write lock on the bus. This is needed to protect against operations that have an impact on the whole bus and the devices connected to it. For example, when asking slaves to drop their dynamic address (RSTDAA CCC), we need to make sure no one is trying to send I3C frames to these devices. Note that this lock does not protect against concurrency between devices: several drivers can send different I3C/I2C frames through the same master in parallel. This is the responsibility of the master to guarantee that frames are actually sent sequentially and not interlacedh]hX:read/write lock on the bus. This is needed to protect against operations that have an impact on the whole bus and the devices connected to it. For example, when asking slaves to drop their dynamic address (RSTDAA CCC), we need to make sure no one is trying to send I3C frames to these devices. Note that this lock does not protect against concurrency between devices: several drivers can send different I3C/I2C frames through the same master in parallel. This is the responsibility of the master to guarantee that frames are actually sent sequentially and not interlaced}(hj@chhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM^hj=cubah}(h]h ]h"]h$]h&]uh1jVhj!cubeh}(h]h ]h"]h$]h&]uh1j4hjbus_init\(\) `. This method is optional. ``attach_i3c_dev`` called every time an I3C device is attached to the bus. It can be after a DAA or when a device is statically declared by the FW, in which case it will only have a static address and the dynamic address will be 0. When this function is called, device information have not been retrieved yet. This is a good place to attach master controller specific data to I3C devices. This method is optional. ``reattach_i3c_dev`` called every time an I3C device has its addressed changed. It can be because the device has been powered down and has lost its address, or it can happen when a device had a static address and has been assigned a dynamic address with SETDASA. This method is optional. ``detach_i3c_dev`` called when an I3C device is detached from the bus. Usually happens when the master device is unregistered. This method is optional. ``do_daa`` do a DAA (Dynamic Address Assignment) procedure. This is procedure should send an ENTDAA CCC command and then add all devices discovered sure the DAA using i3c_master_add_i3c_dev_locked(). Add devices added with i3c_master_add_i3c_dev_locked() will then be attached or re-attached to the controller. This method is mandatory. ``supports_ccc_cmd`` should return true if the CCC command is supported, false otherwise. This method is optional, if not provided the core assumes all CCC commands are supported. ``send_ccc_cmd`` send a CCC command This method is mandatory. ``i3c_xfers`` do one or several I3C SDR or HDR transfers. This method is mandatory. ``attach_i2c_dev`` called every time an I2C device is attached to the bus. This is a good place to attach master controller specific data to I2C devices. This method is optional. ``detach_i2c_dev`` called when an I2C device is detached from the bus. Usually happens when the master device is unregistered. This method is optional. ``i2c_xfers`` do one or several I2C transfers. Note that, unlike i3c transfers, the core does not guarantee that buffers attached to the transfers are DMA-safe. If drivers want to have DMA-safe buffers, they should use the i2c_get_dma_safe_msg_buf() and i2c_put_dma_safe_msg_buf() helpers provided by the I2C framework. This method is mandatory. ``request_ibi`` attach an IBI handler to an I3C device. This implies defining an IBI handler and the constraints of the IBI (maximum payload length and number of pre-allocated slots). Some controllers support less IBI-capable devices than regular devices, so this method might return -``EBUSY`` if there's no more space for an extra IBI registration This method is optional. ``free_ibi`` free an IBI previously requested with ->request_ibi(). The IBI should have been disabled with ->disable_irq() prior to that This method is mandatory only if ->request_ibi is not NULL. ``enable_ibi`` enable the IBI. Only valid if ->request_ibi() has been called prior to ->enable_ibi(). The controller should first enable the IBI on the controller end (for example, unmask the hardware IRQ) and then send the ENEC CCC command (with the IBI flag set) to the I3C device. This method is mandatory only if ->request_ibi is not NULL. ``disable_ibi`` disable an IBI. First send the DISEC CCC command with the IBI flag set and then deactivate the hardware IRQ on the controller end. This method is mandatory only if ->request_ibi is not NULL. ``recycle_ibi_slot`` recycle an IBI slot. Called every time an IBI has been processed by its handler. The IBI slot should be put back in the IBI slot pool so that the controller can re-use it for a future IBI This method is mandatory only if ->request_ibi is not NULL. ``enable_hotjoin`` enable hot join event detect. ``disable_hotjoin`` disable hot join event detect. ``set_speed`` adjust I3C open drain mode timing. ``set_dev_nack_retry`` configure device NACK retry count for the master controller.h](j)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj dubh:}(hj dhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjdubjJ)}(hXstruct i3c_master_controller_ops { int (*bus_init)(struct i3c_master_controller *master); void (*bus_cleanup)(struct i3c_master_controller *master); int (*attach_i3c_dev)(struct i3c_dev_desc *dev); int (*reattach_i3c_dev)(struct i3c_dev_desc *dev, u8 old_dyn_addr); void (*detach_i3c_dev)(struct i3c_dev_desc *dev); int (*do_daa)(struct i3c_master_controller *master); bool (*supports_ccc_cmd)(struct i3c_master_controller *master, const struct i3c_ccc_cmd *cmd); int (*send_ccc_cmd)(struct i3c_master_controller *master, struct i3c_ccc_cmd *cmd); int (*i3c_xfers)(struct i3c_dev_desc *dev, struct i3c_xfer *xfers, int nxfers, enum i3c_xfer_mode mode); int (*attach_i2c_dev)(struct i2c_dev_desc *dev); void (*detach_i2c_dev)(struct i2c_dev_desc *dev); int (*i2c_xfers)(struct i2c_dev_desc *dev, struct i2c_msg *xfers, int nxfers); int (*request_ibi)(struct i3c_dev_desc *dev, const struct i3c_ibi_setup *req); void (*free_ibi)(struct i3c_dev_desc *dev); int (*enable_ibi)(struct i3c_dev_desc *dev); int (*disable_ibi)(struct i3c_dev_desc *dev); void (*recycle_ibi_slot)(struct i3c_dev_desc *dev, struct i3c_ibi_slot *slot); int (*enable_hotjoin)(struct i3c_master_controller *master); int (*disable_hotjoin)(struct i3c_master_controller *master); int (*set_speed)(struct i3c_master_controller *master, enum i3c_open_drain_speed speed); int (*set_dev_nack_retry)(struct i3c_master_controller *master, unsigned int dev_nack_retry_cnt); };h]hXstruct i3c_master_controller_ops { int (*bus_init)(struct i3c_master_controller *master); void (*bus_cleanup)(struct i3c_master_controller *master); int (*attach_i3c_dev)(struct i3c_dev_desc *dev); int (*reattach_i3c_dev)(struct i3c_dev_desc *dev, u8 old_dyn_addr); void (*detach_i3c_dev)(struct i3c_dev_desc *dev); int (*do_daa)(struct i3c_master_controller *master); bool (*supports_ccc_cmd)(struct i3c_master_controller *master, const struct i3c_ccc_cmd *cmd); int (*send_ccc_cmd)(struct i3c_master_controller *master, struct i3c_ccc_cmd *cmd); int (*i3c_xfers)(struct i3c_dev_desc *dev, struct i3c_xfer *xfers, int nxfers, enum i3c_xfer_mode mode); int (*attach_i2c_dev)(struct i2c_dev_desc *dev); void (*detach_i2c_dev)(struct i2c_dev_desc *dev); int (*i2c_xfers)(struct i2c_dev_desc *dev, struct i2c_msg *xfers, int nxfers); int (*request_ibi)(struct i3c_dev_desc *dev, const struct i3c_ibi_setup *req); void (*free_ibi)(struct i3c_dev_desc *dev); int (*enable_ibi)(struct i3c_dev_desc *dev); int (*disable_ibi)(struct i3c_dev_desc *dev); void (*recycle_ibi_slot)(struct i3c_dev_desc *dev, struct i3c_ibi_slot *slot); int (*enable_hotjoin)(struct i3c_master_controller *master); int (*disable_hotjoin)(struct i3c_master_controller *master); int (*set_speed)(struct i3c_master_controller *master, enum i3c_open_drain_speed speed); int (*set_dev_nack_retry)(struct i3c_master_controller *master, unsigned int dev_nack_retry_cnt); };}hj'dsbah}(h]h ]h"]h$]h&]hhuh1jJhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjdubj)}(h **Members**h]j)}(hj8dh]hMembers}(hj:dhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6dubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjdubj0)}(hhh](j5)}(h``bus_init`` hook responsible for the I3C bus initialization. You should at least call master_set_info() from there and set the bus mode. You can also put controller specific initialization in there. This method is mandatory. h](j;)}(h ``bus_init``h]jA)}(hjWdh]hbus_init}(hjYdhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjUdubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjQdubjW)}(hhh]j)}(hhook responsible for the I3C bus initialization. You should at least call master_set_info() from there and set the bus mode. You can also put controller specific initialization in there. This method is mandatory.h]hhook responsible for the I3C bus initialization. You should at least call master_set_info() from there and set the bus mode. You can also put controller specific initialization in there. This method is mandatory.}(hjpdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjmdubah}(h]h ]h"]h$]h&]uh1jVhjQdubeh}(h]h ]h"]h$]h&]uh1j4hjldhMhjNdubj5)}(h``bus_cleanup`` cleanup everything done in :c:type:`i3c_master_controller_ops->bus_init\(\) `. This method is optional. h](j;)}(h``bus_cleanup``h]jA)}(hjdh]h bus_cleanup}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjdubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjdubjW)}(hhh]j)}(hcleanup everything done in :c:type:`i3c_master_controller_ops->bus_init\(\) `. This method is optional.h](hcleanup everything done in }(hjdhhhNhNubh)}(hM:c:type:`i3c_master_controller_ops->bus_init\(\) `h]jA)}(hjdh]h%i3c_master_controller_ops->bus_init()}(hjdhhhNhNubah}(h]h ](jUjc-typeeh"]h$]h&]uh1j@hjdubah}(h]h ]h"]h$]h&]refdocja refdomainjreftypetype refexplicitrefwarnjjgjji3c_master_controller_opsuh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjdubh. This method is optional.}(hjdhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjdhMhjdubah}(h]h ]h"]h$]h&]uh1jVhjdubeh}(h]h ]h"]h$]h&]uh1j4hjdhMhjNdubj5)}(hX``attach_i3c_dev`` called every time an I3C device is attached to the bus. It can be after a DAA or when a device is statically declared by the FW, in which case it will only have a static address and the dynamic address will be 0. When this function is called, device information have not been retrieved yet. This is a good place to attach master controller specific data to I3C devices. This method is optional. h](j;)}(h``attach_i3c_dev``h]jA)}(hjdh]hattach_i3c_dev}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjdubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjdubjW)}(hhh]j)}(hXcalled every time an I3C device is attached to the bus. It can be after a DAA or when a device is statically declared by the FW, in which case it will only have a static address and the dynamic address will be 0. When this function is called, device information have not been retrieved yet. This is a good place to attach master controller specific data to I3C devices. This method is optional.h]hXcalled every time an I3C device is attached to the bus. It can be after a DAA or when a device is statically declared by the FW, in which case it will only have a static address and the dynamic address will be 0. When this function is called, device information have not been retrieved yet. This is a good place to attach master controller specific data to I3C devices. This method is optional.}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjeubah}(h]h ]h"]h$]h&]uh1jVhjdubeh}(h]h ]h"]h$]h&]uh1j4hjehMhjNdubj5)}(hX ``reattach_i3c_dev`` called every time an I3C device has its addressed changed. It can be because the device has been powered down and has lost its address, or it can happen when a device had a static address and has been assigned a dynamic address with SETDASA. This method is optional. h](j;)}(h``reattach_i3c_dev``h]jA)}(hj(eh]hreattach_i3c_dev}(hj*ehhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj&eubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj"eubjW)}(hhh]j)}(hX called every time an I3C device has its addressed changed. It can be because the device has been powered down and has lost its address, or it can happen when a device had a static address and has been assigned a dynamic address with SETDASA. This method is optional.h]hX called every time an I3C device has its addressed changed. It can be because the device has been powered down and has lost its address, or it can happen when a device had a static address and has been assigned a dynamic address with SETDASA. This method is optional.}(hjAehhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj>eubah}(h]h ]h"]h$]h&]uh1jVhj"eubeh}(h]h ]h"]h$]h&]uh1j4hj=ehMhjNdubj5)}(h``detach_i3c_dev`` called when an I3C device is detached from the bus. Usually happens when the master device is unregistered. This method is optional. h](j;)}(h``detach_i3c_dev``h]jA)}(hjbeh]hdetach_i3c_dev}(hjdehhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj`eubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj\eubjW)}(hhh]j)}(hcalled when an I3C device is detached from the bus. Usually happens when the master device is unregistered. This method is optional.h]hcalled when an I3C device is detached from the bus. Usually happens when the master device is unregistered. This method is optional.}(hj{ehhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjxeubah}(h]h ]h"]h$]h&]uh1jVhj\eubeh}(h]h ]h"]h$]h&]uh1j4hjwehMhjNdubj5)}(hXQ``do_daa`` do a DAA (Dynamic Address Assignment) procedure. This is procedure should send an ENTDAA CCC command and then add all devices discovered sure the DAA using i3c_master_add_i3c_dev_locked(). Add devices added with i3c_master_add_i3c_dev_locked() will then be attached or re-attached to the controller. This method is mandatory. h](j;)}(h ``do_daa``h]jA)}(hjeh]hdo_daa}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjeubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjeubjW)}(hhh]j)}(hXEdo a DAA (Dynamic Address Assignment) procedure. This is procedure should send an ENTDAA CCC command and then add all devices discovered sure the DAA using i3c_master_add_i3c_dev_locked(). Add devices added with i3c_master_add_i3c_dev_locked() will then be attached or re-attached to the controller. This method is mandatory.h]hXEdo a DAA (Dynamic Address Assignment) procedure. This is procedure should send an ENTDAA CCC command and then add all devices discovered sure the DAA using i3c_master_add_i3c_dev_locked(). Add devices added with i3c_master_add_i3c_dev_locked() will then be attached or re-attached to the controller. This method is mandatory.}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjeubah}(h]h ]h"]h$]h&]uh1jVhjeubeh}(h]h ]h"]h$]h&]uh1j4hjehMhjNdubj5)}(h``supports_ccc_cmd`` should return true if the CCC command is supported, false otherwise. This method is optional, if not provided the core assumes all CCC commands are supported. h](j;)}(h``supports_ccc_cmd``h]jA)}(hjeh]hsupports_ccc_cmd}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjeubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjeubjW)}(hhh]j)}(hshould return true if the CCC command is supported, false otherwise. This method is optional, if not provided the core assumes all CCC commands are supported.h]hshould return true if the CCC command is supported, false otherwise. This method is optional, if not provided the core assumes all CCC commands are supported.}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjeubah}(h]h ]h"]h$]h&]uh1jVhjeubeh}(h]h ]h"]h$]h&]uh1j4hjehMhjNdubj5)}(h>``send_ccc_cmd`` send a CCC command This method is mandatory. h](j;)}(h``send_ccc_cmd``h]jA)}(hjfh]h send_ccc_cmd}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjfubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj fubjW)}(hhh]j)}(h,send a CCC command This method is mandatory.h]h,send a CCC command This method is mandatory.}(hj)fhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj&fubah}(h]h ]h"]h$]h&]uh1jVhj fubeh}(h]h ]h"]h$]h&]uh1j4hj%fhMhjNdubj5)}(hT``i3c_xfers`` do one or several I3C SDR or HDR transfers. This method is mandatory. h](j;)}(h ``i3c_xfers``h]jA)}(hjJfh]h i3c_xfers}(hjLfhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjHfubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjDfubjW)}(hhh]j)}(hEdo one or several I3C SDR or HDR transfers. This method is mandatory.h]hEdo one or several I3C SDR or HDR transfers. This method is mandatory.}(hjcfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj`fubah}(h]h ]h"]h$]h&]uh1jVhjDfubeh}(h]h ]h"]h$]h&]uh1j4hj_fhMhjNdubj5)}(h``attach_i2c_dev`` called every time an I2C device is attached to the bus. This is a good place to attach master controller specific data to I2C devices. This method is optional. h](j;)}(h``attach_i2c_dev``h]jA)}(hjfh]hattach_i2c_dev}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjfubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj~fubjW)}(hhh]j)}(hcalled every time an I2C device is attached to the bus. This is a good place to attach master controller specific data to I2C devices. This method is optional.h]hcalled every time an I2C device is attached to the bus. This is a good place to attach master controller specific data to I2C devices. This method is optional.}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjfubah}(h]h ]h"]h$]h&]uh1jVhj~fubeh}(h]h ]h"]h$]h&]uh1j4hjfhMhjNdubj5)}(h``detach_i2c_dev`` called when an I2C device is detached from the bus. Usually happens when the master device is unregistered. This method is optional. h](j;)}(h``detach_i2c_dev``h]jA)}(hjfh]hdetach_i2c_dev}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjfubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjfubjW)}(hhh]j)}(hcalled when an I2C device is detached from the bus. Usually happens when the master device is unregistered. This method is optional.h]hcalled when an I2C device is detached from the bus. Usually happens when the master device is unregistered. This method is optional.}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjfubah}(h]h ]h"]h$]h&]uh1jVhjfubeh}(h]h ]h"]h$]h&]uh1j4hjfhMhjNdubj5)}(hXZ``i2c_xfers`` do one or several I2C transfers. Note that, unlike i3c transfers, the core does not guarantee that buffers attached to the transfers are DMA-safe. If drivers want to have DMA-safe buffers, they should use the i2c_get_dma_safe_msg_buf() and i2c_put_dma_safe_msg_buf() helpers provided by the I2C framework. This method is mandatory. h](j;)}(h ``i2c_xfers``h]jA)}(hjfh]h i2c_xfers}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjfubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjfubjW)}(hhh]j)}(hXKdo one or several I2C transfers. Note that, unlike i3c transfers, the core does not guarantee that buffers attached to the transfers are DMA-safe. If drivers want to have DMA-safe buffers, they should use the i2c_get_dma_safe_msg_buf() and i2c_put_dma_safe_msg_buf() helpers provided by the I2C framework. This method is mandatory.h]hXKdo one or several I2C transfers. Note that, unlike i3c transfers, the core does not guarantee that buffers attached to the transfers are DMA-safe. If drivers want to have DMA-safe buffers, they should use the i2c_get_dma_safe_msg_buf() and i2c_put_dma_safe_msg_buf() helpers provided by the I2C framework. This method is mandatory.}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjgubah}(h]h ]h"]h$]h&]uh1jVhjfubeh}(h]h ]h"]h$]h&]uh1j4hj ghMhjNdubj5)}(hXw``request_ibi`` attach an IBI handler to an I3C device. This implies defining an IBI handler and the constraints of the IBI (maximum payload length and number of pre-allocated slots). Some controllers support less IBI-capable devices than regular devices, so this method might return -``EBUSY`` if there's no more space for an extra IBI registration This method is optional. h](j;)}(h``request_ibi``h]jA)}(hj2gh]h request_ibi}(hj4ghhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj0gubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj,gubjW)}(hhh]j)}(hXfattach an IBI handler to an I3C device. This implies defining an IBI handler and the constraints of the IBI (maximum payload length and number of pre-allocated slots). Some controllers support less IBI-capable devices than regular devices, so this method might return -``EBUSY`` if there's no more space for an extra IBI registration This method is optional.h](hX attach an IBI handler to an I3C device. This implies defining an IBI handler and the constraints of the IBI (maximum payload length and number of pre-allocated slots). Some controllers support less IBI-capable devices than regular devices, so this method might return -}(hjKghhhNhNubjA)}(h ``EBUSY``h]hEBUSY}(hjSghhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjKgubhR if there’s no more space for an extra IBI registration This method is optional.}(hjKghhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjHgubah}(h]h ]h"]h$]h&]uh1jVhj,gubeh}(h]h ]h"]h$]h&]uh1j4hjGghMhjNdubj5)}(h``free_ibi`` free an IBI previously requested with ->request_ibi(). The IBI should have been disabled with ->disable_irq() prior to that This method is mandatory only if ->request_ibi is not NULL. h](j;)}(h ``free_ibi``h]jA)}(hj~gh]hfree_ibi}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj|gubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjxgubjW)}(hhh]j)}(hfree an IBI previously requested with ->request_ibi(). The IBI should have been disabled with ->disable_irq() prior to that This method is mandatory only if ->request_ibi is not NULL.h]hfree an IBI previously requested with ->request_ibi(). The IBI should have been disabled with ->disable_irq() prior to that This method is mandatory only if ->request_ibi is not NULL.}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjgubah}(h]h ]h"]h$]h&]uh1jVhjxgubeh}(h]h ]h"]h$]h&]uh1j4hjghMhjNdubj5)}(hXX``enable_ibi`` enable the IBI. Only valid if ->request_ibi() has been called prior to ->enable_ibi(). The controller should first enable the IBI on the controller end (for example, unmask the hardware IRQ) and then send the ENEC CCC command (with the IBI flag set) to the I3C device. This method is mandatory only if ->request_ibi is not NULL. h](j;)}(h``enable_ibi``h]jA)}(hjgh]h enable_ibi}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjgubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjgubjW)}(hhh]j)}(hXHenable the IBI. Only valid if ->request_ibi() has been called prior to ->enable_ibi(). The controller should first enable the IBI on the controller end (for example, unmask the hardware IRQ) and then send the ENEC CCC command (with the IBI flag set) to the I3C device. This method is mandatory only if ->request_ibi is not NULL.h]hXHenable the IBI. Only valid if ->request_ibi() has been called prior to ->enable_ibi(). The controller should first enable the IBI on the controller end (for example, unmask the hardware IRQ) and then send the ENEC CCC command (with the IBI flag set) to the I3C device. This method is mandatory only if ->request_ibi is not NULL.}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjgubah}(h]h ]h"]h$]h&]uh1jVhjgubeh}(h]h ]h"]h$]h&]uh1j4hjghMhjNdubj5)}(h``disable_ibi`` disable an IBI. First send the DISEC CCC command with the IBI flag set and then deactivate the hardware IRQ on the controller end. This method is mandatory only if ->request_ibi is not NULL. h](j;)}(h``disable_ibi``h]jA)}(hjgh]h disable_ibi}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjgubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjgubjW)}(hhh]j)}(hdisable an IBI. First send the DISEC CCC command with the IBI flag set and then deactivate the hardware IRQ on the controller end. This method is mandatory only if ->request_ibi is not NULL.h]hdisable an IBI. First send the DISEC CCC command with the IBI flag set and then deactivate the hardware IRQ on the controller end. This method is mandatory only if ->request_ibi is not NULL.}(hj hhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjhubah}(h]h ]h"]h$]h&]uh1jVhjgubeh}(h]h ]h"]h$]h&]uh1j4hjhhMhjNdubj5)}(hX ``recycle_ibi_slot`` recycle an IBI slot. Called every time an IBI has been processed by its handler. The IBI slot should be put back in the IBI slot pool so that the controller can re-use it for a future IBI This method is mandatory only if ->request_ibi is not NULL. h](j;)}(h``recycle_ibi_slot``h]jA)}(hj,hh]hrecycle_ibi_slot}(hj.hhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj*hubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj&hubjW)}(hhh]j)}(hrecycle an IBI slot. Called every time an IBI has been processed by its handler. The IBI slot should be put back in the IBI slot pool so that the controller can re-use it for a future IBI This method is mandatory only if ->request_ibi is not NULL.h]hrecycle an IBI slot. Called every time an IBI has been processed by its handler. The IBI slot should be put back in the IBI slot pool so that the controller can re-use it for a future IBI This method is mandatory only if ->request_ibi is not NULL.}(hjEhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjBhubah}(h]h ]h"]h$]h&]uh1jVhj&hubeh}(h]h ]h"]h$]h&]uh1j4hjAhhMhjNdubj5)}(h1``enable_hotjoin`` enable hot join event detect. h](j;)}(h``enable_hotjoin``h]jA)}(hjfhh]henable_hotjoin}(hjhhhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjdhubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj`hubjW)}(hhh]j)}(henable hot join event detect.h]henable hot join event detect.}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{hhMhj|hubah}(h]h ]h"]h$]h&]uh1jVhj`hubeh}(h]h ]h"]h$]h&]uh1j4hj{hhMhjNdubj5)}(h3``disable_hotjoin`` disable hot join event detect. h](j;)}(h``disable_hotjoin``h]jA)}(hjhh]hdisable_hotjoin}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjhubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjhubjW)}(hhh]j)}(hdisable hot join event detect.h]hdisable hot join event detect.}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhMhjhubah}(h]h ]h"]h$]h&]uh1jVhjhubeh}(h]h ]h"]h$]h&]uh1j4hjhhMhjNdubj5)}(h1``set_speed`` adjust I3C open drain mode timing. h](j;)}(h ``set_speed``h]jA)}(hjhh]h set_speed}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjhubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjhubjW)}(hhh]j)}(h"adjust I3C open drain mode timing.h]h"adjust I3C open drain mode timing.}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhMhjhubah}(h]h ]h"]h$]h&]uh1jVhjhubeh}(h]h ]h"]h$]h&]uh1j4hjhhMhjNdubj5)}(hS``set_dev_nack_retry`` configure device NACK retry count for the master controller.h](j;)}(h``set_dev_nack_retry``h]jA)}(hjih]hset_dev_nack_retry}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjiubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj iubjW)}(hhh]j)}(h` ``secondary`` true if the master is a secondary master ``init_done`` true when the bus initialization is done ``hotjoin`` true if the master support hotjoin ``rpm_allowed`` true if Runtime PM allowed ``rpm_ibi_allowed`` true if IBI and Hot-Join allowed while runtime suspended ``shutting_down`` set to true when master begins shutdown or unregister ``boardinfo`` board-level information attached to devices connected on the bus ``boardinfo.i3c`` list of I3C boardinfo objects ``boardinfo.i2c`` list of I2C boardinfo objects ``bus`` I3C bus exposed by this master ``wq`` freezable workqueue which can be used by master drivers if they need to postpone operations that need to take place in a thread context. Typical examples are Hot Join processing which requires taking the bus lock in maintenance, which in turn, can only be done from a sleep-able context ``hj_work`` work item used to run DAA after a Hot-Join event is detected. Queued to **wq** by i3c_master_queue_hotjoin() ``reg_work`` work item used to register newly discovered I3C devices with the driver model. Queued to **wq** by i3c_master_do_daa_ext() so that device registration is deferred out of the DAA caller's context (notably the resume path), and is skipped if the controller is shutting down ``dev_nack_retry_count`` retry count when slave device nackh](j)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubh:}(hjihhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjiubjJ )}(hXZstruct i3c_master_controller { struct device dev; struct i3c_dev_desc *this; struct i2c_adapter i2c; const struct i3c_master_controller_ops *ops; unsigned int secondary : 1; unsigned int init_done : 1; unsigned int hotjoin: 1; unsigned int rpm_allowed: 1; unsigned int rpm_ibi_allowed: 1; bool shutting_down; struct { struct list_head i3c; struct list_head i2c; } boardinfo; struct i3c_bus bus; struct workqueue_struct *wq; struct work_struct hj_work; struct work_struct reg_work; unsigned int dev_nack_retry_count; };h]hXZstruct i3c_master_controller { struct device dev; struct i3c_dev_desc *this; struct i2c_adapter i2c; const struct i3c_master_controller_ops *ops; unsigned int secondary : 1; unsigned int init_done : 1; unsigned int hotjoin: 1; unsigned int rpm_allowed: 1; unsigned int rpm_ibi_allowed: 1; bool shutting_down; struct { struct list_head i3c; struct list_head i2c; } boardinfo; struct i3c_bus bus; struct workqueue_struct *wq; struct work_struct hj_work; struct work_struct reg_work; unsigned int dev_nack_retry_count; };}hjisbah}(h]h ]h"]h$]h&]hhuh1jJhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjiubj)}(h **Members**h]j)}(hjih]hMembers}(hjihhhNhNubah}(h]h ]h"]h$]h&]uh1jhjiubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjiubj0)}(hhh](j5)}(h4``dev`` device to be registered to the device-model h](j;)}(h``dev``h]jA)}(hjjh]hdev}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjjubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjjubjW)}(hhh]j)}(h+device to be registered to the device-modelh]h+device to be registered to the device-model}(hj2jhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.jhMhj/jubah}(h]h ]h"]h$]h&]uh1jVhjjubeh}(h]h ]h"]h$]h&]uh1j4hj.jhMhjjubj5)}(h``this`` an I3C device object representing this master. This device will be added to the list of I3C devs available on the bus h](j;)}(h``this``h]jA)}(hjRjh]hthis}(hjTjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjPjubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjLjubjW)}(hhh]j)}(huan I3C device object representing this master. This device will be added to the list of I3C devs available on the bush]huan I3C device object representing this master. This device will be added to the list of I3C devs available on the bus}(hjkjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjhjubah}(h]h ]h"]h$]h&]uh1jVhjLjubeh}(h]h ]h"]h$]h&]uh1j4hjgjhMhjjubj5)}(h``i2c`` I2C adapter used for backward compatibility. This adapter is registered to the I2C subsystem to be as transparent as possible to existing I2C drivers h](j;)}(h``i2c``h]jA)}(hjjh]hi2c}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjjubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjjubjW)}(hhh]j)}(hI2C adapter used for backward compatibility. This adapter is registered to the I2C subsystem to be as transparent as possible to existing I2C driversh]hI2C adapter used for backward compatibility. This adapter is registered to the I2C subsystem to be as transparent as possible to existing I2C drivers}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjjubah}(h]h ]h"]h$]h&]uh1jVhjjubeh}(h]h ]h"]h$]h&]uh1j4hjjhMhjjubj5)}(hf``ops`` master operations. See :c:type:`struct i3c_master_controller_ops ` h](j;)}(h``ops``h]jA)}(hjjh]hops}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjjubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjjubjW)}(hhh]j)}(h]master operations. See :c:type:`struct i3c_master_controller_ops `h](hmaster operations. See }(hjjhhhNhNubh)}(hF:c:type:`struct i3c_master_controller_ops `h]jA)}(hjjh]h struct i3c_master_controller_ops}(hjjhhhNhNubah}(h]h ](jUjc-typeeh"]h$]h&]uh1j@hjjubah}(h]h ]h"]h$]h&]refdocja refdomainjreftypetype refexplicitrefwarnjjgjji3c_master_controller_opsuh1hhjjhMhjjubeh}(h]h ]h"]h$]h&]uh1jhjjhMhjjubah}(h]h ]h"]h$]h&]uh1jVhjjubeh}(h]h ]h"]h$]h&]uh1j4hjjhMhjjubj5)}(h7``secondary`` true if the master is a secondary master h](j;)}(h ``secondary``h]jA)}(hjkh]h secondary}(hj khhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjkubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjkubjW)}(hhh]j)}(h(true if the master is a secondary masterh]h(true if the master is a secondary master}(hj7khhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3khMhj4kubah}(h]h ]h"]h$]h&]uh1jVhjkubeh}(h]h ]h"]h$]h&]uh1j4hj3khMhjjubj5)}(h7``init_done`` true when the bus initialization is done h](j;)}(h ``init_done``h]jA)}(hjWkh]h init_done}(hjYkhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjUkubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjQkubjW)}(hhh]j)}(h(true when the bus initialization is doneh]h(true when the bus initialization is done}(hjpkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlkhMhjmkubah}(h]h ]h"]h$]h&]uh1jVhjQkubeh}(h]h ]h"]h$]h&]uh1j4hjlkhMhjjubj5)}(h/``hotjoin`` true if the master support hotjoin h](j;)}(h ``hotjoin``h]jA)}(hjkh]hhotjoin}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjkubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjkubjW)}(hhh]j)}(h"true if the master support hotjoinh]h"true if the master support hotjoin}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkhMhjkubah}(h]h ]h"]h$]h&]uh1jVhjkubeh}(h]h ]h"]h$]h&]uh1j4hjkhMhjjubj5)}(h+``rpm_allowed`` true if Runtime PM allowed h](j;)}(h``rpm_allowed``h]jA)}(hjkh]h rpm_allowed}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjkubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjkubjW)}(hhh]j)}(htrue if Runtime PM allowedh]htrue if Runtime PM allowed}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkhMhjkubah}(h]h ]h"]h$]h&]uh1jVhjkubeh}(h]h ]h"]h$]h&]uh1j4hjkhMhjjubj5)}(hM``rpm_ibi_allowed`` true if IBI and Hot-Join allowed while runtime suspended h](j;)}(h``rpm_ibi_allowed``h]jA)}(hjlh]hrpm_ibi_allowed}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjlubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjkubjW)}(hhh]j)}(h8true if IBI and Hot-Join allowed while runtime suspendedh]h8true if IBI and Hot-Join allowed while runtime suspended}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlhMhjlubah}(h]h ]h"]h$]h&]uh1jVhjkubeh}(h]h ]h"]h$]h&]uh1j4hjlhMhjjubj5)}(hH``shutting_down`` set to true when master begins shutdown or unregister h](j;)}(h``shutting_down``h]jA)}(hj;lh]h shutting_down}(hj=lhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj9lubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj5lubjW)}(hhh]j)}(h5set to true when master begins shutdown or unregisterh]h5set to true when master begins shutdown or unregister}(hjTlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPlhMhjQlubah}(h]h ]h"]h$]h&]uh1jVhj5lubeh}(h]h ]h"]h$]h&]uh1j4hjPlhMhjjubj5)}(hO``boardinfo`` board-level information attached to devices connected on the bus h](j;)}(h ``boardinfo``h]jA)}(hjtlh]h boardinfo}(hjvlhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjrlubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjnlubjW)}(hhh]j)}(h@board-level information attached to devices connected on the bush]h@board-level information attached to devices connected on the bus}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlhMhjlubah}(h]h ]h"]h$]h&]uh1jVhjnlubeh}(h]h ]h"]h$]h&]uh1j4hjlhMhjjubj5)}(h1``boardinfo.i3c`` list of I3C boardinfo objects h](j;)}(h``boardinfo.i3c``h]jA)}(hjlh]h boardinfo.i3c}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjlubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjlubjW)}(hhh]j)}(hlist of I3C boardinfo objectsh]hlist of I3C boardinfo objects}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlhMhjlubah}(h]h ]h"]h$]h&]uh1jVhjlubeh}(h]h ]h"]h$]h&]uh1j4hjlhMhjjubj5)}(h0``boardinfo.i2c`` list of I2C boardinfo objects h](j;)}(h``boardinfo.i2c``h]jA)}(hjlh]h boardinfo.i2c}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjlubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjlubjW)}(hhh]j)}(hlist of I2C boardinfo objectsh]hlist of I2C boardinfo objects}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlhMhjlubah}(h]h ]h"]h$]h&]uh1jVhjlubeh}(h]h ]h"]h$]h&]uh1j4hjlhMhjjubj5)}(h'``bus`` I3C bus exposed by this master h](j;)}(h``bus``h]jA)}(hjmh]hbus}(hj!mhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjmubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjmubjW)}(hhh]j)}(hI3C bus exposed by this masterh]hI3C bus exposed by this master}(hj8mhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4mhMhj5mubah}(h]h ]h"]h$]h&]uh1jVhjmubeh}(h]h ]h"]h$]h&]uh1j4hj4mhMhjjubj5)}(hX&``wq`` freezable workqueue which can be used by master drivers if they need to postpone operations that need to take place in a thread context. Typical examples are Hot Join processing which requires taking the bus lock in maintenance, which in turn, can only be done from a sleep-able context h](j;)}(h``wq``h]jA)}(hjXmh]hwq}(hjZmhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjVmubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM hjRmubjW)}(hhh]j)}(hXfreezable workqueue which can be used by master drivers if they need to postpone operations that need to take place in a thread context. Typical examples are Hot Join processing which requires taking the bus lock in maintenance, which in turn, can only be done from a sleep-able contexth]hXfreezable workqueue which can be used by master drivers if they need to postpone operations that need to take place in a thread context. Typical examples are Hot Join processing which requires taking the bus lock in maintenance, which in turn, can only be done from a sleep-able context}(hjqmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjnmubah}(h]h ]h"]h$]h&]uh1jVhjRmubeh}(h]h ]h"]h$]h&]uh1j4hjmmhM hjjubj5)}(hy``hj_work`` work item used to run DAA after a Hot-Join event is detected. Queued to **wq** by i3c_master_queue_hotjoin() h](j;)}(h ``hj_work``h]jA)}(hjmh]hhj_work}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjmubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjmubjW)}(hhh]j)}(hlwork item used to run DAA after a Hot-Join event is detected. Queued to **wq** by i3c_master_queue_hotjoin()h](hHwork item used to run DAA after a Hot-Join event is detected. Queued to }(hjmhhhNhNubj)}(h**wq**h]hwq}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubh by i3c_master_queue_hotjoin()}(hjmhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM hjmubah}(h]h ]h"]h$]h&]uh1jVhjmubeh}(h]h ]h"]h$]h&]uh1j4hjmhMhjjubj5)}(hX``reg_work`` work item used to register newly discovered I3C devices with the driver model. Queued to **wq** by i3c_master_do_daa_ext() so that device registration is deferred out of the DAA caller's context (notably the resume path), and is skipped if the controller is shutting down h](j;)}(h ``reg_work``h]jA)}(hjmh]hreg_work}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjmubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjmubjW)}(hhh]j)}(hXwork item used to register newly discovered I3C devices with the driver model. Queued to **wq** by i3c_master_do_daa_ext() so that device registration is deferred out of the DAA caller's context (notably the resume path), and is skipped if the controller is shutting downh](hYwork item used to register newly discovered I3C devices with the driver model. Queued to }(hjmhhhNhNubj)}(h**wq**h]hwq}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjmubh by i3c_master_do_daa_ext() so that device registration is deferred out of the DAA caller’s context (notably the resume path), and is skipped if the controller is shutting down}(hjmhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjmubah}(h]h ]h"]h$]h&]uh1jVhjmubeh}(h]h ]h"]h$]h&]uh1j4hjmhMhjjubj5)}(h;``dev_nack_retry_count`` retry count when slave device nackh](j;)}(h``dev_nack_retry_count``h]jA)}(hj*nh]hdev_nack_retry_count}(hj,nhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj(nubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj$nubjW)}(hhh]j)}(h"retry count when slave device nackh]h"retry count when slave device nack}(hjCnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj@nubah}(h]h ]h"]h$]h&]uh1jVhj$nubeh}(h]h ]h"]h$]h&]uh1j4hj?nhMhjjubeh}(h]h ]h"]h$]h&]uh1j/hjiubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hjmnh]h Description}(hjonhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjknubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhhhhubj)}(hX&A :c:type:`struct i3c_master_controller ` has to be registered to the I3C subsystem through i3c_master_register(). None of :c:type:`struct i3c_master_controller ` fields should be set manually, just pass appropriate values to i3c_master_register().h](hA }(hjnhhhNhNubh)}(h>:c:type:`struct i3c_master_controller `h]jA)}(hjnh]hstruct i3c_master_controller}(hjnhhhNhNubah}(h]h ](jUjc-typeeh"]h$]h&]uh1j@hjnubah}(h]h ]h"]h$]h&]refdocja refdomainjreftypetype refexplicitrefwarnjjgjji3c_master_controlleruh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjnubhR has to be registered to the I3C subsystem through i3c_master_register(). None of }(hjnhhhNhNubh)}(h>:c:type:`struct i3c_master_controller `h]jA)}(hjnh]hstruct i3c_master_controller}(hjnhhhNhNubah}(h]h ](jUjc-typeeh"]h$]h&]uh1j@hjnubah}(h]h ]h"]h$]h&]refdocja refdomainjreftypetype refexplicitrefwarnjjgjji3c_master_controlleruh1hhjnhMhjnubhV fields should be set manually, just pass appropriate values to i3c_master_register().}(hjnhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjnhMhhhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!i3c_bus_for_each_i2cdev (C macro)c.i3c_bus_for_each_i2cdevhNtauh1hhhhhhNhNubh)}(hhh](h)}(hi3c_bus_for_each_i2cdevh]h)}(hi3c_bus_for_each_i2cdevh]j#)}(hi3c_bus_for_each_i2cdevh]j))}(hjnh]hi3c_bus_for_each_i2cdev}(hjnhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjnubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hjnhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM1ubah}(h]h ]h"]h$]h&]hhjuh1hjjhjnhhhjohM1ubah}(h]jnah ](jjeh"]h$]h&]jj)jhuh1hhjohM1hjnhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjnhhhjohM1ubeh}(h]h ](jmacroeh"]h$]h&]j jj j!oj j!oj j juh1hhhhhhNhNubj)}(h&``i3c_bus_for_each_i2cdev (bus, dev)``h]jA)}(hj'oh]h"i3c_bus_for_each_i2cdev (bus, dev)}(hj)ohhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj%oubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM3hhhhubh block_quote)}(h0iterate over all I2C devices present on the bus h]j)}(h/iterate over all I2C devices present on the bush]h/iterate over all I2C devices present on the bus}(hjCohhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM1hj?oubah}(h]h ]h"]h$]h&]uh1j=ohjQohM1hhhhubj)}(h**Parameters** ``bus`` the I3C bus ``dev`` an I2C device descriptor pointer updated to point to the current slot at each iteration of the loop **Description** Iterate over all I2C devs present on the bus.h](j)}(h**Parameters**h]j)}(hj^oh]h Parameters}(hj`ohhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\oubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM5hjXoubj0)}(hhh](j5)}(h``bus`` the I3C bus h](j;)}(h``bus``h]jA)}(hj}oh]hbus}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj{oubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM2hjwoubjW)}(hhh]j)}(h the I3C bush]h the I3C bus}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjohM2hjoubah}(h]h ]h"]h$]h&]uh1jVhjwoubeh}(h]h ]h"]h$]h&]uh1j4hjohM2hjtoubj5)}(hl``dev`` an I2C device descriptor pointer updated to point to the current slot at each iteration of the loop h](j;)}(h``dev``h]jA)}(hjoh]hdev}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjoubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM4hjoubjW)}(hhh]j)}(hcan I2C device descriptor pointer updated to point to the current slot at each iteration of the looph]hcan I2C device descriptor pointer updated to point to the current slot at each iteration of the loop}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM3hjoubah}(h]h ]h"]h$]h&]uh1jVhjoubeh}(h]h ]h"]h$]h&]uh1j4hjohM4hjtoubeh}(h]h ]h"]h$]h&]uh1j/hjXoubj)}(h**Description**h]j)}(hjoh]h Description}(hjohhhNhNubah}(h]h ]h"]h$]h&]uh1jhjoubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM6hjXoubj)}(h-Iterate over all I2C devs present on the bus.h]h-Iterate over all I2C devs present on the bus.}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM5hjXoubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h!i3c_bus_for_each_i3cdev (C macro)c.i3c_bus_for_each_i3cdevhNtauh1hhhhhhNhNubh)}(hhh](h)}(hi3c_bus_for_each_i3cdevh]h)}(hi3c_bus_for_each_i3cdevh]j#)}(hi3c_bus_for_each_i3cdevh]j))}(hj1ph]hi3c_bus_for_each_i3cdev}(hj;phhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj7pubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hj3phhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM<ubah}(h]h ]h"]h$]h&]hhjuh1hjjhj/phhhjNphM<ubah}(h]j*pah ](jjeh"]h$]h&]jj)jhuh1hhjNphM<hj,phhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj,phhhjNphM<ubeh}(h]h ](jmacroeh"]h$]h&]j jj jgpj jgpj j juh1hhhhhhNhNubj)}(h&``i3c_bus_for_each_i3cdev (bus, dev)``h]jA)}(hjmph]h"i3c_bus_for_each_i3cdev (bus, dev)}(hjophhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjkpubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM>hhhhubj>o)}(h0iterate over all I3C devices present on the bus h]j)}(h/iterate over all I3C devices present on the bush]h/iterate over all I3C devices present on the bus}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM<hjpubah}(h]h ]h"]h$]h&]uh1j=ohjphM<hhhhubj)}(h**Parameters** ``bus`` the I3C bus ``dev`` and I3C device descriptor pointer updated to point to the current slot at each iteration of the loop **Description** Iterate over all I3C devs present on the bus.h](j)}(h**Parameters**h]j)}(hjph]h Parameters}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM@hjpubj0)}(hhh](j5)}(h``bus`` the I3C bus h](j;)}(h``bus``h]jA)}(hjph]hbus}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjpubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM=hjpubjW)}(hhh]j)}(h the I3C bush]h the I3C bus}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjphM=hjpubah}(h]h ]h"]h$]h&]uh1jVhjpubeh}(h]h ]h"]h$]h&]uh1j4hjphM=hjpubj5)}(hm``dev`` and I3C device descriptor pointer updated to point to the current slot at each iteration of the loop h](j;)}(h``dev``h]jA)}(hjph]hdev}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjpubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM?hjpubjW)}(hhh]j)}(hdand I3C device descriptor pointer updated to point to the current slot at each iteration of the looph]hdand I3C device descriptor pointer updated to point to the current slot at each iteration of the loop}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM>hjqubah}(h]h ]h"]h$]h&]uh1jVhjpubeh}(h]h ]h"]h$]h&]uh1j4hjqhM?hjpubeh}(h]h ]h"]h$]h&]uh1j/hjpubj)}(h**Description**h]j)}(hj6qh]h Description}(hj8qhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4qubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMAhjpubj)}(h-Iterate over all I3C devs present on the bus.h]h-Iterate over all I3C devs present on the bus.}(hjLqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM@hjpubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](hi3c_dma (C struct) c.i3c_dmahNtauh1hhhhhhNhNubh)}(hhh](h)}(hi3c_dmah]h)}(hstruct i3c_dmah](jN)}(hjQh]hstruct}(hj{qhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjwqhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMEubj)}(h h]h }(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwqhhhjqhMEubj#)}(hi3c_dmah]j))}(hjuqh]hi3c_dma}(hjqhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjqubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hjwqhhhjqhMEubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjsqhhhjqhMEubah}(h]jnqah ](jjeh"]h$]h&]jj)jhuh1hhjqhMEhjpqhhubj)}(hhh]j)}(h#DMA transfer and mapping descriptorh]h#DMA transfer and mapping descriptor}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMGhjqhhubah}(h]h ]h"]h$]h&]uh1jhjpqhhhjqhMEubeh}(h]h ](jstructeh"]h$]h&]j jj jqj jqj j juh1hhhhhhNhNubj)}(hX**Definition**:: struct i3c_dma { struct device *dev; void *buf; size_t len; size_t map_len; dma_addr_t addr; enum dma_data_direction dir; void *bounce_buf; }; **Members** ``dev`` device object of a device doing DMA ``buf`` destination/source buffer for DMA ``len`` length of transfer ``map_len`` length of DMA mapping ``addr`` mapped DMA address for a Host Controller Driver ``dir`` DMA direction ``bounce_buf`` an allocated bounce buffer if transfer needs it or NULLh](j)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjqhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjqubh:}(hjqhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMKhjqubjJ)}(hstruct i3c_dma { struct device *dev; void *buf; size_t len; size_t map_len; dma_addr_t addr; enum dma_data_direction dir; void *bounce_buf; };h]hstruct i3c_dma { struct device *dev; void *buf; size_t len; size_t map_len; dma_addr_t addr; enum dma_data_direction dir; void *bounce_buf; };}hjqsbah}(h]h ]h"]h$]h&]hhuh1jJhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMMhjqubj)}(h **Members**h]j)}(hj rh]hMembers}(hj rhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj rubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMWhjqubj0)}(hhh](j5)}(h,``dev`` device object of a device doing DMA h](j;)}(h``dev``h]jA)}(hj*rh]hdev}(hj,rhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj(rubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMIhj$rubjW)}(hhh]j)}(h#device object of a device doing DMAh]h#device object of a device doing DMA}(hjCrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?rhMIhj@rubah}(h]h ]h"]h$]h&]uh1jVhj$rubeh}(h]h ]h"]h$]h&]uh1j4hj?rhMIhj!rubj5)}(h*``buf`` destination/source buffer for DMA h](j;)}(h``buf``h]jA)}(hjcrh]hbuf}(hjerhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjarubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMJhj]rubjW)}(hhh]j)}(h!destination/source buffer for DMAh]h!destination/source buffer for DMA}(hj|rhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxrhMJhjyrubah}(h]h ]h"]h$]h&]uh1jVhj]rubeh}(h]h ]h"]h$]h&]uh1j4hjxrhMJhj!rubj5)}(h``len`` length of transfer h](j;)}(h``len``h]jA)}(hjrh]hlen}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjrubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMKhjrubjW)}(hhh]j)}(hlength of transferh]hlength of transfer}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrhMKhjrubah}(h]h ]h"]h$]h&]uh1jVhjrubeh}(h]h ]h"]h$]h&]uh1j4hjrhMKhj!rubj5)}(h"``map_len`` length of DMA mapping h](j;)}(h ``map_len``h]jA)}(hjrh]hmap_len}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjrubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMLhjrubjW)}(hhh]j)}(hlength of DMA mappingh]hlength of DMA mapping}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrhMLhjrubah}(h]h ]h"]h$]h&]uh1jVhjrubeh}(h]h ]h"]h$]h&]uh1j4hjrhMLhj!rubj5)}(h9``addr`` mapped DMA address for a Host Controller Driver h](j;)}(h``addr``h]jA)}(hjsh]haddr}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj subah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMMhjsubjW)}(hhh]j)}(h/mapped DMA address for a Host Controller Driverh]h/mapped DMA address for a Host Controller Driver}(hj'shhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#shMMhj$subah}(h]h ]h"]h$]h&]uh1jVhjsubeh}(h]h ]h"]h$]h&]uh1j4hj#shMMhj!rubj5)}(h``dir`` DMA direction h](j;)}(h``dir``h]jA)}(hjGsh]hdir}(hjIshhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjEsubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMNhjAsubjW)}(hhh]j)}(h DMA directionh]h DMA direction}(hj`shhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\shMNhj]subah}(h]h ]h"]h$]h&]uh1jVhjAsubeh}(h]h ]h"]h$]h&]uh1j4hj\shMNhj!rubj5)}(hF``bounce_buf`` an allocated bounce buffer if transfer needs it or NULLh](j;)}(h``bounce_buf``h]jA)}(hjsh]h bounce_buf}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj~subah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMNhjzsubjW)}(hhh]j)}(h7an allocated bounce buffer if transfer needs it or NULLh]h7an allocated bounce buffer if transfer needs it or NULL}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMOhjsubah}(h]h ]h"]h$]h&]uh1jVhjzsubeh}(h]h ]h"]h$]h&]uh1j4hjshMNhj!rubeh}(h]h ]h"]h$]h&]uh1j/hjqubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h$i3c_dev_get_master_data (C function)c.i3c_dev_get_master_datahNtauh1hhhhhhNhNubh)}(hhh](h)}(h?void * i3c_dev_get_master_data (const struct i3c_dev_desc *dev)h]h)}(h=void *i3c_dev_get_master_data(const struct i3c_dev_desc *dev)h](j)}(hvoidh]hvoid}(hjshhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjshhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMubj)}(h h]h }(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjshhhjshMubj)}(hjh]h*}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjshhhjshMubj#)}(hi3c_dev_get_master_datah]j))}(hi3c_dev_get_master_datah]hi3c_dev_get_master_data}(hjthhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjtubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hjshhhjshMubjB)}(h (const struct i3c_dev_desc *dev)h]jH)}(hconst struct i3c_dev_desc *devh](jN)}(hj!#h]hconst}(hj$thhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhj tubj)}(h h]h }(hj1thhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj tubjN)}(hjQh]hstruct}(hj?thhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhj tubj)}(h h]h }(hjLthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj tubh)}(hhh]j))}(h i3c_dev_desch]h i3c_dev_desc}(hj]thhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjZtubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj_tmodnameN classnameNjj)}j]j)}jj tsbc.i3c_dev_get_master_dataasbuh1hhj tubj)}(h h]h }(hj}thhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj tubj)}(hjh]h*}(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj tubj))}(hdevh]hdev}(hjthhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj tubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjtubah}(h]h ]h"]h$]h&]hhuh1jAhjshhhjshMubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjshhhjshMubah}(h]jsah ](jjeh"]h$]h&]jj)jhuh1hhjshMhjshhubj)}(hhh]j)}(huh]hReturn}(hj@uhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj