Commit 5d7aed42 authored by Hirokazu Takata's avatar Hirokazu Takata Committed by Linus Torvalds

[PATCH] m32r: CF boot support for Mappi2

- Update io_mappi2.c to access a CF device as an IDE disk device
  for Mappi2 eva board.

- Please set CONFIG_M32R_CFC=n, when you use m32r-g00ff for CF boot.
Signed-off-by: default avatarNIIBE Yutaka <gniibe@fsij.org>
Signed-off-by: default avatarHirokazu Takata <takata@linux-m32r.org>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent db0f6d35
/* /*
* linux/arch/m32r/kernel/io_mappi.c * linux/arch/m32r/kernel/io_m32700ut.c
* *
* Typical I/O routines for M32700UT board. * Typical I/O routines for M32700UT board.
* *
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <asm/m32r.h> #include <asm/m32r.h>
#include <asm/page.h> #include <asm/page.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/byteorder.h>
#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
#include <linux/types.h> #include <linux/types.h>
...@@ -39,6 +40,27 @@ static __inline__ void *_port2addr(unsigned long port) ...@@ -39,6 +40,27 @@ static __inline__ void *_port2addr(unsigned long port)
#define LAN_IOSTART 0x300 #define LAN_IOSTART 0x300
#define LAN_IOEND 0x320 #define LAN_IOEND 0x320
#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
static __inline__ void *__port2addr_ata(unsigned long port)
{
static int dummy_reg;
switch (port) {
case 0x1f0: return (void *)0xac002000;
case 0x1f1: return (void *)0xac012800;
case 0x1f2: return (void *)0xac012002;
case 0x1f3: return (void *)0xac012802;
case 0x1f4: return (void *)0xac012004;
case 0x1f5: return (void *)0xac012804;
case 0x1f6: return (void *)0xac012006;
case 0x1f7: return (void *)0xac012806;
case 0x3f6: return (void *)0xac01200e;
default: return (void *)&dummy_reg;
}
}
#endif
#ifdef CONFIG_CHIP_OPSP #ifdef CONFIG_CHIP_OPSP
static __inline__ void *_port2addr_ne(unsigned long port) static __inline__ void *_port2addr_ne(unsigned long port)
{ {
...@@ -70,22 +92,13 @@ static __inline__ unsigned char _ne_inb(void *portp) ...@@ -70,22 +92,13 @@ static __inline__ unsigned char _ne_inb(void *portp)
static __inline__ unsigned short _ne_inw(void *portp) static __inline__ unsigned short _ne_inw(void *portp)
{ {
#if 1 /* byte swap */ return (unsigned short)le16_to_cpu(*(volatile unsigned short *)portp);
unsigned short tmp,tmp2;
tmp = *(volatile unsigned short *)portp;
tmp2 = (tmp>>8|tmp<<8);
return tmp2;
#else
return *(volatile unsigned short *)portp;
#endif
} }
static __inline__ void _ne_insb(void *portp, void * addr, unsigned long count) static __inline__ void _ne_insb(void *portp, void * addr, unsigned long count)
{ {
unsigned short tmp;
unsigned char *buf = addr; unsigned char *buf = addr;
tmp = *(volatile unsigned char *)portp;
while (count--) *buf++ = *(volatile unsigned char *)portp; while (count--) *buf++ = *(volatile unsigned char *)portp;
} }
...@@ -96,13 +109,18 @@ static __inline__ void _ne_outb(unsigned char b, void *portp) ...@@ -96,13 +109,18 @@ static __inline__ void _ne_outb(unsigned char b, void *portp)
static __inline__ void _ne_outw(unsigned short w, void *portp) static __inline__ void _ne_outw(unsigned short w, void *portp)
{ {
*(volatile unsigned short *)portp = (w>>8|w<<8); *(volatile unsigned short *)portp = cpu_to_le16(w);
} }
unsigned char _inb(unsigned long port) unsigned char _inb(unsigned long port)
{ {
if (port >= LAN_IOSTART && port < LAN_IOEND) if (port >= LAN_IOSTART && port < LAN_IOEND)
return _ne_inb(PORT2ADDR_NE(port)); return _ne_inb(PORT2ADDR_NE(port));
#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
else if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
return *(volatile unsigned char *)__port2addr_ata(port);
}
#endif
#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
unsigned char b; unsigned char b;
...@@ -118,6 +136,11 @@ unsigned short _inw(unsigned long port) ...@@ -118,6 +136,11 @@ unsigned short _inw(unsigned long port)
{ {
if (port >= LAN_IOSTART && port < LAN_IOEND) if (port >= LAN_IOSTART && port < LAN_IOEND)
return _ne_inw(PORT2ADDR_NE(port)); return _ne_inw(PORT2ADDR_NE(port));
#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
else if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
return *(volatile unsigned short *)__port2addr_ata(port);
}
#endif
#if defined(CONFIG_USB) #if defined(CONFIG_USB)
else if (port >= 0x340 && port < 0x3a0) else if (port >= 0x340 && port < 0x3a0)
return *(volatile unsigned short *)PORT2ADDR_USB(port); return *(volatile unsigned short *)PORT2ADDR_USB(port);
...@@ -149,9 +172,14 @@ unsigned char _inb_p(unsigned long port) ...@@ -149,9 +172,14 @@ unsigned char _inb_p(unsigned long port)
{ {
unsigned char v; unsigned char v;
if (port >= 0x300 && port < 0x320) if (port >= LAN_IOSTART && port < LAN_IOEND)
v = _ne_inb(PORT2ADDR_NE(port)); v = _ne_inb(PORT2ADDR_NE(port));
else else
#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
return *(volatile unsigned char *)__port2addr_ata(port);
} else
#endif
#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
unsigned char b; unsigned char b;
...@@ -169,9 +197,14 @@ unsigned short _inw_p(unsigned long port) ...@@ -169,9 +197,14 @@ unsigned short _inw_p(unsigned long port)
{ {
unsigned short v; unsigned short v;
if (port >= 0x300 && port < 0x320) if (port >= LAN_IOSTART && port < LAN_IOEND)
v = _ne_inw(PORT2ADDR_NE(port)); v = _ne_inw(PORT2ADDR_NE(port));
else else
#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
return *(volatile unsigned short *)__port2addr_ata(port);
} else
#endif
#if defined(CONFIG_USB) #if defined(CONFIG_USB)
if (port >= 0x340 && port < 0x3a0) if (port >= 0x340 && port < 0x3a0)
v = *(volatile unsigned short *)PORT2ADDR_USB(port); v = *(volatile unsigned short *)PORT2ADDR_USB(port);
...@@ -204,6 +237,11 @@ void _outb(unsigned char b, unsigned long port) ...@@ -204,6 +237,11 @@ void _outb(unsigned char b, unsigned long port)
if (port >= LAN_IOSTART && port < LAN_IOEND) if (port >= LAN_IOSTART && port < LAN_IOEND)
_ne_outb(b, PORT2ADDR_NE(port)); _ne_outb(b, PORT2ADDR_NE(port));
else else
#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
*(volatile unsigned char *)__port2addr_ata(port) = b;
} else
#endif
#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
pcc_iowrite_byte(0, port, &b, sizeof(b), 1, 0); pcc_iowrite_byte(0, port, &b, sizeof(b), 1, 0);
...@@ -217,6 +255,11 @@ void _outw(unsigned short w, unsigned long port) ...@@ -217,6 +255,11 @@ void _outw(unsigned short w, unsigned long port)
if (port >= LAN_IOSTART && port < LAN_IOEND) if (port >= LAN_IOSTART && port < LAN_IOEND)
_ne_outw(w, PORT2ADDR_NE(port)); _ne_outw(w, PORT2ADDR_NE(port));
else else
#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
*(volatile unsigned short *)__port2addr_ata(port) = w;
} else
#endif
#if defined(CONFIG_USB) #if defined(CONFIG_USB)
if (port >= 0x340 && port < 0x3a0) if (port >= 0x340 && port < 0x3a0)
*(volatile unsigned short *)PORT2ADDR_USB(port) = w; *(volatile unsigned short *)PORT2ADDR_USB(port) = w;
...@@ -245,6 +288,11 @@ void _outb_p(unsigned char b, unsigned long port) ...@@ -245,6 +288,11 @@ void _outb_p(unsigned char b, unsigned long port)
if (port >= LAN_IOSTART && port < LAN_IOEND) if (port >= LAN_IOSTART && port < LAN_IOEND)
_ne_outb(b, PORT2ADDR_NE(port)); _ne_outb(b, PORT2ADDR_NE(port));
else else
#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
*(volatile unsigned char *)__port2addr_ata(port) = b;
} else
#endif
#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
pcc_iowrite_byte(0, port, &b, sizeof(b), 1, 0); pcc_iowrite_byte(0, port, &b, sizeof(b), 1, 0);
...@@ -260,6 +308,11 @@ void _outw_p(unsigned short w, unsigned long port) ...@@ -260,6 +308,11 @@ void _outw_p(unsigned short w, unsigned long port)
if (port >= LAN_IOSTART && port < LAN_IOEND) if (port >= LAN_IOSTART && port < LAN_IOEND)
_ne_outw(w, PORT2ADDR_NE(port)); _ne_outw(w, PORT2ADDR_NE(port));
else else
#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
*(volatile unsigned short *)__port2addr_ata(port) = w;
} else
#endif
#if defined(CONFIG_USB) #if defined(CONFIG_USB)
if (port >= 0x340 && port < 0x3a0) if (port >= 0x340 && port < 0x3a0)
*(volatile unsigned short *)PORT2ADDR_USB(port) = w; *(volatile unsigned short *)PORT2ADDR_USB(port) = w;
...@@ -285,6 +338,13 @@ void _insb(unsigned int port, void * addr, unsigned long count) ...@@ -285,6 +338,13 @@ void _insb(unsigned int port, void * addr, unsigned long count)
{ {
if (port >= LAN_IOSTART && port < LAN_IOEND) if (port >= LAN_IOSTART && port < LAN_IOEND)
_ne_insb(PORT2ADDR_NE(port), addr, count); _ne_insb(PORT2ADDR_NE(port), addr, count);
#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
else if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
unsigned char *buf = addr;
unsigned char *portp = __port2addr_ata(port);
while(count--) *buf++ = *(volatile unsigned char *)portp;
}
#endif
#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
pcc_ioread_byte(0, port, (void *)addr, sizeof(unsigned char), count, 1); pcc_ioread_byte(0, port, (void *)addr, sizeof(unsigned char), count, 1);
...@@ -302,12 +362,17 @@ void _insw(unsigned int port, void * addr, unsigned long count) ...@@ -302,12 +362,17 @@ void _insw(unsigned int port, void * addr, unsigned long count)
unsigned short *buf = addr; unsigned short *buf = addr;
unsigned short *portp; unsigned short *portp;
if (port >= LAN_IOSTART && port < LAN_IOEND) if (port >= LAN_IOSTART && port < LAN_IOEND) {
portp = PORT2ADDR_NE(port); portp = PORT2ADDR_NE(port);
while (count--) *buf++ = *(volatile unsigned short *)portp; while (count--) *buf++ = *(volatile unsigned short *)portp;
#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
} else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { } else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
pcc_ioread_word(9, port, (void *)addr, sizeof(unsigned short), count, 1); pcc_ioread_word(9, port, (void *)addr, sizeof(unsigned short), count, 1);
#endif
#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
} else if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
portp = __port2addr_ata(port);
while (count--) *buf++ = *(volatile unsigned short *)portp;
#endif #endif
} else { } else {
portp = PORT2ADDR(port); portp = PORT2ADDR(port);
...@@ -329,9 +394,14 @@ void _outsb(unsigned int port, const void * addr, unsigned long count) ...@@ -329,9 +394,14 @@ void _outsb(unsigned int port, const void * addr, unsigned long count)
const unsigned char *buf = addr; const unsigned char *buf = addr;
unsigned char *portp; unsigned char *portp;
if (port >= LAN_IOSTART && port < LAN_IOEND) if (port >= LAN_IOSTART && port < LAN_IOEND) {
portp = PORT2ADDR_NE(port); portp = PORT2ADDR_NE(port);
while (count--) _ne_outb(*buf++, portp); while (count--) _ne_outb(*buf++, portp);
#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
} else if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
portp = __port2addr_ata(port);
while(count--) *(volatile unsigned char *)portp = *buf++;
#endif
#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
} else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { } else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
pcc_iowrite_byte(0, port, (void *)addr, sizeof(unsigned char), count, 1); pcc_iowrite_byte(0, port, (void *)addr, sizeof(unsigned char), count, 1);
...@@ -347,9 +417,14 @@ void _outsw(unsigned int port, const void * addr, unsigned long count) ...@@ -347,9 +417,14 @@ void _outsw(unsigned int port, const void * addr, unsigned long count)
const unsigned short *buf = addr; const unsigned short *buf = addr;
unsigned short *portp; unsigned short *portp;
if (port >= LAN_IOSTART && port < LAN_IOEND) if (port >= LAN_IOSTART && port < LAN_IOEND) {
portp = PORT2ADDR_NE(port); portp = PORT2ADDR_NE(port);
while (count--) *(volatile unsigned short *)portp = *buf++; while (count--) *(volatile unsigned short *)portp = *buf++;
#if defined(CONFIG_IDE) && !defined(CONFIG_M32R_CFC)
} else if ((port >= 0x1f0 && port <=0x1f7) || port == 0x3f6) {
portp = __port2addr_ata(port);
while(count--) *(volatile unsigned short *)portp = *buf++;
#endif
#if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC) #if defined(CONFIG_PCMCIA) && defined(CONFIG_M32R_CFC)
} else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) { } else if (port >= M32R_PCC_IOSTART0 && port <= M32R_PCC_IOEND0) {
pcc_iowrite_word(9, port, (void *)addr, sizeof(unsigned short), count, 1); pcc_iowrite_word(9, port, (void *)addr, sizeof(unsigned short), count, 1);
......
...@@ -151,7 +151,6 @@ void __init init_IRQ(void) ...@@ -151,7 +151,6 @@ void __init init_IRQ(void)
disable_mappi2_irq(M32R_IRQ_INT1); disable_mappi2_irq(M32R_IRQ_INT1);
#endif /* CONFIG_USB */ #endif /* CONFIG_USB */
#if defined(CONFIG_M32R_CFC)
/* ICUCR40: CFC IREQ */ /* ICUCR40: CFC IREQ */
irq_desc[PLD_IRQ_CFIREQ].status = IRQ_DISABLED; irq_desc[PLD_IRQ_CFIREQ].status = IRQ_DISABLED;
irq_desc[PLD_IRQ_CFIREQ].handler = &mappi2_irq_type; irq_desc[PLD_IRQ_CFIREQ].handler = &mappi2_irq_type;
...@@ -161,6 +160,7 @@ void __init init_IRQ(void) ...@@ -161,6 +160,7 @@ void __init init_IRQ(void)
icu_data[PLD_IRQ_CFIREQ].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD01; icu_data[PLD_IRQ_CFIREQ].icucr = M32R_ICUCR_IEN|M32R_ICUCR_ISMOD01;
disable_mappi2_irq(PLD_IRQ_CFIREQ); disable_mappi2_irq(PLD_IRQ_CFIREQ);
#if defined(CONFIG_M32R_CFC)
/* ICUCR41: CFC Insert */ /* ICUCR41: CFC Insert */
irq_desc[PLD_IRQ_CFC_INSERT].status = IRQ_DISABLED; irq_desc[PLD_IRQ_CFC_INSERT].status = IRQ_DISABLED;
irq_desc[PLD_IRQ_CFC_INSERT].handler = &mappi2_irq_type; irq_desc[PLD_IRQ_CFC_INSERT].handler = &mappi2_irq_type;
......
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
static __inline__ int ide_default_irq(unsigned long base) static __inline__ int ide_default_irq(unsigned long base)
{ {
switch (base) { switch (base) {
#if defined(CONFIG_PLAT_M32700UT) #if defined(CONFIG_PLAT_M32700UT) || defined(CONFIG_PLAT_MAPPI2)
case 0x1f0: return PLD_IRQ_CFIREQ; case 0x1f0: return PLD_IRQ_CFIREQ;
default: default:
return 0; return 0;
......
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