2 * Copyright (c) 2015-2016 MediaTek Inc.
3 * Author: Yong Wu <yong.wu@mediatek.com>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 #include <linux/clk.h>
15 #include <linux/component.h>
16 #include <linux/device.h>
17 #include <linux/err.h>
19 #include <linux/module.h>
21 #include <linux/of_platform.h>
22 #include <linux/platform_device.h>
23 #include <linux/pm_runtime.h>
24 #include <soc/mediatek/smi.h>
25 #include <dt-bindings/memory/mt2701-larb-port.h>
28 #define SMI_LARB_MMU_EN 0xf00
31 #define REG_SMI_SECUR_CON_BASE 0x5c0
33 /* every register control 8 port, register offset 0x4 */
34 #define REG_SMI_SECUR_CON_OFFSET(id) (((id) >> 3) << 2)
35 #define REG_SMI_SECUR_CON_ADDR(id) \
36 (REG_SMI_SECUR_CON_BASE + REG_SMI_SECUR_CON_OFFSET(id))
39 * every port have 4 bit to control, bit[port + 3] control virtual or physical,
40 * bit[port + 2 : port + 1] control the domain, bit[port] control the security
43 #define SMI_SECUR_CON_VAL_MSK(id) (~(0xf << (((id) & 0x7) << 2)))
44 #define SMI_SECUR_CON_VAL_VIRT(id) BIT((((id) & 0x7) << 2) + 3)
45 /* mt2701 domain should be set to 3 */
46 #define SMI_SECUR_CON_VAL_DOMAIN(id) (0x3 << ((((id) & 0x7) << 2) + 1))
49 #define SMI_LARB_NONSEC_CON(id) (0x380 + ((id) * 4))
50 #define F_MMU_EN BIT(0)
52 struct mtk_smi_larb_gen
{
54 int port_in_larb
[MTK_LARB_NR_MAX
+ 1];
55 void (*config_port
)(struct device
*);
60 struct clk
*clk_apb
, *clk_smi
;
61 struct clk
*clk_async
; /*only needed by mt2701*/
62 void __iomem
*smi_ao_base
;
65 struct mtk_smi_larb
{ /* larb: local arbiter */
68 struct device
*smi_common_dev
;
69 const struct mtk_smi_larb_gen
*larb_gen
;
79 static int mtk_smi_enable(const struct mtk_smi
*smi
)
83 ret
= pm_runtime_get_sync(smi
->dev
);
87 ret
= clk_prepare_enable(smi
->clk_apb
);
91 ret
= clk_prepare_enable(smi
->clk_smi
);
98 clk_disable_unprepare(smi
->clk_apb
);
100 pm_runtime_put_sync(smi
->dev
);
104 static void mtk_smi_disable(const struct mtk_smi
*smi
)
106 clk_disable_unprepare(smi
->clk_smi
);
107 clk_disable_unprepare(smi
->clk_apb
);
108 pm_runtime_put_sync(smi
->dev
);
111 int mtk_smi_larb_get(struct device
*larbdev
)
113 struct mtk_smi_larb
*larb
= dev_get_drvdata(larbdev
);
114 const struct mtk_smi_larb_gen
*larb_gen
= larb
->larb_gen
;
115 struct mtk_smi
*common
= dev_get_drvdata(larb
->smi_common_dev
);
118 /* Enable the smi-common's power and clocks */
119 ret
= mtk_smi_enable(common
);
123 /* Enable the larb's power and clocks */
124 ret
= mtk_smi_enable(&larb
->smi
);
126 mtk_smi_disable(common
);
130 /* Configure the iommu info for this larb */
131 larb_gen
->config_port(larbdev
);
135 EXPORT_SYMBOL_GPL(mtk_smi_larb_get
);
137 void mtk_smi_larb_put(struct device
*larbdev
)
139 struct mtk_smi_larb
*larb
= dev_get_drvdata(larbdev
);
140 struct mtk_smi
*common
= dev_get_drvdata(larb
->smi_common_dev
);
143 * Don't de-configure the iommu info for this larb since there may be
144 * several modules in this larb.
145 * The iommu info will be reset after power off.
148 mtk_smi_disable(&larb
->smi
);
149 mtk_smi_disable(common
);
151 EXPORT_SYMBOL_GPL(mtk_smi_larb_put
);
154 mtk_smi_larb_bind(struct device
*dev
, struct device
*master
, void *data
)
156 struct mtk_smi_larb
*larb
= dev_get_drvdata(dev
);
157 struct mtk_smi_iommu
*smi_iommu
= data
;
160 if (larb
->larb_gen
->need_larbid
) {
161 larb
->mmu
= &smi_iommu
->larb_imu
[larb
->larbid
].mmu
;
166 * If there is no larbid property, Loop to find the corresponding
169 for (i
= 0; i
< smi_iommu
->larb_nr
; i
++) {
170 if (dev
== smi_iommu
->larb_imu
[i
].dev
) {
171 /* The 'mmu' may be updated in iommu-attach/detach. */
172 larb
->mmu
= &smi_iommu
->larb_imu
[i
].mmu
;
179 static void mtk_smi_larb_config_port_mt2712(struct device
*dev
)
181 struct mtk_smi_larb
*larb
= dev_get_drvdata(dev
);
186 * larb 8/9 is the bdpsys larb, the iommu_en is enabled defaultly.
187 * Don't need to set it again.
189 if (larb
->larbid
== 8 || larb
->larbid
== 9)
192 for_each_set_bit(i
, (unsigned long *)larb
->mmu
, 32) {
193 reg
= readl_relaxed(larb
->base
+ SMI_LARB_NONSEC_CON(i
));
195 writel(reg
, larb
->base
+ SMI_LARB_NONSEC_CON(i
));
199 static void mtk_smi_larb_config_port_mt8173(struct device
*dev
)
201 struct mtk_smi_larb
*larb
= dev_get_drvdata(dev
);
203 writel(*larb
->mmu
, larb
->base
+ SMI_LARB_MMU_EN
);
206 static void mtk_smi_larb_config_port_gen1(struct device
*dev
)
208 struct mtk_smi_larb
*larb
= dev_get_drvdata(dev
);
209 const struct mtk_smi_larb_gen
*larb_gen
= larb
->larb_gen
;
210 struct mtk_smi
*common
= dev_get_drvdata(larb
->smi_common_dev
);
211 int i
, m4u_port_id
, larb_port_num
;
212 u32 sec_con_val
, reg_val
;
214 m4u_port_id
= larb_gen
->port_in_larb
[larb
->larbid
];
215 larb_port_num
= larb_gen
->port_in_larb
[larb
->larbid
+ 1]
216 - larb_gen
->port_in_larb
[larb
->larbid
];
218 for (i
= 0; i
< larb_port_num
; i
++, m4u_port_id
++) {
219 if (*larb
->mmu
& BIT(i
)) {
220 /* bit[port + 3] controls the virtual or physical */
221 sec_con_val
= SMI_SECUR_CON_VAL_VIRT(m4u_port_id
);
223 /* do not need to enable m4u for this port */
226 reg_val
= readl(common
->smi_ao_base
227 + REG_SMI_SECUR_CON_ADDR(m4u_port_id
));
228 reg_val
&= SMI_SECUR_CON_VAL_MSK(m4u_port_id
);
229 reg_val
|= sec_con_val
;
230 reg_val
|= SMI_SECUR_CON_VAL_DOMAIN(m4u_port_id
);
233 + REG_SMI_SECUR_CON_ADDR(m4u_port_id
));
238 mtk_smi_larb_unbind(struct device
*dev
, struct device
*master
, void *data
)
240 /* Do nothing as the iommu is always enabled. */
243 static const struct component_ops mtk_smi_larb_component_ops
= {
244 .bind
= mtk_smi_larb_bind
,
245 .unbind
= mtk_smi_larb_unbind
,
248 static const struct mtk_smi_larb_gen mtk_smi_larb_mt8173
= {
249 /* mt8173 do not need the port in larb */
250 .config_port
= mtk_smi_larb_config_port_mt8173
,
253 static const struct mtk_smi_larb_gen mtk_smi_larb_mt2701
= {
256 LARB0_PORT_OFFSET
, LARB1_PORT_OFFSET
,
257 LARB2_PORT_OFFSET
, LARB3_PORT_OFFSET
259 .config_port
= mtk_smi_larb_config_port_gen1
,
262 static const struct mtk_smi_larb_gen mtk_smi_larb_mt2712
= {
264 .config_port
= mtk_smi_larb_config_port_mt2712
,
267 static const struct of_device_id mtk_smi_larb_of_ids
[] = {
269 .compatible
= "mediatek,mt8173-smi-larb",
270 .data
= &mtk_smi_larb_mt8173
273 .compatible
= "mediatek,mt2701-smi-larb",
274 .data
= &mtk_smi_larb_mt2701
277 .compatible
= "mediatek,mt2712-smi-larb",
278 .data
= &mtk_smi_larb_mt2712
283 static int mtk_smi_larb_probe(struct platform_device
*pdev
)
285 struct mtk_smi_larb
*larb
;
286 struct resource
*res
;
287 struct device
*dev
= &pdev
->dev
;
288 struct device_node
*smi_node
;
289 struct platform_device
*smi_pdev
;
292 larb
= devm_kzalloc(dev
, sizeof(*larb
), GFP_KERNEL
);
296 larb
->larb_gen
= of_device_get_match_data(dev
);
297 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
298 larb
->base
= devm_ioremap_resource(dev
, res
);
299 if (IS_ERR(larb
->base
))
300 return PTR_ERR(larb
->base
);
302 larb
->smi
.clk_apb
= devm_clk_get(dev
, "apb");
303 if (IS_ERR(larb
->smi
.clk_apb
))
304 return PTR_ERR(larb
->smi
.clk_apb
);
306 larb
->smi
.clk_smi
= devm_clk_get(dev
, "smi");
307 if (IS_ERR(larb
->smi
.clk_smi
))
308 return PTR_ERR(larb
->smi
.clk_smi
);
311 if (larb
->larb_gen
->need_larbid
) {
312 err
= of_property_read_u32(dev
->of_node
, "mediatek,larb-id",
315 dev_err(dev
, "missing larbid property\n");
320 smi_node
= of_parse_phandle(dev
->of_node
, "mediatek,smi", 0);
324 smi_pdev
= of_find_device_by_node(smi_node
);
325 of_node_put(smi_node
);
327 if (!platform_get_drvdata(smi_pdev
))
328 return -EPROBE_DEFER
;
329 larb
->smi_common_dev
= &smi_pdev
->dev
;
331 dev_err(dev
, "Failed to get the smi_common device\n");
335 pm_runtime_enable(dev
);
336 platform_set_drvdata(pdev
, larb
);
337 return component_add(dev
, &mtk_smi_larb_component_ops
);
340 static int mtk_smi_larb_remove(struct platform_device
*pdev
)
342 pm_runtime_disable(&pdev
->dev
);
343 component_del(&pdev
->dev
, &mtk_smi_larb_component_ops
);
347 static struct platform_driver mtk_smi_larb_driver
= {
348 .probe
= mtk_smi_larb_probe
,
349 .remove
= mtk_smi_larb_remove
,
351 .name
= "mtk-smi-larb",
352 .of_match_table
= mtk_smi_larb_of_ids
,
356 static const struct of_device_id mtk_smi_common_of_ids
[] = {
358 .compatible
= "mediatek,mt8173-smi-common",
359 .data
= (void *)MTK_SMI_GEN2
362 .compatible
= "mediatek,mt2701-smi-common",
363 .data
= (void *)MTK_SMI_GEN1
366 .compatible
= "mediatek,mt2712-smi-common",
367 .data
= (void *)MTK_SMI_GEN2
372 static int mtk_smi_common_probe(struct platform_device
*pdev
)
374 struct device
*dev
= &pdev
->dev
;
375 struct mtk_smi
*common
;
376 struct resource
*res
;
377 enum mtk_smi_gen smi_gen
;
380 common
= devm_kzalloc(dev
, sizeof(*common
), GFP_KERNEL
);
385 common
->clk_apb
= devm_clk_get(dev
, "apb");
386 if (IS_ERR(common
->clk_apb
))
387 return PTR_ERR(common
->clk_apb
);
389 common
->clk_smi
= devm_clk_get(dev
, "smi");
390 if (IS_ERR(common
->clk_smi
))
391 return PTR_ERR(common
->clk_smi
);
394 * for mtk smi gen 1, we need to get the ao(always on) base to config
395 * m4u port, and we need to enable the aync clock for transform the smi
396 * clock into emi clock domain, but for mtk smi gen2, there's no smi ao
399 smi_gen
= (enum mtk_smi_gen
)of_device_get_match_data(dev
);
400 if (smi_gen
== MTK_SMI_GEN1
) {
401 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
402 common
->smi_ao_base
= devm_ioremap_resource(dev
, res
);
403 if (IS_ERR(common
->smi_ao_base
))
404 return PTR_ERR(common
->smi_ao_base
);
406 common
->clk_async
= devm_clk_get(dev
, "async");
407 if (IS_ERR(common
->clk_async
))
408 return PTR_ERR(common
->clk_async
);
410 ret
= clk_prepare_enable(common
->clk_async
);
414 pm_runtime_enable(dev
);
415 platform_set_drvdata(pdev
, common
);
419 static int mtk_smi_common_remove(struct platform_device
*pdev
)
421 pm_runtime_disable(&pdev
->dev
);
425 static struct platform_driver mtk_smi_common_driver
= {
426 .probe
= mtk_smi_common_probe
,
427 .remove
= mtk_smi_common_remove
,
429 .name
= "mtk-smi-common",
430 .of_match_table
= mtk_smi_common_of_ids
,
434 static int __init
mtk_smi_init(void)
438 ret
= platform_driver_register(&mtk_smi_common_driver
);
440 pr_err("Failed to register SMI driver\n");
444 ret
= platform_driver_register(&mtk_smi_larb_driver
);
446 pr_err("Failed to register SMI-LARB driver\n");
452 platform_driver_unregister(&mtk_smi_common_driver
);
456 module_init(mtk_smi_init
);