diff options
author | Thomas Abraham <thomas.abraham@linaro.org> | 2013-04-23 09:46:53 -0400 |
---|---|---|
committer | Kukjin Kim <kgene.kim@samsung.com> | 2013-04-25 12:21:37 -0400 |
commit | f5f83c71ffc5bda1c1ade5e8b1a8a1d40208860c (patch) | |
tree | a4a0e0998cda417592351eff66dd9aa3e9c25384 | |
parent | 58a7bbf75442ea439a4d3b7993ad87023e406063 (diff) |
ARM: EXYNOS: Create virtual I/O mapping for Chip-ID controller using device tree
On device tree enabled exynos platforms, retrieve the physical base address
of the chip-id controller from device tree and create a virtual I/O mapping
for the chip-id controller. This helps to remove the chip-id controller entry
from the statically defined I/O mapping tables.
Signed-off-by: Thomas Abraham <thomas.abraham@linaro.org>
Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
-rw-r--r-- | arch/arm/mach-exynos/common.c | 53 | ||||
-rw-r--r-- | arch/arm/mach-exynos/include/mach/map.h | 1 |
2 files changed, 30 insertions, 24 deletions
diff --git a/arch/arm/mach-exynos/common.c b/arch/arm/mach-exynos/common.c index 02e35abd136b..e720352f85cb 100644 --- a/arch/arm/mach-exynos/common.c +++ b/arch/arm/mach-exynos/common.c | |||
@@ -119,17 +119,6 @@ static struct map_desc exynos_iodesc[] __initdata = { | |||
119 | }, | 119 | }, |
120 | }; | 120 | }; |
121 | 121 | ||
122 | #ifdef CONFIG_ARCH_EXYNOS5 | ||
123 | static struct map_desc exynos5440_iodesc[] __initdata = { | ||
124 | { | ||
125 | .virtual = (unsigned long)S5P_VA_CHIPID, | ||
126 | .pfn = __phys_to_pfn(EXYNOS5440_PA_CHIPID), | ||
127 | .length = SZ_4K, | ||
128 | .type = MT_DEVICE, | ||
129 | }, | ||
130 | }; | ||
131 | #endif | ||
132 | |||
133 | static struct map_desc exynos4_iodesc[] __initdata = { | 122 | static struct map_desc exynos4_iodesc[] __initdata = { |
134 | { | 123 | { |
135 | .virtual = (unsigned long)S3C_VA_SYS, | 124 | .virtual = (unsigned long)S3C_VA_SYS, |
@@ -320,6 +309,31 @@ void __init exynos_init_late(void) | |||
320 | exynos_pm_late_initcall(); | 309 | exynos_pm_late_initcall(); |
321 | } | 310 | } |
322 | 311 | ||
312 | #ifdef CONFIG_OF | ||
313 | int __init exynos_fdt_map_chipid(unsigned long node, const char *uname, | ||
314 | int depth, void *data) | ||
315 | { | ||
316 | struct map_desc iodesc; | ||
317 | __be32 *reg; | ||
318 | unsigned long len; | ||
319 | |||
320 | if (!of_flat_dt_is_compatible(node, "samsung,exynos4210-chipid") && | ||
321 | !of_flat_dt_is_compatible(node, "samsung,exynos5440-clock")) | ||
322 | return 0; | ||
323 | |||
324 | reg = of_get_flat_dt_prop(node, "reg", &len); | ||
325 | if (reg == NULL || len != (sizeof(unsigned long) * 2)) | ||
326 | return 0; | ||
327 | |||
328 | iodesc.pfn = __phys_to_pfn(be32_to_cpu(reg[0])); | ||
329 | iodesc.length = be32_to_cpu(reg[1]) - 1; | ||
330 | iodesc.virtual = (unsigned long)S5P_VA_CHIPID; | ||
331 | iodesc.type = MT_DEVICE; | ||
332 | iotable_init(&iodesc, 1); | ||
333 | return 1; | ||
334 | } | ||
335 | #endif | ||
336 | |||
323 | /* | 337 | /* |
324 | * exynos_map_io | 338 | * exynos_map_io |
325 | * | 339 | * |
@@ -328,19 +342,12 @@ void __init exynos_init_late(void) | |||
328 | 342 | ||
329 | void __init exynos_init_io(struct map_desc *mach_desc, int size) | 343 | void __init exynos_init_io(struct map_desc *mach_desc, int size) |
330 | { | 344 | { |
331 | struct map_desc *iodesc = exynos_iodesc; | 345 | #ifdef CONFIG_OF |
332 | int iodesc_sz = ARRAY_SIZE(exynos_iodesc); | 346 | if (initial_boot_params) |
333 | #if defined(CONFIG_OF) && defined(CONFIG_ARCH_EXYNOS5) | 347 | of_scan_flat_dt(exynos_fdt_map_chipid, NULL); |
334 | unsigned long root = of_get_flat_dt_root(); | 348 | else |
335 | |||
336 | /* initialize the io descriptors we need for initialization */ | ||
337 | if (of_flat_dt_is_compatible(root, "samsung,exynos5440")) { | ||
338 | iodesc = exynos5440_iodesc; | ||
339 | iodesc_sz = ARRAY_SIZE(exynos5440_iodesc); | ||
340 | } | ||
341 | #endif | 349 | #endif |
342 | 350 | iotable_init(exynos_iodesc, ARRAY_SIZE(exynos_iodesc)); | |
343 | iotable_init(iodesc, iodesc_sz); | ||
344 | 351 | ||
345 | if (mach_desc) | 352 | if (mach_desc) |
346 | iotable_init(mach_desc, size); | 353 | iotable_init(mach_desc, size); |
diff --git a/arch/arm/mach-exynos/include/mach/map.h b/arch/arm/mach-exynos/include/mach/map.h index 7f99b7b187d6..be7abc7ceb67 100644 --- a/arch/arm/mach-exynos/include/mach/map.h +++ b/arch/arm/mach-exynos/include/mach/map.h | |||
@@ -53,7 +53,6 @@ | |||
53 | #define EXYNOS4_PA_ONENAND_DMA 0x0C600000 | 53 | #define EXYNOS4_PA_ONENAND_DMA 0x0C600000 |
54 | 54 | ||
55 | #define EXYNOS_PA_CHIPID 0x10000000 | 55 | #define EXYNOS_PA_CHIPID 0x10000000 |
56 | #define EXYNOS5440_PA_CHIPID 0x00160000 | ||
57 | 56 | ||
58 | #define EXYNOS4_PA_SYSCON 0x10010000 | 57 | #define EXYNOS4_PA_SYSCON 0x10010000 |
59 | #define EXYNOS5_PA_SYSCON 0x10050100 | 58 | #define EXYNOS5_PA_SYSCON 0x10050100 |