setup.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445
  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 "soc.h"
  21. #include "generic.h"
  22. #include "pm.h"
  23. struct at91_init_soc __initdata at91_boot_soc;
  24. struct at91_socinfo at91_soc_initdata;
  25. EXPORT_SYMBOL(at91_soc_initdata);
  26. void __init at91rm9200_set_type(int type)
  27. {
  28. if (type == ARCH_REVISON_9200_PQFP)
  29. at91_soc_initdata.subtype = AT91_SOC_RM9200_PQFP;
  30. else
  31. at91_soc_initdata.subtype = AT91_SOC_RM9200_BGA;
  32. pr_info("filled in soc subtype: %s\n",
  33. at91_get_soc_subtype(&at91_soc_initdata));
  34. }
  35. void __iomem *at91_ramc_base[2];
  36. EXPORT_SYMBOL_GPL(at91_ramc_base);
  37. static struct map_desc sram_desc[2] __initdata;
  38. void __init at91_init_sram(int bank, unsigned long base, unsigned int length)
  39. {
  40. struct map_desc *desc = &sram_desc[bank];
  41. desc->virtual = (unsigned long)AT91_IO_VIRT_BASE - length;
  42. if (bank > 0)
  43. desc->virtual -= sram_desc[bank - 1].length;
  44. desc->pfn = __phys_to_pfn(base);
  45. desc->length = length;
  46. desc->type = MT_MEMORY_RWX_NONCACHED;
  47. pr_info("sram at 0x%lx of 0x%x mapped at 0x%lx\n",
  48. base, length, desc->virtual);
  49. iotable_init(desc, 1);
  50. }
  51. static struct map_desc at91_io_desc __initdata __maybe_unused = {
  52. .virtual = (unsigned long)AT91_VA_BASE_SYS,
  53. .pfn = __phys_to_pfn(AT91_BASE_SYS),
  54. .length = SZ_16K,
  55. .type = MT_DEVICE,
  56. };
  57. static struct map_desc at91_alt_io_desc __initdata __maybe_unused = {
  58. .virtual = (unsigned long)AT91_ALT_VA_BASE_SYS,
  59. .pfn = __phys_to_pfn(AT91_ALT_BASE_SYS),
  60. .length = 24 * SZ_1K,
  61. .type = MT_DEVICE,
  62. };
  63. static void __init soc_detect(u32 dbgu_base)
  64. {
  65. u32 cidr, socid;
  66. cidr = __raw_readl(AT91_IO_P2V(dbgu_base) + AT91_DBGU_CIDR);
  67. socid = cidr & ~AT91_CIDR_VERSION;
  68. switch (socid) {
  69. case ARCH_ID_AT91RM9200:
  70. at91_soc_initdata.type = AT91_SOC_RM9200;
  71. if (at91_soc_initdata.subtype == AT91_SOC_SUBTYPE_UNKNOWN)
  72. at91_soc_initdata.subtype = AT91_SOC_RM9200_BGA;
  73. at91_boot_soc = at91rm9200_soc;
  74. break;
  75. case ARCH_ID_AT91SAM9260:
  76. at91_soc_initdata.type = AT91_SOC_SAM9260;
  77. at91_soc_initdata.subtype = AT91_SOC_SUBTYPE_NONE;
  78. at91_boot_soc = at91sam9260_soc;
  79. break;
  80. case ARCH_ID_AT91SAM9261:
  81. at91_soc_initdata.type = AT91_SOC_SAM9261;
  82. at91_soc_initdata.subtype = AT91_SOC_SUBTYPE_NONE;
  83. at91_boot_soc = at91sam9261_soc;
  84. break;
  85. case ARCH_ID_AT91SAM9263:
  86. at91_soc_initdata.type = AT91_SOC_SAM9263;
  87. at91_soc_initdata.subtype = AT91_SOC_SUBTYPE_NONE;
  88. at91_boot_soc = at91sam9263_soc;
  89. break;
  90. case ARCH_ID_AT91SAM9G20:
  91. at91_soc_initdata.type = AT91_SOC_SAM9G20;
  92. at91_soc_initdata.subtype = AT91_SOC_SUBTYPE_NONE;
  93. at91_boot_soc = at91sam9260_soc;
  94. break;
  95. case ARCH_ID_AT91SAM9G45:
  96. at91_soc_initdata.type = AT91_SOC_SAM9G45;
  97. if (cidr == ARCH_ID_AT91SAM9G45ES)
  98. at91_soc_initdata.subtype = AT91_SOC_SAM9G45ES;
  99. at91_boot_soc = at91sam9g45_soc;
  100. break;
  101. case ARCH_ID_AT91SAM9RL64:
  102. at91_soc_initdata.type = AT91_SOC_SAM9RL;
  103. at91_soc_initdata.subtype = AT91_SOC_SUBTYPE_NONE;
  104. at91_boot_soc = at91sam9rl_soc;
  105. break;
  106. case ARCH_ID_AT91SAM9X5:
  107. at91_soc_initdata.type = AT91_SOC_SAM9X5;
  108. at91_boot_soc = at91sam9x5_soc;
  109. break;
  110. case ARCH_ID_AT91SAM9N12:
  111. at91_soc_initdata.type = AT91_SOC_SAM9N12;
  112. at91_boot_soc = at91sam9n12_soc;
  113. break;
  114. case ARCH_ID_SAMA5:
  115. at91_soc_initdata.exid = __raw_readl(AT91_IO_P2V(dbgu_base) + AT91_DBGU_EXID);
  116. if (at91_soc_initdata.exid & ARCH_EXID_SAMA5D3) {
  117. at91_soc_initdata.type = AT91_SOC_SAMA5D3;
  118. at91_boot_soc = sama5d3_soc;
  119. }
  120. break;
  121. }
  122. /* at91sam9g10 */
  123. if ((socid & ~AT91_CIDR_EXT) == ARCH_ID_AT91SAM9G10) {
  124. at91_soc_initdata.type = AT91_SOC_SAM9G10;
  125. at91_soc_initdata.subtype = AT91_SOC_SUBTYPE_NONE;
  126. at91_boot_soc = at91sam9261_soc;
  127. }
  128. /* at91sam9xe */
  129. else if ((cidr & AT91_CIDR_ARCH) == ARCH_FAMILY_AT91SAM9XE) {
  130. at91_soc_initdata.type = AT91_SOC_SAM9260;
  131. at91_soc_initdata.subtype = AT91_SOC_SAM9XE;
  132. at91_boot_soc = at91sam9260_soc;
  133. }
  134. if (!at91_soc_is_detected())
  135. return;
  136. at91_soc_initdata.cidr = cidr;
  137. /* sub version of soc */
  138. if (!at91_soc_initdata.exid)
  139. at91_soc_initdata.exid = __raw_readl(AT91_IO_P2V(dbgu_base) + AT91_DBGU_EXID);
  140. if (at91_soc_initdata.type == AT91_SOC_SAM9G45) {
  141. switch (at91_soc_initdata.exid) {
  142. case ARCH_EXID_AT91SAM9M10:
  143. at91_soc_initdata.subtype = AT91_SOC_SAM9M10;
  144. break;
  145. case ARCH_EXID_AT91SAM9G46:
  146. at91_soc_initdata.subtype = AT91_SOC_SAM9G46;
  147. break;
  148. case ARCH_EXID_AT91SAM9M11:
  149. at91_soc_initdata.subtype = AT91_SOC_SAM9M11;
  150. break;
  151. }
  152. }
  153. if (at91_soc_initdata.type == AT91_SOC_SAM9X5) {
  154. switch (at91_soc_initdata.exid) {
  155. case ARCH_EXID_AT91SAM9G15:
  156. at91_soc_initdata.subtype = AT91_SOC_SAM9G15;
  157. break;
  158. case ARCH_EXID_AT91SAM9G35:
  159. at91_soc_initdata.subtype = AT91_SOC_SAM9G35;
  160. break;
  161. case ARCH_EXID_AT91SAM9X35:
  162. at91_soc_initdata.subtype = AT91_SOC_SAM9X35;
  163. break;
  164. case ARCH_EXID_AT91SAM9G25:
  165. at91_soc_initdata.subtype = AT91_SOC_SAM9G25;
  166. break;
  167. case ARCH_EXID_AT91SAM9X25:
  168. at91_soc_initdata.subtype = AT91_SOC_SAM9X25;
  169. break;
  170. }
  171. }
  172. if (at91_soc_initdata.type == AT91_SOC_SAMA5D3) {
  173. switch (at91_soc_initdata.exid) {
  174. case ARCH_EXID_SAMA5D31:
  175. at91_soc_initdata.subtype = AT91_SOC_SAMA5D31;
  176. break;
  177. case ARCH_EXID_SAMA5D33:
  178. at91_soc_initdata.subtype = AT91_SOC_SAMA5D33;
  179. break;
  180. case ARCH_EXID_SAMA5D34:
  181. at91_soc_initdata.subtype = AT91_SOC_SAMA5D34;
  182. break;
  183. case ARCH_EXID_SAMA5D35:
  184. at91_soc_initdata.subtype = AT91_SOC_SAMA5D35;
  185. break;
  186. case ARCH_EXID_SAMA5D36:
  187. at91_soc_initdata.subtype = AT91_SOC_SAMA5D36;
  188. break;
  189. }
  190. }
  191. }
  192. static void __init alt_soc_detect(u32 dbgu_base)
  193. {
  194. u32 cidr, socid;
  195. /* SoC ID */
  196. cidr = __raw_readl(AT91_ALT_IO_P2V(dbgu_base) + AT91_DBGU_CIDR);
  197. socid = cidr & ~AT91_CIDR_VERSION;
  198. switch (socid) {
  199. case ARCH_ID_SAMA5:
  200. at91_soc_initdata.exid = __raw_readl(AT91_ALT_IO_P2V(dbgu_base) + AT91_DBGU_EXID);
  201. if (at91_soc_initdata.exid & ARCH_EXID_SAMA5D3) {
  202. at91_soc_initdata.type = AT91_SOC_SAMA5D3;
  203. at91_boot_soc = sama5d3_soc;
  204. } else if (at91_soc_initdata.exid & ARCH_EXID_SAMA5D4) {
  205. at91_soc_initdata.type = AT91_SOC_SAMA5D4;
  206. at91_boot_soc = sama5d4_soc;
  207. }
  208. break;
  209. }
  210. if (!at91_soc_is_detected())
  211. return;
  212. at91_soc_initdata.cidr = cidr;
  213. /* sub version of soc */
  214. if (!at91_soc_initdata.exid)
  215. at91_soc_initdata.exid = __raw_readl(AT91_ALT_IO_P2V(dbgu_base) + AT91_DBGU_EXID);
  216. if (at91_soc_initdata.type == AT91_SOC_SAMA5D4) {
  217. switch (at91_soc_initdata.exid) {
  218. case ARCH_EXID_SAMA5D41:
  219. at91_soc_initdata.subtype = AT91_SOC_SAMA5D41;
  220. break;
  221. case ARCH_EXID_SAMA5D42:
  222. at91_soc_initdata.subtype = AT91_SOC_SAMA5D42;
  223. break;
  224. case ARCH_EXID_SAMA5D43:
  225. at91_soc_initdata.subtype = AT91_SOC_SAMA5D43;
  226. break;
  227. case ARCH_EXID_SAMA5D44:
  228. at91_soc_initdata.subtype = AT91_SOC_SAMA5D44;
  229. break;
  230. }
  231. }
  232. }
  233. static const char *soc_name[] = {
  234. [AT91_SOC_RM9200] = "at91rm9200",
  235. [AT91_SOC_SAM9260] = "at91sam9260",
  236. [AT91_SOC_SAM9261] = "at91sam9261",
  237. [AT91_SOC_SAM9263] = "at91sam9263",
  238. [AT91_SOC_SAM9G10] = "at91sam9g10",
  239. [AT91_SOC_SAM9G20] = "at91sam9g20",
  240. [AT91_SOC_SAM9G45] = "at91sam9g45",
  241. [AT91_SOC_SAM9RL] = "at91sam9rl",
  242. [AT91_SOC_SAM9X5] = "at91sam9x5",
  243. [AT91_SOC_SAM9N12] = "at91sam9n12",
  244. [AT91_SOC_SAMA5D3] = "sama5d3",
  245. [AT91_SOC_SAMA5D4] = "sama5d4",
  246. [AT91_SOC_UNKNOWN] = "Unknown",
  247. };
  248. const char *at91_get_soc_type(struct at91_socinfo *c)
  249. {
  250. return soc_name[c->type];
  251. }
  252. EXPORT_SYMBOL(at91_get_soc_type);
  253. static const char *soc_subtype_name[] = {
  254. [AT91_SOC_RM9200_BGA] = "at91rm9200 BGA",
  255. [AT91_SOC_RM9200_PQFP] = "at91rm9200 PQFP",
  256. [AT91_SOC_SAM9XE] = "at91sam9xe",
  257. [AT91_SOC_SAM9G45ES] = "at91sam9g45es",
  258. [AT91_SOC_SAM9M10] = "at91sam9m10",
  259. [AT91_SOC_SAM9G46] = "at91sam9g46",
  260. [AT91_SOC_SAM9M11] = "at91sam9m11",
  261. [AT91_SOC_SAM9G15] = "at91sam9g15",
  262. [AT91_SOC_SAM9G35] = "at91sam9g35",
  263. [AT91_SOC_SAM9X35] = "at91sam9x35",
  264. [AT91_SOC_SAM9G25] = "at91sam9g25",
  265. [AT91_SOC_SAM9X25] = "at91sam9x25",
  266. [AT91_SOC_SAMA5D31] = "sama5d31",
  267. [AT91_SOC_SAMA5D33] = "sama5d33",
  268. [AT91_SOC_SAMA5D34] = "sama5d34",
  269. [AT91_SOC_SAMA5D35] = "sama5d35",
  270. [AT91_SOC_SAMA5D36] = "sama5d36",
  271. [AT91_SOC_SAMA5D41] = "sama5d41",
  272. [AT91_SOC_SAMA5D42] = "sama5d42",
  273. [AT91_SOC_SAMA5D43] = "sama5d43",
  274. [AT91_SOC_SAMA5D44] = "sama5d44",
  275. [AT91_SOC_SUBTYPE_NONE] = "None",
  276. [AT91_SOC_SUBTYPE_UNKNOWN] = "Unknown",
  277. };
  278. const char *at91_get_soc_subtype(struct at91_socinfo *c)
  279. {
  280. return soc_subtype_name[c->subtype];
  281. }
  282. EXPORT_SYMBOL(at91_get_soc_subtype);
  283. void __init at91_map_io(void)
  284. {
  285. /* Map peripherals */
  286. iotable_init(&at91_io_desc, 1);
  287. at91_soc_initdata.type = AT91_SOC_UNKNOWN;
  288. at91_soc_initdata.subtype = AT91_SOC_SUBTYPE_UNKNOWN;
  289. soc_detect(AT91_BASE_DBGU0);
  290. if (!at91_soc_is_detected())
  291. soc_detect(AT91_BASE_DBGU1);
  292. if (!at91_soc_is_detected())
  293. panic(pr_fmt("Impossible to detect the SOC type"));
  294. pr_info("Detected soc type: %s\n",
  295. at91_get_soc_type(&at91_soc_initdata));
  296. if (at91_soc_initdata.subtype != AT91_SOC_SUBTYPE_NONE)
  297. pr_info("Detected soc subtype: %s\n",
  298. at91_get_soc_subtype(&at91_soc_initdata));
  299. if (!at91_soc_is_enabled())
  300. panic(pr_fmt("Soc not enabled"));
  301. if (at91_boot_soc.map_io)
  302. at91_boot_soc.map_io();
  303. }
  304. void __init at91_alt_map_io(void)
  305. {
  306. /* Map peripherals */
  307. iotable_init(&at91_alt_io_desc, 1);
  308. at91_soc_initdata.type = AT91_SOC_UNKNOWN;
  309. at91_soc_initdata.subtype = AT91_SOC_SUBTYPE_UNKNOWN;
  310. alt_soc_detect(AT91_BASE_DBGU2);
  311. if (!at91_soc_is_detected())
  312. panic("AT91: Impossible to detect the SOC type");
  313. pr_info("AT91: Detected soc type: %s\n",
  314. at91_get_soc_type(&at91_soc_initdata));
  315. if (at91_soc_initdata.subtype != AT91_SOC_SUBTYPE_NONE)
  316. pr_info("AT91: Detected soc subtype: %s\n",
  317. at91_get_soc_subtype(&at91_soc_initdata));
  318. if (!at91_soc_is_enabled())
  319. panic("AT91: Soc not enabled");
  320. if (at91_boot_soc.map_io)
  321. at91_boot_soc.map_io();
  322. }
  323. void __iomem *at91_matrix_base;
  324. EXPORT_SYMBOL_GPL(at91_matrix_base);
  325. void __init at91_ioremap_matrix(u32 base_addr)
  326. {
  327. at91_matrix_base = ioremap(base_addr, 512);
  328. if (!at91_matrix_base)
  329. panic(pr_fmt("Impossible to ioremap at91_matrix_base\n"));
  330. }
  331. static struct of_device_id ramc_ids[] = {
  332. { .compatible = "atmel,at91rm9200-sdramc", .data = at91rm9200_standby },
  333. { .compatible = "atmel,at91sam9260-sdramc", .data = at91sam9_sdram_standby },
  334. { .compatible = "atmel,at91sam9g45-ddramc", .data = at91_ddr_standby },
  335. { .compatible = "atmel,sama5d3-ddramc", .data = at91_ddr_standby },
  336. { /*sentinel*/ }
  337. };
  338. static void at91_dt_ramc(void)
  339. {
  340. struct device_node *np;
  341. const struct of_device_id *of_id;
  342. int idx = 0;
  343. const void *standby = NULL;
  344. for_each_matching_node_and_match(np, ramc_ids, &of_id) {
  345. at91_ramc_base[idx] = of_iomap(np, 0);
  346. if (!at91_ramc_base[idx])
  347. panic(pr_fmt("unable to map ramc[%d] cpu registers\n"), idx);
  348. if (!standby)
  349. standby = of_id->data;
  350. idx++;
  351. }
  352. if (!idx)
  353. panic(pr_fmt("unable to find compatible ram controller node in dtb\n"));
  354. if (!standby) {
  355. pr_warn("ramc no standby function available\n");
  356. return;
  357. }
  358. at91_pm_set_standby(standby);
  359. }
  360. void __init at91rm9200_dt_initialize(void)
  361. {
  362. at91_dt_ramc();
  363. at91_boot_soc.init();
  364. }
  365. void __init at91_dt_initialize(void)
  366. {
  367. at91_dt_ramc();
  368. if (at91_boot_soc.init)
  369. at91_boot_soc.init();
  370. }