Commit d9b9487a authored by Paul Mundt's avatar Paul Mundt

sh: Handle early ioremaps through fixed mappings.

This adds in a mem_init_done to work out when a standard ioremap() is
possible, falling back to the fixmap based ioremap otherwise.
Signed-off-by: default avatarPaul Mundt <lethal@linux-sh.org>
parent 0c54de14
...@@ -101,6 +101,9 @@ struct seq_operations; ...@@ -101,6 +101,9 @@ struct seq_operations;
extern struct pt_regs fake_swapper_regs; extern struct pt_regs fake_swapper_regs;
/* arch/sh/mm/init.c */
extern unsigned int mem_init_done;
/* arch/sh/kernel/setup.c */ /* arch/sh/kernel/setup.c */
const char *get_cpu_subtype(struct sh_cpuinfo *c); const char *get_cpu_subtype(struct sh_cpuinfo *c);
extern const struct seq_operations cpuinfo_op; extern const struct seq_operations cpuinfo_op;
......
...@@ -237,6 +237,8 @@ static void __init iommu_init(void) ...@@ -237,6 +237,8 @@ static void __init iommu_init(void)
no_iommu_init(); no_iommu_init();
} }
unsigned int mem_init_done = 0;
void __init mem_init(void) void __init mem_init(void)
{ {
int codesize, datasize, initsize; int codesize, datasize, initsize;
...@@ -287,6 +289,8 @@ void __init mem_init(void) ...@@ -287,6 +289,8 @@ void __init mem_init(void)
/* Initialize the vDSO */ /* Initialize the vDSO */
vsyscall_init(); vsyscall_init();
mem_init_done = 1;
} }
void free_initmem(void) void free_initmem(void)
......
/* /*
* arch/sh/mm/ioremap.c * arch/sh/mm/ioremap.c
* *
* (C) Copyright 1995 1996 Linus Torvalds
* (C) Copyright 2005 - 2010 Paul Mundt
*
* Re-map IO memory to kernel address space so that we can access it. * Re-map IO memory to kernel address space so that we can access it.
* This is needed for high PCI addresses that aren't mapped in the * This is needed for high PCI addresses that aren't mapped in the
* 640k-1MB IO memory area on PC's * 640k-1MB IO memory area on PC's
* *
* (C) Copyright 1995 1996 Linus Torvalds
* (C) Copyright 2005, 2006 Paul Mundt
*
* This file is subject to the terms and conditions of the GNU General * This file is subject to the terms and conditions of the GNU General
* Public License. See the file "COPYING" in the main directory of this * Public License. See the file "COPYING" in the main directory of this
* archive for more details. * archive for more details.
...@@ -64,6 +64,12 @@ void __iomem *__ioremap_caller(unsigned long phys_addr, unsigned long size, ...@@ -64,6 +64,12 @@ void __iomem *__ioremap_caller(unsigned long phys_addr, unsigned long size,
phys_addr &= PAGE_MASK; phys_addr &= PAGE_MASK;
size = PAGE_ALIGN(last_addr+1) - phys_addr; size = PAGE_ALIGN(last_addr+1) - phys_addr;
/*
* If we can't yet use the regular approach, go the fixmap route.
*/
if (!mem_init_done)
return ioremap_fixed(phys_addr, size, __pgprot(flags));
/* /*
* Ok, go for it.. * Ok, go for it..
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment