Lines Matching full:work

38  * generic delayed work implementation which delays work execution until a
39 * particular vblank has passed, and then executes the work at realtime
43 * re-arming work items can be easily implemented.
48 struct drm_vblank_work *work, *next; in drm_handle_vblank_works() local
54 list_for_each_entry_safe(work, next, &vblank->pending_work, node) { in drm_handle_vblank_works()
55 if (!drm_vblank_passed(count, work->count)) in drm_handle_vblank_works()
58 list_del_init(&work->node); in drm_handle_vblank_works()
60 kthread_queue_work(vblank->worker, &work->base); in drm_handle_vblank_works()
67 /* Handle cancelling any pending vblank work items and drop respective vblank
72 struct drm_vblank_work *work, *next; in drm_vblank_cancel_pending_works() local
76 list_for_each_entry_safe(work, next, &vblank->pending_work, node) { in drm_vblank_cancel_pending_works()
77 list_del_init(&work->node); in drm_vblank_cancel_pending_works()
85 * drm_vblank_work_schedule - schedule a vblank work
86 * @work: vblank work to schedule
90 * Schedule @work for execution once the crtc vblank count reaches @count.
93 * %false the work starts to execute immediately.
96 * %true the work is deferred until the next vblank (as if @count has been
99 * If @work is already scheduled, this function will reschedule said work
100 * using the new @count. This can be used for self-rearming work items.
103 * %1 if @work was successfully (re)scheduled, %0 if it was either already
106 int drm_vblank_work_schedule(struct drm_vblank_work *work, in drm_vblank_work_schedule() argument
109 struct drm_vblank_crtc *vblank = work->vblank; in drm_vblank_work_schedule()
117 if (work->cancelling) in drm_vblank_work_schedule()
126 if (list_empty(&work->node)) { in drm_vblank_work_schedule()
130 } else if (work->count == count) { in drm_vblank_work_schedule()
137 work->count = count; in drm_vblank_work_schedule()
147 ret = kthread_queue_work(vblank->worker, &work->base); in drm_vblank_work_schedule()
150 list_del_init(&work->node); in drm_vblank_work_schedule()
155 list_add_tail(&work->node, &vblank->pending_work); in drm_vblank_work_schedule()
168 * drm_vblank_work_cancel_sync - cancel a vblank work and wait for it to
170 * @work: vblank work to cancel
172 * Cancel an already scheduled vblank work and wait for its
175 * On return, @work is guaranteed to no longer be scheduled or running, even
179 * %True if the work was cancelled before it started to execute, %false
182 bool drm_vblank_work_cancel_sync(struct drm_vblank_work *work) in drm_vblank_work_cancel_sync() argument
184 struct drm_vblank_crtc *vblank = work->vblank; in drm_vblank_work_cancel_sync()
189 if (!list_empty(&work->node)) { in drm_vblank_work_cancel_sync()
190 list_del_init(&work->node); in drm_vblank_work_cancel_sync()
195 work->cancelling++; in drm_vblank_work_cancel_sync()
200 if (kthread_cancel_work_sync(&work->base)) in drm_vblank_work_cancel_sync()
204 work->cancelling--; in drm_vblank_work_cancel_sync()
212 * drm_vblank_work_flush - wait for a scheduled vblank work to finish
214 * @work: vblank work to flush
216 * Wait until @work has finished executing once.
218 void drm_vblank_work_flush(struct drm_vblank_work *work) in drm_vblank_work_flush() argument
220 struct drm_vblank_crtc *vblank = work->vblank; in drm_vblank_work_flush()
224 wait_event_lock_irq(vblank->work_wait_queue, list_empty(&work->node), in drm_vblank_work_flush()
228 kthread_flush_work(&work->base); in drm_vblank_work_flush()
233 * drm_vblank_work_init - initialize a vblank work item
234 * @work: vblank work item
235 * @crtc: CRTC whose vblank will trigger the work execution
236 * @func: work function to be executed
238 * Initialize a vblank work item for a specific crtc.
240 void drm_vblank_work_init(struct drm_vblank_work *work, struct drm_crtc *crtc, in drm_vblank_work_init() argument
241 void (*func)(struct kthread_work *work)) in drm_vblank_work_init() argument
243 kthread_init_work(&work->base, func); in drm_vblank_work_init()
244 INIT_LIST_HEAD(&work->node); in drm_vblank_work_init()
245 work->vblank = &crtc->dev->vblank[drm_crtc_index(crtc)]; in drm_vblank_work_init()