76 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 * 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;
 | 
						|
        }
 | 
						|
}
 |