| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 1 | /* | 
 | 2 |  *  linux/include/linux/clk-provider.h | 
 | 3 |  * | 
 | 4 |  *  Copyright (c) 2010-2011 Jeremy Kerr <jeremy.kerr@canonical.com> | 
 | 5 |  *  Copyright (C) 2011-2012 Linaro Ltd <mturquette@linaro.org> | 
 | 6 |  * | 
 | 7 |  * This program is free software; you can redistribute it and/or modify | 
 | 8 |  * it under the terms of the GNU General Public License version 2 as | 
 | 9 |  * published by the Free Software Foundation. | 
 | 10 |  */ | 
 | 11 | #ifndef __LINUX_CLK_PROVIDER_H | 
 | 12 | #define __LINUX_CLK_PROVIDER_H | 
 | 13 |  | 
| Gerhard Sittig | aa514ce | 2013-07-22 14:14:40 +0200 | [diff] [blame] | 14 | #include <linux/io.h> | 
| Maxime Ripard | 355bb16 | 2014-08-30 21:18:00 +0200 | [diff] [blame] | 15 | #include <linux/of.h> | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 16 |  | 
 | 17 | #ifdef CONFIG_COMMON_CLK | 
 | 18 |  | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 19 | /* | 
 | 20 |  * flags used across common struct clk.  these flags should only affect the | 
 | 21 |  * top-level framework.  custom flags for dealing with hardware specifics | 
 | 22 |  * belong in struct clk_foo | 
 | 23 |  */ | 
 | 24 | #define CLK_SET_RATE_GATE	BIT(0) /* must be gated across rate change */ | 
 | 25 | #define CLK_SET_PARENT_GATE	BIT(1) /* must be gated across re-parent */ | 
 | 26 | #define CLK_SET_RATE_PARENT	BIT(2) /* propagate rate change up one level */ | 
 | 27 | #define CLK_IGNORE_UNUSED	BIT(3) /* do not gate even if unused */ | 
| Stephen Boyd | b9610e7 | 2016-06-01 14:56:57 -0700 | [diff] [blame] | 28 | 				/* unused */ | 
| Rajendra Nayak | f7d8caa | 2012-06-01 14:02:47 +0530 | [diff] [blame] | 29 | #define CLK_IS_BASIC		BIT(5) /* Basic clk, can't do a to_clk_foo() */ | 
| Ulf Hansson | a093bde | 2012-08-31 14:21:28 +0200 | [diff] [blame] | 30 | #define CLK_GET_RATE_NOCACHE	BIT(6) /* do not use the cached clk rate */ | 
| James Hogan | 819c1de | 2013-07-29 12:25:01 +0100 | [diff] [blame] | 31 | #define CLK_SET_RATE_NO_REPARENT BIT(7) /* don't re-parent on rate change */ | 
| Boris BREZILLON | 5279fc4 | 2013-12-21 10:34:47 +0100 | [diff] [blame] | 32 | #define CLK_GET_ACCURACY_NOCACHE BIT(8) /* do not use the cached clk accuracy */ | 
| Bartlomiej Zolnierkiewicz | d8d9198 | 2015-04-03 18:43:44 +0200 | [diff] [blame] | 33 | #define CLK_RECALC_NEW_RATES	BIT(9) /* recalc rates after notifications */ | 
| Heiko Stuebner | 2eb8c71 | 2015-12-22 22:27:58 +0100 | [diff] [blame] | 34 | #define CLK_SET_RATE_UNGATE	BIT(10) /* clock needs to run to set rate */ | 
| Lee Jones | 32b9b10 | 2016-02-11 13:19:09 -0800 | [diff] [blame] | 35 | #define CLK_IS_CRITICAL		BIT(11) /* do not gate, ever */ | 
| Dong Aisheng | a4b3518 | 2016-06-30 17:31:13 +0800 | [diff] [blame] | 36 | /* parents need enable during gate/ungate, set rate and re-parent */ | 
 | 37 | #define CLK_OPS_PARENT_ENABLE	BIT(12) | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 38 |  | 
