1 // SPDX-License-Identifier: GPL-2.0
3 * Interconnect framework driver for i.MX8MN SoC
5 * Copyright (c) 2019-2020, NXP
8 #include <linux/module.h>
9 #include <linux/platform_device.h>
10 #include <dt-bindings/interconnect/imx8mn.h>
14 static const struct imx_icc_node_adj_desc imx8mn_dram_adj
= {
17 .phandle_name
= "fsl,ddrc",
20 static const struct imx_icc_node_adj_desc imx8mn_noc_adj
= {
27 * Describe bus masters, slaves and connections between them
29 * This is a simplified subset of the bus diagram, there are several other
30 * PL301 nics which are skipped/merged into PL301_MAIN
32 static struct imx_icc_node_desc nodes
[] = {
33 DEFINE_BUS_INTERCONNECT("NOC", IMX8MN_ICN_NOC
, &imx8mn_noc_adj
,
34 IMX8MN_ICS_DRAM
, IMX8MN_ICN_MAIN
),
36 DEFINE_BUS_SLAVE("DRAM", IMX8MN_ICS_DRAM
, &imx8mn_dram_adj
),
37 DEFINE_BUS_SLAVE("OCRAM", IMX8MN_ICS_OCRAM
, NULL
),
38 DEFINE_BUS_MASTER("A53", IMX8MN_ICM_A53
, IMX8MN_ICN_NOC
),
41 DEFINE_BUS_MASTER("GPU", IMX8MN_ICM_GPU
, IMX8MN_ICN_GPU
),
42 DEFINE_BUS_INTERCONNECT("PL301_GPU", IMX8MN_ICN_GPU
, NULL
, IMX8MN_ICN_NOC
),
45 DEFINE_BUS_MASTER("CSI1", IMX8MN_ICM_CSI1
, IMX8MN_ICN_MIPI
),
46 DEFINE_BUS_MASTER("CSI2", IMX8MN_ICM_CSI2
, IMX8MN_ICN_MIPI
),
47 DEFINE_BUS_MASTER("ISI", IMX8MN_ICM_ISI
, IMX8MN_ICN_MIPI
),
48 DEFINE_BUS_MASTER("LCDIF", IMX8MN_ICM_LCDIF
, IMX8MN_ICN_MIPI
),
49 DEFINE_BUS_INTERCONNECT("PL301_MIPI", IMX8MN_ICN_MIPI
, NULL
, IMX8MN_ICN_NOC
),
51 /* USB goes straight to NOC */
52 DEFINE_BUS_MASTER("USB", IMX8MN_ICM_USB
, IMX8MN_ICN_NOC
),
55 DEFINE_BUS_MASTER("SDMA2", IMX8MN_ICM_SDMA2
, IMX8MN_ICN_AUDIO
),
56 DEFINE_BUS_MASTER("SDMA3", IMX8MN_ICM_SDMA3
, IMX8MN_ICN_AUDIO
),
57 DEFINE_BUS_INTERCONNECT("PL301_AUDIO", IMX8MN_ICN_AUDIO
, NULL
, IMX8MN_ICN_MAIN
),
60 DEFINE_BUS_MASTER("ENET", IMX8MN_ICM_ENET
, IMX8MN_ICN_ENET
),
61 DEFINE_BUS_INTERCONNECT("PL301_ENET", IMX8MN_ICN_ENET
, NULL
, IMX8MN_ICN_MAIN
),
64 DEFINE_BUS_MASTER("SDMA1", IMX8MN_ICM_SDMA1
, IMX8MN_ICN_MAIN
),
65 DEFINE_BUS_MASTER("NAND", IMX8MN_ICM_NAND
, IMX8MN_ICN_MAIN
),
66 DEFINE_BUS_MASTER("USDHC1", IMX8MN_ICM_USDHC1
, IMX8MN_ICN_MAIN
),
67 DEFINE_BUS_MASTER("USDHC2", IMX8MN_ICM_USDHC2
, IMX8MN_ICN_MAIN
),
68 DEFINE_BUS_MASTER("USDHC3", IMX8MN_ICM_USDHC3
, IMX8MN_ICN_MAIN
),
69 DEFINE_BUS_INTERCONNECT("PL301_MAIN", IMX8MN_ICN_MAIN
, NULL
,
70 IMX8MN_ICN_NOC
, IMX8MN_ICS_OCRAM
),
73 static int imx8mn_icc_probe(struct platform_device
*pdev
)
75 return imx_icc_register(pdev
, nodes
, ARRAY_SIZE(nodes
));
78 static int imx8mn_icc_remove(struct platform_device
*pdev
)
80 return imx_icc_unregister(pdev
);
83 static struct platform_driver imx8mn_icc_driver
= {
84 .probe
= imx8mn_icc_probe
,
85 .remove
= imx8mn_icc_remove
,
87 .name
= "imx8mn-interconnect",
91 module_platform_driver(imx8mn_icc_driver
);
92 MODULE_ALIAS("platform:imx8mn-interconnect");
93 MODULE_AUTHOR("Leonard Crestez <leonard.crestez@nxp.com>");
94 MODULE_LICENSE("GPL v2");