Merge branch 'upstream'
[pandora-kernel.git] / arch / mips / lib / iomap.c
1 /*
2  *  iomap.c, Memory Mapped I/O routines for MIPS architecture.
3  *
4  *  This code is based on lib/iomap.c, by Linus Torvalds.
5  *
6  *  Copyright (C) 2004-2005  Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp>
7  *
8  *  This program is free software; you can redistribute it and/or modify
9  *  it under the terms of the GNU General Public License as published by
10  *  the Free Software Foundation; either version 2 of the License, or
11  *  (at your option) any later version.
12  *
13  *  This program is distributed in the hope that it will be useful,
14  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  *  GNU General Public License for more details.
17  *
18  *  You should have received a copy of the GNU General Public License
19  *  along with this program; if not, write to the Free Software
20  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21  */
22 #include <linux/ioport.h>
23 #include <linux/module.h>
24 #include <linux/pci.h>
25
26 #include <asm/io.h>
27
28 void __iomem *ioport_map(unsigned long port, unsigned int nr)
29 {
30         unsigned long end;
31
32         end = port + nr - 1UL;
33         if (ioport_resource.start > port ||
34             ioport_resource.end < end || port > end)
35                 return NULL;
36
37         return (void __iomem *)(mips_io_port_base + port);
38 }
39
40 void ioport_unmap(void __iomem *addr)
41 {
42 }
43 EXPORT_SYMBOL(ioport_map);
44 EXPORT_SYMBOL(ioport_unmap);
45
46 void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen)
47 {
48         unsigned long start, len, flags;
49
50         if (dev == NULL)
51                 return NULL;
52
53         start = pci_resource_start(dev, bar);
54         len = pci_resource_len(dev, bar);
55         if (!start || !len)
56                 return NULL;
57
58         if (maxlen != 0 && len > maxlen)
59                 len = maxlen;
60
61         flags = pci_resource_flags(dev, bar);
62         if (flags & IORESOURCE_IO)
63                 return ioport_map(start, len);
64         if (flags & IORESOURCE_MEM) {
65                 if (flags & IORESOURCE_CACHEABLE)
66                         return ioremap_cacheable_cow(start, len);
67                 return ioremap_nocache(start, len);
68         }
69
70         return NULL;
71 }
72
73 void pci_iounmap(struct pci_dev *dev, void __iomem *addr)
74 {
75         iounmap(addr);
76 }
77 EXPORT_SYMBOL(pci_iomap);
78 EXPORT_SYMBOL(pci_iounmap);