| Stephen Boyd | 61ae765 | 2015-06-22 17:13:49 -0700 | [diff] [blame] | 39 | struct clk; | 
| Saravana Kannan | 0197b3e | 2012-04-25 22:58:56 -0700 | [diff] [blame] | 40 | struct clk_hw; | 
| Tomeu Vizoso | 035a61c | 2015-01-23 12:03:30 +0100 | [diff] [blame] | 41 | struct clk_core; | 
| Alex Elder | c646cbf | 2014-03-21 06:43:56 -0500 | [diff] [blame] | 42 | struct dentry; | 
| Saravana Kannan | 0197b3e | 2012-04-25 22:58:56 -0700 | [diff] [blame] | 43 |  | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 44 | /** | 
| Boris Brezillon | 0817b62 | 2015-07-07 20:48:08 +0200 | [diff] [blame] | 45 |  * struct clk_rate_request - Structure encoding the clk constraints that | 
 | 46 |  * a clock user might require. | 
 | 47 |  * | 
 | 48 |  * @rate:		Requested clock rate. This field will be adjusted by | 
 | 49 |  *			clock drivers according to hardware capabilities. | 
 | 50 |  * @min_rate:		Minimum rate imposed by clk users. | 
| Masahiro Yamada | 1971dfb | 2015-11-05 18:02:34 +0900 | [diff] [blame] | 51 |  * @max_rate:		Maximum rate imposed by clk users. | 
| Boris Brezillon | 0817b62 | 2015-07-07 20:48:08 +0200 | [diff] [blame] | 52 |  * @best_parent_rate:	The best parent rate a parent can provide to fulfill the | 
 | 53 |  *			requested constraints. | 
 | 54 |  * @best_parent_hw:	The most appropriate parent clock that fulfills the | 
 | 55 |  *			requested constraints. | 
 | 56 |  * | 
 | 57 |  */ | 
 | 58 | struct clk_rate_request { | 
 | 59 | 	unsigned long rate; | 
 | 60 | 	unsigned long min_rate; | 
 | 61 | 	unsigned long max_rate; | 
 | 62 | 	unsigned long best_parent_rate; | 
 | 63 | 	struct clk_hw *best_parent_hw; | 
 | 64 | }; | 
 | 65 |  | 
 | 66 | /** | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 67 |  * struct clk_ops -  Callback operations for hardware clocks; these are to | 
 | 68 |  * be provided by the clock implementation, and will be called by drivers | 
 | 69 |  * through the clk_* api. | 
 | 70 |  * | 
 | 71 |  * @prepare:	Prepare the clock for enabling. This must not return until | 
| Geert Uytterhoeven | 725b418 | 2014-04-22 15:11:41 +0200 | [diff] [blame] | 72 |  *		the clock is fully prepared, and it's safe to call clk_enable. | 
 | 73 |  *		This callback is intended to allow clock implementations to | 
 | 74 |  *		do any initialisation that may sleep. Called with | 
 | 75 |  *		prepare_lock held. | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 76 |  * | 
 | 77 |  * @unprepare:	Release the clock from its prepared state. This will typically | 
| Geert Uytterhoeven | 725b418 | 2014-04-22 15:11:41 +0200 | [diff] [blame] | 78 |  *		undo any work done in the @prepare callback. Called with | 
 | 79 |  *		prepare_lock held. | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 80 |  * | 
| Ulf Hansson | 3d6ee28 | 2013-03-12 20:26:02 +0100 | [diff] [blame] | 81 |  * @is_prepared: Queries the hardware to determine if the clock is prepared. | 
 | 82 |  *		This function is allowed to sleep. Optional, if this op is not | 
 | 83 |  *		set then the prepare count will be used. | 
 | 84 |  * | 
| Ulf Hansson | 3cc8247 | 2013-03-12 20:26:04 +0100 | [diff] [blame] | 85 |  * @unprepare_unused: Unprepare the clock atomically.  Only called from | 
 | 86 |  *		clk_disable_unused for prepare clocks with special needs. | 
 | 87 |  *		Called with prepare mutex held. This function may sleep. | 
 | 88 |  * | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 89 |  * @enable:	Enable the clock atomically. This must not return until the | 
| Geert Uytterhoeven | 725b418 | 2014-04-22 15:11:41 +0200 | [diff] [blame] | 90 |  *		clock is generating a valid clock signal, usable by consumer | 
 | 91 |  *		devices. Called with enable_lock held. This function must not | 
 | 92 |  *		sleep. | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 93 |  * | 
 | 94 |  * @disable:	Disable the clock atomically. Called with enable_lock held. | 
| Geert Uytterhoeven | 725b418 | 2014-04-22 15:11:41 +0200 | [diff] [blame] | 95 |  *		This function must not sleep. | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 96 |  * | 
| Stephen Boyd | 119c712 | 2012-10-03 23:38:53 -0700 | [diff] [blame] | 97 |  * @is_enabled:	Queries the hardware to determine if the clock is enabled. | 
| Geert Uytterhoeven | 725b418 | 2014-04-22 15:11:41 +0200 | [diff] [blame] | 98 |  *		This function must not sleep. Optional, if this op is not | 
 | 99 |  *		set then the enable count will be used. | 
| Stephen Boyd | 119c712 | 2012-10-03 23:38:53 -0700 | [diff] [blame] | 100 |  * | 
| Mike Turquette | 7c045a5 | 2012-12-04 11:00:35 -0800 | [diff] [blame] | 101 |  * @disable_unused: Disable the clock atomically.  Only called from | 
 | 102 |  *		clk_disable_unused for gate clocks with special needs. | 
 | 103 |  *		Called with enable_lock held.  This function must not | 
 | 104 |  *		sleep. | 
 | 105 |  * | 
| Stephen Boyd | 7ce3e8c | 2012-10-03 23:38:54 -0700 | [diff] [blame] | 106 |  * @recalc_rate	Recalculate the rate of this clock, by querying hardware. The | 
| Geert Uytterhoeven | 725b418 | 2014-04-22 15:11:41 +0200 | [diff] [blame] | 107 |  *		parent rate is an input parameter.  It is up to the caller to | 
 | 108 |  *		ensure that the prepare_mutex is held across this call. | 
 | 109 |  *		Returns the calculated rate.  Optional, but recommended - if | 
 | 110 |  *		this op is not set then clock rate will be initialized to 0. | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 111 |  * | 
 | 112 |  * @round_rate:	Given a target rate as input, returns the closest rate actually | 
| Geert Uytterhoeven | 54e7301 | 2014-04-22 15:11:42 +0200 | [diff] [blame] | 113 |  *		supported by the clock. The parent rate is an input/output | 
 | 114 |  *		parameter. | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 115 |  * | 
| James Hogan | 71472c0 | 2013-07-29 12:25:00 +0100 | [diff] [blame] | 116 |  * @determine_rate: Given a target rate as input, returns the closest rate | 
 | 117 |  *		actually supported by the clock, and optionally the parent clock | 
 | 118 |  *		that should be used to provide the clock rate. | 
 | 119 |  * | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 120 |  * @set_parent:	Change the input source of this clock; for clocks with multiple | 
| Geert Uytterhoeven | 54e7301 | 2014-04-22 15:11:42 +0200 | [diff] [blame] | 121 |  *		possible parents specify a new parent by passing in the index | 
 | 122 |  *		as a u8 corresponding to the parent in either the .parent_names | 
 | 123 |  *		or .parents arrays.  This function in affect translates an | 
 | 124 |  *		array index into the value programmed into the hardware. | 
 | 125 |  *		Returns 0 on success, -EERROR otherwise. | 
 | 126 |  * | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 127 |  * @get_parent:	Queries the hardware to determine the parent of a clock.  The | 
| Geert Uytterhoeven | 725b418 | 2014-04-22 15:11:41 +0200 | [diff] [blame] | 128 |  *		return value is a u8 which specifies the index corresponding to | 
 | 129 |  *		the parent clock.  This index can be applied to either the | 
 | 130 |  *		.parent_names or .parents arrays.  In short, this function | 
 | 131 |  *		translates the parent value read from hardware into an array | 
 | 132 |  *		index.  Currently only called when the clock is initialized by | 
 | 133 |  *		__clk_init.  This callback is mandatory for clocks with | 
 | 134 |  *		multiple parents.  It is optional (and unnecessary) for clocks | 
 | 135 |  *		with 0 or 1 parents. | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 136 |  * | 
| Shawn Guo | 1c0035d | 2012-04-12 20:50:18 +0800 | [diff] [blame] | 137 |  * @set_rate:	Change the rate of this clock. The requested rate is specified | 
 | 138 |  *		by the second argument, which should typically be the return | 
 | 139 |  *		of .round_rate call.  The third argument gives the parent rate | 
 | 140 |  *		which is likely helpful for most .set_rate implementation. | 
 | 141 |  *		Returns 0 on success, -EERROR otherwise. | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 142 |  * | 
| Stephen Boyd | 3fa2252 | 2014-01-15 10:47:22 -0800 | [diff] [blame] | 143 |  * @set_rate_and_parent: Change the rate and the parent of this clock. The | 
 | 144 |  *		requested rate is specified by the second argument, which | 
 | 145 |  *		should typically be the return of .round_rate call.  The | 
 | 146 |  *		third argument gives the parent rate which is likely helpful | 
 | 147 |  *		for most .set_rate_and_parent implementation. The fourth | 
 | 148 |  *		argument gives the parent index. This callback is optional (and | 
 | 149 |  *		unnecessary) for clocks with 0 or 1 parents as well as | 
 | 150 |  *		for clocks that can tolerate switching the rate and the parent | 
 | 151 |  *		separately via calls to .set_parent and .set_rate. | 
 | 152 |  *		Returns 0 on success, -EERROR otherwise. | 
 | 153 |  * | 
| Geert Uytterhoeven | 54e7301 | 2014-04-22 15:11:42 +0200 | [diff] [blame] | 154 |  * @recalc_accuracy: Recalculate the accuracy of this clock. The clock accuracy | 
 | 155 |  *		is expressed in ppb (parts per billion). The parent accuracy is | 
 | 156 |  *		an input parameter. | 
 | 157 |  *		Returns the calculated accuracy.  Optional - if	this op is not | 
 | 158 |  *		set then clock accuracy will be initialized to parent accuracy | 
 | 159 |  *		or 0 (perfect clock) if clock has no parent. | 
 | 160 |  * | 
| Maxime Ripard | 9824cf7 | 2014-07-14 13:53:27 +0200 | [diff] [blame] | 161 |  * @get_phase:	Queries the hardware to get the current phase of a clock. | 
 | 162 |  *		Returned values are 0-359 degrees on success, negative | 
 | 163 |  *		error codes on failure. | 
 | 164 |  * | 
| Mike Turquette | e59c537 | 2014-02-18 21:21:25 -0800 | [diff] [blame] | 165 |  * @set_phase:	Shift the phase this clock signal in degrees specified | 
 | 166 |  *		by the second argument. Valid values for degrees are | 
 | 167 |  *		0-359. Return 0 on success, otherwise -EERROR. | 
 | 168 |  * | 
| Geert Uytterhoeven | 54e7301 | 2014-04-22 15:11:42 +0200 | [diff] [blame] | 169 |  * @init:	Perform platform-specific initialization magic. | 
 | 170 |  *		This is not not used by any of the basic clock types. | 
 | 171 |  *		Please consider other ways of solving initialization problems | 
 | 172 |  *		before using this callback, as its use is discouraged. | 
 | 173 |  * | 
| Alex Elder | c646cbf | 2014-03-21 06:43:56 -0500 | [diff] [blame] | 174 |  * @debug_init:	Set up type-specific debugfs entries for this clock.  This | 
 | 175 |  *		is called once, after the debugfs directory entry for this | 
 | 176 |  *		clock has been created.  The dentry pointer representing that | 
 | 177 |  *		directory is provided as an argument.  Called with | 
 | 178 |  *		prepare_lock held.  Returns 0 on success, -EERROR otherwise. | 
 | 179 |  * | 
| Stephen Boyd | 3fa2252 | 2014-01-15 10:47:22 -0800 | [diff] [blame] | 180 |  * | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 181 |  * The clk_enable/clk_disable and clk_prepare/clk_unprepare pairs allow | 
 | 182 |  * implementations to split any work between atomic (enable) and sleepable | 
 | 183 |  * (prepare) contexts.  If enabling a clock requires code that might sleep, | 
 | 184 |  * this must be done in clk_prepare.  Clock enable code that will never be | 
| Stephen Boyd | 7ce3e8c | 2012-10-03 23:38:54 -0700 | [diff] [blame] | 185 |  * called in a sleepable context may be implemented in clk_enable. | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 186 |  * | 
 | 187 |  * Typically, drivers will call clk_prepare when a clock may be needed later | 
 | 188 |  * (eg. when a device is opened), and clk_enable when the clock is actually | 
 | 189 |  * required (eg. from an interrupt). Note that clk_prepare MUST have been | 
 | 190 |  * called before clk_enable. | 
 | 191 |  */ | 
 | 192 | struct clk_ops { | 
 | 193 | 	int		(*prepare)(struct clk_hw *hw); | 
 | 194 | 	void		(*unprepare)(struct clk_hw *hw); | 
| Ulf Hansson | 3d6ee28 | 2013-03-12 20:26:02 +0100 | [diff] [blame] | 195 | 	int		(*is_prepared)(struct clk_hw *hw); | 
| Ulf Hansson | 3cc8247 | 2013-03-12 20:26:04 +0100 | [diff] [blame] | 196 | 	void		(*unprepare_unused)(struct clk_hw *hw); | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 197 | 	int		(*enable)(struct clk_hw *hw); | 
 | 198 | 	void		(*disable)(struct clk_hw *hw); | 
 | 199 | 	int		(*is_enabled)(struct clk_hw *hw); | 
| Mike Turquette | 7c045a5 | 2012-12-04 11:00:35 -0800 | [diff] [blame] | 200 | 	void		(*disable_unused)(struct clk_hw *hw); | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 201 | 	unsigned long	(*recalc_rate)(struct clk_hw *hw, | 
 | 202 | 					unsigned long parent_rate); | 
| Geert Uytterhoeven | 54e7301 | 2014-04-22 15:11:42 +0200 | [diff] [blame] | 203 | 	long		(*round_rate)(struct clk_hw *hw, unsigned long rate, | 
 | 204 | 					unsigned long *parent_rate); | 
| Boris Brezillon | 0817b62 | 2015-07-07 20:48:08 +0200 | [diff] [blame] | 205 | 	int		(*determine_rate)(struct clk_hw *hw, | 
 | 206 | 					  struct clk_rate_request *req); | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 207 | 	int		(*set_parent)(struct clk_hw *hw, u8 index); | 
 | 208 | 	u8		(*get_parent)(struct clk_hw *hw); | 
| Geert Uytterhoeven | 54e7301 | 2014-04-22 15:11:42 +0200 | [diff] [blame] | 209 | 	int		(*set_rate)(struct clk_hw *hw, unsigned long rate, | 
 | 210 | 				    unsigned long parent_rate); | 
| Stephen Boyd | 3fa2252 | 2014-01-15 10:47:22 -0800 | [diff] [blame] | 211 | 	int		(*set_rate_and_parent)(struct clk_hw *hw, | 
 | 212 | 				    unsigned long rate, | 
 | 213 | 				    unsigned long parent_rate, u8 index); | 
| Boris BREZILLON | 5279fc4 | 2013-12-21 10:34:47 +0100 | [diff] [blame] | 214 | 	unsigned long	(*recalc_accuracy)(struct clk_hw *hw, | 
 | 215 | 					   unsigned long parent_accuracy); | 
| Maxime Ripard | 9824cf7 | 2014-07-14 13:53:27 +0200 | [diff] [blame] | 216 | 	int		(*get_phase)(struct clk_hw *hw); | 
| Mike Turquette | e59c537 | 2014-02-18 21:21:25 -0800 | [diff] [blame] | 217 | 	int		(*set_phase)(struct clk_hw *hw, int degrees); | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 218 | 	void		(*init)(struct clk_hw *hw); | 
| Alex Elder | c646cbf | 2014-03-21 06:43:56 -0500 | [diff] [blame] | 219 | 	int		(*debug_init)(struct clk_hw *hw, struct dentry *dentry); | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 220 | }; | 
 | 221 |  | 
| Saravana Kannan | 0197b3e | 2012-04-25 22:58:56 -0700 | [diff] [blame] | 222 | /** | 
 | 223 |  * struct clk_init_data - holds init data that's common to all clocks and is | 
 | 224 |  * shared between the clock provider and the common clock framework. | 
 | 225 |  * | 
 | 226 |  * @name: clock name | 
 | 227 |  * @ops: operations this clock supports | 
 | 228 |  * @parent_names: array of string names for all possible parents | 
 | 229 |  * @num_parents: number of possible parents | 
 | 230 |  * @flags: framework-level hints and quirks | 
 | 231 |  */ | 
 | 232 | struct clk_init_data { | 
 | 233 | 	const char		*name; | 
 | 234 | 	const struct clk_ops	*ops; | 
| Sascha Hauer | 2893c37 | 2015-03-31 20:16:52 +0200 | [diff] [blame] | 235 | 	const char		* const *parent_names; | 
| Saravana Kannan | 0197b3e | 2012-04-25 22:58:56 -0700 | [diff] [blame] | 236 | 	u8			num_parents; | 
 | 237 | 	unsigned long		flags; | 
 | 238 | }; | 
 | 239 |  | 
 | 240 | /** | 
 | 241 |  * struct clk_hw - handle for traversing from a struct clk to its corresponding | 
 | 242 |  * hardware-specific structure.  struct clk_hw should be declared within struct | 
 | 243 |  * clk_foo and then referenced by the struct clk instance that uses struct | 
 | 244 |  * clk_foo's clk_ops | 
 | 245 |  * | 
| Tomeu Vizoso | 035a61c | 2015-01-23 12:03:30 +0100 | [diff] [blame] | 246 |  * @core: pointer to the struct clk_core instance that points back to this | 
 | 247 |  * struct clk_hw instance | 
 | 248 |  * | 
 | 249 |  * @clk: pointer to the per-user struct clk instance that can be used to call | 
 | 250 |  * into the clk API | 
| Saravana Kannan | 0197b3e | 2012-04-25 22:58:56 -0700 | [diff] [blame] | 251 |  * | 
 | 252 |  * @init: pointer to struct clk_init_data that contains the init data shared | 
 | 253 |  * with the common clock framework. | 
 | 254 |  */ | 
 | 255 | struct clk_hw { | 
| Tomeu Vizoso | 035a61c | 2015-01-23 12:03:30 +0100 | [diff] [blame] | 256 | 	struct clk_core *core; | 
| Saravana Kannan | 0197b3e | 2012-04-25 22:58:56 -0700 | [diff] [blame] | 257 | 	struct clk *clk; | 
| Mark Brown | dc4cd94 | 2012-05-14 15:12:42 +0100 | [diff] [blame] | 258 | 	const struct clk_init_data *init; | 
| Saravana Kannan | 0197b3e | 2012-04-25 22:58:56 -0700 | [diff] [blame] | 259 | }; | 
 | 260 |  | 
