€•Œ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/clk”Œ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/clk”Œ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/clk”Œ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/clk”Œ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/clk”Œ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/clk”Œ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/clk”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒThe Common Clk Framework”h]”hŒThe Common Clk Framework”…”�”}”(hh¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhh·h²hh³Œ ”h]”hŒ paragraph”“”)�”}”(hŒ"Mike Turquette ”h]”(hŒMike Turquette <”…”�”}”(hhíh²hh³Nh´NubhŒ reference”“”)�”}”(hŒmturquette@ti.com”h]”hŒmturquette@ti.com”…”�”}”(hh÷h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”Œmailto:mturquette@ti.com”uh1hõhhíubhŒ>”…”�”}”(hhíh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Khhçubah}”(h]”h ]”h"]”h$]”h&]”uh1håhhÒubeh}”(h]”h ]”h"]”h$]”h&]”uh1hÐh³hÊh´KhhÍh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1hËhh·h²hh³hÊh´Kubhì)�”}”(hŒýThis document endeavours to explain the common clk framework details, and how to port a platform over to this framework. It is not yet a detailed explanation of the clock api in include/linux/clk.h, but perhaps someday it will include that information.”h]”hŒýThis document endeavours to explain the common clk framework details, and how to port a platform over to this framework. It is not yet a detailed explanation of the clock api in include/linux/clk.h, but perhaps someday it will include that information.”…”�”}”(hj#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Khh·h²hubh¶)�”}”(hhh]”(h»)�”}”(hŒ Introduction and interface split”h]”hŒ Introduction and interface split”…”�”}”(hj4h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj1h²hh³hÊh´K ubhì)�”}”(hŒþThe common clk framework is an interface to control the clock nodes available on various devices today. This may come in the form of clock gating, rate adjustment, muxing or other operations. This framework is enabled with the CONFIG_COMMON_CLK option.”h]”hŒþThe common clk framework is an interface to control the clock nodes available on various devices today. This may come in the form of clock gating, rate adjustment, muxing or other operations. This framework is enabled with the CONFIG_COMMON_CLK option.”…”�”}”(hjBh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Khj1h²hubhì)�”}”(hXÈThe interface itself is divided into two halves, each shielded from the details of its counterpart. First is the common definition of struct clk which unifies the framework-level accounting and infrastructure that has traditionally been duplicated across a variety of platforms. Second is a common implementation of the clk.h api, defined in drivers/clk/clk.c. Finally there is struct clk_ops, whose operations are invoked by the clk api implementation.”h]”hXÈThe interface itself is divided into two halves, each shielded from the details of its counterpart. First is the common definition of struct clk which unifies the framework-level accounting and infrastructure that has traditionally been duplicated across a variety of platforms. Second is a common implementation of the clk.h api, defined in drivers/clk/clk.c. Finally there is struct clk_ops, whose operations are invoked by the clk api implementation.”…”�”}”(hjPh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Khj1h²hubhì)�”}”(hXThe second half of the interface is comprised of the hardware-specific callbacks registered with struct clk_ops and the corresponding hardware-specific structures needed to model a particular clock. For the remainder of this document any reference to a callback in struct clk_ops, such as .enable or .set_rate, implies the hardware-specific implementation of that code. Likewise, references to struct clk_foo serve as a convenient shorthand for the implementation of the hardware-specific bits for the hypothetical "foo" hardware.”h]”hXThe second half of the interface is comprised of the hardware-specific callbacks registered with struct clk_ops and the corresponding hardware-specific structures needed to model a particular clock. For the remainder of this document any reference to a callback in struct clk_ops, such as .enable or .set_rate, implies the hardware-specific implementation of that code. Likewise, references to struct clk_foo serve as a convenient shorthand for the implementation of the hardware-specific bits for the hypothetical “fooâ€� hardware.”…”�”}”(hj^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Khj1h²hubhì)�”}”(hŒëTying the two halves of this interface together is struct clk_hw, which is defined in struct clk_foo and pointed to within struct clk_core. This allows for easy navigation between the two discrete halves of the common clock interface.”h]”hŒëTying the two halves of this interface together is struct clk_hw, which is defined in struct clk_foo and pointed to within struct clk_core. This allows for easy navigation between the two discrete halves of the common clock interface.”…”�”}”(hjlh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K%hj1h²hubeh}”(h]”Œ introduction-and-interface-split”ah ]”h"]”Œ introduction and interface split”ah$]”h&]”uh1hµhh·h²hh³hÊh´K ubh¶)�”}”(hhh]”(h»)�”}”(hŒCommon data structures and api”h]”hŒCommon data structures and api”…”�”}”(hj…h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj‚h²hh³hÊh´K+ubhŒindex”“”)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(Œsingle”Œclk_core (C struct)”Œ c.clk_core”hNt”auh1j“hj‚h²hh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´NubhŒdesc”“”)�”}”(hhh]”(hŒdesc_signature”“”)�”}”(hŒclk_core”h]”hŒdesc_signature_line”“”)�”}”(hŒstruct clk_core”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³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”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Œclk_core”h]”hŒ desc_sig_name”“”)�”}”(hj®h]”hŒclk_core”…”�”}”(hjáh²hh³Nh´Nubah}”(h]”h ]”Œn”ah"]”h$]”h&]”uh1jßhjÛubah}”(h]”h ]”(Œsig-name”Œdescname”eh"]”h$]”h&]”Œ xml:space”Œpreserve”uh1jÙhj²h²hh³jÇh´Kubeh}”(h]”h ]”h"]”h$]”h&]”j÷jøŒ 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Œ,The internal state of a clk in the clk tree.”h]”hŒ,The internal state of a clk in the clk tree.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´KChjh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj§h²hh³jÇh´Kubeh}”(h]”h ]”(Œc”Œstruct”eh"]”h$]”h&]”Œdomain”j*Œobjtype”j+Œdesctype”j+Œnoindex”‰Œ noindexentry”‰Œnocontentsentry”‰uh1j¥h²hhj‚h³j¤h´NubhŒ container”“”)�”}”(hXê**Definition**:: struct clk_core { const char *name; const struct clk_ops *ops; struct clk_hw *hw; struct module *owner; struct device *dev; struct hlist_node rpm_node; struct device_node *of_node; struct clk_core *parent; struct clk_parent_map *parents; u8 num_parents; u8 new_parent_index; unsigned long rate; unsigned long req_rate; unsigned long new_rate; struct clk_core *new_parent; struct clk_core *new_child; unsigned long flags; bool orphan; bool rpm_enabled; unsigned int enable_count; unsigned int prepare_count; unsigned int protect_count; unsigned long min_rate; unsigned long max_rate; unsigned long accuracy; int phase; struct clk_duty duty; struct hlist_head children; struct hlist_node child_node; struct hlist_node hashtable_node; struct hlist_head clks; unsigned int notifier_count; #ifdef CONFIG_DEBUG_FS; struct dentry *dentry; struct hlist_node debug_node; #endif; struct kref ref; }; **Members** ``name`` Unique name of the clk for identification. ``ops`` Pointer to hardware-specific operations for this clk. ``hw`` Pointer for traversing from a struct clk to its corresponding hardware-specific structure. ``owner`` Kernel module owning this clk (for reference counting). ``dev`` Device associated with this clk (optional) ``rpm_node`` Node for runtime power management list management. ``of_node`` Device tree node associated with this clk (if applicable) ``parent`` Pointer to the current parent in the clock tree. ``parents`` Array of possible parents (for muxes/selectable parents). ``num_parents`` Number of possible parents. ``new_parent_index`` Index of the new parent during parent change operations. ``rate`` Current cached clock rate (Hz). ``req_rate`` The last rate requested by a call to clk_set_rate(). It's initialized to clk_core->rate. It's also updated to clk_core->rate every time the clock is reparented, and when we're doing the orphan -> !orphan transition. ``new_rate`` New rate to be set during a rate change operation. ``new_parent`` Pointer to new parent during parent change. This is also used when a clk's rate is changed. ``new_child`` Pointer to new child during reparenting. This is also used when a clk's rate is changed. ``flags`` Clock property and capability flags. See `clk framework flags`. ``orphan`` True if this clk is currently orphaned. ``rpm_enabled`` True if runtime power management is enabled for this clk. ``enable_count`` Reference count of enables. ``prepare_count`` Reference count of prepares. ``protect_count`` Protection reference count against disable. ``min_rate`` Minimum supported clock rate (Hz). ``max_rate`` Maximum supported clock rate (Hz). ``accuracy`` Accuracy of the clock rate (parts per billion). ``phase`` Current phase (degrees). ``duty`` Current duty cycle configuration (as ratio: num/den). ``children`` All of the children of this clk. ``child_node`` Node for linking as a child in the parent's list. ``hashtable_node`` Node for hash table that allows fast clk lookup by name. ``clks`` All of the clk consumers registered. ``notifier_count`` Number of notifiers registered for this clk. ``dentry`` DebugFS entry for this clk. ``debug_node`` DebugFS node for this clk. ``ref`` Reference count for structure lifetime management.”h]”(hì)�”}”(hŒ**Definition**::”h]”(hŒstrong”“”)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hjAh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j?hj;ubhŒ:”…”�”}”(hj;h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´KGhj7ubhŒ literal_block”“”)�”}”(hXstruct clk_core { const char *name; const struct clk_ops *ops; struct clk_hw *hw; struct module *owner; struct device *dev; struct hlist_node rpm_node; struct device_node *of_node; struct clk_core *parent; struct clk_parent_map *parents; u8 num_parents; u8 new_parent_index; unsigned long rate; unsigned long req_rate; unsigned long new_rate; struct clk_core *new_parent; struct clk_core *new_child; unsigned long flags; bool orphan; bool rpm_enabled; unsigned int enable_count; unsigned int prepare_count; unsigned int protect_count; unsigned long min_rate; unsigned long max_rate; unsigned long accuracy; int phase; struct clk_duty duty; struct hlist_head children; struct hlist_node child_node; struct hlist_node hashtable_node; struct hlist_head clks; unsigned int notifier_count; #ifdef CONFIG_DEBUG_FS; struct dentry *dentry; struct hlist_node debug_node; #endif; struct kref ref; };”h]”hXstruct clk_core { const char *name; const struct clk_ops *ops; struct clk_hw *hw; struct module *owner; struct device *dev; struct hlist_node rpm_node; struct device_node *of_node; struct clk_core *parent; struct clk_parent_map *parents; u8 num_parents; u8 new_parent_index; unsigned long rate; unsigned long req_rate; unsigned long new_rate; struct clk_core *new_parent; struct clk_core *new_child; unsigned long flags; bool orphan; bool rpm_enabled; unsigned int enable_count; unsigned int prepare_count; unsigned int protect_count; unsigned long min_rate; unsigned long max_rate; unsigned long accuracy; int phase; struct clk_duty duty; struct hlist_head children; struct hlist_node child_node; struct hlist_node hashtable_node; struct hlist_head clks; unsigned int notifier_count; #ifdef CONFIG_DEBUG_FS; struct dentry *dentry; struct hlist_node debug_node; #endif; struct kref ref; };”…”�”}”hj\sbah}”(h]”h ]”h"]”h$]”h&]”j÷jøuh1jZh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´KIhj7ubhì)�”}”(hŒ **Members**”h]”j@)�”}”(hjmh]”hŒMembers”…”�”}”(hjoh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j?hjkubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´Kqhj7ubhŒdefinition_list”“”)�”}”(hhh]”(hŒdefinition_list_item”“”)�”}”(hŒ4``name`` Unique name of the clk for identification. ”h]”(hŒterm”“”)�”}”(hŒ``name``”h]”hŒliteral”“”)�”}”(hj’h]”hŒname”…”�”}”(hj–h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´KEhjŠubhŒ definition”“”)�”}”(hhh]”hì)�”}”(hŒ*Unique name of the clk for identification.”h]”hŒ*Unique name of the clk for identification.”…”�”}”(hj¯h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j©h´KEhj¬ubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhjŠubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³j©h´KEhj…ubj‰)�”}”(hŒ>``ops`` Pointer to hardware-specific operations for this clk. ”h]”(j�)�”}”(hŒ``ops``”h]”j•)�”}”(hjÏh]”hŒops”…”�”}”(hjÑh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjÍubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´KFhjÉubj«)�”}”(hhh]”hì)�”}”(hŒ5Pointer to hardware-specific operations for this clk.”h]”hŒ5Pointer to hardware-specific operations for this clk.”…”�”}”(hjèh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jäh´KFhjåubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhjÉubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³jäh´KFhj…ubj‰)�”}”(hŒb``hw`` Pointer for traversing from a struct clk to its corresponding hardware-specific structure. ”h]”(j�)�”}”(hŒ``hw``”h]”j•)�”}”(hjh]”hŒhw”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´KHhjubj«)�”}”(hhh]”hì)�”}”(hŒZPointer for traversing from a struct clk to its corresponding hardware-specific structure.”h]”hŒZPointer for traversing from a struct clk to its corresponding hardware-specific structure.”…”�”}”(hj!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´KGhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³jh´KHhj…ubj‰)�”}”(hŒB``owner`` Kernel module owning this clk (for reference counting). ”h]”(j�)�”}”(hŒ ``owner``”h]”j•)�”}”(hjBh]”hŒowner”…”�”}”(hjDh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hj@ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´KIhj<ubj«)�”}”(hhh]”hì)�”}”(hŒ7Kernel module owning this clk (for reference counting).”h]”hŒ7Kernel module owning this clk (for reference counting).”…”�”}”(hj[h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jWh´KIhjXubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhj<ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³jWh´KIhj…ubj‰)�”}”(hŒ3``dev`` Device associated with this clk (optional) ”h]”(j�)�”}”(hŒ``dev``”h]”j•)�”}”(hj{h]”hŒdev”…”�”}”(hj}h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjyubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´KJhjuubj«)�”}”(hhh]”hì)�”}”(hŒ*Device associated with this clk (optional)”h]”hŒ*Device associated with this clk (optional)”…”�”}”(hj”h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j�h´KJhj‘ubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhjuubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³j�h´KJhj…ubj‰)�”}”(hŒ@``rpm_node`` Node for runtime power management list management. ”h]”(j�)�”}”(hŒ ``rpm_node``”h]”j•)�”}”(hj´h]”hŒrpm_node”…”�”}”(hj¶h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hj²ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´KKhj®ubj«)�”}”(hhh]”hì)�”}”(hŒ2Node for runtime power management list management.”h]”hŒ2Node for runtime power management list management.”…”�”}”(hjÍh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jÉh´KKhjÊubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhj®ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³jÉh´KKhj…ubj‰)�”}”(hŒF``of_node`` Device tree node associated with this clk (if applicable) ”h]”(j�)�”}”(hŒ ``of_node``”h]”j•)�”}”(hjíh]”hŒof_node”…”�”}”(hjïh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjëubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´KLhjçubj«)�”}”(hhh]”hì)�”}”(hŒ9Device tree node associated with this clk (if applicable)”h]”hŒ9Device tree node associated with this clk (if applicable)”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jh´KLhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhjçubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³jh´KLhj…ubj‰)�”}”(hŒ<``parent`` Pointer to the current parent in the clock tree. ”h]”(j�)�”}”(hŒ ``parent``”h]”j•)�”}”(hj&h]”hŒparent”…”�”}”(hj(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hj$ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´KMhj ubj«)�”}”(hhh]”hì)�”}”(hŒ0Pointer to the current parent in the clock tree.”h]”hŒ0Pointer to the current parent in the clock tree.”…”�”}”(hj?h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j;h´KMhj<ubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³j;h´KMhj…ubj‰)�”}”(hŒF``parents`` Array of possible parents (for muxes/selectable parents). ”h]”(j�)�”}”(hŒ ``parents``”h]”j•)�”}”(hj_h]”hŒparents”…”�”}”(hjah²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hj]ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´KNhjYubj«)�”}”(hhh]”hì)�”}”(hŒ9Array of possible parents (for muxes/selectable parents).”h]”hŒ9Array of possible parents (for muxes/selectable parents).”…”�”}”(hjxh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jth´KNhjuubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhjYubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³jth´KNhj…ubj‰)�”}”(hŒ,``num_parents`` Number of possible parents. ”h]”(j�)�”}”(hŒ``num_parents``”h]”j•)�”}”(hj˜h]”hŒ num_parents”…”�”}”(hjšh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hj–ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´KOhj’ubj«)�”}”(hhh]”hì)�”}”(hŒNumber of possible parents.”h]”hŒNumber of possible parents.”…”�”}”(hj±h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j­h´KOhj®ubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhj’ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³j­h´KOhj…ubj‰)�”}”(hŒN``new_parent_index`` Index of the new parent during parent change operations. ”h]”(j�)�”}”(hŒ``new_parent_index``”h]”j•)�”}”(hjÑh]”hŒnew_parent_index”…”�”}”(hjÓh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjÏubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´KPhjËubj«)�”}”(hhh]”hì)�”}”(hŒ8Index of the new parent during parent change operations.”h]”hŒ8Index of the new parent during parent change operations.”…”�”}”(hjêh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jæh´KPhjçubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhjËubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³jæh´KPhj…ubj‰)�”}”(hŒ)``rate`` Current cached clock rate (Hz). ”h]”(j�)�”}”(hŒ``rate``”h]”j•)�”}”(hj h]”hŒrate”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´KQhjubj«)�”}”(hhh]”hì)�”}”(hŒCurrent cached clock rate (Hz).”h]”hŒCurrent cached clock rate (Hz).”…”�”}”(hj#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jh´KQhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³jh´KQhj…ubj‰)�”}”(hŒå``req_rate`` The last rate requested by a call to clk_set_rate(). It's initialized to clk_core->rate. It's also updated to clk_core->rate every time the clock is reparented, and when we're doing the orphan -> !orphan transition. ”h]”(j�)�”}”(hŒ ``req_rate``”h]”j•)�”}”(hjCh]”hŒreq_rate”…”�”}”(hjEh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjAubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´KUhj=ubj«)�”}”(hhh]”hì)�”}”(hŒ×The last rate requested by a call to clk_set_rate(). It's initialized to clk_core->rate. It's also updated to clk_core->rate every time the clock is reparented, and when we're doing the orphan -> !orphan transition.”h]”hŒÝThe last rate requested by a call to clk_set_rate(). It’s initialized to clk_core->rate. It’s also updated to clk_core->rate every time the clock is reparented, and when we’re doing the orphan -> !orphan transition.”…”�”}”(hj\h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´KRhjYubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhj=ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³jXh´KUhj…ubj‰)�”}”(hŒ@``new_rate`` New rate to be set during a rate change operation. ”h]”(j�)�”}”(hŒ ``new_rate``”h]”j•)�”}”(hj}h]”hŒnew_rate”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hj{ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´KVhjwubj«)�”}”(hhh]”hì)�”}”(hŒ2New rate to be set during a rate change operation.”h]”hŒ2New rate to be set during a rate change operation.”…”�”}”(hj–h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j’h´KVhj“ubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhjwubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³j’h´KVhj…ubj‰)�”}”(hŒk``new_parent`` Pointer to new parent during parent change. This is also used when a clk's rate is changed. ”h]”(j�)�”}”(hŒ``new_parent``”h]”j•)�”}”(hj¶h]”hŒ new_parent”…”�”}”(hj¸h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hj´ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´KXhj°ubj«)�”}”(hhh]”hì)�”}”(hŒ[Pointer to new parent during parent change. This is also used when a clk's rate is changed.”h]”hŒ]Pointer to new parent during parent change. This is also used when a clk’s rate is changed.”…”�”}”(hjÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´KWhjÌubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhj°ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³jËh´KXhj…ubj‰)�”}”(hŒg``new_child`` Pointer to new child during reparenting. This is also used when a clk's rate is changed. ”h]”(j�)�”}”(hŒ ``new_child``”h]”j•)�”}”(hjðh]”hŒ new_child”…”�”}”(hjòh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjîubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´KZhjêubj«)�”}”(hhh]”hì)�”}”(hŒXPointer to new child during reparenting. This is also used when a clk's rate is changed.”h]”hŒZPointer to new child during reparenting. This is also used when a clk’s rate is changed.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´KYhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhjêubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³jh´KZhj…ubj‰)�”}”(hŒJ``flags`` Clock property and capability flags. See `clk framework flags`. ”h]”(j�)�”}”(hŒ ``flags``”h]”j•)�”}”(hj*h]”hŒflags”…”�”}”(hj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hj(ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´K\hj$ubj«)�”}”(hhh]”hì)�”}”(hŒ?Clock property and capability flags. See `clk framework flags`.”h]”(hŒ)Clock property and capability flags. See ”…”�”}”(hjCh²hh³Nh´NubhŒtitle_reference”“”)�”}”(hŒ`clk framework flags`”h]”hŒclk framework flags”…”�”}”(hjMh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jKhjCubhŒ.”…”�”}”(hjCh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”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Œ3``orphan`` True if this clk is currently orphaned. ”h]”(j�)�”}”(hŒ ``orphan``”h]”j•)�”}”(hjxh]”hŒorphan”…”�”}”(hjzh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjvubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´K]hjrubj«)�”}”(hhh]”hì)�”}”(hŒ'True if this clk is currently orphaned.”h]”hŒ'True if this clk is currently orphaned.”…”�”}”(hj‘h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j�h´K]hjŽubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhjrubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³j�h´K]hj…ubj‰)�”}”(hŒJ``rpm_enabled`` True if runtime power management is enabled for this clk. ”h]”(j�)�”}”(hŒ``rpm_enabled``”h]”j•)�”}”(hj±h]”hŒ rpm_enabled”…”�”}”(hj³h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hj¯ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´K^hj«ubj«)�”}”(hhh]”hì)�”}”(hŒ9True if runtime power management is enabled for this clk.”h]”hŒ9True if runtime power management is enabled for this clk.”…”�”}”(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Œ-``enable_count`` Reference count of enables. ”h]”(j�)�”}”(hŒ``enable_count``”h]”j•)�”}”(hjêh]”hŒ enable_count”…”�”}”(hjìh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjèubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´K_hjäubj«)�”}”(hhh]”hì)�”}”(hŒReference count of enables.”h]”hŒReference count of enables.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jÿh´K_hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhjäubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³jÿh´K_hj…ubj‰)�”}”(hŒ/``prepare_count`` Reference count of prepares. ”h]”(j�)�”}”(hŒ``prepare_count``”h]”j•)�”}”(hj#h]”hŒ prepare_count”…”�”}”(hj%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hj!ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´K`hjubj«)�”}”(hhh]”hì)�”}”(hŒReference count of prepares.”h]”hŒReference count of prepares.”…”�”}”(hj<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j8h´K`hj9ubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³j8h´K`hj…ubj‰)�”}”(hŒ>``protect_count`` Protection reference count against disable. ”h]”(j�)�”}”(hŒ``protect_count``”h]”j•)�”}”(hj\h]”hŒ protect_count”…”�”}”(hj^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjZubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´KahjVubj«)�”}”(hhh]”hì)�”}”(hŒ+Protection reference count against disable.”h]”hŒ+Protection reference count against disable.”…”�”}”(hjuh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jqh´Kahjrubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhjVubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³jqh´Kahj…ubj‰)�”}”(hŒ0``min_rate`` Minimum supported clock rate (Hz). ”h]”(j�)�”}”(hŒ ``min_rate``”h]”j•)�”}”(hj•h]”hŒmin_rate”…”�”}”(hj—h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hj“ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´Kbhj�ubj«)�”}”(hhh]”hì)�”}”(hŒ"Minimum supported clock rate (Hz).”h]”hŒ"Minimum supported clock rate (Hz).”…”�”}”(hj®h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jªh´Kbhj«ubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhj�ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³jªh´Kbhj…ubj‰)�”}”(hŒ0``max_rate`` Maximum supported clock rate (Hz). ”h]”(j�)�”}”(hŒ ``max_rate``”h]”j•)�”}”(hjÎh]”hŒmax_rate”…”�”}”(hjÐh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjÌubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´KchjÈubj«)�”}”(hhh]”hì)�”}”(hŒ"Maximum supported clock rate (Hz).”h]”hŒ"Maximum supported clock rate (Hz).”…”�”}”(hjçh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jãh´Kchjäubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhjÈubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³jãh´Kchj…ubj‰)�”}”(hŒ=``accuracy`` Accuracy of the clock rate (parts per billion). ”h]”(j�)�”}”(hŒ ``accuracy``”h]”j•)�”}”(hjh]”hŒaccuracy”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´Kdhjubj«)�”}”(hhh]”hì)�”}”(hŒ/Accuracy of the clock rate (parts per billion).”h]”hŒ/Accuracy of the clock rate (parts per billion).”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jh´Kdhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³jh´Kdhj…ubj‰)�”}”(hŒ#``phase`` Current phase (degrees). ”h]”(j�)�”}”(hŒ ``phase``”h]”j•)�”}”(hj@h]”hŒphase”…”�”}”(hjBh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hj>ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´Kehj:ubj«)�”}”(hhh]”hì)�”}”(hŒCurrent phase (degrees).”h]”hŒCurrent phase (degrees).”…”�”}”(hjYh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jUh´KehjVubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhj:ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³jUh´Kehj…ubj‰)�”}”(hŒ?``duty`` Current duty cycle configuration (as ratio: num/den). ”h]”(j�)�”}”(hŒ``duty``”h]”j•)�”}”(hjyh]”hŒduty”…”�”}”(hj{h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjwubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´Kfhjsubj«)�”}”(hhh]”hì)�”}”(hŒ5Current duty cycle configuration (as ratio: num/den).”h]”hŒ5Current duty cycle configuration (as ratio: num/den).”…”�”}”(hj’h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jŽh´Kfhj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhjsubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³jŽh´Kfhj…ubj‰)�”}”(hŒ.``children`` All of the children of this clk. ”h]”(j�)�”}”(hŒ ``children``”h]”j•)�”}”(hj²h]”hŒchildren”…”�”}”(hj´h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hj°ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´Kghj¬ubj«)�”}”(hhh]”hì)�”}”(hŒ All of the children of this clk.”h]”hŒ All of the children of this clk.”…”�”}”(hjËh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jÇh´KghjÈubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhj¬ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³jÇh´Kghj…ubj‰)�”}”(hŒA``child_node`` Node for linking as a child in the parent's list. ”h]”(j�)�”}”(hŒ``child_node``”h]”j•)�”}”(hjëh]”hŒ child_node”…”�”}”(hjíh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjéubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´Khhjåubj«)�”}”(hhh]”hì)�”}”(hŒ1Node for linking as a child in the parent's list.”h]”hŒ3Node for linking as a child in the parent’s list.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j h´Khhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhjåubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³j h´Khhj…ubj‰)�”}”(hŒL``hashtable_node`` Node for hash table that allows fast clk lookup by name. ”h]”(j�)�”}”(hŒ``hashtable_node``”h]”j•)�”}”(hj$ h]”hŒhashtable_node”…”�”}”(hj& h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hj" ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´Kihj ubj«)�”}”(hhh]”hì)�”}”(hŒ8Node for hash table that allows fast clk lookup by name.”h]”hŒ8Node for hash table that allows fast clk lookup by name.”…”�”}”(hj= h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j9 h´Kihj: ubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³j9 h´Kihj…ubj‰)�”}”(hŒ.``clks`` All of the clk consumers registered. ”h]”(j�)�”}”(hŒ``clks``”h]”j•)�”}”(hj] h]”hŒclks”…”�”}”(hj_ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hj[ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´KjhjW ubj«)�”}”(hhh]”hì)�”}”(hŒ$All of the clk consumers registered.”h]”hŒ$All of the clk consumers registered.”…”�”}”(hjv h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jr h´Kjhjs ubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhjW ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³jr h´Kjhj…ubj‰)�”}”(hŒ@``notifier_count`` Number of notifiers registered for this clk. ”h]”(j�)�”}”(hŒ``notifier_count``”h]”j•)�”}”(hj– h]”hŒnotifier_count”…”�”}”(hj˜ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hj” ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´Kkhj� ubj«)�”}”(hhh]”hì)�”}”(hŒ,Number of notifiers registered for this clk.”h]”hŒ,Number of notifiers registered for this clk.”…”�”}”(hj¯ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j« h´Kkhj¬ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhj� ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³j« h´Kkhj…ubj‰)�”}”(hŒ'``dentry`` DebugFS entry for this clk. ”h]”(j�)�”}”(hŒ ``dentry``”h]”j•)�”}”(hjÏ h]”hŒdentry”…”�”}”(hjÑ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjÍ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´KlhjÉ ubj«)�”}”(hhh]”hì)�”}”(hŒDebugFS entry for this clk.”h]”hŒDebugFS entry for this clk.”…”�”}”(hjè h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³jä h´Klhjå ubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhjÉ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³jä h´Klhj…ubj‰)�”}”(hŒ*``debug_node`` DebugFS node for this clk. ”h]”(j�)�”}”(hŒ``debug_node``”h]”j•)�”}”(hj h]”hŒ debug_node”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´Kmhj ubj«)�”}”(hhh]”hì)�”}”(hŒDebugFS node for this clk.”h]”hŒDebugFS node for this clk.”…”�”}”(hj! h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³j h´Kmhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³j h´Kmhj…ubj‰)�”}”(hŒ:``ref`` Reference count for structure lifetime management.”h]”(j�)�”}”(hŒ``ref``”h]”j•)�”}”(hjA h]”hŒref”…”�”}”(hjC h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hj? ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´Kmhj; ubj«)�”}”(hhh]”hì)�”}”(hŒ2Reference count for structure lifetime management.”h]”hŒ2Reference count for structure lifetime management.”…”�”}”(hjZ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´KnhjW ubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhj; ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³jV h´Kmhj…ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jƒhj7ubeh}”(h]”h ]”Œ kernelindent”ah"]”h$]”h&]”uh1j5hj‚h²hh³j¤h´Nubhì)�”}”(hŒ**Description**”h]”j@)�”}”(hj„ h]”hŒ Description”…”�”}”(hj† h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j?hj‚ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´Kqhj‚h²hubhì)�”}”(hX Managed by the clk framework. Clk providers and consumers do not interact with this structure directly. Instead, clk operations flow through the framework and the framework manipulates this structure to keep track of parent/child relationships, rate, enable state, etc.”h]”hX Managed by the clk framework. Clk providers and consumers do not interact with this structure directly. Instead, clk operations flow through the framework and the framework manipulates this structure to keep track of parent/child relationships, rate, enable state, etc.”…”�”}”(hjš h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³ŒP/var/lib/git/docbuild/linux/Documentation/driver-api/clk:45: ./drivers/clk/clk.c”h´Knhj‚h²hubhì)�”}”(hŒÅThe members above make up the core of the clk tree topology. The clk api itself defines several driver-facing functions which operate on struct clk. That api is documented in include/linux/clk.h.”h]”hŒÅThe members above make up the core of the clk tree topology. The clk api itself defines several driver-facing functions which operate on struct clk. That api is documented in include/linux/clk.h.”…”�”}”(hj© h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K0hj‚h²hubhì)�”}”(hXPlatforms and devices utilizing the common struct clk_core use the struct clk_ops pointer in struct clk_core to perform the hardware-specific parts of the operations defined in clk-provider.h, and can set one or more framework-level flags documented below.”h]”hXPlatforms and devices utilizing the common struct clk_core use the struct clk_ops pointer in struct clk_core to perform the hardware-specific parts of the operations defined in clk-provider.h, and can set one or more framework-level flags documented below.”…”�”}”(hj· h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K4hj‚h²hubj”)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œentries”]”(j Œclk_ops (C struct)”Œ c.clk_ops”hNt”auh1j“hj‚h²hh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´Nubj¦)�”}”(hhh]”(j«)�”}”(hŒclk_ops”h]”j±)�”}”(hŒstruct clk_ops”h]”(j·)�”}”(hjºh]”hŒstruct”…”�”}”(hjß h²hh³Nh´Nubah}”(h]”h ]”jÃah"]”h$]”h&]”uh1j¶hjÛ h²hh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´KubjÉ)�”}”(hŒ ”h]”hŒ ”…”�”}”(hjí h²hh³Nh´Nubah}”(h]”h ]”jÕah"]”h$]”h&]”uh1jÈhjÛ h²hh³jì h´KubjÚ)�”}”(hŒclk_ops”h]”jà)�”}”(hjÙ h]”hŒclk_ops”…”�”}”(hjÿ h²hh³Nh´Nubah}”(h]”h ]”jëah"]”h$]”h&]”uh1jßhjû ubah}”(h]”h ]”(jòjóeh"]”h$]”h&]”j÷jøuh1jÙhjÛ h²hh³jì h´Kubeh}”(h]”h ]”h"]”h$]”h&]”j÷jøjÿˆuh1j°jjhj× h²hh³jì h´Kubah}”(h]”jÑ ah ]”(jjeh"]”h$]”h&]”j ˆj )j huh1jªh³jì h´KhjÔ h²hubj)�”}”(hhh]”hì)�”}”(hŒ“Callback operations for hardware clocks; these are to be provided by the clock implementation, and will be called by drivers through the clk_* api.”h]”hŒ“Callback operations for hardware clocks; these are to be provided by the clock implementation, and will be called by drivers through the clk_* api.”…”�”}”(hj! h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´Kyhj h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjÔ h²hh³jì h´Kubeh}”(h]”h ]”(j*Œstruct”eh"]”h$]”h&]”j/j*j0j9 j1j9 j2‰j3‰j4‰uh1j¥h²hhj‚h³jÓ h´Nubj6)�”}”(hX�**Definition**:: struct clk_ops { int (*prepare)(struct clk_hw *hw); void (*unprepare)(struct clk_hw *hw); int (*is_prepared)(struct clk_hw *hw); void (*unprepare_unused)(struct clk_hw *hw); int (*enable)(struct clk_hw *hw); void (*disable)(struct clk_hw *hw); int (*is_enabled)(struct clk_hw *hw); void (*disable_unused)(struct clk_hw *hw); int (*save_context)(struct clk_hw *hw); void (*restore_context)(struct clk_hw *hw); unsigned long (*recalc_rate)(struct clk_hw *hw, unsigned long parent_rate); int (*determine_rate)(struct clk_hw *hw, struct clk_rate_request *req); int (*set_parent)(struct clk_hw *hw, u8 index); u8 (*get_parent)(struct clk_hw *hw); int (*set_rate)(struct clk_hw *hw, unsigned long rate, unsigned long parent_rate); int (*set_rate_and_parent)(struct clk_hw *hw, unsigned long rate, unsigned long parent_rate, u8 index); int (*set_spread_spectrum)(struct clk_hw *hw, const struct clk_spread_spectrum *ss_conf); unsigned long (*recalc_accuracy)(struct clk_hw *hw, unsigned long parent_accuracy); int (*get_phase)(struct clk_hw *hw); int (*set_phase)(struct clk_hw *hw, int degrees); int (*get_duty_cycle)(struct clk_hw *hw, struct clk_duty *duty); int (*set_duty_cycle)(struct clk_hw *hw, struct clk_duty *duty); int (*init)(struct clk_hw *hw); void (*terminate)(struct clk_hw *hw); void (*debug_init)(struct clk_hw *hw, struct dentry *dentry); }; **Members** ``prepare`` Prepare the clock for enabling. This must not return until the clock is fully prepared, and it's safe to call clk_enable. This callback is intended to allow clock implementations to do any initialisation that may sleep. Called with prepare_lock held. ``unprepare`` Release the clock from its prepared state. This will typically undo any work done in the **prepare** callback. Called with prepare_lock held. ``is_prepared`` Queries the hardware to determine if the clock is prepared. This function is allowed to sleep. Optional, if this op is not set then the prepare count will be used. ``unprepare_unused`` Unprepare the clock atomically. Only called from clk_disable_unused for prepare clocks with special needs. Called with prepare mutex held. This function may sleep. ``enable`` Enable the clock atomically. This must not return until the clock is generating a valid clock signal, usable by consumer devices. Called with enable_lock held. This function must not sleep. ``disable`` Disable the clock atomically. Called with enable_lock held. This function must not sleep. ``is_enabled`` Queries the hardware to determine if the clock is enabled. This function must not sleep. Optional, if this op is not set then the enable count will be used. ``disable_unused`` Disable the clock atomically. Only called from clk_disable_unused for gate clocks with special needs. Called with enable_lock held. This function must not sleep. ``save_context`` Save the context of the clock in prepration for poweroff. ``restore_context`` Restore the context of the clock after a restoration of power. ``recalc_rate`` Recalculate the rate of this clock, by querying hardware. The parent rate is an input parameter. It is up to the caller to ensure that the prepare_mutex is held across this call. If the driver cannot figure out a rate for this clock, it must return 0. Returns the calculated rate. Optional, but recommended - if this op is not set then clock rate will be initialized to 0. ``determine_rate`` Given a target rate as input, returns the closest rate actually supported by the clock, and optionally the parent clock that should be used to provide the clock rate. ``set_parent`` Change the input source of this clock; for clocks with multiple possible parents specify a new parent by passing in the index as a u8 corresponding to the parent in either the .parent_names or .parents arrays. This function in affect translates an array index into the value programmed into the hardware. Returns 0 on success, -EERROR otherwise. ``get_parent`` Queries the hardware to determine the parent of a clock. The return value is a u8 which specifies the index corresponding to the parent clock. This index can be applied to either the .parent_names or .parents arrays. In short, this function translates the parent value read from hardware into an array index. Currently only called when the clock is initialized by __clk_init. This callback is mandatory for clocks with multiple parents. It is optional (and unnecessary) for clocks with 0 or 1 parents. ``set_rate`` Change the rate of this clock. The requested rate is specified by the second argument, which should typically be the return of .determine_rate call. The third argument gives the parent rate which is likely helpful for most .set_rate implementation. Returns 0 on success, -EERROR otherwise. ``set_rate_and_parent`` Change the rate and the parent of this clock. The requested rate is specified by the second argument, which should typically be the return of clk_round_rate() call. The third argument gives the parent rate which is likely helpful for most .set_rate_and_parent implementation. The fourth argument gives the parent index. This callback is optional (and unnecessary) for clocks with 0 or 1 parents as well as for clocks that can tolerate switching the rate and the parent separately via calls to .set_parent and .set_rate. Returns 0 on success, -EERROR otherwise. ``set_spread_spectrum`` Optional callback used to configure the spread spectrum modulation frequency, percentage, and method to reduce EMI by spreading the clock frequency over a wider range. Returns 0 on success, -EERROR otherwise. ``recalc_accuracy`` Recalculate the accuracy of this clock. The clock accuracy is expressed in ppb (parts per billion). The parent accuracy is an input parameter. Returns the calculated accuracy. Optional - if this op is not set then clock accuracy will be initialized to parent accuracy or 0 (perfect clock) if clock has no parent. ``get_phase`` Queries the hardware to get the current phase of a clock. Returned values are 0-359 degrees on success, negative error codes on failure. ``set_phase`` Shift the phase this clock signal in degrees specified by the second argument. Valid values for degrees are 0-359. Return 0 on success, otherwise -EERROR. ``get_duty_cycle`` Queries the hardware to get the current duty cycle ratio of a clock. Returned values denominator cannot be 0 and must be superior or equal to the numerator. ``set_duty_cycle`` Apply the duty cycle ratio to this clock signal specified by the numerator (2nd argurment) and denominator (3rd argument). Argument must be a valid ratio (denominator > 0 and >= numerator) Return 0 on success, otherwise -EERROR. ``init`` Perform platform-specific initialization magic. This is not used by any of the basic clock types. This callback exist for HW which needs to perform some initialisation magic for CCF to get an accurate view of the clock. It may also be used dynamic resource allocation is required. It shall not used to deal with clock parameters, such as rate or parents. Returns 0 on success, -EERROR otherwise. ``terminate`` Free any resource allocated by init. ``debug_init`` Set up type-specific debugfs entries for this clock. This is called once, after the debugfs directory entry for this clock has been created. The dentry pointer representing that directory is provided as an argument. Called with prepare_lock held. Returns 0 on success, -EERROR otherwise.”h]”(hì)�”}”(hŒ**Definition**::”h]”(j@)�”}”(hŒ**Definition**”h]”hŒ Definition”…”�”}”(hjE h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j?hjA ubhŒ:”…”�”}”(hjA h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´K}hj= ubj[)�”}”(hX²struct clk_ops { int (*prepare)(struct clk_hw *hw); void (*unprepare)(struct clk_hw *hw); int (*is_prepared)(struct clk_hw *hw); void (*unprepare_unused)(struct clk_hw *hw); int (*enable)(struct clk_hw *hw); void (*disable)(struct clk_hw *hw); int (*is_enabled)(struct clk_hw *hw); void (*disable_unused)(struct clk_hw *hw); int (*save_context)(struct clk_hw *hw); void (*restore_context)(struct clk_hw *hw); unsigned long (*recalc_rate)(struct clk_hw *hw, unsigned long parent_rate); int (*determine_rate)(struct clk_hw *hw, struct clk_rate_request *req); int (*set_parent)(struct clk_hw *hw, u8 index); u8 (*get_parent)(struct clk_hw *hw); int (*set_rate)(struct clk_hw *hw, unsigned long rate, unsigned long parent_rate); int (*set_rate_and_parent)(struct clk_hw *hw, unsigned long rate, unsigned long parent_rate, u8 index); int (*set_spread_spectrum)(struct clk_hw *hw, const struct clk_spread_spectrum *ss_conf); unsigned long (*recalc_accuracy)(struct clk_hw *hw, unsigned long parent_accuracy); int (*get_phase)(struct clk_hw *hw); int (*set_phase)(struct clk_hw *hw, int degrees); int (*get_duty_cycle)(struct clk_hw *hw, struct clk_duty *duty); int (*set_duty_cycle)(struct clk_hw *hw, struct clk_duty *duty); int (*init)(struct clk_hw *hw); void (*terminate)(struct clk_hw *hw); void (*debug_init)(struct clk_hw *hw, struct dentry *dentry); };”h]”hX²struct clk_ops { int (*prepare)(struct clk_hw *hw); void (*unprepare)(struct clk_hw *hw); int (*is_prepared)(struct clk_hw *hw); void (*unprepare_unused)(struct clk_hw *hw); int (*enable)(struct clk_hw *hw); void (*disable)(struct clk_hw *hw); int (*is_enabled)(struct clk_hw *hw); void (*disable_unused)(struct clk_hw *hw); int (*save_context)(struct clk_hw *hw); void (*restore_context)(struct clk_hw *hw); unsigned long (*recalc_rate)(struct clk_hw *hw, unsigned long parent_rate); int (*determine_rate)(struct clk_hw *hw, struct clk_rate_request *req); int (*set_parent)(struct clk_hw *hw, u8 index); u8 (*get_parent)(struct clk_hw *hw); int (*set_rate)(struct clk_hw *hw, unsigned long rate, unsigned long parent_rate); int (*set_rate_and_parent)(struct clk_hw *hw, unsigned long rate, unsigned long parent_rate, u8 index); int (*set_spread_spectrum)(struct clk_hw *hw, const struct clk_spread_spectrum *ss_conf); unsigned long (*recalc_accuracy)(struct clk_hw *hw, unsigned long parent_accuracy); int (*get_phase)(struct clk_hw *hw); int (*set_phase)(struct clk_hw *hw, int degrees); int (*get_duty_cycle)(struct clk_hw *hw, struct clk_duty *duty); int (*set_duty_cycle)(struct clk_hw *hw, struct clk_duty *duty); int (*init)(struct clk_hw *hw); void (*terminate)(struct clk_hw *hw); void (*debug_init)(struct clk_hw *hw, struct dentry *dentry); };”…”�”}”hj^ sbah}”(h]”h ]”h"]”h$]”h&]”j÷jøuh1jZh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´Khj= ubhì)�”}”(hŒ **Members**”h]”j@)�”}”(hjo h]”hŒMembers”…”�”}”(hjq h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j?hjm ubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´K›hj= ubj„)�”}”(hhh]”(j‰)�”}”(hX``prepare`` Prepare the clock for enabling. This must not return until the clock is fully prepared, and it's safe to call clk_enable. This callback is intended to allow clock implementations to do any initialisation that may sleep. Called with prepare_lock held. ”h]”(j�)�”}”(hŒ ``prepare``”h]”j•)�”}”(hjŽ h]”hŒprepare”…”�”}”(hj� h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjŒ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´K‚hjˆ ubj«)�”}”(hhh]”hì)�”}”(hŒúPrepare the clock for enabling. This must not return until the clock is fully prepared, and it's safe to call clk_enable. This callback is intended to allow clock implementations to do any initialisation that may sleep. Called with prepare_lock held.”h]”hŒüPrepare the clock for enabling. This must not return until the clock is fully prepared, and it’s safe to call clk_enable. This callback is intended to allow clock implementations to do any initialisation that may sleep. Called with prepare_lock held.”…”�”}”(hj§ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.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Œœ``unprepare`` Release the clock from its prepared state. This will typically undo any work done in the **prepare** callback. Called with prepare_lock held. ”h]”(j�)�”}”(hŒ ``unprepare``”h]”j•)�”}”(hjÈ h]”hŒ unprepare”…”�”}”(hjÊ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjÆ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´K†hj ubj«)�”}”(hhh]”hì)�”}”(hŒ�Release the clock from its prepared state. This will typically undo any work done in the **prepare** callback. Called with prepare_lock held.”h]”(hŒYRelease the clock from its prepared state. This will typically undo any work done in the ”…”�”}”(hjá h²hh³Nh´Nubj@)�”}”(hŒ **prepare**”h]”hŒprepare”…”�”}”(hjé h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j?hjá ubhŒ) callback. Called with prepare_lock held.”…”�”}”(hjá h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.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Œ´``is_prepared`` Queries the hardware to determine if the clock is prepared. This function is allowed to sleep. Optional, if this op is not set then the prepare count will be used. ”h]”(j�)�”}”(hŒ``is_prepared``”h]”j•)�”}”(hj h]”hŒ is_prepared”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´KŠhj ubj«)�”}”(hhh]”hì)�”}”(hŒ£Queries the hardware to determine if the clock is prepared. This function is allowed to sleep. Optional, if this op is not set then the prepare count will be used.”h]”hŒ£Queries the hardware to determine if the clock is prepared. This function is allowed to sleep. Optional, if this op is not set then the prepare count will be used.”…”�”}”(hj- h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.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Œº``unprepare_unused`` Unprepare the clock atomically. Only called from clk_disable_unused for prepare clocks with special needs. Called with prepare mutex held. This function may sleep. ”h]”(j�)�”}”(hŒ``unprepare_unused``”h]”j•)�”}”(hjN h]”hŒunprepare_unused”…”�”}”(hjP h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjL ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´KŽhjH ubj«)�”}”(hhh]”hì)�”}”(hŒ¤Unprepare the clock atomically. Only called from clk_disable_unused for prepare clocks with special needs. Called with prepare mutex held. This function may sleep.”h]”hŒ¤Unprepare the clock atomically. Only called from clk_disable_unused for prepare clocks with special needs. Called with prepare mutex held. This function may sleep.”…”�”}”(hjg h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´KŒhjd ubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhjH ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³jc h´KŽhj… ubj‰)�”}”(hŒÉ``enable`` Enable the clock atomically. This must not return until the clock is generating a valid clock signal, usable by consumer devices. Called with enable_lock held. This function must not sleep. ”h]”(j�)�”}”(hŒ ``enable``”h]”j•)�”}”(hjˆ h]”hŒenable”…”�”}”(hjŠ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hj† ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´K“hj‚ ubj«)�”}”(hhh]”hì)�”}”(hŒ½Enable the clock atomically. This must not return until the clock is generating a valid clock signal, usable by consumer devices. Called with enable_lock held. This function must not sleep.”h]”hŒ½Enable the clock atomically. This must not return until the clock is generating a valid clock signal, usable by consumer devices. Called with enable_lock held. This function must not sleep.”…”�”}”(hj¡ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.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Œf``disable`` Disable the clock atomically. Called with enable_lock held. This function must not sleep. ”h]”(j�)�”}”(hŒ ``disable``”h]”j•)�”}”(hj h]”hŒdisable”…”�”}”(hjÄ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjÀ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´K–hj¼ ubj«)�”}”(hhh]”hì)�”}”(hŒYDisable the clock atomically. Called with enable_lock held. This function must not sleep.”h]”hŒYDisable the clock atomically. Called with enable_lock held. This function must not sleep.”…”�”}”(hjÛ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.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Œ¬``is_enabled`` Queries the hardware to determine if the clock is enabled. This function must not sleep. Optional, if this op is not set then the enable count will be used. ”h]”(j�)�”}”(hŒ``is_enabled``”h]”j•)�”}”(hjü h]”hŒ is_enabled”…”�”}”(hjþ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjú ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´Kšhjö ubj«)�”}”(hhh]”hì)�”}”(hŒœQueries the hardware to determine if the clock is enabled. This function must not sleep. Optional, if this op is not set then the enable count will be used.”h]”hŒœQueries the hardware to determine if the clock is enabled. This function must not sleep. Optional, if this op is not set then the enable count will be used.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.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Œ·``disable_unused`` Disable the clock atomically. Only called from clk_disable_unused for gate clocks with special needs. Called with enable_lock held. This function must not sleep. ”h]”(j�)�”}”(hŒ``disable_unused``”h]”j•)�”}”(hj6 h]”hŒdisable_unused”…”�”}”(hj8 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hj4 ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´KŸhj0 ubj«)�”}”(hhh]”hì)�”}”(hŒ£Disable the clock atomically. Only called from clk_disable_unused for gate clocks with special needs. Called with enable_lock held. This function must not sleep.”h]”hŒ£Disable the clock atomically. Only called from clk_disable_unused for gate clocks with special needs. Called with enable_lock held. This function must not sleep.”…”�”}”(hjO h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´KœhjL ubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhj0 ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³jK h´KŸhj… ubj‰)�”}”(hŒK``save_context`` Save the context of the clock in prepration for poweroff. ”h]”(j�)�”}”(hŒ``save_context``”h]”j•)�”}”(hjp h]”hŒ save_context”…”�”}”(hjr h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjn ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´K¡hjj ubj«)�”}”(hhh]”hì)�”}”(hŒ9Save the context of the clock in prepration for poweroff.”h]”hŒ9Save the context of the clock in prepration for poweroff.”…”�”}”(hj‰ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”u•+íh1hëh³j… h´K¡hj† ubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhjj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³j… h´K¡hj… ubj‰)�”}”(hŒS``restore_context`` Restore the context of the clock after a restoration of power. ”h]”(j�)�”}”(hŒ``restore_context``”h]”j•)�”}”(hj© h]”hŒrestore_context”…”�”}”(hj« h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hj§ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´K¤hj£ ubj«)�”}”(hhh]”hì)�”}”(hŒ>Restore the context of the clock after a restoration of power.”h]”hŒ>Restore the context of the clock after a restoration of power.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.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†``recalc_rate`` Recalculate the rate of this clock, by querying hardware. The parent rate is an input parameter. It is up to the caller to ensure that the prepare_mutex is held across this call. If the driver cannot figure out a rate for this clock, it must return 0. Returns the calculated rate. Optional, but recommended - if this op is not set then clock rate will be initialized to 0. ”h]”(j�)�”}”(hŒ``recalc_rate``”h]”j•)�”}”(hjã h]”hŒ recalc_rate”…”�”}”(hjå h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjá ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´K«hjÝ ubj«)�”}”(hhh]”hì)�”}”(hXuRecalculate the rate of this clock, by querying hardware. The parent rate is an input parameter. It is up to the caller to ensure that the prepare_mutex is held across this call. If the driver cannot figure out a rate for this clock, it must return 0. Returns the calculated rate. Optional, but recommended - if this op is not set then clock rate will be initialized to 0.”h]”hXuRecalculate the rate of this clock, by querying hardware. The parent rate is an input parameter. It is up to the caller to ensure that the prepare_mutex is held across this call. If the driver cannot figure out a rate for this clock, it must return 0. Returns the calculated rate. Optional, but recommended - if this op is not set then clock rate will be initialized to 0.”…”�”}”(hjü h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.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Œº``determine_rate`` Given a target rate as input, returns the closest rate actually supported by the clock, and optionally the parent clock that should be used to provide the clock rate. ”h]”(j�)�”}”(hŒ``determine_rate``”h]”j•)�”}”(hjh]”hŒdetermine_rate”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´K¯hjubj«)�”}”(hhh]”hì)�”}”(hŒ¦Given a target rate as input, returns the closest rate actually supported by the clock, and optionally the parent clock that should be used to provide the clock rate.”h]”hŒ¦Given a target rate as input, returns the closest rate actually supported by the clock, and optionally the parent clock that should be used to provide the clock rate.”…”�”}”(hj6h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´K­hj3ubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³j2h´K¯hj… ubj‰)�”}”(hXj``set_parent`` Change the input source of this clock; for clocks with multiple possible parents specify a new parent by passing in the index as a u8 corresponding to the parent in either the .parent_names or .parents arrays. This function in affect translates an array index into the value programmed into the hardware. Returns 0 on success, -EERROR otherwise. ”h]”(j�)�”}”(hŒ``set_parent``”h]”j•)�”}”(hjWh]”hŒ set_parent”…”�”}”(hjYh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjUubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´K¶hjQubj«)�”}”(hhh]”hì)�”}”(hXZChange the input source of this clock; for clocks with multiple possible parents specify a new parent by passing in the index as a u8 corresponding to the parent in either the .parent_names or .parents arrays. This function in affect translates an array index into the value programmed into the hardware. Returns 0 on success, -EERROR otherwise.”h]”hXZChange the input source of this clock; for clocks with multiple possible parents specify a new parent by passing in the index as a u8 corresponding to the parent in either the .parent_names or .parents arrays. This function in affect translates an array index into the value programmed into the hardware. Returns 0 on success, -EERROR otherwise.”…”�”}”(hjph²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´K±hjmubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhjQubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³jlh´K¶hj… ubj‰)�”}”(hX ``get_parent`` Queries the hardware to determine the parent of a clock. The return value is a u8 which specifies the index corresponding to the parent clock. This index can be applied to either the .parent_names or .parents arrays. In short, this function translates the parent value read from hardware into an array index. Currently only called when the clock is initialized by __clk_init. This callback is mandatory for clocks with multiple parents. It is optional (and unnecessary) for clocks with 0 or 1 parents. ”h]”(j�)�”}”(hŒ``get_parent``”h]”j•)�”}”(hj‘h]”hŒ get_parent”…”�”}”(hj“h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´KÀhj‹ubj«)�”}”(hhh]”hì)�”}”(hXûQueries the hardware to determine the parent of a clock. The return value is a u8 which specifies the index corresponding to the parent clock. This index can be applied to either the .parent_names or .parents arrays. In short, this function translates the parent value read from hardware into an array index. Currently only called when the clock is initialized by __clk_init. This callback is mandatory for clocks with multiple parents. It is optional (and unnecessary) for clocks with 0 or 1 parents.”h]”hXûQueries the hardware to determine the parent of a clock. The return value is a u8 which specifies the index corresponding to the parent clock. This index can be applied to either the .parent_names or .parents arrays. In short, this function translates the parent value read from hardware into an array index. Currently only called when the clock is initialized by __clk_init. This callback is mandatory for clocks with multiple parents. It is optional (and unnecessary) for clocks with 0 or 1 parents.”…”�”}”(hjªh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.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‰)�”}”(hX0``set_rate`` Change the rate of this clock. The requested rate is specified by the second argument, which should typically be the return of .determine_rate call. The third argument gives the parent rate which is likely helpful for most .set_rate implementation. Returns 0 on success, -EERROR otherwise. ”h]”(j�)�”}”(hŒ ``set_rate``”h]”j•)�”}”(hjËh]”hŒset_rate”…”�”}”(hjÍh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjÉubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´KÆhjÅubj«)�”}”(hhh]”hì)�”}”(hX"Change the rate of this clock. The requested rate is specified by the second argument, which should typically be the return of .determine_rate call. The third argument gives the parent rate which is likely helpful for most .set_rate implementation. Returns 0 on success, -EERROR otherwise.”h]”hX"Change the rate of this clock. The requested rate is specified by the second argument, which should typically be the return of .determine_rate call. The third argument gives the parent rate which is likely helpful for most .set_rate implementation. Returns 0 on success, -EERROR otherwise.”…”�”}”(hjäh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.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‰)�”}”(hXJ``set_rate_and_parent`` Change the rate and the parent of this clock. The requested rate is specified by the second argument, which should typically be the return of clk_round_rate() call. The third argument gives the parent rate which is likely helpful for most .set_rate_and_parent implementation. The fourth argument gives the parent index. This callback is optional (and unnecessary) for clocks with 0 or 1 parents as well as for clocks that can tolerate switching the rate and the parent separately via calls to .set_parent and .set_rate. Returns 0 on success, -EERROR otherwise. ”h]”(j�)�”}”(hŒ``set_rate_and_parent``”h]”j•)�”}”(hjh]”hŒset_rate_and_parent”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´KÑhjÿubj«)�”}”(hhh]”hì)�”}”(hX1Change the rate and the parent of this clock. The requested rate is specified by the second argument, which should typically be the return of clk_round_rate() call. The third argument gives the parent rate which is likely helpful for most .set_rate_and_parent implementation. The fourth argument gives the parent index. This callback is optional (and unnecessary) for clocks with 0 or 1 parents as well as for clocks that can tolerate switching the rate and the parent separately via calls to .set_parent and .set_rate. Returns 0 on success, -EERROR otherwise.”h]”hX1Change the rate and the parent of this clock. The requested rate is specified by the second argument, which should typically be the return of clk_round_rate() call. The third argument gives the parent rate which is likely helpful for most .set_rate_and_parent implementation. The fourth argument gives the parent index. This callback is optional (and unnecessary) for clocks with 0 or 1 parents as well as for clocks that can tolerate switching the rate and the parent separately via calls to .set_parent and .set_rate. Returns 0 on success, -EERROR otherwise.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´KÈhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhjÿubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³jh´KÑhj… ubj‰)�”}”(hŒé``set_spread_spectrum`` Optional callback used to configure the spread spectrum modulation frequency, percentage, and method to reduce EMI by spreading the clock frequency over a wider range. Returns 0 on success, -EERROR otherwise. ”h]”(j�)�”}”(hŒ``set_spread_spectrum``”h]”j•)�”}”(hj?h]”hŒset_spread_spectrum”…”�”}”(hjAh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hj=ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´K×hj9ubj«)�”}”(hhh]”hì)�”}”(hŒÐOptional callback used to configure the spread spectrum modulation frequency, percentage, and method to reduce EMI by spreading the clock frequency over a wider range. Returns 0 on success, -EERROR otherwise.”h]”hŒÐOptional callback used to configure the spread spectrum modulation frequency, percentage, and method to reduce EMI by spreading the clock frequency over a wider range. Returns 0 on success, -EERROR otherwise.”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´KÓhjUubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhj9ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³jTh´K×hj… ubj‰)�”}”(hXN``recalc_accuracy`` Recalculate the accuracy of this clock. The clock accuracy is expressed in ppb (parts per billion). The parent accuracy is an input parameter. Returns the calculated accuracy. Optional - if this op is not set then clock accuracy will be initialized to parent accuracy or 0 (perfect clock) if clock has no parent. ”h]”(j�)�”}”(hŒ``recalc_accuracy``”h]”j•)�”}”(hjyh]”hŒrecalc_accuracy”…”�”}”(hj{h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjwubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´KÞhjsubj«)�”}”(hhh]”hì)�”}”(hX9Recalculate the accuracy of this clock. The clock accuracy is expressed in ppb (parts per billion). The parent accuracy is an input parameter. Returns the calculated accuracy. Optional - if this op is not set then clock accuracy will be initialized to parent accuracy or 0 (perfect clock) if clock has no parent.”h]”hX9Recalculate the accuracy of this clock. The clock accuracy is expressed in ppb (parts per billion). The parent accuracy is an input parameter. Returns the calculated accuracy. Optional - if this op is not set then clock accuracy will be initialized to parent accuracy or 0 (perfect clock) if clock has no parent.”…”�”}”(hj’h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´KÙhj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhjsubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³jŽh´KÞhj… ubj‰)�”}”(hŒ—``get_phase`` Queries the hardware to get the current phase of a clock. Returned values are 0-359 degrees on success, negative error codes on failure. ”h]”(j�)�”}”(hŒ ``get_phase``”h]”j•)�”}”(hj³h]”hŒ get_phase”…”�”}”(hjµh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hj±ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´Kâhj­ubj«)�”}”(hhh]”hì)�”}”(hŒˆQueries the hardware to get the current phase of a clock. Returned values are 0-359 degrees on success, negative error codes on failure.”h]”hŒˆQueries the hardware to get the current phase of a clock. Returned values are 0-359 degrees on success, negative error codes on failure.”…”�”}”(hjÌh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.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Œ©``set_phase`` Shift the phase this clock signal in degrees specified by the second argument. Valid values for degrees are 0-359. Return 0 on success, otherwise -EERROR. ”h]”(j�)�”}”(hŒ ``set_phase``”h]”j•)�”}”(hjíh]”hŒ set_phase”…”�”}”(hjïh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjëubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´Kæhjçubj«)�”}”(hhh]”hì)�”}”(hŒšShift the phase this clock signal in degrees specified by the second argument. Valid values for degrees are 0-359. Return 0 on success, otherwise -EERROR.”h]”hŒšShift the phase this clock signal in degrees specified by the second argument. Valid values for degrees are 0-359. Return 0 on success, otherwise -EERROR.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´Kähjubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhjçubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³jh´Kæhj… ubj‰)�”}”(hŒ°``get_duty_cycle`` Queries the hardware to get the current duty cycle ratio of a clock. Returned values denominator cannot be 0 and must be superior or equal to the numerator. ”h]”(j�)�”}”(hŒ``get_duty_cycle``”h]”j•)�”}”(hj'h]”hŒget_duty_cycle”…”�”}”(hj)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hj%ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´Kêhj!ubj«)�”}”(hhh]”hì)�”}”(hŒœQueries the hardware to get the current duty cycle ratio of a clock. Returned values denominator cannot be 0 and must be superior or equal to the numerator.”h]”hŒœQueries the hardware to get the current duty cycle ratio of a clock. Returned values denominator cannot be 0 and must be superior or equal to the numerator.”…”�”}”(hj@h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.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Œù``set_duty_cycle`` Apply the duty cycle ratio to this clock signal specified by the numerator (2nd argurment) and denominator (3rd argument). Argument must be a valid ratio (denominator > 0 and >= numerator) Return 0 on success, otherwise -EERROR. ”h]”(j�)�”}”(hŒ``set_duty_cycle``”h]”j•)�”}”(hjah]”hŒset_duty_cycle”…”�”}”(hjch²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hj_ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´Kïhj[ubj«)�”}”(hhh]”hì)�”}”(hŒåApply the duty cycle ratio to this clock signal specified by the numerator (2nd argurment) and denominator (3rd argument). Argument must be a valid ratio (denominator > 0 and >= numerator) Return 0 on success, otherwise -EERROR.”h]”hŒåApply the duty cycle ratio to this clock signal specified by the numerator (2nd argurment) and denominator (3rd argument). Argument must be a valid ratio (denominator > 0 and >= numerator) Return 0 on success, otherwise -EERROR.”…”�”}”(hjzh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´Kìhjwubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhj[ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jˆh³jvh´Kïhj… ubj‰)�”}”(hX•``init`` Perform platform-specific initialization magic. This is not used by any of the basic clock types. This callback exist for HW which needs to perform some initialisation magic for CCF to get an accurate view of the clock. It may also be used dynamic resource allocation is required. It shall not used to deal with clock parameters, such as rate or parents. Returns 0 on success, -EERROR otherwise. ”h]”(j�)�”}”(hŒ``init``”h]”j•)�”}”(hj›h]”hŒinit”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hj™ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´Køhj•ubj«)�”}”(hhh]”hì)�”}”(hX‹Perform platform-specific initialization magic. This is not used by any of the basic clock types. This callback exist for HW which needs to perform some initialisation magic for CCF to get an accurate view of the clock. It may also be used dynamic resource allocation is required. It shall not used to deal with clock parameters, such as rate or parents. Returns 0 on success, -EERROR otherwise.”h]”hX‹Perform platform-specific initialization magic. This is not used by any of the basic clock types. This callback exist for HW which needs to perform some initialisation magic for CCF to get an accurate view of the clock. It may also be used dynamic resource allocation is required. It shall not used to deal with clock parameters, such as rate or parents. Returns 0 on success, -EERROR otherwise.”…”�”}”(hj´h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.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Œ3``terminate`` Free any resource allocated by init. ”h]”(j�)�”}”(hŒ ``terminate``”h]”j•)�”}”(hjÕh]”hŒ terminate”…”�”}”(hj×h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjÓubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´KúhjÏubj«)�”}”(hhh]”hì)�”}”(hŒ$Free any resource allocated by init.”h]”hŒ$Free any resource allocated by init.”…”�”}”(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‰)�”}”(hX2``debug_init`` Set up type-specific debugfs entries for this clock. This is called once, after the debugfs directory entry for this clock has been created. The dentry pointer representing that directory is provided as an argument. Called with prepare_lock held. Returns 0 on success, -EERROR otherwise.”h]”(j�)�”}”(hŒ``debug_init``”h]”j•)�”}”(hjh]”hŒ debug_init”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jŽh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´Kÿhjubj«)�”}”(hhh]”hì)�”}”(hX#Set up type-specific debugfs entries for this clock. This is called once, after the debugfs directory entry for this clock has been created. The dentry pointer representing that directory is provided as an argument. Called with prepare_lock held. Returns 0 on success, -EERROR otherwise.”h]”hX#Set up type-specific debugfs entries for this clock. This is called once, after the debugfs directory entry for this clock has been created. The dentry pointer representing that directory is provided as an argument. Called with prepare_lock held. Returns 0 on success, -EERROR otherwise.”…”�”}”(hj'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´Kühj$ubah}”(h]”h ]”h"]”h$]”h&]”uh1jªhjubeh}”(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&]”uh1j5hj‚h²hh³jÓ h´Nubhì)�”}”(hŒ**Description**”h]”j@)�”}”(hjQh]”hŒ Description”…”�”}”(hjSh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j?hjOubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´Mhj‚h²hubhì)�”}”(hX]The clk_enable/clk_disable and clk_prepare/clk_unprepare pairs allow implementations to split any work between atomic (enable) and sleepable (prepare) contexts. If enabling a clock requires code that might sleep, this must be done in clk_prepare. Clock enable code that will never be called in a sleepable context may be implemented in clk_enable.”h]”hX]The clk_enable/clk_disable and clk_prepare/clk_unprepare pairs allow implementations to split any work between atomic (enable) and sleepable (prepare) contexts. If enabling a clock requires code that might sleep, this must be done in clk_prepare. Clock enable code that will never be called in a sleepable context may be implemented in clk_enable.”…”�”}”(hjgh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´Mhj‚h²hubhì)�”}”(hŒóTypically, drivers will call clk_prepare when a clock may be needed later (eg. when a device is opened), and clk_enable when the clock is actually required (eg. from an interrupt). Note that clk_prepare MUST have been called before clk_enable.”h]”hŒóTypically, drivers will call clk_prepare when a clock may be needed later (eg. when a device is opened), and clk_enable when the clock is actually required (eg. from an interrupt). Note that clk_prepare MUST have been called before clk_enable.”…”�”}”(hjvh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:57: ./include/linux/clk-provider.h”h´Mhj‚h²hubeh}”(h]”Œcommon-data-structures-and-api”ah ]”h"]”Œcommon data structures and api”ah$]”h&]”uh1hµhh·h²hh³hÊh´K+ubh¶)�”}”(hhh]”(h»)�”}”(hŒ Core flags”h]”hŒ Core flags”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj�h²hh³hÊh´K=ubhì)�”}”(hŒ§Flags used across common struct clk. These flags should only affect the top-level framework. Custom flags for dealing with hardware specifics belong in struct clk_foo.”h]”hŒ§Flags used across common struct clk. These flags should only affect the top-level framework. Custom flags for dealing with hardware specifics belong in struct clk_foo.”…”�”}”(hjžh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:63: ./include/linux/clk-provider.h”h´Khj�h²hubhŒ bullet_list”“”)�”}”(hhh]”(hŒ list_item”“”)�”}”(hŒ4CLK_SET_RATE_GATE - must be gated across rate change”h]”hì)�”}”(hj¶h]”hŒ4CLK_SET_RATE_GATE - must be gated across rate change”…”�”}”(hj¸h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:63: ./include/linux/clk-provider.h”h´Khj´ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²hj¯ubj³)�”}”(hŒ4CLK_SET_PARENT_GATE - must be gated across re-parent”h]”hì)�”}”(hjÎh]”hŒ4CLK_SET_PARENT_GATE - must be gated across re-parent”…”�”}”(hjÐh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:63: ./include/linux/clk-provider.h”h´KhjÌubah}”(h]”h ]”h"]”h$]”h&]”uh1j²hj¯ubj³)�”}”(hŒ8CLK_SET_RATE_PARENT - propagate rate change up one level”h]”hì)�”}”(hjæh]”hŒ8CLK_SET_RATE_PARENT - propagate rate change up one level”…”�”}”(hjèh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:63: ./include/linux/clk-provider.h”h´Khjäubah}”(h]”h ]”h"]”h$]”h&]”uh1j²hj¯ubj³)�”}”(hŒ.CLK_IGNORE_UNUSED - do not gate even if unused”h]”hì)�”}”(hjþh]”hŒ.CLK_IGNORE_UNUSED - do not gate even if unused”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:63: ./include/linux/clk-provider.h”h´Khjüubah}”(h]”h ]”h"]”h$]”h&]”uh1j²hj¯ubj³)�”}”(hŒ5CLK_GET_RATE_NOCACHE - do not use the cached clk rate”h]”hì)�”}”(hjh]”hŒ5CLK_GET_RATE_NOCACHE - do not use the cached clk rate”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:63: ./include/linux/clk-provider.h”h´Khjubah}”(h]”h ]”h"]”h$]”h&]”uh1j²hj¯ubj³)�”}”(hŒ9CLK_SET_RATE_NO_REPARENT - don't re-parent on rate change”h]”hì)�”}”(hj.h]”hŒ;CLK_SET_RATE_NO_REPARENT - don’t re-parent on rate change”…”�”}”(hj0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:63: ./include/linux/clk-provider.h”h´Khj,ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²hj¯ubj³)�”}”(hŒ=CLK_GET_ACCURACY_NOCACHE - do not use the cached clk accuracy”h]”hì)�”}”(hjFh]”hŒ=CLK_GET_ACCURACY_NOCACHE - do not use the cached clk accuracy”…”�”}”(hjHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:63: ./include/linux/clk-provider.h”h´KhjDubah}”(h]”h ]”h"]”h$]”h&]”uh1j²hj¯ubj³)�”}”(hŒ7CLK_RECALC_NEW_RATES - recalc rates after notifications”h]”hì)�”}”(hj^h]”hŒ7CLK_RECALC_NEW_RATES - recalc rates after notifications”…”�”}”(hj`h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:63: ./include/linux/clk-provider.h”h´Khj\ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²hj¯ubj³)�”}”(hŒ4CLK_SET_RATE_UNGATE - clock needs to run to set rate”h]”hì)�”}”(hjvh]”hŒ4CLK_SET_RATE_UNGATE - clock needs to run to set rate”…”�”}”(hjxh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:63: ./include/linux/clk-provider.h”h´Khjtubah}”(h]”h ]”h"]”h$]”h&]”uh1j²hj¯ubj³)�”}”(hŒ#CLK_IS_CRITICAL - do not gate, ever”h]”hì)�”}”(hjŽh]”hŒ#CLK_IS_CRITICAL - do not gate, ever”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:63: ./include/linux/clk-provider.h”h´KhjŒubah}”(h]”h ]”h"]”h$]”h&]”uh1j²hj¯ubj³)�”}”(hŒVCLK_OPS_PARENT_ENABLE - parents need enable during gate/ungate, set rate and re-parent”h]”hì)�”}”(hj¦h]”hŒVCLK_OPS_PARENT_ENABLE - parents need enable during gate/ungate, set rate and re-parent”…”�”}”(hj¨h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:63: ./include/linux/clk-provider.h”h´Khj¤ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²hj¯ubj³)�”}”(hŒNCLK_DUTY_CYCLE_PARENT - duty cycle call may be forwarded to the parent clock ”h]”hì)�”}”(hŒLCLK_DUTY_CYCLE_PARENT - duty cycle call may be forwarded to the parent clock”h]”hŒLCLK_DUTY_CYCLE_PARENT - duty cycle call may be forwarded to the parent clock”…”�”}”(hjÀh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³Œ[/var/lib/git/docbuild/linux/Documentation/driver-api/clk:63: ./include/linux/clk-provider.h”h´Khj¼ubah}”(h]”h ]”h"]”h$]”h&]”uh1j²hj¯ubeh}”(h]”h ]”h"]”h$]”h&]”Œbullet”Œ*”uh1j­h³jÅh´Khj�h²hubeh}”(h]”Œ core-flags”ah ]”h"]”Œ core flags”ah$]”h&]”uh1hµhh·h²hh³hÊh´K=ubh¶)�”}”(hhh]”(h»)�”}”(hŒHardware clk implementations”h]”hŒHardware clk implementations”…”�”}”(hjèh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjåh²hh³hÊh´KCubhì)�”}”(hXThe strength of the common struct clk_core comes from its .ops and .hw pointers which abstract the details of struct clk from the hardware-specific bits, and vice versa. To illustrate consider the simple gateable clk implementation in drivers/clk/clk-gate.c::”h]”hXThe strength of the common struct clk_core comes from its .ops and .hw pointers which abstract the details of struct clk from the hardware-specific bits, and vice versa. To illustrate consider the simple gateable clk implementation in drivers/clk/clk-gate.c:”…”�”}”(hjöh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KEhjåh²hubj[)�”}”(hŒ{struct clk_gate { struct clk_hw hw; void __iomem *reg; u8 bit_idx; ... };”h]”hŒ{struct clk_gate { struct clk_hw hw; void __iomem *reg; u8 bit_idx; ... };”…”�”}”hjsbah}”(h]”h ]”h"]”h$]”h&]”j÷jøuh1jZh³hÊh´KJhjåh²hubhì)�”}”(hX4struct clk_gate contains struct clk_hw hw as well as hardware-specific knowledge about which register and bit controls this clk's gating. Nothing about clock topology or accounting, such as enable_count or notifier_count, is needed here. That is all handled by the common framework code and struct clk_core.”h]”hX6struct clk_gate contains struct clk_hw hw as well as hardware-specific knowledge about which register and bit controls this clk’s gating. Nothing about clock topology or accounting, such as enable_count or notifier_count, is needed here. That is all handled by the common framework code and struct clk_core.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KQhjåh²hubhì)�”}”(hŒ7Let's walk through enabling this clk from driver code::”h]”hŒ8Let’s walk through enabling this clk from driver code:”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KWhjåh²hubj[)�”}”(hŒ\struct clk *clk; clk = clk_get(NULL, "my_gateable_clk"); clk_prepare(clk); clk_enable(clk);”h]”hŒ\struct clk *clk; clk = clk_get(NULL, "my_gateable_clk"); clk_prepare(clk); clk_enable(clk);”…”�”}”hj.sbah}”(h]”h ]”h"]”h$]”h&]”j÷jøuh1jZh³hÊh´KYhjåh²hubhì)�”}”(hŒ.The call graph for clk_enable is very simple::”h]”hŒ-The call graph for clk_enable is very simple:”…”�”}”(hj<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K_hjåh²hubj[)�”}”(hŒáclk_enable(clk); clk->ops->enable(clk->hw); [resolves to...] clk_gate_enable(hw); [resolves struct clk gate with to_clk_gate(hw)] clk_gate_set_bit(gate);”h]”hŒáclk_enable(clk); clk->ops->enable(clk->hw); [resolves to...] clk_gate_enable(hw); [resolves struct clk gate with to_clk_gate(hw)] clk_gate_set_bit(gate);”…”�”}”hjJsbah}”(h]”h ]”h"]”h$]”h&]”j÷jøuh1jZh³hÊh´Kahjåh²hubhì)�”}”(hŒ(And the definition of clk_gate_set_bit::”h]”hŒ'And the definition of clk_gate_set_bit:”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Khhjåh²hubj[)�”}”(hŒ²static void clk_gate_set_bit(struct clk_gate *gate) { u32 reg; reg = __raw_readl(gate->reg); reg |= BIT(gate->bit_idx); writel(reg, gate->reg); }”h]”hŒ²static void clk_gate_set_bit(struct clk_gate *gate) { u32 reg; reg = __raw_readl(gate->reg); reg |= BIT(gate->bit_idx); writel(reg, gate->reg); }”…”�”}”hjfsbah}”(h]”h ]”h"]”h$]”h&]”j÷jøuh1jZh³hÊh´Kjhjåh²hubhì)�”}”(hŒ%Note that to_clk_gate is defined as::”h]”hŒ$Note that to_clk_gate is defined as:”…”�”}”(hjth²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Kshjåh²hubj[)�”}”(hŒ?#define to_clk_gate(_hw) container_of(_hw, struct clk_gate, hw)”h]”hŒ?#define to_clk_gate(_hw) container_of(_hw, struct clk_gate, hw)”…”�”}”hj‚sbah}”(h]”h ]”h"]”h$]”h&]”j÷jøuh1jZh³hÊh´Kuhjåh²hubhì)�”}”(hŒLThis pattern of abstraction is used for every clock hardware representation.”h]”hŒLThis pattern of abstraction is used for every clock hardware representation.”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Kwhjåh²hubeh}”(h]”Œhardware-clk-implementations”ah ]”h"]”Œhardware clk implementations”ah$]”h&]”uh1hµhh·h²hh³hÊh´KCubh¶)�”}”(hhh]”(h»)�”}”(hŒ Supporting your own clk hardware”h]”hŒ Supporting your own clk hardware”…”�”}”(hj©h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhj¦h²hh³hÊh´K{ubhì)�”}”(hŒhWhen implementing support for a new type of clock it is only necessary to include the following header::”h]”hŒgWhen implementing support for a new type of clock it is only necessary to include the following header:”…”�”}”(hj·h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K}hj¦h²hubj[)�”}”(hŒ#include ”h]”hŒ#include ”…”�”}”hjÅsbah}”(h]”h ]”h"]”h$]”h&]”j÷jøuh1jZh³hÊh´K€hj¦h²hubhì)�”}”(hŒWTo construct a clk hardware structure for your platform you must define the following::”h]”hŒVTo construct a clk hardware structure for your platform you must define the following:”…”�”}”(hjÓh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K‚hj¦h²hubj[)�”}”(hŒ^struct clk_foo { struct clk_hw hw; ... hardware specific data goes here ... };”h]”hŒ^struct clk_foo { struct clk_hw hw; ... hardware specific data goes here ... };”…”�”}”hjásbah}”(h]”h ]”h"]”h$]”h&]”j÷jøuh1jZh³hÊh´K…hj¦h²hubhì)�”}”(hŒUTo take advantage of your data you'll need to support valid operations for your clk::”h]”hŒVTo take advantage of your data you’ll need to support valid operations for your clk:”…”�”}”(hjïh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KŠhj¦h²hubj[)�”}”(hŒxstruct clk_ops clk_foo_ops = { .enable = &clk_foo_enable, .disable = &clk_foo_disable, };”h]”hŒxstruct clk_ops clk_foo_ops = { .enable = &clk_foo_enable, .disable = &clk_foo_disable, };”…”�”}”hjýsbah}”(h]”h ]”h"]”h$]”h&]”j÷jøuh1jZh³hÊh´K�hj¦h²hubhì)�”}”(hŒ2Implement the above functions using container_of::”h]”hŒ1Implement the above functions using container_of:”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K’hj¦h²hubj[)�”}”(hŒÞ#define to_clk_foo(_hw) container_of(_hw, struct clk_foo, hw) int clk_foo_enable(struct clk_hw *hw) { struct clk_foo *foo; foo = to_clk_foo(hw); ... perform magic on foo ... return 0; };”h]”hŒÞ#define to_clk_foo(_hw) container_of(_hw, struct clk_foo, hw) int clk_foo_enable(struct clk_hw *hw) { struct clk_foo *foo; foo = to_clk_foo(hw); ... perform magic on foo ... return 0; };”…”�”}”hjsbah}”(h]”h ]”h"]”h$]”h&]”j÷jøuh1jZh³hÊh´K”hj¦h²hubhì)�”}”(hXGBelow is a matrix detailing which clk_ops are mandatory based upon the hardware capabilities of that clock. A cell marked as "y" means mandatory, a cell marked as "n" implies that either including that callback is invalid or otherwise unnecessary. Empty cells are either optional or must be evaluated on a case-by-case basis.”h]”hXOBelow is a matrix detailing which clk_ops are mandatory based upon the hardware capabilities of that clock. A cell marked as “yâ€� means mandatory, a cell marked as “nâ€� implies that either including that callback is invalid or otherwise unnecessary. Empty cells are either optional or must be evaluated on a case-by-case basis.”…”�”}”(hj'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K¡hj¦h²hubhŒtable”“”)�”}”(hhh]”(h»)�”}”(hŒclock hardware characteristics”h]”hŒclock hardware characteristics”…”�”}”(hj:h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºh³hÊh´K§hj7ubhŒtgroup”“”)�”}”(hhh]”(hŒcolspec”“”)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1jMhjJubjN)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1jMhjJubjN)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”K uh1jMhjJubjN)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1jMhjJubjN)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”K uh1jMhjJubjN)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1jMhjJubhŒthead”“”)�”}”(hhh]”hŒrow”“”)�”}”(hhh]”(hŒentry”“”)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj’ubj–)�”}”(hhh]”hì)�”}”(hŒgate”h]”hŒgate”…”�”}”(hj£h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Kªhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hj’ubj–)�”}”(hhh]”hì)�”}”(hŒ change rate”h]”hŒ change rate”…”�”}”(hjºh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Kªhj·ubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hj’ubj–)�”}”(hhh]”hì)�”}”(hŒ single parent”h]”hŒ single parent”…”�”}”(hjÑh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KªhjÎubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hj’ubj–)�”}”(hhh]”hì)�”}”(hŒ multiplexer”h]”hŒ multiplexer”…”�”}”(hjèh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Kªhjåubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hj’ubj–)�”}”(hhh]”hì)�”}”(hŒroot”h]”hŒroot”…”�”}”(hjÿh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Kªhjüubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hj’ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�hj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1j‹hjJubhŒtbody”“”)�”}”(hhh]”(j‘)�”}”(hhh]”(j–)�”}”(hhh]”hì)�”}”(hŒ.prepare”h]”hŒ.prepare”…”�”}”(hj*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K¬hj'ubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hj$ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj$ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj$ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj$ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj$ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj$ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�hj!ubj‘)�”}”(hhh]”(j–)�”}”(hhh]”hì)�”}”(hŒ .unprepare”h]”hŒ .unprepare”…”�”}”(hjwh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K®hjtubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hjqubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hjqubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hjqubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hjqubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hjqubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hjqubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�hj!ubj‘)�”}”(hhh]”(j–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj¾ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj¾ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj¾ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj¾ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj¾ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj¾ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�hj!ubj‘)�”}”(hhh]”(j–)�”}”(hhh]”hì)�”}”(hŒ.enable”h]”hŒ.enable”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K±hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hjýubj–)�”}”(hhh]”hì)�”}”(hŒy”h]”hŒy”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K±hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hjýubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hjýubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hjýubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hjýubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hjýubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�hj!ubj‘)�”}”(hhh]”(j–)�”}”(hhh]”hì)�”}”(hŒ.disable”h]”hŒ.disable”…”�”}”(hj^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K³hj[ubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hjXubj–)�”}”(hhh]”hì)�”}”(hjh]”hŒy”…”�”}”(hjuh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K³hjrubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hjXubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hjXubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hjXubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hjXubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hjXubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�hj!ubj‘)�”}”(hhh]”(j–)�”}”(hhh]”hì)�”}”(hŒ .is_enabled”h]”hŒ .is_enabled”…”�”}”(hj¸h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Kµhjµubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hj²ubj–)�”}”(hhh]”hì)�”}”(hjh]”hŒy”…”�”}”(hjÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KµhjÌubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hj²ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj²ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj²ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj²ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj²ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�hj!ubj‘)�”}”(hhh]”(j–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�hj!ubj‘)�”}”(hhh]”(j–)�”}”(hhh]”hì)�”}”(hŒ .recalc_rate”h]”hŒ .recalc_rate”…”�”}”(hjQh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K¸hjNubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hjKubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hjKubj–)�”}”(hhh]”hì)�”}”(hjh]”hŒy”…”�”}”(hjqh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K¸hjnubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hjKubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hjKubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hjKubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hjKubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�hj!ubj‘)�”}”(hhh]”(j–)�”}”(hhh]”hì)�”}”(hŒ.determine_rate”h]”hŒ.determine_rate”…”�”}”(hj«h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Kºhj¨ubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hj¥ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj¥ubj–)�”}”(hhh]”hì)�”}”(hjh]”hŒy”…”�”}”(hjËh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KºhjÈubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hj¥ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj¥ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj¥ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj¥ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�hj!ubj‘)�”}”(hhh]”(j–)�”}”(hhh]”hì)�”}”(hŒ .set_rate”h]”hŒ .set_rate”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K¼hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hjÿubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hjÿubj–)�”}”(hhh]”hì)�”}”(hjh]”hŒy”…”�”}”(hj%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K¼hj"ubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hjÿubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hjÿubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hjÿubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hjÿubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�hj!ubj‘)�”}”(hhh]”(j–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hjYubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hjYubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hjYubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hjYubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hjYubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hjYubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�hj!ubj‘)�”}”(hhh]”(j–)�”}”(hhh]”hì)�”}”(hŒ .set_parent”h]”hŒ .set_parent”…”�”}”(hjžh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K¿hj›ubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hj˜ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj˜ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj˜ubj–)�”}”(hhh]”hì)�”}”(hjëh]”hŒn”…”�”}”(hjÇh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K¿hjÄubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hj˜ubj–)�”}”(hhh]”hì)�”}”(hjh]”hŒy”…”�”}”(hjÝh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K¿hjÚubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hj˜ubj–)�”}”(hhh]”hì)�”}”(hjëh]”hŒn”…”�”}”(hjóh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´K¿hjðubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hj˜ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�hj!ubj‘)�”}”(hhh]”(j–)�”}”(hhh]”hì)�”}”(hŒ .get_parent”h]”hŒ .get_parent”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KÁhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hj ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj ubj–)�”}”(hhh]”hì)�”}”(hjëh]”hŒn”…”�”}”(hj;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KÁhj8ubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hj ubj–)�”}”(hhh]”hì)�”}”(hjh]”hŒy”…”�”}”(hjQh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KÁhjNubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hj ubj–)�”}”(hhh]”hì)�”}”(hjëh]”hŒn”…”�”}”(hjgh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KÁhjdubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�hj!ubj‘)�”}”(hhh]”(j–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj€ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj€ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj€ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj€ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj€ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj€ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�hj!ubj‘)�”}”(hhh]”(j–)�”}”(hhh]”hì)�”}”(hŒ.recalc_accuracy”h]”hŒ.recalc_accuracy”…”�”}”(hjÅh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KÄhjÂubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hj¿ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj¿ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj¿ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj¿ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj¿ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj¿ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�hj!ubj‘)�”}”(hhh]”(j–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj ubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�hj!ubj‘)�”}”(hhh]”(j–)�”}”(hhh]”hì)�”}”(hŒ.init”h]”hŒ.init”…”�”}”(hjQh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KÇhjNubah}”(h]”h ]”h"]”h$]”h&]”uh1j•hjKubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hjKubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hjKubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hjKubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hjKubj–)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”uh1j•hjKubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�hj!ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jhjJubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1jHhj7ubeh}”(h]”Œid1”ah ]”h"]”h$]”h&]”uh1j5hj¦h²hh³hÊh´Nubhì)�”}”(hŒáFinally, register your clock at run-time with a hardware-specific registration function. This function simply populates struct clk_foo's data and then passes the common struct clk parameters to the framework with a call to::”h]”hŒâFinally, register your clock at run-time with a hardware-specific registration function. This function simply populates struct clk_foo’s data and then passes the common struct clk parameters to the framework with a call to:”…”�”}”(hj¬h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KÊhj¦h²hubj[)�”}”(hŒclk_register(...)”h]”hŒclk_register(...)”…”�”}”hjºsbah}”(h]”h ]”h"]”h$]”h&]”j÷jøuh1jZh³hÊh´KÏhj¦h²hubhì)�”}”(hŒBSee the basic clock types in ``drivers/clk/clk-*.c`` for examples.”h]”(hŒSee the basic clock types in ”…”�”}”(hjÈh²hh³Nh´Nubj•)�”}”(hŒ``drivers/clk/clk-*.c``”h]”hŒdrivers/clk/clk-*.c”…”�”}”(hjÐh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j”hjÈubhŒ for examples.”…”�”}”(hjÈh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KÑhj¦h²hubeh}”(h]”Œ supporting-your-own-clk-hardware”ah ]”h"]”Œ supporting your own clk hardware”ah$]”h&]”uh1hµhh·h²hh³hÊh´K{ubh¶)�”}”(hhh]”(h»)�”}”(hŒ'Disabling clock gating of unused clocks”h]”hŒ'Disabling clock gating of unused clocks”…”�”}”(hjóh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjðh²hh³hÊh´KÔubhì)�”}”(hX7Sometimes during development it can be useful to be able to bypass the default disabling of unused clocks. For example, if drivers aren't enabling clocks properly but rely on them being on from the bootloader, bypassing the disabling means that the driver will remain functional while the issues are sorted out.”h]”hX9Sometimes during development it can be useful to be able to bypass the default disabling of unused clocks. For example, if drivers aren’t enabling clocks properly but rely on them being on from the bootloader, bypassing the disabling means that the driver will remain functional while the issues are sorted out.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KÖhjðh²hubhì)�”}”(hŒZYou can see which clocks have been disabled by booting your kernel with these parameters::”h]”hŒYYou can see which clocks have been disabled by booting your kernel with these parameters:”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KÜhjðh²hubj[)�”}”(hŒ%tp_printk trace_event=clk:clk_disable”h]”hŒ%tp_printk trace_event=clk:clk_disable”…”�”}”hjsbah}”(h]”h ]”h"]”h$]”h&]”j÷jøuh1jZh³hÊh´Kßhjðh²hubhì)�”}”(hŒTTo bypass this disabling, include "clk_ignore_unused" in the bootargs to the kernel.”h]”hŒXTo bypass this disabling, include “clk_ignore_unusedâ€� in the bootargs to the kernel.”…”�”}”(hj+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´Káhjðh²hubeh}”(h]”Œ'disabling-clock-gating-of-unused-clocks”ah ]”h"]”Œ'disabling clock gating of unused clocks”ah$]”h&]”uh1hµhh·h²hh³hÊh´KÔubh¶)�”}”(hhh]”(h»)�”}”(hŒLocking”h]”hŒLocking”…”�”}”(hjDh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hºhjAh²hh³hÊh´Kåubhì)�”}”(hŒWThe common clock framework uses two global locks, the prepare lock and the enable lock.”h]”hŒWThe common clock framework uses two global locks, the prepare lock and the enable lock.”…”�”}”(hjRh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KçhjAh²hubhì)�”}”(hŒåThe enable lock is a spinlock and is held across calls to the .enable, .disable operations. Those operations are thus not allowed to sleep, and calls to the clk_enable(), clk_disable() API functions are allowed in atomic context.”h]”hŒåThe enable lock is a spinlock and is held across calls to the .enable, .disable operations. Those operations are thus not allowed to sleep, and calls to the clk_enable(), clk_disable() API functions are allowed in atomic context.”…”�”}”(hj`h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KêhjAh²hubhì)�”}”(hXfFor clk_is_enabled() API, it is also designed to be allowed to be used in atomic context. However, it doesn't really make any sense to hold the enable lock in core, unless you want to do something else with the information of the enable state with that lock held. Otherwise, seeing if a clk is enabled is a one-shot read of the enabled state, which could just as easily change after the function returns because the lock is released. Thus the user of this API needs to handle synchronizing the read of the state with whatever they're using it for to make sure that the enable state doesn't change during that time.”h]”hXlFor clk_is_enabled() API, it is also designed to be allowed to be used in atomic context. However, it doesn’t really make any sense to hold the enable lock in core, unless you want to do something else with the information of the enable state with that lock held. Otherwise, seeing if a clk is enabled is a one-shot read of the enabled state, which could just as easily change after the function returns because the lock is released. Thus the user of this API needs to handle synchronizing the read of the state with whatever they’re using it for to make sure that the enable state doesn’t change during that time.”…”�”}”(hjnh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KïhjAh²hubhì)�”}”(hŒÈThe prepare lock is a mutex and is held across calls to all other operations. All those operations are allowed to sleep, and calls to the corresponding API functions are not allowed in atomic context.”h]”hŒÈThe prepare lock is a mutex and is held across calls to all other operations. All those operations are allowed to sleep, and calls to the corresponding API functions are not allowed in atomic context.”…”�”}”(hj|h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KùhjAh²hubhì)�”}”(hŒMThis effectively divides operations in two groups from a locking perspective.”h]”hŒMThis effectively divides operations in two groups from a locking perspective.”…”�”}”(hjŠh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KýhjAh²hubhì)�”}”(hX˜Drivers don't need to manually protect resources shared between the operations of one group, regardless of whether those resources are shared by multiple clocks or not. However, access to resources that are shared between operations of the two groups needs to be protected by the drivers. An example of such a resource would be a register that controls both the clock rate and the clock enable/disable state.”h]”hXšDrivers don’t need to manually protect resources shared between the operations of one group, regardless of whether those resources are shared by multiple clocks or not. However, access to resources that are shared between operations of the two groups needs to be protected by the drivers. An example of such a resource would be a register that controls both the clock rate and the clock enable/disable state.”…”�”}”(hj˜h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´KÿhjAh²hubhì)�”}”(hX•The clock framework is reentrant, in that a driver is allowed to call clock framework functions from within its implementation of clock operations. This can for instance cause a .set_rate operation of one clock being called from within the .set_rate operation of another clock. This case must be considered in the driver implementations, but the code flow is usually controlled by the driver in that case.”h]”hX•The clock framework is reentrant, in that a driver is allowed to call clock framework functions from within its implementation of clock operations. This can for instance cause a .set_rate operation of one clock being called from within the .set_rate operation of another clock. This case must be considered in the driver implementations, but the code flow is usually controlled by the driver in that case.”…”�”}”(hj¦h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´MhjAh²hubhì)�”}”(hŒÃNote that locking must also be considered when code outside of the common clock framework needs to access resources used by the clock operations. This is considered out of scope of this document.”h]”hŒÃNote that locking must also be considered when code outside of the common clock framework needs to access resources used by the clock operations. This is considered out of scope of this document.”…”�”}”(hj´h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÊh´M hjAh²hubeh}”(h]”Œlocking”ah ]”h"]”Œlocking”ah$]”h&]”uh1hµhh·h²hh³hÊh´Kåubeh}”(h]”Œthe-common-clk-framework”ah ]”h"]”Œthe common clk framework”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ôŒerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÊŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(jÏjÌjj|jŠj‡jâjßj£j jíjêj>j;jÇjÄuŒ nametypes”}”(jωj‰jЉjâ‰j£‰jí‰j>‰jljuh}”(jÌh·j|j1j‡j‚j¢j¬jÑ j× jßj�j jåjêj¦j;jðjÄjAj§j7uŒ 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”“”}”jKs…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.