Lines Matching refs:bdisp

211 	struct bdisp_dev *bdisp = ctx->bdisp_dev;  in bdisp_ctx_stop_req()  local
216 cancel_delayed_work(&bdisp->timeout_work); in bdisp_ctx_stop_req()
218 curr_ctx = v4l2_m2m_get_curr_priv(bdisp->m2m.m2m_dev); in bdisp_ctx_stop_req()
219 if (!test_bit(ST_M2M_RUNNING, &bdisp->state) || (curr_ctx != ctx)) in bdisp_ctx_stop_req()
224 ret = wait_event_timeout(bdisp->irq_queue, in bdisp_ctx_stop_req()
308 struct bdisp_dev *bdisp; in bdisp_device_run() local
315 bdisp = ctx->bdisp_dev; in bdisp_device_run()
316 dev_dbg(bdisp->dev, "%s\n", __func__); in bdisp_device_run()
317 spin_lock_irqsave(&bdisp->slock, flags); in bdisp_device_run()
319 if (bdisp->m2m.ctx != ctx) { in bdisp_device_run()
320 dev_dbg(bdisp->dev, "ctx updated: %p -> %p\n", in bdisp_device_run()
321 bdisp->m2m.ctx, ctx); in bdisp_device_run()
323 bdisp->m2m.ctx = ctx; in bdisp_device_run()
329 wake_up(&bdisp->irq_queue); in bdisp_device_run()
335 dev_err(bdisp->dev, "cannot get address\n"); in bdisp_device_run()
339 bdisp_dbg_perf_begin(bdisp); in bdisp_device_run()
341 err = bdisp_hw_reset(bdisp); in bdisp_device_run()
343 dev_err(bdisp->dev, "could not get HW ready\n"); in bdisp_device_run()
349 dev_err(bdisp->dev, "could not send HW request\n"); in bdisp_device_run()
353 queue_delayed_work(bdisp->work_queue, &bdisp->timeout_work, in bdisp_device_run()
355 set_bit(ST_M2M_RUNNING, &bdisp->state); in bdisp_device_run()
358 spin_unlock_irqrestore(&bdisp->slock, flags); in bdisp_device_run()
578 struct bdisp_dev *bdisp = video_drvdata(file); in bdisp_open() local
582 if (mutex_lock_interruptible(&bdisp->lock)) in bdisp_open()
591 ctx->bdisp_dev = bdisp; in bdisp_open()
594 dev_err(bdisp->dev, "no memory for nodes\n"); in bdisp_open()
599 v4l2_fh_init(&ctx->fh, bdisp->m2m.vdev); in bdisp_open()
603 dev_err(bdisp->dev, "Failed to create control\n"); in bdisp_open()
617 ctx->fh.m2m_ctx = v4l2_m2m_ctx_init(bdisp->m2m.m2m_dev, ctx, in bdisp_open()
620 dev_err(bdisp->dev, "Failed to initialize m2m context\n"); in bdisp_open()
625 bdisp->m2m.refcnt++; in bdisp_open()
626 set_bit(ST_M2M_OPEN, &bdisp->state); in bdisp_open()
628 dev_dbg(bdisp->dev, "driver opened, ctx = 0x%p\n", ctx); in bdisp_open()
630 mutex_unlock(&bdisp->lock); in bdisp_open()
643 mutex_unlock(&bdisp->lock); in bdisp_open()
651 struct bdisp_dev *bdisp = ctx->bdisp_dev; in bdisp_release() local
653 dev_dbg(bdisp->dev, "%s\n", __func__); in bdisp_release()
655 if (mutex_lock_interruptible(&bdisp->lock)) in bdisp_release()
665 if (--bdisp->m2m.refcnt <= 0) in bdisp_release()
666 clear_bit(ST_M2M_OPEN, &bdisp->state); in bdisp_release()
672 mutex_unlock(&bdisp->lock); in bdisp_release()
690 struct bdisp_dev *bdisp = ctx->bdisp_dev; in bdisp_querycap() local
692 strlcpy(cap->driver, bdisp->pdev->name, sizeof(cap->driver)); in bdisp_querycap()
693 strlcpy(cap->card, bdisp->pdev->name, sizeof(cap->card)); in bdisp_querycap()
695 BDISP_NAME, bdisp->id); in bdisp_querycap()
1050 static int bdisp_register_device(struct bdisp_dev *bdisp) in bdisp_register_device() argument
1054 if (!bdisp) in bdisp_register_device()
1057 bdisp->vdev.fops = &bdisp_fops; in bdisp_register_device()
1058 bdisp->vdev.ioctl_ops = &bdisp_ioctl_ops; in bdisp_register_device()
1059 bdisp->vdev.release = video_device_release_empty; in bdisp_register_device()
1060 bdisp->vdev.lock = &bdisp->lock; in bdisp_register_device()
1061 bdisp->vdev.vfl_dir = VFL_DIR_M2M; in bdisp_register_device()
1062 bdisp->vdev.v4l2_dev = &bdisp->v4l2_dev; in bdisp_register_device()
1063 snprintf(bdisp->vdev.name, sizeof(bdisp->vdev.name), "%s.%d", in bdisp_register_device()
1064 BDISP_NAME, bdisp->id); in bdisp_register_device()
1066 video_set_drvdata(&bdisp->vdev, bdisp); in bdisp_register_device()
1068 bdisp->m2m.vdev = &bdisp->vdev; in bdisp_register_device()
1069 bdisp->m2m.m2m_dev = v4l2_m2m_init(&bdisp_m2m_ops); in bdisp_register_device()
1070 if (IS_ERR(bdisp->m2m.m2m_dev)) { in bdisp_register_device()
1071 dev_err(bdisp->dev, "failed to initialize v4l2-m2m device\n"); in bdisp_register_device()
1072 return PTR_ERR(bdisp->m2m.m2m_dev); in bdisp_register_device()
1075 ret = video_register_device(&bdisp->vdev, VFL_TYPE_GRABBER, -1); in bdisp_register_device()
1077 dev_err(bdisp->dev, in bdisp_register_device()
1079 v4l2_m2m_release(bdisp->m2m.m2m_dev); in bdisp_register_device()
1086 static void bdisp_unregister_device(struct bdisp_dev *bdisp) in bdisp_unregister_device() argument
1088 if (!bdisp) in bdisp_unregister_device()
1091 if (bdisp->m2m.m2m_dev) in bdisp_unregister_device()
1092 v4l2_m2m_release(bdisp->m2m.m2m_dev); in bdisp_unregister_device()
1094 video_unregister_device(bdisp->m2m.vdev); in bdisp_unregister_device()
1099 struct bdisp_dev *bdisp = priv; in bdisp_irq_thread() local
1102 spin_lock(&bdisp->slock); in bdisp_irq_thread()
1104 bdisp_dbg_perf_end(bdisp); in bdisp_irq_thread()
1106 cancel_delayed_work(&bdisp->timeout_work); in bdisp_irq_thread()
1108 if (!test_and_clear_bit(ST_M2M_RUNNING, &bdisp->state)) in bdisp_irq_thread()
1111 if (test_and_clear_bit(ST_M2M_SUSPENDING, &bdisp->state)) { in bdisp_irq_thread()
1112 set_bit(ST_M2M_SUSPENDED, &bdisp->state); in bdisp_irq_thread()
1113 wake_up(&bdisp->irq_queue); in bdisp_irq_thread()
1117 ctx = v4l2_m2m_get_curr_priv(bdisp->m2m.m2m_dev); in bdisp_irq_thread()
1121 spin_unlock(&bdisp->slock); in bdisp_irq_thread()
1127 wake_up(&bdisp->irq_queue); in bdisp_irq_thread()
1133 spin_unlock(&bdisp->slock); in bdisp_irq_thread()
1149 struct bdisp_dev *bdisp = container_of(twork, struct bdisp_dev, in bdisp_irq_timeout() local
1153 ctx = v4l2_m2m_get_curr_priv(bdisp->m2m.m2m_dev); in bdisp_irq_timeout()
1157 spin_lock(&bdisp->slock); in bdisp_irq_timeout()
1158 clear_bit(ST_M2M_RUNNING, &bdisp->state); in bdisp_irq_timeout()
1159 spin_unlock(&bdisp->slock); in bdisp_irq_timeout()
1161 bdisp_hw_reset(bdisp); in bdisp_irq_timeout()
1166 static int bdisp_m2m_suspend(struct bdisp_dev *bdisp) in bdisp_m2m_suspend() argument
1171 spin_lock_irqsave(&bdisp->slock, flags); in bdisp_m2m_suspend()
1172 if (!test_bit(ST_M2M_RUNNING, &bdisp->state)) { in bdisp_m2m_suspend()
1173 spin_unlock_irqrestore(&bdisp->slock, flags); in bdisp_m2m_suspend()
1176 clear_bit(ST_M2M_SUSPENDED, &bdisp->state); in bdisp_m2m_suspend()
1177 set_bit(ST_M2M_SUSPENDING, &bdisp->state); in bdisp_m2m_suspend()
1178 spin_unlock_irqrestore(&bdisp->slock, flags); in bdisp_m2m_suspend()
1180 timeout = wait_event_timeout(bdisp->irq_queue, in bdisp_m2m_suspend()
1181 test_bit(ST_M2M_SUSPENDED, &bdisp->state), in bdisp_m2m_suspend()
1184 clear_bit(ST_M2M_SUSPENDING, &bdisp->state); in bdisp_m2m_suspend()
1187 dev_err(bdisp->dev, "%s IRQ timeout\n", __func__); in bdisp_m2m_suspend()
1194 static int bdisp_m2m_resume(struct bdisp_dev *bdisp) in bdisp_m2m_resume() argument
1199 spin_lock_irqsave(&bdisp->slock, flags); in bdisp_m2m_resume()
1200 ctx = bdisp->m2m.ctx; in bdisp_m2m_resume()
1201 bdisp->m2m.ctx = NULL; in bdisp_m2m_resume()
1202 spin_unlock_irqrestore(&bdisp->slock, flags); in bdisp_m2m_resume()
1204 if (test_and_clear_bit(ST_M2M_SUSPENDED, &bdisp->state)) in bdisp_m2m_resume()
1212 struct bdisp_dev *bdisp = dev_get_drvdata(dev); in bdisp_runtime_resume() local
1213 int ret = clk_enable(bdisp->clock); in bdisp_runtime_resume()
1218 return bdisp_m2m_resume(bdisp); in bdisp_runtime_resume()
1223 struct bdisp_dev *bdisp = dev_get_drvdata(dev); in bdisp_runtime_suspend() local
1224 int ret = bdisp_m2m_suspend(bdisp); in bdisp_runtime_suspend()
1227 clk_disable(bdisp->clock); in bdisp_runtime_suspend()
1234 struct bdisp_dev *bdisp = dev_get_drvdata(dev); in bdisp_resume() local
1238 spin_lock_irqsave(&bdisp->slock, flags); in bdisp_resume()
1239 opened = test_bit(ST_M2M_OPEN, &bdisp->state); in bdisp_resume()
1240 spin_unlock_irqrestore(&bdisp->slock, flags); in bdisp_resume()
1268 struct bdisp_dev *bdisp = platform_get_drvdata(pdev); in bdisp_remove() local
1270 bdisp_unregister_device(bdisp); in bdisp_remove()
1272 bdisp_hw_free_filters(bdisp->dev); in bdisp_remove()
1274 vb2_dma_contig_cleanup_ctx(bdisp->alloc_ctx); in bdisp_remove()
1278 bdisp_debugfs_remove(bdisp); in bdisp_remove()
1280 v4l2_device_unregister(&bdisp->v4l2_dev); in bdisp_remove()
1282 if (!IS_ERR(bdisp->clock)) in bdisp_remove()
1283 clk_unprepare(bdisp->clock); in bdisp_remove()
1292 struct bdisp_dev *bdisp; in bdisp_probe() local
1299 bdisp = devm_kzalloc(dev, sizeof(struct bdisp_dev), GFP_KERNEL); in bdisp_probe()
1300 if (!bdisp) in bdisp_probe()
1303 bdisp->pdev = pdev; in bdisp_probe()
1304 bdisp->dev = dev; in bdisp_probe()
1305 platform_set_drvdata(pdev, bdisp); in bdisp_probe()
1308 bdisp->id = of_alias_get_id(pdev->dev.of_node, BDISP_NAME); in bdisp_probe()
1310 bdisp->id = pdev->id; in bdisp_probe()
1312 init_waitqueue_head(&bdisp->irq_queue); in bdisp_probe()
1313 INIT_DELAYED_WORK(&bdisp->timeout_work, bdisp_irq_timeout); in bdisp_probe()
1314 bdisp->work_queue = create_workqueue(BDISP_NAME); in bdisp_probe()
1316 spin_lock_init(&bdisp->slock); in bdisp_probe()
1317 mutex_init(&bdisp->lock); in bdisp_probe()
1321 bdisp->regs = devm_ioremap_resource(dev, res); in bdisp_probe()
1322 if (IS_ERR(bdisp->regs)) { in bdisp_probe()
1324 return PTR_ERR(bdisp->regs); in bdisp_probe()
1327 bdisp->clock = devm_clk_get(dev, BDISP_NAME); in bdisp_probe()
1328 if (IS_ERR(bdisp->clock)) { in bdisp_probe()
1330 return PTR_ERR(bdisp->clock); in bdisp_probe()
1333 ret = clk_prepare(bdisp->clock); in bdisp_probe()
1336 bdisp->clock = ERR_PTR(-EINVAL); in bdisp_probe()
1348 pdev->name, bdisp); in bdisp_probe()
1355 ret = v4l2_device_register(dev, &bdisp->v4l2_dev); in bdisp_probe()
1362 ret = bdisp_debugfs_create(bdisp); in bdisp_probe()
1377 bdisp->alloc_ctx = vb2_dma_contig_init_ctx(dev); in bdisp_probe()
1378 if (IS_ERR(bdisp->alloc_ctx)) { in bdisp_probe()
1379 ret = PTR_ERR(bdisp->alloc_ctx); in bdisp_probe()
1384 if (bdisp_hw_alloc_filters(bdisp->dev)) { in bdisp_probe()
1385 dev_err(bdisp->dev, "no memory for filters\n"); in bdisp_probe()
1391 ret = bdisp_register_device(bdisp); in bdisp_probe()
1398 bdisp->id, bdisp->vdev.num); in bdisp_probe()
1405 bdisp_hw_free_filters(bdisp->dev); in bdisp_probe()
1407 vb2_dma_contig_cleanup_ctx(bdisp->alloc_ctx); in bdisp_probe()
1411 bdisp_debugfs_remove(bdisp); in bdisp_probe()
1413 v4l2_device_unregister(&bdisp->v4l2_dev); in bdisp_probe()
1415 if (!IS_ERR(bdisp->clock)) in bdisp_probe()
1416 clk_unprepare(bdisp->clock); in bdisp_probe()