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]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}(hhhhhNhNubah}(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 }(hhhhhNhNubah}(h]h ]wah"]h$]h&]uh1hhhhhhhhKubh desc_name)}(hi3c_bus_maintenance_lockh]h desc_sig_name)}(hi3c_bus_maintenance_lockh]hi3c_bus_maintenance_lock}(hjhhhNhNubah}(h]h ]nah"]h$]h&]uh1jhjubah}(h]h ](sig-namedescnameeh"]h$]h&]hhuh1jhhhhhhhKubhdesc_parameterlist)}(h(struct i3c_bus *bus)h]hdesc_parameter)}(hstruct i3c_bus *bush](hdesc_sig_keyword)}(hstructh]hstruct}(hj;hhhNhNubah}(h]h ]kah"]h$]h&]uh1j9hj5ubh)}(h h]h }(hjJhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj5ubh)}(hhh]j)}(hi3c_bush]hi3c_bus}(hj[hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&] refdomaincreftype identifier reftargetj]modnameN classnameN c:parent_keysphinx.domains.c LookupKey)}data]jw ASTIdentifier)}jrjsbc.i3c_bus_maintenance_lockasbuh1hhj5ubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj5ubhdesc_sig_punctuation)}(h*h]h*}(hjhhhNhNubah}(h]h ]pah"]h$]h&]uh1jhj5ubj)}(hbush]hbus}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj5ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj/ubah}(h]h ]h"]h$]h&]hhuh1j-hhhhhhhKubeh}(h]h ]h"]h$]h&]hh add_permalinkuh1hsphinx_line_type declaratorhhhhhhhKubah}(h]hah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1hhhhKhhhhubh 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&]uh1jhhhhhhhKubeh}(h]h ](jpfunctioneh"]h$]h&]domainjpobjtypejdesctypejnoindex 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}(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.chKhj"ubh definition)}(hhh]j)}(hI3C bus to take the lock onh]hI3C bus to take the lock on}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAhKhjDubah}(h]h ]h"]h$]h&]uh1jBhj"ubeh}(h]h ]h"]h$]h&]uh1j hjAhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h**Description**h]j)}(hjih]h Description}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.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](h)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]hah"]h$]h&]uh1hhjhhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chK3ubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjhhhjhK3ubj)}(hi3c_bus_maintenance_unlockh]j)}(hi3c_bus_maintenance_unlockh]hi3c_bus_maintenance_unlock}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjhhhjhK3ubj.)}(h(struct i3c_bus *bus)h]j4)}(hstruct i3c_bus *bush](j:)}(hj=h]hstruct}(hjhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjubh)}(hhh]j)}(hi3c_bush]hi3c_bus}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetjmodnameN classnameNjvjy)}j|]j)}jrjsbc.i3c_bus_maintenance_unlockasbuh1hhjubh)}(h h]h }(hj8hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjubj)}(hjh]h*}(hjFhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbush]hbus}(hjShhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hjubah}(h]h ]h"]h$]h&]hhuh1j-hjhhhjhK3ubeh}(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}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chK3hjzhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhK3ubeh}(h]h ](jpfunctioneh"]h$]h&]jjpjjjjjjjuh1hhhhhhNhNubj)}(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.chK7hjubj)}(hhh]j!)}(h7``struct i3c_bus *bus`` I3C bus to release the lock on h](j')}(h``struct i3c_bus *bus``h]j-)}(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.chK5hjubjC)}(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&]uh1jBhjubeh}(h]h ]h"]h$]h&]uh1j hjhK5hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(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.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.}(hjhhhNhNubah}(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](h)}(hvoidh]hvoid}(hj>hhhNhNubah}(h]h ]hah"]h$]h&]uh1hhj:hhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chKAubh)}(h h]h }(hjMhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj:hhhjLhKAubj)}(hi3c_bus_normaluse_lockh]j)}(hi3c_bus_normaluse_lockh]hi3c_bus_normaluse_lock}(hj_hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj[ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj:hhhjLhKAubj.)}(h(struct i3c_bus *bus)h]j4)}(hstruct i3c_bus *bush](j:)}(hj=h]hstruct}(hj{hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjwubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjwubh)}(hhh]j)}(hi3c_bush]hi3c_bus}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetjmodnameN classnameNjvjy)}j|]j)}jrjasbc.i3c_bus_normaluse_lockasbuh1hhjwubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjwubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjwubj)}(hbush]hbus}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjwubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hjsubah}(h]h ]h"]h$]h&]hhuh1j-hj:hhhjLhKAubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj6hhhjLhKAubah}(h]j1ah ](jjeh"]h$]h&]jj)jhuh1hhjLhKAhj3hhubj)}(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&]uh1jhj3hhhjLhKAubeh}(h]h ](jpfunctioneh"]h$]h&]jjpjjjjjjjuh1hhhhhhNhNubj)}(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)}(hj h]h Parameters}(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.chKEhjubj)}(hhh]j!)}(h4``struct i3c_bus *bus`` I3C bus to take the lock on h](j')}(h``struct i3c_bus *bus``h]j-)}(hj?h]hstruct i3c_bus *bus}(hjAhhhNhNubah}(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.chKBhj9ubjC)}(hhh]j)}(hI3C bus to take the lock onh]hI3C bus to take the lock on}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjThKBhjUubah}(h]h ]h"]h$]h&]uh1jBhj9ubeh}(h]h ]h"]h$]h&]uh1j hjThKBhj6ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h**Description**h]j)}(hjzh]h Description}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chKDhjubj)}(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.chKChjubj)}(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.chKIhjubeh}(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](h)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]hah"]h$]h&]uh1hhjhhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chKVubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjhhhjhKVubj)}(hi3c_bus_normaluse_unlockh]j)}(hi3c_bus_normaluse_unlockh]hi3c_bus_normaluse_unlock}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjhhhjhKVubj.)}(h(struct i3c_bus *bus)h]j4)}(hstruct i3c_bus *bush](j:)}(hj=h]hstruct}(hj hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjubh)}(hhh]j)}(hi3c_bush]hi3c_bus}(hj)hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetj+modnameN classnameNjvjy)}j|]j)}jrjsbc.i3c_bus_normaluse_unlockasbuh1hhjubh)}(h h]h }(hjIhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjubj)}(hjh]h*}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbush]hbus}(hjdhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hjubah}(h]h ]h"]h$]h&]hhuh1j-hjhhhjhKVubeh}(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 ](jpfunctioneh"]h$]h&]jjpjjjjjjjuh1hhhhhhNhNubj)}(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.chKZhjubj)}(hhh]j!)}(h7``struct i3c_bus *bus`` I3C bus to release the lock on h](j')}(h``struct i3c_bus *bus``h]j-)}(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.chKWhjubjC)}(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&]uh1jBhjubeh}(h]h ]h"]h$]h&]uh1j hjhKWhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h**Description**h]j)}(hj h]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.}(hj hhhNhNubah}(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_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](h)}(hinth]hint}(hjOhhhNhNubah}(h]h ]hah"]h$]h&]uh1hhjKhhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMubh)}(h h]h }(hj^hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjKhhhj]hMubj)}(hi3c_master_get_free_addrh]j)}(hi3c_master_get_free_addrh]hi3c_master_get_free_addr}(hjphhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjlubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjKhhhj]hMubj.)}(h5(struct i3c_master_controller *master, u8 start_addr)h](j4)}(h$struct i3c_master_controller *masterh](j:)}(hj=h]hstruct}(hjhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjubh)}(hhh]j)}(hi3c_master_controllerh]hi3c_master_controller}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetjmodnameN classnameNjvjy)}j|]j)}jrjrsbc.i3c_master_get_free_addrasbuh1hhjubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hmasterh]hmaster}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hjubj4)}(h u8 start_addrh](h)}(hhh]j)}(hu8h]hu8}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetjmodnameN classnameNjvjy)}j|]jc.i3c_master_get_free_addrasbuh1hhjubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjubj)}(h start_addrh]h start_addr}(hj-hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hjubeh}(h]h ]h"]h$]h&]hhuh1j-hjKhhhj]hMubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjGhhhj]hMubah}(h]jBah ](jjeh"]h$]h&]jj)jhuh1hhj]hMhjDhhubj)}(hhh]j)}(hget a free address on the bush]hget a free address on the bus}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjThhubah}(h]h ]h"]h$]h&]uh1jhjDhhhj]hMubeh}(h]h ](jpfunctioneh"]h$]h&]jjpjjojjojjjuh1hhhhhhNhNubj)}(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)}(hjyh]h Parameters}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjwubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjsubj)}(hhh](j!)}(h;``struct i3c_master_controller *master`` I3C master object h](j')}(h(``struct i3c_master_controller *master``h]j-)}(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.chMhjubjC)}(hhh]j)}(hI3C master objecth]hI3C master object}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jBhjubeh}(h]h ]h"]h$]h&]uh1j hjhMhjubj!)}(h+``u8 start_addr`` where to start searching h](j')}(h``u8 start_addr``h]j-)}(hjh]h u8 start_addr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjubah}(h]h ]h"]h$]h&]uh1j&hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubjC)}(hhh]j)}(hwhere to start searchingh]hwhere to start searching}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jBhjubeh}(h]h ]h"]h$]h&]uh1j hjhMhjubeh}(h]h ]h"]h$]h&]uh1jhjsubj)}(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.chMhjsubj)}(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.chMhjsubj)}(h **Return**h]j)}(hj3 h]hReturn}(hj5 hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1 ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjsubj)}(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 }(hjI hhhNhNubj)}(h**start_addr**h]h start_addr}(hjQ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjI ubh> (included) or -ENOMEM if there’s no more address available.}(hjI hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjsubeh}(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](h)}(hinth]hint}(hj hhhNhNubah}(h]h ]hah"]h$]h&]uh1hhj hhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMubh)}(h h]h }(hj hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj hhhj hMubj)}(hi3c_master_entdaa_lockedh]j)}(hi3c_master_entdaa_lockedh]hi3c_master_entdaa_locked}(hj hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj hhhj hMubj.)}(h&(struct i3c_master_controller *master)h]j4)}(h$struct i3c_master_controller *masterh](j:)}(hj=h]hstruct}(hj hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj ubh)}(h h]h }(hj hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj ubh)}(hhh]j)}(hi3c_master_controllerh]hi3c_master_controller}(hj hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetj modnameN classnameNjvjy)}j|]j)}jrj sbc.i3c_master_entdaa_lockedasbuh1hhj ubh)}(h h]h }(hj hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hmasterh]hmaster}(hj hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj ubah}(h]h ]h"]h$]h&]hhuh1j-hj 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}(hjJ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjG hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hMubeh}(h]h ](jpfunctioneh"]h$]h&]jjpjjb jjb jjjuh1hhhhhhNhNubj)}(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, a positive I3C error code if the error is one of the official Mx error codes, and a negative error code otherwise.h](j)}(h**Parameters**h]j)}(hjl h]h Parameters}(hjn hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjj ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjf ubj)}(hhh]j!)}(hO``struct i3c_master_controller *master`` master used to send frames on the bus h](j')}(h(``struct i3c_master_controller *master``h]j-)}(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 ubjC)}(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&]uh1jBhj ubeh}(h]h ]h"]h$]h&]uh1j hj hMhj ubah}(h]h ]h"]h$]h&]uh1jhjf 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.chMhjf 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.chMhjf 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.chMhjf 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.chMhjf ubj)}(h **Return**h]j)}(hj h]hReturn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjf ubj)}(h0 in case of success, a positive I3C error code if the error is one of the official Mx error codes, and a negative error code otherwise.h]h0 in case of success, a positive I3C error code if the error is one of the official Mx error codes, and 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 hjf 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](h)}(hinth]hint}(hjP hhhNhNubah}(h]h ]hah"]h$]h&]uh1hhjL hhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM6ubh)}(h h]h }(hj_ hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjL hhhj^ hM6ubj)}(hi3c_master_disec_lockedh]j)}(hi3c_master_disec_lockedh]hi3c_master_disec_locked}(hjq hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjm ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjL hhhj^ hM6ubj.)}(h8(struct i3c_master_controller *master, u8 addr, u8 evts)h](j4)}(h$struct i3c_master_controller *masterh](j:)}(hj=h]hstruct}(hj hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj ubh)}(h h]h }(hj hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj ubh)}(hhh]j)}(hi3c_master_controllerh]hi3c_master_controller}(hj hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetj modnameN classnameNjvjy)}j|]j)}jrjs sbc.i3c_master_disec_lockedasbuh1hhj ubh)}(h h]h }(hj hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hmasterh]hmaster}(hj hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj ubj4)}(hu8 addrh](h)}(hhh]j)}(hu8h]hu8}(hj hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetj modnameN classnameNjvjy)}j|]j c.i3c_master_disec_lockedasbuh1hhj ubh)}(h h]h }(hj hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj ubj)}(haddrh]haddr}(hj. hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj ubj4)}(hu8 evtsh](h)}(hhh]j)}(hu8h]hu8}(hjJ hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjG ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetjL modnameN classnameNjvjy)}j|]j c.i3c_master_disec_lockedasbuh1hhjC ubh)}(h h]h }(hjh hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjC ubj)}(hevtsh]hevts}(hjv hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjC ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj ubeh}(h]h ]h"]h$]h&]hhuh1j-hjL hhhj^ hM6ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjH hhhj^ hM6ubah}(h]jC ah ](jjeh"]h$]h&]jj)jhuh1hhj^ hM6hjE hhubj)}(hhh]j)}(hsend a DISEC CCC commandh]hsend a DISEC 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.chM6hj hhubah}(h]h ]h"]h$]h&]uh1jhjE hhhj^ hM6ubeh}(h]h ](jpfunctioneh"]h$]h&]jjpjj jj jjjuh1hhhhhhNhNubj)}(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, a positive I3C error code if the error is one of the official Mx error codes, and 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 ubj)}(hhh](j!)}(hO``struct i3c_master_controller *master`` master used to send frames on the bus h](j')}(h(``struct i3c_master_controller *master``h]j-)}(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.chM7hj ubjC)}(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 hM7hj ubah}(h]h ]h"]h$]h&]uh1jBhj ubeh}(h]h ]h"]h$]h&]uh1j hj hM7hj ubj!)}(h@``u8 addr`` a valid I3C slave address or ``I3C_BROADCAST_ADDR`` h](j')}(h ``u8 addr``h]j-)}(hj h]hu8 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.chM8hj ubjC)}(hhh]j)}(h3a valid I3C slave address or ``I3C_BROADCAST_ADDR``h](ha valid I3C slave address or }(hj3 hhhNhNubj-)}(h``I3C_BROADCAST_ADDR``h]hI3C_BROADCAST_ADDR}(hj; hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj3 ubeh}(h]h ]h"]h$]h&]uh1jhj/ hM8hj0 ubah}(h]h ]h"]h$]h&]uh1jBhj ubeh}(h]h ]h"]h$]h&]uh1j hj/ hM8hj ubj!)}(h``u8 evts`` events to disable h](j')}(h ``u8 evts``h]j-)}(hja h]hu8 evts}(hjc 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.chM9hj[ ubjC)}(hhh]j)}(hevents to disableh]hevents to disable}(hjz hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjv hM9hjw ubah}(h]h ]h"]h$]h&]uh1jBhj[ ubeh}(h]h ]h"]h$]h&]uh1j hjv hM9hj ubeh}(h]h ]h"]h$]h&]uh1jhj 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)}(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 }(hj hhhNhNubj)}(h**addr**h]haddr}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh is }(hj hhhNhNubj-)}(h``I3C_BROADCAST_ADDR``h]hI3C_BROADCAST_ADDR}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj ubh.}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM:hj ubj)}(hBThis function must be called with the bus lock held in write mode.h]hBThis function must be called with the bus lock held in write mode.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM=hj ubj)}(h **Return**h]j)}(hj h]hReturn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM?hj ubj)}(h0 in case of success, a positive I3C error code if the error is one of the official Mx error codes, and a negative error code otherwise.h]h0 in case of success, a positive I3C error code if the error is one of the official Mx error codes, and 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_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](h)}(hinth]hint}(hj;hhhNhNubah}(h]h ]hah"]h$]h&]uh1hhj7hhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMKubh)}(h h]h }(hjJhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj7hhhjIhMKubj)}(hi3c_master_enec_lockedh]j)}(hi3c_master_enec_lockedh]hi3c_master_enec_locked}(hj\hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjXubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj7hhhjIhMKubj.)}(h8(struct i3c_master_controller *master, u8 addr, u8 evts)h](j4)}(h$struct i3c_master_controller *masterh](j:)}(hj=h]hstruct}(hjxhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjtubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjtubh)}(hhh]j)}(hi3c_master_controllerh]hi3c_master_controller}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetjmodnameN classnameNjvjy)}j|]j)}jrj^sbc.i3c_master_enec_lockedasbuh1hhjtubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjtubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjtubj)}(hmasterh]hmaster}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjtubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hjpubj4)}(hu8 addrh](h)}(hhh]j)}(hu8h]hu8}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetjmodnameN classnameNjvjy)}j|]jc.i3c_master_enec_lockedasbuh1hhjubh)}(h h]h }(hj hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjubj)}(haddrh]haddr}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hjpubj4)}(hu8 evtsh](h)}(hhh]j)}(hu8h]hu8}(hj5hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetj7modnameN classnameNjvjy)}j|]jc.i3c_master_enec_lockedasbuh1hhj.ubh)}(h h]h }(hjShhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj.ubj)}(hevtsh]hevts}(hjahhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hjpubeh}(h]h ]h"]h$]h&]hhuh1j-hj7hhhjIhMKubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj3hhhjIhMKubah}(h]j.ah ](jjeh"]h$]h&]jj)jhuh1hhjIhMKhj0hhubj)}(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.chMKhjhhubah}(h]h ]h"]h$]h&]uh1jhj0hhhjIhMKubeh}(h]h ](jpfunctioneh"]h$]h&]jjpjjjjjjjuh1hhhhhhNhNubj)}(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, a positive I3C error code if the error is one of the official Mx error codes, and 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.chMOhjubj)}(hhh](j!)}(hO``struct i3c_master_controller *master`` master used to send frames on the bus h](j')}(h(``struct i3c_master_controller *master``h]j-)}(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.chMLhjubjC)}(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&]uh1jhjhMLhjubah}(h]h ]h"]h$]h&]uh1jBhjubeh}(h]h ]h"]h$]h&]uh1j hjhMLhjubj!)}(h@``u8 addr`` a valid I3C slave address or ``I3C_BROADCAST_ADDR`` h](j')}(h ``u8 addr``h]j-)}(hjh]hu8 addr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjubah}(h]h ]h"]h$]h&]uh1j&hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMMhjubjC)}(hhh]j)}(h3a valid I3C slave address or ``I3C_BROADCAST_ADDR``h](ha valid I3C slave address or }(hjhhhNhNubj-)}(h``I3C_BROADCAST_ADDR``h]hI3C_BROADCAST_ADDR}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjubeh}(h]h ]h"]h$]h&]uh1jhjhMMhjubah}(h]h ]h"]h$]h&]uh1jBhjubeh}(h]h ]h"]h$]h&]uh1j hjhMMhjubj!)}(h``u8 evts`` events to disable h](j')}(h ``u8 evts``h]j-)}(hjLh]hu8 evts}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjJubah}(h]h ]h"]h$]h&]uh1j&hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMNhjFubjC)}(hhh]j)}(hevents to disableh]hevents to disable}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjahMNhjbubah}(h]h ]h"]h$]h&]uh1jBhjFubeh}(h]h ]h"]h$]h&]uh1j hjahMNhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(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.chMPhjubj)}(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 }(hjhhhNhNubj-)}(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.chMOhjubj)}(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.chMRhjubj)}(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.chMThjubj)}(h0 in case of success, a positive I3C error code if the error is one of the official Mx error codes, and a negative error code otherwise.h]h0 in case of success, a positive I3C error code if the error is one of the official Mx error codes, and a negative error code otherwise.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMUhjubeh}(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](h)}(hinth]hint}(hj&hhhNhNubah}(h]h ]hah"]h$]h&]uh1hhj"hhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM`ubh)}(h h]h }(hj5hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj"hhhj4hM`ubj)}(hi3c_master_defslvs_lockedh]j)}(hi3c_master_defslvs_lockedh]hi3c_master_defslvs_locked}(hjGhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjCubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj"hhhj4hM`ubj.)}(h&(struct i3c_master_controller *master)h]j4)}(h$struct i3c_master_controller *masterh](j:)}(hj=h]hstruct}(hjchhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj_ubh)}(h h]h }(hjphhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj_ubh)}(hhh]j)}(hi3c_master_controllerh]hi3c_master_controller}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetjmodnameN classnameNjvjy)}j|]j)}jrjIsbc.i3c_master_defslvs_lockedasbuh1hhj_ubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj_ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubj)}(hmasterh]hmaster}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj[ubah}(h]h ]h"]h$]h&]hhuh1j-hj"hhhj4hM`ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjhhhj4hM`ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhj4hM`hjhhubj)}(hhh]j)}(hsend a DEFSLVS CCC commandh]hsend a DEFSLVS CCC command}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM`hjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj4hM`ubeh}(h]h ](jpfunctioneh"]h$]h&]jjpjjjjjjjuh1hhhhhhNhNubj)}(hXO**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, a positive I3C error code if the error is one of the official Mx error codes, and a negative error code otherwise.h](j)}(h**Parameters**h]j)}(hjh]h Parameters}(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.chMdhjubj)}(hhh]j!)}(hO``struct i3c_master_controller *master`` master used to send frames on the bus h](j')}(h(``struct i3c_master_controller *master``h]j-)}(hj'h]h$struct i3c_master_controller *master}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj%ubah}(h]h ]h"]h$]h&]uh1j&hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMahj!ubjC)}(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<hMahj=ubah}(h]h ]h"]h$]h&]uh1jBhj!ubeh}(h]h ]h"]h$]h&]uh1j hj<hMahjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h**Description**h]j)}(hjbh]h Description}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMchjubj)}(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 }(hjxhhhNhNubj)}(h **master**h]hmaster}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxubh\. This is useful when you have secondary masters on the bus to propagate device information.}(hjxhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMbhjubj)}(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]j-)}(hjh]h%i3c_master_controller_ops->bus_init()}(hjhhhNhNubah}(h]h ](xrefjpc-typeeh"]h$]h&]uh1j,hjubah}(h]h ]h"]h$]h&]refdoc driver-api/i3c/master-driver-api refdomainjpreftypetype refexplicitrefwarnjvjy)}j|]sb reftargeti3c_master_controller_opsuh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMfhjubh~. 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&]uh1jhjhMfhjubj)}(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.chMlhjubj)}(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.chMnhjubj)}(h0 in case of success, a positive I3C error code if the error is one of the official Mx error codes, and a negative error code otherwise.h]h0 in case of success, a positive I3C error code if the error is one of the official Mx error codes, and a negative error code otherwise.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMohjubeh}(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](h)}(hinth]hint}(hj'hhhNhNubah}(h]h ]hah"]h$]h&]uh1hhj#hhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMubh)}(h h]h }(hj6hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj#hhhj5hMubj)}(hi3c_master_do_daa_exth]j)}(hi3c_master_do_daa_exth]hi3c_master_do_daa_ext}(hjHhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjDubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj#hhhj5hMubj.)}(h3(struct i3c_master_controller *master, bool rstdaa)h](j4)}(h$struct i3c_master_controller *masterh](j:)}(hj=h]hstruct}(hjdhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj`ubh)}(h h]h }(hjqhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj`ubh)}(hhh]j)}(hi3c_master_controllerh]hi3c_master_controller}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetjmodnameN classnameNjvjy)}j|]j)}jrjJsbc.i3c_master_do_daa_extasbuh1hhj`ubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj`ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj`ubj)}(hmasterh]hmaster}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj`ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj\ubj4)}(h bool rstdaah](h)}(hboolh]hbool}(hjhhhNhNubah}(h]h ]hah"]h$]h&]uh1hhjubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjubj)}(hrstdaah]hrstdaa}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj\ubeh}(h]h ]h"]h$]h&]hhuh1j-hj#hhhj5hMubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjhhhj5hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhj5hMhjhhubj)}(hhh]j)}(h-Dynamic Address Assignment (extended version)h]h-Dynamic Address Assignment (extended version)}(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&]uh1jhjhhhj5hMubeh}(h]h ](jpfunctioneh"]h$]h&]jjpjj4jj4jjjuh1hhhhhhNhNubj)}(hX**Parameters** ``struct i3c_master_controller *master`` controller ``bool rstdaa`` whether to first perform Reset of Dynamic Addresses (RSTDAA) **Description** Perform Dynamic Address Assignment with optional support for System Hibernation (**rstdaa** is true). After System Hibernation, Dynamic Addresses can have been reassigned at boot time to different values. A simple strategy is followed to handle that. Perform a Reset of Dynamic Addresses (RSTDAA) followed by the normal DAA procedure which has provision for reassigning addresses that differ from the previously recorded addresses. **Return** a 0 in case of success, an negative error code otherwise.h](j)}(h**Parameters**h]j)}(hj>h]h Parameters}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj8ubj)}(hhh](j!)}(h4``struct i3c_master_controller *master`` controller h](j')}(h(``struct i3c_master_controller *master``h]j-)}(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.chMhjWubjC)}(hhh]j)}(h controllerh]h controller}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjrhMhjsubah}(h]h ]h"]h$]h&]uh1jBhjWubeh}(h]h ]h"]h$]h&]uh1j hjrhMhjTubj!)}(hM``bool rstdaa`` whether to first perform Reset of Dynamic Addresses (RSTDAA) h](j')}(h``bool rstdaa``h]j-)}(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.chMhjubjC)}(hhh]j)}(hubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM!hj:ubj)}(hhh]j!)}(h>``struct i3c_master_controller *master`` master doing the DAA h](j')}(h(``struct i3c_master_controller *master``h]j-)}(hj_h]h$struct i3c_master_controller *master}(hjahhhNhNubah}(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.chMhjYubjC)}(hhh]j)}(hmaster doing the DAAh]hmaster doing the DAA}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjthMhjuubah}(h]h ]h"]h$]h&]uh1jBhjYubeh}(h]h ]h"]h$]h&]uh1j hjthMhjVubah}(h]h ]h"]h$]h&]uh1jhj: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.chM hj:ubj)}(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.chMhj: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.chM#hj:ubj)}(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.chM$hj:ubeh}(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](j:)}(hj=h]hstruct}(hjhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjhhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM-ubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjhhhjhM-ubh)}(hhh]j)}(hi3c_dmah]hi3c_dma}(hj%hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetj'modnameN classnameNjvjy)}j|]j)}jri3c_master_dma_map_singlesbc.i3c_master_dma_map_singleasbuh1hhjhhhjhM-ubh)}(h h]h }(hjFhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjhhhjhM-ubj)}(hjh]h*}(hjThhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM-ubj)}(hi3c_master_dma_map_singleh]j)}(hjCh]hi3c_master_dma_map_single}(hjehhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjaubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjhhhjhM-ubj.)}(h[(struct device *dev, void *buf, size_t len, bool force_bounce, enum dma_data_direction dir)h](j4)}(hstruct device *devh](j:)}(hj=h]hstruct}(hjhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj|ubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj|ubh)}(hhh]j)}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetjmodnameN classnameNjvjy)}j|]jAc.i3c_master_dma_map_singleasbuh1hhj|ubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj|ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj|ubj)}(hdevh]hdev}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj|ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hjxubj4)}(h void *bufh](h)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]hah"]h$]h&]uh1hhjubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbufh]hbuf}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hjxubj4)}(h size_t lenh](h)}(hhh]j)}(hsize_th]hsize_t}(hj5hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetj7modnameN classnameNjvjy)}j|]jAc.i3c_master_dma_map_singleasbuh1hhj.ubh)}(h h]h }(hjShhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj.ubj)}(hlenh]hlen}(hjahhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hjxubj4)}(hbool force_bounceh](h)}(hjh]hbool}(hjzhhhNhNubah}(h]h ]hah"]h$]h&]uh1hhjvubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjvubj)}(h force_bounceh]h force_bounce}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjvubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hjxubj4)}(henum dma_data_direction dirh](j:)}(henumh]henum}(hjhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjubh)}(hhh]j)}(hdma_data_directionh]hdma_data_direction}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetjmodnameN classnameNjvjy)}j|]jAc.i3c_master_dma_map_singleasbuh1hhjubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjubj)}(hdirh]hdir}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hjxubeh}(h]h ]h"]h$]h&]hhuh1j-hjhhhjhM-ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjhhhjhM-ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhM-hjhhubj)}(hhh]j)}(h"Map buffer for single DMA transferh]h"Map buffer for single DMA transfer}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM-hj hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM-ubeh}(h]h ](jpfunctioneh"]h$]h&]jjpjj;jj;jjjuh1hhhhhhNhNubj)}(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)}(hjEh]h Parameters}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjCubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM1hj?ubj)}(hhh](j!)}(h;``struct device *dev`` device object of a device doing DMA h](j')}(h``struct device *dev``h]j-)}(hjdh]hstruct device *dev}(hjfhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjbubah}(h]h ]h"]h$]h&]uh1j&hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM.hj^ubjC)}(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&]uh1jhjyhM.hjzubah}(h]h ]h"]h$]h&]uh1jBhj^ubeh}(h]h ]h"]h$]h&]uh1j hjyhM.hj[ubj!)}(h0``void *buf`` destination/source buffer for DMA h](j')}(h ``void *buf``h]j-)}(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.chM/hjubjC)}(hhh]j)}(h!destination/source buffer for DMAh]h!destination/source buffer for DMA}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhM/hjubah}(h]h ]h"]h$]h&]uh1jBhjubeh}(h]h ]h"]h$]h&]uh1j hjhM/hj[ubj!)}(h"``size_t len`` length of transfer h](j')}(h``size_t len``h]j-)}(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.chM0hjubjC)}(hhh]j)}(hlength of transferh]hlength of transfer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhM0hjubah}(h]h ]h"]h$]h&]uh1jBhjubeh}(h]h ]h"]h$]h&]uh1j hjhM0hj[ubj!)}(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]j-)}(hjh]hbool force_bounce}(hjhhhNhNubah}(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.chM2hj ubjC)}(hhh]j)}(h_true, force to use a bounce buffer, false, function will auto check is a bounce buffer requiredh]h_true, force to use a bounce buffer, false, function will auto check is a bounce buffer required}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM1hj%ubah}(h]h ]h"]h$]h&]uh1jBhj ubeh}(h]h ]h"]h$]h&]uh1j hj$hM2hj[ubj!)}(h.``enum dma_data_direction dir`` DMA direction h](j')}(h``enum dma_data_direction dir``h]j-)}(hjIh]henum dma_data_direction dir}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjGubah}(h]h ]h"]h$]h&]uh1j&hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM3hjCubjC)}(hhh]j)}(h DMA directionh]h DMA direction}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^hM3hj_ubah}(h]h ]h"]h$]h&]uh1jBhjCubeh}(h]h ]h"]h$]h&]uh1j hj^hM3hj[ubeh}(h]h ]h"]h$]h&]uh1jhj?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.chM5hj?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.chM4hj?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.chM6hj?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.chM7hj?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](h)}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]hah"]h$]h&]uh1hhjhhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMaubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjhhhjhMaubj)}(hi3c_master_dma_unmap_singleh]j)}(hi3c_master_dma_unmap_singleh]hi3c_master_dma_unmap_single}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjhhhjhMaubj.)}(h(struct i3c_dma *dma_xfer)h]j4)}(hstruct i3c_dma *dma_xferh](j:)}(hj=h]hstruct}(hj-hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj)ubh)}(h h]h }(hj:hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj)ubh)}(hhh]j)}(hi3c_dmah]hi3c_dma}(hjKhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjHubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetjMmodnameN classnameNjvjy)}j|]j)}jrjsbc.i3c_master_dma_unmap_singleasbuh1hhj)ubh)}(h h]h }(hjkhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj)ubj)}(hjh]h*}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj)}(hdma_xferh]hdma_xfer}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj%ubah}(h]h ]h"]h$]h&]hhuh1j-hjhhhjhMaubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjhhhjhMaubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhMahjhhubj)}(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.chMahjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMaubeh}(h]h ](jpfunctioneh"]h$]h&]jjpjjjjjjjuh1hhhhhhNhNubj)}(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.chMehjubj)}(hhh]j!)}(hA``struct i3c_dma *dma_xfer`` DMA transfer and mapping descriptor h](j')}(h``struct i3c_dma *dma_xfer``h]j-)}(hjh]hstruct i3c_dma *dma_xfer}(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.chMbhjubjC)}(hhh]j)}(h#DMA transfer and mapping descriptorh]h#DMA transfer and mapping descriptor}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMbhjubah}(h]h ]h"]h$]h&]uh1jBhjubeh}(h]h ]h"]h$]h&]uh1j hjhMbhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(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.chMdhjubj)}(h1Unmap buffer and cleanup DMA transfer descriptor.h]h1Unmap buffer and cleanup DMA transfer descriptor.}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMchjubeh}(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](h)}(hinth]hint}(hjqhhhNhNubah}(h]h ]hah"]h$]h&]uh1hhjmhhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMuubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjmhhhjhMuubj)}(hi3c_master_set_infoh]j)}(hi3c_master_set_infoh]hi3c_master_set_info}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjmhhhjhMuubj.)}(hJ(struct i3c_master_controller *master, const struct i3c_device_info *info)h](j4)}(h$struct i3c_master_controller *masterh](j:)}(hj=h]hstruct}(hjhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjubh)}(hhh]j)}(hi3c_master_controllerh]hi3c_master_controller}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetjmodnameN classnameNjvjy)}j|]j)}jrjsbc.i3c_master_set_infoasbuh1hhjubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hmasterh]hmaster}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hjubj4)}(h"const struct i3c_device_info *infoh](j:)}(hconsth]hconst}(hj hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjubh)}(h h]h }(hj.hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjubj:)}(hj=h]hstruct}(hj<hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjubh)}(h h]h }(hjIhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjubh)}(hhh]j)}(hi3c_device_infoh]hi3c_device_info}(hjZhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetj\modnameN classnameNjvjy)}j|]jc.i3c_master_set_infoasbuh1hhjubh)}(h h]h }(hjxhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hinfoh]hinfo}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hjubeh}(h]h ]h"]h$]h&]hhuh1j-hjmhhhjhMuubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjihhhjhMuubah}(h]jdah ](jjeh"]h$]h&]jj)jhuh1hhjhMuhjfhhubj)}(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.chMuhjhhubah}(h]h ]h"]h$]h&]uh1jhjfhhhjhMuubeh}(h]h ](jpfunctioneh"]h$]h&]jjpjjjjjjjuh1hhhhhhNhNubj)}(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)}(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.chMyhjubj)}(hhh](j!)}(hO``struct i3c_master_controller *master`` master used to send frames on the bus h](j')}(h(``struct i3c_master_controller *master``h]j-)}(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.chMvhjubjC)}(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&]uh1jhjhMvhjubah}(h]h ]h"]h$]h&]uh1jBhjubeh}(h]h ]h"]h$]h&]uh1j hjhMvhjubj!)}(h>``const struct i3c_device_info *info`` I3C device information h](j')}(h&``const struct i3c_device_info *info``h]j-)}(hj7h]h"const struct i3c_device_info *info}(hj9hhhNhNubah}(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.chMwhj1ubjC)}(hhh]j)}(hI3C device informationh]hI3C device information}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLhMwhjMubah}(h]h ]h"]h$]h&]uh1jBhj1ubeh}(h]h ]h"]h$]h&]uh1j hjLhMwhjubeh}(h]h ]h"]h$]h&]uh1jhjubj)}(h**Description**h]j)}(hjrh]h Description}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMyhjubj)}(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 }(hjhhhNhNubh)}(hM:c:type:`i3c_master_controller_ops->bus_init\(\) `h]j-)}(hjh]h%i3c_master_controller_ops->bus_init()}(hjhhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjji3c_master_controller_opsuh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMxhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjhMxhjubj)}(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 }(hjhhhNhNubh)}(h:c:type:`i3c_device_info`h]j-)}(hjh]hi3c_device_info}(hjhhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjji3c_device_infouh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM{hjubhd fields are meaningful for a master device. Here is a list of fields that should be properly filled:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjhM{hjubh bullet_list)}(hhh](h list_item)}(h5:c:type:`i3c_device_info->dyn_addr `h]j)}(hjh]h)}(hjh]j-)}(hjh]hi3c_device_info->dyn_addr}(hjhhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjji3c_device_infouh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM~hjubah}(h]h ]h"]h$]h&]uh1jhjhM~hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h0:c:type:`i3c_device_info->bcr `h]j)}(hj'h]h)}(hj'h]j-)}(hj'h]hi3c_device_info->bcr}(hj/hhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hj,ubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjji3c_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&]uh1jhjJhMhj%ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h0:c:type:`i3c_device_info->dcr `h]j)}(hjYh]h)}(hjYh]j-)}(hjYh]hi3c_device_info->dcr}(hjahhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hj^ubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjji3c_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|hMhjWubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h0:c:type:`i3c_device_info->pid `h]j)}(hjh]h)}(hjh]j-)}(hjh]hi3c_device_info->pid}(hjhhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjji3c_device_infouh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(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]j-)}(hjh]hi3c_device_info->hdr_cap}(hjhhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjji3c_device_infouh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubh if }(hjhhhNhNubj-)}(h``I3C_BCR_HDR_CAP``h]hI3C_BCR_HDR_CAP}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjubh bit is set in }(hjhhhNhNubh)}(h0:c:type:`i3c_device_info->bcr `h]j-)}(hjh]hi3c_device_info->bcr}(hjhhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjji3c_device_infouh1hhjhMhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]bullet-uh1jhjhM~hjubj)}(hHThis function must be called with the bus lock held in maintenance mode.h]hHThis function must be called with the bus lock held in maintenance mode.}(hj, hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubj)}(h **Return**h]j)}(hj= h]hReturn}(hj? hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj; ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubj)}(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 }(hjS hhhNhNubj)}(h**info**h]hinfo}(hj[ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjS ubhj contains valid information (not every piece of information can be checked, but we can at least make sure }(hjS hhhNhNubj)}(h**info->dyn_addr**h]hinfo->dyn_addr}(hjm hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjS ubh and }(hjS hhhNhNubj)}(h **info->bcr**h]h info->bcr}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjS ubh! are correct), -EINVAL otherwise.}(hjS hhhNhNubeh}(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_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](h)}(hinth]hint}(hj hhhNhNubah}(h]h ]hah"]h$]h&]uh1hhj hhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMubh)}(h h]h }(hj hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj hhhj hMubj)}(hi3c_master_bus_inith]j)}(hi3c_master_bus_inith]hi3c_master_bus_init}(hj hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj hhhj hMubj.)}(h&(struct i3c_master_controller *master)h]j4)}(h$struct i3c_master_controller *masterh](j:)}(hj=h]hstruct}(hj hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj ubh)}(h h]h }(hj!hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj ubh)}(hhh]j)}(hi3c_master_controllerh]hi3c_master_controller}(hj!hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetj!modnameN classnameNjvjy)}j|]j)}jrj sbc.i3c_master_bus_initasbuh1hhj ubh)}(h h]h }(hj3!hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj ubj)}(hjh]h*}(hjA!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hmasterh]hmaster}(hjN!hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj ubah}(h]h ]h"]h$]h&]hhuh1j-hj 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}(hjx!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhju!hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hMubeh}(h]h ](jpfunctioneh"]h$]h&]jjpjj!jj!jjjuh1hhhhhhNhNubj)}(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!ubj)}(hhh]j!)}(hJ``struct i3c_master_controller *master`` main master initializing the bus h](j')}(h(``struct i3c_master_controller *master``h]j-)}(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!ubjC)}(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&]uh1jBhj!ubeh}(h]h ]h"]h$]h&]uh1j hj!hMhj!ubah}(h]h ]h"]h$]h&]uh1jhj!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)}(hWThis function is following all initialisation steps described in the I3C specification:h]hWThis function is following all initialisation steps described in the I3C specification:}(hj "hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj!ubhenumerated_list)}(hhh](j)}(hbAttach I2C devs to the master so that the master can fill its internal device table appropriately h]j)}(haAttach I2C devs to the master so that the master can fill its internal device table appropriatelyh]haAttach I2C devs to the master so that the master can fill its internal device table appropriately}(hj""hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj"ubah}(h]h ]h"]h$]h&]uh1jhj"ubj)}(hCall :c:type:`i3c_master_controller_ops->bus_init\(\) ` method to initialize the master controller. That's usually where the bus mode is selected (pure bus or mixed fast/slow bus) h]j)}(hCall :c:type:`i3c_master_controller_ops->bus_init\(\) ` method to initialize the master controller. That's usually where the bus mode is selected (pure bus or mixed fast/slow bus)h](hCall }(hj;"hhhNhNubh)}(hM:c:type:`i3c_master_controller_ops->bus_init\(\) `h]j-)}(hjE"h]h%i3c_master_controller_ops->bus_init()}(hjG"hhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjC"ubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjji3c_master_controller_opsuh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj;"ubh~ method to initialize the master controller. That’s usually where the bus mode is selected (pure bus or mixed fast/slow bus)}(hj;"hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjb"hMhj7"ubah}(h]h ]h"]h$]h&]uh1jhj"ubj)}(hInstruct all devices on the bus to drop their dynamic address. This is particularly important when the bus was previously configured by someone else (for example the bootloader) h]j)}(hInstruct all devices on the bus to drop their dynamic address. This is particularly important when the bus was previously configured by someone else (for example the bootloader)h]hInstruct all devices on the bus to drop their dynamic address. This is particularly important when the bus was previously configured by someone else (for example the bootloader)}(hjw"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjs"ubah}(h]h ]h"]h$]h&]uh1jhj"ubj)}(hDisable all slave events. h]j)}(hDisable all slave events.h]hDisable all slave events.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj"ubah}(h]h ]h"]h$]h&]uh1jhj"ubj)}(hReserve address slots for I3C devices with init_dyn_addr. And if devices also have static_addr, try to pre-assign dynamic addresses requested by the FW with SETDASA and attach corresponding statically defined I3C devices to the master. h]j)}(hReserve address slots for I3C devices with init_dyn_addr. And if devices also have static_addr, try to pre-assign dynamic addresses requested by the FW with SETDASA and attach corresponding statically defined I3C devices to the master.h]hReserve address slots for I3C devices with init_dyn_addr. And if devices also have static_addr, try to pre-assign dynamic addresses requested by the FW with SETDASA and attach corresponding statically defined I3C devices to the master.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj"ubah}(h]h ]h"]h$]h&]uh1jhj"ubj)}(h_Do a DAA (Dynamic Address Assignment) to assign dynamic addresses to all remaining I3C devices h]j)}(h^Do a DAA (Dynamic Address Assignment) to assign dynamic addresses to all remaining I3C devicesh]h^Do a DAA (Dynamic Address Assignment) to assign dynamic addresses to all remaining I3C devices}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj"ubah}(h]h ]h"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]enumtypearabicprefixhsuffix.uh1j"hj!ubj)}(h'hM hj?'ubah}(h]h ]h"]h$]h&]uh1jBhj#'ubeh}(h]h ]h"]h$]h&]uh1j hj>'hM hj&ubeh}(h]h ]h"]h$]h&]uh1jhj&ubj)}(h**Description**h]j)}(hjd'h]h Description}(hjf'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjb'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)}(hvQueue an IBI to the controller workqueue. The IBI handler attached to the dev will be called from a workqueue context.h]hvQueue an IBI to the controller workqueue. The IBI handler attached to the dev will be called from a workqueue context.}(hjz'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_generic_ibi_free_pool (C function)c.i3c_generic_ibi_free_poolhNtauh1hhhhhhNhNubh)}(hhh](h)}(hBvoid i3c_generic_ibi_free_pool (struct i3c_generic_ibi_pool *pool)h]h)}(hAvoid i3c_generic_ibi_free_pool(struct i3c_generic_ibi_pool *pool)h](h)}(hvoidh]hvoid}(hj'hhhNhNubah}(h]h ]hah"]h$]h&]uh1hhj'hhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM ubh)}(h h]h }(hj'hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj'hhhj'hM ubj)}(hi3c_generic_ibi_free_poolh]j)}(hi3c_generic_ibi_free_poolh]hi3c_generic_ibi_free_pool}(hj'hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj'ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj'hhhj'hM ubj.)}(h#(struct i3c_generic_ibi_pool *pool)h]j4)}(h!struct i3c_generic_ibi_pool *poolh](j:)}(hj=h]hstruct}(hj'hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj'ubh)}(h h]h }(hj'hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj'ubh)}(hhh]j)}(hi3c_generic_ibi_poolh]hi3c_generic_ibi_pool}(hj(hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetj(modnameN classnameNjvjy)}j|]j)}jrj'sbc.i3c_generic_ibi_free_poolasbuh1hhj'ubh)}(h h]h }(hj$(hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj'ubj)}(hjh]h*}(hj2(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubj)}(hpoolh]hpool}(hj?(hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj'ubah}(h]h ]h"]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)}(hFree a generic IBI poolh]hFree a generic IBI pool}(hji(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjf(hhubah}(h]h ]h"]h$]h&]uh1jhj'hhhj'hM ubeh}(h]h ](jpfunctioneh"]h$]h&]jjpjj(jj(jjjuh1hhhhhhNhNubj)}(h**Parameters** ``struct i3c_generic_ibi_pool *pool`` the IBI pool to free **Description** Free all IBI slots allated by a generic IBI pool.h](j)}(h**Parameters**h]j)}(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(ubj)}(hhh]j!)}(h;``struct i3c_generic_ibi_pool *pool`` the IBI pool to free h](j')}(h%``struct i3c_generic_ibi_pool *pool``h]j-)}(hj(h]h!struct i3c_generic_ibi_pool *pool}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj(ubah}(h]h ]h"]h$]h&]uh1j&hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj(ubjC)}(hhh]j)}(hthe IBI pool to freeh]hthe IBI pool to free}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(hM hj(ubah}(h]h ]h"]h$]h&]uh1jBhj(ubeh}(h]h ]h"]h$]h&]uh1j hj(hM hj(ubah}(h]h ]h"]h$]h&]uh1jhj(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)}(h1Free all IBI slots allated by a generic IBI pool.h]h1Free all IBI slots allated by a generic IBI pool.}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj(ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h֌'i3c_generic_ibi_alloc_pool (C function)c.i3c_generic_ibi_alloc_poolhNtauh1hhhhhhNhNubh)}(hhh](h)}(htstruct i3c_generic_ibi_pool * i3c_generic_ibi_alloc_pool (struct i3c_dev_desc *dev, const struct i3c_ibi_setup *req)h]h)}(hrstruct i3c_generic_ibi_pool *i3c_generic_ibi_alloc_pool(struct i3c_dev_desc *dev, const struct i3c_ibi_setup *req)h](j:)}(hj=h]hstruct}(hj*)hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj&)hhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM ubh)}(h h]h }(hj8)hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj&)hhhj7)hM ubh)}(hhh]j)}(hi3c_generic_ibi_poolh]hi3c_generic_ibi_pool}(hjI)hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjF)ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetjK)modnameN classnameNjvjy)}j|]j)}jri3c_generic_ibi_alloc_poolsbc.i3c_generic_ibi_alloc_poolasbuh1hhj&)hhhj7)hM ubh)}(h h]h }(hjj)hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj&)hhhj7)hM ubj)}(hjh]h*}(hjx)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&)hhhj7)hM ubj)}(hi3c_generic_ibi_alloc_poolh]j)}(hjg)h]hi3c_generic_ibi_alloc_pool}(hj)hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj)ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj&)hhhj7)hM ubj.)}(h;(struct i3c_dev_desc *dev, const struct i3c_ibi_setup *req)h](j4)}(hstruct i3c_dev_desc *devh](j:)}(hj=h]hstruct}(hj)hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj)ubh)}(h h]h }(hj)hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj)ubh)}(hhh]j)}(h i3c_dev_desch]h i3c_dev_desc}(hj)hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetj)modnameN classnameNjvjy)}j|]je)c.i3c_generic_ibi_alloc_poolasbuh1hhj)ubh)}(h h]h }(hj)hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj)ubj)}(hjh]h*}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj)}(hdevh]hdev}(hj)hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj)ubj4)}(hconst struct i3c_ibi_setup *reqh](j:)}(hj"h]hconst}(hj*hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj*ubh)}(h h]h }(hj!*hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj*ubj:)}(hj=h]hstruct}(hj/*hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj*ubh)}(h h]h }(hj<*hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj*ubh)}(hhh]j)}(h i3c_ibi_setuph]h i3c_ibi_setup}(hjM*hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjJ*ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetjO*modnameN classnameNjvjy)}j|]je)c.i3c_generic_ibi_alloc_poolasbuh1hhj*ubh)}(h h]h }(hjk*hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj*ubj)}(hjh]h*}(hjy*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubj)}(hreqh]hreq}(hj*hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj)ubeh}(h]h ]h"]h$]h&]hhuh1j-hj&)hhhj7)hM ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj")hhhj7)hM ubah}(h]j)ah ](jjeh"]h$]h&]jj)jhuh1hhj7)hM hj)hhubj)}(hhh]j)}(hCreate a generic IBI poolh]hCreate a generic IBI pool}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj*hhubah}(h]h ]h"]h$]h&]uh1jhj)hhhj7)hM ubeh}(h]h ](jpfunctioneh"]h$]h&]jjpjj*jj*jjjuh1hhhhhhNhNubj)}(hX[**Parameters** ``struct i3c_dev_desc *dev`` the device this pool will be used for ``const struct i3c_ibi_setup *req`` IBI setup request describing what the device driver expects **Description** Create a generic IBI pool based on the information provided in **req**. **Return** a valid IBI pool in case of success, an ERR_PTR() otherwise.h](j)}(h**Parameters**h]j)}(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*ubj)}(hhh](j!)}(hC``struct i3c_dev_desc *dev`` the device this pool will be used for h](j')}(h``struct i3c_dev_desc *dev``h]j-)}(hj*h]hstruct i3c_dev_desc *dev}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj*ubah}(h]h ]h"]h$]h&]uh1j&hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj*ubjC)}(hhh]j)}(h%the device this pool will be used forh]h%the device this pool will be used for}(hj +hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+hM hj+ubah}(h]h ]h"]h$]h&]uh1jBhj*ubeh}(h]h ]h"]h$]h&]uh1j hj+hM hj*ubj!)}(h```const struct i3c_ibi_setup *req`` IBI setup request describing what the device driver expects h](j')}(h#``const struct i3c_ibi_setup *req``h]j-)}(hj*+h]hconst struct i3c_ibi_setup *req}(hj,+hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj(+ubah}(h]h ]h"]h$]h&]uh1j&hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj$+ubjC)}(hhh]j)}(h;IBI setup request describing what the device driver expectsh]h;IBI setup request describing what the device driver expects}(hjC+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?+hM hj@+ubah}(h]h ]h"]h$]h&]uh1jBhj$+ubeh}(h]h ]h"]h$]h&]uh1j hj?+hM hj*ubeh}(h]h ]h"]h$]h&]uh1jhj*ubj)}(h**Description**h]j)}(hje+h]h Description}(hjg+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjc+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)}(hGCreate a generic IBI pool based on the information provided in **req**.h](h?Create a generic IBI pool based on the information provided in }(hj{+hhhNhNubj)}(h**req**h]hreq}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj{+ubh.}(hj{+hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj*ubj)}(h **Return**h]j)}(hj+h]hReturn}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj*ubj)}(h,ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj+hhhj+hMN ubj.)}(h#(struct i3c_generic_ibi_pool *pool)h]j4)}(h!struct i3c_generic_ibi_pool *poolh](j:)}(hj=h]hstruct}(hj],hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjY,ubh)}(h h]h }(hjj,hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjY,ubh)}(hhh]j)}(hi3c_generic_ibi_poolh]hi3c_generic_ibi_pool}(hj{,hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjx,ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetj},modnameN classnameNjvjy)}j|]j,c.i3c_generic_ibi_get_free_slotasbuh1hhjY,ubh)}(h h]h }(hj,hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjY,ubj)}(hjh]h*}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjY,ubj)}(hpoolh]hpool}(hj,hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjY,ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hjU,ubah}(h]h ]h"]h$]h&]hhuh1j-hj+hhhj+hMN ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj+hhhj+hMN ubah}(h]j+ah ](jjeh"]h$]h&]jj)jhuh1hhj+hMN hj+hhubj)}(hhh]j)}(h'Get a free slot from a generic IBI poolh]h'Get a free slot from a generic IBI pool}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMN hj,hhubah}(h]h ]h"]h$]h&]uh1jhj+hhhj+hMN ubeh}(h]h ](jpfunctioneh"]h$]h&]jjpjj,jj,jjjuh1hhhhhhNhNubj)}(hXS**Parameters** ``struct i3c_generic_ibi_pool *pool`` the pool to query an IBI slot on **Description** Search for a free slot in a generic IBI pool. The slot should be returned to the pool using i3c_generic_ibi_recycle_slot() when it's no longer needed. **Return** a pointer to a free slot, or NULL if there's no free slot 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.chMR hj,ubj)}(hhh]j!)}(hG``struct i3c_generic_ibi_pool *pool`` the pool to query an IBI slot on h](j')}(h%``struct i3c_generic_ibi_pool *pool``h]j-)}(hj-h]h!struct i3c_generic_ibi_pool *pool}(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.chMO hj-ubjC)}(hhh]j)}(h the pool to query an IBI slot onh]h the pool to query an IBI slot on}(hj8-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4-hMO hj5-ubah}(h]h ]h"]h$]h&]uh1jBhj-ubeh}(h]h ]h"]h$]h&]uh1j hj4-hMO hj-ubah}(h]h ]h"]h$]h&]uh1jhj,ubj)}(h**Description**h]j)}(hjZ-h]h Description}(hj\-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjX-ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMQ hj,ubj)}(hSearch for a free slot in a generic IBI pool. The slot should be returned to the pool using i3c_generic_ibi_recycle_slot() when it's no longer needed.h]hSearch for a free slot in a generic IBI pool. The slot should be returned to the pool using i3c_generic_ibi_recycle_slot() when it’s no longer needed.}(hjp-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMP hj,ubj)}(h **Return**h]j)}(hj-h]hReturn}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMT hj,ubj)}(hDa pointer to a free slot, or NULL if there's no free slot available.h]hFa pointer to a free slot, or NULL if there’s no free slot available.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMU hj,ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h֌)i3c_generic_ibi_recycle_slot (C function)c.i3c_generic_ibi_recycle_slothNtauh1hhhhhhNhNubh)}(hhh](h)}(h]void i3c_generic_ibi_recycle_slot (struct i3c_generic_ibi_pool *pool, struct i3c_ibi_slot *s)h]h)}(h\void i3c_generic_ibi_recycle_slot(struct i3c_generic_ibi_pool *pool, struct i3c_ibi_slot *s)h](h)}(hvoidh]hvoid}(hj-hhhNhNubah}(h]h ]hah"]h$]h&]uh1hhj-hhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMi ubh)}(h h]h }(hj-hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj-hhhj-hMi ubj)}(hi3c_generic_ibi_recycle_sloth]j)}(hi3c_generic_ibi_recycle_sloth]hi3c_generic_ibi_recycle_slot}(hj-hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj-ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj-hhhj-hMi ubj.)}(h;(struct i3c_generic_ibi_pool *pool, struct i3c_ibi_slot *s)h](j4)}(h!struct i3c_generic_ibi_pool *poolh](j:)}(hj=h]hstruct}(hj.hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj-ubh)}(h h]h }(hj.hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj-ubh)}(hhh]j)}(hi3c_generic_ibi_poolh]hi3c_generic_ibi_pool}(hj!.hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetj#.modnameN classnameNjvjy)}j|]j)}jrj-sbc.i3c_generic_ibi_recycle_slotasbuh1hhj-ubh)}(h h]h }(hjA.hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj-ubj)}(hjh]h*}(hjO.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubj)}(hpoolh]hpool}(hj\.hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj-ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj-ubj4)}(hstruct i3c_ibi_slot *sh](j:)}(hj=h]hstruct}(hju.hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjq.ubh)}(h h]h }(hj.hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjq.ubh)}(hhh]j)}(h i3c_ibi_sloth]h i3c_ibi_slot}(hj.hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetj.modnameN classnameNjvjy)}j|]j=.c.i3c_generic_ibi_recycle_slotasbuh1hhjq.ubh)}(h h]h }(hj.hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjq.ubj)}(hjh]h*}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjq.ubj)}(hsh]hs}(hj.hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjq.ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj-ubeh}(h]h ]h"]h$]h&]hhuh1j-hj-hhhj-hMi ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj-hhhj-hMi ubah}(h]j-ah ](jjeh"]h$]h&]jj)jhuh1hhj-hMi hj-hhubj)}(hhh]j)}(h#Return a slot to a generic IBI poolh]h#Return a slot to a generic IBI pool}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMi hj.hhubah}(h]h ]h"]h$]h&]uh1jhj-hhhj-hMi ubeh}(h]h ](jpfunctioneh"]h$]h&]jjpjj/jj/jjjuh1hhhhhhNhNubj)}(hX(**Parameters** ``struct i3c_generic_ibi_pool *pool`` the pool to return the IBI slot to ``struct i3c_ibi_slot *s`` IBI slot to recycle **Description** Add an IBI slot back to its generic IBI pool. Should be called from the master driver struct_master_controller_ops->recycle_ibi() method.h](j)}(h**Parameters**h]j)}(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.chMm hj/ubj)}(hhh](j!)}(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]j-)}(hj7/h]h!struct i3c_generic_ibi_pool *pool}(hj9/hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj5/ubah}(h]h ]h"]h$]h&]uh1j&hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMj hj1/ubjC)}(hhh]j)}(h"the pool to return the IBI slot toh]h"the pool to return the IBI slot to}(hjP/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjL/hMj hjM/ubah}(h]h ]h"]h$]h&]uh1jBhj1/ubeh}(h]h ]h"]h$]h&]uh1j hjL/hMj hj./ubj!)}(h/``struct i3c_ibi_slot *s`` IBI slot to recycle h](j')}(h``struct i3c_ibi_slot *s``h]j-)}(hjp/h]hstruct i3c_ibi_slot *s}(hjr/hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjn/ubah}(h]h ]h"]h$]h&]uh1j&hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMk hjj/ubjC)}(hhh]j)}(hIBI slot to recycleh]hIBI slot to recycle}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/hMk hj/ubah}(h]h ]h"]h$]h&]uh1jBhjj/ubeh}(h]h ]h"]h$]h&]uh1j hj/hMk hj./ubeh}(h]h ]h"]h$]h&]uh1jhj/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.chMm hj/ubj)}(hAdd an IBI slot back to its generic IBI pool. Should be called from the master driver struct_master_controller_ops->recycle_ibi() method.h]hAdd an IBI slot back to its generic IBI pool. Should be called from the master driver struct_master_controller_ops->recycle_ibi() method.}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMl hj/ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h֌ i3c_master_register (C function)c.i3c_master_registerhNtauh1hhhhhhNhNubh)}(hhh](h)}(hint i3c_master_register (struct i3c_master_controller *master, struct device *parent, const struct i3c_master_controller_ops *ops, bool secondary)h]h)}(hint i3c_master_register(struct i3c_master_controller *master, struct device *parent, const struct i3c_master_controller_ops *ops, bool secondary)h](h)}(hinth]hint}(hj/hhhNhNubah}(h]h ]hah"]h$]h&]uh1hhj/hhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM ubh)}(h h]h }(hj/hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj/hhhj/hM ubj)}(hi3c_master_registerh]j)}(hi3c_master_registerh]hi3c_master_register}(hj0hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj 0ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj/hhhj/hM ubj.)}(hz(struct i3c_master_controller *master, struct device *parent, const struct i3c_master_controller_ops *ops, bool secondary)h](j4)}(h$struct i3c_master_controller *masterh](j:)}(hj=h]hstruct}(hj-0hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj)0ubh)}(h h]h }(hj:0hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj)0ubh)}(hhh]j)}(hi3c_master_controllerh]hi3c_master_controller}(hjK0hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjH0ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetjM0modnameN classnameNjvjy)}j|]j)}jrj0sbc.i3c_master_registerasbuh1hhj)0ubh)}(h h]h }(hjk0hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj)0ubj)}(hjh]h*}(hjy0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)0ubj)}(hmasterh]hmaster}(hj0hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj)0ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj%0ubj4)}(hstruct device *parenth](j:)}(hj=h]hstruct}(hj0hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj0ubh)}(h h]h }(hj0hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj0ubh)}(hhh]j)}(hdeviceh]hdevice}(hj0hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetj0modnameN classnameNjvjy)}j|]jg0c.i3c_master_registerasbuh1hhj0ubh)}(h h]h }(hj0hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj0ubj)}(hjh]h*}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj0ubj)}(hparenth]hparent}(hj0hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj0ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj%0ubj4)}(h+const struct i3c_master_controller_ops *opsh](j:)}(hj"h]hconst}(hj1hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj 1ubh)}(h h]h }(hj1hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj 1ubj:)}(hj=h]hstruct}(hj*1hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj 1ubh)}(h h]h }(hj71hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj 1ubh)}(hhh]j)}(hi3c_master_controller_opsh]hi3c_master_controller_ops}(hjH1hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjE1ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetjJ1modnameN classnameNjvjy)}j|]jg0c.i3c_master_registerasbuh1hhj 1ubh)}(h h]h }(hjf1hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj 1ubj)}(hjh]h*}(hjt1hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj 1ubj)}(hopsh]hops}(hj1hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj 1ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj%0ubj4)}(hbool secondaryh](h)}(hjh]hbool}(hj1hhhNhNubah}(h]h ]hah"]h$]h&]uh1hhj1ubh)}(h h]h }(hj1hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj1ubj)}(h secondaryh]h secondary}(hj1hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj%0ubeh}(h]h ]h"]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)}(hregister an I3C masterh]hregister an I3C master}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj1hhubah}(h]h ]h"]h$]h&]uh1jhj/hhhj/hM ubeh}(h]h ](jpfunctioneh"]h$]h&]jjpjj1jj1jjjuh1hhhhhhNhNubj)}(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)}(hj2h]h Parameters}(hj2hhhNhNubah}(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 hj1ubj)}(hhh](j!)}(hO``struct i3c_master_controller *master`` master used to send frames on the bus h](j')}(h(``struct i3c_master_controller *master``h]j-)}(hj 2h]h$struct i3c_master_controller *master}(hj"2hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj2ubah}(h]h ]h"]h$]h&]uh1j&hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj2ubjC)}(hhh]j)}(h%master used to send frames on the bush]h%master used to send frames on the bus}(hj92hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj52hM hj62ubah}(h]h ]h"]h$]h&]uh1jBhj2ubeh}(h]h ]h"]h$]h&]uh1j hj52hM hj2ubj!)}(h_``struct device *parent`` the parent device (the one that provides this I3C master controller) h](j')}(h``struct device *parent``h]j-)}(hjY2h]hstruct device *parent}(hj[2hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjW2ubah}(h]h ]h"]h$]h&]uh1j&hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjS2ubjC)}(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)}(hjr2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjo2ubah}(h]h ]h"]h$]h&]uh1jBhjS2ubeh}(h]h ]h"]h$]h&]uh1j hjn2hM hj2ubj!)}(hQ``const struct i3c_master_controller_ops *ops`` the master controller operations h](j')}(h/``const struct i3c_master_controller_ops *ops``h]j-)}(hj2h]h+const struct i3c_master_controller_ops *ops}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj2ubah}(h]h ]h"]h$]h&]uh1j&hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj2ubjC)}(hhh]j)}(h the master controller operationsh]h the master controller operations}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2hM hj2ubah}(h]h ]h"]h$]h&]uh1jBhj2ubeh}(h]h ]h"]h$]h&]uh1j hj2hM hj2ubj!)}(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]j-)}(hj2h]hbool secondary}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj2ubah}(h]h ]h"]h$]h&]uh1j&hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj2ubjC)}(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}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj2ubah}(h]h ]h"]h$]h&]uh1jBhj2ubeh}(h]h ]h"]h$]h&]uh1j hj2hM hj2ubeh}(h]h ]h"]h$]h&]uh1jhj1ubj)}(h**Description**h]j)}(hj3h]h Description}(hj 3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj1ubj)}(h/This function takes care of everything for you:h]h/This function takes care of everything for you:}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj1ubj)}(hhh](j)}(h#creates and initializes the I3C bush]j)}(hj23h]h#creates and initializes the I3C bus}(hj43hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj03ubah}(h]h ]h"]h$]h&]uh1jhj-3ubj)}(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 }(hjL3hhhNhNubj)}(h**parent->of_node**h]hparent->of_node}(hjT3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjL3ubh is not NULL}(hjL3hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjH3ubah}(h]h ]h"]h$]h&]uh1jhj-3ubj)}(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}(hjw3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjs3ubah}(h]h ]h"]h$]h&]uh1jhj-3ubj)}(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}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj3ubah}(h]h ]h"]h$]h&]uh1jhj-3ubeh}(h]h ]h"]h$]h&]j* j+ uh1jhjA3hM hj1ubj)}(h **Return**h]j)}(hj3h]hReturn}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj1ubj)}(h60 in case of success, a negative error code otherwise.h]h60 in case of success, a negative error code otherwise.}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj1ubeh}(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](h)}(hvoidh]hvoid}(hj3hhhNhNubah}(h]h ]hah"]h$]h&]uh1hhj3hhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM* ubh)}(h h]h }(hj4hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj3hhhj4hM* ubj)}(hi3c_master_unregisterh]j)}(hi3c_master_unregisterh]hi3c_master_unregister}(hj4hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj4ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj3hhhj4hM* ubj.)}(h&(struct i3c_master_controller *master)h]j4)}(h$struct i3c_master_controller *masterh](j:)}(hj=h]hstruct}(hj/4hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj+4ubh)}(h h]h }(hj<4hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj+4ubh)}(hhh]j)}(hi3c_master_controllerh]hi3c_master_controller}(hjM4hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjJ4ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetjO4modnameN classnameNjvjy)}j|]j)}jrj4sbc.i3c_master_unregisterasbuh1hhj+4ubh)}(h h]h }(hjm4hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj+4ubj)}(hjh]h*}(hj{4hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj+4ubj)}(hmasterh]hmaster}(hj4hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj+4ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj'4ubah}(h]h ]h"]h$]h&]hhuh1j-hj3hhhj4hM* ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj3hhhj4hM* ubah}(h]j3ah ](jjeh"]h$]h&]jj)jhuh1hhj4hM* hj3hhubj)}(hhh]j)}(hunregister an I3C masterh]hunregister 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&]uh1jhj3hhhj4hM* ubeh}(h]h ](jpfunctioneh"]h$]h&]jjpjj4jj4jjjuh1hhhhhhNhNubj)}(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)}(hj4h]h Parameters}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM. hj4ubj)}(hhh]j!)}(hO``struct i3c_master_controller *master`` master used to send frames on the bus h](j')}(h(``struct i3c_master_controller *master``h]j-)}(hj4h]h$struct i3c_master_controller *master}(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+ hj4ubjC)}(hhh]j)}(h%master used to send frames on the bush]h%master used to send frames on the bus}(hj 5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5hM+ hj 5ubah}(h]h ]h"]h$]h&]uh1jBhj4ubeh}(h]h ]h"]h$]h&]uh1j hj5hM+ hj4ubah}(h]h ]h"]h$]h&]uh1jhj4ubj)}(h**Description**h]j)}(hj.5h]h Description}(hj05hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,5ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM- hj4ubj)}(h8Basically undo everything done in i3c_master_register().h]h8Basically undo everything done in i3c_master_register().}(hjD5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM, hj4ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h֌i3c_i2c_dev_desc (C struct)c.i3c_i2c_dev_deschNtauh1hhhhhhNhNubh)}(hhh](h)}(hi3c_i2c_dev_desch]h)}(hstruct i3c_i2c_dev_desch](j:)}(hj=h]hstruct}(hjs5hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjo5hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKubh)}(h h]h }(hj5hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjo5hhhj5hKubj)}(hi3c_i2c_dev_desch]j)}(hjm5h]hi3c_i2c_dev_desc}(hj5hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj5ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjo5hhhj5hKubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjk5hhhj5hKubah}(h]jf5ah ](jjeh"]h$]h&]jj)jhuh1hhj5hKhjh5hhubj)}(hhh]j)}(h,Common part of the I3C/I2C device descriptorh]h,Common part of the I3C/I2C device descriptor}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK'hj5hhubah}(h]h ]h"]h$]h&]uh1jhjh5hhhj5hKubeh}(h]h ](jpstructeh"]h$]h&]jjpjj5jj5jjjuh1hhhhhhNhNubj)}(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}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubh:}(hj5hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK+hj5ubh 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; };}hj5sbah}(h]h ]h"]h$]h&]hhuh1j5hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK-hj5ubj)}(h **Members**h]j)}(hj6h]hMembers}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK3hj5ubj)}(hhh](j!)}(hN``node`` node element used to insert the slot into the I2C or I3C device list h](j')}(h``node``h]j-)}(hj$6h]hnode}(hj&6hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj"6ubah}(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*hj6ubjC)}(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=6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK)hj:6ubah}(h]h ]h"]h$]h&]uh1jBhj6ubeh}(h]h ]h"]h$]h&]uh1j hj96hK*hj6ubj!)}(hZ``master`` I3C master that instantiated this device. Will be used to do I2C/I3C transfers h](j')}(h ``master``h]j-)}(hj^6h]hmaster}(hj`6hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj\6ubah}(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,hjX6ubjC)}(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}(hjw6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK+hjt6ubah}(h]h ]h"]h$]h&]uh1jBhjX6ubeh}(h]h ]h"]h$]h&]uh1j hjs6hK,hj6ubj!)}(hj``master_priv`` master private data assigned to the device. Can be used to add master specific informationh](j')}(h``master_priv``h]j-)}(hj6h]h master_priv}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj6ubah}(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-hj6ubjC)}(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}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6hK-hj6ubah}(h]h ]h"]h$]h&]uh1jBhj6ubeh}(h]h ]h"]h$]h&]uh1j hj6hK-hj6ubeh}(h]h ]h"]h$]h&]uh1jhj5ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hj6h]h Description}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK1hhhhubj)}(hhjW7hhubah}(h]h ]h"]h$]h&]uh1jhj 7hhhj%7hK3ubeh}(h]h ](jpstructeh"]h$]h&]jjpjjr7jjr7jjjuh1hhhhhhNhNubj)}(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}(hj~7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjz7ubh:}(hjz7hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKBhjv7ubj5)}(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; };}hj7sbah}(h]h ]h"]h$]h&]hhuh1j5hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKDhjv7ubj)}(h **Members**h]j)}(hj7h]hMembers}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKJhjv7ubj)}(hhh](j!)}(hG``node`` used to insert the boardinfo object in the I2C boardinfo list h](j')}(h``node``h]j-)}(hj7h]hnode}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj7ubah}(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@hj7ubjC)}(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}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7hK@hj7ubah}(h]h ]h"]h$]h&]uh1jBhj7ubeh}(h]h ]h"]h$]h&]uh1j hj7hK@hj7ubj!)}(h'``base`` regular I2C board information h](j')}(h``base``h]j-)}(hj8h]hbase}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj7ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKAhj7ubjC)}(hhh]j)}(hregular I2C board informationh]hregular I2C board information}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8hKAhj8ubah}(h]h ]h"]h$]h&]uh1jBhj7ubeh}(h]h ]h"]h$]h&]uh1j hj8hKAhj7ubj!)}(he``lvr`` LVR (Legacy Virtual Register) needed by the I3C core to know about the I2C device limitationsh](j')}(h``lvr``h]j-)}(hj98h]hlvr}(hj;8hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj78ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKBhj38ubjC)}(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}(hjR8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjN8hKBhjO8ubah}(h]h ]h"]h$]h&]uh1jBhj38ubeh}(h]h ]h"]h$]h&]uh1j hjN8hKBhj7ubeh}(h]h ]h"]h$]h&]uh1jhjv7ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hj{8h]h Description}(hj}8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjy8ubah}(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.}(hj8hhhNhNubah}(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](h֌i2c_dev_desc (C struct)c.i2c_dev_deschNtauh1hhhhhhNhNubh)}(hhh](h)}(h i2c_dev_desch]h)}(hstruct i2c_dev_desch](j:)}(hj=h]hstruct}(hj8hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj8hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKIubh)}(h h]h }(hj8hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj8hhhj8hKIubj)}(h i2c_dev_desch]j)}(hj8h]h i2c_dev_desc}(hj8hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj8ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj8hhhj8hKIubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj8hhhj8hKIubah}(h]j8ah ](jjeh"]h$]h&]jj)jhuh1hhj8hKIhj8hhubj)}(hhh]j)}(hI2C device descriptorh]hI2C device descriptor}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKNhj8hhubah}(h]h ]h"]h$]h&]uh1jhj8hhhj8hKIubeh}(h]h ](jpstructeh"]h$]h&]jjpjj9jj9jjjuh1hhhhhhNhNubj)}(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}(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.hhKRhj9ubj5)}(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; };}hj89sbah}(h]h ]h"]h$]h&]hhuh1j5hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKThj9ubj)}(h **Members**h]j)}(hjI9h]hMembers}(hjK9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjG9ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK[hj9ubj)}(hhh](j!)}(h4``common`` common part of the I2C device descriptor h](j')}(h ``common``h]j-)}(hjh9h]hcommon}(hjj9hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjf9ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKPhjb9ubjC)}(hhh]j)}(h(common part of the I2C device descriptorh]h(common part of the I2C device descriptor}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}9hKPhj~9ubah}(h]h ]h"]h$]h&]uh1jBhjb9ubeh}(h]h ]h"]h$]h&]uh1j hj}9hKPhj_9ubj!)}(h:``dev`` I2C device object registered to the I2C framework h](j')}(h``dev``h]j-)}(hj9h]hdev}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj9ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKQhj9ubjC)}(hhh]j)}(h1I2C device object registered to the I2C frameworkh]h1I2C device object registered to the I2C framework}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9hKQhj9ubah}(h]h ]h"]h$]h&]uh1jBhj9ubeh}(h]h ]h"]h$]h&]uh1j hj9hKQhj_9ubj!)}(h``addr`` I2C device address h](j')}(h``addr``h]j-)}(hj9h]haddr}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj9ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKRhj9ubjC)}(hhh]j)}(hI2C device addressh]hI2C device address}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9hKRhj9ubah}(h]h ]h"]h$]h&]uh1jBhj9ubeh}(h]h ]h"]h$]h&]uh1j hj9hKRhj_9ubj!)}(he``lvr`` LVR (Legacy Virtual Register) needed by the I3C core to know about the I2C device limitationsh](j')}(h``lvr``h]j-)}(hj:h]hlvr}(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.hhKShj :ubjC)}(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(:hKShj):ubah}(h]h ]h"]h$]h&]uh1jBhj :ubeh}(h]h ]h"]h$]h&]uh1j hj(:hKShj_9ubeh}(h]h ]h"]h$]h&]uh1jhj9ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hjU:h]h Description}(hjW:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjS: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 }(hjk:hhhNhNubh)}(hJ:c:type:`struct_i3c_master_controller->ops `h]j-)}(hju:h]h!struct_i3c_master_controller->ops}(hjw:hhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjs:ubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjjstruct_i3c_master_controlleruh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKThjk:ubh->attach_i2c_dev().}(hjk: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]j-)}(hj:h]hstruct_i2c_dev_desc}(hj:hhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hj:ubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjj _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]j-)}(hj:h]h struct_i3c_master_controller_ops}(hj:hhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hj:ubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjj_i3c_master_controller_opsuh1hhj:hKXhj:ubh hooks.}(hj:hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj:hKXhhhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h֌i3c_ibi_slot (C struct)c.i3c_ibi_slothNtauh1hhhhhhNhNubh)}(hhh](h)}(h i3c_ibi_sloth]h)}(hstruct i3c_ibi_sloth](j:)}(hj=h]hstruct}(hj;hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj;hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK_ubh)}(h h]h }(hj;hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj;hhhj;hK_ubj)}(h i3c_ibi_sloth]j)}(hj;h]h i3c_ibi_slot}(hj';hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj#;ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj;hhhj;hK_ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj:hhhj;hK_ubah}(h]j:ah ](jjeh"]h$]h&]jj)jhuh1hhj;hK_hj:hhubj)}(hhh]j)}(h I3C IBI (In-Band Interrupt) sloth]h I3C IBI (In-Band Interrupt) slot}(hjI;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKehjF;hhubah}(h]h ]h"]h$]h&]uh1jhj:hhhj;hK_ubeh}(h]h ](jpstructeh"]h$]h&]jjpjja;jja;jjjuh1hhhhhhNhNubj)}(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}(hjm;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhji;ubh:}(hji;hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKihje;ubj5)}(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&]hhuh1j5hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKkhje;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.hhKrhje;ubj)}(hhh](j!)}(hQ``work`` work associated to this slot. The IBI handler will be called from there h](j')}(h``work``h]j-)}(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;ubjC)}(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&]uh1jBhj;ubeh}(h]h ]h"]h$]h&]uh1j hj;hKhhj;ubj!)}(h3``dev`` the I3C device that has generated this IBI h](j')}(h``dev``h]j-)}(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.hhKihj;ubjC)}(hhh]j)}(h*the I3C device that has generated this IBIh]h*the I3C device that has generated this IBI}(hj <hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<hKihj<ubah}(h]h ]h"]h$]h&]uh1jBhj;ubeh}(h]h ]h"]h$]h&]uh1j hj<hKihj;ubj!)}(h5``len`` length of the payload associated to this IBI h](j')}(h``len``h]j-)}(hj)<h]hlen}(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#<ubjC)}(hhh]j)}(h,length of the payload associated to this IBIh]h,length of the payload associated to this IBI}(hjB<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj><hKjhj?<ubah}(h]h ]h"]h$]h&]uh1jBhj#<ubeh}(h]h ]h"]h$]h&]uh1j hj><hKjhj;ubj!)}(h``data`` payload bufferh](j')}(h``data``h]j-)}(hjb<h]hdata}(hjd<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\<ubjC)}(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.hhKkhjx<ubah}(h]h ]h"]h$]h&]uh1jBhj\<ubeh}(h]h ]h"]h$]h&]uh1j hjw<hKjhj;ubeh}(h]h ]h"]h$]h&]uh1jhje;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](h֌i3c_device_ibi_info (C struct)c.i3c_device_ibi_infohNtauh1hhhhhhNhNubh)}(hhh](h)}(hi3c_device_ibi_infoh]h)}(hstruct i3c_device_ibi_infoh](j:)}(hj=h]hstruct}(hj<hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj<hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKwubh)}(h h]h }(hj=hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj<hhhj<hKwubj)}(hi3c_device_ibi_infoh]j)}(hj<h]hi3c_device_ibi_info}(hj=hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj=ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj<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}(hj4=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}hj1=hhubah}(h]h ]h"]h$]h&]uh1jhj<hhhj<hKwubeh}(h]h ](jpstructeh"]h$]h&]jjpjjL=jjL=jjjuh1hhhhhhNhNubj)}(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}(hjX=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjT=ubh:}(hjT=hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjP=ubj5)}(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); };}hjq=sbah}(h]h ]h"]h$]h&]hhuh1j5hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjP=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.hhKhjP=ubj)}(hhh](j!)}(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]j-)}(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=ubjC)}(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&]uh1jBhj=ubeh}(h]h ]h"]h$]h&]uh1j hj=hKhj=ubj!)}(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]j-)}(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=ubjC)}(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}(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&]uh1jBhj=ubeh}(h]h ]h"]h$]h&]uh1j hj=hKhj=ubj!)}(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]j-)}(hj>h]hmax_payload_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.hhKhj>ubjC)}(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}(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&]uh1jBhj>ubeh}(h]h ]h"]h$]h&]uh1j hj*>hKhj=ubj!)}(h;``num_slots`` number of IBI slots reserved for this device h](j')}(h ``num_slots``h]j-)}(hjO>h]h num_slots}(hjQ>hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjM>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.hhKhjI>ubjC)}(hhh]j)}(h,number of IBI slots reserved for this deviceh]h,number of IBI slots reserved for this device}(hjh>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjd>hKhje>ubah}(h]h ]h"]h$]h&]uh1jBhjI>ubeh}(h]h ]h"]h$]h&]uh1j hjd>hKhj=ubj!)}(h#``enabled`` reflect the IBI status h](j')}(h ``enabled``h]j-)}(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>ubjC)}(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&]uh1jBhj>ubeh}(h]h ]h"]h$]h&]uh1j hj>hKhj=ubj!)}(h/``wq`` workqueue used to execute IBI handlers. h](j')}(h``wq``h]j-)}(hj>h]hwq}(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>ubjC)}(hhh]j)}(h'workqueue used to execute IBI handlers.h]h'workqueue used to execute IBI handlers.}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>hKhj>ubah}(h]h ]h"]h$]h&]uh1jBhj>ubeh}(h]h ]h"]h$]h&]uh1j hj>hKhj=ubj!)}(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]j-)}(hj>h]hhandler}(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>ubjC)}(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}(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&]uh1jBhj>ubeh}(h]h ]h"]h$]h&]uh1j hj?hKhj=ubeh}(h]h ]h"]h$]h&]uh1jhjP=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.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 }(hjS?hhhNhNubh)}(h;:c:type:`struct_i3c_device_ibi_info <_i3c_device_ibi_info>`h]j-)}(hj]?h]hstruct_i3c_device_ibi_info}(hj_?hhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hj[?ubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjj_i3c_device_ibi_infouh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjS?ubh 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.}(hjS?hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjz?hKhhhhubj)}(hNote that this structure is the generic view of the IBI management infrastructure. I3C master drivers may have their own internal representation which they can associate to the device using controller-private data.h]hNote that this structure is the generic view of the IBI management infrastructure. I3C master drivers may have their own internal representation which they can associate to the device using controller-private data.}(hj?hhhNhNubah}(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](h֌i3c_dev_boardinfo (C struct)c.i3c_dev_boardinfohNtauh1hhhhhhNhNubh)}(hhh](h)}(hi3c_dev_boardinfoh]h)}(hstruct i3c_dev_boardinfoh](j:)}(hj=h]hstruct}(hj?hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj?hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKubh)}(h h]h }(hj?hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj?hhhj?hKubj)}(hi3c_dev_boardinfoh]j)}(hj?h]hi3c_dev_boardinfo}(hj?hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj?ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj?hhhj?hKubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj?hhhj?hKubah}(h]j?ah ](jjeh"]h$]h&]jj)jhuh1hhj?hKhj?hhubj)}(hhh]j)}(hI3C device board informationh]hI3C device board information}(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?hhubah}(h]h ]h"]h$]h&]uh1jhj?hhhj?hKubeh}(h]h ](jpstructeh"]h$]h&]jjpjj@jj@jjjuh1hhhhhhNhNubj)}(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}(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 @ubj5)}(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; };}hj,@sbah}(h]h ]h"]h$]h&]hhuh1j5hj/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 @ubj)}(hhh](j!)}(hG``node`` used to insert the boardinfo object in the I3C boardinfo list h](j')}(h``node``h]j-)}(hj\@h]hnode}(hj^@hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjZ@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.hhKhjV@ubjC)}(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}(hju@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjq@hKhjr@ubah}(h]h ]h"]h$]h&]uh1jBhjV@ubeh}(h]h ]h"]h$]h&]uh1j hjq@hKhjS@ubj!)}(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]j-)}(hj@h]h init_dyn_addr}(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@ubjC)}(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}(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&]uh1jBhj@ubeh}(h]h ]h"]h$]h&]uh1j hj@hKhjS@ubj!)}(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]j-)}(hj@h]h static_addr}(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@ubjC)}(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@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&]uh1jBhj@ubeh}(h]h ]h"]h$]h&]uh1j hj@hKhjS@ubj!)}(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]j-)}(hj Ah]hpid}(hj AhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjAubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjAubjC)}(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"AhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjAubah}(h]h ]h"]h$]h&]uh1jBhjAubeh}(h]h ]h"]h$]h&]uh1j hjAhKhjS@ubj!)}(hL``of_node`` optional DT node in case the device has been described in the DTh](j')}(h ``of_node``h]j-)}(hjCAh]hof_node}(hjEAhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjAAubah}(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=AubjC)}(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}(hj\AhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjYAubah}(h]h ]h"]h$]h&]uh1jBhj=Aubeh}(h]h ]h"]h$]h&]uh1j hjXAhKhjS@ubeh}(h]h ]h"]h$]h&]uh1jhj @ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hjAh]h Description}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(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.}(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](h֌i3c_dev_desc (C struct)c.i3c_dev_deschNtauh1hhhhhhNhNubh)}(hhh](h)}(h i3c_dev_desch]h)}(hstruct i3c_dev_desch](j:)}(hj=h]hstruct}(hjAhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjAhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKubh)}(h h]h }(hjAhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjAhhhjAhKubj)}(h i3c_dev_desch]j)}(hjAh]h i3c_dev_desc}(hjAhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjAubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjAhhhjAhKubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjAhhhjAhKubah}(h]jAah ](jjeh"]h$]h&]jj)jhuh1hhjAhKhjAhhubj)}(hhh]j)}(hI3C device descriptorh]hI3C device descriptor}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjBhhubah}(h]h ]h"]h$]h&]uh1jhjAhhhjAhKubeh}(h]h ](jpstructeh"]h$]h&]jjpjjBjjBjjjuh1hhhhhhNhNubj)}(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}(hj*BhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&Bubh:}(hj&BhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj"Bubj5)}(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; };}hjCBsbah}(h]h ]h"]h$]h&]hhuh1j5hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj"Bubj)}(h **Members**h]j)}(hjTBh]hMembers}(hjVBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRBubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj"Bubj)}(hhh](j!)}(h4``common`` common part of the I3C device descriptor h](j')}(h ``common``h]j-)}(hjsBh]hcommon}(hjuBhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjqBubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjmBubjC)}(hhh]j)}(h(common part of the I3C device descriptorh]h(common part of the I3C device descriptor}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBhKhjBubah}(h]h ]h"]h$]h&]uh1jBhjmBubeh}(h]h ]h"]h$]h&]uh1j hjBhKhjjBubj!)}(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]j-)}(hjBh]hinfo}(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.hhKhjBubjC)}(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()}(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&]uh1jBhjBubeh}(h]h ]h"]h$]h&]uh1j hjBhKhjjBubj!)}(h[``ibi_lock`` lock used to protect the :c:type:`struct_i3c_device->ibi ` h](j')}(h ``ibi_lock``h]j-)}(hjBh]hibi_lock}(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.hhKhjBubjC)}(hhh]j)}(hMlock used to protect the :c:type:`struct_i3c_device->ibi `h](hlock used to protect the }(hjBhhhNhNubh)}(h4:c:type:`struct_i3c_device->ibi `h]j-)}(hj Ch]hstruct_i3c_device->ibi}(hj ChhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjCubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjjstruct_i3c_deviceuh1hhjBhKhjBubeh}(h]h ]h"]h$]h&]uh1jhjBhKhjBubah}(h]h ]h"]h$]h&]uh1jBhjBubeh}(h]h ]h"]h$]h&]uh1j hjBhKhjjBubj!)}(h_``ibi`` IBI info attached to a device. Should be NULL until i3c_device_request_ibi() is called h](j')}(h``ibi``h]j-)}(hj>Ch]hibi}(hj@ChhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj desc link or when propagating IBI events to the driver h](j')}(h``dev``h]j-)}(hjxCh]hdev}(hjzChhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjvCubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjrCubjC)}(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}(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&]uh1jBhjrCubeh}(h]h ]h"]h$]h&]uh1j hjChKhjjBubj!)}(hB``boardinfo`` pointer to the boardinfo attached to this I3C deviceh](j')}(h ``boardinfo``h]j-)}(hjCh]h boardinfo}(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.hhKhjCubjC)}(hhh]j)}(h4pointer to the boardinfo attached to this I3C deviceh]h4pointer to the boardinfo attached to this I3C device}(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&]uh1jBhjCubeh}(h]h ]h"]h$]h&]uh1j hjChKhjjBubeh}(h]h ]h"]h$]h&]uh1jhj"Bubeh}(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)}(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 (}(hj DhhhNhNubh)}(h):c:type:`struct_i3c_device <_i3c_device>`h]j-)}(hjDh]hstruct_i3c_device}(hjDhhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjDubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjj _i3c_deviceuh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj Dubh).}(hj DhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj2DhKhhhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h֌i3c_device (C struct) c.i3c_devicehNtauh1hhhhhhNhNubh)}(hhh](h)}(h i3c_deviceh]h)}(hstruct i3c_deviceh](j:)}(hj=h]hstruct}(hjVDhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjRDhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKubh)}(h h]h }(hjdDhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjRDhhhjcDhKubj)}(h i3c_deviceh]j)}(hjPDh]h i3c_device}(hjvDhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjrDubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjRDhhhjcDhKubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjNDhhhjcDhKubah}(h]jIDah ](jjeh"]h$]h&]jj)jhuh1hhjcDhKhjKDhhubj)}(hhh]j)}(hI3C device objecth]hI3C device object}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjDhhubah}(h]h ]h"]h$]h&]uh1jhjKDhhhjcDhKubeh}(h]h ](jpstructeh"]h$]h&]jjpjjDjjDjjjuh1hhhhhhNhNubj)}(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}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubh:}(hjDhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjDubj5)}(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; };}hjDsbah}(h]h ]h"]h$]h&]hhuh1j5hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjDubj)}(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.hhKhjDubj)}(hhh](j!)}(hB``dev`` device object to register the I3C dev to the device model h](j')}(h``dev``h]j-)}(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.hhKhjDubjC)}(hhh]j)}(h9device object to register the I3C dev to the device modelh]h9device object to register the I3C dev to the device model}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEhKhjEubah}(h]h ]h"]h$]h&]uh1jBhjDubeh}(h]h ]h"]h$]h&]uh1j hjEhKhjDubj!)}(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]j-)}(hj>Eh]hdesc}(hj@EhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj` 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 }(hjEhhhNhNubh)}(h-:c:type:`struct_i3c_dev_desc <_i3c_dev_desc>`h]j-)}(hjEh]hstruct_i3c_dev_desc}(hjEhhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjEubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjj _i3c_dev_descuh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjEubhs one. All I3C devs on the I3C bus are represented, including I3C masters. For each of them, we have an instance of }(hjEhhhNhNubh)}(h(:c:type:`struct i3c_device `h]j-)}(hjEh]hstruct i3c_device}(hjFhhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjEubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjj i3c_deviceuh1hhjEhKhjEubh.}(hjEhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjEhKhhhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h֌i3c_bus_mode (C enum)c.i3c_bus_modehNtauh1hhhhhhNhNubh)}(hhh](h)}(h i3c_bus_modeh]h)}(henum i3c_bus_modeh](j:)}(hjh]henum}(hj?FhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj;Fhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKubh)}(h h]h }(hjMFhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj;FhhhjLFhKubj)}(h i3c_bus_modeh]j)}(hj9Fh]h i3c_bus_mode}(hj_FhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj[Fubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj;FhhhjLFhKubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj7FhhhjLFhKubah}(h]j2Fah ](jjeh"]h$]h&]jj)jhuh1hhjLFhKhj4Fhhubj)}(hhh]j)}(h I3C bus modeh]h I3C bus mode}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj~Fhhubah}(h]h ]h"]h$]h&]uh1jhj4FhhhjLFhKubeh}(h]h ](jpenumeh"]h$]h&]jjpjjFjjFjjjuh1hhhhhhNhNubj)}(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)}(hjFh]h Constants}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM hjFubj)}(hhh](j!)}(hX``I3C_BUS_MODE_PURE`` only I3C devices are connected to the bus. No limitation expected h](j')}(h``I3C_BUS_MODE_PURE``h]j-)}(hjFh]hI3C_BUS_MODE_PURE}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjFubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjFubjC)}(hhh]j)}(hAonly I3C devices are connected to the bus. No limitation expectedh]hAonly I3C devices are connected to the bus. No limitation expected}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjFubah}(h]h ]h"]h$]h&]uh1jBhjFubeh}(h]h ]h"]h$]h&]uh1j hjFhMhjFubj!)}(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]j-)}(hjFh]hI3C_BUS_MODE_MIXED_FAST}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjFubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjFubjC)}(hhh]j)}(hI2C devices with 50ns spike filter are present on the bus. The only impact in this mode is that the high SCL pulse has to stay below 50ns to trick I2C devices when transmitting I3C framesh]hI2C devices with 50ns spike filter are present on the bus. The only impact in this mode is that the high SCL pulse has to stay below 50ns to trick I2C devices when transmitting I3C frames}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjGubah}(h]h ]h"]h$]h&]uh1jBhjFubeh}(h]h ]h"]h$]h&]uh1j hjGhMhjFubj!)}(h``I3C_BUS_MODE_MIXED_LIMITED`` I2C devices without 50ns spike filter are present on the bus. However they allow compliance up to the maximum SDR SCL clock frequency. h](j')}(h``I3C_BUS_MODE_MIXED_LIMITED``h]j-)}(hj6Gh]hI3C_BUS_MODE_MIXED_LIMITED}(hj8GhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj4Gubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj0GubjC)}(hhh]j)}(hI2C devices without 50ns spike filter are present on the bus. However they allow compliance up to the maximum SDR SCL clock frequency.h]hI2C devices without 50ns spike filter are present on the bus. However they allow compliance up to the maximum SDR SCL clock frequency.}(hjOGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjLGubah}(h]h ]h"]h$]h&]uh1jBhj0Gubeh}(h]h ]h"]h$]h&]uh1j hjKGhMhjFubj!)}(hX``I3C_BUS_MODE_MIXED_SLOW`` I2C devices without 50ns spike filter are present on the bush](j')}(h``I3C_BUS_MODE_MIXED_SLOW``h]j-)}(hjpGh]hI3C_BUS_MODE_MIXED_SLOW}(hjrGhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjnGubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjjGubjC)}(hhh]j)}(hIubj)}(hhh](j!)}(h'``I3C_ADDR_SLOT_FREE`` address is free h](j')}(h``I3C_ADDR_SLOT_FREE``h]j-)}(hjcIh]hI3C_ADDR_SLOT_FREE}(hjeIhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjaIubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM3hj]IubjC)}(hhh]j)}(haddress is freeh]haddress is free}(hj|IhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxIhM3hjyIubah}(h]h ]h"]h$]h&]uh1jBhj]Iubeh}(h]h ]h"]h$]h&]uh1j hjxIhM3hjZIubj!)}(h+``I3C_ADDR_SLOT_RSVD`` address is reserved h](j')}(h``I3C_ADDR_SLOT_RSVD``h]j-)}(hjIh]hI3C_ADDR_SLOT_RSVD}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjIubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM6hjIubjC)}(hhh]j)}(haddress is reservedh]haddress is reserved}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIhM6hjIubah}(h]h ]h"]h$]h&]uh1jBhjIubeh}(h]h ]h"]h$]h&]uh1j hjIhM6hjZIubj!)}(h?``I3C_ADDR_SLOT_I2C_DEV`` address is assigned to an I2C device h](j')}(h``I3C_ADDR_SLOT_I2C_DEV``h]j-)}(hjIh]hI3C_ADDR_SLOT_I2C_DEV}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjIubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM9hjIubjC)}(hhh]j)}(h$address is assigned to an I2C deviceh]h$address is assigned to an I2C device}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIhM9hjIubah}(h]h ]h"]h$]h&]uh1jBhjIubeh}(h]h ]h"]h$]h&]uh1j hjIhM9hjZIubj!)}(h?``I3C_ADDR_SLOT_I3C_DEV`` address is assigned to an I3C device h](j')}(h``I3C_ADDR_SLOT_I3C_DEV``h]j-)}(hjJh]hI3C_ADDR_SLOT_I3C_DEV}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj Jubah}(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<hjJubjC)}(hhh]j)}(h$address is assigned to an I3C deviceh]h$address is assigned to an I3C device}(hj'JhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#JhM<hj$Jubah}(h]h ]h"]h$]h&]uh1jBhjJubeh}(h]h ]h"]h$]h&]uh1j hj#JhM<hjZIubj!)}(h0``I3C_ADDR_SLOT_STATUS_MASK`` address slot mask h](j')}(h``I3C_ADDR_SLOT_STATUS_MASK``h]j-)}(hjGJh]hI3C_ADDR_SLOT_STATUS_MASK}(hjIJhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjEJubah}(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?hjAJubjC)}(hhh]j)}(haddress slot maskh]haddress slot mask}(hj`JhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\JhM?hj]Jubah}(h]h ]h"]h$]h&]uh1jBhjAJubeh}(h]h ]h"]h$]h&]uh1j hj\JhM?hjZIubj!)}(hN``I3C_ADDR_SLOT_EXT_STATUS_MASK`` address slot mask with extended information h](j')}(h!``I3C_ADDR_SLOT_EXT_STATUS_MASK``h]j-)}(hjJh]hI3C_ADDR_SLOT_EXT_STATUS_MASK}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj~Jubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMBhjzJubjC)}(hhh]j)}(h+address slot mask with extended informationh]h+address slot mask with extended information}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJhMBhjJubah}(h]h ]h"]h$]h&]uh1jBhjzJubeh}(h]h ]h"]h$]h&]uh1j hjJhMBhjZIubj!)}(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]j-)}(hjJh]hI3C_ADDR_SLOT_EXT_DESIRED}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjJubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMGhjJubjC)}(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.}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMEhjJubah}(h]h ]h"]h$]h&]uh1jBhjJubeh}(h]h ]h"]h$]h&]uh1j hjJhMGhjZIubeh}(h]h ]h"]h$]h&]uh1jhj>Iubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hjJh]h Description}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMJhhhhubj)}(h]Addresses marked as reserved are those reserved by the I3C protocol (broadcast address, ...).h]h]Addresses marked as reserved are those reserved by the I3C protocol (broadcast address, ...).}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM7hhhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h֌i3c_bus (C struct) c.i3c_bushNtauh1hhhhhhNhNubh)}(hhh](h)}(hi3c_bush]h)}(hstruct i3c_bush](j:)}(hj=h]hstruct}(hj:KhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj6Khhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM=ubh)}(h h]h }(hjHKhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj6KhhhjGKhM=ubj)}(hi3c_bush]j)}(hj4Kh]hi3c_bus}(hjZKhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjVKubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj6KhhhjGKhM=ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj2KhhhjGKhM=ubah}(h]j-Kah ](jjeh"]h$]h&]jj)jhuh1hhjGKhM=hj/Khhubj)}(hhh]j)}(hI3C bus objecth]hI3C bus object}(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.hhMHhjyKhhubah}(h]h ]h"]h$]h&]uh1jhj/KhhhjGKhM=ubeh}(h]h ](jpstructeh"]h$]h&]jjpjjKjjKjjjuh1hhhhhhNhNubj)}(hX**Definition**:: struct i3c_bus { struct i3c_dev_desc *cur_master; int id; unsigned long addrslots[((I2C_MAX_ADDR + 1) * I3C_ADDR_SLOT_STATUS_BITS) / BITS_PER_LONG]; enum i3c_bus_mode mode; struct { unsigned long i3c; unsigned long i2c; } scl_rate; struct { struct list_head i3c; struct list_head i2c; } devs; struct rw_semaphore lock; }; **Members** ``cur_master`` I3C master currently driving the bus. Since I3C is multi-master this can change over the time. Will be used to let a master know whether it needs to request bus ownership before sending a frame or not ``id`` bus ID. Assigned by the framework when register the bus ``addrslots`` a bitmap with 2-bits per-slot to encode the address status and ease the DAA (Dynamic Address Assignment) procedure (see :c:type:`enum i3c_addr_slot_status `) ``mode`` bus mode (see :c:type:`enum i3c_bus_mode `) ``scl_rate`` SCL signal rate for I3C and I2C mode ``scl_rate.i3c`` maximum rate for the clock signal when doing I3C SDR/priv transfers ``scl_rate.i2c`` maximum rate for the clock signal when doing I2C transfers ``devs`` 2 lists containing all I3C/I2C devices connected to the bus ``devs.i3c`` contains a list of I3C device descriptors representing I3C devices connected on the bus and successfully attached to the I3C master ``devs.i2c`` contains a list of I2C device descriptors representing I2C devices connected on the bus and successfully attached to the I3C master ``lock`` read/write lock on the bus. This is needed to protect against operations that have an impact on the whole bus and the devices connected to it. For example, when asking slaves to drop their dynamic address (RSTDAA CCC), we need to make sure no one is trying to send I3C frames to these devices. Note that this lock does not protect against concurrency between devices: several drivers can send different I3C/I2C frames through the same master in parallel. This is the responsibility of the master to guarantee that frames are actually sent sequentially and not interlacedh](j)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKubh:}(hjKhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMLhjKubj5)}(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; };}hjKsbah}(h]h ]h"]h$]h&]hhuh1j5hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMNhjKubj)}(h **Members**h]j)}(hjKh]hMembers}(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.hhM^hjKubj)}(hhh](j!)}(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]j-)}(hjKh]h cur_master}(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.hhMMhjKubjC)}(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}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMJhjKubah}(h]h ]h"]h$]h&]uh1jBhjKubeh}(h]h ]h"]h$]h&]uh1j hjKhMMhjKubj!)}(h?``id`` bus ID. Assigned by the framework when register the bus h](j')}(h``id``h]j-)}(hj#Lh]hid}(hj%LhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj!Lubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMNhjLubjC)}(hhh]j)}(h7bus ID. Assigned by the framework when register the bush]h7bus ID. Assigned by the framework when register the bus}(hj`) h](j')}(h ``addrslots``h]j-)}(hj\Lh]h addrslots}(hj^LhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjZLubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMQhjVLubjC)}(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 }(hjuLhhhNhNubh)}(h::c:type:`enum i3c_addr_slot_status `h]j-)}(hjLh]henum i3c_addr_slot_status}(hjLhhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hj}Lubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjji3c_addr_slot_statusuh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMOhjuLubh)}(hjuLhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjLhMOhjrLubah}(h]h ]h"]h$]h&]uh1jBhjVLubeh}(h]h ]h"]h$]h&]uh1j hjqLhMQhjKubj!)}(hC``mode`` bus mode (see :c:type:`enum i3c_bus_mode `) h](j')}(h``mode``h]j-)}(hjLh]hmode}(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.hhMRhjLubjC)}(hhh]j)}(h9bus mode (see :c:type:`enum i3c_bus_mode `)h](hbus mode (see }(hjLhhhNhNubh)}(h*:c:type:`enum i3c_bus_mode `h]j-)}(hjLh]henum i3c_bus_mode}(hjLhhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjLubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjj i3c_bus_modeuh1hhjLhMRhjLubh)}(hjLhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjLhMRhjLubah}(h]h ]h"]h$]h&]uh1jBhjLubeh}(h]h ]h"]h$]h&]uh1j hjLhMRhjKubj!)}(h2``scl_rate`` SCL signal rate for I3C and I2C mode h](j')}(h ``scl_rate``h]j-)}(hjMh]hscl_rate}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjMubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMVhjMubjC)}(hhh]j)}(h$SCL signal rate for I3C and I2C modeh]h$SCL signal rate for I3C and I2C mode}(hj.MhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*MhMVhj+Mubah}(h]h ]h"]h$]h&]uh1jBhjMubeh}(h]h ]h"]h$]h&]uh1j hj*MhMVhjKubj!)}(hU``scl_rate.i3c`` maximum rate for the clock signal when doing I3C SDR/priv transfers h](j')}(h``scl_rate.i3c``h]j-)}(hjNMh]h scl_rate.i3c}(hjPMhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjLMubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMThjHMubjC)}(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}(hjgMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMShjdMubah}(h]h ]h"]h$]h&]uh1jBhjHMubeh}(h]h ]h"]h$]h&]uh1j hjcMhMThjKubj!)}(hL``scl_rate.i2c`` maximum rate for the clock signal when doing I2C transfers h](j')}(h``scl_rate.i2c``h]j-)}(hjMh]h scl_rate.i2c}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjMubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMUhjMubjC)}(hhh]j)}(h:maximum rate for the clock signal when doing I2C transfersh]h:maximum rate for the clock signal when doing I2C transfers}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMhMUhjMubah}(h]h ]h"]h$]h&]uh1jBhjMubeh}(h]h ]h"]h$]h&]uh1j hjMhMUhjKubj!)}(hE``devs`` 2 lists containing all I3C/I2C devices connected to the bus h](j')}(h``devs``h]j-)}(hjMh]hdevs}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjMubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM]hjMubjC)}(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}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMhM]hjMubah}(h]h ]h"]h$]h&]uh1jBhjMubeh}(h]h ]h"]h$]h&]uh1j hjMhM]hjKubj!)}(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]j-)}(hjMh]hdevs.i3c}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjMubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMYhjMubjC)}(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}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMWhjNubah}(h]h ]h"]h$]h&]uh1jBhjMubeh}(h]h ]h"]h$]h&]uh1j hjNhMYhjKubj!)}(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]j-)}(hj4Nh]hdevs.i2c}(hj6NhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj2Nubah}(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.NubjC)}(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}(hjMNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMZhjJNubah}(h]h ]h"]h$]h&]uh1jBhj.Nubeh}(h]h ]h"]h$]h&]uh1j hjINhM\hjKubj!)}(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]j-)}(hjnNh]hlock}(hjpNhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjlNubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMfhjhNubjC)}(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}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM^hjNubah}(h]h ]h"]h$]h&]uh1jBhjhNubeh}(h]h ]h"]h$]h&]uh1j hjNhMfhjKubeh}(h]h ]h"]h$]h&]uh1jhjKubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hjNh]h Description}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.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.}(hjNhhhNhNubah}(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](j:)}(hj=h]hstruct}(hjNhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjNhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMoubh)}(h h]h }(hjNhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjNhhhjNhMoubj)}(hi3c_master_controller_opsh]j)}(hjNh]hi3c_master_controller_ops}(hjOhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj Oubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjNhhhjNhMoubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjNhhhjNhMoubah}(h]jNah ](jjeh"]h$]h&]jj)jhuh1hhjNhMohjNhhubj)}(hhh]j)}(hI3C master methodsh]hI3C master methods}(hj1OhhhNhNubah}(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.Ohhubah}(h]h ]h"]h$]h&]uh1jhjNhhhjNhMoubeh}(h]h ](jpstructeh"]h$]h&]jjpjjIOjjIOjjjuh1hhhhhhNhNubj)}(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}(hjUOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQOubh:}(hjQOhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjMOubj5)}(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); };}hjnOsbah}(h]h ]h"]h$]h&]hhuh1j5hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjMOubj)}(h **Members**h]j)}(hjOh]hMembers}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}Oubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjMOubj)}(hhh](j!)}(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]j-)}(hjOh]hbus_init}(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.hhMhjOubjC)}(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.}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjOubah}(h]h ]h"]h$]h&]uh1jBhjOubeh}(h]h ]h"]h$]h&]uh1j hjOhMhjOubj!)}(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]j-)}(hjOh]h bus_cleanup}(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.hhMhjOubjC)}(hhh]j)}(hcleanup everything done in :c:type:`i3c_master_controller_ops->bus_init\(\) `. This method is optional.h](hcleanup everything done in }(hjOhhhNhNubh)}(hM:c:type:`i3c_master_controller_ops->bus_init\(\) `h]j-)}(hjOh]h%i3c_master_controller_ops->bus_init()}(hjOhhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjOubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjji3c_master_controller_opsuh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjOubh. This method is optional.}(hjOhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjPhMhjOubah}(h]h ]h"]h$]h&]uh1jBhjOubeh}(h]h ]h"]h$]h&]uh1j hjOhMhjOubj!)}(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]j-)}(hj5Ph]hattach_i3c_dev}(hj7PhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj3Pubah}(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/PubjC)}(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.}(hjNPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjKPubah}(h]h ]h"]h$]h&]uh1jBhj/Pubeh}(h]h ]h"]h$]h&]uh1j hjJPhMhjOubj!)}(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]j-)}(hjoPh]hreattach_i3c_dev}(hjqPhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjmPubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjiPubjC)}(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.}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjPubah}(h]h ]h"]h$]h&]uh1jBhjiPubeh}(h]h ]h"]h$]h&]uh1j hjPhMhjOubj!)}(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]j-)}(hjPh]hdetach_i3c_dev}(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.hhMhjPubjC)}(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.}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjPubah}(h]h ]h"]h$]h&]uh1jBhjPubeh}(h]h ]h"]h$]h&]uh1j hjPhMhjOubj!)}(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]j-)}(hjPh]hdo_daa}(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.hhMhjPubjC)}(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.}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjPubah}(h]h ]h"]h$]h&]uh1jBhjPubeh}(h]h ]h"]h$]h&]uh1j hjPhMhjOubj!)}(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]j-)}(hjQh]hsupports_ccc_cmd}(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.hhMhjQubjC)}(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.}(hj6QhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj3Qubah}(h]h ]h"]h$]h&]uh1jBhjQubeh}(h]h ]h"]h$]h&]uh1j hj2QhMhjOubj!)}(h>``send_ccc_cmd`` send a CCC command This method is mandatory. h](j')}(h``send_ccc_cmd``h]j-)}(hjWQh]h send_ccc_cmd}(hjYQhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjUQubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjQQubjC)}(hhh]j)}(h,send a CCC command This method is mandatory.h]h,send a CCC command This method is mandatory.}(hjpQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjmQubah}(h]h ]h"]h$]h&]uh1jBhjQQubeh}(h]h ]h"]h$]h&]uh1j hjlQhMhjOubj!)}(hT``i3c_xfers`` do one or several I3C SDR or HDR transfers. This method is mandatory. h](j')}(h ``i3c_xfers``h]j-)}(hjQh]h i3c_xfers}(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.hhMhjQubjC)}(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.}(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&]uh1jBhjQubeh}(h]h ]h"]h$]h&]uh1j hjQhMhjOubj!)}(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]j-)}(hjQh]hattach_i2c_dev}(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.hhMhjQubjC)}(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.}(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&]uh1jBhjQubeh}(h]h ]h"]h$]h&]uh1j hjQhMhjOubj!)}(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]j-)}(hjRh]hdetach_i2c_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.hhMhjQubjC)}(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.}(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&]uh1jBhjQubeh}(h]h ]h"]h$]h&]uh1j hjRhMhjOubj!)}(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]j-)}(hj?Rh]h i2c_xfers}(hjARhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj=Rubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj9RubjC)}(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.}(hjXRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjURubah}(h]h ]h"]h$]h&]uh1jBhj9Rubeh}(h]h ]h"]h$]h&]uh1j hjTRhMhjOubj!)}(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]j-)}(hjyRh]h request_ibi}(hj{RhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjwRubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjsRubjC)}(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 -}(hjRhhhNhNubj-)}(h ``EBUSY``h]hEBUSY}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjRubhR if there’s no more space for an extra IBI registration This method is optional.}(hjRhhhNhNubeh}(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&]uh1jBhjsRubeh}(h]h ]h"]h$]h&]uh1j hjRhMhjOubj!)}(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]j-)}(hjRh]hfree_ibi}(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.hhMhjRubjC)}(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.}(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&]uh1jBhjRubeh}(h]h ]h"]h$]h&]uh1j hjRhMhjOubj!)}(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]j-)}(hjRh]h enable_ibi}(hjShhhNhNubah}(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.hhMhjRubjC)}(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.}(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&]uh1jBhjRubeh}(h]h ]h"]h$]h&]uh1j hjShMhjOubj!)}(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]j-)}(hj9Sh]h disable_ibi}(hj;ShhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj7Subah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj3SubjC)}(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.}(hjRShhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjOSubah}(h]h ]h"]h$]h&]uh1jBhj3Subeh}(h]h ]h"]h$]h&]uh1j hjNShMhjOubj!)}(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]j-)}(hjsSh]hrecycle_ibi_slot}(hjuShhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjqSubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjmSubjC)}(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.}(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&]uh1jBhjmSubeh}(h]h ]h"]h$]h&]uh1j hjShMhjOubj!)}(h1``enable_hotjoin`` enable hot join event detect. h](j')}(h``enable_hotjoin``h]j-)}(hjSh]henable_hotjoin}(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.hhMhjSubjC)}(hhh]j)}(henable hot join event detect.h]henable hot join event detect.}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjShMhjSubah}(h]h ]h"]h$]h&]uh1jBhjSubeh}(h]h ]h"]h$]h&]uh1j hjShMhjOubj!)}(h3``disable_hotjoin`` disable hot join event detect. h](j')}(h``disable_hotjoin``h]j-)}(hjSh]hdisable_hotjoin}(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.hhMhjSubjC)}(hhh]j)}(hdisable hot join event detect.h]hdisable hot join event detect.}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjShMhjSubah}(h]h ]h"]h$]h&]uh1jBhjSubeh}(h]h ]h"]h$]h&]uh1j hjShMhjOubj!)}(h1``set_speed`` adjust I3C open drain mode timing. h](j')}(h ``set_speed``h]j-)}(hjTh]h set_speed}(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.hhMhjTubjC)}(hhh]j)}(h"adjust I3C open drain mode timing.h]h"adjust I3C open drain mode timing.}(hj8ThhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ThMhj5Tubah}(h]h ]h"]h$]h&]uh1jBhjTubeh}(h]h ]h"]h$]h&]uh1j hj4ThMhjOubj!)}(hS``set_dev_nack_retry`` configure device NACK retry count for the master controller.h](j')}(h``set_dev_nack_retry``h]j-)}(hjXTh]hset_dev_nack_retry}(hjZThhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjVTubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjRTubjC)}(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}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubh:}(hjUhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjUubj5)}(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; };}hj0Usbah}(h]h ]h"]h$]h&]hhuh1j5hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjUubj)}(h **Members**h]j)}(hjAUh]hMembers}(hjCUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?Uubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjUubj)}(hhh](j!)}(h4``dev`` device to be registered to the device-model h](j')}(h``dev``h]j-)}(hj`Uh]hdev}(hjbUhhhNhNubah}(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.hhMhjZUubjC)}(hhh]j)}(h+device to be registered to the device-modelh]h+device to be registered to the device-model}(hjyUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuUhMhjvUubah}(h]h ]h"]h$]h&]uh1jBhjZUubeh}(h]h ]h"]h$]h&]uh1j hjuUhMhjWUubj!)}(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]j-)}(hjUh]hthis}(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.hhMhjUubjC)}(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}(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&]uh1jBhjUubeh}(h]h ]h"]h$]h&]uh1j hjUhMhjWUubj!)}(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]j-)}(hjUh]hi2c}(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.hhMhjUubjC)}(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}(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&]uh1jBhjUubeh}(h]h ]h"]h$]h&]uh1j hjUhMhjWUubj!)}(hf``ops`` master operations. See :c:type:`struct i3c_master_controller_ops ` h](j')}(h``ops``h]j-)}(hj Vh]hops}(hjVhhhNhNubah}(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.hhMhjVubjC)}(hhh]j)}(h]master operations. See :c:type:`struct i3c_master_controller_ops `h](hmaster operations. See }(hj&VhhhNhNubh)}(hF:c:type:`struct i3c_master_controller_ops `h]j-)}(hj0Vh]h struct i3c_master_controller_ops}(hj2VhhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hj.Vubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjji3c_master_controller_opsuh1hhj"VhMhj&Vubeh}(h]h ]h"]h$]h&]uh1jhj"VhMhj#Vubah}(h]h ]h"]h$]h&]uh1jBhjVubeh}(h]h ]h"]h$]h&]uh1j hj"VhMhjWUubj!)}(h7``secondary`` true if the master is a secondary master h](j')}(h ``secondary``h]j-)}(hjeVh]h secondary}(hjgVhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjcVubah}(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_VubjC)}(hhh]j)}(h(true if the master is a secondary masterh]h(true if the master is a secondary master}(hj~VhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjzVhMhj{Vubah}(h]h ]h"]h$]h&]uh1jBhj_Vubeh}(h]h ]h"]h$]h&]uh1j hjzVhMhjWUubj!)}(h7``init_done`` true when the bus initialization is done h](j')}(h ``init_done``h]j-)}(hjVh]h init_done}(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.hhMhjVubjC)}(hhh]j)}(h(true when the bus initialization is doneh]h(true when the bus initialization is done}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVhMhjVubah}(h]h ]h"]h$]h&]uh1jBhjVubeh}(h]h ]h"]h$]h&]uh1j hjVhMhjWUubj!)}(h/``hotjoin`` true if the master support hotjoin h](j')}(h ``hotjoin``h]j-)}(hjVh]hhotjoin}(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.hhMhjVubjC)}(hhh]j)}(h"true if the master support hotjoinh]h"true if the master support hotjoin}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVhMhjVubah}(h]h ]h"]h$]h&]uh1jBhjVubeh}(h]h ]h"]h$]h&]uh1j hjVhMhjWUubj!)}(h+``rpm_allowed`` true if Runtime PM allowed h](j')}(h``rpm_allowed``h]j-)}(hjWh]h rpm_allowed}(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.hhMhj WubjC)}(hhh]j)}(htrue if Runtime PM allowedh]htrue if Runtime PM allowed}(hj)WhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%WhMhj&Wubah}(h]h ]h"]h$]h&]uh1jBhj Wubeh}(h]h ]h"]h$]h&]uh1j hj%WhMhjWUubj!)}(hM``rpm_ibi_allowed`` true if IBI and Hot-Join allowed while runtime suspended h](j')}(h``rpm_ibi_allowed``h]j-)}(hjIWh]hrpm_ibi_allowed}(hjKWhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjGWubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjCWubjC)}(hhh]j)}(h8true if IBI and Hot-Join allowed while runtime suspendedh]h8true if IBI and Hot-Join allowed while runtime suspended}(hjbWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^WhMhj_Wubah}(h]h ]h"]h$]h&]uh1jBhjCWubeh}(h]h ]h"]h$]h&]uh1j hj^WhMhjWUubj!)}(hO``boardinfo`` board-level information attached to devices connected on the bus h](j')}(h ``boardinfo``h]j-)}(hjWh]h boardinfo}(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.hhMhj|WubjC)}(hhh]j)}(h@board-level information attached to devices connected on the bush]h@board-level information attached to devices connected on the bus}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWhMhjWubah}(h]h ]h"]h$]h&]uh1jBhj|Wubeh}(h]h ]h"]h$]h&]uh1j hjWhMhjWUubj!)}(h1``boardinfo.i3c`` list of I3C boardinfo objects h](j')}(h``boardinfo.i3c``h]j-)}(hjWh]h boardinfo.i3c}(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.hhMhjWubjC)}(hhh]j)}(hlist of I3C boardinfo objectsh]hlist of I3C boardinfo objects}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWhMhjWubah}(h]h ]h"]h$]h&]uh1jBhjWubeh}(h]h ]h"]h$]h&]uh1j hjWhMhjWUubj!)}(h0``boardinfo.i2c`` list of I2C boardinfo objects h](j')}(h``boardinfo.i2c``h]j-)}(hjWh]h boardinfo.i2c}(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.hhMhjWubjC)}(hhh]j)}(hlist of I2C boardinfo objectsh]hlist of I2C boardinfo objects}(hj XhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj XhMhj Xubah}(h]h ]h"]h$]h&]uh1jBhjWubeh}(h]h ]h"]h$]h&]uh1j hj XhMhjWUubj!)}(h'``bus`` I3C bus exposed by this master h](j')}(h``bus``h]j-)}(hj-Xh]hbus}(hj/XhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj+Xubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj'XubjC)}(hhh]j)}(hI3C bus exposed by this masterh]hI3C bus exposed by this master}(hjFXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBXhMhjCXubah}(h]h ]h"]h$]h&]uh1jBhj'Xubeh}(h]h ]h"]h$]h&]uh1j hjBXhMhjWUubj!)}(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]j-)}(hjfXh]hwq}(hjhXhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjdXubah}(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`XubjC)}(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}(hjXhhhNhNubah}(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&]uh1jBhj`Xubeh}(h]h ]h"]h$]h&]uh1j hj{XhM hjWUubj!)}(h;``dev_nack_retry_count`` retry count when slave device nackh](j')}(h``dev_nack_retry_count``h]j-)}(hjXh]hdev_nack_retry_count}(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.hhM hjXubjC)}(hhh]j)}(h"retry count when slave device nackh]h"retry count when slave device nack}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM hjXubah}(h]h ]h"]h$]h&]uh1jBhjXubeh}(h]h ]h"]h$]h&]uh1j hjXhM hjWUubeh}(h]h ]h"]h$]h&]uh1jhjUubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hjXh]h Description}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.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 }(hjXhhhNhNubh)}(h>:c:type:`struct i3c_master_controller `h]j-)}(hjYh]hstruct i3c_master_controller}(hjYhhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjYubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjji3c_master_controlleruh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM hjXubhR has to be registered to the I3C subsystem through i3c_master_register(). None of }(hjXhhhNhNubh)}(h>:c:type:`struct i3c_master_controller `h]j-)}(hj'Yh]hstruct i3c_master_controller}(hj)YhhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hj%Yubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjji3c_master_controlleruh1hhj YhM hjXubhV fields should be set manually, just pass appropriate values to i3c_master_register().}(hjXhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj YhM 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)}(hjaYh]hi3c_bus_for_each_i2cdev}(hjkYhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjgYubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjcYhhhj/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_Yhhhj~YhM&ubah}(h]jZYah ](jjeh"]h$]h&]jj)jhuh1hhj~YhM&hj\Yhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj\Yhhhj~YhM&ubeh}(h]h ](jpmacroeh"]h$]h&]jjpjjYjjYjjjuh1hhhhhhNhNubj)}(h&``i3c_bus_for_each_i2cdev (bus, dev)``h]j-)}(hjYh]h"i3c_bus_for_each_i2cdev (bus, dev)}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjYubah}(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}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM&hjYubah}(h]h ]h"]h$]h&]uh1jYhjYhM&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)}(hjYh]h Parameters}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM*hjYubj)}(hhh](j!)}(h``bus`` the I3C bus h](j')}(h``bus``h]j-)}(hjYh]hbus}(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.hhM'hjYubjC)}(hhh]j)}(h the I3C bush]h the I3C bus}(hj ZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZhM'hj Zubah}(h]h ]h"]h$]h&]uh1jBhjYubeh}(h]h ]h"]h$]h&]uh1j hjZhM'hjYubj!)}(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]j-)}(hj,Zh]hdev}(hj.ZhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj*Zubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM)hj&ZubjC)}(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}(hjEZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM(hjBZubah}(h]h ]h"]h$]h&]uh1jBhj&Zubeh}(h]h ]h"]h$]h&]uh1j hjAZhM)hjYubeh}(h]h ]h"]h$]h&]uh1jhjYubj)}(h**Description**h]j)}(hjhZh]h Description}(hjjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfZubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM+hjYubj)}(h-Iterate over all I2C devs present on the bus.h]h-Iterate over all I2C devs present on the bus.}(hj~ZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM*hjYubeh}(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)}(hjZh]hi3c_bus_for_each_i3cdev}(hjZhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjZubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjZhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM1ubah}(h]h ]h"]h$]h&]hhjuh1hjjhjZhhhjZhM1ubah}(h]jZah ](jjeh"]h$]h&]jj)jhuh1hhjZhM1hjZhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjZhhhjZhM1ubeh}(h]h ](jpmacroeh"]h$]h&]jjpjjZjjZjjjuh1hhhhhhNhNubj)}(h&``i3c_bus_for_each_i3cdev (bus, dev)``h]j-)}(hjZh]h"i3c_bus_for_each_i3cdev (bus, dev)}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjZubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM3hhhhubjY)}(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}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM1hjZubah}(h]h ]h"]h$]h&]uh1jYhj [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)}(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.hhM5hj[ubj)}(hhh](j!)}(h``bus`` the I3C bus h](j')}(h``bus``h]j-)}(hj7[h]hbus}(hj9[hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj5[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.hhM2hj1[ubjC)}(hhh]j)}(h the I3C bush]h the I3C bus}(hjP[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjL[hM2hjM[ubah}(h]h ]h"]h$]h&]uh1jBhj1[ubeh}(h]h ]h"]h$]h&]uh1j hjL[hM2hj.[ubj!)}(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]j-)}(hjp[h]hdev}(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.hhM4hjj[ubjC)}(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&]uh1jBhjj[ubeh}(h]h ]h"]h$]h&]uh1j hj[hM4hj.[ubeh}(h]h ]h"]h$]h&]uh1jhj[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.hhM6hj[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.hhM5hj[ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h֌i3c_dma (C struct) c.i3c_dmahNtauh1hhhhhhNhNubh)}(hhh](h)}(hi3c_dmah]h)}(hstruct i3c_dmah](j:)}(hj=h]hstruct}(hj[hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj[hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM:ubh)}(h h]h }(hj[hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj[hhhj[hM:ubj)}(hi3c_dmah]j)}(hj[h]hi3c_dma}(hj\hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj \ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj[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}(hj3\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<hj0\hhubah}(h]h ]h"]h$]h&]uh1jhj[hhhj[hM:ubeh}(h]h ](jpstructeh"]h$]h&]jjpjjK\jjK\jjjuh1hhhhhhNhNubj)}(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}(hjW\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjS\ubh:}(hjS\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@hjO\ubj5)}(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; };}hjp\sbah}(h]h ]h"]h$]h&]hhuh1j5hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMBhjO\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.hhMLhjO\ubj)}(hhh](j!)}(h,``dev`` device object of a device doing DMA h](j')}(h``dev``h]j-)}(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\ubjC)}(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&]uh1jBhj\ubeh}(h]h ]h"]h$]h&]uh1j hj\hM>hj\ubj!)}(h*``buf`` destination/source buffer for DMA h](j')}(h``buf``h]j-)}(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\ubjC)}(hhh]j)}(h!destination/source buffer for DMAh]h!destination/source buffer for DMA}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\hM?hj\ubah}(h]h ]h"]h$]h&]uh1jBhj\ubeh}(h]h ]h"]h$]h&]uh1j hj\hM?hj\ubj!)}(h``len`` length of transfer h](j')}(h``len``h]j-)}(hj]h]hlen}(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 ]ubjC)}(hhh]j)}(hlength of transferh]hlength of transfer}(hj+]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj']hM@hj(]ubah}(h]h ]h"]h$]h&]uh1jBhj ]ubeh}(h]h ]h"]h$]h&]uh1j hj']hM@hj\ubj!)}(h"``map_len`` length of DMA mapping h](j')}(h ``map_len``h]j-)}(hjK]h]hmap_len}(hjM]hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjI]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.hhMAhjE]ubjC)}(hhh]j)}(hlength of DMA mappingh]hlength of DMA mapping}(hjd]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`]hMAhja]ubah}(h]h ]h"]h$]h&]uh1jBhjE]ubeh}(h]h ]h"]h$]h&]uh1j hj`]hMAhj\ubj!)}(h9``addr`` mapped DMA address for a Host Controller Driver h](j')}(h``addr``h]j-)}(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~]ubjC)}(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&]uh1jBhj~]ubeh}(h]h ]h"]h$]h&]uh1j hj]hMBhj\ubj!)}(h``dir`` DMA direction h](j')}(h``dir``h]j-)}(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]ubjC)}(hhh]j)}(h DMA directionh]h DMA direction}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj]hMChj]ubah}(h]h ]h"]h$]h&]uh1jBhj]ubeh}(h]h ]h"]h$]h&]uh1j hj]hMChj\ubj!)}(hF``bounce_buf`` an allocated bounce buffer if transfer needs it or NULLh](j')}(h``bounce_buf``h]j-)}(hj]h]h bounce_buf}(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]ubjC)}(hhh]j)}(h7an allocated bounce buffer if transfer needs it or NULLh]h7an allocated bounce buffer if transfer needs it or NULL}(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.hhMDhj ^ubah}(h]h ]h"]h$]h&]uh1jBhj]ubeh}(h]h ]h"]h$]h&]uh1j hj ^hMChj\ubeh}(h]h ]h"]h$]h&]uh1jhjO\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](h)}(hvoidh]hvoid}(hjP^hhhNhNubah}(h]h ]hah"]h$]h&]uh1hhjL^hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMtubh)}(h h]h }(hj_^hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjL^hhhj^^hMtubj)}(hjh]h*}(hjm^hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjL^hhhj^^hMtubj)}(hi3c_dev_get_master_datah]j)}(hi3c_dev_get_master_datah]hi3c_dev_get_master_data}(hj~^hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjz^ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjL^hhhj^^hMtubj.)}(h (const struct i3c_dev_desc *dev)h]j4)}(hconst struct i3c_dev_desc *devh](j:)}(hj"h]hconst}(hj^hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj^ubh)}(h h]h }(hj^hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj^ubj:)}(hj=h]hstruct}(hj^hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj^ubh)}(h h]h }(hj^hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj^ubh)}(hhh]j)}(h i3c_dev_desch]h i3c_dev_desc}(hj^hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetj^modnameN classnameNjvjy)}j|]j)}jrj^sbc.i3c_dev_get_master_dataasbuh1hhj^ubh)}(h h]h }(hj^hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj^ubj)}(hjh]h*}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^ubj)}(hdevh]hdev}(hj_hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj^ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj^ubah}(h]h ]h"]h$]h&]hhuh1j-hjL^hhhj^^hMtubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjH^hhhj^^hMtubah}(h]jC^ah ](jjeh"]h$]h&]jj)jhuh1hhj^^hMthjE^hhubj)}(hhh]j)}(hahhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj:aubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj6aubjC)}(hhh]j)}(h3the I3C device descriptor to attach private data toh]h3the I3C device descriptor to attach private data to}(hjUahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQahMhjRaubah}(h]h ]h"]h$]h&]uh1jBhj6aubeh}(h]h ]h"]h$]h&]uh1j hjQahMhj3aubj!)}(h``void *data`` private data h](j')}(h``void *data``h]j-)}(hjuah]h void *data}(hjwahhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjsaubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjoaubjC)}(hhh]j)}(h private datah]h private data}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjahMhjaubah}(h]h ]h"]h$]h&]uh1jBhjoaubeh}(h]h ]h"]h$]h&]uh1j hjahMhj3aubeh}(h]h ]h"]h$]h&]uh1jhjaubj)}(h**Description**h]j)}(hjah]h Description}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjaubj)}(hThis functions allows a master controller to attach per-device private data which can then be retrieved with i3c_dev_get_master_data().h]hThis functions allows a master controller to attach per-device private data which can then be retrieved with i3c_dev_get_master_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.hhMhjaubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h֌$i2c_dev_get_master_data (C function)c.i2c_dev_get_master_datahNtauh1hhhhhhNhNubh)}(hhh](h)}(h?void * i2c_dev_get_master_data (const struct i2c_dev_desc *dev)h]h)}(h=void *i2c_dev_get_master_data(const struct i2c_dev_desc *dev)h](h)}(hvoidh]hvoid}(hjahhhNhNubah}(h]h ]hah"]h$]h&]uh1hhjahhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMubh)}(h h]h }(hjbhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjahhhjbhMubj)}(hjh]h*}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjahhhjbhMubj)}(hi2c_dev_get_master_datah]j)}(hi2c_dev_get_master_datah]hi2c_dev_get_master_data}(hj#bhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjbubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjahhhjbhMubj.)}(h (const struct i2c_dev_desc *dev)h]j4)}(hconst struct i2c_dev_desc *devh](j:)}(hj"h]hconst}(hj?bhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj;bubh)}(h h]h }(hjLbhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj;bubj:)}(hj=h]hstruct}(hjZbhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj;bubh)}(h h]h }(hjgbhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj;bubh)}(hhh]j)}(h i2c_dev_desch]h i2c_dev_desc}(hjxbhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjububah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetjzbmodnameN classnameNjvjy)}j|]j)}jrj%bsbc.i2c_dev_get_master_dataasbuh1hhj;bubh)}(h h]h }(hjbhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj;bubj)}(hjh]h*}(hjbhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj;bubj)}(hdevh]hdev}(hjbhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj;bubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj7bubah}(h]h ]h"]h$]h&]hhuh1j-hjahhhjbhMubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjahhhjbhMubah}(h]jaah ](jjeh"]h$]h&]jj)jhuh1hhjbhMhjahhubj)}(hhh]j)}(h