Lines Matching refs:dev

29 static int mtk_vcodec_get_hw_count(struct mtk_vcodec_dec_ctx *ctx, struct mtk_vcodec_dec_dev *dev)  in mtk_vcodec_get_hw_count()  argument
31 switch (dev->vdec_pdata->hw_arch) { in mtk_vcodec_get_hw_count()
37 mtk_v4l2_vdec_err(ctx, "hw arch %d not supported", dev->vdec_pdata->hw_arch); in mtk_vcodec_get_hw_count()
42 static bool mtk_vcodec_is_hw_active(struct mtk_vcodec_dec_dev *dev) in mtk_vcodec_is_hw_active() argument
46 if (dev->vdecsys_regmap) in mtk_vcodec_is_hw_active()
47 return !regmap_test_bits(dev->vdecsys_regmap, VDEC_HW_ACTIVE_ADDR, in mtk_vcodec_is_hw_active()
50 cg_status = readl(dev->reg_base[VDEC_SYS] + VDEC_HW_ACTIVE_ADDR); in mtk_vcodec_is_hw_active()
56 struct mtk_vcodec_dec_dev *dev = priv; in mtk_vcodec_dec_irq_handler() local
59 void __iomem *vdec_misc_addr = dev->reg_base[VDEC_MISC] + in mtk_vcodec_dec_irq_handler()
62 ctx = mtk_vcodec_get_curr_ctx(dev, MTK_VDEC_CORE); in mtk_vcodec_dec_irq_handler()
64 if (!mtk_vcodec_is_hw_active(dev)) { in mtk_vcodec_dec_irq_handler()
77 dev->reg_base[VDEC_MISC] + VDEC_IRQ_CFG_REG); in mtk_vcodec_dec_irq_handler()
79 dev->reg_base[VDEC_MISC] + VDEC_IRQ_CFG_REG); in mtk_vcodec_dec_irq_handler()
88 static int mtk_vcodec_get_reg_bases(struct mtk_vcodec_dec_dev *dev) in mtk_vcodec_get_reg_bases() argument
90 struct platform_device *pdev = dev->plat_dev; in mtk_vcodec_get_reg_bases()
125 reg_num = of_property_count_elems_of_size(pdev->dev.of_node, "reg", in mtk_vcodec_get_reg_bases()
128 dev_err(&pdev->dev, "Invalid register property size: %d\n", reg_num); in mtk_vcodec_get_reg_bases()
134 dev->reg_base[i] = devm_platform_ioremap_resource(pdev, i); in mtk_vcodec_get_reg_bases()
135 if (IS_ERR(dev->reg_base[i])) in mtk_vcodec_get_reg_bases()
136 return PTR_ERR(dev->reg_base[i]); in mtk_vcodec_get_reg_bases()
138 dev_dbg(&pdev->dev, "reg[%d] base=%p", i, dev->reg_base[i]); in mtk_vcodec_get_reg_bases()
142 dev->reg_base[i+1] = devm_platform_ioremap_resource_byname(pdev, mtk_dec_reg_names[i]); in mtk_vcodec_get_reg_bases()
143 if (IS_ERR(dev->reg_base[i+1])) in mtk_vcodec_get_reg_bases()
144 return PTR_ERR(dev->reg_base[i+1]); in mtk_vcodec_get_reg_bases()
146 dev_dbg(&pdev->dev, "reg[%d] base=%p", i + 1, dev->reg_base[i + 1]); in mtk_vcodec_get_reg_bases()
149 dev->vdecsys_regmap = syscon_regmap_lookup_by_phandle(pdev->dev.of_node, in mtk_vcodec_get_reg_bases()
151 if (IS_ERR(dev->vdecsys_regmap)) { in mtk_vcodec_get_reg_bases()
152 dev_err(&pdev->dev, "Missing mediatek,vdecsys property"); in mtk_vcodec_get_reg_bases()
153 return PTR_ERR(dev->vdecsys_regmap); in mtk_vcodec_get_reg_bases()
160 static int mtk_vcodec_init_dec_resources(struct mtk_vcodec_dec_dev *dev) in mtk_vcodec_init_dec_resources() argument
162 struct platform_device *pdev = dev->plat_dev; in mtk_vcodec_init_dec_resources()
165 ret = mtk_vcodec_get_reg_bases(dev); in mtk_vcodec_init_dec_resources()
169 if (dev->vdec_pdata->is_subdev_supported) in mtk_vcodec_init_dec_resources()
172 dev->dec_irq = platform_get_irq(pdev, 0); in mtk_vcodec_init_dec_resources()
173 if (dev->dec_irq < 0) in mtk_vcodec_init_dec_resources()
174 return dev->dec_irq; in mtk_vcodec_init_dec_resources()
176 irq_set_status_flags(dev->dec_irq, IRQ_NOAUTOEN); in mtk_vcodec_init_dec_resources()
177 ret = devm_request_irq(&pdev->dev, dev->dec_irq, in mtk_vcodec_init_dec_resources()
178 mtk_vcodec_dec_irq_handler, 0, pdev->name, dev); in mtk_vcodec_init_dec_resources()
180 dev_err(&pdev->dev, "failed to install dev->dec_irq %d (%d)", in mtk_vcodec_init_dec_resources()
181 dev->dec_irq, ret); in mtk_vcodec_init_dec_resources()
185 ret = mtk_vcodec_init_dec_clk(pdev, &dev->pm); in mtk_vcodec_init_dec_resources()
187 dev_err(&pdev->dev, "failed to get mt vcodec clock source"); in mtk_vcodec_init_dec_resources()
191 pm_runtime_enable(&pdev->dev); in mtk_vcodec_init_dec_resources()
197 struct mtk_vcodec_dec_dev *dev = video_drvdata(file); in fops_vcodec_open() local
206 mutex_lock(&dev->dev_mutex); in fops_vcodec_open()
207 ctx->id = dev->id_counter++; in fops_vcodec_open()
212 ctx->dev = dev; in fops_vcodec_open()
213 if (ctx->dev->vdec_pdata->is_subdev_supported) { in fops_vcodec_open()
214 hw_count = mtk_vcodec_get_hw_count(ctx, dev); in fops_vcodec_open()
215 if (!hw_count || !dev->subdev_prob_done) { in fops_vcodec_open()
220 ret = dev->subdev_prob_done(dev); in fops_vcodec_open()
232 ret = dev->vdec_pdata->ctrls_setup(ctx); in fops_vcodec_open()
237 ctx->m2m_ctx = v4l2_m2m_ctx_init(dev->m2m_dev_dec, ctx, in fops_vcodec_open()
253 ret = mtk_vcodec_fw_load_firmware(dev->fw_handler); in fops_vcodec_open()
263 dev->dec_capability = in fops_vcodec_open()
264 mtk_vcodec_fw_get_vdec_capa(dev->fw_handler); in fops_vcodec_open()
266 mtk_v4l2_vdec_dbg(0, ctx, "decoder capability %x", dev->dec_capability); in fops_vcodec_open()
269 ctx->dev->vdec_pdata->init_vdec_params(ctx); in fops_vcodec_open()
271 mutex_lock(&dev->dev_ctx_lock); in fops_vcodec_open()
272 list_add(&ctx->list, &dev->ctx_list); in fops_vcodec_open()
273 mutex_unlock(&dev->dev_ctx_lock); in fops_vcodec_open()
276 mutex_unlock(&dev->dev_mutex); in fops_vcodec_open()
277 mtk_v4l2_vdec_dbg(0, ctx, "%s decoder [%d]", dev_name(&dev->plat_dev->dev), ctx->id); in fops_vcodec_open()
289 mutex_unlock(&dev->dev_mutex); in fops_vcodec_open()
296 struct mtk_vcodec_dec_dev *dev = video_drvdata(file); in fops_vcodec_release() local
300 mutex_lock(&dev->dev_mutex); in fops_vcodec_release()
315 mtk_vcodec_dbgfs_remove(dev, ctx->id); in fops_vcodec_release()
316 mutex_lock(&dev->dev_ctx_lock); in fops_vcodec_release()
318 mutex_unlock(&dev->dev_ctx_lock); in fops_vcodec_release()
320 mutex_unlock(&dev->dev_mutex); in fops_vcodec_release()
335 struct mtk_vcodec_dec_dev *dev; in mtk_vcodec_probe() local
341 dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL); in mtk_vcodec_probe()
342 if (!dev) in mtk_vcodec_probe()
345 INIT_LIST_HEAD(&dev->ctx_list); in mtk_vcodec_probe()
346 dev->plat_dev = pdev; in mtk_vcodec_probe()
348 dev->vdec_pdata = of_device_get_match_data(&pdev->dev); in mtk_vcodec_probe()
349 if (!of_property_read_u32(pdev->dev.of_node, "mediatek,vpu", in mtk_vcodec_probe()
352 } else if (!of_property_read_u32(pdev->dev.of_node, "mediatek,scp", in mtk_vcodec_probe()
356 dev_dbg(&pdev->dev, "Could not get vdec IPI device"); in mtk_vcodec_probe()
359 dma_set_max_seg_size(&pdev->dev, UINT_MAX); in mtk_vcodec_probe()
361 dev->fw_handler = mtk_vcodec_fw_select(dev, fw_type, DECODER); in mtk_vcodec_probe()
362 if (IS_ERR(dev->fw_handler)) in mtk_vcodec_probe()
363 return PTR_ERR(dev->fw_handler); in mtk_vcodec_probe()
365 ret = mtk_vcodec_init_dec_resources(dev); in mtk_vcodec_probe()
367 dev_err(&pdev->dev, "Failed to init dec resources"); in mtk_vcodec_probe()
371 if (IS_VDEC_LAT_ARCH(dev->vdec_pdata->hw_arch)) { in mtk_vcodec_probe()
372 dev->core_workqueue = in mtk_vcodec_probe()
375 if (!dev->core_workqueue) { in mtk_vcodec_probe()
376 dev_dbg(&pdev->dev, "Failed to create core workqueue"); in mtk_vcodec_probe()
383 mutex_init(&dev->dec_mutex[i]); in mtk_vcodec_probe()
384 mutex_init(&dev->dev_mutex); in mtk_vcodec_probe()
385 mutex_init(&dev->dev_ctx_lock); in mtk_vcodec_probe()
386 spin_lock_init(&dev->irqlock); in mtk_vcodec_probe()
388 snprintf(dev->v4l2_dev.name, sizeof(dev->v4l2_dev.name), "%s", in mtk_vcodec_probe()
391 ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev); in mtk_vcodec_probe()
393 dev_err(&pdev->dev, "v4l2_device_register err=%d", ret); in mtk_vcodec_probe()
399 dev_err(&pdev->dev, "Failed to allocate video device"); in mtk_vcodec_probe()
406 vfd_dec->lock = &dev->dev_mutex; in mtk_vcodec_probe()
407 vfd_dec->v4l2_dev = &dev->v4l2_dev; in mtk_vcodec_probe()
414 video_set_drvdata(vfd_dec, dev); in mtk_vcodec_probe()
415 dev->vfd_dec = vfd_dec; in mtk_vcodec_probe()
416 platform_set_drvdata(pdev, dev); in mtk_vcodec_probe()
418 dev->m2m_dev_dec = v4l2_m2m_init(&mtk_vdec_m2m_ops); in mtk_vcodec_probe()
419 if (IS_ERR((__force void *)dev->m2m_dev_dec)) { in mtk_vcodec_probe()
420 dev_err(&pdev->dev, "Failed to init mem2mem dec device"); in mtk_vcodec_probe()
421 ret = PTR_ERR((__force void *)dev->m2m_dev_dec); in mtk_vcodec_probe()
425 dev->decode_workqueue = in mtk_vcodec_probe()
428 if (!dev->decode_workqueue) { in mtk_vcodec_probe()
429 dev_err(&pdev->dev, "Failed to create decode workqueue"); in mtk_vcodec_probe()
434 if (dev->vdec_pdata->is_subdev_supported) { in mtk_vcodec_probe()
435 ret = of_platform_populate(pdev->dev.of_node, NULL, NULL, in mtk_vcodec_probe()
436 &pdev->dev); in mtk_vcodec_probe()
438 dev_err(&pdev->dev, "Main device of_platform_populate failed."); in mtk_vcodec_probe()
442 set_bit(MTK_VDEC_CORE, dev->subdev_bitmap); in mtk_vcodec_probe()
445 atomic_set(&dev->dec_active_cnt, 0); in mtk_vcodec_probe()
446 memset(dev->vdec_racing_info, 0, sizeof(dev->vdec_racing_info)); in mtk_vcodec_probe()
447 mutex_init(&dev->dec_racing_info_mutex); in mtk_vcodec_probe()
451 dev_err(&pdev->dev, "Failed to register video device"); in mtk_vcodec_probe()
455 if (dev->vdec_pdata->uses_stateless_api) { in mtk_vcodec_probe()
459 dev->mdev_dec.dev = &pdev->dev; in mtk_vcodec_probe()
460 strscpy(dev->mdev_dec.model, MTK_VCODEC_DEC_NAME, in mtk_vcodec_probe()
461 sizeof(dev->mdev_dec.model)); in mtk_vcodec_probe()
463 media_device_init(&dev->mdev_dec); in mtk_vcodec_probe()
464 dev->mdev_dec.ops = &mtk_vcodec_media_ops; in mtk_vcodec_probe()
465 dev->v4l2_dev.mdev = &dev->mdev_dec; in mtk_vcodec_probe()
467 ret = v4l2_m2m_register_media_controller(dev->m2m_dev_dec, dev->vfd_dec, in mtk_vcodec_probe()
470 dev_err(&pdev->dev, "Failed to register media controller"); in mtk_vcodec_probe()
474 ret = media_device_register(&dev->mdev_dec); in mtk_vcodec_probe()
476 dev_err(&pdev->dev, "Failed to register media device"); in mtk_vcodec_probe()
480 dev_dbg(&pdev->dev, "media registered as /dev/media%d", vfd_dec->minor); in mtk_vcodec_probe()
483 mtk_vcodec_dbgfs_init(dev, false); in mtk_vcodec_probe()
484 dev_dbg(&pdev->dev, "decoder registered as /dev/video%d", vfd_dec->minor); in mtk_vcodec_probe()
489 v4l2_m2m_unregister_media_controller(dev->m2m_dev_dec); in mtk_vcodec_probe()
493 if (dev->vdec_pdata->uses_stateless_api) in mtk_vcodec_probe()
494 media_device_cleanup(&dev->mdev_dec); in mtk_vcodec_probe()
495 destroy_workqueue(dev->decode_workqueue); in mtk_vcodec_probe()
497 v4l2_m2m_release(dev->m2m_dev_dec); in mtk_vcodec_probe()
499 v4l2_device_unregister(&dev->v4l2_dev); in mtk_vcodec_probe()
501 if (IS_VDEC_LAT_ARCH(dev->vdec_pdata->hw_arch)) in mtk_vcodec_probe()
502 destroy_workqueue(dev->core_workqueue); in mtk_vcodec_probe()
504 if (!dev->vdec_pdata->is_subdev_supported) in mtk_vcodec_probe()
505 pm_runtime_disable(dev->pm.dev); in mtk_vcodec_probe()
507 mtk_vcodec_fw_release(dev->fw_handler); in mtk_vcodec_probe()
543 struct mtk_vcodec_dec_dev *dev = platform_get_drvdata(pdev); in mtk_vcodec_dec_remove() local
545 destroy_workqueue(dev->decode_workqueue); in mtk_vcodec_dec_remove()
547 if (media_devnode_is_registered(dev->mdev_dec.devnode)) { in mtk_vcodec_dec_remove()
548 media_device_unregister(&dev->mdev_dec); in mtk_vcodec_dec_remove()
549 v4l2_m2m_unregister_media_controller(dev->m2m_dev_dec); in mtk_vcodec_dec_remove()
550 media_device_cleanup(&dev->mdev_dec); in mtk_vcodec_dec_remove()
553 if (dev->m2m_dev_dec) in mtk_vcodec_dec_remove()
554 v4l2_m2m_release(dev->m2m_dev_dec); in mtk_vcodec_dec_remove()
556 if (dev->vfd_dec) in mtk_vcodec_dec_remove()
557 video_unregister_device(dev->vfd_dec); in mtk_vcodec_dec_remove()
559 mtk_vcodec_dbgfs_deinit(&dev->dbgfs); in mtk_vcodec_dec_remove()
560 v4l2_device_unregister(&dev->v4l2_dev); in mtk_vcodec_dec_remove()
561 if (!dev->vdec_pdata->is_subdev_supported) in mtk_vcodec_dec_remove()
562 pm_runtime_disable(dev->pm.dev); in mtk_vcodec_dec_remove()
563 mtk_vcodec_fw_release(dev->fw_handler); in mtk_vcodec_dec_remove()