Commit 51df9f1c authored by Geert Uytterhoeven's avatar Geert Uytterhoeven Committed by Linus Torvalds

[PATCH] M68k raw I/O updates

M68k raw I/O updates:
  - Convert raw I/O access macros to inline functions:
      o raw_{in,out}s[bw]()
      o raw_{in,out}sw_swapw()
  - Add raw_{in,out}sl() (needed for IDE)
  - Update isa_[im]t_[bw]() for stricter type checking of inline functions
parent b055ca93
...@@ -120,66 +120,66 @@ extern int isa_sex; ...@@ -120,66 +120,66 @@ extern int isa_sex;
* be compiled in so the case statement will be optimised away * be compiled in so the case statement will be optimised away
*/ */
static inline unsigned long isa_itb(long addr) static inline unsigned char *isa_itb(long addr)
{ {
switch(ISA_TYPE) switch(ISA_TYPE)
{ {
#ifdef CONFIG_Q40 #ifdef CONFIG_Q40
case Q40_ISA: return Q40_ISA_IO_B(addr); case Q40_ISA: return (unsigned char *)Q40_ISA_IO_B(addr);
#endif #endif
#ifdef CONFIG_GG2 #ifdef CONFIG_GG2
case GG2_ISA: return GG2_ISA_IO_B(addr); case GG2_ISA: return (unsigned char *)GG2_ISA_IO_B(addr);
#endif #endif
#ifdef CONFIG_AMIGA_PCMCIA #ifdef CONFIG_AMIGA_PCMCIA
case AG_ISA: return AG_ISA_IO_B(addr); case AG_ISA: return (unsigned char *)AG_ISA_IO_B(addr);
#endif #endif
default: return 0; /* avoid warnings, just in case */ default: return 0; /* avoid warnings, just in case */
} }
} }
static inline unsigned long isa_itw(long addr) static inline unsigned short *isa_itw(long addr)
{ {
switch(ISA_TYPE) switch(ISA_TYPE)
{ {
#ifdef CONFIG_Q40 #ifdef CONFIG_Q40
case Q40_ISA: return Q40_ISA_IO_W(addr); case Q40_ISA: return (unsigned short *)Q40_ISA_IO_W(addr);
#endif #endif
#ifdef CONFIG_GG2 #ifdef CONFIG_GG2
case GG2_ISA: return GG2_ISA_IO_W(addr); case GG2_ISA: return (unsigned short *)GG2_ISA_IO_W(addr);
#endif #endif
#ifdef CONFIG_AMIGA_PCMCIA #ifdef CONFIG_AMIGA_PCMCIA
case AG_ISA: return AG_ISA_IO_W(addr); case AG_ISA: return (unsigned short *)AG_ISA_IO_W(addr);
#endif #endif
default: return 0; /* avoid warnings, just in case */ default: return 0; /* avoid warnings, just in case */
} }
} }
static inline unsigned long isa_mtb(long addr) static inline unsigned char *isa_mtb(long addr)
{ {
switch(ISA_TYPE) switch(ISA_TYPE)
{ {
#ifdef CONFIG_Q40 #ifdef CONFIG_Q40
case Q40_ISA: return Q40_ISA_MEM_B(addr); case Q40_ISA: return (unsigned char *)Q40_ISA_MEM_B(addr);
#endif #endif
#ifdef CONFIG_GG2 #ifdef CONFIG_GG2
case GG2_ISA: return GG2_ISA_MEM_B(addr); case GG2_ISA: return (unsigned char *)GG2_ISA_MEM_B(addr);
#endif #endif
#ifdef CONFIG_AMIGA_PCMCIA #ifdef CONFIG_AMIGA_PCMCIA
case AG_ISA: return addr; case AG_ISA: return (unsigned char *)addr;
#endif #endif
default: return 0; /* avoid warnings, just in case */ default: return 0; /* avoid warnings, just in case */
} }
} }
static inline unsigned long isa_mtw(long addr) static inline unsigned short *isa_mtw(long addr)
{ {
switch(ISA_TYPE) switch(ISA_TYPE)
{ {
#ifdef CONFIG_Q40 #ifdef CONFIG_Q40
case Q40_ISA: return Q40_ISA_MEM_W(addr); case Q40_ISA: return (unsigned short *)Q40_ISA_MEM_W(addr);
#endif #endif
#ifdef CONFIG_GG2 #ifdef CONFIG_GG2
case GG2_ISA: return GG2_ISA_MEM_W(addr); case GG2_ISA: return (unsigned short *)GG2_ISA_MEM_W(addr);
#endif #endif
#ifdef CONFIG_AMIGA_PCMCIA #ifdef CONFIG_AMIGA_PCMCIA
case AG_ISA: return addr; case AG_ISA: return (unsigned short *)addr;
#endif #endif
default: return 0; /* avoid warnings, just in case */ default: return 0; /* avoid warnings, just in case */
} }
......
...@@ -52,208 +52,290 @@ extern void __iounmap(void *addr, unsigned long size); ...@@ -52,208 +52,290 @@ extern void __iounmap(void *addr, unsigned long size);
#define raw_outw(val,port) out_be16((port),(val)) #define raw_outw(val,port) out_be16((port),(val))
#define raw_outl(val,port) out_be32((port),(val)) #define raw_outl(val,port) out_be32((port),(val))
#define raw_insb(port, buf, len) ({ \ static inline void raw_insb(volatile unsigned char *port, unsigned char *buf,
volatile unsigned char *_port = (volatile unsigned char *) (port); \ unsigned int len)
unsigned char *_buf =(unsigned char *)(buf); \ {
unsigned int _i,_len=(unsigned int)(len); \ unsigned int i;
for(_i=0; _i< _len; _i++) \
*_buf++=in_8(_port); \
})
#define raw_outsb(port, buf, len) ({ \ for (i = 0; i < len; i++)
volatile unsigned char *_port = (volatile unsigned char *) (port); \ *buf++ = in_8(port);
unsigned char *_buf =(unsigned char *)(buf); \ }
unsigned int _i,_len=(unsigned int)(len); \
for( _i=0; _i< _len; _i++) \
out_8(_port,*_buf++); \
})
static inline void raw_outsb(volatile unsigned char *port,
const unsigned char *buf, unsigned int len)
{
unsigned int i;
#define raw_insw(port, buf, nr) ({ \ for (i = 0; i < len; i++)
volatile unsigned char *_port = (volatile unsigned char *) (port); \ out_8(port, *buf++);
unsigned char *_buf = (unsigned char *)(buf); \ }
unsigned int _nr = (unsigned int)(nr); \
unsigned long _tmp; \
\
if (_nr & 15) { \
_tmp = (_nr & 15) - 1; \
asm volatile ( \
"1: movew %2@,%0@+; dbra %1,1b" \
: "=a" (_buf), "=d" (_tmp) \
: "a" (_port), "0" (_buf), \
"1" (_tmp)); \
} \
if (_nr >> 4) { \
_tmp = (_nr >> 4) - 1; \
asm volatile ( \
"1: " \
"movew %2@,%0@+; " \
"movew %2@,%0@+; " \
"movew %2@,%0@+; " \
"movew %2@,%0@+; " \
"movew %2@,%0@+; " \
"movew %2@,%0@+; " \
"movew %2@,%0@+; " \
"movew %2@,%0@+; " \
"movew %2@,%0@+; " \
"movew %2@,%0@+; " \
"movew %2@,%0@+; " \
"movew %2@,%0@+; " \
"movew %2@,%0@+; " \
"movew %2@,%0@+; " \
"movew %2@,%0@+; " \
"movew %2@,%0@+; " \
"dbra %1,1b" \
: "=a" (_buf), "=d" (_tmp) \
: "a" (_port), "0" (_buf), \
"1" (_tmp)); \
} \
})
#define raw_outsw(port, buf, nr) ({ \ static inline void raw_insw(volatile unsigned short *port, unsigned short *buf,
volatile unsigned char *_port = (volatile unsigned char *) (port); \ unsigned int nr)
unsigned char *_buf = (unsigned char *)(buf); \ {
unsigned int _nr = (unsigned int)(nr); \ unsigned int tmp;
unsigned long _tmp; \
\
if (_nr & 15) { \
_tmp = (_nr & 15) - 1; \
asm volatile ( \
"1: movew %0@+,%2@; dbra %1,1b" \
: "=a" (_buf), "=d" (_tmp) \
: "a" (_port), "0" (_buf), \
"1" (_tmp)); \
} \
if (_nr >> 4) { \
_tmp = (_nr >> 4) - 1; \
asm volatile ( \
"1: " \
"movew %0@+,%2@; " \
"movew %0@+,%2@; " \
"movew %0@+,%2@; " \
"movew %0@+,%2@; " \
"movew %0@+,%2@; " \
"movew %0@+,%2@; " \
"movew %0@+,%2@; " \
"movew %0@+,%2@; " \
"movew %0@+,%2@; " \
"movew %0@+,%2@; " \
"movew %0@+,%2@; " \
"movew %0@+,%2@; " \
"movew %0@+,%2@; " \
"movew %0@+,%2@; " \
"movew %0@+,%2@; " \
"movew %0@+,%2@; " \
"dbra %1,1b" \
: "=a" (_buf), "=d" (_tmp) \
: "a" (_port), "0" (_buf), \
"1" (_tmp)); \
} \
})
if (nr & 15) {
tmp = (nr & 15) - 1;
asm volatile (
"1: movew %2@,%0@+; dbra %1,1b"
: "=a" (buf), "=d" (tmp)
: "a" (port), "0" (buf),
"1" (tmp));
}
if (nr >> 4) {
tmp = (nr >> 4) - 1;
asm volatile (
"1: "
"movew %2@,%0@+; "
"movew %2@,%0@+; "
"movew %2@,%0@+; "
"movew %2@,%0@+; "
"movew %2@,%0@+; "
"movew %2@,%0@+; "
"movew %2@,%0@+; "
"movew %2@,%0@+; "
"movew %2@,%0@+; "
"movew %2@,%0@+; "
"movew %2@,%0@+; "
"movew %2@,%0@+; "
"movew %2@,%0@+; "
"movew %2@,%0@+; "
"movew %2@,%0@+; "
"movew %2@,%0@+; "
"dbra %1,1b"
: "=a" (buf), "=d" (tmp)
: "a" (port), "0" (buf),
"1" (tmp));
}
}
#define raw_insw_swapw(port, buf, nr) \ static inline void raw_outsw(volatile unsigned short *port,
({ if ((nr) % 8) \ const unsigned short *buf, unsigned int nr)
__asm__ __volatile__ \ {
("movel %0,%/a0; \ unsigned int tmp;
movel %1,%/a1; \
movel %2,%/d6; \
subql #1,%/d6; \
1:movew %/a0@,%/d0; \
rolw #8,%/d0; \
movew %/d0,%/a1@+; \
dbra %/d6,1b" \
: \
: "g" (port), "g" (buf), "g" (nr) \
: "d0", "a0", "a1", "d6"); \
else \
__asm__ __volatile__ \
("movel %0,%/a0; \
movel %1,%/a1; \
movel %2,%/d6; \
lsrl #3,%/d6; \
subql #1,%/d6; \
1:movew %/a0@,%/d0; \
rolw #8,%/d0; \
movew %/d0,%/a1@+; \
movew %/a0@,%/d0; \
rolw #8,%/d0; \
movew %/d0,%/a1@+; \
movew %/a0@,%/d0; \
rolw #8,%/d0; \
movew %/d0,%/a1@+; \
movew %/a0@,%/d0; \
rolw #8,%/d0; \
movew %/d0,%/a1@+; \
movew %/a0@,%/d0; \
rolw #8,%/d0; \
movew %/d0,%/a1@+; \
movew %/a0@,%/d0; \
rolw #8,%/d0; \
movew %/d0,%/a1@+; \
movew %/a0@,%/d0; \
rolw #8,%/d0; \
movew %/d0,%/a1@+; \
movew %/a0@,%/d0; \
rolw #8,%/d0; \
movew %/d0,%/a1@+; \
dbra %/d6,1b" \
: \
: "g" (port), "g" (buf), "g" (nr) \
: "d0", "a0", "a1", "d6"); \
})
if (nr & 15) {
tmp = (nr & 15) - 1;
asm volatile (
"1: movew %0@+,%2@; dbra %1,1b"
: "=a" (buf), "=d" (tmp)
: "a" (port), "0" (buf),
"1" (tmp));
}
if (nr >> 4) {
tmp = (nr >> 4) - 1;
asm volatile (
"1: "
"movew %0@+,%2@; "
"movew %0@+,%2@; "
"movew %0@+,%2@; "
"movew %0@+,%2@; "
"movew %0@+,%2@; "
"movew %0@+,%2@; "
"movew %0@+,%2@; "
"movew %0@+,%2@; "
"movew %0@+,%2@; "
"movew %0@+,%2@; "
"movew %0@+,%2@; "
"movew %0@+,%2@; "
"movew %0@+,%2@; "
"movew %0@+,%2@; "
"movew %0@+,%2@; "
"movew %0@+,%2@; "
"dbra %1,1b"
: "=a" (buf), "=d" (tmp)
: "a" (port), "0" (buf),
"1" (tmp));
}
}
#define raw_outsw_swapw(port, buf, nr) \ static inline void raw_insl(volatile unsigned int *port, unsigned int *buf,
({ if ((nr) % 8) \ unsigned int nr)
__asm__ __volatile__ \ {
("movel %0,%/a0; \ unsigned int tmp;
movel %1,%/a1; \
movel %2,%/d6; \ if (nr & 15) {
subql #1,%/d6; \ tmp = (nr & 15) - 1;
1:movew %/a1@+,%/d0; \ asm volatile (
rolw #8,%/d0; \ "1: movel %2@,%0@+; dbra %1,1b"
movew %/d0,%/a0@; \ : "=a" (buf), "=d" (tmp)
dbra %/d6,1b" \ : "a" (port), "0" (buf),
: \ "1" (tmp));
: "g" (port), "g" (buf), "g" (nr) \ }
: "d0", "a0", "a1", "d6"); \ if (nr >> 4) {
else \ tmp = (nr >> 4) - 1;
__asm__ __volatile__ \ asm volatile (
("movel %0,%/a0; \ "1: "
movel %1,%/a1; \ "movel %2@,%0@+; "
movel %2,%/d6; \ "movel %2@,%0@+; "
lsrl #3,%/d6; \ "movel %2@,%0@+; "
subql #1,%/d6; \ "movel %2@,%0@+; "
1:movew %/a1@+,%/d0; \ "movel %2@,%0@+; "
rolw #8,%/d0; \ "movel %2@,%0@+; "
movew %/d0,%/a0@; \ "movel %2@,%0@+; "
movew %/a1@+,%/d0; \ "movel %2@,%0@+; "
rolw #8,%/d0; \ "movel %2@,%0@+; "
movew %/d0,%/a0@; \ "movel %2@,%0@+; "
movew %/a1@+,%/d0; \ "movel %2@,%0@+; "
rolw #8,%/d0; \ "movel %2@,%0@+; "
movew %/d0,%/a0@; \ "movel %2@,%0@+; "
movew %/a1@+,%/d0; \ "movel %2@,%0@+; "
rolw #8,%/d0; \ "movel %2@,%0@+; "
movew %/d0,%/a0@; \ "movel %2@,%0@+; "
movew %/a1@+,%/d0; \ "dbra %1,1b"
rolw #8,%/d0; \ : "=a" (buf), "=d" (tmp)
movew %/d0,%/a0@; \ : "a" (port), "0" (buf),
movew %/a1@+,%/d0; \ "1" (tmp));
rolw #8,%/d0; \ }
movew %/d0,%/a0@; \ }
movew %/a1@+,%/d0; \
rolw #8,%/d0; \ static inline void raw_outsl(volatile unsigned int *port,
movew %/d0,%/a0@; \ const unsigned int *buf, unsigned int nr)
movew %/a1@+,%/d0; \ {
rolw #8,%/d0; \ unsigned int tmp;
movew %/d0,%/a0@; \
dbra %/d6,1b" \ if (nr & 15) {
: \ tmp = (nr & 15) - 1;
: "g" (port), "g" (buf), "g" (nr) \ asm volatile (
: "d0", "a0", "a1", "d6"); \ "1: movel %0@+,%2@; dbra %1,1b"
}) : "=a" (buf), "=d" (tmp)
: "a" (port), "0" (buf),
"1" (tmp));
}
if (nr >> 4) {
tmp = (nr >> 4) - 1;
asm volatile (
"1: "
"movel %0@+,%2@; "
"movel %0@+,%2@; "
"movel %0@+,%2@; "
"movel %0@+,%2@; "
"movel %0@+,%2@; "
"movel %0@+,%2@; "
"movel %0@+,%2@; "
"movel %0@+,%2@; "
"movel %0@+,%2@; "
"movel %0@+,%2@; "
"movel %0@+,%2@; "
"movel %0@+,%2@; "
"movel %0@+,%2@; "
"movel %0@+,%2@; "
"movel %0@+,%2@; "
"movel %0@+,%2@; "
"dbra %1,1b"
: "=a" (buf), "=d" (tmp)
: "a" (port), "0" (buf),
"1" (tmp));
}
}
static inline void raw_insw_swapw(volatile unsigned short *port,
unsigned short *buf, unsigned int nr)
{
if ((nr) % 8)
__asm__ __volatile__
("\tmovel %0,%/a0\n\t"
"movel %1,%/a1\n\t"
"movel %2,%/d6\n\t"
"subql #1,%/d6\n"
"1:\tmovew %/a0@,%/d0\n\t"
"rolw #8,%/d0\n\t"
"movew %/d0,%/a1@+\n\t"
"dbra %/d6,1b"
:
: "g" (port), "g" (buf), "g" (nr)
: "d0", "a0", "a1", "d6");
else
__asm__ __volatile__
("movel %0,%/a0\n\t"
"movel %1,%/a1\n\t"
"movel %2,%/d6\n\t"
"lsrl #3,%/d6\n\t"
"subql #1,%/d6\n"
"1:\tmovew %/a0@,%/d0\n\t"
"rolw #8,%/d0\n\t"
"movew %/d0,%/a1@+\n\t"
"movew %/a0@,%/d0\n\t"
"rolw #8,%/d0\n\t"
"movew %/d0,%/a1@+\n\t"
"movew %/a0@,%/d0\n\t"
"rolw #8,%/d0\n\t"
"movew %/d0,%/a1@+\n\t"
"movew %/a0@,%/d0\n\t"
"rolw #8,%/d0\n\t"
"movew %/d0,%/a1@+\n\t"
"movew %/a0@,%/d0\n\t"
"rolw #8,%/d0\n\t"
"movew %/d0,%/a1@+\n\t"
"movew %/a0@,%/d0\n\t"
"rolw #8,%/d0\n\t"
"movew %/d0,%/a1@+\n\t"
"movew %/a0@,%/d0\n\t"
"rolw #8,%/d0\n\t"
"movew %/d0,%/a1@+\n\t"
"movew %/a0@,%/d0\n\t"
"rolw #8,%/d0\n\t"
"movew %/d0,%/a1@+\n\t"
"dbra %/d6,1b"
:
: "g" (port), "g" (buf), "g" (nr)
: "d0", "a0", "a1", "d6");
}
static inline void raw_outsw_swapw(volatile unsigned short *port,
const unsigned short *buf, unsigned int nr)
{
if ((nr) % 8)
__asm__ __volatile__
("movel %0,%/a0\n\t"
"movel %1,%/a1\n\t"
"movel %2,%/d6\n\t"
"subql #1,%/d6\n"
"1:\tmovew %/a1@+,%/d0\n\t"
"rolw #8,%/d0\n\t"
"movew %/d0,%/a0@\n\t"
"dbra %/d6,1b"
:
: "g" (port), "g" (buf), "g" (nr)
: "d0", "a0", "a1", "d6");
else
__asm__ __volatile__
("movel %0,%/a0\n\t"
"movel %1,%/a1\n\t"
"movel %2,%/d6\n\t"
"lsrl #3,%/d6\n\t"
"subql #1,%/d6\n"
"1:\tmovew %/a1@+,%/d0\n\t"
"rolw #8,%/d0\n\t"
"movew %/d0,%/a0@\n\t"
"movew %/a1@+,%/d0\n\t"
"rolw #8,%/d0\n\t"
"movew %/d0,%/a0@\n\t"
"movew %/a1@+,%/d0\n\t"
"rolw #8,%/d0\n\t"
"movew %/d0,%/a0@\n\t"
"movew %/a1@+,%/d0\n\t"
"rolw #8,%/d0\n\t"
"movew %/d0,%/a0@\n\t"
"movew %/a1@+,%/d0\n\t"
"rolw #8,%/d0\n\t"
"movew %/d0,%/a0@\n\t"
"movew %/a1@+,%/d0\n\t"
"rolw #8,%/d0\n\t"
"movew %/d0,%/a0@\n\t"
"movew %/a1@+,%/d0\n\t"
"rolw #8,%/d0\n\t"
"movew %/d0,%/a0@\n\t"
"movew %/a1@+,%/d0\n\t"
"rolw #8,%/d0\n\t"
"movew %/d0,%/a0@\n\t"
"dbra %/d6,1b"
:
: "g" (port), "g" (buf), "g" (nr)
: "d0", "a0", "a1", "d6");
}
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment