Lines Matching refs:m2m_dev
232 void *v4l2_m2m_get_curr_priv(struct v4l2_m2m_dev *m2m_dev) in v4l2_m2m_get_curr_priv() argument
237 spin_lock_irqsave(&m2m_dev->job_spinlock, flags); in v4l2_m2m_get_curr_priv()
238 if (m2m_dev->curr_ctx) in v4l2_m2m_get_curr_priv()
239 ret = m2m_dev->curr_ctx->priv; in v4l2_m2m_get_curr_priv()
240 spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); in v4l2_m2m_get_curr_priv()
255 static void v4l2_m2m_try_run(struct v4l2_m2m_dev *m2m_dev) in v4l2_m2m_try_run() argument
259 spin_lock_irqsave(&m2m_dev->job_spinlock, flags); in v4l2_m2m_try_run()
260 if (NULL != m2m_dev->curr_ctx) { in v4l2_m2m_try_run()
261 spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); in v4l2_m2m_try_run()
266 if (list_empty(&m2m_dev->job_queue)) { in v4l2_m2m_try_run()
267 spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); in v4l2_m2m_try_run()
272 if (m2m_dev->job_queue_flags & QUEUE_PAUSED) { in v4l2_m2m_try_run()
273 spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); in v4l2_m2m_try_run()
278 m2m_dev->curr_ctx = list_first_entry(&m2m_dev->job_queue, in v4l2_m2m_try_run()
280 m2m_dev->curr_ctx->job_flags |= TRANS_RUNNING; in v4l2_m2m_try_run()
281 spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); in v4l2_m2m_try_run()
283 dprintk("Running job on m2m_ctx: %p\n", m2m_dev->curr_ctx); in v4l2_m2m_try_run()
284 m2m_dev->m2m_ops->device_run(m2m_dev->curr_ctx->priv); in v4l2_m2m_try_run()
296 static void __v4l2_m2m_try_queue(struct v4l2_m2m_dev *m2m_dev, in __v4l2_m2m_try_queue() argument
310 spin_lock_irqsave(&m2m_dev->job_spinlock, flags_job); in __v4l2_m2m_try_queue()
361 if (m2m_dev->m2m_ops->job_ready in __v4l2_m2m_try_queue()
362 && (!m2m_dev->m2m_ops->job_ready(m2m_ctx->priv))) { in __v4l2_m2m_try_queue()
367 list_add_tail(&m2m_ctx->queue, &m2m_dev->job_queue); in __v4l2_m2m_try_queue()
371 spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags_job); in __v4l2_m2m_try_queue()
388 struct v4l2_m2m_dev *m2m_dev = m2m_ctx->m2m_dev; in v4l2_m2m_try_schedule() local
390 __v4l2_m2m_try_queue(m2m_dev, m2m_ctx); in v4l2_m2m_try_schedule()
391 v4l2_m2m_try_run(m2m_dev); in v4l2_m2m_try_schedule()
401 struct v4l2_m2m_dev *m2m_dev = in v4l2_m2m_device_run_work() local
404 v4l2_m2m_try_run(m2m_dev); in v4l2_m2m_device_run_work()
418 struct v4l2_m2m_dev *m2m_dev; in v4l2_m2m_cancel_job() local
421 m2m_dev = m2m_ctx->m2m_dev; in v4l2_m2m_cancel_job()
422 spin_lock_irqsave(&m2m_dev->job_spinlock, flags); in v4l2_m2m_cancel_job()
426 spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); in v4l2_m2m_cancel_job()
427 if (m2m_dev->m2m_ops->job_abort) in v4l2_m2m_cancel_job()
428 m2m_dev->m2m_ops->job_abort(m2m_ctx->priv); in v4l2_m2m_cancel_job()
435 spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); in v4l2_m2m_cancel_job()
440 spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); in v4l2_m2m_cancel_job()
448 static void v4l2_m2m_schedule_next_job(struct v4l2_m2m_dev *m2m_dev, in v4l2_m2m_schedule_next_job() argument
456 __v4l2_m2m_try_queue(m2m_dev, m2m_ctx); in v4l2_m2m_schedule_next_job()
462 schedule_work(&m2m_dev->job_work); in v4l2_m2m_schedule_next_job()
469 static bool _v4l2_m2m_job_finish(struct v4l2_m2m_dev *m2m_dev, in _v4l2_m2m_job_finish() argument
472 if (!m2m_dev->curr_ctx || m2m_dev->curr_ctx != m2m_ctx) { in _v4l2_m2m_job_finish()
477 list_del(&m2m_dev->curr_ctx->queue); in _v4l2_m2m_job_finish()
478 m2m_dev->curr_ctx->job_flags &= ~(TRANS_QUEUED | TRANS_RUNNING); in _v4l2_m2m_job_finish()
479 wake_up(&m2m_dev->curr_ctx->finished); in _v4l2_m2m_job_finish()
480 m2m_dev->curr_ctx = NULL; in _v4l2_m2m_job_finish()
484 void v4l2_m2m_job_finish(struct v4l2_m2m_dev *m2m_dev, in v4l2_m2m_job_finish() argument
497 spin_lock_irqsave(&m2m_dev->job_spinlock, flags); in v4l2_m2m_job_finish()
498 schedule_next = _v4l2_m2m_job_finish(m2m_dev, m2m_ctx); in v4l2_m2m_job_finish()
499 spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); in v4l2_m2m_job_finish()
502 v4l2_m2m_schedule_next_job(m2m_dev, m2m_ctx); in v4l2_m2m_job_finish()
506 void v4l2_m2m_buf_done_and_job_finish(struct v4l2_m2m_dev *m2m_dev, in v4l2_m2m_buf_done_and_job_finish() argument
514 spin_lock_irqsave(&m2m_dev->job_spinlock, flags); in v4l2_m2m_buf_done_and_job_finish()
535 schedule_next = _v4l2_m2m_job_finish(m2m_dev, m2m_ctx); in v4l2_m2m_buf_done_and_job_finish()
537 spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); in v4l2_m2m_buf_done_and_job_finish()
540 v4l2_m2m_schedule_next_job(m2m_dev, m2m_ctx); in v4l2_m2m_buf_done_and_job_finish()
544 void v4l2_m2m_suspend(struct v4l2_m2m_dev *m2m_dev) in v4l2_m2m_suspend() argument
549 spin_lock_irqsave(&m2m_dev->job_spinlock, flags); in v4l2_m2m_suspend()
550 m2m_dev->job_queue_flags |= QUEUE_PAUSED; in v4l2_m2m_suspend()
551 curr_ctx = m2m_dev->curr_ctx; in v4l2_m2m_suspend()
552 spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); in v4l2_m2m_suspend()
560 void v4l2_m2m_resume(struct v4l2_m2m_dev *m2m_dev) in v4l2_m2m_resume() argument
564 spin_lock_irqsave(&m2m_dev->job_spinlock, flags); in v4l2_m2m_resume()
565 m2m_dev->job_queue_flags &= ~QUEUE_PAUSED; in v4l2_m2m_resume()
566 spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); in v4l2_m2m_resume()
568 v4l2_m2m_try_run(m2m_dev); in v4l2_m2m_resume()
872 struct v4l2_m2m_dev *m2m_dev; in v4l2_m2m_streamoff() local
885 m2m_dev = m2m_ctx->m2m_dev; in v4l2_m2m_streamoff()
886 spin_lock_irqsave(&m2m_dev->job_spinlock, flags_job); in v4l2_m2m_streamoff()
899 if (m2m_dev->curr_ctx == m2m_ctx) { in v4l2_m2m_streamoff()
900 m2m_dev->curr_ctx = NULL; in v4l2_m2m_streamoff()
903 spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags_job); in v4l2_m2m_streamoff()
1021 void v4l2_m2m_unregister_media_controller(struct v4l2_m2m_dev *m2m_dev) in v4l2_m2m_unregister_media_controller() argument
1023 media_remove_intf_links(&m2m_dev->intf_devnode->intf); in v4l2_m2m_unregister_media_controller()
1024 media_devnode_remove(m2m_dev->intf_devnode); in v4l2_m2m_unregister_media_controller()
1026 media_entity_remove_links(m2m_dev->source); in v4l2_m2m_unregister_media_controller()
1027 media_entity_remove_links(&m2m_dev->sink); in v4l2_m2m_unregister_media_controller()
1028 media_entity_remove_links(&m2m_dev->proc); in v4l2_m2m_unregister_media_controller()
1029 media_device_unregister_entity(m2m_dev->source); in v4l2_m2m_unregister_media_controller()
1030 media_device_unregister_entity(&m2m_dev->sink); in v4l2_m2m_unregister_media_controller()
1031 media_device_unregister_entity(&m2m_dev->proc); in v4l2_m2m_unregister_media_controller()
1032 kfree(m2m_dev->source->name); in v4l2_m2m_unregister_media_controller()
1033 kfree(m2m_dev->sink.name); in v4l2_m2m_unregister_media_controller()
1034 kfree(m2m_dev->proc.name); in v4l2_m2m_unregister_media_controller()
1039 struct v4l2_m2m_dev *m2m_dev, enum v4l2_m2m_entity_type type, in v4l2_m2m_register_entity() argument
1051 entity = m2m_dev->source; in v4l2_m2m_register_entity()
1052 pads = &m2m_dev->source_pad; in v4l2_m2m_register_entity()
1057 entity = &m2m_dev->sink; in v4l2_m2m_register_entity()
1058 pads = &m2m_dev->sink_pad; in v4l2_m2m_register_entity()
1063 entity = &m2m_dev->proc; in v4l2_m2m_register_entity()
1064 pads = m2m_dev->proc_pads; in v4l2_m2m_register_entity()
1096 int v4l2_m2m_register_media_controller(struct v4l2_m2m_dev *m2m_dev, in v4l2_m2m_register_media_controller() argument
1112 m2m_dev->source = &vdev->entity; in v4l2_m2m_register_media_controller()
1113 ret = v4l2_m2m_register_entity(mdev, m2m_dev, in v4l2_m2m_register_media_controller()
1117 ret = v4l2_m2m_register_entity(mdev, m2m_dev, in v4l2_m2m_register_media_controller()
1121 ret = v4l2_m2m_register_entity(mdev, m2m_dev, in v4l2_m2m_register_media_controller()
1127 ret = media_create_pad_link(m2m_dev->source, 0, &m2m_dev->proc, 0, in v4l2_m2m_register_media_controller()
1132 ret = media_create_pad_link(&m2m_dev->proc, 1, &m2m_dev->sink, 0, in v4l2_m2m_register_media_controller()
1138 m2m_dev->intf_devnode = media_devnode_create(mdev, in v4l2_m2m_register_media_controller()
1141 if (!m2m_dev->intf_devnode) { in v4l2_m2m_register_media_controller()
1147 link = media_create_intf_link(m2m_dev->source, in v4l2_m2m_register_media_controller()
1148 &m2m_dev->intf_devnode->intf, in v4l2_m2m_register_media_controller()
1155 link = media_create_intf_link(&m2m_dev->sink, in v4l2_m2m_register_media_controller()
1156 &m2m_dev->intf_devnode->intf, in v4l2_m2m_register_media_controller()
1165 media_remove_intf_links(&m2m_dev->intf_devnode->intf); in v4l2_m2m_register_media_controller()
1167 media_devnode_remove(m2m_dev->intf_devnode); in v4l2_m2m_register_media_controller()
1169 media_entity_remove_links(&m2m_dev->sink); in v4l2_m2m_register_media_controller()
1171 media_entity_remove_links(&m2m_dev->proc); in v4l2_m2m_register_media_controller()
1172 media_entity_remove_links(m2m_dev->source); in v4l2_m2m_register_media_controller()
1174 media_device_unregister_entity(&m2m_dev->proc); in v4l2_m2m_register_media_controller()
1175 kfree(m2m_dev->proc.name); in v4l2_m2m_register_media_controller()
1177 media_device_unregister_entity(&m2m_dev->sink); in v4l2_m2m_register_media_controller()
1178 kfree(m2m_dev->sink.name); in v4l2_m2m_register_media_controller()
1180 media_device_unregister_entity(m2m_dev->source); in v4l2_m2m_register_media_controller()
1181 kfree(m2m_dev->source->name); in v4l2_m2m_register_media_controller()
1190 struct v4l2_m2m_dev *m2m_dev; in v4l2_m2m_init() local
1195 m2m_dev = kzalloc(sizeof *m2m_dev, GFP_KERNEL); in v4l2_m2m_init()
1196 if (!m2m_dev) in v4l2_m2m_init()
1199 m2m_dev->curr_ctx = NULL; in v4l2_m2m_init()
1200 m2m_dev->m2m_ops = m2m_ops; in v4l2_m2m_init()
1201 INIT_LIST_HEAD(&m2m_dev->job_queue); in v4l2_m2m_init()
1202 spin_lock_init(&m2m_dev->job_spinlock); in v4l2_m2m_init()
1203 INIT_WORK(&m2m_dev->job_work, v4l2_m2m_device_run_work); in v4l2_m2m_init()
1205 return m2m_dev; in v4l2_m2m_init()
1209 void v4l2_m2m_release(struct v4l2_m2m_dev *m2m_dev) in v4l2_m2m_release() argument
1211 kfree(m2m_dev); in v4l2_m2m_release()
1215 struct v4l2_m2m_ctx *v4l2_m2m_ctx_init(struct v4l2_m2m_dev *m2m_dev, in v4l2_m2m_ctx_init() argument
1228 m2m_ctx->m2m_dev = m2m_dev; in v4l2_m2m_ctx_init()
1553 struct v4l2_m2m_dev *m2m_dev = fh->m2m_ctx->m2m_dev; in v4l2_m2m_ioctl_stateless_decoder_cmd() local
1561 spin_lock_irqsave(&m2m_dev->job_spinlock, flags); in v4l2_m2m_ioctl_stateless_decoder_cmd()
1583 spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); in v4l2_m2m_ioctl_stateless_decoder_cmd()