浏览代码

sh: Kill off duplicate address alignment in ioremap_fixed().

This is already taken care of in the top-level ioremap, and now that
no one should be calling ioremap_fixed() directly we can simply throw the
mapping displacement in as an additional argument.

Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Paul Mundt 15 年之前
父节点
当前提交
acf2c9685f
共有 3 个文件被更改,包括 8 次插入22 次删除
  1. 4 2
      arch/sh/include/asm/io.h
  2. 1 1
      arch/sh/mm/ioremap.c
  3. 3 19
      arch/sh/mm/ioremap_fixed.c

+ 4 - 2
arch/sh/include/asm/io.h

@@ -239,12 +239,14 @@ void __iomem *__ioremap_caller(unsigned long offset, unsigned long size,
 void __iounmap(void __iomem *addr);
 
 #ifdef CONFIG_IOREMAP_FIXED
-extern void __iomem *ioremap_fixed(resource_size_t, unsigned long, pgprot_t);
+extern void __iomem *ioremap_fixed(resource_size_t, unsigned long,
+				   unsigned long, pgprot_t);
 extern int iounmap_fixed(void __iomem *);
 extern void ioremap_fixed_init(void);
 #else
 static inline void __iomem *
-ioremap_fixed(resource_size t phys_addr, unsigned long size, pgprot_t prot)
+ioremap_fixed(resource_size t phys_addr, unsigned long offset,
+	      unsigned long size, pgprot_t prot)
 {
 	BUG();
 }

+ 1 - 1
arch/sh/mm/ioremap.c

@@ -68,7 +68,7 @@ __ioremap_caller(unsigned long phys_addr, unsigned long size,
 	 * If we can't yet use the regular approach, go the fixmap route.
 	 */
 	if (!mem_init_done)
-		return ioremap_fixed(phys_addr, size, pgprot);
+		return ioremap_fixed(phys_addr, offset, size, pgprot);
 
 	/*
 	 * Ok, go for it..

+ 3 - 19
arch/sh/mm/ioremap_fixed.c

@@ -45,12 +45,11 @@ void __init ioremap_fixed_init(void)
 }
 
 void __init __iomem *
-ioremap_fixed(resource_size_t phys_addr, unsigned long size, pgprot_t prot)
+ioremap_fixed(resource_size_t phys_addr, unsigned long offset,
+	      unsigned long size, pgprot_t prot)
 {
 	enum fixed_addresses idx0, idx;
-	resource_size_t last_addr;
 	struct ioremap_map *map;
-	unsigned long offset;
 	unsigned int nrpages;
 	int i, slot;
 
@@ -67,18 +66,6 @@ ioremap_fixed(resource_size_t phys_addr, unsigned long size, pgprot_t prot)
 	if (slot < 0)
 		return NULL;
 
-	/* Don't allow wraparound or zero size */
-	last_addr = phys_addr + size - 1;
-	if (!size || last_addr < phys_addr)
-		return NULL;
-
-	/*
-	 * Fixmap mappings have to be page-aligned
-	 */
-	offset = phys_addr & ~PAGE_MASK;
-	phys_addr &= PAGE_MASK;
-	size = PAGE_ALIGN(last_addr + 1) - phys_addr;
-
 	/*
 	 * Mappings have to fit in the FIX_IOREMAP area.
 	 */
@@ -111,7 +98,6 @@ int iounmap_fixed(void __iomem *addr)
 	unsigned long offset;
 	unsigned int nrpages;
 	int i, slot;
-	pgprot_t prot;
 
 	slot = -1;
 	for (i = 0; i < FIX_N_IOREMAPS; i++) {
@@ -133,11 +119,9 @@ int iounmap_fixed(void __iomem *addr)
 	offset = virt_addr & ~PAGE_MASK;
 	nrpages = PAGE_ALIGN(offset + map->size - 1) >> PAGE_SHIFT;
 
-	pgprot_val(prot) = _PAGE_WIRED;
-
 	idx = FIX_IOREMAP_BEGIN + slot + nrpages;
 	while (nrpages > 0) {
-		__clear_fixmap(idx, prot);
+		__clear_fixmap(idx, __pgprot(_PAGE_WIRED));
 		--idx;
 		--nrpages;
 	}