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/generic-countermodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget./translations/zh_TW/driver-api/generic-countermodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget./translations/it_IT/driver-api/generic-countermodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget./translations/ja_JP/driver-api/generic-countermodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget./translations/ko_KR/driver-api/generic-countermodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget./translations/sp_SP/driver-api/generic-countermodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhH/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter.rsthKubhsection)}(hhh](htitle)}(hGeneric Counter Interfaceh]hGeneric Counter Interface}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h Introductionh]h Introduction}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh paragraph)}(hXCounter devices are prevalent among a diverse spectrum of industries. The ubiquitous presence of these devices necessitates a common interface and standard of interaction and exposure. This driver API attempts to resolve the issue of duplicate code found among existing counter device drivers by introducing a generic counter interface for consumption. The Generic Counter interface enables drivers to support and expose a common set of components and functionality present in counter devices.h]hXCounter devices are prevalent among a diverse spectrum of industries. The ubiquitous presence of these devices necessitates a common interface and standard of interaction and exposure. This driver API attempts to resolve the issue of duplicate code found among existing counter device drivers by introducing a generic counter interface for consumption. The Generic Counter interface enables drivers to support and expose a common set of components and functionality present in counter devices.}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhhhubeh}(h] introductionah ]h"] introductionah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hTheoryh]hTheory}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh)}(hX6Counter devices can vary greatly in design, but regardless of whether some devices are quadrature encoder counters or tally counters, all counter devices consist of a core set of components. This core set of components, shared by all counter devices, is what forms the essence of the Generic Counter interface.h]hX6Counter devices can vary greatly in design, but regardless of whether some devices are quadrature encoder counters or tally counters, all counter devices consist of a core set of components. This core set of components, shared by all counter devices, is what forms the essence of the Generic Counter interface.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(h-There are three core components to a counter:h]h-There are three core components to a counter:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh bullet_list)}(hhh](h list_item)}(h7Signal: Stream of data to be evaluated by the counter. h]h)}(h6Signal: Stream of data to be evaluated by the counter.h]h6Signal: Stream of data to be evaluated by the counter.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj&ubah}(h]h ]h"]h$]h&]uh1j$hj!hhhhhNubj%)}(hHSynapse: Association of a Signal, and evaluation trigger, with a Count. h]h)}(hGSynapse: Association of a Signal, and evaluation trigger, with a Count.h]hGSynapse: Association of a Signal, and evaluation trigger, with a Count.}(hjBhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hj>ubah}(h]h ]h"]h$]h&]uh1j$hj!hhhhhNubj%)}(h:Count: Accumulation of the effects of connected Synapses. h]h)}(h9Count: Accumulation of the effects of connected Synapses.h]h9Count: Accumulation of the effects of connected Synapses.}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK#hjVubah}(h]h ]h"]h$]h&]uh1j$hj!hhhhhNubeh}(h]h ]h"]h$]h&]bullet*uh1jhhhKhhhhubh)}(hhh](h)}(hSIGNALh]hSIGNAL}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjvhhhhhK'ubh)}(hXA Signal represents a stream of data. This is the input data that is evaluated by the counter to determine the count data; e.g. a quadrature signal output line of a rotary encoder. Not all counter devices provide user access to the Signal data, so exposure is optional for drivers.h]hXA Signal represents a stream of data. This is the input data that is evaluated by the counter to determine the count data; e.g. a quadrature signal output line of a rotary encoder. Not all counter devices provide user access to the Signal data, so exposure is optional for drivers.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK(hjvhhubh)}(hWhen the Signal data is available for user access, the Generic Counter interface provides the following available signal values:h]hWhen the Signal data is available for user access, the Generic Counter interface provides the following available signal values:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK-hjvhhubj )}(hhh](j%)}(h+SIGNAL_LOW: Signal line is in a low state. h]h)}(h*SIGNAL_LOW: Signal line is in a low state.h]h*SIGNAL_LOW: Signal line is in a low state.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK0hjubah}(h]h ]h"]h$]h&]uh1j$hjhhhhhNubj%)}(h-SIGNAL_HIGH: Signal line is in a high state. h]h)}(h,SIGNAL_HIGH: Signal line is in a high state.h]h,SIGNAL_HIGH: Signal line is in a high state.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK3hjubah}(h]h ]h"]h$]h&]uh1j$hjhhhhhNubeh}(h]h ]h"]h$]h&]jtjuuh1jhhhK0hjvhhubh)}(h3A Signal may be associated with one or more Counts.h]h3A Signal may be associated with one or more Counts.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK6hjvhhubeh}(h]signalah ]h"]signalah$]h&]uh1hhhhhhhhK'ubh)}(hhh](h)}(hSYNAPSEh]hSYNAPSE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK9ubh)}(hA Synapse represents the association of a Signal with a Count. Signal data affects respective Count data, and the Synapse represents this relationship.h]hA Synapse represents the association of a Signal with a Count. Signal data affects respective Count data, and the Synapse represents this relationship.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK:hjhhubh)}(hThe Synapse action mode specifies the Signal data condition that triggers the respective Count's count function evaluation to update the count data. The Generic Counter interface provides the following available action modes:h]hThe Synapse action mode specifies the Signal data condition that triggers the respective Count’s count function evaluation to update the count data. The Generic Counter interface provides the following available action modes:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK>hjhhubj )}(hhh](j%)}(hNone: Signal does not trigger the count function. In Pulse-Direction count function mode, this Signal is evaluated as Direction. h]h)}(hNone: Signal does not trigger the count function. In Pulse-Direction count function mode, this Signal is evaluated as Direction.h]hNone: Signal does not trigger the count function. In Pulse-Direction count function mode, this Signal is evaluated as Direction.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKChj"ubah}(h]h ]h"]h$]h&]uh1j$hjhhhhhNubj%)}(h2Rising Edge: Low state transitions to high state. h]h)}(h1Rising Edge: Low state transitions to high state.h]h1Rising Edge: Low state transitions to high state.}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKGhj:ubah}(h]h ]h"]h$]h&]uh1j$hjhhhhhNubj%)}(h3Falling Edge: High state transitions to low state. h]h)}(h2Falling Edge: High state transitions to low state.h]h2Falling Edge: High state transitions to low state.}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKJhjRubah}(h]h ]h"]h$]h&]uh1j$hjhhhhhNubj%)}(h"Both Edges: Any state transition. h]h)}(h!Both Edges: Any state transition.h]h!Both Edges: Any state transition.}(hjnhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKMhjjubah}(h]h ]h"]h$]h&]uh1j$hjhhhhhNubeh}(h]h ]h"]h$]h&]jtjuuh1jhhhKChjhhubh)}(hXA counter is defined as a set of input signals associated with count data that are generated by the evaluation of the state of the associated input signals as defined by the respective count functions. Within the context of the Generic Counter interface, a counter consists of Counts each associated with a set of Signals, whose respective Synapse instances represent the count function update conditions for the associated Counts.h]hXA counter is defined as a set of input signals associated with count data that are generated by the evaluation of the state of the associated input signals as defined by the respective count functions. Within the context of the Generic Counter interface, a counter consists of Counts each associated with a set of Signals, whose respective Synapse instances represent the count function update conditions for the associated Counts.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKPhjhhubh)}(h/A Synapse associates one Signal with one Count.h]h/A Synapse associates one Signal with one Count.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKXhjhhubeh}(h]synapseah ]h"]synapseah$]h&]uh1hhhhhhhhK9ubh)}(hhh](h)}(hCOUNTh]hCOUNT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK[ubh)}(hA Count represents the accumulation of the effects of connected Synapses; i.e. the count data for a set of Signals. The Generic Counter interface represents the count data as a natural number.h]hA Count represents the accumulation of the effects of connected Synapses; i.e. the count data for a set of Signals. The Generic Counter interface represents the count data as a natural number.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK\hjhhubh)}(hA Count has a count function mode which represents the update behavior for the count data. The Generic Counter interface provides the following available count function modes:h]hA Count has a count function mode which represents the update behavior for the count data. The Generic Counter interface provides the following available count function modes:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK`hjhhubj )}(hhh](j%)}(h,Increase: Accumulated count is incremented. h]h)}(h+Increase: Accumulated count is incremented.h]h+Increase: Accumulated count is incremented.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKdhjubah}(h]h ]h"]h$]h&]uh1j$hjhhhhhNubj%)}(h,Decrease: Accumulated count is decremented. h]h)}(h+Decrease: Accumulated count is decremented.h]h+Decrease: Accumulated count is decremented.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKghjubah}(h]h ]h"]h$]h&]uh1j$hjhhhhhNubj%)}(hzPulse-Direction: Rising edges on signal A updates the respective count. The input level of signal B determines direction. h]h)}(hyPulse-Direction: Rising edges on signal A updates the respective count. The input level of signal B determines direction.h]hyPulse-Direction: Rising edges on signal A updates the respective count. The input level of signal B determines direction.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKjhj ubah}(h]h ]h"]h$]h&]uh1j$hjhhhhhNubj%)}(hX?Quadrature: A pair of quadrature encoding signals are evaluated to determine position and direction. The following Quadrature modes are available: - x1 A: If direction is forward, rising edges on quadrature pair signal A updates the respective count; if the direction is backward, falling edges on quadrature pair signal A updates the respective count. Quadrature encoding determines the direction. - x1 B: If direction is forward, rising edges on quadrature pair signal B updates the respective count; if the direction is backward, falling edges on quadrature pair signal B updates the respective count. Quadrature encoding determines the direction. - x2 A: Any state transition on quadrature pair signal A updates the respective count. Quadrature encoding determines the direction. - x2 B: Any state transition on quadrature pair signal B updates the respective count. Quadrature encoding determines the direction. - x4: Any state transition on either quadrature pair signals updates the respective count. Quadrature encoding determines the direction. h](h)}(hQuadrature: A pair of quadrature encoding signals are evaluated to determine position and direction. The following Quadrature modes are available:h]hQuadrature: A pair of quadrature encoding signals are evaluated to determine position and direction. The following Quadrature modes are available:}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKnhj$ubj )}(hhh](j%)}(hx1 A: If direction is forward, rising edges on quadrature pair signal A updates the respective count; if the direction is backward, falling edges on quadrature pair signal A updates the respective count. Quadrature encoding determines the direction. h]h)}(hx1 A: If direction is forward, rising edges on quadrature pair signal A updates the respective count; if the direction is backward, falling edges on quadrature pair signal A updates the respective count. Quadrature encoding determines the direction.h]hx1 A: If direction is forward, rising edges on quadrature pair signal A updates the respective count; if the direction is backward, falling edges on quadrature pair signal A updates the respective count. Quadrature encoding determines the direction.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKrhj9ubah}(h]h ]h"]h$]h&]uh1j$hj6ubj%)}(hx1 B: If direction is forward, rising edges on quadrature pair signal B updates the respective count; if the direction is backward, falling edges on quadrature pair signal B updates the respective count. Quadrature encoding determines the direction. h]h)}(hx1 B: If direction is forward, rising edges on quadrature pair signal B updates the respective count; if the direction is backward, falling edges on quadrature pair signal B updates the respective count. Quadrature encoding determines the direction.h]hx1 B: If direction is forward, rising edges on quadrature pair signal B updates the respective count; if the direction is backward, falling edges on quadrature pair signal B updates the respective count. Quadrature encoding determines the direction.}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKxhjQubah}(h]h ]h"]h$]h&]uh1j$hj6ubj%)}(hx2 A: Any state transition on quadrature pair signal A updates the respective count. Quadrature encoding determines the direction. h]h)}(hx2 A: Any state transition on quadrature pair signal A updates the respective count. Quadrature encoding determines the direction.h]hx2 A: Any state transition on quadrature pair signal A updates the respective count. Quadrature encoding determines the direction.}(hjmhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK~hjiubah}(h]h ]h"]h$]h&]uh1j$hj6ubj%)}(hx2 B: Any state transition on quadrature pair signal B updates the respective count. Quadrature encoding determines the direction. h]h)}(hx2 B: Any state transition on quadrature pair signal B updates the respective count. Quadrature encoding determines the direction.h]hx2 B: Any state transition on quadrature pair signal B updates the respective count. Quadrature encoding determines the direction.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j$hj6ubj%)}(hx4: Any state transition on either quadrature pair signals updates the respective count. Quadrature encoding determines the direction. h]h)}(hx4: Any state transition on either quadrature pair signals updates the respective count. Quadrature encoding determines the direction.h]hx4: Any state transition on either quadrature pair signals updates the respective count. Quadrature encoding determines the direction.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1j$hj6ubeh}(h]h ]h"]h$]h&]jt-uh1jhhhKrhj$ubeh}(h]h ]h"]h$]h&]uh1j$hjhhhNhNubeh}(h]h ]h"]h$]h&]jtjuuh1jhhhKdhjhhubh)}(h5A Count has a set of one or more associated Synapses.h]h5A Count has a set of one or more associated Synapses.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]countah ]h"]countah$]h&]uh1hhhhhhhhK[ubeh}(h]theoryah ]h"]theoryah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hParadigmh]hParadigm}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hThe most basic counter device may be expressed as a single Count associated with a single Signal via a single Synapse. Take for example a counter device which simply accumulates a count of rising edges on a source input line::h]hThe most basic counter device may be expressed as a single Count associated with a single Signal via a single Synapse. Take for example a counter device which simply accumulates a count of rising edges on a source input line:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh literal_block)}(hX4 Count Synapse Signal ----- ------- ------ +---------------------+ | Data: Count | Rising Edge ________ | Function: Increase | <------------- / Source \ | | ____________ +---------------------+h]hX4 Count Synapse Signal ----- ------- ------ +---------------------+ | Data: Count | Rising Edge ________ | Function: Increase | <------------- / Source \ | | ____________ +---------------------+}hjsbah}(h]h ]h"]h$]h&]hhuh1jhhhKhjhhubh)}(hXKIn this example, the Signal is a source input line with a pulsing voltage, while the Count is a persistent count value which is repeatedly incremented. The Signal is associated with the respective Count via a Synapse. The increase function is triggered by the Signal data condition specified by the Synapse -- in this case a rising edge condition on the voltage input line. In summary, the counter device existence and behavior is aptly represented by respective Count, Signal, and Synapse components: a rising edge condition triggers an increase function on an accumulating count datum.h]hXKIn this example, the Signal is a source input line with a pulsing voltage, while the Count is a persistent count value which is repeatedly incremented. The Signal is associated with the respective Count via a Synapse. The increase function is triggered by the Signal data condition specified by the Synapse -- in this case a rising edge condition on the voltage input line. In summary, the counter device existence and behavior is aptly represented by respective Count, Signal, and Synapse components: a rising edge condition triggers an increase function on an accumulating count datum.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hA counter device is not limited to a single Signal; in fact, in theory many Signals may be associated with even a single Count. For example, a quadrature encoder counter device can keep track of position based on the states of two input lines::h]hA counter device is not limited to a single Signal; in fact, in theory many Signals may be associated with even a single Count. For example, a quadrature encoder counter device can keep track of position based on the states of two input lines:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(hX Count Synapse Signal ----- ------- ------ +-------------------------+ | Data: Position | Both Edges ___ | Function: Quadrature x4 | <------------ / A \ | | _______ | | | | Both Edges ___ | | <------------ / B \ | | _______ +-------------------------+h]hX Count Synapse Signal ----- ------- ------ +-------------------------+ | Data: Position | Both Edges ___ | Function: Quadrature x4 | <------------ / A \ | | _______ | | | | Both Edges ___ | | <------------ / B \ | | _______ +-------------------------+}hj-sbah}(h]h ]h"]h$]h&]hhuh1jhhhKhjhhubh)}(hXIn this example, two Signals (quadrature encoder lines A and B) are associated with a single Count: a rising or falling edge on either A or B triggers the "Quadrature x4" function which determines the direction of movement and updates the respective position data. The "Quadrature x4" function is likely implemented in the hardware of the quadrature encoder counter device; the Count, Signals, and Synapses simply represent this hardware behavior and functionality.h]hXIn this example, two Signals (quadrature encoder lines A and B) are associated with a single Count: a rising or falling edge on either A or B triggers the “Quadrature x4” function which determines the direction of movement and updates the respective position data. The “Quadrature x4” function is likely implemented in the hardware of the quadrature encoder counter device; the Count, Signals, and Synapses simply represent this hardware behavior and functionality.}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hX Signals associated with the same Count can have differing Synapse action mode conditions. For example, a quadrature encoder counter device operating in a non-quadrature Pulse-Direction mode could have one input line dedicated for movement and a second input line dedicated for direction::h]hXSignals associated with the same Count can have differing Synapse action mode conditions. For example, a quadrature encoder counter device operating in a non-quadrature Pulse-Direction mode could have one input line dedicated for movement and a second input line dedicated for direction:}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(hX" Count Synapse Signal ----- ------- ------ +---------------------------+ | Data: Position | Rising Edge ___ | Function: Pulse-Direction | <------------- / A \ (Movement) | | _______ | | | | None ___ | | <------------- / B \ (Direction) | | _______ +---------------------------+h]hX" Count Synapse Signal ----- ------- ------ +---------------------------+ | Data: Position | Rising Edge ___ | Function: Pulse-Direction | <------------- / A \ (Movement) | | _______ | | | | None ___ | | <------------- / B \ (Direction) | | _______ +---------------------------+}hjWsbah}(h]h ]h"]h$]h&]hhuh1jhhhKhjhhubh)}(hX+Only Signal A triggers the "Pulse-Direction" update function, but the instantaneous state of Signal B is still required in order to know the direction so that the position data may be properly updated. Ultimately, both Signals are associated with the same Count via two respective Synapses, but only one Synapse has an active action mode condition which triggers the respective count function while the other is left with a "None" condition action mode to indicate its respective Signal's availability for state evaluation despite its non-triggering mode.h]hX5Only Signal A triggers the “Pulse-Direction” update function, but the instantaneous state of Signal B is still required in order to know the direction so that the position data may be properly updated. Ultimately, both Signals are associated with the same Count via two respective Synapses, but only one Synapse has an active action mode condition which triggers the respective count function while the other is left with a “None” condition action mode to indicate its respective Signal’s availability for state evaluation despite its non-triggering mode.}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubh)}(hXKeep in mind that the Signal, Synapse, and Count are abstract representations which do not need to be closely married to their respective physical sources. This allows the user of a counter to divorce themselves from the nuances of physical components (such as whether an input line is differential or single-ended) and instead focus on the core idea of what the data and process represent (e.g. position as interpreted from quadrature encoding data).h]hXKeep in mind that the Signal, Synapse, and Count are abstract representations which do not need to be closely married to their respective physical sources. This allows the user of a counter to divorce themselves from the nuances of physical components (such as whether an input line is differential or single-ended) and instead focus on the core idea of what the data and process represent (e.g. position as interpreted from quadrature encoding data).}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h]paradigmah ]h"]paradigmah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h Driver APIh]h Driver API}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hDriver authors may utilize the Generic Counter interface in their code by including the include/linux/counter.h header file. This header file provides several core data structures, function prototypes, and macros for defining a counter device.h]hDriver authors may utilize the Generic Counter interface in their code by including the include/linux/counter.h header file. This header file provides several core data structures, function prototypes, and macros for defining a counter device.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubhindex)}(hhh]h}(h]h ]h"]h$]h&]entries](singlecounter_comp (C struct)c.counter_comphNtauh1jhjhhhNhNubhdesc)}(hhh](hdesc_signature)}(h counter_comph]hdesc_signature_line)}(hstruct counter_comph](hdesc_sig_keyword)}(hstructh]hstruct}(hjhhhNhNubah}(h]h ]kah"]h$]h&]uh1jhjhhhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKubhdesc_sig_space)}(h h]h }(hjhhhNhNubah}(h]h ]wah"]h$]h&]uh1jhjhhhjhKubh desc_name)}(h counter_comph]h desc_sig_name)}(hjh]h counter_comp}(hjhhhNhNubah}(h]h ]nah"]h$]h&]uh1jhjubah}(h]h ](sig-namedescnameeh"]h$]h&]hhuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]hh add_permalinkuh1jsphinx_line_type declaratorhjhhhjhKubah}(h]jah ](sig sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1jhjhKhjhhubh desc_content)}(hhh]h)}(hCounter component nodeh]hCounter component node}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhK(hj!hhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](cstructeh"]h$]h&]domainj<objtypej=desctypej=noindex noindexentrynocontentsentryuh1jhhhjhNhNubh container)}(hX!**Definition**:: struct counter_comp { enum counter_comp_type type; const char *name; void *priv; union { int (*action_read)(struct counter_device *counter,struct counter_count *count,struct counter_synapse *synapse, enum counter_synapse_action *action); int (*device_u8_read)(struct counter_device *counter, u8 *val); int (*count_u8_read)(struct counter_device *counter, struct counter_count *count, u8 *val); int (*signal_u8_read)(struct counter_device *counter, struct counter_signal *signal, u8 *val); int (*device_u32_read)(struct counter_device *counter, u32 *val); int (*count_u32_read)(struct counter_device *counter, struct counter_count *count, u32 *val); int (*signal_u32_read)(struct counter_device *counter, struct counter_signal *signal, u32 *val); int (*device_u64_read)(struct counter_device *counter, u64 *val); int (*count_u64_read)(struct counter_device *counter, struct counter_count *count, u64 *val); int (*signal_u64_read)(struct counter_device *counter, struct counter_signal *signal, u64 *val); int (*signal_array_u32_read)(struct counter_device *counter,struct counter_signal *signal, size_t idx, u32 *val); int (*device_array_u64_read)(struct counter_device *counter, size_t idx, u64 *val); int (*count_array_u64_read)(struct counter_device *counter,struct counter_count *count, size_t idx, u64 *val); int (*signal_array_u64_read)(struct counter_device *counter,struct counter_signal *signal, size_t idx, u64 *val); }; union { int (*action_write)(struct counter_device *counter,struct counter_count *count,struct counter_synapse *synapse, enum counter_synapse_action action); int (*device_u8_write)(struct counter_device *counter, u8 val); int (*count_u8_write)(struct counter_device *counter, struct counter_count *count, u8 val); int (*signal_u8_write)(struct counter_device *counter, struct counter_signal *signal, u8 val); int (*device_u32_write)(struct counter_device *counter, u32 val); int (*count_u32_write)(struct counter_device *counter, struct counter_count *count, u32 val); int (*signal_u32_write)(struct counter_device *counter, struct counter_signal *signal, u32 val); int (*device_u64_write)(struct counter_device *counter, u64 val); int (*count_u64_write)(struct counter_device *counter, struct counter_count *count, u64 val); int (*signal_u64_write)(struct counter_device *counter, struct counter_signal *signal, u64 val); int (*signal_array_u32_write)(struct counter_device *counter,struct counter_signal *signal, size_t idx, u32 val); int (*device_array_u64_write)(struct counter_device *counter, size_t idx, u64 val); int (*count_array_u64_write)(struct counter_device *counter,struct counter_count *count, size_t idx, u64 val); int (*signal_array_u64_write)(struct counter_device *counter,struct counter_signal *signal, size_t idx, u64 val); }; }; **Members** ``type`` Counter component data type ``name`` device-specific component name ``priv`` component-relevant data ``{unnamed_union}`` anonymous ``action_read`` Synapse action mode read callback. The read value of the respective Synapse action mode should be passed back via the action parameter. ``device_u8_read`` Device u8 component read callback. The read value of the respective Device u8 component should be passed back via the val parameter. ``count_u8_read`` Count u8 component read callback. The read value of the respective Count u8 component should be passed back via the val parameter. ``signal_u8_read`` Signal u8 component read callback. The read value of the respective Signal u8 component should be passed back via the val parameter. ``device_u32_read`` Device u32 component read callback. The read value of the respective Device u32 component should be passed back via the val parameter. ``count_u32_read`` Count u32 component read callback. The read value of the respective Count u32 component should be passed back via the val parameter. ``signal_u32_read`` Signal u32 component read callback. The read value of the respective Signal u32 component should be passed back via the val parameter. ``device_u64_read`` Device u64 component read callback. The read value of the respective Device u64 component should be passed back via the val parameter. ``count_u64_read`` Count u64 component read callback. The read value of the respective Count u64 component should be passed back via the val parameter. ``signal_u64_read`` Signal u64 component read callback. The read value of the respective Signal u64 component should be passed back via the val parameter. ``signal_array_u32_read`` Signal u32 array component read callback. The index of the respective Count u32 array component element is passed via the idx parameter. The read value of the respective Count u32 array component element should be passed back via the val parameter. ``device_array_u64_read`` Device u64 array component read callback. The index of the respective Device u64 array component element is passed via the idx parameter. The read value of the respective Device u64 array component element should be passed back via the val parameter. ``count_array_u64_read`` Count u64 array component read callback. The index of the respective Count u64 array component element is passed via the idx parameter. The read value of the respective Count u64 array component element should be passed back via the val parameter. ``signal_array_u64_read`` Signal u64 array component read callback. The index of the respective Count u64 array component element is passed via the idx parameter. The read value of the respective Count u64 array component element should be passed back via the val parameter. ``{unnamed_union}`` anonymous ``action_write`` Synapse action mode write callback. The write value of the respective Synapse action mode is passed via the action parameter. ``device_u8_write`` Device u8 component write callback. The write value of the respective Device u8 component is passed via the val parameter. ``count_u8_write`` Count u8 component write callback. The write value of the respective Count u8 component is passed via the val parameter. ``signal_u8_write`` Signal u8 component write callback. The write value of the respective Signal u8 component is passed via the val parameter. ``device_u32_write`` Device u32 component write callback. The write value of the respective Device u32 component is passed via the val parameter. ``count_u32_write`` Count u32 component write callback. The write value of the respective Count u32 component is passed via the val parameter. ``signal_u32_write`` Signal u32 component write callback. The write value of the respective Signal u32 component is passed via the val parameter. ``device_u64_write`` Device u64 component write callback. The write value of the respective Device u64 component is passed via the val parameter. ``count_u64_write`` Count u64 component write callback. The write value of the respective Count u64 component is passed via the val parameter. ``signal_u64_write`` Signal u64 component write callback. The write value of the respective Signal u64 component is passed via the val parameter. ``signal_array_u32_write`` Signal u32 array component write callback. The index of the respective Signal u32 array component element is passed via the idx parameter. The write value of the respective Signal u32 array component element is passed via the val parameter. ``device_array_u64_write`` Device u64 array component write callback. The index of the respective Device u64 array component element is passed via the idx parameter. The write value of the respective Device u64 array component element is passed via the val parameter. ``count_array_u64_write`` Count u64 array component write callback. The index of the respective Count u64 array component element is passed via the idx parameter. The write value of the respective Count u64 array component element is passed via the val parameter. ``signal_array_u64_write`` Signal u64 array component write callback. The index of the respective Signal u64 array component element is passed via the idx parameter. The write value of the respective Signal u64 array component element is passed via the val parameter.h](h)}(h**Definition**::h](hstrong)}(h**Definition**h]h Definition}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjMubh:}(hjMhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhK,hjIubj)}(hX struct counter_comp { enum counter_comp_type type; const char *name; void *priv; union { int (*action_read)(struct counter_device *counter,struct counter_count *count,struct counter_synapse *synapse, enum counter_synapse_action *action); int (*device_u8_read)(struct counter_device *counter, u8 *val); int (*count_u8_read)(struct counter_device *counter, struct counter_count *count, u8 *val); int (*signal_u8_read)(struct counter_device *counter, struct counter_signal *signal, u8 *val); int (*device_u32_read)(struct counter_device *counter, u32 *val); int (*count_u32_read)(struct counter_device *counter, struct counter_count *count, u32 *val); int (*signal_u32_read)(struct counter_device *counter, struct counter_signal *signal, u32 *val); int (*device_u64_read)(struct counter_device *counter, u64 *val); int (*count_u64_read)(struct counter_device *counter, struct counter_count *count, u64 *val); int (*signal_u64_read)(struct counter_device *counter, struct counter_signal *signal, u64 *val); int (*signal_array_u32_read)(struct counter_device *counter,struct counter_signal *signal, size_t idx, u32 *val); int (*device_array_u64_read)(struct counter_device *counter, size_t idx, u64 *val); int (*count_array_u64_read)(struct counter_device *counter,struct counter_count *count, size_t idx, u64 *val); int (*signal_array_u64_read)(struct counter_device *counter,struct counter_signal *signal, size_t idx, u64 *val); }; union { int (*action_write)(struct counter_device *counter,struct counter_count *count,struct counter_synapse *synapse, enum counter_synapse_action action); int (*device_u8_write)(struct counter_device *counter, u8 val); int (*count_u8_write)(struct counter_device *counter, struct counter_count *count, u8 val); int (*signal_u8_write)(struct counter_device *counter, struct counter_signal *signal, u8 val); int (*device_u32_write)(struct counter_device *counter, u32 val); int (*count_u32_write)(struct counter_device *counter, struct counter_count *count, u32 val); int (*signal_u32_write)(struct counter_device *counter, struct counter_signal *signal, u32 val); int (*device_u64_write)(struct counter_device *counter, u64 val); int (*count_u64_write)(struct counter_device *counter, struct counter_count *count, u64 val); int (*signal_u64_write)(struct counter_device *counter, struct counter_signal *signal, u64 val); int (*signal_array_u32_write)(struct counter_device *counter,struct counter_signal *signal, size_t idx, u32 val); int (*device_array_u64_write)(struct counter_device *counter, size_t idx, u64 val); int (*count_array_u64_write)(struct counter_device *counter,struct counter_count *count, size_t idx, u64 val); int (*signal_array_u64_write)(struct counter_device *counter,struct counter_signal *signal, size_t idx, u64 val); }; };h]hX struct counter_comp { enum counter_comp_type type; const char *name; void *priv; union { int (*action_read)(struct counter_device *counter,struct counter_count *count,struct counter_synapse *synapse, enum counter_synapse_action *action); int (*device_u8_read)(struct counter_device *counter, u8 *val); int (*count_u8_read)(struct counter_device *counter, struct counter_count *count, u8 *val); int (*signal_u8_read)(struct counter_device *counter, struct counter_signal *signal, u8 *val); int (*device_u32_read)(struct counter_device *counter, u32 *val); int (*count_u32_read)(struct counter_device *counter, struct counter_count *count, u32 *val); int (*signal_u32_read)(struct counter_device *counter, struct counter_signal *signal, u32 *val); int (*device_u64_read)(struct counter_device *counter, u64 *val); int (*count_u64_read)(struct counter_device *counter, struct counter_count *count, u64 *val); int (*signal_u64_read)(struct counter_device *counter, struct counter_signal *signal, u64 *val); int (*signal_array_u32_read)(struct counter_device *counter,struct counter_signal *signal, size_t idx, u32 *val); int (*device_array_u64_read)(struct counter_device *counter, size_t idx, u64 *val); int (*count_array_u64_read)(struct counter_device *counter,struct counter_count *count, size_t idx, u64 *val); int (*signal_array_u64_read)(struct counter_device *counter,struct counter_signal *signal, size_t idx, u64 *val); }; union { int (*action_write)(struct counter_device *counter,struct counter_count *count,struct counter_synapse *synapse, enum counter_synapse_action action); int (*device_u8_write)(struct counter_device *counter, u8 val); int (*count_u8_write)(struct counter_device *counter, struct counter_count *count, u8 val); int (*signal_u8_write)(struct counter_device *counter, struct counter_signal *signal, u8 val); int (*device_u32_write)(struct counter_device *counter, u32 val); int (*count_u32_write)(struct counter_device *counter, struct counter_count *count, u32 val); int (*signal_u32_write)(struct counter_device *counter, struct counter_signal *signal, u32 val); int (*device_u64_write)(struct counter_device *counter, u64 val); int (*count_u64_write)(struct counter_device *counter, struct counter_count *count, u64 val); int (*signal_u64_write)(struct counter_device *counter, struct counter_signal *signal, u64 val); int (*signal_array_u32_write)(struct counter_device *counter,struct counter_signal *signal, size_t idx, u32 val); int (*device_array_u64_write)(struct counter_device *counter, size_t idx, u64 val); int (*count_array_u64_write)(struct counter_device *counter,struct counter_count *count, size_t idx, u64 val); int (*signal_array_u64_write)(struct counter_device *counter,struct counter_signal *signal, size_t idx, u64 val); }; };}hjlsbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhK.hjIubh)}(h **Members**h]jR)}(hj}h]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj{ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKThjIubhdefinition_list)}(hhh](hdefinition_list_item)}(h%``type`` Counter component data type h](hterm)}(h``type``h]hliteral)}(hjh]htype}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhK*hjubh definition)}(hhh]h)}(hCounter component data typeh]hCounter component data type}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK*hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhK*hjubj)}(h(``name`` device-specific component name h](j)}(h``name``h]j)}(hjh]hname}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhK+hjubj)}(hhh]h)}(hdevice-specific component nameh]hdevice-specific component name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK+hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhK+hjubj)}(h!``priv`` component-relevant data h](j)}(h``priv``h]j)}(hjh]hpriv}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhK,hjubj)}(hhh]h)}(hcomponent-relevant datah]hcomponent-relevant data}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hK,hj.ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj-hK,hjubj)}(h``{unnamed_union}`` anonymous h](j)}(h``{unnamed_union}``h]j)}(hjQh]h{unnamed_union}}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1jhjOubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhK/hjKubj)}(hhh]h)}(h anonymoush]h anonymous}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjfhK/hjgubah}(h]h ]h"]h$]h&]uh1jhjKubeh}(h]h ]h"]h$]h&]uh1jhjfhK/hjubj)}(h``action_read`` Synapse action mode read callback. The read value of the respective Synapse action mode should be passed back via the action parameter. h](j)}(h``action_read``h]j)}(hjh]h action_read}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhK/hjubj)}(hhh]h)}(hSynapse action mode read callback. The read value of the respective Synapse action mode should be passed back via the action parameter.h]hSynapse action mode read callback. The read value of the respective Synapse action mode should be passed back via the action parameter.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhK-hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhK/hjubj)}(h``device_u8_read`` Device u8 component read callback. The read value of the respective Device u8 component should be passed back via the val parameter. h](j)}(h``device_u8_read``h]j)}(hjh]hdevice_u8_read}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhK2hjubj)}(hhh]h)}(hDevice u8 component read callback. The read value of the respective Device u8 component should be passed back via the val parameter.h]hDevice u8 component read callback. The read value of the respective Device u8 component should be passed back via the val parameter.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhK0hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhK2hjubj)}(h``count_u8_read`` Count u8 component read callback. The read value of the respective Count u8 component should be passed back via the val parameter. h](j)}(h``count_u8_read``h]j)}(hjh]h count_u8_read}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhK5hjubj)}(hhh]h)}(hCount u8 component read callback. The read value of the respective Count u8 component should be passed back via the val parameter.h]hCount u8 component read callback. The read value of the respective Count u8 component should be passed back via the val parameter.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhK3hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhK5hjubj)}(h``signal_u8_read`` Signal u8 component read callback. The read value of the respective Signal u8 component should be passed back via the val parameter. h](j)}(h``signal_u8_read``h]j)}(hj8h]hsignal_u8_read}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhK8hj2ubj)}(hhh]h)}(hSignal u8 component read callback. The read value of the respective Signal u8 component should be passed back via the val parameter.h]hSignal u8 component read callback. The read value of the respective Signal u8 component should be passed back via the val parameter.}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhK6hjNubah}(h]h ]h"]h$]h&]uh1jhj2ubeh}(h]h ]h"]h$]h&]uh1jhjMhK8hjubj)}(h``device_u32_read`` Device u32 component read callback. The read value of the respective Device u32 component should be passed back via the val parameter. h](j)}(h``device_u32_read``h]j)}(hjrh]hdevice_u32_read}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1jhjpubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhK;hjlubj)}(hhh]h)}(hDevice u32 component read callback. The read value of the respective Device u32 component should be passed back via the val parameter.h]hDevice u32 component read callback. The read value of the respective Device u32 component should be passed back via the val parameter.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhK9hjubah}(h]h ]h"]h$]h&]uh1jhjlubeh}(h]h ]h"]h$]h&]uh1jhjhK;hjubj)}(h``count_u32_read`` Count u32 component read callback. The read value of the respective Count u32 component should be passed back via the val parameter. h](j)}(h``count_u32_read``h]j)}(hjh]hcount_u32_read}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhK>hjubj)}(hhh]h)}(hCount u32 component read callback. The read value of the respective Count u32 component should be passed back via the val parameter.h]hCount u32 component read callback. The read value of the respective Count u32 component should be passed back via the val parameter.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKhjubj)}(h``signal_u32_read`` Signal u32 component read callback. The read value of the respective Signal u32 component should be passed back via the val parameter. h](j)}(h``signal_u32_read``h]j)}(hjh]hsignal_u32_read}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKAhjubj)}(hhh]h)}(hSignal u32 component read callback. The read value of the respective Signal u32 component should be passed back via the val parameter.h]hSignal u32 component read callback. The read value of the respective Signal u32 component should be passed back via the val parameter.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhK?hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKAhjubj)}(h``device_u64_read`` Device u64 component read callback. The read value of the respective Device u64 component should be passed back via the val parameter. h](j)}(h``device_u64_read``h]j)}(hj h]hdevice_u64_read}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKDhjubj)}(hhh]h)}(hDevice u64 component read callback. The read value of the respective Device u64 component should be passed back via the val parameter.h]hDevice u64 component read callback. The read value of the respective Device u64 component should be passed back via the val parameter.}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKBhj6ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj5hKDhjubj)}(h``count_u64_read`` Count u64 component read callback. The read value of the respective Count u64 component should be passed back via the val parameter. h](j)}(h``count_u64_read``h]j)}(hjZh]hcount_u64_read}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKGhjTubj)}(hhh]h)}(hCount u64 component read callback. The read value of the respective Count u64 component should be passed back via the val parameter.h]hCount u64 component read callback. The read value of the respective Count u64 component should be passed back via the val parameter.}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKEhjpubah}(h]h ]h"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]uh1jhjohKGhjubj)}(h``signal_u64_read`` Signal u64 component read callback. The read value of the respective Signal u64 component should be passed back via the val parameter. h](j)}(h``signal_u64_read``h]j)}(hjh]hsignal_u64_read}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKJhjubj)}(hhh]h)}(hSignal u64 component read callback. The read value of the respective Signal u64 component should be passed back via the val parameter.h]hSignal u64 component read callback. The read value of the respective Signal u64 component should be passed back via the val parameter.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKHhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKJhjubj)}(hX``signal_array_u32_read`` Signal u32 array component read callback. The index of the respective Count u32 array component element is passed via the idx parameter. The read value of the respective Count u32 array component element should be passed back via the val parameter. h](j)}(h``signal_array_u32_read``h]j)}(hjh]hsignal_array_u32_read}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKPhjubj)}(hhh]h)}(hSignal u32 array component read callback. The index of the respective Count u32 array component element is passed via the idx parameter. The read value of the respective Count u32 array component element should be passed back via the val parameter.h]hSignal u32 array component read callback. The index of the respective Count u32 array component element is passed via the idx parameter. The read value of the respective Count u32 array component element should be passed back via the val parameter.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKPhjubj)}(hX``device_array_u64_read`` Device u64 array component read callback. The index of the respective Device u64 array component element is passed via the idx parameter. The read value of the respective Device u64 array component element should be passed back via the val parameter. h](j)}(h``device_array_u64_read``h]j)}(hj h]hdevice_array_u64_read}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKVhj ubj)}(hhh]h)}(hDevice u64 array component read callback. The index of the respective Device u64 array component element is passed via the idx parameter. The read value of the respective Device u64 array component element should be passed back via the val parameter.h]hDevice u64 array component read callback. The index of the respective Device u64 array component element is passed via the idx parameter. The read value of the respective Device u64 array component element should be passed back via the val parameter.}(hj! hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKQhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hKVhjubj)}(hX``count_array_u64_read`` Count u64 array component read callback. The index of the respective Count u64 array component element is passed via the idx parameter. The read value of the respective Count u64 array component element should be passed back via the val parameter. h](j)}(h``count_array_u64_read``h]j)}(hjB h]hcount_array_u64_read}(hjD hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj@ ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhK\hj< ubj)}(hhh]h)}(hCount u64 array component read callback. The index of the respective Count u64 array component element is passed via the idx parameter. The read value of the respective Count u64 array component element should be passed back via the val parameter.h]hCount u64 array component read callback. The index of the respective Count u64 array component element is passed via the idx parameter. The read value of the respective Count u64 array component element should be passed back via the val parameter.}(hj[ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKWhjX ubah}(h]h ]h"]h$]h&]uh1jhj< ubeh}(h]h ]h"]h$]h&]uh1jhjW hK\hjubj)}(hX``signal_array_u64_read`` Signal u64 array component read callback. The index of the respective Count u64 array component element is passed via the idx parameter. The read value of the respective Count u64 array component element should be passed back via the val parameter. h](j)}(h``signal_array_u64_read``h]j)}(hj| h]hsignal_array_u64_read}(hj~ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjz ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKbhjv ubj)}(hhh]h)}(hSignal u64 array component read callback. The index of the respective Count u64 array component element is passed via the idx parameter. The read value of the respective Count u64 array component element should be passed back via the val parameter.h]hSignal u64 array component read callback. The index of the respective Count u64 array component element is passed via the idx parameter. The read value of the respective Count u64 array component element should be passed back via the val parameter.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhK]hj ubah}(h]h ]h"]h$]h&]uh1jhjv ubeh}(h]h ]h"]h$]h&]uh1jhj hKbhjubj)}(h``{unnamed_union}`` anonymous h](j)}(h``{unnamed_union}``h]j)}(hj h]h{unnamed_union}}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKehj ubj)}(hhh]h)}(h anonymoush]h anonymous}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKehj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hKehjubj)}(h``action_write`` Synapse action mode write callback. The write value of the respective Synapse action mode is passed via the action parameter. h](j)}(h``action_write``h]j)}(hj h]h action_write}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKehj ubj)}(hhh]h)}(h}Synapse action mode write callback. The write value of the respective Synapse action mode is passed via the action parameter.h]h}Synapse action mode write callback. The write value of the respective Synapse action mode is passed via the action parameter.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKchj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hKehjubj)}(h``device_u8_write`` Device u8 component write callback. The write value of the respective Device u8 component is passed via the val parameter. h](j)}(h``device_u8_write``h]j)}(hj) h]hdevice_u8_write}(hj+ hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj' ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKhhj# ubj)}(hhh]h)}(hzDevice u8 component write callback. The write value of the respective Device u8 component is passed via the val parameter.h]hzDevice u8 component write callback. The write value of the respective Device u8 component is passed via the val parameter.}(hjB hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKfhj? ubah}(h]h ]h"]h$]h&]uh1jhj# ubeh}(h]h ]h"]h$]h&]uh1jhj> hKhhjubj)}(h``count_u8_write`` Count u8 component write callback. The write value of the respective Count u8 component is passed via the val parameter. h](j)}(h``count_u8_write``h]j)}(hjc h]hcount_u8_write}(hje hhhNhNubah}(h]h ]h"]h$]h&]uh1jhja ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKkhj] ubj)}(hhh]h)}(hxCount u8 component write callback. The write value of the respective Count u8 component is passed via the val parameter.h]hxCount u8 component write callback. The write value of the respective Count u8 component is passed via the val parameter.}(hj| hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKihjy ubah}(h]h ]h"]h$]h&]uh1jhj] ubeh}(h]h ]h"]h$]h&]uh1jhjx hKkhjubj)}(h``signal_u8_write`` Signal u8 component write callback. The write value of the respective Signal u8 component is passed via the val parameter. h](j)}(h``signal_u8_write``h]j)}(hj h]hsignal_u8_write}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKnhj ubj)}(hhh]h)}(hzSignal u8 component write callback. The write value of the respective Signal u8 component is passed via the val parameter.h]hzSignal u8 component write callback. The write value of the respective Signal u8 component is passed via the val parameter.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKlhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hKnhjubj)}(h``device_u32_write`` Device u32 component write callback. The write value of the respective Device u32 component is passed via the val parameter. h](j)}(h``device_u32_write``h]j)}(hj h]hdevice_u32_write}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKqhj ubj)}(hhh]h)}(h|Device u32 component write callback. The write value of the respective Device u32 component is passed via the val parameter.h]h|Device u32 component write callback. The write value of the respective Device u32 component is passed via the val parameter.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKohj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hKqhjubj)}(h``count_u32_write`` Count u32 component write callback. The write value of the respective Count u32 component is passed via the val parameter. h](j)}(h``count_u32_write``h]j)}(hj h]hcount_u32_write}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKthj ubj)}(hhh]h)}(hzCount u32 component write callback. The write value of the respective Count u32 component is passed via the val parameter.h]hzCount u32 component write callback. The write value of the respective Count u32 component is passed via the val parameter.}(hj* hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKrhj' ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj& hKthjubj)}(h``signal_u32_write`` Signal u32 component write callback. The write value of the respective Signal u32 component is passed via the val parameter. h](j)}(h``signal_u32_write``h]j)}(hjK h]hsignal_u32_write}(hjM hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjI ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKwhjE ubj)}(hhh]h)}(h|Signal u32 component write callback. The write value of the respective Signal u32 component is passed via the val parameter.h]h|Signal u32 component write callback. The write value of the respective Signal u32 component is passed via the val parameter.}(hjd hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKuhja ubah}(h]h ]h"]h$]h&]uh1jhjE ubeh}(h]h ]h"]h$]h&]uh1jhj` hKwhjubj)}(h``device_u64_write`` Device u64 component write callback. The write value of the respective Device u64 component is passed via the val parameter. h](j)}(h``device_u64_write``h]j)}(hj h]hdevice_u64_write}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKzhj ubj)}(hhh]h)}(h|Device u64 component write callback. The write value of the respective Device u64 component is passed via the val parameter.h]h|Device u64 component write callback. The write value of the respective Device u64 component is passed via the val parameter.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKxhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hKzhjubj)}(h``count_u64_write`` Count u64 component write callback. The write value of the respective Count u64 component is passed via the val parameter. h](j)}(h``count_u64_write``h]j)}(hj h]hcount_u64_write}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhK}hj ubj)}(hhh]h)}(hzCount u64 component write callback. The write value of the respective Count u64 component is passed via the val parameter.h]hzCount u64 component write callback. The write value of the respective Count u64 component is passed via the val parameter.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhK{hj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hK}hjubj)}(h``signal_u64_write`` Signal u64 component write callback. The write value of the respective Signal u64 component is passed via the val parameter. h](j)}(h``signal_u64_write``h]j)}(hj h]hsignal_u64_write}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKhj ubj)}(hhh]h)}(h|Signal u64 component write callback. The write value of the respective Signal u64 component is passed via the val parameter.h]h|Signal u64 component write callback. The write value of the respective Signal u64 component is passed via the val parameter.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhK~hj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hKhjubj)}(hX ``signal_array_u32_write`` Signal u32 array component write callback. The index of the respective Signal u32 array component element is passed via the idx parameter. The write value of the respective Signal u32 array component element is passed via the val parameter. h](j)}(h``signal_array_u32_write``h]j)}(hj3 h]hsignal_array_u32_write}(hj5 hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1 ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKhj- ubj)}(hhh]h)}(hSignal u32 array component write callback. The index of the respective Signal u32 array component element is passed via the idx parameter. The write value of the respective Signal u32 array component element is passed via the val parameter.h]hSignal u32 array component write callback. The index of the respective Signal u32 array component element is passed via the idx parameter. The write value of the respective Signal u32 array component element is passed via the val parameter.}(hjL hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKhjI ubah}(h]h ]h"]h$]h&]uh1jhj- ubeh}(h]h ]h"]h$]h&]uh1jhjH hKhjubj)}(hX ``device_array_u64_write`` Device u64 array component write callback. The index of the respective Device u64 array component element is passed via the idx parameter. The write value of the respective Device u64 array component element is passed via the val parameter. h](j)}(h``device_array_u64_write``h]j)}(hjm h]hdevice_array_u64_write}(hjo hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjk ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKhjg ubj)}(hhh]h)}(hDevice u64 array component write callback. The index of the respective Device u64 array component element is passed via the idx parameter. The write value of the respective Device u64 array component element is passed via the val parameter.h]hDevice u64 array component write callback. The index of the respective Device u64 array component element is passed via the idx parameter. The write value of the respective Device u64 array component element is passed via the val parameter.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKhj ubah}(h]h ]h"]h$]h&]uh1jhjg ubeh}(h]h ]h"]h$]h&]uh1jhj hKhjubj)}(hX``count_array_u64_write`` Count u64 array component write callback. The index of the respective Count u64 array component element is passed via the idx parameter. The write value of the respective Count u64 array component element is passed via the val parameter. h](j)}(h``count_array_u64_write``h]j)}(hj h]hcount_array_u64_write}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKhj ubj)}(hhh]h)}(hCount u64 array component write callback. The index of the respective Count u64 array component element is passed via the idx parameter. The write value of the respective Count u64 array component element is passed via the val parameter.h]hCount u64 array component write callback. The index of the respective Count u64 array component element is passed via the idx parameter. The write value of the respective Count u64 array component element is passed via the val parameter.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hKhjubj)}(hX ``signal_array_u64_write`` Signal u64 array component write callback. The index of the respective Signal u64 array component element is passed via the idx parameter. The write value of the respective Signal u64 array component element is passed via the val parameter.h](j)}(h``signal_array_u64_write``h]j)}(hj h]hsignal_array_u64_write}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKhj ubj)}(hhh]h)}(hSignal u64 array component write callback. The index of the respective Signal u64 array component element is passed via the idx parameter. The write value of the respective Signal u64 array component element is passed via the val parameter.h]hSignal u64 array component write callback. The index of the respective Signal u64 array component element is passed via the idx parameter. The write value of the respective Signal u64 array component element is passed via the val parameter.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hKhjubeh}(h]h ]h"]h$]h&]uh1jhjIubeh}(h]h ] kernelindentah"]h$]h&]uh1jGhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jcounter_signal (C struct)c.counter_signalhNtauh1jhjhhhNhNubj)}(hhh](j)}(hcounter_signalh]j)}(hstruct counter_signalh](j)}(hjh]hstruct}(hj; hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7 hhhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKubj)}(h h]h }(hjI hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj7 hhhjH hKubj)}(hcounter_signalh]j)}(hj5 h]hcounter_signal}(hj[ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjW ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj7 hhhjH hKubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj3 hhhjH hKubah}(h]j. ah ](jjeh"]h$]h&]jj)jhuh1jhjH hKhj0 hhubj )}(hhh]h)}(hCounter Signal nodeh]hCounter Signal node}(hj} hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKhjz hhubah}(h]h ]h"]h$]h&]uh1jhj0 hhhjH hKubeh}(h]h ](j<structeh"]h$]h&]jAj<jBj jCj jDjEjFuh1jhhhjhNhNubjH)}(hX`**Definition**:: struct counter_signal { int id; const char *name; struct counter_comp *ext; size_t num_ext; }; **Members** ``id`` unique ID used to identify the Signal ``name`` device-specific Signal name ``ext`` optional array of Signal extensions ``num_ext`` number of Signal extensions specified in **ext**h](h)}(h**Definition**::h](jR)}(h**Definition**h]h Definition}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj ubh:}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKhj ubj)}(hnstruct counter_signal { int id; const char *name; struct counter_comp *ext; size_t num_ext; };h]hnstruct counter_signal { int id; const char *name; struct counter_comp *ext; size_t num_ext; };}hj sbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKhj ubh)}(h **Members**h]jR)}(hj h]hMembers}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj ubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKhj ubj)}(hhh](j)}(h-``id`` unique ID used to identify the Signal h](j)}(h``id``h]j)}(hj h]hid}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKhj ubj)}(hhh]h)}(h%unique ID used to identify the Signalh]h%unique ID used to identify the Signal}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKhjubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]uh1jhj hKhj ubj)}(h%``name`` device-specific Signal name h](j)}(h``name``h]j)}(hj#h]hname}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKhjubj)}(hhh]h)}(hdevice-specific Signal nameh]hdevice-specific Signal name}(hj<hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8hKhj9ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj8hKhj ubj)}(h,``ext`` optional array of Signal extensions h](j)}(h``ext``h]j)}(hj\h]hext}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjZubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKhjVubj)}(hhh]h)}(h#optional array of Signal extensionsh]h#optional array of Signal extensions}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjqhKhjrubah}(h]h ]h"]h$]h&]uh1jhjVubeh}(h]h ]h"]h$]h&]uh1jhjqhKhj ubj)}(h<``num_ext`` number of Signal extensions specified in **ext**h](j)}(h ``num_ext``h]j)}(hjh]hnum_ext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKhjubj)}(hhh]h)}(h0number of Signal extensions specified in **ext**h](h)number of Signal extensions specified in }(hjhhhNhNubjR)}(h**ext**h]hext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhj ubeh}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jGhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jcounter_synapse (C struct)c.counter_synapsehNtauh1jhjhhhNhNubj)}(hhh](j)}(hcounter_synapseh]j)}(hstruct counter_synapseh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj hKubj)}(hcounter_synapseh]j)}(hjh]hcounter_synapse}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1jhjhhhj hKubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjhhhj hKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj hKhjhhubj )}(hhh]h)}(hCounter Synapse nodeh]hCounter Synapse node}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKhj<hhubah}(h]h ]h"]h$]h&]uh1jhjhhhj hKubeh}(h]h ](j<structeh"]h$]h&]jAj<jBjWjCjWjDjEjFuh1jhhhjhNhNubjH)}(hX_**Definition**:: struct counter_synapse { const enum counter_synapse_action *actions_list; size_t num_actions; struct counter_signal *signal; }; **Members** ``actions_list`` array of available action modes ``num_actions`` number of action modes specified in **actions_list** ``signal`` pointer to the associated Signalh](h)}(h**Definition**::h](jR)}(h**Definition**h]h Definition}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj_ubh:}(hj_hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKhj[ubj)}(hstruct counter_synapse { const enum counter_synapse_action *actions_list; size_t num_actions; struct counter_signal *signal; };h]hstruct counter_synapse { const enum counter_synapse_action *actions_list; size_t num_actions; struct counter_signal *signal; };}hj|sbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKhj[ubh)}(h **Members**h]jR)}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKhj[ubj)}(hhh](j)}(h1``actions_list`` array of available action modes h](j)}(h``actions_list``h]j)}(hjh]h actions_list}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKhjubj)}(hhh]h)}(harray of available action modesh]harray of available action modes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(hE``num_actions`` number of action modes specified in **actions_list** h](j)}(h``num_actions``h]j)}(hjh]h num_actions}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKhjubj)}(hhh]h)}(h4number of action modes specified in **actions_list**h](h$number of action modes specified in }(hjhhhNhNubjR)}(h**actions_list**h]h actions_list}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubeh}(h]h ]h"]h$]h&]uh1hhjhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKhjubj)}(h+``signal`` pointer to the associated Signalh](j)}(h ``signal``h]j)}(hj,h]hsignal}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKhj&ubj)}(hhh]h)}(h pointer to the associated Signalh]h pointer to the associated Signal}(hjEhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKhjBubah}(h]h ]h"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]uh1jhjAhKhjubeh}(h]h ]h"]h$]h&]uh1jhj[ubeh}(h]h ] kernelindentah"]h$]h&]uh1jGhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jcounter_count (C struct)c.counter_counthNtauh1jhjhhhNhNubj)}(hhh](j)}(h counter_counth]j)}(hstruct counter_counth](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhKubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhKubj)}(h counter_counth]j)}(hjh]h counter_count}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj~hhhjhKubah}(h]jyah ](jjeh"]h$]h&]jj)jhuh1jhjhKhj{hhubj )}(hhh]h)}(hCounter Count nodeh]hCounter Count node}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhj{hhhjhKubeh}(h]h ](j<structeh"]h$]h&]jAj<jBjjCjjDjEjFuh1jhhhjhNhNubjH)}(hX**Definition**:: struct counter_count { int id; const char *name; const enum counter_function *functions_list; size_t num_functions; struct counter_synapse *synapses; size_t num_synapses; struct counter_comp *ext; size_t num_ext; }; **Members** ``id`` unique ID used to identify the Count ``name`` device-specific Count name ``functions_list`` array of available function modes ``num_functions`` number of function modes specified in **functions_list** ``synapses`` array of Synapses for initialization ``num_synapses`` number of Synapses specified in **synapses** ``ext`` optional array of Count extensions ``num_ext`` number of Count extensions specified in **ext**h](h)}(h**Definition**::h](jR)}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMhjubj)}(hstruct counter_count { int id; const char *name; const enum counter_function *functions_list; size_t num_functions; struct counter_synapse *synapses; size_t num_synapses; struct counter_comp *ext; size_t num_ext; };h]hstruct counter_count { int id; const char *name; const enum counter_function *functions_list; size_t num_functions; struct counter_synapse *synapses; size_t num_synapses; struct counter_comp *ext; size_t num_ext; };}hjsbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMhjubh)}(h **Members**h]jR)}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMhjubj)}(hhh](j)}(h,``id`` unique ID used to identify the Count h](j)}(h``id``h]j)}(hj5h]hid}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMhj/ubj)}(hhh]h)}(h$unique ID used to identify the Counth]h$unique ID used to identify the Count}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJhMhjKubah}(h]h ]h"]h$]h&]uh1jhj/ubeh}(h]h ]h"]h$]h&]uh1jhjJhMhj,ubj)}(h$``name`` device-specific Count name h](j)}(h``name``h]j)}(hjnh]hname}(hjphhhNhNubah}(h]h ]h"]h$]h&]uh1jhjlubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMhjhubj)}(hhh]h)}(hdevice-specific Count nameh]hdevice-specific Count name}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjhubeh}(h]h ]h"]h$]h&]uh1jhjhMhj,ubj)}(h5``functions_list`` array of available function modes h](j)}(h``functions_list``h]j)}(hjh]hfunctions_list}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMhjubj)}(hhh]h)}(h!array of available function modesh]h!array of available function modes}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj,ubj)}(hK``num_functions`` number of function modes specified in **functions_list** h](j)}(h``num_functions``h]j)}(hjh]h num_functions}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMhjubj)}(hhh]h)}(h8number of function modes specified in **functions_list**h](h&number of function modes specified in }(hjhhhNhNubjR)}(h**functions_list**h]hfunctions_list}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubeh}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj,ubj)}(h2``synapses`` array of Synapses for initialization h](j)}(h ``synapses``h]j)}(hj'h]hsynapses}(hj)hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMhj!ubj)}(hhh]h)}(h$array of Synapses for initializationh]h$array of Synapses for initialization}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj<hMhj=ubah}(h]h ]h"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]uh1jhj<hMhj,ubj)}(h>``num_synapses`` number of Synapses specified in **synapses** h](j)}(h``num_synapses``h]j)}(hj`h]h num_synapses}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj^ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMhjZubj)}(hhh]h)}(h,number of Synapses specified in **synapses**h](h number of Synapses specified in }(hjyhhhNhNubjR)}(h **synapses**h]hsynapses}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjyubeh}(h]h ]h"]h$]h&]uh1hhjuhMhjvubah}(h]h ]h"]h$]h&]uh1jhjZubeh}(h]h ]h"]h$]h&]uh1jhjuhMhj,ubj)}(h+``ext`` optional array of Count extensions h](j)}(h``ext``h]j)}(hjh]hext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMhjubj)}(hhh]h)}(h"optional array of Count extensionsh]h"optional array of Count extensions}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj,ubj)}(h;``num_ext`` number of Count extensions specified in **ext**h](j)}(h ``num_ext``h]j)}(hjh]hnum_ext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMhjubj)}(hhh]h)}(h/number of Count extensions specified in **ext**h](h(number of Count extensions specified in }(hjhhhNhNubjR)}(h**ext**h]hext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhM hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhj,ubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jGhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jcounter_event_node (C struct)c.counter_event_nodehNtauh1jhjhhhNhNubj)}(hhh](j)}(hcounter_event_nodeh]j)}(hstruct counter_event_nodeh](j)}(hjh]hstruct}(hjHhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDhhhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMubj)}(h h]h }(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjDhhhjUhMubj)}(hcounter_event_nodeh]j)}(hjBh]hcounter_event_node}(hjhhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjdubah}(h]h ](jjeh"]h$]h&]hhuh1jhjDhhhjUhMubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj@hhhjUhMubah}(h]j;ah ](jjeh"]h$]h&]jj)jhuh1jhjUhMhj=hhubj )}(hhh]h)}(hCounter Event nodeh]hCounter Event node}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMhjhhubah}(h]h ]h"]h$]h&]uh1jhj=hhhjUhMubeh}(h]h ](j<structeh"]h$]h&]jAj<jBjjCjjDjEjFuh1jhhhjhNhNubjH)}(hXO**Definition**:: struct counter_event_node { struct list_head l; u8 event; u8 channel; struct list_head comp_list; }; **Members** ``l`` list of current watching Counter events ``event`` event that triggers ``channel`` event channel ``comp_list`` list of components to watch when event triggersh](h)}(h**Definition**::h](jR)}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMhjubj)}(htstruct counter_event_node { struct list_head l; u8 event; u8 channel; struct list_head comp_list; };h]htstruct counter_event_node { struct list_head l; u8 event; u8 channel; struct list_head comp_list; };}hjsbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMhjubh)}(h **Members**h]jR)}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhM&hjubj)}(hhh](j)}(h.``l`` list of current watching Counter events h](j)}(h``l``h]j)}(hjh]hl}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMhjubj)}(hhh]h)}(h'list of current watching Counter eventsh]h'list of current watching Counter events}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMhj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj hMhjubj)}(h``event`` event that triggers h](j)}(h ``event``h]j)}(hj0h]hevent}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMhj*ubj)}(hhh]h)}(hevent that triggersh]hevent that triggers}(hjIhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjEhMhjFubah}(h]h ]h"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]uh1jhjEhMhjubj)}(h``channel`` event channel h](j)}(h ``channel``h]j)}(hjih]hchannel}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjgubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMhjcubj)}(hhh]h)}(h event channelh]h event channel}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj~hMhjubah}(h]h ]h"]h$]h&]uh1jhjcubeh}(h]h ]h"]h$]h&]uh1jhj~hMhjubj)}(h=``comp_list`` list of components to watch when event triggersh](j)}(h ``comp_list``h]j)}(hjh]h comp_list}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMhjubj)}(hhh]h)}(h/list of components to watch when event triggersh]h/list of components to watch when event triggers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhjubeh}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ] kernelindentah"]h$]h&]uh1jGhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jcounter_ops (C struct) c.counter_opshNtauh1jhjhhhNhNubj)}(hhh](j)}(h counter_opsh]j)}(hstruct counter_opsh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhM$ubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj hM$ubj)}(h counter_opsh]j)}(hjh]h counter_ops}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1jhjhhhj hM$ubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjhhhj hM$ubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhj hM$hjhhubj )}(hhh]h)}(hCallbacks from driverh]hCallbacks from driver}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhM'hj;hhubah}(h]h ]h"]h$]h&]uh1jhjhhhj hM$ubeh}(h]h ](j<structeh"]h$]h&]jAj<jBjVjCjVjDjEjFuh1jhhhjhNhNubjH)}(hX **Definition**:: struct counter_ops { int (*signal_read)(struct counter_device *counter,struct counter_signal *signal, enum counter_signal_level *level); int (*count_read)(struct counter_device *counter, struct counter_count *count, u64 *value); int (*count_write)(struct counter_device *counter, struct counter_count *count, u64 value); int (*function_read)(struct counter_device *counter,struct counter_count *count, enum counter_function *function); int (*function_write)(struct counter_device *counter,struct counter_count *count, enum counter_function function); int (*action_read)(struct counter_device *counter,struct counter_count *count,struct counter_synapse *synapse, enum counter_synapse_action *action); int (*action_write)(struct counter_device *counter,struct counter_count *count,struct counter_synapse *synapse, enum counter_synapse_action action); int (*events_configure)(struct counter_device *counter); int (*watch_validate)(struct counter_device *counter, const struct counter_watch *watch); }; **Members** ``signal_read`` optional read callback for Signals. The read level of the respective Signal should be passed back via the level parameter. ``count_read`` read callback for Counts. The read value of the respective Count should be passed back via the value parameter. ``count_write`` optional write callback for Counts. The write value for the respective Count is passed in via the value parameter. ``function_read`` read callback the Count function modes. The read function mode of the respective Count should be passed back via the function parameter. ``function_write`` optional write callback for Count function modes. The function mode to write for the respective Count is passed in via the function parameter. ``action_read`` optional read callback the Synapse action modes. The read action mode of the respective Synapse should be passed back via the action parameter. ``action_write`` optional write callback for Synapse action modes. The action mode to write for the respective Synapse is passed in via the action parameter. ``events_configure`` optional write callback to configure events. The list of struct counter_event_node may be accessed via the events_list member of the counter parameter. ``watch_validate`` optional callback to validate a watch. The Counter component watch configuration is passed in via the watch parameter. A return value of 0 indicates a valid Counter component watch configuration.h](h)}(h**Definition**::h](jR)}(h**Definition**h]h Definition}(hjbhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj^ubh:}(hj^hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhM+hjZubj)}(hX struct counter_ops { int (*signal_read)(struct counter_device *counter,struct counter_signal *signal, enum counter_signal_level *level); int (*count_read)(struct counter_device *counter, struct counter_count *count, u64 *value); int (*count_write)(struct counter_device *counter, struct counter_count *count, u64 value); int (*function_read)(struct counter_device *counter,struct counter_count *count, enum counter_function *function); int (*function_write)(struct counter_device *counter,struct counter_count *count, enum counter_function function); int (*action_read)(struct counter_device *counter,struct counter_count *count,struct counter_synapse *synapse, enum counter_synapse_action *action); int (*action_write)(struct counter_device *counter,struct counter_count *count,struct counter_synapse *synapse, enum counter_synapse_action action); int (*events_configure)(struct counter_device *counter); int (*watch_validate)(struct counter_device *counter, const struct counter_watch *watch); };h]hX struct counter_ops { int (*signal_read)(struct counter_device *counter,struct counter_signal *signal, enum counter_signal_level *level); int (*count_read)(struct counter_device *counter, struct counter_count *count, u64 *value); int (*count_write)(struct counter_device *counter, struct counter_count *count, u64 value); int (*function_read)(struct counter_device *counter,struct counter_count *count, enum counter_function *function); int (*function_write)(struct counter_device *counter,struct counter_count *count, enum counter_function function); int (*action_read)(struct counter_device *counter,struct counter_count *count,struct counter_synapse *synapse, enum counter_synapse_action *action); int (*action_write)(struct counter_device *counter,struct counter_count *count,struct counter_synapse *synapse, enum counter_synapse_action action); int (*events_configure)(struct counter_device *counter); int (*watch_validate)(struct counter_device *counter, const struct counter_watch *watch); };}hj{sbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhM-hjZubh)}(h **Members**h]jR)}(hjh]hMembers}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhM9hjZubj)}(hhh](j)}(h``signal_read`` optional read callback for Signals. The read level of the respective Signal should be passed back via the level parameter. h](j)}(h``signal_read``h]j)}(hjh]h signal_read}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhM+hjubj)}(hhh]h)}(hzoptional read callback for Signals. The read level of the respective Signal should be passed back via the level parameter.h]hzoptional read callback for Signals. The read level of the respective Signal should be passed back via the level parameter.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhM)hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM+hjubj)}(h``count_read`` read callback for Counts. The read value of the respective Count should be passed back via the value parameter. h](j)}(h``count_read``h]j)}(hjh]h count_read}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhM.hjubj)}(hhh]h)}(horead callback for Counts. The read value of the respective Count should be passed back via the value parameter.h]horead callback for Counts. The read value of the respective Count should be passed back via the value parameter.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhM,hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM.hjubj)}(h``count_write`` optional write callback for Counts. The write value for the respective Count is passed in via the value parameter. h](j)}(h``count_write``h]j)}(hjh]h count_write}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhM1hjubj)}(hhh]h)}(hroptional write callback for Counts. The write value for the respective Count is passed in via the value parameter.h]hroptional write callback for Counts. The write value for the respective Count is passed in via the value parameter.}(hj8hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhM/hj5ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj4hM1hjubj)}(h``function_read`` read callback the Count function modes. The read function mode of the respective Count should be passed back via the function parameter. h](j)}(h``function_read``h]j)}(hjYh]h function_read}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjWubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhM4hjSubj)}(hhh]h)}(hread callback the Count function modes. The read function mode of the respective Count should be passed back via the function parameter.h]hread callback the Count function modes. The read function mode of the respective Count should be passed back via the function parameter.}(hjrhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhM2hjoubah}(h]h ]h"]h$]h&]uh1jhjSubeh}(h]h ]h"]h$]h&]uh1jhjnhM4hjubj)}(h``function_write`` optional write callback for Count function modes. The function mode to write for the respective Count is passed in via the function parameter. h](j)}(h``function_write``h]j)}(hjh]hfunction_write}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhM7hjubj)}(hhh]h)}(hoptional write callback for Count function modes. The function mode to write for the respective Count is passed in via the function parameter.h]hoptional write callback for Count function modes. The function mode to write for the respective Count is passed in via the function parameter.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhM5hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM7hjubj)}(h``action_read`` optional read callback the Synapse action modes. The read action mode of the respective Synapse should be passed back via the action parameter. h](j)}(h``action_read``h]j)}(hjh]h action_read}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhM:hjubj)}(hhh]h)}(hoptional read callback the Synapse action modes. The read action mode of the respective Synapse should be passed back via the action parameter.h]hoptional read callback the Synapse action modes. The read action mode of the respective Synapse should be passed back via the action parameter.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhM8hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM:hjubj)}(h``action_write`` optional write callback for Synapse action modes. The action mode to write for the respective Synapse is passed in via the action parameter. h](j)}(h``action_write``h]j)}(hjh]h action_write}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhM=hjubj)}(hhh]h)}(hoptional write callback for Synapse action modes. The action mode to write for the respective Synapse is passed in via the action parameter.h]hoptional write callback for Synapse action modes. The action mode to write for the respective Synapse is passed in via the action parameter.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhM;hjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhM=hjubj)}(h``events_configure`` optional write callback to configure events. The list of struct counter_event_node may be accessed via the events_list member of the counter parameter. h](j)}(h``events_configure``h]j)}(hjAh]hevents_configure}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj?ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhM@hj;ubj)}(hhh]h)}(hoptional write callback to configure events. The list of struct counter_event_node may be accessed via the events_list member of the counter parameter.h]hoptional write callback to configure events. The list of struct counter_event_node may be accessed via the events_list member of the counter parameter.}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhM>hjWubah}(h]h ]h"]h$]h&]uh1jhj;ubeh}(h]h ]h"]h$]h&]uh1jhjVhM@hjubj)}(h``watch_validate`` optional callback to validate a watch. The Counter component watch configuration is passed in via the watch parameter. A return value of 0 indicates a valid Counter component watch configuration.h](j)}(h``watch_validate``h]j)}(hj{h]hwatch_validate}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjyubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMChjuubj)}(hhh]h)}(hoptional callback to validate a watch. The Counter component watch configuration is passed in via the watch parameter. A return value of 0 indicates a valid Counter component watch configuration.h]hoptional callback to validate a watch. The Counter component watch configuration is passed in via the watch parameter. A return value of 0 indicates a valid Counter component watch configuration.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMAhjubah}(h]h ]h"]h$]h&]uh1jhjuubeh}(h]h ]h"]h$]h&]uh1jhjhMChjubeh}(h]h ]h"]h$]h&]uh1jhjZubeh}(h]h ] kernelindentah"]h$]h&]uh1jGhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jcounter_device (C struct)c.counter_devicehNtauh1jhjhhhNhNubj)}(hhh](j)}(hcounter_deviceh]j)}(hstruct counter_deviceh](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMJubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhjhMJubj)}(hcounter_deviceh]j)}(hjh]hcounter_device}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ](jjeh"]h$]h&]hhuh1jhjhhhjhMJubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjhhhjhMJubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhMJhjhhubj )}(hhh]h)}(hCounter data structureh]hCounter data structure}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMahjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhMJubeh}(h]h ](j<structeh"]h$]h&]jAj<jBj/jCj/jDjEjFuh1jhhhjhNhNubjH)}(hX**Definition**:: struct counter_device { const char *name; struct device *parent; const struct counter_ops *ops; struct counter_signal *signals; size_t num_signals; struct counter_count *counts; size_t num_counts; struct counter_comp *ext; size_t num_ext; struct device dev; struct cdev chrdev; struct list_head events_list; spinlock_t events_list_lock; struct list_head next_events_list; struct mutex n_events_list_lock; struct counter_event *events; wait_queue_head_t events_wait; spinlock_t events_in_lock; struct mutex events_out_lock; struct mutex ops_exist_lock; }; **Members** ``name`` name of the device ``parent`` optional parent device providing the counters ``ops`` callbacks from driver ``signals`` array of Signals ``num_signals`` number of Signals specified in **signals** ``counts`` array of Counts ``num_counts`` number of Counts specified in **counts** ``ext`` optional array of Counter device extensions ``num_ext`` number of Counter device extensions specified in **ext** ``dev`` internal device structure ``chrdev`` internal character device structure ``events_list`` list of current watching Counter events ``events_list_lock`` lock to protect Counter events list operations ``next_events_list`` list of next watching Counter events ``n_events_list_lock`` lock to protect Counter next events list operations ``events`` queue of detected Counter events ``events_wait`` wait queue to allow blocking reads of Counter events ``events_in_lock`` lock to protect Counter events queue in operations ``events_out_lock`` lock to protect Counter events queue out operations ``ops_exist_lock`` lock to prevent use during removalh](h)}(h**Definition**::h](jR)}(h**Definition**h]h Definition}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj7ubh:}(hj7hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMehj3ubj)}(hXzstruct counter_device { const char *name; struct device *parent; const struct counter_ops *ops; struct counter_signal *signals; size_t num_signals; struct counter_count *counts; size_t num_counts; struct counter_comp *ext; size_t num_ext; struct device dev; struct cdev chrdev; struct list_head events_list; spinlock_t events_list_lock; struct list_head next_events_list; struct mutex n_events_list_lock; struct counter_event *events; wait_queue_head_t events_wait; spinlock_t events_in_lock; struct mutex events_out_lock; struct mutex ops_exist_lock; };h]hXzstruct counter_device { const char *name; struct device *parent; const struct counter_ops *ops; struct counter_signal *signals; size_t num_signals; struct counter_count *counts; size_t num_counts; struct counter_comp *ext; size_t num_ext; struct device dev; struct cdev chrdev; struct list_head events_list; spinlock_t events_list_lock; struct list_head next_events_list; struct mutex n_events_list_lock; struct counter_event *events; wait_queue_head_t events_wait; spinlock_t events_in_lock; struct mutex events_out_lock; struct mutex ops_exist_lock; };}hjTsbah}(h]h ]h"]h$]h&]hhuh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMghj3ubh)}(h **Members**h]jR)}(hjeh]hMembers}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjcubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhM~hj3ubj)}(hhh](j)}(h``name`` name of the device h](j)}(h``name``h]j)}(hjh]hname}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMchj~ubj)}(hhh]h)}(hname of the deviceh]hname of the device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMchjubah}(h]h ]h"]h$]h&]uh1jhj~ubeh}(h]h ]h"]h$]h&]uh1jhjhMchj{ubj)}(h9``parent`` optional parent device providing the counters h](j)}(h ``parent``h]j)}(hjh]hparent}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMdhjubj)}(hhh]h)}(h-optional parent device providing the countersh]h-optional parent device providing the counters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMdhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMdhj{ubj)}(h``ops`` callbacks from driver h](j)}(h``ops``h]j)}(hjh]hops}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMehjubj)}(hhh]h)}(hcallbacks from driverh]hcallbacks from driver}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hMehj ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj hMehj{ubj)}(h``signals`` array of Signals h](j)}(h ``signals``h]j)}(hj/h]hsignals}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMfhj)ubj)}(hhh]h)}(harray of Signalsh]harray of Signals}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjDhMfhjEubah}(h]h ]h"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]uh1jhjDhMfhj{ubj)}(h;``num_signals`` number of Signals specified in **signals** h](j)}(h``num_signals``h]j)}(hjhh]h num_signals}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMghjbubj)}(hhh]h)}(h*number of Signals specified in **signals**h](hnumber of Signals specified in }(hjhhhNhNubjR)}(h **signals**h]hsignals}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubeh}(h]h ]h"]h$]h&]uh1hhj}hMghj~ubah}(h]h ]h"]h$]h&]uh1jhjbubeh}(h]h ]h"]h$]h&]uh1jhj}hMghj{ubj)}(h``counts`` array of Counts h](j)}(h ``counts``h]j)}(hjh]hcounts}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMhhjubj)}(hhh]h)}(harray of Countsh]harray of Counts}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMhhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMhhj{ubj)}(h8``num_counts`` number of Counts specified in **counts** h](j)}(h``num_counts``h]j)}(hjh]h num_counts}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMihjubj)}(hhh]h)}(h(number of Counts specified in **counts**h](hnumber of Counts specified in }(hjhhhNhNubjR)}(h **counts**h]hcounts}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubeh}(h]h ]h"]h$]h&]uh1hhjhMihjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMihj{ubj)}(h4``ext`` optional array of Counter device extensions h](j)}(h``ext``h]j)}(hj/h]hext}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj-ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMjhj)ubj)}(hhh]h)}(h+optional array of Counter device extensionsh]h+optional array of Counter device extensions}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjDhMjhjEubah}(h]h ]h"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]uh1jhjDhMjhj{ubj)}(hE``num_ext`` number of Counter device extensions specified in **ext** h](j)}(h ``num_ext``h]j)}(hjhh]hnum_ext}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjfubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMkhjbubj)}(hhh]h)}(h8number of Counter device extensions specified in **ext**h](h1number of Counter device extensions specified in }(hjhhhNhNubjR)}(h**ext**h]hext}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubeh}(h]h ]h"]h$]h&]uh1hhj}hMkhj~ubah}(h]h ]h"]h$]h&]uh1jhjbubeh}(h]h ]h"]h$]h&]uh1jhj}hMkhj{ubj)}(h"``dev`` internal device structure h](j)}(h``dev``h]j)}(hjh]hdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMlhjubj)}(hhh]h)}(hinternal device structureh]hinternal device structure}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMlhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMlhj{ubj)}(h/``chrdev`` internal character device structure h](j)}(h ``chrdev``h]j)}(hjh]hchrdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMmhjubj)}(hhh]h)}(h#internal character device structureh]h#internal character device structure}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMmhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMmhj{ubj)}(h8``events_list`` list of current watching Counter events h](j)}(h``events_list``h]j)}(hj!h]h events_list}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMnhjubj)}(hhh]h)}(h'list of current watching Counter eventsh]h'list of current watching Counter events}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj6hMnhj7ubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhj6hMnhj{ubj)}(hD``events_list_lock`` lock to protect Counter events list operations h](j)}(h``events_list_lock``h]j)}(hjZh]hevents_list_lock}(hj\hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjXubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMohjTubj)}(hhh]h)}(h.lock to protect Counter events list operationsh]h.lock to protect Counter events list operations}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhjohMohjpubah}(h]h ]h"]h$]h&]uh1jhjTubeh}(h]h ]h"]h$]h&]uh1jhjohMohj{ubj)}(h:``next_events_list`` list of next watching Counter events h](j)}(h``next_events_list``h]j)}(hjh]hnext_events_list}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMphjubj)}(hhh]h)}(h$list of next watching Counter eventsh]h$list of next watching Counter events}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMphjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMphj{ubj)}(hK``n_events_list_lock`` lock to protect Counter next events list operations h](j)}(h``n_events_list_lock``h]j)}(hjh]hn_events_list_lock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMqhjubj)}(hhh]h)}(h3lock to protect Counter next events list operationsh]h3lock to protect Counter next events list operations}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMqhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMqhj{ubj)}(h,``events`` queue of detected Counter events h](j)}(h ``events``h]j)}(hjh]hevents}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMrhjubj)}(hhh]h)}(h queue of detected Counter eventsh]h queue of detected Counter events}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMrhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMrhj{ubj)}(hE``events_wait`` wait queue to allow blocking reads of Counter events h](j)}(h``events_wait``h]j)}(hj>h]h events_wait}(hj@hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj<ubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMshj8ubj)}(hhh]h)}(h4wait queue to allow blocking reads of Counter eventsh]h4wait queue to allow blocking reads of Counter events}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjShMshjTubah}(h]h ]h"]h$]h&]uh1jhj8ubeh}(h]h ]h"]h$]h&]uh1jhjShMshj{ubj)}(hF``events_in_lock`` lock to protect Counter events queue in operations h](j)}(h``events_in_lock``h]j)}(hjwh]hevents_in_lock}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjuubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMthjqubj)}(hhh]h)}(h2lock to protect Counter events queue in operationsh]h2lock to protect Counter events queue in operations}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMthjubah}(h]h ]h"]h$]h&]uh1jhjqubeh}(h]h ]h"]h$]h&]uh1jhjhMthj{ubj)}(hH``events_out_lock`` lock to protect Counter events queue out operations h](j)}(h``events_out_lock``h]j)}(hjh]hevents_out_lock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMuhjubj)}(hhh]h)}(h3lock to protect Counter events queue out operationsh]h3lock to protect Counter events queue out operations}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhMuhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMuhj{ubj)}(h5``ops_exist_lock`` lock to prevent use during removalh](j)}(h``ops_exist_lock``h]j)}(hjh]hops_exist_lock}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMuhjubj)}(hhh]h)}(h"lock to prevent use during removalh]h"lock to prevent use during removal}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.hhMvhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhMuhj{ubeh}(h]h ]h"]h$]h&]uh1jhj3ubeh}(h]h ] kernelindentah"]h$]h&]uh1jGhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jcounter_priv (C function)c.counter_privhNtauh1jhjhhhNhNubj)}(hhh](j)}(h@void * counter_priv (const struct counter_device *const counter)h]j)}(h>void *counter_priv(const struct counter_device *const counter)h](hdesc_sig_keyword_type)}(hvoidh]hvoid}(hjEhhhNhNubah}(h]h ]ktah"]h$]h&]uh1jChj?hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKFubj)}(h h]h }(hjUhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj?hhhjThKFubhdesc_sig_punctuation)}(hjuh]h*}(hjehhhNhNubah}(h]h ]pah"]h$]h&]uh1jchj?hhhjThKFubj)}(h counter_privh]j)}(h counter_privh]h counter_priv}(hjwhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjsubah}(h]h ](jjeh"]h$]h&]hhuh1jhj?hhhjThKFubhdesc_parameterlist)}(h,(const struct counter_device *const counter)h]hdesc_parameter)}(h*const struct counter_device *const counterh](j)}(hconsth]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubh)}(hhh]j)}(hcounter_deviceh]hcounter_device}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj<reftype identifier reftargetjmodnameN classnameN c:parent_keysphinx.domains.c LookupKey)}data]j ASTIdentifier)}jjysbc.counter_privasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubjd)}(hjuh]h*}(hjhhhNhNubah}(h]h ]joah"]h$]h&]uh1jchjubj)}(hjh]hconst}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h h]h }(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(hcounterh]hcounter}(hj/hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubah}(h]h ]h"]h$]h&]hhuh1jhj?hhhjThKFubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj;hhhjThKFubah}(h]j6ah ](jjeh"]h$]h&]jj)jhuh1jhjThKFhj8hhubj )}(hhh]h)}(h"access counter device private datah]h"access counter device private data}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKAhjVhhubah}(h]h ]h"]h$]h&]uh1jhj8hhhjThKFubeh}(h]h ](j<functioneh"]h$]h&]jAj<jBjqjCjqjDjEjFuh1jhhhjhNhNubjH)}(h**Parameters** ``const struct counter_device *const counter`` counter device **Description** Get the counter device private datah](h)}(h**Parameters**h]jR)}(hj{h]h Parameters}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjyubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKEhjuubj)}(hhh]j)}(h>``const struct counter_device *const counter`` counter device h](j)}(h.``const struct counter_device *const counter``h]j)}(hjh]h*const struct counter_device *const counter}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKBhjubj)}(hhh]h)}(hcounter deviceh]hcounter device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKBhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]uh1jhjhKBhjubah}(h]h ]h"]h$]h&]uh1jhjuubh)}(h**Description**h]jR)}(hjh]h Description}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKDhjuubh)}(h#Get the counter device private datah]h#Get the counter device private data}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKDhjuubeh}(h]h ] kernelindentah"]h$]h&]uh1jGhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jcounter_alloc (C function)c.counter_allochNtauh1jhjhhhNhNubj)}(hhh](j)}(h:struct counter_device * counter_alloc (size_t sizeof_priv)h]j)}(h8struct counter_device *counter_alloc(size_t sizeof_priv)h](j)}(hjh]hstruct}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKXubj)}(h h]h }(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj'hKXubh)}(hhh]j)}(hcounter_deviceh]hcounter_device}(hj9hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj6ubah}(h]h ]h"]h$]h&] refdomainj<reftypej reftargetj;modnameN classnameNjj)}j]j)}j counter_allocsbc.counter_allocasbuh1hhjhhhj'hKXubj)}(h h]h }(hjZhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjhhhj'hKXubjd)}(hjuh]h*}(hjhhhhNhNubah}(h]h ]joah"]h$]h&]uh1jchjhhhj'hKXubj)}(h counter_alloch]j)}(hjWh]h counter_alloc}(hjyhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjuubah}(h]h ](jjeh"]h$]h&]hhuh1jhjhhhj'hKXubj)}(h(size_t sizeof_priv)h]j)}(hsize_t sizeof_privh](h)}(hhh]j)}(hsize_th]hsize_t}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&] refdomainj<reftypej reftargetjmodnameN classnameNjj)}j]jUc.counter_allocasbuh1hhjubj)}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubj)}(h sizeof_privh]h sizeof_priv}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]noemphhhuh1jhjubah}(h]h ]h"]h$]h&]hhuh1jhjhhhj'hKXubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjhhhj'hKXubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj'hKXhjhhubj )}(hhh]h)}(hallocate a counter_deviceh]hallocate a counter_device}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKPhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj'hKXubeh}(h]h ](j<functioneh"]h$]h&]jAj<jBj jCj jDjEjFuh1jhhhjhNhNubjH)}(hX6**Parameters** ``size_t sizeof_priv`` size of the driver private data **Description** This is part one of counter registration. The structure is allocated dynamically to ensure the right lifetime for the embedded struct device. If this succeeds, call counter_put() to get rid of the counter_device again.h](h)}(h**Parameters**h]jR)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKThj ubj)}(hhh]j)}(h7``size_t sizeof_priv`` size of the driver private data h](j)}(h``size_t sizeof_priv``h]j)}(hj. h]hsize_t sizeof_priv}(hj0 hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj, ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKQhj( ubj)}(hhh]h)}(hsize of the driver private datah]hsize of the driver private data}(hjG hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjC hKQhjD ubah}(h]h ]h"]h$]h&]uh1jhj( ubeh}(h]h ]h"]h$]h&]uh1jhjC hKQhj% ubah}(h]h ]h"]h$]h&]uh1jhj ubh)}(h**Description**h]jR)}(hji h]h Description}(hjk hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjg ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKShj ubh)}(hThis is part one of counter registration. The structure is allocated dynamically to ensure the right lifetime for the embedded struct device.h]hThis is part one of counter registration. The structure is allocated dynamically to ensure the right lifetime for the embedded struct device.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKShj ubh)}(hLIf this succeeds, call counter_put() to get rid of the counter_device again.h]hLIf this succeeds, call counter_put() to get rid of the counter_device again.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKVhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jGhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jcounter_add (C function) c.counter_addhNtauh1jhjhhhNhNubj)}(hhh](j)}(h0int counter_add (struct counter_device *counter)h]j)}(h/int counter_add(struct counter_device *counter)h](jD)}(hinth]hint}(hj hhhNhNubah}(h]h ]jPah"]h$]h&]uh1jChj hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKubj)}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhj hKubj)}(h counter_addh]j)}(h counter_addh]h counter_add}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj hhhj hKubj)}(h (struct counter_device *counter)h]j)}(hstruct counter_device *counterh](j)}(hjh]hstruct}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubj)}(h h]h }(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubh)}(hhh]j)}(hcounter_deviceh]hcounter_device}(hj!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&] refdomainj<reftypej reftargetj!modnameN classnameNjj)}j]j)}jj sb c.counter_addasbuh1hhj ubj)}(h h]h }(hj8!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubjd)}(hjuh]h*}(hjF!hhhNhNubah}(h]h ]joah"]h$]h&]uh1jchj ubj)}(hcounterh]hcounter}(hjS!hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj ubah}(h]h ]h"]h$]h&]hhuh1jhj hhhj hKubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj hhhj hKubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj hKhj hhubj )}(hhh]h)}(h"complete registration of a counterh]h"complete registration of a counter}(hj}!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKhjz!hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj hKubeh}(h]h ](j<functioneh"]h$]h&]jAj<jBj!jCj!jDjEjFuh1jhhhjhNhNubjH)}(h**Parameters** ``struct counter_device *counter`` the counter to add **Description** This is part two of counter registration. If this succeeds, call counter_unregister() to get rid of the counter_device again.h](h)}(h**Parameters**h]jR)}(hj!h]h Parameters}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj!ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKhj!ubj)}(hhh]j)}(h6``struct counter_device *counter`` the counter to add h](j)}(h"``struct counter_device *counter``h]j)}(hj!h]hstruct counter_device *counter}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj!ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKhj!ubj)}(hhh]h)}(hthe counter to addh]hthe counter to add}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!hKhj!ubah}(h]h ]h"]h$]h&]uh1jhj!ubeh}(h]h ]h"]h$]h&]uh1jhj!hKhj!ubah}(h]h ]h"]h$]h&]uh1jhj!ubh)}(h**Description**h]jR)}(hj!h]h Description}(hj!hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj!ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKhj!ubh)}(h)This is part two of counter registration.h]h)This is part two of counter registration.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKhj!ubh)}(hSIf this succeeds, call counter_unregister() to get rid of the counter_device again.h]hSIf this succeeds, call counter_unregister() to get rid of the counter_device again.}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKhj!ubeh}(h]h ] kernelindentah"]h$]h&]uh1jGhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jcounter_unregister (C function)c.counter_unregisterhNtauh1jhjhhhNhNubj)}(hhh](j)}(h>void counter_unregister (struct counter_device *const counter)h]j)}(h=void counter_unregister(struct counter_device *const counter)h](jD)}(hvoidh]hvoid}(hjM"hhhNhNubah}(h]h ]jPah"]h$]h&]uh1jChjI"hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKubj)}(h h]h }(hj\"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjI"hhhj["hKubj)}(hcounter_unregisterh]j)}(hcounter_unregisterh]hcounter_unregister}(hjn"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjj"ubah}(h]h ](jjeh"]h$]h&]hhuh1jhjI"hhhj["hKubj)}(h&(struct counter_device *const counter)h]j)}(h$struct counter_device *const counterh](j)}(hjh]hstruct}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubj)}(h h]h }(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubh)}(hhh]j)}(hcounter_deviceh]hcounter_device}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubah}(h]h ]h"]h$]h&] refdomainj<reftypej reftargetj"modnameN classnameNjj)}j]j)}jjp"sbc.counter_unregisterasbuh1hhj"ubj)}(h h]h }(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubjd)}(hjuh]h*}(hj"hhhNhNubah}(h]h ]joah"]h$]h&]uh1jchj"ubj)}(hjh]hconst}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubj)}(h h]h }(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubj)}(hcounterh]hcounter}(hj"hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj"ubah}(h]h ]h"]h$]h&]hhuh1jhjI"hhhj["hKubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjE"hhhj["hKubah}(h]j@"ah ](jjeh"]h$]h&]jj)jhuh1jhj["hKhjB"hhubj )}(hhh]h)}(h"unregister Counter from the systemh]h"unregister Counter from the system}(hj(#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKhj%#hhubah}(h]h ]h"]h$]h&]uh1jhjB"hhhj["hKubeh}(h]h ](j<functioneh"]h$]h&]jAj<jBj@#jCj@#jDjEjFuh1jhhhjhNhNubjH)}(h**Parameters** ``struct counter_device *const counter`` pointer to Counter to unregister **Description** The Counter is unregistered from the system.h](h)}(h**Parameters**h]jR)}(hjJ#h]h Parameters}(hjL#hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjH#ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKhjD#ubj)}(hhh]j)}(hJ``struct counter_device *const counter`` pointer to Counter to unregister h](j)}(h(``struct counter_device *const counter``h]j)}(hji#h]h$struct counter_device *const counter}(hjk#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjg#ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKhjc#ubj)}(hhh]h)}(h pointer to Counter to unregisterh]h pointer to Counter to unregister}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj~#hKhj#ubah}(h]h ]h"]h$]h&]uh1jhjc#ubeh}(h]h ]h"]h$]h&]uh1jhj~#hKhj`#ubah}(h]h ]h"]h$]h&]uh1jhjD#ubh)}(h**Description**h]jR)}(hj#h]h Description}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj#ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKhjD#ubh)}(h,The Counter is unregistered from the system.h]h,The Counter is unregistered from the system.}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKhjD#ubeh}(h]h ] kernelindentah"]h$]h&]uh1jGhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdevm_counter_alloc (C function)c.devm_counter_allochNtauh1jhjhhhNhNubj)}(hhh](j)}(hSstruct counter_device * devm_counter_alloc (struct device *dev, size_t sizeof_priv)h]j)}(hQstruct counter_device *devm_counter_alloc(struct device *dev, size_t sizeof_priv)h](j)}(hjh]hstruct}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKubj)}(h h]h }(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#hhhj#hKubh)}(hhh]j)}(hcounter_deviceh]hcounter_device}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&] refdomainj<reftypej reftargetj $modnameN classnameNjj)}j]j)}jdevm_counter_allocsbc.devm_counter_allocasbuh1hhj#hhhj#hKubj)}(h h]h }(hj)$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj#hhhj#hKubjd)}(hjuh]h*}(hj7$hhhNhNubah}(h]h ]joah"]h$]h&]uh1jchj#hhhj#hKubj)}(hdevm_counter_alloch]j)}(hj&$h]hdevm_counter_alloc}(hjH$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjD$ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj#hhhj#hKubj)}(h((struct device *dev, size_t sizeof_priv)h](j)}(hstruct device *devh](j)}(hjh]hstruct}(hjc$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_$ubj)}(h h]h }(hjp$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&] refdomainj<reftypej reftargetj$modnameN classnameNjj)}j]j$$c.devm_counter_allocasbuh1hhj_$ubj)}(h h]h }(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_$ubjd)}(hjuh]h*}(hj$hhhNhNubah}(h]h ]joah"]h$]h&]uh1jchj_$ubj)}(hdevh]hdev}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_$ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj[$ubj)}(hsize_t sizeof_privh](h)}(hhh]j)}(hsize_th]hsize_t}(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubah}(h]h ]h"]h$]h&] refdomainj<reftypej reftargetj$modnameN classnameNjj)}j]j$$c.devm_counter_allocasbuh1hhj$ubj)}(h h]h }(hj$hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubj)}(h sizeof_privh]h sizeof_priv}(hj%hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj$ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj[$ubeh}(h]h ]h"]h$]h&]hhuh1jhj#hhhj#hKubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj#hhhj#hKubah}(h]j#ah ](jjeh"]h$]h&]jj)jhuh1jhj#hKhj#hhubj )}(hhh]h)}(hallocate a counter_deviceh]hallocate a counter_device}(hj,%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKhj)%hhubah}(h]h ]h"]h$]h&]uh1jhj#hhhj#hKubeh}(h]h ](j<functioneh"]h$]h&]jAj<jBjD%jCjD%jDjEjFuh1jhhhjhNhNubjH)}(hX**Parameters** ``struct device *dev`` the device to register the release callback for ``size_t sizeof_priv`` size of the driver private data **Description** This is the device managed version of counter_add(). It registers a cleanup callback to care for calling counter_put().h](h)}(h**Parameters**h]jR)}(hjN%h]h Parameters}(hjP%hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhjL%ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKhjH%ubj)}(hhh](j)}(hG``struct device *dev`` the device to register the release callback for h](j)}(h``struct device *dev``h]j)}(hjm%h]hstruct device *dev}(hjo%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjk%ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKhjg%ubj)}(hhh]h)}(h/the device to register the release callback forh]h/the device to register the release callback for}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hKhj%ubah}(h]h ]h"]h$]h&]uh1jhjg%ubeh}(h]h ]h"]h$]h&]uh1jhj%hKhjd%ubj)}(h7``size_t sizeof_priv`` size of the driver private data h](j)}(h``size_t sizeof_priv``h]j)}(hj%h]hsize_t sizeof_priv}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj%ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKhj%ubj)}(hhh]h)}(hsize of the driver private datah]hsize of the driver private data}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj%hKhj%ubah}(h]h ]h"]h$]h&]uh1jhj%ubeh}(h]h ]h"]h$]h&]uh1jhj%hKhjd%ubeh}(h]h ]h"]h$]h&]uh1jhjH%ubh)}(h**Description**h]jR)}(hj%h]h Description}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj%ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKhjH%ubh)}(hwThis is the device managed version of counter_add(). It registers a cleanup callback to care for calling counter_put().h]hwThis is the device managed version of counter_add(). It registers a cleanup callback to care for calling counter_put().}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKhjH%ubeh}(h]h ] kernelindentah"]h$]h&]uh1jGhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jdevm_counter_add (C function)c.devm_counter_addhNtauh1jhjhhhNhNubj)}(hhh](j)}(hOint devm_counter_add (struct device *dev, struct counter_device *const counter)h]j)}(hNint devm_counter_add(struct device *dev, struct counter_device *const counter)h](jD)}(hinth]hint}(hj&&hhhNhNubah}(h]h ]jPah"]h$]h&]uh1jChj"&hhhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKubj)}(h h]h }(hj5&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj"&hhhj4&hKubj)}(hdevm_counter_addh]j)}(hdevm_counter_addh]hdevm_counter_add}(hjG&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjC&ubah}(h]h ](jjeh"]h$]h&]hhuh1jhj"&hhhj4&hKubj)}(h:(struct device *dev, struct counter_device *const counter)h](j)}(hstruct device *devh](j)}(hjh]hstruct}(hjc&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_&ubj)}(h h]h }(hjp&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&] refdomainj<reftypej reftargetj&modnameN classnameNjj)}j]j)}jjI&sbc.devm_counter_addasbuh1hhj_&ubj)}(h h]h }(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_&ubjd)}(hjuh]h*}(hj&hhhNhNubah}(h]h ]joah"]h$]h&]uh1jchj_&ubj)}(hdevh]hdev}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj_&ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj[&ubj)}(h$struct counter_device *const counterh](j)}(hjh]hstruct}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj)}(h h]h }(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubh)}(hhh]j)}(hcounter_deviceh]hcounter_device}(hj&hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubah}(h]h ]h"]h$]h&] refdomainj<reftypej reftargetj&modnameN classnameNjj)}j]j&c.devm_counter_addasbuh1hhj&ubj)}(h h]h }(hj'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubjd)}(hjuh]h*}(hj'hhhNhNubah}(h]h ]joah"]h$]h&]uh1jchj&ubj)}(hjh]hconst}(hj,'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj)}(h h]h }(hj9'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubj)}(hcounterh]hcounter}(hjG'hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj&ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj[&ubeh}(h]h ]h"]h$]h&]hhuh1jhj"&hhhj4&hKubeh}(h]h ]h"]h$]h&]hhjuh1jjjhj&hhhj4&hKubah}(h]j&ah ](jjeh"]h$]h&]jj)jhuh1jhj4&hKhj&hhubj )}(hhh]h)}(h"complete registration of a counterh]h"complete registration of a counter}(hjq'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKhjn'hhubah}(h]h ]h"]h$]h&]uh1jhj&hhhj4&hKubeh}(h]h ](j<functioneh"]h$]h&]jAj<jBj'jCj'jDjEjFuh1jhhhjhNhNubjH)}(hX(**Parameters** ``struct device *dev`` the device to register the release callback for ``struct counter_device *const counter`` the counter to add **Description** This is the device managed version of counter_add(). It registers a cleanup callback to care for calling counter_unregister().h](h)}(h**Parameters**h]jR)}(hj'h]h Parameters}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj'ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKhj'ubj)}(hhh](j)}(hG``struct device *dev`` the device to register the release callback for h](j)}(h``struct device *dev``h]j)}(hj'h]hstruct device *dev}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKhj'ubj)}(hhh]h)}(h/the device to register the release callback forh]h/the device to register the release callback for}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj'hKhj'ubah}(h]h ]h"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]uh1jhj'hKhj'ubj)}(h<``struct counter_device *const counter`` the counter to add h](j)}(h(``struct counter_device *const counter``h]j)}(hj'h]h$struct counter_device *const counter}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj'ubah}(h]h ]h"]h$]h&]uh1jhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKhj'ubj)}(hhh]h)}(hthe counter to addh]hthe counter to add}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hKhj(ubah}(h]h ]h"]h$]h&]uh1jhj'ubeh}(h]h ]h"]h$]h&]uh1jhj(hKhj'ubeh}(h]h ]h"]h$]h&]uh1jhj'ubh)}(h**Description**h]jR)}(hj&(h]h Description}(hj((hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj$(ubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKhj'ubh)}(h~This is the device managed version of counter_add(). It registers a cleanup callback to care for calling counter_unregister().h]h~This is the device managed version of counter_add(). It registers a cleanup callback to care for calling counter_unregister().}(hj<(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.chKhj'ubeh}(h]h ] kernelindentah"]h$]h&]uh1jGhjhhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jcounter_push_event (C function)c.counter_push_eventhNtauh1jhjhhhNhNubj)}(hhh](j)}(h`void counter_push_event (struct counter_device *const counter, const u8 event, const u8 channel)h]j)}(h_void counter_push_event(struct counter_device *const counter, const u8 event, const u8 channel)h](jD)}(hvoidh]hvoid}(hjk(hhhNhNubah}(h]h ]jPah"]h$]h&]uh1jChjg(hhhl/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:240: ./drivers/counter/counter-chrdev.chMzubj)}(h h]h }(hjz(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjg(hhhjy(hMzubj)}(hcounter_push_eventh]j)}(hcounter_push_eventh]hcounter_push_event}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubah}(h]h ](jjeh"]h$]h&]hhuh1jhjg(hhhjy(hMzubj)}(hH(struct counter_device *const counter, const u8 event, const u8 channel)h](j)}(h$struct counter_device *const counterh](j)}(hjh]hstruct}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj)}(h h]h }(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubh)}(hhh]j)}(hcounter_deviceh]hcounter_device}(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubah}(h]h ]h"]h$]h&] refdomainj<reftypej reftargetj(modnameN classnameNjj)}j]j)}jj(sbc.counter_push_eventasbuh1hhj(ubj)}(h h]h }(hj(hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubjd)}(hjuh]h*}(hj(hhhNhNubah}(h]h ]joah"]h$]h&]uh1jchj(ubj)}(hjh]hconst}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj)}(h h]h }(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubj)}(hcounterh]hcounter}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj(ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj(ubj)}(hconst u8 eventh](j)}(hjh]hconst}(hj5)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1)ubj)}(h h]h }(hjB)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1)ubh)}(hhh]j)}(hu8h]hu8}(hjS)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjP)ubah}(h]h ]h"]h$]h&] refdomainj<reftypej reftargetjU)modnameN classnameNjj)}j]j(c.counter_push_eventasbuh1hhj1)ubj)}(h h]h }(hjq)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1)ubj)}(heventh]hevent}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj1)ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj(ubj)}(hconst u8 channelh](j)}(hjh]hconst}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj)}(h h]h }(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubh)}(hhh]j)}(hu8h]hu8}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubah}(h]h ]h"]h$]h&] refdomainj<reftypej reftargetj)modnameN classnameNjj)}j]j(c.counter_push_eventasbuh1hhj)ubj)}(h h]h }(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubj)}(hchannelh]hchannel}(hj)hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj)ubeh}(h]h ]h"]h$]h&]noemphhhuh1jhj(ubeh}(h]h ]h"]h$]h&]hhuh1jhjg(hhhjy(hMzubeh}(h]h ]h"]h$]h&]hhjuh1jjjhjc(hhhjy(hMzubah}(h]j^(ah ](jjeh"]h$]h&]jj)jhuh1jhjy(hMzhj`(hhubj )}(hhh]h)}(h!queue event for userspace readingh]h!queue event for userspace reading}(hj *hhhNhNubah}(h]h ]h"]h$]h&]uh1hhl/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:240: ./drivers/counter/counter-chrdev.chMrhj *hhubah}(h]h ]h"]h$]h&]uh1jhj`(hhhjy(hMzubeh}(h]h ](j<functioneh"]h$]h&]jAj<jBj$*jCj$*jDjEjFuh1jhhhjhNhNubjH)}(h**Parameters** ``struct counter_device *const counter`` pointer to Counter structure ``const u8 event`` triggered event ``const u8 channel`` event channel **Note** If no one is watching for the respective event, it is silently discarded.h](h)}(h**Parameters**h]jR)}(hj.*h]h Parameters}(hj0*hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj,*ubah}(h]h ]h"]h$]h&]uh1hhl/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:240: ./drivers/counter/counter-chrdev.chMvhj(*ubj)}(hhh](j)}(hF``struct counter_device *const counter`` pointer to Counter structure h](j)}(h(``struct counter_device *const counter``h]j)}(hjM*h]h$struct counter_device *const counter}(hjO*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjK*ubah}(h]h ]h"]h$]h&]uh1jhl/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:240: ./drivers/counter/counter-chrdev.chMshjG*ubj)}(hhh]h)}(hpointer to Counter structureh]hpointer to Counter structure}(hjf*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjb*hMshjc*ubah}(h]h ]h"]h$]h&]uh1jhjG*ubeh}(h]h ]h"]h$]h&]uh1jhjb*hMshjD*ubj)}(h#``const u8 event`` triggered event h](j)}(h``const u8 event``h]j)}(hj*h]hconst u8 event}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jhl/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:240: ./drivers/counter/counter-chrdev.chMthj*ubj)}(hhh]h)}(htriggered eventh]htriggered event}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hMthj*ubah}(h]h ]h"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]uh1jhj*hMthjD*ubj)}(h#``const u8 channel`` event channel h](j)}(h``const u8 channel``h]j)}(hj*h]hconst u8 channel}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj*ubah}(h]h ]h"]h$]h&]uh1jhl/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:240: ./drivers/counter/counter-chrdev.chMuhj*ubj)}(hhh]h)}(h event channelh]h event channel}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj*hMuhj*ubah}(h]h ]h"]h$]h&]uh1jhj*ubeh}(h]h ]h"]h$]h&]uh1jhj*hMuhjD*ubeh}(h]h ]h"]h$]h&]uh1jhj(*ubh)}(h**Note**h]jR)}(hj*h]hNote}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1jQhj*ubah}(h]h ]h"]h$]h&]uh1hhl/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:240: ./drivers/counter/counter-chrdev.chMwhj(*ubh)}(hIIf no one is watching for the respective event, it is silently discarded.h]hIIf no one is watching for the respective event, it is silently discarded.}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhl/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:240: ./drivers/counter/counter-chrdev.chMwhj(*ubeh}(h]h ] kernelindentah"]h$]h&]uh1jGhjhhhNhNubeh}(h] driver-apiah ]h"] driver apiah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hDriver Implementationh]hDriver Implementation}(hj1+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.+hhhhhKubh)}(hXTo support a counter device, a driver must first allocate the available Counter Signals via counter_signal structures. These Signals should be stored as an array and set to the signals array member of an allocated counter_device structure before the Counter is registered to the system.h]hXTo support a counter device, a driver must first allocate the available Counter Signals via counter_signal structures. These Signals should be stored as an array and set to the signals array member of an allocated counter_device structure before the Counter is registered to the system.}(hj?+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj.+hhubh)}(hXCounter Counts may be allocated via counter_count structures, and respective Counter Signal associations (Synapses) made via counter_synapse structures. Associated counter_synapse structures are stored as an array and set to the synapses array member of the respective counter_count structure. These counter_count structures are set to the counts array member of an allocated counter_device structure before the Counter is registered to the system.h]hXCounter Counts may be allocated via counter_count structures, and respective Counter Signal associations (Synapses) made via counter_synapse structures. Associated counter_synapse structures are stored as an array and set to the synapses array member of the respective counter_count structure. These counter_count structures are set to the counts array member of an allocated counter_device structure before the Counter is registered to the system.}(hjM+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj.+hhubh)}(hDriver callbacks must be provided to the counter_device structure in order to communicate with the device: to read and write various Signals and Counts, and to set and get the "action mode" and "function mode" for various Synapses and Counts respectively.h]hXDriver callbacks must be provided to the counter_device structure in order to communicate with the device: to read and write various Signals and Counts, and to set and get the “action mode” and “function mode” for various Synapses and Counts respectively.}(hj[+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj.+hhubh)}(hX2A counter_device structure is allocated using counter_alloc() and then registered to the system by passing it to the counter_add() function, and unregistered by passing it to the counter_unregister function. There are device managed variants of these functions: devm_counter_alloc() and devm_counter_add().h]hX2A counter_device structure is allocated using counter_alloc() and then registered to the system by passing it to the counter_add() function, and unregistered by passing it to the counter_unregister function. There are device managed variants of these functions: devm_counter_alloc() and devm_counter_add().}(hji+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hj.+hhubh)}(hiThe struct counter_comp structure is used to define counter extensions for Signals, Synapses, and Counts.h]hiThe struct counter_comp structure is used to define counter extensions for Signals, Synapses, and Counts.}(hjw+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj.+hhubh)}(hX The "type" member specifies the type of high-level data (e.g. BOOL, COUNT_DIRECTION, etc.) handled by this extension. The "``*_read``" and "``*_write``" members can then be set by the counter device driver with callbacks to handle that data using native C data types (i.e. u8, u64, etc.).h](hThe “type” member specifies the type of high-level data (e.g. BOOL, COUNT_DIRECTION, etc.) handled by this extension. The “}(hj+hhhNhNubj)}(h ``*_read``h]h*_read}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubh ” and “}(hj+hhhNhNubj)}(h ``*_write``h]h*_write}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubh” members can then be set by the counter device driver with callbacks to handle that data using native C data types (i.e. u8, u64, etc.).}(hj+hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj.+hhubh)}(hX^Convenience macros such as ``COUNTER_COMP_COUNT_U64`` are provided for use by driver authors. In particular, driver authors are expected to use the provided macros for standard Counter subsystem attributes in order to maintain a consistent interface for userspace. For example, a counter device driver may define several standard attributes like so::h](hConvenience macros such as }(hj+hhhNhNubj)}(h``COUNTER_COMP_COUNT_U64``h]hCOUNTER_COMP_COUNT_U64}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubhX( are provided for use by driver authors. In particular, driver authors are expected to use the provided macros for standard Counter subsystem attributes in order to maintain a consistent interface for userspace. For example, a counter device driver may define several standard attributes like so:}(hj+hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj.+hhubj)}(hstruct counter_comp count_ext[] = { COUNTER_COMP_DIRECTION(count_direction_read), COUNTER_COMP_ENABLE(count_enable_read, count_enable_write), COUNTER_COMP_CEILING(count_ceiling_read, count_ceiling_write), };h]hstruct counter_comp count_ext[] = { COUNTER_COMP_DIRECTION(count_direction_read), COUNTER_COMP_ENABLE(count_enable_read, count_enable_write), COUNTER_COMP_CEILING(count_ceiling_read, count_ceiling_write), };}hj+sbah}(h]h ]h"]h$]h&]hhuh1jhhhMhj.+hhubh)}(hThis makes it simple to see, add, and modify the attributes that are supported by this driver ("direction", "enable", and "ceiling") and to maintain this code without getting lost in a web of struct braces.h]hThis makes it simple to see, add, and modify the attributes that are supported by this driver (“direction”, “enable”, and “ceiling”) and to maintain this code without getting lost in a web of struct braces.}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM$hj.+hhubh)}(hCallbacks must match the function type expected for the respective component or extension. These function types are defined in the struct counter_comp structure as the "``*_read``" and "``*_write``" union members.h](hCallbacks must match the function type expected for the respective component or extension. These function types are defined in the struct counter_comp structure as the “}(hj+hhhNhNubj)}(h ``*_read``h]h*_read}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubh ” and “}(hj+hhhNhNubj)}(h ``*_write``h]h*_write}(hj ,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj+ubh” union members.}(hj+hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM(hj.+hhubh)}(hkThe corresponding callback prototypes for the extensions mentioned in the previous example above would be::h]hjThe corresponding callback prototypes for the extensions mentioned in the previous example above would be:}(hj%,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM-hj.+hhubj)}(hXint count_direction_read(struct counter_device *counter, struct counter_count *count, enum counter_count_direction *direction); int count_enable_read(struct counter_device *counter, struct counter_count *count, u8 *enable); int count_enable_write(struct counter_device *counter, struct counter_count *count, u8 enable); int count_ceiling_read(struct counter_device *counter, struct counter_count *count, u64 *ceiling); int count_ceiling_write(struct counter_device *counter, struct counter_count *count, u64 ceiling);h]hXint count_direction_read(struct counter_device *counter, struct counter_count *count, enum counter_count_direction *direction); int count_enable_read(struct counter_device *counter, struct counter_count *count, u8 *enable); int count_enable_write(struct counter_device *counter, struct counter_count *count, u8 enable); int count_ceiling_read(struct counter_device *counter, struct counter_count *count, u64 *ceiling); int count_ceiling_write(struct counter_device *counter, struct counter_count *count, u64 ceiling);}hj3,sbah}(h]h ]h"]h$]h&]hhuh1jhhhM0hj.+hhubh)}(hADetermining the type of extension to create is a matter of scope.h]hADetermining the type of extension to create is a matter of scope.}(hjA,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM<hj.+hhubj )}(hhh](j%)}(hXWSignal extensions are attributes that expose information/control specific to a Signal. These types of attributes will exist under a Signal's directory in sysfs. For example, if you have an invert feature for a Signal, you can have a Signal extension called "invert" that toggles that feature: /sys/bus/counter/devices/counterX/signalY/invert h](h)}(hSignal extensions are attributes that expose information/control specific to a Signal. These types of attributes will exist under a Signal's directory in sysfs.h]hSignal extensions are attributes that expose information/control specific to a Signal. These types of attributes will exist under a Signal’s directory in sysfs.}(hjV,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM>hjR,ubh)}(hFor example, if you have an invert feature for a Signal, you can have a Signal extension called "invert" that toggles that feature: /sys/bus/counter/devices/counterX/signalY/inverth]hFor example, if you have an invert feature for a Signal, you can have a Signal extension called “invert” that toggles that feature: /sys/bus/counter/devices/counterX/signalY/invert}(hjd,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMBhjR,ubeh}(h]h ]h"]h$]h&]uh1j$hjO,hhhhhNubj%)}(hXQCount extensions are attributes that expose information/control specific to a Count. These type of attributes will exist under a Count's directory in sysfs. For example, if you want to pause/unpause a Count from updating, you can have a Count extension called "enable" that toggles such: /sys/bus/counter/devices/counterX/countY/enable h](h)}(hCount extensions are attributes that expose information/control specific to a Count. These type of attributes will exist under a Count's directory in sysfs.h]hCount extensions are attributes that expose information/control specific to a Count. These type of attributes will exist under a Count’s directory in sysfs.}(hj|,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMFhjx,ubh)}(hFor example, if you want to pause/unpause a Count from updating, you can have a Count extension called "enable" that toggles such: /sys/bus/counter/devices/counterX/countY/enableh]hFor example, if you want to pause/unpause a Count from updating, you can have a Count extension called “enable” that toggles such: /sys/bus/counter/devices/counterX/countY/enable}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMJhjx,ubeh}(h]h ]h"]h$]h&]uh1j$hjO,hhhhhNubj%)}(hXDevice extensions are attributes that expose information/control non-specific to a particular Count or Signal. This is where you would put your global features or other miscellaneous functionality. For example, if your device has an overtemp sensor, you can report the chip overheated via a device extension called "error_overtemp": /sys/bus/counter/devices/counterX/error_overtemp h](h)}(hDevice extensions are attributes that expose information/control non-specific to a particular Count or Signal. This is where you would put your global features or other miscellaneous functionality.h]hDevice extensions are attributes that expose information/control non-specific to a particular Count or Signal. This is where you would put your global features or other miscellaneous functionality.}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMNhj,ubh)}(hFor example, if your device has an overtemp sensor, you can report the chip overheated via a device extension called "error_overtemp": /sys/bus/counter/devices/counterX/error_overtemph]hFor example, if your device has an overtemp sensor, you can report the chip overheated via a device extension called “error_overtemp”: /sys/bus/counter/devices/counterX/error_overtemp}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMRhj,ubeh}(h]h ]h"]h$]h&]uh1j$hjO,hhhhhNubeh}(h]h ]h"]h$]h&]jtjuuh1jhhhM>hj.+hhubeh}(h]driver-implementationah ]h"]driver implementationah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hSubsystem Architectureh]hSubsystem Architecture}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj,hhhhhMWubh)}(hX7Counter drivers pass and take data natively (i.e. ``u8``, ``u64``, etc.) and the shared counter module handles the translation between the sysfs interface. This guarantees a standard userspace interface for all counter drivers, and enables a Generic Counter chrdev interface via a generalized device driver ABI.h](h2Counter drivers pass and take data natively (i.e. }(hj,hhhNhNubj)}(h``u8``h]hu8}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubh, }(hj,hhhNhNubj)}(h``u64``h]hu64}(hj,hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj,ubh, etc.) and the shared counter module handles the translation between the sysfs interface. This guarantees a standard userspace interface for all counter drivers, and enables a Generic Counter chrdev interface via a generalized device driver ABI.}(hj,hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMYhj,hhubh)}(hA high-level view of how a count value is passed down from a counter driver is exemplified by the following. The driver callbacks are first registered to the Counter core component for use by the Counter userspace interface components::h]hA high-level view of how a count value is passed down from a counter driver is exemplified by the following. The driver callbacks are first registered to the Counter core component for use by the Counter userspace interface components:}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM_hj,hhubj)}(hXDriver callbacks registration: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +----------------------------+ | Counter device driver | +----------------------------+ | Processes data from device | +----------------------------+ | ------------------- / driver callbacks / ------------------- | V +----------------------+ | Counter core | +----------------------+ | Routes device driver | | callbacks to the | | userspace interfaces | +----------------------+ | ------------------- / driver callbacks / ------------------- | +---------------+---------------+ | | V V +--------------------+ +---------------------+ | Counter sysfs | | Counter chrdev | +--------------------+ +---------------------+ | Translates to the | | Translates to the | | standard Counter | | standard Counter | | sysfs output | | character device | +--------------------+ +---------------------+h]hXDriver callbacks registration: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +----------------------------+ | Counter device driver | +----------------------------+ | Processes data from device | +----------------------------+ | ------------------- / driver callbacks / ------------------- | V +----------------------+ | Counter core | +----------------------+ | Routes device driver | | callbacks to the | | userspace interfaces | +----------------------+ | ------------------- / driver callbacks / ------------------- | +---------------+---------------+ | | V V +--------------------+ +---------------------+ | Counter sysfs | | Counter chrdev | +--------------------+ +---------------------+ | Translates to the | | Translates to the | | standard Counter | | standard Counter | | sysfs output | | character device | +--------------------+ +---------------------+}hj#-sbah}(h]h ]h"]h$]h&]hhuh1jhhhMdhj,hhubh)}(hpThereafter, data can be transferred directly between the Counter device driver and Counter userspace interface::h]hoThereafter, data can be transferred directly between the Counter device driver and Counter userspace interface:}(hj1-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj,hhubj)}(hX Count data request: ~~~~~~~~~~~~~~~~~~~ ---------------------- / Counter device \ +----------------------+ | Count register: 0x28 | +----------------------+ | ----------------- / raw count data / ----------------- | V +----------------------------+ | Counter device driver | +----------------------------+ | Processes data from device | |----------------------------| | Type: u64 | | Value: 42 | +----------------------------+ | ---------- / u64 / ---------- | +---------------+---------------+ | | V V +--------------------+ +---------------------+ | Counter sysfs | | Counter chrdev | +--------------------+ +---------------------+ | Translates to the | | Translates to the | | standard Counter | | standard Counter | | sysfs output | | character device | |--------------------| |---------------------| | Type: const char * | | Type: u64 | | Value: "42" | | Value: 42 | +--------------------+ +---------------------+ | | --------------- ----------------------- / const char * / / struct counter_event / --------------- ----------------------- | | | V | +-----------+ | | read | | +-----------+ | \ Count: 42 / | ----------- | V +--------------------------------------------------+ | `/sys/bus/counter/devices/counterX/countY/count` | +--------------------------------------------------+ \ Count: "42" / --------------------------------------------------h]hX Count data request: ~~~~~~~~~~~~~~~~~~~ ---------------------- / Counter device \ +----------------------+ | Count register: 0x28 | +----------------------+ | ----------------- / raw count data / ----------------- | V +----------------------------+ | Counter device driver | +----------------------------+ | Processes data from device | |----------------------------| | Type: u64 | | Value: 42 | +----------------------------+ | ---------- / u64 / ---------- | +---------------+---------------+ | | V V +--------------------+ +---------------------+ | Counter sysfs | | Counter chrdev | +--------------------+ +---------------------+ | Translates to the | | Translates to the | | standard Counter | | standard Counter | | sysfs output | | character device | |--------------------| |---------------------| | Type: const char * | | Type: u64 | | Value: "42" | | Value: 42 | +--------------------+ +---------------------+ | | --------------- ----------------------- / const char * / / struct counter_event / --------------- ----------------------- | | | V | +-----------+ | | read | | +-----------+ | \ Count: 42 / | ----------- | V +--------------------------------------------------+ | `/sys/bus/counter/devices/counterX/countY/count` | +--------------------------------------------------+ \ Count: "42" / --------------------------------------------------}hj?-sbah}(h]h ]h"]h$]h&]hhuh1jhhhMhj,hhubh)}(h+There are four primary components involved:h]h+There are four primary components involved:}(hjM-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj,hhubh)}(hhh](h)}(hCounter device driverh]hCounter device driver}(hj^-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj[-hhhhhMubh)}(htCommunicates with the hardware device to read/write data; e.g. counter drivers for quadrature encoders, timers, etc.h]htCommunicates with the hardware device to read/write data; e.g. counter drivers for quadrature encoders, timers, etc.}(hjl-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj[-hhubeh}(h]counter-device-driverah ]h"]counter device driverah$]h&]uh1hhj,hhhhhMubh)}(hhh](h)}(h Counter coreh]h Counter core}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hhhhhMubh)}(h{Registers the counter device driver to the system so that the respective callbacks are called during userspace interaction.h]h{Registers the counter device driver to the system so that the respective callbacks are called during userspace interaction.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj-hhubeh}(h] counter-coreah ]h"] counter coreah$]h&]uh1hhj,hhhhhMubh)}(hhh](h)}(h Counter sysfsh]h Counter sysfs}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hhhhhMubh)}(hVTranslates counter data to the standard Counter sysfs interface format and vice versa.h]hVTranslates counter data to the standard Counter sysfs interface format and vice versa.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj-hhubh)}(hPlease refer to the Documentation/ABI/testing/sysfs-bus-counter file for a detailed breakdown of the available Generic Counter interface sysfs attributes.h]hPlease refer to the Documentation/ABI/testing/sysfs-bus-counter file for a detailed breakdown of the available Generic Counter interface sysfs attributes.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj-hhubeh}(h] counter-sysfsah ]h"] counter sysfsah$]h&]uh1hhj,hhhhhMubh)}(hhh](h)}(hCounter chrdevh]hCounter chrdev}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-hhhhhMubh)}(hTranslates Counter events to the standard Counter character device; data is transferred via standard character device read calls, while Counter events are configured via ioctl calls.h]hTranslates Counter events to the standard Counter character device; data is transferred via standard character device read calls, while Counter events are configured via ioctl calls.}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj-hhubeh}(h]counter-chrdevah ]h"]counter chrdevah$]h&]uh1hhj,hhhhhMubeh}(h]subsystem-architectureah ]h"]subsystem architectureah$]h&]uh1hhhhhhhhMWubh)}(hhh](h)}(hSysfs Interfaceh]hSysfs Interface}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj .hhhhhMubh)}(hXESeveral sysfs attributes are generated by the Generic Counter interface, and reside under the ``/sys/bus/counter/devices/counterX`` directory, where ``X`` is to the respective counter device id. Please see Documentation/ABI/testing/sysfs-bus-counter for detailed information on each Generic Counter interface sysfs attribute.h](h^Several sysfs attributes are generated by the Generic Counter interface, and reside under the }(hj.hhhNhNubj)}(h%``/sys/bus/counter/devices/counterX``h]h!/sys/bus/counter/devices/counterX}(hj&.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubh directory, where }(hj.hhhNhNubj)}(h``X``h]hX}(hj8.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubh is to the respective counter device id. Please see Documentation/ABI/testing/sysfs-bus-counter for detailed information on each Generic Counter interface sysfs attribute.}(hj.hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj .hhubh)}(hThrough these sysfs attributes, programs and scripts may interact with the Generic Counter paradigm Counts, Signals, and Synapses of respective counter devices.h]hThrough these sysfs attributes, programs and scripts may interact with the Generic Counter paradigm Counts, Signals, and Synapses of respective counter devices.}(hjP.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj .hhubeh}(h]sysfs-interfaceah ]h"]sysfs interfaceah$]h&]uh1hhhhhhhhMubh)}(hhh](h)}(hCounter Character Deviceh]hCounter Character Device}(hji.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjf.hhhhhMubh)}(hCounter character device nodes are created under the ``/dev`` directory as ``counterX``, where ``X`` is the respective counter device id. Defines for the standard Counter data types are exposed via the userspace ``include/uapi/linux/counter.h`` file.h](h5Counter character device nodes are created under the }(hjw.hhhNhNubj)}(h``/dev``h]h/dev}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjw.ubh directory as }(hjw.hhhNhNubj)}(h ``counterX``h]hcounterX}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjw.ubh, where }(hjw.hhhNhNubj)}(h``X``h]hX}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjw.ubhp is the respective counter device id. Defines for the standard Counter data types are exposed via the userspace }(hjw.hhhNhNubj)}(h ``include/uapi/linux/counter.h``h]hinclude/uapi/linux/counter.h}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjw.ubh file.}(hjw.hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhjf.hhubh)}(hhh](h)}(hCounter eventsh]hCounter events}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.hhhhhMubh)}(hdCounter device drivers can support Counter events by utilizing the ``counter_push_event`` function::h](hCCounter device drivers can support Counter events by utilizing the }(hj.hhhNhNubj)}(h``counter_push_event``h]hcounter_push_event}(hj.hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj.ubh function:}(hj.hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj.hhubj)}(hxvoid counter_push_event(struct counter_device *const counter, const u8 event, const u8 channel);h]hxvoid counter_push_event(struct counter_device *const counter, const u8 event, const u8 channel);}hj.sbah}(h]h ]h"]h$]h&]hhuh1jhhhMhj.hhubh)}(hX*The event id is specified by the ``event`` parameter; the event channel id is specified by the ``channel`` parameter. When this function is called, the Counter data associated with the respective event is gathered, and a ``struct counter_event`` is generated for each datum and pushed to userspace.h](h!The event id is specified by the }(hj /hhhNhNubj)}(h ``event``h]hevent}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj /ubh5 parameter; the event channel id is specified by the }(hj /hhhNhNubj)}(h ``channel``h]hchannel}(hj&/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj /ubhs parameter. When this function is called, the Counter data associated with the respective event is gathered, and a }(hj /hhhNhNubj)}(h``struct counter_event``h]hstruct counter_event}(hj8/hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj /ubh5 is generated for each datum and pushed to userspace.}(hj /hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj.hhubh)}(hCounter events can be configured by users to report various Counter data of interest. This can be conceptualized as a list of Counter component read calls to perform. For example:h]hCounter events can be configured by users to report various Counter data of interest. This can be conceptualized as a list of Counter component read calls to perform. For example:}(hjP/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj.hhubh block_quote)}(hX +------------------------+------------------------+ | COUNTER_EVENT_OVERFLOW | COUNTER_EVENT_INDEX | +========================+========================+ | Channel 0 | Channel 0 | +------------------------+------------------------+ | * Count 0 | * Signal 0 | | * Count 1 | * Signal 0 Extension 0 | | * Signal 3 | * Extension 4 | | * Count 4 Extension 2 +------------------------+ | * Signal 5 Extension 0 | Channel 1 | | +------------------------+ | | * Signal 4 | | | * Signal 4 Extension 0 | | | * Count 7 | +------------------------+------------------------+ h]htable)}(hhh]htgroup)}(hhh](hcolspec)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jn/hjk/ubjo/)}(hhh]h}(h]h ]h"]h$]h&]colwidthKuh1jn/hjk/ubhthead)}(hhh]hrow)}(hhh](hentry)}(hhh]h)}(hCOUNTER_EVENT_OVERFLOWh]hCOUNTER_EVENT_OVERFLOW}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj/ubah}(h]h ]h"]h$]h&]uh1j/hj/ubj/)}(hhh]h)}(hCOUNTER_EVENT_INDEXh]hCOUNTER_EVENT_INDEX}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj/ubah}(h]h ]h"]h$]h&]uh1j/hj/ubeh}(h]h ]h"]h$]h&]uh1j/hj/ubah}(h]h ]h"]h$]h&]uh1j/hjk/ubhtbody)}(hhh](j/)}(hhh](j/)}(hhh]h)}(h Channel 0h]h Channel 0}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hj/ubah}(h]h ]h"]h$]h&]uh1j/hj/ubj/)}(hhh]h)}(h Channel 0h]h Channel 0}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hj/ubah}(h]h ]h"]h$]h&]uh1j/hj/ubeh}(h]h ]h"]h$]h&]uh1j/hj/ubj/)}(hhh](j/)}(hhh]j )}(hhh](j%)}(hCount 0h]h)}(hj0h]hCount 0}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hj0ubah}(h]h ]h"]h$]h&]uh1j$hj 0ubj%)}(hCount 1h]h)}(hj(0h]hCount 1}(hj*0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hj&0ubah}(h]h ]h"]h$]h&]uh1j$hj 0ubj%)}(hSignal 3h]h)}(hj?0h]hSignal 3}(hjA0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj=0ubah}(h]h ]h"]h$]h&]uh1j$hj 0ubj%)}(hCount 4 Extension 2h]h)}(hjV0h]hCount 4 Extension 2}(hjX0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjT0ubah}(h]h ]h"]h$]h&]uh1j$hj 0ubj%)}(hSignal 5 Extension 0 h]h)}(hSignal 5 Extension 0h]hSignal 5 Extension 0}(hjo0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjk0ubah}(h]h ]h"]h$]h&]uh1j$hj 0ubeh}(h]h ]h"]h$]h&]jtjuuh1jhhhM hj 0ubah}(h]h ]h"]h$]h&]morerowsKuh1j/hj0ubj/)}(hhh]j )}(hhh](j%)}(hSignal 0h]h)}(hj0h]hSignal 0}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hj0ubah}(h]h ]h"]h$]h&]uh1j$hj0ubj%)}(hSignal 0 Extension 0h]h)}(hj0h]hSignal 0 Extension 0}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhM hj0ubah}(h]h ]h"]h$]h&]uh1j$hj0ubj%)}(h Extension 4h]h)}(hj0h]h Extension 4}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj0ubah}(h]h ]h"]h$]h&]uh1j$hj0ubeh}(h]h ]h"]h$]h&]jtjuuh1jhhhM hj0ubah}(h]h ]h"]h$]h&]uh1j/hj0ubeh}(h]h ]h"]h$]h&]uh1j/hj/ubj/)}(hhh]j/)}(hhh]h)}(h Channel 1h]h Channel 1}(hj0hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj0ubah}(h]h ]h"]h$]h&]uh1j/hj0ubah}(h]h ]h"]h$]h&]uh1j/hj/ubj/)}(hhh]j/)}(hhh]j )}(hhh](j%)}(hSignal 4h]h)}(hj1h]hSignal 4}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj1ubah}(h]h ]h"]h$]h&]uh1j$hj1ubj%)}(hSignal 4 Extension 0h]h)}(hj/1h]hSignal 4 Extension 0}(hj11hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhj-1ubah}(h]h ]h"]h$]h&]uh1j$hj1ubj%)}(hCount 7h]h)}(hjF1h]hCount 7}(hjH1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhMhjD1ubah}(h]h ]h"]h$]h&]uh1j$hj1ubeh}(h]h ]h"]h$]h&]jtjuuh1jhhhMhj1ubah}(h]h ]h"]h$]h&]uh1j/hj 1ubah}(h]h ]h"]h$]h&]uh1j/hj/ubeh}(h]h ]h"]h$]h&]uh1j/hjk/ubeh}(h]h ]h"]h$]h&]colsKuh1ji/hjf/ubah}(h]h ]h"]h$]h&]uh1jd/hj`/ubah}(h]h ]h"]h$]h&]uh1j^/hhhMhj.hhubh)}(hXWhen ``counter_push_event(counter, COUNTER_EVENT_INDEX, 1)`` is called for example, it will go down the list for the ``COUNTER_EVENT_INDEX`` event channel 1 and execute the read callbacks for Signal 4, Signal 4 Extension 0, and Count 7 -- the data returned for each is pushed to a kfifo as a ``struct counter_event``, which userspace can retrieve via a standard read operation on the respective character device node.h](hWhen }(hj1hhhNhNubj)}(h7``counter_push_event(counter, COUNTER_EVENT_INDEX, 1)``h]h3counter_push_event(counter, COUNTER_EVENT_INDEX, 1)}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubh9 is called for example, it will go down the list for the }(hj1hhhNhNubj)}(h``COUNTER_EVENT_INDEX``h]hCOUNTER_EVENT_INDEX}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubh event channel 1 and execute the read callbacks for Signal 4, Signal 4 Extension 0, and Count 7 -- the data returned for each is pushed to a kfifo as a }(hj1hhhNhNubj)}(h``struct counter_event``h]hstruct counter_event}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubhe, which userspace can retrieve via a standard read operation on the respective character device node.}(hj1hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhMhj.hhubeh}(h]counter-eventsah ]h"]counter eventsah$]h&]uh1hhjf.hhhhhMubh)}(hhh](h)}(h Userspaceh]h Userspace}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj1hhhhhMubh)}(hUserspace applications can configure Counter events via ioctl operations on the Counter character device node. There following ioctl codes are supported and provided by the ``linux/counter.h`` userspace header file:h](hUserspace applications can configure Counter events via ioctl operations on the Counter character device node. There following ioctl codes are supported and provided by the }(hj1hhhNhNubj)}(h``linux/counter.h``h]hlinux/counter.h}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj1ubh userspace header file:}(hj1hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM hj1hhubj )}(hhh](j%)}(h#:c:macro:`COUNTER_ADD_WATCH_IOCTL` h]h)}(h":c:macro:`COUNTER_ADD_WATCH_IOCTL`h]h)}(hj 2h]j)}(hj 2h]hCOUNTER_ADD_WATCH_IOCTL}(hj2hhhNhNubah}(h]h ](xrefj<c-macroeh"]h$]h&]uh1jhj2ubah}(h]h ]h"]h$]h&]refdocdriver-api/generic-counter refdomainj<reftypemacro refexplicitrefwarnjj)}j]sb reftargetCOUNTER_ADD_WATCH_IOCTLuh1hhhhM$hj 2ubah}(h]h ]h"]h$]h&]uh1hhhhM$hj2ubah}(h]h ]h"]h$]h&]uh1j$hj2hhhhhNubj%)}(h':c:macro:`COUNTER_ENABLE_EVENTS_IOCTL` h]h)}(h&:c:macro:`COUNTER_ENABLE_EVENTS_IOCTL`h]h)}(hjD2h]j)}(hjD2h]hCOUNTER_ENABLE_EVENTS_IOCTL}(hjI2hhhNhNubah}(h]h ](j2j<c-macroeh"]h$]h&]uh1jhjF2ubah}(h]h ]h"]h$]h&]refdocj'2 refdomainj<reftypemacro refexplicitrefwarnjj-2j02COUNTER_ENABLE_EVENTS_IOCTLuh1hhhhM&hjB2ubah}(h]h ]h"]h$]h&]uh1hhhhM&hj>2ubah}(h]h ]h"]h$]h&]uh1j$hj2hhhhhNubj%)}(h(:c:macro:`COUNTER_DISABLE_EVENTS_IOCTL` h]h)}(h':c:macro:`COUNTER_DISABLE_EVENTS_IOCTL`h]h)}(hjv2h]j)}(hjv2h]hCOUNTER_DISABLE_EVENTS_IOCTL}(hj{2hhhNhNubah}(h]h ](j2j<c-macroeh"]h$]h&]uh1jhjx2ubah}(h]h ]h"]h$]h&]refdocj'2 refdomainj<reftypemacro refexplicitrefwarnjj-2j02COUNTER_DISABLE_EVENTS_IOCTLuh1hhhhM(hjt2ubah}(h]h ]h"]h$]h&]uh1hhhhM(hjp2ubah}(h]h ]h"]h$]h&]uh1j$hj2hhhhhNubeh}(h]h ]h"]h$]h&]jtjuuh1jhhhM$hj1hhubh)}(hXTo configure events to gather Counter data, users first populate a ``struct counter_watch`` with the relevant event id, event channel id, and the information for the desired Counter component from which to read, and then pass it via the ``COUNTER_ADD_WATCH_IOCTL`` ioctl command.h](hCTo configure events to gather Counter data, users first populate a }(hj2hhhNhNubj)}(h``struct counter_watch``h]hstruct counter_watch}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubh with the relevant event id, event channel id, and the information for the desired Counter component from which to read, and then pass it via the }(hj2hhhNhNubj)}(h``COUNTER_ADD_WATCH_IOCTL``h]hCOUNTER_ADD_WATCH_IOCTL}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubh ioctl command.}(hj2hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM*hj1hhubh)}(hXDNote that an event can be watched without gathering Counter data by setting the ``component.type`` member equal to ``COUNTER_COMPONENT_NONE``. With this configuration the Counter character device will simply populate the event timestamps for those respective ``struct counter_event`` elements and ignore the component value.h](hPNote that an event can be watched without gathering Counter data by setting the }(hj2hhhNhNubj)}(h``component.type``h]hcomponent.type}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubh member equal to }(hj2hhhNhNubj)}(h``COUNTER_COMPONENT_NONE``h]hCOUNTER_COMPONENT_NONE}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubhv. With this configuration the Counter character device will simply populate the event timestamps for those respective }(hj2hhhNhNubj)}(h``struct counter_event``h]hstruct counter_event}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj2ubh) elements and ignore the component value.}(hj2hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM0hj1hhubh)}(hThe ``COUNTER_ADD_WATCH_IOCTL`` command will buffer these Counter watches. When ready, the ``COUNTER_ENABLE_EVENTS_IOCTL`` ioctl command may be used to activate these Counter watches.h](hThe }(hj3hhhNhNubj)}(h``COUNTER_ADD_WATCH_IOCTL``h]hCOUNTER_ADD_WATCH_IOCTL}(hj&3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubh< command will buffer these Counter watches. When ready, the }(hj3hhhNhNubj)}(h``COUNTER_ENABLE_EVENTS_IOCTL``h]hCOUNTER_ENABLE_EVENTS_IOCTL}(hj83hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj3ubh= ioctl command may be used to activate these Counter watches.}(hj3hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM7hj1hhubh)}(hUserspace applications can then execute a ``read`` operation (optionally calling ``poll`` first) on the Counter character device node to retrieve ``struct counter_event`` elements with the desired data.h](h*Userspace applications can then execute a }(hjP3hhhNhNubj)}(h``read``h]hread}(hjX3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjP3ubh operation (optionally calling }(hjP3hhhNhNubj)}(h``poll``h]hpoll}(hjj3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjP3ubh9 first) on the Counter character device node to retrieve }(hjP3hhhNhNubj)}(h``struct counter_event``h]hstruct counter_event}(hj|3hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjP3ubh elements with the desired data.}(hjP3hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhM;hj1hhubeh}(h] userspaceah ]h"] userspaceah$]h&]uh1hhjf.hhhhhMubeh}(h]counter-character-deviceah ]h"]counter character deviceah$]h&]uh1hhhhhhhhMubeh}(h]generic-counter-interfaceah ]h"]generic counter interfaceah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksj/footnote_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_handlerj3error_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(j3j3hhjjjjjjjjjjj++j(+j,j,j .j.j-j|-j-j-j-j-j.j-jc.j`.j3j3j1j1j3j3u nametypes}(j3hjjjjjj++j,j .j-j-j-j.jc.j3j1j3uh}(j3hhhjhjjvjjjjjjj(+jjjj. j3 jjjyj~j;j@jjjjj6j;j jj j j@"jE"j#j#j&j&j^(jc(j,j.+j.j,j|-j[-j-j-j-j-j-j-j`.j .j3jf.j1j.j3j1u footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages] transformerN include_log] decorationNhhub.