aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/base
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/base')
-rw-r--r--drivers/base/power/clock_ops.c188
1 files changed, 94 insertions, 94 deletions
diff --git a/drivers/base/power/clock_ops.c b/drivers/base/power/clock_ops.c
index 2fb9c121c64b..a846b2f95cfb 100644
--- a/drivers/base/power/clock_ops.c
+++ b/drivers/base/power/clock_ops.c
@@ -17,7 +17,7 @@
17 17
18#ifdef CONFIG_PM 18#ifdef CONFIG_PM
19 19
20struct pm_runtime_clk_data { 20struct pm_clk_data {
21 struct list_head clock_list; 21 struct list_head clock_list;
22 struct mutex lock; 22 struct mutex lock;
23}; 23};
@@ -36,25 +36,25 @@ struct pm_clock_entry {
36 enum pce_status status; 36 enum pce_status status;
37}; 37};
38 38
39static struct pm_runtime_clk_data *__to_prd(struct device *dev) 39static struct pm_clk_data *__to_pcd(struct device *dev)
40{ 40{
41 return dev ? dev->power.subsys_data : NULL; 41 return dev ? dev->power.subsys_data : NULL;
42} 42}
43 43
44/** 44/**
45 * pm_runtime_clk_add - Start using a device clock for runtime PM. 45 * pm_clk_add - Start using a device clock for power management.
46 * @dev: Device whose clock is going to be used for runtime PM. 46 * @dev: Device whose clock is going to be used for power management.
47 * @con_id: Connection ID of the clock. 47 * @con_id: Connection ID of the clock.
48 * 48 *
49 * Add the clock represented by @con_id to the list of clocks used for 49 * Add the clock represented by @con_id to the list of clocks used for
50 * the runtime PM of @dev. 50 * the power management of @dev.
51 */ 51 */
52int pm_runtime_clk_add(struct device *dev, const char *con_id) 52int pm_clk_add(struct device *dev, const char *con_id)
53{ 53{
54 struct pm_runtime_clk_data *prd = __to_prd(dev); 54 struct pm_clk_data *pcd = __to_pcd(dev);
55 struct pm_clock_entry *ce; 55 struct pm_clock_entry *ce;
56 56
57 if (!prd) 57 if (!pcd)
58 return -EINVAL; 58 return -EINVAL;
59 59
60 ce = kzalloc(sizeof(*ce), GFP_KERNEL); 60 ce = kzalloc(sizeof(*ce), GFP_KERNEL);
@@ -73,20 +73,20 @@ int pm_runtime_clk_add(struct device *dev, const char *con_id)
73 } 73 }
74 } 74 }
75 75
76 mutex_lock(&prd->lock); 76 mutex_lock(&pcd->lock);
77 list_add_tail(&ce->node, &prd->clock_list); 77 list_add_tail(&ce->node, &pcd->clock_list);
78 mutex_unlock(&prd->lock); 78 mutex_unlock(&pcd->lock);
79 return 0; 79 return 0;
80} 80}
81 81
82/** 82/**
83 * __pm_runtime_clk_remove - Destroy runtime PM clock entry. 83 * __pm_clk_remove - Destroy PM clock entry.
84 * @ce: Runtime PM clock entry to destroy. 84 * @ce: PM clock entry to destroy.
85 * 85 *
86 * This routine must be called under the mutex protecting the runtime PM list 86 * This routine must be called under the mutex protecting the PM list of clocks
87 * of clocks corresponding the the @ce's device. 87 * corresponding the the @ce's device.
88 */ 88 */
89static void __pm_runtime_clk_remove(struct pm_clock_entry *ce) 89static void __pm_clk_remove(struct pm_clock_entry *ce)
90{ 90{
91 if (!ce) 91 if (!ce)
92 return; 92 return;
@@ -108,87 +108,87 @@ static void __pm_runtime_clk_remove(struct pm_clock_entry *ce)
108} 108}
109 109
110/** 110/**
111 * pm_runtime_clk_remove - Stop using a device clock for runtime PM. 111 * pm_clk_remove - Stop using a device clock for power management.
112 * @dev: Device whose clock should not be used for runtime PM any more. 112 * @dev: Device whose clock should not be used for PM any more.
113 * @con_id: Connection ID of the clock. 113 * @con_id: Connection ID of the clock.
114 * 114 *
115 * Remove the clock represented by @con_id from the list of clocks used for 115 * Remove the clock represented by @con_id from the list of clocks used for
116 * the runtime PM of @dev. 116 * the power management of @dev.
117 */ 117 */
118void pm_runtime_clk_remove(struct device *dev, const char *con_id) 118void pm_clk_remove(struct device *dev, const char *con_id)
119{ 119{
120 struct pm_runtime_clk_data *prd = __to_prd(dev); 120 struct pm_clk_data *pcd = __to_pcd(dev);
121 struct pm_clock_entry *ce; 121 struct pm_clock_entry *ce;
122 122
123 if (!prd) 123 if (!pcd)
124 return; 124 return;
125 125
126 mutex_lock(&prd->lock); 126 mutex_lock(&pcd->lock);
127 127
128 list_for_each_entry(ce, &prd->clock_list, node) { 128 list_for_each_entry(ce, &pcd->clock_list, node) {
129 if (!con_id && !ce->con_id) { 129 if (!con_id && !ce->con_id) {
130 __pm_runtime_clk_remove(ce); 130 __pm_clk_remove(ce);
131 break; 131 break;
132 } else if (!con_id || !ce->con_id) { 132 } else if (!con_id || !ce->con_id) {
133 continue; 133 continue;
134 } else if (!strcmp(con_id, ce->con_id)) { 134 } else if (!strcmp(con_id, ce->con_id)) {
135 __pm_runtime_clk_remove(ce); 135 __pm_clk_remove(ce);
136 break; 136 break;
137 } 137 }
138 } 138 }
139 139
140 mutex_unlock(&prd->lock); 140 mutex_unlock(&pcd->lock);
141} 141}
142 142
143/** 143/**
144 * pm_runtime_clk_init - Initialize a device's list of runtime PM clocks. 144 * pm_clk_init - Initialize a device's list of power management clocks.
145 * @dev: Device to initialize the list of runtime PM clocks for. 145 * @dev: Device to initialize the list of PM clocks for.
146 * 146 *
147 * Allocate a struct pm_runtime_clk_data object, initialize its lock member and 147 * Allocate a struct pm_clk_data object, initialize its lock member and
148 * make the @dev's power.subsys_data field point to it. 148 * make the @dev's power.subsys_data field point to it.
149 */ 149 */
150int pm_runtime_clk_init(struct device *dev) 150int pm_clk_init(struct device *dev)
151{ 151{
152 struct pm_runtime_clk_data *prd; 152 struct pm_clk_data *pcd;
153 153
154 prd = kzalloc(sizeof(*prd), GFP_KERNEL); 154 pcd = kzalloc(sizeof(*pcd), GFP_KERNEL);
155 if (!prd) { 155 if (!pcd) {
156 dev_err(dev, "Not enough memory fo runtime PM data.\n"); 156 dev_err(dev, "Not enough memory for PM clock data.\n");
157 return -ENOMEM; 157 return -ENOMEM;
158 } 158 }
159 159
160 INIT_LIST_HEAD(&prd->clock_list); 160 INIT_LIST_HEAD(&pcd->clock_list);
161 mutex_init(&prd->lock); 161 mutex_init(&pcd->lock);
162 dev->power.subsys_data = prd; 162 dev->power.subsys_data = pcd;
163 return 0; 163 return 0;
164} 164}
165 165
166/** 166/**
167 * pm_runtime_clk_destroy - Destroy a device's list of runtime PM clocks. 167 * pm_clk_destroy - Destroy a device's list of power management clocks.
168 * @dev: Device to destroy the list of runtime PM clocks for. 168 * @dev: Device to destroy the list of PM clocks for.
169 * 169 *
170 * Clear the @dev's power.subsys_data field, remove the list of clock entries 170 * Clear the @dev's power.subsys_data field, remove the list of clock entries
171 * from the struct pm_runtime_clk_data object pointed to by it before and free 171 * from the struct pm_clk_data object pointed to by it before and free
172 * that object. 172 * that object.
173 */ 173 */
174void pm_runtime_clk_destroy(struct device *dev) 174void pm_clk_destroy(struct device *dev)
175{ 175{
176 struct pm_runtime_clk_data *prd = __to_prd(dev); 176 struct pm_clk_data *pcd = __to_pcd(dev);
177 struct pm_clock_entry *ce, *c; 177 struct pm_clock_entry *ce, *c;
178 178
179 if (!prd) 179 if (!pcd)
180 return; 180 return;
181 181
182 dev->power.subsys_data = NULL; 182 dev->power.subsys_data = NULL;
183 183
184 mutex_lock(&prd->lock); 184 mutex_lock(&pcd->lock);
185 185
186 list_for_each_entry_safe_reverse(ce, c, &prd->clock_list, node) 186 list_for_each_entry_safe_reverse(ce, c, &pcd->clock_list, node)
187 __pm_runtime_clk_remove(ce); 187 __pm_clk_remove(ce);
188 188
189 mutex_unlock(&prd->lock); 189 mutex_unlock(&pcd->lock);
190 190
191 kfree(prd); 191 kfree(pcd);
192} 192}
193 193
194#endif /* CONFIG_PM */ 194#endif /* CONFIG_PM */
@@ -196,11 +196,11 @@ void pm_runtime_clk_destroy(struct device *dev)
196#ifdef CONFIG_PM_RUNTIME 196#ifdef CONFIG_PM_RUNTIME
197 197
198/** 198/**
199 * pm_runtime_clk_acquire - Acquire a device clock. 199 * pm_clk_acquire - Acquire a device clock.
200 * @dev: Device whose clock is to be acquired. 200 * @dev: Device whose clock is to be acquired.
201 * @con_id: Connection ID of the clock. 201 * @con_id: Connection ID of the clock.
202 */ 202 */
203static void pm_runtime_clk_acquire(struct device *dev, 203static void pm_clk_acquire(struct device *dev,
204 struct pm_clock_entry *ce) 204 struct pm_clock_entry *ce)
205{ 205{
206 ce->clk = clk_get(dev, ce->con_id); 206 ce->clk = clk_get(dev, ce->con_id);
@@ -213,24 +213,24 @@ static void pm_runtime_clk_acquire(struct device *dev,
213} 213}
214 214
215/** 215/**
216 * pm_runtime_clk_suspend - Disable clocks in a device's runtime PM clock list. 216 * pm_clk_suspend - Disable clocks in a device's PM clock list.
217 * @dev: Device to disable the clocks for. 217 * @dev: Device to disable the clocks for.
218 */ 218 */
219int pm_runtime_clk_suspend(struct device *dev) 219int pm_clk_suspend(struct device *dev)
220{ 220{
221 struct pm_runtime_clk_data *prd = __to_prd(dev); 221 struct pm_clk_data *pcd = __to_pcd(dev);
222 struct pm_clock_entry *ce; 222 struct pm_clock_entry *ce;
223 223
224 dev_dbg(dev, "%s()\n", __func__); 224 dev_dbg(dev, "%s()\n", __func__);
225 225
226 if (!prd) 226 if (!pcd)
227 return 0; 227 return 0;
228 228
229 mutex_lock(&prd->lock); 229 mutex_lock(&pcd->lock);
230 230
231 list_for_each_entry_reverse(ce, &prd->clock_list, node) { 231 list_for_each_entry_reverse(ce, &pcd->clock_list, node) {
232 if (ce->status == PCE_STATUS_NONE) 232 if (ce->status == PCE_STATUS_NONE)
233 pm_runtime_clk_acquire(dev, ce); 233 pm_clk_acquire(dev, ce);
234 234
235 if (ce->status < PCE_STATUS_ERROR) { 235 if (ce->status < PCE_STATUS_ERROR) {
236 clk_disable(ce->clk); 236 clk_disable(ce->clk);
@@ -238,30 +238,30 @@ int pm_runtime_clk_suspend(struct device *dev)
238 } 238 }
239 } 239 }
240 240
241 mutex_unlock(&prd->lock); 241 mutex_unlock(&pcd->lock);
242 242
243 return 0; 243 return 0;
244} 244}
245 245
246/** 246/**
247 * pm_runtime_clk_resume - Enable clocks in a device's runtime PM clock list. 247 * pm_clk_resume - Enable clocks in a device's PM clock list.
248 * @dev: Device to enable the clocks for. 248 * @dev: Device to enable the clocks for.
249 */ 249 */
250int pm_runtime_clk_resume(struct device *dev) 250int pm_clk_resume(struct device *dev)
251{ 251{
252 struct pm_runtime_clk_data *prd = __to_prd(dev); 252 struct pm_clk_data *pcd = __to_pcd(dev);
253 struct pm_clock_entry *ce; 253 struct pm_clock_entry *ce;
254 254
255 dev_dbg(dev, "%s()\n", __func__); 255 dev_dbg(dev, "%s()\n", __func__);
256 256
257 if (!prd) 257 if (!pcd)
258 return 0; 258 return 0;
259 259
260 mutex_lock(&prd->lock); 260 mutex_lock(&pcd->lock);
261 261
262 list_for_each_entry(ce, &prd->clock_list, node) { 262 list_for_each_entry(ce, &pcd->clock_list, node) {
263 if (ce->status == PCE_STATUS_NONE) 263 if (ce->status == PCE_STATUS_NONE)
264 pm_runtime_clk_acquire(dev, ce); 264 pm_clk_acquire(dev, ce);
265 265
266 if (ce->status < PCE_STATUS_ERROR) { 266 if (ce->status < PCE_STATUS_ERROR) {
267 clk_enable(ce->clk); 267 clk_enable(ce->clk);
@@ -269,13 +269,13 @@ int pm_runtime_clk_resume(struct device *dev)
269 } 269 }
270 } 270 }
271 271
272 mutex_unlock(&prd->lock); 272 mutex_unlock(&pcd->lock);
273 273
274 return 0; 274 return 0;
275} 275}
276 276
277/** 277/**
278 * pm_runtime_clk_notify - Notify routine for device addition and removal. 278 * pm_clk_notify - Notify routine for device addition and removal.
279 * @nb: Notifier block object this function is a member of. 279 * @nb: Notifier block object this function is a member of.
280 * @action: Operation being carried out by the caller. 280 * @action: Operation being carried out by the caller.
281 * @data: Device the routine is being run for. 281 * @data: Device the routine is being run for.
@@ -284,13 +284,13 @@ int pm_runtime_clk_resume(struct device *dev)
284 * struct pm_clk_notifier_block containing all of the requisite data. 284 * struct pm_clk_notifier_block containing all of the requisite data.
285 * Specifically, the pm_domain member of that object is copied to the device's 285 * Specifically, the pm_domain member of that object is copied to the device's
286 * pm_domain field and its con_ids member is used to populate the device's list 286 * pm_domain field and its con_ids member is used to populate the device's list
287 * of runtime PM clocks, depending on @action. 287 * of PM clocks, depending on @action.
288 * 288 *
289 * If the device's pm_domain field is already populated with a value different 289 * If the device's pm_domain field is already populated with a value different
290 * from the one stored in the struct pm_clk_notifier_block object, the function 290 * from the one stored in the struct pm_clk_notifier_block object, the function
291 * does nothing. 291 * does nothing.
292 */ 292 */
293static int pm_runtime_clk_notify(struct notifier_block *nb, 293static int pm_clk_notify(struct notifier_block *nb,
294 unsigned long action, void *data) 294 unsigned long action, void *data)
295{ 295{
296 struct pm_clk_notifier_block *clknb; 296 struct pm_clk_notifier_block *clknb;
@@ -307,16 +307,16 @@ static int pm_runtime_clk_notify(struct notifier_block *nb,
307 if (dev->pm_domain) 307 if (dev->pm_domain)
308 break; 308 break;
309 309
310 error = pm_runtime_clk_init(dev); 310 error = pm_clk_init(dev);
311 if (error) 311 if (error)
312 break; 312 break;
313 313
314 dev->pm_domain = clknb->pm_domain; 314 dev->pm_domain = clknb->pm_domain;
315 if (clknb->con_ids[0]) { 315 if (clknb->con_ids[0]) {
316 for (con_id = clknb->con_ids; *con_id; con_id++) 316 for (con_id = clknb->con_ids; *con_id; con_id++)
317 pm_runtime_clk_add(dev, *con_id); 317 pm_clk_add(dev, *con_id);
318 } else { 318 } else {
319 pm_runtime_clk_add(dev, NULL); 319 pm_clk_add(dev, NULL);
320 } 320 }
321 321
322 break; 322 break;
@@ -325,7 +325,7 @@ static int pm_runtime_clk_notify(struct notifier_block *nb,
325 break; 325 break;
326 326
327 dev->pm_domain = NULL; 327 dev->pm_domain = NULL;
328 pm_runtime_clk_destroy(dev); 328 pm_clk_destroy(dev);
329 break; 329 break;
330 } 330 }
331 331
@@ -337,51 +337,51 @@ static int pm_runtime_clk_notify(struct notifier_block *nb,
337#ifdef CONFIG_PM 337#ifdef CONFIG_PM
338 338
339/** 339/**
340 * pm_runtime_clk_suspend - Disable clocks in a device's PM clock list. 340 * pm_clk_suspend - Disable clocks in a device's PM clock list.
341 * @dev: Device to disable the clocks for. 341 * @dev: Device to disable the clocks for.
342 */ 342 */
343int pm_runtime_clk_suspend(struct device *dev) 343int pm_clk_suspend(struct device *dev)
344{ 344{
345 struct pm_runtime_clk_data *prd = __to_prd(dev); 345 struct pm_clk_data *pcd = __to_pcd(dev);
346 struct pm_clock_entry *ce; 346 struct pm_clock_entry *ce;
347 347
348 dev_dbg(dev, "%s()\n", __func__); 348 dev_dbg(dev, "%s()\n", __func__);
349 349
350 /* If there is no driver, the clocks are already disabled. */ 350 /* If there is no driver, the clocks are already disabled. */
351 if (!prd || !dev->driver) 351 if (!pcd || !dev->driver)
352 return 0; 352 return 0;
353 353
354 mutex_lock(&prd->lock); 354 mutex_lock(&pcd->lock);
355 355
356 list_for_each_entry_reverse(ce, &prd->clock_list, node) 356 list_for_each_entry_reverse(ce, &pcd->clock_list, node)
357 clk_disable(ce->clk); 357 clk_disable(ce->clk);
358 358
359 mutex_unlock(&prd->lock); 359 mutex_unlock(&pcd->lock);
360 360
361 return 0; 361 return 0;
362} 362}
363 363
364/** 364/**
365 * pm_runtime_clk_resume - Enable clocks in a device's PM clock list. 365 * pm_clk_resume - Enable clocks in a device's PM clock list.
366 * @dev: Device to enable the clocks for. 366 * @dev: Device to enable the clocks for.
367 */ 367 */
368int pm_runtime_clk_resume(struct device *dev) 368int pm_clk_resume(struct device *dev)
369{ 369{
370 struct pm_runtime_clk_data *prd = __to_prd(dev); 370 struct pm_clk_data *pcd = __to_pcd(dev);
371 struct pm_clock_entry *ce; 371 struct pm_clock_entry *ce;
372 372
373 dev_dbg(dev, "%s()\n", __func__); 373 dev_dbg(dev, "%s()\n", __func__);
374 374
375 /* If there is no driver, the clocks should remain disabled. */ 375 /* If there is no driver, the clocks should remain disabled. */
376 if (!prd || !dev->driver) 376 if (!pcd || !dev->driver)
377 return 0; 377 return 0;
378 378
379 mutex_lock(&prd->lock); 379 mutex_lock(&pcd->lock);
380 380
381 list_for_each_entry(ce, &prd->clock_list, node) 381 list_for_each_entry(ce, &pcd->clock_list, node)
382 clk_enable(ce->clk); 382 clk_enable(ce->clk);
383 383
384 mutex_unlock(&prd->lock); 384 mutex_unlock(&pcd->lock);
385 385
386 return 0; 386 return 0;
387} 387}
@@ -423,7 +423,7 @@ static void disable_clock(struct device *dev, const char *con_id)
423} 423}
424 424
425/** 425/**
426 * pm_runtime_clk_notify - Notify routine for device addition and removal. 426 * pm_clk_notify - Notify routine for device addition and removal.
427 * @nb: Notifier block object this function is a member of. 427 * @nb: Notifier block object this function is a member of.
428 * @action: Operation being carried out by the caller. 428 * @action: Operation being carried out by the caller.
429 * @data: Device the routine is being run for. 429 * @data: Device the routine is being run for.
@@ -433,7 +433,7 @@ static void disable_clock(struct device *dev, const char *con_id)
433 * Specifically, the con_ids member of that object is used to enable or disable 433 * Specifically, the con_ids member of that object is used to enable or disable
434 * the device's clocks, depending on @action. 434 * the device's clocks, depending on @action.
435 */ 435 */
436static int pm_runtime_clk_notify(struct notifier_block *nb, 436static int pm_clk_notify(struct notifier_block *nb,
437 unsigned long action, void *data) 437 unsigned long action, void *data)
438{ 438{
439 struct pm_clk_notifier_block *clknb; 439 struct pm_clk_notifier_block *clknb;
@@ -469,21 +469,21 @@ static int pm_runtime_clk_notify(struct notifier_block *nb,
469#endif /* !CONFIG_PM_RUNTIME */ 469#endif /* !CONFIG_PM_RUNTIME */
470 470
471/** 471/**
472 * pm_runtime_clk_add_notifier - Add bus type notifier for runtime PM clocks. 472 * pm_clk_add_notifier - Add bus type notifier for power management clocks.
473 * @bus: Bus type to add the notifier to. 473 * @bus: Bus type to add the notifier to.
474 * @clknb: Notifier to be added to the given bus type. 474 * @clknb: Notifier to be added to the given bus type.
475 * 475 *
476 * The nb member of @clknb is not expected to be initialized and its 476 * The nb member of @clknb is not expected to be initialized and its
477 * notifier_call member will be replaced with pm_runtime_clk_notify(). However, 477 * notifier_call member will be replaced with pm_clk_notify(). However,
478 * the remaining members of @clknb should be populated prior to calling this 478 * the remaining members of @clknb should be populated prior to calling this
479 * routine. 479 * routine.
480 */ 480 */
481void pm_runtime_clk_add_notifier(struct bus_type *bus, 481void pm_clk_add_notifier(struct bus_type *bus,
482 struct pm_clk_notifier_block *clknb) 482 struct pm_clk_notifier_block *clknb)
483{ 483{
484 if (!bus || !clknb) 484 if (!bus || !clknb)
485 return; 485 return;
486 486
487 clknb->nb.notifier_call = pm_runtime_clk_notify; 487 clknb->nb.notifier_call = pm_clk_notify;
488 bus_register_notifier(bus, &clknb->nb); 488 bus_register_notifier(bus, &clknb->nb);
489} 489}