| Mike Turquette | 9d9f78e | 2012-03-15 23:11:20 -0700 | [diff] [blame] | 261 | /* | 
 | 262 |  * DOC: Basic clock implementations common to many platforms | 
 | 263 |  * | 
 | 264 |  * Each basic clock hardware type is comprised of a structure describing the | 
 | 265 |  * clock hardware, implementations of the relevant callbacks in struct clk_ops, | 
 | 266 |  * unique flags for that hardware type, a registration function and an | 
 | 267 |  * alternative macro for static initialization | 
 | 268 |  */ | 
 | 269 |  | 
 | 270 | /** | 
 | 271 |  * struct clk_fixed_rate - fixed-rate clock | 
 | 272 |  * @hw:		handle between common and hardware-specific interfaces | 
 | 273 |  * @fixed_rate:	constant frequency of clock | 
 | 274 |  */ | 
 | 275 | struct clk_fixed_rate { | 
 | 276 | 	struct		clk_hw hw; | 
 | 277 | 	unsigned long	fixed_rate; | 
| Boris BREZILLON | 0903ea6 | 2013-12-21 10:34:48 +0100 | [diff] [blame] | 278 | 	unsigned long	fixed_accuracy; | 
| Mike Turquette | 9d9f78e | 2012-03-15 23:11:20 -0700 | [diff] [blame] | 279 | 	u8		flags; | 
 | 280 | }; | 
 | 281 |  | 
| Geliang Tang | 5fd9c05 | 2016-01-08 23:51:46 +0800 | [diff] [blame] | 282 | #define to_clk_fixed_rate(_hw) container_of(_hw, struct clk_fixed_rate, hw) | 
 | 283 |  | 
| Shawn Guo | bffad66 | 2012-03-27 15:23:23 +0800 | [diff] [blame] | 284 | extern const struct clk_ops clk_fixed_rate_ops; | 
| Mike Turquette | 9d9f78e | 2012-03-15 23:11:20 -0700 | [diff] [blame] | 285 | struct clk *clk_register_fixed_rate(struct device *dev, const char *name, | 
 | 286 | 		const char *parent_name, unsigned long flags, | 
 | 287 | 		unsigned long fixed_rate); | 
| Stephen Boyd | 26ef56b | 2016-02-07 00:34:13 -0800 | [diff] [blame] | 288 | struct clk_hw *clk_hw_register_fixed_rate(struct device *dev, const char *name, | 
 | 289 | 		const char *parent_name, unsigned long flags, | 
 | 290 | 		unsigned long fixed_rate); | 
| Boris BREZILLON | 0903ea6 | 2013-12-21 10:34:48 +0100 | [diff] [blame] | 291 | struct clk *clk_register_fixed_rate_with_accuracy(struct device *dev, | 
 | 292 | 		const char *name, const char *parent_name, unsigned long flags, | 
 | 293 | 		unsigned long fixed_rate, unsigned long fixed_accuracy); | 
| Masahiro Yamada | 0b225e4 | 2016-01-06 13:25:10 +0900 | [diff] [blame] | 294 | void clk_unregister_fixed_rate(struct clk *clk); | 
| Stephen Boyd | 26ef56b | 2016-02-07 00:34:13 -0800 | [diff] [blame] | 295 | struct clk_hw *clk_hw_register_fixed_rate_with_accuracy(struct device *dev, | 
 | 296 | 		const char *name, const char *parent_name, unsigned long flags, | 
 | 297 | 		unsigned long fixed_rate, unsigned long fixed_accuracy); | 
| Masahiro Yamada | 5244563 | 2016-05-22 14:33:35 +0900 | [diff] [blame] | 298 | void clk_hw_unregister_fixed_rate(struct clk_hw *hw); | 
| Stephen Boyd | 26ef56b | 2016-02-07 00:34:13 -0800 | [diff] [blame] | 299 |  | 
| Grant Likely | 015ba40 | 2012-04-07 21:39:39 -0500 | [diff] [blame] | 300 | void of_fixed_clk_setup(struct device_node *np); | 
 | 301 |  | 
| Mike Turquette | 9d9f78e | 2012-03-15 23:11:20 -0700 | [diff] [blame] | 302 | /** | 
 | 303 |  * struct clk_gate - gating clock | 
 | 304 |  * | 
 | 305 |  * @hw:		handle between common and hardware-specific interfaces | 
 | 306 |  * @reg:	register controlling gate | 
 | 307 |  * @bit_idx:	single bit controlling gate | 
 | 308 |  * @flags:	hardware-specific flags | 
 | 309 |  * @lock:	register lock | 
 | 310 |  * | 
 | 311 |  * Clock which can gate its output.  Implements .enable & .disable | 
 | 312 |  * | 
 | 313 |  * Flags: | 
| Viresh Kumar | 1f73f31 | 2012-04-17 16:45:35 +0530 | [diff] [blame] | 314 |  * CLK_GATE_SET_TO_DISABLE - by default this clock sets the bit at bit_idx to | 
| Geert Uytterhoeven | 725b418 | 2014-04-22 15:11:41 +0200 | [diff] [blame] | 315 |  *	enable the clock.  Setting this flag does the opposite: setting the bit | 
 | 316 |  *	disable the clock and clearing it enables the clock | 
| Haojian Zhuang | 0457799 | 2013-06-08 22:47:19 +0800 | [diff] [blame] | 317 |  * CLK_GATE_HIWORD_MASK - The gate settings are only in lower 16-bit | 
| Geert Uytterhoeven | 725b418 | 2014-04-22 15:11:41 +0200 | [diff] [blame] | 318 |  *	of this register, and mask of gate bits are in higher 16-bit of this | 
 | 319 |  *	register.  While setting the gate bits, higher 16-bit should also be | 
 | 320 |  *	updated to indicate changing gate bits. | 
| Mike Turquette | 9d9f78e | 2012-03-15 23:11:20 -0700 | [diff] [blame] | 321 |  */ | 
 | 322 | struct clk_gate { | 
 | 323 | 	struct clk_hw hw; | 
 | 324 | 	void __iomem	*reg; | 
 | 325 | 	u8		bit_idx; | 
 | 326 | 	u8		flags; | 
 | 327 | 	spinlock_t	*lock; | 
| Mike Turquette | 9d9f78e | 2012-03-15 23:11:20 -0700 | [diff] [blame] | 328 | }; | 
 | 329 |  | 
| Geliang Tang | 5fd9c05 | 2016-01-08 23:51:46 +0800 | [diff] [blame] | 330 | #define to_clk_gate(_hw) container_of(_hw, struct clk_gate, hw) | 
 | 331 |  | 
| Mike Turquette | 9d9f78e | 2012-03-15 23:11:20 -0700 | [diff] [blame] | 332 | #define CLK_GATE_SET_TO_DISABLE		BIT(0) | 
| Haojian Zhuang | 0457799 | 2013-06-08 22:47:19 +0800 | [diff] [blame] | 333 | #define CLK_GATE_HIWORD_MASK		BIT(1) | 
| Mike Turquette | 9d9f78e | 2012-03-15 23:11:20 -0700 | [diff] [blame] | 334 |  | 
| Shawn Guo | bffad66 | 2012-03-27 15:23:23 +0800 | [diff] [blame] | 335 | extern const struct clk_ops clk_gate_ops; | 
| Mike Turquette | 9d9f78e | 2012-03-15 23:11:20 -0700 | [diff] [blame] | 336 | struct clk *clk_register_gate(struct device *dev, const char *name, | 
 | 337 | 		const char *parent_name, unsigned long flags, | 
 | 338 | 		void __iomem *reg, u8 bit_idx, | 
 | 339 | 		u8 clk_gate_flags, spinlock_t *lock); | 
| Stephen Boyd | e270d8c | 2016-02-06 23:54:45 -0800 | [diff] [blame] | 340 | struct clk_hw *clk_hw_register_gate(struct device *dev, const char *name, | 
 | 341 | 		const char *parent_name, unsigned long flags, | 
 | 342 | 		void __iomem *reg, u8 bit_idx, | 
 | 343 | 		u8 clk_gate_flags, spinlock_t *lock); | 
| Krzysztof Kozlowski | 4e3c021 | 2015-01-05 10:52:40 +0100 | [diff] [blame] | 344 | void clk_unregister_gate(struct clk *clk); | 
| Stephen Boyd | e270d8c | 2016-02-06 23:54:45 -0800 | [diff] [blame] | 345 | void clk_hw_unregister_gate(struct clk_hw *hw); | 
| Gabriel Fernandez | 0a9c869 | 2017-08-21 13:59:01 +0200 | [diff] [blame] | 346 | int clk_gate_is_enabled(struct clk_hw *hw); | 
| Mike Turquette | 9d9f78e | 2012-03-15 23:11:20 -0700 | [diff] [blame] | 347 |  | 
| Rajendra Nayak | 357c3f0 | 2012-06-29 19:06:32 +0530 | [diff] [blame] | 348 | struct clk_div_table { | 
 | 349 | 	unsigned int	val; | 
 | 350 | 	unsigned int	div; | 
 | 351 | }; | 
 | 352 |  | 
