1 | // SPDX-License-Identifier: GPL-2.0-only |
2 | /* |
3 | * ARTPEC-6 device support. |
4 | */ |
5 | |
6 | #include <linux/amba/bus.h> |
7 | #include <linux/clocksource.h> |
8 | #include <linux/dma-mapping.h> |
9 | #include <linux/io.h> |
10 | #include <linux/irqchip.h> |
11 | #include <linux/irqchip/arm-gic.h> |
12 | #include <linux/mfd/syscon.h> |
13 | #include <linux/of.h> |
14 | #include <linux/of_address.h> |
15 | #include <linux/clk-provider.h> |
16 | #include <linux/regmap.h> |
17 | #include <linux/smp.h> |
18 | #include <asm/smp_scu.h> |
19 | #include <asm/mach/arch.h> |
20 | #include <asm/mach/map.h> |
21 | #include <asm/psci.h> |
22 | #include <linux/arm-smccc.h> |
23 | |
24 | |
25 | #define ARTPEC6_DMACFG_REGNUM 0x10 |
26 | #define ARTPEC6_DMACFG_UARTS_BURST 0xff |
27 | |
28 | #define SECURE_OP_L2C_WRITEREG 0xb4000001 |
29 | |
30 | static void __init artpec6_init_machine(void) |
31 | { |
32 | struct regmap *regmap; |
33 | |
34 | regmap = syscon_regmap_lookup_by_compatible(s: "axis,artpec6-syscon" ); |
35 | |
36 | if (!IS_ERR(ptr: regmap)) { |
37 | /* Use PL011 DMA Burst Request signal instead of DMA |
38 | * Single Request |
39 | */ |
40 | regmap_write(map: regmap, ARTPEC6_DMACFG_REGNUM, |
41 | ARTPEC6_DMACFG_UARTS_BURST); |
42 | }; |
43 | } |
44 | |
45 | static void artpec6_l2c310_write_sec(unsigned long val, unsigned reg) |
46 | { |
47 | struct arm_smccc_res res; |
48 | |
49 | arm_smccc_smc(SECURE_OP_L2C_WRITEREG, reg, val, 0, |
50 | 0, 0, 0, 0, &res); |
51 | |
52 | WARN_ON(res.a0); |
53 | } |
54 | |
55 | static const char * const artpec6_dt_match[] = { |
56 | "axis,artpec6" , |
57 | NULL |
58 | }; |
59 | |
60 | DT_MACHINE_START(ARTPEC6, "Axis ARTPEC-6 Platform" ) |
61 | .l2c_aux_val = 0x0C000000, |
62 | .l2c_aux_mask = 0xF3FFFFFF, |
63 | .l2c_write_sec = artpec6_l2c310_write_sec, |
64 | .init_machine = artpec6_init_machine, |
65 | .dt_compat = artpec6_dt_match, |
66 | MACHINE_END |
67 | |