13d0407baSopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 23d0407baSopenharmony_ci/* 33d0407baSopenharmony_ci * Copyright (c) 2010-2011 Jeremy Kerr <jeremy.kerr@canonical.com> 43d0407baSopenharmony_ci * Copyright (C) 2011-2012 Linaro Ltd <mturquette@linaro.org> 53d0407baSopenharmony_ci */ 63d0407baSopenharmony_ci#ifndef __LINUX_CLK_PROVIDER_H 73d0407baSopenharmony_ci#define __LINUX_CLK_PROVIDER_H 83d0407baSopenharmony_ci 93d0407baSopenharmony_ci#include <linux/of.h> 103d0407baSopenharmony_ci#include <linux/of_clk.h> 113d0407baSopenharmony_ci 123d0407baSopenharmony_ci/* 133d0407baSopenharmony_ci * flags used across common struct clk. these flags should only affect the 143d0407baSopenharmony_ci * top-level framework. custom flags for dealing with hardware specifics 153d0407baSopenharmony_ci * belong in struct clk_foo 163d0407baSopenharmony_ci * 173d0407baSopenharmony_ci * Please update clk_flags[] in drivers/clk/clk.c when making changes here! 183d0407baSopenharmony_ci */ 193d0407baSopenharmony_ci#define CLK_SET_RATE_GATE BIT(0) /* must be gated across rate change */ 203d0407baSopenharmony_ci#define CLK_SET_PARENT_GATE BIT(1) /* must be gated across re-parent */ 213d0407baSopenharmony_ci#define CLK_SET_RATE_PARENT BIT(2) /* propagate rate change up one level */ 223d0407baSopenharmony_ci#define CLK_IGNORE_UNUSED BIT(3) /* do not gate even if unused */ 233d0407baSopenharmony_ci /* unused */ 243d0407baSopenharmony_ci /* unused */ 253d0407baSopenharmony_ci#define CLK_GET_RATE_NOCACHE BIT(6) /* do not use the cached clk rate */ 263d0407baSopenharmony_ci#define CLK_SET_RATE_NO_REPARENT BIT(7) /* don't re-parent on rate change */ 273d0407baSopenharmony_ci#define CLK_GET_ACCURACY_NOCACHE BIT(8) /* do not use the cached clk accuracy */ 283d0407baSopenharmony_ci#define CLK_RECALC_NEW_RATES BIT(9) /* recalc rates after notifications */ 293d0407baSopenharmony_ci#define CLK_SET_RATE_UNGATE BIT(10) /* clock needs to run to set rate */ 303d0407baSopenharmony_ci#define CLK_IS_CRITICAL BIT(11) /* do not gate, ever */ 313d0407baSopenharmony_ci/* parents need enable during gate/ungate, set rate and re-parent */ 323d0407baSopenharmony_ci#define CLK_OPS_PARENT_ENABLE BIT(12) 333d0407baSopenharmony_ci/* duty cycle call may be forwarded to the parent clock */ 343d0407baSopenharmony_ci#define CLK_DUTY_CYCLE_PARENT BIT(13) 353d0407baSopenharmony_ci 363d0407baSopenharmony_cistruct clk; 373d0407baSopenharmony_cistruct clk_hw; 383d0407baSopenharmony_cistruct clk_core; 393d0407baSopenharmony_cistruct dentry; 403d0407baSopenharmony_ci 413d0407baSopenharmony_ci/** 423d0407baSopenharmony_ci * struct clk_rate_request - Structure encoding the clk constraints that 433d0407baSopenharmony_ci * a clock user might require. 443d0407baSopenharmony_ci * 453d0407baSopenharmony_ci * @rate: Requested clock rate. This field will be adjusted by 463d0407baSopenharmony_ci * clock drivers according to hardware capabilities. 473d0407baSopenharmony_ci * @min_rate: Minimum rate imposed by clk users. 483d0407baSopenharmony_ci * @max_rate: Maximum rate imposed by clk users. 493d0407baSopenharmony_ci * @best_parent_rate: The best parent rate a parent can provide to fulfill the 503d0407baSopenharmony_ci * requested constraints. 513d0407baSopenharmony_ci * @best_parent_hw: The most appropriate parent clock that fulfills the 523d0407baSopenharmony_ci * requested constraints. 533d0407baSopenharmony_ci * 543d0407baSopenharmony_ci */ 553d0407baSopenharmony_cistruct clk_rate_request { 563d0407baSopenharmony_ci unsigned long rate; 573d0407baSopenharmony_ci unsigned long min_rate; 583d0407baSopenharmony_ci unsigned long max_rate; 593d0407baSopenharmony_ci unsigned long best_parent_rate; 603d0407baSopenharmony_ci struct clk_hw *best_parent_hw; 613d0407baSopenharmony_ci}; 623d0407baSopenharmony_ci 633d0407baSopenharmony_ci/** 643d0407baSopenharmony_ci * struct clk_duty - Struture encoding the duty cycle ratio of a clock 653d0407baSopenharmony_ci * 663d0407baSopenharmony_ci * @num: Numerator of the duty cycle ratio 673d0407baSopenharmony_ci * @den: Denominator of the duty cycle ratio 683d0407baSopenharmony_ci */ 693d0407baSopenharmony_cistruct clk_duty { 703d0407baSopenharmony_ci unsigned int num; 713d0407baSopenharmony_ci unsigned int den; 723d0407baSopenharmony_ci}; 733d0407baSopenharmony_ci 743d0407baSopenharmony_ci/** 753d0407baSopenharmony_ci * struct clk_ops - Callback operations for hardware clocks; these are to 763d0407baSopenharmony_ci * be provided by the clock implementation, and will be called by drivers 773d0407baSopenharmony_ci * through the clk_* api. 783d0407baSopenharmony_ci * 793d0407baSopenharmony_ci * @prepare: Prepare the clock for enabling. This must not return until 803d0407baSopenharmony_ci * the clock is fully prepared, and it's safe to call clk_enable. 813d0407baSopenharmony_ci * This callback is intended to allow clock implementations to 823d0407baSopenharmony_ci * do any initialisation that may sleep. Called with 833d0407baSopenharmony_ci * prepare_lock held. 843d0407baSopenharmony_ci * 853d0407baSopenharmony_ci * @unprepare: Release the clock from its prepared state. This will typically 863d0407baSopenharmony_ci * undo any work done in the @prepare callback. Called with 873d0407baSopenharmony_ci * prepare_lock held. 883d0407baSopenharmony_ci * 893d0407baSopenharmony_ci * @is_prepared: Queries the hardware to determine if the clock is prepared. 903d0407baSopenharmony_ci * This function is allowed to sleep. Optional, if this op is not 913d0407baSopenharmony_ci * set then the prepare count will be used. 923d0407baSopenharmony_ci * 933d0407baSopenharmony_ci * @unprepare_unused: Unprepare the clock atomically. Only called from 943d0407baSopenharmony_ci * clk_disable_unused for prepare clocks with special needs. 953d0407baSopenharmony_ci * Called with prepare mutex held. This function may sleep. 963d0407baSopenharmony_ci * 973d0407baSopenharmony_ci * @enable: Enable the clock atomically. This must not return until the 983d0407baSopenharmony_ci * clock is generating a valid clock signal, usable by consumer 993d0407baSopenharmony_ci * devices. Called with enable_lock held. This function must not 1003d0407baSopenharmony_ci * sleep. 1013d0407baSopenharmony_ci * 1023d0407baSopenharmony_ci * @disable: Disable the clock atomically. Called with enable_lock held. 1033d0407baSopenharmony_ci * This function must not sleep. 1043d0407baSopenharmony_ci * 1053d0407baSopenharmony_ci * @is_enabled: Queries the hardware to determine if the clock is enabled. 1063d0407baSopenharmony_ci * This function must not sleep. Optional, if this op is not 1073d0407baSopenharmony_ci * set then the enable count will be used. 1083d0407baSopenharmony_ci * 1093d0407baSopenharmony_ci * @disable_unused: Disable the clock atomically. Only called from 1103d0407baSopenharmony_ci * clk_disable_unused for gate clocks with special needs. 1113d0407baSopenharmony_ci * Called with enable_lock held. This function must not 1123d0407baSopenharmony_ci * sleep. 1133d0407baSopenharmony_ci * 1143d0407baSopenharmony_ci * @save_context: Save the context of the clock in prepration for poweroff. 1153d0407baSopenharmony_ci * 1163d0407baSopenharmony_ci * @restore_context: Restore the context of the clock after a restoration 1173d0407baSopenharmony_ci * of power. 1183d0407baSopenharmony_ci * 1193d0407baSopenharmony_ci * @recalc_rate Recalculate the rate of this clock, by querying hardware. The 1203d0407baSopenharmony_ci * parent rate is an input parameter. It is up to the caller to 1213d0407baSopenharmony_ci * ensure that the prepare_mutex is held across this call. 1223d0407baSopenharmony_ci * Returns the calculated rate. Optional, but recommended - if 1233d0407baSopenharmony_ci * this op is not set then clock rate will be initialized to 0. 1243d0407baSopenharmony_ci * 1253d0407baSopenharmony_ci * @round_rate: Given a target rate as input, returns the closest rate actually 1263d0407baSopenharmony_ci * supported by the clock. The parent rate is an input/output 1273d0407baSopenharmony_ci * parameter. 1283d0407baSopenharmony_ci * 1293d0407baSopenharmony_ci * @determine_rate: Given a target rate as input, returns the closest rate 1303d0407baSopenharmony_ci * actually supported by the clock, and optionally the parent clock 1313d0407baSopenharmony_ci * that should be used to provide the clock rate. 1323d0407baSopenharmony_ci * 1333d0407baSopenharmony_ci * @set_parent: Change the input source of this clock; for clocks with multiple 1343d0407baSopenharmony_ci * possible parents specify a new parent by passing in the index 1353d0407baSopenharmony_ci * as a u8 corresponding to the parent in either the .parent_names 1363d0407baSopenharmony_ci * or .parents arrays. This function in affect translates an 1373d0407baSopenharmony_ci * array index into the value programmed into the hardware. 1383d0407baSopenharmony_ci * Returns 0 on success, -EERROR otherwise. 1393d0407baSopenharmony_ci * 1403d0407baSopenharmony_ci * @get_parent: Queries the hardware to determine the parent of a clock. The 1413d0407baSopenharmony_ci * return value is a u8 which specifies the index corresponding to 1423d0407baSopenharmony_ci * the parent clock. This index can be applied to either the 1433d0407baSopenharmony_ci * .parent_names or .parents arrays. In short, this function 1443d0407baSopenharmony_ci * translates the parent value read from hardware into an array 1453d0407baSopenharmony_ci * index. Currently only called when the clock is initialized by 1463d0407baSopenharmony_ci * __clk_init. This callback is mandatory for clocks with 1473d0407baSopenharmony_ci * multiple parents. It is optional (and unnecessary) for clocks 1483d0407baSopenharmony_ci * with 0 or 1 parents. 1493d0407baSopenharmony_ci * 1503d0407baSopenharmony_ci * @set_rate: Change the rate of this clock. The requested rate is specified 1513d0407baSopenharmony_ci * by the second argument, which should typically be the return 1523d0407baSopenharmony_ci * of .round_rate call. The third argument gives the parent rate 1533d0407baSopenharmony_ci * which is likely helpful for most .set_rate implementation. 1543d0407baSopenharmony_ci * Returns 0 on success, -EERROR otherwise. 1553d0407baSopenharmony_ci * 1563d0407baSopenharmony_ci * @set_rate_and_parent: Change the rate and the parent of this clock. The 1573d0407baSopenharmony_ci * requested rate is specified by the second argument, which 1583d0407baSopenharmony_ci * should typically be the return of .round_rate call. The 1593d0407baSopenharmony_ci * third argument gives the parent rate which is likely helpful 1603d0407baSopenharmony_ci * for most .set_rate_and_parent implementation. The fourth 1613d0407baSopenharmony_ci * argument gives the parent index. This callback is optional (and 1623d0407baSopenharmony_ci * unnecessary) for clocks with 0 or 1 parents as well as 1633d0407baSopenharmony_ci * for clocks that can tolerate switching the rate and the parent 1643d0407baSopenharmony_ci * separately via calls to .set_parent and .set_rate. 1653d0407baSopenharmony_ci * Returns 0 on success, -EERROR otherwise. 1663d0407baSopenharmony_ci * 1673d0407baSopenharmony_ci * @recalc_accuracy: Recalculate the accuracy of this clock. The clock accuracy 1683d0407baSopenharmony_ci * is expressed in ppb (parts per billion). The parent accuracy is 1693d0407baSopenharmony_ci * an input parameter. 1703d0407baSopenharmony_ci * Returns the calculated accuracy. Optional - if this op is not 1713d0407baSopenharmony_ci * set then clock accuracy will be initialized to parent accuracy 1723d0407baSopenharmony_ci * or 0 (perfect clock) if clock has no parent. 1733d0407baSopenharmony_ci * 1743d0407baSopenharmony_ci * @get_phase: Queries the hardware to get the current phase of a clock. 1753d0407baSopenharmony_ci * Returned values are 0-359 degrees on success, negative 1763d0407baSopenharmony_ci * error codes on failure. 1773d0407baSopenharmony_ci * 1783d0407baSopenharmony_ci * @set_phase: Shift the phase this clock signal in degrees specified 1793d0407baSopenharmony_ci * by the second argument. Valid values for degrees are 1803d0407baSopenharmony_ci * 0-359. Return 0 on success, otherwise -EERROR. 1813d0407baSopenharmony_ci * 1823d0407baSopenharmony_ci * @get_duty_cycle: Queries the hardware to get the current duty cycle ratio 1833d0407baSopenharmony_ci * of a clock. Returned values denominator cannot be 0 and must be 1843d0407baSopenharmony_ci * superior or equal to the numerator. 1853d0407baSopenharmony_ci * 1863d0407baSopenharmony_ci * @set_duty_cycle: Apply the duty cycle ratio to this clock signal specified by 1873d0407baSopenharmony_ci * the numerator (2nd argurment) and denominator (3rd argument). 1883d0407baSopenharmony_ci * Argument must be a valid ratio (denominator > 0 1893d0407baSopenharmony_ci * and >= numerator) Return 0 on success, otherwise -EERROR. 1903d0407baSopenharmony_ci * 1913d0407baSopenharmony_ci * @init: Perform platform-specific initialization magic. 1923d0407baSopenharmony_ci * This is not used by any of the basic clock types. 1933d0407baSopenharmony_ci * This callback exist for HW which needs to perform some 1943d0407baSopenharmony_ci * initialisation magic for CCF to get an accurate view of the 1953d0407baSopenharmony_ci * clock. It may also be used dynamic resource allocation is 1963d0407baSopenharmony_ci * required. It shall not used to deal with clock parameters, 1973d0407baSopenharmony_ci * such as rate or parents. 1983d0407baSopenharmony_ci * Returns 0 on success, -EERROR otherwise. 1993d0407baSopenharmony_ci * 2003d0407baSopenharmony_ci * @terminate: Free any resource allocated by init. 2013d0407baSopenharmony_ci * 2023d0407baSopenharmony_ci * @debug_init: Set up type-specific debugfs entries for this clock. This 2033d0407baSopenharmony_ci * is called once, after the debugfs directory entry for this 2043d0407baSopenharmony_ci * clock has been created. The dentry pointer representing that 2053d0407baSopenharmony_ci * directory is provided as an argument. Called with 2063d0407baSopenharmony_ci * prepare_lock held. Returns 0 on success, -EERROR otherwise. 2073d0407baSopenharmony_ci * 2083d0407baSopenharmony_ci * 2093d0407baSopenharmony_ci * The clk_enable/clk_disable and clk_prepare/clk_unprepare pairs allow 2103d0407baSopenharmony_ci * implementations to split any work between atomic (enable) and sleepable 2113d0407baSopenharmony_ci * (prepare) contexts. If enabling a clock requires code that might sleep, 2123d0407baSopenharmony_ci * this must be done in clk_prepare. Clock enable code that will never be 2133d0407baSopenharmony_ci * called in a sleepable context may be implemented in clk_enable. 2143d0407baSopenharmony_ci * 2153d0407baSopenharmony_ci * Typically, drivers will call clk_prepare when a clock may be needed later 2163d0407baSopenharmony_ci * (eg. when a device is opened), and clk_enable when the clock is actually 2173d0407baSopenharmony_ci * required (eg. from an interrupt). Note that clk_prepare MUST have been 2183d0407baSopenharmony_ci * called before clk_enable. 2193d0407baSopenharmony_ci */ 2203d0407baSopenharmony_cistruct clk_ops { 2213d0407baSopenharmony_ci int (*prepare)(struct clk_hw *hw); 2223d0407baSopenharmony_ci void (*unprepare)(struct clk_hw *hw); 2233d0407baSopenharmony_ci int (*is_prepared)(struct clk_hw *hw); 2243d0407baSopenharmony_ci void (*unprepare_unused)(struct clk_hw *hw); 2253d0407baSopenharmony_ci int (*enable)(struct clk_hw *hw); 2263d0407baSopenharmony_ci void (*disable)(struct clk_hw *hw); 2273d0407baSopenharmony_ci int (*is_enabled)(struct clk_hw *hw); 2283d0407baSopenharmony_ci void (*disable_unused)(struct clk_hw *hw); 2293d0407baSopenharmony_ci int (*save_context)(struct clk_hw *hw); 2303d0407baSopenharmony_ci void (*restore_context)(struct clk_hw *hw); 2313d0407baSopenharmony_ci unsigned long (*recalc_rate)(struct clk_hw *hw, unsigned long parent_rate); 2323d0407baSopenharmony_ci long (*round_rate)(struct clk_hw *hw, unsigned long rate, unsigned long *parent_rate); 2333d0407baSopenharmony_ci int (*determine_rate)(struct clk_hw *hw, struct clk_rate_request *req); 2343d0407baSopenharmony_ci int (*set_parent)(struct clk_hw *hw, u8 index); 2353d0407baSopenharmony_ci u8 (*get_parent)(struct clk_hw *hw); 2363d0407baSopenharmony_ci int (*set_rate)(struct clk_hw *hw, unsigned long rate, unsigned long parent_rate); 2373d0407baSopenharmony_ci int (*set_rate_and_parent)(struct clk_hw *hw, unsigned long rate, unsigned long parent_rate, u8 index); 2383d0407baSopenharmony_ci unsigned long (*recalc_accuracy)(struct clk_hw *hw, unsigned long parent_accuracy); 2393d0407baSopenharmony_ci int (*get_phase)(struct clk_hw *hw); 2403d0407baSopenharmony_ci int (*set_phase)(struct clk_hw *hw, int degrees); 2413d0407baSopenharmony_ci int (*get_duty_cycle)(struct clk_hw *hw, struct clk_duty *duty); 2423d0407baSopenharmony_ci int (*set_duty_cycle)(struct clk_hw *hw, struct clk_duty *duty); 2433d0407baSopenharmony_ci int (*init)(struct clk_hw *hw); 2443d0407baSopenharmony_ci void (*terminate)(struct clk_hw *hw); 2453d0407baSopenharmony_ci void (*debug_init)(struct clk_hw *hw, struct dentry *dentry); 2463d0407baSopenharmony_ci}; 2473d0407baSopenharmony_ci 2483d0407baSopenharmony_ci/** 2493d0407baSopenharmony_ci * struct clk_parent_data - clk parent information 2503d0407baSopenharmony_ci * @hw: parent clk_hw pointer (used for clk providers with internal clks) 2513d0407baSopenharmony_ci * @fw_name: parent name local to provider registering clk 2523d0407baSopenharmony_ci * @name: globally unique parent name (used as a fallback) 2533d0407baSopenharmony_ci * @index: parent index local to provider registering clk (if @fw_name absent) 2543d0407baSopenharmony_ci */ 2553d0407baSopenharmony_cistruct clk_parent_data { 2563d0407baSopenharmony_ci const struct clk_hw *hw; 2573d0407baSopenharmony_ci const char *fw_name; 2583d0407baSopenharmony_ci const char *name; 2593d0407baSopenharmony_ci int index; 2603d0407baSopenharmony_ci}; 2613d0407baSopenharmony_ci 2623d0407baSopenharmony_ci/** 2633d0407baSopenharmony_ci * struct clk_init_data - holds init data that's common to all clocks and is 2643d0407baSopenharmony_ci * shared between the clock provider and the common clock framework. 2653d0407baSopenharmony_ci * 2663d0407baSopenharmony_ci * @name: clock name 2673d0407baSopenharmony_ci * @ops: operations this clock supports 2683d0407baSopenharmony_ci * @parent_names: array of string names for all possible parents 2693d0407baSopenharmony_ci * @parent_data: array of parent data for all possible parents (when some 2703d0407baSopenharmony_ci * parents are external to the clk controller) 2713d0407baSopenharmony_ci * @parent_hws: array of pointers to all possible parents (when all parents 2723d0407baSopenharmony_ci * are internal to the clk controller) 2733d0407baSopenharmony_ci * @num_parents: number of possible parents 2743d0407baSopenharmony_ci * @flags: framework-level hints and quirks 2753d0407baSopenharmony_ci */ 2763d0407baSopenharmony_cistruct clk_init_data { 2773d0407baSopenharmony_ci const char *name; 2783d0407baSopenharmony_ci const struct clk_ops *ops; 2793d0407baSopenharmony_ci /* Only one of the following three should be assigned */ 2803d0407baSopenharmony_ci const char *const *parent_names; 2813d0407baSopenharmony_ci const struct clk_parent_data *parent_data; 2823d0407baSopenharmony_ci const struct clk_hw **parent_hws; 2833d0407baSopenharmony_ci u8 num_parents; 2843d0407baSopenharmony_ci unsigned long flags; 2853d0407baSopenharmony_ci}; 2863d0407baSopenharmony_ci 2873d0407baSopenharmony_ci/** 2883d0407baSopenharmony_ci * struct clk_hw - handle for traversing from a struct clk to its corresponding 2893d0407baSopenharmony_ci * hardware-specific structure. struct clk_hw should be declared within struct 2903d0407baSopenharmony_ci * clk_foo and then referenced by the struct clk instance that uses struct 2913d0407baSopenharmony_ci * clk_foo's clk_ops 2923d0407baSopenharmony_ci * 2933d0407baSopenharmony_ci * @core: pointer to the struct clk_core instance that points back to this 2943d0407baSopenharmony_ci * struct clk_hw instance 2953d0407baSopenharmony_ci * 2963d0407baSopenharmony_ci * @clk: pointer to the per-user struct clk instance that can be used to call 2973d0407baSopenharmony_ci * into the clk API 2983d0407baSopenharmony_ci * 2993d0407baSopenharmony_ci * @init: pointer to struct clk_init_data that contains the init data shared 3003d0407baSopenharmony_ci * with the common clock framework. This pointer will be set to NULL once 3013d0407baSopenharmony_ci * a clk_register() variant is called on this clk_hw pointer. 3023d0407baSopenharmony_ci */ 3033d0407baSopenharmony_cistruct clk_hw { 3043d0407baSopenharmony_ci struct clk_core *core; 3053d0407baSopenharmony_ci struct clk *clk; 3063d0407baSopenharmony_ci const struct clk_init_data *init; 3073d0407baSopenharmony_ci}; 3083d0407baSopenharmony_ci 3093d0407baSopenharmony_ci/* 3103d0407baSopenharmony_ci * DOC: Basic clock implementations common to many platforms 3113d0407baSopenharmony_ci * 3123d0407baSopenharmony_ci * Each basic clock hardware type is comprised of a structure describing the 3133d0407baSopenharmony_ci * clock hardware, implementations of the relevant callbacks in struct clk_ops, 3143d0407baSopenharmony_ci * unique flags for that hardware type, a registration function and an 3153d0407baSopenharmony_ci * alternative macro for static initialization 3163d0407baSopenharmony_ci */ 3173d0407baSopenharmony_ci 3183d0407baSopenharmony_ci/** 3193d0407baSopenharmony_ci * struct clk_fixed_rate - fixed-rate clock 3203d0407baSopenharmony_ci * @hw: handle between common and hardware-specific interfaces 3213d0407baSopenharmony_ci * @fixed_rate: constant frequency of clock 3223d0407baSopenharmony_ci * @fixed_accuracy: constant accuracy of clock in ppb (parts per billion) 3233d0407baSopenharmony_ci * @flags: hardware specific flags 3243d0407baSopenharmony_ci * 3253d0407baSopenharmony_ci * Flags: 3263d0407baSopenharmony_ci * * CLK_FIXED_RATE_PARENT_ACCURACY - Use the accuracy of the parent clk 3273d0407baSopenharmony_ci * instead of what's set in @fixed_accuracy. 3283d0407baSopenharmony_ci */ 3293d0407baSopenharmony_cistruct clk_fixed_rate { 3303d0407baSopenharmony_ci struct clk_hw hw; 3313d0407baSopenharmony_ci unsigned long fixed_rate; 3323d0407baSopenharmony_ci unsigned long fixed_accuracy; 3333d0407baSopenharmony_ci unsigned long flags; 3343d0407baSopenharmony_ci}; 3353d0407baSopenharmony_ci 3363d0407baSopenharmony_ci#define CLK_FIXED_RATE_PARENT_ACCURACY BIT(0) 3373d0407baSopenharmony_ci 3383d0407baSopenharmony_ciextern const struct clk_ops clk_fixed_rate_ops; 3393d0407baSopenharmony_cistruct clk_hw *__clk_hw_register_fixed_rate(struct device *dev, struct device_node *np, const char *name, 3403d0407baSopenharmony_ci const char *parent_name, const struct clk_hw *parent_hw, 3413d0407baSopenharmony_ci const struct clk_parent_data *parent_data, unsigned long flags, 3423d0407baSopenharmony_ci unsigned long fixed_rate, unsigned long fixed_accuracy, 3433d0407baSopenharmony_ci unsigned long clk_fixed_flags); 3443d0407baSopenharmony_cistruct clk *clk_register_fixed_rate(struct device *dev, const char *name, const char *parent_name, unsigned long flags, 3453d0407baSopenharmony_ci unsigned long fixed_rate); 3463d0407baSopenharmony_ci/** 3473d0407baSopenharmony_ci * clk_hw_register_fixed_rate - register fixed-rate clock with the clock 3483d0407baSopenharmony_ci * framework 3493d0407baSopenharmony_ci * @dev: device that is registering this clock 3503d0407baSopenharmony_ci * @name: name of this clock 3513d0407baSopenharmony_ci * @parent_name: name of clock's parent 3523d0407baSopenharmony_ci * @flags: framework-specific flags 3533d0407baSopenharmony_ci * @fixed_rate: non-adjustable clock rate 3543d0407baSopenharmony_ci */ 3553d0407baSopenharmony_ci#define clk_hw_register_fixed_rate(dev, name, parent_name, flags, fixed_rate) \ 3563d0407baSopenharmony_ci __clk_hw_register_fixed_rate((dev), NULL, (name), (parent_name), NULL, NULL, (flags), (fixed_rate), 0, 0) 3573d0407baSopenharmony_ci/** 3583d0407baSopenharmony_ci * clk_hw_register_fixed_rate_parent_hw - register fixed-rate clock with 3593d0407baSopenharmony_ci * the clock framework 3603d0407baSopenharmony_ci * @dev: device that is registering this clock 3613d0407baSopenharmony_ci * @name: name of this clock 3623d0407baSopenharmony_ci * @parent_hw: pointer to parent clk 3633d0407baSopenharmony_ci * @flags: framework-specific flags 3643d0407baSopenharmony_ci * @fixed_rate: non-adjustable clock rate 3653d0407baSopenharmony_ci */ 3663d0407baSopenharmony_ci#define clk_hw_register_fixed_rate_parent_hw(dev, name, parent_hw, flags, fixed_rate) \ 3673d0407baSopenharmony_ci __clk_hw_register_fixed_rate((dev), NULL, (name), NULL, (parent_hw), NULL, (flags), (fixed_rate), 0, 0) 3683d0407baSopenharmony_ci/** 3693d0407baSopenharmony_ci * clk_hw_register_fixed_rate_parent_data - register fixed-rate clock with 3703d0407baSopenharmony_ci * the clock framework 3713d0407baSopenharmony_ci * @dev: device that is registering this clock 3723d0407baSopenharmony_ci * @name: name of this clock 3733d0407baSopenharmony_ci * @parent_data: parent clk data 3743d0407baSopenharmony_ci * @flags: framework-specific flags 3753d0407baSopenharmony_ci * @fixed_rate: non-adjustable clock rate 3763d0407baSopenharmony_ci */ 3773d0407baSopenharmony_ci#define clk_hw_register_fixed_rate_parent_data(dev, name, parent_hw, flags, fixed_rate) \ 3783d0407baSopenharmony_ci __clk_hw_register_fixed_rate((dev), NULL, (name), NULL, NULL, (parent_data), (flags), (fixed_rate), 0, 0) 3793d0407baSopenharmony_ci/** 3803d0407baSopenharmony_ci * clk_hw_register_fixed_rate_with_accuracy - register fixed-rate clock with 3813d0407baSopenharmony_ci * the clock framework 3823d0407baSopenharmony_ci * @dev: device that is registering this clock 3833d0407baSopenharmony_ci * @name: name of this clock 3843d0407baSopenharmony_ci * @parent_name: name of clock's parent 3853d0407baSopenharmony_ci * @flags: framework-specific flags 3863d0407baSopenharmony_ci * @fixed_rate: non-adjustable clock rate 3873d0407baSopenharmony_ci * @fixed_accuracy: non-adjustable clock accuracy 3883d0407baSopenharmony_ci */ 3893d0407baSopenharmony_ci#define clk_hw_register_fixed_rate_with_accuracy(dev, name, parent_name, flags, fixed_rate, fixed_accuracy) \ 3903d0407baSopenharmony_ci __clk_hw_register_fixed_rate((dev), NULL, (name), (parent_name), NULL, NULL, (flags), (fixed_rate), \ 3913d0407baSopenharmony_ci (fixed_accuracy), 0) 3923d0407baSopenharmony_ci/** 3933d0407baSopenharmony_ci * clk_hw_register_fixed_rate_with_accuracy_parent_hw - register fixed-rate 3943d0407baSopenharmony_ci * clock with the clock framework 3953d0407baSopenharmony_ci * @dev: device that is registering this clock 3963d0407baSopenharmony_ci * @name: name of this clock 3973d0407baSopenharmony_ci * @parent_hw: pointer to parent clk 3983d0407baSopenharmony_ci * @flags: framework-specific flags 3993d0407baSopenharmony_ci * @fixed_rate: non-adjustable clock rate 4003d0407baSopenharmony_ci * @fixed_accuracy: non-adjustable clock accuracy 4013d0407baSopenharmony_ci */ 4023d0407baSopenharmony_ci#define clk_hw_register_fixed_rate_with_accuracy_parent_hw(dev, name, parent_hw, flags, fixed_rate, fixed_accuracy) \ 4033d0407baSopenharmony_ci __clk_hw_register_fixed_rate((dev), NULL, (name), NULL, (parent_hw)NULL, NULL, (flags), (fixed_rate), \ 4043d0407baSopenharmony_ci (fixed_accuracy), 0) 4053d0407baSopenharmony_ci/** 4063d0407baSopenharmony_ci * clk_hw_register_fixed_rate_with_accuracy_parent_data - register fixed-rate 4073d0407baSopenharmony_ci * clock with the clock framework 4083d0407baSopenharmony_ci * @dev: device that is registering this clock 4093d0407baSopenharmony_ci * @name: name of this clock 4103d0407baSopenharmony_ci * @parent_name: name of clock's parent 4113d0407baSopenharmony_ci * @flags: framework-specific flags 4123d0407baSopenharmony_ci * @fixed_rate: non-adjustable clock rate 4133d0407baSopenharmony_ci * @fixed_accuracy: non-adjustable clock accuracy 4143d0407baSopenharmony_ci */ 4153d0407baSopenharmony_ci#define clk_hw_register_fixed_rate_with_accuracy_parent_data(dev, name, parent_data, flags, fixed_rate, \ 4163d0407baSopenharmony_ci fixed_accuracy) \ 4173d0407baSopenharmony_ci __clk_hw_register_fixed_rate((dev), NULL, (name), NULL, NULL, (parent_data), NULL, (flags), (fixed_rate), \ 4183d0407baSopenharmony_ci (fixed_accuracy), 0) 4193d0407baSopenharmony_ci 4203d0407baSopenharmony_civoid clk_unregister_fixed_rate(struct clk *clk); 4213d0407baSopenharmony_civoid clk_hw_unregister_fixed_rate(struct clk_hw *hw); 4223d0407baSopenharmony_ci 4233d0407baSopenharmony_civoid of_fixed_clk_setup(struct device_node *np); 4243d0407baSopenharmony_ci 4253d0407baSopenharmony_ci/** 4263d0407baSopenharmony_ci * struct clk_gate - gating clock 4273d0407baSopenharmony_ci * 4283d0407baSopenharmony_ci * @hw: handle between common and hardware-specific interfaces 4293d0407baSopenharmony_ci * @reg: register controlling gate 4303d0407baSopenharmony_ci * @bit_idx: single bit controlling gate 4313d0407baSopenharmony_ci * @flags: hardware-specific flags 4323d0407baSopenharmony_ci * @lock: register lock 4333d0407baSopenharmony_ci * 4343d0407baSopenharmony_ci * Clock which can gate its output. Implements .enable & .disable 4353d0407baSopenharmony_ci * 4363d0407baSopenharmony_ci * Flags: 4373d0407baSopenharmony_ci * CLK_GATE_SET_TO_DISABLE - by default this clock sets the bit at bit_idx to 4383d0407baSopenharmony_ci * enable the clock. Setting this flag does the opposite: setting the bit 4393d0407baSopenharmony_ci * disable the clock and clearing it enables the clock 4403d0407baSopenharmony_ci * CLK_GATE_HIWORD_MASK - The gate settings are only in lower 16-bit 4413d0407baSopenharmony_ci * of this register, and mask of gate bits are in higher 16-bit of this 4423d0407baSopenharmony_ci * register. While setting the gate bits, higher 16-bit should also be 4433d0407baSopenharmony_ci * updated to indicate changing gate bits. 4443d0407baSopenharmony_ci * CLK_GATE_BIG_ENDIAN - by default little endian register accesses are used for 4453d0407baSopenharmony_ci * the gate register. Setting this flag makes the register accesses big 4463d0407baSopenharmony_ci * endian. 4473d0407baSopenharmony_ci */ 4483d0407baSopenharmony_cistruct clk_gate { 4493d0407baSopenharmony_ci struct clk_hw hw; 4503d0407baSopenharmony_ci void __iomem *reg; 4513d0407baSopenharmony_ci u8 bit_idx; 4523d0407baSopenharmony_ci u8 flags; 4533d0407baSopenharmony_ci spinlock_t *lock; 4543d0407baSopenharmony_ci}; 4553d0407baSopenharmony_ci 4563d0407baSopenharmony_ci#define to_clk_gate(_hw) container_of(_hw, struct clk_gate, hw) 4573d0407baSopenharmony_ci 4583d0407baSopenharmony_ci#define CLK_GATE_SET_TO_DISABLE BIT(0) 4593d0407baSopenharmony_ci#define CLK_GATE_HIWORD_MASK BIT(1) 4603d0407baSopenharmony_ci#define CLK_GATE_BIG_ENDIAN BIT(2) 4613d0407baSopenharmony_ci 4623d0407baSopenharmony_ciextern const struct clk_ops clk_gate_ops; 4633d0407baSopenharmony_cistruct clk_hw *__clk_hw_register_gate(struct device *dev, struct device_node *np, const char *name, 4643d0407baSopenharmony_ci const char *parent_name, const struct clk_hw *parent_hw, 4653d0407baSopenharmony_ci const struct clk_parent_data *parent_data, unsigned long flags, void __iomem *reg, 4663d0407baSopenharmony_ci u8 bit_idx, u8 clk_gate_flags, spinlock_t *lock); 4673d0407baSopenharmony_cistruct clk *clk_register_gate(struct device *dev, const char *name, const char *parent_name, unsigned long flags, 4683d0407baSopenharmony_ci void __iomem *reg, u8 bit_idx, u8 clk_gate_flags, spinlock_t *lock); 4693d0407baSopenharmony_ci/** 4703d0407baSopenharmony_ci * clk_hw_register_gate - register a gate clock with the clock framework 4713d0407baSopenharmony_ci * @dev: device that is registering this clock 4723d0407baSopenharmony_ci * @name: name of this clock 4733d0407baSopenharmony_ci * @parent_name: name of this clock's parent 4743d0407baSopenharmony_ci * @flags: framework-specific flags for this clock 4753d0407baSopenharmony_ci * @reg: register address to control gating of this clock 4763d0407baSopenharmony_ci * @bit_idx: which bit in the register controls gating of this clock 4773d0407baSopenharmony_ci * @clk_gate_flags: gate-specific flags for this clock 4783d0407baSopenharmony_ci * @lock: shared register lock for this clock 4793d0407baSopenharmony_ci */ 4803d0407baSopenharmony_ci#define clk_hw_register_gate(dev, name, parent_name, flags, reg, bit_idx, clk_gate_flags, lock) \ 4813d0407baSopenharmony_ci __clk_hw_register_gate((dev), NULL, (name), (parent_name), NULL, NULL, (flags), (reg), (bit_idx), \ 4823d0407baSopenharmony_ci (clk_gate_flags), (lock)) 4833d0407baSopenharmony_ci/** 4843d0407baSopenharmony_ci * clk_hw_register_gate_parent_hw - register a gate clock with the clock 4853d0407baSopenharmony_ci * framework 4863d0407baSopenharmony_ci * @dev: device that is registering this clock 4873d0407baSopenharmony_ci * @name: name of this clock 4883d0407baSopenharmony_ci * @parent_hw: pointer to parent clk 4893d0407baSopenharmony_ci * @flags: framework-specific flags for this clock 4903d0407baSopenharmony_ci * @reg: register address to control gating of this clock 4913d0407baSopenharmony_ci * @bit_idx: which bit in the register controls gating of this clock 4923d0407baSopenharmony_ci * @clk_gate_flags: gate-specific flags for this clock 4933d0407baSopenharmony_ci * @lock: shared register lock for this clock 4943d0407baSopenharmony_ci */ 4953d0407baSopenharmony_ci#define clk_hw_register_gate_parent_hw(dev, name, parent_hw, flags, reg, bit_idx, clk_gate_flags, lock) \ 4963d0407baSopenharmony_ci __clk_hw_register_gate((dev), NULL, (name), NULL, (parent_hw), NULL, (flags), (reg), (bit_idx), (clk_gate_flags), \ 4973d0407baSopenharmony_ci (lock)) 4983d0407baSopenharmony_ci/** 4993d0407baSopenharmony_ci * clk_hw_register_gate_parent_data - register a gate clock with the clock 5003d0407baSopenharmony_ci * framework 5013d0407baSopenharmony_ci * @dev: device that is registering this clock 5023d0407baSopenharmony_ci * @name: name of this clock 5033d0407baSopenharmony_ci * @parent_data: parent clk data 5043d0407baSopenharmony_ci * @flags: framework-specific flags for this clock 5053d0407baSopenharmony_ci * @reg: register address to control gating of this clock 5063d0407baSopenharmony_ci * @bit_idx: which bit in the register controls gating of this clock 5073d0407baSopenharmony_ci * @clk_gate_flags: gate-specific flags for this clock 5083d0407baSopenharmony_ci * @lock: shared register lock for this clock 5093d0407baSopenharmony_ci */ 5103d0407baSopenharmony_ci#define clk_hw_register_gate_parent_data(dev, name, parent_data, flags, reg, bit_idx, clk_gate_flags, lock) \ 5113d0407baSopenharmony_ci __clk_hw_register_gate((dev), NULL, (name), NULL, NULL, (parent_data), (flags), (reg), (bit_idx), \ 5123d0407baSopenharmony_ci (clk_gate_flags), (lock)) 5133d0407baSopenharmony_civoid clk_unregister_gate(struct clk *clk); 5143d0407baSopenharmony_civoid clk_hw_unregister_gate(struct clk_hw *hw); 5153d0407baSopenharmony_ciint clk_gate_is_enabled(struct clk_hw *hw); 5163d0407baSopenharmony_ci 5173d0407baSopenharmony_cistruct clk_div_table { 5183d0407baSopenharmony_ci unsigned int val; 5193d0407baSopenharmony_ci unsigned int div; 5203d0407baSopenharmony_ci}; 5213d0407baSopenharmony_ci 5223d0407baSopenharmony_ci/** 5233d0407baSopenharmony_ci * struct clk_divider - adjustable divider clock 5243d0407baSopenharmony_ci * 5253d0407baSopenharmony_ci * @hw: handle between common and hardware-specific interfaces 5263d0407baSopenharmony_ci * @reg: register containing the divider 5273d0407baSopenharmony_ci * @shift: shift to the divider bit field 5283d0407baSopenharmony_ci * @width: width of the divider bit field 5293d0407baSopenharmony_ci * @table: array of value/divider pairs, last entry should have div = 0 5303d0407baSopenharmony_ci * @lock: register lock 5313d0407baSopenharmony_ci * 5323d0407baSopenharmony_ci * Clock with an adjustable divider affecting its output frequency. Implements 5333d0407baSopenharmony_ci * .recalc_rate, .set_rate and .round_rate 5343d0407baSopenharmony_ci * 5353d0407baSopenharmony_ci * Flags: 5363d0407baSopenharmony_ci * CLK_DIVIDER_ONE_BASED - by default the divisor is the value read from the 5373d0407baSopenharmony_ci * register plus one. If CLK_DIVIDER_ONE_BASED is set then the divider is 5383d0407baSopenharmony_ci * the raw value read from the register, with the value of zero considered 5393d0407baSopenharmony_ci * invalid, unless CLK_DIVIDER_ALLOW_ZERO is set. 5403d0407baSopenharmony_ci * CLK_DIVIDER_POWER_OF_TWO - clock divisor is 2 raised to the value read from 5413d0407baSopenharmony_ci * the hardware register 5423d0407baSopenharmony_ci * CLK_DIVIDER_ALLOW_ZERO - Allow zero divisors. For dividers which have 5433d0407baSopenharmony_ci * CLK_DIVIDER_ONE_BASED set, it is possible to end up with a zero divisor. 5443d0407baSopenharmony_ci * Some hardware implementations gracefully handle this case and allow a 5453d0407baSopenharmony_ci * zero divisor by not modifying their input clock 5463d0407baSopenharmony_ci * (divide by one / bypass). 5473d0407baSopenharmony_ci * CLK_DIVIDER_HIWORD_MASK - The divider settings are only in lower 16-bit 5483d0407baSopenharmony_ci * of this register, and mask of divider bits are in higher 16-bit of this 5493d0407baSopenharmony_ci * register. While setting the divider bits, higher 16-bit should also be 5503d0407baSopenharmony_ci * updated to indicate changing divider bits. 5513d0407baSopenharmony_ci * CLK_DIVIDER_ROUND_CLOSEST - Makes the best calculated divider to be rounded 5523d0407baSopenharmony_ci * to the closest integer instead of the up one. 5533d0407baSopenharmony_ci * CLK_DIVIDER_READ_ONLY - The divider settings are preconfigured and should 5543d0407baSopenharmony_ci * not be changed by the clock framework. 5553d0407baSopenharmony_ci * CLK_DIVIDER_MAX_AT_ZERO - For dividers which are like CLK_DIVIDER_ONE_BASED 5563d0407baSopenharmony_ci * except when the value read from the register is zero, the divisor is 5573d0407baSopenharmony_ci * 2^width of the field. 5583d0407baSopenharmony_ci * CLK_DIVIDER_BIG_ENDIAN - By default little endian register accesses are used 5593d0407baSopenharmony_ci * for the divider register. Setting this flag makes the register accesses 5603d0407baSopenharmony_ci * big endian. 5613d0407baSopenharmony_ci */ 5623d0407baSopenharmony_cistruct clk_divider { 5633d0407baSopenharmony_ci struct clk_hw hw; 5643d0407baSopenharmony_ci void __iomem *reg; 5653d0407baSopenharmony_ci u8 shift; 5663d0407baSopenharmony_ci u8 width; 5673d0407baSopenharmony_ci u8 flags; 5683d0407baSopenharmony_ci unsigned long max_prate; 5693d0407baSopenharmony_ci const struct clk_div_table *table; 5703d0407baSopenharmony_ci spinlock_t *lock; 5713d0407baSopenharmony_ci}; 5723d0407baSopenharmony_ci 5733d0407baSopenharmony_ci#define clk_div_mask(width) ((1 << (width)) - 1) 5743d0407baSopenharmony_ci#define to_clk_divider(_hw) container_of(_hw, struct clk_divider, hw) 5753d0407baSopenharmony_ci 5763d0407baSopenharmony_ci#define CLK_DIVIDER_ONE_BASED BIT(0) 5773d0407baSopenharmony_ci#define CLK_DIVIDER_POWER_OF_TWO BIT(1) 5783d0407baSopenharmony_ci#define CLK_DIVIDER_ALLOW_ZERO BIT(2) 5793d0407baSopenharmony_ci#define CLK_DIVIDER_HIWORD_MASK BIT(3) 5803d0407baSopenharmony_ci#define CLK_DIVIDER_ROUND_CLOSEST BIT(4) 5813d0407baSopenharmony_ci#define CLK_DIVIDER_READ_ONLY BIT(5) 5823d0407baSopenharmony_ci#define CLK_DIVIDER_MAX_AT_ZERO BIT(6) 5833d0407baSopenharmony_ci#define CLK_DIVIDER_BIG_ENDIAN BIT(7) 5843d0407baSopenharmony_ci 5853d0407baSopenharmony_ciextern const struct clk_ops clk_divider_ops; 5863d0407baSopenharmony_ciextern const struct clk_ops clk_divider_ro_ops; 5873d0407baSopenharmony_ci 5883d0407baSopenharmony_ciunsigned long divider_recalc_rate(struct clk_hw *hw, unsigned long parent_rate, unsigned int val, 5893d0407baSopenharmony_ci const struct clk_div_table *table, unsigned long flags, unsigned long width); 5903d0407baSopenharmony_cilong divider_round_rate_parent(struct clk_hw *hw, struct clk_hw *parent, unsigned long rate, unsigned long *prate, 5913d0407baSopenharmony_ci const struct clk_div_table *table, u8 width, unsigned long flags); 5923d0407baSopenharmony_cilong divider_ro_round_rate_parent(struct clk_hw *hw, struct clk_hw *parent, unsigned long rate, unsigned long *prate, 5933d0407baSopenharmony_ci const struct clk_div_table *table, u8 width, unsigned long flags, unsigned int val); 5943d0407baSopenharmony_ciint divider_get_val(unsigned long rate, unsigned long parent_rate, const struct clk_div_table *table, u8 width, 5953d0407baSopenharmony_ci unsigned long flags); 5963d0407baSopenharmony_ci 5973d0407baSopenharmony_cistruct clk_hw *__clk_hw_register_divider(struct device *dev, struct device_node *np, const char *name, 5983d0407baSopenharmony_ci const char *parent_name, const struct clk_hw *parent_hw, 5993d0407baSopenharmony_ci const struct clk_parent_data *parent_data, unsigned long flags, 6003d0407baSopenharmony_ci void __iomem *reg, u8 shift, u8 width, u8 clk_divider_flags, 6013d0407baSopenharmony_ci const struct clk_div_table *table, spinlock_t *lock); 6023d0407baSopenharmony_cistruct clk *clk_register_divider_table(struct device *dev, const char *name, const char *parent_name, 6033d0407baSopenharmony_ci unsigned long flags, void __iomem *reg, u8 shift, u8 width, u8 clk_divider_flags, 6043d0407baSopenharmony_ci const struct clk_div_table *table, spinlock_t *lock); 6053d0407baSopenharmony_ci/** 6063d0407baSopenharmony_ci * clk_register_divider - register a divider clock with the clock framework 6073d0407baSopenharmony_ci * @dev: device registering this clock 6083d0407baSopenharmony_ci * @name: name of this clock 6093d0407baSopenharmony_ci * @parent_name: name of clock's parent 6103d0407baSopenharmony_ci * @flags: framework-specific flags 6113d0407baSopenharmony_ci * @reg: register address to adjust divider 6123d0407baSopenharmony_ci * @shift: number of bits to shift the bitfield 6133d0407baSopenharmony_ci * @width: width of the bitfield 6143d0407baSopenharmony_ci * @clk_divider_flags: divider-specific flags for this clock 6153d0407baSopenharmony_ci * @lock: shared register lock for this clock 6163d0407baSopenharmony_ci */ 6173d0407baSopenharmony_ci#define clk_register_divider(dev, name, parent_name, flags, reg, shift, width, clk_divider_flags, lock) \ 6183d0407baSopenharmony_ci clk_register_divider_table((dev), (name), (parent_name), (flags), (reg), (shift), (width), (clk_divider_flags), \ 6193d0407baSopenharmony_ci NULL, (lock)) 6203d0407baSopenharmony_ci/** 6213d0407baSopenharmony_ci * clk_hw_register_divider - register a divider clock with the clock framework 6223d0407baSopenharmony_ci * @dev: device registering this clock 6233d0407baSopenharmony_ci * @name: name of this clock 6243d0407baSopenharmony_ci * @parent_name: name of clock's parent 6253d0407baSopenharmony_ci * @flags: framework-specific flags 6263d0407baSopenharmony_ci * @reg: register address to adjust divider 6273d0407baSopenharmony_ci * @shift: number of bits to shift the bitfield 6283d0407baSopenharmony_ci * @width: width of the bitfield 6293d0407baSopenharmony_ci * @clk_divider_flags: divider-specific flags for this clock 6303d0407baSopenharmony_ci * @lock: shared register lock for this clock 6313d0407baSopenharmony_ci */ 6323d0407baSopenharmony_ci#define clk_hw_register_divider(dev, name, parent_name, flags, reg, shift, width, clk_divider_flags, lock) \ 6333d0407baSopenharmony_ci __clk_hw_register_divider((dev), NULL, (name), (parent_name), NULL, NULL, (flags), (reg), (shift), (width), \ 6343d0407baSopenharmony_ci (clk_divider_flags), NULL, (lock)) 6353d0407baSopenharmony_ci/** 6363d0407baSopenharmony_ci * clk_hw_register_divider_parent_hw - register a divider clock with the clock 6373d0407baSopenharmony_ci * framework 6383d0407baSopenharmony_ci * @dev: device registering this clock 6393d0407baSopenharmony_ci * @name: name of this clock 6403d0407baSopenharmony_ci * @parent_hw: pointer to parent clk 6413d0407baSopenharmony_ci * @flags: framework-specific flags 6423d0407baSopenharmony_ci * @reg: register address to adjust divider 6433d0407baSopenharmony_ci * @shift: number of bits to shift the bitfield 6443d0407baSopenharmony_ci * @width: width of the bitfield 6453d0407baSopenharmony_ci * @clk_divider_flags: divider-specific flags for this clock 6463d0407baSopenharmony_ci * @lock: shared register lock for this clock 6473d0407baSopenharmony_ci */ 6483d0407baSopenharmony_ci#define clk_hw_register_divider_parent_hw(dev, name, parent_hw, flags, reg, shift, width, clk_divider_flags, lock) \ 6493d0407baSopenharmony_ci __clk_hw_register_divider((dev), NULL, (name), NULL, (parent_hw), NULL, (flags), (reg), (shift), (width), \ 6503d0407baSopenharmony_ci (clk_divider_flags), NULL, (lock)) 6513d0407baSopenharmony_ci/** 6523d0407baSopenharmony_ci * clk_hw_register_divider_parent_data - register a divider clock with the clock 6533d0407baSopenharmony_ci * framework 6543d0407baSopenharmony_ci * @dev: device registering this clock 6553d0407baSopenharmony_ci * @name: name of this clock 6563d0407baSopenharmony_ci * @parent_data: parent clk data 6573d0407baSopenharmony_ci * @flags: framework-specific flags 6583d0407baSopenharmony_ci * @reg: register address to adjust divider 6593d0407baSopenharmony_ci * @shift: number of bits to shift the bitfield 6603d0407baSopenharmony_ci * @width: width of the bitfield 6613d0407baSopenharmony_ci * @clk_divider_flags: divider-specific flags for this clock 6623d0407baSopenharmony_ci * @lock: shared register lock for this clock 6633d0407baSopenharmony_ci */ 6643d0407baSopenharmony_ci#define clk_hw_register_divider_parent_data(dev, name, parent_data, flags, reg, shift, width, clk_divider_flags, lock) \ 6653d0407baSopenharmony_ci __clk_hw_register_divider((dev), NULL, (name), NULL, NULL, (parent_data), (flags), (reg), (shift), (width), \ 6663d0407baSopenharmony_ci (clk_divider_flags), NULL, (lock)) 6673d0407baSopenharmony_ci/** 6683d0407baSopenharmony_ci * clk_hw_register_divider_table - register a table based divider clock with 6693d0407baSopenharmony_ci * the clock framework 6703d0407baSopenharmony_ci * @dev: device registering this clock 6713d0407baSopenharmony_ci * @name: name of this clock 6723d0407baSopenharmony_ci * @parent_name: name of clock's parent 6733d0407baSopenharmony_ci * @flags: framework-specific flags 6743d0407baSopenharmony_ci * @reg: register address to adjust divider 6753d0407baSopenharmony_ci * @shift: number of bits to shift the bitfield 6763d0407baSopenharmony_ci * @width: width of the bitfield 6773d0407baSopenharmony_ci * @clk_divider_flags: divider-specific flags for this clock 6783d0407baSopenharmony_ci * @table: array of divider/value pairs ending with a div set to 0 6793d0407baSopenharmony_ci * @lock: shared register lock for this clock 6803d0407baSopenharmony_ci */ 6813d0407baSopenharmony_ci#define clk_hw_register_divider_table(dev, name, parent_name, flags, reg, shift, width, clk_divider_flags, table, \ 6823d0407baSopenharmony_ci lock) \ 6833d0407baSopenharmony_ci __clk_hw_register_divider((dev), NULL, (name), (parent_name), NULL, NULL, (flags), (reg), (shift), (width), \ 6843d0407baSopenharmony_ci (clk_divider_flags), (table), (lock)) 6853d0407baSopenharmony_ci/** 6863d0407baSopenharmony_ci * clk_hw_register_divider_table_parent_hw - register a table based divider 6873d0407baSopenharmony_ci * clock with the clock framework 6883d0407baSopenharmony_ci * @dev: device registering this clock 6893d0407baSopenharmony_ci * @name: name of this clock 6903d0407baSopenharmony_ci * @parent_hw: pointer to parent clk 6913d0407baSopenharmony_ci * @flags: framework-specific flags 6923d0407baSopenharmony_ci * @reg: register address to adjust divider 6933d0407baSopenharmony_ci * @shift: number of bits to shift the bitfield 6943d0407baSopenharmony_ci * @width: width of the bitfield 6953d0407baSopenharmony_ci * @clk_divider_flags: divider-specific flags for this clock 6963d0407baSopenharmony_ci * @table: array of divider/value pairs ending with a div set to 0 6973d0407baSopenharmony_ci * @lock: shared register lock for this clock 6983d0407baSopenharmony_ci */ 6993d0407baSopenharmony_ci#define clk_hw_register_divider_table_parent_hw(dev, name, parent_hw, flags, reg, shift, width, clk_divider_flags, \ 7003d0407baSopenharmony_ci table, lock) \ 7013d0407baSopenharmony_ci __clk_hw_register_divider((dev), NULL, (name), NULL, (parent_hw), NULL, (flags), (reg), (shift), (width), \ 7023d0407baSopenharmony_ci (clk_divider_flags), (table), (lock)) 7033d0407baSopenharmony_ci/** 7043d0407baSopenharmony_ci * clk_hw_register_divider_table_parent_data - register a table based divider 7053d0407baSopenharmony_ci * clock with the clock framework 7063d0407baSopenharmony_ci * @dev: device registering this clock 7073d0407baSopenharmony_ci * @name: name of this clock 7083d0407baSopenharmony_ci * @parent_data: parent clk data 7093d0407baSopenharmony_ci * @flags: framework-specific flags 7103d0407baSopenharmony_ci * @reg: register address to adjust divider 7113d0407baSopenharmony_ci * @shift: number of bits to shift the bitfield 7123d0407baSopenharmony_ci * @width: width of the bitfield 7133d0407baSopenharmony_ci * @clk_divider_flags: divider-specific flags for this clock 7143d0407baSopenharmony_ci * @table: array of divider/value pairs ending with a div set to 0 7153d0407baSopenharmony_ci * @lock: shared register lock for this clock 7163d0407baSopenharmony_ci */ 7173d0407baSopenharmony_ci#define clk_hw_register_divider_table_parent_data(dev, name, parent_data, flags, reg, shift, width, clk_divider_flags, \ 7183d0407baSopenharmony_ci table, lock) \ 7193d0407baSopenharmony_ci __clk_hw_register_divider((dev), NULL, (name), NULL, NULL, (parent_data), (flags), (reg), (shift), (width), \ 7203d0407baSopenharmony_ci (clk_divider_flags), (table), (lock)) 7213d0407baSopenharmony_ci 7223d0407baSopenharmony_civoid clk_unregister_divider(struct clk *clk); 7233d0407baSopenharmony_civoid clk_hw_unregister_divider(struct clk_hw *hw); 7243d0407baSopenharmony_ci 7253d0407baSopenharmony_ci/** 7263d0407baSopenharmony_ci * struct clk_mux - multiplexer clock 7273d0407baSopenharmony_ci * 7283d0407baSopenharmony_ci * @hw: handle between common and hardware-specific interfaces 7293d0407baSopenharmony_ci * @reg: register controlling multiplexer 7303d0407baSopenharmony_ci * @table: array of register values corresponding to the parent index 7313d0407baSopenharmony_ci * @shift: shift to multiplexer bit field 7323d0407baSopenharmony_ci * @mask: mask of mutliplexer bit field 7333d0407baSopenharmony_ci * @flags: hardware-specific flags 7343d0407baSopenharmony_ci * @lock: register lock 7353d0407baSopenharmony_ci * 7363d0407baSopenharmony_ci * Clock with multiple selectable parents. Implements .get_parent, .set_parent 7373d0407baSopenharmony_ci * and .recalc_rate 7383d0407baSopenharmony_ci * 7393d0407baSopenharmony_ci * Flags: 7403d0407baSopenharmony_ci * CLK_MUX_INDEX_ONE - register index starts at 1, not 0 7413d0407baSopenharmony_ci * CLK_MUX_INDEX_BIT - register index is a single bit (power of two) 7423d0407baSopenharmony_ci * CLK_MUX_HIWORD_MASK - The mux settings are only in lower 16-bit of this 7433d0407baSopenharmony_ci * register, and mask of mux bits are in higher 16-bit of this register. 7443d0407baSopenharmony_ci * While setting the mux bits, higher 16-bit should also be updated to 7453d0407baSopenharmony_ci * indicate changing mux bits. 7463d0407baSopenharmony_ci * CLK_MUX_READ_ONLY - The mux registers can't be written, only read in the 7473d0407baSopenharmony_ci * .get_parent clk_op. 7483d0407baSopenharmony_ci * CLK_MUX_ROUND_CLOSEST - Use the parent rate that is closest to the desired 7493d0407baSopenharmony_ci * frequency. 7503d0407baSopenharmony_ci * CLK_MUX_BIG_ENDIAN - By default little endian register accesses are used for 7513d0407baSopenharmony_ci * the mux register. Setting this flag makes the register accesses big 7523d0407baSopenharmony_ci * endian. 7533d0407baSopenharmony_ci */ 7543d0407baSopenharmony_cistruct clk_mux { 7553d0407baSopenharmony_ci struct clk_hw hw; 7563d0407baSopenharmony_ci void __iomem *reg; 7573d0407baSopenharmony_ci u32 *table; 7583d0407baSopenharmony_ci u32 mask; 7593d0407baSopenharmony_ci u8 shift; 7603d0407baSopenharmony_ci u8 flags; 7613d0407baSopenharmony_ci spinlock_t *lock; 7623d0407baSopenharmony_ci}; 7633d0407baSopenharmony_ci 7643d0407baSopenharmony_ci#define to_clk_mux(_hw) container_of(_hw, struct clk_mux, hw) 7653d0407baSopenharmony_ci 7663d0407baSopenharmony_ci#define CLK_MUX_INDEX_ONE BIT(0) 7673d0407baSopenharmony_ci#define CLK_MUX_INDEX_BIT BIT(1) 7683d0407baSopenharmony_ci#define CLK_MUX_HIWORD_MASK BIT(2) 7693d0407baSopenharmony_ci#define CLK_MUX_READ_ONLY BIT(3) /* mux can't be changed */ 7703d0407baSopenharmony_ci#define CLK_MUX_ROUND_CLOSEST BIT(4) 7713d0407baSopenharmony_ci#define CLK_MUX_BIG_ENDIAN BIT(5) 7723d0407baSopenharmony_ci 7733d0407baSopenharmony_ciextern const struct clk_ops clk_mux_ops; 7743d0407baSopenharmony_ciextern const struct clk_ops clk_mux_ro_ops; 7753d0407baSopenharmony_ci 7763d0407baSopenharmony_cistruct clk_hw *__clk_hw_register_mux(struct device *dev, struct device_node *np, const char *name, u8 num_parents, 7773d0407baSopenharmony_ci const char *const *parent_names, const struct clk_hw **parent_hws, 7783d0407baSopenharmony_ci const struct clk_parent_data *parent_data, unsigned long flags, void __iomem *reg, 7793d0407baSopenharmony_ci u8 shift, u32 mask, u8 clk_mux_flags, u32 *table, spinlock_t *lock); 7803d0407baSopenharmony_cistruct clk *clk_register_mux_table(struct device *dev, const char *name, const char *const *parent_names, 7813d0407baSopenharmony_ci u8 num_parents, unsigned long flags, void __iomem *reg, u8 shift, u32 mask, 7823d0407baSopenharmony_ci u8 clk_mux_flags, u32 *table, spinlock_t *lock); 7833d0407baSopenharmony_ci 7843d0407baSopenharmony_ci#define clk_register_mux(dev, name, parent_names, num_parents, flags, reg, shift, width, clk_mux_flags, lock) \ 7853d0407baSopenharmony_ci clk_register_mux_table((dev), (name), (parent_names), (num_parents), (flags), (reg), (shift), BIT((width)) - 1, \ 7863d0407baSopenharmony_ci (clk_mux_flags), NULL, (lock)) 7873d0407baSopenharmony_ci#define clk_hw_register_mux_table(dev, name, parent_names, num_parents, flags, reg, shift, mask, clk_mux_flags, table, \ 7883d0407baSopenharmony_ci lock) \ 7893d0407baSopenharmony_ci __clk_hw_register_mux((dev), NULL, (name), (num_parents), (parent_names), NULL, NULL, (flags), (reg), (shift), \ 7903d0407baSopenharmony_ci (mask), (clk_mux_flags), (table), (lock)) 7913d0407baSopenharmony_ci#define clk_hw_register_mux(dev, name, parent_names, num_parents, flags, reg, shift, width, clk_mux_flags, lock) \ 7923d0407baSopenharmony_ci __clk_hw_register_mux((dev), NULL, (name), (num_parents), (parent_names), NULL, NULL, (flags), (reg), (shift), \ 7933d0407baSopenharmony_ci BIT((width)) - 1, (clk_mux_flags), NULL, (lock)) 7943d0407baSopenharmony_ci#define clk_hw_register_mux_hws(dev, name, parent_hws, num_parents, flags, reg, shift, width, clk_mux_flags, lock) \ 7953d0407baSopenharmony_ci __clk_hw_register_mux((dev), NULL, (name), (num_parents), NULL, (parent_hws), NULL, (flags), (reg), (shift), \ 7963d0407baSopenharmony_ci BIT((width)) - 1, (clk_mux_flags), NULL, (lock)) 7973d0407baSopenharmony_ci#define clk_hw_register_mux_parent_data(dev, name, parent_data, num_parents, flags, reg, shift, width, clk_mux_flags, \ 7983d0407baSopenharmony_ci lock) \ 7993d0407baSopenharmony_ci __clk_hw_register_mux((dev), NULL, (name), (num_parents), NULL, NULL, (parent_data), (flags), (reg), (shift), \ 8003d0407baSopenharmony_ci BIT((width)) - 1, (clk_mux_flags), NULL, (lock)) 8013d0407baSopenharmony_ci 8023d0407baSopenharmony_ciint clk_mux_val_to_index(struct clk_hw *hw, u32 *table, unsigned int flags, unsigned int val); 8033d0407baSopenharmony_ciunsigned int clk_mux_index_to_val(u32 *table, unsigned int flags, u8 index); 8043d0407baSopenharmony_ci 8053d0407baSopenharmony_civoid clk_unregister_mux(struct clk *clk); 8063d0407baSopenharmony_civoid clk_hw_unregister_mux(struct clk_hw *hw); 8073d0407baSopenharmony_ci 8083d0407baSopenharmony_civoid of_fixed_factor_clk_setup(struct device_node *node); 8093d0407baSopenharmony_ci 8103d0407baSopenharmony_ci/** 8113d0407baSopenharmony_ci * struct clk_fixed_factor - fixed multiplier and divider clock 8123d0407baSopenharmony_ci * 8133d0407baSopenharmony_ci * @hw: handle between common and hardware-specific interfaces 8143d0407baSopenharmony_ci * @mult: multiplier 8153d0407baSopenharmony_ci * @div: divider 8163d0407baSopenharmony_ci * 8173d0407baSopenharmony_ci * Clock with a fixed multiplier and divider. The output frequency is the 8183d0407baSopenharmony_ci * parent clock rate divided by div and multiplied by mult. 8193d0407baSopenharmony_ci * Implements .recalc_rate, .set_rate and .round_rate 8203d0407baSopenharmony_ci */ 8213d0407baSopenharmony_ci 8223d0407baSopenharmony_cistruct clk_fixed_factor { 8233d0407baSopenharmony_ci struct clk_hw hw; 8243d0407baSopenharmony_ci unsigned int mult; 8253d0407baSopenharmony_ci unsigned int div; 8263d0407baSopenharmony_ci}; 8273d0407baSopenharmony_ci 8283d0407baSopenharmony_ci#define to_clk_fixed_factor(_hw) container_of(_hw, struct clk_fixed_factor, hw) 8293d0407baSopenharmony_ci 8303d0407baSopenharmony_ciextern const struct clk_ops clk_fixed_factor_ops; 8313d0407baSopenharmony_cistruct clk *clk_register_fixed_factor(struct device *dev, const char *name, const char *parent_name, 8323d0407baSopenharmony_ci unsigned long flags, unsigned int mult, unsigned int div); 8333d0407baSopenharmony_civoid clk_unregister_fixed_factor(struct clk *clk); 8343d0407baSopenharmony_cistruct clk_hw *clk_hw_register_fixed_factor(struct device *dev, const char *name, const char *parent_name, 8353d0407baSopenharmony_ci unsigned long flags, unsigned int mult, unsigned int div); 8363d0407baSopenharmony_civoid clk_hw_unregister_fixed_factor(struct clk_hw *hw); 8373d0407baSopenharmony_ci 8383d0407baSopenharmony_ci/** 8393d0407baSopenharmony_ci * struct clk_fractional_divider - adjustable fractional divider clock 8403d0407baSopenharmony_ci * 8413d0407baSopenharmony_ci * @hw: handle between common and hardware-specific interfaces 8423d0407baSopenharmony_ci * @reg: register containing the divider 8433d0407baSopenharmony_ci * @mshift: shift to the numerator bit field 8443d0407baSopenharmony_ci * @mwidth: width of the numerator bit field 8453d0407baSopenharmony_ci * @nshift: shift to the denominator bit field 8463d0407baSopenharmony_ci * @nwidth: width of the denominator bit field 8473d0407baSopenharmony_ci * @lock: register lock 8483d0407baSopenharmony_ci * 8493d0407baSopenharmony_ci * Clock with adjustable fractional divider affecting its output frequency. 8503d0407baSopenharmony_ci * 8513d0407baSopenharmony_ci * Flags: 8523d0407baSopenharmony_ci * CLK_FRAC_DIVIDER_ZERO_BASED - by default the numerator and denominator 8533d0407baSopenharmony_ci * is the value read from the register. If CLK_FRAC_DIVIDER_ZERO_BASED 8543d0407baSopenharmony_ci * is set then the numerator and denominator are both the value read 8553d0407baSopenharmony_ci * plus one. 8563d0407baSopenharmony_ci * CLK_FRAC_DIVIDER_BIG_ENDIAN - By default little endian register accesses are 8573d0407baSopenharmony_ci * used for the divider register. Setting this flag makes the register 8583d0407baSopenharmony_ci * accesses big endian. 8593d0407baSopenharmony_ci * CLK_FRAC_DIVIDER_NO_LIMIT - not need to follow the 20 times limit on 8603d0407baSopenharmony_ci * fractional divider 8613d0407baSopenharmony_ci */ 8623d0407baSopenharmony_cistruct clk_fractional_divider { 8633d0407baSopenharmony_ci struct clk_hw hw; 8643d0407baSopenharmony_ci void __iomem *reg; 8653d0407baSopenharmony_ci u8 mshift; 8663d0407baSopenharmony_ci u8 mwidth; 8673d0407baSopenharmony_ci u32 mmask; 8683d0407baSopenharmony_ci u8 nshift; 8693d0407baSopenharmony_ci u8 nwidth; 8703d0407baSopenharmony_ci u32 nmask; 8713d0407baSopenharmony_ci u8 flags; 8723d0407baSopenharmony_ci unsigned long max_prate; 8733d0407baSopenharmony_ci void (*approximation)(struct clk_hw *hw, unsigned long rate, unsigned long *parent_rate, unsigned long *m, 8743d0407baSopenharmony_ci unsigned long *n); 8753d0407baSopenharmony_ci spinlock_t *lock; 8763d0407baSopenharmony_ci}; 8773d0407baSopenharmony_ci 8783d0407baSopenharmony_ci#define to_clk_fd(_hw) container_of(_hw, struct clk_fractional_divider, hw) 8793d0407baSopenharmony_ci 8803d0407baSopenharmony_ci#define CLK_FRAC_DIVIDER_ZERO_BASED BIT(0) 8813d0407baSopenharmony_ci#define CLK_FRAC_DIVIDER_BIG_ENDIAN BIT(1) 8823d0407baSopenharmony_ci#define CLK_FRAC_DIVIDER_NO_LIMIT BIT(2) 8833d0407baSopenharmony_ci 8843d0407baSopenharmony_ciextern const struct clk_ops clk_fractional_divider_ops; 8853d0407baSopenharmony_cistruct clk *clk_register_fractional_divider(struct device *dev, const char *name, const char *parent_name, 8863d0407baSopenharmony_ci unsigned long flags, void __iomem *reg, u8 mshift, u8 mwidth, u8 nshift, 8873d0407baSopenharmony_ci u8 nwidth, u8 clk_divider_flags, spinlock_t *lock); 8883d0407baSopenharmony_cistruct clk_hw *clk_hw_register_fractional_divider(struct device *dev, const char *name, const char *parent_name, 8893d0407baSopenharmony_ci unsigned long flags, void __iomem *reg, u8 mshift, u8 mwidth, 8903d0407baSopenharmony_ci u8 nshift, u8 nwidth, u8 clk_divider_flags, spinlock_t *lock); 8913d0407baSopenharmony_civoid clk_hw_unregister_fractional_divider(struct clk_hw *hw); 8923d0407baSopenharmony_ci 8933d0407baSopenharmony_ci/** 8943d0407baSopenharmony_ci * struct clk_multiplier - adjustable multiplier clock 8953d0407baSopenharmony_ci * 8963d0407baSopenharmony_ci * @hw: handle between common and hardware-specific interfaces 8973d0407baSopenharmony_ci * @reg: register containing the multiplier 8983d0407baSopenharmony_ci * @shift: shift to the multiplier bit field 8993d0407baSopenharmony_ci * @width: width of the multiplier bit field 9003d0407baSopenharmony_ci * @lock: register lock 9013d0407baSopenharmony_ci * 9023d0407baSopenharmony_ci * Clock with an adjustable multiplier affecting its output frequency. 9033d0407baSopenharmony_ci * Implements .recalc_rate, .set_rate and .round_rate 9043d0407baSopenharmony_ci * 9053d0407baSopenharmony_ci * Flags: 9063d0407baSopenharmony_ci * CLK_MULTIPLIER_ZERO_BYPASS - By default, the multiplier is the value read 9073d0407baSopenharmony_ci * from the register, with 0 being a valid value effectively 9083d0407baSopenharmony_ci * zeroing the output clock rate. If CLK_MULTIPLIER_ZERO_BYPASS is 9093d0407baSopenharmony_ci * set, then a null multiplier will be considered as a bypass, 9103d0407baSopenharmony_ci * leaving the parent rate unmodified. 9113d0407baSopenharmony_ci * CLK_MULTIPLIER_ROUND_CLOSEST - Makes the best calculated divider to be 9123d0407baSopenharmony_ci * rounded to the closest integer instead of the down one. 9133d0407baSopenharmony_ci * CLK_MULTIPLIER_BIG_ENDIAN - By default little endian register accesses are 9143d0407baSopenharmony_ci * used for the multiplier register. Setting this flag makes the register 9153d0407baSopenharmony_ci * accesses big endian. 9163d0407baSopenharmony_ci */ 9173d0407baSopenharmony_cistruct clk_multiplier { 9183d0407baSopenharmony_ci struct clk_hw hw; 9193d0407baSopenharmony_ci void __iomem *reg; 9203d0407baSopenharmony_ci u8 shift; 9213d0407baSopenharmony_ci u8 width; 9223d0407baSopenharmony_ci u8 flags; 9233d0407baSopenharmony_ci spinlock_t *lock; 9243d0407baSopenharmony_ci}; 9253d0407baSopenharmony_ci 9263d0407baSopenharmony_ci#define to_clk_multiplier(_hw) container_of(_hw, struct clk_multiplier, hw) 9273d0407baSopenharmony_ci 9283d0407baSopenharmony_ci#define CLK_MULTIPLIER_ZERO_BYPASS BIT(0) 9293d0407baSopenharmony_ci#define CLK_MULTIPLIER_ROUND_CLOSEST BIT(1) 9303d0407baSopenharmony_ci#define CLK_MULTIPLIER_BIG_ENDIAN BIT(2) 9313d0407baSopenharmony_ci 9323d0407baSopenharmony_ciextern const struct clk_ops clk_multiplier_ops; 9333d0407baSopenharmony_ci 9343d0407baSopenharmony_ci/*** 9353d0407baSopenharmony_ci * struct clk_composite - aggregate clock of mux, divider and gate clocks 9363d0407baSopenharmony_ci * 9373d0407baSopenharmony_ci * @hw: handle between common and hardware-specific interfaces 9383d0407baSopenharmony_ci * @mux_hw: handle between composite and hardware-specific mux clock 9393d0407baSopenharmony_ci * @rate_hw: handle between composite and hardware-specific rate clock 9403d0407baSopenharmony_ci * @gate_hw: handle between composite and hardware-specific gate clock 9413d0407baSopenharmony_ci * @brother_hw: a member of clk_composite who has the common parent clocks 9423d0407baSopenharmony_ci * with another clk_composite, and it's also a handle between 9433d0407baSopenharmony_ci * common and hardware-specific interfaces 9443d0407baSopenharmony_ci * @mux_ops: clock ops for mux 9453d0407baSopenharmony_ci * @rate_ops: clock ops for rate 9463d0407baSopenharmony_ci * @gate_ops: clock ops for gate 9473d0407baSopenharmony_ci */ 9483d0407baSopenharmony_cistruct clk_composite { 9493d0407baSopenharmony_ci struct clk_hw hw; 9503d0407baSopenharmony_ci struct clk_ops ops; 9513d0407baSopenharmony_ci 9523d0407baSopenharmony_ci struct clk_hw *mux_hw; 9533d0407baSopenharmony_ci struct clk_hw *rate_hw; 9543d0407baSopenharmony_ci struct clk_hw *gate_hw; 9553d0407baSopenharmony_ci struct clk_hw *brother_hw; 9563d0407baSopenharmony_ci 9573d0407baSopenharmony_ci const struct clk_ops *mux_ops; 9583d0407baSopenharmony_ci const struct clk_ops *rate_ops; 9593d0407baSopenharmony_ci const struct clk_ops *gate_ops; 9603d0407baSopenharmony_ci}; 9613d0407baSopenharmony_ci 9623d0407baSopenharmony_ci#define to_clk_composite(_hw) container_of(_hw, struct clk_composite, hw) 9633d0407baSopenharmony_ci 9643d0407baSopenharmony_cistruct clk *clk_register_composite(struct device *dev, const char *name, const char *const *parent_names, 9653d0407baSopenharmony_ci int num_parents, struct clk_hw *mux_hw, const struct clk_ops *mux_ops, 9663d0407baSopenharmony_ci struct clk_hw *rate_hw, const struct clk_ops *rate_ops, struct clk_hw *gate_hw, 9673d0407baSopenharmony_ci const struct clk_ops *gate_ops, unsigned long flags); 9683d0407baSopenharmony_cistruct clk *clk_register_composite_pdata(struct device *dev, const char *name, 9693d0407baSopenharmony_ci const struct clk_parent_data *parent_data, int num_parents, 9703d0407baSopenharmony_ci struct clk_hw *mux_hw, const struct clk_ops *mux_ops, struct clk_hw *rate_hw, 9713d0407baSopenharmony_ci const struct clk_ops *rate_ops, struct clk_hw *gate_hw, 9723d0407baSopenharmony_ci const struct clk_ops *gate_ops, unsigned long flags); 9733d0407baSopenharmony_civoid clk_unregister_composite(struct clk *clk); 9743d0407baSopenharmony_cistruct clk_hw *clk_hw_register_composite(struct device *dev, const char *name, const char *const *parent_names, 9753d0407baSopenharmony_ci int num_parents, struct clk_hw *mux_hw, const struct clk_ops *mux_ops, 9763d0407baSopenharmony_ci struct clk_hw *rate_hw, const struct clk_ops *rate_ops, struct clk_hw *gate_hw, 9773d0407baSopenharmony_ci const struct clk_ops *gate_ops, unsigned long flags); 9783d0407baSopenharmony_cistruct clk_hw *clk_hw_register_composite_pdata(struct device *dev, const char *name, 9793d0407baSopenharmony_ci const struct clk_parent_data *parent_data, int num_parents, 9803d0407baSopenharmony_ci struct clk_hw *mux_hw, const struct clk_ops *mux_ops, 9813d0407baSopenharmony_ci struct clk_hw *rate_hw, const struct clk_ops *rate_ops, 9823d0407baSopenharmony_ci struct clk_hw *gate_hw, const struct clk_ops *gate_ops, 9833d0407baSopenharmony_ci unsigned long flags); 9843d0407baSopenharmony_civoid clk_hw_unregister_composite(struct clk_hw *hw); 9853d0407baSopenharmony_ci 9863d0407baSopenharmony_cistruct clk *clk_register(struct device *dev, struct clk_hw *hw); 9873d0407baSopenharmony_cistruct clk *devm_clk_register(struct device *dev, struct clk_hw *hw); 9883d0407baSopenharmony_ci 9893d0407baSopenharmony_ciint __must_check clk_hw_register(struct device *dev, struct clk_hw *hw); 9903d0407baSopenharmony_ciint __must_check devm_clk_hw_register(struct device *dev, struct clk_hw *hw); 9913d0407baSopenharmony_ciint __must_check of_clk_hw_register(struct device_node *node, struct clk_hw *hw); 9923d0407baSopenharmony_ci 9933d0407baSopenharmony_civoid clk_unregister(struct clk *clk); 9943d0407baSopenharmony_civoid devm_clk_unregister(struct device *dev, struct clk *clk); 9953d0407baSopenharmony_ci 9963d0407baSopenharmony_civoid clk_hw_unregister(struct clk_hw *hw); 9973d0407baSopenharmony_civoid devm_clk_hw_unregister(struct device *dev, struct clk_hw *hw); 9983d0407baSopenharmony_ci 9993d0407baSopenharmony_ci/* helper functions */ 10003d0407baSopenharmony_ciconst char *__clk_get_name(const struct clk *clk); 10013d0407baSopenharmony_ciconst char *clk_hw_get_name(const struct clk_hw *hw); 10023d0407baSopenharmony_ci#ifdef CONFIG_COMMON_CLK 10033d0407baSopenharmony_cistruct clk_hw *__clk_get_hw(struct clk *clk); 10043d0407baSopenharmony_ci#else 10053d0407baSopenharmony_cistatic inline struct clk_hw *__clk_get_hw(struct clk *clk) 10063d0407baSopenharmony_ci{ 10073d0407baSopenharmony_ci return (struct clk_hw *)clk; 10083d0407baSopenharmony_ci} 10093d0407baSopenharmony_ci#endif 10103d0407baSopenharmony_ciunsigned int clk_hw_get_num_parents(const struct clk_hw *hw); 10113d0407baSopenharmony_cistruct clk_hw *clk_hw_get_parent(const struct clk_hw *hw); 10123d0407baSopenharmony_cistruct clk_hw *clk_hw_get_parent_by_index(const struct clk_hw *hw, unsigned int index); 10133d0407baSopenharmony_ciint clk_hw_get_parent_index(struct clk_hw *hw); 10143d0407baSopenharmony_ciint clk_hw_set_parent(struct clk_hw *hw, struct clk_hw *new_parent); 10153d0407baSopenharmony_ciunsigned int __clk_get_enable_count(struct clk *clk); 10163d0407baSopenharmony_ciunsigned long clk_hw_get_rate(const struct clk_hw *hw); 10173d0407baSopenharmony_ciunsigned long clk_hw_get_flags(const struct clk_hw *hw); 10183d0407baSopenharmony_ci#define clk_hw_can_set_rate_parent(hw) (clk_hw_get_flags((hw)) & CLK_SET_RATE_PARENT) 10193d0407baSopenharmony_ci 10203d0407baSopenharmony_cibool clk_hw_is_prepared(const struct clk_hw *hw); 10213d0407baSopenharmony_cibool clk_hw_rate_is_protected(const struct clk_hw *hw); 10223d0407baSopenharmony_cibool clk_hw_is_enabled(const struct clk_hw *hw); 10233d0407baSopenharmony_cibool __clk_is_enabled(struct clk *clk); 10243d0407baSopenharmony_cistruct clk *__clk_lookup(const char *name); 10253d0407baSopenharmony_ciint __clk_mux_determine_rate(struct clk_hw *hw, struct clk_rate_request *req); 10263d0407baSopenharmony_ciint __clk_determine_rate(struct clk_hw *core, struct clk_rate_request *req); 10273d0407baSopenharmony_ciint __clk_mux_determine_rate_closest(struct clk_hw *hw, struct clk_rate_request *req); 10283d0407baSopenharmony_ciint clk_mux_determine_rate_flags(struct clk_hw *hw, struct clk_rate_request *req, unsigned long flags); 10293d0407baSopenharmony_civoid clk_hw_reparent(struct clk_hw *hw, struct clk_hw *new_parent); 10303d0407baSopenharmony_civoid clk_hw_set_rate_range(struct clk_hw *hw, unsigned long min_rate, unsigned long max_rate); 10313d0407baSopenharmony_ci 10323d0407baSopenharmony_cistatic inline void __clk_hw_set_clk(struct clk_hw *dst, struct clk_hw *src) 10333d0407baSopenharmony_ci{ 10343d0407baSopenharmony_ci dst->clk = src->clk; 10353d0407baSopenharmony_ci dst->core = src->core; 10363d0407baSopenharmony_ci} 10373d0407baSopenharmony_ci 10383d0407baSopenharmony_cistatic inline long divider_round_rate(struct clk_hw *hw, unsigned long rate, unsigned long *prate, 10393d0407baSopenharmony_ci const struct clk_div_table *table, u8 width, unsigned long flags) 10403d0407baSopenharmony_ci{ 10413d0407baSopenharmony_ci return divider_round_rate_parent(hw, clk_hw_get_parent(hw), rate, prate, table, width, flags); 10423d0407baSopenharmony_ci} 10433d0407baSopenharmony_ci 10443d0407baSopenharmony_cistatic inline long divider_ro_round_rate(struct clk_hw *hw, unsigned long rate, unsigned long *prate, 10453d0407baSopenharmony_ci const struct clk_div_table *table, u8 width, unsigned long flags, 10463d0407baSopenharmony_ci unsigned int val) 10473d0407baSopenharmony_ci{ 10483d0407baSopenharmony_ci return divider_ro_round_rate_parent(hw, clk_hw_get_parent(hw), rate, prate, table, width, flags, val); 10493d0407baSopenharmony_ci} 10503d0407baSopenharmony_ci 10513d0407baSopenharmony_ci/* 10523d0407baSopenharmony_ci * clock api without lock protection 10533d0407baSopenharmony_ci */ 10543d0407baSopenharmony_ciunsigned long clk_hw_round_rate(struct clk_hw *hw, unsigned long rate); 10553d0407baSopenharmony_ci 10563d0407baSopenharmony_cistruct clk_onecell_data { 10573d0407baSopenharmony_ci struct clk **clks; 10583d0407baSopenharmony_ci unsigned int clk_num; 10593d0407baSopenharmony_ci}; 10603d0407baSopenharmony_ci 10613d0407baSopenharmony_cistruct clk_hw_onecell_data { 10623d0407baSopenharmony_ci unsigned int num; 10633d0407baSopenharmony_ci struct clk_hw *hws[]; 10643d0407baSopenharmony_ci}; 10653d0407baSopenharmony_ci 10663d0407baSopenharmony_ci#define CLK_OF_DECLARE(name, compat, fn) OF_DECLARE_1(clk, name, compat, fn) 10673d0407baSopenharmony_ci 10683d0407baSopenharmony_ci/* 10693d0407baSopenharmony_ci * Use this macro when you have a driver that requires two initialization 10703d0407baSopenharmony_ci * routines, one at of_clk_init(), and one at platform device probe 10713d0407baSopenharmony_ci */ 10723d0407baSopenharmony_ci#define CLK_OF_DECLARE_DRIVER(name, compat, fn) \ 10733d0407baSopenharmony_ci static void __init name##_of_clk_init_driver(struct device_node *np) \ 10743d0407baSopenharmony_ci { \ 10753d0407baSopenharmony_ci of_node_clear_flag(np, OF_POPULATED); \ 10763d0407baSopenharmony_ci fn(np); \ 10773d0407baSopenharmony_ci } \ 10783d0407baSopenharmony_ci OF_DECLARE_1(clk, name, compat, name##_of_clk_init_driver) 10793d0407baSopenharmony_ci 10803d0407baSopenharmony_ci#define CLK_HW_INIT(_name, _parent, _ops, _flags) \ 10813d0407baSopenharmony_ci (&(struct clk_init_data) { \ 10823d0407baSopenharmony_ci .flags = (_flags), \ 10833d0407baSopenharmony_ci .name = (_name), \ 10843d0407baSopenharmony_ci .parent_names = (const char *[]) {_parent}, \ 10853d0407baSopenharmony_ci .num_parents = 1, \ 10863d0407baSopenharmony_ci .ops = (_ops), \ 10873d0407baSopenharmony_ci }) 10883d0407baSopenharmony_ci 10893d0407baSopenharmony_ci#define CLK_HW_INIT_HW(_name, _parent, _ops, _flags) \ 10903d0407baSopenharmony_ci (&(struct clk_init_data) { \ 10913d0407baSopenharmony_ci .flags = (_flags), \ 10923d0407baSopenharmony_ci .name = (_name), \ 10933d0407baSopenharmony_ci .parent_hws = (const struct clk_hw *[]) {_parent}, \ 10943d0407baSopenharmony_ci .num_parents = 1, \ 10953d0407baSopenharmony_ci .ops = (_ops), \ 10963d0407baSopenharmony_ci }) 10973d0407baSopenharmony_ci 10983d0407baSopenharmony_ci/* 10993d0407baSopenharmony_ci * This macro is intended for drivers to be able to share the otherwise 11003d0407baSopenharmony_ci * individual struct clk_hw[] compound literals created by the compiler 11013d0407baSopenharmony_ci * when using CLK_HW_INIT_HW. It does NOT support multiple parents. 11023d0407baSopenharmony_ci */ 11033d0407baSopenharmony_ci#define CLK_HW_INIT_HWS(_name, _parent, _ops, _flags) \ 11043d0407baSopenharmony_ci (&(struct clk_init_data) { \ 11053d0407baSopenharmony_ci .flags = (_flags), \ 11063d0407baSopenharmony_ci .name = (_name), \ 11073d0407baSopenharmony_ci .parent_hws = (_parent), \ 11083d0407baSopenharmony_ci .num_parents = 1, \ 11093d0407baSopenharmony_ci .ops = (_ops), \ 11103d0407baSopenharmony_ci }) 11113d0407baSopenharmony_ci 11123d0407baSopenharmony_ci#define CLK_HW_INIT_FW_NAME(_name, _parent, _ops, _flags) \ 11133d0407baSopenharmony_ci (&(struct clk_init_data) { \ 11143d0407baSopenharmony_ci .flags = (_flags), \ 11153d0407baSopenharmony_ci .name = (_name), \ 11163d0407baSopenharmony_ci .parent_data = \ 11173d0407baSopenharmony_ci (const struct clk_parent_data[]) { \ 11183d0407baSopenharmony_ci {.fw_name = _parent}, \ 11193d0407baSopenharmony_ci }, \ 11203d0407baSopenharmony_ci .num_parents = 1, \ 11213d0407baSopenharmony_ci .ops = (_ops), \ 11223d0407baSopenharmony_ci }) 11233d0407baSopenharmony_ci 11243d0407baSopenharmony_ci#define CLK_HW_INIT_PARENTS(_name, _parents, _ops, _flags) \ 11253d0407baSopenharmony_ci (&(struct clk_init_data) { \ 11263d0407baSopenharmony_ci .flags = (_flags), \ 11273d0407baSopenharmony_ci .name = (_name), \ 11283d0407baSopenharmony_ci .parent_names = (_parents), \ 11293d0407baSopenharmony_ci .num_parents = ARRAY_SIZE(_parents), \ 11303d0407baSopenharmony_ci .ops = (_ops), \ 11313d0407baSopenharmony_ci }) 11323d0407baSopenharmony_ci 11333d0407baSopenharmony_ci#define CLK_HW_INIT_PARENTS_HW(_name, _parents, _ops, _flags) \ 11343d0407baSopenharmony_ci (&(struct clk_init_data) { \ 11353d0407baSopenharmony_ci .flags = (_flags), \ 11363d0407baSopenharmony_ci .name = (_name), \ 11373d0407baSopenharmony_ci .parent_hws = (_parents), \ 11383d0407baSopenharmony_ci .num_parents = ARRAY_SIZE(_parents), \ 11393d0407baSopenharmony_ci .ops = (_ops), \ 11403d0407baSopenharmony_ci }) 11413d0407baSopenharmony_ci 11423d0407baSopenharmony_ci#define CLK_HW_INIT_PARENTS_DATA(_name, _parents, _ops, _flags) \ 11433d0407baSopenharmony_ci (&(struct clk_init_data) { \ 11443d0407baSopenharmony_ci .flags = (_flags), \ 11453d0407baSopenharmony_ci .name = (_name), \ 11463d0407baSopenharmony_ci .parent_data = (_parents), \ 11473d0407baSopenharmony_ci .num_parents = ARRAY_SIZE(_parents), \ 11483d0407baSopenharmony_ci .ops = (_ops), \ 11493d0407baSopenharmony_ci }) 11503d0407baSopenharmony_ci 11513d0407baSopenharmony_ci#define CLK_HW_INIT_NO_PARENT(_name, _ops, _flags) \ 11523d0407baSopenharmony_ci (&(struct clk_init_data) { \ 11533d0407baSopenharmony_ci .flags = (_flags), \ 11543d0407baSopenharmony_ci .name = (_name), \ 11553d0407baSopenharmony_ci .parent_names = NULL, \ 11563d0407baSopenharmony_ci .num_parents = 0, \ 11573d0407baSopenharmony_ci .ops = (_ops), \ 11583d0407baSopenharmony_ci }) 11593d0407baSopenharmony_ci 11603d0407baSopenharmony_ci#define CLK_FIXED_FACTOR(_struct, _name, _parent, _div, _mult, _flags) \ 11613d0407baSopenharmony_ci struct clk_fixed_factor _struct = { \ 11623d0407baSopenharmony_ci .div = (_div), \ 11633d0407baSopenharmony_ci .mult = (_mult), \ 11643d0407baSopenharmony_ci .hw.init = CLK_HW_INIT(_name, _parent, &clk_fixed_factor_ops, _flags), \ 11653d0407baSopenharmony_ci } 11663d0407baSopenharmony_ci 11673d0407baSopenharmony_ci#define CLK_FIXED_FACTOR_HW(_struct, _name, _parent, _div, _mult, _flags) \ 11683d0407baSopenharmony_ci struct clk_fixed_factor _struct = { \ 11693d0407baSopenharmony_ci .div = (_div), \ 11703d0407baSopenharmony_ci .mult = _mult, \ 11713d0407baSopenharmony_ci .hw.init = CLK_HW_INIT_HW(_name, _parent, &clk_fixed_factor_ops, _flags), \ 11723d0407baSopenharmony_ci } 11733d0407baSopenharmony_ci 11743d0407baSopenharmony_ci/* 11753d0407baSopenharmony_ci * This macro allows the driver to reuse the _parent array for multiple 11763d0407baSopenharmony_ci * fixed factor clk declarations. 11773d0407baSopenharmony_ci */ 11783d0407baSopenharmony_ci#define CLK_FIXED_FACTOR_HWS(_struct, _name, _parent, _div, _mult, _flags) \ 11793d0407baSopenharmony_ci struct clk_fixed_factor _struct = { \ 11803d0407baSopenharmony_ci .div = (_div), \ 11813d0407baSopenharmony_ci .mult = (_mult), \ 11823d0407baSopenharmony_ci .hw.init = CLK_HW_INIT_HWS(_name, _parent, &clk_fixed_factor_ops, _flags), \ 11833d0407baSopenharmony_ci } 11843d0407baSopenharmony_ci 11853d0407baSopenharmony_ci#define CLK_FIXED_FACTOR_FW_NAME(_struct, _name, _parent, _div, _mult, _flags) \ 11863d0407baSopenharmony_ci struct clk_fixed_factor _struct = { \ 11873d0407baSopenharmony_ci .div = (_div), \ 11883d0407baSopenharmony_ci .mult = (_mult), \ 11893d0407baSopenharmony_ci .hw.init = CLK_HW_INIT_FW_NAME(_name, _parent, &clk_fixed_factor_ops, _flags), \ 11903d0407baSopenharmony_ci } 11913d0407baSopenharmony_ci 11923d0407baSopenharmony_ci#ifdef CONFIG_OF 11933d0407baSopenharmony_ciint of_clk_add_provider(struct device_node *np, struct clk *(*clk_src_get)(struct of_phandle_args *args, void *data), 11943d0407baSopenharmony_ci void *data); 11953d0407baSopenharmony_ciint of_clk_add_hw_provider(struct device_node *np, struct clk_hw *(*get)(struct of_phandle_args *clkspec, void *data), 11963d0407baSopenharmony_ci void *data); 11973d0407baSopenharmony_ciint devm_of_clk_add_hw_provider(struct device *dev, struct clk_hw *(*get)(struct of_phandle_args *clkspec, void *data), 11983d0407baSopenharmony_ci void *data); 11993d0407baSopenharmony_civoid of_clk_del_provider(struct device_node *np); 12003d0407baSopenharmony_civoid devm_of_clk_del_provider(struct device *dev); 12013d0407baSopenharmony_cistruct clk *of_clk_src_simple_get(struct of_phandle_args *clkspec, void *data); 12023d0407baSopenharmony_cistruct clk_hw *of_clk_hw_simple_get(struct of_phandle_args *clkspec, void *data); 12033d0407baSopenharmony_cistruct clk *of_clk_src_onecell_get(struct of_phandle_args *clkspec, void *data); 12043d0407baSopenharmony_cistruct clk_hw *of_clk_hw_onecell_get(struct of_phandle_args *clkspec, void *data); 12053d0407baSopenharmony_ciint of_clk_parent_fill(struct device_node *np, const char **parents, unsigned int size); 12063d0407baSopenharmony_ciint of_clk_detect_critical(struct device_node *np, int index, unsigned long *flags); 12073d0407baSopenharmony_ci 12083d0407baSopenharmony_ci#else /* !CONFIG_OF */ 12093d0407baSopenharmony_ci 12103d0407baSopenharmony_cistatic inline int of_clk_add_provider(struct device_node *np, 12113d0407baSopenharmony_ci struct clk *(*clk_src_get)(struct of_phandle_args *args, void *data), void *data) 12123d0407baSopenharmony_ci{ 12133d0407baSopenharmony_ci return 0; 12143d0407baSopenharmony_ci} 12153d0407baSopenharmony_cistatic inline int of_clk_add_hw_provider(struct device_node *np, 12163d0407baSopenharmony_ci struct clk_hw *(*get)(struct of_phandle_args *clkspec, void *data), void *data) 12173d0407baSopenharmony_ci{ 12183d0407baSopenharmony_ci return 0; 12193d0407baSopenharmony_ci} 12203d0407baSopenharmony_cistatic inline int devm_of_clk_add_hw_provider(struct device *dev, 12213d0407baSopenharmony_ci struct clk_hw *(*get)(struct of_phandle_args *clkspec, void *data), 12223d0407baSopenharmony_ci void *data) 12233d0407baSopenharmony_ci{ 12243d0407baSopenharmony_ci return 0; 12253d0407baSopenharmony_ci} 12263d0407baSopenharmony_cistatic inline void of_clk_del_provider(struct device_node *np) 12273d0407baSopenharmony_ci{ 12283d0407baSopenharmony_ci} 12293d0407baSopenharmony_cistatic inline void devm_of_clk_del_provider(struct device *dev) 12303d0407baSopenharmony_ci{ 12313d0407baSopenharmony_ci} 12323d0407baSopenharmony_cistatic inline struct clk *of_clk_src_simple_get(struct of_phandle_args *clkspec, void *data) 12333d0407baSopenharmony_ci{ 12343d0407baSopenharmony_ci return ERR_PTR(-ENOENT); 12353d0407baSopenharmony_ci} 12363d0407baSopenharmony_cistatic inline struct clk_hw *of_clk_hw_simple_get(struct of_phandle_args *clkspec, void *data) 12373d0407baSopenharmony_ci{ 12383d0407baSopenharmony_ci return ERR_PTR(-ENOENT); 12393d0407baSopenharmony_ci} 12403d0407baSopenharmony_cistatic inline struct clk *of_clk_src_onecell_get(struct of_phandle_args *clkspec, void *data) 12413d0407baSopenharmony_ci{ 12423d0407baSopenharmony_ci return ERR_PTR(-ENOENT); 12433d0407baSopenharmony_ci} 12443d0407baSopenharmony_cistatic inline struct clk_hw *of_clk_hw_onecell_get(struct of_phandle_args *clkspec, void *data) 12453d0407baSopenharmony_ci{ 12463d0407baSopenharmony_ci return ERR_PTR(-ENOENT); 12473d0407baSopenharmony_ci} 12483d0407baSopenharmony_cistatic inline int of_clk_parent_fill(struct device_node *np, const char **parents, unsigned int size) 12493d0407baSopenharmony_ci{ 12503d0407baSopenharmony_ci return 0; 12513d0407baSopenharmony_ci} 12523d0407baSopenharmony_cistatic inline int of_clk_detect_critical(struct device_node *np, int index, unsigned long *flags) 12533d0407baSopenharmony_ci{ 12543d0407baSopenharmony_ci return 0; 12553d0407baSopenharmony_ci} 12563d0407baSopenharmony_ci#endif /* CONFIG_OF */ 12573d0407baSopenharmony_ci 12583d0407baSopenharmony_civoid clk_gate_restore_context(struct clk_hw *hw); 12593d0407baSopenharmony_ci 12603d0407baSopenharmony_ci#endif /* CLK_PROVIDER_H */ 1261