|
@@ -172,3 +172,59 @@ static inline void __iomem *__typesafe_io(unsigned long addr)
|
|
#define PCI_IO_VIRT_BASE 0xfee00000
|
|
#define PCI_IO_VIRT_BASE 0xfee00000
|
|
|
|
|
|
extern int pci_ioremap_io(unsigned int offset, phys_addr_t phys_addr);
|
|
extern int pci_ioremap_io(unsigned int offset, phys_addr_t phys_addr);
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Now, pick up the machine-defined IO definitions
|
|
|
|
+ */
|
|
|
|
+#ifdef CONFIG_NEED_MACH_IO_H
|
|
|
|
+#include <mach/io.h>
|
|
|
|
+#elif defined(CONFIG_PCI)
|
|
|
|
+#define IO_SPACE_LIMIT ((resource_size_t)0xfffff)
|
|
|
|
+#define __io(a) __typesafe_io(PCI_IO_VIRT_BASE + ((a) & IO_SPACE_LIMIT))
|
|
|
|
+#else
|
|
|
|
+#define __io(a) __typesafe_io((a) & IO_SPACE_LIMIT)
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * This is the limit of PC card/PCI/ISA IO space, which is by default
|
|
|
|
+ * 64K if we have PC card, PCI or ISA support. Otherwise, default to
|
|
|
|
+ * zero to prevent ISA/PCI drivers claiming IO space (and potentially
|
|
|
|
+ * oopsing.)
|
|
|
|
+ *
|
|
|
|
+ * Only set this larger if you really need inb() et.al. to operate over
|
|
|
|
+ * a larger address space. Note that SOC_COMMON ioremaps each sockets
|
|
|
|
+ * IO space area, and so inb() et.al. must be defined to operate as per
|
|
|
|
+ * readb() et.al. on such platforms.
|
|
|
|
+ */
|
|
|
|
+#ifndef IO_SPACE_LIMIT
|
|
|
|
+#if defined(CONFIG_PCMCIA_SOC_COMMON) || defined(CONFIG_PCMCIA_SOC_COMMON_MODULE)
|
|
|
|
+#define IO_SPACE_LIMIT ((resource_size_t)0xffffffff)
|
|
|
|
+#elif defined(CONFIG_PCI) || defined(CONFIG_ISA) || defined(CONFIG_PCCARD)
|
|
|
|
+#define IO_SPACE_LIMIT ((resource_size_t)0xffff)
|
|
|
|
+#else
|
|
|
|
+#define IO_SPACE_LIMIT ((resource_size_t)0)
|
|
|
|
+#endif
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * IO port access primitives
|
|
|
|
+ * -------------------------
|
|
|
|
+ *
|
|
|
|
+ * The ARM doesn't have special IO access instructions; all IO is memory
|
|
|
|
+ * mapped. Note that these are defined to perform little endian accesses
|
|
|
|
+ * only. Their primary purpose is to access PCI and ISA peripherals.
|
|
|
|
+ *
|
|
|
|
+ * Note that for a big endian machine, this implies that the following
|
|
|
|
+ * big endian mode connectivity is in place, as described by numerous
|
|
|
|
+ * ARM documents:
|
|
|
|
+ *
|
|
|
|
+ * PCI: D0-D7 D8-D15 D16-D23 D24-D31
|
|
|
|
+ * ARM: D24-D31 D16-D23 D8-D15 D0-D7
|
|
|
|
+ *
|
|
|
|
+ * The machine specific io.h include defines __io to translate an "IO"
|
|
|
|
+ * address to a memory address.
|
|
|
|
+ *
|
|
|
|
+ * Note that we prevent GCC re-ordering or caching values in expressions
|
|
|
|
+ * by introducing sequence points into the in*() definitions. Note that
|
|
|
|
+ * __raw_* do not guarantee this behaviour.
|
|
|
|
+ *
|