[XTENSA] Move string-io functions to io.c from pci.c
The string-io functions (outs{bwl}, ins{bwl}) are independent from the PCI option and should be in a separate file. Signed-off-by: Chris Zankel <chris@zankel.net>
This commit is contained in:
@@ -7,7 +7,7 @@ extra-y := head.o vmlinux.lds
|
|||||||
|
|
||||||
obj-y := align.o entry.o irq.o coprocessor.o process.o ptrace.o semaphore.o \
|
obj-y := align.o entry.o irq.o coprocessor.o process.o ptrace.o semaphore.o \
|
||||||
setup.o signal.o syscall.o time.o traps.o vectors.o platform.o \
|
setup.o signal.o syscall.o time.o traps.o vectors.o platform.o \
|
||||||
pci-dma.o init_task.o
|
pci-dma.o init_task.o io.o
|
||||||
|
|
||||||
## windowspill.o
|
## windowspill.o
|
||||||
|
|
||||||
|
75
arch/xtensa/kernel/io.c
Normal file
75
arch/xtensa/kernel/io.c
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
/*
|
||||||
|
* arch/xtensa/io.c
|
||||||
|
*
|
||||||
|
* IO primitives
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* Copied from sparc.
|
||||||
|
*
|
||||||
|
* Chris Zankel <chris@zankel.net>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <asm/io.h>
|
||||||
|
#include <asm/byteorder.h>
|
||||||
|
|
||||||
|
void outsb(unsigned long addr, const void *src, unsigned long count) {
|
||||||
|
while (count) {
|
||||||
|
count -= 1;
|
||||||
|
writeb(*(const char *)src, addr);
|
||||||
|
src += 1;
|
||||||
|
addr += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void outsw(unsigned long addr, const void *src, unsigned long count) {
|
||||||
|
while (count) {
|
||||||
|
count -= 2;
|
||||||
|
writew(*(const short *)src, addr);
|
||||||
|
src += 2;
|
||||||
|
addr += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void outsl(unsigned long addr, const void *src, unsigned long count) {
|
||||||
|
while (count) {
|
||||||
|
count -= 4;
|
||||||
|
writel(*(const long *)src, addr);
|
||||||
|
src += 4;
|
||||||
|
addr += 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void insb(unsigned long addr, void *dst, unsigned long count) {
|
||||||
|
while (count) {
|
||||||
|
count -= 1;
|
||||||
|
*(unsigned char *)dst = readb(addr);
|
||||||
|
dst += 1;
|
||||||
|
addr += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void insw(unsigned long addr, void *dst, unsigned long count) {
|
||||||
|
while (count) {
|
||||||
|
count -= 2;
|
||||||
|
*(unsigned short *)dst = readw(addr);
|
||||||
|
dst += 2;
|
||||||
|
addr += 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void insl(unsigned long addr, void *dst, unsigned long count) {
|
||||||
|
while (count) {
|
||||||
|
count -= 4;
|
||||||
|
/*
|
||||||
|
* XXX I am sure we are in for an unaligned trap here.
|
||||||
|
*/
|
||||||
|
*(unsigned long *)dst = readl(addr);
|
||||||
|
dst += 4;
|
||||||
|
addr += 4;
|
||||||
|
}
|
||||||
|
}
|
@@ -394,72 +394,3 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
|
|||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* This probably belongs here rather than ioport.c because
|
|
||||||
* we do not want this crud linked into SBus kernels.
|
|
||||||
* Also, think for a moment about likes of floppy.c that
|
|
||||||
* include architecture specific parts. They may want to redefine ins/outs.
|
|
||||||
*
|
|
||||||
* We do not use horrible macros here because we want to
|
|
||||||
* advance pointer by sizeof(size).
|
|
||||||
*/
|
|
||||||
void outsb(unsigned long addr, const void *src, unsigned long count) {
|
|
||||||
while (count) {
|
|
||||||
count -= 1;
|
|
||||||
writeb(*(const char *)src, addr);
|
|
||||||
src += 1;
|
|
||||||
addr += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void outsw(unsigned long addr, const void *src, unsigned long count) {
|
|
||||||
while (count) {
|
|
||||||
count -= 2;
|
|
||||||
writew(*(const short *)src, addr);
|
|
||||||
src += 2;
|
|
||||||
addr += 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void outsl(unsigned long addr, const void *src, unsigned long count) {
|
|
||||||
while (count) {
|
|
||||||
count -= 4;
|
|
||||||
writel(*(const long *)src, addr);
|
|
||||||
src += 4;
|
|
||||||
addr += 4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void insb(unsigned long addr, void *dst, unsigned long count) {
|
|
||||||
while (count) {
|
|
||||||
count -= 1;
|
|
||||||
*(unsigned char *)dst = readb(addr);
|
|
||||||
dst += 1;
|
|
||||||
addr += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void insw(unsigned long addr, void *dst, unsigned long count) {
|
|
||||||
while (count) {
|
|
||||||
count -= 2;
|
|
||||||
*(unsigned short *)dst = readw(addr);
|
|
||||||
dst += 2;
|
|
||||||
addr += 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void insl(unsigned long addr, void *dst, unsigned long count) {
|
|
||||||
while (count) {
|
|
||||||
count -= 4;
|
|
||||||
/*
|
|
||||||
* XXX I am sure we are in for an unaligned trap here.
|
|
||||||
*/
|
|
||||||
*(unsigned long *)dst = readl(addr);
|
|
||||||
dst += 4;
|
|
||||||
addr += 4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user