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