1/* 2 * linux/include/linux/clk.h 3 * 4 * Copyright (C) 2004 ARM Limited. 5 * Written by Deep Blue Solutions Limited. 6 * Copyright (C) 2011-2012 Linaro Ltd <mturquette@linaro.org> 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License version 2 as 10 * published by the Free Software Foundation. 11 */ 12#ifndef __LINUX_CLK_H 13#define __LINUX_CLK_H 14 15#include <linux/kernel.h> 16#include <linux/notifier.h> 17 18struct device; 19 20struct clk; 21 22#ifdef CONFIG_COMMON_CLK 23 24/** 25 * DOC: clk notifier callback types 26 * 27 * PRE_RATE_CHANGE - called immediately before the clk rate is changed, 28 * to indicate that the rate change will proceed. Drivers must 29 * immediately terminate any operations that will be affected by the 30 * rate change. Callbacks may either return NOTIFY_DONE or 31 * NOTIFY_STOP. 32 * 33 * ABORT_RATE_CHANGE: called if the rate change failed for some reason 34 * after PRE_RATE_CHANGE. In this case, all registered notifiers on 35 * the clk will be called with ABORT_RATE_CHANGE. Callbacks must 36 * always return NOTIFY_DONE. 37 * 38 * POST_RATE_CHANGE - called after the clk rate change has successfully 39 * completed. Callbacks must always return NOTIFY_DONE. 40 * 41 */ 42#define PRE_RATE_CHANGE BIT(0) 43#define POST_RATE_CHANGE BIT(1) 44#define ABORT_RATE_CHANGE BIT(2) 45 46/** 47 * struct clk_notifier - associate a clk with a notifier 48 * @clk: struct clk * to associate the notifier with 49 * @notifier_head: a blocking_notifier_head for this clk 50 * @node: linked list pointers 51 * 52 * A list of struct clk_notifier is maintained by the notifier code. 53 * An entry is created whenever code registers the first notifier on a 54 * particular @clk. Future notifiers on that @clk are added to the 55 * @notifier_head. 56 */ 57struct clk_notifier { 58 struct clk *clk; 59 struct srcu_notifier_head notifier_head; 60 struct list_head node; 61}; 62 63/** 64 * struct clk_notifier_data - rate data to pass to the notifier callback 65 * @clk: struct clk * being changed 66 * @old_rate: previous rate of this clk 67 * @new_rate: new rate of this clk 68 * 69 * For a pre-notifier, old_rate is the clk's rate before this rate 70 * change, and new_rate is what the rate will be in the future. For a 71 * post-notifier, old_rate and new_rate are both set to the clk's 72 * current rate (this was done to optimize the implementation). 73 */ 74struct clk_notifier_data { 75 struct clk *clk; 76 unsigned long old_rate; 77 unsigned long new_rate; 78}; 79 80int clk_notifier_register(struct clk *clk, struct notifier_block *nb); 81 82int clk_notifier_unregister(struct clk *clk, struct notifier_block *nb); 83 84#endif 85 86/** 87 * clk_get - lookup and obtain a reference to a clock producer. 88 * @dev: device for clock "consumer" 89 * @id: clock comsumer ID 90 * 91 * Returns a struct clk corresponding to the clock producer, or 92 * valid IS_ERR() condition containing errno. The implementation 93 * uses @dev and @id to determine the clock consumer, and thereby 94 * the clock producer. (IOW, @id may be identical strings, but 95 * clk_get may return different clock producers depending on @dev.) 96 * 97 * Drivers must assume that the clock source is not enabled. 98 * 99 * clk_get should not be called from within interrupt context. 100 */ 101struct clk *clk_get(struct device *dev, const char *id); 102 103/** 104 * devm_clk_get - lookup and obtain a managed reference to a clock producer. 105 * @dev: device for clock "consumer" 106 * @id: clock comsumer ID 107 * 108 * Returns a struct clk corresponding to the clock producer, or 109 * valid IS_ERR() condition containing errno. The implementation 110 * uses @dev and @id to determine the clock consumer, and thereby 111 * the clock producer. (IOW, @id may be identical strings, but 112 * clk_get may return different clock producers depending on @dev.) 113 * 114 * Drivers must assume that the clock source is not enabled. 115 * 116 * devm_clk_get should not be called from within interrupt context. 117 * 118 * The clock will automatically be freed when the device is unbound 119 * from the bus. 120 */ 121struct clk *devm_clk_get(struct device *dev, const char *id); 122 123/** 124 * clk_prepare - prepare a clock source 125 * @clk: clock source 126 * 127 * This prepares the clock source for use. 128 * 129 * Must not be called from within atomic context. 130 */ 131#ifdef CONFIG_HAVE_CLK_PREPARE 132int clk_prepare(struct clk *clk); 133#else 134static inline int clk_prepare(struct clk *clk) 135{ 136 might_sleep(); 137 return 0; 138} 139#endif 140 141/** 142 * clk_enable - inform the system when the clock source should be running. 143 * @clk: clock source 144 * 145 * If the clock can not be enabled/disabled, this should return success. 146 * 147 * May be called from atomic contexts. 148 * 149 * Returns success (0) or negative errno. 150 */ 151int clk_enable(struct clk *clk); 152 153/** 154 * clk_disable - inform the system when the clock source is no longer required. 155 * @clk: clock source 156 * 157 * Inform the system that a clock source is no longer required by 158 * a driver and may be shut down. 159 * 160 * May be called from atomic contexts. 161 * 162 * Implementation detail: if the clock source is shared between 163 * multiple drivers, clk_enable() calls must be balanced by the 164 * same number of clk_disable() calls for the clock source to be 165 * disabled. 166 */ 167void clk_disable(struct clk *clk); 168 169 170/** 171 * clk_unprepare - undo preparation of a clock source 172 * @clk: clock source 173 * 174 * This undoes a previously prepared clock. The caller must balance 175 * the number of prepare and unprepare calls. 176 * 177 * Must not be called from within atomic context. 178 */ 179#ifdef CONFIG_HAVE_CLK_PREPARE 180void clk_unprepare(struct clk *clk); 181#else 182static inline void clk_unprepare(struct clk *clk) 183{ 184 might_sleep(); 185} 186#endif 187 188/* clk_prepare_enable helps cases using clk_enable in non-atomic context. */ 189static inline int clk_prepare_enable(struct clk *clk) 190{ 191 int ret; 192 193 ret = clk_prepare(clk); 194 if (ret) 195 return ret; 196 ret = clk_enable(clk); 197 if (ret) 198 clk_unprepare(clk); 199 200 return ret; 201} 202 203/* clk_disable_unprepare helps cases using clk_disable in non-atomic context. */ 204static inline void clk_disable_unprepare(struct clk *clk) 205{ 206 clk_disable(clk); 207 clk_unprepare(clk); 208} 209 210/** 211 * clk_get_rate - obtain the current clock rate (in Hz) for a clock source. 212 * This is only valid once the clock source has been enabled. 213 * @clk: clock source 214 */ 215unsigned long clk_get_rate(struct clk *clk); 216 217/** 218 * clk_put - "free" the clock source 219 * @clk: clock source 220 * 221 * Note: drivers must ensure that all clk_enable calls made on this 222 * clock source are balanced by clk_disable calls prior to calling 223 * this function. 224 * 225 * clk_put should not be called from within interrupt context. 226 */ 227void clk_put(struct clk *clk); 228 229/** 230 * devm_clk_put - "free" a managed clock source 231 * @dev: device used to acuqire the clock 232 * @clk: clock source acquired with devm_clk_get() 233 * 234 * Note: drivers must ensure that all clk_enable calls made on this 235 * clock source are balanced by clk_disable calls prior to calling 236 * this function. 237 * 238 * clk_put should not be called from within interrupt context. 239 */ 240void devm_clk_put(struct device *dev, struct clk *clk); 241 242/* 243 * The remaining APIs are optional for machine class support. 244 */ 245 246 247/** 248 * clk_round_rate - adjust a rate to the exact rate a clock can provide 249 * @clk: clock source 250 * @rate: desired clock rate in Hz 251 * 252 * Returns rounded clock rate in Hz, or negative errno. 253 */ 254long clk_round_rate(struct clk *clk, unsigned long rate); 255 256/** 257 * clk_set_rate - set the clock rate for a clock source 258 * @clk: clock source 259 * @rate: desired clock rate in Hz 260 * 261 * Returns success (0) or negative errno. 262 */ 263int clk_set_rate(struct clk *clk, unsigned long rate); 264 265/** 266 * clk_set_parent - set the parent clock source for this clock 267 * @clk: clock source 268 * @parent: parent clock source 269 * 270 * Returns success (0) or negative errno. 271 */ 272int clk_set_parent(struct clk *clk, struct clk *parent); 273 274/** 275 * clk_get_parent - get the parent clock source for this clock 276 * @clk: clock source 277 * 278 * Returns struct clk corresponding to parent clock source, or 279 * valid IS_ERR() condition containing errno. 280 */ 281struct clk *clk_get_parent(struct clk *clk); 282 283/** 284 * clk_get_sys - get a clock based upon the device name 285 * @dev_id: device name 286 * @con_id: connection ID 287 * 288 * Returns a struct clk corresponding to the clock producer, or 289 * valid IS_ERR() condition containing errno. The implementation 290 * uses @dev_id and @con_id to determine the clock consumer, and 291 * thereby the clock producer. In contrast to clk_get() this function 292 * takes the device name instead of the device itself for identification. 293 * 294 * Drivers must assume that the clock source is not enabled. 295 * 296 * clk_get_sys should not be called from within interrupt context. 297 */ 298struct clk *clk_get_sys(const char *dev_id, const char *con_id); 299 300/** 301 * clk_add_alias - add a new clock alias 302 * @alias: name for clock alias 303 * @alias_dev_name: device name 304 * @id: platform specific clock name 305 * @dev: device 306 * 307 * Allows using generic clock names for drivers by adding a new alias. 308 * Assumes clkdev, see clkdev.h for more info. 309 */ 310int clk_add_alias(const char *alias, const char *alias_dev_name, char *id, 311 struct device *dev); 312 313#endif 314