| Mike Turquette | 9d9f78e | 2012-03-15 23:11:20 -0700 | [diff] [blame] | 353 | /** | 
 | 354 |  * struct clk_divider - adjustable divider clock | 
 | 355 |  * | 
 | 356 |  * @hw:		handle between common and hardware-specific interfaces | 
 | 357 |  * @reg:	register containing the divider | 
 | 358 |  * @shift:	shift to the divider bit field | 
 | 359 |  * @width:	width of the divider bit field | 
| Rajendra Nayak | 357c3f0 | 2012-06-29 19:06:32 +0530 | [diff] [blame] | 360 |  * @table:	array of value/divider pairs, last entry should have div = 0 | 
| Mike Turquette | 9d9f78e | 2012-03-15 23:11:20 -0700 | [diff] [blame] | 361 |  * @lock:	register lock | 
 | 362 |  * | 
 | 363 |  * Clock with an adjustable divider affecting its output frequency.  Implements | 
 | 364 |  * .recalc_rate, .set_rate and .round_rate | 
 | 365 |  * | 
 | 366 |  * Flags: | 
 | 367 |  * CLK_DIVIDER_ONE_BASED - by default the divisor is the value read from the | 
| Geert Uytterhoeven | 725b418 | 2014-04-22 15:11:41 +0200 | [diff] [blame] | 368 |  *	register plus one.  If CLK_DIVIDER_ONE_BASED is set then the divider is | 
 | 369 |  *	the raw value read from the register, with the value of zero considered | 
| Soren Brinkmann | 056b2053 | 2013-04-02 15:36:56 -0700 | [diff] [blame] | 370 |  *	invalid, unless CLK_DIVIDER_ALLOW_ZERO is set. | 
| Mike Turquette | 9d9f78e | 2012-03-15 23:11:20 -0700 | [diff] [blame] | 371 |  * CLK_DIVIDER_POWER_OF_TWO - clock divisor is 2 raised to the value read from | 
| Geert Uytterhoeven | 725b418 | 2014-04-22 15:11:41 +0200 | [diff] [blame] | 372 |  *	the hardware register | 
| Soren Brinkmann | 056b2053 | 2013-04-02 15:36:56 -0700 | [diff] [blame] | 373 |  * CLK_DIVIDER_ALLOW_ZERO - Allow zero divisors.  For dividers which have | 
 | 374 |  *	CLK_DIVIDER_ONE_BASED set, it is possible to end up with a zero divisor. | 
 | 375 |  *	Some hardware implementations gracefully handle this case and allow a | 
 | 376 |  *	zero divisor by not modifying their input clock | 
 | 377 |  *	(divide by one / bypass). | 
| Haojian Zhuang | d57dfe7 | 2013-06-08 22:47:18 +0800 | [diff] [blame] | 378 |  * CLK_DIVIDER_HIWORD_MASK - The divider settings are only in lower 16-bit | 
| Geert Uytterhoeven | 725b418 | 2014-04-22 15:11:41 +0200 | [diff] [blame] | 379 |  *	of this register, and mask of divider bits are in higher 16-bit of this | 
 | 380 |  *	register.  While setting the divider bits, higher 16-bit should also be | 
 | 381 |  *	updated to indicate changing divider bits. | 
| Maxime COQUELIN | 774b514 | 2014-01-29 17:24:07 +0100 | [diff] [blame] | 382 |  * CLK_DIVIDER_ROUND_CLOSEST - Makes the best calculated divider to be rounded | 
 | 383 |  *	to the closest integer instead of the up one. | 
| Heiko Stuebner | 79c6ab5 | 2014-05-23 18:32:15 +0530 | [diff] [blame] | 384 |  * CLK_DIVIDER_READ_ONLY - The divider settings are preconfigured and should | 
 | 385 |  *	not be changed by the clock framework. | 
| Jim Quinlan | afe76c8f | 2015-05-15 15:45:47 -0400 | [diff] [blame] | 386 |  * CLK_DIVIDER_MAX_AT_ZERO - For dividers which are like CLK_DIVIDER_ONE_BASED | 
 | 387 |  *	except when the value read from the register is zero, the divisor is | 
 | 388 |  *	2^width of the field. | 
| Mike Turquette | 9d9f78e | 2012-03-15 23:11:20 -0700 | [diff] [blame] | 389 |  */ | 
 | 390 | struct clk_divider { | 
 | 391 | 	struct clk_hw	hw; | 
 | 392 | 	void __iomem	*reg; | 
 | 393 | 	u8		shift; | 
 | 394 | 	u8		width; | 
 | 395 | 	u8		flags; | 
| Rajendra Nayak | 357c3f0 | 2012-06-29 19:06:32 +0530 | [diff] [blame] | 396 | 	const struct clk_div_table	*table; | 
| Mike Turquette | 9d9f78e | 2012-03-15 23:11:20 -0700 | [diff] [blame] | 397 | 	spinlock_t	*lock; | 
| Mike Turquette | 9d9f78e | 2012-03-15 23:11:20 -0700 | [diff] [blame] | 398 | }; | 
 | 399 |  | 
| Geliang Tang | 5fd9c05 | 2016-01-08 23:51:46 +0800 | [diff] [blame] | 400 | #define to_clk_divider(_hw) container_of(_hw, struct clk_divider, hw) | 
 | 401 |  | 
| Mike Turquette | 9d9f78e | 2012-03-15 23:11:20 -0700 | [diff] [blame] | 402 | #define CLK_DIVIDER_ONE_BASED		BIT(0) | 
 | 403 | #define CLK_DIVIDER_POWER_OF_TWO	BIT(1) | 
| Soren Brinkmann | 056b2053 | 2013-04-02 15:36:56 -0700 | [diff] [blame] | 404 | #define CLK_DIVIDER_ALLOW_ZERO		BIT(2) | 
| Haojian Zhuang | d57dfe7 | 2013-06-08 22:47:18 +0800 | [diff] [blame] | 405 | #define CLK_DIVIDER_HIWORD_MASK		BIT(3) | 
| Maxime COQUELIN | 774b514 | 2014-01-29 17:24:07 +0100 | [diff] [blame] | 406 | #define CLK_DIVIDER_ROUND_CLOSEST	BIT(4) | 
| Heiko Stuebner | 79c6ab5 | 2014-05-23 18:32:15 +0530 | [diff] [blame] | 407 | #define CLK_DIVIDER_READ_ONLY		BIT(5) | 
| Jim Quinlan | afe76c8f | 2015-05-15 15:45:47 -0400 | [diff] [blame] | 408 | #define CLK_DIVIDER_MAX_AT_ZERO		BIT(6) | 
| Mike Turquette | 9d9f78e | 2012-03-15 23:11:20 -0700 | [diff] [blame] | 409 |  | 
| Shawn Guo | bffad66 | 2012-03-27 15:23:23 +0800 | [diff] [blame] | 410 | extern const struct clk_ops clk_divider_ops; | 
| Heiko Stuebner | 5035981 | 2016-01-21 21:53:09 +0100 | [diff] [blame] | 411 | extern const struct clk_ops clk_divider_ro_ops; | 
| Stephen Boyd | bca9690 | 2015-01-19 18:05:29 -0800 | [diff] [blame] | 412 |  | 
 | 413 | unsigned long divider_recalc_rate(struct clk_hw *hw, unsigned long parent_rate, | 
 | 414 | 		unsigned int val, const struct clk_div_table *table, | 
 | 415 | 		unsigned long flags); | 
| Maxime Ripard | 22833a9 | 2017-05-17 09:40:30 +0200 | [diff] [blame] | 416 | long divider_round_rate_parent(struct clk_hw *hw, struct clk_hw *parent, | 
 | 417 | 			       unsigned long rate, unsigned long *prate, | 
 | 418 | 			       const struct clk_div_table *table, | 
 | 419 | 			       u8 width, unsigned long flags); | 
| Stephen Boyd | bca9690 | 2015-01-19 18:05:29 -0800 | [diff] [blame] | 420 | int divider_get_val(unsigned long rate, unsigned long parent_rate, | 
 | 421 | 		const struct clk_div_table *table, u8 width, | 
 | 422 | 		unsigned long flags); | 
 | 423 |  | 
| Mike Turquette | 9d9f78e | 2012-03-15 23:11:20 -0700 | [diff] [blame] | 424 | struct clk *clk_register_divider(struct device *dev, const char *name, | 
 | 425 | 		const char *parent_name, unsigned long flags, | 
 | 426 | 		void __iomem *reg, u8 shift, u8 width, | 
 | 427 | 		u8 clk_divider_flags, spinlock_t *lock); | 
| Stephen Boyd | eb7d264 | 2016-02-06 23:26:37 -0800 | [diff] [blame] | 428 | struct clk_hw *clk_hw_register_divider(struct device *dev, const char *name, | 
 | 429 | 		const char *parent_name, unsigned long flags, | 
 | 430 | 		void __iomem *reg, u8 shift, u8 width, | 
 | 431 | 		u8 clk_divider_flags, spinlock_t *lock); | 
| Rajendra Nayak | 357c3f0 | 2012-06-29 19:06:32 +0530 | [diff] [blame] | 432 | struct clk *clk_register_divider_table(struct device *dev, const char *name, | 
 | 433 | 		const char *parent_name, unsigned long flags, | 
 | 434 | 		void __iomem *reg, u8 shift, u8 width, | 
 | 435 | 		u8 clk_divider_flags, const struct clk_div_table *table, | 
 | 436 | 		spinlock_t *lock); | 
| Stephen Boyd | eb7d264 | 2016-02-06 23:26:37 -0800 | [diff] [blame] | 437 | struct clk_hw *clk_hw_register_divider_table(struct device *dev, | 
 | 438 | 		const char *name, const char *parent_name, unsigned long flags, | 
 | 439 | 		void __iomem *reg, u8 shift, u8 width, | 
 | 440 | 		u8 clk_divider_flags, const struct clk_div_table *table, | 
 | 441 | 		spinlock_t *lock); | 
| Krzysztof Kozlowski | 4e3c021 | 2015-01-05 10:52:40 +0100 | [diff] [blame] | 442 | void clk_unregister_divider(struct clk *clk); | 
| Stephen Boyd | eb7d264 | 2016-02-06 23:26:37 -0800 | [diff] [blame] | 443 | void clk_hw_unregister_divider(struct clk_hw *hw); | 
| Mike Turquette | 9d9f78e | 2012-03-15 23:11:20 -0700 | [diff] [blame] | 444 |  | 
 | 445 | /** | 
 | 446 |  * struct clk_mux - multiplexer clock | 
 | 447 |  * | 
 | 448 |  * @hw:		handle between common and hardware-specific interfaces | 
 | 449 |  * @reg:	register controlling multiplexer | 
 | 450 |  * @shift:	shift to multiplexer bit field | 
 | 451 |  * @width:	width of mutliplexer bit field | 
| James Hogan | 3566d40 | 2013-03-25 14:35:07 +0000 | [diff] [blame] | 452 |  * @flags:	hardware-specific flags | 
| Mike Turquette | 9d9f78e | 2012-03-15 23:11:20 -0700 | [diff] [blame] | 453 |  * @lock:	register lock | 
 | 454 |  * | 
 | 455 |  * Clock with multiple selectable parents.  Implements .get_parent, .set_parent | 
 | 456 |  * and .recalc_rate | 
 | 457 |  * | 
 | 458 |  * Flags: | 
 | 459 |  * CLK_MUX_INDEX_ONE - register index starts at 1, not 0 | 
| Viresh Kumar | 1f73f31 | 2012-04-17 16:45:35 +0530 | [diff] [blame] | 460 |  * CLK_MUX_INDEX_BIT - register index is a single bit (power of two) | 
| Haojian Zhuang | ba492e9 | 2013-06-08 22:47:17 +0800 | [diff] [blame] | 461 |  * CLK_MUX_HIWORD_MASK - The mux settings are only in lower 16-bit of this | 
| Geert Uytterhoeven | 725b418 | 2014-04-22 15:11:41 +0200 | [diff] [blame] | 462 |  *	register, and mask of mux bits are in higher 16-bit of this register. | 
 | 463 |  *	While setting the mux bits, higher 16-bit should also be updated to | 
 | 464 |  *	indicate changing mux bits. | 
| Stephen Boyd | 15a02c1 | 2015-01-19 18:05:28 -0800 | [diff] [blame] | 465 |  * CLK_MUX_ROUND_CLOSEST - Use the parent rate that is closest to the desired | 
 | 466 |  *	frequency. | 
| Mike Turquette | 9d9f78e | 2012-03-15 23:11:20 -0700 | [diff] [blame] | 467 |  */ | 
 | 468 | struct clk_mux { | 
 | 469 | 	struct clk_hw	hw; | 
 | 470 | 	void __iomem	*reg; | 
| Peter De Schrijver | ce4f331 | 2013-03-22 14:07:53 +0200 | [diff] [blame] | 471 | 	u32		*table; | 
 | 472 | 	u32		mask; | 
| Mike Turquette | 9d9f78e | 2012-03-15 23:11:20 -0700 | [diff] [blame] | 473 | 	u8		shift; | 
| Mike Turquette | 9d9f78e | 2012-03-15 23:11:20 -0700 | [diff] [blame] | 474 | 	u8		flags; | 
 | 475 | 	spinlock_t	*lock; | 
 | 476 | }; | 
 | 477 |  | 
