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()
360 if (m2m_dev->m2m_ops->job_ready in __v4l2_m2m_try_queue()
361 && (!m2m_dev->m2m_ops->job_ready(m2m_ctx->priv))) { in __v4l2_m2m_try_queue()
366 list_add_tail(&m2m_ctx->queue, &m2m_dev->job_queue); in __v4l2_m2m_try_queue()
370 spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags_job); in __v4l2_m2m_try_queue()
387 struct v4l2_m2m_dev *m2m_dev = m2m_ctx->m2m_dev; in v4l2_m2m_try_schedule() local
389 __v4l2_m2m_try_queue(m2m_dev, m2m_ctx); in v4l2_m2m_try_schedule()
390 v4l2_m2m_try_run(m2m_dev); in v4l2_m2m_try_schedule()
400 struct v4l2_m2m_dev *m2m_dev = in v4l2_m2m_device_run_work() local
403 v4l2_m2m_try_run(m2m_dev); in v4l2_m2m_device_run_work()
417 struct v4l2_m2m_dev *m2m_dev; in v4l2_m2m_cancel_job() local
420 m2m_dev = m2m_ctx->m2m_dev; in v4l2_m2m_cancel_job()
421 spin_lock_irqsave(&m2m_dev->job_spinlock, flags); in v4l2_m2m_cancel_job()
425 spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); in v4l2_m2m_cancel_job()
426 if (m2m_dev->m2m_ops->job_abort) in v4l2_m2m_cancel_job()
427 m2m_dev->m2m_ops->job_abort(m2m_ctx->priv); in v4l2_m2m_cancel_job()
434 spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); in v4l2_m2m_cancel_job()
439 spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); in v4l2_m2m_cancel_job()
447 static void v4l2_m2m_schedule_next_job(struct v4l2_m2m_dev *m2m_dev, in v4l2_m2m_schedule_next_job() argument
455 __v4l2_m2m_try_queue(m2m_dev, m2m_ctx); in v4l2_m2m_schedule_next_job()
461 schedule_work(&m2m_dev->job_work); in v4l2_m2m_schedule_next_job()
468 static bool _v4l2_m2m_job_finish(struct v4l2_m2m_dev *m2m_dev, in _v4l2_m2m_job_finish() argument
471 if (!m2m_dev->curr_ctx || m2m_dev->curr_ctx != m2m_ctx) { in _v4l2_m2m_job_finish()
476 list_del(&m2m_dev->curr_ctx->queue); in _v4l2_m2m_job_finish()
477 m2m_dev->curr_ctx->job_flags &= ~(TRANS_QUEUED | TRANS_RUNNING); in _v4l2_m2m_job_finish()
478 wake_up(&m2m_dev->curr_ctx->finished); in _v4l2_m2m_job_finish()
479 m2m_dev->curr_ctx = NULL; in _v4l2_m2m_job_finish()
483 void v4l2_m2m_job_finish(struct v4l2_m2m_dev *m2m_dev, in v4l2_m2m_job_finish() argument
496 spin_lock_irqsave(&m2m_dev->job_spinlock, flags); in v4l2_m2m_job_finish()
497 schedule_next = _v4l2_m2m_job_finish(m2m_dev, m2m_ctx); in v4l2_m2m_job_finish()
498 spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); in v4l2_m2m_job_finish()
501 v4l2_m2m_schedule_next_job(m2m_dev, m2m_ctx); in v4l2_m2m_job_finish()
505 void v4l2_m2m_buf_done_and_job_finish(struct v4l2_m2m_dev *m2m_dev, in v4l2_m2m_buf_done_and_job_finish() argument
513 spin_lock_irqsave(&m2m_dev->job_spinlock, flags); in v4l2_m2m_buf_done_and_job_finish()
534 schedule_next = _v4l2_m2m_job_finish(m2m_dev, m2m_ctx); in v4l2_m2m_buf_done_and_job_finish()
536 spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); in v4l2_m2m_buf_done_and_job_finish()
539 v4l2_m2m_schedule_next_job(m2m_dev, m2m_ctx); in v4l2_m2m_buf_done_and_job_finish()
543 void v4l2_m2m_suspend(struct v4l2_m2m_dev *m2m_dev) in v4l2_m2m_suspend() argument
548 spin_lock_irqsave(&m2m_dev->job_spinlock, flags); in v4l2_m2m_suspend()
549 m2m_dev->job_queue_flags |= QUEUE_PAUSED; in v4l2_m2m_suspend()
550 curr_ctx = m2m_dev->curr_ctx; in v4l2_m2m_suspend()
551 spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); in v4l2_m2m_suspend()
559 void v4l2_m2m_resume(struct v4l2_m2m_dev *m2m_dev) in v4l2_m2m_resume() argument
563 spin_lock_irqsave(&m2m_dev->job_spinlock, flags); in v4l2_m2m_resume()
564 m2m_dev->job_queue_flags &= ~QUEUE_PAUSED; in v4l2_m2m_resume()
565 spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); in v4l2_m2m_resume()
567 v4l2_m2m_try_run(m2m_dev); in v4l2_m2m_resume()
842 struct v4l2_m2m_dev *m2m_dev; in v4l2_m2m_streamoff() local
855 m2m_dev = m2m_ctx->m2m_dev; in v4l2_m2m_streamoff()
856 spin_lock_irqsave(&m2m_dev->job_spinlock, flags_job); in v4l2_m2m_streamoff()
869 if (m2m_dev->curr_ctx == m2m_ctx) { in v4l2_m2m_streamoff()
870 m2m_dev->curr_ctx = NULL; in v4l2_m2m_streamoff()
873 spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags_job); in v4l2_m2m_streamoff()
961 void v4l2_m2m_unregister_media_controller(struct v4l2_m2m_dev *m2m_dev) in v4l2_m2m_unregister_media_controller() argument
963 media_remove_intf_links(&m2m_dev->intf_devnode->intf); in v4l2_m2m_unregister_media_controller()
964 media_devnode_remove(m2m_dev->intf_devnode); in v4l2_m2m_unregister_media_controller()
966 media_entity_remove_links(m2m_dev->source); in v4l2_m2m_unregister_media_controller()
967 media_entity_remove_links(&m2m_dev->sink); in v4l2_m2m_unregister_media_controller()
968 media_entity_remove_links(&m2m_dev->proc); in v4l2_m2m_unregister_media_controller()
969 media_device_unregister_entity(m2m_dev->source); in v4l2_m2m_unregister_media_controller()
970 media_device_unregister_entity(&m2m_dev->sink); in v4l2_m2m_unregister_media_controller()
971 media_device_unregister_entity(&m2m_dev->proc); in v4l2_m2m_unregister_media_controller()
972 kfree(m2m_dev->source->name); in v4l2_m2m_unregister_media_controller()
973 kfree(m2m_dev->sink.name); in v4l2_m2m_unregister_media_controller()
974 kfree(m2m_dev->proc.name); in v4l2_m2m_unregister_media_controller()
979 struct v4l2_m2m_dev *m2m_dev, enum v4l2_m2m_entity_type type, in v4l2_m2m_register_entity() argument
991 entity = m2m_dev->source; in v4l2_m2m_register_entity()
992 pads = &m2m_dev->source_pad; in v4l2_m2m_register_entity()
997 entity = &m2m_dev->sink; in v4l2_m2m_register_entity()
998 pads = &m2m_dev->sink_pad; in v4l2_m2m_register_entity()
1003 entity = &m2m_dev->proc; in v4l2_m2m_register_entity()
1004 pads = m2m_dev->proc_pads; in v4l2_m2m_register_entity()
1036 int v4l2_m2m_register_media_controller(struct v4l2_m2m_dev *m2m_dev, in v4l2_m2m_register_media_controller() argument
1052 m2m_dev->source = &vdev->entity; in v4l2_m2m_register_media_controller()
1053 ret = v4l2_m2m_register_entity(mdev, m2m_dev, in v4l2_m2m_register_media_controller()
1057 ret = v4l2_m2m_register_entity(mdev, m2m_dev, in v4l2_m2m_register_media_controller()
1061 ret = v4l2_m2m_register_entity(mdev, m2m_dev, in v4l2_m2m_register_media_controller()
1067 ret = media_create_pad_link(m2m_dev->source, 0, &m2m_dev->proc, 0, in v4l2_m2m_register_media_controller()
1072 ret = media_create_pad_link(&m2m_dev->proc, 1, &m2m_dev->sink, 0, in v4l2_m2m_register_media_controller()
1078 m2m_dev->intf_devnode = media_devnode_create(mdev, in v4l2_m2m_register_media_controller()
1081 if (!m2m_dev->intf_devnode) { in v4l2_m2m_register_media_controller()
1087 link = media_create_intf_link(m2m_dev->source, in v4l2_m2m_register_media_controller()
1088 &m2m_dev->intf_devnode->intf, in v4l2_m2m_register_media_controller()
1095 link = media_create_intf_link(&m2m_dev->sink, in v4l2_m2m_register_media_controller()
1096 &m2m_dev->intf_devnode->intf, in v4l2_m2m_register_media_controller()
1105 media_remove_intf_links(&m2m_dev->intf_devnode->intf); in v4l2_m2m_register_media_controller()
1107 media_devnode_remove(m2m_dev->intf_devnode); in v4l2_m2m_register_media_controller()
1109 media_entity_remove_links(&m2m_dev->sink); in v4l2_m2m_register_media_controller()
1111 media_entity_remove_links(&m2m_dev->proc); in v4l2_m2m_register_media_controller()
1112 media_entity_remove_links(m2m_dev->source); in v4l2_m2m_register_media_controller()
1114 media_device_unregister_entity(&m2m_dev->proc); in v4l2_m2m_register_media_controller()
1115 kfree(m2m_dev->proc.name); in v4l2_m2m_register_media_controller()
1117 media_device_unregister_entity(&m2m_dev->sink); in v4l2_m2m_register_media_controller()
1118 kfree(m2m_dev->sink.name); in v4l2_m2m_register_media_controller()
1120 media_device_unregister_entity(m2m_dev->source); in v4l2_m2m_register_media_controller()
1121 kfree(m2m_dev->source->name); in v4l2_m2m_register_media_controller()
1130 struct v4l2_m2m_dev *m2m_dev; in v4l2_m2m_init() local
1135 m2m_dev = kzalloc(sizeof *m2m_dev, GFP_KERNEL); in v4l2_m2m_init()
1136 if (!m2m_dev) in v4l2_m2m_init()
1139 m2m_dev->curr_ctx = NULL; in v4l2_m2m_init()
1140 m2m_dev->m2m_ops = m2m_ops; in v4l2_m2m_init()
1141 INIT_LIST_HEAD(&m2m_dev->job_queue); in v4l2_m2m_init()
1142 spin_lock_init(&m2m_dev->job_spinlock); in v4l2_m2m_init()
1143 INIT_WORK(&m2m_dev->job_work, v4l2_m2m_device_run_work); in v4l2_m2m_init()
1145 return m2m_dev; in v4l2_m2m_init()
1149 void v4l2_m2m_release(struct v4l2_m2m_dev *m2m_dev) in v4l2_m2m_release() argument
1151 kfree(m2m_dev); in v4l2_m2m_release()
1155 struct v4l2_m2m_ctx *v4l2_m2m_ctx_init(struct v4l2_m2m_dev *m2m_dev, in v4l2_m2m_ctx_init() argument
1168 m2m_ctx->m2m_dev = m2m_dev; in v4l2_m2m_ctx_init()
1493 struct v4l2_m2m_dev *m2m_dev = fh->m2m_ctx->m2m_dev; in v4l2_m2m_ioctl_stateless_decoder_cmd() local
1501 spin_lock_irqsave(&m2m_dev->job_spinlock, flags); in v4l2_m2m_ioctl_stateless_decoder_cmd()
1523 spin_unlock_irqrestore(&m2m_dev->job_spinlock, flags); in v4l2_m2m_ioctl_stateless_decoder_cmd()