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;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								}
							 |