Lines Matching refs:pm

58 	struct pm_device *pm = dev->pm;  in runtime_suspend()  local
63 if (!atomic_test_bit(&pm->base.flags, PM_DEVICE_FLAG_RUNTIME_ENABLED)) { in runtime_suspend()
70 ret = k_sem_take(&pm->lock, k_is_in_isr() ? K_NO_WAIT : K_FOREVER); in runtime_suspend()
76 if (pm->base.usage == 0U) { in runtime_suspend()
82 pm->base.usage--; in runtime_suspend()
83 if (pm->base.usage > 0U) { in runtime_suspend()
90 pm->base.state = PM_DEVICE_STATE_SUSPENDING; in runtime_suspend()
92 (void)k_work_schedule(&pm->work, delay); in runtime_suspend()
94 (void)k_work_schedule_for_queue(&pm_device_runtime_wq, &pm->work, delay); in runtime_suspend()
99 ret = pm->base.action_cb(pm->dev, PM_DEVICE_ACTION_SUSPEND); in runtime_suspend()
101 pm->base.usage++; in runtime_suspend()
105 pm->base.state = PM_DEVICE_STATE_SUSPENDED; in runtime_suspend()
116 k_sem_give(&pm->lock); in runtime_suspend()
127 struct pm_device *pm = CONTAINER_OF(dwork, struct pm_device, work); in runtime_suspend_work() local
129 ret = pm->base.action_cb(pm->dev, PM_DEVICE_ACTION_SUSPEND); in runtime_suspend_work()
131 (void)k_sem_take(&pm->lock, K_FOREVER); in runtime_suspend_work()
133 pm->base.usage++; in runtime_suspend_work()
134 pm->base.state = PM_DEVICE_STATE_ACTIVE; in runtime_suspend_work()
136 pm->base.state = PM_DEVICE_STATE_SUSPENDED; in runtime_suspend_work()
138 k_event_set(&pm->event, BIT(pm->base.state)); in runtime_suspend_work()
139 k_sem_give(&pm->lock); in runtime_suspend_work()
146 atomic_test_bit(&pm->base.flags, PM_DEVICE_FLAG_PD_CLAIMED)) { in runtime_suspend_work()
147 (void)pm_device_runtime_put(PM_DOMAIN(&pm->base)); in runtime_suspend_work()
148 atomic_clear_bit(&pm->base.flags, PM_DEVICE_FLAG_PD_CLAIMED); in runtime_suspend_work()
158 struct pm_device_isr *pm = dev->pm_isr; in get_sync_locked() local
159 uint32_t flags = pm->base.flags; in get_sync_locked()
161 if (pm->base.usage == 0) { in get_sync_locked()
163 const struct device *domain = PM_DOMAIN(&pm->base); in get_sync_locked()
175 ret = pm->base.action_cb(dev, PM_DEVICE_ACTION_RESUME); in get_sync_locked()
179 pm->base.state = PM_DEVICE_STATE_ACTIVE; in get_sync_locked()
184 pm->base.usage++; in get_sync_locked()
192 struct pm_device *pm = dev->pm; in pm_device_runtime_get() local
194 if (pm == NULL) { in pm_device_runtime_get()
198 SYS_PORT_TRACING_FUNC_ENTER(pm, device_runtime_get, dev); in pm_device_runtime_get()
203 if (!atomic_test_bit(&pm->base.flags, PM_DEVICE_FLAG_RUNTIME_ENABLED)) { in pm_device_runtime_get()
217 ret = k_sem_take(&pm->lock, k_is_in_isr() ? K_NO_WAIT : K_FOREVER); in pm_device_runtime_get()
223 if (k_is_in_isr() && (pm->base.state == PM_DEVICE_STATE_SUSPENDING)) { in pm_device_runtime_get()
232 const struct device *domain = PM_DOMAIN(&pm->base); in pm_device_runtime_get()
240 if (atomic_test_bit(&pm->base.flags, PM_DEVICE_FLAG_TURN_ON_FAILED)) { in pm_device_runtime_get()
246 atomic_set_bit(&pm->base.flags, PM_DEVICE_FLAG_PD_CLAIMED); in pm_device_runtime_get()
249 pm->base.usage++; in pm_device_runtime_get()
257 if ((pm->base.state == PM_DEVICE_STATE_SUSPENDING) && in pm_device_runtime_get()
258 ((k_work_cancel_delayable(&pm->work) & K_WORK_RUNNING) == 0)) { in pm_device_runtime_get()
259 pm->base.state = PM_DEVICE_STATE_ACTIVE; in pm_device_runtime_get()
268 while (pm->base.state == PM_DEVICE_STATE_SUSPENDING) { in pm_device_runtime_get()
269 k_event_clear(&pm->event, EVENT_MASK); in pm_device_runtime_get()
270 k_sem_give(&pm->lock); in pm_device_runtime_get()
272 k_event_wait(&pm->event, EVENT_MASK, false, K_FOREVER); in pm_device_runtime_get()
274 (void)k_sem_take(&pm->lock, K_FOREVER); in pm_device_runtime_get()
279 if (pm->base.usage > 1U) { in pm_device_runtime_get()
283 ret = pm->base.action_cb(pm->dev, PM_DEVICE_ACTION_RESUME); in pm_device_runtime_get()
285 pm->base.usage--; in pm_device_runtime_get()
292 pm->base.state = PM_DEVICE_STATE_ACTIVE; in pm_device_runtime_get()
296 k_sem_give(&pm->lock); in pm_device_runtime_get()
300 SYS_PORT_TRACING_FUNC_EXIT(pm, device_runtime_get, dev, ret); in pm_device_runtime_get()
309 struct pm_device_isr *pm = dev->pm_isr; in put_sync_locked() local
310 uint32_t flags = pm->base.flags; in put_sync_locked()
316 if (pm->base.usage == 0U) { in put_sync_locked()
320 pm->base.usage--; in put_sync_locked()
321 if (pm->base.usage == 0U) { in put_sync_locked()
322 ret = pm->base.action_cb(dev, PM_DEVICE_ACTION_SUSPEND); in put_sync_locked()
326 pm->base.state = PM_DEVICE_STATE_SUSPENDED; in put_sync_locked()
329 const struct device *domain = PM_DOMAIN(&pm->base); in put_sync_locked()
352 SYS_PORT_TRACING_FUNC_ENTER(pm, device_runtime_put, dev); in pm_device_runtime_put()
364 SYS_PORT_TRACING_FUNC_EXIT(pm, device_runtime_put, dev, ret); in pm_device_runtime_put()
378 SYS_PORT_TRACING_FUNC_ENTER(pm, device_runtime_put_async, dev, delay); in pm_device_runtime_put_async()
389 SYS_PORT_TRACING_FUNC_EXIT(pm, device_runtime_put_async, dev, delay, ret); in pm_device_runtime_put_async()
401 struct pm_device_base *pm = dev->pm_base; in pm_device_runtime_auto_enable() local
404 if (!pm || !atomic_test_bit(&pm->flags, PM_DEVICE_FLAG_RUNTIME_AUTO)) { in pm_device_runtime_auto_enable()
413 struct pm_device_isr *pm = dev->pm_isr; in runtime_enable_sync() local
414 k_spinlock_key_t k = k_spin_lock(&pm->lock); in runtime_enable_sync()
416 if (pm->base.state == PM_DEVICE_STATE_ACTIVE) { in runtime_enable_sync()
417 ret = pm->base.action_cb(dev, PM_DEVICE_ACTION_SUSPEND); in runtime_enable_sync()
422 pm->base.state = PM_DEVICE_STATE_SUSPENDED; in runtime_enable_sync()
427 pm->base.flags |= BIT(PM_DEVICE_FLAG_RUNTIME_ENABLED); in runtime_enable_sync()
428 pm->base.usage = 0U; in runtime_enable_sync()
430 k_spin_unlock(&pm->lock, k); in runtime_enable_sync()
437 struct pm_device *pm = dev->pm; in pm_device_runtime_enable() local
439 SYS_PORT_TRACING_FUNC_ENTER(pm, device_runtime_enable, dev); in pm_device_runtime_enable()
441 if (pm == NULL) { in pm_device_runtime_enable()
446 if (atomic_test_bit(&pm->base.flags, PM_DEVICE_FLAG_RUNTIME_ENABLED)) { in pm_device_runtime_enable()
461 (void)k_sem_take(&pm->lock, K_FOREVER); in pm_device_runtime_enable()
465 if (pm->dev == NULL) { in pm_device_runtime_enable()
466 pm->dev = dev; in pm_device_runtime_enable()
468 k_work_init_delayable(&pm->work, runtime_suspend_work); in pm_device_runtime_enable()
472 if (pm->base.state == PM_DEVICE_STATE_ACTIVE) { in pm_device_runtime_enable()
473 ret = pm->base.action_cb(pm->dev, PM_DEVICE_ACTION_SUSPEND); in pm_device_runtime_enable()
477 pm->base.state = PM_DEVICE_STATE_SUSPENDED; in pm_device_runtime_enable()
480 pm->base.usage = 0U; in pm_device_runtime_enable()
482 atomic_set_bit(&pm->base.flags, PM_DEVICE_FLAG_RUNTIME_ENABLED); in pm_device_runtime_enable()
486 k_sem_give(&pm->lock); in pm_device_runtime_enable()
490 SYS_PORT_TRACING_FUNC_EXIT(pm, device_runtime_enable, dev, ret); in pm_device_runtime_enable()
496 struct pm_device_isr *pm = dev->pm_isr; in runtime_disable_sync() local
498 k_spinlock_key_t k = k_spin_lock(&pm->lock); in runtime_disable_sync()
500 if (pm->base.state == PM_DEVICE_STATE_SUSPENDED) { in runtime_disable_sync()
501 ret = pm->base.action_cb(dev, PM_DEVICE_ACTION_RESUME); in runtime_disable_sync()
506 pm->base.state = PM_DEVICE_STATE_ACTIVE; in runtime_disable_sync()
511 pm->base.flags &= ~BIT(PM_DEVICE_FLAG_RUNTIME_ENABLED); in runtime_disable_sync()
513 k_spin_unlock(&pm->lock, k); in runtime_disable_sync()
520 struct pm_device *pm = dev->pm; in pm_device_runtime_disable() local
522 SYS_PORT_TRACING_FUNC_ENTER(pm, device_runtime_disable, dev); in pm_device_runtime_disable()
524 if (pm == NULL) { in pm_device_runtime_disable()
529 if (!atomic_test_bit(&pm->base.flags, PM_DEVICE_FLAG_RUNTIME_ENABLED)) { in pm_device_runtime_disable()
539 (void)k_sem_take(&pm->lock, K_FOREVER); in pm_device_runtime_disable()
544 if ((pm->base.state == PM_DEVICE_STATE_SUSPENDING) && in pm_device_runtime_disable()
545 ((k_work_cancel_delayable(&pm->work) & K_WORK_RUNNING) == 0)) { in pm_device_runtime_disable()
546 pm->base.state = PM_DEVICE_STATE_ACTIVE; in pm_device_runtime_disable()
551 while (pm->base.state == PM_DEVICE_STATE_SUSPENDING) { in pm_device_runtime_disable()
552 k_event_clear(&pm->event, EVENT_MASK); in pm_device_runtime_disable()
553 k_sem_give(&pm->lock); in pm_device_runtime_disable()
555 k_event_wait(&pm->event, EVENT_MASK, false, K_FOREVER); in pm_device_runtime_disable()
557 (void)k_sem_take(&pm->lock, K_FOREVER); in pm_device_runtime_disable()
563 if (pm->base.state == PM_DEVICE_STATE_SUSPENDED) { in pm_device_runtime_disable()
564 ret = pm->base.action_cb(dev, PM_DEVICE_ACTION_RESUME); in pm_device_runtime_disable()
569 pm->base.state = PM_DEVICE_STATE_ACTIVE; in pm_device_runtime_disable()
574 atomic_clear_bit(&pm->base.flags, PM_DEVICE_FLAG_RUNTIME_ENABLED); in pm_device_runtime_disable()
578 k_sem_give(&pm->lock); in pm_device_runtime_disable()
582 SYS_PORT_TRACING_FUNC_EXIT(pm, device_runtime_disable, dev, ret); in pm_device_runtime_disable()
589 struct pm_device_base *pm = dev->pm_base; in pm_device_runtime_is_enabled() local
591 return pm && atomic_test_bit(&pm->flags, PM_DEVICE_FLAG_RUNTIME_ENABLED); in pm_device_runtime_is_enabled()