Commit d93f7de8 authored by Hirokazu Takata's avatar Hirokazu Takata Committed by Linus Torvalds

[PATCH] m32r: bootloader support for OPSPUT platform

This patch supports "m32r-g00ff" bootloader for an OPSPUT platform.

Applying this patch, it is possible to do ATA-boot from an IDE drive or
HTTP-boot from network by m32r-g00ff.

    * arch/m32r/boot/compressed/m32r_sio.c: Fix hangup on OPSPUT at boot.

    * arch/m32r/kernel/io_opsput.c: IDE support for OPSPUT.
    * arch/m32r/kernel/setup_opsput.c: ditto.
    * include/asm-m32r/ide.h: ditto.
Signed-off-by: default avatarKazuhiro Inaoka <inaoka@linux-m32r.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 6b8bd3f4
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
* arch/m32r/boot/compressed/m32r_sio.c * arch/m32r/boot/compressed/m32r_sio.c
* *
* 2003-02-12: Takeo Takahashi * 2003-02-12: Takeo Takahashi
* 2006-11-30: OPSPUT support by Kazuhiro Inaoka
* *
*/ */
...@@ -16,7 +17,7 @@ static int puts(const char *s) ...@@ -16,7 +17,7 @@ static int puts(const char *s)
return 0; return 0;
} }
#if defined(CONFIG_PLAT_M32700UT_Alpha) || defined(CONFIG_PLAT_M32700UT) #if defined(CONFIG_PLAT_M32700UT_Alpha) || defined(CONFIG_PLAT_M32700UT) || defined(CONFIG_PLAT_OPSPUT)
#include <asm/m32r.h> #include <asm/m32r.h>
#include <asm/io.h> #include <asm/io.h>
...@@ -31,7 +32,11 @@ static int puts(const char *s) ...@@ -31,7 +32,11 @@ static int puts(const char *s)
#define BOOT_SIO0TXB (volatile unsigned short *)(0x02c00000 + 0x2000c) #define BOOT_SIO0TXB (volatile unsigned short *)(0x02c00000 + 0x2000c)
#else #else
#undef PLD_BASE #undef PLD_BASE
#if defined(CONFIG_PLAT_OPSPUT)
#define PLD_BASE 0x1cc00000
#else
#define PLD_BASE 0xa4c00000 #define PLD_BASE 0xa4c00000
#endif
#define BOOT_SIO0STS PLD_ESIO0STS #define BOOT_SIO0STS PLD_ESIO0STS
#define BOOT_SIO0TXB PLD_ESIO0TXB #define BOOT_SIO0TXB PLD_ESIO0TXB
#endif #endif
......
...@@ -38,6 +38,26 @@ static inline void *_port2addr(unsigned long port) ...@@ -38,6 +38,26 @@ static inline void *_port2addr(unsigned long port)
return (void *)(port | NONCACHE_OFFSET); return (void *)(port | NONCACHE_OFFSET);
} }
#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 *)(0x0c002000 | NONCACHE_OFFSET);
case 0x1f1: return (void *)(0x0c012800 | NONCACHE_OFFSET);
case 0x1f2: return (void *)(0x0c012002 | NONCACHE_OFFSET);
case 0x1f3: return (void *)(0x0c012802 | NONCACHE_OFFSET);
case 0x1f4: return (void *)(0x0c012004 | NONCACHE_OFFSET);
case 0x1f5: return (void *)(0x0c012804 | NONCACHE_OFFSET);
case 0x1f6: return (void *)(0x0c012006 | NONCACHE_OFFSET);
case 0x1f7: return (void *)(0x0c012806 | NONCACHE_OFFSET);
case 0x3f6: return (void *)(0x0c01200e | NONCACHE_OFFSET);
default: return (void *)&dummy_reg;
}
}
#endif
/* /*
* OPSPUT-LAN is located in the extended bus space * OPSPUT-LAN is located in the extended bus space
* from 0x10000000 to 0x13ffffff on physical address. * from 0x10000000 to 0x13ffffff on physical address.
...@@ -97,6 +117,12 @@ unsigned char _inb(unsigned long port) ...@@ -97,6 +117,12 @@ 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;
...@@ -112,6 +138,11 @@ unsigned short _inw(unsigned long port) ...@@ -112,6 +138,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);
...@@ -164,6 +195,11 @@ void _outb(unsigned char b, unsigned long port) ...@@ -164,6 +195,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);
...@@ -177,6 +213,11 @@ void _outw(unsigned short w, unsigned long port) ...@@ -177,6 +213,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;
...@@ -222,6 +263,14 @@ void _insb(unsigned int port, void *addr, unsigned long count) ...@@ -222,6 +263,14 @@ 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), pcc_ioread_byte(0, port, (void *)addr, sizeof(unsigned char),
...@@ -253,6 +302,12 @@ void _insw(unsigned int port, void *addr, unsigned long count) ...@@ -253,6 +302,12 @@ void _insw(unsigned int port, void *addr, unsigned long count)
} 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), pcc_ioread_word(9, port, (void *)addr, sizeof(unsigned short),
count, 1); 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);
...@@ -280,6 +335,12 @@ void _outsb(unsigned int port, const void *addr, unsigned long count) ...@@ -280,6 +335,12 @@ void _outsb(unsigned int port, const void *addr, unsigned long count)
portp = PORT2ADDR_NE(port); portp = PORT2ADDR_NE(port);
while (count--) while (count--)
_ne_outb(*buf++, portp); _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), pcc_iowrite_byte(0, port, (void *)addr, sizeof(unsigned char),
...@@ -305,6 +366,12 @@ void _outsw(unsigned int port, const void *addr, unsigned long count) ...@@ -305,6 +366,12 @@ void _outsw(unsigned int port, const void *addr, unsigned long count)
portp = PORT2ADDR_NE(port); portp = PORT2ADDR_NE(port);
while (count--) while (count--)
*(volatile unsigned short *)portp = *buf++; *(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), pcc_iowrite_word(9, port, (void *)addr, sizeof(unsigned short),
......
...@@ -218,13 +218,13 @@ static void shutdown_opsput_lanpld_irq(unsigned int irq) ...@@ -218,13 +218,13 @@ static void shutdown_opsput_lanpld_irq(unsigned int irq)
static struct hw_interrupt_type opsput_lanpld_irq_type = static struct hw_interrupt_type opsput_lanpld_irq_type =
{ {
"OPSPUT-PLD-LAN-IRQ", .typename = "OPSPUT-PLD-LAN-IRQ",
startup_opsput_lanpld_irq, .startup = startup_opsput_lanpld_irq,
shutdown_opsput_lanpld_irq, .shutdown = shutdown_opsput_lanpld_irq,
enable_opsput_lanpld_irq, .enable = enable_opsput_lanpld_irq,
disable_opsput_lanpld_irq, .disable = disable_opsput_lanpld_irq,
mask_and_ack_opsput_lanpld, .ack = mask_and_ack_opsput_lanpld,
end_opsput_lanpld_irq .end = end_opsput_lanpld_irq
}; };
/* /*
...@@ -374,7 +374,6 @@ void __init init_IRQ(void) ...@@ -374,7 +374,6 @@ void __init init_IRQ(void)
disable_opsput_pld_irq(PLD_IRQ_SIO0_SND); disable_opsput_pld_irq(PLD_IRQ_SIO0_SND);
#endif /* CONFIG_SERIAL_M32R_PLDSIO */ #endif /* CONFIG_SERIAL_M32R_PLDSIO */
#if defined(CONFIG_M32R_CFC)
/* INT#1: CFC IREQ on PLD */ /* INT#1: CFC IREQ on PLD */
irq_desc[PLD_IRQ_CFIREQ].status = IRQ_DISABLED; irq_desc[PLD_IRQ_CFIREQ].status = IRQ_DISABLED;
irq_desc[PLD_IRQ_CFIREQ].chip = &opsput_pld_irq_type; irq_desc[PLD_IRQ_CFIREQ].chip = &opsput_pld_irq_type;
...@@ -398,8 +397,6 @@ void __init init_IRQ(void) ...@@ -398,8 +397,6 @@ void __init init_IRQ(void)
irq_desc[PLD_IRQ_CFC_EJECT].depth = 1; /* disable nested irq */ irq_desc[PLD_IRQ_CFC_EJECT].depth = 1; /* disable nested irq */
pld_icu_data[irq2pldirq(PLD_IRQ_CFC_EJECT)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD02; /* 'H' edge sense */ pld_icu_data[irq2pldirq(PLD_IRQ_CFC_EJECT)].icucr = PLD_ICUCR_IEN|PLD_ICUCR_ISMOD02; /* 'H' edge sense */
disable_opsput_pld_irq(PLD_IRQ_CFC_EJECT); disable_opsput_pld_irq(PLD_IRQ_CFC_EJECT);
#endif /* CONFIG_M32R_CFC */
/* /*
* INT0# is used for LAN, DIO * INT0# is used for LAN, DIO
......
...@@ -32,7 +32,8 @@ ...@@ -32,7 +32,8 @@
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) || defined(CONFIG_PLAT_MAPPI2) #if defined(CONFIG_PLAT_M32700UT) || defined(CONFIG_PLAT_MAPPI2) \
|| defined(CONFIG_PLAT_OPSPUT)
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