| Geliang Tang | 5fd9c05 | 2016-01-08 23:51:46 +0800 | [diff] [blame] | 478 | #define to_clk_mux(_hw) container_of(_hw, struct clk_mux, hw) | 
 | 479 |  | 
| Mike Turquette | 9d9f78e | 2012-03-15 23:11:20 -0700 | [diff] [blame] | 480 | #define CLK_MUX_INDEX_ONE		BIT(0) | 
 | 481 | #define CLK_MUX_INDEX_BIT		BIT(1) | 
| Haojian Zhuang | ba492e9 | 2013-06-08 22:47:17 +0800 | [diff] [blame] | 482 | #define CLK_MUX_HIWORD_MASK		BIT(2) | 
| Stephen Boyd | 15a02c1 | 2015-01-19 18:05:28 -0800 | [diff] [blame] | 483 | #define CLK_MUX_READ_ONLY		BIT(3) /* mux can't be changed */ | 
 | 484 | #define CLK_MUX_ROUND_CLOSEST		BIT(4) | 
| Mike Turquette | 9d9f78e | 2012-03-15 23:11:20 -0700 | [diff] [blame] | 485 |  | 
| Shawn Guo | bffad66 | 2012-03-27 15:23:23 +0800 | [diff] [blame] | 486 | extern const struct clk_ops clk_mux_ops; | 
| Tomasz Figa | c57acd1 | 2013-07-23 01:49:18 +0200 | [diff] [blame] | 487 | extern const struct clk_ops clk_mux_ro_ops; | 
| Peter De Schrijver | ce4f331 | 2013-03-22 14:07:53 +0200 | [diff] [blame] | 488 |  | 
| Mike Turquette | 9d9f78e | 2012-03-15 23:11:20 -0700 | [diff] [blame] | 489 | struct clk *clk_register_mux(struct device *dev, const char *name, | 
| Sascha Hauer | 2893c37 | 2015-03-31 20:16:52 +0200 | [diff] [blame] | 490 | 		const char * const *parent_names, u8 num_parents, | 
 | 491 | 		unsigned long flags, | 
| Mike Turquette | 9d9f78e | 2012-03-15 23:11:20 -0700 | [diff] [blame] | 492 | 		void __iomem *reg, u8 shift, u8 width, | 
 | 493 | 		u8 clk_mux_flags, spinlock_t *lock); | 
| Stephen Boyd | 264b317 | 2016-02-07 00:05:48 -0800 | [diff] [blame] | 494 | struct clk_hw *clk_hw_register_mux(struct device *dev, const char *name, | 
 | 495 | 		const char * const *parent_names, u8 num_parents, | 
 | 496 | 		unsigned long flags, | 
 | 497 | 		void __iomem *reg, u8 shift, u8 width, | 
 | 498 | 		u8 clk_mux_flags, spinlock_t *lock); | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 499 |  | 
| Peter De Schrijver | ce4f331 | 2013-03-22 14:07:53 +0200 | [diff] [blame] | 500 | struct clk *clk_register_mux_table(struct device *dev, const char *name, | 
| Sascha Hauer | 2893c37 | 2015-03-31 20:16:52 +0200 | [diff] [blame] | 501 | 		const char * const *parent_names, u8 num_parents, | 
 | 502 | 		unsigned long flags, | 
| Peter De Schrijver | ce4f331 | 2013-03-22 14:07:53 +0200 | [diff] [blame] | 503 | 		void __iomem *reg, u8 shift, u32 mask, | 
 | 504 | 		u8 clk_mux_flags, u32 *table, spinlock_t *lock); | 
| Stephen Boyd | 264b317 | 2016-02-07 00:05:48 -0800 | [diff] [blame] | 505 | struct clk_hw *clk_hw_register_mux_table(struct device *dev, const char *name, | 
 | 506 | 		const char * const *parent_names, u8 num_parents, | 
 | 507 | 		unsigned long flags, | 
 | 508 | 		void __iomem *reg, u8 shift, u32 mask, | 
 | 509 | 		u8 clk_mux_flags, u32 *table, spinlock_t *lock); | 
| Peter De Schrijver | ce4f331 | 2013-03-22 14:07:53 +0200 | [diff] [blame] | 510 |  | 
| Krzysztof Kozlowski | 4e3c021 | 2015-01-05 10:52:40 +0100 | [diff] [blame] | 511 | void clk_unregister_mux(struct clk *clk); | 
| Stephen Boyd | 264b317 | 2016-02-07 00:05:48 -0800 | [diff] [blame] | 512 | void clk_hw_unregister_mux(struct clk_hw *hw); | 
| Krzysztof Kozlowski | 4e3c021 | 2015-01-05 10:52:40 +0100 | [diff] [blame] | 513 |  | 
| Gregory CLEMENT | 79b1664 | 2013-04-12 13:57:44 +0200 | [diff] [blame] | 514 | void of_fixed_factor_clk_setup(struct device_node *node); | 
 | 515 |  | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 516 | /** | 
| Sascha Hauer | f0948f5 | 2012-05-03 15:36:14 +0530 | [diff] [blame] | 517 |  * struct clk_fixed_factor - fixed multiplier and divider clock | 
 | 518 |  * | 
 | 519 |  * @hw:		handle between common and hardware-specific interfaces | 
 | 520 |  * @mult:	multiplier | 
 | 521 |  * @div:	divider | 
 | 522 |  * | 
 | 523 |  * Clock with a fixed multiplier and divider. The output frequency is the | 
 | 524 |  * parent clock rate divided by div and multiplied by mult. | 
 | 525 |  * Implements .recalc_rate, .set_rate and .round_rate | 
 | 526 |  */ | 
 | 527 |  | 
 | 528 | struct clk_fixed_factor { | 
 | 529 | 	struct clk_hw	hw; | 
 | 530 | 	unsigned int	mult; | 
 | 531 | 	unsigned int	div; | 
 | 532 | }; | 
 | 533 |  | 
| Geliang Tang | 5fd9c05 | 2016-01-08 23:51:46 +0800 | [diff] [blame] | 534 | #define to_clk_fixed_factor(_hw) container_of(_hw, struct clk_fixed_factor, hw) | 
 | 535 |  | 
| Daniel Thompson | 3037e9e | 2015-06-10 21:04:54 +0100 | [diff] [blame] | 536 | extern const struct clk_ops clk_fixed_factor_ops; | 
| Sascha Hauer | f0948f5 | 2012-05-03 15:36:14 +0530 | [diff] [blame] | 537 | struct clk *clk_register_fixed_factor(struct device *dev, const char *name, | 
 | 538 | 		const char *parent_name, unsigned long flags, | 
 | 539 | 		unsigned int mult, unsigned int div); | 
| Masahiro Yamada | cbf9591 | 2016-01-06 13:25:09 +0900 | [diff] [blame] | 540 | void clk_unregister_fixed_factor(struct clk *clk); | 
| Stephen Boyd | 0759ac8 | 2016-02-07 00:11:06 -0800 | [diff] [blame] | 541 | struct clk_hw *clk_hw_register_fixed_factor(struct device *dev, | 
 | 542 | 		const char *name, const char *parent_name, unsigned long flags, | 
 | 543 | 		unsigned int mult, unsigned int div); | 
 | 544 | void clk_hw_unregister_fixed_factor(struct clk_hw *hw); | 
| Sascha Hauer | f0948f5 | 2012-05-03 15:36:14 +0530 | [diff] [blame] | 545 |  | 
| Heikki Krogerus | e2d0e90 | 2014-05-15 16:40:25 +0300 | [diff] [blame] | 546 | /** | 
 | 547 |  * struct clk_fractional_divider - adjustable fractional divider clock | 
 | 548 |  * | 
 | 549 |  * @hw:		handle between common and hardware-specific interfaces | 
 | 550 |  * @reg:	register containing the divider | 
 | 551 |  * @mshift:	shift to the numerator bit field | 
 | 552 |  * @mwidth:	width of the numerator bit field | 
 | 553 |  * @nshift:	shift to the denominator bit field | 
 | 554 |  * @nwidth:	width of the denominator bit field | 
 | 555 |  * @lock:	register lock | 
 | 556 |  * | 
 | 557 |  * Clock with adjustable fractional divider affecting its output frequency. | 
 | 558 |  */ | 
| Heikki Krogerus | e2d0e90 | 2014-05-15 16:40:25 +0300 | [diff] [blame] | 559 | struct clk_fractional_divider { | 
 | 560 | 	struct clk_hw	hw; | 
 | 561 | 	void __iomem	*reg; | 
 | 562 | 	u8		mshift; | 
| Andy Shevchenko | 934e253 | 2015-09-22 18:54:09 +0300 | [diff] [blame] | 563 | 	u8		mwidth; | 
| Heikki Krogerus | e2d0e90 | 2014-05-15 16:40:25 +0300 | [diff] [blame] | 564 | 	u32		mmask; | 
 | 565 | 	u8		nshift; | 
| Andy Shevchenko | 934e253 | 2015-09-22 18:54:09 +0300 | [diff] [blame] | 566 | 	u8		nwidth; | 
| Heikki Krogerus | e2d0e90 | 2014-05-15 16:40:25 +0300 | [diff] [blame] | 567 | 	u32		nmask; | 
 | 568 | 	u8		flags; | 
| Elaine Zhang | ec52e46 | 2017-08-01 18:21:22 +0200 | [diff] [blame] | 569 | 	void		(*approximation)(struct clk_hw *hw, | 
 | 570 | 				unsigned long rate, unsigned long *parent_rate, | 
 | 571 | 				unsigned long *m, unsigned long *n); | 
| Heikki Krogerus | e2d0e90 | 2014-05-15 16:40:25 +0300 | [diff] [blame] | 572 | 	spinlock_t	*lock; | 
 | 573 | }; | 
 | 574 |  | 
| Geliang Tang | 5fd9c05 | 2016-01-08 23:51:46 +0800 | [diff] [blame] | 575 | #define to_clk_fd(_hw) container_of(_hw, struct clk_fractional_divider, hw) | 
 | 576 |  | 
| Heikki Krogerus | e2d0e90 | 2014-05-15 16:40:25 +0300 | [diff] [blame] | 577 | extern const struct clk_ops clk_fractional_divider_ops; | 
 | 578 | struct clk *clk_register_fractional_divider(struct device *dev, | 
 | 579 | 		const char *name, const char *parent_name, unsigned long flags, | 
 | 580 | 		void __iomem *reg, u8 mshift, u8 mwidth, u8 nshift, u8 nwidth, | 
 | 581 | 		u8 clk_divider_flags, spinlock_t *lock); | 
