vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
}
-static void rzv2h_ivc_transfer_buffer(struct work_struct *work)
+void rzv2h_ivc_transfer_buffer(struct rzv2h_ivc *ivc)
{
- struct rzv2h_ivc *ivc = container_of(work, struct rzv2h_ivc,
- buffers.work);
struct rzv2h_ivc_buf *buf;
- guard(spinlock_irqsave)(&ivc->spinlock);
+ lockdep_assert_held(&ivc->spinlock);
if (ivc->vvalid_ifp)
return;
scoped_guard(spinlock_irq, &ivc->spinlock) {
if (vb2_is_streaming(vb->vb2_queue))
- queue_work(ivc->buffers.async_wq, &ivc->buffers.work);
+ rzv2h_ivc_transfer_buffer(ivc);
}
}
rzv2h_ivc_format_configure(ivc);
- queue_work(ivc->buffers.async_wq, &ivc->buffers.work);
+ scoped_guard(spinlock_irq, &ivc->spinlock) {
+ rzv2h_ivc_transfer_buffer(ivc);
+ }
return 0;
spin_lock_init(&ivc->buffers.lock);
INIT_LIST_HEAD(&ivc->buffers.queue);
- INIT_WORK(&ivc->buffers.work, rzv2h_ivc_transfer_buffer);
-
- ivc->buffers.async_wq = alloc_workqueue("rzv2h-ivc", 0, 0);
- if (!ivc->buffers.async_wq)
- return -EINVAL;
/* Initialise vb2 queue */
vb2q = &ivc->vdev.vb2q;
ret = vb2_queue_init(vb2q);
if (ret) {
dev_err(ivc->dev, "vb2 queue init failed\n");
- goto err_destroy_workqueue;
+ return ret;
}
/* Initialise Video Device */
media_entity_cleanup(&vdev->entity);
err_release_vb2q:
vb2_queue_release(vb2q);
-err_destroy_workqueue:
- destroy_workqueue(ivc->buffers.async_wq);
return ret;
}
struct {
/* Spinlock to guard buffer queue */
spinlock_t lock;
- struct workqueue_struct *async_wq;
- struct work_struct work;
struct list_head queue;
struct rzv2h_ivc_buf *curr;
unsigned int sequence;
void rzv2h_ivc_write(struct rzv2h_ivc *ivc, u32 addr, u32 val);
void rzv2h_ivc_update_bits(struct rzv2h_ivc *ivc, unsigned int addr,
u32 mask, u32 val);
+void rzv2h_ivc_transfer_buffer(struct rzv2h_ivc *ivc);