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.chMlubh)}(h h]h }(hj^hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjKhhhj]hMlubj)}(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]hMlubj.)}(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]hMlubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjGhhhj]hMlubah}(h]jBah ](jjeh"]h$]h&]jj)jhuh1hhj]hMlhjDhhubj)}(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.chMlhjThhubah}(h]h ]h"]h$]h&]uh1jhjDhhhj]hMlubeh}(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.chMphjsubj)}(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.chMmhjubjC)}(hhh]j)}(hI3C master objecth]hI3C master object}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMmhjubah}(h]h ]h"]h$]h&]uh1jBhjubeh}(h]h ]h"]h$]h&]uh1j hjhMmhjubj!)}(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.chMnhjubjC)}(hhh]j)}(hwhere to start searchingh]hwhere to start searching}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMnhjubah}(h]h ]h"]h$]h&]uh1jBhjubeh}(h]h ]h"]h$]h&]uh1j hjhMnhjubeh}(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.chMphjsubj)}(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.chMohjsubj)}(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.chMqhjsubj)}(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.chMrhjsubeh}(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.chMhjf 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.chMhjf 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.chMubh)}(h h]h }(hj_ hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjL hhhj^ hMubj)}(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^ hMubj.)}(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^ hMubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjH hhhj^ hMubah}(h]jC ah ](jjeh"]h$]h&]jj)jhuh1hhj^ hMhjE 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.chMhj hhubah}(h]h ]h"]h$]h&]uh1jhjE hhhj^ hMubeh}(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.chMhj 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 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.chMhj 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/ hMhj0 ubah}(h]h ]h"]h$]h&]uh1jBhj ubeh}(h]h ]h"]h$]h&]uh1j hj/ hMhj 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.chMhj[ ubjC)}(hhh]j)}(hevents to disableh]hevents to disable}(hjz hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjv hMhjw ubah}(h]h ]h"]h$]h&]uh1jBhj[ ubeh}(h]h ]h"]h$]h&]uh1j hjv hMhj 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.chMhj 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.chMhj ubj)}(hBThis function must be called with the bus lock held in write mode.h]hBThis function must be called with the bus lock held in write mode.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj ubj)}(h **Return**h]j)}(hj h]hReturn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj ubj)}(h0 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.chMhj 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.chMubh)}(h h]h }(hjJhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj7hhhjIhMubj)}(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&]hhuh1jhj7hhhjIhMubj.)}(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-hj7hhhjIhMubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj3hhhjIhMubah}(h]j.ah ](jjeh"]h$]h&]jj)jhuh1hhjIhMhj0hhubj)}(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.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhj0hhhjIhMubeh}(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.chMhjubj)}(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.chMhjubjC)}(hhh]j)}(h%master used to send frames on the bush]h%master used to send frames on the bus}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jBhjubeh}(h]h ]h"]h$]h&]uh1j hjhMhjubj!)}(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.chMhjubjC)}(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&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jBhjubeh}(h]h ]h"]h$]h&]uh1j hjhMhjubj!)}(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.chMhjFubjC)}(hhh]j)}(hevents to disableh]hevents to disable}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjahMhjbubah}(h]h ]h"]h$]h&]uh1jBhjFubeh}(h]h ]h"]h$]h&]uh1j hjahMhjubeh}(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.chMhjubj)}(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.chMhjubj)}(hBThis function must be called with the bus lock held in write mode.h]hBThis function must be called with the bus lock held in write mode.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjubj)}(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 hjubj)}(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.chM hjubeh}(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.chMubh)}(h h]h }(hj5hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj"hhhj4hMubj)}(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"hhhj4hMubj.)}(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"hhhj4hMubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjhhhj4hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhj4hMhjhhubj)}(hhh]j)}(hsend a DEFSLVS CCC commandh]hsend a DEFSLVS CCC command}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj4hMubeh}(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.chMhjubj)}(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<hMhjubah}(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.chMhjubj)}(hSend a DEFSLVS CCC command containing all the devices known to the **master**. This is useful when you have secondary masters on the bus to propagate device information.h](hCSend a DEFSLVS CCC command containing all the devices known to the }(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.chMhjubj)}(hXWThis should be called after all I3C devices have been discovered (in other words, after the DAA procedure has finished) and instantiated in :c:type:`i3c_master_controller_ops->bus_init\(\) `. It should also be called if a master ACKed an Hot-Join request and assigned a dynamic address to the device joining the bus.h](hThis should be called after all I3C devices have been discovered (in other words, after the DAA procedure has finished) and instantiated in }(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.chMhjubh~. It should also be called if a master ACKed an Hot-Join request and assigned a dynamic address to the device joining the bus.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(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.chM#hjubj)}(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%hjubj)}(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.chM&hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h֌i3c_master_do_daa (C function)c.i3c_master_do_daahNtauh1hhhhhhNhNubh)}(hhh](h)}(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}(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)}(hmaster doing the DAAh]hmaster doing the DAA}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=hMhj>ubah}(h]h ]h"]h$]h&]uh1jBhj"ubeh}(h]h ]h"]h$]h&]uh1j hj=hMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h**Description**h]j)}(hjch]h Description}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjaubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubj)}(hThis function is instantiating an I3C device object and adding it to the I3C device list. All device information are automatically retrieved using standard CCC commands.h]hThis function is instantiating an I3C device object and adding it to the I3C device list. All device information are automatically retrieved using standard CCC commands.}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubj)}(hxThe I3C device object is returned in case the master wants to attach private data to it using i3c_dev_set_master_data().h]hxThe I3C device object is returned in case the master wants to attach private data to it using i3c_dev_set_master_data().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubj)}(hBThis function must be called with the bus lock held in write mode.h]hBThis function must be called with the bus lock held in write mode.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubj)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubj)}(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.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h֌&i3c_master_dma_map_single (C function)c.i3c_master_dma_map_singlehNtauh1hhhhhhNhNubh)}(hhh](h)}(hstruct i3c_dma * i3c_master_dma_map_single (struct device *dev, void *buf, size_t len, bool force_bounce, enum dma_data_direction dir)h]h)}(hstruct i3c_dma *i3c_master_dma_map_single(struct device *dev, void *buf, size_t len, bool force_bounce, enum dma_data_direction dir)h](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.chMubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjhhhjhMubh)}(hhh]j)}(hi3c_dmah]hi3c_dma}(hj hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetjmodnameN classnameNjvjy)}j|]j)}jri3c_master_dma_map_singlesbc.i3c_master_dma_map_singleasbuh1hhjhhhjhMubh)}(h h]h }(hj-hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjhhhjhMubj)}(hjh]h*}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj)}(hi3c_master_dma_map_singleh]j)}(hj*h]hi3c_master_dma_map_single}(hjLhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjHubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjhhhjhMubj.)}(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}(hjghhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjcubh)}(h h]h }(hjthhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjcubh)}(hhh]j)}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetjmodnameN classnameNjvjy)}j|]j(c.i3c_master_dma_map_singleasbuh1hhjcubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjcubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjcubj)}(hdevh]hdev}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj_ubj4)}(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*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hbufh]hbuf}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj_ubj4)}(h size_t lenh](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetjmodnameN classnameNjvjy)}j|]j(c.i3c_master_dma_map_singleasbuh1hhjubh)}(h h]h }(hj:hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjubj)}(hlenh]hlen}(hjHhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj_ubj4)}(hbool force_bounceh](h)}(hboolh]hbool}(hjahhhNhNubah}(h]h ]hah"]h$]h&]uh1hhj]ubh)}(h h]h }(hjohhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj]ubj)}(h force_bounceh]h force_bounce}(hj}hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj]ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj_ubj4)}(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|]j(c.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&]noemphhhuh1j3hj_ubeh}(h]h ]h"]h$]h&]hhuh1j-hjhhhjhMubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhMhjhhubj)}(hhh]j)}(h"Map buffer for single DMA transferh]h"Map buffer for single DMA transfer}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](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)}(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!)}(h;``struct device *dev`` device object of a device doing DMA h](j')}(h``struct device *dev``h]j-)}(hjLh]hstruct device *dev}(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.chMhjFubjC)}(hhh]j)}(h#device object of a device doing DMAh]h#device object of a device doing DMA}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1jhjahMhjbubah}(h]h ]h"]h$]h&]uh1jBhjFubeh}(h]h ]h"]h$]h&]uh1j hjahMhjCubj!)}(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.chMhjubjC)}(hhh]j)}(h!destination/source buffer for DMAh]h!destination/source buffer for DMA}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jBhjubeh}(h]h ]h"]h$]h&]uh1j hjhMhjCubj!)}(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.chMhjubjC)}(hhh]j)}(hlength of transferh]hlength of transfer}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jBhjubeh}(h]h ]h"]h$]h&]uh1j hjhMhjCubj!)}(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,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)}(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}(hjhhhNhNubah}(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&]uh1jBhjubeh}(h]h ]h"]h$]h&]uh1j hj hMhjCubj!)}(h.``enum dma_data_direction dir`` DMA direction h](j')}(h``enum dma_data_direction dir``h]j-)}(hj1h]henum dma_data_direction dir}(hj3hhhNhNubah}(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 DMA directionh]h DMA direction}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFhMhjGubah}(h]h ]h"]h$]h&]uh1jBhj+ubeh}(h]h ]h"]h$]h&]uh1j hjFhMhjCubeh}(h]h ]h"]h$]h&]uh1jhj'ubj)}(h**Description**h]j)}(hjlh]h Description}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj'ubj)}(hGMap buffer for a DMA transfer and allocate a bounce buffer if required.h]hGMap buffer for a DMA transfer and allocate a bounce buffer if required.}(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.chMhj'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.chMhj'ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h֌(i3c_master_dma_unmap_single (C function)c.i3c_master_dma_unmap_singlehNtauh1hhhhhhNhNubh)}(hhh](h)}(h;void i3c_master_dma_unmap_single (struct i3c_dma *dma_xfer)h]h)}(h:void i3c_master_dma_unmap_single(struct i3c_dma *dma_xfer)h](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.chMubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjhhhjhMubj)}(hi3c_master_dma_unmap_singleh]j)}(hi3c_master_dma_unmap_singleh]hi3c_master_dma_unmap_single}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjhhhjhMubj.)}(h(struct i3c_dma *dma_xfer)h]j4)}(hstruct i3c_dma *dma_xferh](j:)}(hj=h]hstruct}(hjhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjubh)}(h h]h }(hj"hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjubh)}(hhh]j)}(hi3c_dmah]hi3c_dma}(hj3hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetj5modnameN classnameNjvjy)}j|]j)}jrjsbc.i3c_master_dma_unmap_singleasbuh1hhjubh)}(h h]h }(hjShhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjubj)}(hjh]h*}(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdma_xferh]hdma_xfer}(hjnhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj ubah}(h]h ]h"]h$]h&]hhuh1j-hjhhhjhMubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhMhjhhubj)}(hhh]j)}(hUnmap buffer after DMAh]hUnmap buffer after DMA}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(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.chMhjubj)}(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.chMhjubjC)}(hhh]j)}(h#DMA transfer and mapping descriptorh]h#DMA transfer and mapping descriptor}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jBhjubeh}(h]h ]h"]h$]h&]uh1j hjhMhjubah}(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.chMhjubj)}(h1Unmap buffer and cleanup DMA transfer descriptor.h]h1Unmap buffer and cleanup DMA transfer descriptor.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h֌ i3c_master_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}(hjYhhhNhNubah}(h]h ]hah"]h$]h&]uh1hhjUhhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM ubh)}(h h]h }(hjhhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjUhhhjghM ubj)}(hi3c_master_set_infoh]j)}(hi3c_master_set_infoh]hi3c_master_set_info}(hjzhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjvubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjUhhhjghM ubj.)}(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)}jrj|sbc.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}(hjhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjubj:)}(hj=h]hstruct}(hj$hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjubh)}(h h]h }(hj1hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjubh)}(hhh]j)}(hi3c_device_infoh]hi3c_device_info}(hjBhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetjDmodnameN classnameNjvjy)}j|]jc.i3c_master_set_infoasbuh1hhjubh)}(h h]h }(hj`hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjubj)}(hjh]h*}(hjnhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hinfoh]hinfo}(hj{hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hjubeh}(h]h ]h"]h$]h&]hhuh1j-hjUhhhjghM ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjQhhhjghM ubah}(h]jLah ](jjeh"]h$]h&]jj)jhuh1hhjghM hjNhhubj)}(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.chM hjhhubah}(h]h ]h"]h$]h&]uh1jhjNhhhjghM ubeh}(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.chMhjubj)}(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.chMhjubjC)}(hhh]j)}(h%master used to send frames on the bush]h%master used to send frames on the bus}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jBhjubeh}(h]h ]h"]h$]h&]uh1j hjhMhjubj!)}(h>``const struct i3c_device_info *info`` I3C device information h](j')}(h&``const struct i3c_device_info *info``h]j-)}(hjh]h"const struct i3c_device_info *info}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjubah}(h]h ]h"]h$]h&]uh1j&hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubjC)}(hhh]j)}(hI3C device informationh]hI3C device information}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4hMhj5ubah}(h]h ]h"]h$]h&]uh1jBhjubeh}(h]h ]h"]h$]h&]uh1j hj4hMhjubeh}(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.chMhjubj)}(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 }(hjphhhNhNubh)}(hM:c:type:`i3c_master_controller_ops->bus_init\(\) `h]j-)}(hjzh]h%i3c_master_controller_ops->bus_init()}(hj|hhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjxubah}(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.chMhjpubh.}(hjphhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubj)}(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.chMhjubhd fields are meaningful for a master device. Here is a list of fields that should be properly filled:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubh 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.chMhjubah}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h0:c:type:`i3c_device_info->bcr `h]j)}(hjh]h)}(hjh]j-)}(hjh]hi3c_device_info->bcr}(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&]uh1jhj2hMhj ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h0:c:type:`i3c_device_info->dcr `h]j)}(hjAh]h)}(hjAh]j-)}(hjAh]hi3c_device_info->dcr}(hjIhhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjFubah}(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.chMhjCubah}(h]h ]h"]h$]h&]uh1jhjdhMhj?ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h0:c:type:`i3c_device_info->pid `h]j)}(hjsh]h)}(hjsh]j-)}(hjsh]hi3c_device_info->pid}(hj{hhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjxubah}(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.chMhjuubah}(h]h ]h"]h$]h&]uh1jhjhMhjqubah}(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-uh1jhjhMhjubj)}(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.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubj)}(h **Return**h]j)}(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 }(hj;hhhNhNubj)}(h**info**h]hinfo}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubhj contains valid information (not every piece of information can be checked, but we can at least make sure }(hj;hhhNhNubj)}(h**info->dyn_addr**h]hinfo->dyn_addr}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubh and }(hj;hhhNhNubj)}(h **info->bcr**h]h info->bcr}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubh! are correct), -EINVAL otherwise.}(hj;hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjubeh}(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}(hjhhhNhNubah}(h]h ]hah"]h$]h&]uh1hhjhhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMdubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjhhhjhMdubj)}(hi3c_master_bus_inith]j)}(hi3c_master_bus_inith]hi3c_master_bus_init}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjhhhjhMdubj.)}(h&(struct i3c_master_controller *master)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_bus_initasbuh1hhjubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjubj)}(hjh]h*}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hmasterh]hmaster}(hj6hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hjubah}(h]h ]h"]h$]h&]hhuh1j-hjhhhjhMdubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjhhhjhMdubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhMdhjhhubj)}(hhh]j)}(hinitialize an I3C bush]hinitialize an I3C bus}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMdhj]hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMdubeh}(h]h ](jpfunctioneh"]h$]h&]jjpjjxjjxjjjuh1hhhhhhNhNubj)}(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)}(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.chMhhj|ubj)}(hhh]j!)}(hJ``struct i3c_master_controller *master`` main master initializing 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.chMehjubjC)}(hhh]j)}(h main master initializing the bush]h main master initializing the bus}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMehjubah}(h]h ]h"]h$]h&]uh1jBhjubeh}(h]h ]h"]h$]h&]uh1j hjhMehjubah}(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.chMghj|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:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMfhj|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.chMihj 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-)}(hj- h]h%i3c_master_controller_ops->bus_init()}(hj/ hhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hj+ 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.chMlhj# 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&]uh1jhjJ hMlhj 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)}(hj_ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMphj[ ubah}(h]h ]h"]h$]h&]uh1jhj ubj)}(hDisable all slave events. h]j)}(hDisable all slave events.h]hDisable all slave events.}(hjx hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMthjt 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.chMvhj 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.chM{hj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]enumtypearabicprefixhsuffix.uh1j hj|ubj)}(hhjD"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-)}(hji"h]h$struct i3c_master_controller *master}(hjk"hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjg"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;hjc"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~"hM;hj"ubah}(h]h ]h"]h$]h&]uh1jBhjc"ubeh}(h]h ]h"]h$]h&]uh1j hj~"hM;hj`"ubj!)}(h=``u8 addr`` I3C slave dynamic address assigned to the device 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.chM<hj"ubjC)}(hhh]j)}(h0I3C slave dynamic address assigned to the deviceh]h0I3C slave dynamic address assigned to the device}(hj"hhhNhNubah}(h]h ]h"]h$]h&]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&]uh1jhjD"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>hjD"ubj)}(hThis function is instantiating an I3C device object and adding it to the I3C device list. All device information are automatically retrieved using standard CCC commands.h]hThis function is instantiating an I3C device object and adding it to the I3C device list. All device information are automatically retrieved using standard CCC commands.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM=hjD"ubj)}(hxThe I3C device object is returned in case the master wants to attach private data to it using i3c_dev_set_master_data().h]hxThe I3C device object is returned in case the master wants to attach private data to it using i3c_dev_set_master_data().}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMAhjD"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.chMDhjD"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.chMFhjD"ubj)}(h9a 0 in case of success, an negative error code otherwise.h]h9a 0 in case of success, an negative error code otherwise.}(hj8#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMGhjD"ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h֌!i3c_master_queue_ibi (C function)c.i3c_master_queue_ibihNtauh1hhhhhhNhNubh)}(hhh](h)}(hOvoid i3c_master_queue_ibi (struct i3c_dev_desc *dev, struct i3c_ibi_slot *slot)h]h)}(hNvoid i3c_master_queue_ibi(struct i3c_dev_desc *dev, struct i3c_ibi_slot *slot)h](h)}(hvoidh]hvoid}(hjg#hhhNhNubah}(h]h ]hah"]h$]h&]uh1hhjc#hhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM? ubh)}(h h]h }(hjv#hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjc#hhhju#hM? ubj)}(hi3c_master_queue_ibih]j)}(hi3c_master_queue_ibih]hi3c_master_queue_ibi}(hj#hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj#ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjc#hhhju#hM? ubj.)}(h5(struct i3c_dev_desc *dev, struct i3c_ibi_slot *slot)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|]j)}jrj#sbc.i3c_master_queue_ibiasbuh1hhj#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)}(hstruct i3c_ibi_slot *sloth](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_ibi_sloth]h i3c_ibi_slot}(hj4$hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj1$ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetj6$modnameN classnameNjvjy)}j|]j#c.i3c_master_queue_ibiasbuh1hhj$ubh)}(h h]h }(hjR$hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj$ubj)}(hjh]h*}(hj`$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj)}(hsloth]hslot}(hjm$hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj#ubeh}(h]h ]h"]h$]h&]hhuh1j-hjc#hhhju#hM? ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj_#hhhju#hM? ubah}(h]jZ#ah ](jjeh"]h$]h&]jj)jhuh1hhju#hM? hj\#hhubj)}(hhh]j)}(h Queue an IBIh]h Queue an IBI}(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\#hhhju#hM? ubeh}(h]h ](jpfunctioneh"]h$]h&]jjpjj$jj$jjjuh1hhhhhhNhNubj)}(hX"**Parameters** ``struct i3c_dev_desc *dev`` the device this IBI is coming from ``struct i3c_ibi_slot *slot`` the IBI slot used to store the payload **Description** Queue an IBI to the controller workqueue. The IBI handler attached to the dev will be called from a workqueue context.h](j)}(h**Parameters**h]j)}(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.chMC hj$ubj)}(hhh](j!)}(h@``struct i3c_dev_desc *dev`` the device this IBI is coming from 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 IBI is coming fromh]h"the device this IBI is coming from}(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!)}(hE``struct i3c_ibi_slot *slot`` the IBI slot used to store the payload h](j')}(h``struct i3c_ibi_slot *slot``h]j-)}(hj%h]hstruct i3c_ibi_slot *slot}(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.chMA hj %ubjC)}(hhh]j)}(h&the IBI slot used to store the payloadh]h&the IBI slot used to store the payload}(hj*%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&%hMA hj'%ubah}(h]h ]h"]h$]h&]uh1jBhj %ubeh}(h]h ]h"]h$]h&]uh1j hj&%hMA hj$ubeh}(h]h ]h"]h$]h&]uh1jhj$ubj)}(h**Description**h]j)}(hjL%h]h Description}(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.chMC 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.}(hjb%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMB 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.chMy ubh)}(h h]h }(hj%hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj%hhhj%hMy 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%hMy 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*}(hj&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%hMy ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj%hhhj%hMy ubah}(h]j%ah ](jjeh"]h$]h&]jj)jhuh1hhj%hMy hj%hhubj)}(hhh]j)}(hFree a generic IBI poolh]hFree a generic IBI pool}(hjQ&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMy hjN&hhubah}(h]h ]h"]h$]h&]uh1jhj%hhhj%hMy ubeh}(h]h ](jpfunctioneh"]h$]h&]jjpjji&jji&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)}(hjs&h]h Parameters}(hju&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjq&ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM} hjm&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.chMz hj&ubjC)}(hhh]j)}(hthe IBI pool to freeh]hthe IBI pool to free}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&hMz hj&ubah}(h]h ]h"]h$]h&]uh1jBhj&ubeh}(h]h ]h"]h$]h&]uh1j hj&hMz hj&ubah}(h]h ]h"]h$]h&]uh1jhjm&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| hjm&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{ hjm&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 }(hj 'hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj'hhhj'hM ubh)}(hhh]j)}(hi3c_generic_ibi_poolh]hi3c_generic_ibi_pool}(hj1'hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj.'ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetj3'modnameN classnameNjvjy)}j|]j)}jri3c_generic_ibi_alloc_poolsbc.i3c_generic_ibi_alloc_poolasbuh1hhj'hhhj'hM ubh)}(h h]h }(hjR'hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj'hhhj'hM ubj)}(hjh]h*}(hj`'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'hhhj'hM ubj)}(hi3c_generic_ibi_alloc_poolh]j)}(hjO'h]hi3c_generic_ibi_alloc_pool}(hjq'hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjm'ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj'hhhj'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|]jM'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}(hj5(hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj2(ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetj7(modnameN classnameNjvjy)}j|]jM'c.i3c_generic_ibi_alloc_poolasbuh1hhj'ubh)}(h h]h }(hjS(hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj'ubj)}(hjh]h*}(hja(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubj)}(hreqh]hreq}(hjn(hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj'ubeh}(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)}(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'hhhj'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}(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(ubeh}(h]h ]h"]h$]h&]uh1jhj(ubj)}(h**Description**h]j)}(hjM)h]h Description}(hjO)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjK)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 }(hjc)hhhNhNubj)}(h**req**h]hreq}(hjk)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjc)ubh.}(hjc)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)}(hrecycle_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.chM 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-)}(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)}(h"the pool to return the IBI slot toh]h"the pool to return the IBI slot to}(hj8-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4-hM hj5-ubah}(h]h ]h"]h$]h&]uh1jBhj-ubeh}(h]h ]h"]h$]h&]uh1j hj4-hM hj-ubj!)}(h/``struct i3c_ibi_slot *s`` IBI slot to recycle h](j')}(h``struct i3c_ibi_slot *s``h]j-)}(hjX-h]hstruct i3c_ibi_slot *s}(hjZ-hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjV-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 hjR-ubjC)}(hhh]j)}(hIBI slot to recycleh]hIBI slot to recycle}(hjq-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjm-hM hjn-ubah}(h]h ]h"]h$]h&]uh1jBhjR-ubeh}(h]h ]h"]h$]h&]uh1j hjm-hM 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.chM 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.chM 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}(hj-hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj-ubah}(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.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}(hj3.hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj0.ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetj5.modnameN classnameNjvjy)}j|]j)}jrj-sbc.i3c_master_registerasbuh1hhj.ubh)}(h h]h }(hjS.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 .ubj4)}(hstruct device *parenth](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)}(hdeviceh]hdevice}(hj.hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetj.modnameN classnameNjvjy)}j|]jO.c.i3c_master_registerasbuh1hhj.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)}(hparenth]hparent}(hj.hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj .ubj4)}(h+const struct i3c_master_controller_ops *opsh](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)}(hi3c_master_controller_opsh]hi3c_master_controller_ops}(hj0/hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj-/ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetj2/modnameN classnameNjvjy)}j|]jO.c.i3c_master_registerasbuh1hhj.ubh)}(h h]h }(hjN/hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj.ubj)}(hjh]h*}(hj\/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj.ubj)}(hopsh]hops}(hji/hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj.ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj .ubj4)}(hbool secondaryh](h)}(hjch]hbool}(hj/hhhNhNubah}(h]h ]hah"]h$]h&]uh1hhj~/ubh)}(h h]h }(hj/hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj~/ubj)}(h secondaryh]h secondary}(hj/hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj~/ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj .ubeh}(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}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj/hhubah}(h]h ]h"]h$]h&]uh1jhj-hhhj-hM ubeh}(h]h ](jpfunctioneh"]h$]h&]jjpjj/jj/jjjuh1hhhhhhNhNubj)}(hX2**Parameters** ``struct i3c_master_controller *master`` master used to send frames on the bus ``struct device *parent`` the parent device (the one that provides this I3C master controller) ``const struct i3c_master_controller_ops *ops`` the master controller operations ``bool secondary`` true if you are registering a secondary master. Will return -EOPNOTSUPP if set to true since secondary masters are not yet supported **Description** This function takes care of everything for you: - creates and initializes the I3C bus - populates the bus with static I2C devs if **parent->of_node** is not NULL - registers all I3C devices added by the controller during bus initialization - registers the I2C adapter and all I2C devices **Return** 0 in case of success, a negative error code otherwise.h](j)}(h**Parameters**h]j)}(hj/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-)}(hj0h]h$struct i3c_master_controller *master}(hj 0hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj0ubah}(h]h ]h"]h$]h&]uh1j&hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj0ubjC)}(hhh]j)}(h%master used to send frames on the bush]h%master used to send frames on the bus}(hj!0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0hM hj0ubah}(h]h ]h"]h$]h&]uh1jBhj0ubeh}(h]h ]h"]h$]h&]uh1j hj0hM hj/ubj!)}(h_``struct device *parent`` the parent device (the one that provides this I3C master controller) h](j')}(h``struct device *parent``h]j-)}(hjA0h]hstruct device *parent}(hjC0hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj?0ubah}(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;0ubjC)}(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)}(hjZ0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjW0ubah}(h]h ]h"]h$]h&]uh1jBhj;0ubeh}(h]h ]h"]h$]h&]uh1j hjV0hM hj/ubj!)}(hQ``const struct i3c_master_controller_ops *ops`` the master controller operations h](j')}(h/``const struct i3c_master_controller_ops *ops``h]j-)}(hj{0h]h+const struct i3c_master_controller_ops *ops}(hj}0hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjy0ubah}(h]h ]h"]h$]h&]uh1j&hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hju0ubjC)}(hhh]j)}(h the master controller operationsh]h the master controller operations}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0hM hj0ubah}(h]h ]h"]h$]h&]uh1jBhju0ubeh}(h]h ]h"]h$]h&]uh1j hj0hM hj/ubj!)}(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-)}(hj0h]hbool secondary}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj0ubah}(h]h ]h"]h$]h&]uh1j&hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj0ubjC)}(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}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj0ubah}(h]h ]h"]h$]h&]uh1jBhj0ubeh}(h]h ]h"]h$]h&]uh1j hj0hM hj/ubeh}(h]h ]h"]h$]h&]uh1jhj/ubj)}(h**Description**h]j)}(hj0h]h Description}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj/ubj)}(h/This function takes care of everything for you:h]h/This function takes care of everything for you:}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj/ubj)}(hhh](j)}(h#creates and initializes the I3C bush]j)}(hj1h]h#creates and initializes the I3C bus}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj1ubah}(h]h ]h"]h$]h&]uh1jhj1ubj)}(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 }(hj41hhhNhNubj)}(h**parent->of_node**h]hparent->of_node}(hj<1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj41ubh is not NULL}(hj41hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj01ubah}(h]h ]h"]h$]h&]uh1jhj1ubj)}(hKregisters all I3C devices added by the controller during bus initializationh]j)}(hKregisters all I3C devices added by the controller during bus initializationh]hKregisters all I3C devices added by the controller during bus initialization}(hj_1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM" hj[1ubah}(h]h ]h"]h$]h&]uh1jhj1ubj)}(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}(hjx1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM$ hjt1ubah}(h]h ]h"]h$]h&]uh1jhj1ubeh}(h]h ]h"]h$]h&]jjuh1jhj)1hM hj/ubj)}(h **Return**h]j)}(hj1h]hReturn}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM& hj/ubj)}(h60 in case of success, a negative error code otherwise.h]h60 in case of success, a negative error code otherwise.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM' hj/ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h֌"i3c_master_unregister (C function)c.i3c_master_unregisterhNtauh1hhhhhhNhNubh)}(hhh](h)}(hAvoid i3c_master_unregister (struct i3c_master_controller *master)h]h)}(h@void i3c_master_unregister(struct i3c_master_controller *master)h](h)}(hvoidh]hvoid}(hj1hhhNhNubah}(h]h ]hah"]h$]h&]uh1hhj1hhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM ubh)}(h h]h }(hj1hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj1hhhj1hM ubj)}(hi3c_master_unregisterh]j)}(hi3c_master_unregisterh]hi3c_master_unregister}(hj1hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj1ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj1hhhj1hM ubj.)}(h&(struct i3c_master_controller *master)h]j4)}(h$struct i3c_master_controller *masterh](j:)}(hj=h]hstruct}(hj2hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj2ubh)}(h h]h }(hj$2hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj2ubh)}(hhh]j)}(hi3c_master_controllerh]hi3c_master_controller}(hj52hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj22ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetj72modnameN classnameNjvjy)}j|]j)}jrj1sbc.i3c_master_unregisterasbuh1hhj2ubh)}(h h]h }(hjU2hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj2ubj)}(hjh]h*}(hjc2hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj2ubj)}(hmasterh]hmaster}(hjp2hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj2ubah}(h]h ]h"]h$]h&]hhuh1j-hj1hhhj1hM ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj1hhhj1hM ubah}(h]j1ah ](jjeh"]h$]h&]jj)jhuh1hhj1hM hj1hhubj)}(hhh]j)}(hunregister an I3C masterh]hunregister an I3C master}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj2hhubah}(h]h ]h"]h$]h&]uh1jhj1hhhj1hM ubeh}(h]h ](jpfunctioneh"]h$]h&]jjpjj2jj2jjjuh1hhhhhhNhNubj)}(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)}(hj2h]h Parameters}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj2ubj)}(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-)}(hj2h]h$struct i3c_master_controller *master}(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%master used to send frames on the bush]h%master used to send frames on the bus}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2hM hj2ubah}(h]h ]h"]h$]h&]uh1jBhj2ubeh}(h]h ]h"]h$]h&]uh1j hj2hM hj2ubah}(h]h ]h"]h$]h&]uh1jhj2ubj)}(h**Description**h]j)}(hj3h]h Description}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj2ubj)}(h8Basically undo everything done in i3c_master_register().h]h8Basically undo everything done in i3c_master_register().}(hj,3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj2ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h֌i3c_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}(hj[3hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjW3hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKubh)}(h h]h }(hji3hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjW3hhhjh3hKubj)}(hi3c_i2c_dev_desch]j)}(hjU3h]hi3c_i2c_dev_desc}(hj{3hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjw3ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjW3hhhjh3hKubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjS3hhhjh3hKubah}(h]jN3ah ](jjeh"]h$]h&]jj)jhuh1hhjh3hKhjP3hhubj)}(hhh]j)}(h,Common part of the I3C/I2C device descriptorh]h,Common part of the I3C/I2C device descriptor}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK'hj3hhubah}(h]h ]h"]h$]h&]uh1jhjP3hhhjh3hKubeh}(h]h ](jpstructeh"]h$]h&]jjpjj3jj3jjjuh1hhhhhhNhNubj)}(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}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubh:}(hj3hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK+hj3ubh 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; };}hj3sbah}(h]h ]h"]h$]h&]hhuh1j3hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK-hj3ubj)}(h **Members**h]j)}(hj3h]hMembers}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK3hj3ubj)}(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 4h]hnode}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj 4ubah}(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*hj4ubjC)}(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%4hhhNhNubah}(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"4ubah}(h]h ]h"]h$]h&]uh1jBhj4ubeh}(h]h ]h"]h$]h&]uh1j hj!4hK*hj4ubj!)}(hZ``master`` I3C master that instantiated this device. Will be used to do I2C/I3C transfers h](j')}(h ``master``h]j-)}(hjF4h]hmaster}(hjH4hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjD4ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK,hj@4ubjC)}(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}(hj_4hhhNhNubah}(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\4ubah}(h]h ]h"]h$]h&]uh1jBhj@4ubeh}(h]h ]h"]h$]h&]uh1j hj[4hK,hj4ubj!)}(hj``master_priv`` master private data assigned to the device. Can be used to add master specific informationh](j')}(h``master_priv``h]j-)}(hj4h]h master_priv}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj~4ubah}(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-hjz4ubjC)}(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}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4hK-hj4ubah}(h]h ]h"]h$]h&]uh1jBhjz4ubeh}(h]h ]h"]h$]h&]uh1j hj4hK-hj4ubeh}(h]h ]h"]h$]h&]uh1jhj3ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hj4h]h Description}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK1hhhhubj)}(hhj?5hhubah}(h]h ]h"]h$]h&]uh1jhj4hhhj 5hK3ubeh}(h]h ](jpstructeh"]h$]h&]jjpjjZ5jjZ5jjjuh1hhhhhhNhNubj)}(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}(hjf5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjb5ubh:}(hjb5hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKBhj^5ubj3)}(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; };}hj5sbah}(h]h ]h"]h$]h&]hhuh1j3hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKDhj^5ubj)}(h **Members**h]j)}(hj5h]hMembers}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKJhj^5ubj)}(hhh](j!)}(hG``node`` used to insert the boardinfo object in the I2C boardinfo list h](j')}(h``node``h]j-)}(hj5h]hnode}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj5ubah}(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@hj5ubjC)}(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}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5hK@hj5ubah}(h]h ]h"]h$]h&]uh1jBhj5ubeh}(h]h ]h"]h$]h&]uh1j hj5hK@hj5ubj!)}(h'``base`` regular I2C board information h](j')}(h``base``h]j-)}(hj5h]hbase}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj5ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKAhj5ubjC)}(hhh]j)}(hregular I2C board informationh]hregular I2C board information}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5hKAhj5ubah}(h]h ]h"]h$]h&]uh1jBhj5ubeh}(h]h ]h"]h$]h&]uh1j hj5hKAhj5ubj!)}(he``lvr`` LVR (Legacy Virtual Register) needed by the I3C core to know about the I2C device limitationsh](j')}(h``lvr``h]j-)}(hj!6h]hlvr}(hj#6hhhNhNubah}(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.hhKBhj6ubjC)}(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:6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj66hKBhj76ubah}(h]h ]h"]h$]h&]uh1jBhj6ubeh}(h]h ]h"]h$]h&]uh1j hj66hKBhj5ubeh}(h]h ]h"]h$]h&]uh1jhj^5ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hjc6h]h Description}(hje6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhja6ubah}(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.}(hjy6hhhNhNubah}(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}(hj6hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj6hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKIubh)}(h h]h }(hj6hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj6hhhj6hKIubj)}(h i2c_dev_desch]j)}(hj6h]h i2c_dev_desc}(hj6hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj6ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj6hhhj6hKIubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj6hhhj6hKIubah}(h]j6ah ](jjeh"]h$]h&]jj)jhuh1hhj6hKIhj6hhubj)}(hhh]j)}(hI2C device descriptorh]hI2C device descriptor}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKNhj6hhubah}(h]h ]h"]h$]h&]uh1jhj6hhhj6hKIubeh}(h]h ](jpstructeh"]h$]h&]jjpjj6jj6jjjuh1hhhhhhNhNubj)}(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}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubh:}(hj7hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKRhj6ubj3)}(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; };}hj 7sbah}(h]h ]h"]h$]h&]hhuh1j3hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKThj6ubj)}(h **Members**h]j)}(hj17h]hMembers}(hj37hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/7ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK[hj6ubj)}(hhh](j!)}(h4``common`` common part of the I2C device descriptor h](j')}(h ``common``h]j-)}(hjP7h]hcommon}(hjR7hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjN7ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKPhjJ7ubjC)}(hhh]j)}(h(common part of the I2C device descriptorh]h(common part of the I2C device descriptor}(hji7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhje7hKPhjf7ubah}(h]h ]h"]h$]h&]uh1jBhjJ7ubeh}(h]h ]h"]h$]h&]uh1j hje7hKPhjG7ubj!)}(h:``dev`` I2C device object registered to the I2C framework h](j')}(h``dev``h]j-)}(hj7h]hdev}(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.hhKQhj7ubjC)}(hhh]j)}(h1I2C device object registered to the I2C frameworkh]h1I2C device object registered to the I2C framework}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7hKQhj7ubah}(h]h ]h"]h$]h&]uh1jBhj7ubeh}(h]h ]h"]h$]h&]uh1j hj7hKQhjG7ubj!)}(h``addr`` I2C device address h](j')}(h``addr``h]j-)}(hj7h]haddr}(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.hhKRhj7ubjC)}(hhh]j)}(hI2C device addressh]hI2C device address}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7hKRhj7ubah}(h]h ]h"]h$]h&]uh1jBhj7ubeh}(h]h ]h"]h$]h&]uh1j hj7hKRhjG7ubj!)}(he``lvr`` LVR (Legacy Virtual Register) needed by the I3C core to know about the I2C device limitationsh](j')}(h``lvr``h]j-)}(hj7h]hlvr}(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.hhKShj7ubjC)}(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}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8hKShj8ubah}(h]h ]h"]h$]h&]uh1jBhj7ubeh}(h]h ]h"]h$]h&]uh1j hj8hKShjG7ubeh}(h]h ]h"]h$]h&]uh1jhj6ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hj=8h]h Description}(hj?8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;8ubah}(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 }(hjS8hhhNhNubh)}(hJ:c:type:`struct_i3c_master_controller->ops `h]j-)}(hj]8h]h!struct_i3c_master_controller->ops}(hj_8hhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hj[8ubah}(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.hhKThjS8ubh->attach_i2c_dev().}(hjS8hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjz8hKThhhhubj)}(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-)}(hj8h]hstruct_i2c_dev_desc}(hj8hhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hj8ubah}(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.hhKXhj8ubhl is the internal representation of an I2C device connected on an I3C bus. This object is also passed to all }(hj8hhhNhNubh)}(hG:c:type:`struct_i3c_master_controller_ops <_i3c_master_controller_ops>`h]j-)}(hj8h]h struct_i3c_master_controller_ops}(hj8hhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hj8ubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjj_i3c_master_controller_opsuh1hhj8hKXhj8ubh hooks.}(hj8hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj8hKXhhhhubh)}(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}(hj8hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj8hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK_ubh)}(h h]h }(hj8hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj8hhhj8hK_ubj)}(h i3c_ibi_sloth]j)}(hj8h]h i3c_ibi_slot}(hj9hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj 9ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj8hhhj8hK_ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj8hhhj8hK_ubah}(h]j8ah ](jjeh"]h$]h&]jj)jhuh1hhj8hK_hj8hhubj)}(hhh]j)}(h I3C IBI (In-Band Interrupt) sloth]h I3C IBI (In-Band Interrupt) slot}(hj19hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKehj.9hhubah}(h]h ]h"]h$]h&]uh1jhj8hhhj8hK_ubeh}(h]h ](jpstructeh"]h$]h&]jjpjjI9jjI9jjjuh1hhhhhhNhNubj)}(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}(hjU9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQ9ubh:}(hjQ9hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKihjM9ubj3)}(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; };}hjn9sbah}(h]h ]h"]h$]h&]hhuh1j3hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKkhjM9ubj)}(h **Members**h]j)}(hj9h]hMembers}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj}9ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKrhjM9ubj)}(hhh](j!)}(hQ``work`` work associated to this slot. The IBI handler will be called from there h](j')}(h``work``h]j-)}(hj9h]hwork}(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.hhKhhj9ubjC)}(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}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKghj9ubah}(h]h ]h"]h$]h&]uh1jBhj9ubeh}(h]h ]h"]h$]h&]uh1j hj9hKhhj9ubj!)}(h3``dev`` the I3C device that has generated this IBI 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.hhKihj9ubjC)}(hhh]j)}(h*the I3C device that has generated this IBIh]h*the I3C device that has generated this IBI}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9hKihj9ubah}(h]h ]h"]h$]h&]uh1jBhj9ubeh}(h]h ]h"]h$]h&]uh1j hj9hKihj9ubj!)}(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}(hj*:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&:hKjhj':ubah}(h]h ]h"]h$]h&]uh1jBhj :ubeh}(h]h ]h"]h$]h&]uh1j hj&:hKjhj9ubj!)}(h``data`` payload bufferh](j')}(h``data``h]j-)}(hjJ:h]hdata}(hjL:hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjH:ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKjhjD:ubjC)}(hhh]j)}(hpayload bufferh]hpayload buffer}(hjc:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKkhj`:ubah}(h]h ]h"]h$]h&]uh1jBhjD:ubeh}(h]h ]h"]h$]h&]uh1j hj_:hKjhj9ubeh}(h]h ]h"]h$]h&]uh1jhjM9ubeh}(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}(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.hhK}hj;hhubah}(h]h ]h"]h$]h&]uh1jhj:hhhj:hKwubeh}(h]h ](jpstructeh"]h$]h&]jjpjj4;jj4;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}(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.hhKhj8;ubj3)}(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); };}hjY;sbah}(h]h ]h"]h$]h&]hhuh1j3hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj8;ubj)}(h **Members**h]j)}(hjj;h]hMembers}(hjl;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjh;ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj8;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-)}(hj7<h]h num_slots}(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.hhKhj1<ubjC)}(hhh]j)}(h,number of IBI slots reserved for this deviceh]h,number of IBI slots reserved for this device}(hjP<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjL<hKhjM<ubah}(h]h ]h"]h$]h&]uh1jBhj1<ubeh}(h]h ]h"]h$]h&]uh1j hjL<hKhj;ubj!)}(h#``enabled`` reflect the IBI status h](j')}(h ``enabled``h]j-)}(hjp<h]henabled}(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.hhKhjj<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&]uh1jBhjj<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&]uh1jhj8;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 }(hj;=hhhNhNubh)}(h;:c:type:`struct_i3c_device_ibi_info <_i3c_device_ibi_info>`h]j-)}(hjE=h]hstruct_i3c_device_ibi_info}(hjG=hhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjC=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.hhKhj;=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.}(hj;=hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjb=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.}(hjm=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.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=ubj3)}(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&]hhuh1j3hj/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-)}(hjD>h]hnode}(hjF>hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjB>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=used to insert the boardinfo object in the I3C boardinfo listh]h=used to insert the boardinfo object in the I3C boardinfo list}(hj]>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjY>hKhjZ>ubah}(h]h ]h"]h$]h&]uh1jBhj>>ubeh}(h]h ]h"]h$]h&]uh1j hjY>hKhj;>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.hhKhjw>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&]uh1jBhjw>ubeh}(h]h ]h"]h$]h&]uh1j hj>hKhj;>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>hKhj;>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>h]hpid}(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)}(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 ?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!)}(hL``of_node`` optional DT node in case the device has been described in the DTh](j')}(h ``of_node``h]j-)}(hj+?h]hof_node}(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@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}(hjD?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjA?ubah}(h]h ]h"]h$]h&]uh1jBhj%?ubeh}(h]h ]h"]h$]h&]uh1j hj@?hKhj;>ubeh}(h]h ]h"]h$]h&]uh1jhj=ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hjn?h]h Description}(hjp?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjl?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)}(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.}(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_desc (C struct)c.i3c_dev_deschNtauh1hhhhhhNhNubh)}(hhh](h)}(h i3c_dev_desch]h)}(hstruct i3c_dev_desch](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)}(h i3c_dev_desch]j)}(hj?h]h i3c_dev_desc}(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 descriptorh]hI3C device descriptor}(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_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@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 @ubj3)}(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; };}hj+@sbah}(h]h ]h"]h$]h&]hhuh1j3hj/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!)}(h4``common`` common part of the I3C device descriptor h](j')}(h ``common``h]j-)}(hj[@h]hcommon}(hj]@hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjY@ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjU@ubjC)}(hhh]j)}(h(common part of the I3C device descriptorh]h(common part of the I3C device descriptor}(hjt@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjp@hKhjq@ubah}(h]h ]h"]h$]h&]uh1jBhjU@ubeh}(h]h ]h"]h$]h&]uh1j hjp@hKhjR@ubj!)}(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-)}(hj@h]hinfo}(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)}(huI3C device information. Will be automatically filled when you create your device with i3c_master_add_i3c_dev_locked()h]huI3C device information. Will be automatically filled when you create your device with i3c_master_add_i3c_dev_locked()}(hj@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@hKhjR@ubj!)}(h[``ibi_lock`` lock used to protect the :c:type:`struct_i3c_device->ibi ` h](j')}(h ``ibi_lock``h]j-)}(hj@h]hibi_lock}(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)}(hMlock used to protect the :c:type:`struct_i3c_device->ibi `h](hlock used to protect the }(hj@hhhNhNubh)}(h4:c:type:`struct_i3c_device->ibi `h]j-)}(hj@h]hstruct_i3c_device->ibi}(hj@hhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hj@ubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjjstruct_i3c_deviceuh1hhj@hKhj@ubeh}(h]h ]h"]h$]h&]uh1jhj@hKhj@ubah}(h]h ]h"]h$]h&]uh1jBhj@ubeh}(h]h ]h"]h$]h&]uh1j hj@hKhjR@ubj!)}(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&Ah]hibi}(hj(AhhhNhNubah}(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.hhKhj AubjC)}(hhh]j)}(hVIBI info attached to a device. Should be NULL until i3c_device_request_ibi() is calledh]hVIBI info attached to a device. Should be NULL until i3c_device_request_ibi() is called}(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.hhKhj desc link or when propagating IBI events to the driver h](j')}(h``dev``h]j-)}(hj`Ah]hdev}(hjbAhhhNhNubah}(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.hhKhjZAubjC)}(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}(hjyAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjvAubah}(h]h ]h"]h$]h&]uh1jBhjZAubeh}(h]h ]h"]h$]h&]uh1j hjuAhKhjR@ubj!)}(hB``boardinfo`` pointer to the boardinfo attached to this I3C deviceh](j')}(h ``boardinfo``h]j-)}(hjAh]h boardinfo}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjAubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjAubjC)}(hhh]j)}(h4pointer to the boardinfo attached to this I3C deviceh]h4pointer to the boardinfo attached to this I3C device}(hjAhhhNhNubah}(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 hjAhKhjR@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)}(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 (}(hjAhhhNhNubh)}(h):c:type:`struct_i3c_device <_i3c_device>`h]j-)}(hjAh]hstruct_i3c_device}(hjAhhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjAubah}(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.hhKhjAubh).}(hjAhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjBhKhhhhubh)}(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}(hj>BhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj:Bhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKubh)}(h h]h }(hjLBhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj:BhhhjKBhKubj)}(h i3c_deviceh]j)}(hj8Bh]h i3c_device}(hj^BhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjZBubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj:BhhhjKBhKubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj6BhhhjKBhKubah}(h]j1Bah ](jjeh"]h$]h&]jj)jhuh1hhjKBhKhj3Bhhubj)}(hhh]j)}(hI3C device objecth]hI3C device object}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj}Bhhubah}(h]h ]h"]h$]h&]uh1jhj3BhhhjKBhKubeh}(h]h ](jpstructeh"]h$]h&]jjpjjBjjBjjjuh1hhhhhhNhNubj)}(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}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubh:}(hjBhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjBubj3)}(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; };}hjBsbah}(h]h ]h"]h$]h&]hhuh1j3hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjBubj)}(h **Members**h]j)}(hjBh]hMembers}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjBubj)}(hhh](j!)}(hB``dev`` device object to register the I3C dev to the device model h](j')}(h``dev``h]j-)}(hjBh]hdev}(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)}(h9device object to register the I3C dev to the device modelh]h9device object to register the I3C dev to the device model}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjChKhjCubah}(h]h ]h"]h$]h&]uh1jBhjBubeh}(h]h ]h"]h$]h&]uh1j hjChKhjBubj!)}(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&Ch]hdesc}(hj(ChhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj$Cubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj CubjC)}(hhh]j)}(hpointer to an i3c device descriptor object. This link is updated every time the I3C device is rediscovered with a different dynamic address assignedh]hpointer to an i3c device descriptor object. This link is updated every time the I3C device is rediscovered with a different dynamic address assigned}(hj?ChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj` 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 }(hjChhhNhNubh)}(h-:c:type:`struct_i3c_dev_desc <_i3c_dev_desc>`h]j-)}(hjCh]hstruct_i3c_dev_desc}(hjChhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjCubah}(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.hhKhjCubhs one. All I3C devs on the I3C bus are represented, including I3C masters. For each of them, we have an instance of }(hjChhhNhNubh)}(h(:c:type:`struct i3c_device `h]j-)}(hjCh]hstruct i3c_device}(hjChhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjCubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjj i3c_deviceuh1hhjChKhjCubh.}(hjChhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjChKhhhhubh)}(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'DhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj#Dhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKubh)}(h h]h }(hj5DhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj#Dhhhj4DhKubj)}(h i3c_bus_modeh]j)}(hj!Dh]h i3c_bus_mode}(hjGDhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjCDubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj#Dhhhj4DhKubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjDhhhj4DhKubah}(h]jDah ](jjeh"]h$]h&]jj)jhuh1hhj4DhKhjDhhubj)}(hhh]j)}(h I3C bus modeh]h I3C bus mode}(hjiDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjfDhhubah}(h]h ]h"]h$]h&]uh1jhjDhhhj4DhKubeh}(h]h ](jpenumeh"]h$]h&]jjpjjDjjDjjjuh1hhhhhhNhNubj)}(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)}(hjDh]h Constants}(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.hhM hjDubj)}(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-)}(hjDh]hI3C_BUS_MODE_PURE}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjDubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjDubjC)}(hhh]j)}(hAonly I3C devices are connected to the bus. No limitation expectedh]hAonly I3C devices are connected to the bus. No limitation expected}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjDubah}(h]h ]h"]h$]h&]uh1jBhjDubeh}(h]h ]h"]h$]h&]uh1j hjDhMhjDubj!)}(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-)}(hjDh]hI3C_BUS_MODE_MIXED_FAST}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjDubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjDubjC)}(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}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjDubah}(h]h ]h"]h$]h&]uh1jBhjDubeh}(h]h ]h"]h$]h&]uh1j hjDhMhjDubj!)}(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-)}(hjEh]hI3C_BUS_MODE_MIXED_LIMITED}(hj EhhhNhNubah}(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.hhMhjEubjC)}(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.}(hj7EhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj4Eubah}(h]h ]h"]h$]h&]uh1jBhjEubeh}(h]h ]h"]h$]h&]uh1j hj3EhMhjDubj!)}(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-)}(hjXEh]hI3C_BUS_MODE_MIXED_SLOW}(hjZEhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjVEubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjREubjC)}(hhh]j)}(hIubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjIhhhj/IhM=ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjIhhhj/IhM=ubah}(h]jIah ](jjeh"]h$]h&]jj)jhuh1hhj/IhM=hjIhhubj)}(hhh]j)}(hI3C bus objecth]hI3C bus object}(hjdIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMHhjaIhhubah}(h]h ]h"]h$]h&]uh1jhjIhhhj/IhM=ubeh}(h]h ](jpstructeh"]h$]h&]jjpjj|Ijj|Ijjjuh1hhhhhhNhNubj)}(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}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubh:}(hjIhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMLhjIubj3)}(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; };}hjIsbah}(h]h ]h"]h$]h&]hhuh1j3hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMNhjIubj)}(h **Members**h]j)}(hjIh]hMembers}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjIubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM^hjIubj)}(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-)}(hjIh]h cur_master}(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.hhMMhjIubjC)}(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}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMJhjIubah}(h]h ]h"]h$]h&]uh1jBhjIubeh}(h]h ]h"]h$]h&]uh1j hjIhMMhjIubj!)}(h?``id`` bus ID. Assigned by the framework when register the bus h](j')}(h``id``h]j-)}(hj Jh]hid}(hj JhhhNhNubah}(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.hhMNhjJubjC)}(hhh]j)}(h7bus ID. Assigned by the framework when register the bush]h7bus ID. Assigned by the framework when register the bus}(hj$JhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj JhMNhj!Jubah}(h]h ]h"]h$]h&]uh1jBhjJubeh}(h]h ]h"]h$]h&]uh1j hj JhMNhjIubj!)}(h``addrslots`` a bitmap with 2-bits per-slot to encode the address status and ease the DAA (Dynamic Address Assignment) procedure (see :c:type:`enum i3c_addr_slot_status `) h](j')}(h ``addrslots``h]j-)}(hjDJh]h addrslots}(hjFJhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjBJubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMQhj>JubjC)}(hhh]j)}(ha bitmap with 2-bits per-slot to encode the address status and ease the DAA (Dynamic Address Assignment) procedure (see :c:type:`enum i3c_addr_slot_status `)h](hxa bitmap with 2-bits per-slot to encode the address status and ease the DAA (Dynamic Address Assignment) procedure (see }(hj]JhhhNhNubh)}(h::c:type:`enum i3c_addr_slot_status `h]j-)}(hjgJh]henum i3c_addr_slot_status}(hjiJhhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjeJubah}(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.hhMOhj]Jubh)}(hj]JhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjJhMOhjZJubah}(h]h ]h"]h$]h&]uh1jBhj>Jubeh}(h]h ]h"]h$]h&]uh1j hjYJhMQhjIubj!)}(hC``mode`` bus mode (see :c:type:`enum i3c_bus_mode `) h](j')}(h``mode``h]j-)}(hjJh]hmode}(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.hhMRhjJubjC)}(hhh]j)}(h9bus mode (see :c:type:`enum i3c_bus_mode `)h](hbus mode (see }(hjJhhhNhNubh)}(h*:c:type:`enum i3c_bus_mode `h]j-)}(hjJh]henum i3c_bus_mode}(hjJhhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjJubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjj i3c_bus_modeuh1hhjJhMRhjJubh)}(hjJhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjJhMRhjJubah}(h]h ]h"]h$]h&]uh1jBhjJubeh}(h]h ]h"]h$]h&]uh1j hjJhMRhjIubj!)}(h2``scl_rate`` SCL signal rate for I3C and I2C mode h](j')}(h ``scl_rate``h]j-)}(hjJh]hscl_rate}(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.hhMVhjJubjC)}(hhh]j)}(h$SCL signal rate for I3C and I2C modeh]h$SCL signal rate for I3C and I2C mode}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKhMVhjKubah}(h]h ]h"]h$]h&]uh1jBhjJubeh}(h]h ]h"]h$]h&]uh1j hjKhMVhjIubj!)}(hU``scl_rate.i3c`` maximum rate for the clock signal when doing I3C SDR/priv transfers h](j')}(h``scl_rate.i3c``h]j-)}(hj6Kh]h scl_rate.i3c}(hj8KhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj4Kubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMThj0KubjC)}(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}(hjOKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMShjLKubah}(h]h ]h"]h$]h&]uh1jBhj0Kubeh}(h]h ]h"]h$]h&]uh1j hjKKhMThjIubj!)}(hL``scl_rate.i2c`` maximum rate for the clock signal when doing I2C transfers h](j')}(h``scl_rate.i2c``h]j-)}(hjpKh]h scl_rate.i2c}(hjrKhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjnKubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMUhjjKubjC)}(hhh]j)}(h:maximum rate for the clock signal when doing I2C transfersh]h:maximum rate for the clock signal when doing I2C transfers}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKhMUhjKubah}(h]h ]h"]h$]h&]uh1jBhjjKubeh}(h]h ]h"]h$]h&]uh1j hjKhMUhjIubj!)}(hE``devs`` 2 lists containing all I3C/I2C devices connected to the bus h](j')}(h``devs``h]j-)}(hjKh]hdevs}(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.hhM]hjKubjC)}(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}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjKhM]hjKubah}(h]h ]h"]h$]h&]uh1jBhjKubeh}(h]h ]h"]h$]h&]uh1j hjKhM]hjIubj!)}(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-)}(hjKh]hdevs.i3c}(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.hhMYhjKubjC)}(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}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMWhjKubah}(h]h ]h"]h$]h&]uh1jBhjKubeh}(h]h ]h"]h$]h&]uh1j hjKhMYhjIubj!)}(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-)}(hjLh]hdevs.i2c}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjLubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM\hjLubjC)}(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}(hj5LhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMZhj2Lubah}(h]h ]h"]h$]h&]uh1jBhjLubeh}(h]h ]h"]h$]h&]uh1j hj1LhM\hjIubj!)}(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-)}(hjVLh]hlock}(hjXLhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjTLubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMfhjPLubjC)}(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}(hjoLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM^hjlLubah}(h]h ]h"]h$]h&]uh1jBhjPLubeh}(h]h ]h"]h$]h&]uh1j hjkLhMfhjIubeh}(h]h ]h"]h$]h&]uh1jhjIubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hjLh]h Description}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjLubah}(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.}(hjLhhhNhNubah}(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}(hjLhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjLhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMoubh)}(h h]h }(hjLhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjLhhhjLhMoubj)}(hi3c_master_controller_opsh]j)}(hjLh]hi3c_master_controller_ops}(hjLhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjLubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjLhhhjLhMoubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjLhhhjLhMoubah}(h]jLah ](jjeh"]h$]h&]jj)jhuh1hhjLhMohjLhhubj)}(hhh]j)}(hI3C master methodsh]hI3C master methods}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM~hjMhhubah}(h]h ]h"]h$]h&]uh1jhjLhhhjLhMoubeh}(h]h ](jpstructeh"]h$]h&]jjpjj1Mjj1Mjjjuh1hhhhhhNhNubj)}(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 (*priv_xfers)(struct i3c_dev_desc *dev, struct i3c_priv_xfer *xfers, int nxfers); 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); }; **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. ``priv_xfers`` do one or several private I3C SDR 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.h](j)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hj=MhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj9Mubh:}(hj9MhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj5Mubj3)}(hXwstruct 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 (*priv_xfers)(struct i3c_dev_desc *dev, struct i3c_priv_xfer *xfers, int nxfers); 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); };h]hXwstruct 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 (*priv_xfers)(struct i3c_dev_desc *dev, struct i3c_priv_xfer *xfers, int nxfers); 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); };}hjVMsbah}(h]h ]h"]h$]h&]hhuh1j3hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj5Mubj)}(h **Members**h]j)}(hjgMh]hMembers}(hjiMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjeMubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj5Mubj)}(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-)}(hjMh]hbus_init}(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.hhMhjMubjC)}(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.}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjMubah}(h]h ]h"]h$]h&]uh1jBhjMubeh}(h]h ]h"]h$]h&]uh1j hjMhMhj}Mubj!)}(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-)}(hjMh]h bus_cleanup}(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.hhMhjMubjC)}(hhh]j)}(hcleanup everything done in :c:type:`i3c_master_controller_ops->bus_init\(\) `. This method is optional.h](hcleanup everything done in }(hjMhhhNhNubh)}(hM:c:type:`i3c_master_controller_ops->bus_init\(\) `h]j-)}(hjMh]h%i3c_master_controller_ops->bus_init()}(hjMhhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjMubah}(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.hhMhjMubh. This method is optional.}(hjMhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjNhMhjMubah}(h]h ]h"]h$]h&]uh1jBhjMubeh}(h]h ]h"]h$]h&]uh1j hjMhMhj}Mubj!)}(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-)}(hjNh]hattach_i3c_dev}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjNubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjNubjC)}(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.}(hj6NhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj3Nubah}(h]h ]h"]h$]h&]uh1jBhjNubeh}(h]h ]h"]h$]h&]uh1j hj2NhMhj}Mubj!)}(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-)}(hjWNh]hreattach_i3c_dev}(hjYNhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjUNubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjQNubjC)}(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.}(hjpNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjmNubah}(h]h ]h"]h$]h&]uh1jBhjQNubeh}(h]h ]h"]h$]h&]uh1j hjlNhMhj}Mubj!)}(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-)}(hjNh]hdetach_i3c_dev}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjNubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjNubjC)}(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.}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjNubah}(h]h ]h"]h$]h&]uh1jBhjNubeh}(h]h ]h"]h$]h&]uh1j hjNhMhj}Mubj!)}(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-)}(hjNh]hdo_daa}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjNubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjNubjC)}(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.}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjNubah}(h]h ]h"]h$]h&]uh1jBhjNubeh}(h]h ]h"]h$]h&]uh1j hjNhMhj}Mubj!)}(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-)}(hjOh]hsupports_ccc_cmd}(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.hhMhjNubjC)}(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.}(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&]uh1jBhjNubeh}(h]h ]h"]h$]h&]uh1j hjOhMhj}Mubj!)}(h>``send_ccc_cmd`` send a CCC command This method is mandatory. h](j')}(h``send_ccc_cmd``h]j-)}(hj?Oh]h send_ccc_cmd}(hjAOhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj=Oubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj9OubjC)}(hhh]j)}(h,send a CCC command This method is mandatory.h]h,send a CCC command This method is mandatory.}(hjXOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjUOubah}(h]h ]h"]h$]h&]uh1jBhj9Oubeh}(h]h ]h"]h$]h&]uh1j hjTOhMhj}Mubj!)}(hU``priv_xfers`` do one or several private I3C SDR transfers This method is mandatory. h](j')}(h``priv_xfers``h]j-)}(hjyOh]h priv_xfers}(hj{OhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjwOubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjsOubjC)}(hhh]j)}(hEdo one or several private I3C SDR transfers This method is mandatory.h]hEdo one or several private I3C SDR transfers 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&]uh1jBhjsOubeh}(h]h ]h"]h$]h&]uh1j hjOhMhj}Mubj!)}(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-)}(hjOh]hattach_i2c_dev}(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)}(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.}(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 hjOhMhj}Mubj!)}(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-)}(hjOh]hdetach_i2c_dev}(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)}(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.}(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&]uh1jBhjOubeh}(h]h ]h"]h$]h&]uh1j hjPhMhj}Mubj!)}(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'Ph]h i2c_xfers}(hj)PhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj%Pubah}(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)}(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.}(hj@PhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj=Pubah}(h]h ]h"]h$]h&]uh1jBhj!Pubeh}(h]h ]h"]h$]h&]uh1j hjrequest_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-)}(hjPh]hfree_ibi}(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)}(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.}(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 hjPhMhj}Mubj!)}(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-)}(hjPh]h enable_ibi}(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)}(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.}(hjQhhhNhNubah}(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 hjPhMhj}Mubj!)}(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-)}(hj!Qh]h disable_ibi}(hj#QhhhNhNubah}(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)}(hdisable an IBI. First send the DISEC CCC command with the IBI flag set and then deactivate the hardware IRQ on the controller end. This method is mandatory only if ->request_ibi is not NULL.h]hdisable an IBI. First send the DISEC CCC command with the IBI flag set and then deactivate the hardware IRQ on the controller end. This method is mandatory only if ->request_ibi is not NULL.}(hj:QhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj7Qubah}(h]h ]h"]h$]h&]uh1jBhjQubeh}(h]h ]h"]h$]h&]uh1j hj6QhMhj}Mubj!)}(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-)}(hj[Qh]hrecycle_ibi_slot}(hj]QhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjYQubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjUQubjC)}(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.}(hjtQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjqQubah}(h]h ]h"]h$]h&]uh1jBhjUQubeh}(h]h ]h"]h$]h&]uh1j hjpQhMhj}Mubj!)}(h1``enable_hotjoin`` enable hot join event detect. h](j')}(h``enable_hotjoin``h]j-)}(hjQh]henable_hotjoin}(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)}(henable hot join event detect.h]henable hot join event detect.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQhMhjQubah}(h]h ]h"]h$]h&]uh1jBhjQubeh}(h]h ]h"]h$]h&]uh1j hjQhMhj}Mubj!)}(h3``disable_hotjoin`` disable hot join event detect. h](j')}(h``disable_hotjoin``h]j-)}(hjQh]hdisable_hotjoin}(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)}(hdisable hot join event detect.h]hdisable hot join event detect.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQhMhjQubah}(h]h ]h"]h$]h&]uh1jBhjQubeh}(h]h ]h"]h$]h&]uh1j hjQhMhj}Mubj!)}(h0``set_speed`` adjust I3C open drain mode timing.h](j')}(h ``set_speed``h]j-)}(hjRh]h set_speed}(hj RhhhNhNubah}(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)}(h"adjust I3C open drain mode timing.h]h"adjust I3C open drain mode timing.}(hj RhhhNhNubah}(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 hjRhMhj}Mubeh}(h]h ]h"]h$]h&]uh1jhj5Mubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h֌ i3c_master_controller (C struct)c.i3c_master_controllerhNtauh1hhhhhhNhNubh)}(hhh](h)}(hi3c_master_controllerh]h)}(hstruct i3c_master_controllerh](j:)}(hj=h]hstruct}(hjaRhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj]Rhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMubh)}(h h]h }(hjoRhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj]RhhhjnRhMubj)}(hi3c_master_controllerh]j)}(hj[Rh]hi3c_master_controller}(hjRhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj}Rubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj]RhhhjnRhMubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjYRhhhjnRhMubah}(h]jTRah ](jjeh"]h$]h&]jj)jhuh1hhjnRhMhjVRhhubj)}(hhh]j)}(hI3C master controller objecth]hI3C master controller object}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjRhhubah}(h]h ]h"]h$]h&]uh1jhjVRhhhjnRhMubeh}(h]h ](jpstructeh"]h$]h&]jjpjjRjjRjjjuh1hhhhhhNhNubj)}(hXJ**Definition**:: struct 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; struct { struct list_head i3c; struct list_head i2c; } boardinfo; struct i3c_bus bus; struct workqueue_struct *wq; }; **Members** ``dev`` device to be registered to the device-model ``this`` an I3C device object representing this master. This device will be added to the list of I3C devs available on the bus ``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 ``ops`` master operations. See :c:type:`struct i3c_master_controller_ops ` ``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 ``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 contexth](j)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubh:}(hjRhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjRubj3)}(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; struct { struct list_head i3c; struct list_head i2c; } boardinfo; struct i3c_bus bus; struct workqueue_struct *wq; };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; struct { struct list_head i3c; struct list_head i2c; } boardinfo; struct i3c_bus bus; struct workqueue_struct *wq; };}hjRsbah}(h]h ]h"]h$]h&]hhuh1j3hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjRubj)}(h **Members**h]j)}(hjRh]hMembers}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjRubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjRubj)}(hhh](j!)}(h4``dev`` device to be registered to the device-model h](j')}(h``dev``h]j-)}(hjSh]hdev}(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.hhMhj SubjC)}(hhh]j)}(h+device to be registered to the device-modelh]h+device to be registered to the device-model}(hj)ShhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ShMhj&Subah}(h]h ]h"]h$]h&]uh1jBhj Subeh}(h]h ]h"]h$]h&]uh1j hj%ShMhjSubj!)}(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-)}(hjISh]hthis}(hjKShhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjGSubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjCSubjC)}(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}(hjbShhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj_Subah}(h]h ]h"]h$]h&]uh1jBhjCSubeh}(h]h ]h"]h$]h&]uh1j hj^ShMhjSubj!)}(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-)}(hjSh]hi2c}(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.hhMhj}SubjC)}(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}(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&]uh1jBhj}Subeh}(h]h ]h"]h$]h&]uh1j hjShMhjSubj!)}(hf``ops`` master operations. See :c:type:`struct i3c_master_controller_ops ` h](j')}(h``ops``h]j-)}(hjSh]hops}(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)}(h]master operations. See :c:type:`struct i3c_master_controller_ops `h](hmaster operations. See }(hjShhhNhNubh)}(hF:c:type:`struct i3c_master_controller_ops `h]j-)}(hjSh]h struct i3c_master_controller_ops}(hjShhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjSubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjji3c_master_controller_opsuh1hhjShMhjSubeh}(h]h ]h"]h$]h&]uh1jhjShMhjSubah}(h]h ]h"]h$]h&]uh1jBhjSubeh}(h]h ]h"]h$]h&]uh1j hjShMhjSubj!)}(h7``secondary`` true if the master is a secondary master h](j')}(h ``secondary``h]j-)}(hjTh]h secondary}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjTubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjTubjC)}(hhh]j)}(h(true if the master is a secondary masterh]h(true if the master is a secondary master}(hj.ThhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ThMhj+Tubah}(h]h ]h"]h$]h&]uh1jBhjTubeh}(h]h ]h"]h$]h&]uh1j hj*ThMhjSubj!)}(h7``init_done`` true when the bus initialization is done h](j')}(h ``init_done``h]j-)}(hjNTh]h init_done}(hjPThhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjLTubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjHTubjC)}(hhh]j)}(h(true when the bus initialization is doneh]h(true when the bus initialization is done}(hjgThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjcThMhjdTubah}(h]h ]h"]h$]h&]uh1jBhjHTubeh}(h]h ]h"]h$]h&]uh1j hjcThMhjSubj!)}(h/``hotjoin`` true if the master support hotjoin h](j')}(h ``hotjoin``h]j-)}(hjTh]hhotjoin}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjTubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjTubjC)}(hhh]j)}(h"true if the master support hotjoinh]h"true if the master support hotjoin}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjThMhjTubah}(h]h ]h"]h$]h&]uh1jBhjTubeh}(h]h ]h"]h$]h&]uh1j hjThMhjSubj!)}(hO``boardinfo`` board-level information attached to devices connected on the bus h](j')}(h ``boardinfo``h]j-)}(hjTh]h boardinfo}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjTubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjTubjC)}(hhh]j)}(h@board-level information attached to devices connected on the bush]h@board-level information attached to devices connected on the bus}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1jhjThMhjTubah}(h]h ]h"]h$]h&]uh1jBhjTubeh}(h]h ]h"]h$]h&]uh1j hjThMhjSubj!)}(h1``boardinfo.i3c`` list of I3C boardinfo objects h](j')}(h``boardinfo.i3c``h]j-)}(hjTh]h boardinfo.i3c}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjTubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjTubjC)}(hhh]j)}(hlist of I3C boardinfo objectsh]hlist of I3C boardinfo objects}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUhMhjUubah}(h]h ]h"]h$]h&]uh1jBhjTubeh}(h]h ]h"]h$]h&]uh1j hjUhMhjSubj!)}(h0``boardinfo.i2c`` list of I2C boardinfo objects h](j')}(h``boardinfo.i2c``h]j-)}(hj2Uh]h boardinfo.i2c}(hj4UhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj0Uubah}(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,UubjC)}(hhh]j)}(hlist of I2C boardinfo objectsh]hlist of I2C boardinfo objects}(hjKUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGUhMhjHUubah}(h]h ]h"]h$]h&]uh1jBhj,Uubeh}(h]h ]h"]h$]h&]uh1j hjGUhMhjSubj!)}(h'``bus`` I3C bus exposed by this master h](j')}(h``bus``h]j-)}(hjkUh]hbus}(hjmUhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjiUubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjeUubjC)}(hhh]j)}(hI3C bus exposed by this masterh]hI3C bus exposed by this master}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUhMhjUubah}(h]h ]h"]h$]h&]uh1jBhjeUubeh}(h]h ]h"]h$]h&]uh1j hjUhMhjSubj!)}(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 contexth](j')}(h``wq``h]j-)}(hjUh]hwq}(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)}(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}(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 hjUhMhjSubeh}(h]h ]h"]h$]h&]uh1jhjRubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hjUh]h Description}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjUubah}(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 }(hjUhhhNhNubh)}(h>:c:type:`struct i3c_master_controller `h]j-)}(hjVh]hstruct i3c_master_controller}(hj VhhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjVubah}(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.hhMhjUubhR has to be registered to the I3C subsystem through i3c_master_register(). None of }(hjUhhhNhNubh)}(h>:c:type:`struct i3c_master_controller `h]j-)}(hj+Vh]hstruct i3c_master_controller}(hj-VhhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hj)Vubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjji3c_master_controlleruh1hhj$VhMhjUubhV fields should be set manually, just pass appropriate values to i3c_master_register().}(hjUhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj$VhMhhhhubh)}(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)}(hjeVh]hi3c_bus_for_each_i2cdev}(hjoVhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjkVubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjgVhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMubah}(h]h ]h"]h$]h&]hhjuh1hjjhjcVhhhjVhMubah}(h]j^Vah ](jjeh"]h$]h&]jj)jhuh1hhjVhMhj`Vhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhj`VhhhjVhMubeh}(h]h ](jpmacroeh"]h$]h&]jjpjjVjjVjjjuh1hhhhhhNhNubj)}(h&``i3c_bus_for_each_i2cdev (bus, dev)``h]j-)}(hjVh]h"i3c_bus_for_each_i2cdev (bus, dev)}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjVubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhhhhubh 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}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjVubah}(h]h ]h"]h$]h&]uh1jVhjVhMhhhhubj)}(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)}(hjVh]h Parameters}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM hjVubj)}(hhh](j!)}(h``bus`` the I3C bus h](j')}(h``bus``h]j-)}(hjVh]hbus}(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 the I3C bush]h the I3C bus}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj WhMhj Wubah}(h]h ]h"]h$]h&]uh1jBhjVubeh}(h]h ]h"]h$]h&]uh1j hj WhMhjVubj!)}(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-)}(hj0Wh]hdev}(hj2WhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj.Wubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj*WubjC)}(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}(hjIWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjFWubah}(h]h ]h"]h$]h&]uh1jBhj*Wubeh}(h]h ]h"]h$]h&]uh1j hjEWhMhjVubeh}(h]h ]h"]h$]h&]uh1jhjVubj)}(h**Description**h]j)}(hjlWh]h Description}(hjnWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjjWubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM!hjVubj)}(h-Iterate over all I2C devs present on the bus.h]h-Iterate over all I2C devs present on the bus.}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM hjVubeh}(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)}(hjWh]hi3c_bus_for_each_i3cdev}(hjWhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjWubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjWhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM'ubah}(h]h ]h"]h$]h&]hhjuh1hjjhjWhhhjWhM'ubah}(h]jWah ](jjeh"]h$]h&]jj)jhuh1hhjWhM'hjWhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjWhhhjWhM'ubeh}(h]h ](jpmacroeh"]h$]h&]jjpjjWjjWjjjuh1hhhhhhNhNubj)}(h&``i3c_bus_for_each_i3cdev (bus, dev)``h]j-)}(hjWh]h"i3c_bus_for_each_i3cdev (bus, dev)}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjWubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM)hhhhubjV)}(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}(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'hjWubah}(h]h ]h"]h$]h&]uh1jVhjXhM'hhhhubj)}(h**Parameters** ``bus`` the I3C bus ``dev`` and I3C device descriptor pointer updated to point to the current slot at each iteration of the loop **Description** Iterate over all I3C devs present on the bus.h](j)}(h**Parameters**h]j)}(hjXh]h Parameters}(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.hhM+hjXubj)}(hhh](j!)}(h``bus`` the I3C bus h](j')}(h``bus``h]j-)}(hj;Xh]hbus}(hj=XhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj9Xubah}(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(hj5XubjC)}(hhh]j)}(h the I3C bush]h the I3C bus}(hjTXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPXhM(hjQXubah}(h]h ]h"]h$]h&]uh1jBhj5Xubeh}(h]h ]h"]h$]h&]uh1j hjPXhM(hj2Xubj!)}(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-)}(hjtXh]hdev}(hjvXhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjrXubah}(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*hjnXubjC)}(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}(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&]uh1jBhjnXubeh}(h]h ]h"]h$]h&]uh1j hjXhM*hj2Xubeh}(h]h ]h"]h$]h&]uh1jhjXubj)}(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.hhM,hjXubj)}(h-Iterate over all I3C devs present on the bus.h]h-Iterate over all I3C devs present on the bus.}(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+hjXubeh}(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}(hjXhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjXhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM0ubh)}(h h]h }(hjYhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjXhhhjYhM0ubj)}(hi3c_dmah]j)}(hjXh]hi3c_dma}(hjYhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjYubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjXhhhjYhM0ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjXhhhjYhM0ubah}(h]jXah ](jjeh"]h$]h&]jj)jhuh1hhjYhM0hjXhhubj)}(hhh]j)}(h#DMA transfer and mapping descriptorh]h#DMA transfer and mapping descriptor}(hj7YhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM2hj4Yhhubah}(h]h ]h"]h$]h&]uh1jhjXhhhjYhM0ubeh}(h]h ](jpstructeh"]h$]h&]jjpjjOYjjOYjjjuh1hhhhhhNhNubj)}(hX**Definition**:: struct i3c_dma { struct device *dev; void *buf; size_t len; size_t map_len; dma_addr_t addr; enum dma_data_direction dir; void *bounce_buf; }; **Members** ``dev`` device object of a device doing DMA ``buf`` destination/source buffer for DMA ``len`` length of transfer ``map_len`` length of DMA mapping ``addr`` mapped DMA address for a Host Controller Driver ``dir`` DMA direction ``bounce_buf`` an allocated bounce buffer if transfer needs it or NULLh](j)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hj[YhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWYubh:}(hjWYhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM6hjSYubj3)}(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; };}hjtYsbah}(h]h ]h"]h$]h&]hhuh1j3hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM8hjSYubj)}(h **Members**h]j)}(hjYh]hMembers}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMBhjSYubj)}(hhh](j!)}(h,``dev`` device object of a device doing DMA h](j')}(h``dev``h]j-)}(hjYh]hdev}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjYubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM4hjYubjC)}(hhh]j)}(h#device object of a device doing DMAh]h#device object of a device doing DMA}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYhM4hjYubah}(h]h ]h"]h$]h&]uh1jBhjYubeh}(h]h ]h"]h$]h&]uh1j hjYhM4hjYubj!)}(h*``buf`` destination/source buffer for DMA h](j')}(h``buf``h]j-)}(hjYh]hbuf}(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.hhM5hjYubjC)}(hhh]j)}(h!destination/source buffer for DMAh]h!destination/source buffer for DMA}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYhM5hjYubah}(h]h ]h"]h$]h&]uh1jBhjYubeh}(h]h ]h"]h$]h&]uh1j hjYhM5hjYubj!)}(h``len`` length of transfer h](j')}(h``len``h]j-)}(hjZh]hlen}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjZubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM6hjZubjC)}(hhh]j)}(hlength of transferh]hlength of transfer}(hj/ZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ZhM6hj,Zubah}(h]h ]h"]h$]h&]uh1jBhjZubeh}(h]h ]h"]h$]h&]uh1j hj+ZhM6hjYubj!)}(h"``map_len`` length of DMA mapping h](j')}(h ``map_len``h]j-)}(hjOZh]hmap_len}(hjQZhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjMZubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM7hjIZubjC)}(hhh]j)}(hlength of DMA mappingh]hlength of DMA mapping}(hjhZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjdZhM7hjeZubah}(h]h ]h"]h$]h&]uh1jBhjIZubeh}(h]h ]h"]h$]h&]uh1j hjdZhM7hjYubj!)}(h9``addr`` mapped DMA address for a Host Controller Driver h](j')}(h``addr``h]j-)}(hjZh]haddr}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjZubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM8hjZubjC)}(hhh]j)}(h/mapped DMA address for a Host Controller Driverh]h/mapped DMA address for a Host Controller Driver}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZhM8hjZubah}(h]h ]h"]h$]h&]uh1jBhjZubeh}(h]h ]h"]h$]h&]uh1j hjZhM8hjYubj!)}(h``dir`` DMA direction h](j')}(h``dir``h]j-)}(hjZh]hdir}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjZubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM9hjZubjC)}(hhh]j)}(h DMA directionh]h DMA direction}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZhM9hjZubah}(h]h ]h"]h$]h&]uh1jBhjZubeh}(h]h ]h"]h$]h&]uh1j hjZhM9hjYubj!)}(hF``bounce_buf`` an allocated bounce buffer if transfer needs it or NULLh](j')}(h``bounce_buf``h]j-)}(hjZh]h bounce_buf}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjZubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM9hjZubjC)}(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.hhM:hj[ubah}(h]h ]h"]h$]h&]uh1jBhjZubeh}(h]h ]h"]h$]h&]uh1j hj[hM9hjYubeh}(h]h ]h"]h$]h&]uh1jhjSYubeh}(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}(hjT[hhhNhNubah}(h]h ]hah"]h$]h&]uh1hhjP[hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMiubh)}(h h]h }(hjc[hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjP[hhhjb[hMiubj)}(hjh]h*}(hjq[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjP[hhhjb[hMiubj)}(hi3c_dev_get_master_datah]j)}(hi3c_dev_get_master_datah]hi3c_dev_get_master_data}(hj[hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj~[ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjP[hhhjb[hMiubj.)}(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-hjP[hhhjb[hMiubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjL[hhhjb[hMiubah}(h]jG[ah ](jjeh"]h$]h&]jj)jhuh1hhjb[hMihjI[hhubj)}(hhh]j)}(h^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.hhMxhj:^ubjC)}(hhh]j)}(h3the I3C device descriptor to attach private data toh]h3the I3C device descriptor to attach private data to}(hjY^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjU^hMxhjV^ubah}(h]h ]h"]h$]h&]uh1jBhj:^ubeh}(h]h ]h"]h$]h&]uh1j hjU^hMxhj7^ubj!)}(h``void *data`` private data h](j')}(h``void *data``h]j-)}(hjy^h]h void *data}(hj{^hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjw^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.hhMyhjs^ubjC)}(hhh]j)}(h private datah]h private data}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^hMyhj^ubah}(h]h ]h"]h$]h&]uh1jBhjs^ubeh}(h]h ]h"]h$]h&]uh1j hj^hMyhj7^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.hhM{hj^ubj)}(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().}(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.hhMzhj^ubeh}(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}(hj^hhhNhNubah}(h]h ]hah"]h$]h&]uh1hhj^hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMubh)}(h h]h }(hj_hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj^hhhj_hMubj)}(hjh]h*}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj^hhhj_hMubj)}(hi2c_dev_get_master_datah]j)}(hi2c_dev_get_master_datah]hi2c_dev_get_master_data}(hj'_hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj#_ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj^hhhj_hMubj.)}(h (const struct i2c_dev_desc *dev)h]j4)}(hconst struct i2c_dev_desc *devh](j:)}(hj h]hconst}(hjC_hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj?_ubh)}(h h]h }(hjP_hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj?_ubj:)}(hj=h]hstruct}(hj^_hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj?_ubh)}(h h]h }(hjk_hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj?_ubh)}(hhh]j)}(h i2c_dev_desch]h i2c_dev_desc}(hj|_hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjy_ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetj~_modnameN classnameNjvjy)}j|]j)}jrj)_sbc.i2c_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-hj^hhhj_hMubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj^hhhj_hMubah}(h]j^ah ](jjeh"]h$]h&]jj)jhuh1hhj_hMhj^hhubj)}(hhh]j)}(h