Lines Matching +full:mt8173 +full:- +full:rdma0
1 // SPDX-License-Identifier: GPL-2.0-only
14 #include <linux/dma-mapping.h>
50 if (info->num_planes != 1) in mtk_drm_mode_fb_create()
51 return ERR_PTR(-EINVAL); in mtk_drm_mode_fb_create()
316 { .compatible = "mediatek,mt2701-mmsys",
318 { .compatible = "mediatek,mt7623-mmsys",
320 { .compatible = "mediatek,mt2712-mmsys",
322 { .compatible = "mediatek,mt8167-mmsys",
324 { .compatible = "mediatek,mt8173-mmsys",
326 { .compatible = "mediatek,mt8183-mmsys",
328 { .compatible = "mediatek,mt8186-mmsys",
330 { .compatible = "mediatek,mt8188-vdosys0",
332 { .compatible = "mediatek,mt8192-mmsys",
334 { .compatible = "mediatek,mt8195-mmsys",
336 { .compatible = "mediatek,mt8195-vdosys0",
338 { .compatible = "mediatek,mt8195-vdosys1",
346 if (!strncmp(dev_name(dev), "mediatek-drm", sizeof("mediatek-drm") - 1)) in mtk_drm_match()
355 struct device_node *phandle = dev->parent->of_node; in mtk_drm_get_all_drm_priv()
362 for_each_child_of_node(phandle->parent, node) { in mtk_drm_get_all_drm_priv()
373 drm_dev = device_find_child(&pdev->dev, NULL, mtk_drm_match); in mtk_drm_get_all_drm_priv()
378 if (all_drm_priv[cnt] && all_drm_priv[cnt]->mtk_drm_bound) in mtk_drm_get_all_drm_priv()
387 if (drm_priv->data->mmsys_dev_num == cnt) { in mtk_drm_get_all_drm_priv()
390 all_drm_priv[j]->all_drm_private[i] = all_drm_priv[i]; in mtk_drm_get_all_drm_priv()
400 const struct mtk_mmsys_driver_data *drv_data = private->data; in mtk_drm_find_mmsys_comp()
403 if (drv_data->main_path) in mtk_drm_find_mmsys_comp()
404 for (i = 0; i < drv_data->main_len; i++) in mtk_drm_find_mmsys_comp()
405 if (drv_data->main_path[i] == comp_id) in mtk_drm_find_mmsys_comp()
408 if (drv_data->ext_path) in mtk_drm_find_mmsys_comp()
409 for (i = 0; i < drv_data->ext_len; i++) in mtk_drm_find_mmsys_comp()
410 if (drv_data->ext_path[i] == comp_id) in mtk_drm_find_mmsys_comp()
413 if (drv_data->third_path) in mtk_drm_find_mmsys_comp()
414 for (i = 0; i < drv_data->third_len; i++) in mtk_drm_find_mmsys_comp()
415 if (drv_data->third_path[i] == comp_id) in mtk_drm_find_mmsys_comp()
423 struct mtk_drm_private *private = drm->dev_private; in mtk_drm_kms_init()
430 return -ENODEV; in mtk_drm_kms_init()
436 drm->mode_config.min_width = 64; in mtk_drm_kms_init()
437 drm->mode_config.min_height = 64; in mtk_drm_kms_init()
444 drm->mode_config.max_width = 4096; in mtk_drm_kms_init()
445 drm->mode_config.max_height = 4096; in mtk_drm_kms_init()
446 drm->mode_config.funcs = &mtk_drm_mode_config_funcs; in mtk_drm_kms_init()
447 drm->mode_config.helper_private = &mtk_drm_mode_config_helpers; in mtk_drm_kms_init()
449 for (i = 0; i < private->data->mmsys_dev_num; i++) { in mtk_drm_kms_init()
450 drm->dev_private = private->all_drm_private[i]; in mtk_drm_kms_init()
451 ret = component_bind_all(private->all_drm_private[i]->dev, drm); in mtk_drm_kms_init()
465 * OVL0 -> COLOR0 -> AAL -> OD -> RDMA0 -> UFOE -> DSI0 ... in mtk_drm_kms_init()
472 for (j = 0; j < private->data->mmsys_dev_num; j++) { in mtk_drm_kms_init()
473 priv_n = private->all_drm_private[j]; in mtk_drm_kms_init()
475 if (i == 0 && priv_n->data->main_len) { in mtk_drm_kms_init()
476 ret = mtk_drm_crtc_create(drm, priv_n->data->main_path, in mtk_drm_kms_init()
477 priv_n->data->main_len, j); in mtk_drm_kms_init()
482 } else if (i == 1 && priv_n->data->ext_len) { in mtk_drm_kms_init()
483 ret = mtk_drm_crtc_create(drm, priv_n->data->ext_path, in mtk_drm_kms_init()
484 priv_n->data->ext_len, j); in mtk_drm_kms_init()
489 } else if (i == 2 && priv_n->data->third_len) { in mtk_drm_kms_init()
490 ret = mtk_drm_crtc_create(drm, priv_n->data->third_path, in mtk_drm_kms_init()
491 priv_n->data->third_len, j); in mtk_drm_kms_init()
505 ret = -ENODEV; in mtk_drm_kms_init()
506 dev_err(drm->dev, "Need at least one OVL device\n"); in mtk_drm_kms_init()
510 for (i = 0; i < private->data->mmsys_dev_num; i++) in mtk_drm_kms_init()
511 private->all_drm_private[i]->dma_dev = dma_dev; in mtk_drm_kms_init()
533 for (i = 0; i < private->data->mmsys_dev_num; i++) in mtk_drm_kms_init()
534 component_unbind_all(private->all_drm_private[i]->dev, drm); in mtk_drm_kms_init()
536 for (i = 0; i < private->data->mmsys_dev_num; i++) in mtk_drm_kms_init()
537 put_device(private->all_drm_private[i]->mutex_dev); in mtk_drm_kms_init()
547 component_unbind_all(drm->dev, drm); in mtk_drm_kms_deinit()
554 * not dev->dev, as drm_gem_prime_import() expects.
559 struct mtk_drm_private *private = dev->dev_private; in mtk_drm_gem_prime_import()
561 return drm_gem_prime_import_dev(dev, dma_buf, private->dma_dev); in mtk_drm_gem_prime_import()
593 return -EPROBE_DEFER; in mtk_drm_bind()
595 pdev = of_find_device_by_node(private->mutex_node); in mtk_drm_bind()
597 dev_err(dev, "Waiting for disp-mutex device %pOF\n", in mtk_drm_bind()
598 private->mutex_node); in mtk_drm_bind()
599 of_node_put(private->mutex_node); in mtk_drm_bind()
600 return -EPROBE_DEFER; in mtk_drm_bind()
603 private->mutex_dev = &pdev->dev; in mtk_drm_bind()
604 private->mtk_drm_bound = true; in mtk_drm_bind()
605 private->dev = dev; in mtk_drm_bind()
614 private->drm_master = true; in mtk_drm_bind()
615 drm->dev_private = private; in mtk_drm_bind()
616 for (i = 0; i < private->data->mmsys_dev_num; i++) in mtk_drm_bind()
617 private->all_drm_private[i]->drm = drm; in mtk_drm_bind()
634 private->drm = NULL; in mtk_drm_bind()
636 for (i = 0; i < private->data->mmsys_dev_num; i++) in mtk_drm_bind()
637 private->all_drm_private[i]->drm = NULL; in mtk_drm_bind()
646 if (private->drm_master) { in mtk_drm_unbind()
647 drm_dev_unregister(private->drm); in mtk_drm_unbind()
648 mtk_drm_kms_deinit(private->drm); in mtk_drm_unbind()
649 drm_dev_put(private->drm); in mtk_drm_unbind()
651 private->mtk_drm_bound = false; in mtk_drm_unbind()
652 private->drm_master = false; in mtk_drm_unbind()
653 private->drm = NULL; in mtk_drm_unbind()
662 { .compatible = "mediatek,mt8167-disp-aal",
664 { .compatible = "mediatek,mt8173-disp-aal",
666 { .compatible = "mediatek,mt8183-disp-aal",
668 { .compatible = "mediatek,mt8192-disp-aal",
670 { .compatible = "mediatek,mt8167-disp-ccorr",
672 { .compatible = "mediatek,mt8183-disp-ccorr",
674 { .compatible = "mediatek,mt8192-disp-ccorr",
676 { .compatible = "mediatek,mt2701-disp-color",
678 { .compatible = "mediatek,mt8167-disp-color",
680 { .compatible = "mediatek,mt8173-disp-color",
682 { .compatible = "mediatek,mt8167-disp-dither",
684 { .compatible = "mediatek,mt8183-disp-dither",
686 { .compatible = "mediatek,mt8195-disp-dsc",
688 { .compatible = "mediatek,mt8167-disp-gamma",
690 { .compatible = "mediatek,mt8173-disp-gamma",
692 { .compatible = "mediatek,mt8183-disp-gamma",
694 { .compatible = "mediatek,mt8195-disp-merge",
696 { .compatible = "mediatek,mt2701-disp-mutex",
698 { .compatible = "mediatek,mt2712-disp-mutex",
700 { .compatible = "mediatek,mt8167-disp-mutex",
702 { .compatible = "mediatek,mt8173-disp-mutex",
704 { .compatible = "mediatek,mt8183-disp-mutex",
706 { .compatible = "mediatek,mt8186-disp-mutex",
708 { .compatible = "mediatek,mt8188-disp-mutex",
710 { .compatible = "mediatek,mt8192-disp-mutex",
712 { .compatible = "mediatek,mt8195-disp-mutex",
714 { .compatible = "mediatek,mt8173-disp-od",
716 { .compatible = "mediatek,mt2701-disp-ovl",
718 { .compatible = "mediatek,mt8167-disp-ovl",
720 { .compatible = "mediatek,mt8173-disp-ovl",
722 { .compatible = "mediatek,mt8183-disp-ovl",
724 { .compatible = "mediatek,mt8192-disp-ovl",
726 { .compatible = "mediatek,mt8195-disp-ovl",
728 { .compatible = "mediatek,mt8183-disp-ovl-2l",
730 { .compatible = "mediatek,mt8192-disp-ovl-2l",
732 { .compatible = "mediatek,mt8192-disp-postmask",
734 { .compatible = "mediatek,mt2701-disp-pwm",
736 { .compatible = "mediatek,mt8167-disp-pwm",
738 { .compatible = "mediatek,mt8173-disp-pwm",
740 { .compatible = "mediatek,mt2701-disp-rdma",
742 { .compatible = "mediatek,mt8167-disp-rdma",
744 { .compatible = "mediatek,mt8173-disp-rdma",
746 { .compatible = "mediatek,mt8183-disp-rdma",
748 { .compatible = "mediatek,mt8195-disp-rdma",
750 { .compatible = "mediatek,mt8173-disp-ufoe",
752 { .compatible = "mediatek,mt8173-disp-wdma",
754 { .compatible = "mediatek,mt2701-dpi",
756 { .compatible = "mediatek,mt8167-dsi",
758 { .compatible = "mediatek,mt8173-dpi",
760 { .compatible = "mediatek,mt8183-dpi",
762 { .compatible = "mediatek,mt8186-dpi",
764 { .compatible = "mediatek,mt8188-dp-intf",
766 { .compatible = "mediatek,mt8192-dpi",
768 { .compatible = "mediatek,mt8195-dp-intf",
770 { .compatible = "mediatek,mt2701-dsi",
772 { .compatible = "mediatek,mt8173-dsi",
774 { .compatible = "mediatek,mt8183-dsi",
776 { .compatible = "mediatek,mt8186-dsi",
783 struct device *dev = &pdev->dev; in mtk_drm_probe()
784 struct device_node *phandle = dev->parent->of_node; in mtk_drm_probe()
795 return -ENOMEM; in mtk_drm_probe()
797 private->mmsys_dev = dev->parent; in mtk_drm_probe()
798 if (!private->mmsys_dev) { in mtk_drm_probe()
800 return -ENODEV; in mtk_drm_probe()
805 return -ENODEV; in mtk_drm_probe()
807 private->data = of_id->data; in mtk_drm_probe()
809 private->all_drm_private = devm_kmalloc_array(dev, private->data->mmsys_dev_num, in mtk_drm_probe()
810 sizeof(*private->all_drm_private), in mtk_drm_probe()
812 if (!private->all_drm_private) in mtk_drm_probe()
813 return -ENOMEM; in mtk_drm_probe()
817 ovl_adaptor = platform_device_register_data(dev, "mediatek-disp-ovl-adaptor", in mtk_drm_probe()
819 (void *)private->mmsys_dev, in mtk_drm_probe()
820 sizeof(*private->mmsys_dev)); in mtk_drm_probe()
821 private->ddp_comp[DDP_COMPONENT_DRM_OVL_ADAPTOR].dev = &ovl_adaptor->dev; in mtk_drm_probe()
822 mtk_ddp_comp_init(NULL, &private->ddp_comp[DDP_COMPONENT_DRM_OVL_ADAPTOR], in mtk_drm_probe()
824 component_match_add(dev, &match, compare_dev, &ovl_adaptor->dev); in mtk_drm_probe()
828 for_each_child_of_node(phandle->parent, node) { in mtk_drm_probe()
843 comp_type = (enum mtk_ddp_comp_type)(uintptr_t)of_id->data; in mtk_drm_probe()
849 if (id < 0 || id == private->data->mmsys_id) { in mtk_drm_probe()
850 private->mutex_node = of_node_get(node); in mtk_drm_probe()
851 dev_dbg(dev, "get mutex for mmsys %d", private->data->mmsys_id); in mtk_drm_probe()
866 private->comp_node[comp_id] = of_node_get(node); in mtk_drm_probe()
891 ret = mtk_ddp_comp_init(node, &private->ddp_comp[comp_id], comp_id); in mtk_drm_probe()
898 if (!private->mutex_node) { in mtk_drm_probe()
899 dev_err(dev, "Failed to find disp-mutex node\n"); in mtk_drm_probe()
900 ret = -ENODEV; in mtk_drm_probe()
917 of_node_put(private->mutex_node); in mtk_drm_probe()
919 of_node_put(private->comp_node[i]); in mtk_drm_probe()
928 component_master_del(&pdev->dev, &mtk_drm_ops); in mtk_drm_remove()
929 pm_runtime_disable(&pdev->dev); in mtk_drm_remove()
930 of_node_put(private->mutex_node); in mtk_drm_remove()
932 of_node_put(private->comp_node[i]); in mtk_drm_remove()
939 drm_atomic_helper_shutdown(private->drm); in mtk_drm_shutdown()
945 struct drm_device *drm = private->drm; in mtk_drm_sys_prepare()
947 if (private->drm_master) in mtk_drm_sys_prepare()
956 struct drm_device *drm = private->drm; in mtk_drm_sys_complete()
959 if (private->drm_master) in mtk_drm_sys_complete()
975 .name = "mediatek-drm",