• Home
  • Raw
  • Download

Lines Matching +full:pm +full:- +full:bus

1 // SPDX-License-Identifier: GPL-2.0
3 * drivers/base/power/clock_ops.c - Generic clock manipulation PM callbacks
11 #include <linux/pm.h>
38 * pm_clk_enable - Enable a clock, reporting any errors
40 * @ce: PM clock entry corresponding to the clock.
46 if (ce->status < PCE_STATUS_ERROR) { in __pm_clk_enable()
47 ret = clk_enable(ce->clk); in __pm_clk_enable()
49 ce->status = PCE_STATUS_ENABLED; in __pm_clk_enable()
52 __func__, ce->clk, ret); in __pm_clk_enable()
57 * pm_clk_acquire - Acquire a device clock.
59 * @ce: PM clock entry corresponding to the clock.
63 if (!ce->clk) in pm_clk_acquire()
64 ce->clk = clk_get(dev, ce->con_id); in pm_clk_acquire()
65 if (IS_ERR(ce->clk)) { in pm_clk_acquire()
66 ce->status = PCE_STATUS_ERROR; in pm_clk_acquire()
68 if (clk_prepare(ce->clk)) { in pm_clk_acquire()
69 ce->status = PCE_STATUS_ERROR; in pm_clk_acquire()
72 ce->status = PCE_STATUS_ACQUIRED; in pm_clk_acquire()
74 "Clock %pC con_id %s managed by runtime PM.\n", in pm_clk_acquire()
75 ce->clk, ce->con_id); in pm_clk_acquire()
87 return -EINVAL; in __pm_clk_add()
91 return -ENOMEM; in __pm_clk_add()
94 ce->con_id = kstrdup(con_id, GFP_KERNEL); in __pm_clk_add()
95 if (!ce->con_id) { in __pm_clk_add()
97 return -ENOMEM; in __pm_clk_add()
102 return -ENOENT; in __pm_clk_add()
104 ce->clk = clk; in __pm_clk_add()
109 spin_lock_irq(&psd->lock); in __pm_clk_add()
110 list_add_tail(&ce->node, &psd->clock_list); in __pm_clk_add()
111 spin_unlock_irq(&psd->lock); in __pm_clk_add()
116 * pm_clk_add - Start using a device clock for power management.
130 * pm_clk_add_clk - Start using a device clock for power management.
135 * The power-management code will take control of the clock reference, so
147 * of_pm_clk_add_clk - Start using a device clock for power management.
151 * Add the clock described in the 'clocks' device-tree node that matches
161 if (!dev || !dev->of_node || !name) in of_pm_clk_add_clk()
162 return -EINVAL; in of_pm_clk_add_clk()
164 clk = of_clk_get_by_name(dev->of_node, name); in of_pm_clk_add_clk()
179 * of_pm_clk_add_clks - Start using device clock(s) for power management.
182 * Add a series of clocks described in the 'clocks' device-tree node for
194 if (!dev || !dev->of_node) in of_pm_clk_add_clks()
195 return -EINVAL; in of_pm_clk_add_clks()
197 count = of_clk_get_parent_count(dev->of_node); in of_pm_clk_add_clks()
199 return -ENODEV; in of_pm_clk_add_clks()
203 return -ENOMEM; in of_pm_clk_add_clks()
206 clks[i] = of_clk_get(dev->of_node, i); in of_pm_clk_add_clks()
224 while (i--) in of_pm_clk_add_clks()
234 * __pm_clk_remove - Destroy PM clock entry.
235 * @ce: PM clock entry to destroy.
242 if (ce->status < PCE_STATUS_ERROR) { in __pm_clk_remove()
243 if (ce->status == PCE_STATUS_ENABLED) in __pm_clk_remove()
244 clk_disable(ce->clk); in __pm_clk_remove()
246 if (ce->status >= PCE_STATUS_ACQUIRED) { in __pm_clk_remove()
247 clk_unprepare(ce->clk); in __pm_clk_remove()
248 clk_put(ce->clk); in __pm_clk_remove()
252 kfree(ce->con_id); in __pm_clk_remove()
257 * pm_clk_remove - Stop using a device clock for power management.
258 * @dev: Device whose clock should not be used for PM any more.
272 spin_lock_irq(&psd->lock); in pm_clk_remove()
274 list_for_each_entry(ce, &psd->clock_list, node) { in pm_clk_remove()
275 if (!con_id && !ce->con_id) in pm_clk_remove()
277 else if (!con_id || !ce->con_id) in pm_clk_remove()
279 else if (!strcmp(con_id, ce->con_id)) in pm_clk_remove()
283 spin_unlock_irq(&psd->lock); in pm_clk_remove()
287 list_del(&ce->node); in pm_clk_remove()
288 spin_unlock_irq(&psd->lock); in pm_clk_remove()
295 * pm_clk_remove_clk - Stop using a device clock for power management.
296 * @dev: Device whose clock should not be used for PM any more.
310 spin_lock_irq(&psd->lock); in pm_clk_remove_clk()
312 list_for_each_entry(ce, &psd->clock_list, node) { in pm_clk_remove_clk()
313 if (clk == ce->clk) in pm_clk_remove_clk()
317 spin_unlock_irq(&psd->lock); in pm_clk_remove_clk()
321 list_del(&ce->node); in pm_clk_remove_clk()
322 spin_unlock_irq(&psd->lock); in pm_clk_remove_clk()
329 * pm_clk_init - Initialize a device's list of power management clocks.
330 * @dev: Device to initialize the list of PM clocks for.
339 INIT_LIST_HEAD(&psd->clock_list); in pm_clk_init()
344 * pm_clk_create - Create and initialize a device's list of PM clocks.
345 * @dev: Device to create and initialize the list of PM clocks for.
357 * pm_clk_destroy - Destroy a device's list of power management clocks.
358 * @dev: Device to destroy the list of PM clocks for.
375 spin_lock_irq(&psd->lock); in pm_clk_destroy()
377 list_for_each_entry_safe_reverse(ce, c, &psd->clock_list, node) in pm_clk_destroy()
378 list_move(&ce->node, &list); in pm_clk_destroy()
380 spin_unlock_irq(&psd->lock); in pm_clk_destroy()
385 list_del(&ce->node); in pm_clk_destroy()
392 * pm_clk_suspend - Disable clocks in a device's PM clock list.
406 spin_lock_irqsave(&psd->lock, flags); in pm_clk_suspend()
408 list_for_each_entry_reverse(ce, &psd->clock_list, node) { in pm_clk_suspend()
409 if (ce->status < PCE_STATUS_ERROR) { in pm_clk_suspend()
410 if (ce->status == PCE_STATUS_ENABLED) in pm_clk_suspend()
411 clk_disable(ce->clk); in pm_clk_suspend()
412 ce->status = PCE_STATUS_ACQUIRED; in pm_clk_suspend()
416 spin_unlock_irqrestore(&psd->lock, flags); in pm_clk_suspend()
423 * pm_clk_resume - Enable clocks in a device's PM clock list.
437 spin_lock_irqsave(&psd->lock, flags); in pm_clk_resume()
439 list_for_each_entry(ce, &psd->clock_list, node) in pm_clk_resume()
442 spin_unlock_irqrestore(&psd->lock, flags); in pm_clk_resume()
449 * pm_clk_notify - Notify routine for device addition and removal.
458 * of PM clocks, depending on @action.
478 if (dev->pm_domain) in pm_clk_notify()
485 dev_pm_domain_set(dev, clknb->pm_domain); in pm_clk_notify()
486 if (clknb->con_ids[0]) { in pm_clk_notify()
487 for (con_id = clknb->con_ids; *con_id; con_id++) in pm_clk_notify()
495 if (dev->pm_domain != clknb->pm_domain) in pm_clk_notify()
548 * enable_clock - Enable a device clock.
560 dev_info(dev, "Runtime PM disabled, clock forced on.\n"); in enable_clock()
565 * disable_clock - Disable a device clock.
577 dev_info(dev, "Runtime PM disabled, clock forced off.\n"); in disable_clock()
582 * pm_clk_notify - Notify routine for device addition and removal.
605 if (clknb->con_ids[0]) { in pm_clk_notify()
606 for (con_id = clknb->con_ids; *con_id; con_id++) in pm_clk_notify()
614 if (clknb->con_ids[0]) { in pm_clk_notify()
615 for (con_id = clknb->con_ids; *con_id; con_id++) in pm_clk_notify()
629 * pm_clk_add_notifier - Add bus type notifier for power management clocks.
630 * @bus: Bus type to add the notifier to.
631 * @clknb: Notifier to be added to the given bus type.
638 void pm_clk_add_notifier(struct bus_type *bus, in pm_clk_add_notifier() argument
641 if (!bus || !clknb) in pm_clk_add_notifier()
644 clknb->nb.notifier_call = pm_clk_notify; in pm_clk_add_notifier()
645 bus_register_notifier(bus, &clknb->nb); in pm_clk_add_notifier()