mm-imx3.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Copyright (C) 1999,2000 Arm Limited
  4. * Copyright (C) 2000 Deep Blue Solutions Ltd
  5. * Copyright (C) 2002 Shane Nay ([email protected])
  6. * Copyright 2005-2007 Freescale Semiconductor, Inc. All Rights Reserved.
  7. * - add MX31 specific definitions
  8. */
  9. #include <linux/mm.h>
  10. #include <linux/init.h>
  11. #include <linux/err.h>
  12. #include <linux/io.h>
  13. #include <linux/of_address.h>
  14. #include <linux/pinctrl/machine.h>
  15. #include <asm/system_misc.h>
  16. #include <asm/hardware/cache-l2x0.h>
  17. #include <asm/mach/map.h>
  18. #include "common.h"
  19. #include "crmregs-imx3.h"
  20. #include "hardware.h"
  21. void __iomem *mx3_ccm_base;
  22. static void imx3_idle(void)
  23. {
  24. unsigned long reg = 0;
  25. __asm__ __volatile__(
  26. /* disable I and D cache */
  27. "mrc p15, 0, %0, c1, c0, 0\n"
  28. "bic %0, %0, #0x00001000\n"
  29. "bic %0, %0, #0x00000004\n"
  30. "mcr p15, 0, %0, c1, c0, 0\n"
  31. /* invalidate I cache */
  32. "mov %0, #0\n"
  33. "mcr p15, 0, %0, c7, c5, 0\n"
  34. /* clear and invalidate D cache */
  35. "mov %0, #0\n"
  36. "mcr p15, 0, %0, c7, c14, 0\n"
  37. /* WFI */
  38. "mov %0, #0\n"
  39. "mcr p15, 0, %0, c7, c0, 4\n"
  40. "nop\n" "nop\n" "nop\n" "nop\n"
  41. "nop\n" "nop\n" "nop\n"
  42. /* enable I and D cache */
  43. "mrc p15, 0, %0, c1, c0, 0\n"
  44. "orr %0, %0, #0x00001000\n"
  45. "orr %0, %0, #0x00000004\n"
  46. "mcr p15, 0, %0, c1, c0, 0\n"
  47. : "=r" (reg));
  48. }
  49. static void __iomem *imx3_ioremap_caller(phys_addr_t phys_addr, size_t size,
  50. unsigned int mtype, void *caller)
  51. {
  52. if (mtype == MT_DEVICE) {
  53. /*
  54. * Access all peripherals below 0x80000000 as nonshared device
  55. * on mx3, but leave l2cc alone. Otherwise cache corruptions
  56. * can occur.
  57. */
  58. if (phys_addr < 0x80000000 &&
  59. !addr_in_module(phys_addr, MX3x_L2CC))
  60. mtype = MT_DEVICE_NONSHARED;
  61. }
  62. return __arm_ioremap_caller(phys_addr, size, mtype, caller);
  63. }
  64. #ifdef CONFIG_SOC_IMX31
  65. static struct map_desc mx31_io_desc[] __initdata = {
  66. imx_map_entry(MX31, X_MEMC, MT_DEVICE),
  67. imx_map_entry(MX31, AVIC, MT_DEVICE_NONSHARED),
  68. imx_map_entry(MX31, AIPS1, MT_DEVICE_NONSHARED),
  69. imx_map_entry(MX31, AIPS2, MT_DEVICE_NONSHARED),
  70. imx_map_entry(MX31, SPBA0, MT_DEVICE_NONSHARED),
  71. };
  72. /*
  73. * This function initializes the memory map. It is called during the
  74. * system startup to create static physical to virtual memory mappings
  75. * for the IO modules.
  76. */
  77. void __init mx31_map_io(void)
  78. {
  79. iotable_init(mx31_io_desc, ARRAY_SIZE(mx31_io_desc));
  80. }
  81. static void imx31_idle(void)
  82. {
  83. int reg = imx_readl(mx3_ccm_base + MXC_CCM_CCMR);
  84. reg &= ~MXC_CCM_CCMR_LPM_MASK;
  85. imx_writel(reg, mx3_ccm_base + MXC_CCM_CCMR);
  86. imx3_idle();
  87. }
  88. void __init imx31_init_early(void)
  89. {
  90. struct device_node *np;
  91. mxc_set_cpu_type(MXC_CPU_MX31);
  92. arch_ioremap_caller = imx3_ioremap_caller;
  93. arm_pm_idle = imx31_idle;
  94. np = of_find_compatible_node(NULL, NULL, "fsl,imx31-ccm");
  95. mx3_ccm_base = of_iomap(np, 0);
  96. BUG_ON(!mx3_ccm_base);
  97. }
  98. #endif /* ifdef CONFIG_SOC_IMX31 */
  99. #ifdef CONFIG_SOC_IMX35
  100. static struct map_desc mx35_io_desc[] __initdata = {
  101. imx_map_entry(MX35, X_MEMC, MT_DEVICE),
  102. imx_map_entry(MX35, AVIC, MT_DEVICE_NONSHARED),
  103. imx_map_entry(MX35, AIPS1, MT_DEVICE_NONSHARED),
  104. imx_map_entry(MX35, AIPS2, MT_DEVICE_NONSHARED),
  105. imx_map_entry(MX35, SPBA0, MT_DEVICE_NONSHARED),
  106. };
  107. void __init mx35_map_io(void)
  108. {
  109. iotable_init(mx35_io_desc, ARRAY_SIZE(mx35_io_desc));
  110. }
  111. static void imx35_idle(void)
  112. {
  113. int reg = imx_readl(mx3_ccm_base + MXC_CCM_CCMR);
  114. reg &= ~MXC_CCM_CCMR_LPM_MASK;
  115. reg |= MXC_CCM_CCMR_LPM_WAIT_MX35;
  116. imx_writel(reg, mx3_ccm_base + MXC_CCM_CCMR);
  117. imx3_idle();
  118. }
  119. void __init imx35_init_early(void)
  120. {
  121. struct device_node *np;
  122. mxc_set_cpu_type(MXC_CPU_MX35);
  123. arm_pm_idle = imx35_idle;
  124. arch_ioremap_caller = imx3_ioremap_caller;
  125. np = of_find_compatible_node(NULL, NULL, "fsl,imx35-ccm");
  126. mx3_ccm_base = of_iomap(np, 0);
  127. BUG_ON(!mx3_ccm_base);
  128. }
  129. #endif /* ifdef CONFIG_SOC_IMX35 */