setup.c 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. /*
  2. * Copyright (C) 2007 Atmel Corporation.
  3. * Copyright (C) 2011 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
  4. *
  5. * Under GPLv2
  6. */
  7. #define pr_fmt(fmt) "AT91: " fmt
  8. #include <linux/module.h>
  9. #include <linux/io.h>
  10. #include <linux/mm.h>
  11. #include <linux/pm.h>
  12. #include <linux/of_address.h>
  13. #include <linux/pinctrl/machine.h>
  14. #include <linux/clk/at91_pmc.h>
  15. #include <asm/system_misc.h>
  16. #include <asm/mach/map.h>
  17. #include <mach/hardware.h>
  18. #include <mach/cpu.h>
  19. #include <mach/at91_dbgu.h>
  20. #include "generic.h"
  21. #include "pm.h"
  22. struct at91_socinfo at91_soc_initdata;
  23. EXPORT_SYMBOL(at91_soc_initdata);
  24. static struct map_desc at91_io_desc __initdata __maybe_unused = {
  25. .virtual = (unsigned long)AT91_VA_BASE_SYS,
  26. .pfn = __phys_to_pfn(AT91_BASE_SYS),
  27. .length = SZ_16K,
  28. .type = MT_DEVICE,
  29. };
  30. static struct map_desc at91_alt_io_desc __initdata __maybe_unused = {
  31. .virtual = (unsigned long)AT91_ALT_VA_BASE_SYS,
  32. .pfn = __phys_to_pfn(AT91_ALT_BASE_SYS),
  33. .length = 24 * SZ_1K,
  34. .type = MT_DEVICE,
  35. };
  36. static void __init soc_detect(u32 dbgu_base)
  37. {
  38. u32 cidr, socid;
  39. cidr = __raw_readl(AT91_IO_P2V(dbgu_base) + AT91_DBGU_CIDR);
  40. socid = cidr & ~AT91_CIDR_VERSION;
  41. switch (socid) {
  42. case ARCH_ID_AT91RM9200:
  43. at91_soc_initdata.type = AT91_SOC_RM9200;
  44. if (at91_soc_initdata.subtype == AT91_SOC_SUBTYPE_UNKNOWN)
  45. at91_soc_initdata.subtype = AT91_SOC_RM9200_BGA;
  46. break;
  47. case ARCH_ID_AT91SAM9260:
  48. at91_soc_initdata.type = AT91_SOC_SAM9260;
  49. at91_soc_initdata.subtype = AT91_SOC_SUBTYPE_NONE;
  50. break;
  51. case ARCH_ID_AT91SAM9261:
  52. at91_soc_initdata.type = AT91_SOC_SAM9261;
  53. at91_soc_initdata.subtype = AT91_SOC_SUBTYPE_NONE;
  54. break;
  55. case ARCH_ID_AT91SAM9263:
  56. at91_soc_initdata.type = AT91_SOC_SAM9263;
  57. at91_soc_initdata.subtype = AT91_SOC_SUBTYPE_NONE;
  58. break;
  59. case ARCH_ID_AT91SAM9G20:
  60. at91_soc_initdata.type = AT91_SOC_SAM9G20;
  61. at91_soc_initdata.subtype = AT91_SOC_SUBTYPE_NONE;
  62. break;
  63. case ARCH_ID_AT91SAM9G45:
  64. at91_soc_initdata.type = AT91_SOC_SAM9G45;
  65. if (cidr == ARCH_ID_AT91SAM9G45ES)
  66. at91_soc_initdata.subtype = AT91_SOC_SAM9G45ES;
  67. break;
  68. case ARCH_ID_AT91SAM9RL64:
  69. at91_soc_initdata.type = AT91_SOC_SAM9RL;
  70. at91_soc_initdata.subtype = AT91_SOC_SUBTYPE_NONE;
  71. break;
  72. case ARCH_ID_AT91SAM9X5:
  73. at91_soc_initdata.type = AT91_SOC_SAM9X5;
  74. break;
  75. case ARCH_ID_AT91SAM9N12:
  76. at91_soc_initdata.type = AT91_SOC_SAM9N12;
  77. break;
  78. case ARCH_ID_SAMA5:
  79. at91_soc_initdata.exid = __raw_readl(AT91_IO_P2V(dbgu_base) + AT91_DBGU_EXID);
  80. if (at91_soc_initdata.exid & ARCH_EXID_SAMA5D3) {
  81. at91_soc_initdata.type = AT91_SOC_SAMA5D3;
  82. }
  83. break;
  84. }
  85. /* at91sam9g10 */
  86. if ((socid & ~AT91_CIDR_EXT) == ARCH_ID_AT91SAM9G10) {
  87. at91_soc_initdata.type = AT91_SOC_SAM9G10;
  88. at91_soc_initdata.subtype = AT91_SOC_SUBTYPE_NONE;
  89. }
  90. /* at91sam9xe */
  91. else if ((cidr & AT91_CIDR_ARCH) == ARCH_FAMILY_AT91SAM9XE) {
  92. at91_soc_initdata.type = AT91_SOC_SAM9260;
  93. at91_soc_initdata.subtype = AT91_SOC_SAM9XE;
  94. }
  95. if (!at91_soc_is_detected())
  96. return;
  97. at91_soc_initdata.cidr = cidr;
  98. /* sub version of soc */
  99. if (!at91_soc_initdata.exid)
  100. at91_soc_initdata.exid = __raw_readl(AT91_IO_P2V(dbgu_base) + AT91_DBGU_EXID);
  101. if (at91_soc_initdata.type == AT91_SOC_SAM9G45) {
  102. switch (at91_soc_initdata.exid) {
  103. case ARCH_EXID_AT91SAM9M10:
  104. at91_soc_initdata.subtype = AT91_SOC_SAM9M10;
  105. break;
  106. case ARCH_EXID_AT91SAM9G46:
  107. at91_soc_initdata.subtype = AT91_SOC_SAM9G46;
  108. break;
  109. case ARCH_EXID_AT91SAM9M11:
  110. at91_soc_initdata.subtype = AT91_SOC_SAM9M11;
  111. break;
  112. }
  113. }
  114. if (at91_soc_initdata.type == AT91_SOC_SAM9X5) {
  115. switch (at91_soc_initdata.exid) {
  116. case ARCH_EXID_AT91SAM9G15:
  117. at91_soc_initdata.subtype = AT91_SOC_SAM9G15;
  118. break;
  119. case ARCH_EXID_AT91SAM9G35:
  120. at91_soc_initdata.subtype = AT91_SOC_SAM9G35;
  121. break;
  122. case ARCH_EXID_AT91SAM9X35:
  123. at91_soc_initdata.subtype = AT91_SOC_SAM9X35;
  124. break;
  125. case ARCH_EXID_AT91SAM9G25:
  126. at91_soc_initdata.subtype = AT91_SOC_SAM9G25;
  127. break;
  128. case ARCH_EXID_AT91SAM9X25:
  129. at91_soc_initdata.subtype = AT91_SOC_SAM9X25;
  130. break;
  131. }
  132. }
  133. if (at91_soc_initdata.type == AT91_SOC_SAMA5D3) {
  134. switch (at91_soc_initdata.exid) {
  135. case ARCH_EXID_SAMA5D31:
  136. at91_soc_initdata.subtype = AT91_SOC_SAMA5D31;
  137. break;
  138. case ARCH_EXID_SAMA5D33:
  139. at91_soc_initdata.subtype = AT91_SOC_SAMA5D33;
  140. break;
  141. case ARCH_EXID_SAMA5D34:
  142. at91_soc_initdata.subtype = AT91_SOC_SAMA5D34;
  143. break;
  144. case ARCH_EXID_SAMA5D35:
  145. at91_soc_initdata.subtype = AT91_SOC_SAMA5D35;
  146. break;
  147. case ARCH_EXID_SAMA5D36:
  148. at91_soc_initdata.subtype = AT91_SOC_SAMA5D36;
  149. break;
  150. }
  151. }
  152. }
  153. static void __init alt_soc_detect(u32 dbgu_base)
  154. {
  155. u32 cidr, socid;
  156. /* SoC ID */
  157. cidr = __raw_readl(AT91_ALT_IO_P2V(dbgu_base) + AT91_DBGU_CIDR);
  158. socid = cidr & ~AT91_CIDR_VERSION;
  159. switch (socid) {
  160. case ARCH_ID_SAMA5:
  161. at91_soc_initdata.exid = __raw_readl(AT91_ALT_IO_P2V(dbgu_base) + AT91_DBGU_EXID);
  162. if (at91_soc_initdata.exid & ARCH_EXID_SAMA5D3) {
  163. at91_soc_initdata.type = AT91_SOC_SAMA5D3;
  164. } else if (at91_soc_initdata.exid & ARCH_EXID_SAMA5D4) {
  165. at91_soc_initdata.type = AT91_SOC_SAMA5D4;
  166. }
  167. break;
  168. }
  169. if (!at91_soc_is_detected())
  170. return;
  171. at91_soc_initdata.cidr = cidr;
  172. /* sub version of soc */
  173. if (!at91_soc_initdata.exid)
  174. at91_soc_initdata.exid = __raw_readl(AT91_ALT_IO_P2V(dbgu_base) + AT91_DBGU_EXID);
  175. if (at91_soc_initdata.type == AT91_SOC_SAMA5D4) {
  176. switch (at91_soc_initdata.exid) {
  177. case ARCH_EXID_SAMA5D41:
  178. at91_soc_initdata.subtype = AT91_SOC_SAMA5D41;
  179. break;
  180. case ARCH_EXID_SAMA5D42:
  181. at91_soc_initdata.subtype = AT91_SOC_SAMA5D42;
  182. break;
  183. case ARCH_EXID_SAMA5D43:
  184. at91_soc_initdata.subtype = AT91_SOC_SAMA5D43;
  185. break;
  186. case ARCH_EXID_SAMA5D44:
  187. at91_soc_initdata.subtype = AT91_SOC_SAMA5D44;
  188. break;
  189. }
  190. }
  191. }
  192. static const char *soc_name[] = {
  193. [AT91_SOC_RM9200] = "at91rm9200",
  194. [AT91_SOC_SAM9260] = "at91sam9260",
  195. [AT91_SOC_SAM9261] = "at91sam9261",
  196. [AT91_SOC_SAM9263] = "at91sam9263",
  197. [AT91_SOC_SAM9G10] = "at91sam9g10",
  198. [AT91_SOC_SAM9G20] = "at91sam9g20",
  199. [AT91_SOC_SAM9G45] = "at91sam9g45",
  200. [AT91_SOC_SAM9RL] = "at91sam9rl",
  201. [AT91_SOC_SAM9X5] = "at91sam9x5",
  202. [AT91_SOC_SAM9N12] = "at91sam9n12",
  203. [AT91_SOC_SAMA5D3] = "sama5d3",
  204. [AT91_SOC_SAMA5D4] = "sama5d4",
  205. [AT91_SOC_UNKNOWN] = "Unknown",
  206. };
  207. const char *at91_get_soc_type(struct at91_socinfo *c)
  208. {
  209. return soc_name[c->type];
  210. }
  211. EXPORT_SYMBOL(at91_get_soc_type);
  212. static const char *soc_subtype_name[] = {
  213. [AT91_SOC_RM9200_BGA] = "at91rm9200 BGA",
  214. [AT91_SOC_RM9200_PQFP] = "at91rm9200 PQFP",
  215. [AT91_SOC_SAM9XE] = "at91sam9xe",
  216. [AT91_SOC_SAM9G45ES] = "at91sam9g45es",
  217. [AT91_SOC_SAM9M10] = "at91sam9m10",
  218. [AT91_SOC_SAM9G46] = "at91sam9g46",
  219. [AT91_SOC_SAM9M11] = "at91sam9m11",
  220. [AT91_SOC_SAM9G15] = "at91sam9g15",
  221. [AT91_SOC_SAM9G35] = "at91sam9g35",
  222. [AT91_SOC_SAM9X35] = "at91sam9x35",
  223. [AT91_SOC_SAM9G25] = "at91sam9g25",
  224. [AT91_SOC_SAM9X25] = "at91sam9x25",
  225. [AT91_SOC_SAMA5D31] = "sama5d31",
  226. [AT91_SOC_SAMA5D33] = "sama5d33",
  227. [AT91_SOC_SAMA5D34] = "sama5d34",
  228. [AT91_SOC_SAMA5D35] = "sama5d35",
  229. [AT91_SOC_SAMA5D36] = "sama5d36",
  230. [AT91_SOC_SAMA5D41] = "sama5d41",
  231. [AT91_SOC_SAMA5D42] = "sama5d42",
  232. [AT91_SOC_SAMA5D43] = "sama5d43",
  233. [AT91_SOC_SAMA5D44] = "sama5d44",
  234. [AT91_SOC_SUBTYPE_NONE] = "None",
  235. [AT91_SOC_SUBTYPE_UNKNOWN] = "Unknown",
  236. };
  237. const char *at91_get_soc_subtype(struct at91_socinfo *c)
  238. {
  239. return soc_subtype_name[c->subtype];
  240. }
  241. EXPORT_SYMBOL(at91_get_soc_subtype);
  242. void __init at91_map_io(void)
  243. {
  244. /* Map peripherals */
  245. iotable_init(&at91_io_desc, 1);
  246. at91_soc_initdata.type = AT91_SOC_UNKNOWN;
  247. at91_soc_initdata.subtype = AT91_SOC_SUBTYPE_UNKNOWN;
  248. soc_detect(AT91_BASE_DBGU0);
  249. if (!at91_soc_is_detected())
  250. soc_detect(AT91_BASE_DBGU1);
  251. if (!at91_soc_is_detected())
  252. panic(pr_fmt("Impossible to detect the SOC type"));
  253. pr_info("Detected soc type: %s\n",
  254. at91_get_soc_type(&at91_soc_initdata));
  255. if (at91_soc_initdata.subtype != AT91_SOC_SUBTYPE_NONE)
  256. pr_info("Detected soc subtype: %s\n",
  257. at91_get_soc_subtype(&at91_soc_initdata));
  258. }
  259. void __init at91_alt_map_io(void)
  260. {
  261. /* Map peripherals */
  262. iotable_init(&at91_alt_io_desc, 1);
  263. at91_soc_initdata.type = AT91_SOC_UNKNOWN;
  264. at91_soc_initdata.subtype = AT91_SOC_SUBTYPE_UNKNOWN;
  265. alt_soc_detect(AT91_BASE_DBGU2);
  266. if (!at91_soc_is_detected())
  267. panic("AT91: Impossible to detect the SOC type");
  268. pr_info("AT91: Detected soc type: %s\n",
  269. at91_get_soc_type(&at91_soc_initdata));
  270. if (at91_soc_initdata.subtype != AT91_SOC_SUBTYPE_NONE)
  271. pr_info("AT91: Detected soc subtype: %s\n",
  272. at91_get_soc_subtype(&at91_soc_initdata));
  273. }
  274. void __iomem *at91_matrix_base;
  275. EXPORT_SYMBOL_GPL(at91_matrix_base);
  276. void __init at91_ioremap_matrix(u32 base_addr)
  277. {
  278. at91_matrix_base = ioremap(base_addr, 512);
  279. if (!at91_matrix_base)
  280. panic(pr_fmt("Impossible to ioremap at91_matrix_base\n"));
  281. }