mach-ox820.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. #include <linux/init.h>
  2. #include <linux/kernel.h>
  3. #include <linux/bug.h>
  4. #include <linux/of_platform.h>
  5. #include <linux/clocksource.h>
  6. #include <linux/clk-provider.h>
  7. #include <linux/clk.h>
  8. #include <linux/slab.h>
  9. #include <linux/gfp.h>
  10. #include <linux/reset.h>
  11. #include <linux/version.h>
  12. #include <asm/mach-types.h>
  13. #include <asm/mach/map.h>
  14. #include <asm/mach/arch.h>
  15. #include <asm/page.h>
  16. #include <mach/iomap.h>
  17. #include <mach/hardware.h>
  18. #include <mach/utils.h>
  19. #include <mach/smp.h>
  20. static struct map_desc ox820_io_desc[] __initdata = {
  21. {
  22. .virtual = (unsigned long)OXNAS_PERCPU_BASE_VA,
  23. .pfn = __phys_to_pfn(OXNAS_PERCPU_BASE),
  24. .length = OXNAS_PERCPU_SIZE,
  25. .type = MT_DEVICE,
  26. },
  27. {
  28. .virtual = (unsigned long)OXNAS_SYSCRTL_BASE_VA,
  29. .pfn = __phys_to_pfn(OXNAS_SYSCRTL_BASE),
  30. .length = OXNAS_SYSCRTL_SIZE,
  31. .type = MT_DEVICE,
  32. },
  33. {
  34. .virtual = (unsigned long)OXNAS_SECCRTL_BASE_VA,
  35. .pfn = __phys_to_pfn(OXNAS_SECCRTL_BASE),
  36. .length = OXNAS_SECCRTL_SIZE,
  37. .type = MT_DEVICE,
  38. },
  39. {
  40. .virtual = (unsigned long)OXNAS_RPSA_BASE_VA,
  41. .pfn = __phys_to_pfn(OXNAS_RPSA_BASE),
  42. .length = OXNAS_RPSA_SIZE,
  43. .type = MT_DEVICE,
  44. },
  45. {
  46. .virtual = (unsigned long)OXNAS_RPSC_BASE_VA,
  47. .pfn = __phys_to_pfn(OXNAS_RPSC_BASE),
  48. .length = OXNAS_RPSC_SIZE,
  49. .type = MT_DEVICE,
  50. },
  51. };
  52. void __init ox820_map_common_io(void)
  53. {
  54. debug_ll_io_init();
  55. iotable_init(ox820_io_desc, ARRAY_SIZE(ox820_io_desc));
  56. }
  57. static void __init ox820_dt_init(void)
  58. {
  59. int ret;
  60. ret = of_platform_populate(NULL, of_default_bus_match_table, NULL,
  61. NULL);
  62. if (ret) {
  63. pr_err("of_platform_populate failed: %d\n", ret);
  64. BUG();
  65. }
  66. }
  67. static void __init ox820_timer_init(void)
  68. {
  69. of_clk_init(NULL);
  70. #if LINUX_VERSION_CODE < KERNEL_VERSION(4,3,0)
  71. clocksource_of_init();
  72. #else
  73. clocksource_probe();
  74. #endif
  75. }
  76. void ox820_init_early(void)
  77. {
  78. }
  79. void ox820_assert_system_reset(enum reboot_mode mode, const char *cmd)
  80. {
  81. u32 value;
  82. /* Assert reset to cores as per power on defaults
  83. * Don't touch the DDR interface as things will come to an impromptu stop
  84. * NB Possibly should be asserting reset for PLLB, but there are timing
  85. * concerns here according to the docs */
  86. value = BIT(SYS_CTRL_RST_COPRO) |
  87. BIT(SYS_CTRL_RST_USBHS) |
  88. BIT(SYS_CTRL_RST_USBHSPHYA) |
  89. BIT(SYS_CTRL_RST_MACA) |
  90. BIT(SYS_CTRL_RST_PCIEA) |
  91. BIT(SYS_CTRL_RST_SGDMA) |
  92. BIT(SYS_CTRL_RST_CIPHER) |
  93. BIT(SYS_CTRL_RST_SATA) |
  94. BIT(SYS_CTRL_RST_SATA_LINK) |
  95. BIT(SYS_CTRL_RST_SATA_PHY) |
  96. BIT(SYS_CTRL_RST_PCIEPHY) |
  97. BIT(SYS_CTRL_RST_STATIC) |
  98. BIT(SYS_CTRL_RST_UART1) |
  99. BIT(SYS_CTRL_RST_UART2) |
  100. BIT(SYS_CTRL_RST_MISC) |
  101. BIT(SYS_CTRL_RST_I2S) |
  102. BIT(SYS_CTRL_RST_SD) |
  103. BIT(SYS_CTRL_RST_MACB) |
  104. BIT(SYS_CTRL_RST_PCIEB) |
  105. BIT(SYS_CTRL_RST_VIDEO) |
  106. BIT(SYS_CTRL_RST_USBHSPHYB) |
  107. BIT(SYS_CTRL_RST_USBDEV);
  108. writel(value, SYS_CTRL_RST_SET_CTRL);
  109. /* Release reset to cores as per power on defaults */
  110. writel(BIT(SYS_CTRL_RST_GPIO), SYS_CTRL_RST_CLR_CTRL);
  111. /* Disable clocks to cores as per power-on defaults - must leave DDR
  112. * related clocks enabled otherwise we'll stop rather abruptly. */
  113. value =
  114. BIT(SYS_CTRL_CLK_COPRO) |
  115. BIT(SYS_CTRL_CLK_DMA) |
  116. BIT(SYS_CTRL_CLK_CIPHER) |
  117. BIT(SYS_CTRL_CLK_SD) |
  118. BIT(SYS_CTRL_CLK_SATA) |
  119. BIT(SYS_CTRL_CLK_I2S) |
  120. BIT(SYS_CTRL_CLK_USBHS) |
  121. BIT(SYS_CTRL_CLK_MAC) |
  122. BIT(SYS_CTRL_CLK_PCIEA) |
  123. BIT(SYS_CTRL_CLK_STATIC) |
  124. BIT(SYS_CTRL_CLK_MACB) |
  125. BIT(SYS_CTRL_CLK_PCIEB) |
  126. BIT(SYS_CTRL_CLK_REF600) |
  127. BIT(SYS_CTRL_CLK_USBDEV);
  128. writel(value, SYS_CTRL_CLK_CLR_CTRL);
  129. /* Enable clocks to cores as per power-on defaults */
  130. /* Set sys-control pin mux'ing as per power-on defaults */
  131. writel(0, SYS_CTRL_SECONDARY_SEL);
  132. writel(0, SYS_CTRL_TERTIARY_SEL);
  133. writel(0, SYS_CTRL_QUATERNARY_SEL);
  134. writel(0, SYS_CTRL_DEBUG_SEL);
  135. writel(0, SYS_CTRL_ALTERNATIVE_SEL);
  136. writel(0, SYS_CTRL_PULLUP_SEL);
  137. writel(0, SEC_CTRL_SECONDARY_SEL);
  138. writel(0, SEC_CTRL_TERTIARY_SEL);
  139. writel(0, SEC_CTRL_QUATERNARY_SEL);
  140. writel(0, SEC_CTRL_DEBUG_SEL);
  141. writel(0, SEC_CTRL_ALTERNATIVE_SEL);
  142. writel(0, SEC_CTRL_PULLUP_SEL);
  143. /* No need to save any state, as the ROM loader can determine whether
  144. * reset is due to power cycling or programatic action, just hit the
  145. * (self-clearing) CPU reset bit of the block reset register */
  146. value =
  147. BIT(SYS_CTRL_RST_SCU) |
  148. BIT(SYS_CTRL_RST_ARM0) |
  149. BIT(SYS_CTRL_RST_ARM1);
  150. writel(value, SYS_CTRL_RST_SET_CTRL);
  151. }
  152. static const char * const ox820_dt_board_compat[] = {
  153. "plxtech,nas7820",
  154. "plxtech,nas7821",
  155. "plxtech,nas7825",
  156. NULL
  157. };
  158. DT_MACHINE_START(OX820_DT, "PLXTECH NAS782X SoC (Flattened Device Tree)")
  159. .map_io = ox820_map_common_io,
  160. .smp = smp_ops(ox820_smp_ops),
  161. .init_early = ox820_init_early,
  162. .init_time = ox820_timer_init,
  163. .init_machine = ox820_dt_init,
  164. .restart = ox820_assert_system_reset,
  165. .dt_compat = ox820_dt_board_compat,
  166. MACHINE_END