| Stephen Boyd | 39b44cf | 2016-02-07 00:15:09 -0800 | [diff] [blame] | 582 | struct clk_hw *clk_hw_register_fractional_divider(struct device *dev, | 
 | 583 | 		const char *name, const char *parent_name, unsigned long flags, | 
 | 584 | 		void __iomem *reg, u8 mshift, u8 mwidth, u8 nshift, u8 nwidth, | 
 | 585 | 		u8 clk_divider_flags, spinlock_t *lock); | 
 | 586 | void clk_hw_unregister_fractional_divider(struct clk_hw *hw); | 
| Heikki Krogerus | e2d0e90 | 2014-05-15 16:40:25 +0300 | [diff] [blame] | 587 |  | 
| Maxime Ripard | f2e0a53 | 2015-05-19 22:19:33 +0200 | [diff] [blame] | 588 | /** | 
 | 589 |  * struct clk_multiplier - adjustable multiplier clock | 
 | 590 |  * | 
 | 591 |  * @hw:		handle between common and hardware-specific interfaces | 
 | 592 |  * @reg:	register containing the multiplier | 
 | 593 |  * @shift:	shift to the multiplier bit field | 
 | 594 |  * @width:	width of the multiplier bit field | 
 | 595 |  * @lock:	register lock | 
 | 596 |  * | 
 | 597 |  * Clock with an adjustable multiplier affecting its output frequency. | 
 | 598 |  * Implements .recalc_rate, .set_rate and .round_rate | 
 | 599 |  * | 
 | 600 |  * Flags: | 
 | 601 |  * CLK_MULTIPLIER_ZERO_BYPASS - By default, the multiplier is the value read | 
 | 602 |  *	from the register, with 0 being a valid value effectively | 
 | 603 |  *	zeroing the output clock rate. If CLK_MULTIPLIER_ZERO_BYPASS is | 
 | 604 |  *	set, then a null multiplier will be considered as a bypass, | 
 | 605 |  *	leaving the parent rate unmodified. | 
 | 606 |  * CLK_MULTIPLIER_ROUND_CLOSEST - Makes the best calculated divider to be | 
 | 607 |  *	rounded to the closest integer instead of the down one. | 
 | 608 |  */ | 
 | 609 | struct clk_multiplier { | 
 | 610 | 	struct clk_hw	hw; | 
 | 611 | 	void __iomem	*reg; | 
 | 612 | 	u8		shift; | 
 | 613 | 	u8		width; | 
 | 614 | 	u8		flags; | 
 | 615 | 	spinlock_t	*lock; | 
 | 616 | }; | 
 | 617 |  | 
| Geliang Tang | 5fd9c05 | 2016-01-08 23:51:46 +0800 | [diff] [blame] | 618 | #define to_clk_multiplier(_hw) container_of(_hw, struct clk_multiplier, hw) | 
 | 619 |  | 
| Maxime Ripard | f2e0a53 | 2015-05-19 22:19:33 +0200 | [diff] [blame] | 620 | #define CLK_MULTIPLIER_ZERO_BYPASS		BIT(0) | 
 | 621 | #define CLK_MULTIPLIER_ROUND_CLOSEST	BIT(1) | 
 | 622 |  | 
 | 623 | extern const struct clk_ops clk_multiplier_ops; | 
 | 624 |  | 
| Prashant Gaikwad | ece7009 | 2013-03-20 17:30:34 +0530 | [diff] [blame] | 625 | /*** | 
 | 626 |  * struct clk_composite - aggregate clock of mux, divider and gate clocks | 
 | 627 |  * | 
 | 628 |  * @hw:		handle between common and hardware-specific interfaces | 
| Mike Turquette | d3a1c7b | 2013-04-11 11:31:36 -0700 | [diff] [blame] | 629 |  * @mux_hw:	handle between composite and hardware-specific mux clock | 
 | 630 |  * @rate_hw:	handle between composite and hardware-specific rate clock | 
 | 631 |  * @gate_hw:	handle between composite and hardware-specific gate clock | 
| Prashant Gaikwad | ece7009 | 2013-03-20 17:30:34 +0530 | [diff] [blame] | 632 |  * @mux_ops:	clock ops for mux | 
| Mike Turquette | d3a1c7b | 2013-04-11 11:31:36 -0700 | [diff] [blame] | 633 |  * @rate_ops:	clock ops for rate | 
| Prashant Gaikwad | ece7009 | 2013-03-20 17:30:34 +0530 | [diff] [blame] | 634 |  * @gate_ops:	clock ops for gate | 
 | 635 |  */ | 
 | 636 | struct clk_composite { | 
 | 637 | 	struct clk_hw	hw; | 
 | 638 | 	struct clk_ops	ops; | 
 | 639 |  | 
 | 640 | 	struct clk_hw	*mux_hw; | 
| Mike Turquette | d3a1c7b | 2013-04-11 11:31:36 -0700 | [diff] [blame] | 641 | 	struct clk_hw	*rate_hw; | 
| Prashant Gaikwad | ece7009 | 2013-03-20 17:30:34 +0530 | [diff] [blame] | 642 | 	struct clk_hw	*gate_hw; | 
 | 643 |  | 
 | 644 | 	const struct clk_ops	*mux_ops; | 
| Mike Turquette | d3a1c7b | 2013-04-11 11:31:36 -0700 | [diff] [blame] | 645 | 	const struct clk_ops	*rate_ops; | 
| Prashant Gaikwad | ece7009 | 2013-03-20 17:30:34 +0530 | [diff] [blame] | 646 | 	const struct clk_ops	*gate_ops; | 
 | 647 | }; | 
 | 648 |  | 
| Geliang Tang | 5fd9c05 | 2016-01-08 23:51:46 +0800 | [diff] [blame] | 649 | #define to_clk_composite(_hw) container_of(_hw, struct clk_composite, hw) | 
 | 650 |  | 
| Prashant Gaikwad | ece7009 | 2013-03-20 17:30:34 +0530 | [diff] [blame] | 651 | struct clk *clk_register_composite(struct device *dev, const char *name, | 
| Sascha Hauer | 2893c37 | 2015-03-31 20:16:52 +0200 | [diff] [blame] | 652 | 		const char * const *parent_names, int num_parents, | 
| Prashant Gaikwad | ece7009 | 2013-03-20 17:30:34 +0530 | [diff] [blame] | 653 | 		struct clk_hw *mux_hw, const struct clk_ops *mux_ops, | 
| Mike Turquette | d3a1c7b | 2013-04-11 11:31:36 -0700 | [diff] [blame] | 654 | 		struct clk_hw *rate_hw, const struct clk_ops *rate_ops, | 
| Prashant Gaikwad | ece7009 | 2013-03-20 17:30:34 +0530 | [diff] [blame] | 655 | 		struct clk_hw *gate_hw, const struct clk_ops *gate_ops, | 
 | 656 | 		unsigned long flags); | 
| Maxime Ripard | 92a39d9 | 2016-03-23 17:38:24 +0100 | [diff] [blame] | 657 | void clk_unregister_composite(struct clk *clk); | 
| Stephen Boyd | 49cb392 | 2016-02-07 00:20:31 -0800 | [diff] [blame] | 658 | struct clk_hw *clk_hw_register_composite(struct device *dev, const char *name, | 
 | 659 | 		const char * const *parent_names, int num_parents, | 
 | 660 | 		struct clk_hw *mux_hw, const struct clk_ops *mux_ops, | 
 | 661 | 		struct clk_hw *rate_hw, const struct clk_ops *rate_ops, | 
 | 662 | 		struct clk_hw *gate_hw, const struct clk_ops *gate_ops, | 
 | 663 | 		unsigned long flags); | 
 | 664 | void clk_hw_unregister_composite(struct clk_hw *hw); | 
| Prashant Gaikwad | ece7009 | 2013-03-20 17:30:34 +0530 | [diff] [blame] | 665 |  | 
| Jyri Sarha | c873d14 | 2014-09-05 15:21:34 +0300 | [diff] [blame] | 666 | /*** | 
 | 667 |  * struct clk_gpio_gate - gpio gated clock | 
 | 668 |  * | 
 | 669 |  * @hw:		handle between common and hardware-specific interfaces | 
 | 670 |  * @gpiod:	gpio descriptor | 
 | 671 |  * | 
 | 672 |  * Clock with a gpio control for enabling and disabling the parent clock. | 
 | 673 |  * Implements .enable, .disable and .is_enabled | 
 | 674 |  */ | 
 | 675 |  | 
 | 676 | struct clk_gpio { | 
 | 677 | 	struct clk_hw	hw; | 
 | 678 | 	struct gpio_desc *gpiod; | 
 | 679 | }; | 
 | 680 |  | 
| Geliang Tang | 5fd9c05 | 2016-01-08 23:51:46 +0800 | [diff] [blame] | 681 | #define to_clk_gpio(_hw) container_of(_hw, struct clk_gpio, hw) | 
 | 682 |  | 
| Jyri Sarha | c873d14 | 2014-09-05 15:21:34 +0300 | [diff] [blame] | 683 | extern const struct clk_ops clk_gpio_gate_ops; | 
 | 684 | struct clk *clk_register_gpio_gate(struct device *dev, const char *name, | 
| Linus Walleij | 908a543 | 2017-09-24 18:19:18 +0200 | [diff] [blame] | 685 | 		const char *parent_name, struct gpio_desc *gpiod, | 
| Jyri Sarha | c873d14 | 2014-09-05 15:21:34 +0300 | [diff] [blame] | 686 | 		unsigned long flags); | 
| Stephen Boyd | b120743 | 2016-02-07 00:27:55 -0800 | [diff] [blame] | 687 | struct clk_hw *clk_hw_register_gpio_gate(struct device *dev, const char *name, | 
| Linus Walleij | 908a543 | 2017-09-24 18:19:18 +0200 | [diff] [blame] | 688 | 		const char *parent_name, struct gpio_desc *gpiod, | 
| Stephen Boyd | b120743 | 2016-02-07 00:27:55 -0800 | [diff] [blame] | 689 | 		unsigned long flags); | 
 | 690 | void clk_hw_unregister_gpio_gate(struct clk_hw *hw); | 
| Jyri Sarha | c873d14 | 2014-09-05 15:21:34 +0300 | [diff] [blame] | 691 |  | 
| Sascha Hauer | f0948f5 | 2012-05-03 15:36:14 +0530 | [diff] [blame] | 692 | /** | 
| Sergej Sawazki | 80eeb1f | 2015-06-28 16:24:55 +0200 | [diff] [blame] | 693 |  * struct clk_gpio_mux - gpio controlled clock multiplexer | 
 | 694 |  * | 
 | 695 |  * @hw:		see struct clk_gpio | 
 | 696 |  * @gpiod:	gpio descriptor to select the parent of this clock multiplexer | 
 | 697 |  * | 
 | 698 |  * Clock with a gpio control for selecting the parent clock. | 
 | 699 |  * Implements .get_parent, .set_parent and .determine_rate | 
 | 700 |  */ | 
 | 701 |  | 
 | 702 | extern const struct clk_ops clk_gpio_mux_ops; | 
 | 703 | struct clk *clk_register_gpio_mux(struct device *dev, const char *name, | 
| Linus Walleij | 908a543 | 2017-09-24 18:19:18 +0200 | [diff] [blame] | 704 | 		const char * const *parent_names, u8 num_parents, struct gpio_desc *gpiod, | 
 | 705 | 		unsigned long flags); | 
