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.chKubhdesc_sig_space)}(h h]h }(hjhhhNhNubah}(h]h ]wah"]h$]h&]uh1jhhhhhjhKubh 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"hhhhhjhKubhdesc_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&]hhuh1jAhhhhhjhKubeh}(h]h ]h"]h$]h&]hhƌ add_permalinkuh1hsphinx_line_type declaratorhhhhhjhKubah}(h]hah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1hhjhKhhhhubh 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.chKhjhhubah}(h]h ]h"]h$]h&]uh1jhhhhhjhKubeh}(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.chKhj6ubh definition)}(hhh]j)}(hI3C bus to take the lock onh]hI3C bus to take the lock on}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUhKhjXubah}(h]h ]h"]h$]h&]uh1jVhj6ubeh}(h]h ]h"]h$]h&]uh1j4hjUhKhj1ubah}(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.chK3ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhK3ubj#)}(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"hjhhhjhK3ubjB)}(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&]hhuh1jAhjhhhjhK3ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjhhhjhK3ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhK3hjhhubj)}(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.chK3hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhK3ubeh}(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.chK7hjubj0)}(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.chK5hjubjW)}(hhh]j)}(hI3C bus to release the lock onh]hI3C bus to release the lock on}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhK5hjubah}(h]h ]h"]h$]h&]uh1jVhjubeh}(h]h ]h"]h$]h&]uh1j4hjhK5hjubah}(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.chK7hjubj)}(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.chK6hjubeh}(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.chKAubj)}(h h]h }(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNhhhj`hKAubj#)}(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`hKAubjB)}(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`hKAubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjJhhhj`hKAubah}(h]jEah ](jjeh"]h$]h&]jj)jhuh1hhj`hKAhjGhhubj)}(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.chKAhjhhubah}(h]h ]h"]h$]h&]uh1jhjGhhhj`hKAubeh}(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.chKEhj.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.chKBhjMubjW)}(hhh]j)}(hI3C bus to take the lock onh]hI3C bus to take the lock on}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhhKBhjiubah}(h]h ]h"]h$]h&]uh1jVhjMubeh}(h]h ]h"]h$]h&]uh1j4hjhhKBhjJubah}(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.chKDhj.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.chKChj.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.chKIhj.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.chKVubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhKVubj#)}(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"hjhhhjhKVubjB)}(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&]hhuh1jAhjhhhjhKVubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjhhhjhKVubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhKVhjhhubj)}(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.chKVhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKVubeh}(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.chKZhjubj0)}(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.chKWhjubjW)}(hhh]j)}(hI3C bus to release the lock onh]hI3C bus to release the lock on}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKWhjubah}(h]h ]h"]h$]h&]uh1jVhjubeh}(h]h ]h"]h$]h&]uh1j4hjhKWhjubah}(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.chKYhjubj)}(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.chKXhjubeh}(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}(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_send_ccc_cmd_lockedh]j))}(hi3c_master_send_ccc_cmd_lockedh]hi3c_master_send_ccc_cmd_locked}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hj_hhhjqhMubjB)}(h?(struct i3c_master_controller *master, struct i3c_ccc_cmd *cmd)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)}jjsb c.i3c_master_send_ccc_cmd_lockedasbuh1hhjubj)}(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&]noemphhhuh1jGhjubjH)}(hstruct i3c_ccc_cmd *cmdh](jN)}(hjQh]hstruct}(hjhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j))}(h i3c_ccc_cmdh]h i3c_ccc_cmd}(hj0hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj-ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj2modnameN classnameNjj)}j]j c.i3c_master_send_ccc_cmd_lockedasbuh1hhjubj)}(h h]h }(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj))}(hcmdh]hcmd}(hjihhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjubeh}(h]h ]h"]h$]h&]hhuh1jAhj_hhhjqhMubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj[hhhjqhMubah}(h]jVah ](jjeh"]h$]h&]jj)jhuh1hhjqhMhjXhhubj)}(hhh]j)}(h!send a CCC (Common Command Codes)h]h!send a CCC (Common Command Codes)}(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&]uh1jhjXhhhjqhMubeh}(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 ``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)}(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&]uh1j4hjhMhjubj5)}(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" hMhjubeh}(h]h ]h"]h$]h&]uh1j/hjubj)}(h **Return**h]j)}(hjH h]hReturn}(hjJ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjF ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubj)}(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.chMhjubeh}(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}(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_get_free_addrasbuh1hhj 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 u8 start_addrh](h)}(hhh]j))}(hu8h]hu8}(hj? hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj< ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjA modnameN classnameNjj)}j]j c.i3c_master_get_free_addrasbuh1hhj8 ubj)}(h h]h }(hj] hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8 ubj))}(h start_addrh]h start_addr}(hjk hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj8 ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhj 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)}(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)}(h;``struct i3c_master_controller *master`` I3C master object 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)}(hI3C master objecth]hI3C master object}(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+``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$ hMhj ubeh}(h]h ]h"]h$]h&]uh1j/hj ubj)}(h**Description**h]j)}(hjJ h]h Description}(hjL hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjH 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)}(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.chMhj ubj)}(h **Return**h]j)}(hjq h]hReturn}(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)}(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.chMhj 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}(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_entdaa_lockedh]j))}(hi3c_master_entdaa_lockedh]hi3c_master_entdaa_locked}(hj hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj ubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hj hhhj hMubjB)}(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_entdaa_lockedasbuh1hhj ubj)}(h h]h }(hjC hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hjh]h*}(hjQ 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&]hhuh1jAhj hhhj hMubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj hhhj hMubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1hhj hMhj 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.chMhj hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hMubeh}(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.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.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 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.chM hj ubj)}(h3Send a ENTDAA CCC command to start a DAA procedure.h]h3Send a ENTDAA CCC command to start a DAA 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.chMhj 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.}(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.}(hj8 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)}(h **Return**h]j)}(hjI h]hReturn}(hjK hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjG 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)}(h90 in case of success, or a negative error code otherwise.h]h90 in case of success, or 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_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}(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.chMZubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhj hMZubj#)}(hi3c_master_disec_lockedh]j))}(hi3c_master_disec_lockedh]hi3c_master_disec_locked}(hj hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj ubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hj hhhj hMZubjB)}(h8(struct i3c_master_controller *master, u8 addr, u8 evts)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_disec_lockedasbuh1hhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hjh]h*}(hjhhhNhNubah}(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)}(hu8 addrh](h)}(hhh]j))}(hu8h]hu8}(hj@hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj=ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjBmodnameN classnameNjj)}j]jc.i3c_master_disec_lockedasbuh1hhj9ubj)}(h h]h }(hj^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9ubj))}(haddrh]haddr}(hjlhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj9ubeh}(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]jc.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&]hhuh1jAhj hhhj hMZubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj hhhj hMZubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1hhj hMZhj hhubj)}(hhh]j)}(hsend a DISEC CCC commandh]hsend a 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.chMZhjhhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hMZubeh}(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`` ``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)}(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.chM^hjubj0)}(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}(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.chM[hjubjW)}(hhh]j)}(h%master used to send frames on the bush]h%master used to send frames on the bus}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4hM[hj5ubah}(h]h ]h"]h$]h&]uh1jVhjubeh}(h]h ]h"]h$]h&]uh1j4hj4hM[hjubj5)}(h@``u8 addr`` a valid I3C slave address or ``I3C_BROADCAST_ADDR`` h](j;)}(h ``u8 addr``h]jA)}(hjXh]hu8 addr}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjVubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM\hjRubjW)}(hhh]j)}(h3a valid I3C slave address or ``I3C_BROADCAST_ADDR``h](ha valid I3C slave address or }(hjqhhhNhNubjA)}(h``I3C_BROADCAST_ADDR``h]hI3C_BROADCAST_ADDR}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjqubeh}(h]h ]h"]h$]h&]uh1jhjmhM\hjnubah}(h]h ]h"]h$]h&]uh1jVhjRubeh}(h]h ]h"]h$]h&]uh1j4hjmhM\hjubj5)}(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.chM]hjubjW)}(hhh]j)}(hevents to disableh]hevents to disable}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhM]hjubah}(h]h ]h"]h$]h&]uh1jVhjubeh}(h]h ]h"]h$]h&]uh1j4hjhM]hjubeh}(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.chM_hjubj)}(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 }(hjhhhNhNubj)}(h**addr**h]haddr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is }(hjhhhNhNubjA)}(h``I3C_BROADCAST_ADDR``h]hI3C_BROADCAST_ADDR}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjubh.}(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.}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMahjubj)}(h **Return**h]j)}(hj4h]hReturn}(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.chMchjubj)}(h90 in case of success, or a negative error code otherwise.h]h90 in case of success, or a negative error code otherwise.}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMdhjubeh}(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}(hjyhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjuhhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMnubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuhhhjhMnubj#)}(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"hjuhhhjhMnubjB)}(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 }(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_enec_lockedasbuh1hhjubj)}(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&]noemphhhuh1jGhjubjH)}(hu8 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]jc.i3c_master_enec_lockedasbuh1hhj$ubj)}(h h]h }(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj))}(haddrh]haddr}(hjWhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj$ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjubjH)}(hu8 evtsh](h)}(hhh]j))}(hu8h]hu8}(hjshhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjpubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjumodnameN classnameNjj)}j]jc.i3c_master_enec_lockedasbuh1hhjlubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj))}(hevtsh]hevts}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjlubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjubeh}(h]h ]h"]h$]h&]hhuh1jAhjuhhhjhMnubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjqhhhjhMnubah}(h]jlah ](jjeh"]h$]h&]jj)jhuh1hhjhMnhjnhhubj)}(hhh]j)}(hsend an ENEC CCC commandh]hsend an ENEC 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.chMnhjhhubah}(h]h ]h"]h$]h&]uh1jhjnhhhjhMnubeh}(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`` ``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)}(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.chMrhjubj0)}(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.chMohjubjW)}(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&]uh1jhjhMohj ubah}(h]h ]h"]h$]h&]uh1jVhjubeh}(h]h ]h"]h$]h&]uh1j4hjhMohjubj5)}(h@``u8 addr`` a valid I3C slave address or ``I3C_BROADCAST_ADDR`` h](j;)}(h ``u8 addr``h]jA)}(hjCh]hu8 addr}(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.chMphj=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}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj\ubeh}(h]h ]h"]h$]h&]uh1jhjXhMphjYubah}(h]h ]h"]h$]h&]uh1jVhj=ubeh}(h]h ]h"]h$]h&]uh1j4hjXhMphjubj5)}(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.chMqhjubjW)}(hhh]j)}(hevents to disableh]hevents to disable}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMqhjubah}(h]h ]h"]h$]h&]uh1jVhjubeh}(h]h ]h"]h$]h&]uh1j4hjhMqhjubeh}(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.chMshjubj)}(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 }(hjhhhNhNubj)}(h**addr**h]haddr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is }(hjhhhNhNubjA)}(h``I3C_BROADCAST_ADDR``h]hI3C_BROADCAST_ADDR}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMrhjubj)}(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.chMuhjubj)}(h **Return**h]j)}(hjh]hReturn}(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.chMwhjubj)}(h90 in case of success, or a negative error code otherwise.h]h90 in case of success, or a negative error code otherwise.}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMxhjubeh}(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}(hjdhhhNhNubah}(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 }(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`hhhjrhMubj#)}(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"hj`hhhjrhMubjB)}(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_defslvs_lockedasbuh1hhjubj)}(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`hhhjrhMubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj\hhhjrhMubah}(h]jWah ](jjeh"]h$]h&]jj)jhuh1hhjrhMhjYhhubj)}(hhh]j)}(hsend a DEFSLVS CCC commandh]hsend a DEFSLVS CCC command}(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&]uh1jhjYhhhjrhMubeh}(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 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)}(hjFh]h Parameters}(hjHhhhNhNubah}(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.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)}(hjeh]h$struct i3c_master_controller *master}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjcubah}(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&]uh1jhjzhMhj{ubah}(h]h ]h"]h$]h&]uh1jVhj_ubeh}(h]h ]h"]h$]h&]uh1j4hjzhMhj\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)}(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}(hjhhhNhNubah}(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.chMhj@ubj)}(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 }(hjhhhNhNubh)}(hM:c:type:`i3c_master_controller_ops->bus_init\(\) `h]jA)}(hjh]h%i3c_master_controller_ops->bus_init()}(hjhhhNhNubah}(h]h ](xrefjc-typeeh"]h$]h&]uh1j@hjubah}(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.chMhjubh~. It should also be called if a master ACKed an Hot-Join request and assigned a dynamic address to the device joining the bus.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjhMhj@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.chMhj@ubj)}(h **Return**h]j)}(hj h]hReturn}(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.chMhj@ubj)}(h90 in case of success, or a negative error code otherwise.h]h90 in case of success, or a negative error code otherwise.}(hj6hhhNhNubah}(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_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}(hjehhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjahhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM ubj)}(h h]h }(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjahhhjshM ubj#)}(hi3c_master_do_daa_exth]j))}(hi3c_master_do_daa_exth]hi3c_master_do_daa_ext}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hjahhhjshM ubjB)}(h3(struct i3c_master_controller *master, bool rstdaa)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_do_daa_extasbuh1hhjubj)}(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&]noemphhhuh1jGhjubjH)}(h bool rstdaah](j)}(hboolh]hbool}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjubj)}(h h]h }(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj))}(hrstdaah]hrstdaa}(hj0hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjubeh}(h]h ]h"]h$]h&]hhuh1jAhjahhhjshM ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj]hhhjshM ubah}(h]jXah ](jjeh"]h$]h&]jj)jhuh1hhjshM hjZhhubj)}(hhh]j)}(h-Dynamic Address Assignment (extended version)h]h-Dynamic Address Assignment (extended version)}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjWhhubah}(h]h ]h"]h$]h&]uh1jhjZhhhjshM ubeh}(h]h ](jfunctioneh"]h$]h&]j jj jrj jrj 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&]uh1jhjzubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjvubj0)}(hhh](j5)}(h4``struct i3c_master_controller *master`` controller 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.chM hjubjW)}(hhh]j)}(h controllerh]h controller}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhM hjubah}(h]h ]h"]h$]h&]uh1jVhjubeh}(h]h ]h"]h$]h&]uh1j4hjhM hjubj5)}(hM``bool rstdaa`` whether to first perform Reset of Dynamic Addresses (RSTDAA) h](j;)}(h``bool rstdaa``h]jA)}(hjh]h bool rstdaa}(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``struct i3c_master_controller *master`` master doing the DAA 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.chM<hjubjW)}(hhh]j)}(hmaster doing the DAAh]hmaster doing the DAA}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhM<hjubah}(h]h ]h"]h$]h&]uh1jVhjubeh}(h]h ]h"]h$]h&]uh1j4hjhM<hjubah}(h]h ]h"]h$]h&]uh1j/hjxubj)}(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.chM>hjxubj)}(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.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM=hjxubj)}(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.chMAhjxubj)}(h9a 0 in case of success, an negative error code otherwise.h]h9a 0 in case of success, an 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.chMBhjxubeh}(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}(hjDhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhj@hhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMKubj)}(h h]h }(hjRhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@hhhjQhMKubh)}(hhh]j))}(hi3c_dmah]hi3c_dma}(hjchhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj`ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjemodnameN classnameNjj)}j]j)}ji3c_master_dma_map_singlesbc.i3c_master_dma_map_singleasbuh1hhj@hhhjQhMKubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@hhhjQhMKubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj@hhhjQhMKubj#)}(hi3c_master_dma_map_singleh]j))}(hjh]hi3c_master_dma_map_single}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hj@hhhjQhMKubjB)}(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&]uh1jMhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j))}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]jc.i3c_master_dma_map_singleasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj))}(hdevh]hdev}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjubjH)}(h void *bufh](j)}(hvoidh]hvoid}(hj.hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj*ubj)}(h h]h }(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubj)}(hjh]h*}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubj))}(hbufh]hbuf}(hjWhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj*ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjubjH)}(h size_t lenh](h)}(hhh]j))}(hsize_th]hsize_t}(hjshhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjpubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjumodnameN classnameNjj)}j]jc.i3c_master_dma_map_singleasbuh1hhjlubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj))}(hlenh]hlen}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjlubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjubjH)}(hbool force_bounceh](j)}(hjh]hbool}(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj))}(h force_bounceh]h force_bounce}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjubjH)}(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}(hj hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjj)}j]jc.i3c_master_dma_map_singleasbuh1hhjubj)}(h h]h }(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj))}(hdirh]hdir}(hj7hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjubeh}(h]h ]h"]h$]h&]hhuh1jAhj@hhhjQhMKubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj<hhhjQhMKubah}(h]j7ah ](jjeh"]h$]h&]jj)jhuh1hhjQhMKhj9hhubj)}(hhh]j)}(h"Map buffer for single DMA transferh]h"Map buffer for single DMA transfer}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMKhj^hhubah}(h]h ]h"]h$]h&]uh1jhj9hhhjQhMKubeh}(h]h ](jfunctioneh"]h$]h&]j jj jyj jyj 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)}(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.chMOhj}ubj0)}(hhh](j5)}(h;``struct device *dev`` device object of a device doing DMA h](j;)}(h``struct device *dev``h]jA)}(hjh]hstruct device *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.chMLhjubjW)}(hhh]j)}(h#device object of a device doing DMAh]h#device object of a device doing DMA}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMLhjubah}(h]h ]h"]h$]h&]uh1jVhjubeh}(h]h ]h"]h$]h&]uh1j4hjhMLhjubj5)}(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.chMMhjubjW)}(hhh]j)}(h!destination/source buffer for DMAh]h!destination/source buffer for DMA}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMMhjubah}(h]h ]h"]h$]h&]uh1jVhjubeh}(h]h ]h"]h$]h&]uh1j4hjhMMhjubj5)}(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.chMNhjubjW)}(hhh]j)}(hlength of transferh]hlength of transfer}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)hMNhj*ubah}(h]h ]h"]h$]h&]uh1jVhjubeh}(h]h ]h"]h$]h&]uh1j4hj)hMNhjubj5)}(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)}(hjMh]hbool force_bounce}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjKubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMPhjGubjW)}(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}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMOhjcubah}(h]h ]h"]h$]h&]uh1jVhjGubeh}(h]h ]h"]h$]h&]uh1j4hjbhMPhjubj5)}(h.``enum dma_data_direction dir`` DMA direction h](j;)}(h``enum dma_data_direction dir``h]jA)}(hjh]henum dma_data_direction dir}(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.chMQhjubjW)}(hhh]j)}(h DMA directionh]h DMA direction}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMQhjubah}(h]h ]h"]h$]h&]uh1jVhjubeh}(h]h ]h"]h$]h&]uh1j4hjhMQhjubeh}(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)}(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.}(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)}(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.chMThj}ubj)}(h5I3C DMA transfer descriptor or NULL in case of error.h]h5I3C DMA transfer descriptor or NULL in case of error.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMUhj}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}(hjOhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjKubah}(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}(hjkhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjgubj)}(h h]h }(hjxhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubh)}(hhh]j))}(hi3c_dmah]hi3c_dma}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j)}jjQsbc.i3c_master_dma_unmap_singleasbuh1hhjgubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjgubj))}(hdma_xferh]hdma_xfer}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjgubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjcubah}(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}(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&]uh1jhj#hhhj<hMubeh}(h]h ](jfunctioneh"]h$]h&]j jj jj jj 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)}(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.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}(hj1hhhNhNubah}(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}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDhMhjEubah}(h]h ]h"]h$]h&]uh1jVhj)ubeh}(h]h ]h"]h$]h&]uh1j4hjDhMhj&ubah}(h]h ]h"]h$]h&]uh1j/hj ubj)}(h**Description**h]j)}(hjjh]h Description}(hjlhhhNhNubah}(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.chMhj ubj)}(h1Unmap buffer and cleanup DMA transfer descriptor.h]h1Unmap buffer and cleanup DMA transfer descriptor.}(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_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}(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_set_infoh]j))}(hi3c_master_set_infoh]hi3c_master_set_info}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hjhhhjhMubjB)}(hJ(struct i3c_master_controller *master, const struct i3c_device_info *info)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}(hj hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjj)}j]j)}jjsbc.i3c_master_set_infoasbuh1hhjubj)}(h h]h }(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj))}(hmasterh]hmaster}(hjEhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjubjH)}(h"const struct i3c_device_info *infoh](jN)}(hconsth]hconst}(hj^hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjZubj)}(h h]h }(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubjN)}(hjQh]hstruct}(hjzhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjZubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubh)}(hhh]j))}(hi3c_device_infoh]hi3c_device_info}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjj)}j]j&c.i3c_master_set_infoasbuh1hhjZubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjZubj))}(hinfoh]hinfo}(hjhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjZubeh}(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)}(hset master device informationh]hset master device information}(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 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.chMhj6 ubjW)}(hhh]j)}(h%master used to send frames on the bush]h%master used to send frames on the bus}(hjU hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQ hMhjR ubah}(h]h ]h"]h$]h&]uh1jVhj6 ubeh}(h]h ]h"]h$]h&]uh1j4hjQ hMhj3 ubj5)}(h>``const struct i3c_device_info *info`` I3C device information h](j;)}(h&``const struct i3c_device_info *info``h]jA)}(hju h]h"const struct i3c_device_info *info}(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)}(hI3C device informationh]hI3C device information}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj hMhj ubah}(h]h ]h"]h$]h&]uh1jVhjo ubeh}(h]h ]h"]h$]h&]uh1j4hj hMhj3 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.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 ](jjc-typeeh"]h$]h&]uh1j@hj ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjjji3c_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 ](jjc-typeeh"]h$]h&]uh1j@hj!ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjjji3c_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)}(hj3!h]h)}(hj3!h]jA)}(hj3!h]hi3c_device_info->dyn_addr}(hj;!hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1j@hj8!ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjjji3c_device_infouh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj5!ubah}(h]h ]h"]h$]h&]uh1jhjV!hMhj1!ubah}(h]h ]h"]h$]h&]uh1j/!hj,!ubj0!)}(h0:c:type:`i3c_device_info->bcr `h]j)}(hje!h]h)}(hje!h]jA)}(hje!h]hi3c_device_info->bcr}(hjm!hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1j@hjj!ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjjji3c_device_infouh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjg!ubah}(h]h ]h"]h$]h&]uh1jhj!hMhjc!ubah}(h]h ]h"]h$]h&]uh1j/!hj,!ubj0!)}(h0:c:type:`i3c_device_info->dcr `h]j)}(hj!h]h)}(hj!h]jA)}(hj!h]hi3c_device_info->dcr}(hj!hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1j@hj!ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjjji3c_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,!ubj0!)}(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 ](jjc-typeeh"]h$]h&]uh1j@hj!ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjjji3c_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,!ubj0!)}(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 ](jjc-typeeh"]h$]h&]uh1j@hj"ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjjji3c_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)}(hj9"h]hi3c_device_info->bcr}(hj;"hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1j@hj7"ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjjji3c_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*!hjV!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.}(hjj"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&]uh1jhjy"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 }(hj"hhhNhNubj)}(h**info**h]hinfo}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubhj contains valid information (not every piece of information can be checked, but we can at least make sure }(hj"hhhNhNubj)}(h**info->dyn_addr**h]hinfo->dyn_addr}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubh and }(hj"hhhNhNubj)}(h **info->bcr**h]h info->bcr}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"ubh! are correct), -EINVAL otherwise.}(hj"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.chMubj)}(h h]h }(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"hhhj#hMubj#)}(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#hMubjB)}(h&(struct i3c_master_controller *master)h]jH)}(h$struct i3c_master_controller *masterh](jN)}(hjQh]hstruct}(hj3#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}(hjQ#hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjN#ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjS#modnameN classnameNjj)}j]j)}jj#sbc.i3c_master_bus_initasbuh1hhj/#ubj)}(h h]h }(hjq#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&]hhuh1jAhj"hhhj#hMubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj"hhhj#hMubah}(h]j"ah ](jjeh"]h$]h&]jj)jhuh1hhj#hMhj"hhubj)}(hhh]j)}(hinitialize an I3C bush]hinitialize an I3C 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)}(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.chMhj#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.chMhj#ubjW)}(hhh]j)}(h main master initializing the bush]h main master initializing 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#ubah}(h]h ]h"]h$]h&]uh1j/hj#ubj)}(h**Description**h]j)}(hj2$h]h Description}(hj4$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0$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)}(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:}(hjH$hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj#ubhenumerated_list)}(hhh](j0!)}(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.chMhj\$ubah}(h]h ]h"]h$]h&]uh1j/!hjY$ubj0!)}(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 }(hjy$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 ](jjc-typeeh"]h$]h&]uh1j@hj$ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjjji3c_master_controller_opsuh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjy$ubh~ method to initialize the master controller. That’s usually where the bus mode is selected (pure bus or mixed fast/slow bus)}(hjy$hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj$hMhju$ubah}(h]h ]h"]h$]h&]uh1j/!hjY$ubj0!)}(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)}(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&]uh1j/!hjY$ubj0!)}(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.chMhj$ubah}(h]h ]h"]h$]h&]uh1j/!hjY$ubj0!)}(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.chMhj$ubah}(h]h ]h"]h$]h&]uh1j/!hjY$ubj0!)}(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.chMhj$ubah}(h]h ]h"]h$]h&]uh1j/!hjY$ubeh}(h]h ]h"]h$]h&]enumtypearabicprefixhsuffix.uh1jW$hj#ubj)}(h/h]h Parameters}(hj@/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrecycle_ibi() method.h](j)}(h**Parameters**h]j)}(hjV1h]h Parameters}(hjX1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjT1ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjP1ubj0)}(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)}(hju1h]h!struct i3c_generic_ibi_pool *pool}(hjw1hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjs1ubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjo1ubjW)}(hhh]j)}(h"the pool to return the IBI slot toh]h"the pool to return the IBI slot to}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1hM hj1ubah}(h]h ]h"]h$]h&]uh1jVhjo1ubeh}(h]h ]h"]h$]h&]uh1j4hj1hM hjl1ubj5)}(h/``struct i3c_ibi_slot *s`` IBI slot to recycle h](j;)}(h``struct i3c_ibi_slot *s``h]jA)}(hj1h]hstruct i3c_ibi_slot *s}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj1ubah}(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)}(hIBI slot to recycleh]hIBI slot to recycle}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1hM hj1ubah}(h]h ]h"]h$]h&]uh1jVhj1ubeh}(h]h ]h"]h$]h&]uh1j4hj1hM hjl1ubeh}(h]h ]h"]h$]h&]uh1j/hjP1ubj)}(h**Description**h]j)}(hj1h]h Description}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjP1ubj)}(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.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjP1ubeh}(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.2hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj*2hhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM ubj)}(h h]h }(hj=2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*2hhhj<2hM ubj#)}(hi3c_master_registerh]j))}(hi3c_master_registerh]hi3c_master_register}(hjO2hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjK2ubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hj*2hhhj<2hM 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}(hjk2hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjg2ubj)}(h h]h }(hjx2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjg2ubh)}(hhh]j))}(hi3c_master_controllerh]hi3c_master_controller}(hj2hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj2ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj2modnameN classnameNjj)}j]j)}jjQ2sbc.i3c_master_registerasbuh1hhjg2ubj)}(h h]h }(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjg2ubj)}(hjh]h*}(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjg2ubj))}(hmasterh]hmaster}(hj2hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjg2ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjc2ubjH)}(hstruct device *parenth](jN)}(hjQh]hstruct}(hj2hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhj2ubj)}(h h]h }(hj2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubh)}(hhh]j))}(hdeviceh]hdevice}(hj2hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj2ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj2modnameN classnameNjj)}j]j2c.i3c_master_registerasbuh1hhj2ubj)}(h h]h }(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj)}(hjh]h*}(hj'3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj))}(hparenth]hparent}(hj43hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj2ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjc2ubjH)}(h+const struct i3c_master_controller_ops *opsh](jN)}(hj`h]hconst}(hjM3hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjI3ubj)}(h h]h }(hjZ3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjI3ubjN)}(hjQh]hstruct}(hjh3hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjI3ubj)}(h h]h }(hju3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjI3ubh)}(hhh]j))}(hi3c_master_controller_opsh]hi3c_master_controller_ops}(hj3hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj3ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj3modnameN classnameNjj)}j]j2c.i3c_master_registerasbuh1hhjI3ubj)}(h h]h }(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjI3ubj)}(hjh]h*}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjI3ubj))}(hopsh]hops}(hj3hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjI3ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjc2ubjH)}(hbool secondaryh](j)}(hjh]hbool}(hj3hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj3ubj)}(h h]h }(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj3ubj))}(h secondaryh]h secondary}(hj3hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj3ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhjc2ubeh}(h]h ]h"]h$]h&]hhuh1jAhj*2hhhj<2hM ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj&2hhhj<2hM ubah}(h]j!2ah ](jjeh"]h$]h&]jj)jhuh1hhj<2hM hj#2hhubj)}(hhh]j)}(hregister an I3C masterh]hregister an I3C master}(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&]uh1jhj#2hhhj<2hM ubeh}(h]h ](jfunctioneh"]h$]h&]j jj j54j j54j 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)}(hj?4h]h Parameters}(hjA4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=4ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj94ubj0)}(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^4h]h$struct i3c_master_controller *master}(hj`4hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj\4ubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjX4ubjW)}(hhh]j)}(h%master used to send frames on the bush]h%master used to send frames on the bus}(hjw4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjs4hM hjt4ubah}(h]h ]h"]h$]h&]uh1jVhjX4ubeh}(h]h ]h"]h$]h&]uh1j4hjs4hM hjU4ubj5)}(h_``struct device *parent`` the parent device (the one that provides this I3C master controller) h](j;)}(h``struct device *parent``h]jA)}(hj4h]hstruct device *parent}(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)}(hDthe parent device (the one that provides this I3C master controller)h]hDthe parent device (the one that provides this I3C master controller)}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj4ubah}(h]h ]h"]h$]h&]uh1jVhj4ubeh}(h]h ]h"]h$]h&]uh1j4hj4hM hjU4ubj5)}(hQ``const struct i3c_master_controller_ops *ops`` the master controller operations h](j;)}(h/``const struct i3c_master_controller_ops *ops``h]jA)}(hj4h]h+const struct i3c_master_controller_ops *ops}(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)}(h the master controller operationsh]h the master controller operations}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4hM hj4ubah}(h]h ]h"]h$]h&]uh1jVhj4ubeh}(h]h ]h"]h$]h&]uh1j4hj4hM hjU4ubj5)}(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 5h]hbool secondary}(hj 5hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj5ubah}(h]h ]h"]h$]h&]uh1j:hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj5ubjW)}(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#5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj 5ubah}(h]h ]h"]h$]h&]uh1jVhj5ubeh}(h]h ]h"]h$]h&]uh1j4hj5hM hjU4ubeh}(h]h ]h"]h$]h&]uh1j/hj94ubj)}(h**Description**h]j)}(hjF5h]h Description}(hjH5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjD5ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj94ubj)}(h/This function takes care of everything for you:h]h/This function takes care of everything for you:}(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 hj94ubj+!)}(hhh](j0!)}(h#creates and initializes the I3C bush]j)}(hjp5h]h#creates and initializes the I3C bus}(hjr5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjn5ubah}(h]h ]h"]h$]h&]uh1j/!hjk5ubj0!)}(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 }(hj5hhhNhNubj)}(h**parent->of_node**h]hparent->of_node}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubh is not NULL}(hj5hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj5ubah}(h]h ]h"]h$]h&]uh1j/!hjk5ubj0!)}(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}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj5ubah}(h]h ]h"]h$]h&]uh1j/!hjk5ubj0!)}(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}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj5ubah}(h]h ]h"]h$]h&]uh1j/!hjk5ubeh}(h]h ]h"]h$]h&]jh"ji"uh1j*!hj5hM hj94ubj)}(h **Return**h]j)}(hj5h]hReturn}(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 hj94ubj)}(h60 in case of success, a negative error code otherwise.h]h60 in case of success, a negative error code otherwise.}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj94ubeh}(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}(hj06hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj,6hhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chME ubj)}(h h]h }(hj?6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,6hhhj>6hME ubj#)}(hi3c_master_unregisterh]j))}(hi3c_master_unregisterh]hi3c_master_unregister}(hjQ6hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjM6ubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hj,6hhhj>6hME ubjB)}(h&(struct i3c_master_controller *master)h]jH)}(h$struct i3c_master_controller *masterh](jN)}(hjQh]hstruct}(hjm6hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhji6ubj)}(h h]h }(hjz6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhji6ubh)}(hhh]j))}(hi3c_master_controllerh]hi3c_master_controller}(hj6hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj6ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj6modnameN classnameNjj)}j]j)}jjS6sbc.i3c_master_unregisterasbuh1hhji6ubj)}(h h]h }(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhji6ubj)}(hjh]h*}(hj6hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhji6ubj))}(hmasterh]hmaster}(hj6hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hji6ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhje6ubah}(h]h ]h"]h$]h&]hhuh1jAhj,6hhhj>6hME ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj(6hhhj>6hME ubah}(h]j#6ah ](jjeh"]h$]h&]jj)jhuh1hhj>6hME hj%6hhubj)}(hhh]j)}(hunregister an I3C masterh]hunregister an I3C master}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chME hj6hhubah}(h]h ]h"]h$]h&]uh1jhj%6hhhj>6hME ubeh}(h]h ](jfunctioneh"]h$]h&]j jj j7j j7j 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)}(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.chMI hj 7ubj0)}(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)}(hj17h]h$struct i3c_master_controller *master}(hj37hhhNhNubah}(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.chMF hj+7ubjW)}(hhh]j)}(h%master used to send frames on the bush]h%master used to send frames on the bus}(hjJ7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjF7hMF hjG7ubah}(h]h ]h"]h$]h&]uh1jVhj+7ubeh}(h]h ]h"]h$]h&]uh1j4hjF7hMF hj(7ubah}(h]h ]h"]h$]h&]uh1j/hj 7ubj)}(h**Description**h]j)}(hjl7h]h Description}(hjn7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjj7ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMH hj 7ubj)}(h8Basically undo everything done in i3c_master_register().h]h8Basically undo everything done in i3c_master_register().}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMG hj 7ubeh}(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}(hj7hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhj7hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKubj)}(h h]h }(hj7hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7hhhj7hKubj#)}(hi3c_i2c_dev_desch]j))}(hj7h]hi3c_i2c_dev_desc}(hj7hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj7ubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hj7hhhj7hKubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj7hhhj7hKubah}(h]j7ah ](jjeh"]h$]h&]jj)jhuh1hhj7hKhj7hhubj)}(hhh]j)}(h,Common part of the I3C/I2C device descriptorh]h,Common part of the I3C/I2C device descriptor}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK'hj7hhubah}(h]h ]h"]h$]h&]uh1jhj7hhhj7hKubeh}(h]h ](jstructeh"]h$]h&]j jj j 8j j 8j 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}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubh:}(hj8hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK+hj8ubh 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; };}hj28sbah}(h]h ]h"]h$]h&]hhuh1j08hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK-hj8ubj)}(h **Members**h]j)}(hjC8h]hMembers}(hjE8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjA8ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK3hj8ubj0)}(hhh](j5)}(hN``node`` node element used to insert the slot into the I2C or I3C device list h](j;)}(h``node``h]jA)}(hjb8h]hnode}(hjd8hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj`8ubah}(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*hj\8ubjW)}(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}(hj{8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK)hjx8ubah}(h]h ]h"]h$]h&]uh1jVhj\8ubeh}(h]h ]h"]h$]h&]uh1j4hjw8hK*hjY8ubj5)}(hZ``master`` I3C master that instantiated this device. Will be used to do I2C/I3C transfers h](j;)}(h ``master``h]jA)}(hj8h]hmaster}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj8ubah}(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,hj8ubjW)}(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}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK+hj8ubah}(h]h ]h"]h$]h&]uh1jVhj8ubeh}(h]h ]h"]h$]h&]uh1j4hj8hK,hjY8ubj5)}(hj``master_priv`` master private data assigned to the device. Can be used to add master specific informationh](j;)}(h``master_priv``h]jA)}(hj8h]h master_priv}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj8ubah}(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-hj8ubjW)}(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}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8hK-hj8ubah}(h]h ]h"]h$]h&]uh1jVhj8ubeh}(h]h ]h"]h$]h&]uh1j4hj8hK-hjY8ubeh}(h]h ]h"]h$]h&]uh1j/hj8ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hj9h]h Description}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK1hhhhubj)}(hhj9hhubah}(h]h ]h"]h$]h&]uh1jhjK9hhhjc9hK3ubeh}(h]h ](jstructeh"]h$]h&]j jj j9j j9j 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}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubh:}(hj9hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKBhj9ubj18)}(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; };}hj9sbah}(h]h ]h"]h$]h&]hhuh1j08hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKDhj9ubj)}(h **Members**h]j)}(hj9h]hMembers}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKJhj9ubj0)}(hhh](j5)}(hG``node`` used to insert the boardinfo object in the I2C boardinfo list h](j;)}(h``node``h]jA)}(hj:h]hnode}(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.hhK@hj9ubjW)}(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}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:hK@hj:ubah}(h]h ]h"]h$]h&]uh1jVhj9ubeh}(h]h ]h"]h$]h&]uh1j4hj:hK@hj9ubj5)}(h'``base`` regular I2C board information h](j;)}(h``base``h]jA)}(hj>:h]hbase}(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.hhKAhj8:ubjW)}(hhh]j)}(hregular I2C board informationh]hregular I2C board information}(hjW:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjS:hKAhjT:ubah}(h]h ]h"]h$]h&]uh1jVhj8:ubeh}(h]h ]h"]h$]h&]uh1j4hjS:hKAhj9ubj5)}(he``lvr`` LVR (Legacy Virtual Register) needed by the I3C core to know about the I2C device limitationsh](j;)}(h``lvr``h]jA)}(hjw:h]hlvr}(hjy:hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hju: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.hhKBhjq:ubjW)}(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:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj:hKBhj:ubah}(h]h ]h"]h$]h&]uh1jVhjq:ubeh}(h]h ]h"]h$]h&]uh1j4hj:hKBhj9ubeh}(h]h ]h"]h$]h&]uh1j/hj9ubeh}(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.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.}(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.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}(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.hhKIubj)}(h h]h }(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj:hhhj;hKIubj#)}(h i2c_dev_desch]j))}(hj:h]h i2c_dev_desc}(hj;hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj;ubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hj:hhhj;hKIubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj:hhhj;hKIubah}(h]j:ah ](jjeh"]h$]h&]jj)jhuh1hhj;hKIhj:hhubj)}(hhh]j)}(hI2C device descriptorh]hI2C device descriptor}(hj9;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKNhj6;hhubah}(h]h ]h"]h$]h&]uh1jhj:hhhj;hKIubeh}(h]h ](jstructeh"]h$]h&]j jj jQ;j jQ;j 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}(hj];hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjY;ubh:}(hjY;hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKRhjU;ubj18)}(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; };}hjv;sbah}(h]h ]h"]h$]h&]hhuh1j08hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKThjU;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.hhK[hjU;ubj0)}(hhh](j5)}(h4``common`` common part of the I2C device descriptor h](j;)}(h ``common``h]jA)}(hj;h]hcommon}(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.hhKPhj;ubjW)}(hhh]j)}(h(common part of the I2C device descriptorh]h(common part of the I2C device descriptor}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;hKPhj;ubah}(h]h ]h"]h$]h&]uh1jVhj;ubeh}(h]h ]h"]h$]h&]uh1j4hj;hKPhj;ubj5)}(h:``dev`` I2C device object registered to the I2C framework h](j;)}(h``dev``h]jA)}(hj;h]hdev}(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.hhKQhj;ubjW)}(hhh]j)}(h1I2C device object registered to the I2C frameworkh]h1I2C device object registered to the I2C framework}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;hKQhj;ubah}(h]h ]h"]h$]h&]uh1jVhj;ubeh}(h]h ]h"]h$]h&]uh1j4hj;hKQhj;ubj5)}(h``addr`` I2C device address h](j;)}(h``addr``h]jA)}(hj<h]haddr}(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.hhKRhj<ubjW)}(hhh]j)}(hI2C device addressh]hI2C device address}(hj1<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-<hKRhj.<ubah}(h]h ]h"]h$]h&]uh1jVhj<ubeh}(h]h ]h"]h$]h&]uh1j4hj-<hKRhj;ubj5)}(he``lvr`` LVR (Legacy Virtual Register) needed by the I3C core to know about the I2C device limitationsh](j;)}(h``lvr``h]jA)}(hjQ<h]hlvr}(hjS<hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjO<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.hhKShjK<ubjW)}(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}(hjj<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjf<hKShjg<ubah}(h]h ]h"]h$]h&]uh1jVhjK<ubeh}(h]h ]h"]h$]h&]uh1j4hjf<hKShj;ubeh}(h]h ]h"]h$]h&]uh1j/hjU;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.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<hhhNhNubh)}(hJ:c:type:`struct_i3c_master_controller->ops `h]jA)}(hj<h]h!struct_i3c_master_controller->ops}(hj<hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1j@hj<ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjjjstruct_i3c_master_controlleruh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKThj<ubh->attach_i2c_dev().}(hj<hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj<hKThhhhubj)}(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<h]hstruct_i2c_dev_desc}(hj<hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1j@hj<ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjjj _i2c_dev_descuh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKXhj<ubhl is the internal representation of an I2C device connected on an I3C bus. This object is also passed to all }(hj<hhhNhNubh)}(hG:c:type:`struct_i3c_master_controller_ops <_i3c_master_controller_ops>`h]jA)}(hj=h]h struct_i3c_master_controller_ops}(hj=hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1j@hj=ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjjj_i3c_master_controller_opsuh1hhj<hKXhj<ubh hooks.}(hj<hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj<hKXhhhhubh)}(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}(hjE=hhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjA=hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK_ubj)}(h h]h }(hjS=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjA=hhhjR=hK_ubj#)}(h i3c_ibi_sloth]j))}(hj?=h]h i3c_ibi_slot}(hje=hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hja=ubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hjA=hhhjR=hK_ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj==hhhjR=hK_ubah}(h]j8=ah ](jjeh"]h$]h&]jj)jhuh1hhjR=hK_hj:=hhubj)}(hhh]j)}(h I3C IBI (In-Band Interrupt) sloth]h I3C IBI (In-Band Interrupt) slot}(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.hhKehj=hhubah}(h]h ]h"]h$]h&]uh1jhj:=hhhjR=hK_ubeh}(h]h ](jstructeh"]h$]h&]j jj j=j j=j 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=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=ubh:}(hj=hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKihj=ubj18)}(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=sbah}(h]h ]h"]h$]h&]hhuh1j08hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKkhj=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.hhKrhj=ubj0)}(hhh](j5)}(hQ``work`` work associated to this slot. The IBI handler will be called from there h](j;)}(h``work``h]jA)}(hj=h]hwork}(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.hhKhhj=ubjW)}(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}(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.hhKghj >ubah}(h]h ]h"]h$]h&]uh1jVhj=ubeh}(h]h ]h"]h$]h&]uh1j4hj >hKhhj=ubj5)}(h3``dev`` the I3C device that has generated this IBI h](j;)}(h``dev``h]jA)}(hj.>h]hdev}(hj0>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.hhKihj(>ubjW)}(hhh]j)}(h*the I3C device that has generated this IBIh]h*the I3C device that has generated this IBI}(hjG>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjC>hKihjD>ubah}(h]h ]h"]h$]h&]uh1jVhj(>ubeh}(h]h ]h"]h$]h&]uh1j4hjC>hKihj=ubj5)}(h5``len`` length of the payload associated to this IBI h](j;)}(h``len``h]jA)}(hjg>h]hlen}(hji>hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hje>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.hhKjhja>ubjW)}(hhh]j)}(h,length of the payload associated to this IBIh]h,length of the payload associated to this IBI}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|>hKjhj}>ubah}(h]h ]h"]h$]h&]uh1jVhja>ubeh}(h]h ]h"]h$]h&]uh1j4hj|>hKjhj=ubj5)}(h``data`` payload bufferh](j;)}(h``data``h]jA)}(hj>h]hdata}(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.hhKjhj>ubjW)}(hhh]j)}(hpayload bufferh]hpayload buffer}(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.hhKkhj>ubah}(h]h ]h"]h$]h&]uh1jVhj>ubeh}(h]h ]h"]h$]h&]uh1j4hj>hKjhj=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.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().}(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.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.}(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.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}(hj0?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.hhKwubj)}(h h]h }(hj>?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,?hhhj=?hKwubj#)}(hi3c_device_ibi_infoh]j))}(hj*?h]hi3c_device_ibi_info}(hjP?hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjL?ubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hj,?hhhj=?hKwubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj(?hhhj=?hKwubah}(h]j#?ah ](jjeh"]h$]h&]jj)jhuh1hhj=?hKwhj%?hhubj)}(hhh]j)}(h-IBI information attached to a specific deviceh]h-IBI information attached to a specific device}(hjr?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK}hjo?hhubah}(h]h ]h"]h$]h&]uh1jhj%?hhhj=?hKwubeh}(h]h ](jstructeh"]h$]h&]j jj j?j j?j 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}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubh:}(hj?hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj?ubj18)}(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?sbah}(h]h ]h"]h$]h&]hhuh1j08hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj?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.hhKhj?ubj0)}(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)}(hj?h]hall_ibis_handled}(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.hhKhj?ubjW)}(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}(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.hhKhj?ubah}(h]h ]h"]h$]h&]uh1jVhj?ubeh}(h]h ]h"]h$]h&]uh1j4hj?hKhj?ubj5)}(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)}(hj@h]h pending_ibis}(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.hhKhj@ubjW)}(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}(hj2@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj/@ubah}(h]h ]h"]h$]h&]uh1jVhj@ubeh}(h]h ]h"]h$]h&]uh1j4hj.@hKhj?ubj5)}(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)}(hjS@h]hmax_payload_len}(hjU@hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjQ@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.hhKhjM@ubjW)}(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}(hjl@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhji@ubah}(h]h ]h"]h$]h&]uh1jVhjM@ubeh}(h]h ]h"]h$]h&]uh1j4hjh@hKhj?ubj5)}(h;``num_slots`` number of IBI slots reserved for this device h](j;)}(h ``num_slots``h]jA)}(hj@h]h num_slots}(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.hhKhj@ubjW)}(hhh]j)}(h,number of IBI slots reserved for this deviceh]h,number of IBI slots reserved for this device}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@hKhj@ubah}(h]h ]h"]h$]h&]uh1jVhj@ubeh}(h]h ]h"]h$]h&]uh1j4hj@hKhj?ubj5)}(h#``enabled`` reflect the IBI status h](j;)}(h ``enabled``h]jA)}(hj@h]henabled}(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.hhKhj@ubjW)}(hhh]j)}(hreflect the IBI statush]hreflect the IBI status}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@hKhj@ubah}(h]h ]h"]h$]h&]uh1jVhj@ubeh}(h]h ]h"]h$]h&]uh1j4hj@hKhj?ubj5)}(h/``wq`` workqueue used to execute IBI handlers. h](j;)}(h``wq``h]jA)}(hj@h]hwq}(hjAhhhNhNubah}(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.hhKhj@ubjW)}(hhh]j)}(h'workqueue used to execute IBI handlers.h]h'workqueue used to execute IBI handlers.}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAhKhjAubah}(h]h ]h"]h$]h&]uh1jVhj@ubeh}(h]h ]h"]h$]h&]uh1j4hjAhKhj?ubj5)}(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)}(hj8Ah]hhandler}(hj:AhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj6Aubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj2AubjW)}(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}(hjQAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjNAubah}(h]h ]h"]h$]h&]uh1jVhj2Aubeh}(h]h ]h"]h$]h&]uh1j4hjMAhKhj?ubeh}(h]h ]h"]h$]h&]uh1j/hj?ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hj{Ah]h Description}(hj}AhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyAubah}(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 }(hjAhhhNhNubh)}(h;:c:type:`struct_i3c_device_ibi_info <_i3c_device_ibi_info>`h]jA)}(hjAh]hstruct_i3c_device_ibi_info}(hjAhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1j@hjAubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjjj_i3c_device_ibi_infouh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjAubh 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.}(hjAhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjAhKhhhhubj)}(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.}(hjAhhhNhNubah}(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}(hjAhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjAhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKubj)}(h h]h }(hjAhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAhhhjAhKubj#)}(hi3c_dev_boardinfoh]j))}(hjAh]hi3c_dev_boardinfo}(hj BhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjBubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hjAhhhjAhKubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjAhhhjAhKubah}(h]jAah ](jjeh"]h$]h&]jj)jhuh1hhjAhKhjAhhubj)}(hhh]j)}(hI3C device board informationh]hI3C device board information}(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.hhKhj*Bhhubah}(h]h ]h"]h$]h&]uh1jhjAhhhjAhKubeh}(h]h ](jstructeh"]h$]h&]j jj jEBj jEBj 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}(hjQBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMBubh:}(hjMBhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjIBubj18)}(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; };}hjjBsbah}(h]h ]h"]h$]h&]hhuh1j08hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjIBubj)}(h **Members**h]j)}(hj{Bh]hMembers}(hj}BhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyBubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjIBubj0)}(hhh](j5)}(hG``node`` used to insert the boardinfo object in the I3C boardinfo list h](j;)}(h``node``h]jA)}(hjBh]hnode}(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.hhKhjBubjW)}(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}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBhKhjBubah}(h]h ]h"]h$]h&]uh1jVhjBubeh}(h]h ]h"]h$]h&]uh1j4hjBhKhjBubj5)}(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)}(hjBh]h init_dyn_addr}(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.hhKhjBubjW)}(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}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjBubah}(h]h ]h"]h$]h&]uh1jVhjBubeh}(h]h ]h"]h$]h&]uh1j4hjBhKhjBubj5)}(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)}(hj Ch]h static_addr}(hjChhhNhNubah}(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.hhKhjCubjW)}(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)}(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.hhKhj#Cubah}(h]h ]h"]h$]h&]uh1jVhjCubeh}(h]h ]h"]h$]h&]uh1j4hj"ChKhjBubj5)}(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)}(hjGCh]hpid}(hjIChhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjECubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjACubjW)}(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}(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.hhKhj]Cubah}(h]h ]h"]h$]h&]uh1jVhjACubeh}(h]h ]h"]h$]h&]uh1j4hj\ChKhjBubj5)}(hL``of_node`` optional DT node in case the device has been described in the DTh](j;)}(h ``of_node``h]jA)}(hjCh]hof_node}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjCubah}(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{CubjW)}(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}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjCubah}(h]h ]h"]h$]h&]uh1jVhj{Cubeh}(h]h ]h"]h$]h&]uh1j4hjChKhjBubeh}(h]h ]h"]h$]h&]uh1j/hjIBubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hjCh]h Description}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(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.}(hjChhhNhNubah}(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}(hjDhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjChhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKubj)}(h h]h }(hjDhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjChhhjDhKubj#)}(h i3c_dev_desch]j))}(hjCh]h i3c_dev_desc}(hj"DhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjDubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hjChhhjDhKubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjChhhjDhKubah}(h]jCah ](jjeh"]h$]h&]jj)jhuh1hhjDhKhjChhubj)}(hhh]j)}(hI3C device descriptorh]hI3C device descriptor}(hjDDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjADhhubah}(h]h ]h"]h$]h&]uh1jhjChhhjDhKubeh}(h]h ](jstructeh"]h$]h&]j jj j\Dj j\Dj 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}(hjhDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdDubh:}(hjdDhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj`Dubj18)}(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; };}hjDsbah}(h]h ]h"]h$]h&]hhuh1j08hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj`Dubj)}(h **Members**h]j)}(hjDh]hMembers}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj`Dubj0)}(hhh](j5)}(h4``common`` common part of the I3C device descriptor h](j;)}(h ``common``h]jA)}(hjDh]hcommon}(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.hhKhjDubjW)}(hhh]j)}(h(common part of the I3C device descriptorh]h(common part of the I3C device descriptor}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDhKhjDubah}(h]h ]h"]h$]h&]uh1jVhjDubeh}(h]h ]h"]h$]h&]uh1j4hjDhKhjDubj5)}(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)}(hjDh]hinfo}(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.hhKhjDubjW)}(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()}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjEubah}(h]h ]h"]h$]h&]uh1jVhjDubeh}(h]h ]h"]h$]h&]uh1j4hjDhKhjDubj5)}(h[``ibi_lock`` lock used to protect the :c:type:`struct_i3c_device->ibi ` h](j;)}(h ``ibi_lock``h]jA)}(hj$Eh]hibi_lock}(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.hhKhjEubjW)}(hhh]j)}(hMlock used to protect the :c:type:`struct_i3c_device->ibi `h](hlock used to protect the }(hj=EhhhNhNubh)}(h4:c:type:`struct_i3c_device->ibi `h]jA)}(hjGEh]hstruct_i3c_device->ibi}(hjIEhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1j@hjEEubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjjjstruct_i3c_deviceuh1hhj9EhKhj=Eubeh}(h]h ]h"]h$]h&]uh1jhj9EhKhj:Eubah}(h]h ]h"]h$]h&]uh1jVhjEubeh}(h]h ]h"]h$]h&]uh1j4hj9EhKhjDubj5)}(h_``ibi`` IBI info attached to a device. Should be NULL until i3c_device_request_ibi() is called h](j;)}(h``ibi``h]jA)}(hj|Eh]hibi}(hj~EhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjzEubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjvEubjW)}(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}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjEubah}(h]h ]h"]h$]h&]uh1jVhjvEubeh}(h]h ]h"]h$]h&]uh1j4hjEhKhjDubj5)}(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)}(hjEh]hdev}(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.hhKhjEubjW)}(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}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjEubah}(h]h ]h"]h$]h&]uh1jVhjEubeh}(h]h ]h"]h$]h&]uh1j4hjEhKhjDubj5)}(hB``boardinfo`` pointer to the boardinfo attached to this I3C deviceh](j;)}(h ``boardinfo``h]jA)}(hjEh]h boardinfo}(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.hhKhjEubjW)}(hhh]j)}(h4pointer to the boardinfo attached to this I3C deviceh]h4pointer to the boardinfo attached to this I3C device}(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.hhKhjFubah}(h]h ]h"]h$]h&]uh1jVhjEubeh}(h]h ]h"]h$]h&]uh1j4hjFhKhjDubeh}(h]h ]h"]h$]h&]uh1j/hj`Dubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hj3Fh]h Description}(hj5FhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1Fubah}(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 (}(hjIFhhhNhNubh)}(h):c:type:`struct_i3c_device <_i3c_device>`h]jA)}(hjSFh]hstruct_i3c_device}(hjUFhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1j@hjQFubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjjj _i3c_deviceuh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjIFubh).}(hjIFhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjpFhKhhhhubh)}(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}(hjFhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjFhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKubj)}(h h]h }(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFhhhjFhKubj#)}(h i3c_deviceh]j))}(hjFh]h i3c_device}(hjFhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjFubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hjFhhhjFhKubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjFhhhjFhKubah}(h]jFah ](jjeh"]h$]h&]jj)jhuh1hhjFhKhjFhhubj)}(hhh]j)}(hI3C device objecth]hI3C device object}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjFhhubah}(h]h ]h"]h$]h&]uh1jhjFhhhjFhKubeh}(h]h ](jstructeh"]h$]h&]j jj jFj jFj 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}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubh:}(hjFhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjFubj18)}(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; };}hjGsbah}(h]h ]h"]h$]h&]hhuh1j08hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjFubj)}(h **Members**h]j)}(hj$Gh]hMembers}(hj&GhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj"Gubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjFubj0)}(hhh](j5)}(hB``dev`` device object to register the I3C dev to the device model h](j;)}(h``dev``h]jA)}(hjCGh]hdev}(hjEGhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjAGubah}(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=GubjW)}(hhh]j)}(h9device object to register the I3C dev to the device modelh]h9device object to register the I3C dev to the device model}(hj\GhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXGhKhjYGubah}(h]h ]h"]h$]h&]uh1jVhj=Gubeh}(h]h ]h"]h$]h&]uh1j4hjXGhKhj:Gubj5)}(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)}(hj|Gh]hdesc}(hj~GhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjzGubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjvGubjW)}(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}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjGubah}(h]h ]h"]h$]h&]uh1jVhjvGubeh}(h]h ]h"]h$]h&]uh1j4hjGhKhj:Gubj5)}(h*``bus`` I3C bus this device is attached toh](j;)}(h``bus``h]jA)}(hjGh]hbus}(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.hhKhjGubjW)}(hhh]j)}(h"I3C bus this device is attached toh]h"I3C bus this device is attached to}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjGubah}(h]h ]h"]h$]h&]uh1jVhjGubeh}(h]h ]h"]h$]h&]uh1j4hjGhKhj:Gubeh}(h]h ]h"]h$]h&]uh1j/hjFubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hjGh]h Description}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(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 }(hjHhhhNhNubh)}(h-:c:type:`struct_i3c_dev_desc <_i3c_dev_desc>`h]jA)}(hjHh]hstruct_i3c_dev_desc}(hjHhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1j@hjHubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjjj _i3c_dev_descuh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjHubhs one. All I3C devs on the I3C bus are represented, including I3C masters. For each of them, we have an instance of }(hjHhhhNhNubh)}(h(:c:type:`struct i3c_device `h]jA)}(hj=Hh]hstruct i3c_device}(hj?HhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1j@hj;Hubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjjj i3c_deviceuh1hhj6HhKhjHubh.}(hjHhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj6HhKhhhhubh)}(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}(hj}HhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhjyHhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKubj)}(h h]h }(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjyHhhhjHhKubj#)}(h i3c_bus_modeh]j))}(hjwHh]h i3c_bus_mode}(hjHhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjHubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hjyHhhhjHhKubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjuHhhhjHhKubah}(h]jpHah ](jjeh"]h$]h&]jj)jhuh1hhjHhKhjrHhhubj)}(hhh]j)}(h I3C bus modeh]h I3C bus mode}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjHhhubah}(h]h ]h"]h$]h&]uh1jhjrHhhhjHhKubeh}(h]h ](jenumeh"]h$]h&]j jj jHj jHj 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)}(hjHh]h Constants}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM hjHubj0)}(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)}(hjIh]hI3C_BUS_MODE_PURE}(hjIhhhNhNubah}(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)}(hAonly I3C devices are connected to the bus. No limitation expectedh]hAonly I3C devices are connected to the bus. No limitation expected}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjIubah}(h]h ]h"]h$]h&]uh1jVhjHubeh}(h]h ]h"]h$]h&]uh1j4hjIhMhjHubj5)}(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:Ih]hI3C_BUS_MODE_MIXED_FAST}(hjKhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj:Kubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hjKhhhj+KhM1ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjKhhhj+KhM1ubah}(h]jKah ](jjeh"]h$]h&]jj)jhuh1hhj+KhM1hjKhhubj)}(hhh]j)}(hI3C address slot statush]hI3C address slot status}(hj`KhhhNhNubah}(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]Khhubah}(h]h ]h"]h$]h&]uh1jhjKhhhj+KhM1ubeh}(h]h ](jenumeh"]h$]h&]j jj jxKj jxKj 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)}(hjKh]h Constants}(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.hhM0hj|Kubj0)}(hhh](j5)}(h'``I3C_ADDR_SLOT_FREE`` address is free h](j;)}(h``I3C_ADDR_SLOT_FREE``h]jA)}(hjKh]hI3C_ADDR_SLOT_FREE}(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.hhM3hjKubjW)}(hhh]j)}(haddress is freeh]haddress is free}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKhM3hjKubah}(h]h ]h"]h$]h&]uh1jVhjKubeh}(h]h ]h"]h$]h&]uh1j4hjKhM3hjKubj5)}(h+``I3C_ADDR_SLOT_RSVD`` address is reserved h](j;)}(h``I3C_ADDR_SLOT_RSVD``h]jA)}(hjKh]hI3C_ADDR_SLOT_RSVD}(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.hhM6hjKubjW)}(hhh]j)}(haddress is reservedh]haddress is reserved}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKhM6hjKubah}(h]h ]h"]h$]h&]uh1jVhjKubeh}(h]h ]h"]h$]h&]uh1j4hjKhM6hjKubj5)}(h?``I3C_ADDR_SLOT_I2C_DEV`` address is assigned to an I2C device h](j;)}(h``I3C_ADDR_SLOT_I2C_DEV``h]jA)}(hjLh]hI3C_ADDR_SLOT_I2C_DEV}(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.hhM9hj LubjW)}(hhh]j)}(h$address is assigned to an I2C deviceh]h$address is assigned to an I2C device}(hj,LhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(LhM9hj)Lubah}(h]h ]h"]h$]h&]uh1jVhj Lubeh}(h]h ]h"]h$]h&]uh1j4hj(LhM9hjKubj5)}(h?``I3C_ADDR_SLOT_I3C_DEV`` address is assigned to an I3C device h](j;)}(h``I3C_ADDR_SLOT_I3C_DEV``h]jA)}(hjLLh]hI3C_ADDR_SLOT_I3C_DEV}(hjNLhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjJLubah}(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<hjFLubjW)}(hhh]j)}(h$address is assigned to an I3C deviceh]h$address is assigned to an I3C device}(hjeLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaLhM<hjbLubah}(h]h ]h"]h$]h&]uh1jVhjFLubeh}(h]h ]h"]h$]h&]uh1j4hjaLhM<hjKubj5)}(h0``I3C_ADDR_SLOT_STATUS_MASK`` address slot mask h](j;)}(h``I3C_ADDR_SLOT_STATUS_MASK``h]jA)}(hjLh]hI3C_ADDR_SLOT_STATUS_MASK}(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.hhM?hjLubjW)}(hhh]j)}(haddress slot maskh]haddress slot mask}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLhM?hjLubah}(h]h ]h"]h$]h&]uh1jVhjLubeh}(h]h ]h"]h$]h&]uh1j4hjLhM?hjKubj5)}(hN``I3C_ADDR_SLOT_EXT_STATUS_MASK`` address slot mask with extended information h](j;)}(h!``I3C_ADDR_SLOT_EXT_STATUS_MASK``h]jA)}(hjLh]hI3C_ADDR_SLOT_EXT_STATUS_MASK}(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.hhMBhjLubjW)}(hhh]j)}(h+address slot mask with extended informationh]h+address slot mask with extended information}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLhMBhjLubah}(h]h ]h"]h$]h&]uh1jVhjLubeh}(h]h ]h"]h$]h&]uh1j4hjLhMBhjKubj5)}(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)}(hjLh]hI3C_ADDR_SLOT_EXT_DESIRED}(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.hhMGhjLubjW)}(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.}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMEhj Mubah}(h]h ]h"]h$]h&]uh1jVhjLubeh}(h]h ]h"]h$]h&]uh1j4hj MhMGhjKubeh}(h]h ]h"]h$]h&]uh1j/hj|Kubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hj:Mh]h Description}(hj`) ``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}(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.hhMLhjMubj18)}(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; };}hjMsbah}(h]h ]h"]h$]h&]hhuh1j08hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMNhjMubj)}(h **Members**h]j)}(hjNh]hMembers}(hj NhhhNhNubah}(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.hhM^hjMubj0)}(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'Nh]h cur_master}(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.hhMMhj!NubjW)}(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@NhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMJhj=Nubah}(h]h ]h"]h$]h&]uh1jVhj!Nubeh}(h]h ]h"]h$]h&]uh1j4hj`) h](j;)}(h ``addrslots``h]jA)}(hjNh]h addrslots}(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.hhMQhjNubjW)}(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 }(hjNhhhNhNubh)}(h::c:type:`enum i3c_addr_slot_status `h]jA)}(hjNh]henum i3c_addr_slot_status}(hjNhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1j@hjNubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjjji3c_addr_slot_statusuh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMOhjNubh)}(hjNhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjNhMOhjNubah}(h]h ]h"]h$]h&]uh1jVhjNubeh}(h]h ]h"]h$]h&]uh1j4hjNhMQhjNubj5)}(hC``mode`` bus mode (see :c:type:`enum i3c_bus_mode `) h](j;)}(h``mode``h]jA)}(hjNh]hmode}(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.hhMRhjNubjW)}(hhh]j)}(h9bus mode (see :c:type:`enum i3c_bus_mode `)h](hbus mode (see }(hjOhhhNhNubh)}(h*:c:type:`enum i3c_bus_mode `h]jA)}(hjOh]henum i3c_bus_mode}(hjOhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1j@hjOubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjjj i3c_bus_modeuh1hhj OhMRhjOubh)}(hjOhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj OhMRhj Oubah}(h]h ]h"]h$]h&]uh1jVhjNubeh}(h]h ]h"]h$]h&]uh1j4hj OhMRhjNubj5)}(h2``scl_rate`` SCL signal rate for I3C and I2C mode h](j;)}(h ``scl_rate``h]jA)}(hjSOh]hscl_rate}(hjUOhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjQOubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMVhjMOubjW)}(hhh]j)}(h$SCL signal rate for I3C and I2C modeh]h$SCL signal rate for I3C and I2C mode}(hjlOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhOhMVhjiOubah}(h]h ]h"]h$]h&]uh1jVhjMOubeh}(h]h ]h"]h$]h&]uh1j4hjhOhMVhjNubj5)}(hU``scl_rate.i3c`` maximum rate for the clock signal when doing I3C SDR/priv transfers h](j;)}(h``scl_rate.i3c``h]jA)}(hjOh]h scl_rate.i3c}(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.hhMThjOubjW)}(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}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMShjOubah}(h]h ]h"]h$]h&]uh1jVhjOubeh}(h]h ]h"]h$]h&]uh1j4hjOhMThjNubj5)}(hL``scl_rate.i2c`` maximum rate for the clock signal when doing I2C transfers h](j;)}(h``scl_rate.i2c``h]jA)}(hjOh]h scl_rate.i2c}(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.hhMUhjOubjW)}(hhh]j)}(h:maximum rate for the clock signal when doing I2C transfersh]h:maximum rate for the clock signal when doing I2C transfers}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOhMUhjOubah}(h]h ]h"]h$]h&]uh1jVhjOubeh}(h]h ]h"]h$]h&]uh1j4hjOhMUhjNubj5)}(hE``devs`` 2 lists containing all I3C/I2C devices connected to the bus h](j;)}(h``devs``h]jA)}(hjOh]hdevs}(hjPhhhNhNubah}(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.hhM]hjOubjW)}(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}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPhM]hjPubah}(h]h ]h"]h$]h&]uh1jVhjOubeh}(h]h ]h"]h$]h&]uh1j4hjPhM]hjNubj5)}(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)}(hj8Ph]hdevs.i3c}(hj:PhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj6Pubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMYhj2PubjW)}(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}(hjQPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMWhjNPubah}(h]h ]h"]h$]h&]uh1jVhj2Pubeh}(h]h ]h"]h$]h&]uh1j4hjMPhMYhjNubj5)}(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)}(hjrPh]hdevs.i2c}(hjtPhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjpPubah}(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\hjlPubjW)}(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}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMZhjPubah}(h]h ]h"]h$]h&]uh1jVhjlPubeh}(h]h ]h"]h$]h&]uh1j4hjPhM\hjNubj5)}(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)}(hjPh]hlock}(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.hhMfhjPubjW)}(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}(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&]uh1jVhjPubeh}(h]h ]h"]h$]h&]uh1j4hjPhMfhjNubeh}(h]h ]h"]h$]h&]uh1j/hjMubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hjPh]h Description}(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.hhMjhhhhubj)}(hThe I3C bus is represented with its own object and not implicitly described by the I3C master to cope with the multi-master functionality, where one bus can be shared amongst several masters, each of them requesting bus ownership when they need to.h]hThe I3C bus is represented with its own object and not implicitly described by the I3C master to cope with the multi-master functionality, where one bus can be shared amongst several masters, each of them requesting bus ownership when they need to.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMghhhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h$i3c_master_controller_ops (C struct)c.i3c_master_controller_opshNtauh1hhhhhhNhNubh)}(hhh](h)}(hi3c_master_controller_opsh]h)}(h struct i3c_master_controller_opsh](jN)}(hjQh]hstruct}(hj-QhhhNhNubah}(h]h ]jZah"]h$]h&]uh1jMhj)Qhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMoubj)}(h h]h }(hj;QhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)Qhhhj:QhMoubj#)}(hi3c_master_controller_opsh]j))}(hj'Qh]hi3c_master_controller_ops}(hjMQhhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjIQubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hj)Qhhhj:QhMoubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj%Qhhhj:QhMoubah}(h]j Qah ](jjeh"]h$]h&]jj)jhuh1hhj:QhMohj"Qhhubj)}(hhh]j)}(hI3C master methodsh]hI3C master methods}(hjoQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM~hjlQhhubah}(h]h ]h"]h$]h&]uh1jhj"Qhhhj:QhMoubeh}(h]h ](jstructeh"]h$]h&]j jj jQj jQj j juh1hhhhhhNhNubj)}(hX[**Definition**:: struct 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 long dev_nack_retry_cnt); }; **Members** ``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. ``bus_cleanup`` cleanup everything done in :c:type:`i3c_master_controller_ops->bus_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}(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.hhMhjQubj18)}(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 long 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 long dev_nack_retry_cnt); };}hjQsbah}(h]h ]h"]h$]h&]hhuh1j08hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjQubj)}(h **Members**h]j)}(hjQh]hMembers}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjQubj0)}(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)}(hjQh]hbus_init}(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.hhMhjQubjW)}(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.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjQubah}(h]h ]h"]h$]h&]uh1jVhjQubeh}(h]h ]h"]h$]h&]uh1j4hjQhMhjQubj5)}(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)}(hjRh]h bus_cleanup}(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.hhMhjRubjW)}(hhh]j)}(hcleanup everything done in :c:type:`i3c_master_controller_ops->bus_init\(\) `. This method is optional.h](hcleanup everything done in }(hj/RhhhNhNubh)}(hM:c:type:`i3c_master_controller_ops->bus_init\(\) `h]jA)}(hj9Rh]h%i3c_master_controller_ops->bus_init()}(hj;RhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1j@hj7Rubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjjji3c_master_controller_opsuh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj/Rubh. This method is optional.}(hj/RhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjVRhMhj,Rubah}(h]h ]h"]h$]h&]uh1jVhjRubeh}(h]h ]h"]h$]h&]uh1j4hj+RhMhjQubj5)}(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)}(hjsRh]hattach_i3c_dev}(hjuRhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjqRubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjmRubjW)}(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.}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjRubah}(h]h ]h"]h$]h&]uh1jVhjmRubeh}(h]h ]h"]h$]h&]uh1j4hjRhMhjQubj5)}(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)}(hjRh]hreattach_i3c_dev}(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.hhMhjRubjW)}(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.}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjRubah}(h]h ]h"]h$]h&]uh1jVhjRubeh}(h]h ]h"]h$]h&]uh1j4hjRhMhjQubj5)}(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)}(hjRh]hdetach_i3c_dev}(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.hhMhjRubjW)}(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.}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjRubah}(h]h ]h"]h$]h&]uh1jVhjRubeh}(h]h ]h"]h$]h&]uh1j4hjRhMhjQubj5)}(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)}(hj!Sh]hdo_daa}(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.hhMhjSubjW)}(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.}(hj:ShhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj7Subah}(h]h ]h"]h$]h&]uh1jVhjSubeh}(h]h ]h"]h$]h&]uh1j4hj6ShMhjQubj5)}(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)}(hj[Sh]hsupports_ccc_cmd}(hj]ShhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjYSubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjUSubjW)}(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.}(hjtShhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjqSubah}(h]h ]h"]h$]h&]uh1jVhjUSubeh}(h]h ]h"]h$]h&]uh1j4hjpShMhjQubj5)}(h>``send_ccc_cmd`` send a CCC command This method is mandatory. h](j;)}(h``send_ccc_cmd``h]jA)}(hjSh]h send_ccc_cmd}(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.hhMhjSubjW)}(hhh]j)}(h,send a CCC command This method is mandatory.h]h,send a CCC command This method is mandatory.}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjSubah}(h]h ]h"]h$]h&]uh1jVhjSubeh}(h]h ]h"]h$]h&]uh1j4hjShMhjQubj5)}(hT``i3c_xfers`` do one or several I3C SDR or HDR transfers. This method is mandatory. h](j;)}(h ``i3c_xfers``h]jA)}(hjSh]h i3c_xfers}(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.hhMhjSubjW)}(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.}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjSubah}(h]h ]h"]h$]h&]uh1jVhjSubeh}(h]h ]h"]h$]h&]uh1j4hjShMhjQubj5)}(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)}(hj Th]hattach_i2c_dev}(hj ThhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjTubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjTubjW)}(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.}(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.hhMhjTubah}(h]h ]h"]h$]h&]uh1jVhjTubeh}(h]h ]h"]h$]h&]uh1j4hjThMhjQubj5)}(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)}(hjCTh]hdetach_i2c_dev}(hjEThhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjATubah}(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=TubjW)}(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.}(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.hhMhjYTubah}(h]h ]h"]h$]h&]uh1jVhj=Tubeh}(h]h ]h"]h$]h&]uh1j4hjXThMhjQubj5)}(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)}(hj}Th]h i2c_xfers}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj{Tubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjwTubjW)}(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.}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjTubah}(h]h ]h"]h$]h&]uh1jVhjwTubeh}(h]h ]h"]h$]h&]uh1j4hjThMhjQubj5)}(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)}(hjTh]h request_ibi}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjTubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjTubjW)}(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 -}(hjThhhNhNubjA)}(h ``EBUSY``h]hEBUSY}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjTubhR if there’s no more space for an extra IBI registration This method is optional.}(hjThhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjTubah}(h]h ]h"]h$]h&]uh1jVhjTubeh}(h]h ]h"]h$]h&]uh1j4hjThMhjQubj5)}(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)}(hjUh]hfree_ibi}(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.hhMhjTubjW)}(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.}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjUubah}(h]h ]h"]h$]h&]uh1jVhjTubeh}(h]h ]h"]h$]h&]uh1j4hjUhMhjQubj5)}(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)}(hj=Uh]h enable_ibi}(hj?UhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj;Uubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj7UubjW)}(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.}(hjVUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjSUubah}(h]h ]h"]h$]h&]uh1jVhj7Uubeh}(h]h ]h"]h$]h&]uh1j4hjRUhMhjQubj5)}(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)}(hjwUh]h disable_ibi}(hjyUhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjuUubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjqUubjW)}(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.}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjUubah}(h]h ]h"]h$]h&]uh1jVhjqUubeh}(h]h ]h"]h$]h&]uh1j4hjUhMhjQubj5)}(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)}(hjUh]hrecycle_ibi_slot}(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.hhMhjUubjW)}(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.}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjUubah}(h]h ]h"]h$]h&]uh1jVhjUubeh}(h]h ]h"]h$]h&]uh1j4hjUhMhjQubj5)}(h1``enable_hotjoin`` enable hot join event detect. h](j;)}(h``enable_hotjoin``h]jA)}(hjUh]henable_hotjoin}(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.hhMhjUubjW)}(hhh]j)}(henable hot join event detect.h]henable hot join event detect.}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVhMhjVubah}(h]h ]h"]h$]h&]uh1jVhjUubeh}(h]h ]h"]h$]h&]uh1j4hjVhMhjQubj5)}(h3``disable_hotjoin`` disable hot join event detect. h](j;)}(h``disable_hotjoin``h]jA)}(hj$Vh]hdisable_hotjoin}(hj&VhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj"Vubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjVubjW)}(hhh]j)}(hdisable hot join event detect.h]hdisable hot join event detect.}(hj=VhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9VhMhj:Vubah}(h]h ]h"]h$]h&]uh1jVhjVubeh}(h]h ]h"]h$]h&]uh1j4hj9VhMhjQubj5)}(h1``set_speed`` adjust I3C open drain mode timing. h](j;)}(h ``set_speed``h]jA)}(hj]Vh]h set_speed}(hj_VhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj[Vubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjWVubjW)}(hhh]j)}(h"adjust I3C open drain mode timing.h]h"adjust I3C open drain mode timing.}(hjvVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrVhMhjsVubah}(h]h ]h"]h$]h&]uh1jVhjWVubeh}(h]h ]h"]h$]h&]uh1j4hjrVhMhjQubj5)}(hS``set_dev_nack_retry`` configure device NACK retry count for the master controller.h](j;)}(h``set_dev_nack_retry``h]jA)}(hjVh]hset_dev_nack_retry}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjVubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjVubjW)}(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 ``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`` 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 ``dev_nack_retry_count`` retry count when slave device nackh](j)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjUWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQWubh:}(hjQWhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjMWubj18)}(hXstruct 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; struct { struct list_head i3c; struct list_head i2c; } boardinfo; struct i3c_bus bus; struct workqueue_struct *wq; unsigned int dev_nack_retry_count; };h]hXstruct 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; struct { struct list_head i3c; struct list_head i2c; } boardinfo; struct i3c_bus bus; struct workqueue_struct *wq; unsigned int dev_nack_retry_count; };}hjnWsbah}(h]h ]h"]h$]h&]hhuh1j08hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjMWubj)}(h **Members**h]j)}(hjWh]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.hhMhjMWubj0)}(hhh](j5)}(h4``dev`` device to be registered to the device-model h](j;)}(h``dev``h]jA)}(hjWh]hdev}(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.hhMhjWubjW)}(hhh]j)}(h+device to be registered to the device-modelh]h+device to be registered to the device-model}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWhMhjWubah}(h]h ]h"]h$]h&]uh1jVhjWubeh}(h]h ]h"]h$]h&]uh1j4hjWhMhjWubj5)}(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)}(hjWh]hthis}(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.hhMhjWubjW)}(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}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjWubah}(h]h ]h"]h$]h&]uh1jVhjWubeh}(h]h ]h"]h$]h&]uh1j4hjWhMhjWubj5)}(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)}(hjXh]hi2c}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjXubah}(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 XubjW)}(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}(hj*XhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj'Xubah}(h]h ]h"]h$]h&]uh1jVhj Xubeh}(h]h ]h"]h$]h&]uh1j4hj&XhMhjWubj5)}(hf``ops`` master operations. See :c:type:`struct i3c_master_controller_ops ` h](j;)}(h``ops``h]jA)}(hjKXh]hops}(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.hhMhjEXubjW)}(hhh]j)}(h]master operations. See :c:type:`struct i3c_master_controller_ops `h](hmaster operations. See }(hjdXhhhNhNubh)}(hF:c:type:`struct i3c_master_controller_ops `h]jA)}(hjnXh]h struct i3c_master_controller_ops}(hjpXhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1j@hjlXubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjjji3c_master_controller_opsuh1hhj`XhMhjdXubeh}(h]h ]h"]h$]h&]uh1jhj`XhMhjaXubah}(h]h ]h"]h$]h&]uh1jVhjEXubeh}(h]h ]h"]h$]h&]uh1j4hj`XhMhjWubj5)}(h7``secondary`` true if the master is a secondary master h](j;)}(h ``secondary``h]jA)}(hjXh]h secondary}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjXubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjXubjW)}(hhh]j)}(h(true if the master is a secondary masterh]h(true if the master is a secondary master}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXhMhjXubah}(h]h ]h"]h$]h&]uh1jVhjXubeh}(h]h ]h"]h$]h&]uh1j4hjXhMhjWubj5)}(h7``init_done`` true when the bus initialization is done h](j;)}(h ``init_done``h]jA)}(hjXh]h init_done}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjXubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjXubjW)}(hhh]j)}(h(true when the bus initialization is doneh]h(true when the bus initialization is done}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXhMhjXubah}(h]h ]h"]h$]h&]uh1jVhjXubeh}(h]h ]h"]h$]h&]uh1j4hjXhMhjWubj5)}(h/``hotjoin`` true if the master support hotjoin h](j;)}(h ``hotjoin``h]jA)}(hjYh]hhotjoin}(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.hhMhjYubjW)}(hhh]j)}(h"true if the master support hotjoinh]h"true if the master support hotjoin}(hj.YhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*YhMhj+Yubah}(h]h ]h"]h$]h&]uh1jVhjYubeh}(h]h ]h"]h$]h&]uh1j4hj*YhMhjWubj5)}(h+``rpm_allowed`` true if Runtime PM allowed h](j;)}(h``rpm_allowed``h]jA)}(hjNYh]h rpm_allowed}(hjPYhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjLYubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjHYubjW)}(hhh]j)}(htrue if Runtime PM allowedh]htrue if Runtime PM allowed}(hjgYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcYhMhjdYubah}(h]h ]h"]h$]h&]uh1jVhjHYubeh}(h]h ]h"]h$]h&]uh1j4hjcYhMhjWubj5)}(hM``rpm_ibi_allowed`` true if IBI and Hot-Join allowed while runtime suspended h](j;)}(h``rpm_ibi_allowed``h]jA)}(hjYh]hrpm_ibi_allowed}(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.hhMhjYubjW)}(hhh]j)}(h8true if IBI and Hot-Join allowed while runtime suspendedh]h8true if IBI and Hot-Join allowed while runtime suspended}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYhMhjYubah}(h]h ]h"]h$]h&]uh1jVhjYubeh}(h]h ]h"]h$]h&]uh1j4hjYhMhjWubj5)}(hO``boardinfo`` board-level information attached to devices connected on the bus h](j;)}(h ``boardinfo``h]jA)}(hjYh]h boardinfo}(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.hhMhjYubjW)}(hhh]j)}(h@board-level information attached to devices connected on the bush]h@board-level information attached to devices connected on the bus}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYhMhjYubah}(h]h ]h"]h$]h&]uh1jVhjYubeh}(h]h ]h"]h$]h&]uh1j4hjYhMhjWubj5)}(h1``boardinfo.i3c`` list of I3C boardinfo objects h](j;)}(h``boardinfo.i3c``h]jA)}(hjYh]h boardinfo.i3c}(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.hhMhjYubjW)}(hhh]j)}(hlist of I3C boardinfo objectsh]hlist of I3C boardinfo objects}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZhMhjZubah}(h]h ]h"]h$]h&]uh1jVhjYubeh}(h]h ]h"]h$]h&]uh1j4hjZhMhjWubj5)}(h0``boardinfo.i2c`` list of I2C boardinfo objects h](j;)}(h``boardinfo.i2c``h]jA)}(hj2Zh]h boardinfo.i2c}(hj4ZhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj0Zubah}(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,ZubjW)}(hhh]j)}(hlist of I2C boardinfo objectsh]hlist of I2C boardinfo objects}(hjKZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGZhMhjHZubah}(h]h ]h"]h$]h&]uh1jVhj,Zubeh}(h]h ]h"]h$]h&]uh1j4hjGZhMhjWubj5)}(h'``bus`` I3C bus exposed by this master h](j;)}(h``bus``h]jA)}(hjkZh]hbus}(hjmZhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjiZubah}(h]h ]h"]h$]h&]uh1j:hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjeZubjW)}(hhh]j)}(hI3C bus exposed by this masterh]hI3C bus exposed by this master}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZhMhjZubah}(h]h ]h"]h$]h&]uh1jVhjeZubeh}(h]h ]h"]h$]h&]uh1j4hjZhMhjWubj5)}(hX``wq`` 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)}(hjZh]hwq}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjZubah}(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 hjZubjW)}(hhh]j)}(hXworkqueue 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]hXworkqueue 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}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjZubah}(h]h ]h"]h$]h&]uh1jVhjZubeh}(h]h ]h"]h$]h&]uh1j4hjZhM hjWubj5)}(h;``dev_nack_retry_count`` retry count when slave device nackh](j;)}(h``dev_nack_retry_count``h]jA)}(hjZh]hdev_nack_retry_count}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjZubah}(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 hjZubjW)}(hhh]j)}(h"retry count when slave device nackh]h"retry count when slave device nack}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM hjZubah}(h]h ]h"]h$]h&]uh1jVhjZubeh}(h]h ]h"]h$]h&]uh1j4hjZhM hjWubeh}(h]h ]h"]h$]h&]uh1j/hjMWubeh}(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.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 }(hj7[hhhNhNubh)}(h>:c:type:`struct i3c_master_controller `h]jA)}(hjA[h]hstruct i3c_master_controller}(hjC[hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1j@hj?[ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjjji3c_master_controlleruh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM hj7[ubhR has to be registered to the I3C subsystem through i3c_master_register(). None of }(hj7[hhhNhNubh)}(h>:c:type:`struct i3c_master_controller `h]jA)}(hje[h]hstruct i3c_master_controller}(hjg[hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1j@hjc[ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjjji3c_master_controlleruh1hhj^[hM hj7[ubhV fields should be set manually, just pass appropriate values to i3c_master_register().}(hj7[hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj^[hM hhhhubh)}(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))}(hj[h]hi3c_bus_for_each_i2cdev}(hj[hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj[ubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hj[hhhj/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[hhhj[hM&ubah}(h]j[ah ](jjeh"]h$]h&]jj)jhuh1hhj[hM&hj[hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj[hhhj[hM&ubeh}(h]h ](jmacroeh"]h$]h&]j jj j[j j[j j juh1hhhhhhNhNubj)}(h&``i3c_bus_for_each_i2cdev (bus, dev)``h]jA)}(hj[h]h"i3c_bus_for_each_i2cdev (bus, dev)}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj[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(hhhhubh 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}(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&]uh1j[hj\hM&hhhhubj)}(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\h]h Parameters}(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)}(h``bus`` the I3C bus h](j;)}(h``bus``h]jA)}(hj1\h]hbus}(hj3\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 the I3C bush]h the I3C bus}(hjJ\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjF\hM'hjG\ubah}(h]h ]h"]h$]h&]uh1jVhj+\ubeh}(h]h ]h"]h$]h&]uh1j4hjF\hM'hj(\ubj5)}(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)}(hjj\h]hdev}(hjl\hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjh\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)hjd\ubjW)}(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}(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&]uh1jVhjd\ubeh}(h]h ]h"]h$]h&]uh1j4hj\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&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM+hj \ubj)}(h-Iterate over all I2C devs present on the bus.h]h-Iterate over all I2C devs present on the bus.}(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 \ubeh}(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))}(hj\h]hi3c_bus_for_each_i3cdev}(hj\hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj\ubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hj\hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM1ubah}(h]h ]h"]h$]h&]hhjuh1hjjhj\hhhj]hM1ubah}(h]j\ah ](jjeh"]h$]h&]jj)jhuh1hhj]hM1hj\hhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj\hhhj]hM1ubeh}(h]h ](jmacroeh"]h$]h&]j jj j]j j]j j juh1hhhhhhNhNubj)}(h&``i3c_bus_for_each_i3cdev (bus, dev)``h]jA)}(hj!]h]h"i3c_bus_for_each_i3cdev (bus, dev)}(hj#]hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj]ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM3hhhhubj[)}(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}(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.hhM1hj7]ubah}(h]h ]h"]h$]h&]uh1j[hjI]hM1hhhhubj)}(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)}(hjV]h]h Parameters}(hjX]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjT]ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM5hjP]ubj0)}(hhh](j5)}(h``bus`` the I3C bus h](j;)}(h``bus``h]jA)}(hju]h]hbus}(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.hhM2hjo]ubjW)}(hhh]j)}(h the I3C bush]h the I3C bus}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]hM2hj]ubah}(h]h ]h"]h$]h&]uh1jVhjo]ubeh}(h]h ]h"]h$]h&]uh1j4hj]hM2hjl]ubj5)}(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)}(hj]h]hdev}(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.hhM4hj]ubjW)}(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}(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.hhM3hj]ubah}(h]h ]h"]h$]h&]uh1jVhj]ubeh}(h]h ]h"]h$]h&]uh1j4hj]hM4hjl]ubeh}(h]h ]h"]h$]h&]uh1j/hjP]ubj)}(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.hhM6hjP]ubj)}(h-Iterate over all I3C devs present on the bus.h]h-Iterate over all I3C devs present on the bus.}(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.hhM5hjP]ubeh}(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/^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_dmah]j))}(hj)^h]hi3c_dma}(hjO^hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjK^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)}(h#DMA transfer and mapping descriptorh]h#DMA transfer and mapping descriptor}(hjq^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<hjn^hhubah}(h]h ]h"]h$]h&]uh1jhj$^hhhj<^hM:ubeh}(h]h ](jstructeh"]h$]h&]j jj j^j j^j 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}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubh:}(hj^hhhNhNubeh}(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^ubj18)}(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; };}hj^sbah}(h]h ]h"]h$]h&]hhuh1j08hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMBhj^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.hhMLhj^ubj0)}(hhh](j5)}(h,``dev`` device object of a device doing DMA h](j;)}(h``dev``h]jA)}(hj^h]hdev}(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#device object of a device doing DMAh]h#device object of a device doing DMA}(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*``buf`` destination/source buffer for DMA h](j;)}(h``buf``h]jA)}(hj_h]hbuf}(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!destination/source buffer for DMAh]h!destination/source buffer for DMA}(hj0_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``len`` length of transfer h](j;)}(h``len``h]jA)}(hjP_h]hlen}(hjR_hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hjN_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@hjJ_ubjW)}(hhh]j)}(hlength of transferh]hlength of transfer}(hji_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhje_hM@hjf_ubah}(h]h ]h"]h$]h&]uh1jVhjJ_ubeh}(h]h ]h"]h$]h&]uh1j4hje_hM@hj^ubj5)}(h"``map_len`` length of DMA mapping h](j;)}(h ``map_len``h]jA)}(hj_h]hmap_len}(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.hhMAhj_ubjW)}(hhh]j)}(hlength of DMA mappingh]hlength of DMA mapping}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_hMAhj_ubah}(h]h ]h"]h$]h&]uh1jVhj_ubeh}(h]h ]h"]h$]h&]uh1j4hj_hMAhj^ubj5)}(h9``addr`` mapped DMA address for a Host Controller Driver h](j;)}(h``addr``h]jA)}(hj_h]haddr}(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.hhMBhj_ubjW)}(hhh]j)}(h/mapped DMA address for a Host Controller Driverh]h/mapped DMA address for a Host Controller Driver}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_hMBhj_ubah}(h]h ]h"]h$]h&]uh1jVhj_ubeh}(h]h ]h"]h$]h&]uh1j4hj_hMBhj^ubj5)}(h``dir`` DMA direction h](j;)}(h``dir``h]jA)}(hj_h]hdir}(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.hhMChj_ubjW)}(hhh]j)}(h DMA directionh]h DMA direction}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`hMChj`ubah}(h]h ]h"]h$]h&]uh1jVhj_ubeh}(h]h ]h"]h$]h&]uh1j4hj`hMChj^ubj5)}(hF``bounce_buf`` an allocated bounce buffer if transfer needs it or NULLh](j;)}(h``bounce_buf``h]jA)}(hj4`h]h bounce_buf}(hj6`hhhNhNubah}(h]h ]h"]h$]h&]uh1j@hj2`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.hhMChj.`ubjW)}(hhh]j)}(h7an allocated bounce buffer if transfer needs it or NULLh]h7an allocated bounce buffer if transfer needs it or NULL}(hjM`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMDhjJ`ubah}(h]h ]h"]h$]h&]uh1jVhj.`ubeh}(h]h ]h"]h$]h&]uh1j4hjI`hMChj^ubeh}(h]h ]h"]h$]h&]uh1j/hj^ubeh}(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}(hj`hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj`hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMtubj)}(h h]h }(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`hhhj`hMtubj)}(hjh]h*}(hj`hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`hhhj`hMtubj#)}(hi3c_dev_get_master_datah]j))}(hi3c_dev_get_master_datah]hi3c_dev_get_master_data}(hj`hhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj`ubah}(h]h ](j<j=eh"]h$]h&]hhuh1j"hj`hhhj`hMtubjB)}(h (const struct i3c_dev_desc *dev)h]jH)}(hconst struct i3c_dev_desc *devh](jN)}(hj`h]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 }(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubh)}(hhh]j))}(h i3c_dev_desch]h i3c_dev_desc}(hjahhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hjaubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjamodnameN classnameNjj)}j]j)}jj`sbc.i3c_dev_get_master_dataasbuh1hhj`ubj)}(h h]h }(hj1ahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubj)}(hjh]h*}(hj?ahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubj))}(hdevh]hdev}(hjLahhhNhNubah}(h]h ]j5ah"]h$]h&]uh1j(hj`ubeh}(h]h ]h"]h$]h&]noemphhhuh1jGhj`ubah}(h]h ]h"]h$]h&]hhuh1jAhj`hhhj`hMtubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj`hhhj`hMtubah}(h]j`ah ](jjeh"]h$]h&]jj)jhuh1hhj`hMthj`hhubj)}(hhh]j)}(h