sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget(/translations/zh_CN/driver-api/componentmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/zh_TW/driver-api/componentmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/it_IT/driver-api/componentmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/ja_JP/driver-api/componentmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/ko_KR/driver-api/componentmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hPortuguese (Brazilian)}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/pt_BR/driver-api/componentmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/sp_SP/driver-api/componentmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhtarget)}(h.. _component:h]h}(h]h ]h"]h$]h&]refid componentuh1hhKhhhhhB/var/lib/git/docbuild/linux/Documentation/driver-api/component.rstubhsection)}(hhh](htitle)}(h&Component Helper for Aggregate Driversh]h&Component Helper for Aggregate Drivers}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh paragraph)}(hXThe component helper allows drivers to collect a pile of sub-devices, including their bound drivers, into an aggregate driver. Various subsystems already provide functions to get hold of such components, e.g. of_clk_get_by_name(). The component helper can be used when such a subsystem-specific way to find a device is not available: The component helper fills the niche of aggregate drivers for specific hardware, where further standardization into a subsystem would not be practical. The common example is when a logical device (e.g. a DRM display driver) is spread around the SoC on various components (scanout engines, blending blocks, transcoders for various outputs and so on).h]hXThe component helper allows drivers to collect a pile of sub-devices, including their bound drivers, into an aggregate driver. Various subsystems already provide functions to get hold of such components, e.g. of_clk_get_by_name(). The component helper can be used when such a subsystem-specific way to find a device is not available: The component helper fills the niche of aggregate drivers for specific hardware, where further standardization into a subsystem would not be practical. The common example is when a logical device (e.g. a DRM display driver) is spread around the SoC on various components (scanout engines, blending blocks, transcoders for various outputs and so on).}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/driver-api/component:7: ./drivers/base/component.chKhhhhubh)}(hThe component helper also doesn't solve runtime dependencies, e.g. for system suspend and resume operations. See also :ref:`device links`.h](hxThe component helper also doesn’t solve runtime dependencies, e.g. for system suspend and resume operations. See also }(hhhhhNhNubh)}(h :ref:`device links`h]hinline)}(hhh]h device links}(hhhhhNhNubah}(h]h ](xrefstdstd-refeh"]h$]h&]uh1hhhubah}(h]h ]h"]h$]h&]refdocdriver-api/component refdomainjreftyperef refexplicitrefwarn reftarget device_linkuh1hh\/var/lib/git/docbuild/linux/Documentation/driver-api/component:7: ./drivers/base/component.chKhhubh.}(hhhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKhhhhubh)}(hComponents are registered using component_add() and unregistered with component_del(), usually from the driver's probe and disconnect functions.h]hComponents are registered using component_add() and unregistered with component_del(), usually from the driver’s probe and disconnect functions.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/driver-api/component:7: ./drivers/base/component.chKhhhhubh)}(hAggregate drivers first assemble a component match list of what they need using component_match_add(). This is then registered as an aggregate driver using component_master_add_with_match(), and unregistered using component_master_del().h]hAggregate drivers first assemble a component match list of what they need using component_match_add(). This is then registered as an aggregate driver using component_master_add_with_match(), and unregistered using component_master_del().}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hh\/var/lib/git/docbuild/linux/Documentation/driver-api/component:7: ./drivers/base/component.chKhhhhubh)}(hhh](h)}(hAPIh]hAPI}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhj@hhhhhK ubhindex)}(hhh]h}(h]h ]h"]h$]h&]entries](singlecomponent_ops (C struct)c.component_opshNtauh1jQhj@hhhNhNubhdesc)}(hhh](hdesc_signature)}(h component_opsh]hdesc_signature_line)}(hstruct component_opsh](hdesc_sig_keyword)}(hstructh]hstruct}(hjuhhhNhNubah}(h]h ]kah"]h$]h&]uh1jshjohhh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhKubhdesc_sig_space)}(h h]h }(hjhhhNhNubah}(h]h ]wah"]h$]h&]uh1jhjohhhjhKubh desc_name)}(h component_opsh]h desc_sig_name)}(hjkh]h component_ops}(hjhhhNhNubah}(h]h ]nah"]h$]h&]uh1jhjubah}(h]h ](sig-namedescnameeh"]h$]h&] xml:spacepreserveuh1jhjohhhjhKubeh}(h]h ]h"]h$]h&]jj add_permalinkuh1jmsphinx_line_type declaratorhjihhhjhKubah}(h]j`ah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1jghjhKhjdhhubh desc_content)}(hhh]h)}(hcallbacks for component driversh]hcallbacks for component drivers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhK hjhhubah}(h]h ]h"]h$]h&]uh1jhjdhhhjhKubeh}(h]h ](cstructeh"]h$]h&]domainjobjtypejdesctypejnoindex noindexentrynocontentsentryuh1jbhhhj@hNhNubh container)}(hX3**Definition**:: struct component_ops { int (*bind)(struct device *comp, struct device *master, void *master_data); void (*unbind)(struct device *comp, struct device *master, void *master_data); }; **Members** ``bind`` Called through component_bind_all() when the aggregate driver is ready to bind the overall driver. ``unbind`` Called through component_unbind_all() when the aggregate driver is ready to bind the overall driver, or when component_bind_all() fails part-ways through and needs to unbind some already bound components.h](h)}(h**Definition**::h](hstrong)}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhKhjubh literal_block)}(hstruct component_ops { int (*bind)(struct device *comp, struct device *master, void *master_data); void (*unbind)(struct device *comp, struct device *master, void *master_data); };h]hstruct component_ops { int (*bind)(struct device *comp, struct device *master, void *master_data); void (*unbind)(struct device *comp, struct device *master, void *master_data); };}hjsbah}(h]h ]h"]h$]h&]jjuh1jh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhKhjubh)}(h **Members**h]j)}(hj*h]hMembers}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhKhjubhdefinition_list)}(hhh](hdefinition_list_item)}(hl``bind`` Called through component_bind_all() when the aggregate driver is ready to bind the overall driver. h](hterm)}(h``bind``h]hliteral)}(hjOh]hbind}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjMubah}(h]h ]h"]h$]h&]uh1jKh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhKhjGubh definition)}(hhh]h)}(hbCalled through component_bind_all() when the aggregate driver is ready to bind the overall driver.h]hbCalled through component_bind_all() when the aggregate driver is ready to bind the overall driver.}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhKhjiubah}(h]h ]h"]h$]h&]uh1jghjGubeh}(h]h ]h"]h$]h&]uh1jEhjfhKhjBubjF)}(h``unbind`` Called through component_unbind_all() when the aggregate driver is ready to bind the overall driver, or when component_bind_all() fails part-ways through and needs to unbind some already bound components.h](jL)}(h ``unbind``h]jR)}(hjh]hunbind}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1jKh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhKhjubjh)}(hhh]h)}(hCalled through component_unbind_all() when the aggregate driver is ready to bind the overall driver, or when component_bind_all() fails part-ways through and needs to unbind some already bound components.h]hCalled through component_unbind_all() when the aggregate driver is ready to bind the overall driver, or when component_bind_all() fails part-ways through and needs to unbind some already bound components.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhKhjubah}(h]h ]h"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]uh1jEhjhKhjBubeh}(h]h ]h"]h$]h&]uh1j@hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj@hhhNhNubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhK hj@hhubh)}(hUComponents are registered with component_add() and unregistered with component_del().h]hUComponents are registered with component_add() and unregistered with component_del().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhK hj@hhubjR)}(hhh]h}(h]h ]h"]h$]h&]entries](j^component_master_ops (C struct)c.component_master_opshNtauh1jQhj@hhhNhNubjc)}(hhh](jh)}(hcomponent_master_opsh]jn)}(hstruct component_master_opsh](jt)}(hjwh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jshj hhh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhKubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhjhKubj)}(hcomponent_master_opsh]j)}(hjh]hcomponent_master_ops}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj hhhjhKubeh}(h]h ]h"]h$]h&]jjjuh1jmjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jghjhKhjhhubj)}(hhh]h)}(h!callback for the aggregate driverh]h!callback for the aggregate driver}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhK/hjMhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jstructeh"]h$]h&]jjjjhjjhjjjuh1jbhhhj@hNhNubj)}(hXH**Definition**:: struct component_master_ops { int (*bind)(struct device *master); void (*unbind)(struct device *master); }; **Members** ``bind`` Called when all components or the aggregate driver, as specified in the match list passed to component_master_add_with_match(), are ready. Usually there are 3 steps to bind an aggregate driver: 1. Allocate a structure for the aggregate driver. 2. Bind all components to the aggregate driver by calling component_bind_all() with the aggregate driver structure as opaque pointer data. 3. Register the aggregate driver with the subsystem to publish its interfaces. Note that the lifetime of the aggregate driver does not align with any of the underlying :c:type:`struct device ` instances. Therefore devm cannot be used and all resources acquired or allocated in this callback must be explicitly released in the **unbind** callback. ``unbind`` Called when either the aggregate driver, using component_master_del(), or one of its components, using component_del(), is unregistered.h](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubh:}(hjphhhNhNubeh}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhK3hjlubj)}(hsstruct component_master_ops { int (*bind)(struct device *master); void (*unbind)(struct device *master); };h]hsstruct component_master_ops { int (*bind)(struct device *master); void (*unbind)(struct device *master); };}hjsbah}(h]h ]h"]h$]h&]jjuh1jh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhK5hjlubh)}(h **Members**h]j)}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhK:hjlubjA)}(hhh](jF)}(hX``bind`` Called when all components or the aggregate driver, as specified in the match list passed to component_master_add_with_match(), are ready. Usually there are 3 steps to bind an aggregate driver: 1. Allocate a structure for the aggregate driver. 2. Bind all components to the aggregate driver by calling component_bind_all() with the aggregate driver structure as opaque pointer data. 3. Register the aggregate driver with the subsystem to publish its interfaces. Note that the lifetime of the aggregate driver does not align with any of the underlying :c:type:`struct device ` instances. Therefore devm cannot be used and all resources acquired or allocated in this callback must be explicitly released in the **unbind** callback. h](jL)}(h``bind``h]jR)}(hjh]hbind}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1jKh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhKGhjubjh)}(hhh](h)}(hCalled when all components or the aggregate driver, as specified in the match list passed to component_master_add_with_match(), are ready. Usually there are 3 steps to bind an aggregate driver:h]hCalled when all components or the aggregate driver, as specified in the match list passed to component_master_add_with_match(), are ready. Usually there are 3 steps to bind an aggregate driver:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhK7hjubhenumerated_list)}(hhh](h list_item)}(h/Allocate a structure for the aggregate driver. h]h)}(h.Allocate a structure for the aggregate driver.h]h.Allocate a structure for the aggregate driver.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhK;hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hBind all components to the aggregate driver by calling component_bind_all() with the aggregate driver structure as opaque pointer data. h]h)}(hBind all components to the aggregate driver by calling component_bind_all() with the aggregate driver structure as opaque pointer data.h]hBind all components to the aggregate driver by calling component_bind_all() with the aggregate driver structure as opaque pointer data.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhK=hjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hLRegister the aggregate driver with the subsystem to publish its interfaces. h]h)}(hKRegister the aggregate driver with the subsystem to publish its interfaces.h]hKRegister the aggregate driver with the subsystem to publish its interfaces.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhKAhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]enumtypearabicprefixhsuffix.uh1jhjubh)}(hXNote that the lifetime of the aggregate driver does not align with any of the underlying :c:type:`struct device ` instances. Therefore devm cannot be used and all resources acquired or allocated in this callback must be explicitly released in the **unbind** callback.h](hYNote that the lifetime of the aggregate driver does not align with any of the underlying }(hjBhhhNhNubh)}(h :c:type:`struct device `h]jR)}(hjLh]h struct device}(hjNhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jQhjJubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarn c:parent_keysphinx.domains.c LookupKey)}data]sbjdeviceuh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhKDhjBubh instances. Therefore devm cannot be used and all resources acquired or allocated in this callback must be explicitly released in the }(hjBhhhNhNubj)}(h **unbind**h]hunbind}(hjvhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubh callback.}(hjBhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjqhKDhjubeh}(h]h ]h"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]uh1jEhjhKGhjubjF)}(h``unbind`` Called when either the aggregate driver, using component_master_del(), or one of its components, using component_del(), is unregistered.h](jL)}(h ``unbind``h]jR)}(hjh]hunbind}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1jKh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhKNhjubjh)}(hhh]h)}(hCalled when either the aggregate driver, using component_master_del(), or one of its components, using component_del(), is unregistered.h]hCalled when either the aggregate driver, using component_master_del(), or one of its components, using component_del(), is unregistered.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhKMhjubah}(h]h ]h"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]uh1jEhjhKNhjubeh}(h]h ]h"]h$]h&]uh1j@hjlubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj@hhhNhNubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhKRhj@hhubh)}(huAggregate drivers are registered with component_master_add_with_match() and unregistered with component_master_del().h]huAggregate drivers are registered with component_master_add_with_match() and unregistered with component_master_del().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhK0hj@hhubjR)}(hhh]h}(h]h ]h"]h$]h&]entries](j^ component_match_add (C function)c.component_match_addhNtauh1jQhj@hhhNhNubjc)}(hhh](jh)}(hvoid component_match_add (struct device *parent, struct component_match **matchptr, int (*compare)(struct device *, void *), void *compare_data)h]jn)}(hvoid component_match_add(struct device *parent, struct component_match **matchptr, int (*compare)(struct device*, void*), void *compare_data)h](hdesc_sig_keyword_type)}(hvoidh]hvoid}(hj#hhhNhNubah}(h]h ]ktah"]h$]h&]uh1j!hjhhh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhKmubj)}(h h]h }(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj2hKmubj)}(hcomponent_match_addh]j)}(hcomponent_match_addh]hcomponent_match_add}(hjEhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjAubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhj2hKmubhdesc_parameterlist)}(hu(struct device *parent, struct component_match **matchptr, int (*compare)(struct device*, void*), void *compare_data)h](hdesc_parameter)}(hstruct device *parenth](jt)}(hjwh]hstruct}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jshjaubj)}(h h]h }(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubh)}(hhh]j)}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftype identifier reftargetjmodnameN classnameNjhjk)}jn]ji ASTIdentifier)}jjGsbc.component_match_addasbuh1hhjaubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubhdesc_sig_punctuation)}(h*h]h*}(hjhhhNhNubah}(h]h ]pah"]h$]h&]uh1jhjaubj)}(hparenth]hparent}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjaubeh}(h]h ]h"]h$]h&]noemphjjuh1j_hj[ubj`)}(h!struct component_match **matchptrh](jt)}(hjwh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jshjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hcomponent_matchh]hcomponent_match}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjhjk)}jn]jc.component_match_addasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hj5hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hmatchptrh]hmatchptr}(hjBhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j_hj[ubj`)}(h%int (*compare)(struct device*, void*)h](j")}(hinth]hint}(hj[hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjWubj)}(h h]h }(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj)}(h(h]h(}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj)}(hcompareh]hcompare}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj)}(h)h]h)}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj)}(hjyh]h(}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubjt)}(hjwh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jshjWubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubh)}(hhh]j)}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjhjk)}jn]jc.component_match_addasbuh1hhjWubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj)}(h,h]h,}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj")}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjWubj)}(hjh]h*}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubj)}(hjh]h)}(hj;hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjWubeh}(h]h ]h"]h$]h&]noemphjjuh1j_hj[ubj`)}(hvoid *compare_datah](j")}(hvoidh]hvoid}(hjShhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjOubj)}(h h]h }(hjahhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubj)}(hjh]h*}(hjohhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubj)}(h compare_datah]h compare_data}(hj|hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjOubeh}(h]h ]h"]h$]h&]noemphjjuh1j_hj[ubeh}(h]h ]h"]h$]h&]jjuh1jYhjhhhj2hKmubeh}(h]h ]h"]h$]h&]jjjuh1jmjjhjhhhj2hKmubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jghj2hKmhjhhubj)}(hhh]h)}(hadd a component match entryh]hadd a component match entry}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhKmhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj2hKmubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jbhhhj@hNhNubj)}(hX***Parameters** ``struct device *parent`` device with the aggregate driver ``struct component_match **matchptr`` pointer to the list of component matches ``int (*compare)(struct device *, void *)`` compare function to match against all components ``void *compare_data`` opaque pointer passed to the **compare** function **Description** Adds a new component match to the list stored in **matchptr**, which the **parent** aggregate driver needs to function. The list of component matches pointed to by **matchptr** must be initialized to NULL before adding the first match. This only matches against components added with component_add(). The allocated match list in **matchptr** is automatically released using devm actions. See also component_match_add_release() and component_match_add_typed().h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhKqhjubjA)}(hhh](jF)}(h;``struct device *parent`` device with the aggregate driver h](jL)}(h``struct device *parent``h]jR)}(hjh]hstruct device *parent}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1jKh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhKnhjubjh)}(hhh]h)}(h device with the aggregate driverh]h device with the aggregate driver}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKnhjubah}(h]h ]h"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]uh1jEhjhKnhjubjF)}(hO``struct component_match **matchptr`` pointer to the list of component matches h](jL)}(h%``struct component_match **matchptr``h]jR)}(hj h]h!struct component_match **matchptr}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1jKh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhKohjubjh)}(hhh]h)}(h(pointer to the list of component matchesh]h(pointer to the list of component matches}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj5hKohj6ubah}(h]h ]h"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]uh1jEhj5hKohjubjF)}(h]``int (*compare)(struct device *, void *)`` compare function to match against all components h](jL)}(h+``int (*compare)(struct device *, void *)``h]jR)}(hjYh]h'int (*compare)(struct device *, void *)}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjWubah}(h]h ]h"]h$]h&]uh1jKh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhKphjSubjh)}(hhh]h)}(h0compare function to match against all componentsh]h0compare function to match against all components}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjnhKphjoubah}(h]h ]h"]h$]h&]uh1jghjSubeh}(h]h ]h"]h$]h&]uh1jEhjnhKphjubjF)}(hI``void *compare_data`` opaque pointer passed to the **compare** function h](jL)}(h``void *compare_data``h]jR)}(hjh]hvoid *compare_data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1jKh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhKqhjubjh)}(hhh]h)}(h1opaque pointer passed to the **compare** functionh](hopaque pointer passed to the }(hjhhhNhNubj)}(h **compare**h]hcompare}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh function}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhKqhjubah}(h]h ]h"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]uh1jEhjhKqhjubeh}(h]h ]h"]h$]h&]uh1j@hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhKshjubh)}(hX,Adds a new component match to the list stored in **matchptr**, which the **parent** aggregate driver needs to function. The list of component matches pointed to by **matchptr** must be initialized to NULL before adding the first match. This only matches against components added with component_add().h](h1Adds a new component match to the list stored in }(hjhhhNhNubj)}(h **matchptr**h]hmatchptr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh , which the }(hjhhhNhNubj)}(h **parent**h]hparent}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubhQ aggregate driver needs to function. The list of component matches pointed to by }(hjhhhNhNubj)}(h **matchptr**h]hmatchptr}(hj! hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh| must be initialized to NULL before adding the first match. This only matches against components added with component_add().}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhKrhjubh)}(hVThe allocated match list in **matchptr** is automatically released using devm actions.h](hThe allocated match list in }(hj: hhhNhNubj)}(h **matchptr**h]hmatchptr}(hjB hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj: ubh. is automatically released using devm actions.}(hj: hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhKwhjubh)}(hGSee also component_match_add_release() and component_match_add_typed().h]hGSee also component_match_add_release() and component_match_add_typed().}(hj[ hhhNhNubah}(h]h ]h"]h$]h&]uh1hh^/var/lib/git/docbuild/linux/Documentation/driver-api/component:14: ./include/linux/component.hhKzhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj@hhhNhNubjR)}(hhh]h}(h]h ]h"]h$]h&]entries](j^!component_compare_of (C function)c.component_compare_ofhNtauh1jQhj@hhhNhNubjc)}(hhh](jh)}(h9int component_compare_of (struct device *dev, void *data)h]jn)}(h8int component_compare_of(struct device *dev, void *data)h](j")}(hinth]hint}(hj hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj hhh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhj hM ubj)}(hcomponent_compare_ofh]j)}(hcomponent_compare_ofh]hcomponent_compare_of}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj hhhj hM ubjZ)}(h (struct device *dev, void *data)h](j`)}(hstruct device *devh](jt)}(hjwh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jshj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hhh]j)}(hdeviceh]hdevice}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjhjk)}jn]j)}jj sbc.component_compare_ofasbuh1hhj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hdevh]hdev}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j_hj ubj`)}(h void *datah](j")}(hvoidh]hvoid}(hj9 hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj5 ubj)}(h h]h }(hjG hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5 ubj)}(hjh]h*}(hjU hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5 ubj)}(hdatah]hdata}(hjb hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj5 ubeh}(h]h ]h"]h$]h&]noemphjjuh1j_hj ubeh}(h]h ]h"]h$]h&]jjuh1jYhj hhhj hM ubeh}(h]h ]h"]h$]h&]jjjuh1jmjjhj hhhj hM ubah}(h]j} ah ](jjeh"]h$]h&]jj)jhuh1jghj hM hj hhubj)}(hhh]h)}(h/A common component compare function for of_nodeh]h/A common component compare function for of_node}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM hj hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hM ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj jj jjjuh1jbhhhj@hNhNubj)}(hXP**Parameters** ``struct device *dev`` component device ``void *data`` **compare_data** from component_match_add_release() **Description** A common compare function when compare_data is device of_node. e.g. component_match_add_release(masterdev, :c:type:`match`, component_release_of, component_compare_of, component_dev_of_node)h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM$hj ubjA)}(hhh](jF)}(h(``struct device *dev`` component device h](jL)}(h``struct device *dev``h]jR)}(hj h]hstruct device *dev}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj ubah}(h]h ]h"]h$]h&]uh1jKh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM!hj ubjh)}(hhh]h)}(hcomponent deviceh]hcomponent device}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hM!hj ubah}(h]h ]h"]h$]h&]uh1jghj ubeh}(h]h ]h"]h$]h&]uh1jEhj hM!hj ubjF)}(hC``void *data`` **compare_data** from component_match_add_release() h](jL)}(h``void *data``h]jR)}(hj h]h void *data}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj ubah}(h]h ]h"]h$]h&]uh1jKh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM"hj ubjh)}(hhh]h)}(h3**compare_data** from component_match_add_release()h](j)}(h**compare_data**h]h compare_data}(hj# hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubh# from component_match_add_release()}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj hM"hj ubah}(h]h ]h"]h$]h&]uh1jghj ubeh}(h]h ]h"]h$]h&]uh1jEhj hM"hj ubeh}(h]h ]h"]h$]h&]uh1j@hj ubh)}(h**Description**h]j)}(hjO h]h Description}(hjQ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjM ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM$hj ubh)}(hA common compare function when compare_data is device of_node. e.g. component_match_add_release(masterdev, :c:type:`match`, component_release_of, component_compare_of, component_dev_of_node)h](hkA common compare function when compare_data is device of_node. e.g. component_match_add_release(masterdev, }(hje hhhNhNubh)}(h:c:type:`match`h]jR)}(hjo h]hmatch}(hjq hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jQhjm ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjhjljmatchuh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM#hje ubhD, component_release_of, component_compare_of, component_dev_of_node)}(hje hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj hM#hj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj@hhhNhNubjR)}(hhh]h}(h]h ]h"]h$]h&]entries](j^!component_release_of (C function)c.component_release_ofhNtauh1jQhj@hhhNhNubjc)}(hhh](jh)}(h:void component_release_of (struct device *dev, void *data)h]jn)}(h9void component_release_of(struct device *dev, void *data)h](j")}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj hhh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM/ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhj hM/ubj)}(hcomponent_release_ofh]j)}(hcomponent_release_ofh]hcomponent_release_of}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj hhhj hM/ubjZ)}(h (struct device *dev, void *data)h](j`)}(hstruct device *devh](jt)}(hjwh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jshj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hhh]j)}(hdeviceh]hdevice}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjhjk)}jn]j)}jj sbc.component_release_ofasbuh1hhj ubj)}(h h]h }(hj2 hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hjh]h*}(hj@ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hdevh]hdev}(hjM hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j_hj ubj`)}(h void *datah](j")}(hvoidh]hvoid}(hjf hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjb ubj)}(h h]h }(hjt hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjb ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjb ubj)}(hdatah]hdata}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjb ubeh}(h]h ]h"]h$]h&]noemphjjuh1j_hj ubeh}(h]h ]h"]h$]h&]jjuh1jYhj hhhj hM/ubeh}(h]h ]h"]h$]h&]jjjuh1jmjjhj hhhj hM/ubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jghj hM/hj hhubj)}(hhh]h)}(h/A common component release function for of_nodeh]h/A common component release function for of_node}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM/hj hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hM/ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj jj jjjuh1jbhhhj@hNhNubj)}(h**Parameters** ``struct device *dev`` component device ``void *data`` **compare_data** from component_match_add_release() **Description** About the example, Please see component_compare_of().h](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM3hj ubjA)}(hhh](jF)}(h(``struct device *dev`` component device h](jL)}(h``struct device *dev``h]jR)}(hj h]hstruct device *dev}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj ubah}(h]h ]h"]h$]h&]uh1jKh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM0hj ubjh)}(hhh]h)}(hcomponent deviceh]hcomponent device}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hM0hj ubah}(h]h ]h"]h$]h&]uh1jghj ubeh}(h]h ]h"]h$]h&]uh1jEhj hM0hj ubjF)}(hC``void *data`` **compare_data** from component_match_add_release() h](jL)}(h``void *data``h]jR)}(hj3 h]h void *data}(hj5 hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj1 ubah}(h]h ]h"]h$]h&]uh1jKh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM1hj- ubjh)}(hhh]h)}(h3**compare_data** from component_match_add_release()h](j)}(h**compare_data**h]h compare_data}(hjP hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjL ubh# from component_match_add_release()}(hjL hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjH hM1hjI ubah}(h]h ]h"]h$]h&]uh1jghj- ubeh}(h]h ]h"]h$]h&]uh1jEhjH hM1hj ubeh}(h]h ]h"]h$]h&]uh1j@hj ubh)}(h**Description**h]j)}(hj| h]h Description}(hj~ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjz ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM3hj ubh)}(h5About the example, Please see component_compare_of().h]h5About the example, Please see component_compare_of().}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM2hj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj@hhhNhNubjR)}(hhh]h}(h]h ]h"]h$]h&]entries](j^"component_compare_dev (C function)c.component_compare_devhNtauh1jQhj@hhhNhNubjc)}(hhh](jh)}(h:int component_compare_dev (struct device *dev, void *data)h]jn)}(h9int component_compare_dev(struct device *dev, void *data)h](j")}(hinth]hint}(hj hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj hhh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM<ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhj hM<ubj)}(hcomponent_compare_devh]j)}(hcomponent_compare_devh]hcomponent_compare_dev}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj hhhj hM<ubjZ)}(h (struct device *dev, void *data)h](j`)}(hstruct device *devh](jt)}(hjwh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jshj ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hhh]j)}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjhjk)}jn]j)}jj sbc.component_compare_devasbuh1hhj ubj)}(h h]h }(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hjh]h*}(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(hdevh]hdev}(hjWhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphjjuh1j_hj ubj`)}(h void *datah](j")}(hvoidh]hvoid}(hjphhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjlubj)}(h h]h }(hj~hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubj)}(hdatah]hdata}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjlubeh}(h]h ]h"]h$]h&]noemphjjuh1j_hj ubeh}(h]h ]h"]h$]h&]jjuh1jYhj hhhj hM<ubeh}(h]h ]h"]h$]h&]jjjuh1jmjjhj hhhj hM<ubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jghj hM<hj hhubj)}(hhh]h)}(h+A common component compare function for devh]h+A common component compare function for dev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM<hjhhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hM<ubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jbhhhj@hNhNubj)}(hX***Parameters** ``struct device *dev`` component device ``void *data`` **compare_data** from component_match_add_release() **Description** A common compare function when compare_data is struce device. e.g. component_match_add(masterdev, :c:type:`match`, component_compare_dev, component_dev)h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM@hjubjA)}(hhh](jF)}(h(``struct device *dev`` component device h](jL)}(h``struct device *dev``h]jR)}(hjh]hstruct device *dev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1jKh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM=hjubjh)}(hhh]h)}(hcomponent deviceh]hcomponent device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhM=hjubah}(h]h ]h"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]uh1jEhjhM=hjubjF)}(hC``void *data`` **compare_data** from component_match_add_release() h](jL)}(h``void *data``h]jR)}(hj=h]h void *data}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj;ubah}(h]h ]h"]h$]h&]uh1jKh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM>hj7ubjh)}(hhh]h)}(h3**compare_data** from component_match_add_release()h](j)}(h**compare_data**h]h compare_data}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjVubh# from component_match_add_release()}(hjVhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjRhM>hjSubah}(h]h ]h"]h$]h&]uh1jghj7ubeh}(h]h ]h"]h$]h&]uh1jEhjRhM>hjubeh}(h]h ]h"]h$]h&]uh1j@hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM@hjubh)}(hA common compare function when compare_data is struce device. e.g. component_match_add(masterdev, :c:type:`match`, component_compare_dev, component_dev)h](hbA common compare function when compare_data is struce device. e.g. component_match_add(masterdev, }(hjhhhNhNubh)}(h:c:type:`match`h]jR)}(hjh]hmatch}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjhjljmatchuh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM?hjubh', component_compare_dev, component_dev)}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhM?hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj@hhhNhNubjR)}(hhh]h}(h]h ]h"]h$]h&]entries](j^'component_compare_dev_name (C function)c.component_compare_dev_namehNtauh1jQhj@hhhNhNubjc)}(hhh](jh)}(h?int component_compare_dev_name (struct device *dev, void *data)h]jn)}(h>int component_compare_dev_name(struct device *dev, void *data)h](j")}(hinth]hint}(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjhhh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMJubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMJubj)}(hcomponent_compare_dev_nameh]j)}(hcomponent_compare_dev_nameh]hcomponent_compare_dev_name}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhjhMJubjZ)}(h (struct device *dev, void *data)h](j`)}(hstruct device *devh](jt)}(hjwh]hstruct}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jshj'ubj)}(h h]h }(hj8hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubh)}(hhh]j)}(hdeviceh]hdevice}(hjIhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjFubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjKmodnameN classnameNjhjk)}jn]j)}jjsbc.component_compare_dev_nameasbuh1hhj'ubj)}(h h]h }(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubj)}(hjh]h*}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubj)}(hdevh]hdev}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]noemphjjuh1j_hj#ubj`)}(h void *datah](j")}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hdatah]hdata}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j_hj#ubeh}(h]h ]h"]h$]h&]jjuh1jYhjhhhjhMJubeh}(h]h ]h"]h$]h&]jjjuh1jmjjhjhhhjhMJubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jghjhMJhjhhubj)}(hhh]h)}(h3A common component compare function for device nameh]h3A common component compare function for device name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMJhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMJubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jbhhhj@hNhNubj)}(hX;**Parameters** ``struct device *dev`` component device ``void *data`` **compare_data** from component_match_add_release() **Description** A common compare function when compare_data is device name string. e.g. component_match_add(masterdev, :c:type:`match`, component_compare_dev_name, "component_dev_name")h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMNhj ubjA)}(hhh](jF)}(h(``struct device *dev`` component device h](jL)}(h``struct device *dev``h]jR)}(hj1h]hstruct device *dev}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj/ubah}(h]h ]h"]h$]h&]uh1jKh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMKhj+ubjh)}(hhh]h)}(hcomponent deviceh]hcomponent device}(hjJhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjFhMKhjGubah}(h]h ]h"]h$]h&]uh1jghj+ubeh}(h]h ]h"]h$]h&]uh1jEhjFhMKhj(ubjF)}(hC``void *data`` **compare_data** from component_match_add_release() h](jL)}(h``void *data``h]jR)}(hjjh]h void *data}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjhubah}(h]h ]h"]h$]h&]uh1jKh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMLhjdubjh)}(hhh]h)}(h3**compare_data** from component_match_add_release()h](j)}(h**compare_data**h]h compare_data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh# from component_match_add_release()}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMLhjubah}(h]h ]h"]h$]h&]uh1jghjdubeh}(h]h ]h"]h$]h&]uh1jEhjhMLhj(ubeh}(h]h ]h"]h$]h&]uh1j@hj ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMNhj ubh)}(hA common compare function when compare_data is device name string. e.g. component_match_add(masterdev, :c:type:`match`, component_compare_dev_name, "component_dev_name")h](hgA common compare function when compare_data is device name string. e.g. component_match_add(masterdev, }(hjhhhNhNubh)}(h:c:type:`match`h]jR)}(hjh]hmatch}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjhjljmatchuh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMMhjubh7, component_compare_dev_name, “component_dev_name”)}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMMhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj@hhhNhNubjR)}(hhh]h}(h]h ]h"]h$]h&]entries](j^(component_match_add_release (C function)c.component_match_add_releasehNtauh1jQhj@hhhNhNubjc)}(hhh](jh)}(hvoid component_match_add_release (struct device *parent, struct component_match **matchptr, void (*release)(struct device *, void *), int (*compare)(struct device *, void *), void *compare_data)h]jn)}(hvoid component_match_add_release(struct device *parent, struct component_match **matchptr, void (*release)(struct device*, void*), int (*compare)(struct device*, void*), void *compare_data)h](j")}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjhhh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMubj)}(h h]h }(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj)hMubj)}(hcomponent_match_add_releaseh]j)}(hcomponent_match_add_releaseh]hcomponent_match_add_release}(hj<hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhj)hMubjZ)}(h(struct device *parent, struct component_match **matchptr, void (*release)(struct device*, void*), int (*compare)(struct device*, void*), void *compare_data)h](j`)}(hstruct device *parenth](jt)}(hjwh]hstruct}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jshjTubj)}(h h]h }(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubh)}(hhh]j)}(hdeviceh]hdevice}(hjvhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjxmodnameN classnameNjhjk)}jn]j)}jj>sbc.component_match_add_releaseasbuh1hhjTubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubj)}(hparenth]hparent}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]noemphjjuh1j_hjPubj`)}(h!struct component_match **matchptrh](jt)}(hjwh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jshjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hcomponent_matchh]hcomponent_match}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjhjk)}jn]jc.component_match_add_releaseasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hmatchptrh]hmatchptr}(hj.hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j_hjPubj`)}(h&void (*release)(struct device*, void*)h](j")}(hvoidh]hvoid}(hjGhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjCubj)}(h h]h }(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj)}(hjyh]h(}(hjchhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj)}(hjh]h*}(hjphhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj)}(hreleaseh]hrelease}(hj}hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj)}(hjh]h)}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj)}(hjyh]h(}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubjt)}(hjwh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jshjCubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubh)}(hhh]j)}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjhjk)}jn]jc.component_match_add_releaseasbuh1hhjCubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj)}(hjh]h,}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj")}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjCubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubj)}(hjh]h)}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjCubeh}(h]h ]h"]h$]h&]noemphjjuh1j_hjPubj`)}(h%int (*compare)(struct device*, void*)h](j")}(hinth]hint}(hj<hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj8ubj)}(h h]h }(hjJhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubj)}(hjyh]h(}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubj)}(hjh]h*}(hjehhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubj)}(hcompareh]hcompare}(hjrhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubj)}(hjh]h)}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubj)}(hjyh]h(}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubjt)}(hjwh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jshj8ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubh)}(hhh]j)}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjhjk)}jn]jc.component_match_add_releaseasbuh1hhj8ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubj)}(hjh]h,}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubj")}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj8ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubj)}(hjh]h)}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]noemphjjuh1j_hjPubj`)}(hvoid *compare_datah](j")}(hvoidh]hvoid}(hj1hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj-ubj)}(h h]h }(hj?hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubj)}(hjh]h*}(hjMhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubj)}(h compare_datah]h compare_data}(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubeh}(h]h ]h"]h$]h&]noemphjjuh1j_hjPubeh}(h]h ]h"]h$]h&]jjuh1jYhjhhhj)hMubeh}(h]h ]h"]h$]h&]jjjuh1jmjjhjhhhj)hMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jghj)hMhjhhubj)}(hhh]h)}(h1add a component match entry with release callbackh]h1add a component match entry with release callback}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj)hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jbhhhj@hNhNubj)}(hX)**Parameters** ``struct device *parent`` parent device of the aggregate driver ``struct component_match **matchptr`` pointer to the list of component matches ``void (*release)(struct device *, void *)`` release function for **compare_data** ``int (*compare)(struct device *, void *)`` compare function to match against all components ``void *compare_data`` opaque pointer passed to the **compare** function **Description** Adds a new component match to the list stored in **matchptr**, which the aggregate driver needs to function. The list of component matches pointed to by **matchptr** must be initialized to NULL before adding the first match. This only matches against components added with component_add(). The allocated match list in **matchptr** is automatically released using devm actions, where upon **release** will be called to free any references held by **compare_data**, e.g. when **compare_data** is a :c:type:`device_node` that must be released with of_node_put(). See also component_match_add() and component_match_add_typed().h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhjubjA)}(hhh](jF)}(h@``struct device *parent`` parent device of the aggregate driver h](jL)}(h``struct device *parent``h]jR)}(hjh]hstruct device *parent}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1jKh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhjubjh)}(hhh]h)}(h%parent device of the aggregate driverh]h%parent device of the aggregate driver}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]uh1jEhjhMhjubjF)}(hO``struct component_match **matchptr`` pointer to the list of component matches h](jL)}(h%``struct component_match **matchptr``h]jR)}(hjh]h!struct component_match **matchptr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1jKh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhjubjh)}(hhh]h)}(h(pointer to the list of component matchesh]h(pointer to the list of component matches}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]uh1jEhjhMhjubjF)}(hS``void (*release)(struct device *, void *)`` release function for **compare_data** h](jL)}(h,``void (*release)(struct device *, void *)``h]jR)}(hj7h]h(void (*release)(struct device *, void *)}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj5ubah}(h]h ]h"]h$]h&]uh1jKh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhj1ubjh)}(hhh]h)}(h%release function for **compare_data**h](hrelease function for }(hjPhhhNhNubj)}(h**compare_data**h]h compare_data}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjPubeh}(h]h ]h"]h$]h&]uh1hhjLhMhjMubah}(h]h ]h"]h$]h&]uh1jghj1ubeh}(h]h ]h"]h$]h&]uh1jEhjLhMhjubjF)}(h]``int (*compare)(struct device *, void *)`` compare function to match against all components h](jL)}(h+``int (*compare)(struct device *, void *)``h]jR)}(hj~h]h'int (*compare)(struct device *, void *)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj|ubah}(h]h ]h"]h$]h&]uh1jKh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhjxubjh)}(hhh]h)}(h0compare function to match against all componentsh]h0compare function to match against all components}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jghjxubeh}(h]h ]h"]h$]h&]uh1jEhjhMhjubjF)}(hI``void *compare_data`` opaque pointer passed to the **compare** function h](jL)}(h``void *compare_data``h]jR)}(hjh]hvoid *compare_data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1jKh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhjubjh)}(hhh]h)}(h1opaque pointer passed to the **compare** functionh](hopaque pointer passed to the }(hjhhhNhNubj)}(h **compare**h]hcompare}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh function}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]uh1jEhjhMhjubeh}(h]h ]h"]h$]h&]uh1j@hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhjubh)}(hX!Adds a new component match to the list stored in **matchptr**, which the aggregate driver needs to function. The list of component matches pointed to by **matchptr** must be initialized to NULL before adding the first match. This only matches against components added with component_add().h](h1Adds a new component match to the list stored in }(hjhhhNhNubj)}(h **matchptr**h]hmatchptr}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh\, which the aggregate driver needs to function. The list of component matches pointed to by }(hjhhhNhNubj)}(h **matchptr**h]hmatchptr}(hj4hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh| must be initialized to NULL before adding the first match. This only matches against components added with component_add().}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhjubh)}(hX The allocated match list in **matchptr** is automatically released using devm actions, where upon **release** will be called to free any references held by **compare_data**, e.g. when **compare_data** is a :c:type:`device_node` that must be released with of_node_put().h](hThe allocated match list in }(hjMhhhNhNubj)}(h **matchptr**h]hmatchptr}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubh: is automatically released using devm actions, where upon }(hjMhhhNhNubj)}(h **release**h]hrelease}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubh/ will be called to free any references held by }(hjMhhhNhNubj)}(h**compare_data**h]h compare_data}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubh , e.g. when }(hjMhhhNhNubj)}(h**compare_data**h]h compare_data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjMubh is a }(hjMhhhNhNubh)}(h:c:type:`device_node`h]jR)}(hjh]h device_node}(hjhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjhjlj device_nodeuh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhjMubh* that must be released with of_node_put().}(hjMhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubh)}(h?See also component_match_add() and component_match_add_typed().h]h?See also component_match_add() and component_match_add_typed().}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj@hhhNhNubjR)}(hhh]h}(h]h ]h"]h$]h&]entries](j^&component_match_add_typed (C function)c.component_match_add_typedhNtauh1jQhj@hhhNhNubjc)}(hhh](jh)}(hvoid component_match_add_typed (struct device *parent, struct component_match **matchptr, int (*compare_typed)(struct device *, int, void *), void *compare_data)h]jn)}(hvoid component_match_add_typed(struct device *parent, struct component_match **matchptr, int (*compare_typed)(struct device*, int, void*), void *compare_data)h](j")}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjhhh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMubj)}(hcomponent_match_add_typedh]j)}(hcomponent_match_add_typedh]hcomponent_match_add_typed}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhjhMubjZ)}(h(struct device *parent, struct component_match **matchptr, int (*compare_typed)(struct device*, int, void*), void *compare_data)h](j`)}(hstruct device *parenth](jt)}(hjwh]hstruct}(hj3hhhNhNubah}(h]h ]jah"]h$]h&]uh1jshj/ubj)}(h h]h }(hj@hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubh)}(hhh]j)}(hdeviceh]hdevice}(hjQhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjNubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjSmodnameN classnameNjhjk)}jn]j)}jjsbc.component_match_add_typedasbuh1hhj/ubj)}(h h]h }(hjqhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubj)}(hparenth]hparent}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]noemphjjuh1j_hj+ubj`)}(h!struct component_match **matchptrh](jt)}(hjwh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jshjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hcomponent_matchh]hcomponent_match}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjhjk)}jn]jmc.component_match_add_typedasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hmatchptrh]hmatchptr}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j_hj+ubj`)}(h0int (*compare_typed)(struct device*, int, void*)h](j")}(hinth]hint}(hj"hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjubj)}(h h]h }(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjyh]h(}(hj>hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjKhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h compare_typedh]h compare_typed}(hjXhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h)}(hjfhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjyh]h(}(hjshhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjt)}(hjwh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jshjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjhjk)}jn]jmc.component_match_add_typedasbuh1hhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h,}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj")}(hinth]hint}(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjubj)}(hjh]h,}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj")}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h)}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j_hj+ubj`)}(hvoid *compare_datah](j")}(hvoidh]hvoid}(hj@hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj<ubj)}(h h]h }(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubj)}(hjh]h*}(hj\hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubj)}(h compare_datah]h compare_data}(hjihhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj<ubeh}(h]h ]h"]h$]h&]noemphjjuh1j_hj+ubeh}(h]h ]h"]h$]h&]jjuh1jYhjhhhjhMubeh}(h]h ]h"]h$]h&]jjjuh1jmjjhjhhhjhMubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jghjhMhjhhubj)}(hhh]h)}(h1add a component match entry for a typed componenth]h1add a component match entry for a typed component}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjjjjjjuh1jbhhhj@hNhNubj)}(hX;**Parameters** ``struct device *parent`` parent device of the aggregate driver ``struct component_match **matchptr`` pointer to the list of component matches ``int (*compare_typed)(struct device *, int, void *)`` compare function to match against all typed components ``void *compare_data`` opaque pointer passed to the **compare** function **Description** Adds a new component match to the list stored in **matchptr**, which the aggregate driver needs to function. The list of component matches pointed to by **matchptr** must be initialized to NULL before adding the first match. This only matches against components added with component_add_typed(). The allocated match list in **matchptr** is automatically released using devm actions. See also component_match_add_release() and component_match_add_typed().h](h)}(h**Parameters**h]j)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhjubjA)}(hhh](jF)}(h@``struct device *parent`` parent device of the aggregate driver h](jL)}(h``struct device *parent``h]jR)}(hjh]hstruct device *parent}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1jKh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhjubjh)}(hhh]h)}(h%parent device of the aggregate driverh]h%parent device of the aggregate driver}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]uh1jEhjhMhjubjF)}(hO``struct component_match **matchptr`` pointer to the list of component matches h](jL)}(h%``struct component_match **matchptr``h]jR)}(hj h]h!struct component_match **matchptr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj ubah}(h]h ]h"]h$]h&]uh1jKh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhjubjh)}(hhh]h)}(h(pointer to the list of component matchesh]h(pointer to the list of component matches}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hMhj#ubah}(h]h ]h"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]uh1jEhj"hMhjubjF)}(hn``int (*compare_typed)(struct device *, int, void *)`` compare function to match against all typed components h](jL)}(h6``int (*compare_typed)(struct device *, int, void *)``h]jR)}(hjFh]h2int (*compare_typed)(struct device *, int, void *)}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjDubah}(h]h ]h"]h$]h&]uh1jKh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhj@ubjh)}(hhh]h)}(h6compare function to match against all typed componentsh]h6compare function to match against all typed components}(hj_hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj[hMhj\ubah}(h]h ]h"]h$]h&]uh1jghj@ubeh}(h]h ]h"]h$]h&]uh1jEhj[hMhjubjF)}(hI``void *compare_data`` opaque pointer passed to the **compare** function h](jL)}(h``void *compare_data``h]jR)}(hjh]hvoid *compare_data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj}ubah}(h]h ]h"]h$]h&]uh1jKh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhjyubjh)}(hhh]h)}(h1opaque pointer passed to the **compare** functionh](hopaque pointer passed to the }(hjhhhNhNubj)}(h **compare**h]hcompare}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh function}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jghjyubeh}(h]h ]h"]h$]h&]uh1jEhjhMhjubeh}(h]h ]h"]h$]h&]uh1j@hjubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhjubh)}(hX'Adds a new component match to the list stored in **matchptr**, which the aggregate driver needs to function. The list of component matches pointed to by **matchptr** must be initialized to NULL before adding the first match. This only matches against components added with component_add_typed().h](h1Adds a new component match to the list stored in }(hjhhhNhNubj)}(h **matchptr**h]hmatchptr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh\, which the aggregate driver needs to function. The list of component matches pointed to by }(hjhhhNhNubj)}(h **matchptr**h]hmatchptr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh must be initialized to NULL before adding the first match. This only matches against components added with component_add_typed().}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhjubh)}(hVThe allocated match list in **matchptr** is automatically released using devm actions.h](hThe allocated match list in }(hjhhhNhNubj)}(h **matchptr**h]hmatchptr}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh. is automatically released using devm actions.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhjubh)}(hGSee also component_match_add_release() and component_match_add_typed().h]hGSee also component_match_add_release() and component_match_add_typed().}(hj6hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj@hhhNhNubjR)}(hhh]h}(h]h ]h"]h$]h&]entries](j^,component_master_add_with_match (C function)!c.component_master_add_with_matchhNtauh1jQhj@hhhNhNubjc)}(hhh](jh)}(hint component_master_add_with_match (struct device *parent, const struct component_master_ops *ops, struct component_match *match)h]jn)}(hint component_master_add_with_match(struct device *parent, const struct component_master_ops *ops, struct component_match *match)h](j")}(hinth]hint}(hjehhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjahhh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMubj)}(h h]h }(hjthhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjahhhjshMubj)}(hcomponent_master_add_with_matchh]j)}(hcomponent_master_add_with_matchh]hcomponent_master_add_with_match}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjahhhjshMubjZ)}(h^(struct device *parent, const struct component_master_ops *ops, struct component_match *match)h](j`)}(hstruct device *parenth](jt)}(hjwh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jshjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hdeviceh]hdevice}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjhjk)}jn]j)}jjsb!c.component_master_add_with_matchasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hparenth]hparent}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j_hjubj`)}(h&const struct component_master_ops *opsh](jt)}(hconsth]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jshjubj)}(h h]h }(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjt)}(hjwh]hstruct}(hj0hhhNhNubah}(h]h ]jah"]h$]h&]uh1jshjubj)}(h h]h }(hj=hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hcomponent_master_opsh]hcomponent_master_ops}(hjNhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjKubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjPmodnameN classnameNjhjk)}jn]j!c.component_master_add_with_matchasbuh1hhjubj)}(h h]h }(hjlhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjzhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hopsh]hops}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j_hjubj`)}(hstruct component_match *matchh](jt)}(hjwh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jshjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hcomponent_matchh]hcomponent_match}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjmodnameN classnameNjhjk)}jn]j!c.component_master_add_with_matchasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hmatchh]hmatch}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j_hjubeh}(h]h ]h"]h$]h&]jjuh1jYhjahhhjshMubeh}(h]h ]h"]h$]h&]jjjuh1jmjjhj]hhhjshMubah}(h]jXah ](jjeh"]h$]h&]jj)jhuh1jghjshMhjZhhubj)}(hhh]h)}(hregister an aggregate driverh]hregister an aggregate driver}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhjhhubah}(h]h ]h"]h$]h&]uh1jhjZhhhjshMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj9jj9jjjuh1jbhhhj@hNhNubj)}(hX`**Parameters** ``struct device *parent`` parent device of the aggregate driver ``const struct component_master_ops *ops`` callbacks for the aggregate driver ``struct component_match *match`` component match list for the aggregate driver **Description** Registers a new aggregate driver consisting of the components added to **match** by calling one of the component_match_add() functions. Once all components in **match** are available, it will be assembled by calling :c:type:`component_master_ops.bind ` from **ops**. Must be unregistered by calling component_master_del().h](h)}(h**Parameters**h]j)}(hjCh]h Parameters}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjAubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhj=ubjA)}(hhh](jF)}(h@``struct device *parent`` parent device of the aggregate driver h](jL)}(h``struct device *parent``h]jR)}(hjbh]hstruct device *parent}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj`ubah}(h]h ]h"]h$]h&]uh1jKh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhj\ubjh)}(hhh]h)}(h%parent device of the aggregate driverh]h%parent device of the aggregate driver}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjwhMhjxubah}(h]h ]h"]h$]h&]uh1jghj\ubeh}(h]h ]h"]h$]h&]uh1jEhjwhMhjYubjF)}(hN``const struct component_master_ops *ops`` callbacks for the aggregate driver h](jL)}(h*``const struct component_master_ops *ops``h]jR)}(hjh]h&const struct component_master_ops *ops}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1jKh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhjubjh)}(hhh]h)}(h"callbacks for the aggregate driverh]h"callbacks for the aggregate driver}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]uh1jEhjhMhjYubjF)}(hP``struct component_match *match`` component match list for the aggregate driver h](jL)}(h!``struct component_match *match``h]jR)}(hjh]hstruct component_match *match}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1jKh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhjubjh)}(hhh]h)}(h-component match list for the aggregate driverh]h-component match list for the aggregate driver}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jghjubeh}(h]h ]h"]h$]h&]uh1jEhjhMhjYubeh}(h]h ]h"]h$]h&]uh1j@hj=ubh)}(h**Description**h]j)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhj=ubh)}(hXXRegisters a new aggregate driver consisting of the components added to **match** by calling one of the component_match_add() functions. Once all components in **match** are available, it will be assembled by calling :c:type:`component_master_ops.bind ` from **ops**. Must be unregistered by calling component_master_del().h](hGRegisters a new aggregate driver consisting of the components added to }(hj%hhhNhNubj)}(h **match**h]hmatch}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubhO by calling one of the component_match_add() functions. Once all components in }(hj%hhhNhNubj)}(h **match**h]hmatch}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubh0 are available, it will be assembled by calling }(hj%hhhNhNubh)}(h::c:type:`component_master_ops.bind `h]jR)}(hjSh]hcomponent_master_ops.bind}(hjUhhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jQhjQubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjhjljcomponent_master_opsuh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhj%ubh from }(hj%hhhNhNubj)}(h**ops**h]hops}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubh9. Must be unregistered by calling component_master_del().}(hj%hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjphMhj=ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj@hhhNhNubjR)}(hhh]h}(h]h ]h"]h$]h&]entries](j^!component_master_del (C function)c.component_master_delhNtauh1jQhj@hhhNhNubjc)}(hhh](jh)}(hYvoid component_master_del (struct device *parent, const struct component_master_ops *ops)h]jn)}(hXvoid component_master_del(struct device *parent, const struct component_master_ops *ops)h](j")}(hvoidh]hvoid}(hjhhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjhhh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM%ubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhM%ubj)}(hcomponent_master_delh]j)}(hcomponent_master_delh]hcomponent_master_del}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]jjuh1jhjhhhjhM%ubjZ)}(h?(struct device *parent, const struct component_master_ops *ops)h](j`)}(hstruct device *parenth](jt)}(hjwh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jshjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hdeviceh]hdevice}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjhjk)}jn]j)}jjsbc.component_master_delasbuh1hhjubj)}(h h]h }(hj( hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]h*}(hj6 hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hparenth]hparent}(hjC hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphjjuh1j_hjubj`)}(h&const struct component_master_ops *opsh](jt)}(hjh]hconst}(hj\ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jshjX ubj)}(h h]h }(hji hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjX ubjt)}(hjwh]hstruct}(hjw hhhNhNubah}(h]h ]jah"]h$]h&]uh1jshjX ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjX ubh)}(hhh]j)}(hcomponent_master_opsh]hcomponent_master_ops}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjhjk)}jn]j$ c.component_master_delasbuh1hhjX ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjX ubj)}(hjh]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjX ubj)}(hopsh]hops}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjX ubeh}(h]h ]h"]h$]h&]noemphjjuh1j_hjubeh}(h]h ]h"]h$]h&]jjuh1jYhjhhhjhM%ubeh}(h]h ]h"]h$]h&]jjjuh1jmjjhjhhhjhM%ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jghjhM%hjhhubj)}(hhh]h)}(hunregister an aggregate driverh]hunregister an aggregate driver}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM%hj hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhM%ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj!jj!jjjuh1jbhhhj@hNhNubj)}(hX**Parameters** ``struct device *parent`` parent device of the aggregate driver ``const struct component_master_ops *ops`` callbacks for the aggregate driver **Description** Unregisters an aggregate driver registered with component_master_add_with_match(). If necessary the aggregate driver is first disassembled by calling :c:type:`component_master_ops.unbind ` from **ops**.h](h)}(h**Parameters**h]j)}(hj!h]h Parameters}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM)hj!ubjA)}(hhh](jF)}(h@``struct device *parent`` parent device of the aggregate driver h](jL)}(h``struct device *parent``h]jR)}(hj9!h]hstruct device *parent}(hj;!hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj7!ubah}(h]h ]h"]h$]h&]uh1jKh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM&hj3!ubjh)}(hhh]h)}(h%parent device of the aggregate driverh]h%parent device of the aggregate driver}(hjR!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjN!hM&hjO!ubah}(h]h ]h"]h$]h&]uh1jghj3!ubeh}(h]h ]h"]h$]h&]uh1jEhjN!hM&hj0!ubjF)}(hN``const struct component_master_ops *ops`` callbacks for the aggregate driver h](jL)}(h*``const struct component_master_ops *ops``h]jR)}(hjr!h]h&const struct component_master_ops *ops}(hjt!hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjp!ubah}(h]h ]h"]h$]h&]uh1jKh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM'hjl!ubjh)}(hhh]h)}(h"callbacks for the aggregate driverh]h"callbacks for the aggregate driver}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!hM'hj!ubah}(h]h ]h"]h$]h&]uh1jghjl!ubeh}(h]h ]h"]h$]h&]uh1jEhj!hM'hj0!ubeh}(h]h ]h"]h$]h&]uh1j@hj!ubh)}(h**Description**h]j)}(hj!h]h Description}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM)hj!ubh)}(hUnregisters an aggregate driver registered with component_master_add_with_match(). If necessary the aggregate driver is first disassembled by calling :c:type:`component_master_ops.unbind ` from **ops**.h](hUnregisters an aggregate driver registered with component_master_add_with_match(). If necessary the aggregate driver is first disassembled by calling }(hj!hhhNhNubh)}(h<:c:type:`component_master_ops.unbind `h]jR)}(hj!h]hcomponent_master_ops.unbind}(hj!hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jQhj!ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjhjljcomponent_master_opsuh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM(hj!ubh from }(hj!hhhNhNubj)}(h**ops**h]hops}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubh.}(hj!hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj!hM(hj!ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj@hhhNhNubjR)}(hhh]h}(h]h ]h"]h$]h&]entries](j^!component_unbind_all (C function)c.component_unbind_allhNtauh1jQhj@hhhNhNubjc)}(hhh](jh)}(h=void component_unbind_all (struct device *parent, void *data)h]jn)}(h` functions. Should be called from :c:type:`component_master_ops.unbind `.h](h)}(h**Parameters**h]j)}(hjK#h]h Parameters}(hjM#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjI#ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM`hjE#ubjA)}(hhh](jF)}(h@``struct device *parent`` parent device of the aggregate driver h](jL)}(h``struct device *parent``h]jR)}(hjj#h]hstruct device *parent}(hjl#hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjh#ubah}(h]h ]h"]h$]h&]uh1jKh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM]hjd#ubjh)}(hhh]h)}(h%parent device of the aggregate driverh]h%parent device of the aggregate driver}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#hM]hj#ubah}(h]h ]h"]h$]h&]uh1jghjd#ubeh}(h]h ]h"]h$]h&]uh1jEhj#hM]hja#ubjF)}(h8``void *data`` opaque pointer, passed to all components h](jL)}(h``void *data``h]jR)}(hj#h]h void *data}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj#ubah}(h]h ]h"]h$]h&]uh1jKh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM^hj#ubjh)}(hhh]h)}(h(opaque pointer, passed to all componentsh]h(opaque pointer, passed to all components}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj#hM^hj#ubah}(h]h ]h"]h$]h&]uh1jghj#ubeh}(h]h ]h"]h$]h&]uh1jEhj#hM^hja#ubeh}(h]h ]h"]h$]h&]uh1j@hjE#ubh)}(h**Description**h]j)}(hj#h]h Description}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM`hjE#ubh)}(hUnbinds all components of the aggregate device by passing **data** to their :c:type:`component_ops.unbind ` functions. Should be called from :c:type:`component_master_ops.unbind `.h](h:Unbinds all components of the aggregate device by passing }(hj#hhhNhNubj)}(h**data**h]hdata}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj#ubh to their }(hj#hhhNhNubh)}(h.:c:type:`component_ops.unbind `h]jR)}(hj$h]hcomponent_ops.unbind}(hj$hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jQhj$ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjhjlj component_opsuh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM_hj#ubh" functions. Should be called from }(hj#hhhNhNubh)}(h<:c:type:`component_master_ops.unbind `h]jR)}(hj4$h]hcomponent_master_ops.unbind}(hj6$hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jQhj2$ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjhjljcomponent_master_opsuh1hhj-$hM_hj#ubh.}(hj#hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj-$hM_hjE#ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj@hhhNhNubjR)}(hhh]h}(h]h ]h"]h$]h&]entries](j^component_bind_all (C function)c.component_bind_allhNtauh1jQhj@hhhNhNubjc)}(hhh](jh)}(h:int component_bind_all (struct device *parent, void *data)h]jn)}(h9int component_bind_all(struct device *parent, void *data)h](j")}(hinth]hint}(hj{$hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hjw$hhh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMubj)}(h h]h }(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjw$hhhj$hMubj)}(hcomponent_bind_allh]j)}(hcomponent_bind_allh]hcomponent_bind_all}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubah}(h]h ](jjeh"]h$]h&]jjuh1jhjw$hhhj$hMubjZ)}(h#(struct device *parent, void *data)h](j`)}(hstruct device *parenth](jt)}(hjwh]hstruct}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jshj$ubj)}(h h]h }(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubh)}(hhh]j)}(hdeviceh]hdevice}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj$modnameN classnameNjhjk)}jn]j)}jj$sbc.component_bind_allasbuh1hhj$ubj)}(h h]h }(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj)}(hjh]h*}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj)}(hparenth]hparent}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]noemphjjuh1j_hj$ubj`)}(h void *datah](j")}(hvoidh]hvoid}(hj*%hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj&%ubj)}(h h]h }(hj8%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&%ubj)}(hjh]h*}(hjF%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&%ubj)}(hdatah]hdata}(hjS%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&%ubeh}(h]h ]h"]h$]h&]noemphjjuh1j_hj$ubeh}(h]h ]h"]h$]h&]jjuh1jYhjw$hhhj$hMubeh}(h]h ]h"]h$]h&]jjjuh1jmjjhjs$hhhj$hMubah}(h]jn$ah ](jjeh"]h$]h&]jj)jhuh1jghj$hMhjp$hhubj)}(hhh]h)}(h*bind all components of an aggregate driverh]h*bind all components of an aggregate driver}(hj}%hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhjz%hhubah}(h]h ]h"]h$]h&]uh1jhjp$hhhj$hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj%jj%jjjuh1jbhhhj@hNhNubj)}(hXs**Parameters** ``struct device *parent`` parent device of the aggregate driver ``void *data`` opaque pointer, passed to all components **Description** Binds all components of the aggregate **dev** by passing **data** to their :c:type:`component_ops.bind ` functions. Should be called from :c:type:`component_master_ops.bind `.h](h)}(h**Parameters**h]j)}(hj%h]h Parameters}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhj%ubjA)}(hhh](jF)}(h@``struct device *parent`` parent device of the aggregate driver h](jL)}(h``struct device *parent``h]jR)}(hj%h]hstruct device *parent}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj%ubah}(h]h ]h"]h$]h&]uh1jKh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhj%ubjh)}(hhh]h)}(h%parent device of the aggregate driverh]h%parent device of the aggregate driver}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hMhj%ubah}(h]h ]h"]h$]h&]uh1jghj%ubeh}(h]h ]h"]h$]h&]uh1jEhj%hMhj%ubjF)}(h8``void *data`` opaque pointer, passed to all components h](jL)}(h``void *data``h]jR)}(hj%h]h void *data}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj%ubah}(h]h ]h"]h$]h&]uh1jKh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhj%ubjh)}(hhh]h)}(h(opaque pointer, passed to all componentsh]h(opaque pointer, passed to all components}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj &hMhj &ubah}(h]h ]h"]h$]h&]uh1jghj%ubeh}(h]h ]h"]h$]h&]uh1jEhj &hMhj%ubeh}(h]h ]h"]h$]h&]uh1j@hj%ubh)}(h**Description**h]j)}(hj2&h]h Description}(hj4&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj0&ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhj%ubh)}(hBinds all components of the aggregate **dev** by passing **data** to their :c:type:`component_ops.bind ` functions. Should be called from :c:type:`component_master_ops.bind `.h](h&Binds all components of the aggregate }(hjH&hhhNhNubj)}(h**dev**h]hdev}(hjP&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjH&ubh by passing }(hjH&hhhNhNubj)}(h**data**h]hdata}(hjb&hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjH&ubh to their }(hjH&hhhNhNubh)}(h,:c:type:`component_ops.bind `h]jR)}(hjv&h]hcomponent_ops.bind}(hjx&hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jQhjt&ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjhjlj component_opsuh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhjH&ubh" functions. Should be called from }(hjH&hhhNhNubh)}(h::c:type:`component_master_ops.bind `h]jR)}(hj&h]hcomponent_master_ops.bind}(hj&hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jQhj&ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjhjljcomponent_master_opsuh1hhj&hMhjH&ubh.}(hjH&hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj&hMhj%ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj@hhhNhNubjR)}(hhh]h}(h]h ]h"]h$]h&]entries](j^ component_add_typed (C function)c.component_add_typedhNtauh1jQhj@hhhNhNubjc)}(hhh](jh)}(h_int component_add_typed (struct device *dev, const struct component_ops *ops, int subcomponent)h]jn)}(h^int component_add_typed(struct device *dev, const struct component_ops *ops, int subcomponent)h](j")}(hinth]hint}(hj&hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj&hhh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMubj)}(h h]h }(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&hhhj&hMubj)}(hcomponent_add_typedh]j)}(hcomponent_add_typedh]hcomponent_add_typed}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj&hhhj&hMubjZ)}(hG(struct device *dev, const struct component_ops *ops, int subcomponent)h](j`)}(hstruct device *devh](jt)}(hjwh]hstruct}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jshj'ubj)}(h h]h }(hj+'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubh)}(hhh]j)}(hdeviceh]hdevice}(hj<'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj9'ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj>'modnameN classnameNjhjk)}jn]j)}jj'sbc.component_add_typedasbuh1hhj'ubj)}(h h]h }(hj\'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubj)}(hjh]h*}(hjj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubj)}(hdevh]hdev}(hjw'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]noemphjjuh1j_hj'ubj`)}(hconst struct component_ops *opsh](jt)}(hjh]hconst}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jshj'ubj)}(h h]h }(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubjt)}(hjwh]hstruct}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jshj'ubj)}(h h]h }(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubh)}(hhh]j)}(h component_opsh]h component_ops}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj'modnameN classnameNjhjk)}jn]jX'c.component_add_typedasbuh1hhj'ubj)}(h h]h }(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubj)}(hjh]h*}(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubj)}(hopsh]hops}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]noemphjjuh1j_hj'ubj`)}(hint subcomponenth](j")}(hinth]hint}(hj(hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj(ubj)}(h h]h }(hj)(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj)}(h subcomponenth]h subcomponent}(hj7(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]noemphjjuh1j_hj'ubeh}(h]h ]h"]h$]h&]jjuh1jYhj&hhhj&hMubeh}(h]h ]h"]h$]h&]jjjuh1jmjjhj&hhhj&hMubah}(h]j&ah ](jjeh"]h$]h&]jj)jhuh1jghj&hMhj&hhubj)}(hhh]h)}(hregister a componenth]hregister a component}(hja(hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhj^(hhubah}(h]h ]h"]h$]h&]uh1jhj&hhhj&hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjjy(jjy(jjjuh1jbhhhj@hNhNubj)}(hX**Parameters** ``struct device *dev`` component device ``const struct component_ops *ops`` component callbacks ``int subcomponent`` nonzero identifier for subcomponents **Description** Register a new component for **dev**. Functions in **ops** will be call when the aggregate driver is ready to bind the overall driver by calling component_bind_all(). See also :c:type:`struct component_ops `. **subcomponent** must be nonzero and is used to differentiate between multiple components registered on the same device **dev**. These components are match using component_match_add_typed(). The component needs to be unregistered at driver unload/disconnect by calling component_del(). See also component_add().h](h)}(h**Parameters**h]j)}(hj(h]h Parameters}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhj}(ubjA)}(hhh](jF)}(h(``struct device *dev`` component device h](jL)}(h``struct device *dev``h]jR)}(hj(h]hstruct device *dev}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj(ubah}(h]h ]h"]h$]h&]uh1jKh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhj(ubjh)}(hhh]h)}(hcomponent deviceh]hcomponent device}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hMhj(ubah}(h]h ]h"]h$]h&]uh1jghj(ubeh}(h]h ]h"]h$]h&]uh1jEhj(hMhj(ubjF)}(h8``const struct component_ops *ops`` component callbacks h](jL)}(h#``const struct component_ops *ops``h]jR)}(hj(h]hconst struct component_ops *ops}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj(ubah}(h]h ]h"]h$]h&]uh1jKh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhj(ubjh)}(hhh]h)}(hcomponent callbacksh]hcomponent callbacks}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hMhj(ubah}(h]h ]h"]h$]h&]uh1jghj(ubeh}(h]h ]h"]h$]h&]uh1jEhj(hMhj(ubjF)}(h:``int subcomponent`` nonzero identifier for subcomponents h](jL)}(h``int subcomponent``h]jR)}(hj)h]hint subcomponent}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj)ubah}(h]h ]h"]h$]h&]uh1jKh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhj)ubjh)}(hhh]h)}(h$nonzero identifier for subcomponentsh]h$nonzero identifier for subcomponents}(hj-)hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj))hMhj*)ubah}(h]h ]h"]h$]h&]uh1jghj)ubeh}(h]h ]h"]h$]h&]uh1jEhj))hMhj(ubeh}(h]h ]h"]h$]h&]uh1j@hj}(ubh)}(h**Description**h]j)}(hjO)h]h Description}(hjQ)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjM)ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhj}(ubOh)}(hRegister a new component for **dev**. Functions in **ops** will be call when the aggregate driver is ready to bind the overall driver by calling component_bind_all(). See also :c:type:`struct component_ops `.h](hRegister a new component for }(hje)hhhNhNubj)}(h**dev**h]hdev}(hjm)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhje)ubh. Functions in }(hje)hhhNhNubj)}(h**ops**h]hops}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhje)ubhv will be call when the aggregate driver is ready to bind the overall driver by calling component_bind_all(). See also }(hje)hhhNhNubh)}(h.:c:type:`struct component_ops `h]jR)}(hj)h]hstruct component_ops}(hj)hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jQhj)ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjhjlj component_opsuh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhje)ubh.}(hje)hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj)hMhj}(ubh)}(h**subcomponent** must be nonzero and is used to differentiate between multiple components registered on the same device **dev**. These components are match using component_match_add_typed().h](j)}(h**subcomponent**h]h subcomponent}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubhh must be nonzero and is used to differentiate between multiple components registered on the same device }(hj)hhhNhNubj)}(h**dev**h]hdev}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubh?. These components are match using component_match_add_typed().}(hj)hhhNhNubeh}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhj}(ubh)}(h^The component needs to be unregistered at driver unload/disconnect by calling component_del().h]h^The component needs to be unregistered at driver unload/disconnect by calling component_del().}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhj}(ubh)}(hSee also component_add().h]hSee also component_add().}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM hj}(ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj@hhhNhNubjR)}(hhh]h}(h]h ]h"]h$]h&]entries](j^component_add (C function)c.component_addhNtauh1jQhj@hhhNhNubjc)}(hhh](jh)}(hGint component_add (struct device *dev, const struct component_ops *ops)h]jn)}(hFint component_add(struct device *dev, const struct component_ops *ops)h](j")}(hinth]hint}(hj(*hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj$*hhh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMubj)}(h h]h }(hj7*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$*hhhj6*hMubj)}(h component_addh]j)}(h component_addh]h component_add}(hjI*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjE*ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj$*hhhj6*hMubjZ)}(h5(struct device *dev, const struct component_ops *ops)h](j`)}(hstruct device *devh](jt)}(hjwh]hstruct}(hje*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jshja*ubj)}(h h]h }(hjr*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhja*ubh)}(hhh]j)}(hdeviceh]hdevice}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj*modnameN classnameNjhjk)}jn]j)}jjK*sbc.component_addasbuh1hhja*ubj)}(h h]h }(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhja*ubj)}(hjh]h*}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhja*ubj)}(hdevh]hdev}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhja*ubeh}(h]h ]h"]h$]h&]noemphjjuh1j_hj]*ubj`)}(hconst struct component_ops *opsh](jt)}(hjh]hconst}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jshj*ubj)}(h h]h }(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubjt)}(hjwh]hstruct}(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jshj*ubj)}(h h]h }(hj*hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubh)}(hhh]j)}(h component_opsh]h component_ops}(hj+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj +ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj+modnameN classnameNjhjk)}jn]j*c.component_addasbuh1hhj*ubj)}(h h]h }(hj.+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubj)}(hjh]h*}(hj<+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubj)}(hopsh]hops}(hjI+hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]noemphjjuh1j_hj]*ubeh}(h]h ]h"]h$]h&]jjuh1jYhj$*hhhj6*hMubeh}(h]h ]h"]h$]h&]jjjuh1jmjjhj *hhhj6*hMubah}(h]j*ah ](jjeh"]h$]h&]jj)jhuh1jghj6*hMhj*hhubj)}(hhh]h)}(hregister a componenth]hregister a component}(hjs+hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhjp+hhubah}(h]h ]h"]h$]h&]uh1jhj*hhhj6*hMubeh}(h]h ](jfunctioneh"]h$]h&]jjjj+jj+jjjuh1jbhhhj@hNhNubj)}(hX4**Parameters** ``struct device *dev`` component device ``const struct component_ops *ops`` component callbacks **Description** Register a new component for **dev**. Functions in **ops** will be called when the aggregate driver is ready to bind the overall driver by calling component_bind_all(). See also :c:type:`struct component_ops `. The component needs to be unregistered at driver unload/disconnect by calling component_del(). See also component_add_typed() for a variant that allows multiple different components on the same device.h](h)}(h**Parameters**h]j)}(hj+h]h Parameters}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhj+ubjA)}(hhh](jF)}(h(``struct device *dev`` component device h](jL)}(h``struct device *dev``h]jR)}(hj+h]hstruct device *dev}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj+ubah}(h]h ]h"]h$]h&]uh1jKh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhj+ubjh)}(hhh]h)}(hcomponent deviceh]hcomponent device}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj+hMhj+ubah}(h]h ]h"]h$]h&]uh1jghj+ubeh}(h]h ]h"]h$]h&]uh1jEhj+hMhj+ubjF)}(h8``const struct component_ops *ops`` component callbacks h](jL)}(h#``const struct component_ops *ops``h]jR)}(hj+h]hconst struct component_ops *ops}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj+ubah}(h]h ]h"]h$]h&]uh1jKh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhj+ubjh)}(hhh]h)}(hcomponent callbacksh]hcomponent callbacks}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hMhj,ubah}(h]h ]h"]h$]h&]uh1jghj+ubeh}(h]h ]h"]h$]h&]uh1jEhj,hMhj+ubeh}(h]h ]h"]h$]h&]uh1j@hj+ubh)}(h**Description**h]j)}(hj(,h]h Description}(hj*,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj&,ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhj+ubh)}(hRegister a new component for **dev**. Functions in **ops** will be called when the aggregate driver is ready to bind the overall driver by calling component_bind_all(). See also :c:type:`struct component_ops `.h](hRegister a new component for }(hj>,hhhNhNubj)}(h**dev**h]hdev}(hjF,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>,ubh. Functions in }(hj>,hhhNhNubj)}(h**ops**h]hops}(hjX,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj>,ubhx will be called when the aggregate driver is ready to bind the overall driver by calling component_bind_all(). See also }(hj>,hhhNhNubh)}(h.:c:type:`struct component_ops `h]jR)}(hjl,h]hstruct component_ops}(hjn,hhhNhNubah}(h]h ](jjc-typeeh"]h$]h&]uh1jQhjj,ubah}(h]h ]h"]h$]h&]refdocj refdomainjreftypetype refexplicitrefwarnjhjlj component_opsuh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhj>,ubh.}(hj>,hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhj,hMhj+ubh)}(h^The component needs to be unregistered at driver unload/disconnect by calling component_del().h]h^The component needs to be unregistered at driver unload/disconnect by calling component_del().}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chMhj+ubh)}(hjSee also component_add_typed() for a variant that allows multiple different components on the same device.h]hjSee also component_add_typed() for a variant that allows multiple different components on the same device.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM!hj+ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj@hhhNhNubjR)}(hhh]h}(h]h ]h"]h$]h&]entries](j^component_del (C function)c.component_delhNtauh1jQhj@hhhNhNubjc)}(hhh](jh)}(hHvoid component_del (struct device *dev, const struct component_ops *ops)h]jn)}(hGvoid component_del(struct device *dev, const struct component_ops *ops)h](j")}(hvoidh]hvoid}(hj,hhhNhNubah}(h]h ]j.ah"]h$]h&]uh1j!hj,hhh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM,ubj)}(h h]h }(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,hhhj,hM,ubj)}(h component_delh]j)}(h component_delh]h component_del}(hj,hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj,ubah}(h]h ](jjeh"]h$]h&]jjuh1jhj,hhhj,hM,ubjZ)}(h5(struct device *dev, const struct component_ops *ops)h](j`)}(hstruct device *devh](jt)}(hjwh]hstruct}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jshj -ubj)}(h h]h }(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj -ubh)}(hhh]j)}(hdeviceh]hdevice}(hj--hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj*-ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj/-modnameN classnameNjhjk)}jn]j)}jj,sbc.component_delasbuh1hhj -ubj)}(h h]h }(hjM-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj -ubj)}(hjh]h*}(hj[-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj -ubj)}(hdevh]hdev}(hjh-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj -ubeh}(h]h ]h"]h$]h&]noemphjjuh1j_hj-ubj`)}(hconst struct component_ops *opsh](jt)}(hjh]hconst}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jshj}-ubj)}(h h]h }(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}-ubjt)}(hjwh]hstruct}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jshj}-ubj)}(h h]h }(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}-ubh)}(hhh]j)}(h component_opsh]h component_ops}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj-modnameN classnameNjhjk)}jn]jI-c.component_delasbuh1hhj}-ubj)}(h h]h }(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}-ubj)}(hjh]h*}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}-ubj)}(hopsh]hops}(hj-hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj}-ubeh}(h]h ]h"]h$]h&]noemphjjuh1j_hj-ubeh}(h]h ]h"]h$]h&]jjuh1jYhj,hhhj,hM,ubeh}(h]h ]h"]h$]h&]jjjuh1jmjjhj,hhhj,hM,ubah}(h]j,ah ](jjeh"]h$]h&]jj)jhuh1jghj,hM,hj,hhubj)}(hhh]h)}(hunregister a componenth]hunregister a component}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM,hj.hhubah}(h]h ]h"]h$]h&]uh1jhj,hhhj,hM,ubeh}(h]h ](jfunctioneh"]h$]h&]jjjj5.jj5.jjjuh1jbhhhj@hNhNubj)}(hXG**Parameters** ``struct device *dev`` component device ``const struct component_ops *ops`` component callbacks **Description** Unregister a component added with component_add(). If the component is bound into an aggregate driver, this will force the entire aggregate driver, including all its components, to be unbound.h](h)}(h**Parameters**h]j)}(hj?.h]h Parameters}(hjA.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj=.ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM0hj9.ubjA)}(hhh](jF)}(h(``struct device *dev`` component device h](jL)}(h``struct device *dev``h]jR)}(hj^.h]hstruct device *dev}(hj`.hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj\.ubah}(h]h ]h"]h$]h&]uh1jKh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM-hjX.ubjh)}(hhh]h)}(hcomponent deviceh]hcomponent device}(hjw.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjs.hM-hjt.ubah}(h]h ]h"]h$]h&]uh1jghjX.ubeh}(h]h ]h"]h$]h&]uh1jEhjs.hM-hjU.ubjF)}(h8``const struct component_ops *ops`` component callbacks h](jL)}(h#``const struct component_ops *ops``h]jR)}(hj.h]hconst struct component_ops *ops}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj.ubah}(h]h ]h"]h$]h&]uh1jKh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM.hj.ubjh)}(hhh]h)}(hcomponent callbacksh]hcomponent callbacks}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.hM.hj.ubah}(h]h ]h"]h$]h&]uh1jghj.ubeh}(h]h ]h"]h$]h&]uh1jEhj.hM.hjU.ubeh}(h]h ]h"]h$]h&]uh1j@hj9.ubh)}(h**Description**h]j)}(hj.h]h Description}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM0hj9.ubh)}(hUnregister a component added with component_add(). If the component is bound into an aggregate driver, this will force the entire aggregate driver, including all its components, to be unbound.h]hUnregister a component added with component_add(). If the component is bound into an aggregate driver, this will force the entire aggregate driver, including all its components, to be unbound.}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hh]/var/lib/git/docbuild/linux/Documentation/driver-api/component:17: ./drivers/base/component.chM/hj9.ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhj@hhhNhNubeh}(h]apiah ]h"]apiah$]h&]uh1hhhhhhhhK ubeh}(h](&component-helper-for-aggregate-driversheh ]h"](&component helper for aggregate drivers componenteh$]h&]uh1hhhhhhhhKexpect_referenced_by_name}j /hsexpect_referenced_by_id}hhsubeh}(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_handlerj6/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}h]hasnameids}(j /hj /j/j/j/u nametypes}(j /j /j/uh}(hhj/hj/j@j`jijjjjj} j j j j j jjjjjjjXj]jjj"j"jn$js$j&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]hsystem_message)}(hhh]h)}(hhh]h/Hyperlink target "component" is not referenced.}hj/sbah}(h]h ]h"]h$]h&]uh1hhj/ubah}(h]h ]h"]h$]h&]levelKtypeINFOsourcehÌlineKuh1j/uba transformerN include_log] decorationNhhub.