| Stephen Boyd | b120743 | 2016-02-07 00:27:55 -0800 | [diff] [blame] | 706 | struct clk_hw *clk_hw_register_gpio_mux(struct device *dev, const char *name, | 
| Linus Walleij | 908a543 | 2017-09-24 18:19:18 +0200 | [diff] [blame] | 707 | 		const char * const *parent_names, u8 num_parents, struct gpio_desc *gpiod, | 
 | 708 | 		unsigned long flags); | 
| Stephen Boyd | b120743 | 2016-02-07 00:27:55 -0800 | [diff] [blame] | 709 | void clk_hw_unregister_gpio_mux(struct clk_hw *hw); | 
| Sergej Sawazki | 80eeb1f | 2015-06-28 16:24:55 +0200 | [diff] [blame] | 710 |  | 
| Sergej Sawazki | 80eeb1f | 2015-06-28 16:24:55 +0200 | [diff] [blame] | 711 | /** | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 712 |  * clk_register - allocate a new clock, register it and return an opaque cookie | 
 | 713 |  * @dev: device that is registering this clock | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 714 |  * @hw: link to hardware-specific clock data | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 715 |  * | 
 | 716 |  * clk_register is the primary interface for populating the clock tree with new | 
 | 717 |  * clock nodes.  It returns a pointer to the newly allocated struct clk which | 
 | 718 |  * cannot be dereferenced by driver code but may be used in conjuction with the | 
| Mike Turquette | d1302a3 | 2012-03-29 14:30:40 -0700 | [diff] [blame] | 719 |  * rest of the clock API.  In the event of an error clk_register will return an | 
 | 720 |  * error code; drivers must test for an error code after calling clk_register. | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 721 |  */ | 
| Saravana Kannan | 0197b3e | 2012-04-25 22:58:56 -0700 | [diff] [blame] | 722 | struct clk *clk_register(struct device *dev, struct clk_hw *hw); | 
| Stephen Boyd | 46c8773 | 2012-09-24 13:38:04 -0700 | [diff] [blame] | 723 | struct clk *devm_clk_register(struct device *dev, struct clk_hw *hw); | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 724 |  | 
| Stephen Boyd | 4143804 | 2016-02-05 17:02:52 -0800 | [diff] [blame] | 725 | int __must_check clk_hw_register(struct device *dev, struct clk_hw *hw); | 
 | 726 | int __must_check devm_clk_hw_register(struct device *dev, struct clk_hw *hw); | 
 | 727 |  | 
| Mark Brown | 1df5c93 | 2012-04-18 09:07:12 +0100 | [diff] [blame] | 728 | void clk_unregister(struct clk *clk); | 
| Stephen Boyd | 46c8773 | 2012-09-24 13:38:04 -0700 | [diff] [blame] | 729 | void devm_clk_unregister(struct device *dev, struct clk *clk); | 
| Mark Brown | 1df5c93 | 2012-04-18 09:07:12 +0100 | [diff] [blame] | 730 |  | 
| Stephen Boyd | 4143804 | 2016-02-05 17:02:52 -0800 | [diff] [blame] | 731 | void clk_hw_unregister(struct clk_hw *hw); | 
 | 732 | void devm_clk_hw_unregister(struct device *dev, struct clk_hw *hw); | 
 | 733 |  | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 734 | /* helper functions */ | 
| Geert Uytterhoeven | b76281c | 2015-10-16 14:35:21 +0200 | [diff] [blame] | 735 | const char *__clk_get_name(const struct clk *clk); | 
| Stephen Boyd | e7df6f6 | 2015-08-12 13:04:56 -0700 | [diff] [blame] | 736 | const char *clk_hw_get_name(const struct clk_hw *hw); | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 737 | struct clk_hw *__clk_get_hw(struct clk *clk); | 
| Stephen Boyd | e7df6f6 | 2015-08-12 13:04:56 -0700 | [diff] [blame] | 738 | unsigned int clk_hw_get_num_parents(const struct clk_hw *hw); | 
 | 739 | struct clk_hw *clk_hw_get_parent(const struct clk_hw *hw); | 
 | 740 | struct clk_hw *clk_hw_get_parent_by_index(const struct clk_hw *hw, | 
| Stephen Boyd | 1a9c069 | 2015-06-25 15:55:14 -0700 | [diff] [blame] | 741 | 					  unsigned int index); | 
| Linus Torvalds | 9387468 | 2012-12-11 11:25:08 -0800 | [diff] [blame] | 742 | unsigned int __clk_get_enable_count(struct clk *clk); | 
| Stephen Boyd | e7df6f6 | 2015-08-12 13:04:56 -0700 | [diff] [blame] | 743 | unsigned long clk_hw_get_rate(const struct clk_hw *hw); | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 744 | unsigned long __clk_get_flags(struct clk *clk); | 
| Stephen Boyd | e7df6f6 | 2015-08-12 13:04:56 -0700 | [diff] [blame] | 745 | unsigned long clk_hw_get_flags(const struct clk_hw *hw); | 
 | 746 | bool clk_hw_is_prepared(const struct clk_hw *hw); | 
| Joachim Eastwood | be68bf8 | 2015-10-24 18:55:22 +0200 | [diff] [blame] | 747 | bool clk_hw_is_enabled(const struct clk_hw *hw); | 
| Stephen Boyd | 2ac6b1f | 2012-10-03 23:38:55 -0700 | [diff] [blame] | 748 | bool __clk_is_enabled(struct clk *clk); | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 749 | struct clk *__clk_lookup(const char *name); | 
| Boris Brezillon | 0817b62 | 2015-07-07 20:48:08 +0200 | [diff] [blame] | 750 | int __clk_mux_determine_rate(struct clk_hw *hw, | 
 | 751 | 			     struct clk_rate_request *req); | 
 | 752 | int __clk_determine_rate(struct clk_hw *core, struct clk_rate_request *req); | 
 | 753 | int __clk_mux_determine_rate_closest(struct clk_hw *hw, | 
 | 754 | 				     struct clk_rate_request *req); | 
| Tomeu Vizoso | 42c8654 | 2015-03-11 11:34:25 +0100 | [diff] [blame] | 755 | void clk_hw_reparent(struct clk_hw *hw, struct clk_hw *new_parent); | 
| Stephen Boyd | 9783c0d | 2015-07-16 12:50:27 -0700 | [diff] [blame] | 756 | void clk_hw_set_rate_range(struct clk_hw *hw, unsigned long min_rate, | 
 | 757 | 			   unsigned long max_rate); | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 758 |  | 
| Javier Martinez Canillas | 2e65d8b | 2015-02-12 14:58:29 +0100 | [diff] [blame] | 759 | static inline void __clk_hw_set_clk(struct clk_hw *dst, struct clk_hw *src) | 
 | 760 | { | 
 | 761 | 	dst->clk = src->clk; | 
 | 762 | 	dst->core = src->core; | 
 | 763 | } | 
 | 764 |  | 
| Maxime Ripard | 22833a9 | 2017-05-17 09:40:30 +0200 | [diff] [blame] | 765 | static inline long divider_round_rate(struct clk_hw *hw, unsigned long rate, | 
 | 766 | 				      unsigned long *prate, | 
 | 767 | 				      const struct clk_div_table *table, | 
 | 768 | 				      u8 width, unsigned long flags) | 
 | 769 | { | 
 | 770 | 	return divider_round_rate_parent(hw, clk_hw_get_parent(hw), | 
 | 771 | 					 rate, prate, table, width, flags); | 
 | 772 | } | 
 | 773 |  | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 774 | /* | 
 | 775 |  * FIXME clock api without lock protection | 
 | 776 |  */ | 
| Stephen Boyd | 1a9c069 | 2015-06-25 15:55:14 -0700 | [diff] [blame] | 777 | unsigned long clk_hw_round_rate(struct clk_hw *hw, unsigned long rate); | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 778 |  | 
| Grant Likely | 766e6a4 | 2012-04-09 14:50:06 -0500 | [diff] [blame] | 779 | struct of_device_id; | 
 | 780 |  | 
 | 781 | typedef void (*of_clk_init_cb_t)(struct device_node *); | 
 | 782 |  | 
| Sebastian Hesselbarth | 0b151de | 2013-05-01 02:58:28 +0200 | [diff] [blame] | 783 | struct clk_onecell_data { | 
 | 784 | 	struct clk **clks; | 
 | 785 | 	unsigned int clk_num; | 
 | 786 | }; | 
 | 787 |  | 
| Stephen Boyd | 0861e5b | 2016-02-05 17:38:26 -0800 | [diff] [blame] | 788 | struct clk_hw_onecell_data { | 
| Masahiro Yamada | 5963f19 | 2016-09-23 21:29:36 +0900 | [diff] [blame] | 789 | 	unsigned int num; | 
| Stephen Boyd | 0861e5b | 2016-02-05 17:38:26 -0800 | [diff] [blame] | 790 | 	struct clk_hw *hws[]; | 
 | 791 | }; | 
 | 792 |  | 
| Tero Kristo | 819b486 | 2013-10-22 11:39:36 +0300 | [diff] [blame] | 793 | extern struct of_device_id __clk_of_table; | 
 | 794 |  | 
| Rob Herring | 54196cc | 2014-05-08 16:09:24 -0500 | [diff] [blame] | 795 | #define CLK_OF_DECLARE(name, compat, fn) OF_DECLARE_1(clk, name, compat, fn) | 
| Sebastian Hesselbarth | 0b151de | 2013-05-01 02:58:28 +0200 | [diff] [blame] | 796 |  | 
| Ricardo Ribalda Delgado | c7296c5 | 2016-07-05 18:23:25 +0200 | [diff] [blame] | 797 | /* | 
 | 798 |  * Use this macro when you have a driver that requires two initialization | 
 | 799 |  * routines, one at of_clk_init(), and one at platform device probe | 
 | 800 |  */ | 
 | 801 | #define CLK_OF_DECLARE_DRIVER(name, compat, fn) \ | 
