|
@@ -0,0 +1,97 @@
|
|
|
+/* io.h: FRV I/O operations
|
|
|
+ *
|
|
|
+ * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
|
|
|
+ * Written by David Howells (dhowells@redhat.com)
|
|
|
+ *
|
|
|
+ * This program is free software; you can redistribute it and/or
|
|
|
+ * modify it under the terms of the GNU General Public License
|
|
|
+ * as published by the Free Software Foundation; either version
|
|
|
+ * 2 of the License, or (at your option) any later version.
|
|
|
+ *
|
|
|
+ * This gets interesting when talking to the PCI bus - the CPU is in big endian
|
|
|
+ * mode, the PCI bus is little endian and the hardware in the middle can do
|
|
|
+ * byte swapping
|
|
|
+ */
|
|
|
+#ifndef _ASM_IO_H
|
|
|
+#define _ASM_IO_H
|
|
|
+
|
|
|
+#ifdef __KERNEL__
|
|
|
+
|
|
|
+#include <linux/types.h>
|
|
|
+#include <asm/virtconvert.h>
|
|
|
+#include <asm/string.h>
|
|
|
+#include <asm/mb-regs.h>
|
|
|
+#include <asm-generic/pci_iomap.h>
|
|
|
+#include <linux/delay.h>
|
|
|
+
|
|
|
+/*
|
|
|
+ * swap functions are sometimes needed to interface little-endian hardware
|
|
|
+ */
|
|
|
+
|
|
|
+static inline unsigned short _swapw(unsigned short v)
|
|
|
+{
|
|
|
+ return ((v << 8) | (v >> 8));
|
|
|
+}
|
|
|
+
|
|
|
+static inline unsigned long _swapl(unsigned long v)
|
|
|
+{
|
|
|
+ return ((v << 24) | ((v & 0xff00) << 8) | ((v & 0xff0000) >> 8) | (v >> 24));
|
|
|
+}
|
|
|
+
|
|
|
+//#define __iormb() asm volatile("membar")
|
|
|
+//#define __iowmb() asm volatile("membar")
|
|
|
+
|
|
|
+#define __raw_readb __builtin_read8
|
|
|
+#define __raw_readw __builtin_read16
|
|
|
+#define __raw_readl __builtin_read32
|
|
|
+
|
|
|
+#define __raw_writeb(datum, addr) __builtin_write8(addr, datum)
|
|
|
+#define __raw_writew(datum, addr) __builtin_write16(addr, datum)
|
|
|
+#define __raw_writel(datum, addr) __builtin_write32(addr, datum)
|
|
|
+
|
|
|
+static inline void io_outsb(unsigned int addr, const void *buf, int len)
|
|
|
+{
|
|
|
+ unsigned long __ioaddr = (unsigned long) addr;
|
|
|
+ const uint8_t *bp = buf;
|
|
|
+
|
|
|
+ while (len--)
|
|
|
+ __builtin_write8((volatile void __iomem *) __ioaddr, *bp++);
|
|
|
+}
|
|
|
+
|
|
|
+static inline void io_outsw(unsigned int addr, const void *buf, int len)
|
|
|
+{
|
|
|
+ unsigned long __ioaddr = (unsigned long) addr;
|
|
|
+ const uint16_t *bp = buf;
|
|
|
+
|
|
|
+ while (len--)
|
|
|
+ __builtin_write16((volatile void __iomem *) __ioaddr, (*bp++));
|
|
|
+}
|
|
|
+
|
|
|
+extern void __outsl_ns(unsigned int addr, const void *buf, int len);
|
|
|
+extern void __outsl_sw(unsigned int addr, const void *buf, int len);
|
|
|
+static inline void __outsl(unsigned int addr, const void *buf, int len, int swap)
|
|
|
+{
|
|
|
+ unsigned long __ioaddr = (unsigned long) addr;
|
|
|
+
|
|
|
+ if (!swap)
|
|
|
+ __outsl_ns(__ioaddr, buf, len);
|
|
|
+ else
|
|
|
+ __outsl_sw(__ioaddr, buf, len);
|
|
|
+}
|
|
|
+
|
|
|
+static inline void io_insb(unsigned long addr, void *buf, int len)
|
|
|
+{
|
|
|
+ uint8_t *bp = buf;
|
|
|
+
|
|
|
+ while (len--)
|
|
|
+ *bp++ = __builtin_read8((volatile void __iomem *) addr);
|
|
|
+}
|
|
|
+
|
|
|
+static inline void io_insw(unsigned long addr, void *buf, int len)
|
|
|
+{
|
|
|
+ uint16_t *bp = buf;
|
|
|
+
|
|
|
+ while (len--)
|
|
|
+ *bp++ = __builtin_read16((volatile void __iomem *) addr);
|
|
|
+}
|
|
|
+
|