121d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD/* 221d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD * Copyright (C) 2007 Atmel Corporation. 321d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD * Copyright (C) 2011 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> 421d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD * 521d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD * Under GPLv2 621d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD */ 721d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD 89e8be232b934418932e40da276f6871dce83fa7cMaxime Ripard#define pr_fmt(fmt) "AT91: " fmt 99e8be232b934418932e40da276f6871dce83fa7cMaxime Ripard 1021d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD#include <linux/module.h> 1121d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD#include <linux/io.h> 12fb149f9e2835446e02e796081635520b881dc351Jean-Christophe PLAGNIOL-VILLARD#include <linux/mm.h> 13f22deee523e0ff49c3be01dd6f979d374230725aJean-Christophe PLAGNIOL-VILLARD#include <linux/pm.h> 142b11ea5bf2fe4b79f9388d2eaf5d84713eb44a4cJean-Christophe PLAGNIOL-VILLARD#include <linux/of_address.h> 1597e5e625248e588de234aa5134cebbf969618dcfJean-Christophe PLAGNIOL-VILLARD#include <linux/pinctrl/machine.h> 162edb90ae421a0f65edcdef65ef9dd08e3228abbfBoris BREZILLON#include <linux/clk/at91_pmc.h> 1721d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD 1886dfe446c2c10ab2ab437a1b0a3f29e63cb350cbOlof Johansson#include <asm/system_misc.h> 1921d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD#include <asm/mach/map.h> 2021d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD 2121d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD#include <mach/hardware.h> 2221d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD#include <mach/cpu.h> 238c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD#include <mach/at91_dbgu.h> 2421d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD 2521d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD#include "soc.h" 2621d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD#include "generic.h" 276b625891c6b541080bdaad97bcb82bd9ecd9e44bJean-Christophe PLAGNIOL-VILLARD#include "pm.h" 2821d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD 298c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARDstruct at91_init_soc __initdata at91_boot_soc; 308c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD 318c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARDstruct at91_socinfo at91_soc_initdata; 328c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARDEXPORT_SYMBOL(at91_soc_initdata); 338c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD 348c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARDvoid __init at91rm9200_set_type(int type) 358c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD{ 368c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD if (type == ARCH_REVISON_9200_PQFP) 378c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD at91_soc_initdata.subtype = AT91_SOC_RM9200_PQFP; 383e90772f76010c315474bde59eaca7cc4c94d645Nicolas Ferre else 393e90772f76010c315474bde59eaca7cc4c94d645Nicolas Ferre at91_soc_initdata.subtype = AT91_SOC_RM9200_BGA; 403e90772f76010c315474bde59eaca7cc4c94d645Nicolas Ferre 419e8be232b934418932e40da276f6871dce83fa7cMaxime Ripard pr_info("filled in soc subtype: %s\n", 423e90772f76010c315474bde59eaca7cc4c94d645Nicolas Ferre at91_get_soc_subtype(&at91_soc_initdata)); 438c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD} 4421d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD 4592100c12ca1bc5f347ff41c1413f9db07c4d276cJean-Christophe PLAGNIOL-VILLARDvoid __init at91_init_irq_default(void) 4692100c12ca1bc5f347ff41c1413f9db07c4d276cJean-Christophe PLAGNIOL-VILLARD{ 4792100c12ca1bc5f347ff41c1413f9db07c4d276cJean-Christophe PLAGNIOL-VILLARD at91_init_interrupts(at91_boot_soc.default_irq_priority); 4892100c12ca1bc5f347ff41c1413f9db07c4d276cJean-Christophe PLAGNIOL-VILLARD} 4992100c12ca1bc5f347ff41c1413f9db07c4d276cJean-Christophe PLAGNIOL-VILLARD 5092100c12ca1bc5f347ff41c1413f9db07c4d276cJean-Christophe PLAGNIOL-VILLARDvoid __init at91_init_interrupts(unsigned int *priority) 5192100c12ca1bc5f347ff41c1413f9db07c4d276cJean-Christophe PLAGNIOL-VILLARD{ 5292100c12ca1bc5f347ff41c1413f9db07c4d276cJean-Christophe PLAGNIOL-VILLARD /* Initialize the AIC interrupt controller */ 53071926041e5b38f84f2aaac2122c57e398e535b5Boris BREZILLON if (IS_ENABLED(CONFIG_OLD_IRQ_AT91)) 54071926041e5b38f84f2aaac2122c57e398e535b5Boris BREZILLON at91_aic_init(priority, at91_boot_soc.extern_irq); 5592100c12ca1bc5f347ff41c1413f9db07c4d276cJean-Christophe PLAGNIOL-VILLARD 5692100c12ca1bc5f347ff41c1413f9db07c4d276cJean-Christophe PLAGNIOL-VILLARD /* Enable GPIO interrupts */ 5792100c12ca1bc5f347ff41c1413f9db07c4d276cJean-Christophe PLAGNIOL-VILLARD at91_gpio_irq_setup(); 5892100c12ca1bc5f347ff41c1413f9db07c4d276cJean-Christophe PLAGNIOL-VILLARD} 5992100c12ca1bc5f347ff41c1413f9db07c4d276cJean-Christophe PLAGNIOL-VILLARD 60a7776ec625c8ca90d050953946a5b72eaf41c21cJean-Christophe PLAGNIOL-VILLARDvoid __iomem *at91_ramc_base[2]; 619268c6c6fab0b27a01afec8268f7c863783541bfJoachim EastwoodEXPORT_SYMBOL_GPL(at91_ramc_base); 62a7776ec625c8ca90d050953946a5b72eaf41c21cJean-Christophe PLAGNIOL-VILLARD 63a7776ec625c8ca90d050953946a5b72eaf41c21cJean-Christophe PLAGNIOL-VILLARDvoid __init at91_ioremap_ramc(int id, u32 addr, u32 size) 64a7776ec625c8ca90d050953946a5b72eaf41c21cJean-Christophe PLAGNIOL-VILLARD{ 65a7776ec625c8ca90d050953946a5b72eaf41c21cJean-Christophe PLAGNIOL-VILLARD if (id < 0 || id > 1) { 66a7776ec625c8ca90d050953946a5b72eaf41c21cJean-Christophe PLAGNIOL-VILLARD pr_emerg("Wrong RAM controller id (%d), cannot continue\n", id); 67a7776ec625c8ca90d050953946a5b72eaf41c21cJean-Christophe PLAGNIOL-VILLARD BUG(); 68a7776ec625c8ca90d050953946a5b72eaf41c21cJean-Christophe PLAGNIOL-VILLARD } 69a7776ec625c8ca90d050953946a5b72eaf41c21cJean-Christophe PLAGNIOL-VILLARD at91_ramc_base[id] = ioremap(addr, size); 70a7776ec625c8ca90d050953946a5b72eaf41c21cJean-Christophe PLAGNIOL-VILLARD if (!at91_ramc_base[id]) 719e8be232b934418932e40da276f6871dce83fa7cMaxime Ripard panic(pr_fmt("Impossible to ioremap ramc.%d 0x%x\n"), id, addr); 72a7776ec625c8ca90d050953946a5b72eaf41c21cJean-Christophe PLAGNIOL-VILLARD} 73a7776ec625c8ca90d050953946a5b72eaf41c21cJean-Christophe PLAGNIOL-VILLARD 74f0051d82a68abcf35418d49db1c82e6f0e514d78Jean-Christophe PLAGNIOL-VILLARDstatic struct map_desc sram_desc[2] __initdata; 75f0051d82a68abcf35418d49db1c82e6f0e514d78Jean-Christophe PLAGNIOL-VILLARD 76f0051d82a68abcf35418d49db1c82e6f0e514d78Jean-Christophe PLAGNIOL-VILLARDvoid __init at91_init_sram(int bank, unsigned long base, unsigned int length) 77f0051d82a68abcf35418d49db1c82e6f0e514d78Jean-Christophe PLAGNIOL-VILLARD{ 78f0051d82a68abcf35418d49db1c82e6f0e514d78Jean-Christophe PLAGNIOL-VILLARD struct map_desc *desc = &sram_desc[bank]; 79f0051d82a68abcf35418d49db1c82e6f0e514d78Jean-Christophe PLAGNIOL-VILLARD 80dca4ba4121a66bdd0d85d02df21aee2738edcf5aArnd Bergmann desc->virtual = (unsigned long)AT91_IO_VIRT_BASE - length; 81f0051d82a68abcf35418d49db1c82e6f0e514d78Jean-Christophe PLAGNIOL-VILLARD if (bank > 0) 82f0051d82a68abcf35418d49db1c82e6f0e514d78Jean-Christophe PLAGNIOL-VILLARD desc->virtual -= sram_desc[bank - 1].length; 83f0051d82a68abcf35418d49db1c82e6f0e514d78Jean-Christophe PLAGNIOL-VILLARD 84f0051d82a68abcf35418d49db1c82e6f0e514d78Jean-Christophe PLAGNIOL-VILLARD desc->pfn = __phys_to_pfn(base); 85f0051d82a68abcf35418d49db1c82e6f0e514d78Jean-Christophe PLAGNIOL-VILLARD desc->length = length; 862e2c9de207be043ee80161971c814d740759d3bcRussell King desc->type = MT_MEMORY_RWX_NONCACHED; 87f0051d82a68abcf35418d49db1c82e6f0e514d78Jean-Christophe PLAGNIOL-VILLARD 889e8be232b934418932e40da276f6871dce83fa7cMaxime Ripard pr_info("sram at 0x%lx of 0x%x mapped at 0x%lx\n", 89f0051d82a68abcf35418d49db1c82e6f0e514d78Jean-Christophe PLAGNIOL-VILLARD base, length, desc->virtual); 90f0051d82a68abcf35418d49db1c82e6f0e514d78Jean-Christophe PLAGNIOL-VILLARD 91f0051d82a68abcf35418d49db1c82e6f0e514d78Jean-Christophe PLAGNIOL-VILLARD iotable_init(desc, 1); 92f0051d82a68abcf35418d49db1c82e6f0e514d78Jean-Christophe PLAGNIOL-VILLARD} 93f0051d82a68abcf35418d49db1c82e6f0e514d78Jean-Christophe PLAGNIOL-VILLARD 94ac09281a026aad1fe489419bc948ba88b910e242Arnd Bergmannstatic struct map_desc at91_io_desc __initdata __maybe_unused = { 95dca4ba4121a66bdd0d85d02df21aee2738edcf5aArnd Bergmann .virtual = (unsigned long)AT91_VA_BASE_SYS, 9621d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD .pfn = __phys_to_pfn(AT91_BASE_SYS), 9721d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD .length = SZ_16K, 9821d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD .type = MT_DEVICE, 9921d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD}; 10021d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD 101726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferrestatic struct map_desc at91_alt_io_desc __initdata __maybe_unused = { 102726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre .virtual = (unsigned long)AT91_ALT_VA_BASE_SYS, 103726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre .pfn = __phys_to_pfn(AT91_ALT_BASE_SYS), 104726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre .length = 24 * SZ_1K, 105726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre .type = MT_DEVICE, 106726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre}; 107726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre 1088c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARDstatic void __init soc_detect(u32 dbgu_base) 10921d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD{ 1108c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD u32 cidr, socid; 1118c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD 1128c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD cidr = __raw_readl(AT91_IO_P2V(dbgu_base) + AT91_DBGU_CIDR); 1138c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD socid = cidr & ~AT91_CIDR_VERSION; 11421d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD 1158c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD switch (socid) { 1168c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD case ARCH_ID_AT91RM9200: 1178c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD at91_soc_initdata.type = AT91_SOC_RM9200; 11813ab6aeb49663b0ca0f0eed3560fbaecacf4858fNicolas Ferre if (at91_soc_initdata.subtype == AT91_SOC_SUBTYPE_UNKNOWN) 11936224d0fe0f34cdde66a381708853ebadeac799cJean-Christophe PLAGNIOL-VILLARD at91_soc_initdata.subtype = AT91_SOC_RM9200_BGA; 12021d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD at91_boot_soc = at91rm9200_soc; 1218c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD break; 1228c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD 1238c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD case ARCH_ID_AT91SAM9260: 1248c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD at91_soc_initdata.type = AT91_SOC_SAM9260; 12513ab6aeb49663b0ca0f0eed3560fbaecacf4858fNicolas Ferre at91_soc_initdata.subtype = AT91_SOC_SUBTYPE_NONE; 12621d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD at91_boot_soc = at91sam9260_soc; 1278c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD break; 1288c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD 1298c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD case ARCH_ID_AT91SAM9261: 1308c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD at91_soc_initdata.type = AT91_SOC_SAM9261; 13113ab6aeb49663b0ca0f0eed3560fbaecacf4858fNicolas Ferre at91_soc_initdata.subtype = AT91_SOC_SUBTYPE_NONE; 13221d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD at91_boot_soc = at91sam9261_soc; 1338c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD break; 1348c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD 1358c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD case ARCH_ID_AT91SAM9263: 1368c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD at91_soc_initdata.type = AT91_SOC_SAM9263; 13713ab6aeb49663b0ca0f0eed3560fbaecacf4858fNicolas Ferre at91_soc_initdata.subtype = AT91_SOC_SUBTYPE_NONE; 13821d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD at91_boot_soc = at91sam9263_soc; 1398c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD break; 1408c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD 1418c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD case ARCH_ID_AT91SAM9G20: 1428c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD at91_soc_initdata.type = AT91_SOC_SAM9G20; 14313ab6aeb49663b0ca0f0eed3560fbaecacf4858fNicolas Ferre at91_soc_initdata.subtype = AT91_SOC_SUBTYPE_NONE; 14421d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD at91_boot_soc = at91sam9260_soc; 1458c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD break; 1468c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD 1478c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD case ARCH_ID_AT91SAM9G45: 1488c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD at91_soc_initdata.type = AT91_SOC_SAM9G45; 1498c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD if (cidr == ARCH_ID_AT91SAM9G45ES) 1508c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD at91_soc_initdata.subtype = AT91_SOC_SAM9G45ES; 15121d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD at91_boot_soc = at91sam9g45_soc; 1528c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD break; 1538c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD 1548c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD case ARCH_ID_AT91SAM9RL64: 1558c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD at91_soc_initdata.type = AT91_SOC_SAM9RL; 15613ab6aeb49663b0ca0f0eed3560fbaecacf4858fNicolas Ferre at91_soc_initdata.subtype = AT91_SOC_SUBTYPE_NONE; 15721d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD at91_boot_soc = at91sam9rl_soc; 1588c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD break; 1598c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD 1608c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD case ARCH_ID_AT91SAM9X5: 1618c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD at91_soc_initdata.type = AT91_SOC_SAM9X5; 16221d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD at91_boot_soc = at91sam9x5_soc; 1638c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD break; 16474db4fb93e4ed4d6241bf0f28e4b5d68a7a05577Hong Xu 16574db4fb93e4ed4d6241bf0f28e4b5d68a7a05577Hong Xu case ARCH_ID_AT91SAM9N12: 16674db4fb93e4ed4d6241bf0f28e4b5d68a7a05577Hong Xu at91_soc_initdata.type = AT91_SOC_SAM9N12; 16774db4fb93e4ed4d6241bf0f28e4b5d68a7a05577Hong Xu at91_boot_soc = at91sam9n12_soc; 16874db4fb93e4ed4d6241bf0f28e4b5d68a7a05577Hong Xu break; 1698f4b47949f61eb7f68f458d56a661a7842e67c44Ludovic Desroches 170726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre case ARCH_ID_SAMA5: 171726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre at91_soc_initdata.exid = __raw_readl(AT91_IO_P2V(dbgu_base) + AT91_DBGU_EXID); 172726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre if (at91_soc_initdata.exid & ARCH_EXID_SAMA5D3) { 173726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre at91_soc_initdata.type = AT91_SOC_SAMA5D3; 174726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre at91_boot_soc = sama5d3_soc; 175726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre } 1768f4b47949f61eb7f68f458d56a661a7842e67c44Ludovic Desroches break; 1778c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD } 1788c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD 1798c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD /* at91sam9g10 */ 1803d9a0183dd3423353e9e363bcc261c1220d05f9fIvan Shugov if ((socid & ~AT91_CIDR_EXT) == ARCH_ID_AT91SAM9G10) { 1818c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD at91_soc_initdata.type = AT91_SOC_SAM9G10; 18213ab6aeb49663b0ca0f0eed3560fbaecacf4858fNicolas Ferre at91_soc_initdata.subtype = AT91_SOC_SUBTYPE_NONE; 1838c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD at91_boot_soc = at91sam9261_soc; 1848c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD } 1858c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD /* at91sam9xe */ 1868c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD else if ((cidr & AT91_CIDR_ARCH) == ARCH_FAMILY_AT91SAM9XE) { 1878c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD at91_soc_initdata.type = AT91_SOC_SAM9260; 1888c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD at91_soc_initdata.subtype = AT91_SOC_SAM9XE; 1898c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD at91_boot_soc = at91sam9260_soc; 1908c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD } 1918c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD 1928c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD if (!at91_soc_is_detected()) 1938c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD return; 1948c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD 1958c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD at91_soc_initdata.cidr = cidr; 1968c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD 1978c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD /* sub version of soc */ 198726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre if (!at91_soc_initdata.exid) 199726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre at91_soc_initdata.exid = __raw_readl(AT91_IO_P2V(dbgu_base) + AT91_DBGU_EXID); 2008c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD 2018c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD if (at91_soc_initdata.type == AT91_SOC_SAM9G45) { 2028c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD switch (at91_soc_initdata.exid) { 2038c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD case ARCH_EXID_AT91SAM9M10: 2048c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD at91_soc_initdata.subtype = AT91_SOC_SAM9M10; 2058c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD break; 2068c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD case ARCH_EXID_AT91SAM9G46: 2078c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD at91_soc_initdata.subtype = AT91_SOC_SAM9G46; 2088c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD break; 2098c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD case ARCH_EXID_AT91SAM9M11: 2108c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD at91_soc_initdata.subtype = AT91_SOC_SAM9M11; 2118c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD break; 2128c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD } 2138c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD } 2148c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD 2158c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD if (at91_soc_initdata.type == AT91_SOC_SAM9X5) { 2168c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD switch (at91_soc_initdata.exid) { 2178c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD case ARCH_EXID_AT91SAM9G15: 2188c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD at91_soc_initdata.subtype = AT91_SOC_SAM9G15; 2198c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD break; 2208c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD case ARCH_EXID_AT91SAM9G35: 2218c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD at91_soc_initdata.subtype = AT91_SOC_SAM9G35; 2228c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD break; 2238c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD case ARCH_EXID_AT91SAM9X35: 2248c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD at91_soc_initdata.subtype = AT91_SOC_SAM9X35; 2258c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD break; 2268c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD case ARCH_EXID_AT91SAM9G25: 2278c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD at91_soc_initdata.subtype = AT91_SOC_SAM9G25; 2288c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD break; 2298c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD case ARCH_EXID_AT91SAM9X25: 2308c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD at91_soc_initdata.subtype = AT91_SOC_SAM9X25; 2318c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD break; 2328c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD } 2338c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD } 2348f4b47949f61eb7f68f458d56a661a7842e67c44Ludovic Desroches 2358f4b47949f61eb7f68f458d56a661a7842e67c44Ludovic Desroches if (at91_soc_initdata.type == AT91_SOC_SAMA5D3) { 2368f4b47949f61eb7f68f458d56a661a7842e67c44Ludovic Desroches switch (at91_soc_initdata.exid) { 2378f4b47949f61eb7f68f458d56a661a7842e67c44Ludovic Desroches case ARCH_EXID_SAMA5D31: 2388f4b47949f61eb7f68f458d56a661a7842e67c44Ludovic Desroches at91_soc_initdata.subtype = AT91_SOC_SAMA5D31; 2398f4b47949f61eb7f68f458d56a661a7842e67c44Ludovic Desroches break; 2408f4b47949f61eb7f68f458d56a661a7842e67c44Ludovic Desroches case ARCH_EXID_SAMA5D33: 2418f4b47949f61eb7f68f458d56a661a7842e67c44Ludovic Desroches at91_soc_initdata.subtype = AT91_SOC_SAMA5D33; 2428f4b47949f61eb7f68f458d56a661a7842e67c44Ludovic Desroches break; 2438f4b47949f61eb7f68f458d56a661a7842e67c44Ludovic Desroches case ARCH_EXID_SAMA5D34: 2448f4b47949f61eb7f68f458d56a661a7842e67c44Ludovic Desroches at91_soc_initdata.subtype = AT91_SOC_SAMA5D34; 2458f4b47949f61eb7f68f458d56a661a7842e67c44Ludovic Desroches break; 2468f4b47949f61eb7f68f458d56a661a7842e67c44Ludovic Desroches case ARCH_EXID_SAMA5D35: 2478f4b47949f61eb7f68f458d56a661a7842e67c44Ludovic Desroches at91_soc_initdata.subtype = AT91_SOC_SAMA5D35; 2488f4b47949f61eb7f68f458d56a661a7842e67c44Ludovic Desroches break; 2497f457160dae592b71b4aac03258237b0f2a67a3eJosh Wu case ARCH_EXID_SAMA5D36: 2507f457160dae592b71b4aac03258237b0f2a67a3eJosh Wu at91_soc_initdata.subtype = AT91_SOC_SAMA5D36; 2517f457160dae592b71b4aac03258237b0f2a67a3eJosh Wu break; 2528f4b47949f61eb7f68f458d56a661a7842e67c44Ludovic Desroches } 2538f4b47949f61eb7f68f458d56a661a7842e67c44Ludovic Desroches } 2548c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD} 2558c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD 256726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferrestatic void __init alt_soc_detect(u32 dbgu_base) 257726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre{ 258726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre u32 cidr, socid; 259726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre 260726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre /* SoC ID */ 261726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre cidr = __raw_readl(AT91_ALT_IO_P2V(dbgu_base) + AT91_DBGU_CIDR); 262726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre socid = cidr & ~AT91_CIDR_VERSION; 263726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre 264726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre switch (socid) { 265726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre case ARCH_ID_SAMA5: 266726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre at91_soc_initdata.exid = __raw_readl(AT91_ALT_IO_P2V(dbgu_base) + AT91_DBGU_EXID); 267726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre if (at91_soc_initdata.exid & ARCH_EXID_SAMA5D3) { 268726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre at91_soc_initdata.type = AT91_SOC_SAMA5D3; 269726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre at91_boot_soc = sama5d3_soc; 270726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre } else if (at91_soc_initdata.exid & ARCH_EXID_SAMA5D4) { 271726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre at91_soc_initdata.type = AT91_SOC_SAMA5D4; 272726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre at91_boot_soc = sama5d4_soc; 273726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre } 274726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre break; 275726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre } 276726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre 277726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre if (!at91_soc_is_detected()) 278726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre return; 279726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre 280726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre at91_soc_initdata.cidr = cidr; 281726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre 282726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre /* sub version of soc */ 283726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre if (!at91_soc_initdata.exid) 284726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre at91_soc_initdata.exid = __raw_readl(AT91_ALT_IO_P2V(dbgu_base) + AT91_DBGU_EXID); 285726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre 286726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre if (at91_soc_initdata.type == AT91_SOC_SAMA5D4) { 287726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre switch (at91_soc_initdata.exid) { 288726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre case ARCH_EXID_SAMA5D41: 289726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre at91_soc_initdata.subtype = AT91_SOC_SAMA5D41; 290726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre break; 291726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre case ARCH_EXID_SAMA5D42: 292726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre at91_soc_initdata.subtype = AT91_SOC_SAMA5D42; 293726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre break; 294726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre case ARCH_EXID_SAMA5D43: 295726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre at91_soc_initdata.subtype = AT91_SOC_SAMA5D43; 296726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre break; 297726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre case ARCH_EXID_SAMA5D44: 298726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre at91_soc_initdata.subtype = AT91_SOC_SAMA5D44; 299726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre break; 300726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre } 301726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre } 302726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre} 303726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre 3048c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARDstatic const char *soc_name[] = { 3058c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD [AT91_SOC_RM9200] = "at91rm9200", 3068c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD [AT91_SOC_SAM9260] = "at91sam9260", 3078c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD [AT91_SOC_SAM9261] = "at91sam9261", 3088c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD [AT91_SOC_SAM9263] = "at91sam9263", 3098c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD [AT91_SOC_SAM9G10] = "at91sam9g10", 3108c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD [AT91_SOC_SAM9G20] = "at91sam9g20", 3118c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD [AT91_SOC_SAM9G45] = "at91sam9g45", 3128c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD [AT91_SOC_SAM9RL] = "at91sam9rl", 3138c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD [AT91_SOC_SAM9X5] = "at91sam9x5", 31474db4fb93e4ed4d6241bf0f28e4b5d68a7a05577Hong Xu [AT91_SOC_SAM9N12] = "at91sam9n12", 3158f4b47949f61eb7f68f458d56a661a7842e67c44Ludovic Desroches [AT91_SOC_SAMA5D3] = "sama5d3", 316726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre [AT91_SOC_SAMA5D4] = "sama5d4", 31713ab6aeb49663b0ca0f0eed3560fbaecacf4858fNicolas Ferre [AT91_SOC_UNKNOWN] = "Unknown", 3188c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD}; 3198c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD 3208c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARDconst char *at91_get_soc_type(struct at91_socinfo *c) 3218c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD{ 3228c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD return soc_name[c->type]; 3238c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD} 3248c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARDEXPORT_SYMBOL(at91_get_soc_type); 3258c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD 3268c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARDstatic const char *soc_subtype_name[] = { 3278c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD [AT91_SOC_RM9200_BGA] = "at91rm9200 BGA", 3288c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD [AT91_SOC_RM9200_PQFP] = "at91rm9200 PQFP", 3298c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD [AT91_SOC_SAM9XE] = "at91sam9xe", 3308c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD [AT91_SOC_SAM9G45ES] = "at91sam9g45es", 3318c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD [AT91_SOC_SAM9M10] = "at91sam9m10", 3328c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD [AT91_SOC_SAM9G46] = "at91sam9g46", 3338c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD [AT91_SOC_SAM9M11] = "at91sam9m11", 3348c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD [AT91_SOC_SAM9G15] = "at91sam9g15", 3358c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD [AT91_SOC_SAM9G35] = "at91sam9g35", 3368c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD [AT91_SOC_SAM9X35] = "at91sam9x35", 3378c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD [AT91_SOC_SAM9G25] = "at91sam9g25", 3388c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD [AT91_SOC_SAM9X25] = "at91sam9x25", 3398f4b47949f61eb7f68f458d56a661a7842e67c44Ludovic Desroches [AT91_SOC_SAMA5D31] = "sama5d31", 3408f4b47949f61eb7f68f458d56a661a7842e67c44Ludovic Desroches [AT91_SOC_SAMA5D33] = "sama5d33", 3418f4b47949f61eb7f68f458d56a661a7842e67c44Ludovic Desroches [AT91_SOC_SAMA5D34] = "sama5d34", 3428f4b47949f61eb7f68f458d56a661a7842e67c44Ludovic Desroches [AT91_SOC_SAMA5D35] = "sama5d35", 3437f457160dae592b71b4aac03258237b0f2a67a3eJosh Wu [AT91_SOC_SAMA5D36] = "sama5d36", 344726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre [AT91_SOC_SAMA5D41] = "sama5d41", 345726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre [AT91_SOC_SAMA5D42] = "sama5d42", 346726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre [AT91_SOC_SAMA5D43] = "sama5d43", 347726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre [AT91_SOC_SAMA5D44] = "sama5d44", 34813ab6aeb49663b0ca0f0eed3560fbaecacf4858fNicolas Ferre [AT91_SOC_SUBTYPE_NONE] = "None", 34913ab6aeb49663b0ca0f0eed3560fbaecacf4858fNicolas Ferre [AT91_SOC_SUBTYPE_UNKNOWN] = "Unknown", 3508c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD}; 3518c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD 3528c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARDconst char *at91_get_soc_subtype(struct at91_socinfo *c) 3538c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD{ 3548c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD return soc_subtype_name[c->subtype]; 3558c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD} 3568c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARDEXPORT_SYMBOL(at91_get_soc_subtype); 3578c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD 3588c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARDvoid __init at91_map_io(void) 3598c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD{ 3608c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD /* Map peripherals */ 3618c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD iotable_init(&at91_io_desc, 1); 3628c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD 36313ab6aeb49663b0ca0f0eed3560fbaecacf4858fNicolas Ferre at91_soc_initdata.type = AT91_SOC_UNKNOWN; 36413ab6aeb49663b0ca0f0eed3560fbaecacf4858fNicolas Ferre at91_soc_initdata.subtype = AT91_SOC_SUBTYPE_UNKNOWN; 3658c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD 36613079a733313c00ca92fc6716383dd126caa7276Jean-Christophe PLAGNIOL-VILLARD soc_detect(AT91_BASE_DBGU0); 3678c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD if (!at91_soc_is_detected()) 36813079a733313c00ca92fc6716383dd126caa7276Jean-Christophe PLAGNIOL-VILLARD soc_detect(AT91_BASE_DBGU1); 3698c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD 3708c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD if (!at91_soc_is_detected()) 3719e8be232b934418932e40da276f6871dce83fa7cMaxime Ripard panic(pr_fmt("Impossible to detect the SOC type")); 3728c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD 3739e8be232b934418932e40da276f6871dce83fa7cMaxime Ripard pr_info("Detected soc type: %s\n", 3748c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD at91_get_soc_type(&at91_soc_initdata)); 37513ab6aeb49663b0ca0f0eed3560fbaecacf4858fNicolas Ferre if (at91_soc_initdata.subtype != AT91_SOC_SUBTYPE_NONE) 3769e8be232b934418932e40da276f6871dce83fa7cMaxime Ripard pr_info("Detected soc subtype: %s\n", 37713ab6aeb49663b0ca0f0eed3560fbaecacf4858fNicolas Ferre at91_get_soc_subtype(&at91_soc_initdata)); 3788c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD 3798c3583b634d5705d8f604c0d9392bc273d19c256Jean-Christophe PLAGNIOL-VILLARD if (!at91_soc_is_enabled()) 3809e8be232b934418932e40da276f6871dce83fa7cMaxime Ripard panic(pr_fmt("Soc not enabled")); 38121d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD 38221d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD if (at91_boot_soc.map_io) 38321d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD at91_boot_soc.map_io(); 38421d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD} 38521d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD 386726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferrevoid __init at91_alt_map_io(void) 387726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre{ 388726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre /* Map peripherals */ 389726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre iotable_init(&at91_alt_io_desc, 1); 390726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre 391726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre at91_soc_initdata.type = AT91_SOC_UNKNOWN; 392726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre at91_soc_initdata.subtype = AT91_SOC_SUBTYPE_UNKNOWN; 393726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre 394726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre alt_soc_detect(AT91_BASE_DBGU2); 395726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre if (!at91_soc_is_detected()) 396726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre panic("AT91: Impossible to detect the SOC type"); 397726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre 398726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre pr_info("AT91: Detected soc type: %s\n", 399726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre at91_get_soc_type(&at91_soc_initdata)); 400726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre if (at91_soc_initdata.subtype != AT91_SOC_SUBTYPE_NONE) 401726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre pr_info("AT91: Detected soc subtype: %s\n", 402726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre at91_get_soc_subtype(&at91_soc_initdata)); 403726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre 404726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre if (!at91_soc_is_enabled()) 405726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre panic("AT91: Soc not enabled"); 406726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre 407726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre if (at91_boot_soc.map_io) 408726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre at91_boot_soc.map_io(); 409726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre} 410726d32bf79ef4042004535c9af9c8ea543abe46fNicolas Ferre 4114342d6479e249c0cc952ff71f22167e4276a4927Jean-Christophe PLAGNIOL-VILLARDvoid __iomem *at91_matrix_base; 412ac8c411c8360c281d1fb5e03a975e9088d069dedJoachim EastwoodEXPORT_SYMBOL_GPL(at91_matrix_base); 4134342d6479e249c0cc952ff71f22167e4276a4927Jean-Christophe PLAGNIOL-VILLARD 4144342d6479e249c0cc952ff71f22167e4276a4927Jean-Christophe PLAGNIOL-VILLARDvoid __init at91_ioremap_matrix(u32 base_addr) 4154342d6479e249c0cc952ff71f22167e4276a4927Jean-Christophe PLAGNIOL-VILLARD{ 4164342d6479e249c0cc952ff71f22167e4276a4927Jean-Christophe PLAGNIOL-VILLARD at91_matrix_base = ioremap(base_addr, 512); 4174342d6479e249c0cc952ff71f22167e4276a4927Jean-Christophe PLAGNIOL-VILLARD if (!at91_matrix_base) 4189e8be232b934418932e40da276f6871dce83fa7cMaxime Ripard panic(pr_fmt("Impossible to ioremap at91_matrix_base\n")); 4194342d6479e249c0cc952ff71f22167e4276a4927Jean-Christophe PLAGNIOL-VILLARD} 4204342d6479e249c0cc952ff71f22167e4276a4927Jean-Christophe PLAGNIOL-VILLARD 421dfe367632656d3abd954edf2921e1a2af2d48e44Arnd Bergmann#if defined(CONFIG_OF) && !defined(CONFIG_ARCH_AT91X40) 422a7776ec625c8ca90d050953946a5b72eaf41c21cJean-Christophe PLAGNIOL-VILLARDstatic struct of_device_id ramc_ids[] = { 4236b625891c6b541080bdaad97bcb82bd9ecd9e44bJean-Christophe PLAGNIOL-VILLARD { .compatible = "atmel,at91rm9200-sdramc", .data = at91rm9200_standby }, 4246b625891c6b541080bdaad97bcb82bd9ecd9e44bJean-Christophe PLAGNIOL-VILLARD { .compatible = "atmel,at91sam9260-sdramc", .data = at91sam9_sdram_standby }, 4256b625891c6b541080bdaad97bcb82bd9ecd9e44bJean-Christophe PLAGNIOL-VILLARD { .compatible = "atmel,at91sam9g45-ddramc", .data = at91_ddr_standby }, 426017b5522d5e31a0b2c2f54f566aa8887838bccc7Alexandre Belloni { .compatible = "atmel,sama5d3-ddramc", .data = at91_ddr_standby }, 427a7776ec625c8ca90d050953946a5b72eaf41c21cJean-Christophe PLAGNIOL-VILLARD { /*sentinel*/ } 428a7776ec625c8ca90d050953946a5b72eaf41c21cJean-Christophe PLAGNIOL-VILLARD}; 429a7776ec625c8ca90d050953946a5b72eaf41c21cJean-Christophe PLAGNIOL-VILLARD 430a7776ec625c8ca90d050953946a5b72eaf41c21cJean-Christophe PLAGNIOL-VILLARDstatic void at91_dt_ramc(void) 431a7776ec625c8ca90d050953946a5b72eaf41c21cJean-Christophe PLAGNIOL-VILLARD{ 432a7776ec625c8ca90d050953946a5b72eaf41c21cJean-Christophe PLAGNIOL-VILLARD struct device_node *np; 4336b625891c6b541080bdaad97bcb82bd9ecd9e44bJean-Christophe PLAGNIOL-VILLARD const struct of_device_id *of_id; 4348d248f0d3a1ddb3c671b4029f8950fbad09be7aeMaxime Ripard int idx = 0; 435c8260db557389c1fb46eeafb54414b03d9f19e49Alexandre Belloni const void *standby = NULL; 436a7776ec625c8ca90d050953946a5b72eaf41c21cJean-Christophe PLAGNIOL-VILLARD 437c8260db557389c1fb46eeafb54414b03d9f19e49Alexandre Belloni for_each_matching_node_and_match(np, ramc_ids, &of_id) { 4388d248f0d3a1ddb3c671b4029f8950fbad09be7aeMaxime Ripard at91_ramc_base[idx] = of_iomap(np, 0); 4398d248f0d3a1ddb3c671b4029f8950fbad09be7aeMaxime Ripard if (!at91_ramc_base[idx]) 4408d248f0d3a1ddb3c671b4029f8950fbad09be7aeMaxime Ripard panic(pr_fmt("unable to map ramc[%d] cpu registers\n"), idx); 44182015c4eae2ac67cfed8e98f8d9a4ee77a2d26caJean-Christophe PLAGNIOL-VILLARD 442c8260db557389c1fb46eeafb54414b03d9f19e49Alexandre Belloni if (!standby) 443c8260db557389c1fb46eeafb54414b03d9f19e49Alexandre Belloni standby = of_id->data; 44482015c4eae2ac67cfed8e98f8d9a4ee77a2d26caJean-Christophe PLAGNIOL-VILLARD 4458d248f0d3a1ddb3c671b4029f8950fbad09be7aeMaxime Ripard idx++; 44682015c4eae2ac67cfed8e98f8d9a4ee77a2d26caJean-Christophe PLAGNIOL-VILLARD } 44782015c4eae2ac67cfed8e98f8d9a4ee77a2d26caJean-Christophe PLAGNIOL-VILLARD 4488d248f0d3a1ddb3c671b4029f8950fbad09be7aeMaxime Ripard if (!idx) 4498d248f0d3a1ddb3c671b4029f8950fbad09be7aeMaxime Ripard panic(pr_fmt("unable to find compatible ram controller node in dtb\n")); 45082015c4eae2ac67cfed8e98f8d9a4ee77a2d26caJean-Christophe PLAGNIOL-VILLARD 451c8260db557389c1fb46eeafb54414b03d9f19e49Alexandre Belloni if (!standby) { 4529e8be232b934418932e40da276f6871dce83fa7cMaxime Ripard pr_warn("ramc no standby function available\n"); 4538d248f0d3a1ddb3c671b4029f8950fbad09be7aeMaxime Ripard return; 45482015c4eae2ac67cfed8e98f8d9a4ee77a2d26caJean-Christophe PLAGNIOL-VILLARD } 45582015c4eae2ac67cfed8e98f8d9a4ee77a2d26caJean-Christophe PLAGNIOL-VILLARD 456c8260db557389c1fb46eeafb54414b03d9f19e49Alexandre Belloni at91_pm_set_standby(standby); 45782015c4eae2ac67cfed8e98f8d9a4ee77a2d26caJean-Christophe PLAGNIOL-VILLARD} 45882015c4eae2ac67cfed8e98f8d9a4ee77a2d26caJean-Christophe PLAGNIOL-VILLARD 459397f8c3ca3fec5906d82656ca23a841763196f22Joachim Eastwoodvoid __init at91rm9200_dt_initialize(void) 460397f8c3ca3fec5906d82656ca23a841763196f22Joachim Eastwood{ 461397f8c3ca3fec5906d82656ca23a841763196f22Joachim Eastwood at91_dt_ramc(); 462397f8c3ca3fec5906d82656ca23a841763196f22Joachim Eastwood 463397f8c3ca3fec5906d82656ca23a841763196f22Joachim Eastwood /* Init clock subsystem */ 464397f8c3ca3fec5906d82656ca23a841763196f22Joachim Eastwood at91_dt_clock_init(); 465397f8c3ca3fec5906d82656ca23a841763196f22Joachim Eastwood 466397f8c3ca3fec5906d82656ca23a841763196f22Joachim Eastwood /* Register the processor-specific clocks */ 467c8a8c6300866a51ba41fb41b95800e5982dcf96aBoris BREZILLON if (at91_boot_soc.register_clocks) 468c8a8c6300866a51ba41fb41b95800e5982dcf96aBoris BREZILLON at91_boot_soc.register_clocks(); 469397f8c3ca3fec5906d82656ca23a841763196f22Joachim Eastwood 470397f8c3ca3fec5906d82656ca23a841763196f22Joachim Eastwood at91_boot_soc.init(); 471397f8c3ca3fec5906d82656ca23a841763196f22Joachim Eastwood} 472397f8c3ca3fec5906d82656ca23a841763196f22Joachim Eastwood 4732b11ea5bf2fe4b79f9388d2eaf5d84713eb44a4cJean-Christophe PLAGNIOL-VILLARDvoid __init at91_dt_initialize(void) 4742b11ea5bf2fe4b79f9388d2eaf5d84713eb44a4cJean-Christophe PLAGNIOL-VILLARD{ 475a7776ec625c8ca90d050953946a5b72eaf41c21cJean-Christophe PLAGNIOL-VILLARD at91_dt_ramc(); 4762b11ea5bf2fe4b79f9388d2eaf5d84713eb44a4cJean-Christophe PLAGNIOL-VILLARD 4772b11ea5bf2fe4b79f9388d2eaf5d84713eb44a4cJean-Christophe PLAGNIOL-VILLARD /* Init clock subsystem */ 478eb5e76ffd4e626655944e99bb85b07e17172620dJean-Christophe PLAGNIOL-VILLARD at91_dt_clock_init(); 4792b11ea5bf2fe4b79f9388d2eaf5d84713eb44a4cJean-Christophe PLAGNIOL-VILLARD 4802b11ea5bf2fe4b79f9388d2eaf5d84713eb44a4cJean-Christophe PLAGNIOL-VILLARD /* Register the processor-specific clocks */ 481c8a8c6300866a51ba41fb41b95800e5982dcf96aBoris BREZILLON if (at91_boot_soc.register_clocks) 482c8a8c6300866a51ba41fb41b95800e5982dcf96aBoris BREZILLON at91_boot_soc.register_clocks(); 4832b11ea5bf2fe4b79f9388d2eaf5d84713eb44a4cJean-Christophe PLAGNIOL-VILLARD 4845314ec8e52263b56edd6a37d089b3b675d50e3f1Jean-Christophe PLAGNIOL-VILLARD if (at91_boot_soc.init) 4855314ec8e52263b56edd6a37d089b3b675d50e3f1Jean-Christophe PLAGNIOL-VILLARD at91_boot_soc.init(); 4862b11ea5bf2fe4b79f9388d2eaf5d84713eb44a4cJean-Christophe PLAGNIOL-VILLARD} 4872b11ea5bf2fe4b79f9388d2eaf5d84713eb44a4cJean-Christophe PLAGNIOL-VILLARD#endif 4882b11ea5bf2fe4b79f9388d2eaf5d84713eb44a4cJean-Christophe PLAGNIOL-VILLARD 48921d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARDvoid __init at91_initialize(unsigned long main_clock) 49021d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD{ 491cfa5a1fe7e65bacdee59d5df60a9f44b0c030532Jean-Christophe PLAGNIOL-VILLARD at91_boot_soc.ioremap_registers(); 492cfa5a1fe7e65bacdee59d5df60a9f44b0c030532Jean-Christophe PLAGNIOL-VILLARD 493465393749da3a3229f6067246c7e8f97f7cc833dJean-Christophe PLAGNIOL-VILLARD /* Init clock subsystem */ 494465393749da3a3229f6067246c7e8f97f7cc833dJean-Christophe PLAGNIOL-VILLARD at91_clock_init(main_clock); 495465393749da3a3229f6067246c7e8f97f7cc833dJean-Christophe PLAGNIOL-VILLARD 49651ddec7617bd0d4c73c44a8862faac5d7d97eb03Jean-Christophe PLAGNIOL-VILLARD /* Register the processor-specific clocks */ 49751ddec7617bd0d4c73c44a8862faac5d7d97eb03Jean-Christophe PLAGNIOL-VILLARD at91_boot_soc.register_clocks(); 49851ddec7617bd0d4c73c44a8862faac5d7d97eb03Jean-Christophe PLAGNIOL-VILLARD 499465393749da3a3229f6067246c7e8f97f7cc833dJean-Christophe PLAGNIOL-VILLARD at91_boot_soc.init(); 50097e5e625248e588de234aa5134cebbf969618dcfJean-Christophe PLAGNIOL-VILLARD 50197e5e625248e588de234aa5134cebbf969618dcfJean-Christophe PLAGNIOL-VILLARD pinctrl_provide_dummies(); 50221d08b9d5536ac418bbce4f419fe2b528b7ddf31Jean-Christophe PLAGNIOL-VILLARD} 50365f2ce96a94d2a61fca486a48d9da30845b16d20Maxime Ripard 50465f2ce96a94d2a61fca486a48d9da30845b16d20Maxime Ripardvoid __init at91_register_devices(void) 50565f2ce96a94d2a61fca486a48d9da30845b16d20Maxime Ripard{ 50665f2ce96a94d2a61fca486a48d9da30845b16d20Maxime Ripard at91_boot_soc.register_devices(); 50765f2ce96a94d2a61fca486a48d9da30845b16d20Maxime Ripard} 508d2992e51e799099e319aeaaa8648917954f59a3bMaxime Ripard 509d2992e51e799099e319aeaaa8648917954f59a3bMaxime Ripardvoid __init at91_init_time(void) 510d2992e51e799099e319aeaaa8648917954f59a3bMaxime Ripard{ 511d2992e51e799099e319aeaaa8648917954f59a3bMaxime Ripard at91_boot_soc.init_time(); 512d2992e51e799099e319aeaaa8648917954f59a3bMaxime Ripard} 513