static void solo_thread_try(struct solo_filehandle *fh) { struct videobuf_buffer *vb; unsigned int cur_write; for (;;) { spin_lock(&fh->slock); if (list_empty(&fh->vidq_active)) break; vb = list_first_entry(&fh->vidq_active, struct videobuf_buffer, queue); if (!waitqueue_active(&vb->done)) break; cur_write = SOLO_VI_STATUS0_PAGE(solo_reg_read(fh->solo_dev, SOLO_VI_STATUS0)); if (cur_write == fh->old_write) break; fh->old_write = cur_write; list_del(&vb->queue); spin_unlock(&fh->slock); solo_fillbuf(fh, vb); } assert_spin_locked(&fh->slock); spin_unlock(&fh->slock); }
static void solo_thread_try(struct solo_dev *solo_dev) { struct solo_vb2_buf *vb; /* Only "break" from this loop if slock is held, otherwise * just return. */ for (;;) { unsigned int cur_write; cur_write = SOLO_VI_STATUS0_PAGE( solo_reg_read(solo_dev, SOLO_VI_STATUS0)); if (cur_write == solo_dev->old_write) return; spin_lock(&solo_dev->slock); if (list_empty(&solo_dev->vidq_active)) break; vb = list_first_entry(&solo_dev->vidq_active, struct solo_vb2_buf, list); solo_dev->old_write = cur_write; list_del(&vb->list); spin_unlock(&solo_dev->slock); solo_fillbuf(solo_dev, &vb->vb); } assert_spin_locked(&solo_dev->slock); spin_unlock(&solo_dev->slock); }
static void solo_thread_try(struct solo_filehandle *fh) { struct videobuf_buffer *vb; /* Only "break" from this loop if slock is held, otherwise * just return. */ for (;;) { unsigned int cur_write; cur_write = SOLO_VI_STATUS0_PAGE( solo_reg_read(fh->solo_dev, SOLO_VI_STATUS0)); if (cur_write == fh->old_write) return; spin_lock(&fh->slock); if (list_empty(&fh->vidq_active)) break; vb = list_first_entry(&fh->vidq_active, struct videobuf_buffer, queue); if (!waitqueue_active(&vb->done)) break; fh->old_write = cur_write; list_del(&vb->queue); vb->state = VIDEOBUF_ACTIVE; spin_unlock(&fh->slock); solo_fillbuf(fh, vb); } assert_spin_locked(&fh->slock); spin_unlock(&fh->slock); }