162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * ARTPEC-6 device support. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include <linux/amba/bus.h> 762306a36Sopenharmony_ci#include <linux/clocksource.h> 862306a36Sopenharmony_ci#include <linux/dma-mapping.h> 962306a36Sopenharmony_ci#include <linux/io.h> 1062306a36Sopenharmony_ci#include <linux/irqchip.h> 1162306a36Sopenharmony_ci#include <linux/irqchip/arm-gic.h> 1262306a36Sopenharmony_ci#include <linux/mfd/syscon.h> 1362306a36Sopenharmony_ci#include <linux/of.h> 1462306a36Sopenharmony_ci#include <linux/of_address.h> 1562306a36Sopenharmony_ci#include <linux/clk-provider.h> 1662306a36Sopenharmony_ci#include <linux/regmap.h> 1762306a36Sopenharmony_ci#include <linux/smp.h> 1862306a36Sopenharmony_ci#include <asm/smp_scu.h> 1962306a36Sopenharmony_ci#include <asm/mach/arch.h> 2062306a36Sopenharmony_ci#include <asm/mach/map.h> 2162306a36Sopenharmony_ci#include <asm/psci.h> 2262306a36Sopenharmony_ci#include <linux/arm-smccc.h> 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci#define ARTPEC6_DMACFG_REGNUM 0x10 2662306a36Sopenharmony_ci#define ARTPEC6_DMACFG_UARTS_BURST 0xff 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci#define SECURE_OP_L2C_WRITEREG 0xb4000001 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_cistatic void __init artpec6_init_machine(void) 3162306a36Sopenharmony_ci{ 3262306a36Sopenharmony_ci struct regmap *regmap; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci regmap = syscon_regmap_lookup_by_compatible("axis,artpec6-syscon"); 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci if (!IS_ERR(regmap)) { 3762306a36Sopenharmony_ci /* Use PL011 DMA Burst Request signal instead of DMA 3862306a36Sopenharmony_ci * Single Request 3962306a36Sopenharmony_ci */ 4062306a36Sopenharmony_ci regmap_write(regmap, ARTPEC6_DMACFG_REGNUM, 4162306a36Sopenharmony_ci ARTPEC6_DMACFG_UARTS_BURST); 4262306a36Sopenharmony_ci }; 4362306a36Sopenharmony_ci} 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_cistatic void artpec6_l2c310_write_sec(unsigned long val, unsigned reg) 4662306a36Sopenharmony_ci{ 4762306a36Sopenharmony_ci struct arm_smccc_res res; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci arm_smccc_smc(SECURE_OP_L2C_WRITEREG, reg, val, 0, 5062306a36Sopenharmony_ci 0, 0, 0, 0, &res); 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci WARN_ON(res.a0); 5362306a36Sopenharmony_ci} 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_cistatic const char * const artpec6_dt_match[] = { 5662306a36Sopenharmony_ci "axis,artpec6", 5762306a36Sopenharmony_ci NULL 5862306a36Sopenharmony_ci}; 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ciDT_MACHINE_START(ARTPEC6, "Axis ARTPEC-6 Platform") 6162306a36Sopenharmony_ci .l2c_aux_val = 0x0C000000, 6262306a36Sopenharmony_ci .l2c_aux_mask = 0xF3FFFFFF, 6362306a36Sopenharmony_ci .l2c_write_sec = artpec6_l2c310_write_sec, 6462306a36Sopenharmony_ci .init_machine = artpec6_init_machine, 6562306a36Sopenharmony_ci .dt_compat = artpec6_dt_match, 6662306a36Sopenharmony_ciMACHINE_END 67