xref: /linux/drivers/interconnect/mediatek/mt8183.c (revision a1ff5a7d78a036d6c2178ee5acd6ba4946243800)
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