board-artpec6.c 1.5 KB

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