io.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:3k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  include/asm-s390/io.h
  3.  *
  4.  *  S390 version
  5.  *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
  6.  *    Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com)
  7.  *
  8.  *  Derived from "include/asm-i386/io.h"
  9.  */
  10. #ifndef _S390_IO_H
  11. #define _S390_IO_H
  12. #ifdef __KERNEL__
  13. #include <linux/vmalloc.h>
  14. #include <asm/page.h>
  15. #define IO_SPACE_LIMIT 0xffffffff
  16. #define __io_virt(x)            ((void *)(PAGE_OFFSET | (unsigned long)(x)))
  17. #define __io_phys(x)            ((unsigned long)(x) & ~PAGE_OFFSET)
  18. /*
  19.  * Change virtual addresses to physical addresses and vv.
  20.  * These are pretty trivial
  21.  */
  22. extern inline unsigned long virt_to_phys(volatile void * address)
  23. {
  24. unsigned long real_address;
  25. __asm__ ("   lrag   %0,0(%1)n"
  26.                  "   jz     0fn"
  27.                  "   slgr   %0,%0n"
  28.                  "0:"
  29.                  : "=a" (real_address) : "a" (address) : "cc" );
  30.         return real_address;
  31. }
  32. extern inline void * phys_to_virt(unsigned long address)
  33. {
  34.         return __io_virt(address);
  35. }
  36. extern void * __ioremap(unsigned long offset, unsigned long size, unsigned long flags);
  37. extern inline void * ioremap (unsigned long offset, unsigned long size)
  38. {
  39.         return __ioremap(offset, size, 0);
  40. }
  41. /*
  42.  * This one maps high address device memory and turns off caching for that area.
  43.  * it's useful if some control registers are in such an area and write combining
  44.  * or read caching is not desirable:
  45.  */
  46. extern inline void * ioremap_nocache (unsigned long offset, unsigned long size)
  47. {
  48.         return __ioremap(offset, size, 0);
  49. }
  50. extern void iounmap(void *addr);
  51. /*
  52.  * IO bus memory addresses are also 1:1 with the physical address
  53.  */
  54. #define virt_to_bus virt_to_phys
  55. #define bus_to_virt phys_to_virt
  56. /*
  57.  * readX/writeX() are used to access memory mapped devices. On some
  58.  * architectures the memory mapped IO stuff needs to be accessed
  59.  * differently.
  60.  */
  61. #define readb(addr) (*(volatile unsigned char *) __io_virt(addr))
  62. #define readw(addr) (*(volatile unsigned short *) __io_virt(addr))
  63. #define readl(addr) (*(volatile unsigned int *) __io_virt(addr))
  64. #define writeb(b,addr) (*(volatile unsigned char *) __io_virt(addr) = (b))
  65. #define writew(b,addr) (*(volatile unsigned short *) __io_virt(addr) = (b))
  66. #define writel(b,addr) (*(volatile unsigned int *) __io_virt(addr) = (b))
  67. #define memset_io(a,b,c)        memset(__io_virt(a),(b),(c))
  68. #define memcpy_fromio(a,b,c)    memcpy((a),__io_virt(b),(c))
  69. #define memcpy_toio(a,b,c)      memcpy(__io_virt(a),(b),(c))
  70. #define inb_p(addr) readb(addr)
  71. #define inb(addr) readb(addr)
  72. #define outb(x,addr) ((void) writeb(x,addr))
  73. #define outb_p(x,addr) outb(x,addr)
  74. #endif /* __KERNEL__ */
  75. #endif