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.chK,ubhdesc_sig_space)}(h h]h }(hhhhhNhNubah}(h]h ]wah"]h$]h&]uh1hhhhhhhhK,ubh 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&]hhuh1jhhhhhhhK,ubhdesc_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-hhhhhhhK,ubeh}(h]h ]h"]h$]h&]hh add_permalinkuh1hsphinx_line_type declaratorhhhhhhhK,ubah}(h]hah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1hhhhK,hhhhubh desc_content)}(hhh]h paragraph)}(h(Lock the bus for a maintenance operationh]h(Lock the bus for a maintenance operation}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chKhjhhubah}(h]h ]h"]h$]h&]uh1jhhhhhhhK,ubeh}(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.chK:ubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjhhhjhK:ubj)}(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&]hhuh1jhjhhhjhK:ubj.)}(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-hjhhhjhK:ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjhhhjhK:ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhK:hjhhubj)}(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.chK2hjzhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhK:ubeh}(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.chK6hjubj)}(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.chK4hjubjC)}(hhh]j)}(hI3C bus to release the lock onh]hI3C bus to release the lock on}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhK4hjubah}(h]h ]h"]h$]h&]uh1jBhjubeh}(h]h ]h"]h$]h&]uh1j hjhK4hjubah}(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.chK6hjubj)}(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.chKOubh)}(h h]h }(hjMhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj:hhhjLhKOubj)}(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:hhhjLhKOubj.)}(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:hhhjLhKOubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj6hhhjLhKOubah}(h]j1ah ](jjeh"]h$]h&]jj)jhuh1hhjLhKOhj3hhubj)}(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.chK@hjhhubah}(h]h ]h"]h$]h&]uh1jhj3hhhjLhKOubeh}(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.chKDhjubj)}(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.chKAhj9ubjC)}(hhh]j)}(hI3C bus to take the lock onh]hI3C bus to take the lock on}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjThKAhjUubah}(h]h ]h"]h$]h&]uh1jBhj9ubeh}(h]h ]h"]h$]h&]uh1j hjThKAhj6ubah}(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.chKChjubj)}(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.chK\ubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjhhhjhK\ubj)}(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&]hhuh1jhjhhhjhK\ubj.)}(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-hjhhhjhK\ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjhhhjhK\ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhK\hjhhubj)}(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.chKUhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhK\ubeh}(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.chKYhjubj)}(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.chKVhjubjC)}(hhh]j)}(hI3C bus to release the lock onh]hI3C bus to release the lock on}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhKVhjubah}(h]h ]h"]h$]h&]uh1jBhjubeh}(h]h ]h"]h$]h&]uh1j hjhKVhjubah}(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.chKXhjubj)}(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.chMtubh)}(h h]h }(hj^hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjKhhhj]hMtubj)}(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]hMtubj.)}(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]hMtubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjGhhhj]hMtubah}(h]jBah ](jjeh"]h$]h&]jj)jhuh1hhj]hMthjDhhubj)}(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.chMkhjThhubah}(h]h ]h"]h$]h&]uh1jhjDhhhj]hMtubeh}(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.chMohjsubj)}(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.chMlhjubjC)}(hhh]j)}(hI3C master objecth]hI3C master object}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMlhjubah}(h]h ]h"]h$]h&]uh1jBhjubeh}(h]h ]h"]h$]h&]uh1j hjhMlhjubj!)}(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.chMmhjubjC)}(hhh]j)}(hwhere to start searchingh]hwhere to start searching}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMmhjubah}(h]h ]h"]h$]h&]uh1jBhjubeh}(h]h ]h"]h$]h&]uh1j hjhMmhjubeh}(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.chMohjsubj)}(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.chMqhjsubeh}(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.chM(ubh)}(h h]h }(hj5hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj"hhhj4hM(ubj)}(hi3c_master_defslvs_lockedh]j)}(hi3c_master_defslvs_lockedh]hi3c_master_defslvs_locked}(hjGhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjCubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj"hhhj4hM(ubj.)}(h&(struct i3c_master_controller *master)h]j4)}(h$struct i3c_master_controller *masterh](j:)}(hj=h]hstruct}(hjchhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj_ubh)}(h h]h }(hjphhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj_ubh)}(hhh]j)}(hi3c_master_controllerh]hi3c_master_controller}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj~ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetjmodnameN classnameNjvjy)}j|]j)}jrjIsbc.i3c_master_defslvs_lockedasbuh1hhj_ubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj_ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_ubj)}(hmasterh]hmaster}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj_ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj[ubah}(h]h ]h"]h$]h&]hhuh1j-hj"hhhj4hM(ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjhhhj4hM(ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhj4hM(hjhhubj)}(hhh]j)}(hsend a DEFSLVS CCC commandh]hsend a DEFSLVS CCC command}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj4hM(ubeh}(h]h ](jpfunctioneh"]h$]h&]jjpjjjjjjjuh1hhhhhhNhNubj)}(hXO**Parameters** ``struct i3c_master_controller *master`` master used to send frames on the bus **Description** Send a DEFSLVS CCC command containing all the devices known to the **master**. This is useful when you have secondary masters on the bus to propagate device information. This should be called after all I3C devices have been discovered (in other words, after the DAA procedure has finished) and instantiated in :c:type:`i3c_master_controller_ops->bus_init\(\) `. It should also be called if a master ACKed an Hot-Join request and assigned a dynamic address to the device joining the bus. This function must be called with the bus lock held in write mode. **Return** 0 in case of success, a positive I3C error code if the error is one of the official Mx error codes, and a negative error code otherwise.h](j)}(h**Parameters**h]j)}(hjh]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.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_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}(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_set_infoh]j)}(hi3c_master_set_infoh]hi3c_master_set_info}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjhhhjhMubj.)}(hJ(struct i3c_master_controller *master, const struct i3c_device_info *info)h](j4)}(h$struct i3c_master_controller *masterh](j:)}(hj=h]hstruct}(hj*hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj&ubh)}(h h]h }(hj7hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj&ubh)}(hhh]j)}(hi3c_master_controllerh]hi3c_master_controller}(hjHhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjEubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetjJmodnameN classnameNjvjy)}j|]j)}jrjsbc.i3c_master_set_infoasbuh1hhj&ubh)}(h h]h }(hjhhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj&ubj)}(hjh]h*}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj)}(hmasterh]hmaster}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj"ubj4)}(h"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}(hjhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjubh)}(hhh]j)}(hi3c_device_infoh]hi3c_device_info}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetjmodnameN classnameNjvjy)}j|]jdc.i3c_master_set_infoasbuh1hhjubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hinfoh]hinfo}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj"ubeh}(h]h ]h"]h$]h&]hhuh1j-hjhhhjhMubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1hhjhMhjhhubj)}(hhh]j)}(hset master device informationh]hset master device information}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj6hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jpfunctioneh"]h$]h&]jjpjjQjjQjjjuh1hhhhhhNhNubj)}(hX1**Parameters** ``struct i3c_master_controller *master`` master used to send frames on the bus ``const struct i3c_device_info *info`` I3C device information **Description** Set master device info. This should be called from :c:type:`i3c_master_controller_ops->bus_init\(\) `. Not all :c:type:`i3c_device_info` fields are meaningful for a master device. Here is a list of fields that should be properly filled: - :c:type:`i3c_device_info->dyn_addr ` - :c:type:`i3c_device_info->bcr ` - :c:type:`i3c_device_info->dcr ` - :c:type:`i3c_device_info->pid ` - :c:type:`i3c_device_info->hdr_cap ` if ``I3C_BCR_HDR_CAP`` bit is set in :c:type:`i3c_device_info->bcr ` This function must be called with the bus lock held in maintenance mode. **Return** 0 if **info** contains valid information (not every piece of information can be checked, but we can at least make sure **info->dyn_addr** and **info->bcr** are correct), -EINVAL otherwise.h](j)}(h**Parameters**h]j)}(hj[h]h Parameters}(hj]hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjUubj)}(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-)}(hjzh]h$struct i3c_master_controller *master}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjxubah}(h]h ]h"]h$]h&]uh1j&hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjtubjC)}(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&]uh1jBhjtubeh}(h]h ]h"]h$]h&]uh1j hjhMhjqubj!)}(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}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjubah}(h]h ]h"]h$]h&]uh1j&hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubjC)}(hhh]j)}(hI3C device informationh]hI3C device information}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jBhjubeh}(h]h ]h"]h$]h&]uh1j hjhMhjqubeh}(h]h ]h"]h$]h&]uh1jhjUubj)}(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.chMhjUubj)}(hSet master device info. This should be called from :c:type:`i3c_master_controller_ops->bus_init\(\) `.h](h3Set master device info. This should be called from }(hjhhhNhNubh)}(hM:c:type:`i3c_master_controller_ops->bus_init\(\) `h]j-)}(hjh]h%i3c_master_controller_ops->bus_init()}(hjhhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,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.chMhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj+hMhjUubj)}(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 }(hj6hhhNhNubh)}(h:c:type:`i3c_device_info`h]j-)}(hj@h]hi3c_device_info}(hjBhhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hj>ubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjji3c_device_infouh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj6ubhd fields are meaningful for a master device. Here is a list of fields that should be properly filled:}(hj6hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj]hMhjUubh bullet_list)}(hhh](h list_item)}(h5:c:type:`i3c_device_info->dyn_addr `h]j)}(hjqh]h)}(hjqh]j-)}(hjqh]hi3c_device_info->dyn_addr}(hjyhhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjvubah}(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.chMhjsubah}(h]h ]h"]h$]h&]uh1jhjhMhjoubah}(h]h ]h"]h$]h&]uh1jmhjjubjn)}(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&]uh1jhjhMhjubah}(h]h ]h"]h$]h&]uh1jmhjjubjn)}(h0:c:type:`i3c_device_info->dcr `h]j)}(hjh]h)}(hjh]j-)}(hjh]hi3c_device_info->dcr}(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&]uh1jmhjjubjn)}(h0:c:type:`i3c_device_info->pid `h]j)}(hjh]h)}(hjh]j-)}(hjh]hi3c_device_info->pid}(hjhhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hj ubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjji3c_device_infouh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj ubah}(h]h ]h"]h$]h&]uh1jhj*hMhjubah}(h]h ]h"]h$]h&]uh1jmhjjubjn)}(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-)}(hjAh]hi3c_device_info->hdr_cap}(hjChhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hj?ubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjji3c_device_infouh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj;ubh if }(hj;hhhNhNubj-)}(h``I3C_BCR_HDR_CAP``h]hI3C_BCR_HDR_CAP}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj;ubh bit is set in }(hj;hhhNhNubh)}(h0:c:type:`i3c_device_info->bcr `h]j-)}(hjwh]hi3c_device_info->bcr}(hjyhhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjuubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjji3c_device_infouh1hhj^hMhj;ubeh}(h]h ]h"]h$]h&]uh1jhj^hMhj7ubah}(h]h ]h"]h$]h&]uh1jmhjjubeh}(h]h ]h"]h$]h&]bullet-uh1jhhjhMhjUubj)}(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.chMhjUubj)}(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.chMhjUubj)}(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 }(hjhhhNhNubj)}(h**info**h]hinfo}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhj contains valid information (not every piece of information can be checked, but we can at least make sure }(hjhhhNhNubj)}(h**info->dyn_addr**h]hinfo->dyn_addr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh and }(hjhhhNhNubj)}(h **info->bcr**h]h info->bcr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh! are correct), -EINVAL otherwise.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjUubeh}(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}(hj4hhhNhNubah}(h]h ]hah"]h$]h&]uh1hhj0hhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM9ubh)}(h h]h }(hjChhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj0hhhjBhM9ubj)}(hi3c_master_bus_inith]j)}(hi3c_master_bus_inith]hi3c_master_bus_init}(hjUhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjQubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj0hhhjBhM9ubj.)}(h&(struct i3c_master_controller *master)h]j4)}(h$struct i3c_master_controller *masterh](j:)}(hj=h]hstruct}(hjqhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjmubh)}(h h]h }(hj~hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjmubh)}(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)}jrjWsbc.i3c_master_bus_initasbuh1hhjmubh)}(h h]h }(hjhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjmubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjmubj)}(hmasterh]hmaster}(hjhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjmubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hjiubah}(h]h ]h"]h$]h&]hhuh1j-hj0hhhjBhM9ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj,hhhjBhM9ubah}(h]j'ah ](jjeh"]h$]h&]jj)jhuh1hhjBhM9hj)hhubj)}(hhh]j)}(hinitialize an I3C bush]hinitialize an I3C bus}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhj)hhhjBhM9ubeh}(h]h ](jpfunctioneh"]h$]h&]jjpjj jj jjjuh1hhhhhhNhNubj)}(hX**Parameters** ``struct i3c_master_controller *master`` main master initializing the bus **Description** This function is following all initialisation steps described in the I3C specification: 1. Attach I2C devs to the master so that the master can fill its internal device table appropriately 2. Call :c:type:`i3c_master_controller_ops->bus_init\(\) ` method to initialize the master controller. That's usually where the bus mode is selected (pure bus or mixed fast/slow bus) 3. Instruct all devices on the bus to drop their dynamic address. This is particularly important when the bus was previously configured by someone else (for example the bootloader) 4. Disable all slave events. 5. Reserve address slots for I3C devices with init_dyn_addr. And if devices also have static_addr, try to pre-assign dynamic addresses requested by the FW with SETDASA and attach corresponding statically defined I3C devices to the master. 6. Do a DAA (Dynamic Address Assignment) to assign dynamic addresses to all remaining I3C devices Once this is done, all I3C and I2C devices should be usable. **Return** a 0 in case of success, an negative error code otherwise.h](j)}(h**Parameters**h]j)}(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!)}(hJ``struct i3c_master_controller *master`` main master initializing the bus h](j')}(h(``struct i3c_master_controller *master``h]j-)}(hj5h]h$struct i3c_master_controller *master}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj3ubah}(h]h ]h"]h$]h&]uh1j&hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhj/ubjC)}(hhh]j)}(h main master initializing the bush]h main master initializing the bus}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjJhMhjKubah}(h]h ]h"]h$]h&]uh1jBhj/ubeh}(h]h ]h"]h$]h&]uh1j hjJhMhj,ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h**Description**h]j)}(hjph]h Description}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjnubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMhjubj)}(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.chMhjubhenumerated_list)}(hhh](jn)}(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}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjubah}(h]h ]h"]h$]h&]uh1jmhjubjn)}(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 }(hjhhhNhNubh)}(hM:c:type:`i3c_master_controller_ops->bus_init\(\) `h]j-)}(hjh]h%i3c_master_controller_ops->bus_init()}(hjhhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjji3c_master_controller_opsuh1hhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM#hjubh~ method to initialize the master controller. That’s usually where the bus mode is selected (pure bus or mixed fast/slow bus)}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjhM#hjubah}(h]h ]h"]h$]h&]uh1jmhjubjn)}(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)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM'hjubah}(h]h ]h"]h$]h&]uh1jmhjubjn)}(hDisable all slave events. h]j)}(hDisable all slave events.h]hDisable all slave events.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM+hjubah}(h]h ]h"]h$]h&]uh1jmhjubjn)}(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.chM-hj!ubah}(h]h ]h"]h$]h&]uh1jmhjubjn)}(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.chM2hj:ubah}(h]h ]h"]h$]h&]uh1jmhjubeh}(h]h ]h"]h$]h&]enumtypearabicprefixhsuffix.uh1jhjubj)}(h"hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj;"ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetj@"modnameN classnameNjvjy)}j|]j!c.i3c_generic_ibi_alloc_poolasbuh1hhj"ubh)}(h h]h }(hj\"hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj"ubj)}(hjh]h*}(hjj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubj)}(hdevh]hdev}(hjw"hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj"ubj4)}(hconst struct i3c_ibi_setup *reqh](j:)}(hjh]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}(hj"hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetj"modnameN classnameNjvjy)}j|]j!c.i3c_generic_ibi_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)}(hreqh]hreq}(hj#hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj"ubeh}(h]h ]h"]h$]h&]hhuh1j-hj!hhhj!hMU ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj!hhhj!hMU ubah}(h]j!ah ](jjeh"]h$]h&]jj)jhuh1hhj!hMU 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.chMM hj)#hhubah}(h]h ]h"]h$]h&]uh1jhj!hhhj!hMU ubeh}(h]h ](jpfunctioneh"]h$]h&]jjpjjD#jjD#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)}(hjN#h]h Parameters}(hjP#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjL#ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMQ hjH#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-)}(hjm#h]hstruct i3c_dev_desc *dev}(hjo#hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjk#ubah}(h]h ]h"]h$]h&]uh1j&hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMN hjg#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#hMN hj#ubah}(h]h ]h"]h$]h&]uh1jBhjg#ubeh}(h]h ]h"]h$]h&]uh1j hj#hMN hjd#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.chMO 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#hMO hj#ubah}(h]h ]h"]h$]h&]uh1jBhj#ubeh}(h]h ]h"]h$]h&]uh1j hj#hMO hjd#ubeh}(h]h ]h"]h$]h&]uh1jhjH#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.chMQ hjH#ubj)}(hGCreate a generic IBI pool based on the information provided in **req**.h](h?Create a generic IBI pool based on the information provided in }(hj#hhhNhNubj)}(h**req**h]hreq}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubh.}(hj#hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chMQ hjH#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.chMS hjH#ubj)}(h&hhhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM ubh)}(h h]h }(hjQ&hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj>&hhhjP&hM ubj)}(hi3c_generic_ibi_recycle_sloth]j)}(hi3c_generic_ibi_recycle_sloth]hi3c_generic_ibi_recycle_slot}(hjc&hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj_&ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj>&hhhjP&hM ubj.)}(h;(struct i3c_generic_ibi_pool *pool, struct i3c_ibi_slot *s)h](j4)}(h!struct i3c_generic_ibi_pool *poolh](j:)}(hj=h]hstruct}(hj&hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj{&ubh)}(h h]h }(hj&hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj{&ubh)}(hhh]j)}(hi3c_generic_ibi_poolh]hi3c_generic_ibi_pool}(hj&hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetj&modnameN classnameNjvjy)}j|]j)}jrje&sbc.i3c_generic_ibi_recycle_slotasbuh1hhj{&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&]noemphhhuh1j3hjw&ubj4)}(hstruct i3c_ibi_slot *sh](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}(hj'hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj 'ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetj'modnameN classnameNjvjy)}j|]j&c.i3c_generic_ibi_recycle_slotasbuh1hhj&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)}(hsh]hs}(hjH'hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hjw&ubeh}(h]h ]h"]h$]h&]hhuh1j-hj>&hhhjP&hM ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj:&hhhjP&hM ubah}(h]j5&ah ](jjeh"]h$]h&]jj)jhuh1hhjP&hM hj7&hhubj)}(hhh]j)}(h#Return a slot to a generic IBI poolh]h#Return a slot to a generic IBI pool}(hjr'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjo'hhubah}(h]h ]h"]h$]h&]uh1jhj7&hhhjP&hM ubeh}(h]h ](jpfunctioneh"]h$]h&]jjpjj'jj'jjjuh1hhhhhhNhNubj)}(hX(**Parameters** ``struct i3c_generic_ibi_pool *pool`` the pool to return the IBI slot to ``struct i3c_ibi_slot *s`` IBI slot to recycle **Description** Add an IBI slot back to its generic IBI pool. Should be called from the master driver struct_master_controller_ops->recycle_ibi() method.h](j)}(h**Parameters**h]j)}(hj'h]h Parameters}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.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}(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/``struct i3c_ibi_slot *s`` IBI slot to recycle h](j')}(h``struct i3c_ibi_slot *s``h]j-)}(hj'h]hstruct i3c_ibi_slot *s}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj'ubah}(h]h ]h"]h$]h&]uh1j&hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj'ubjC)}(hhh]j)}(hIBI slot to recycleh]hIBI slot to recycle}(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)}(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}(hjl(hhhNhNubah}(h]h ]hah"]h$]h&]uh1hhjh(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&]uh1hhjh(hhhjz(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&]hhuh1jhjh(hhhjz(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}(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_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)}(hmasterh]hmaster}(hj)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}(hj9)hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj6)ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetj;)modnameN classnameNjvjy)}j|]j(c.i3c_master_registerasbuh1hhj)ubh)}(h h]h }(hjW)hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj)ubj)}(hjh]h*}(hje)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj)}(hparenth]hparent}(hjr)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:)}(hjh]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}(hj)hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetj)modnameN classnameNjvjy)}j|]j(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)}(hopsh]hops}(hj)hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj(ubj4)}(hbool secondaryh](h)}(hboolh]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}(hj2*hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj(ubeh}(h]h ]h"]h$]h&]hhuh1j-hjh(hhhjz(hM ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjd(hhhjz(hM ubah}(h]j_(ah ](jjeh"]h$]h&]jj)jhuh1hhjz(hM hja(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 hjY*hhubah}(h]h ]h"]h$]h&]uh1jhja(hhhjz(hM ubeh}(h]h ](jpfunctioneh"]h$]h&]jjpjjt*jjt*jjjuh1hhhhhhNhNubj)}(hX0**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 -ENOTSUPP 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 hjx*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.chM hj*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&]uh1jBhj*ubeh}(h]h ]h"]h$]h&]uh1j hj*hM 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-)}(hj*h]hstruct device *parent}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj*ubah}(h]h ]h"]h$]h&]uh1j&hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj*ubjC)}(hhh]j)}(hDthe parent device (the one that provides this I3C master controller)h]hDthe parent device (the one that provides this I3C master controller)}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj*ubah}(h]h ]h"]h$]h&]uh1jBhj*ubeh}(h]h ]h"]h$]h&]uh1j hj*hM 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+h]h+const struct i3c_master_controller_ops *ops}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj+ubah}(h]h ]h"]h$]h&]uh1j&hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj +ubjC)}(hhh]j)}(h the master controller operationsh]h the master controller operations}(hj)+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%+hM hj&+ubah}(h]h ]h"]h$]h&]uh1jBhj +ubeh}(h]h ]h"]h$]h&]uh1j hj%+hM hj*ubj!)}(h``bool secondary`` true if you are registering a secondary master. Will return -ENOTSUPP if set to true since secondary masters are not yet supported h](j')}(h``bool secondary``h]j-)}(hjI+h]hbool secondary}(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)}(htrue if you are registering a secondary master. Will return -ENOTSUPP if set to true since secondary masters are not yet supportedh]htrue if you are registering a secondary master. Will return -ENOTSUPP if set to true since secondary masters are not yet supported}(hjb+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&]uh1jBhjC+ubeh}(h]h ]h"]h$]h&]uh1j hj^+hM hj*ubeh}(h]h ]h"]h$]h&]uh1jhjx*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 hjx*ubj)}(h/This function takes care of everything for you:h]h/This function takes care of everything for you:}(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 hjx*ubji)}(hhh](jn)}(h#creates and initializes the I3C bush]j)}(hj+h]h#creates and initializes the 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.chM hj+ubah}(h]h ]h"]h$]h&]uh1jmhj+ubjn)}(hIpopulates the bus with static I2C devs if **parent->of_node** is not NULLh]j)}(hIpopulates the bus with static I2C devs if **parent->of_node** is not NULLh](h*populates the bus with static I2C devs if }(hj+hhhNhNubj)}(h**parent->of_node**h]hparent->of_node}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubh is not NULL}(hj+hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj+ubah}(h]h ]h"]h$]h&]uh1jmhj+ubjn)}(hKregisters all I3C devices added by the controller during bus initializationh]j)}(hKregisters all I3C devices added by the controller during bus initializationh]hKregisters all I3C devices added by the controller during bus initialization}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj+ubah}(h]h ]h"]h$]h&]uh1jmhj+ubjn)}(h.registers the I2C adapter and all I2C devices h]j)}(h-registers the I2C adapter and all I2C devicesh]h-registers the I2C adapter and all I2C devices}(hj ,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hj ,ubah}(h]h ]h"]h$]h&]uh1jmhj+ubeh}(h]h ]h"]h$]h&]jjuh1jhhj+hM hjx*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 hjx*ubj)}(h60 in case of success, a negative error code otherwise.h]h60 in case of success, a negative error code otherwise.}(hj@,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM hjx*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}(hjo,hhhNhNubah}(h]h ]hah"]h$]h&]uh1hhjk,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&]uh1hhjk,hhhj},hM` ubj)}(hi3c_master_unregisterh]j)}(hi3c_master_unregisterh]hi3c_master_unregister}(hj,hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj,ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjk,hhhj},hM` ubj.)}(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_unregisterasbuh1hhj,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-hjk,hhhj},hM` ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjg,hhhj},hM` ubah}(h]jb,ah ](jjeh"]h$]h&]jj)jhuh1hhj},hM` hjd,hhubj)}(hhh]j)}(hunregister an I3C masterh]hunregister an I3C master}(hj/-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM[ hj,-hhubah}(h]h ]h"]h$]h&]uh1jhjd,hhhj},hM` ubeh}(h]h ](jpfunctioneh"]h$]h&]jjpjjG-jjG-jjjuh1hhhhhhNhNubj)}(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)}(hjQ-h]h Parameters}(hjS-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjO-ubah}(h]h ]h"]h$]h&]uh1jhd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM_ hjK-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-)}(hjp-h]h$struct i3c_master_controller *master}(hjr-hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjn-ubah}(h]h ]h"]h$]h&]uh1j&hd/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:7: ./drivers/i3c/master.chM\ hjj-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&]uh1jBhjj-ubeh}(h]h ]h"]h$]h&]uh1j hj-hM\ hjg-ubah}(h]h ]h"]h$]h&]uh1jhjK-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^ hjK-ubj)}(h8Basically undo everything done in i3c_master_register().h]h8Basically undo everything done in i3c_master_register().}(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^ hjK-ubeh}(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-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_i2c_dev_desch]j)}(hj-h]hi3c_i2c_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)}(h,Common part of the I3C/I2C device descriptorh]h,Common part of the I3C/I2C device descriptor}(hj2.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK'hj/.hhubah}(h]h ]h"]h$]h&]uh1jhj-hhhj-hKubeh}(h]h ](jpstructeh"]h$]h&]jjpjjJ.jjJ.jjjuh1hhhhhhNhNubj)}(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}(hjV.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjR.ubh:}(hjR.hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK+hjN.ubh 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; };}hjq.sbah}(h]h ]h"]h$]h&]hhuh1jo.hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK-hjN.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.hhK3hjN.ubj)}(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.h]hnode}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj.ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK*hj.ubjC)}(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.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.ubah}(h]h ]h"]h$]h&]uh1jBhj.ubeh}(h]h ]h"]h$]h&]uh1j hj.hK*hj.ubj!)}(hZ``master`` I3C master that instantiated this device. Will be used to do I2C/I3C transfers h](j')}(h ``master``h]j-)}(hj.h]hmaster}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj.ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK,hj.ubjC)}(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.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.ubah}(h]h ]h"]h$]h&]uh1jBhj.ubeh}(h]h ]h"]h$]h&]uh1j hj.hK,hj.ubj!)}(hj``master_priv`` master private data assigned to the device. Can be used to add master specific informationh](j')}(h``master_priv``h]j-)}(hj/h]h master_priv}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj/ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK-hj/ubjC)}(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}(hj./hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*/hK-hj+/ubah}(h]h ]h"]h$]h&]uh1jBhj/ubeh}(h]h ]h"]h$]h&]uh1j hj*/hK-hj.ubeh}(h]h ]h"]h$]h&]uh1jhjN.ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hjW/h]h Description}(hjY/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjU/ubah}(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/hhubah}(h]h ]h"]h$]h&]uh1jhj/hhhj/hK4ubeh}(h]h ](jpstructeh"]h$]h&]jjpjj/jj/jjjuh1hhhhhhNhNubj)}(hXl**Definition**:: struct i2c_dev_boardinfo { struct list_head node; struct i2c_board_info base; u8 lvr; }; **Members** ``node`` used to insert the boardinfo object in the I2C boardinfo list ``base`` regular I2C board information ``lvr`` LVR (Legacy Virtual Register) needed by the I3C core to know about the I2C device limitationsh](j)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hj/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.hhKBhj/ubjp.)}(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; };}hj0sbah}(h]h ]h"]h$]h&]hhuh1jo.hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKDhj/ubj)}(h **Members**h]j)}(hj%0h]hMembers}(hj'0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#0ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKJhj/ubj)}(hhh](j!)}(hG``node`` used to insert the boardinfo object in the I2C boardinfo list h](j')}(h``node``h]j-)}(hjD0h]hnode}(hjF0hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjB0ubah}(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>0ubjC)}(hhh]j)}(h=used to insert the boardinfo object in the I2C boardinfo listh]h=used to insert the boardinfo object in the I2C boardinfo list}(hj]0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjY0hK@hjZ0ubah}(h]h ]h"]h$]h&]uh1jBhj>0ubeh}(h]h ]h"]h$]h&]uh1j hjY0hK@hj;0ubj!)}(h'``base`` regular I2C board information h](j')}(h``base``h]j-)}(hj}0h]hbase}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj{0ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKAhjw0ubjC)}(hhh]j)}(hregular I2C board informationh]hregular I2C board information}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0hKAhj0ubah}(h]h ]h"]h$]h&]uh1jBhjw0ubeh}(h]h ]h"]h$]h&]uh1j hj0hKAhj;0ubj!)}(he``lvr`` LVR (Legacy Virtual Register) needed by the I3C core to know about the I2C device limitationsh](j')}(h``lvr``h]j-)}(hj0h]hlvr}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj0ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKBhj0ubjC)}(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}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0hKBhj0ubah}(h]h ]h"]h$]h&]uh1jBhj0ubeh}(h]h ]h"]h$]h&]uh1j hj0hKBhj;0ubeh}(h]h ]h"]h$]h&]uh1jhj/ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hj0h]h Description}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0ubah}(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.}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKDhhhhubh)}(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}(hj61hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj21hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKJubh)}(h h]h }(hjD1hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj21hhhjC1hKJubj)}(h i2c_dev_desch]j)}(hj01h]h i2c_dev_desc}(hjV1hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjR1ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj21hhhjC1hKJubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj.1hhhjC1hKJubah}(h]j)1ah ](jjeh"]h$]h&]jj)jhuh1hhjC1hKJhj+1hhubj)}(hhh]j)}(hI2C device descriptorh]hI2C device descriptor}(hjx1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKNhju1hhubah}(h]h ]h"]h$]h&]uh1jhj+1hhhjC1hKJubeh}(h]h ](jpstructeh"]h$]h&]jjpjj1jj1jjjuh1hhhhhhNhNubj)}(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}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubh:}(hj1hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKRhj1ubjp.)}(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; };}hj1sbah}(h]h ]h"]h$]h&]hhuh1jo.hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKThj1ubj)}(h **Members**h]j)}(hj1h]hMembers}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK[hj1ubj)}(hhh](j!)}(h4``common`` common part of the I2C device descriptor h](j')}(h ``common``h]j-)}(hj1h]hcommon}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj1ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKPhj1ubjC)}(hhh]j)}(h(common part of the I2C device descriptorh]h(common part of the I2C device descriptor}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1hKPhj1ubah}(h]h ]h"]h$]h&]uh1jBhj1ubeh}(h]h ]h"]h$]h&]uh1j hj1hKPhj1ubj!)}(h:``dev`` I2C device object registered to the I2C framework h](j')}(h``dev``h]j-)}(hj2h]hdev}(hj 2hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj2ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKQhj2ubjC)}(hhh]j)}(h1I2C device object registered to the I2C frameworkh]h1I2C device object registered to the I2C framework}(hj72hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj32hKQhj42ubah}(h]h ]h"]h$]h&]uh1jBhj2ubeh}(h]h ]h"]h$]h&]uh1j hj32hKQhj1ubj!)}(h``addr`` I2C device address h](j')}(h``addr``h]j-)}(hjW2h]haddr}(hjY2hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjU2ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKRhjQ2ubjC)}(hhh]j)}(hI2C device addressh]hI2C device address}(hjp2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjl2hKRhjm2ubah}(h]h ]h"]h$]h&]uh1jBhjQ2ubeh}(h]h ]h"]h$]h&]uh1j hjl2hKRhj1ubj!)}(he``lvr`` LVR (Legacy Virtual Register) needed by the I3C core to know about the I2C device limitationsh](j')}(h``lvr``h]j-)}(hj2h]hlvr}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj2ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKShj2ubjC)}(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}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2hKShj2ubah}(h]h ]h"]h$]h&]uh1jBhj2ubeh}(h]h ]h"]h$]h&]uh1j hj2hKShj1ubeh}(h]h ]h"]h$]h&]uh1jhj1ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hj2h]h Description}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubah}(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 }(hj2hhhNhNubh)}(hJ:c:type:`struct_i3c_master_controller->ops `h]j-)}(hj2h]h!struct_i3c_master_controller->ops}(hj2hhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hj2ubah}(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.hhKUhj2ubh->attach_i2c_dev().}(hj2hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj3hKUhhhhubj)}(h:c:type:`struct_i2c_dev_desc <_i2c_dev_desc>` is the internal representation of an I2C device connected on an I3C bus. This object is also passed to all :c:type:`struct_i3c_master_controller_ops <_i3c_master_controller_ops>` hooks.h](h)}(h-:c:type:`struct_i2c_dev_desc <_i2c_dev_desc>`h]j-)}(hj 3h]hstruct_i2c_dev_desc}(hj"3hhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hj3ubah}(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.hhKYhj3ubhl is the internal representation of an I2C device connected on an I3C bus. This object is also passed to all }(hj3hhhNhNubh)}(hG:c:type:`struct_i3c_master_controller_ops <_i3c_master_controller_ops>`h]j-)}(hjD3h]h struct_i3c_master_controller_ops}(hjF3hhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjB3ubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjj_i3c_master_controller_opsuh1hhj=3hKYhj3ubh hooks.}(hj3hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj=3hKYhhhhubh)}(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}(hj3hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj3hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK`ubh)}(h h]h }(hj3hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj3hhhj3hK`ubj)}(h i3c_ibi_sloth]j)}(hj~3h]h i3c_ibi_slot}(hj3hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj3ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj3hhhj3hK`ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj|3hhhj3hK`ubah}(h]jw3ah ](jjeh"]h$]h&]jj)jhuh1hhj3hK`hjy3hhubj)}(hhh]j)}(h I3C IBI (In-Band Interrupt) sloth]h I3C IBI (In-Band Interrupt) slot}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKehj3hhubah}(h]h ]h"]h$]h&]uh1jhjy3hhhj3hK`ubeh}(h]h ](jpstructeh"]h$]h&]jjpjj3jj3jjjuh1hhhhhhNhNubj)}(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}(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.hhKihj3ubjp.)}(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; };}hj4sbah}(h]h ]h"]h$]h&]hhuh1jo.hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKkhj3ubj)}(h **Members**h]j)}(hj4h]hMembers}(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.hhKrhj3ubj)}(hhh](j!)}(hQ``work`` work associated to this slot. The IBI handler will be called from there h](j')}(h``work``h]j-)}(hj34h]hwork}(hj54hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj14ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhhj-4ubjC)}(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}(hjL4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKghjI4ubah}(h]h ]h"]h$]h&]uh1jBhj-4ubeh}(h]h ]h"]h$]h&]uh1j hjH4hKhhj*4ubj!)}(h3``dev`` the I3C device that has generated this IBI h](j')}(h``dev``h]j-)}(hjm4h]hdev}(hjo4hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjk4ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKihjg4ubjC)}(hhh]j)}(h*the I3C device that has generated this IBIh]h*the I3C device that has generated this IBI}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4hKihj4ubah}(h]h ]h"]h$]h&]uh1jBhjg4ubeh}(h]h ]h"]h$]h&]uh1j hj4hKihj*4ubj!)}(h5``len`` length of the payload associated to this IBI h](j')}(h``len``h]j-)}(hj4h]hlen}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj4ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKjhj4ubjC)}(hhh]j)}(h,length of the payload associated to this IBIh]h,length of the payload associated to this IBI}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4hKjhj4ubah}(h]h ]h"]h$]h&]uh1jBhj4ubeh}(h]h ]h"]h$]h&]uh1j hj4hKjhj*4ubj!)}(h``data`` payload bufferh](j')}(h``data``h]j-)}(hj4h]hdata}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj4ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKjhj4ubjC)}(hhh]j)}(hpayload bufferh]hpayload buffer}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKkhj4ubah}(h]h ]h"]h$]h&]uh1jBhj4ubeh}(h]h ]h"]h$]h&]uh1j hj4hKjhj*4ubeh}(h]h ]h"]h$]h&]uh1jhj3ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hj"5h]h Description}(hj$5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj 5ubah}(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().}(hj85hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKlhhhhubj)}(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.}(hjG5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKrhhhhubh)}(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}(hjo5hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjk5hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKxubh)}(h h]h }(hj}5hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjk5hhhj|5hKxubj)}(hi3c_device_ibi_infoh]j)}(hji5h]hi3c_device_ibi_info}(hj5hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj5ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjk5hhhj|5hKxubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjg5hhhj|5hKxubah}(h]jb5ah ](jjeh"]h$]h&]jj)jhuh1hhj|5hKxhjd5hhubj)}(hhh]j)}(h-IBI information attached to a specific deviceh]h-IBI information attached to a specific device}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhK}hj5hhubah}(h]h ]h"]h$]h&]uh1jhjd5hhhj|5hKxubeh}(h]h ](jpstructeh"]h$]h&]jjpjj5jj5jjjuh1hhhhhhNhNubj)}(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}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5ubh:}(hj5hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj5ubjp.)}(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); };}hj5sbah}(h]h ]h"]h$]h&]hhuh1jo.hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj5ubj)}(h **Members**h]j)}(hj5h]hMembers}(hj6hhhNhNubah}(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.hhKhj5ubj)}(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-)}(hj6h]hall_ibis_handled}(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.hhKhj6ubjC)}(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}(hj76hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj46ubah}(h]h ]h"]h$]h&]uh1jBhj6ubeh}(h]h ]h"]h$]h&]uh1j hj36hKhj6ubj!)}(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-)}(hjX6h]h pending_ibis}(hjZ6hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjV6ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjR6ubjC)}(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}(hjq6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjn6ubah}(h]h ]h"]h$]h&]uh1jBhjR6ubeh}(h]h ]h"]h$]h&]uh1j hjm6hKhj6ubj!)}(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-)}(hj6h]hmax_payload_len}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj6ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj6ubjC)}(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}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj6ubah}(h]h ]h"]h$]h&]uh1jBhj6ubeh}(h]h ]h"]h$]h&]uh1j hj6hKhj6ubj!)}(h;``num_slots`` number of IBI slots reserved for this device h](j')}(h ``num_slots``h]j-)}(hj6h]h num_slots}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj6ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj6ubjC)}(hhh]j)}(h,number of IBI slots reserved for this deviceh]h,number of IBI slots reserved for this device}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6hKhj6ubah}(h]h ]h"]h$]h&]uh1jBhj6ubeh}(h]h ]h"]h$]h&]uh1j hj6hKhj6ubj!)}(h#``enabled`` reflect the IBI status h](j')}(h ``enabled``h]j-)}(hj7h]henabled}(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.hhKhj6ubjC)}(hhh]j)}(hreflect the IBI statush]hreflect the IBI status}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7hKhj7ubah}(h]h ]h"]h$]h&]uh1jBhj6ubeh}(h]h ]h"]h$]h&]uh1j hj7hKhj6ubj!)}(h/``wq`` workqueue used to execute IBI handlers. h](j')}(h``wq``h]j-)}(hj>7h]hwq}(hj@7hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj<7ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj87ubjC)}(hhh]j)}(h'workqueue used to execute IBI handlers.h]h'workqueue used to execute IBI handlers.}(hjW7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjS7hKhjT7ubah}(h]h ]h"]h$]h&]uh1jBhj87ubeh}(h]h ]h"]h$]h&]uh1j hjS7hKhj6ubj!)}(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-)}(hjw7h]hhandler}(hjy7hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hju7ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjq7ubjC)}(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}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj7ubah}(h]h ]h"]h$]h&]uh1jBhjq7ubeh}(h]h ]h"]h$]h&]uh1j hj7hKhj6ubeh}(h]h ]h"]h$]h&]uh1jhj5ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hj7h]h Description}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj7ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.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 }(hj7hhhNhNubh)}(h;:c:type:`struct_i3c_device_ibi_info <_i3c_device_ibi_info>`h]j-)}(hj7h]hstruct_i3c_device_ibi_info}(hj7hhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hj7ubah}(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.hhKhj7ubh 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.}(hj7hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj7hKhhhhubj)}(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.}(hj8hhhNhNubah}(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*8hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj&8hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKubh)}(h h]h }(hj88hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj&8hhhj78hKubj)}(hi3c_dev_boardinfoh]j)}(hj$8h]hi3c_dev_boardinfo}(hjJ8hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjF8ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj&8hhhj78hKubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj"8hhhj78hKubah}(h]j8ah ](jjeh"]h$]h&]jj)jhuh1hhj78hKhj8hhubj)}(hhh]j)}(hI3C device board informationh]hI3C device board information}(hjl8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhji8hhubah}(h]h ]h"]h$]h&]uh1jhj8hhhj78hKubeh}(h]h ](jpstructeh"]h$]h&]jjpjj8jj8jjjuh1hhhhhhNhNubj)}(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}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubh:}(hj8hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj8ubjp.)}(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; };}hj8sbah}(h]h ]h"]h$]h&]hhuh1jo.hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj8ubj)}(h **Members**h]j)}(hj8h]hMembers}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj8ubj)}(hhh](j!)}(hG``node`` used to insert the boardinfo object in the I3C boardinfo list h](j')}(h``node``h]j-)}(hj8h]hnode}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj8ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj8ubjC)}(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}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj8hKhj8ubah}(h]h ]h"]h$]h&]uh1jBhj8ubeh}(h]h ]h"]h$]h&]uh1j hj8hKhj8ubj!)}(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-)}(hj9h]h init_dyn_addr}(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.hhKhj 9ubjC)}(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+9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj(9ubah}(h]h ]h"]h$]h&]uh1jBhj 9ubeh}(h]h ]h"]h$]h&]uh1j hj'9hKhj8ubj!)}(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-)}(hjL9h]h static_addr}(hjN9hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjJ9ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjF9ubjC)}(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)}(hje9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjb9ubah}(h]h ]h"]h$]h&]uh1jBhjF9ubeh}(h]h ]h"]h$]h&]uh1j hja9hKhj8ubj!)}(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-)}(hj9h]hpid}(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.hhKhj9ubjC)}(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}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj9ubah}(h]h ]h"]h$]h&]uh1jBhj9ubeh}(h]h ]h"]h$]h&]uh1j hj9hKhj8ubj!)}(hL``of_node`` optional DT node in case the device has been described in the DTh](j')}(h ``of_node``h]j-)}(hj9h]hof_node}(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.hhKhj9ubjC)}(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}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj9ubah}(h]h ]h"]h$]h&]uh1jBhj9ubeh}(h]h ]h"]h$]h&]uh1j hj9hKhj8ubeh}(h]h ]h"]h$]h&]uh1jhj8ubeh}(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)}(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}(hjA: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 }(hjO:hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj=:hhhjN:hKubj)}(h i3c_dev_desch]j)}(hj;:h]h i3c_dev_desc}(hja:hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj]:ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj=:hhhjN:hKubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj9:hhhjN:hKubah}(h]j4:ah ](jjeh"]h$]h&]jj)jhuh1hhjN:hKhj6: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&]uh1jhj6:hhhjN: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:ubjp.)}(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&]hhuh1jo.hj/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,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(common part of the I3C device descriptorh]h(common part of the I3C device descriptor}(hj ;hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;hKhj;ubah}(h]h ]h"]h$]h&]uh1jBhj:ubeh}(h]h ]h"]h$]h&]uh1j hj;hKhj:ubj!)}(h``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()}(hjB;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[``ibi_lock`` lock used to protect the :c:type:`struct_i3c_device->ibi ` h](j')}(h ``ibi_lock``h]j-)}(hjc;h]hibi_lock}(hje;hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hja;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_deviceuh1hhjx;hKhj|;ubeh}(h]h ]h"]h$]h&]uh1jhjx;hKhjy;ubah}(h]h ]h"]h$]h&]uh1jBhj];ubeh}(h]h ]h"]h$]h&]uh1j hjx;hKhj: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;h]hibi}(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)}(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;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!)}(hX``dev`` pointer to the I3C device object exposed to I3C device drivers. This should never be accessed from I3C master controller drivers. Only core code should manipulate it in when updating the dev <-> desc link or when propagating IBI events to the driver h](j')}(h``dev``h]j-)}(hj;h]hdev}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj;ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj;ubjC)}(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}(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!)}(hB``boardinfo`` pointer to the boardinfo attached to this I3C deviceh](j')}(h ``boardinfo``h]j-)}(hj/<h]h boardinfo}(hj1<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)}(h4pointer to the boardinfo attached to this I3C deviceh]h4pointer to the boardinfo attached to this I3C device}(hjH<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhjE<ubah}(h]h ]h"]h$]h&]uh1jBhj)<ubeh}(h]h ]h"]h$]h&]uh1j hjD<hKhj:ubeh}(h]h ]h"]h$]h&]uh1jhj:ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hjr<h]h Description}(hjt<hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjp<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)}(hXXInternal representation of an I3C device. This object is only used by the core and passed to I3C master controller drivers when they're requested to do some operations on the device. The core maintains the link between the internal I3C dev descriptor and the object exposed to the I3C device drivers (:c:type:`struct_i3c_device <_i3c_device>`).h](hX/Internal representation of an I3C device. This object is only used by the core and passed to I3C master controller drivers when they’re requested to do some operations on the device. The core maintains the link between the internal I3C dev descriptor and the object exposed to the I3C device drivers (}(hj<hhhNhNubh)}(h):c:type:`struct_i3c_device <_i3c_device>`h]j-)}(hj<h]hstruct_i3c_device}(hj<hhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hj<ubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjj _i3c_deviceuh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj<ubh).}(hj<hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj<hKhhhhubh)}(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<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_deviceh]j)}(hj<h]h i3c_device}(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 objecth]hI3C device object}(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_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}(hj9=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj5=ubh:}(hj5=hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj1=ubjp.)}(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; };}hjR=sbah}(h]h ]h"]h$]h&]hhuh1jo.hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj1=ubj)}(h **Members**h]j)}(hjc=h]hMembers}(hje=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhja=ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj1=ubj)}(hhh](j!)}(hB``dev`` device object to register the I3C dev to the device model h](j')}(h``dev``h]j-)}(hj=h]hdev}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj=ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhKhj|=ubjC)}(hhh]j)}(h9device object to register the I3C dev to the device modelh]h9device object to register the I3C dev to the device model}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=hKhj=ubah}(h]h ]h"]h$]h&]uh1jBhj|=ubeh}(h]h ]h"]h$]h&]uh1j hj=hKhjy=ubj!)}(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=h]hdesc}(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)}(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=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=hKhjy=ubj!)}(h*``bus`` I3C bus this device is attached toh](j')}(h``bus``h]j-)}(hj=h]hbus}(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"I3C bus this device is attached toh]h"I3C bus this device is attached to}(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 >hKhjy=ubeh}(h]h ]h"]h$]h&]uh1jhj1=ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hj8>h]h Description}(hj:>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6>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)}(hX0I3C device object exposed to I3C device drivers. The takes care of linking this object to the relevant :c:type:`struct_i3c_dev_desc <_i3c_dev_desc>` one. All I3C devs on the I3C bus are represented, including I3C masters. For each of them, we have an instance of :c:type:`struct i3c_device `.h](hgI3C device object exposed to I3C device drivers. The takes care of linking this object to the relevant }(hjN>hhhNhNubh)}(h-:c:type:`struct_i3c_dev_desc <_i3c_dev_desc>`h]j-)}(hjX>h]hstruct_i3c_dev_desc}(hjZ>hhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjV>ubah}(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.hhKhjN>ubhs one. All I3C devs on the I3C bus are represented, including I3C masters. For each of them, we have an instance of }(hjN>hhhNhNubh)}(h(:c:type:`struct i3c_device `h]j-)}(hj|>h]hstruct i3c_device}(hj~>hhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjz>ubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjj i3c_deviceuh1hhju>hKhjN>ubh.}(hjN>hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhju>hKhhhhubh)}(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:)}(henumh]henum}(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_bus_modeh]j)}(hj>h]h i3c_bus_mode}(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)}(h I3C bus modeh]h I3C bus mode}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj>hhubah}(h]h ]h"]h$]h&]uh1jhj>hhhj>hKubeh}(h]h ](jpenumeh"]h$]h&]jjpjj?jj?jjjuh1hhhhhhNhNubj)}(hXX**Constants** ``I3C_BUS_MODE_PURE`` only I3C devices are connected to the bus. No limitation expected ``I3C_BUS_MODE_MIXED_FAST`` I2C devices with 50ns spike filter are present on the bus. The only impact in this mode is that the high SCL pulse has to stay below 50ns to trick I2C devices when transmitting I3C frames ``I3C_BUS_MODE_MIXED_LIMITED`` I2C devices without 50ns spike filter are present on the bus. However they allow compliance up to the maximum SDR SCL clock frequency. ``I3C_BUS_MODE_MIXED_SLOW`` I2C devices without 50ns spike filter are present on the bush](j)}(h **Constants**h]j)}(hj!?h]h Constants}(hj#?hhhNhNubah}(h]h ]h"]h$]h&]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.hhMhj?ubj)}(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-)}(hj@?h]hI3C_BUS_MODE_PURE}(hjB?hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj>?ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM hj:?ubjC)}(hhh]j)}(hAonly I3C devices are connected to the bus. No limitation expectedh]hAonly I3C devices are connected to the bus. No limitation expected}(hjY?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 hjV?ubah}(h]h ]h"]h$]h&]uh1jBhj:?ubeh}(h]h ]h"]h$]h&]uh1j hjU?hM hj7?ubj!)}(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-)}(hjz?h]hI3C_BUS_MODE_MIXED_FAST}(hj|?hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjx?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.hhMhjt?ubjC)}(hhh]j)}(hI2C devices with 50ns spike filter are present on the bus. The only impact in this mode is that the high SCL pulse has to stay below 50ns to trick I2C devices when transmitting I3C framesh]hI2C devices with 50ns spike filter are present on the bus. The only impact in this mode is that the high SCL pulse has to stay below 50ns to trick I2C devices when transmitting I3C frames}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj?ubah}(h]h ]h"]h$]h&]uh1jBhjt?ubeh}(h]h ]h"]h$]h&]uh1j hj?hMhj7?ubj!)}(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-)}(hj?h]hI3C_BUS_MODE_MIXED_LIMITED}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj?ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj?ubjC)}(hhh]j)}(hI2C devices without 50ns spike filter are present on the bus. However they allow compliance up to the maximum SDR SCL clock frequency.h]hI2C devices without 50ns spike filter are present on the bus. However they allow compliance up to the maximum SDR SCL clock frequency.}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj?ubah}(h]h ]h"]h$]h&]uh1jBhj?ubeh}(h]h ]h"]h$]h&]uh1j hj?hMhj7?ubj!)}(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-)}(hj?h]hI3C_BUS_MODE_MIXED_SLOW}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj?ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj?ubjC)}(hhh]j)}(hh]henum}(hjG@hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjC@hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM!ubh)}(h h]h }(hjU@hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjC@hhhjT@hM!ubj)}(hi3c_open_drain_speedh]j)}(hjA@h]hi3c_open_drain_speed}(hjg@hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjc@ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjC@hhhjT@hM!ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj?@hhhjT@hM!ubah}(h]j:@ah ](jjeh"]h$]h&]jj)jhuh1hhjT@hM!hj<@hhubj)}(hhh]j)}(hI3C open-drain speedh]hI3C open-drain speed}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj@hhubah}(h]h ]h"]h$]h&]uh1jhj<@hhhjT@hM!ubeh}(h]h ](jpenumeh"]h$]h&]jjpjj@jj@jjjuh1hhhhhhNhNubj)}(hXy**Constants** ``I3C_OPEN_DRAIN_SLOW_SPEED`` Slow open-drain speed for sending the first broadcast address. The first broadcast address at this speed will be visible to all devices on the I3C bus. I3C devices working in I2C mode will turn off their spike filter when switching into I3C mode. ``I3C_OPEN_DRAIN_NORMAL_SPEED`` Normal open-drain speed in I3C bus mode.h](j)}(h **Constants**h]j)}(hj@h]h Constants}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj@ubj)}(hhh](j!)}(hX``I3C_OPEN_DRAIN_SLOW_SPEED`` Slow open-drain speed for sending the first broadcast address. The first broadcast address at this speed will be visible to all devices on the I3C bus. I3C devices working in I2C mode will turn off their spike filter when switching into I3C mode. h](j')}(h``I3C_OPEN_DRAIN_SLOW_SPEED``h]j-)}(hj@h]hI3C_OPEN_DRAIN_SLOW_SPEED}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj@ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM$hj@ubjC)}(hhh]j)}(hSlow open-drain speed for sending the first broadcast address. The first broadcast address at this speed will be visible to all devices on the I3C bus. I3C devices working in I2C mode will turn off their spike filter when switching into I3C mode.h]hSlow open-drain speed for sending the first broadcast address. The first broadcast address at this speed will be visible to all devices on the I3C bus. I3C devices working in I2C mode will turn off their spike filter when switching into I3C mode.}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM hj@ubah}(h]h ]h"]h$]h&]uh1jBhj@ubeh}(h]h ]h"]h$]h&]uh1j hj@hM$hj@ubj!)}(hH``I3C_OPEN_DRAIN_NORMAL_SPEED`` Normal open-drain speed in I3C bus mode.h](j')}(h``I3C_OPEN_DRAIN_NORMAL_SPEED``h]j-)}(hjAh]hI3C_OPEN_DRAIN_NORMAL_SPEED}(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.hhM&hj@ubjC)}(hhh]j)}(h(Normal open-drain speed in I3C bus mode.h]h(Normal open-drain speed in I3C bus mode.}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM'hjAubah}(h]h ]h"]h$]h&]uh1jBhj@ubeh}(h]h ]h"]h$]h&]uh1j hjAhM&hj@ubeh}(h]h ]h"]h$]h&]uh1jhj@ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h֌i3c_addr_slot_status (C enum)c.i3c_addr_slot_statushNtauh1hhhhhhNhNubh)}(hhh](h)}(hi3c_addr_slot_statush]h)}(henum i3c_addr_slot_statush](j:)}(hj>h]henum}(hj^AhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjZAhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM-ubh)}(h h]h }(hjlAhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjZAhhhjkAhM-ubj)}(hi3c_addr_slot_statush]j)}(hjXAh]hi3c_addr_slot_status}(hj~AhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjzAubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjZAhhhjkAhM-ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjVAhhhjkAhM-ubah}(h]jQAah ](jjeh"]h$]h&]jj)jhuh1hhjkAhM-hjSAhhubj)}(hhh]j)}(hI3C address slot statush]hI3C address slot status}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM'hjAhhubah}(h]h ]h"]h$]h&]uh1jhjSAhhhjkAhM-ubeh}(h]h ](jpenumeh"]h$]h&]jjpjjAjjAjjjuh1hhhhhhNhNubj)}(hX**Constants** ``I3C_ADDR_SLOT_FREE`` address is free ``I3C_ADDR_SLOT_RSVD`` address is reserved ``I3C_ADDR_SLOT_I2C_DEV`` address is assigned to an I2C device ``I3C_ADDR_SLOT_I3C_DEV`` address is assigned to an I3C device ``I3C_ADDR_SLOT_STATUS_MASK`` address slot mask ``I3C_ADDR_SLOT_EXT_STATUS_MASK`` address slot mask with extended information ``I3C_ADDR_SLOT_EXT_DESIRED`` the bitmask represents addresses that are preferred by some devices, such as the "assigned-address" property in a device tree source. On an I3C bus, addresses are assigned dynamically, and we need to know which addresses are free to use and which ones are already assigned.h](j)}(h **Constants**h]j)}(hjAh]h Constants}(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.hhM+hjAubj)}(hhh](j!)}(h'``I3C_ADDR_SLOT_FREE`` address is free h](j')}(h``I3C_ADDR_SLOT_FREE``h]j-)}(hjAh]hI3C_ADDR_SLOT_FREE}(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.hhM.hjAubjC)}(hhh]j)}(haddress is freeh]haddress is free}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAhM.hjAubah}(h]h ]h"]h$]h&]uh1jBhjAubeh}(h]h ]h"]h$]h&]uh1j hjAhM.hjAubj!)}(h+``I3C_ADDR_SLOT_RSVD`` address is reserved h](j')}(h``I3C_ADDR_SLOT_RSVD``h]j-)}(hjBh]hI3C_ADDR_SLOT_RSVD}(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.hhM1hjBubjC)}(hhh]j)}(haddress is reservedh]haddress is reserved}(hj3BhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/BhM1hj0Bubah}(h]h ]h"]h$]h&]uh1jBhjBubeh}(h]h ]h"]h$]h&]uh1j hj/BhM1hjAubj!)}(h?``I3C_ADDR_SLOT_I2C_DEV`` address is assigned to an I2C device h](j')}(h``I3C_ADDR_SLOT_I2C_DEV``h]j-)}(hjSBh]hI3C_ADDR_SLOT_I2C_DEV}(hjUBhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjQBubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM4hjMBubjC)}(hhh]j)}(h$address is assigned to an I2C deviceh]h$address is assigned to an I2C device}(hjlBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhBhM4hjiBubah}(h]h ]h"]h$]h&]uh1jBhjMBubeh}(h]h ]h"]h$]h&]uh1j hjhBhM4hjAubj!)}(h?``I3C_ADDR_SLOT_I3C_DEV`` address is assigned to an I3C device h](j')}(h``I3C_ADDR_SLOT_I3C_DEV``h]j-)}(hjBh]hI3C_ADDR_SLOT_I3C_DEV}(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.hhM7hjBubjC)}(hhh]j)}(h$address is assigned to an I3C deviceh]h$address is assigned to an I3C device}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBhM7hjBubah}(h]h ]h"]h$]h&]uh1jBhjBubeh}(h]h ]h"]h$]h&]uh1j hjBhM7hjAubj!)}(h0``I3C_ADDR_SLOT_STATUS_MASK`` address slot mask h](j')}(h``I3C_ADDR_SLOT_STATUS_MASK``h]j-)}(hjBh]hI3C_ADDR_SLOT_STATUS_MASK}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjBubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM:hjBubjC)}(hhh]j)}(haddress slot maskh]haddress slot mask}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBhM:hjBubah}(h]h ]h"]h$]h&]uh1jBhjBubeh}(h]h ]h"]h$]h&]uh1j hjBhM:hjAubj!)}(hN``I3C_ADDR_SLOT_EXT_STATUS_MASK`` address slot mask with extended information h](j')}(h!``I3C_ADDR_SLOT_EXT_STATUS_MASK``h]j-)}(hjBh]hI3C_ADDR_SLOT_EXT_STATUS_MASK}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjBubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM=hjBubjC)}(hhh]j)}(h+address slot mask with extended informationh]h+address slot mask with extended information}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjChM=hjCubah}(h]h ]h"]h$]h&]uh1jBhjBubeh}(h]h ]h"]h$]h&]uh1j hjChM=hjAubj!)}(hX/``I3C_ADDR_SLOT_EXT_DESIRED`` the bitmask represents addresses that are preferred by some devices, such as the "assigned-address" property in a device tree source. On an I3C bus, addresses are assigned dynamically, and we need to know which addresses are free to use and which ones are already assigned.h](j')}(h``I3C_ADDR_SLOT_EXT_DESIRED``h]j-)}(hj7Ch]hI3C_ADDR_SLOT_EXT_DESIRED}(hj9ChhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj5Cubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMBhj1CubjC)}(hhh]j)}(hXthe bitmask represents addresses that are preferred by some devices, such as the "assigned-address" property in a device tree source. On an I3C bus, addresses are assigned dynamically, and we need to know which addresses are free to use and which ones are already assigned.h]hXthe bitmask represents addresses that are preferred by some devices, such as the “assigned-address” property in a device tree source. On an I3C bus, addresses are assigned dynamically, and we need to know which addresses are free to use and which ones are already assigned.}(hjPChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM@hjMCubah}(h]h ]h"]h$]h&]uh1jBhj1Cubeh}(h]h ]h"]h$]h&]uh1j hjLChMBhjAubeh}(h]h ]h"]h$]h&]uh1jhjAubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hjzCh]h Description}(hj|ChhhNhNubah}(h]h ]h"]h$]h&]uh1jhjxCubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMFhhhhubj)}(h]Addresses marked as reserved are those reserved by the I3C protocol (broadcast address, ...).h]h]Addresses marked as reserved are those reserved by the I3C protocol (broadcast address, ...).}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM3hhhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h֌i3c_bus (C struct) c.i3c_bushNtauh1hhhhhhNhNubh)}(hhh](h)}(hi3c_bush]h)}(hstruct i3c_bush](j:)}(hj=h]hstruct}(hjChhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjChhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM9ubh)}(h h]h }(hjChhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjChhhjChM9ubj)}(hi3c_bush]j)}(hjCh]hi3c_bus}(hjChhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjCubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjChhhjChM9ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjChhhjChM9ubah}(h]jCah ](jjeh"]h$]h&]jj)jhuh1hhjChM9hjChhubj)}(hhh]j)}(hI3C bus objecth]hI3C bus object}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMChjChhubah}(h]h ]h"]h$]h&]uh1jhjChhhjChM9ubeh}(h]h ](jpstructeh"]h$]h&]jjpjjDjjDjjjuh1hhhhhhNhNubj)}(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}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDubh:}(hjDhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMGhjDubjp.)}(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; };}hj7Dsbah}(h]h ]h"]h$]h&]hhuh1jo.hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMIhjDubj)}(h **Members**h]j)}(hjHDh]hMembers}(hjJDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFDubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMYhjDubj)}(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-)}(hjgDh]h cur_master}(hjiDhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjeDubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMHhjaDubjC)}(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}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMEhj}Dubah}(h]h ]h"]h$]h&]uh1jBhjaDubeh}(h]h ]h"]h$]h&]uh1j hj|DhMHhj^Dubj!)}(h?``id`` bus ID. Assigned by the framework when register the bus h](j')}(h``id``h]j-)}(hjDh]hid}(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.hhMIhjDubjC)}(hhh]j)}(h7bus ID. Assigned by the framework when register the bush]h7bus ID. Assigned by the framework when register the bus}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjDhMIhjDubah}(h]h ]h"]h$]h&]uh1jBhjDubeh}(h]h ]h"]h$]h&]uh1j hjDhMIhj^Dubj!)}(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-)}(hjDh]h addrslots}(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.hhMLhjDubjC)}(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 }(hjDhhhNhNubh)}(h::c:type:`enum i3c_addr_slot_status `h]j-)}(hjDh]henum i3c_addr_slot_status}(hjDhhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjDubah}(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.hhMJhjDubh)}(hjDhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjEhMJhjDubah}(h]h ]h"]h$]h&]uh1jBhjDubeh}(h]h ]h"]h$]h&]uh1j hjDhMLhj^Dubj!)}(hC``mode`` bus mode (see :c:type:`enum i3c_bus_mode `) h](j')}(h``mode``h]j-)}(hj7Eh]hmode}(hj9EhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj5Eubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMMhj1EubjC)}(hhh]j)}(h9bus mode (see :c:type:`enum i3c_bus_mode `)h](hbus mode (see }(hjPEhhhNhNubh)}(h*:c:type:`enum i3c_bus_mode `h]j-)}(hjZEh]henum i3c_bus_mode}(hj\EhhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjXEubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjj i3c_bus_modeuh1hhjLEhMMhjPEubh)}(hjPEhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjLEhMMhjMEubah}(h]h ]h"]h$]h&]uh1jBhj1Eubeh}(h]h ]h"]h$]h&]uh1j hjLEhMMhj^Dubj!)}(h2``scl_rate`` SCL signal rate for I3C and I2C mode h](j')}(h ``scl_rate``h]j-)}(hjEh]hscl_rate}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjEubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMQhjEubjC)}(hhh]j)}(h$SCL signal rate for I3C and I2C modeh]h$SCL signal rate for I3C and I2C mode}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjEhMQhjEubah}(h]h ]h"]h$]h&]uh1jBhjEubeh}(h]h ]h"]h$]h&]uh1j hjEhMQhj^Dubj!)}(hU``scl_rate.i3c`` maximum rate for the clock signal when doing I3C SDR/priv transfers h](j')}(h``scl_rate.i3c``h]j-)}(hjEh]h scl_rate.i3c}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjEubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMOhjEubjC)}(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}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMNhjEubah}(h]h ]h"]h$]h&]uh1jBhjEubeh}(h]h ]h"]h$]h&]uh1j hjEhMOhj^Dubj!)}(hL``scl_rate.i2c`` maximum rate for the clock signal when doing I2C transfers h](j')}(h``scl_rate.i2c``h]j-)}(hjFh]h scl_rate.i2c}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjFubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMPhjFubjC)}(hhh]j)}(h:maximum rate for the clock signal when doing I2C transfersh]h:maximum rate for the clock signal when doing I2C transfers}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjFhMPhjFubah}(h]h ]h"]h$]h&]uh1jBhjFubeh}(h]h ]h"]h$]h&]uh1j hjFhMPhj^Dubj!)}(hE``devs`` 2 lists containing all I3C/I2C devices connected to the bus h](j')}(h``devs``h]j-)}(hj?Fh]hdevs}(hjAFhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj=Fubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMXhj9FubjC)}(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}(hjXFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjTFhMXhjUFubah}(h]h ]h"]h$]h&]uh1jBhj9Fubeh}(h]h ]h"]h$]h&]uh1j hjTFhMXhj^Dubj!)}(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-)}(hjxFh]hdevs.i3c}(hjzFhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjvFubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMThjrFubjC)}(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}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMRhjFubah}(h]h ]h"]h$]h&]uh1jBhjrFubeh}(h]h ]h"]h$]h&]uh1j hjFhMThj^Dubj!)}(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-)}(hjFh]hdevs.i2c}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjFubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMWhjFubjC)}(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}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMUhjFubah}(h]h ]h"]h$]h&]uh1jBhjFubeh}(h]h ]h"]h$]h&]uh1j hjFhMWhj^Dubj!)}(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-)}(hjFh]hlock}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjFubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMahjFubjC)}(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}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMYhjGubah}(h]h ]h"]h$]h&]uh1jBhjFubeh}(h]h ]h"]h$]h&]uh1j hjGhMahj^Dubeh}(h]h ]h"]h$]h&]uh1jhjDubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubj)}(h**Description**h]j)}(hj/Gh]h Description}(hj1GhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-Gubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMehhhhubj)}(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.}(hjEGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMchhhhubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h֌$i3c_master_controller_ops (C struct)c.i3c_master_controller_opshNtauh1hhhhhhNhNubh)}(hhhW](h)}(hi3c_master_controller_opsh]h)}(h struct i3c_master_controller_opsh](j:)}(hj=h]hstruct}(hjmGhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjiGhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMkubh)}(h h]h }(hj{GhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjiGhhhjzGhMkubj)}(hi3c_master_controller_opsh]j)}(hjgGh]hi3c_master_controller_ops}(hjGhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjGubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjiGhhhjzGhMkubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjeGhhhjzGhMkubah}(h]j`Gah ](jjeh"]h$]h&]jj)jhuh1hhjzGhMkhjbGhhubj)}(hhh]j)}(hI3C master methodsh]hI3C master methods}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMyhjGhhubah}(h]h ]h"]h$]h&]uh1jhjbGhhhjzGhMkubeh}(h]h ](jpstructeh"]h$]h&]jjpjjGjjGjjjuh1hhhhhhNhNubj)}(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}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubh:}(hjGhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM}hjGubjp.)}(hXvstruct 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]hXvstruct 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); };}hjGsbah}(h]h ]h"]h$]h&]hhuh1jo.hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjGubj)}(h **Members**h]j)}(hjGh]hMembers}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjGubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjGubj)}(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-)}(hjHh]hbus_init}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjHubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM~hjHubjC)}(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.}(hj5HhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM{hj2Hubah}(h]h ]h"]h$]h&]uh1jBhjHubeh}(h]h ]h"]h$]h&]uh1j hj1HhM~hjHubj!)}(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-)}(hjVHh]h bus_cleanup}(hjXHhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjTHubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjPHubjC)}(hhh]j)}(hcleanup everything done in :c:type:`i3c_master_controller_ops->bus_init\(\) `. This method is optional.h](hcleanup everything done in }(hjoHhhhNhNubh)}(hM:c:type:`i3c_master_controller_ops->bus_init\(\) `h]j-)}(hjyHh]h%i3c_master_controller_ops->bus_init()}(hj{HhhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjwHubah}(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.hhMhjoHubh. This method is optional.}(hjoHhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjHhMhjlHubah}(h]h ]h"]h$]h&]uh1jBhjPHubeh}(h]h ]h"]h$]h&]uh1j hjkHhMhjHubj!)}(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-)}(hjHh]hattach_i3c_dev}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjHubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjHubjC)}(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.}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjHubah}(h]h ]h"]h$]h&]uh1jBhjHubeh}(h]h ]h"]h$]h&]uh1j hjHhMhjHubj!)}(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-)}(hjHh]hreattach_i3c_dev}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjHubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjHubjC)}(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.}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjIubah}(h]h ]h"]h$]h&]uh1jBhjHubeh}(h]h ]h"]h$]h&]uh1j hjIhMhjHubj!)}(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-)}(hj'Ih]hdetach_i3c_dev}(hj)IhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj%Iubah}(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!IubjC)}(hhh]j)}(hcalled when an I3C device is detached from the bus. Usually happens when the master device is unregistered. This method is optional.h]hcalled when an I3C device is detached from the bus. Usually happens when the master device is unregistered. This method is optional.}(hj@IhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj=Iubah}(h]h ]h"]h$]h&]uh1jBhj!Iubeh}(h]h ]h"]h$]h&]uh1j hj``send_ccc_cmd`` send a CCC command This method is mandatory. h](j')}(h``send_ccc_cmd``h]j-)}(hjIh]h send_ccc_cmd}(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.hhMhjIubjC)}(hhh]j)}(h,send a CCC command This method is mandatory.h]h,send a CCC command This method is mandatory.}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjIubah}(h]h ]h"]h$]h&]uh1jBhjIubeh}(h]h ]h"]h$]h&]uh1j hjIhMhjHubj!)}(hU``priv_xfers`` do one or several private I3C SDR transfers This method is mandatory. h](j')}(h``priv_xfers``h]j-)}(hjJh]h priv_xfers}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj Jubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj JubjC)}(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.}(hj(JhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj%Jubah}(h]h ]h"]h$]h&]uh1jBhj Jubeh}(h]h ]h"]h$]h&]uh1j hj$JhMhjHubj!)}(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-)}(hjIJh]hattach_i2c_dev}(hjKJhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjGJubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjCJubjC)}(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.}(hjbJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj_Jubah}(h]h ]h"]h$]h&]uh1jBhjCJubeh}(h]h ]h"]h$]h&]uh1j hj^JhMhjHubj!)}(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-)}(hjJh]hdetach_i2c_dev}(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.hhMhj}JubjC)}(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.}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjJubah}(h]h ]h"]h$]h&]uh1jBhj}Jubeh}(h]h ]h"]h$]h&]uh1j hjJhMhjHubj!)}(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-)}(hjJh]h i2c_xfers}(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.hhMhjJubjC)}(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.}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjJubah}(h]h ]h"]h$]h&]uh1jBhjJubeh}(h]h ]h"]h$]h&]uh1j hjJhMhjHubj!)}(hXw``request_ibi`` attach an IBI handler to an I3C device. This implies defining an IBI handler and the constraints of the IBI (maximum payload length and number of pre-allocated slots). Some controllers support less IBI-capable devices than regular devices, so this method might return -``EBUSY`` if there's no more space for an extra IBI registration This method is optional. h](j')}(h``request_ibi``h]j-)}(hjJh]h request_ibi}(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.hhMhjJubjC)}(hhh]j)}(hXfattach an IBI handler to an I3C device. This implies defining an IBI handler and the constraints of the IBI (maximum payload length and number of pre-allocated slots). Some controllers support less IBI-capable devices than regular devices, so this method might return -``EBUSY`` if there's no more space for an extra IBI registration This method is optional.h](hX attach an IBI handler to an I3C device. This implies defining an IBI handler and the constraints of the IBI (maximum payload length and number of pre-allocated slots). Some controllers support less IBI-capable devices than regular devices, so this method might return -}(hjKhhhNhNubj-)}(h ``EBUSY``h]hEBUSY}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjKubhR if there’s no more space for an extra IBI registration This method is optional.}(hjKhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj Kubah}(h]h ]h"]h$]h&]uh1jBhjJubeh}(h]h ]h"]h$]h&]uh1j hj KhMhjHubj!)}(h``free_ibi`` free an IBI previously requested with ->request_ibi(). The IBI should have been disabled with ->disable_irq() prior to that This method is mandatory only if ->request_ibi is not NULL. h](j')}(h ``free_ibi``h]j-)}(hjCKh]hfree_ibi}(hjEKhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjAKubah}(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=KubjC)}(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.}(hj\KhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjYKubah}(h]h ]h"]h$]h&]uh1jBhj=Kubeh}(h]h ]h"]h$]h&]uh1j hjXKhMhjHubj!)}(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-)}(hj}Kh]h enable_ibi}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj{Kubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjwKubjC)}(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.}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjKubah}(h]h ]h"]h$]h&]uh1jBhjwKubeh}(h]h ]h"]h$]h&]uh1j hjKhMhjHubj!)}(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-)}(hjKh]h disable_ibi}(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.hhMhjKubjC)}(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.}(hjKhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjKubah}(h]h ]h"]h$]h&]uh1jBhjKubeh}(h]h ]h"]h$]h&]uh1j hjKhMhjHubj!)}(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-)}(hjKh]hrecycle_ibi_slot}(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.hhMhjKubjC)}(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.}(hj LhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjLubah}(h]h ]h"]h$]h&]uh1jBhjKubeh}(h]h ]h"]h$]h&]uh1j hjLhMhjHubj!)}(h1``enable_hotjoin`` enable hot join event detect. h](j')}(h``enable_hotjoin``h]j-)}(hj+Lh]henable_hotjoin}(hj-LhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj)Lubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj%LubjC)}(hhh]j)}(henable hot join event detect.h]henable hot join event detect.}(hjDLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@LhMhjALubah}(h]h ]h"]h$]h&]uh1jBhj%Lubeh}(h]h ]h"]h$]h&]uh1j hj@LhMhjHubj!)}(h3``disable_hotjoin`` disable hot join event detect. h](j')}(h``disable_hotjoin``h]j-)}(hjdLh]hdisable_hotjoin}(hjfLhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjbLubah}(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^LubjC)}(hhh]j)}(hdisable hot join event detect.h]hdisable hot join event detect.}(hj}LhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyLhMhjzLubah}(h]h ]h"]h$]h&]uh1jBhj^Lubeh}(h]h ]h"]h$]h&]uh1j hjyLhMhjHubj!)}(h0``set_speed`` adjust I3C open drain mode timing.h](j')}(h ``set_speed``h]j-)}(hjLh]h set_speed}(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.hhMhjLubjC)}(hhh]j)}(h"adjust I3C open drain mode timing.h]h"adjust I3C open drain mode timing.}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjLubah}(h]h ]h"]h$]h&]uh1jBhjLubeh}(h]h ]h"]h$]h&]uh1j hjLhMhjHubeh}(h]h ]h"]h$]h&]uh1jhjGubeh}(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}(hjLhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjLhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMubh)}(h h]h }(hjMhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjLhhhjMhMubj)}(hi3c_master_controllerh]j)}(hjLh]hi3c_master_controller}(hjMhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjMubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjLhhhjMhMubeh}(h]h ]h"]h$]h&]hhjuh1hjjhjLhhhjMhMubah}(h]jLah ](jjeh"]h$]h&]jj)jhuh1hhjMhMhjLhhubj)}(hhh]j)}(hI3C master controller objecth]hI3C master controller object}(hj9MhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj6Mhhubah}(h]h ]h"]h$]h&]uh1jhjLhhhjMhMubeh}(h]h ](jpstructeh"]h$]h&]jjpjjQMjjQMjjjuh1hhhhhhNhNubj)}(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}(hj]MhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjYMubh:}(hjYMhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjUMubjp.)}(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; };}hjvMsbah}(h]h ]h"]h$]h&]hhuh1jo.hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjUMubj)}(h **Members**h]j)}(hjMh]hMembers}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjUMubj)}(hhh](j!)}(h4``dev`` device to be registered to the device-model h](j')}(h``dev``h]j-)}(hjMh]hdev}(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)}(h+device to be registered to the device-modelh]h+device to be registered to the device-model}(hjMhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMhMhjMubah}(h]h ]h"]h$]h&]uh1jBhjMubeh}(h]h ]h"]h$]h&]uh1j hjMhMhjMubj!)}(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-)}(hjMh]hthis}(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)}(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}(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 hjMhMhjMubj!)}(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-)}(hjNh]hi2c}(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)}(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}(hj2NhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj/Nubah}(h]h ]h"]h$]h&]uh1jBhjNubeh}(h]h ]h"]h$]h&]uh1j hj.NhMhjMubj!)}(hf``ops`` master operations. See :c:type:`struct i3c_master_controller_ops ` h](j')}(h``ops``h]j-)}(hjSNh]hops}(hjUNhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjQNubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjMNubjC)}(hhh]j)}(h]master operations. See :c:type:`struct i3c_master_controller_ops `h](hmaster operations. See }(hjlNhhhNhNubh)}(hF:c:type:`struct i3c_master_controller_ops `h]j-)}(hjvNh]h struct i3c_master_controller_ops}(hjxNhhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjtNubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjji3c_master_controller_opsuh1hhjhNhMhjlNubeh}(h]h ]h"]h$]h&]uh1jhjhNhMhjiNubah}(h]h ]h"]h$]h&]uh1jBhjMNubeh}(h]h ]h"]h$]h&]uh1j hjhNhMhjMubj!)}(h7``secondary`` true if the master is a secondary master h](j')}(h ``secondary``h]j-)}(hjNh]h secondary}(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)}(h(true if the master is a secondary masterh]h(true if the master is a secondary master}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNhMhjNubah}(h]h ]h"]h$]h&]uh1jBhjNubeh}(h]h ]h"]h$]h&]uh1j hjNhMhjMubj!)}(h7``init_done`` true when the bus initialization is done h](j')}(h ``init_done``h]j-)}(hjNh]h init_done}(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)}(h(true when the bus initialization is doneh]h(true when the bus initialization is done}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjNhMhjNubah}(h]h ]h"]h$]h&]uh1jBhjNubeh}(h]h ]h"]h$]h&]uh1j hjNhMhjMubj!)}(h/``hotjoin`` true if the master support hotjoin h](j')}(h ``hotjoin``h]j-)}(hjOh]hhotjoin}(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)}(h"true if the master support hotjoinh]h"true if the master support hotjoin}(hj6OhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2OhMhj3Oubah}(h]h ]h"]h$]h&]uh1jBhjOubeh}(h]h ]h"]h$]h&]uh1j hj2OhMhjMubj!)}(hO``boardinfo`` board-level information attached to devices connected on the bus h](j')}(h ``boardinfo``h]j-)}(hjVOh]h boardinfo}(hjXOhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjTOubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjPOubjC)}(hhh]j)}(h@board-level information attached to devices connected on the bush]h@board-level information attached to devices connected on the bus}(hjoOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjkOhMhjlOubah}(h]h ]h"]h$]h&]uh1jBhjPOubeh}(h]h ]h"]h$]h&]uh1j hjkOhMhjMubj!)}(h1``boardinfo.i3c`` list of I3C boardinfo objects h](j')}(h``boardinfo.i3c``h]j-)}(hjOh]h boardinfo.i3c}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjOubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjOubjC)}(hhh]j)}(hlist of I3C boardinfo objectsh]hlist of I3C boardinfo objects}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOhMhjOubah}(h]h ]h"]h$]h&]uh1jBhjOubeh}(h]h ]h"]h$]h&]uh1j hjOhMhjMubj!)}(h0``boardinfo.i2c`` list of I2C boardinfo objects h](j')}(h``boardinfo.i2c``h]j-)}(hjOh]h boardinfo.i2c}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjOubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjOubjC)}(hhh]j)}(hlist of I2C boardinfo objectsh]hlist of I2C boardinfo objects}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOhMhjOubah}(h]h ]h"]h$]h&]uh1jBhjOubeh}(h]h ]h"]h$]h&]uh1j hjOhMhjMubj!)}(h'``bus`` I3C bus exposed by this master h](j')}(h``bus``h]j-)}(hjPh]hbus}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjOubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjOubjC)}(hhh]j)}(hI3C bus exposed by this masterh]hI3C bus exposed by this master}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPhMhjPubah}(h]h ]h"]h$]h&]uh1jBhjOubeh}(h]h ]h"]h$]h&]uh1j hjPhMhjMubj!)}(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-)}(hj:Ph]hwq}(hj` 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 }(hjPhhhNhNubh)}(h>:c:type:`struct i3c_master_controller `h]j-)}(hjPh]hstruct i3c_master_controller}(hjPhhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjPubah}(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.hhMhjPubhR has to be registered to the I3C subsystem through i3c_master_register(). None of }(hjPhhhNhNubh)}(h>:c:type:`struct i3c_master_controller `h]j-)}(hjPh]hstruct i3c_master_controller}(hjPhhhNhNubah}(h]h ](jjpc-typeeh"]h$]h&]uh1j,hjPubah}(h]h ]h"]h$]h&]refdocj refdomainjpreftypetype refexplicitrefwarnjvjji3c_master_controlleruh1hhjPhMhjPubhV fields should be set manually, just pass appropriate values to i3c_master_register().}(hjPhhhNhNubeh}(h]h ]h"]h$]h&]uh1jhjPhMhhhhubh)}(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)}(hjPh]hi3c_bus_for_each_i2cdev}(hjQhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjQubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjPhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMubah}(h]h ]h"]h$]h&]hhjuh1hjjhjPhhhjQhMubah}(h]jPah ](jjeh"]h$]h&]jj)jhuh1hhjQhMhjPhhubj)}(hhh]h}(h]h ]h"]h$]h&]uh1jhjPhhhjQhMubeh}(h]h ](jpmacroeh"]h$]h&]jjpjj1Qjj1Qjjjuh1hhhhhhNhNubj)}(h&``i3c_bus_for_each_i2cdev (bus, dev)``h]j-)}(hj7Qh]h"i3c_bus_for_each_i2cdev (bus, dev)}(hj9QhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj5Qubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM hhhhubh block_quote)}(h0iterate over all I2C devices present on the bus h]j)}(h/iterate over all I2C devices present on the bush]h/iterate over all I2C devices present on the bus}(hjSQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjOQubah}(h]h ]h"]h$]h&]uh1jMQhjaQhMhhhhubj)}(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)}(hjnQh]h Parameters}(hjpQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlQubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjhQubj)}(hhh](j!)}(h``bus`` the I3C bus h](j')}(h``bus``h]j-)}(hjQh]hbus}(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)}(h the I3C bush]h the I3C bus}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQhMhjQubah}(h]h ]h"]h$]h&]uh1jBhjQubeh}(h]h ]h"]h$]h&]uh1j hjQhMhjQubj!)}(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-)}(hjQh]hdev}(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)}(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}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjQubah}(h]h ]h"]h$]h&]uh1jBhjQubeh}(h]h ]h"]h$]h&]uh1j hjQhMhjQubeh}(h]h ]h"]h$]h&]uh1jhjhQubj)}(h**Description**h]j)}(hjRh]h Description}(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.hhMhjhQubj)}(h-Iterate over all I2C devs present on the bus.h]h-Iterate over all I2C devs present on the bus.}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjhQubeh}(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)}(hjARh]hi3c_bus_for_each_i3cdev}(hjKRhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjGRubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhjCRhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhM)ubah}(h]h ]h"]h$]h&]hhjuh1hjjhj?Rhhhj^RhM)ubah}(h]j:Rah ](jjeh"]h$]h&]jj)jhuh1hhj^RhM)hjYhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj+Yhhhj=YhM{ubj)}(hi2c_dev_set_master_datah]j)}(hi2c_dev_set_master_datah]hi2c_dev_set_master_data}(hjPYhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjLYubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj+Yhhhj=YhM{ubj.)}(h&(struct i2c_dev_desc *dev, void *data)h](j4)}(hstruct i2c_dev_desc *devh](j:)}(hj=h]hstruct}(hjlYhhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjhYubh)}(h h]h }(hjyYhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjhYubh)}(hhh]j)}(h i2c_dev_desch]h i2c_dev_desc}(hjYhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjYubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetjYmodnameN classnameNjvjy)}j|]j)}jrjRYsbc.i2c_dev_set_master_dataasbuh1hhjhYubh)}(h h]h }(hjYhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjhYubj)}(hjh]h*}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhYubj)}(hdevh]hdev}(hjYhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjhYubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hjdYubj4)}(h void *datah](h)}(hvoidh]hvoid}(hjYhhhNhNubah}(h]h ]hah"]h$]h&]uh1hhjYubh)}(h h]h }(hjYhhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjYubj)}(hjh]h*}(hjYhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjYubj)}(hdatah]hdata}(hjZhhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjYubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hjdYubeh}(h]h ]h"]h$]h&]hhuh1j-hj+Yhhhj=YhM{ubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj'Yhhhj=YhM{ubah}(h]j"Yah ](jjeh"]h$]h&]jj)jhuh1hhj=YhM{hj$Yhhubj)}(hhh]j)}(h6attach master private data to an I2C device descriptorh]h6attach master private data to an I2C device descriptor}(hj1ZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMshj.Zhhubah}(h]h ]h"]h$]h&]uh1jhj$Yhhhj=YhM{ubeh}(h]h ](jpfunctioneh"]h$]h&]jjpjjIZjjIZjjjuh1hhhhhhNhNubj)}(hX**Parameters** ``struct i2c_dev_desc *dev`` the I2C device descriptor to attach private data to ``void *data`` private data **Description** This functions allows a master controller to attach per-device private data which can then be retrieved with i2c_device_get_master_data().h](j)}(h**Parameters**h]j)}(hjSZh]h Parameters}(hjUZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjQZubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMwhjMZubj)}(hhh](j!)}(hQ``struct i2c_dev_desc *dev`` the I2C device descriptor to attach private data to h](j')}(h``struct i2c_dev_desc *dev``h]j-)}(hjrZh]hstruct i2c_dev_desc *dev}(hjtZhhhNhNubah}(h]h ]h"]h$]h&]uh1j,hjpZubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMuhjlZubjC)}(hhh]j)}(h3the I2C device descriptor to attach private data toh]h3the I2C device descriptor to attach private data to}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZhMuhjZubah}(h]h ]h"]h$]h&]uh1jBhjlZubeh}(h]h ]h"]h$]h&]uh1j hjZhMuhjiZubj!)}(h``void *data`` private data h](j')}(h``void *data``h]j-)}(hjZh]h void *data}(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.hhMvhjZubjC)}(hhh]j)}(h private datah]h private data}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZhMvhjZubah}(h]h ]h"]h$]h&]uh1jBhjZubeh}(h]h ]h"]h$]h&]uh1j hjZhMvhjiZubeh}(h]h ]h"]h$]h&]uh1jhjMZubj)}(h**Description**h]j)}(hjZh]h Description}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMxhjMZubj)}(hThis functions allows a master controller to attach per-device private data which can then be retrieved with i2c_device_get_master_data().h]hThis functions allows a master controller to attach per-device private data which can then be retrieved with i2c_device_get_master_data().}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMxhjMZubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h֌i3c_dev_get_master (C function)c.i3c_dev_get_masterhNtauh1hhhhhhNhNubh)}(hhh](h)}(hLstruct i3c_master_controller * i3c_dev_get_master (struct i3c_dev_desc *dev)h]h)}(hJstruct i3c_master_controller *i3c_dev_get_master(struct i3c_dev_desc *dev)h](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.hhMubh)}(h h]h }(hj9[hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj'[hhhj8[hMubh)}(hhh]j)}(hi3c_master_controllerh]hi3c_master_controller}(hjJ[hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjG[ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetjL[modnameN classnameNjvjy)}j|]j)}jri3c_dev_get_mastersbc.i3c_dev_get_masterasbuh1hhj'[hhhj8[hMubh)}(h h]h }(hjk[hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj'[hhhj8[hMubj)}(hjh]h*}(hjy[hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'[hhhj8[hMubj)}(hi3c_dev_get_masterh]j)}(hjh[h]hi3c_dev_get_master}(hj[hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj[ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj'[hhhj8[hMubj.)}(h(struct i3c_dev_desc *dev)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|]jf[c.i3c_dev_get_masterasbuh1hhj[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'[hhhj8[hMubeh}(h]h ]h"]h$]h&]hhjuh1hjjhj#[hhhj8[hMubah}(h]j[ah ](jjeh"]h$]h&]jj)jhuh1hhj8[hMhj [hhubj)}(hhh]j)}(h,get master used to communicate with a deviceh]h,get master used to communicate with a 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.hhMhj#\hhubah}(h]h ]h"]h$]h&]uh1jhj [hhhj8[hMubeh}(h]h ](jpfunctioneh"]h$]h&]jjpjj>\jj>\jjjuh1hhhhhhNhNubj)}(hi**Parameters** ``struct i3c_dev_desc *dev`` I3C dev **Return** the master controller driving **dev**h](j)}(h**Parameters**h]j)}(hjH\h]h Parameters}(hjJ\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjF\ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjB\ubj)}(hhh]j!)}(h%``struct i3c_dev_desc *dev`` I3C dev h](j')}(h``struct i3c_dev_desc *dev``h]j-)}(hjg\h]hstruct i3c_dev_desc *dev}(hji\hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hje\ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhja\ubjC)}(hhh]j)}(hI3C devh]hI3C dev}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj|\hMhj}\ubah}(h]h ]h"]h$]h&]uh1jBhja\ubeh}(h]h ]h"]h$]h&]uh1j hj|\hMhj^\ubah}(h]h ]h"]h$]h&]uh1jhjB\ubj)}(h **Return**h]j)}(hj\h]hReturn}(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.hhMhjB\ubj)}(h%the master controller driving **dev**h](hthe master controller driving }(hj\hhhNhNubj)}(h**dev**h]hdev}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj\ubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhjB\ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h֌i2c_dev_get_master (C function)c.i2c_dev_get_masterhNtauh1hhhhhhNhNubh)}(hhh](h)}(hLstruct i3c_master_controller * i2c_dev_get_master (struct i2c_dev_desc *dev)h]h)}(hJstruct i3c_master_controller *i2c_dev_get_master(struct i2c_dev_desc *dev)h](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.hhMubh)}(h h]h }(hj]hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj\hhhj]hMubh)}(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)}jri2c_dev_get_mastersbc.i2c_dev_get_masterasbuh1hhj\hhhj]hMubh)}(h h]h }(hj5]hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj\hhhj]hMubj)}(hjh]h*}(hjC]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj\hhhj]hMubj)}(hi2c_dev_get_masterh]j)}(hj2]h]hi2c_dev_get_master}(hjT]hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjP]ubah}(h]h ](j(j)eh"]h$]h&]hhuh1jhj\hhhj]hMubj.)}(h(struct i2c_dev_desc *dev)h]j4)}(hstruct i2c_dev_desc *devh](j:)}(hj=h]hstruct}(hjo]hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hjk]ubh)}(h h]h }(hj|]hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjk]ubh)}(hhh]j)}(h i2c_dev_desch]h i2c_dev_desc}(hj]hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj]ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetj]modnameN classnameNjvjy)}j|]j0]c.i2c_dev_get_masterasbuh1hhjk]ubh)}(h h]h }(hj]hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhjk]ubj)}(hjh]h*}(hj]hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjk]ubj)}(hdevh]hdev}(hj]hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjk]ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hjg]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,get master used to communicate with a deviceh]h,get master used to communicate with a 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.hhMhj]hhubah}(h]h ]h"]h$]h&]uh1jhj\hhhj]hMubeh}(h]h ](jpfunctioneh"]h$]h&]jjpjj^jj^jjjuh1hhhhhhNhNubj)}(hi**Parameters** ``struct i2c_dev_desc *dev`` I2C dev **Return** the master controller driving **dev**h](j)}(h**Parameters**h]j)}(hj^h]h Parameters}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj ^ubj)}(hhh]j!)}(h%``struct i2c_dev_desc *dev`` I2C dev h](j')}(h``struct i2c_dev_desc *dev``h]j-)}(hj1^h]hstruct i2c_dev_desc *dev}(hj3^hhhNhNubah}(h]h ]h"]h$]h&]uh1j,hj/^ubah}(h]h ]h"]h$]h&]uh1j&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj+^ubjC)}(hhh]j)}(hI2C devh]hI2C dev}(hjJ^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjF^hMhjG^ubah}(h]h ]h"]h$]h&]uh1jBhj+^ubeh}(h]h ]h"]h$]h&]uh1j hjF^hMhj(^ubah}(h]h ]h"]h$]h&]uh1jhj ^ubj)}(h **Return**h]j)}(hjl^h]hReturn}(hjn^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjj^ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj ^ubj)}(h%the master controller driving **dev**h](hthe master controller driving }(hj^hhhNhNubj)}(h**dev**h]hdev}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj ^ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubh)}(hhh]h}(h]h ]h"]h$]h&]entries](h֌i3c_master_get_bus (C function)c.i3c_master_get_bushNtauh1hhhhhhNhNubh)}(hhh](h)}(hJstruct i3c_bus * i3c_master_get_bus (struct i3c_master_controller *master)h]h)}(hHstruct i3c_bus *i3c_master_get_bus(struct i3c_master_controller *master)h](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.hhMubh)}(h h]h }(hj^hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj^hhhj^hMubh)}(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)}jri3c_master_get_bussbc.i3c_master_get_busasbuh1hhj^hhhj^hMubh)}(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)}(hi3c_master_get_bush]j)}(hj^h]hi3c_master_get_bus}(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}(hj9_hhhNhNubah}(h]h ]jFah"]h$]h&]uh1j9hj5_ubh)}(h h]h }(hjF_hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj5_ubh)}(hhh]j)}(hi3c_master_controllerh]hi3c_master_controller}(hjW_hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhjT_ubah}(h]h ]h"]h$]h&] refdomainjpreftypejr reftargetjY_modnameN classnameNjvjy)}j|]j^c.i3c_master_get_busasbuh1hhj5_ubh)}(h h]h }(hju_hhhNhNubah}(h]h ]j ah"]h$]h&]uh1hhj5_ubj)}(hjh]h*}(hj_hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5_ubj)}(hmasterh]hmaster}(hj_hhhNhNubah}(h]h ]j!ah"]h$]h&]uh1jhj5_ubeh}(h]h ]h"]h$]h&]noemphhhuh1j3hj1_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 get the bus attached to a masterh]h get the bus attached to a 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.hhMhj_hhubah}(h]h ]h"]h$]h&]uh1jhj^hhhj^hMubeh}(h]h ](jpfunctioneh"]h$]h&]jjpjj_jj_jjjuh1hhhhhhNhNubj)}(h|**Parameters** ``struct i3c_master_controller *master`` master object **Return** the I3C bus **master** is connected toh](j)}(h**Parameters**h]j)}(hj_h]h Parameters}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj_ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj_ubj)}(hhh]j!)}(h7``struct i3c_master_controller *master`` master object 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&hj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj_ubjC)}(hhh]j)}(h master objecth]h master object}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj`hMhj`ubah}(h]h ]h"]h$]h&]uh1jBhj_ubeh}(h]h ]h"]h$]h&]uh1j hj`hMhj_ubah}(h]h ]h"]h$]h&]uh1jhj_ubj)}(h **Return**h]j)}(hj6`h]hReturn}(hj8`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj4`ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj_ubj)}(h&the I3C bus **master** is connected toh](h the I3C bus }(hjL`hhhNhNubj)}(h **master**h]hmaster}(hjT`hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjL`ubh is connected to}(hjL`hhhNhNubeh}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/i3c/master-driver-api:9: ./include/linux/i3c/master.hhMhj_ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhhhhhNhNubeh}(h] i3c-master-controller-driver-apiah ]h"] i3c master controller driver apiah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerj`error_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}jy`jv`s nametypes}jy`sh}(jv`hhhjjj1j6jjjBjGj} j jC jH j.j3jjjjjjj'j,jjjjj j j!j!jR$jW$j5&j:&j_(jd(jb,jg,j-j-j/j/j)1j.1jw3j|3jb5jg5j8j"8j4:j9:j<j<j>j>j:@j?@jQAjVAjCjCj`GjeGjLjLjPjPj:Rj?Rj~SjSjRUjWUjNWjSWj"Yj'Yj[j#[j\j\j^j^u footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages] transformerN include_log] decorationNhhub.