Blame view

include/linux/clk.h 5.19 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
  /*
f8ce25476   Russell King   [ARM] Move asm/ha...
2
   *  linux/include/linux/clk.h
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3
4
5
6
7
8
9
10
   *
   *  Copyright (C) 2004 ARM Limited.
   *  Written by Deep Blue Solutions Limited.
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2 as
   * published by the Free Software Foundation.
   */
686f8c5d7   Todd Poynor   include/linux/clk...
11
12
  #ifndef __LINUX_CLK_H
  #define __LINUX_CLK_H
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
13

40d3e0f49   Russell King   clk: provide prep...
14
  #include <linux/kernel.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
  struct device;
  
  /*
   * The base API.
   */
  
  
  /*
   * struct clk - an machine class defined object / cookie.
   */
  struct clk;
  
  /**
   * clk_get - lookup and obtain a reference to a clock producer.
   * @dev: device for clock "consumer"
ea3f4eaca   Russell King   [PATCH] ARM: Add ...
30
   * @id: clock comsumer ID
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
31
32
   *
   * Returns a struct clk corresponding to the clock producer, or
ea3f4eaca   Russell King   [PATCH] ARM: Add ...
33
34
35
36
   * valid IS_ERR() condition containing errno.  The implementation
   * uses @dev and @id to determine the clock consumer, and thereby
   * the clock producer.  (IOW, @id may be identical strings, but
   * clk_get may return different clock producers depending on @dev.)
f47fc0ac7   Russell King   [ARM] Add additio...
37
38
   *
   * Drivers must assume that the clock source is not enabled.
f7ad160b4   Alex Raimondi   include/linux/clk...
39
40
   *
   * clk_get should not be called from within interrupt context.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
41
42
43
44
   */
  struct clk *clk_get(struct device *dev, const char *id);
  
  /**
40d3e0f49   Russell King   clk: provide prep...
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
   * clk_prepare - prepare a clock source
   * @clk: clock source
   *
   * This prepares the clock source for use.
   *
   * Must not be called from within atomic context.
   */
  #ifdef CONFIG_HAVE_CLK_PREPARE
  int clk_prepare(struct clk *clk);
  #else
  static inline int clk_prepare(struct clk *clk)
  {
  	might_sleep();
  	return 0;
  }
  #endif
  
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
63
64
65
66
67
   * clk_enable - inform the system when the clock source should be running.
   * @clk: clock source
   *
   * If the clock can not be enabled/disabled, this should return success.
   *
40d3e0f49   Russell King   clk: provide prep...
68
69
   * May be called from atomic contexts.
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
70
71
72
73
74
75
76
   * Returns success (0) or negative errno.
   */
  int clk_enable(struct clk *clk);
  
  /**
   * clk_disable - inform the system when the clock source is no longer required.
   * @clk: clock source
f47fc0ac7   Russell King   [ARM] Add additio...
77
78
79
80
   *
   * Inform the system that a clock source is no longer required by
   * a driver and may be shut down.
   *
40d3e0f49   Russell King   clk: provide prep...
81
82
   * May be called from atomic contexts.
   *
f47fc0ac7   Russell King   [ARM] Add additio...
83
84
85
86
   * Implementation detail: if the clock source is shared between
   * multiple drivers, clk_enable() calls must be balanced by the
   * same number of clk_disable() calls for the clock source to be
   * disabled.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
87
88
   */
  void clk_disable(struct clk *clk);
40d3e0f49   Russell King   clk: provide prep...
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
  
  /**
   * clk_unprepare - undo preparation of a clock source
   * @clk: clock source
   *
   * This undoes a previously prepared clock.  The caller must balance
   * the number of prepare and unprepare calls.
   *
   * Must not be called from within atomic context.
   */
  #ifdef CONFIG_HAVE_CLK_PREPARE
  void clk_unprepare(struct clk *clk);
  #else
  static inline void clk_unprepare(struct clk *clk)
  {
  	might_sleep();
  }
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
107
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
108
109
110
111
112
113
114
115
116
   * clk_get_rate - obtain the current clock rate (in Hz) for a clock source.
   *		  This is only valid once the clock source has been enabled.
   * @clk: clock source
   */
  unsigned long clk_get_rate(struct clk *clk);
  
  /**
   * clk_put	- "free" the clock source
   * @clk: clock source
f47fc0ac7   Russell King   [ARM] Add additio...
117
118
119
120
   *
   * Note: drivers must ensure that all clk_enable calls made on this
   * clock source are balanced by clk_disable calls prior to calling
   * this function.
f7ad160b4   Alex Raimondi   include/linux/clk...
121
122
   *
   * clk_put should not be called from within interrupt context.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
   */
  void clk_put(struct clk *clk);
  
  
  /*
   * The remaining APIs are optional for machine class support.
   */
  
  
  /**
   * clk_round_rate - adjust a rate to the exact rate a clock can provide
   * @clk: clock source
   * @rate: desired clock rate in Hz
   *
   * Returns rounded clock rate in Hz, or negative errno.
   */
  long clk_round_rate(struct clk *clk, unsigned long rate);
   
  /**
   * clk_set_rate - set the clock rate for a clock source
   * @clk: clock source
   * @rate: desired clock rate in Hz
   *
   * Returns success (0) or negative errno.
   */
  int clk_set_rate(struct clk *clk, unsigned long rate);
   
  /**
   * clk_set_parent - set the parent clock source for this clock
   * @clk: clock source
   * @parent: parent clock source
   *
   * Returns success (0) or negative errno.
   */
  int clk_set_parent(struct clk *clk, struct clk *parent);
  
  /**
   * clk_get_parent - get the parent clock source for this clock
   * @clk: clock source
   *
   * Returns struct clk corresponding to parent clock source, or
   * valid IS_ERR() condition containing errno.
   */
  struct clk *clk_get_parent(struct clk *clk);
05fd8e73e   Sascha Hauer   clkdev: add possi...
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
  /**
   * clk_get_sys - get a clock based upon the device name
   * @dev_id: device name
   * @con_id: connection ID
   *
   * Returns a struct clk corresponding to the clock producer, or
   * valid IS_ERR() condition containing errno.  The implementation
   * uses @dev_id and @con_id to determine the clock consumer, and
   * thereby the clock producer. In contrast to clk_get() this function
   * takes the device name instead of the device itself for identification.
   *
   * Drivers must assume that the clock source is not enabled.
   *
   * clk_get_sys should not be called from within interrupt context.
   */
  struct clk *clk_get_sys(const char *dev_id, const char *con_id);
c06830392   Tony Lindgren   [ARM] 5536/1: Mov...
183
184
185
186
187
188
189
190
191
192
193
194
  /**
   * clk_add_alias - add a new clock alias
   * @alias: name for clock alias
   * @alias_dev_name: device name
   * @id: platform specific clock name
   * @dev: device
   *
   * Allows using generic clock names for drivers by adding a new alias.
   * Assumes clkdev, see clkdev.h for more info.
   */
  int clk_add_alias(const char *alias, const char *alias_dev_name, char *id,
  			struct device *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
195
  #endif