€•KŒ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Œ block_quote”“”)�”}”(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); }; }; ”h]”(hï)�”}”(hŒ**Definition**::”h]”(hŒstrong”“”)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hjmh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jkhjgubhŒ:”…”�”}”(hjgh²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,hjcubj)�”}”(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.hjcubeh}”(h]”h ]”h"]”h$]”h&]”uh1jah³j…h´K,hj]ubhï)�”}”(hŒ **Members**”h]”jl)�”}”(hj�h]”hŒMembers”…”�”}”(hjŸh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jkhj›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”…”�”}”(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Œdevice-specific component name”h]”hŒdevice-specific component name”…”�”}”(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Œ!``priv`` component-relevant data ”h]”(j¿)�”}”(hŒ``priv``”h]”jÅ)�”}”(hj8h]”hŒpriv”…”�”}”(hj:h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÄhj6ubah}”(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,hj2ubjÛ)�”}”(hhh]”hï)�”}”(hŒcomponent-relevant data”h]”hŒcomponent-relevant data”…”�”}”(hjQh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jMh´K,hjNubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhj2ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³jMh´K,hjµubj¹)�”}”(hŒ``{unnamed_union}`` anonymous ”h]”(j¿)�”}”(hŒ``{unnamed_union}``”h]”jÅ)�”}”(hjqh]”hŒ{unnamed_union}”…”�”}”(hjsh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÄhjoubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´KhjkubjÛ)�”}”(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Úhjkubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³j†h´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”…”�”}”(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´K5hjubjÛ)�”}”(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.”…”�”}”(hj7h²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´K3hj4ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³j3h´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Å)�”}”(hjXh]”hŒsignal_u8_read”…”�”}”(hjZh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÄhjVubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´K8hjRubjÛ)�”}”(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.”…”�”}”(hjqh²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´K6hjnubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhjRubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³jmh´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Å)�”}”(hjh]”hŒsignal_u32_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´KAhjubjÛ)�”}”(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Úhjubeh}”(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Å)�”}”(hj@h]”hŒdevice_u64_read”…”�”}”(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´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.”…”�”}”(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´KBhjVubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhj:ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³jUh´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Å)�”}”(hjzh]”hŒcount_u64_read”…”�”}”(hj|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÄhjxubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´KGhjtubjÛ)�”}”(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Úhjtubeh}”(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.”…”�”}”(hjA 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´KQhj> ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhj" ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³j= 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Å)�”}”(hjb h]”hŒcount_array_u64_read”…”�”}”(hjd 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 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.”…”�”}”(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´KWhjx ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhj\ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³jw 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Å)�”}”(hjI h]”hŒdevice_u8_write”…”�”}”(hjK h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÄhjG 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´KhhjC 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.”…”�”}”(hjb 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´Kfhj_ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhjC ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³j^ 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Å)�”}”(hjƒ h]”hŒcount_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´Kkhj} 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Úhj} 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Å)�”}”(hj1 h]”hŒcount_u32_write”…”�”}”(hj3 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.”…”�”}”(hjJ 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´KrhjG ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhj+ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³jF 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Å)�”}”(hjk h]”hŒsignal_u32_write”…”�”}”(hjm h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÄhji 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´Kwhje 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.”…”�”}”(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´Kuhj� ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhje ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³j€ 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.”…”�”}”(hj2 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Å)�”}”(hjS h]”hŒsignal_array_u32_write”…”�”}”(hjU h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÄhjQ 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†hjM 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.”…”�”}”(hjl 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�hji ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhjM ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³jh 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”…”�”}”(hj[ h²hh³Nh´Nubah}”(h]”h ]”jëah"]”h$]”h&]”uh1jÞhjW h²hh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Kžubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hji h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhjW h²hh³jh h´Kžubj)�”}”(hŒcounter_signal”h]”j)�”}”(hjU h]”hŒcounter_signal”…”�”}”(hj{ h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjw ubah}”(h]”h ]”(jjeh"]”h$]”h&]”hÅhÆuh1jhjW h²hh³jh h´Kžubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj%ˆuh1jØj&j'hjS h²hh³jh h´Kžubah}”(h]”jN ah ]”(j+j,eh"]”h$]”h&]”j0ˆj1)j2huh1jÒh³jh h´KžhjP 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&]”uh1j3hjP h²hh³jh h´Kžubeh}”(h]”h ]”(jPŒstruct”eh"]”h$]”h&]”jUjPjVjµ jWjµ jX‰jY‰jZ‰uh1jÍh²hhj�h³Nh´Nubj\)�”}”(hXv **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]”(jb)�”}”(hŒ•**Definition**:: struct counter_signal { int id; const char *name; struct counter_comp *ext; size_t num_ext; }; ”h]”(hï)�”}”(hŒ**Definition**::”h]”(jl)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hjÅ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jkhjÁ 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Œvstruct counter_signal { int id; const char *name; struct counter_comp *ext; size_t num_ext; };”h]”hŒvstruct 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½ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jah³jÝ h´Kèhj¹ ubhï)�”}”(hŒ **Members**”h]”jl)�”}”(hjõ h]”hŒMembers”…”�”}”(hj÷ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jkhjó 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Å)�”}”(hjh]”hŒid”…”�”}”(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´KæhjubjÛ)�”}”(hhh]”hï)�”}”(hŒ%unique ID used to identify the Signal”h]”hŒ%unique ID used to identify the Signal”…”�”}”(hj-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³j)h´Kæhj*ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³j)h´Kæhj ubj¹)�”}”(hŒ%``name`` device-specific Signal name ”h]”(j¿)�”}”(hŒ``name``”h]”jÅ)�”}”(hjMh]”hŒname”…”�”}”(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´KçhjGubjÛ)�”}”(hhh]”hï)�”}”(hŒdevice-specific Signal name”h]”hŒdevice-specific Signal name”…”�”}”(hjfh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jbh´Kçhjcubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhjGubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³jbh´Kçhj ubj¹)�”}”(hŒ,``ext`` optional array of Signal 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´Kèhj€ubjÛ)�”}”(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Úhj€ubeh}”(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´Nubjl)�”}”(hŒ**ext**”h]”hŒext”…”�”}”(hjàh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jkhjØ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”…”�”}”(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Œ ”…”�”}”(hj5h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhj#h²hh³j4h´Kïubj)�”}”(hŒcounter_synapse”h]”j)�”}”(hj!h]”hŒcounter_synapse”…”�”}”(hjGh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjCubah}”(h]”h ]”(jjeh"]”h$]”h&]”hÅhÆuh1jhj#h²hh³j4h´Kïubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj%ˆuh1jØj&j'hjh²hh³j4h´Kïubah}”(h]”jah ]”(j+j,eh"]”h$]”h&]”j0ˆj1)j2huh1jÒh³j4h´Kïhjh²hubj4)�”}”(hhh]”hï)�”}”(hŒCounter Synapse node”h]”hŒCounter Synapse node”…”�”}”(hjih²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óhjfh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j3hjh²hh³j4h´Kïubeh}”(h]”h ]”(jPŒstruct”eh"]”h$]”h&]”jUjPjVj�jWj�jX‰jY‰jZ‰uh1jÍh²hhj�h³Nh´Nubj\)�”}”(hXq **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]”(jb)�”}”(hŒ®**Definition**:: struct counter_synapse { const enum counter_synapse_action *actions_list; size_t num_actions; struct counter_signal *signal; }; ”h]”(hï)�”}”(hŒ**Definition**::”h]”(jl)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hj‘h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jkhj�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Œ‘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ùhj‰ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jah³j©h´K÷hj…ubhï)�”}”(hŒ **Members**”h]”jl)�”}”(hjÁh]”hŒMembers”…”�”}”(hjÃh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jkhj¿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Œ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Å)�”}”(hjh]”hŒ num_actions”…”�”}”(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´KöhjubjÛ)�”}”(hhh]”hï)�”}”(hŒ4number of action modes specified in **actions_list**”h]”(hŒ$number of action modes specified in ”…”�”}”(hj2h²hh³Nh´Nubjl)�”}”(hŒ**actions_list**”h]”hŒ actions_list”…”�”}”(hj:h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jkhj2ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³j.h´Köhj/ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³j.h´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öhjZubjÛ)�”}”(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ÚhjZubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³juh´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_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&]”jUjPjVjjWjjX‰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]”(jb)�”}”(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; }; ”h]”(hï)�”}”(hŒ**Definition**::”h]”(jl)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hj$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jkhj 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´Mhjubj)�”}”(hXstruct 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]”hXstruct 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; };”…”�”}”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´Mhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jah³j<h´Mhjubhï)�”}”(hŒ **Members**”h]”jl)�”}”(hjTh]”hŒMembers”…”�”}”(hjVh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jkhjRubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Mhjubj´)�”}”(hhh]”(j¹)�”}”(hŒ,``id`` unique ID used to identify the Count ”h]”(j¿)�”}”(hŒ``id``”h]”jÅ)�”}”(hjsh]”hŒid”…”�”}”(hjuh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÄhjqubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´MhjmubjÛ)�”}”(hhh]”hï)�”}”(hŒ$unique ID used to identify the Count”h]”hŒ$unique ID used to identify the Count”…”�”}”(hjŒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jˆh´Mhj‰ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhjmubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³jˆh´Mhjjubj¹)�”}”(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´Mhjjubj¹)�”}”(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´Mhjjubj¹)�”}”(hŒK``num_functions`` number of function modes specified in **functions_list** ”h]”(j¿)�”}”(hŒ``num_functions``”h]”jÅ)�”}”(hjh]”hŒ num_functions”…”�”}”(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´MhjubjÛ)�”}”(hhh]”hï)�”}”(hŒ8number of function modes specified in **functions_list**”h]”(hŒ&number of function modes specified in ”…”�”}”(hj7h²hh³Nh´Nubjl)�”}”(hŒ**functions_list**”h]”hŒfunctions_list”…”�”}”(hj?h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jkhj7ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³j3h´Mhj4ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³j3h´Mhjjubj¹)�”}”(hŒ2``synapses`` array of Synapses for initialization ”h]”(j¿)�”}”(hŒ ``synapses``”h]”jÅ)�”}”(hjeh]”hŒsynapses”…”�”}”(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´Mhj_ubjÛ)�”}”(hhh]”hï)�”}”(hŒ$array of Synapses for initialization”h]”hŒ$array of Synapses for initialization”…”�”}”(hj~h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jzh´Mhj{ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhj_ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³jzh´Mhjjubj¹)�”}”(hŒ>``num_synapses`` number of Synapses specified in **synapses** ”h]”(j¿)�”}”(hŒ``num_synapses``”h]”jÅ)�”}”(hjžh]”hŒ num_synapses”…”�”}”(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 Synapses specified in **synapses**”h]”(hŒ number of Synapses specified in ”…”�”}”(hj·h²hh³Nh´Nubjl)�”}”(hŒ **synapses**”h]”hŒsynapses”…”�”}”(hj¿h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jkhj·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´Mhjjubj¹)�”}”(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´Mhjjubj¹)�”}”(hŒ;``num_ext`` number of Count extensions specified in **ext**”h]”(j¿)�”}”(hŒ ``num_ext``”h]”jÅ)�”}”(hjh]”hŒnum_ext”…”�”}”(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´MhjubjÛ)�”}”(hhh]”hï)�”}”(hŒ/number of Count extensions specified in **ext**”h]”(hŒ(number of Count extensions specified in ”…”�”}”(hj7h²hh³Nh´Nubjl)�”}”(hŒ**ext**”h]”hŒext”…”�”}”(hj?h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jkhj7ubeh}”(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 hj4ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³j3h´Mhjjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j³hjubeh}”(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Þhj‚h²hh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´Mubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj”h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhj‚h²hh³j“h´Mubj)�”}”(hŒcounter_event_node”h]”j)�”}”(hj€h]”hŒcounter_event_node”…”�”}”(hj¦h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj¢ubah}”(h]”h ]”(jjeh"]”h$]”h&]”hÅhÆuh1jhj‚h²hh³j“h´Mubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj%ˆuh1jØj&j'hj~h²hh³j“h´Mubah}”(h]”jyah ]”(j+j,eh"]”h$]”h&]”j0ˆj1)j2huh1jÒh³j“h´Mhj{h²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&]”uh1j3hj{h²hh³j“h´Mubeh}”(h]”h ]”(jPŒstruct”eh"]”h$]”h&]”jUjPjVjàjWjàjX‰jY‰jZ‰uh1jÍh²hhj�h³Nh´Nubj\)�”}”(hXe **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]”(jb)�”}”(hŒ›**Definition**:: struct counter_event_node { struct list_head l; u8 event; u8 channel; struct list_head comp_list; }; ”h]”(hï)�”}”(hŒ**Definition**::”h]”(jl)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hjðh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jkhjì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_event_node { struct list_head l; u8 event; u8 channel; struct list_head comp_list; };”h]”hŒ|struct 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èubeh}”(h]”h ]”h"]”h$]”h&]”uh1jah³jh´Mhjäubhï)�”}”(hŒ **Members**”h]”jl)�”}”(hj h]”hŒMembers”…”�”}”(hj"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jkhjubah}”(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”…”�”}”(hjAh²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´Mhj9ubjÛ)�”}”(hhh]”hï)�”}”(hŒ'list of current watching Counter events”h]”hŒ'list of current watching Counter events”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jTh´MhjUubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhj9ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³jTh´Mhj6ubj¹)�”}”(hŒ``event`` event that triggers ”h]”(j¿)�”}”(hŒ ``event``”h]”jÅ)�”}”(hjxh]”hŒevent”…”�”}”(hjzh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÄhjvubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´MhjrubjÛ)�”}”(hhh]”hï)�”}”(hŒevent that triggers”h]”hŒevent that triggers”…”�”}”(hj‘h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³j�h´MhjŽubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhjrubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³j�h´Mhj6ubj¹)�”}”(hŒ``channel`` event channel ”h]”(j¿)�”}”(hŒ ``channel``”h]”jÅ)�”}”(hj±h]”hŒchannel”…”�”}”(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Œ 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Úhj«ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³jÆh´Mhj6ubj¹)�”}”(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”…”�”}”(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´Mhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhjäubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³jÿh´Mhj6ubeh}”(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”…”�”}”(hjDh²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Œ ”…”�”}”(hjRh²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhj@h²hh³jQh´M$ubj)�”}”(hŒ counter_ops”h]”j)�”}”(hj>h]”hŒ counter_ops”…”�”}”(hjdh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj`ubah}”(h]”h ]”(jjeh"]”h$]”h&]”hÅhÆuh1jhj@h²hh³jQh´M$ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj%ˆuh1jØj&j'hj<h²hh³jQh´M$ubah}”(h]”j7ah ]”(j+j,eh"]”h$]”h&]”j0ˆj1)j2huh1jÒh³jQh´M$hj9h²hubj4)�”}”(hhh]”hï)�”}”(hŒCallbacks from driver”h]”hŒCallbacks from driver”…”�”}”(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ƒh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j3hj9h²hh³jQh´M$ubeh}”(h]”h ]”(jPŒstruct”eh"]”h$]”h&]”jUjPjVjžjWjžjX‰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]”(jb)�”}”(hXL**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); }; ”h]”(hï)�”}”(hŒ**Definition**::”h]”(jl)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hj®h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jkhjª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´M+hj¦ubj)�”}”(hX#struct counter_ops { int (*signal_read)(struct counter_device *counter, struct counter_signal *signal, enum counter_signal_level *level); int (*count_read)(struct counter_device *counter, struct counter_count *count, u64 *value); int (*count_write)(struct counter_device *counter, struct counter_count *count, u64 value); int (*function_read)(struct counter_device *counter, struct counter_count *count, enum counter_function *function); int (*function_write)(struct counter_device *counter, struct counter_count *count, enum counter_function function); int (*action_read)(struct counter_device *counter, struct counter_count *count, struct counter_synapse *synapse, enum counter_synapse_action *action); int (*action_write)(struct counter_device *counter, struct counter_count *count, struct counter_synapse *synapse, enum counter_synapse_action action); int (*events_configure)(struct counter_device *counter); int (*watch_validate)(struct counter_device *counter, const struct counter_watch *watch); };”h]”hX#struct counter_ops { int (*signal_read)(struct counter_device *counter, struct counter_signal *signal, enum counter_signal_level *level); int (*count_read)(struct counter_device *counter, struct counter_count *count, u64 *value); int (*count_write)(struct counter_device *counter, struct counter_count *count, u64 value); int (*function_read)(struct counter_device *counter, struct counter_count *count, enum counter_function *function); int (*function_write)(struct counter_device *counter, struct counter_count *count, enum counter_function function); int (*action_read)(struct counter_device *counter, struct counter_count *count, struct counter_synapse *synapse, enum counter_synapse_action *action); int (*action_write)(struct counter_device *counter, struct counter_count *count, struct counter_synapse *synapse, enum counter_synapse_action action); int (*events_configure)(struct counter_device *counter); int (*watch_validate)(struct counter_device *counter, const struct counter_watch *watch); };”…”�”}”hjÇsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jh³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´M-hj¦ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jah³jÆh´M+hj¢ubhï)�”}”(hŒ **Members**”h]”jl)�”}”(hjÞh]”hŒMembers”…”�”}”(hjàh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jkhjÜ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´M9hj¢ubj´)�”}”(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.”…”�”}”(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_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Å)�”}”(hj7h]”hŒ count_read”…”�”}”(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´M.hj1ubjÛ)�”}”(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.”…”�”}”(hjPh²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,hjMubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhj1ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³jLh´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Å)�”}”(hjqh]”hŒ count_write”…”�”}”(hjsh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÄhjoubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾h³Œc/var/lib/git/docbuild/linux/Documentation/driver-api/generic-counter:234: ./include/linux/counter.h”h´M1hjkubjÛ)�”}”(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.”…”�”}”(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Úhjkubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³j†h´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Å)�”}”(hj«h]”hŒ function_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´M4hj¥ubjÛ)�”}”(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Úhj¥ubeh}”(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Å)�”}”(hjh]”hŒ action_read”…”�”}”(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´M:hjubjÛ)�”}”(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.”…”�”}”(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´M8hj5ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³j4h´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Å)�”}”(hjYh]”hŒ action_write”…”�”}”(hj[h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÄhjWubah}”(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=hjSubjÛ)�”}”(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.”…”�”}”(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;hjoubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhjSubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³jnh´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Å)�”}”(hj“h]”hŒevents_configure”…”�”}”(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 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.”…”�”}”(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ŒÖ``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³hj¢ubeh}”(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”•Ih]”(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Œ ”…”�”}”(hj5h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhj#h²hh³j4h´MJubj)�”}”(hŒcounter_device”h]”j)�”}”(hj!h]”hŒcounter_device”…”�”}”(hjGh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjCubah}”(h]”h ]”(jjeh"]”h$]”h&]”hÅhÆuh1jhj#h²hh³j4h´MJubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj%ˆuh1jØj&j'hjh²hh³j4h´MJubah}”(h]”jah ]”(j+j,eh"]”h$]”h&]”j0ˆj1)j2huh1jÒh³j4h´MJhjh²hubj4)�”}”(hhh]”hï)�”}”(hŒCounter data structure”h]”hŒCounter data structure”…”�”}”(hjih²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´Mahjfh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j3hjh²hh³j4h´MJubeh}”(h]”h ]”(jPŒstruct”eh"]”h$]”h&]”jUjPjVj�jWj�jX‰jY‰jZ‰uh1jÍh²hhj�h³Nh´Nubj\)�”}”(hXu **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]”(jb)�”}”(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; }; ”h]”(hï)�”}”(hŒ**Definition**::”h]”(jl)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hj‘h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jkhj�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´Mehj‰ubj)�”}”(hX¢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; };”h]”hX¢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; };”…”�”}”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´Mghj‰ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jah³j©h´Mehj…ubhï)�”}”(hŒ **Members**”h]”jl)�”}”(hjÁh]”hŒMembers”…”�”}”(hjÃh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jkhj¿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Œ``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Å)�”}”(hjh]”hŒparent”…”�”}”(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´MdhjubjÛ)�”}”(hhh]”hï)�”}”(hŒ-optional parent device providing the counters”h]”hŒ-optional parent device providing the counters”…”�”}”(hj2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³j.h´Mdhj/ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³j.h´Mdhj×ubj¹)�”}”(hŒ``ops`` callbacks from driver ”h]”(j¿)�”}”(hŒ``ops``”h]”jÅ)�”}”(hjRh]”hŒops”…”�”}”(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´MehjLubjÛ)�”}”(hhh]”hï)�”}”(hŒcallbacks from driver”h]”hŒcallbacks from driver”…”�”}”(hjkh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jgh´Mehjhubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhjLubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³jgh´Mehj×ubj¹)�”}”(hŒ``signals`` array of Signals ”h]”(j¿)�”}”(hŒ ``signals``”h]”jÅ)�”}”(hj‹h]”hŒsignals”…”�”}”(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´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³j h´Mfhj¡ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhj…ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³j h´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Ä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´Mghj¾ubjÛ)�”}”(hhh]”hï)�”}”(hŒ*number of Signals specified in **signals**”h]”(hŒnumber of Signals specified in ”…”�”}”(hjÝh²hh³Nh´Nubjl)�”}”(hŒ **signals**”h]”hŒsignals”…”�”}”(hjåh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jkhjÝubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jÙh´MghjÚubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhj¾ubeh}”(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´MhhjubjÛ)�”}”(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Úhjubeh}”(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Å)�”}”(hjDh]”hŒ num_counts”…”�”}”(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´Mihj>ubjÛ)�”}”(hhh]”hï)�”}”(hŒ(number of Counts specified in **counts**”h]”(hŒnumber of Counts specified in ”…”�”}”(hj]h²hh³Nh´Nubjl)�”}”(hŒ **counts**”h]”hŒcounts”…”�”}”(hjeh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jkhj]ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jYh´MihjZubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhj>ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³jYh´Mihj×ubj¹)�”}”(hŒ4``ext`` optional array of Counter device 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´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³j h´Mjhj¡ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhj…ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³j h´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Ä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´Mkhj¾ubjÛ)�”}”(hhh]”hï)�”}”(hŒ8number of Counter device extensions specified in **ext**”h]”(hŒ1number of Counter device extensions specified in ”…”�”}”(hjÝh²hh³Nh´Nubjl)�”}”(hŒ**ext**”h]”hŒext”…”�”}”(hjåh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jkhjÝubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jÙh´MkhjÚubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhj¾ubeh}”(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´MlhjubjÛ)�”}”(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Úhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³j h´Mlhj×ubj¹)�”}”(hŒ/``chrdev`` internal character device structure ”h]”(j¿)�”}”(hŒ ``chrdev``”h]”jÅ)�”}”(hjDh]”hŒchrdev”…”�”}”(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´Mmhj>ubjÛ)�”}”(hhh]”hï)�”}”(hŒ#internal character device structure”h]”hŒ#internal character device structure”…”�”}”(hj]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jYh´MmhjZubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhj>ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³jYh´Mmhj×ubj¹)�”}”(hŒ8``events_list`` list of current watching Counter events ”h]”(j¿)�”}”(hŒ``events_list``”h]”jÅ)�”}”(hj}h]”hŒ events_list”…”�”}”(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´MnhjwubjÛ)�”}”(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´Mnhj“ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhjwubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³j’h´Mnhj×ubj¹)�”}”(hŒD``events_list_lock`` lock to protect Counter events list operations ”h]”(j¿)�”}”(hŒ``events_list_lock``”h]”jÅ)�”}”(hj¶h]”hŒ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´Mohj°ubjÛ)�”}”(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Úhj°ubeh}”(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”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jh´Mphjubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhjéubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³jh´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”…”�”}”(hjAh²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Å)�”}”(hjah]”hŒevents”…”�”}”(hjch²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´Mrhj[ubjÛ)�”}”(hhh]”hï)�”}”(hŒ queue of detected Counter events”h]”hŒ queue of detected Counter events”…”�”}”(hjzh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³jvh´Mrhjwubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhj[ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³jvh´Mrhj×ubj¹)�”}”(hŒE``events_wait`` wait queue to allow blocking reads of Counter events ”h]”(j¿)�”}”(hŒ``events_wait``”h]”jÅ)�”}”(hjšh]”hŒ events_wait”…”�”}”(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´Mshj”ubjÛ)�”}”(hhh]”hï)�”}”(hŒ4wait queue to allow blocking reads of Counter events”h]”hŒ4wait queue to allow blocking reads of Counter events”…”�”}”(hj³h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³j¯h´Mshj°ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhj”ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³j¯h´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”…”�”}”(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´MuhjubjÛ)�”}”(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Úhjubeh}”(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Å)�”}”(hjEh]”hŒops_exist_lock”…”�”}”(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´Muhj?ubjÛ)�”}”(hhh]”hï)�”}”(hŒ"lock to prevent use during removal”h]”hŒ"lock to prevent use during removal”…”�”}”(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´Mvhj[ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhj?ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³jZh´Muhj×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_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”…”�”}”(hj¡h²hh³Nh´Nubah}”(h]”h ]”Œkt”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´KAubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj±h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhj›h²hh³j°h´KAubhŒdesc_sig_punctuation”“”)�”}”(hj‰h]”hŒ*”…”�”}”(hjÁh²hh³Nh´Nubah}”(h]”h ]”Œp”ah"]”h$]”h&]”uh1j¿hj›h²hh³j°h´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Æuh1jhj›h²hh³j°h´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Œ ”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhjïubjß)�”}”(hjâh]”hŒstruct”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”jëah"]”h$]”h&]”uh1jÞhjïubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjh²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”]”jHŒ ASTIdentifier”“”)�”}”jCjÕsbŒc.counter_priv”†”asbuh1hhjïubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjUh²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhjïubjÀ)�”}”(hj‰h]”hŒ*”…”�”}”(hjch²hh³Nh´Nubah}”(h]”h ]”jËah"]”h$]”h&]”uh1j¿hjïubjß)�”}”(hjõh]”hŒconst”…”�”}”(hjph²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³j°h´KAubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj%ˆuh1jØj&j'hj—h²hh³j°h´KAubah}”(h]”j’ah ]”(j+j,eh"]”h$]”h&]”j0ˆj1)j2huh1jÒh³j°h´KAhj”h²hubj4)�”}”(hhh]”hï)�”}”(hŒ"access counter device private data”h]”hŒ"access 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´KAhj²h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j3hj”h²hh³j°h´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]”jl)�”}”(hj×h]”hŒ Parameters”…”�”}”(hjÙh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jkhjÕ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”…”�”}”(hjh²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]”jl)�”}”(hj1h]”hŒ Description”…”�”}”(hj3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jkhj/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”…”�”}”(hjGh²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”…”�”}”(hjvh²hh³Nh´Nubah}”(h]”h ]”jëah"]”h$]”h&]”uh1jÞhjrh²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ðhjrh²hh³jƒh´KPubh)�”}”(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”jCŒ reftarget”j—Œmodname”NŒ classname”NjGjJ)�”}”jM]”jP)�”}”jCŒ counter_alloc”sbŒc.counter_alloc”†”asbuh1hhjrh²hh³jƒh´KPubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj¶h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhjrh²hh³jƒh´KPubjÀ)�”}”(hj‰h]”hŒ*”…”�”}”(hjÄh²hh³Nh´Nubah}”(h]”h ]”jËah"]”h$]”h&]”uh1j¿hjrh²hh³jƒh´KPubj)�”}”(hŒ counter_alloc”h]”j)�”}”(hj³h]”hŒ counter_alloc”…”�”}”(hjÕh²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjÑubah}”(h]”h ]”(jjeh"]”h$]”h&]”hÅhÆuh1jhjrh²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”jCŒ reftarget”jõŒmodname”NŒ classname”NjGjJ)�”}”jM]”j±Œ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çhjrh²hh³jƒh´KPubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj%ˆuh1jØj&j'hjnh²hh³jƒh´KPubah}”(h]”jiah ]”(j+j,eh"]”h$]”h&]”j0ˆj1)j2huh1jÒh³jƒh´KPhjkh²hubj4)�”}”(hhh]”hï)�”}”(hŒallocate a counter_device”h]”hŒallocate a counter_device”…”�”}”(hjI 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´KPhjF h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j3hjkh²hh³jƒh´KPubeh}”(h]”h ]”(jPŒfunction”eh"]”h$]”h&]”jUjPjVja jWja 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]”jl)�”}”(hjk h]”hŒ Parameters”…”�”}”(hjm h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jkhji 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´KThje ubj´)�”}”(hhh]”j¹)�”}”(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´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³jŸ h´KQhj  ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhj„ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³jŸ h´KQhj� ubah}”(h]”h ]”h"]”h$]”h&]”uh1j³hje ubhï)�”}”(hŒ**Description**”h]”jl)�”}”(hjÅ h]”hŒ Description”…”�”}”(hjÇ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jkhjà 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´KShje 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´KRhje 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´KUhje 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]”(j )�”}”(hŒint”h]”hŒint”…”�”}”(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“ubj)�”}”(hŒ counter_add”h]”j)�”}”(hŒ counter_add”h]”hŒ counter_add”…”�”}”(hj:!h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj6!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”…”�”}”(hjV!h²hh³Nh´Nubah}”(h]”h ]”jëah"]”h$]”h&]”uh1jÞhjR!ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjc!h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhjR!ubh)�”}”(hhh]”j)�”}”(hŒcounter_device”h]”hŒcounter_device”…”�”}”(hjt!h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjq!ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jPŒreftype”jCŒ reftarget”jv!Œmodname”NŒ classname”NjGjJ)�”}”jM]”jP)�”}”jCjvoid counter_unregister (struct counter_device *const counter)”h]”jÙ)�”}”(hŒ=void counter_unregister(struct counter_device *const counter)”h]”(j )�”}”(hŒvoid”h]”hŒvoid”…”�”}”(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®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³j·"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”jCŒ reftarget”j#Œmodname”NŒ classname”NjGjJ)�”}”jM]”jP)�”}”jCjÌ"sbŒc.counter_unregister”†”asbuh1hhjâ"ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj$#h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhjâ"ubjÀ)�”}”(hj‰h]”hŒ*”…”�”}”(hj2#h²hh³Nh´Nubah}”(h]”h ]”jËah"]”h$]”h&]”uh1j¿hjâ"ubjß)�”}”(hjõh]”hŒconst”…”�”}”(hj?#h²hh³Nh´Nubah}”(h]”h ]”jëah"]”h$]”h&]”uh1jÞhjâ"ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjL#h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhjâ"ubj)�”}”(hŒcounter”h]”hŒcounter”…”�”}”(hjZ#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Œ"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®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 *const counter`` pointer to Counter to unregister **Description** The Counter is unregistered from the system.”h]”(hï)�”}”(hŒ**Parameters**”h]”jl)�”}”(hj¦#h]”hŒ Parameters”…”�”}”(hj¨#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jkhj¤#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Œ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¯hj¿#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Ú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]”jl)�”}”(hj$h]”hŒ Description”…”�”}”(hj$h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jkhjþ#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Œ,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°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_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”…”�”}”(hjE$h²hh³Nh´Nubah}”(h]”h ]”jëah"]”h$]”h&]”uh1jÞhjA$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Œ ”…”�”}”(hjS$h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhjA$h²hh³jR$h´KÎubh)�”}”(hhh]”j)�”}”(hŒcounter_device”h]”hŒcounter_device”…”�”}”(hjd$h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhja$ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jPŒreftype”jCŒ reftarget”jf$Œmodname”NŒ classname”NjGjJ)�”}”jM]”jP)�”}”jCŒdevm_counter_alloc”sbŒc.devm_counter_alloc”†”asbuh1hhjA$h²hh³jR$h´KÎubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj…$h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhjA$h²hh³jR$h´KÎubjÀ)�”}”(hj‰h]”hŒ*”…”�”}”(hj“$h²hh³Nh´Nubah}”(h]”h ]”jËah"]”h$]”h&]”uh1j¿hjA$h²hh³jR$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&]”uh1jhj $ubah}”(h]”h ]”(jjeh"]”h$]”h&]”hÅhÆuh1jhjA$h²hh³jR$h´KÎubjè)�”}”(hŒ((struct device *dev, size_t sizeof_priv)”h]”(jî)�”}”(hŒstruct device *dev”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Œdevice”h]”hŒdevice”…”�”}”(hjÝ$h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjÚ$ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jPŒreftype”jCŒ reftarget”jß$Œmodname”NŒ classname”NjGjJ)�”}”jM]”j€$Œc.devm_counter_alloc”†”asbuh1hhj»$ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjû$h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhj»$ubjÀ)�”}”(hj‰h]”hŒ*”…”�”}”(hj %h²hh³Nh´Nubah}”(h]”h ]”jËah"]”h$]”h&]”uh1j¿hj»$ubj)�”}”(hŒdev”h]”hŒdev”…”�”}”(hj%h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj»$ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jíhj·$ubjî)�”}”(hŒsize_t sizeof_priv”h]”(h)�”}”(hhh]”j)�”}”(hŒsize_t”h]”hŒsize_t”…”�”}”(hj2%h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj/%ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jPŒreftype”jCŒ reftarget”j4%Œmodname”NŒ classname”NjGjJ)�”}”jM]”j€$Œc.devm_counter_alloc”†”asbuh1hhj+%ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjP%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·$ubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jçhjA$h²hh³jR$h´KÎubeh}”(h]”h ]”h"]”h$]”h&]”hÅhÆj%ˆuh1jØj&j'hj=$h²hh³jR$h´KÎubah}”(h]”j8$ah ]”(j+j,eh"]”h$]”h&]”j0ˆj1)j2huh1jÒh³jR$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³jR$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 ``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]”jl)�”}”(hjª%h]”hŒ Parameters”…”�”}”(hj¬%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jkhj¨%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Œ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ÐhjÀ%ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j³hj¤%ubhï)�”}”(hŒ**Description**”h]”jl)�”}”(hj=&h]”hŒ Description”…”�”}”(hj?&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jkhj;&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().”…”�”}”(hjS&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]”(j )�”}”(hŒint”h]”hŒint”…”�”}”(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ç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&]”uh1jhjŸ&ubah}”(h]”h ]”(jjeh"]”h$]”h&]”hÅhÆuh1jhj~&h²hh³j�&h´Kçubjè)�”}”(hŒ:(struct device *dev, struct counter_device *const counter)”h]”(jî)�”}”(hŒstruct device *dev”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Œdevice”h]”hŒdevice”…”�”}”(hjÝ&h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjÚ&ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jPŒreftype”jCŒ reftarget”jß&Œmodname”NŒ classname”NjGjJ)�”}”jM]”jP)�”}”jCj¥&sbŒc.devm_counter_add”†”asbuh1hhj»&ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjý&h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhj»&ubjÀ)�”}”(hj‰h]”hŒ*”…”�”}”(hj 'h²hh³Nh´Nubah}”(h]”h ]”jËah"]”h$]”h&]”uh1j¿hj»&ubj)�”}”(hŒdev”h]”hŒdev”…”�”}”(hj'h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhj»&ubeh}”(h]”h ]”h"]”h$]”h&]”Œnoemph”ˆhÅhÆuh1jíhj·&ubjî)�”}”(hŒ$struct counter_device *const counter”h]”(jß)�”}”(hjâh]”hŒstruct”…”�”}”(hj1'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”…”�”}”(hjO'h²hh³Nh´Nubah}”(h]”h ]”jah"]”h$]”h&]”uh1jhjL'ubah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”jPŒreftype”jCŒ reftarget”jQ'Œmodname”NŒ classname”NjGjJ)�”}”jM]”jù&Œc.devm_counter_add”†”asbuh1hhj-'ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjm'h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhj-'ubjÀ)�”}”(hj‰h]”hŒ*”…”�”}”(hj{'h²hh³Nh´Nubah}”(h]”h ]”jËah"]”h$]”h&]”uh1j¿hj-'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·&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'hjz&h²hh³j�&h´Kçubah}”(h]”ju&ah ]”(j+j,eh"]”h$]”h&]”j0ˆj1)j2huh1jÒh³j�&h´Kçhjw&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&]”uh1j3hjw&h²hh³j�&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]”jl)�”}”(hjï'h]”hŒ Parameters”…”�”}”(hjñ'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jkhjí'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Å)�”}”(hjG(h]”hŒ$struct counter_device *const counter”…”�”}”(hjI(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÄhjE(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éhjA(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ÚhjA(ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³j\(h´Kéhj(ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j³hjé'ubhï)�”}”(hŒ**Description**”h]”jl)�”}”(hj‚(h]”hŒ Description”…”�”}”(hj„(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jkhj€(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().”…”�”}”(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ÉŒ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]”(j )�”}”(hŒvoid”h]”hŒvoid”…”�”}”(hjÇ(h²hh³Nh´Nubah}”(h]”h ]”j¬ah"]”h$]”h&]”uh1jŸhjÃ(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”jCŒ reftarget”j$)Œmodname”NŒ classname”NjGjJ)�”}”jM]”jP)�”}”jCjê(sbŒc.counter_push_event”†”asbuh1hhj)ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjB)h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhj)ubjÀ)�”}”(hj‰h]”hŒ*”…”�”}”(hjP)h²hh³Nh´Nubah}”(h]”h ]”jËah"]”h$]”h&]”uh1j¿hj)ubjß)�”}”(hjõh]”hŒconst”…”�”}”(hj])h²hh³Nh´Nubah}”(h]”h ]”jëah"]”h$]”h&]”uh1jÞhj)ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjj)h²hh³Nh´Nubah}”(h]”h ]”jýah"]”h$]”h&]”uh1jðhj)ubj)�”}”(hŒcounter”h]”hŒcounter”…”�”}”(hjx)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”…”�”}”(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”jCŒ reftarget”j±)Œmodname”NŒ classname”NjGjJ)�”}”jM]”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Œevent”h]”hŒevent”…”�”}”(hjÛ)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 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”jCŒ reftarget”j*Œmodname”NŒ classname”NjGjJ)�”}”jM]”j>)Œc.counter_push_event”†”asbuh1hhjð)ubjñ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hj0*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'hj¿(h²hh³jÕ(h´Mrubah}”(h]”jº(ah ]”(j+j,eh"]”h$]”h&]”j0ˆj1)j2huh1jÒh³jÕ(h´Mrhj¼(h²hubj4)�”}”(hhh]”hï)�”}”(hŒ!queue event for userspace reading”h]”hŒ!queue event for userspace reading”…”�”}”(hjh*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´Mrhje*h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j3hj¼(h²hh³jÕ(h´Mrubeh}”(h]”h ]”(jPŒfunction”eh"]”h$]”h&]”jUjPjVj€*jWj€*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]”jl)�”}”(hjŠ*h]”hŒ Parameters”…”�”}”(hjŒ*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jkhjˆ*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Å)�”}”(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³Œ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”…”�”}”(hjÂ*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³j¾*h´Mshj¿*ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhj£*ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³j¾*h´Mshj *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´Mthj *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”…”�”}”(hj4+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³j0+h´Muhj1+ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÚhj+ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j¸h³j0+h´Muhj *ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j³hj„*ubhï)�”}”(hŒ**Note**”h]”jl)�”}”(hjV+h]”hŒNote”…”�”}”(hjX+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jkhjT+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.”…”�”}”(hjl+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”…”�”}”(hj�+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjŠ+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.”…”�”}”(hj›+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KöhjŠ+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.”…”�”}”(hj©+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KühjŠ+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.”…”�”}”(hj·+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MhjŠ+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 hjŠ+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´MhjŠ+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´MhjŠ+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´MhjŠ+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), };”…”�”}”hj3,sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jh³hÇh´MhjŠ+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.”…”�”}”(hjA,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M$hjŠ+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 “”…”�”}”(hjO,h²hh³Nh´NubjÅ)�”}”(hŒ ``*_read``”h]”hŒ*_read”…”�”}”(hjW,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÄhjO,ubhŒ â€� and “”…”�”}”(hjO,h²hh³Nh´NubjÅ)�”}”(hŒ ``*_write``”h]”hŒ*_write”…”�”}”(hji,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÄhjO,ubhŒâ€� union members.”…”�”}”(hjO,h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M(hjŠ+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:”…”�”}”(hj�,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M-hjŠ+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);”…”�”}”hj�,sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jh³hÇh´M0hjŠ+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.”…”�”}”(hj�,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M<hjŠ+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.”…”�”}”(hj²,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M>hj®,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”…”�”}”(hjÀ,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MBhj®,ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j8hj«,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&]”uh1j8hj«,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&]”uh1j8hj«,h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jˆj‰uh1j3h³hÇh´M>hjŠ+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”…”�”}”(hj1-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”…”�”}”(hjG-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÄhj?-ubhŒ, ”…”�”}”(hj?-h²hh³Nh´NubjÅ)�”}”(hŒ``u64``”h]”hŒu64”…”�”}”(hjY-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:”…”�”}”(hjq-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 | +--------------------+ +---------------------+”…”�”}”hj-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:”…”�”}”(hj�-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" / --------------------------------------------------”…”�”}”hj›-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:”…”�”}”(hj©-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”…”�”}”(hjº-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj·-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Éhj·-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.”…”�”}”(hjK.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”…”�”}”(hjl.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhji.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 ”…”�”}”(hjz.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Ähjz.ubhŒ directory, where ”…”�”}”(hjz.h²hh³Nh´NubjÅ)�”}”(hŒ``X``”h]”hŒX”…”�”}”(hj”.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÄhjz.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.”…”�”}”(hjz.h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Mãhji.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.”…”�”}”(hj¬.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Méhji.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ÍhjÂ.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ðhjÂ.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”…”�”}”(hjB/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);”…”�”}”hjZ/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 ”…”�”}”(hjh/h²hh³Nh´NubjÅ)�”}”(hŒ ``event``”h]”hŒevent”…”�”}”(hjp/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÄhjh/ubhŒ5 parameter; the event channel id is specified by the ”…”�”}”(hjh/h²hh³Nh´NubjÅ)�”}”(hŒ ``channel``”h]”hŒchannel”…”�”}”(hj‚/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÄhjh/ubhŒs parameter. When this function is called, the Counter data associated with the respective event is gathered, and a ”…”�”}”(hjh/h²hh³Nh´NubjÅ)�”}”(hŒ``struct counter_event``”h]”hŒstruct counter_event”…”�”}”(hj”/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÄhjh/ubhŒ5 is generated for each datum and pushed to userspace.”…”�”}”(hjh/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:”…”�”}”(hj¬/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Mhj)/h²hubjb)�”}”(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”…”�”}”(hj0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Mhj0ubah}”(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/0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M hj,0ubah}”(h]”h ]”h"]”h$]”h&]”uh1jè/hj)0ubjé/)�”}”(hhh]”hï)�”}”(hŒ Channel 0”h]”hŒ Channel 0”…”�”}”(hjF0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M hjC0ubah}”(h]”h ]”h"]”h$]”h&]”uh1jè/hj)0ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jã/hj&0ubjä/)�”}”(hhh]”(jé/)�”}”(hhh]”j4)�”}”(hhh]”(j9)�”}”(hŒCount 0”h]”hï)�”}”(hjk0h]”hŒCount 0”…”�”}”(hjm0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M hji0ubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hjf0ubj9)�”}”(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&]”uh1j8hjf0ubj9)�”}”(hŒSignal 3”h]”hï)�”}”(hj™0h]”hŒSignal 3”…”�”}”(hj›0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Mhj—0ubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hjf0ubj9)�”}”(hŒCount 4 Extension 2”h]”hï)�”}”(hj°0h]”hŒCount 4 Extension 2”…”�”}”(hj²0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Mhj®0ubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hjf0ubj9)�”}”(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´MhjÅ0ubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hjf0ubeh}”(h]”h ]”h"]”h$]”h&]”jˆj‰uh1j3h³hÇh´M hjc0ubah}”(h]”h ]”h"]”h$]”h&]”Œmorerows”Kuh1jè/hj`0ubjé/)�”}”(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 1h]”hŒSignal 0 Extension 0”…”�”}”(hj 1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M hj1ubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hjí0ubj9)�”}”(hŒ Extension 4”h]”hï)�”}”(hj 1h]”hŒ Extension 4”…”�”}”(hj"1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Mhj1ubah}”(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è/hj`0ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jã/hj&0ubjä/)�”}”(hhh]”jé/)�”}”(hhh]”hï)�”}”(hŒ Channel 1”h]”hŒ Channel 1”…”�”}”(hjM1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MhjJ1ubah}”(h]”h ]”h"]”h$]”h&]”uh1jè/hjG1ubah}”(h]”h ]”h"]”h$]”h&]”uh1jã/hj&0ubjä/)�”}”(hhh]”jé/)�”}”(hhh]”j4)�”}”(hhh]”(j9)�”}”(hŒSignal 4”h]”hï)�”}”(hjr1h]”hŒSignal 4”…”�”}”(hjt1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Mhjp1ubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hjm1ubj9)�”}”(hŒSignal 4 Extension 0”h]”hï)�”}”(hj‰1h]”hŒSignal 4 Extension 0”…”�”}”(hj‹1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Mhj‡1ubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hjm1ubj9)�”}”(hŒCount 7”h]”hï)�”}”(hj 1h]”hŒCount 7”…”�”}”(hj¢1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Mhjž1ubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hjm1ubeh}”(h]”h ]”h"]”h$]”h&]”jˆj‰uh1j3h³hÇh´Mhjj1ubah}”(h]”h ]”h"]”h$]”h&]”uh1jè/hjg1ubah}”(h]”h ]”h"]”h$]”h&]”uh1jã/hj&0ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j$0hjÅ/ubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1jÃ/hjÀ/ubah}”(h]”h ]”h"]”h$]”h&]”uh1j¾/hjº/ubah}”(h]”h ]”h"]”h$]”h&]”uh1jah³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 2h²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ÈhjÂ.h²hh³hÇh´MöubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Userspace”h]”hŒ Userspace”…”�”}”(hj/2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj,2h²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=2h²hh³Nh´NubjÅ)�”}”(hŒ``linux/counter.h``”h]”hŒlinux/counter.h”…”�”}”(hjE2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÄhj=2ubhŒ userspace header file:”…”�”}”(hj=2h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M hj,2h²hubj4)�”}”(hhh]”(j9)�”}”(hŒ#:c:macro:`COUNTER_ADD_WATCH_IOCTL` ”h]”hï)�”}”(hŒ":c:macro:`COUNTER_ADD_WATCH_IOCTL`”h]”h)�”}”(hjf2h]”jÅ)�”}”(hjf2h]”hŒCOUNTER_ADD_WATCH_IOCTL”…”�”}”(hjk2h²hh³Nh´Nubah}”(h]”h ]”(Œxref”jPŒc-macro”eh"]”h$]”h&]”uh1jÄhjh2ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”Œdriver-api/generic-counter”Œ refdomain”jPŒreftype”Œmacro”Œ refexplicit”‰Œrefwarn”‰jGjJ)�”}”jM]”sbŒ reftarget”ŒCOUNTER_ADD_WATCH_IOCTL”uh1hh³hÇh´M$hjd2ubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M$hj`2ubah}”(h]”h ]”h"]”h$]”h&]”uh1j8hj]2h²hh³hÇh´Nubj9)�”}”(hŒ':c:macro:`COUNTER_ENABLE_EVENTS_IOCTL` ”h]”hï)�”}”(hŒ&:c:macro:`COUNTER_ENABLE_EVENTS_IOCTL`”h]”h)�”}”(hjž2h]”jÅ)�”}”(hjž2h]”hŒCOUNTER_ENABLE_EVENTS_IOCTL”…”�”}”(hj£2h²hh³Nh´Nubah}”(h]”h ]”(ju2jPŒc-macro”eh"]”h$]”h&]”uh1jÄhj 2ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j�2Œ refdomain”jPŒreftype”Œmacro”Œ refexplicit”‰Œrefwarn”‰jGj‡2jŠ2ŒCOUNTER_ENABLE_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&]”uh1j8hj]2h²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 ]”(ju2jPŒc-macro”eh"]”h$]”h&]”uh1jÄhjÒ2ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”j�2Œ refdomain”jPŒreftype”Œmacro”Œ refexplicit”‰Œrefwarn”‰jGj‡2jŠ2Œ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&]”uh1j8hj]2h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”jˆj‰uh1j3h³hÇh´M$hj,2h²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 ”…”�”}”(hj3h²hh³Nh´NubjÅ)�”}”(hŒ``struct counter_watch``”h]”hŒstruct counter_watch”…”�”}”(hj 3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÄhj3ubhŒ’ 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 ”…”�”}”(hj3h²hh³Nh´NubjÅ)�”}”(hŒ``COUNTER_ADD_WATCH_IOCTL``”h]”hŒCOUNTER_ADD_WATCH_IOCTL”…”�”}”(hj3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÄhj3ubhŒ ioctl command.”…”�”}”(hj3h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M*hj,2h²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 ”…”�”}”(hj43h²hh³Nh´NubjÅ)�”}”(hŒ``component.type``”h]”hŒcomponent.type”…”�”}”(hj<3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÄhj43ubhŒ member equal to ”…”�”}”(hj43h²hh³Nh´NubjÅ)�”}”(hŒ``COUNTER_COMPONENT_NONE``”h]”hŒCOUNTER_COMPONENT_NONE”…”�”}”(hjN3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÄhj43ubhŒv. With this configuration the Counter character device will simply populate the event timestamps for those respective ”…”�”}”(hj43h²hh³Nh´NubjÅ)�”}”(hŒ``struct counter_event``”h]”hŒstruct counter_event”…”�”}”(hj`3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÄhj43ubhŒ) elements and ignore the component value.”…”�”}”(hj43h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M0hj,2h²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 ”…”�”}”(hjx3h²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Ähjx3ubhŒ< command will buffer these Counter watches. When ready, the ”…”�”}”(hjx3h²hh³Nh´NubjÅ)�”}”(hŒ``COUNTER_ENABLE_EVENTS_IOCTL``”h]”hŒCOUNTER_ENABLE_EVENTS_IOCTL”…”�”}”(hj’3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÄhjx3ubhŒ= ioctl command may be used to activate these Counter watches.”…”�”}”(hjx3h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M7hj,2h²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 ”…”�”}”(hjª3h²hh³Nh´NubjÅ)�”}”(hŒ``read``”h]”hŒread”…”�”}”(hj²3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÄhjª3ubhŒ operation (optionally calling ”…”�”}”(hjª3h²hh³Nh´NubjÅ)�”}”(hŒ``poll``”h]”hŒpoll”…”�”}”(hjÄ3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÄhjª3ubhŒ9 first) on the Counter character device node to retrieve ”…”�”}”(hjª3h²hh³Nh´NubjÅ)�”}”(hŒ``struct counter_event``”h]”hŒstruct counter_event”…”�”}”(hjÖ3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÄhjª3ubhŒ elements with the desired data.”…”�”}”(hjª3h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M;hj,2h²hubeh}”(h]”Œ userspace”ah ]”h"]”Œ userspace”ah$]”h&]”uh1hÈhjÂ.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(4Œ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”}”(j4j4jjjójðjjj½jºjëjèjšj—j‡+j„+j+-j(-jf.jc.jÛ-jØ-j.jÿ-j7.j4.j^.j[.j¿.j¼.jû3jø3j)2j&2jó3jð3uŒ nametypes”}”(j4‰j‰jó‰j‰j½‰jë‰jš‰j‡+‰j+-‰jf.‰jÛ-‰j.‰j7.‰j^.‰j¿.‰jû3‰j)2‰jó3‰uh}”(j4hÊjhÝjðjjjŠjºjjèjÀj—jöj„+j�jËjÔjN jS jjj­j²jyj~j7j<jjj’j—jijnj !j!jœ"j¡"j8$j=$ju&jz&jº(j¿(j(-jŠ+jc.j.-jØ-j·-jÿ-jÞ-j4.j.j[.j:.j¼.ji.jø3jÂ.j&2j)/jð3j,2uŒ 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.