| Shawn Guo | 339e1e5 | 2016-10-08 16:59:38 +0800 | [diff] [blame] | 802 | 	static void __init name##_of_clk_init_driver(struct device_node *np) \ | 
| Ricardo Ribalda Delgado | c7296c5 | 2016-07-05 18:23:25 +0200 | [diff] [blame] | 803 | 	{								\ | 
 | 804 | 		of_node_clear_flag(np, OF_POPULATED);			\ | 
 | 805 | 		fn(np);							\ | 
 | 806 | 	}								\ | 
 | 807 | 	OF_DECLARE_1(clk, name, compat, name##_of_clk_init_driver) | 
 | 808 |  | 
| Sebastian Hesselbarth | 0b151de | 2013-05-01 02:58:28 +0200 | [diff] [blame] | 809 | #ifdef CONFIG_OF | 
| Grant Likely | 766e6a4 | 2012-04-09 14:50:06 -0500 | [diff] [blame] | 810 | int of_clk_add_provider(struct device_node *np, | 
 | 811 | 			struct clk *(*clk_src_get)(struct of_phandle_args *args, | 
 | 812 | 						   void *data), | 
 | 813 | 			void *data); | 
| Stephen Boyd | 0861e5b | 2016-02-05 17:38:26 -0800 | [diff] [blame] | 814 | int of_clk_add_hw_provider(struct device_node *np, | 
 | 815 | 			   struct clk_hw *(*get)(struct of_phandle_args *clkspec, | 
 | 816 | 						 void *data), | 
 | 817 | 			   void *data); | 
| Stephen Boyd | aa795c4 | 2017-09-01 16:16:40 -0700 | [diff] [blame] | 818 | int devm_of_clk_add_hw_provider(struct device *dev, | 
 | 819 | 			   struct clk_hw *(*get)(struct of_phandle_args *clkspec, | 
 | 820 | 						 void *data), | 
 | 821 | 			   void *data); | 
| Grant Likely | 766e6a4 | 2012-04-09 14:50:06 -0500 | [diff] [blame] | 822 | void of_clk_del_provider(struct device_node *np); | 
| Stephen Boyd | aa795c4 | 2017-09-01 16:16:40 -0700 | [diff] [blame] | 823 | void devm_of_clk_del_provider(struct device *dev); | 
| Grant Likely | 766e6a4 | 2012-04-09 14:50:06 -0500 | [diff] [blame] | 824 | struct clk *of_clk_src_simple_get(struct of_phandle_args *clkspec, | 
 | 825 | 				  void *data); | 
| Stephen Boyd | 0861e5b | 2016-02-05 17:38:26 -0800 | [diff] [blame] | 826 | struct clk_hw *of_clk_hw_simple_get(struct of_phandle_args *clkspec, | 
 | 827 | 				    void *data); | 
| Shawn Guo | 494bfec | 2012-08-22 21:36:27 +0800 | [diff] [blame] | 828 | struct clk *of_clk_src_onecell_get(struct of_phandle_args *clkspec, void *data); | 
| Stephen Boyd | 0861e5b | 2016-02-05 17:38:26 -0800 | [diff] [blame] | 829 | struct clk_hw *of_clk_hw_onecell_get(struct of_phandle_args *clkspec, | 
 | 830 | 				     void *data); | 
| Stephen Boyd | 929e7f3 | 2016-02-19 15:52:32 -0800 | [diff] [blame] | 831 | unsigned int of_clk_get_parent_count(struct device_node *np); | 
| Dinh Nguyen | 2e61dfb | 2015-06-05 11:26:13 -0500 | [diff] [blame] | 832 | int of_clk_parent_fill(struct device_node *np, const char **parents, | 
 | 833 | 		       unsigned int size); | 
| Grant Likely | 766e6a4 | 2012-04-09 14:50:06 -0500 | [diff] [blame] | 834 | const char *of_clk_get_parent_name(struct device_node *np, int index); | 
| Lee Jones | d56f899 | 2016-02-11 13:19:11 -0800 | [diff] [blame] | 835 | int of_clk_detect_critical(struct device_node *np, int index, | 
 | 836 | 			    unsigned long *flags); | 
| Grant Likely | 766e6a4 | 2012-04-09 14:50:06 -0500 | [diff] [blame] | 837 | void of_clk_init(const struct of_device_id *matches); | 
 | 838 |  | 
| Sebastian Hesselbarth | 0b151de | 2013-05-01 02:58:28 +0200 | [diff] [blame] | 839 | #else /* !CONFIG_OF */ | 
| Prashant Gaikwad | f2f6c25 | 2013-01-04 12:30:52 +0530 | [diff] [blame] | 840 |  | 
| Sebastian Hesselbarth | 0b151de | 2013-05-01 02:58:28 +0200 | [diff] [blame] | 841 | static inline int of_clk_add_provider(struct device_node *np, | 
 | 842 | 			struct clk *(*clk_src_get)(struct of_phandle_args *args, | 
 | 843 | 						   void *data), | 
 | 844 | 			void *data) | 
 | 845 | { | 
 | 846 | 	return 0; | 
 | 847 | } | 
| Stephen Boyd | 0861e5b | 2016-02-05 17:38:26 -0800 | [diff] [blame] | 848 | static inline int of_clk_add_hw_provider(struct device_node *np, | 
 | 849 | 			struct clk_hw *(*get)(struct of_phandle_args *clkspec, | 
 | 850 | 					      void *data), | 
 | 851 | 			void *data) | 
 | 852 | { | 
 | 853 | 	return 0; | 
 | 854 | } | 
| Stephen Boyd | aa795c4 | 2017-09-01 16:16:40 -0700 | [diff] [blame] | 855 | static inline int devm_of_clk_add_hw_provider(struct device *dev, | 
 | 856 | 			   struct clk_hw *(*get)(struct of_phandle_args *clkspec, | 
 | 857 | 						 void *data), | 
 | 858 | 			   void *data) | 
 | 859 | { | 
 | 860 | 	return 0; | 
 | 861 | } | 
| Geert Uytterhoeven | 20dd882 | 2015-10-29 22:12:56 +0100 | [diff] [blame] | 862 | static inline void of_clk_del_provider(struct device_node *np) {} | 
| Stephen Boyd | aa795c4 | 2017-09-01 16:16:40 -0700 | [diff] [blame] | 863 | static inline void devm_of_clk_del_provider(struct device *dev) {} | 
| Sebastian Hesselbarth | 0b151de | 2013-05-01 02:58:28 +0200 | [diff] [blame] | 864 | static inline struct clk *of_clk_src_simple_get( | 
 | 865 | 	struct of_phandle_args *clkspec, void *data) | 
 | 866 | { | 
 | 867 | 	return ERR_PTR(-ENOENT); | 
 | 868 | } | 
| Stephen Boyd | 0861e5b | 2016-02-05 17:38:26 -0800 | [diff] [blame] | 869 | static inline struct clk_hw * | 
 | 870 | of_clk_hw_simple_get(struct of_phandle_args *clkspec, void *data) | 
 | 871 | { | 
 | 872 | 	return ERR_PTR(-ENOENT); | 
 | 873 | } | 
| Sebastian Hesselbarth | 0b151de | 2013-05-01 02:58:28 +0200 | [diff] [blame] | 874 | static inline struct clk *of_clk_src_onecell_get( | 
 | 875 | 	struct of_phandle_args *clkspec, void *data) | 
 | 876 | { | 
 | 877 | 	return ERR_PTR(-ENOENT); | 
 | 878 | } | 
| Stephen Boyd | 0861e5b | 2016-02-05 17:38:26 -0800 | [diff] [blame] | 879 | static inline struct clk_hw * | 
 | 880 | of_clk_hw_onecell_get(struct of_phandle_args *clkspec, void *data) | 
 | 881 | { | 
 | 882 | 	return ERR_PTR(-ENOENT); | 
 | 883 | } | 
| Rafał Miłecki | d42c047 | 2016-08-26 14:58:07 +0200 | [diff] [blame] | 884 | static inline unsigned int of_clk_get_parent_count(struct device_node *np) | 
| Stephen Boyd | 679c51c | 2015-10-26 11:55:34 -0700 | [diff] [blame] | 885 | { | 
 | 886 | 	return 0; | 
 | 887 | } | 
 | 888 | static inline int of_clk_parent_fill(struct device_node *np, | 
 | 889 | 				     const char **parents, unsigned int size) | 
 | 890 | { | 
 | 891 | 	return 0; | 
 | 892 | } | 
| Sebastian Hesselbarth | 0b151de | 2013-05-01 02:58:28 +0200 | [diff] [blame] | 893 | static inline const char *of_clk_get_parent_name(struct device_node *np, | 
 | 894 | 						 int index) | 
 | 895 | { | 
 | 896 | 	return NULL; | 
 | 897 | } | 
| Lee Jones | d56f899 | 2016-02-11 13:19:11 -0800 | [diff] [blame] | 898 | static inline int of_clk_detect_critical(struct device_node *np, int index, | 
 | 899 | 					  unsigned long *flags) | 
 | 900 | { | 
 | 901 | 	return 0; | 
 | 902 | } | 
| Geert Uytterhoeven | 20dd882 | 2015-10-29 22:12:56 +0100 | [diff] [blame] | 903 | static inline void of_clk_init(const struct of_device_id *matches) {} | 
| Sebastian Hesselbarth | 0b151de | 2013-05-01 02:58:28 +0200 | [diff] [blame] | 904 | #endif /* CONFIG_OF */ | 
| Gerhard Sittig | aa514ce | 2013-07-22 14:14:40 +0200 | [diff] [blame] | 905 |  | 
 | 906 | /* | 
 | 907 |  * wrap access to peripherals in accessor routines | 
 | 908 |  * for improved portability across platforms | 
 | 909 |  */ | 
 | 910 |  | 
| Gerhard Sittig | 6d8cdb6 | 2013-11-30 23:51:24 +0100 | [diff] [blame] | 911 | #if IS_ENABLED(CONFIG_PPC) | 
 | 912 |  | 
 | 913 | static inline u32 clk_readl(u32 __iomem *reg) | 
 | 914 | { | 
 | 915 | 	return ioread32be(reg); | 
 | 916 | } | 
 | 917 |  | 
 | 918 | static inline void clk_writel(u32 val, u32 __iomem *reg) | 
 | 919 | { | 
 | 920 | 	iowrite32be(val, reg); | 
 | 921 | } | 
 | 922 |  | 
 | 923 | #else	/* platform dependent I/O accessors */ | 
 | 924 |  | 
| Gerhard Sittig | aa514ce | 2013-07-22 14:14:40 +0200 | [diff] [blame] | 925 | static inline u32 clk_readl(u32 __iomem *reg) | 
 | 926 | { | 
 | 927 | 	return readl(reg); | 
 | 928 | } | 
 | 929 |  | 
 | 930 | static inline void clk_writel(u32 val, u32 __iomem *reg) | 
 | 931 | { | 
 | 932 | 	writel(val, reg); | 
 | 933 | } | 
 | 934 |  | 
| Gerhard Sittig | 6d8cdb6 | 2013-11-30 23:51:24 +0100 | [diff] [blame] | 935 | #endif	/* platform dependent I/O accessors */ | 
 | 936 |  | 
| Peter De Schrijver | fb2b3c9 | 2014-06-26 18:00:53 +0300 | [diff] [blame] | 937 | #ifdef CONFIG_DEBUG_FS | 
| Tomeu Vizoso | 61c7cdd | 2014-12-02 08:54:21 +0100 | [diff] [blame] | 938 | struct dentry *clk_debugfs_add_file(struct clk_hw *hw, char *name, umode_t mode, | 
| Peter De Schrijver | fb2b3c9 | 2014-06-26 18:00:53 +0300 | [diff] [blame] | 939 | 				void *data, const struct file_operations *fops); | 
 | 940 | #endif | 
 | 941 |  | 
| Mike Turquette | b2476490 | 2012-03-15 23:11:19 -0700 | [diff] [blame] | 942 | #endif /* CONFIG_COMMON_CLK */ | 
 | 943 | #endif /* CLK_PROVIDER_H */ |