[ARM] Orion: fix ioremap() optimization
The ioremap() optimization used for internal register didn't cope with the fact that paddr + size can wrap to zero if the area extends to the end of the physical address space. Issue isolated by Sylver Bruneau <sylver.bruneau@googlemail.com>. Signed-off-by: Nicolas Pitre <nico@marvell.com>
This commit is contained in:
parent
c5a1e8f709
commit
fd153abb01
|
@ -20,11 +20,10 @@ static inline void __iomem *
|
|||
__arch_ioremap(unsigned long paddr, size_t size, unsigned int mtype)
|
||||
{
|
||||
void __iomem *retval;
|
||||
|
||||
if (mtype == MT_DEVICE && size && paddr >= ORION5X_REGS_PHYS_BASE &&
|
||||
paddr + size <= ORION5X_REGS_PHYS_BASE + ORION5X_REGS_SIZE) {
|
||||
retval = (void __iomem *)ORION5X_REGS_VIRT_BASE +
|
||||
(paddr - ORION5X_REGS_PHYS_BASE);
|
||||
unsigned long offs = paddr - ORION5X_REGS_PHYS_BASE;
|
||||
if (mtype == MT_DEVICE && size && offs < ORION5X_REGS_SIZE &&
|
||||
size <= ORION5X_REGS_SIZE && offs + size <= ORION5X_REGS_SIZE) {
|
||||
retval = (void __iomem *)ORION5X_REGS_VIRT_BASE + offs;
|
||||
} else {
|
||||
retval = __arm_ioremap(paddr, size, mtype);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue