€•Œsphinx.addnodes”Œdocument”“”)�”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)�”}”(hhh]”(hŒ pending_xref”“”)�”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…”�”}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ./translations/zh_CN/driver-api/generic-counter”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)�”}”(hhh]”hŒChinese (Traditional)”…”�”}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ./translations/zh_TW/driver-api/generic-counter”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ./translations/it_IT/driver-api/generic-counter”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ./translations/ja_JP/driver-api/generic-counter”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ./translations/ko_KR/driver-api/generic-counter”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒPortuguese (Brazilian)”…”�”}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ./translations/pt_BR/driver-api/generic-counter”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒSpanish”…”�”}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ./translations/sp_SP/driver-api/generic-counter”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)�”}”(hŒ SPDX-License-Identifier: GPL-2.0”h]”hŒ SPDX-License-Identifier: GPL-2.0”…”�”}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³ŒH/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter.rst”h´KubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒGeneric Counter Interface”h]”hŒGeneric Counter Interface”…”�”}”(hhÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhÊh²hh³hÇh´KubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Introduction”h]”hŒ Introduction”…”�”}”(hhàh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhÝh²hh³hÇh´KubhŒ paragraph”“”)�”}”(hXíCounter 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]”hXíCounter 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.”…”�”}”(hhðh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K hhÝh²hubeh}”(h]”Œ introduction”ah ]”h"]”Œ introduction”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒTheory”h]”hŒTheory”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjh²hh³hÇh´Kubhï)�”}”(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.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Khjh²hubhï)�”}”(hŒ-There are three core components to a counter:”h]”hŒ-There are three core components to a counter:”…”�”}”(hj%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Khjh²hubhŒ bullet_list”“”)�”}”(hhh]”(hŒ list_item”“”)�”}”(hŒ7Signal: Stream of data to be evaluated by the counter. ”h]”hï)�”}”(hŒ6Signal: Stream of data to be evaluated by the counter.”h]”hŒ6Signal: Stream of data to be evaluated by the counter.”…”�”}”(hj>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Khj:ubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hj5h²hh³hÇh´Nubj9)�”}”(hŒHSynapse: Association of a Signal, and evaluation trigger, with a Count. ”h]”hï)�”}”(hŒGSynapse: Association of a Signal, and evaluation trigger, with a Count.”h]”hŒGSynapse: Association of a Signal, and evaluation trigger, with a Count.”…”�”}”(hjVh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K hjRubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hj5h²hh³hÇh´Nubj9)�”}”(hŒ:Count: Accumulation of the effects of connected Synapses. ”h]”hï)�”}”(hŒ9Count: Accumulation of the effects of connected Synapses.”h]”hŒ9Count: Accumulation of the effects of connected Synapses.”…”�”}”(hjnh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K#hjjubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hj5h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ*”uh1j3h³hÇh´Khjh²hubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒSIGNAL”h]”hŒSIGNAL”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjŠh²hh³hÇh´K'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.”…”�”}”(hj›h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K(hjŠh²hubhï)�”}”(hŒ€When the Signal data is available for user access, the Generic Counter interface provides the following available signal values:”h]”hŒ€When the Signal data is available for user access, the Generic Counter interface provides the following available signal values:”…”�”}”(hj©h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K-hjŠh²hubj4)�”}”(hhh]”(j9)�”}”(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.”…”�”}”(hj¾h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K0hjºubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hj·h²hh³hÇh´Nubj9)�”}”(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.”…”�”}”(hjÖh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K3hjÒubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hj·h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jˆj‰uh1j3h³hÇh´K0hjŠh²hubhï)�”}”(hŒ3A Signal may be associated with one or more Counts.”h]”hŒ3A Signal may be associated with one or more Counts.”…”�”}”(hjðh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K6hjŠh²hubeh}”(h]”Œsignal”ah ]”h"]”Œsignal”ah$]”h&]”uh1hÈhjh²hh³hÇh´K'ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒSYNAPSE”h]”hŒSYNAPSE”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjh²hh³hÇh´K9ubhï)�”}”(hŒ—A Synapse represents the association of a Signal with a Count. Signal data affects respective Count data, and the Synapse represents this relationship.”h]”hŒ—A Synapse represents the association of a Signal with a Count. Signal data affects respective Count data, and the Synapse represents this relationship.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K:hjh²hubhï)�”}”(hŒáThe 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]”hŒãThe 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:”…”�”}”(hj%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K>hjh²hubj4)�”}”(hhh]”(j9)�”}”(hŒ�None: Signal does not trigger the count function. In Pulse-Direction count function mode, this Signal is evaluated as Direction. ”h]”hï)�”}”(hŒ€None: Signal does not trigger the count function. In Pulse-Direction count function mode, this Signal is evaluated as Direction.”h]”hŒ€None: Signal does not trigger the count function. In Pulse-Direction count function mode, this Signal is evaluated as Direction.”…”�”}”(hj:h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KChj6ubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hj3h²hh³hÇh´Nubj9)�”}”(hŒ2Rising Edge: Low state transitions to high state. ”h]”hï)�”}”(hŒ1Rising Edge: Low state transitions to high state.”h]”hŒ1Rising Edge: Low state transitions to high state.”…”�”}”(hjRh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KGhjNubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hj3h²hh³hÇh´Nubj9)�”}”(hŒ3Falling Edge: High state transitions to low state. ”h]”hï)�”}”(hŒ2Falling Edge: High state transitions to low state.”h]”hŒ2Falling Edge: High state transitions to low state.”…”�”}”(hjjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KJhjfubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hj3h²hh³hÇh´Nubj9)�”}”(hŒ"Both Edges: Any state transition. ”h]”hï)�”}”(hŒ!Both Edges: Any state transition.”h]”hŒ!Both Edges: Any state transition.”…”�”}”(hj‚h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KMhj~ubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hj3h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jˆj‰uh1j3h³hÇh´KChjh²hubhï)�”}”(hX¯A 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]”hX¯A 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.”…”�”}”(hjœh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KPhjh²hubhï)�”}”(hŒ/A Synapse associates one Signal with one Count.”h]”hŒ/A Synapse associates one Signal with one Count.”…”�”}”(hjªh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KXhjh²hubeh}”(h]”Œsynapse”ah ]”h"]”Œsynapse”ah$]”h&]”uh1hÈhjh²hh³hÇh´K9ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒCOUNT”h]”hŒCOUNT”…”�”}”(hjÃh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjÀh²hh³hÇh´K[ubhï)�”}”(hŒÀA 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]”hŒÀA 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.”…”�”}”(hjÑh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K\hjÀh²hubhï)�”}”(hŒ¯A 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]”hŒ¯A 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:”…”�”}”(hjßh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K`hjÀh²hubj4)�”}”(hhh]”(j9)�”}”(hŒ,Increase: Accumulated count is incremented. ”h]”hï)�”}”(hŒ+Increase: Accumulated count is incremented.”h]”hŒ+Increase: Accumulated count is incremented.”…”�”}”(hjôh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Kdhjðubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hjíh²hh³hÇh´Nubj9)�”}”(hŒ,Decrease: Accumulated count is decremented. ”h]”hï)�”}”(hŒ+Decrease: Accumulated count is decremented.”h]”hŒ+Decrease: Accumulated count is decremented.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Kghjubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hjíh²hh³hÇh´Nubj9)�”}”(hŒzPulse-Direction: Rising edges on signal A updates the respective count. The input level of signal B determines direction. ”h]”hï)�”}”(hŒyPulse-Direction: Rising edges on signal A updates the respective count. The input level of signal B determines direction.”h]”hŒyPulse-Direction: Rising edges on signal A updates the respective count. The input level of signal B determines direction.”…”�”}”(hj$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Kjhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hjíh²hh³hÇh´Nubj9)�”}”(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ï)�”}”(hŒ’Quadrature: A pair of quadrature encoding signals are evaluated to determine position and direction. The following Quadrature modes are available:”h]”hŒ’Quadrature: A pair of quadrature encoding signals are evaluated to determine position and direction. The following Quadrature modes are available:”…”�”}”(hj<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Knhj8ubj4)�”}”(hhh]”(j9)�”}”(hŒú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. ”h]”hï)�”}”(hŒù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.”h]”hŒù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.”…”�”}”(hjQh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KrhjMubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hjJubj9)�”}”(hŒú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. ”h]”hï)�”}”(hŒù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.”h]”hŒù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.”…”�”}”(hjih²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Kxhjeubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hjJubj9)�”}”(hŒƒx2 A: Any state transition on quadrature pair signal A updates the respective count. Quadrature encoding determines the direction. ”h]”hï)�”}”(hŒ‚x2 A: Any state transition on quadrature pair signal A updates the respective count. Quadrature encoding determines the direction.”h]”hŒ‚x2 A: Any state transition on quadrature pair signal A updates the respective count. Quadrature encoding determines the direction.”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K~hj}ubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hjJubj9)�”}”(hŒƒx2 B: Any state transition on quadrature pair signal B updates the respective count. Quadrature encoding determines the direction. ”h]”hï)�”}”(hŒ‚x2 B: Any state transition on quadrature pair signal B updates the respective count. Quadrature encoding determines the direction.”h]”hŒ‚x2 B: Any state transition on quadrature pair signal B updates the respective count. Quadrature encoding determines the direction.”…”�”}”(hj™h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K‚hj•ubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hjJubj9)�”}”(hŒ‡x4: Any state transition on either quadrature pair signals updates the respective count. Quadrature encoding determines the direction. ”h]”hï)�”}”(hŒ†x4: Any state transition on either quadrature pair signals updates the respective count. Quadrature encoding determines the direction.”h]”hŒ†x4: Any state transition on either quadrature pair signals updates the respective count. Quadrature encoding determines the direction.”…”�”}”(hj±h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K†hj­ubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hjJubeh}”(h]”h ]”h"]”h$]”h&]”jˆŒ-”uh1j3h³hÇh´Krhj8ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j8hjíh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jˆj‰uh1j3h³hÇh´KdhjÀh²hubhï)�”}”(hŒ5A Count has a set of one or more associated Synapses.”h]”hŒ5A Count has a set of one or more associated Synapses.”…”�”}”(hjØh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KŠhjÀh²hubeh}”(h]”Œcount”ah ]”h"]”Œcount”ah$]”h&]”uh1hÈhjh²hh³hÇh´K[ubeh}”(h]”Œtheory”ah ]”h"]”Œtheory”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒParadigm”h]”hŒParadigm”…”�”}”(hjùh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjöh²hh³hÇh´K�ubhï)�”}”(hŒâThe 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]”hŒáThe 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:”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K�hjöh²hubhŒ 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&]”hÅhÆuh1jh³hÇh´K”hjöh²hubhï)�”}”(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.”…”�”}”(hj%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Kœhjöh²hubhï)�”}”(hŒôA 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]”hŒóA 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:”…”�”}”(hj3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K¦hjöh²hubj)�”}”(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 \ | | _______ +-------------------------+”…”�”}”hjAsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jh³hÇh´K«hjöh²hubhï)�”}”(hXÑIn 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]”hXÙIn 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.”…”�”}”(hjOh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K·hjöh²hubhï)�”}”(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:”…”�”}”(hj]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K¿hjöh²hubj)�”}”(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) | | _______ +---------------------------+”…”�”}”hjksbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jh³hÇh´KÅhjöh²hubhï)�”}”(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.”…”�”}”(hjyh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KÑhjöh²hubhï)�”}”(hXÃKeep 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]”hXÃKeep 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).”…”�”}”(hj‡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KÚhjöh²hubeh}”(h]”Œparadigm”ah ]”h"]”Œparadigm”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K�ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Driver API”h]”hŒ Driver API”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj�h²hh³hÇh´Kãubhï)�”}”(hŒóDriver 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]”hŒóDriver 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.”…”�”}”(hj®h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Kåhj�h²hubhŒindex”“”)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(Œsingle”Œcounter_comp (C struct)”Œc.counter_comp”hNt”auh1j¼hj�h²hh³Nh´NubhŒdesc”“”)�”}”(hhh]”(hŒdesc_signature”“”)�”}”(hŒ counter_comp”h]”hŒdesc_signature_line”“”)�”}”(hŒstruct counter_comp”h]”(hŒdesc_sig_keyword”“”)�”}”(hŒstruct”h]”hŒstruct”…”�”}”(hjàh²hh³Nh´Nubah}”(h]”h ]”Œk”ah"]”h$]”h&]”uh1jÞhjÚh²hh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´KubhŒdesc_sig_space”“”)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjòh²hh³Nh´Nubah}”(h]”h ]”Œw”ah"]”h$]”h&]”uh1jðhjÚh²hh³jïh´KubhŒ desc_name”“”)�”}”(hŒ counter_comp”h]”hŒ desc_sig_name”“”)�”}”(hjÖh]”hŒ counter_comp”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”Œn”ah"]”h$]”h&]”uh1jhjubah}”(h]”h ]”(Œsig-name”Œdescname”eh"]”h$]”h&]”hÅhÆuh1jhjÚh²hh³jïh´Kubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆŒ add_permalink”ˆuh1jØŒsphinx_line_type”Œ declarator”hjÔh²hh³jïh´Kubah}”(h]”jËah ]”(Œsig”Œ sig-object”eh"]”h$]”h&]”Œ is_multiline”ˆŒ _toc_parts”)Œ _toc_name”huh1jÒh³jïh´KhjÏh²hubhŒ desc_content”“”)�”}”(hhh]”hï)�”}”(hŒCounter component node”h]”hŒCounter component node”…”�”}”(hj8h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´K(hj5h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j3hjÏh²hh³jïh´Kubeh}”(h]”h ]”(Œc”Œstruct”eh"]”h$]”h&]”Œdomain”jPŒobjtype”jQŒdesctype”jQŒnoindex”‰Œ noindexentry”‰Œnocontentsentry”‰uh1jÍh²hhj�h³Nh´NubhŒ 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]”(hŒstrong”“”)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hjgh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jehjaubhŒ:”…”�”}”(hjah²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´K,hj]ubj)�”}”(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); }; };”…”�”}”hj€sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´K.hj]ubhï)�”}”(hŒ **Members**”h]”jf)�”}”(hj‘h]”hŒMembers”…”�”}”(hj“h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jehj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´KThj]ubhŒdefinition_list”“”)�”}”(hhh]”(hŒdefinition_list_item”“”)�”}”(hŒ%``type`` Counter component data type ”h]”(hŒterm”“”)�”}”(hŒ``type``”h]”hŒliteral”“”)�”}”(hj¶h]”hŒtype”…”�”}”(hjºh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj´ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´K*hj®ubhŒ definition”“”)�”}”(hhh]”hï)�”}”(hŒCounter component data type”h]”hŒCounter component data type”…”�”}”(hjÓh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jÍh´K*hjÐubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj®ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jÍh´K*hj©ubj­)�”}”(hŒ(``name`` device-specific component name ”h]”(j³)�”}”(hŒ``name``”h]”j¹)�”}”(hjóh]”hŒname”…”�”}”(hjõh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjñubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´K+hjíubjÏ)�”}”(hhh]”hï)�”}”(hŒdevice-specific component name”h]”hŒdevice-specific component name”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jh´K+hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjíubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jh´K+hj©ubj­)�”}”(hŒ!``priv`` component-relevant data ”h]”(j³)�”}”(hŒ``priv``”h]”j¹)�”}”(hj,h]”hŒpriv”…”�”}”(hj.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj*ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´K,hj&ubjÏ)�”}”(hhh]”hï)�”}”(hŒcomponent-relevant data”h]”hŒcomponent-relevant data”…”�”}”(hjEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jAh´K,hjBubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj&ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jAh´K,hj©ubj­)�”}”(hŒ``{unnamed_union}`` anonymous ”h]”(j³)�”}”(hŒ``{unnamed_union}``”h]”j¹)�”}”(hjeh]”hŒ{unnamed_union}”…”�”}”(hjgh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjcubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Khj_ubjÏ)�”}”(hhh]”hï)�”}”(hŒ anonymous”h]”hŒ anonymous”…”�”}”(hj~h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jzh´Khj{ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj_ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jzh´Khj©ubj­)�”}”(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¹)�”}”(hjžh]”hŒ action_read”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjœubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´K/hj˜ubjÏ)�”}”(hhh]”hï)�”}”(hŒ‡Synapse action mode read callback. The read value of the respective Synapse action mode should be passed back via the action parameter.”h]”hŒ‡Synapse action mode read callback. The read value of the respective Synapse action mode should be passed back via the action parameter.”…”�”}”(hj·h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´K-hj´ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj˜ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j³h´K/hj©ubj­)�”}”(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¹)�”}”(hjØh]”hŒdevice_u8_read”…”�”}”(hjÚh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjÖubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´K2hjÒubjÏ)�”}”(hhh]”hï)�”}”(hŒ„Device u8 component read callback. The read value of the respective Device u8 component should be passed back via the val parameter.”h]”hŒ„Device u8 component read callback. The read value of the respective Device u8 component should be passed back via the val parameter.”…”�”}”(hjñh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´K0hjîubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjÒubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jíh´K2hj©ubj­)�”}”(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”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´K5hj ubjÏ)�”}”(hhh]”hï)�”}”(hŒ‚Count u8 component read callback. The read value of the respective Count u8 component should be passed back via the val parameter.”h]”hŒ‚Count u8 component read callback. The read value of the respective Count u8 component should be passed back via the val parameter.”…”�”}”(hj+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´K3hj(ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j'h´K5hj©ubj­)�”}”(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¹)�”}”(hjLh]”hŒsignal_u8_read”…”�”}”(hjNh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjJubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´K8hjFubjÏ)�”}”(hhh]”hï)�”}”(hŒ„Signal u8 component read callback. The read value of the respective Signal u8 component should be passed back via the val parameter.”h]”hŒ„Signal u8 component read callback. The read value of the respective Signal u8 component should be passed back via the val parameter.”…”�”}”(hjeh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´K6hjbubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjFubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jah´K8hj©ubj­)�”}”(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¹)�”}”(hj†h]”hŒdevice_u32_read”…”�”}”(hjˆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj„ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´K;hj€ubjÏ)�”}”(hhh]”hï)�”}”(hŒ†Device u32 component read callback. The read value of the respective Device u32 component should be passed back via the val parameter.”h]”hŒ†Device u32 component read callback. The read value of the respective Device u32 component should be passed back via the val parameter.”…”�”}”(hjŸh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´K9hjœubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj€ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j›h´K;hj©ubj­)�”}”(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¹)�”}”(hjÀh]”hŒcount_u32_read”…”�”}”(hjÂh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj¾ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´K>hjºubjÏ)�”}”(hhh]”hï)�”}”(hŒ„Count u32 component read callback. The read value of the respective Count u32 component should be passed back via the val parameter.”h]”hŒ„Count u32 component read callback. The read value of the respective Count u32 component should be passed back via the val parameter.”…”�”}”(hjÙh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Khj©ubj­)�”}”(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¹)�”}”(hjúh]”hŒsignal_u32_read”…”�”}”(hjüh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjøubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´KAhjôubjÏ)�”}”(hhh]”hï)�”}”(hŒ†Signal u32 component read callback. The read value of the respective Signal u32 component should be passed back via the val parameter.”h]”hŒ†Signal u32 component read callback. The read value of the respective Signal u32 component should be passed back via the val parameter.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´K?hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjôubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jh´KAhj©ubj­)�”}”(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¹)�”}”(hj4h]”hŒdevice_u64_read”…”�”}”(hj6h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj2ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´KDhj.ubjÏ)�”}”(hhh]”hï)�”}”(hŒ†Device u64 component read callback. The read value of the respective Device u64 component should be passed back via the val parameter.”h]”hŒ†Device u64 component read callback. The read value of the respective Device u64 component should be passed back via the val parameter.”…”�”}”(hjMh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´KBhjJubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj.ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jIh´KDhj©ubj­)�”}”(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¹)�”}”(hjnh]”hŒcount_u64_read”…”�”}”(hjph²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjlubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´KGhjhubjÏ)�”}”(hhh]”hï)�”}”(hŒ„Count u64 component read callback. The read value of the respective Count u64 component should be passed back via the val parameter.”h]”hŒ„Count u64 component read callback. The read value of the respective Count u64 component should be passed back via the val parameter.”…”�”}”(hj‡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´KEhj„ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjhubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jƒh´KGhj©ubj­)�”}”(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¹)�”}”(hj¨h]”hŒsignal_u64_read”…”�”}”(hjªh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj¦ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´KJhj¢ubjÏ)�”}”(hhh]”hï)�”}”(hŒ†Signal u64 component read callback. The read value of the respective Signal u64 component should be passed back via the val parameter.”h]”hŒ†Signal u64 component read callback. The read value of the respective Signal u64 component should be passed back via the val parameter.”…”�”}”(hjÁh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´KHhj¾ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj¢ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j½h´KJhj©ubj­)�”}”(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¹)�”}”(hjâh]”hŒsignal_array_u32_read”…”�”}”(hjäh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjàubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´KPhjÜubjÏ)�”}”(hhh]”hï)�”}”(hŒø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]”hŒø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.”…”�”}”(hjûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´KKhjøubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjÜubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j÷h´KPhj©ubj­)�”}”(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]”hŒdevice_array_u64_read”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´KVhj ubjÏ)�”}”(hhh]”hï)�”}”(hŒú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]”hŒú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.”…”�”}”(hj5 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´KQhj2 ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j1 h´KVhj©ubj­)�”}”(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¹)�”}”(hjV h]”hŒcount_array_u64_read”…”�”}”(hjX h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjT ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´K\hjP ubjÏ)�”}”(hhh]”hï)�”}”(hŒ÷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]”hŒ÷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.”…”�”}”(hjo h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´KWhjl ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjP ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jk h´K\hj©ubj­)�”}”(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]”hŒsignal_array_u64_read”…”�”}”(hj’ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjŽ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´KbhjŠ ubjÏ)�”}”(hhh]”hï)�”}”(hŒø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]”hŒø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.”…”�”}”(hj© h²hh³Nh´Nubah}”(h]”h •]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´K]hj¦ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjŠ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j¥ h´Kbhj©ubj­)�”}”(hŒ``{unnamed_union}`` anonymous ”h]”(j³)�”}”(hŒ``{unnamed_union}``”h]”j¹)�”}”(hjÊ h]”hŒ{unnamed_union}”…”�”}”(hjÌ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjÈ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´KhjÄ ubjÏ)�”}”(hhh]”hï)�”}”(hŒ anonymous”h]”hŒ anonymous”…”�”}”(hjã h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jß h´Khjà ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjÄ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jß h´Khj©ubj­)�”}”(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 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Kehjý 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 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Kchj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjý ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j h´Kehj©ubj­)�”}”(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]”hŒdevice_u8_write”…”�”}”(hj? h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj; ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Khhj7 ubjÏ)�”}”(hhh]”hï)�”}”(hŒzDevice u8 component write callback. The write value of the respective Device u8 component is passed via the val parameter.”h]”hŒzDevice u8 component write callback. The write value of the respective Device u8 component is passed via the val parameter.”…”�”}”(hjV h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´KfhjS ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj7 ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jR h´Khhj©ubj­)�”}”(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¹)�”}”(hjw h]”hŒcount_u8_write”…”�”}”(hjy h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hju ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Kkhjq ubjÏ)�”}”(hhh]”hï)�”}”(hŒxCount u8 component write callback. The write value of the respective Count u8 component is passed via the val parameter.”h]”hŒxCount u8 component write callback. The write value of the respective Count u8 component is passed via the val parameter.”…”�”}”(hj� h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Kihj� ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjq ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jŒ h´Kkhj©ubj­)�”}”(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]”hŒsignal_u8_write”…”�”}”(hj³ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj¯ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Knhj« ubjÏ)�”}”(hhh]”hï)�”}”(hŒzSignal u8 component write callback. The write value of the respective Signal u8 component is passed via the val parameter.”h]”hŒzSignal u8 component write callback. The write value of the respective Signal u8 component is passed via the val parameter.”…”�”}”(hjÊ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´KlhjÇ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj« ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jÆ h´Knhj©ubj­)�”}”(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]”hŒdevice_u32_write”…”�”}”(hjí h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjé ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Kqhjå 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 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Kohj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjå ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j h´Kqhj©ubj­)�”}”(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]”hŒcount_u32_write”…”�”}”(hj' h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj# ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Kthj ubjÏ)�”}”(hhh]”hï)�”}”(hŒzCount u32 component write callback. The write value of the respective Count u32 component is passed via the val parameter.”h]”hŒzCount u32 component write callback. The write value of the respective Count u32 component is passed via the val parameter.”…”�”}”(hj> h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Krhj; ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j: h´Kthj©ubj­)�”}”(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¹)�”}”(hj_ h]”hŒsignal_u32_write”…”�”}”(hja h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj] ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´KwhjY 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.”…”�”}”(hjx h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Kuhju ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjY ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jt h´Kwhj©ubj­)�”}”(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]”hŒdevice_u64_write”…”�”}”(hj› h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj— ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Kzhj“ 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² h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Kxhj¯ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj“ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j® h´Kzhj©ubj­)�”}”(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]”hŒcount_u64_write”…”�”}”(hjÕ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjÑ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´K}hjÍ ubjÏ)�”}”(hhh]”hï)�”}”(hŒzCount u64 component write callback. The write value of the respective Count u64 component is passed via the val parameter.”h]”hŒzCount u64 component write callback. The write value of the respective Count u64 component is passed via the val parameter.”…”�”}”(hjì h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´K{hjé ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjÍ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jè h´K}hj©ubj­)�”}”(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]”hŒsignal_u64_write”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´K€hj 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& h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´K~hj# ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j" h´K€hj©ubj­)�”}”(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¹)�”}”(hjG h]”hŒsignal_array_u32_write”…”�”}”(hjI h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjE ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´K†hjA ubjÏ)�”}”(hhh]”hï)�”}”(hŒð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]”hŒð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.”…”�”}”(hj` h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´K�hj] ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjA ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j\ h´K†hj©ubj­)�”}”(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¹)�”}”(hj� h]”hŒdevice_array_u64_write”…”�”}”(hjƒ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´KŒhj{ ubjÏ)�”}”(hhh]”hï)�”}”(hŒð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]”hŒð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.”…”�”}”(hjš h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´K‡hj— ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj{ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j– h´KŒhj©ubj­)�”}”(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]”hŒcount_array_u64_write”…”�”}”(hj½ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj¹ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´K’hjµ ubjÏ)�”}”(hhh]”hï)�”}”(hŒí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]”hŒí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.”…”�”}”(hjÔ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´K�hjÑ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjµ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jÐ h´K’hj©ubj­)�”}”(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]”hŒsignal_array_u64_write”…”�”}”(hj÷ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjó ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´K—hjï ubjÏ)�”}”(hhh]”hï)�”}”(hŒð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Œð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.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´K“hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjï ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j h´K—hj©ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j§hj]ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j[hj�h²hh³Nh´Nubj½)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jÉŒcounter_signal (C struct)”Œc.counter_signal”hNt”auh1j¼hj�h²hh³Nh´NubjÎ)�”}”(hhh]”(jÓ)�”}”(hŒcounter_signal”h]”jÙ)�”}”(hŒstruct counter_signal”h]”(jß)�”}”(hjâh]”hŒstruct”…”�”}”(hjO h²hh³Nh´Nubah}”(h]”h ]”jëah"]”h$]”h&]”uh1jÞhjK h²hh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Kžubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj] h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhjK h²hh³j\ h´Kžubj)�”}”(hŒcounter_signal”h]”j)�”}”(hjI h]”hŒcounter_signal”…”�”}”(hjo h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjk ubah}”(h]”h ]”(jjeh"]”h$]”h&]”hÅhÆuh1jhjK h²hh³j\ h´Kžubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj%ˆuh1jØj&j'hjG h²hh³j\ h´Kžubah}”(h]”jB ah ]”(j+j,eh"]”h$]”h&]”j0ˆj1)j2huh1jÒh³j\ h´KžhjD h²hubj4)�”}”(hhh]”hï)�”}”(hŒCounter Signal node”h]”hŒCounter Signal node”…”�”}”(hj‘ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´KähjŽ h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j3hjD h²hh³j\ h´Kžubeh}”(h]”h ]”(jPŒstruct”eh"]”h$]”h&]”jUjPjVj© jWj© jX‰jY‰jZ‰uh1jÍh²hhj�h³Nh´Nubj\)�”}”(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]”(jf)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hjµ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jehj± ubhŒ:”…”�”}”(hj± h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Kèhj­ ubj)�”}”(hŒnstruct counter_signal { int id; const char *name; struct counter_comp *ext; size_t num_ext; };”h]”hŒnstruct counter_signal { int id; const char *name; struct counter_comp *ext; size_t num_ext; };”…”�”}”hjÎ sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Kêhj­ ubhï)�”}”(hŒ **Members**”h]”jf)�”}”(hjß h]”hŒMembers”…”�”}”(hjá h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jehjÝ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Kñhj­ ubj¨)�”}”(hhh]”(j­)�”}”(hŒ-``id`` unique ID used to identify the Signal ”h]”(j³)�”}”(hŒ``id``”h]”j¹)�”}”(hjþ h]”hŒid”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjü ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Kæhjø ubjÏ)�”}”(hhh]”hï)�”}”(hŒ%unique ID used to identify the Signal”h]”hŒ%unique ID used to identify the Signal”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jh´Kæhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjø ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jh´Kæhjõ ubj­)�”}”(hŒ%``name`` device-specific Signal name ”h]”(j³)�”}”(hŒ``name``”h]”j¹)�”}”(hj7h]”hŒname”…”�”}”(hj9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj5ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Kçhj1ubjÏ)�”}”(hhh]”hï)�”}”(hŒdevice-specific Signal name”h]”hŒdevice-specific Signal name”…”�”}”(hjPh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jLh´KçhjMubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj1ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jLh´Kçhjõ ubj­)�”}”(hŒ,``ext`` optional array of Signal extensions ”h]”(j³)�”}”(hŒ``ext``”h]”j¹)�”}”(hjph]”hŒext”…”�”}”(hjrh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjnubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´KèhjjubjÏ)�”}”(hhh]”hï)�”}”(hŒ#optional array of Signal extensions”h]”hŒ#optional array of Signal extensions”…”�”}”(hj‰h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³j…h´Kèhj†ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j…h´Kèhjõ ubj­)�”}”(hŒ<``num_ext`` number of Signal extensions specified in **ext**”h]”(j³)�”}”(hŒ ``num_ext``”h]”j¹)�”}”(hj©h]”hŒnum_ext”…”�”}”(hj«h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj§ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Kèhj£ubjÏ)�”}”(hhh]”hï)�”}”(hŒ0number of Signal extensions specified in **ext**”h]”(hŒ)number of Signal extensions specified in ”…”�”}”(hjÂh²hh³Nh´Nubjf)�”}”(hŒ**ext**”h]”hŒext”…”�”}”(hjÊh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jehjÂubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Kéhj¿ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj£ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j¾h´Kèhjõ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j§hj­ ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j[hj�h²hh³Nh´Nubj½)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jÉŒcounter_synapse (C struct)”Œc.counter_synapse”hNt”auh1j¼hj�h²hh³Nh´NubjÎ)�”}”(hhh]”(jÓ)�”}”(hŒcounter_synapse”h]”jÙ)�”}”(hŒstruct counter_synapse”h]”(jß)�”}”(hjâh]”hŒstruct”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jëah"]”h$]”h&]”uh1jÞhj h²hh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Kïubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhj h²hh³jh´Kïubj)�”}”(hŒcounter_synapse”h]”j)�”}”(hj h]”hŒcounter_synapse”…”�”}”(hj1h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj-ubah}”(h]”h ]”(jjeh"]”h$]”h&]”hÅhÆuh1jhj h²hh³jh´Kïubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj%ˆuh1jØj&j'hj h²hh³jh´Kïubah}”(h]”jah ]”(j+j,eh"]”h$]”h&]”j0ˆj1)j2huh1jÒh³jh´Kïhjh²hubj4)�”}”(hhh]”hï)�”}”(hŒCounter Synapse node”h]”hŒCounter Synapse node”…”�”}”(hjSh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´KóhjPh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j3hjh²hh³jh´Kïubeh}”(h]”h ]”(jPŒstruct”eh"]”h$]”h&]”jUjPjVjkjWjkjX‰jY‰jZ‰uh1jÍh²hhj�h³Nh´Nubj\)�”}”(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 Signal”h]”(hï)�”}”(hŒ**Definition**::”h]”(jf)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hjwh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jehjsubhŒ:”…”�”}”(hjsh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´K÷hjoubj)�”}”(hŒ‹struct counter_synapse { const enum counter_synapse_action *actions_list; size_t num_actions; struct counter_signal *signal; };”h]”hŒ‹struct counter_synapse { const enum counter_synapse_action *actions_list; size_t num_actions; struct counter_signal *signal; };”…”�”}”hj�sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Kùhjoubhï)�”}”(hŒ **Members**”h]”jf)�”}”(hj¡h]”hŒMembers”…”�”}”(hj£h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jehjŸubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Kÿhjoubj¨)�”}”(hhh]”(j­)�”}”(hŒ1``actions_list`` array of available action modes ”h]”(j³)�”}”(hŒ``actions_list``”h]”j¹)�”}”(hjÀh]”hŒ actions_list”…”�”}”(hjÂh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj¾ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´KõhjºubjÏ)�”}”(hhh]”hï)�”}”(hŒarray of available action modes”h]”hŒarray of available action modes”…”�”}”(hjÙh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jÕh´KõhjÖubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjºubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jÕh´Kõhj·ubj­)�”}”(hŒE``num_actions`` number of action modes specified in **actions_list** ”h]”(j³)�”}”(hŒ``num_actions``”h]”j¹)�”}”(hjùh]”hŒ num_actions”…”�”}”(hjûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj÷ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´KöhjóubjÏ)�”}”(hhh]”hï)�”}”(hŒ4number of action modes specified in **actions_list**”h]”(hŒ$number of action modes specified in ”…”�”}”(hjh²hh³Nh´Nubjf)�”}”(hŒ**actions_list**”h]”hŒ actions_list”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jehjubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jh´Köhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjóubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jh´Köhj·ubj­)�”}”(hŒ+``signal`` pointer to the associated Signal”h]”(j³)�”}”(hŒ ``signal``”h]”j¹)�”}”(hj@h]”hŒsignal”…”�”}”(hjBh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj>ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Köhj:ubjÏ)�”}”(hhh]”hï)�”}”(hŒ pointer to the associated Signal”h]”hŒ pointer to the associated Signal”…”�”}”(hjYh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´K÷hjVubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj:ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jUh´Köhj·ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j§hjoubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j[hj�h²hh³Nh´Nubj½)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jÉŒcounter_count (C struct)”Œc.counter_count”hNt”auh1j¼hj�h²hh³Nh´NubjÎ)�”}”(hhh]”(jÓ)�”}”(hŒ counter_count”h]”jÙ)�”}”(hŒstruct counter_count”h]”(jß)�”}”(hjâh]”hŒstruct”…”�”}”(hjšh²hh³Nh´Nubah}”(h]”h ]”jëah"]”h$]”h&]”uh1jÞhj–h²hh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Kýubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¨h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhj–h²hh³j§h´Kýubj)�”}”(hŒ counter_count”h]”j)�”}”(hj”h]”hŒ counter_count”…”�”}”(hjºh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj¶ubah}”(h]”h ]”(jjeh"]”h$]”h&]”hÅhÆuh1jhj–h²hh³j§h´Kýubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj%ˆuh1jØj&j'hj’h²hh³j§h´Kýubah}”(h]”j�ah ]”(j+j,eh"]”h$]”h&]”j0ˆj1)j2huh1jÒh³j§h´Kýhj�h²hubj4)�”}”(hhh]”hï)�”}”(hŒCounter Count node”h]”hŒCounter Count node”…”�”}”(hjÜh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´MhjÙh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j3hj�h²hh³j§h´Kýubeh}”(h]”h ]”(jPŒstruct”eh"]”h$]”h&]”jUjPjVjôjWjôjX‰jY‰jZ‰uh1jÍh²hhj�h³Nh´Nubj\)�”}”(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]”(jf)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jehjüubhŒ:”…”�”}”(hjüh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Mhjøubj)�”}”(hŒ÷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; };”h]”hŒ÷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; };”…”�”}”hjsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Mhjøubhï)�”}”(hŒ **Members**”h]”jf)�”}”(hj*h]”hŒMembers”…”�”}”(hj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jehj(ubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Mhjøubj¨)�”}”(hhh]”(j­)�”}”(hŒ,``id`` unique ID used to identify the Count ”h]”(j³)�”}”(hŒ``id``”h]”j¹)�”}”(hjIh]”hŒid”…”�”}”(hjKh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjGubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´MhjCubjÏ)�”}”(hhh]”hï)�”}”(hŒ$unique ID used to identify the Count”h]”hŒ$unique ID used to identify the Count”…”�”}”(hjbh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³j^h´Mhj_ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjCubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j^h´Mhj@ubj­)�”}”(hŒ$``name`` device-specific Count name ”h]”(j³)�”}”(hŒ``name``”h]”j¹)�”}”(hj‚h]”hŒname”…”�”}”(hj„h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj€ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Mhj|ubjÏ)�”}”(hhh]”hï)�”}”(hŒdevice-specific Count name”h]”hŒdevice-specific Count name”…”�”}”(hj›h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³j—h´Mhj˜ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj|ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j—h´Mhj@ubj­)�”}”(hŒ5``functions_list`` array of available function modes ”h]”(j³)�”}”(hŒ``functions_list``”h]”j¹)�”}”(hj»h]”hŒfunctions_list”…”�”}”(hj½h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj¹ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´MhjµubjÏ)�”}”(hhh]”hï)�”}”(hŒ!array of available function modes”h]”hŒ!array of available function modes”…”�”}”(hjÔh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jÐh´MhjÑubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjµubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jÐh´Mhj@ubj­)�”}”(hŒK``num_functions`` number of function modes specified in **functions_list** ”h]”(j³)�”}”(hŒ``num_functions``”h]”j¹)�”}”(hjôh]”hŒ num_functions”…”�”}”(hjöh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjòubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´MhjîubjÏ)�”}”(hhh]”hï)�”}”(hŒ8number of function modes specified in **functions_list**”h]”(hŒ&number of function modes specified in ”…”�”}”(hj h²hh³Nh´Nubjf)�”}”(hŒ**functions_list**”h]”hŒfunctions_list”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jehj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³j h´Mhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjîubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j h´Mhj@ubj­)�”}”(hŒ2``synapses`` array of Synapses for initialization ”h]”(j³)�”}”(hŒ ``synapses``”h]”j¹)�”}”(hj;h]”hŒsynapses”…”�”}”(hj=h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj9ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Mhj5ubjÏ)�”}”(hhh]”hï)�”}”(hŒ$array of Synapses for initialization”h]”hŒ$array of Synapses for initialization”…”�”}”(hjTh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jPh´MhjQubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj5ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jPh´Mhj@ubj­)�”}”(hŒ>``num_synapses`` number of Synapses specified in **synapses** ”h]”(j³)�”}”(hŒ``num_synapses``”h]”j¹)�”}”(hjth]”hŒ num_synapses”…”�”}”(hjvh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjrubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´MhjnubjÏ)�”}”(hhh]”hï)�”}”(hŒ,number of Synapses specified in **synapses**”h]”(hŒ number of Synapses specified in ”…”�”}”(hj�h²hh³Nh´Nubjf)�”}”(hŒ **synapses**”h]”hŒsynapses”…”�”}”(hj•h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jehj�ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³j‰h´MhjŠubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjnubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j‰h´Mhj@ubj­)�”}”(hŒ+``ext`` optional array of Count extensions ”h]”(j³)�”}”(hŒ``ext``”h]”j¹)�”}”(hj»h]”hŒext”…”�”}”(hj½h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj¹ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´MhjµubjÏ)�”}”(hhh]”hï)�”}”(hŒ"optional array of Count extensions”h]”hŒ"optional array of Count extensions”…”�”}”(hjÔh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jÐh´MhjÑubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjµubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jÐh´Mhj@ubj­)�”}”(hŒ;``num_ext`` number of Count extensions specified in **ext**”h]”(j³)�”}”(hŒ ``num_ext``”h]”j¹)�”}”(hjôh]”hŒnum_ext”…”�”}”(hjöh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjòubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´MhjîubjÏ)�”}”(hhh]”hï)�”}”(hŒ/number of Count extensions specified in **ext**”h]”(hŒ(number of Count extensions specified in ”…”�”}”(hj h²hh³Nh´Nubjf)�”}”(hŒ**ext**”h]”hŒext”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jehj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´M hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjîubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j h´Mhj@ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j§hjøubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j[hj�h²hh³Nh´Nubj½)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jÉŒcounter_event_node (C struct)”Œc.counter_event_node”hNt”auh1j¼hj�h²hh³Nh´NubjÎ)�”}”(hhh]”(jÓ)�”}”(hŒcounter_event_node”h]”jÙ)�”}”(hŒstruct counter_event_node”h]”(jß)�”}”(hjâh]”hŒstruct”…”�”}”(hj\h²hh³Nh´Nubah}”(h]”h ]”jëah"]”h$]”h&]”uh1jÞhjXh²hh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Mubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjjh²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhjXh²hh³jih´Mubj)�”}”(hŒcounter_event_node”h]”j)�”}”(hjVh]”hŒcounter_event_node”…”�”}”(hj|h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjxubah}”(h]”h ]”(jjeh"]”h$]”h&]”hÅhÆuh1jhjXh²hh³jih´Mubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj%ˆuh1jØj&j'hjTh²hh³jih´Mubah}”(h]”jOah ]”(j+j,eh"]”h$]”h&]”j0ˆj1)j2huh1jÒh³jih´MhjQh²hubj4)�”}”(hhh]”hï)�”}”(hŒCounter Event node”h]”hŒCounter Event node”…”�”}”(hjžh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Mhj›h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j3hjQh²hh³jih´Mubeh}”(h]”h ]”(jPŒstruct”eh"]”h$]”h&]”jUjPjVj¶jWj¶jX‰jY‰jZ‰uh1jÍh²hhj�h³Nh´Nubj\)�”}”(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 triggers”h]”(hï)�”}”(hŒ**Definition**::”h]”(jf)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hjÂh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jehj¾ubhŒ:”…”�”}”(hj¾h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Mhjºubj)�”}”(hŒtstruct counter_event_node { struct list_head l; u8 event; u8 channel; struct list_head comp_list; };”h]”hŒtstruct counter_event_node { struct list_head l; u8 event; u8 channel; struct list_head comp_list; };”…”�”}”hjÛsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Mhjºubhï)�”}”(hŒ **Members**”h]”jf)�”}”(hjìh]”hŒMembers”…”�”}”(hjîh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jehjêubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´M&hjºubj¨)�”}”(hhh]”(j­)�”}”(hŒ.``l`` list of current watching Counter events ”h]”(j³)�”}”(hŒ``l``”h]”j¹)�”}”(hj h]”hŒl”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´MhjubjÏ)�”}”(hhh]”hï)�”}”(hŒ'list of current watching Counter events”h]”hŒ'list of current watching Counter events”…”�”}”(hj$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³j h´Mhj!ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j h´Mhjubj­)�”}”(hŒ``event`` event that triggers ”h]”(j³)�”}”(hŒ ``event``”h]”j¹)�”}”(hjDh]”hŒevent”…”�”}”(hjFh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjBubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Mhj>ubjÏ)�”}”(hhh]”hï)�”}”(hŒevent that triggers”h]”hŒevent that triggers”…”�”}”(hj]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jYh´MhjZubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj>ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jYh´Mhjubj­)�”}”(hŒ``channel`` event channel ”h]”(j³)�”}”(hŒ ``channel``”h]”j¹)�”}”(hj}h]”hŒchannel”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj{ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´MhjwubjÏ)�”}”(hhh]”hï)�”}”(hŒ event channel”h]”hŒ event channel”…”�”}”(hj–h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³j’h´Mhj“ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjwubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j’h´Mhjubj­)�”}”(hŒ=``comp_list`` list of components to watch when event triggers”h]”(j³)�”}”(hŒ ``comp_list``”h]”j¹)�”}”(hj¶h]”hŒ comp_list”…”�”}”(hj¸h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj´ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Mhj°ubjÏ)�”}”(hhh]”hï)�”}”(hŒ/list of components to watch when event triggers”h]”hŒ/list of components to watch when event triggers”…”�”}”(hjÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´MhjÌubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj°ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jËh´Mhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j§hjºubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j[hj�h²hh³Nh´Nubj½)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jÉŒcounter_ops (C struct)”Œ c.counter_ops”hNt”auh1j¼hj�h²hh³Nh´NubjÎ)�”}”(hhh]”(jÓ)�”}”(hŒ counter_ops”h]”jÙ)�”}”(hŒstruct counter_ops”h]”(jß)�”}”(hjâh]”hŒstruct”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jëah"]”h$]”h&]”uh1jÞhj h²hh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´M$ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhj h²hh³jh´M$ubj)�”}”(hŒ counter_ops”h]”j)�”}”(hj h]”hŒ counter_ops”…”�”}”(hj0h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj,ubah}”(h]”h ]”(jjeh"]”h$]”h&]”hÅhÆuh1jhj h²hh³jh´M$ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj%ˆuh1jØj&j'hjh²hh³jh´M$ubah}”(h]”jah ]”(j+j,eh"]”h$]”h&]”j0ˆj1)j2huh1jÒh³jh´M$hjh²hubj4)�”}”(hhh]”hï)�”}”(hŒCallbacks from driver”h]”hŒCallbacks from driver”…”�”}”(hjRh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´M'hjOh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j3hjh²hh³jh´M$ubeh}”(h]”h ]”(jPŒstruct”eh"]”h$]”h&]”jUjPjVjjjWjjjX‰jY‰jZ‰uh1jÍh²hhj�h³Nh´Nubj\)�”}”(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]”(jf)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hjvh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jehjrubhŒ:”…”�”}”(hjrh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´M+hjnubj)�”}”(hXstruct 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]”hXstruct 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&]”hÅhÆuh1jh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´M-hjnubhï)�”}”(hŒ **Members**”h]”jf)�”}”(hj h]”hŒMembers”…”�”}”(hj¢h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jehjžubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´M9hjnubj¨)�”}”(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¹)�”}”(hj¿h]”hŒ signal_read”…”�”}”(hjÁh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj½ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´M+hj¹ubjÏ)�”}”(hhh]”hï)�”}”(hŒzoptional read callback for Signals. The read level of the respective Signal should be passed back via the level parameter.”h]”hŒzoptional read callback for Signals. The read level of the respective Signal should be passed back via the level parameter.”…”�”}”(hjØh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´M)hjÕubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj¹ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jÔh´M+hj¶ubj­)�”}”(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¹)�”}”(hjùh]”hŒ count_read”…”�”}”(hjûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj÷ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´M.hjóubjÏ)�”}”(hhh]”hï)�”}”(hŒoread callback for Counts. The read value of the respective Count should be passed back via the value parameter.”h]”hŒoread callback for Counts. The read value of the respective Count should be passed back via the value parameter.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´M,hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjóubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jh´M.hj¶ubj­)�”}”(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¹)�”}”(hj3h]”hŒ count_write”…”�”}”(hj5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj1ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´M1hj-ubjÏ)�”}”(hhh]”hï)�”}”(hŒroptional write callback for Counts. The write value for the respective Count is passed in via the value parameter.”h]”hŒroptional write callback for Counts. The write value for the respective Count is passed in via the value parameter.”…”�”}”(hjLh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´M/hjIubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj-ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jHh´M1hj¶ubj­)�”}”(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¹)�”}”(hjmh]”hŒ function_read”…”�”}”(hjoh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjkubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´M4hjgubjÏ)�”}”(hhh]”hï)�”}”(hŒˆread callback the Count function modes. The read function mode of the respective Count should be passed back via the function parameter.”h]”hŒˆread callback the Count function modes. The read function mode of the respective Count should be passed back via the function parameter.”…”�”}”(hj†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´M2hjƒubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjgubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j‚h´M4hj¶ubj­)�”}”(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¹)�”}”(hj§h]”hŒfunction_write”…”�”}”(hj©h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj¥ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´M7hj¡ubjÏ)�”}”(hhh]”hï)�”}”(hŒŽoptional write callback for Count function modes. The function mode to write for the respective Count is passed in via the function parameter.”h]”hŒŽoptional write callback for Count function modes. The function mode to write for the respective Count is passed in via the function parameter.”…”�”}”(hjÀh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´M5hj½ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj¡ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j¼h´M7hj¶ubj­)�”}”(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¹)�”}”(hjáh]”hŒ action_read”…”�”}”(hjãh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjßubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´M:hjÛubjÏ)�”}”(hhh]”hï)�”}”(hŒ�optional read callback the Synapse action modes. The read action mode of the respective Synapse should be passed back via the action parameter.”h]”hŒ�optional read callback the Synapse action modes. The read action mode of the respective Synapse should be passed back via the action parameter.”…”�”}”(hjúh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´M8hj÷ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjÛubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jöh´M:hj¶ubj­)�”}”(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”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´M=hjubjÏ)�”}”(hhh]”hï)�”}”(hŒŒoptional write callback for Synapse action modes. The action mode to write for the respective Synapse is passed in via the action parameter.”h]”hŒŒoptional write callback for Synapse action modes. The action mode to write for the respective Synapse is passed in via the action parameter.”…”�”}”(hj4h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´M;hj1ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j0h´M=hj¶ubj­)�”}”(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¹)�”}”(hjUh]”hŒevents_configure”…”�”}”(hjWh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjSubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´M@hjOubjÏ)�”}”(hhh]”hï)�”}”(hŒ—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]”hŒ—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.”…”�”}”(hjnh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´M>hjkubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjOubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jjh´M@hj¶ubj­)�”}”(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]”hŒwatch_validate”…”�”}”(hj‘h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´MChj‰ubjÏ)�”}”(hhh]”hï)�”}”(hŒÃ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ŒÃ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.”…”�”}”(hj¨h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´MAhj¥ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj‰ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j¤h´MChj¶ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j§hjnubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j[hj�h²hh³Nh´Nubj½)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jÉŒcounter_device (C struct)”Œc.counter_device”hNt”auh1j¼hj�h²hh³Nh´NubjÎ)�”}”(hhh]”(jÓ)�”}”(hŒcounter_device”h]”jÙ)�”}”(hŒstruct counter_device”h]”(jß)�”}”(hjâh]”hŒstruct”…”�”}”(hjéh²hh³Nh´Nubah}”(h]”h ]”jëah"]”h$]”h&]”uh1jÞhjåh²hh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´MJubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj÷h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhjåh²hh³jöh´MJubj)�”}”(hŒcounter_device”h]”j)�”}”(hjãh]”hŒcounter_device”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjubah}”(h]”h ]”(jjeh"]”h$]”h&]”hÅhÆuh1jhjåh²hh³jöh´MJubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj%ˆuh1jØj&j'hjáh²hh³jöh´MJubah}”(h]”jÜah ]”(j+j,eh"]”h$]”h&]”j0ˆj1)j2huh1jÒh³jöh´MJhjÞh²hubj4)�”}”(hhh]”hï)�”}”(hŒCounter data structure”h]”hŒCounter data structure”…”�”}”(hj+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Mahj(h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j3hjÞh²hh³jöh´MJubeh}”(h]”h ]”(jPŒstruct”eh"]”h$]”h&]”jUjPjVjCjWjCjX‰jY‰jZ‰uh1jÍh²hhj�h³Nh´Nubj\)�”}”(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 removal”h]”(hï)�”}”(hŒ**Definition**::”h]”(jf)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hjOh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jehjKubhŒ:”…”�”}”(hjKh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´MehjGubj)�”}”(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; };”…”�”}”hjhsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´MghjGubhï)�”}”(hŒ **Members**”h]”jf)�”}”(hjyh]”hŒMembers”…”�”}”(hj{h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jehjwubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´M~hjGubj¨)�”}”(hhh]”(j­)�”}”(hŒ``name`` name of the device ”h]”(j³)�”}”(hŒ``name``”h]”j¹)�”}”(hj˜h]”hŒname”…”�”}”(hjšh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj–ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Mchj’ubjÏ)�”}”(hhh]”hï)�”}”(hŒname of the device”h]”hŒname of the device”…”�”}”(hj±h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³j­h´Mchj®ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj’ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j­h´Mchj�ubj­)�”}”(hŒ9``parent`` optional parent device providing the counters ”h]”(j³)�”}”(hŒ ``parent``”h]”j¹)�”}”(hjÑh]”hŒparent”…”�”}”(hjÓh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjÏubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´MdhjËubjÏ)�”}”(hhh]”hï)�”}”(hŒ-optional parent device providing the counters”h]”hŒ-optional parent device providing the counters”…”�”}”(hjêh²hh³Nh´Nubah}”(h]”h ]”h"]”h$•]”h&]”uh1hîh³jæh´Mdhjçubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjËubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jæh´Mdhj�ubj­)�”}”(hŒ``ops`` callbacks from driver ”h]”(j³)�”}”(hŒ``ops``”h]”j¹)�”}”(hj h]”hŒops”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´MehjubjÏ)�”}”(hhh]”hï)�”}”(hŒcallbacks from driver”h]”hŒcallbacks from driver”…”�”}”(hj#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jh´Mehj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jh´Mehj�ubj­)�”}”(hŒ``signals`` array of Signals ”h]”(j³)�”}”(hŒ ``signals``”h]”j¹)�”}”(hjCh]”hŒsignals”…”�”}”(hjEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjAubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Mfhj=ubjÏ)�”}”(hhh]”hï)�”}”(hŒarray of Signals”h]”hŒarray of Signals”…”�”}”(hj\h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jXh´MfhjYubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj=ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jXh´Mfhj�ubj­)�”}”(hŒ;``num_signals`` number of Signals specified in **signals** ”h]”(j³)�”}”(hŒ``num_signals``”h]”j¹)�”}”(hj|h]”hŒ num_signals”…”�”}”(hj~h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjzubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´MghjvubjÏ)�”}”(hhh]”hï)�”}”(hŒ*number of Signals specified in **signals**”h]”(hŒnumber of Signals specified in ”…”�”}”(hj•h²hh³Nh´Nubjf)�”}”(hŒ **signals**”h]”hŒsignals”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jehj•ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³j‘h´Mghj’ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjvubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j‘h´Mghj�ubj­)�”}”(hŒ``counts`` array of Counts ”h]”(j³)�”}”(hŒ ``counts``”h]”j¹)�”}”(hjÃh]”hŒcounts”…”�”}”(hjÅh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjÁubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Mhhj½ubjÏ)�”}”(hhh]”hï)�”}”(hŒarray of Counts”h]”hŒarray of Counts”…”�”}”(hjÜh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jØh´MhhjÙubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj½ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jØh´Mhhj�ubj­)�”}”(hŒ8``num_counts`` number of Counts specified in **counts** ”h]”(j³)�”}”(hŒ``num_counts``”h]”j¹)�”}”(hjüh]”hŒ num_counts”…”�”}”(hjþh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjúubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´MihjöubjÏ)�”}”(hhh]”hï)�”}”(hŒ(number of Counts specified in **counts**”h]”(hŒnumber of Counts specified in ”…”�”}”(hjh²hh³Nh´Nubjf)�”}”(hŒ **counts**”h]”hŒcounts”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jehjubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jh´Mihjubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjöubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jh´Mihj�ubj­)�”}”(hŒ4``ext`` optional array of Counter device extensions ”h]”(j³)�”}”(hŒ``ext``”h]”j¹)�”}”(hjCh]”hŒext”…”�”}”(hjEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjAubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Mjhj=ubjÏ)�”}”(hhh]”hï)�”}”(hŒ+optional array of Counter device extensions”h]”hŒ+optional array of Counter device extensions”…”�”}”(hj\h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jXh´MjhjYubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj=ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jXh´Mjhj�ubj­)�”}”(hŒE``num_ext`` number of Counter device extensions specified in **ext** ”h]”(j³)�”}”(hŒ ``num_ext``”h]”j¹)�”}”(hj|h]”hŒnum_ext”…”�”}”(hj~h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjzubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´MkhjvubjÏ)�”}”(hhh]”hï)�”}”(hŒ8number of Counter device extensions specified in **ext**”h]”(hŒ1number of Counter device extensions specified in ”…”�”}”(hj•h²hh³Nh´Nubjf)�”}”(hŒ**ext**”h]”hŒext”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jehj•ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³j‘h´Mkhj’ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjvubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j‘h´Mkhj�ubj­)�”}”(hŒ"``dev`` internal device structure ”h]”(j³)�”}”(hŒ``dev``”h]”j¹)�”}”(hjÃh]”hŒdev”…”�”}”(hjÅh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjÁubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Mlhj½ubjÏ)�”}”(hhh]”hï)�”}”(hŒinternal device structure”h]”hŒinternal device structure”…”�”}”(hjÜh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jØh´MlhjÙubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj½ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jØh´Mlhj�ubj­)�”}”(hŒ/``chrdev`` internal character device structure ”h]”(j³)�”}”(hŒ ``chrdev``”h]”j¹)�”}”(hjüh]”hŒchrdev”…”�”}”(hjþh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjúubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´MmhjöubjÏ)�”}”(hhh]”hï)�”}”(hŒ#internal character device structure”h]”hŒ#internal character device structure”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jh´Mmhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjöubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jh´Mmhj�ubj­)�”}”(hŒ8``events_list`` list of current watching Counter events ”h]”(j³)�”}”(hŒ``events_list``”h]”j¹)�”}”(hj5h]”hŒ events_list”…”�”}”(hj7h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj3ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Mnhj/ubjÏ)�”}”(hhh]”hï)�”}”(hŒ'list of current watching Counter events”h]”hŒ'list of current watching Counter events”…”�”}”(hjNh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jJh´MnhjKubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj/ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jJh´Mnhj�ubj­)�”}”(hŒD``events_list_lock`` lock to protect Counter events list operations ”h]”(j³)�”}”(hŒ``events_list_lock``”h]”j¹)�”}”(hjnh]”hŒevents_list_lock”…”�”}”(hjph²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjlubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´MohjhubjÏ)�”}”(hhh]”hï)�”}”(hŒ.lock to protect Counter events list operations”h]”hŒ.lock to protect Counter events list operations”…”�”}”(hj‡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jƒh´Mohj„ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjhubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jƒh´Mohj�ubj­)�”}”(hŒ:``next_events_list`` list of next watching Counter events ”h]”(j³)�”}”(hŒ``next_events_list``”h]”j¹)�”}”(hj§h]”hŒnext_events_list”…”�”}”(hj©h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj¥ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Mphj¡ubjÏ)�”}”(hhh]”hï)�”}”(hŒ$list of next watching Counter events”h]”hŒ$list of next watching Counter events”…”�”}”(hjÀh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³j¼h´Mphj½ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj¡ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j¼h´Mphj�ubj­)�”}”(hŒK``n_events_list_lock`` lock to protect Counter next events list operations ”h]”(j³)�”}”(hŒ``n_events_list_lock``”h]”j¹)�”}”(hjàh]”hŒn_events_list_lock”…”�”}”(hjâh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjÞubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´MqhjÚubjÏ)�”}”(hhh]”hï)�”}”(hŒ3lock to protect Counter next events list operations”h]”hŒ3lock to protect Counter next events list operations”…”�”}”(hjùh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jõh´Mqhjöubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjÚubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jõh´Mqhj�ubj­)�”}”(hŒ,``events`` queue of detected Counter events ”h]”(j³)�”}”(hŒ ``events``”h]”j¹)�”}”(hjh]”hŒevents”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´MrhjubjÏ)�”}”(hhh]”hï)�”}”(hŒ queue of detected Counter events”h]”hŒ queue of detected Counter events”…”�”}”(hj2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³j.h´Mrhj/ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j.h´Mrhj�ubj­)�”}”(hŒE``events_wait`` wait queue to allow blocking reads of Counter events ”h]”(j³)�”}”(hŒ``events_wait``”h]”j¹)�”}”(hjRh]”hŒ events_wait”…”�”}”(hjTh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjPubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´MshjLubjÏ)�”}”(hhh]”hï)�”}”(hŒ4wait queue to allow blocking reads of Counter events”h]”hŒ4wait queue to allow blocking reads of Counter events”…”�”}”(hjkh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jgh´Mshjhubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjLubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jgh´Mshj�ubj­)�”}”(hŒF``events_in_lock`` lock to protect Counter events queue in operations ”h]”(j³)�”}”(hŒ``events_in_lock``”h]”j¹)�”}”(hj‹h]”hŒevents_in_lock”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj‰ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Mthj…ubjÏ)�”}”(hhh]”hï)�”}”(hŒ2lock to protect Counter events queue in operations”h]”hŒ2lock to protect Counter events queue in operations”…”�”}”(hj¤h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³j h´Mthj¡ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj…ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j h´Mthj�ubj­)�”}”(hŒH``events_out_lock`` lock to protect Counter events queue out operations ”h]”(j³)�”}”(hŒ``events_out_lock``”h]”j¹)�”}”(hjÄh]”hŒevents_out_lock”…”�”}”(hjÆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjÂubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Muhj¾ubjÏ)�”}”(hhh]”hï)�”}”(hŒ3lock to protect Counter events queue out operations”h]”hŒ3lock to protect Counter events queue out operations”…”�”}”(hjÝh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jÙh´MuhjÚubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj¾ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jÙh´Muhj�ubj­)�”}”(hŒ5``ops_exist_lock`` lock to prevent use during removal”h]”(j³)�”}”(hŒ``ops_exist_lock``”h]”j¹)�”}”(hjýh]”hŒops_exist_lock”…”�”}”(hjÿh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjûubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Muhj÷ubjÏ)�”}”(hhh]”hï)�”}”(hŒ"lock to prevent use during removal”h]”hŒ"lock to prevent use during removal”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Mvhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj÷ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jh´Muhj�ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j§hjGubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j[hj�h²hh³Nh´Nubj½)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jÉŒcounter_priv (C function)”Œc.counter_priv”hNt”auh1j¼hj�h²hh³Nh´NubjÎ)�”}”(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]”(hŒdesc_sig_keyword_type”“”)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjYh²hh³Nh´Nubah}”(h]”h ]”Œkt”ah"]”h$]”h&]”uh1jWhjSh²hh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´KAubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjih²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhjSh²hh³jhh´KAubhŒdesc_sig_punctuation”“”)�”}”(hj‰h]”hŒ*”…”�”}”(hjyh²hh³Nh´Nubah}”(h]”h ]”Œp”ah"]”h$]”h&]”uh1jwhjSh²hh³jhh´KAubj)�”}”(hŒ counter_priv”h]”j)�”}”(hŒ counter_priv”h]”hŒ counter_priv”…”�”}”(hj‹h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj‡ubah}”(h]”h ]”(jjeh"]”h$]”h&]”hÅhÆuh1jhjSh²hh³jhh´KAubhŒdesc_parameterlist”“”)�”}”(hŒ,(const struct counter_device *const counter)”h]”hŒdesc_parameter”“”)�”}”(hŒ*const struct counter_device *const counter”h]”(jß)�”}”(hŒconst”h]”hŒconst”…”�”}”(hj«h²hh³Nh´Nubah}”(h]”h ]”jëah"]”h$]”h&]”uh1jÞhj§ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¹h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhj§ubjß)�”}”(hjâh]”hŒstruct”…”�”}”(hjÇh²hh³Nh´Nubah}”(h]”h ]”jëah"]”h$]”h&]”uh1jÞhj§ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÔh²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhj§ubh)�”}”(hhh]”j)�”}”(hŒcounter_device”h]”hŒcounter_device”…”�”}”(hjåh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjâubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jPŒreftype”Œ identifier”Œ reftarget”jçŒmodname”NŒ classname”NŒ c:parent_key”Œsphinx.domains.c”Œ LookupKey”“”)�”}”Œdata”]”jŒ ASTIdentifier”“”)�”}”jûj�sbŒc.counter_priv”†”asbuh1hhj§ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhj§ubjx)�”}”(hj‰h]”hŒ*”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jƒah"]”h$]”h&]”uh1jwhj§ubjß)�”}”(hj­h]”hŒconst”…”�”}”(hj(h²hh³Nh´Nubah}”(h]”h ]”jëah"]”h$]”h&]”uh1jÞhj§ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj5h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhj§ubj)�”}”(hŒcounter”h]”hŒcounter”…”�”}”(hjCh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj§ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j¥hj¡ubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jŸhjSh²hh³jhh´KAubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj%ˆuh1jØj&j'hjOh²hh³jhh´KAubah}”(h]”jJah ]”(j+j,eh"]”h$]”h&]”j0ˆj1)j2huh1jÒh³jhh´KAhjLh²hubj4)�”}”(hhh]”hï)�”}”(hŒ"access counter device private data”h]”hŒ"access counter device private data”…”�”}”(hjmh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´KAhjjh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j3hjLh²hh³jhh´KAubeh}”(h]”h ]”(jPŒfunction”eh"]”h$]”h&]”jUjPjVj…jWj…jX‰jY‰jZ‰uh1jÍh²hhj�h³Nh´Nubj\)�”}”(hŒ…**Parameters** ``const struct counter_device *const counter`` counter device **Description** Get the counter device private data”h]”(hï)�”}”(hŒ**Parameters**”h]”jf)�”}”(hj�h]”hŒ Parameters”…”�”}”(hj‘h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jehj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´KEhj‰ubj¨)�”}”(hhh]”j­)�”}”(hŒ>``const struct counter_device *const counter`` counter device ”h]”(j³)�”}”(hŒ.``const struct counter_device *const counter``”h]”j¹)�”}”(hj®h]”hŒ*const struct counter_device *const counter”…”�”}”(hj°h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj¬ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´KBhj¨ubjÏ)�”}”(hhh]”hï)�”}”(hŒcounter device”h]”hŒcounter device”…”�”}”(hjÇh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jÃh´KBhjÄubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj¨ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jÃh´KBhj¥ubah}”(h]”h ]”h"]”h$]”h&]”uh1j§hj‰ubhï)�”}”(hŒ**Description**”h]”jf)�”}”(hjéh]”hŒ Description”…”�”}”(hjëh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jehjçubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´KDhj‰ubhï)�”}”(hŒ#Get the counter device private data”h]”hŒ#Get the counter device private data”…”�”}”(hjÿh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´KChj‰ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j[hj�h²hh³Nh´Nubj½)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jÉŒcounter_alloc (C function)”Œc.counter_alloc”hNt”auh1j¼hj�h²hh³Nh´NubjÎ)�”}”(hhh]”(jÓ)�”}”(hŒ:struct counter_device * counter_alloc (size_t sizeof_priv)”h]”jÙ)�”}”(hŒ8struct counter_device *counter_alloc(size_t sizeof_priv)”h]”(jß)�”}”(hjâh]”hŒstruct”…”�”}”(hj.h²hh³Nh´Nubah}”(h]”h ]”jëah"]”h$]”h&]”uh1jÞhj*h²hh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´KPubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj<h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhj*h²hh³j;h´KPubh)�”}”(hhh]”j)�”}”(hŒcounter_device”h]”hŒcounter_device”…”�”}”(hjMh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjJubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jPŒreftype”jûŒ reftarget”jOŒmodname”NŒ classname”Njÿj)�”}”j]”j)�”}”jûŒ counter_alloc”sbŒc.counter_alloc”†”asbuh1hhj*h²hh³j;h´KPubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjnh²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhj*h²hh³j;h´KPubjx)�”}”(hj‰h]”hŒ*”…”�”}”(hj|h²hh³Nh´Nubah}”(h]”h ]”jƒah"]”h$]”h&]”uh1jwhj*h²hh³j;h´KPubj)�”}”(hŒ counter_alloc”h]”j)�”}”(hjkh]”hŒ counter_alloc”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj‰ubah}”(h]”h ]”(jjeh"]”h$]”h&]”hÅhÆuh1jhj*h²hh³j;h´KPubj )�”}”(hŒ(size_t sizeof_priv)”h]”j¦)�”}”(hŒsize_t sizeof_priv”h]”(h)�”}”(hhh]”j)�”}”(hŒsize_t”h]”hŒsize_t”…”�”}”(hj«h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj¨ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jPŒreftype”jûŒ reftarget”j­Œmodname”NŒ classname”Njÿj)�”}”j]”jiŒc.counter_alloc”†”asbuh1hhj¤ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÉh²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhj¤ubj)�”}”(hŒ sizeof_priv”h]”hŒ sizeof_priv”…”�”}”(hj×h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj¤ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j¥hj ubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jŸhj*h²hh³j;h´KPubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj%ˆuh1jØj&j'hj&h²hh³j;h´KPubah}”(h]”j!ah ]”(j+j,eh"]”h$]”h&]”j0ˆj1)j2huh1jÒh³j;h´KPhj#h²hubj4)�”}”(hhh]”hï)�”}”(hŒallocate a counter_device”h]”hŒallocate a counter_device”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´KPhjþh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j3hj#h²hh³j;h´KPubeh}”(h]”h ]”(jPŒfunction”eh"]”h$]”h&]”jUjPjVj jWj jX‰jY‰jZ‰uh1jÍh²hhj�h³Nh´Nubj\)�”}”(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]”jf)�”}”(hj# h]”hŒ Parameters”…”�”}”(hj% h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jehj! ubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´KThj ubj¨)�”}”(hhh]”j­)�”}”(hŒ7``size_t sizeof_priv`` size of the driver private data ”h]”(j³)�”}”(hŒ``size_t sizeof_priv``”h]”j¹)�”}”(hjB h]”hŒsize_t sizeof_priv”…”�”}”(hjD h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj@ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´KQhj< ubjÏ)�”}”(hhh]”hï)�”}”(hŒsize of the driver private data”h]”hŒsize of the driver private data”…”�”}”(hj[ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jW h´KQhjX ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj< ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jW h´KQhj9 ubah}”(h]”h ]”h"]”h$]”h&]”uh1j§hj ubhï)�”}”(hŒ**Description**”h]”jf)�”}”(hj} h]”hŒ Description”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jehj{ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´KShj ubhï)�”}”(hŒ�This is part one of counter registration. The structure is allocated dynamically to ensure the right lifetime for the embedded struct device.”h]”hŒ�This is part one of counter registration. The structure is allocated dynamically to ensure the right lifetime for the embedded struct device.”…”�”}”(hj“ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´KRhj ubhï)�”}”(hŒLIf this succeeds, call counter_put() to get rid of the counter_device again.”h]”hŒLIf this succeeds, call counter_put() to get rid of the counter_device again.”…”�”}”(hj¢ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´KUhj ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j[hj�h²hh³Nh´Nubj½)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jÉŒcounter_add (C function)”Œ c.counter_add”hNt”auh1j¼hj�h²hh³Nh´NubjÎ)�”}”(hhh]”(jÓ)�”}”(hŒ0int counter_add (struct counter_device *counter)”h]”jÙ)�”}”(hŒ/int counter_add(struct counter_device *counter)”h]”(jX)�”}”(hŒint”h]”hŒint”…”�”}”(hjÑ h²hh³Nh´Nubah}”(h]”h ]”jdah"]”h$]”h&]”uh1jWhjÍ h²hh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´K“ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjà h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhjÍ h²hh³jß h´K“ubj)�”}”(hŒ counter_add”h]”j)�”}”(hŒ counter_add”h]”hŒ counter_add”…”�”}”(hjò h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjî ubah}”(h]”h ]”(jjeh"]”h$]”h&]”hÅhÆuh1jhjÍ h²hh³jß h´K“ubj )�”}”(hŒ (struct counter_device *counter)”h]”j¦)�”}”(hŒstruct counter_device *counter”h]”(jß)�”}”(hjâh]”hŒstruct”…”�”}”(hj!h²hh³Nh´Nubah}”(h]”h ]”jëah"]”h$]”h&]”uh1jÞhj !ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj!h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhj !ubh)�”}”(hhh]”j)�”}”(hŒcounter_device”h]”hŒcounter_device”…”�”}”(hj,!h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj)!ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jPŒreftype”jûŒ reftarget”j.!Œmodname”NŒ classname”Njÿj)�”}”j]”j)�”}”jûjô sbŒ c.counter_add”†”asbuh1hhj !ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjL!h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhj !ubjx)�”}”(hj‰h]”hŒ*”…”�”}”(hjZ!h²hh³Nh´Nubah}”(h]”h ]”jƒah"]”h$]”h&]”uh1jwhj !ubj)�”}”(hŒcounter”h]”hŒcounter”…”�”}”(hjg!h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj !ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j¥hj!ubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jŸhjÍ h²hh³jß h´K“ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj%ˆuh1jØj&j'hjÉ h²hh³jß h´K“ubah}”(h]”jÄ ah ]”(j+j,eh"]”h$]”h&]”j0ˆj1)j2huh1jÒh³jß h´K“hjÆ h²hubj4)�”}”(hhh]”hï)�”}”(hŒ"complete registration of a counter”h]”hŒ"complete registration of a counter”…”�”}”(hj‘!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´K“hjŽ!h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j3hjÆ h²hh³jß h´K“ubeh}”(h]”h ]”(jPŒfunction”eh"]”h$]”h&]”jUjPjVj©!jWj©!jX‰jY‰jZ‰uh1jÍh²hhj�h³Nh´Nubj\)�”}”(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]”jf)�”}”(hj³!h]”hŒ Parameters”…”�”}”(hjµ!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jehj±!ubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´K—hj­!ubj¨)�”}”(hhh]”j­)�”}”(hŒ6``struct counter_device *counter`` the counter to add ”h]”(j³)�”}”(hŒ"``struct counter_device *counter``”h]”j¹)�”}”(hjÒ!h]”hŒstruct counter_device *counter”…”�”}”(hjÔ!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjÐ!ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´K”hjÌ!ubjÏ)�”}”(hhh]”hï)�”}”(hŒthe counter to add”h]”hŒthe counter to add”…”�”}”(hjë!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jç!h´K”hjè!ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjÌ!ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jç!h´K”hjÉ!ubah}”(h]”h ]”h"]”h$]”h&]”uh1j§hj­!ubhï)�”}”(hŒ**Description**”h]”jf)�”}”(hj "h]”hŒ Description”…”�”}”(hj"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jehj "ubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´K–hj­!ubhï)�”}”(hŒ)This is part two of counter registration.”h]”hŒ)This is part two of counter registration.”…”�”}”(hj#"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´K•hj­!ubhï)�”}”(hŒSIf this succeeds, call counter_unregister() to get rid of the counter_device again.”h]”hŒSIf this succeeds, call counter_unregister() to get rid of the counter_device again.”…”�”}”(hj2"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´K—hj­!ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j[hj�h²hh³Nh´Nubj½)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jÉŒcounter_unregister (C function)”Œc.counter_unregister”hNt”auh1j¼hj�h²hh³Nh´NubjÎ)�”}”(hhh]”(jÓ)�”}”(hŒ>void counter_unregister (struct counter_device *const counter)”h]”jÙ)�”}”(hŒ=void counter_unregister(struct counter_device *const counter)”h]”(jX)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hja"h²hh³Nh´Nubah}”(h]”h ]”jdah"]”h$]”h&]”uh1jWhj]"h²hh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´K®ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjp"h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhj]"h²hh³jo"h´K®ubj)�”}”(hŒcounter_unregister”h]”j)�”}”(hŒcounter_unregister”h]”hŒcounter_unregister”…”�”}”(hj‚"h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj~"ubah}”(h]”h ]”(jjeh"]”h$]”h&]”hÅhÆuh1jhj]"h²hh³jo"h´K®ubj )�”}”(hŒ&(struct counter_device *const counter)”h]”j¦)�”}”(hŒ$struct counter_device *const counter”h]”(jß)�”}”(hjâh]”hŒstruct”…”�”}”(hjž"h²hh³Nh´Nubah}”(h]”h ]”jëah"]”h$]”h&]”uh1jÞhjš"ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj«"h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhjš"ubh)�”}”(hhh]”j)�”}”(hŒcounter_device”h]”hŒcounter_device”…”�”}”(hj¼"h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj¹"ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jPŒreftype”jûŒ reftarget”j¾"Œmodname”NŒ classname”Njÿj)�”}”j]”j)�”}”jûj„"sbŒc.counter_unregister”†”asbuh1hhjš"ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÜ"h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhjš"ubjx)�”}”(hj‰h]”hŒ*”…”�”}”(hjê"h²hh³Nh´Nubah}”(h]”h ]”jƒah"]”h$]”h&]”uh1jwhjš"ubjß)�”}”(hj­h]”hŒconst”…”�”}”(hj÷"h²hh³Nh´Nubah}”(h]”h ]”jëah"]”h$]”h&]”uh1jÞhjš"ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj#h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhjš"ubj)�”}”(hŒcounter”h]”hŒcounter”…”�”}”(hj#h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjš"ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j¥hj–"ubah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jŸhj]"h²hh³jo"h´K®ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj%ˆuh1jØj&j'hjY"h²hh³jo"h´K®ubah}”(h]”jT"ah ]”(j+j,eh"]”h$]”h&]”j0ˆj1)j2huh1jÒh³jo"h´K®hjV"h²hubj4)�”}”(hhh]”hï)�”}”(hŒ"unregister Counter from the system”h]”hŒ"unregister Counter from the system”…”�”}”(hj<#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´K®hj9#h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j3hjV"h²hh³jo"h´K®ubeh}”(h]”h ]”(jPŒfunction”eh"]”h$]”h&]”jUjPjVjT#jWjT#jX‰jY‰jZ‰uh1jÍh²hhj�h³Nh´Nubj\)�”}”(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]”jf)�”}”(hj^#h]”hŒ Parameters”…”�”}”(hj`#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jehj\#ubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´K²hjX#ubj¨)�”}”(hhh]”j­)�”}”(hŒJ``struct counter_device *const counter`` pointer to Counter to unregister ”h]”(j³)�”}”(hŒ(``struct counter_device *const counter``”h]”j¹)�”}”(hj}#h]”hŒ$struct counter_device *const counter”…”�”}”(hj#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj{#ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´K¯hjw#ubjÏ)�”}”(hhh]”hï)�”}”(hŒ pointer to Counter to unregister”h]”hŒ pointer to Counter to unregister”…”�”}”(hj–#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³j’#h´K¯hj“#ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjw#ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j’#h´K¯hjt#ubah}”(h]”h ]”h"]”h$]”h&]”uh1j§hjX#ubhï)�”}”(hŒ**Description**”h]”jf)�”}”(hj¸#h]”hŒ Description”…”�”}”(hjº#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jehj¶#ubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´K±hjX#ubhï)�”}”(hŒ,The Counter is unregistered from the system.”h]”hŒ,The Counter is unregistered from the system.”…”�”}”(hjÎ#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´K°hjX#ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j[hj�h²hh³Nh´Nubj½)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jÉŒdevm_counter_alloc (C function)”Œc.devm_counter_alloc”hNt”auh1j¼hj�h²hh³Nh´NubjÎ)�”}”(hhh]”(jÓ)�”}”(hŒSstruct counter_device * devm_counter_alloc (struct device *dev, size_t sizeof_priv)”h]”jÙ)�”}”(hŒQstruct counter_device *devm_counter_alloc(struct device *dev, size_t sizeof_priv)”h]”(jß)�”}”(hjâh]”hŒstruct”…”�”}”(hjý#h²hh³Nh´Nubah}”(h]”h ]”jëah"]”h$]”h&]”uh1jÞhjù#h²hh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´KÎubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj $h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhjù#h²hh³j $h´KÎubh)�”}”(hhh]”j)�”}”(hŒcounter_device”h]”hŒcounter_device”…”�”}”(hj$h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj$ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jPŒreftype”jûŒ reftarget”j$Œmodname”NŒ classname”Njÿj)�”}”j]”j)�”}”jûŒdevm_counter_alloc”sbŒc.devm_counter_alloc”†”asbuh1hhjù#h²hh³j $h´KÎubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj=$h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhjù#h²hh³j $h´KÎubjx)�”}”(hj‰h]”hŒ*”…”�”}”(hjK$h²hh³Nh´Nubah}”(h]”h ]”jƒah"]”h$]”h&]”uh1jwhjù#h²hh³j $h´KÎubj)�”}”(hŒdevm_counter_alloc”h]”j)�”}”(hj:$h]”hŒdevm_counter_alloc”…”�”}”(hj\$h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjX$ubah}”(h]”h ]”(jjeh"]”h$]”h&]”hÅhÆuh1jhjù#h²hh³j $h´KÎubj )�”}”(hŒ((struct device *dev, size_t sizeof_priv)”h]”(j¦)�”}”(hŒstruct device *dev”h]”(jß)�”}”(hjâh]”hŒstruct”…”�”}”(hjw$h²hh³Nh´Nubah}”(h]”h ]”jëah"]”h$]”h&]”uh1jÞhjs$ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj„$h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhjs$ubh)�”}”(hhh]”j)�”}”(hŒdevice”h]”hŒdevice”…”�”}”(hj•$h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj’$ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jPŒreftype”jûŒ reftarget”j—$Œmodname”NŒ classname”Njÿj)�”}”j]”j8$Œc.devm_counter_alloc”†”asbuh1hhjs$ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj³$h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhjs$ubjx)�”}”(hj‰h]”hŒ*”…”�”}”(hjÁ$h²hh³Nh´Nubah}”(h]”h ]”jƒah"]”h$]”h&]”uh1jwhjs$ubj)�”}”(hŒdev”h]”hŒdev”…”�”}”(hjÎ$h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjs$ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j¥hjo$ubj¦)�”}”(hŒsize_t sizeof_priv”h]”(h)�”}”(hhh]”j)�”}”(hŒsize_t”h]”hŒsize_t”…”�”}”(hjê$h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjç$ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jPŒreftype”jûŒ reftarget”jì$Œmodname”NŒ classname”Njÿj)�”}”j]”j8$Œc.devm_counter_alloc”†”asbuh1hhjã$ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj%h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhjã$ubj)�”}”(hŒ sizeof_priv”h]”hŒ sizeof_priv”…”�”}”(hj%h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjã$ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j¥hjo$ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jŸhjù#h²hh³j $h´KÎubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj%ˆuh1jØj&j'hjõ#h²hh³j $h´KÎubah}”(h]”jð#ah ]”(j+j,eh"]”h$]”h&]”j0ˆj1)j2huh1jÒh³j $h´KÎhjò#h²hubj4)�”}”(hhh]”hï)�”}”(hŒallocate a counter_device”h]”hŒallocate a counter_device”…”�”}”(hj@%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´KÎhj=%h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j3hjò#h²hh³j $h´KÎubeh}”(h]”h ]”(jPŒfunction”eh"]”h$]”h&]”jUjPjVjX%jWjX%jX‰jY‰jZ‰uh1jÍh²hhj�h³Nh´Nubj\)�”}”(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]”jf)�”}”(hjb%h]”hŒ Parameters”…”�”}”(hjd%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jehj`%ubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´KÒhj\%ubj¨)�”}”(hhh]”(j­)�”}”(hŒG``struct device *dev`` the device to register the release callback for ”h]”(j³)�”}”(hŒ``struct device *dev``”h]”j¹)�”}”(hj�%h]”hŒstruct device *dev”…”�”}”(hjƒ%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj%ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´KÏhj{%ubjÏ)�”}”(hhh]”hï)�”}”(hŒ/the device to register the release callback for”h]”hŒ/the device to register the release callback for”…”�”}”(hjš%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³j–%h´KÏhj—%ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj{%ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j–%h´KÏhjx%ubj­)�”}”(hŒ7``size_t sizeof_priv`` size of the driver private data ”h]”(j³)�”}”(hŒ``size_t sizeof_priv``”h]”j¹)�”}”(hjº%h]”hŒsize_t sizeof_priv”…”�”}”(hj¼%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj¸%ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´KÐhj´%ubjÏ)�”}”(hhh]”hï)�”}”(hŒsize of the driver private data”h]”hŒsize of the driver private data”…”�”}”(hjÓ%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jÏ%h´KÐhjÐ%ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj´%ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jÏ%h´KÐhjx%ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j§hj\%ubhï)�”}”(hŒ**Description**”h]”jf)�”}”(hjõ%h]”hŒ Description”…”�”}”(hj÷%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jehjó%ubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´KÒhj\%ubhï)�”}”(hŒwThis is the device managed version of counter_add(). It registers a cleanup callback to care for calling counter_put().”h]”hŒwThis is the device managed version of counter_add(). It registers a cleanup callback to care for calling counter_put().”…”�”}”(hj &h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´KÑhj\%ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j[hj�h²hh³Nh´Nubj½)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jÉŒdevm_counter_add (C function)”Œc.devm_counter_add”hNt”auh1j¼hj�h²hh³Nh´NubjÎ)�”}”(hhh]”(jÓ)�”}”(hŒOint devm_counter_add (struct device *dev, struct counter_device *const counter)”h]”jÙ)�”}”(hŒNint devm_counter_add(struct device *dev, struct counter_device *const counter)”h]”(jX)�”}”(hŒint”h]”hŒint”…”�”}”(hj:&h²hh³Nh´Nubah}”(h]”h ]”jdah"]”h$]”h&]”uh1jWhj6&h²hh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´Kçubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjI&h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhj6&h²hh³jH&h´Kçubj)�”}”(hŒdevm_counter_add”h]”j)�”}”(hŒdevm_counter_add”h]”hŒdevm_counter_add”…”�”}”(hj[&h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjW&ubah}”(h]”h ]”(jjeh"]”h$]”h&]”hÅhÆuh1jhj6&h²hh³jH&h´Kçubj )�”}”(hŒ:(struct device *dev, struct counter_device *const counter)”h]”(j¦)�”}”(hŒstruct device *dev”h]”(jß)�”}”(hjâh]”hŒstruct”…”�”}”(hjw&h²hh³Nh´Nubah}”(h]”h ]”jëah"]”h$]”h&]”uh1jÞhjs&ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj„&h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhjs&ubh)�”}”(hhh]”j)�”}”(hŒdevice”h]”hŒdevice”…”�”}”(hj•&h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj’&ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jPŒreftype”jûŒ reftarget”j—&Œmodname”NŒ classname”Njÿj)�”}”j]”j)�”}”jûj]&sbŒc.devm_counter_add”†”asbuh1hhjs&ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjµ&h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhjs&ubjx)�”}”(hj‰h]”hŒ*”…”�”}”(hjÃ&h²hh³Nh´Nubah}”(h]”h ]”jƒah"]”h$]”h&]”uh1jwhjs&ubj)�”}”(hŒdev”h]”hŒdev”…”�”}”(hjÐ&h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjs&ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j¥hjo&ubj¦)�”}”(hŒ$struct counter_device *const counter”h]”(jß)�”}”(hjâh]”hŒstruct”…”�”}”(hjé&h²hh³Nh´Nubah}”(h]”h ]”jëah"]”h$]”h&]”uh1jÞhjå&ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjö&h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhjå&ubh)�”}”(hhh]”j)�”}”(hŒcounter_device”h]”hŒcounter_device”…”�”}”(hj'h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj'ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jPŒreftype”jûŒ reftarget”j 'Œmodname”NŒ classname”Njÿj)�”}”j]”j±&Œc.devm_counter_add”†”asbuh1hhjå&ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj%'h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhjå&ubjx)�”}”(hj‰h]”hŒ*”…”�”}”(hj3'h²hh³Nh´Nubah}”(h]”h ]”jƒah"]”h$]”h&]”uh1jwhjå&ubjß)�”}”(hj­h]”hŒconst”…”�”}”(hj@'h²hh³Nh´Nubah}”(h]”h ]”jëah"]”h$]”h&]”uh1jÞhjå&ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjM'h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhjå&ubj)�”}”(hŒcounter”h]”hŒcounter”…”�”}”(hj['h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjå&ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j¥hjo&ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jŸhj6&h²hh³jH&h´Kçubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj%ˆuh1jØj&j'hj2&h²hh³jH&h´Kçubah}”(h]”j-&ah ]”(j+j,eh"]”h$]”h&]”j0ˆj1)j2huh1jÒh³jH&h´Kçhj/&h²hubj4)�”}”(hhh]”hï)�”}”(hŒ"complete registration of a counter”h]”hŒ"complete registration of a counter”…”�”}”(hj…'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´Kçhj‚'h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j3hj/&h²hh³jH&h´Kçubeh}”(h]”h ]”(jPŒfunction”eh"]”h$]”h&]”jUjPjVj�'jWj�'jX‰jY‰jZ‰uh1jÍh²hhj�h³Nh´Nubj\)�”}”(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]”jf)�”}”(hj§'h]”hŒ Parameters”…”�”}”(hj©'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jehj¥'ubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´Këhj¡'ubj¨)�”}”(hhh]”(j­)�”}”(hŒG``struct device *dev`` the device to register the release callback for ”h]”(j³)�”}”(hŒ``struct device *dev``”h]”j¹)�”}”(hjÆ'h]”hŒstruct device *dev”…”�”}”(hjÈ'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjÄ'ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´KèhjÀ'ubjÏ)�”}”(hhh]”hï)�”}”(hŒ/the device to register the release callback for”h]”hŒ/the device to register the release callback for”…”�”}”(hjß'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jÛ'h´KèhjÜ'ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjÀ'ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jÛ'h´Kèhj½'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(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjý'ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´Kéhjù'ubjÏ)�”}”(hhh]”hï)�”}”(hŒthe counter to add”h]”hŒthe counter to add”…”�”}”(hj(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³j(h´Kéhj(ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjù'ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j(h´Kéhj½'ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j§hj¡'ubhï)�”}”(hŒ**Description**”h]”jf)�”}”(hj:(h]”hŒ Description”…”�”}”(hj<(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jehj8(ubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´Këhj¡'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().”…”�”}”(hjP(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œj/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:237: ./drivers/counter/counter-core.c”h´Kêhj¡'ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j[hj�h²hh³Nh´Nubj½)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(jÉŒcounter_push_event (C function)”Œc.counter_push_event”hNt”auh1j¼hj�h²hh³Nh´NubjÎ)�”}”(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]”(jX)�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hj(h²hh³Nh´Nubah}”(h]”h ]”jdah"]”h$]”h&]”uh1jWhj{(h²hh³Œl/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:240: ./drivers/counter/counter-chrdev.c”h´Mrubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjŽ(h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhj{(h²hh³j�(h´Mrubj)�”}”(hŒcounter_push_event”h]”j)�”}”(hŒcounter_push_event”h]”hŒcounter_push_event”…”�”}”(hj (h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjœ(ubah}”(h]”h ]”(jjeh"]”h$]”h&]”hÅhÆuh1jhj{(h²hh³j�(h´Mrubj )�”}”(hŒH(struct counter_device *const counter, const u8 event, const u8 channel)”h]”(j¦)�”}”(hŒ$struct counter_device *const counter”h]”(jß)�”}”(hjâh]”hŒstruct”…”�”}”(hj¼(h²hh³Nh´Nubah}”(h]”h ]”jëah"]”h$]”h&]”uh1jÞhj¸(ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjÉ(h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhj¸(ubh)�”}”(hhh]”j)�”}”(hŒcounter_device”h]”hŒcounter_device”…”�”}”(hjÚ(h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj×(ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jPŒreftype”jûŒ reftarget”jÜ(Œmodname”NŒ classname”Njÿj)�”}”j]”j)�”}”jûj¢(sbŒc.counter_push_event”†”asbuh1hhj¸(ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjú(h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhj¸(ubjx)�”}”(hj‰h]”hŒ*”…”�”}”(hj)h²hh³Nh´Nubah}”(h]”h ]”jƒah"]”h$]”h&]”uh1jwhj¸(ubjß)�”}”(hj­h]”hŒconst”…”�”}”(hj)h²hh³Nh´Nubah}”(h]”h ]”jëah"]”h$]”h&]”uh1jÞhj¸(ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj")h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhj¸(ubj)�”}”(hŒcounter”h]”hŒcounter”…”�”}”(hj0)h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj¸(ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j¥hj´(ubj¦)�”}”(hŒconst u8 event”h]”(jß)�”}”(hj­h]”hŒconst”…”�”}”(hjI)h²hh³Nh´Nubah}”(h]”h ]”jëah"]”h$]”h&]”uh1jÞhjE)ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjV)h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhjE)ubh)�”}”(hhh]”j)�”}”(hŒu8”h]”hŒu8”…”�”}”(hjg)h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjd)ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jPŒreftype”jûŒ reftarget”ji)Œmodname”NŒ classname”Njÿj)�”}”j]”jö(Œc.counter_push_event”†”asbuh1hhjE)ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj…)h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhjE)ubj)�”}”(hŒevent”h]”hŒevent”…”�”}”(hj“)h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjE)ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j¥hj´(ubj¦)�”}”(hŒconst u8 channel”h]”(jß)�”}”(hj­h]”hŒconst”…”�”}”(hj¬)h²hh³Nh´Nubah}”(h]”h ]”jëah"]”h$]”h&]”uh1jÞhj¨)ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¹)h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhj¨)ubh)�”}”(hhh]”j)�”}”(hŒu8”h]”hŒu8”…”�”}”(hjÊ)h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjÇ)ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jPŒreftype”jûŒ reftarget”jÌ)Œmodname”NŒ classname”Njÿj)�”}”j]”jö(Œc.counter_push_event”†”asbuh1hhj¨)ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjè)h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhj¨)ubj)�”}”(hŒchannel”h]”hŒchannel”…”�”}”(hjö)h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj¨)ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1j¥hj´(ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jŸhj{(h²hh³j�(h´Mrubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj%ˆuh1jØj&j'hjw(h²hh³j�(h´Mrubah}”(h]”jr(ah ]”(j+j,eh"]”h$]”h&]”j0ˆj1)j2huh1jÒh³j�(h´Mrhjt(h²hubj4)�”}”(hhh]”hï)�”}”(hŒ!queue event for userspace reading”h]”hŒ!queue event for userspace reading”…”�”}”(hj *h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œl/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:240: ./drivers/counter/counter-chrdev.c”h´Mrhj*h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j3hjt(h²hh³j�(h´Mrubeh}”(h]”h ]”(jPŒfunction”eh"]”h$]”h&]”jUjPjVj8*jWj8*jX‰jY‰jZ‰uh1jÍh²hhj�h³Nh´Nubj\)�”}”(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]”jf)�”}”(hjB*h]”hŒ Parameters”…”�”}”(hjD*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jehj@*ubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œl/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:240: ./drivers/counter/counter-chrdev.c”h´Mvhj<*ubj¨)�”}”(hhh]”(j­)�”}”(hŒF``struct counter_device *const counter`` pointer to Counter structure ”h]”(j³)�”}”(hŒ(``struct counter_device *const counter``”h]”j¹)�”}”(hja*h]”hŒ$struct counter_device *const counter”…”�”}”(hjc*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj_*ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œl/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:240: ./drivers/counter/counter-chrdev.c”h´Mshj[*ubjÏ)�”}”(hhh]”hï)�”}”(hŒpointer to Counter structure”h]”hŒpointer to Counter structure”…”�”}”(hjz*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jv*h´Mshjw*ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj[*ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jv*h´MshjX*ubj­)�”}”(hŒ#``const u8 event`` triggered event ”h]”(j³)�”}”(hŒ``const u8 event``”h]”j¹)�”}”(hjš*h]”hŒconst u8 event”…”�”}”(hjœ*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj˜*ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œl/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:240: ./drivers/counter/counter-chrdev.c”h´Mthj”*ubjÏ)�”}”(hhh]”hï)�”}”(hŒtriggered event”h]”hŒtriggered event”…”�”}”(hj³*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³j¯*h´Mthj°*ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhj”*ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³j¯*h´MthjX*ubj­)�”}”(hŒ#``const u8 channel`` event channel ”h]”(j³)�”}”(hŒ``const u8 channel``”h]”j¹)�”}”(hjÓ*h]”hŒconst u8 channel”…”�”}”(hjÕ*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjÑ*ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²h³Œl/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:240: ./drivers/counter/counter-chrdev.c”h´MuhjÍ*ubjÏ)�”}”(hhh]”hï)�”}”(hŒ event channel”h]”hŒ event channel”…”�”}”(hjì*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jè*h´Muhjé*ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÎhjÍ*ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¬h³jè*h´MuhjX*ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j§hj<*ubhï)�”}”(hŒ**Note**”h]”jf)�”}”(hj+h]”hŒNote”…”�”}”(hj+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jehj +ubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œl/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:240: ./drivers/counter/counter-chrdev.c”h´Mwhj<*ubhï)�”}”(hŒIIf no one is watching for the respective event, it is silently discarded.”h]”hŒIIf no one is watching for the respective event, it is silently discarded.”…”�”}”(hj$+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œl/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:240: ./drivers/counter/counter-chrdev.c”h´Mwhj<*ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j[hj�h²hh³Nh´Nubeh}”(h]”Œ driver-api”ah ]”h"]”Œ driver api”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KãubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒDriver Implementation”h]”hŒDriver Implementation”…”�”}”(hjE+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjB+h²hh³hÇh´Kôubhï)�”}”(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.”…”�”}”(hjS+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KöhjB+h²hubhï)�”}”(hXÀCounter 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]”hXÀCounter 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.”…”�”}”(hja+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KühjB+h²hubhï)�”}”(hŒÿDriver 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.”…”�”}”(hjo+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MhjB+h²hubhï)�”}”(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().”…”�”}”(hj}+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M hjB+h²hubhï)�”}”(hŒiThe struct counter_comp structure is used to define counter extensions for Signals, Synapses, and Counts.”h]”hŒiThe struct counter_comp structure is used to define counter extensions for Signals, Synapses, and Counts.”…”�”}”(hj‹+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MhjB+h²hubhï)�”}”(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]”(hŒ�The “typeâ€� member specifies the type of high-level data (e.g. BOOL, COUNT_DIRECTION, etc.) handled by this extension. The “”…”�”}”(hj™+h²hh³Nh´Nubj¹)�”}”(hŒ ``*_read``”h]”hŒ*_read”…”�”}”(hj¡+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj™+ubhŒ â€� and “”…”�”}”(hj™+h²hh³Nh´Nubj¹)�”}”(hŒ ``*_write``”h]”hŒ*_write”…”�”}”(hj³+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj™+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™+h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MhjB+h²hubhï)�”}”(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]”(hŒConvenience macros such as ”…”�”}”(hjË+h²hh³Nh´Nubj¹)�”}”(hŒ``COUNTER_COMP_COUNT_U64``”h]”hŒCOUNTER_COMP_COUNT_U64”…”�”}”(hjÓ+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjË+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Ë+h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MhjB+h²hubj)�”}”(hŒçstruct 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]”hŒçstruct 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&]”hÅhÆuh1jh³hÇh´MhjB+h²hubhï)�”}”(hŒÎThis 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]”hŒÚThis 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ù+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M$hjB+h²hubhï)�”}”(hŒÕCallbacks 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]”(hŒ«Callbacks 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,h²hh³Nh´Nubj¹)�”}”(hŒ ``*_read``”h]”hŒ*_read”…”�”}”(hj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj,ubhŒ â€� and “”…”�”}”(hj,h²hh³Nh´Nubj¹)�”}”(hŒ ``*_write``”h]”hŒ*_write”…”�”}”(hj!,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj,ubhŒâ€� union members.”…”�”}”(hj,h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M(hjB+h²hubhï)�”}”(hŒkThe corresponding callback prototypes for the extensions mentioned in the previous example above would be::”h]”hŒjThe corresponding callback prototypes for the extensions mentioned in the previous example above would be:”…”�”}”(hj9,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M-hjB+h²hubj)�”}”(hX“int 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]”hX“int 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);”…”�”}”hjG,sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jh³hÇh´M0hjB+h²hubhï)�”}”(hŒADetermining the type of extension to create is a matter of scope.”h]”hŒADetermining the type of extension to create is a matter of scope.”…”�”}”(hjU,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M<hjB+h²hubj4)�”}”(hhh]”(j9)�”}”(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ï)�”}”(hŒ Signal 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]”hŒ¢Signal extensions are attributes that expose information/control specific to a Signal. These types of attributes will exist under a Signal’s directory in sysfs.”…”�”}”(hjj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M>hjf,ubhï)�”}”(hŒ´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Œ¸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”…”�”}”(hjx,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MBhjf,ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j8hjc,h²hh³hÇh´Nubj9)�”}”(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ï)�”}”(hŒœCount 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]”hŒžCount 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�,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MFhjŒ,ubhï)�”}”(hŒ²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Œ¶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”…”�”}”(hjž,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MJhjŒ,ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j8hjc,h²hh³hÇh´Nubj9)�”}”(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ï)�”}”(hŒÅDevice 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]”hŒÅDevice 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¶,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MNhj²,ubhï)�”}”(hŒ·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Œ»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”…”�”}”(hjÄ,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MRhj²,ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j8hjc,h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jˆj‰uh1j3h³hÇh´M>hjB+h²hubeh}”(h]”Œdriver-implementation”ah ]”h"]”Œdriver implementation”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KôubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒSubsystem Architecture”h]”hŒSubsystem Architecture”…”�”}”(hjé,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjæ,h²hh³hÇh´MWubhï)�”}”(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]”(hŒ2Counter drivers pass and take data natively (i.e. ”…”�”}”(hj÷,h²hh³Nh´Nubj¹)�”}”(hŒ``u8``”h]”hŒu8”…”�”}”(hjÿ,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj÷,ubhŒ, ”…”�”}”(hj÷,h²hh³Nh´Nubj¹)�”}”(hŒ``u64``”h]”hŒu64”…”�”}”(hj-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj÷,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÷,h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MYhjæ,h²hubhï)�”}”(hŒìA 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]”hŒëA 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)-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M_hjæ,h²hubj)�”}”(hX«Driver 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]”hX«Driver 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 | +--------------------+ +---------------------+”…”�”}”hj7-sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jh³hÇh´Mdhjæ,h²hubhï)�”}”(hŒpThereafter, data can be transferred directly between the Counter device driver and Counter userspace interface::”h]”hŒoThereafter, data can be transferred directly between the Counter device driver and Counter userspace interface:”…”�”}”(hjE-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Mˆhjæ,h²hubj)�”}”(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" / --------------------------------------------------”…”�”}”hjS-sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jh³hÇh´M‹hjæ,h²hubhï)�”}”(hŒ+There are four primary components involved:”h]”hŒ+There are four primary components involved:”…”�”}”(hja-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MÅhjæ,h²hubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒCounter device driver”h]”hŒCounter device driver”…”�”}”(hjr-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjo-h²hh³hÇh´MÈubhï)�”}”(hŒtCommunicates with the hardware device to read/write data; e.g. counter drivers for quadrature encoders, timers, etc.”h]”hŒtCommunicates with the hardware device to read/write data; e.g. counter drivers for quadrature encoders, timers, etc.”…”�”}”(hj€-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MÉhjo-h²hubeh}”(h]”Œcounter-device-driver”ah ]”h"]”Œcounter device driver”ah$]”h&]”uh1hÈhjæ,h²hh³hÇh´MÈubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Counter core”h]”hŒ Counter core”…”�”}”(hj™-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj–-h²hh³hÇh´MÍubhï)�”}”(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§-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MÎhj–-h²hubeh}”(h]”Œ counter-core”ah ]”h"]”Œ counter core”ah$]”h&]”uh1hÈhjæ,h²hh³hÇh´MÍubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Counter sysfs”h]”hŒ Counter sysfs”…”�”}”(hjÀ-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj½-h²hh³hÇh´MÒubhï)�”}”(hŒVTranslates counter data to the standard Counter sysfs interface format and vice versa.”h]”hŒVTranslates counter data to the standard Counter sysfs interface format and vice versa.”…”�”}”(hjÎ-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MÓhj½-h²hubhï)�”}”(hŒšPlease refer to the Documentation/ABI/testing/sysfs-bus-counter file for a detailed breakdown of the available Generic Counter interface sysfs attributes.”h]”hŒšPlease refer to the Documentation/ABI/testing/sysfs-bus-counter file for a detailed breakdown of the available Generic Counter interface sysfs attributes.”…”�”}”(hjÜ-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MÖhj½-h²hubeh}”(h]”Œ counter-sysfs”ah ]”h"]”Œ counter sysfs”ah$]”h&]”uh1hÈhjæ,h²hh³hÇh´MÒubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒCounter chrdev”h]”hŒCounter chrdev”…”�”}”(hjõ-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjò-h²hh³hÇh´MÛubhï)�”}”(hŒ¶Translates 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]”hŒ¶Translates 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.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MÜhjò-h²hubeh}”(h]”Œcounter-chrdev”ah ]”h"]”Œcounter chrdev”ah$]”h&]”uh1hÈhjæ,h²hh³hÇh´MÛubeh}”(h]”Œsubsystem-architecture”ah ]”h"]”Œsubsystem architecture”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´MWubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒSysfs Interface”h]”hŒSysfs Interface”…”�”}”(hj$.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj!.h²hh³hÇh´Máubhï)�”}”(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 ”…”�”}”(hj2.h²hh³Nh´Nubj¹)�”}”(hŒ%``/sys/bus/counter/devices/counterX``”h]”hŒ!/sys/bus/counter/devices/counterX”…”�”}”(hj:.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj2.ubhŒ directory, where ”…”�”}”(hj2.h²hh³Nh´Nubj¹)�”}”(hŒ``X``”h]”hŒX”…”�”}”(hjL.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj2.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.”…”�”}”(hj2.h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Mãhj!.h²hubhï)�”}”(hŒ Through these sysfs attributes, programs and scripts may interact with the Generic Counter paradigm Counts, Signals, and Synapses of respective counter devices.”h]”hŒ Through these sysfs attributes, programs and scripts may interact with the Generic Counter paradigm Counts, Signals, and Synapses of respective counter devices.”…”�”}”(hjd.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Méhj!.h²hubeh}”(h]”Œsysfs-interface”ah ]”h"]”Œsysfs interface”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´MáubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒCounter Character Device”h]”hŒCounter Character Device”…”�”}”(hj}.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjz.h²hh³hÇh´Mîubhï)�”}”(hŒúCounter 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]”(hŒ5Counter character device nodes are created under the ”…”�”}”(hj‹.h²hh³Nh´Nubj¹)�”}”(hŒ``/dev``”h]”hŒ/dev”…”�”}”(hj“.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj‹.ubhŒ directory as ”…”�”}”(hj‹.h²hh³Nh´Nubj¹)�”}”(hŒ ``counterX``”h]”hŒcounterX”…”�”}”(hj¥.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj‹.ubhŒ, where ”…”�”}”(hj‹.h²hh³Nh´Nubj¹)�”}”(hŒ``X``”h]”hŒX”…”�”}”(hj·.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj‹.ubhŒp is the respective counter device id. Defines for the standard Counter data types are exposed via the userspace ”…”�”}”(hj‹.h²hh³Nh´Nubj¹)�”}”(hŒ ``include/uapi/linux/counter.h``”h]”hŒinclude/uapi/linux/counter.h”…”�”}”(hjÉ.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj‹.ubhŒ file.”…”�”}”(hj‹.h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Mðhjz.h²hubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒCounter events”h]”hŒCounter events”…”�”}”(hjä.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjá.h²hh³hÇh´Möubhï)�”}”(hŒdCounter device drivers can support Counter events by utilizing the ``counter_push_event`` function::”h]”(hŒCCounter device drivers can support Counter events by utilizing the ”…”�”}”(hjò.h²hh³Nh´Nubj¹)�”}”(hŒ``counter_push_event``”h]”hŒcounter_push_event”…”�”}”(hjú.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjò.ubhŒ function:”…”�”}”(hjò.h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M÷hjá.h²hubj)�”}”(hŒxvoid counter_push_event(struct counter_device *const counter, const u8 event, const u8 channel);”h]”hŒxvoid counter_push_event(struct counter_device *const counter, const u8 event, const u8 channel);”…”�”}”hj/sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jh³hÇh´Múhjá.h²hubhï)�”}”(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 /h²hh³Nh´Nubj¹)�”}”(hŒ ``event``”h]”hŒevent”…”�”}”(hj(/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj /ubhŒ5 parameter; the event channel id is specified by the ”…”�”}”(hj /h²hh³Nh´Nubj¹)�”}”(hŒ ``channel``”h]”hŒchannel”…”�”}”(hj:/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj /ubhŒs parameter. When this function is called, the Counter data associated with the respective event is gathered, and a ”…”�”}”(hj /h²hh³Nh´Nubj¹)�”}”(hŒ``struct counter_event``”h]”hŒstruct counter_event”…”�”}”(hjL/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj /ubhŒ5 is generated for each datum and pushed to userspace.”…”�”}”(hj /h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Mýhjá.h²hubhï)�”}”(hŒ³Counter 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]”hŒ³Counter 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:”…”�”}”(hjd/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Mhjá.h²hubhŒ 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]”hŒtable”“”)�”}”(hhh]”hŒtgroup”“”)�”}”(hhh]”(hŒcolspec”“”)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1j‚/hj/ubjƒ/)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1j‚/hj/ubhŒthead”“”)�”}”(hhh]”hŒrow”“”)�”}”(hhh]”(hŒentry”“”)�”}”(hhh]”hï)�”}”(hŒCOUNTER_EVENT_OVERFLOW”h]”hŒCOUNTER_EVENT_OVERFLOW”…”�”}”(hj§/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Mhj¤/ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¢/hjŸ/ubj£/)�”}”(hhh]”hï)�”}”(hŒCOUNTER_EVENT_INDEX”h]”hŒCOUNTER_EVENT_INDEX”…”�”}”(hj¾/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Mhj»/ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¢/hjŸ/ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�/hjš/ubah}”(h]”h ]”h"]”h$]”h&]”uh1j˜/hj/ubhŒtbody”“”)�”}”(hhh]”(jž/)�”}”(hhh]”(j£/)�”}”(hhh]”hï)�”}”(hŒ Channel 0”h]”hŒ Channel 0”…”�”}”(hjé/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M hjæ/ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¢/hjã/ubj£/)�”}”(hhh]”hï)�”}”(hŒ Channel 0”h]”hŒ Channel 0”…”�”}”(hj0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M hjý/ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¢/hjã/ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�/hjà/ubjž/)�”}”(hhh]”(j£/)�”}”(hhh]”j4)�”}”(hhh]”(j9)�”}”(hŒCount 0”h]”hï)�”}”(hj%0h]”hŒCount 0”…”�”}”(hj'0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M hj#0ubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hj 0ubj9)�”}”(hŒCount 1”h]”hï)�”}”(hj<0h]”hŒCount 1”…”�”}”(hj>0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M hj:0ubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hj 0ubj9)�”}”(hŒSignal 3”h]”hï)�”}”(hjS0h]”hŒSignal 3”…”�”}”(hjU0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MhjQ0ubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hj 0ubj9)�”}”(hŒCount 4 Extension 2”h]”hï)�”}”(hjj0h]”hŒCount 4 Extension 2”…”�”}”(hjl0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Mhjh0ubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hj 0ubj9)�”}”(hŒSignal 5 Extension 0 ”h]”hï)�”}”(hŒSignal 5 Extension 0”h]”hŒSignal 5 Extension 0”…”�”}”(hjƒ0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Mhj0ubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hj 0ubeh}”(h]”h ]”h"]”h$]”h&]”jˆj‰uh1j3h³hÇh´M hj0ubah}”(h]”h ]”h"]”h$]”h&]”Œmorerows”Kuh1j¢/hj0ubj£/)�”}”(hhh]”j4)�”}”(hhh]”(j9)�”}”(hŒSignal 0”h]”hï)�”}”(hj¬0h]”hŒSignal 0”…”�”}”(hj®0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M hjª0ubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hj§0ubj9)�”}”(hŒSignal 0 Extension 0”h]”hï)�”}”(hjÃ0h]”hŒSignal 0 Extension 0”…”�”}”(hjÅ0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M hjÁ0ubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hj§0ubj9)�”}”(hŒ Extension 4”h]”hï)�”}”(hjÚ0h]”hŒ Extension 4”…”�”}”(hjÜ0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MhjØ0ubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hj§0ubeh}”(h]”h ]”h"]”h$]”h&]”jˆj‰uh1j3h³hÇh´M hj¤0ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¢/hj0ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�/hjà/ubjž/)�”}”(hhh]”j£/)�”}”(hhh]”hï)�”}”(hŒ Channel 1”h]”hŒ Channel 1”…”�”}”(hj1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Mhj1ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¢/hj1ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�/hjà/ubjž/)�”}”(hhh]”j£/)�”}”(hhh]”j4)�”}”(hhh]”(j9)�”}”(hŒSignal 4”h]”hï)�”}”(hj,1h]”hŒSignal 4”…”�”}”(hj.1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Mhj*1ubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hj'1ubj9)�”}”(hŒSignal 4 Extension 0”h]”hï)�”}”(hjC1h]”hŒSignal 4 Extension 0”…”�”}”(hjE1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MhjA1ubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hj'1ubj9)�”}”(hŒCount 7”h]”hï)�”}”(hjZ1h]”hŒCount 7”…”�”}”(hj\1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MhjX1ubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hj'1ubeh}”(h]”h ]”h"]”h$]”h&]”jˆj‰uh1j3h³hÇh´Mhj$1ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¢/hj!1ubah}”(h]”h ]”h"]”h$]”h&]”uh1j�/hjà/ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÞ/hj/ubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1j}/hjz/ubah}”(h]”h ]”h"]”h$]”h&]”uh1jx/hjt/ubah}”(h]”h ]”h"]”h$]”h&]”uh1jr/h³hÇh´Mhjá.h²hubhï)�”}”(hX¡When ``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]”(hŒWhen ”…”�”}”(hjš1h²hh³Nh´Nubj¹)�”}”(hŒ7``counter_push_event(counter, COUNTER_EVENT_INDEX, 1)``”h]”hŒ3counter_push_event(counter, COUNTER_EVENT_INDEX, 1)”…”�”}”(hj¢1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjš1ubhŒ9 is called for example, it will go down the list for the ”…”�”}”(hjš1h²hh³Nh´Nubj¹)�”}”(hŒ``COUNTER_EVENT_INDEX``”h]”hŒCOUNTER_EVENT_INDEX”…”�”}”(hj´1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjš1ubhŒ˜ 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 ”…”�”}”(hjš1h²hh³Nh´Nubj¹)�”}”(hŒ``struct counter_event``”h]”hŒstruct counter_event”…”�”}”(hjÆ1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjš1ubhŒe, which userspace can retrieve via a standard read operation on the respective character device node.”…”�”}”(hjš1h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Mhjá.h²hubeh}”(h]”Œcounter-events”ah ]”h"]”Œcounter events”ah$]”h&]”uh1hÈhjz.h²hh³hÇh´MöubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Userspace”h]”hŒ Userspace”…”�”}”(hjé1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjæ1h²hh³hÇh´Mubhï)�”}”(hŒ×Userspace 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]”(hŒ­Userspace applications can configure Counter events via ioctl operations on the Counter character device node. There following ioctl codes are supported and provided by the ”…”�”}”(hj÷1h²hh³Nh´Nubj¹)�”}”(hŒ``linux/counter.h``”h]”hŒlinux/counter.h”…”�”}”(hjÿ1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj÷1ubhŒ userspace header file:”…”�”}”(hj÷1h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M hjæ1h²hubj4)�”}”(hhh]”(j9)�”}”(hŒ#:c:macro:`COUNTER_ADD_WATCH_IOCTL` ”h]”hï)�”}”(hŒ":c:macro:`COUNTER_ADD_WATCH_IOCTL`”h]”h)�”}”(hj 2h]”j¹)�”}”(hj 2h]”hŒCOUNTER_ADD_WATCH_IOCTL”…”�”}”(hj%2h²hh³Nh´Nubah}”(h]”h ]”(Œxref”jPŒc-macro”eh"]”h$]”h&]”uh1j¸hj"2ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”Œdriver-api/generic-counter”Œ refdomain”jPŒreftype”Œmacro”Œ refexplicit”‰Œrefwarn”‰jÿj)�”}”j]”sbŒ reftarget”ŒCOUNTER_ADD_WATCH_IOCTL”uh1hh³hÇh´M$hj2ubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M$hj2ubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hj2h²hh³hÇh´Nubj9)�”}”(hŒ':c:macro:`COUNTER_ENABLE_EVENTS_IOCTL` ”h]”hï)�”}”(hŒ&:c:macro:`COUNTER_ENABLE_EVENTS_IOCTL`”h]”h)�”}”(hjX2h]”j¹)�”}”(hjX2h]”hŒCOUNTER_ENABLE_EVENTS_IOCTL”…”�”}”(hj]2h²hh³Nh´Nubah}”(h]”h ]”(j/2jPŒc-macro”eh"]”h$]”h&]”uh1j¸hjZ2ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j;2Œ refdomain”jPŒreftype”Œmacro”Œ refexplicit”‰Œrefwarn”‰jÿjA2jD2ŒCOUNTER_ENABLE_EVENTS_IOCTL”uh1hh³hÇh´M&hjV2ubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M&hjR2ubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hj2h²hh³hÇh´Nubj9)�”}”(hŒ(:c:macro:`COUNTER_DISABLE_EVENTS_IOCTL` ”h]”hï)�”}”(hŒ':c:macro:`COUNTER_DISABLE_EVENTS_IOCTL`”h]”h)�”}”(hjŠ2h]”j¹)�”}”(hjŠ2h]”hŒCOUNTER_DISABLE_EVENTS_IOCTL”…”�”}”(hj�2h²hh³Nh´Nubah}”(h]”h ]”(j/2jPŒc-macro”eh"]”h$]”h&]”uh1j¸hjŒ2ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j;2Œ refdomain”jPŒreftype”Œmacro”Œ refexplicit”‰Œrefwarn”‰jÿjA2jD2ŒCOUNTER_DISABLE_EVENTS_IOCTL”uh1hh³hÇh´M(hjˆ2ubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M(hj„2ubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hj2h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jˆj‰uh1j3h³hÇh´M$hjæ1h²hubhï)�”}”(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]”(hŒCTo configure events to gather Counter data, users first populate a ”…”�”}”(hj¼2h²hh³Nh´Nubj¹)�”}”(hŒ``struct counter_watch``”h]”hŒstruct counter_watch”…”�”}”(hjÄ2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj¼2ubhŒ’ 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 ”…”�”}”(hj¼2h²hh³Nh´Nubj¹)�”}”(hŒ``COUNTER_ADD_WATCH_IOCTL``”h]”hŒCOUNTER_ADD_WATCH_IOCTL”…”�”}”(hjÖ2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj¼2ubhŒ ioctl command.”…”�”}”(hj¼2h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M*hjæ1h²hubhï)�”}”(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]”(hŒPNote that an event can be watched without gathering Counter data by setting the ”…”�”}”(hjî2h²hh³Nh´Nubj¹)�”}”(hŒ``component.type``”h]”hŒcomponent.type”…”�”}”(hjö2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjî2ubhŒ member equal to ”…”�”}”(hjî2h²hh³Nh´Nubj¹)�”}”(hŒ``COUNTER_COMPONENT_NONE``”h]”hŒCOUNTER_COMPONENT_NONE”…”�”}”(hj3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjî2ubhŒv. With this configuration the Counter character device will simply populate the event timestamps for those respective ”…”�”}”(hjî2h²hh³Nh´Nubj¹)�”}”(hŒ``struct counter_event``”h]”hŒstruct counter_event”…”�”}”(hj3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjî2ubhŒ) elements and ignore the component value.”…”�”}”(hjî2h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M0hjæ1h²hubhï)�”}”(hŒ·The ``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]”(hŒThe ”…”�”}”(hj23h²hh³Nh´Nubj¹)�”}”(hŒ``COUNTER_ADD_WATCH_IOCTL``”h]”hŒCOUNTER_ADD_WATCH_IOCTL”…”�”}”(hj:3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj23ubhŒ< command will buffer these Counter watches. When ready, the ”…”�”}”(hj23h²hh³Nh´Nubj¹)�”}”(hŒ``COUNTER_ENABLE_EVENTS_IOCTL``”h]”hŒCOUNTER_ENABLE_EVENTS_IOCTL”…”�”}”(hjL3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hj23ubhŒ= ioctl command may be used to activate these Counter watches.”…”�”}”(hj23h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M7hjæ1h²hubhï)�”}”(hŒÊUserspace 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 ”…”�”}”(hjd3h²hh³Nh´Nubj¹)�”}”(hŒ``read``”h]”hŒread”…”�”}”(hjl3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjd3ubhŒ operation (optionally calling ”…”�”}”(hjd3h²hh³Nh´Nubj¹)�”}”(hŒ``poll``”h]”hŒpoll”…”�”}”(hj~3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjd3ubhŒ9 first) on the Counter character device node to retrieve ”…”�”}”(hjd3h²hh³Nh´Nubj¹)�”}”(hŒ``struct counter_event``”h]”hŒstruct counter_event”…”�”}”(hj�3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j¸hjd3ubhŒ elements with the desired data.”…”�”}”(hjd3h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M;hjæ1h²hubeh}”(h]”Œ userspace”ah ]”h"]”Œ userspace”ah$]”h&]”uh1hÈhjz.h²hh³hÇh´Mubeh}”(h]”Œcounter-character-device”ah ]”h"]”Œcounter character device”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´Mîubeh}”(h]”Œgeneric-counter-interface”ah ]”h"]”Œgeneric counter interface”ah$]”h&]”uh1hÈhhh²hh³hÇh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÇuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)�”}”(hÍNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”j¢/Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jâ3Œerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÇŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(j½3jº3jjjójðjjj½jºjëjèjšj—j?+j<+jã,jà,j.j.j“-j�-jº-j·-jï-jì-j.j.jw.jt.jµ3j²3jã1jà1j­3jª3uŒ nametypes”}”(j½3‰j‰jó‰j‰j½‰jë‰jš‰j?+‰jã,‰j.‰j“-‰jº-‰jï-‰j.‰jw.‰jµ3‰jã1‰j­3‰uh}”(jº3hÊjhÝjðjjjŠjºjjèjÀj—jöj<+j�jËjÔjB jG jj j�j’jOjTjjjÜjájJjOj!j&jÄ jÉ jT"jY"jð#jõ#j-&j2&jr(jw(jà,jB+j.jæ,j�-jo-j·-j–-jì-j½-j.jò-jt.j!.j²3jz.jà1já.jª3jæ1uŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.