1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright (c) 2021 MediaTek Inc. 4 * Copyright (c) 2024 Collabora Ltd. 5 * AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> 6 */ 7 8 #include <linux/device.h> 9 #include <linux/interconnect.h> 10 #include <linux/interconnect-provider.h> 11 #include <linux/module.h> 12 #include <linux/platform_device.h> 13 #include <dt-bindings/interconnect/mediatek,mt8183.h> 14 15 #include "icc-emi.h" 16 17 static struct mtk_icc_node ddr_emi = { 18 .name = "ddr-emi", 19 .id = SLAVE_DDR_EMI, 20 .ep = 1, 21 }; 22 23 static struct mtk_icc_node mcusys = { 24 .name = "mcusys", 25 .id = MASTER_MCUSYS, 26 .ep = 0, 27 .num_links = 1, 28 .links = { SLAVE_DDR_EMI } 29 }; 30 31 static struct mtk_icc_node gpu = { 32 .name = "gpu", 33 .id = MASTER_MFG, 34 .ep = 0, 35 .num_links = 1, 36 .links = { SLAVE_DDR_EMI } 37 }; 38 39 static struct mtk_icc_node mmsys = { 40 .name = "mmsys", 41 .id = MASTER_MMSYS, 42 .ep = 0, 43 .num_links = 1, 44 .links = { SLAVE_DDR_EMI } 45 }; 46 47 static struct mtk_icc_node mm_vpu = { 48 .name = "mm-vpu", 49 .id = MASTER_MM_VPU, 50 .ep = 0, 51 .num_links = 1, 52 .links = { MASTER_MMSYS } 53 }; 54 55 static struct mtk_icc_node mm_disp = { 56 .name = "mm-disp", 57 .id = MASTER_MM_DISP, 58 .ep = 0, 59 .num_links = 1, 60 .links = { MASTER_MMSYS } 61 }; 62 63 static struct mtk_icc_node mm_vdec = { 64 .name = "mm-vdec", 65 .id = MASTER_MM_VDEC, 66 .ep = 0, 67 .num_links = 1, 68 .links = { MASTER_MMSYS } 69 }; 70 71 static struct mtk_icc_node mm_venc = { 72 .name = "mm-venc", 73 .id = MASTER_MM_VENC, 74 .ep = 0, 75 .num_links = 1, 76 .links = { MASTER_MMSYS } 77 }; 78 79 static struct mtk_icc_node mm_cam = { 80 .name = "mm-cam", 81 .id = MASTER_MM_CAM, 82 .ep = 0, 83 .num_links = 1, 84 .links = { MASTER_MMSYS } 85 }; 86 87 static struct mtk_icc_node mm_img = { 88 .name = "mm-img", 89 .id = MASTER_MM_IMG, 90 .ep = 0, 91 .num_links = 1, 92 .links = { MASTER_MMSYS } 93 }; 94 95 static struct mtk_icc_node mm_mdp = { 96 .name = "mm-mdp", 97 .id = MASTER_MM_MDP, 98 .ep = 0, 99 .num_links = 1, 100 .links = { MASTER_MMSYS } 101 }; 102 103 static struct mtk_icc_node *mt8183_emi_icc_nodes[] = { 104 [SLAVE_DDR_EMI] = &ddr_emi, 105 [MASTER_MCUSYS] = &mcusys, 106 [MASTER_MFG] = &gpu, 107 [MASTER_MMSYS] = &mmsys, 108 [MASTER_MM_VPU] = &mm_vpu, 109 [MASTER_MM_DISP] = &mm_disp, 110 [MASTER_MM_VDEC] = &mm_vdec, 111 [MASTER_MM_VENC] = &mm_venc, 112 [MASTER_MM_CAM] = &mm_cam, 113 [MASTER_MM_IMG] = &mm_img, 114 [MASTER_MM_MDP] = &mm_mdp 115 }; 116 117 static const struct mtk_icc_desc mt8183_emi_icc = { 118 .nodes = mt8183_emi_icc_nodes, 119 .num_nodes = ARRAY_SIZE(mt8183_emi_icc_nodes), 120 }; 121 122 static const struct of_device_id mtk_mt8183_emi_icc_of_match[] = { 123 { .compatible = "mediatek,mt8183-emi", .data = &mt8183_emi_icc }, 124 { /* sentinel */ }, 125 }; 126 MODULE_DEVICE_TABLE(of, mtk_mt8183_emi_icc_of_match); 127 128 static struct platform_driver mtk_emi_icc_mt8183_driver = { 129 .driver = { 130 .name = "emi-icc-mt8183", 131 .of_match_table = mtk_mt8183_emi_icc_of_match, 132 .sync_state = icc_sync_state, 133 }, 134 .probe = mtk_emi_icc_probe, 135 .remove = mtk_emi_icc_remove, 136 137 }; 138 module_platform_driver(mtk_emi_icc_mt8183_driver); 139 140 MODULE_AUTHOR("AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>"); 141 MODULE_DESCRIPTION("MediaTek MT8183 EMI ICC driver"); 142 MODULE_LICENSE("GPL"); 143