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: Paul Mundt <lethal@linux-sh.org>
This commit is contained in:
@@ -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)
|
|||||||
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)
|
|||||||
|
|
||||||
/* Initialize the vDSO */
|
/* Initialize the vDSO */
|
||||||
vsyscall_init();
|
vsyscall_init();
|
||||||
|
|
||||||
|
mem_init_done = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void free_initmem(void)
|
void free_initmem(void)
|
||||||
|
@@ -1,13 +1,13 @@
|
|||||||
/*
|
/*
|
||||||
* 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,
|
|||||||
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..
|
||||||
*/
|
*/
|
||||||
|
Reference in New Issue
Block a user