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