Lines Matching refs:vsp1
49 struct vsp1_device *vsp1 = data; in vsp1_irq_handler() local
54 for (i = 0; i < vsp1->info->wpf_count; ++i) { in vsp1_irq_handler()
55 struct vsp1_rwpf *wpf = vsp1->wpf[i]; in vsp1_irq_handler()
60 status = vsp1_read(vsp1, VI6_WPF_IRQ_STA(i)); in vsp1_irq_handler()
61 vsp1_write(vsp1, VI6_WPF_IRQ_STA(i), ~status & mask); in vsp1_irq_handler()
90 static int vsp1_create_sink_links(struct vsp1_device *vsp1, in vsp1_create_sink_links() argument
98 list_for_each_entry(source, &vsp1->entities, list_dev) { in vsp1_create_sink_links()
133 static int vsp1_uapi_create_links(struct vsp1_device *vsp1) in vsp1_uapi_create_links() argument
139 list_for_each_entry(entity, &vsp1->entities, list_dev) { in vsp1_uapi_create_links()
144 ret = vsp1_create_sink_links(vsp1, entity); in vsp1_uapi_create_links()
149 if (vsp1->hgo) { in vsp1_uapi_create_links()
150 ret = media_create_pad_link(&vsp1->hgo->histo.entity.subdev.entity, in vsp1_uapi_create_links()
152 &vsp1->hgo->histo.video.entity, 0, in vsp1_uapi_create_links()
159 if (vsp1->hgt) { in vsp1_uapi_create_links()
160 ret = media_create_pad_link(&vsp1->hgt->histo.entity.subdev.entity, in vsp1_uapi_create_links()
162 &vsp1->hgt->histo.video.entity, 0, in vsp1_uapi_create_links()
169 for (i = 0; i < vsp1->info->lif_count; ++i) { in vsp1_uapi_create_links()
170 if (!vsp1->lif[i]) in vsp1_uapi_create_links()
173 ret = media_create_pad_link(&vsp1->wpf[i]->entity.subdev.entity, in vsp1_uapi_create_links()
175 &vsp1->lif[i]->entity.subdev.entity, in vsp1_uapi_create_links()
181 for (i = 0; i < vsp1->info->rpf_count; ++i) { in vsp1_uapi_create_links()
182 struct vsp1_rwpf *rpf = vsp1->rpf[i]; in vsp1_uapi_create_links()
193 for (i = 0; i < vsp1->info->wpf_count; ++i) { in vsp1_uapi_create_links()
198 struct vsp1_rwpf *wpf = vsp1->wpf[i]; in vsp1_uapi_create_links()
212 static void vsp1_destroy_entities(struct vsp1_device *vsp1) in vsp1_destroy_entities() argument
217 list_for_each_entry_safe(entity, _entity, &vsp1->entities, list_dev) { in vsp1_destroy_entities()
222 list_for_each_entry_safe(video, _video, &vsp1->videos, list) { in vsp1_destroy_entities()
227 v4l2_device_unregister(&vsp1->v4l2_dev); in vsp1_destroy_entities()
228 if (vsp1->info->uapi) in vsp1_destroy_entities()
229 media_device_unregister(&vsp1->media_dev); in vsp1_destroy_entities()
230 media_device_cleanup(&vsp1->media_dev); in vsp1_destroy_entities()
232 if (!vsp1->info->uapi) in vsp1_destroy_entities()
233 vsp1_drm_cleanup(vsp1); in vsp1_destroy_entities()
236 static int vsp1_create_entities(struct vsp1_device *vsp1) in vsp1_create_entities() argument
238 struct media_device *mdev = &vsp1->media_dev; in vsp1_create_entities()
239 struct v4l2_device *vdev = &vsp1->v4l2_dev; in vsp1_create_entities()
244 mdev->dev = vsp1->dev; in vsp1_create_entities()
245 mdev->hw_revision = vsp1->version; in vsp1_create_entities()
246 strscpy(mdev->model, vsp1->info->model, sizeof(mdev->model)); in vsp1_create_entities()
249 vsp1->media_ops.link_setup = vsp1_entity_link_setup; in vsp1_create_entities()
255 if (vsp1->info->uapi) in vsp1_create_entities()
256 vsp1->media_ops.link_validate = v4l2_subdev_link_validate; in vsp1_create_entities()
259 ret = v4l2_device_register(vsp1->dev, vdev); in vsp1_create_entities()
261 dev_err(vsp1->dev, "V4L2 device registration failed (%d)\n", in vsp1_create_entities()
267 if (vsp1_feature(vsp1, VSP1_HAS_BRS)) { in vsp1_create_entities()
268 vsp1->brs = vsp1_brx_create(vsp1, VSP1_ENTITY_BRS); in vsp1_create_entities()
269 if (IS_ERR(vsp1->brs)) { in vsp1_create_entities()
270 ret = PTR_ERR(vsp1->brs); in vsp1_create_entities()
274 list_add_tail(&vsp1->brs->entity.list_dev, &vsp1->entities); in vsp1_create_entities()
277 if (vsp1_feature(vsp1, VSP1_HAS_BRU)) { in vsp1_create_entities()
278 vsp1->bru = vsp1_brx_create(vsp1, VSP1_ENTITY_BRU); in vsp1_create_entities()
279 if (IS_ERR(vsp1->bru)) { in vsp1_create_entities()
280 ret = PTR_ERR(vsp1->bru); in vsp1_create_entities()
284 list_add_tail(&vsp1->bru->entity.list_dev, &vsp1->entities); in vsp1_create_entities()
287 if (vsp1_feature(vsp1, VSP1_HAS_CLU)) { in vsp1_create_entities()
288 vsp1->clu = vsp1_clu_create(vsp1); in vsp1_create_entities()
289 if (IS_ERR(vsp1->clu)) { in vsp1_create_entities()
290 ret = PTR_ERR(vsp1->clu); in vsp1_create_entities()
294 list_add_tail(&vsp1->clu->entity.list_dev, &vsp1->entities); in vsp1_create_entities()
297 vsp1->hsi = vsp1_hsit_create(vsp1, true); in vsp1_create_entities()
298 if (IS_ERR(vsp1->hsi)) { in vsp1_create_entities()
299 ret = PTR_ERR(vsp1->hsi); in vsp1_create_entities()
303 list_add_tail(&vsp1->hsi->entity.list_dev, &vsp1->entities); in vsp1_create_entities()
305 vsp1->hst = vsp1_hsit_create(vsp1, false); in vsp1_create_entities()
306 if (IS_ERR(vsp1->hst)) { in vsp1_create_entities()
307 ret = PTR_ERR(vsp1->hst); in vsp1_create_entities()
311 list_add_tail(&vsp1->hst->entity.list_dev, &vsp1->entities); in vsp1_create_entities()
313 if (vsp1_feature(vsp1, VSP1_HAS_HGO) && vsp1->info->uapi) { in vsp1_create_entities()
314 vsp1->hgo = vsp1_hgo_create(vsp1); in vsp1_create_entities()
315 if (IS_ERR(vsp1->hgo)) { in vsp1_create_entities()
316 ret = PTR_ERR(vsp1->hgo); in vsp1_create_entities()
320 list_add_tail(&vsp1->hgo->histo.entity.list_dev, in vsp1_create_entities()
321 &vsp1->entities); in vsp1_create_entities()
324 if (vsp1_feature(vsp1, VSP1_HAS_HGT) && vsp1->info->uapi) { in vsp1_create_entities()
325 vsp1->hgt = vsp1_hgt_create(vsp1); in vsp1_create_entities()
326 if (IS_ERR(vsp1->hgt)) { in vsp1_create_entities()
327 ret = PTR_ERR(vsp1->hgt); in vsp1_create_entities()
331 list_add_tail(&vsp1->hgt->histo.entity.list_dev, in vsp1_create_entities()
332 &vsp1->entities); in vsp1_create_entities()
340 if (!vsp1->info->uapi) { in vsp1_create_entities()
341 for (i = 0; i < vsp1->info->lif_count; ++i) { in vsp1_create_entities()
344 lif = vsp1_lif_create(vsp1, i); in vsp1_create_entities()
350 vsp1->lif[i] = lif; in vsp1_create_entities()
351 list_add_tail(&lif->entity.list_dev, &vsp1->entities); in vsp1_create_entities()
355 if (vsp1_feature(vsp1, VSP1_HAS_LUT)) { in vsp1_create_entities()
356 vsp1->lut = vsp1_lut_create(vsp1); in vsp1_create_entities()
357 if (IS_ERR(vsp1->lut)) { in vsp1_create_entities()
358 ret = PTR_ERR(vsp1->lut); in vsp1_create_entities()
362 list_add_tail(&vsp1->lut->entity.list_dev, &vsp1->entities); in vsp1_create_entities()
365 for (i = 0; i < vsp1->info->rpf_count; ++i) { in vsp1_create_entities()
368 rpf = vsp1_rpf_create(vsp1, i); in vsp1_create_entities()
374 vsp1->rpf[i] = rpf; in vsp1_create_entities()
375 list_add_tail(&rpf->entity.list_dev, &vsp1->entities); in vsp1_create_entities()
377 if (vsp1->info->uapi) { in vsp1_create_entities()
378 struct vsp1_video *video = vsp1_video_create(vsp1, rpf); in vsp1_create_entities()
385 list_add_tail(&video->list, &vsp1->videos); in vsp1_create_entities()
389 if (vsp1_feature(vsp1, VSP1_HAS_SRU)) { in vsp1_create_entities()
390 vsp1->sru = vsp1_sru_create(vsp1); in vsp1_create_entities()
391 if (IS_ERR(vsp1->sru)) { in vsp1_create_entities()
392 ret = PTR_ERR(vsp1->sru); in vsp1_create_entities()
396 list_add_tail(&vsp1->sru->entity.list_dev, &vsp1->entities); in vsp1_create_entities()
399 for (i = 0; i < vsp1->info->uds_count; ++i) { in vsp1_create_entities()
402 uds = vsp1_uds_create(vsp1, i); in vsp1_create_entities()
408 vsp1->uds[i] = uds; in vsp1_create_entities()
409 list_add_tail(&uds->entity.list_dev, &vsp1->entities); in vsp1_create_entities()
412 for (i = 0; i < vsp1->info->uif_count; ++i) { in vsp1_create_entities()
415 uif = vsp1_uif_create(vsp1, i); in vsp1_create_entities()
421 vsp1->uif[i] = uif; in vsp1_create_entities()
422 list_add_tail(&uif->entity.list_dev, &vsp1->entities); in vsp1_create_entities()
425 for (i = 0; i < vsp1->info->wpf_count; ++i) { in vsp1_create_entities()
428 wpf = vsp1_wpf_create(vsp1, i); in vsp1_create_entities()
434 vsp1->wpf[i] = wpf; in vsp1_create_entities()
435 list_add_tail(&wpf->entity.list_dev, &vsp1->entities); in vsp1_create_entities()
437 if (vsp1->info->uapi) { in vsp1_create_entities()
438 struct vsp1_video *video = vsp1_video_create(vsp1, wpf); in vsp1_create_entities()
445 list_add_tail(&video->list, &vsp1->videos); in vsp1_create_entities()
450 list_for_each_entry(entity, &vsp1->entities, list_dev) { in vsp1_create_entities()
451 ret = v4l2_device_register_subdev(&vsp1->v4l2_dev, in vsp1_create_entities()
461 if (vsp1->info->uapi) { in vsp1_create_entities()
462 ret = vsp1_uapi_create_links(vsp1); in vsp1_create_entities()
466 ret = v4l2_device_register_subdev_nodes(&vsp1->v4l2_dev); in vsp1_create_entities()
472 ret = vsp1_drm_init(vsp1); in vsp1_create_entities()
477 vsp1_destroy_entities(vsp1); in vsp1_create_entities()
482 int vsp1_reset_wpf(struct vsp1_device *vsp1, unsigned int index) in vsp1_reset_wpf() argument
487 status = vsp1_read(vsp1, VI6_STATUS); in vsp1_reset_wpf()
491 vsp1_write(vsp1, VI6_SRESET, VI6_SRESET_SRTS(index)); in vsp1_reset_wpf()
493 status = vsp1_read(vsp1, VI6_STATUS); in vsp1_reset_wpf()
501 dev_err(vsp1->dev, "failed to reset wpf.%u\n", index); in vsp1_reset_wpf()
508 static int vsp1_device_init(struct vsp1_device *vsp1) in vsp1_device_init() argument
514 for (i = 0; i < vsp1->info->wpf_count; ++i) { in vsp1_device_init()
515 ret = vsp1_reset_wpf(vsp1, i); in vsp1_device_init()
520 vsp1_write(vsp1, VI6_CLK_DCSWT, (8 << VI6_CLK_DCSWT_CSTPW_SHIFT) | in vsp1_device_init()
523 for (i = 0; i < vsp1->info->rpf_count; ++i) in vsp1_device_init()
524 vsp1_write(vsp1, VI6_DPR_RPF_ROUTE(i), VI6_DPR_NODE_UNUSED); in vsp1_device_init()
526 for (i = 0; i < vsp1->info->uds_count; ++i) in vsp1_device_init()
527 vsp1_write(vsp1, VI6_DPR_UDS_ROUTE(i), VI6_DPR_NODE_UNUSED); in vsp1_device_init()
529 for (i = 0; i < vsp1->info->uif_count; ++i) in vsp1_device_init()
530 vsp1_write(vsp1, VI6_DPR_UIF_ROUTE(i), VI6_DPR_NODE_UNUSED); in vsp1_device_init()
532 vsp1_write(vsp1, VI6_DPR_SRU_ROUTE, VI6_DPR_NODE_UNUSED); in vsp1_device_init()
533 vsp1_write(vsp1, VI6_DPR_LUT_ROUTE, VI6_DPR_NODE_UNUSED); in vsp1_device_init()
534 vsp1_write(vsp1, VI6_DPR_CLU_ROUTE, VI6_DPR_NODE_UNUSED); in vsp1_device_init()
535 vsp1_write(vsp1, VI6_DPR_HST_ROUTE, VI6_DPR_NODE_UNUSED); in vsp1_device_init()
536 vsp1_write(vsp1, VI6_DPR_HSI_ROUTE, VI6_DPR_NODE_UNUSED); in vsp1_device_init()
537 vsp1_write(vsp1, VI6_DPR_BRU_ROUTE, VI6_DPR_NODE_UNUSED); in vsp1_device_init()
539 if (vsp1_feature(vsp1, VSP1_HAS_BRS)) in vsp1_device_init()
540 vsp1_write(vsp1, VI6_DPR_ILV_BRS_ROUTE, VI6_DPR_NODE_UNUSED); in vsp1_device_init()
542 vsp1_write(vsp1, VI6_DPR_HGO_SMPPT, (7 << VI6_DPR_SMPPT_TGW_SHIFT) | in vsp1_device_init()
544 vsp1_write(vsp1, VI6_DPR_HGT_SMPPT, (7 << VI6_DPR_SMPPT_TGW_SHIFT) | in vsp1_device_init()
547 vsp1_dlm_setup(vsp1); in vsp1_device_init()
552 static void vsp1_mask_all_interrupts(struct vsp1_device *vsp1) in vsp1_mask_all_interrupts() argument
556 for (i = 0; i < vsp1->info->lif_count; ++i) in vsp1_mask_all_interrupts()
557 vsp1_write(vsp1, VI6_DISP_IRQ_ENB(i), 0); in vsp1_mask_all_interrupts()
558 for (i = 0; i < vsp1->info->wpf_count; ++i) in vsp1_mask_all_interrupts()
559 vsp1_write(vsp1, VI6_WPF_IRQ_ENB(i), 0); in vsp1_mask_all_interrupts()
569 int vsp1_device_get(struct vsp1_device *vsp1) in vsp1_device_get() argument
571 return pm_runtime_resume_and_get(vsp1->dev); in vsp1_device_get()
580 void vsp1_device_put(struct vsp1_device *vsp1) in vsp1_device_put() argument
582 pm_runtime_put_sync(vsp1->dev); in vsp1_device_put()
591 struct vsp1_device *vsp1 = dev_get_drvdata(dev); in vsp1_pm_suspend() local
597 if (!vsp1->drm) in vsp1_pm_suspend()
598 vsp1_video_suspend(vsp1); in vsp1_pm_suspend()
600 pm_runtime_force_suspend(vsp1->dev); in vsp1_pm_suspend()
607 struct vsp1_device *vsp1 = dev_get_drvdata(dev); in vsp1_pm_resume() local
609 pm_runtime_force_resume(vsp1->dev); in vsp1_pm_resume()
615 if (!vsp1->drm) in vsp1_pm_resume()
616 vsp1_video_resume(vsp1); in vsp1_pm_resume()
623 struct vsp1_device *vsp1 = dev_get_drvdata(dev); in vsp1_pm_runtime_suspend() local
625 rcar_fcp_disable(vsp1->fcp); in vsp1_pm_runtime_suspend()
626 reset_control_assert(vsp1->rstc); in vsp1_pm_runtime_suspend()
633 struct vsp1_device *vsp1 = dev_get_drvdata(dev); in vsp1_pm_runtime_resume() local
636 ret = reset_control_deassert(vsp1->rstc); in vsp1_pm_runtime_resume()
640 if (vsp1->info) { in vsp1_pm_runtime_resume()
646 if (vsp1->info->gen == 2) in vsp1_pm_runtime_resume()
649 ret = vsp1_device_init(vsp1); in vsp1_pm_runtime_resume()
654 ret = rcar_fcp_enable(vsp1->fcp); in vsp1_pm_runtime_resume()
658 reset_control_assert(vsp1->rstc); in vsp1_pm_runtime_resume()
845 static const struct vsp1_device_info *vsp1_lookup_info(struct vsp1_device *vsp1) in vsp1_lookup_info() argument
856 info = of_device_get_match_data(vsp1->dev); in vsp1_lookup_info()
858 vsp1->version = VI6_IP_VERSION_VSP_SW | info->version | info->soc; in vsp1_lookup_info()
862 vsp1->version = vsp1_read(vsp1, VI6_IP_VERSION); in vsp1_lookup_info()
863 model = vsp1->version & VI6_IP_VERSION_MODEL_MASK; in vsp1_lookup_info()
864 soc = vsp1->version & VI6_IP_VERSION_SOC_MASK; in vsp1_lookup_info()
873 dev_err(vsp1->dev, "unsupported IP version 0x%08x\n", vsp1->version); in vsp1_lookup_info()
880 struct vsp1_device *vsp1; in vsp1_probe() local
885 vsp1 = devm_kzalloc(&pdev->dev, sizeof(*vsp1), GFP_KERNEL); in vsp1_probe()
886 if (vsp1 == NULL) in vsp1_probe()
889 vsp1->dev = &pdev->dev; in vsp1_probe()
890 INIT_LIST_HEAD(&vsp1->entities); in vsp1_probe()
891 INIT_LIST_HEAD(&vsp1->videos); in vsp1_probe()
893 platform_set_drvdata(pdev, vsp1); in vsp1_probe()
896 vsp1->mmio = devm_platform_ioremap_resource(pdev, 0); in vsp1_probe()
897 if (IS_ERR(vsp1->mmio)) in vsp1_probe()
898 return PTR_ERR(vsp1->mmio); in vsp1_probe()
904 vsp1->rstc = devm_reset_control_get_shared(&pdev->dev, NULL); in vsp1_probe()
905 if (IS_ERR(vsp1->rstc)) in vsp1_probe()
906 return dev_err_probe(&pdev->dev, PTR_ERR(vsp1->rstc), in vsp1_probe()
912 vsp1->fcp = rcar_fcp_get(fcp_node); in vsp1_probe()
914 if (IS_ERR(vsp1->fcp)) { in vsp1_probe()
916 PTR_ERR(vsp1->fcp)); in vsp1_probe()
917 return PTR_ERR(vsp1->fcp); in vsp1_probe()
925 vsp1->bus_master = rcar_fcp_get_device(vsp1->fcp); in vsp1_probe()
927 vsp1->bus_master = vsp1->dev; in vsp1_probe()
933 ret = vsp1_device_get(vsp1); in vsp1_probe()
937 vsp1->info = vsp1_lookup_info(vsp1); in vsp1_probe()
938 if (!vsp1->info) { in vsp1_probe()
939 vsp1_device_put(vsp1); in vsp1_probe()
944 dev_dbg(&pdev->dev, "IP version 0x%08x\n", vsp1->version); in vsp1_probe()
953 vsp1_mask_all_interrupts(vsp1); in vsp1_probe()
955 vsp1_device_put(vsp1); in vsp1_probe()
958 IRQF_SHARED, dev_name(&pdev->dev), vsp1); in vsp1_probe()
965 ret = vsp1_create_entities(vsp1); in vsp1_probe()
974 rcar_fcp_put(vsp1->fcp); in vsp1_probe()
982 struct vsp1_device *vsp1 = platform_get_drvdata(pdev); in vsp1_remove() local
984 vsp1_destroy_entities(vsp1); in vsp1_remove()
985 rcar_fcp_put(vsp1->fcp); in vsp1_remove()