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();
}
* 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..
}
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;
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.
*/
unsigned long offset;
unsigned int nrpages;
int i, slot;
- pgprot_t prot;
slot = -1;
for (i = 0; i < FIX_N_IOREMAPS; i++) {
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;
}