162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2015 Atmel 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Alexandre Belloni <alexandre.belloni@free-electrons.com 662306a36Sopenharmony_ci * Boris Brezillon <boris.brezillon@free-electrons.com 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#define pr_fmt(fmt) "AT91: " fmt 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/io.h> 1262306a36Sopenharmony_ci#include <linux/of.h> 1362306a36Sopenharmony_ci#include <linux/of_address.h> 1462306a36Sopenharmony_ci#include <linux/of_platform.h> 1562306a36Sopenharmony_ci#include <linux/slab.h> 1662306a36Sopenharmony_ci#include <linux/sys_soc.h> 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#include "soc.h" 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#define AT91_DBGU_CIDR 0x40 2162306a36Sopenharmony_ci#define AT91_DBGU_EXID 0x44 2262306a36Sopenharmony_ci#define AT91_CHIPID_CIDR 0x00 2362306a36Sopenharmony_ci#define AT91_CHIPID_EXID 0x04 2462306a36Sopenharmony_ci#define AT91_CIDR_VERSION(x, m) ((x) & (m)) 2562306a36Sopenharmony_ci#define AT91_CIDR_VERSION_MASK GENMASK(4, 0) 2662306a36Sopenharmony_ci#define AT91_CIDR_VERSION_MASK_SAMA7G5 GENMASK(3, 0) 2762306a36Sopenharmony_ci#define AT91_CIDR_EXT BIT(31) 2862306a36Sopenharmony_ci#define AT91_CIDR_MATCH_MASK GENMASK(30, 5) 2962306a36Sopenharmony_ci#define AT91_CIDR_MASK_SAMA7G5 GENMASK(27, 5) 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_cistatic const struct at91_soc socs[] __initconst = { 3262306a36Sopenharmony_ci#ifdef CONFIG_SOC_AT91RM9200 3362306a36Sopenharmony_ci AT91_SOC(AT91RM9200_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 3462306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, 0, "at91rm9200 BGA", "at91rm9200"), 3562306a36Sopenharmony_ci#endif 3662306a36Sopenharmony_ci#ifdef CONFIG_SOC_AT91SAM9 3762306a36Sopenharmony_ci AT91_SOC(AT91SAM9260_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 3862306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, 0, "at91sam9260", NULL), 3962306a36Sopenharmony_ci AT91_SOC(AT91SAM9261_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 4062306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, 0, "at91sam9261", NULL), 4162306a36Sopenharmony_ci AT91_SOC(AT91SAM9263_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 4262306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, 0, "at91sam9263", NULL), 4362306a36Sopenharmony_ci AT91_SOC(AT91SAM9G20_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 4462306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, 0, "at91sam9g20", NULL), 4562306a36Sopenharmony_ci AT91_SOC(AT91SAM9RL64_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 4662306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, 0, "at91sam9rl64", NULL), 4762306a36Sopenharmony_ci AT91_SOC(AT91SAM9G45_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 4862306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, AT91SAM9M11_EXID_MATCH, 4962306a36Sopenharmony_ci "at91sam9m11", "at91sam9g45"), 5062306a36Sopenharmony_ci AT91_SOC(AT91SAM9G45_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 5162306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, AT91SAM9M10_EXID_MATCH, 5262306a36Sopenharmony_ci "at91sam9m10", "at91sam9g45"), 5362306a36Sopenharmony_ci AT91_SOC(AT91SAM9G45_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 5462306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, AT91SAM9G46_EXID_MATCH, 5562306a36Sopenharmony_ci "at91sam9g46", "at91sam9g45"), 5662306a36Sopenharmony_ci AT91_SOC(AT91SAM9G45_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 5762306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, AT91SAM9G45_EXID_MATCH, 5862306a36Sopenharmony_ci "at91sam9g45", "at91sam9g45"), 5962306a36Sopenharmony_ci AT91_SOC(AT91SAM9X5_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 6062306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, AT91SAM9G15_EXID_MATCH, 6162306a36Sopenharmony_ci "at91sam9g15", "at91sam9x5"), 6262306a36Sopenharmony_ci AT91_SOC(AT91SAM9X5_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 6362306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, AT91SAM9G35_EXID_MATCH, 6462306a36Sopenharmony_ci "at91sam9g35", "at91sam9x5"), 6562306a36Sopenharmony_ci AT91_SOC(AT91SAM9X5_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 6662306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, AT91SAM9X35_EXID_MATCH, 6762306a36Sopenharmony_ci "at91sam9x35", "at91sam9x5"), 6862306a36Sopenharmony_ci AT91_SOC(AT91SAM9X5_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 6962306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, AT91SAM9G25_EXID_MATCH, 7062306a36Sopenharmony_ci "at91sam9g25", "at91sam9x5"), 7162306a36Sopenharmony_ci AT91_SOC(AT91SAM9X5_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 7262306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, AT91SAM9X25_EXID_MATCH, 7362306a36Sopenharmony_ci "at91sam9x25", "at91sam9x5"), 7462306a36Sopenharmony_ci AT91_SOC(AT91SAM9N12_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 7562306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, AT91SAM9CN12_EXID_MATCH, 7662306a36Sopenharmony_ci "at91sam9cn12", "at91sam9n12"), 7762306a36Sopenharmony_ci AT91_SOC(AT91SAM9N12_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 7862306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, AT91SAM9N12_EXID_MATCH, 7962306a36Sopenharmony_ci "at91sam9n12", "at91sam9n12"), 8062306a36Sopenharmony_ci AT91_SOC(AT91SAM9N12_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 8162306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, AT91SAM9CN11_EXID_MATCH, 8262306a36Sopenharmony_ci "at91sam9cn11", "at91sam9n12"), 8362306a36Sopenharmony_ci AT91_SOC(AT91SAM9XE128_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 8462306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, 0, "at91sam9xe128", "at91sam9xe128"), 8562306a36Sopenharmony_ci AT91_SOC(AT91SAM9XE256_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 8662306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, 0, "at91sam9xe256", "at91sam9xe256"), 8762306a36Sopenharmony_ci AT91_SOC(AT91SAM9XE512_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 8862306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, 0, "at91sam9xe512", "at91sam9xe512"), 8962306a36Sopenharmony_ci#endif 9062306a36Sopenharmony_ci#ifdef CONFIG_SOC_SAM9X60 9162306a36Sopenharmony_ci AT91_SOC(SAM9X60_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 9262306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAM9X60_EXID_MATCH, 9362306a36Sopenharmony_ci "sam9x60", "sam9x60"), 9462306a36Sopenharmony_ci AT91_SOC(SAM9X60_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 9562306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAM9X60_D5M_EXID_MATCH, 9662306a36Sopenharmony_ci "sam9x60 64MiB DDR2 SiP", "sam9x60"), 9762306a36Sopenharmony_ci AT91_SOC(SAM9X60_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 9862306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAM9X60_D1G_EXID_MATCH, 9962306a36Sopenharmony_ci "sam9x60 128MiB DDR2 SiP", "sam9x60"), 10062306a36Sopenharmony_ci AT91_SOC(SAM9X60_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 10162306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAM9X60_D6K_EXID_MATCH, 10262306a36Sopenharmony_ci "sam9x60 8MiB SDRAM SiP", "sam9x60"), 10362306a36Sopenharmony_ci#endif 10462306a36Sopenharmony_ci#ifdef CONFIG_SOC_SAMA5 10562306a36Sopenharmony_ci AT91_SOC(SAMA5D2_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 10662306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAMA5D21CU_EXID_MATCH, 10762306a36Sopenharmony_ci "sama5d21", "sama5d2"), 10862306a36Sopenharmony_ci AT91_SOC(SAMA5D2_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 10962306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAMA5D22CU_EXID_MATCH, 11062306a36Sopenharmony_ci "sama5d22", "sama5d2"), 11162306a36Sopenharmony_ci AT91_SOC(SAMA5D2_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 11262306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAMA5D225C_D1M_EXID_MATCH, 11362306a36Sopenharmony_ci "sama5d225c 16MiB SiP", "sama5d2"), 11462306a36Sopenharmony_ci AT91_SOC(SAMA5D2_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 11562306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAMA5D23CU_EXID_MATCH, 11662306a36Sopenharmony_ci "sama5d23", "sama5d2"), 11762306a36Sopenharmony_ci AT91_SOC(SAMA5D2_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 11862306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAMA5D24CX_EXID_MATCH, 11962306a36Sopenharmony_ci "sama5d24", "sama5d2"), 12062306a36Sopenharmony_ci AT91_SOC(SAMA5D2_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 12162306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAMA5D24CU_EXID_MATCH, 12262306a36Sopenharmony_ci "sama5d24", "sama5d2"), 12362306a36Sopenharmony_ci AT91_SOC(SAMA5D2_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 12462306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAMA5D26CU_EXID_MATCH, 12562306a36Sopenharmony_ci "sama5d26", "sama5d2"), 12662306a36Sopenharmony_ci AT91_SOC(SAMA5D2_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 12762306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAMA5D27CU_EXID_MATCH, 12862306a36Sopenharmony_ci "sama5d27", "sama5d2"), 12962306a36Sopenharmony_ci AT91_SOC(SAMA5D2_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 13062306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAMA5D27CN_EXID_MATCH, 13162306a36Sopenharmony_ci "sama5d27", "sama5d2"), 13262306a36Sopenharmony_ci AT91_SOC(SAMA5D2_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 13362306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAMA5D27C_D1G_EXID_MATCH, 13462306a36Sopenharmony_ci "sama5d27c 128MiB SiP", "sama5d2"), 13562306a36Sopenharmony_ci AT91_SOC(SAMA5D2_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 13662306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAMA5D27C_D5M_EXID_MATCH, 13762306a36Sopenharmony_ci "sama5d27c 64MiB SiP", "sama5d2"), 13862306a36Sopenharmony_ci AT91_SOC(SAMA5D2_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 13962306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAMA5D27C_LD1G_EXID_MATCH, 14062306a36Sopenharmony_ci "sama5d27c 128MiB LPDDR2 SiP", "sama5d2"), 14162306a36Sopenharmony_ci AT91_SOC(SAMA5D2_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 14262306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAMA5D27C_LD2G_EXID_MATCH, 14362306a36Sopenharmony_ci "sama5d27c 256MiB LPDDR2 SiP", "sama5d2"), 14462306a36Sopenharmony_ci AT91_SOC(SAMA5D2_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 14562306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAMA5D28CU_EXID_MATCH, 14662306a36Sopenharmony_ci "sama5d28", "sama5d2"), 14762306a36Sopenharmony_ci AT91_SOC(SAMA5D2_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 14862306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAMA5D28CN_EXID_MATCH, 14962306a36Sopenharmony_ci "sama5d28", "sama5d2"), 15062306a36Sopenharmony_ci AT91_SOC(SAMA5D2_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 15162306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAMA5D28C_D1G_EXID_MATCH, 15262306a36Sopenharmony_ci "sama5d28c 128MiB SiP", "sama5d2"), 15362306a36Sopenharmony_ci AT91_SOC(SAMA5D2_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 15462306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAMA5D28C_LD1G_EXID_MATCH, 15562306a36Sopenharmony_ci "sama5d28c 128MiB LPDDR2 SiP", "sama5d2"), 15662306a36Sopenharmony_ci AT91_SOC(SAMA5D2_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 15762306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAMA5D28C_LD2G_EXID_MATCH, 15862306a36Sopenharmony_ci "sama5d28c 256MiB LPDDR2 SiP", "sama5d2"), 15962306a36Sopenharmony_ci AT91_SOC(SAMA5D2_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 16062306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAMA5D29CN_EXID_MATCH, 16162306a36Sopenharmony_ci "sama5d29", "sama5d2"), 16262306a36Sopenharmony_ci AT91_SOC(SAMA5D3_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 16362306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAMA5D31_EXID_MATCH, 16462306a36Sopenharmony_ci "sama5d31", "sama5d3"), 16562306a36Sopenharmony_ci AT91_SOC(SAMA5D3_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 16662306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAMA5D33_EXID_MATCH, 16762306a36Sopenharmony_ci "sama5d33", "sama5d3"), 16862306a36Sopenharmony_ci AT91_SOC(SAMA5D3_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 16962306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAMA5D34_EXID_MATCH, 17062306a36Sopenharmony_ci "sama5d34", "sama5d3"), 17162306a36Sopenharmony_ci AT91_SOC(SAMA5D3_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 17262306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAMA5D35_EXID_MATCH, 17362306a36Sopenharmony_ci "sama5d35", "sama5d3"), 17462306a36Sopenharmony_ci AT91_SOC(SAMA5D3_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 17562306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAMA5D36_EXID_MATCH, 17662306a36Sopenharmony_ci "sama5d36", "sama5d3"), 17762306a36Sopenharmony_ci AT91_SOC(SAMA5D4_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 17862306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAMA5D41_EXID_MATCH, 17962306a36Sopenharmony_ci "sama5d41", "sama5d4"), 18062306a36Sopenharmony_ci AT91_SOC(SAMA5D4_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 18162306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAMA5D42_EXID_MATCH, 18262306a36Sopenharmony_ci "sama5d42", "sama5d4"), 18362306a36Sopenharmony_ci AT91_SOC(SAMA5D4_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 18462306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAMA5D43_EXID_MATCH, 18562306a36Sopenharmony_ci "sama5d43", "sama5d4"), 18662306a36Sopenharmony_ci AT91_SOC(SAMA5D4_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 18762306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAMA5D44_EXID_MATCH, 18862306a36Sopenharmony_ci "sama5d44", "sama5d4"), 18962306a36Sopenharmony_ci#endif 19062306a36Sopenharmony_ci#ifdef CONFIG_SOC_SAMV7 19162306a36Sopenharmony_ci AT91_SOC(SAME70Q21_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 19262306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAME70Q21_EXID_MATCH, 19362306a36Sopenharmony_ci "same70q21", "same7"), 19462306a36Sopenharmony_ci AT91_SOC(SAME70Q20_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 19562306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAME70Q20_EXID_MATCH, 19662306a36Sopenharmony_ci "same70q20", "same7"), 19762306a36Sopenharmony_ci AT91_SOC(SAME70Q19_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 19862306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAME70Q19_EXID_MATCH, 19962306a36Sopenharmony_ci "same70q19", "same7"), 20062306a36Sopenharmony_ci AT91_SOC(SAMS70Q21_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 20162306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAMS70Q21_EXID_MATCH, 20262306a36Sopenharmony_ci "sams70q21", "sams7"), 20362306a36Sopenharmony_ci AT91_SOC(SAMS70Q20_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 20462306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAMS70Q20_EXID_MATCH, 20562306a36Sopenharmony_ci "sams70q20", "sams7"), 20662306a36Sopenharmony_ci AT91_SOC(SAMS70Q19_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 20762306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAMS70Q19_EXID_MATCH, 20862306a36Sopenharmony_ci "sams70q19", "sams7"), 20962306a36Sopenharmony_ci AT91_SOC(SAMV71Q21_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 21062306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAMV71Q21_EXID_MATCH, 21162306a36Sopenharmony_ci "samv71q21", "samv7"), 21262306a36Sopenharmony_ci AT91_SOC(SAMV71Q20_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 21362306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAMV71Q20_EXID_MATCH, 21462306a36Sopenharmony_ci "samv71q20", "samv7"), 21562306a36Sopenharmony_ci AT91_SOC(SAMV71Q19_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 21662306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAMV71Q19_EXID_MATCH, 21762306a36Sopenharmony_ci "samv71q19", "samv7"), 21862306a36Sopenharmony_ci AT91_SOC(SAMV70Q20_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 21962306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAMV70Q20_EXID_MATCH, 22062306a36Sopenharmony_ci "samv70q20", "samv7"), 22162306a36Sopenharmony_ci AT91_SOC(SAMV70Q19_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 22262306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK, SAMV70Q19_EXID_MATCH, 22362306a36Sopenharmony_ci "samv70q19", "samv7"), 22462306a36Sopenharmony_ci#endif 22562306a36Sopenharmony_ci#ifdef CONFIG_SOC_SAMA7 22662306a36Sopenharmony_ci AT91_SOC(SAMA7G5_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 22762306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK_SAMA7G5, SAMA7G51_EXID_MATCH, 22862306a36Sopenharmony_ci "sama7g51", "sama7g5"), 22962306a36Sopenharmony_ci AT91_SOC(SAMA7G5_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 23062306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK_SAMA7G5, SAMA7G52_EXID_MATCH, 23162306a36Sopenharmony_ci "sama7g52", "sama7g5"), 23262306a36Sopenharmony_ci AT91_SOC(SAMA7G5_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 23362306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK_SAMA7G5, SAMA7G53_EXID_MATCH, 23462306a36Sopenharmony_ci "sama7g53", "sama7g5"), 23562306a36Sopenharmony_ci AT91_SOC(SAMA7G5_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 23662306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK_SAMA7G5, SAMA7G54_EXID_MATCH, 23762306a36Sopenharmony_ci "sama7g54", "sama7g5"), 23862306a36Sopenharmony_ci AT91_SOC(SAMA7G5_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 23962306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK_SAMA7G5, SAMA7G54_D1G_EXID_MATCH, 24062306a36Sopenharmony_ci "SAMA7G54 1Gb DDR3L SiP", "sama7g5"), 24162306a36Sopenharmony_ci AT91_SOC(SAMA7G5_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 24262306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK_SAMA7G5, SAMA7G54_D2G_EXID_MATCH, 24362306a36Sopenharmony_ci "SAMA7G54 2Gb DDR3L SiP", "sama7g5"), 24462306a36Sopenharmony_ci AT91_SOC(SAMA7G5_CIDR_MATCH, AT91_CIDR_MATCH_MASK, 24562306a36Sopenharmony_ci AT91_CIDR_VERSION_MASK_SAMA7G5, SAMA7G54_D4G_EXID_MATCH, 24662306a36Sopenharmony_ci "SAMA7G54 4Gb DDR3L SiP", "sama7g5"), 24762306a36Sopenharmony_ci#endif 24862306a36Sopenharmony_ci { /* sentinel */ }, 24962306a36Sopenharmony_ci}; 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_cistatic int __init at91_get_cidr_exid_from_dbgu(u32 *cidr, u32 *exid) 25262306a36Sopenharmony_ci{ 25362306a36Sopenharmony_ci struct device_node *np; 25462306a36Sopenharmony_ci void __iomem *regs; 25562306a36Sopenharmony_ci 25662306a36Sopenharmony_ci np = of_find_compatible_node(NULL, NULL, "atmel,at91rm9200-dbgu"); 25762306a36Sopenharmony_ci if (!np) 25862306a36Sopenharmony_ci np = of_find_compatible_node(NULL, NULL, 25962306a36Sopenharmony_ci "atmel,at91sam9260-dbgu"); 26062306a36Sopenharmony_ci if (!np) 26162306a36Sopenharmony_ci return -ENODEV; 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_ci regs = of_iomap(np, 0); 26462306a36Sopenharmony_ci of_node_put(np); 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_ci if (!regs) { 26762306a36Sopenharmony_ci pr_warn("Could not map DBGU iomem range"); 26862306a36Sopenharmony_ci return -ENXIO; 26962306a36Sopenharmony_ci } 27062306a36Sopenharmony_ci 27162306a36Sopenharmony_ci *cidr = readl(regs + AT91_DBGU_CIDR); 27262306a36Sopenharmony_ci *exid = readl(regs + AT91_DBGU_EXID); 27362306a36Sopenharmony_ci 27462306a36Sopenharmony_ci iounmap(regs); 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_ci return 0; 27762306a36Sopenharmony_ci} 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_cistatic int __init at91_get_cidr_exid_from_chipid(u32 *cidr, u32 *exid) 28062306a36Sopenharmony_ci{ 28162306a36Sopenharmony_ci struct device_node *np; 28262306a36Sopenharmony_ci void __iomem *regs; 28362306a36Sopenharmony_ci static const struct of_device_id chipids[] = { 28462306a36Sopenharmony_ci { .compatible = "atmel,sama5d2-chipid" }, 28562306a36Sopenharmony_ci { .compatible = "microchip,sama7g5-chipid" }, 28662306a36Sopenharmony_ci { }, 28762306a36Sopenharmony_ci }; 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_ci np = of_find_matching_node(NULL, chipids); 29062306a36Sopenharmony_ci if (!np) 29162306a36Sopenharmony_ci return -ENODEV; 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_ci regs = of_iomap(np, 0); 29462306a36Sopenharmony_ci of_node_put(np); 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ci if (!regs) { 29762306a36Sopenharmony_ci pr_warn("Could not map DBGU iomem range"); 29862306a36Sopenharmony_ci return -ENXIO; 29962306a36Sopenharmony_ci } 30062306a36Sopenharmony_ci 30162306a36Sopenharmony_ci *cidr = readl(regs + AT91_CHIPID_CIDR); 30262306a36Sopenharmony_ci *exid = readl(regs + AT91_CHIPID_EXID); 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ci iounmap(regs); 30562306a36Sopenharmony_ci 30662306a36Sopenharmony_ci return 0; 30762306a36Sopenharmony_ci} 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_cistruct soc_device * __init at91_soc_init(const struct at91_soc *socs) 31062306a36Sopenharmony_ci{ 31162306a36Sopenharmony_ci struct soc_device_attribute *soc_dev_attr; 31262306a36Sopenharmony_ci const struct at91_soc *soc; 31362306a36Sopenharmony_ci struct soc_device *soc_dev; 31462306a36Sopenharmony_ci u32 cidr, exid; 31562306a36Sopenharmony_ci int ret; 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_ci /* 31862306a36Sopenharmony_ci * With SAMA5D2 and later SoCs, CIDR and EXID registers are no more 31962306a36Sopenharmony_ci * in the dbgu device but in the chipid device whose purpose is only 32062306a36Sopenharmony_ci * to expose these two registers. 32162306a36Sopenharmony_ci */ 32262306a36Sopenharmony_ci ret = at91_get_cidr_exid_from_dbgu(&cidr, &exid); 32362306a36Sopenharmony_ci if (ret) 32462306a36Sopenharmony_ci ret = at91_get_cidr_exid_from_chipid(&cidr, &exid); 32562306a36Sopenharmony_ci if (ret) { 32662306a36Sopenharmony_ci if (ret == -ENODEV) 32762306a36Sopenharmony_ci pr_warn("Could not find identification node"); 32862306a36Sopenharmony_ci return NULL; 32962306a36Sopenharmony_ci } 33062306a36Sopenharmony_ci 33162306a36Sopenharmony_ci for (soc = socs; soc->name; soc++) { 33262306a36Sopenharmony_ci if (soc->cidr_match != (cidr & soc->cidr_mask)) 33362306a36Sopenharmony_ci continue; 33462306a36Sopenharmony_ci 33562306a36Sopenharmony_ci if (!(cidr & AT91_CIDR_EXT) || soc->exid_match == exid) 33662306a36Sopenharmony_ci break; 33762306a36Sopenharmony_ci } 33862306a36Sopenharmony_ci 33962306a36Sopenharmony_ci if (!soc->name) { 34062306a36Sopenharmony_ci pr_warn("Could not find matching SoC description\n"); 34162306a36Sopenharmony_ci return NULL; 34262306a36Sopenharmony_ci } 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ci soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL); 34562306a36Sopenharmony_ci if (!soc_dev_attr) 34662306a36Sopenharmony_ci return NULL; 34762306a36Sopenharmony_ci 34862306a36Sopenharmony_ci soc_dev_attr->family = soc->family; 34962306a36Sopenharmony_ci soc_dev_attr->soc_id = soc->name; 35062306a36Sopenharmony_ci soc_dev_attr->revision = kasprintf(GFP_KERNEL, "%X", 35162306a36Sopenharmony_ci AT91_CIDR_VERSION(cidr, soc->version_mask)); 35262306a36Sopenharmony_ci soc_dev = soc_device_register(soc_dev_attr); 35362306a36Sopenharmony_ci if (IS_ERR(soc_dev)) { 35462306a36Sopenharmony_ci kfree(soc_dev_attr->revision); 35562306a36Sopenharmony_ci kfree(soc_dev_attr); 35662306a36Sopenharmony_ci pr_warn("Could not register SoC device\n"); 35762306a36Sopenharmony_ci return NULL; 35862306a36Sopenharmony_ci } 35962306a36Sopenharmony_ci 36062306a36Sopenharmony_ci if (soc->family) 36162306a36Sopenharmony_ci pr_info("Detected SoC family: %s\n", soc->family); 36262306a36Sopenharmony_ci pr_info("Detected SoC: %s, revision %X\n", soc->name, 36362306a36Sopenharmony_ci AT91_CIDR_VERSION(cidr, soc->version_mask)); 36462306a36Sopenharmony_ci 36562306a36Sopenharmony_ci return soc_dev; 36662306a36Sopenharmony_ci} 36762306a36Sopenharmony_ci 36862306a36Sopenharmony_cistatic const struct of_device_id at91_soc_allowed_list[] __initconst = { 36962306a36Sopenharmony_ci { .compatible = "atmel,at91rm9200", }, 37062306a36Sopenharmony_ci { .compatible = "atmel,at91sam9", }, 37162306a36Sopenharmony_ci { .compatible = "atmel,sama5", }, 37262306a36Sopenharmony_ci { .compatible = "atmel,samv7", }, 37362306a36Sopenharmony_ci { .compatible = "microchip,sama7g5", }, 37462306a36Sopenharmony_ci { } 37562306a36Sopenharmony_ci}; 37662306a36Sopenharmony_ci 37762306a36Sopenharmony_cistatic int __init atmel_soc_device_init(void) 37862306a36Sopenharmony_ci{ 37962306a36Sopenharmony_ci struct device_node *np = of_find_node_by_path("/"); 38062306a36Sopenharmony_ci 38162306a36Sopenharmony_ci if (!of_match_node(at91_soc_allowed_list, np)) 38262306a36Sopenharmony_ci return 0; 38362306a36Sopenharmony_ci 38462306a36Sopenharmony_ci at91_soc_init(socs); 38562306a36Sopenharmony_ci 38662306a36Sopenharmony_ci return 0; 38762306a36Sopenharmony_ci} 38862306a36Sopenharmony_cisubsys_initcall(atmel_soc_device_init); 389