Commit 13bea95f authored by Yoshinori Sato's avatar Yoshinori Sato Committed by Linus Torvalds

[PATCH] H8/300 new ide driver support

- new config items
- interface setup
- io cleanup
parent b4625576
# uClinux H8/300 Target Board Selection Menu (IDE) # uClinux H8/300 Target Board Selection Menu (IDE)
if (H8300H_AKI3068NET)
menu "IDE Extra configuration" menu "IDE Extra configuration"
config H8300_IDE_BASE config H8300_IDE_BASE
hex "IDE regitser base address" hex "IDE register base address"
depends on IDE depends on IDE
default 0
help help
IDE registers base address IDE registers base address
config H8300_IDE_ALT config H8300_IDE_ALT
hex "IDE regitser alternate address" hex "IDE register alternate address"
depends on IDE depends on IDE
default 0
help help
IDE alternate registers address IDE alternate registers address
config H8300_IDE_IRQ config H8300_IDE_IRQ
int "IDE IRQ no" int "IDE IRQ no"
depends on IDE depends on IDE
default 0
help help
IDE I/F using IRQ no IDE use IRQ no
endmenu endmenu
endif
if (H8300H_H8MAX)
config H8300_IDE_BASE
hex
depends on IDE
default 0x200000
config H8300_IDE_ALT
hex
depends on IDE
default 0x60000c
config H8300_IDE_IRQ
int
depends on IDE
default 5
endif
...@@ -40,16 +40,12 @@ ...@@ -40,16 +40,12 @@
#if defined(__H8300H__) #if defined(__H8300H__)
#define CPU "H8/300H" #define CPU "H8/300H"
#include <asm/regs306x.h>
#endif #endif
#if defined(__H8300S__) #if defined(__H8300S__)
#define CPU "H8S" #define CPU "H8S"
#endif #include <asm/regs267x.h>
#if defined(CONFIG_INTELFLASH)
#define BLKOFFSET 512
#else
#define BLKOFFSET 0
#endif #endif
#define STUBSIZE 0xc000; #define STUBSIZE 0xc000;
...@@ -58,8 +54,6 @@ unsigned long rom_length; ...@@ -58,8 +54,6 @@ unsigned long rom_length;
unsigned long memory_start; unsigned long memory_start;
unsigned long memory_end; unsigned long memory_end;
struct task_struct *_current_task;
char command_line[512]; char command_line[512];
char saved_command_line[512]; char saved_command_line[512];
...@@ -107,12 +101,11 @@ void __init setup_arch(char **cmdline_p) ...@@ -107,12 +101,11 @@ void __init setup_arch(char **cmdline_p)
memory_start = (unsigned long) &_ramstart; memory_start = (unsigned long) &_ramstart;
/* allow for ROMFS on the end of the kernel */ /* allow for ROMFS on the end of the kernel */
if (memcmp((void *)(memory_start + BLKOFFSET), "-rom1fs-", 8) == 0) { if (memcmp((void *)memory_start, "-rom1fs-", 8) == 0) {
#if defined(CONFIG_BLK_DEV_INITRD) #if defined(CONFIG_BLK_DEV_INITRD)
initrd_start = memory_start += BLKOFFSET; initrd_start = memory_start;
initrd_end = memory_start += be32_to_cpu(((unsigned long *) (memory_start))[2]); initrd_end = memory_start += be32_to_cpu(((unsigned long *) (memory_start))[2]);
#else #else
memory_start += BLKOFFSET;
memory_start += be32_to_cpu(((unsigned long *) memory_start)[2]); memory_start += be32_to_cpu(((unsigned long *) memory_start)[2]);
#endif #endif
} }
...@@ -190,6 +183,16 @@ void __init setup_arch(char **cmdline_p) ...@@ -190,6 +183,16 @@ void __init setup_arch(char **cmdline_p)
*/ */
paging_init(); paging_init();
h8300_gpio_init(); h8300_gpio_init();
#if defined(CONFIG_H8300_AKI3068NET) && defined(CONFIG_IDE)
{
#define AREABIT(addr) (1 << (((addr) >> 21) & 7))
/* setup BSC */
volatile unsigned char *abwcr = (volatile unsigned char *)ABWCR;
volatile unsigned char *cscr = (volatile unsigned char *)CSCR;
*abwcr &= ~(AREABIT(CONFIG_H8300_IDE_BASE) | AREABIT(CONFIG_H8300_IDE_ALT));
*cscr |= (AREABIT(CONFIG_H8300_IDE_BASE) | AREABIT(CONFIG_H8300_IDE_ALT)) | 0x0f;
}
#endif
#ifdef DEBUG #ifdef DEBUG
printk(KERN_DEBUG "Done setup_arch\n"); printk(KERN_DEBUG "Done setup_arch\n");
#endif #endif
......
...@@ -33,21 +33,29 @@ ...@@ -33,21 +33,29 @@
* swap functions are sometimes needed to interface little-endian hardware * swap functions are sometimes needed to interface little-endian hardware
*/ */
/*
* CHANGES
*
* 020325 Added some #define's for the COBRA5272 board
* (hede)
*/
static inline unsigned short _swapw(volatile unsigned short v) static inline unsigned short _swapw(volatile unsigned short v)
{ {
return ((v << 8) | (v >> 8)); unsigned short r,t;
__asm__("mov.b %w2,%x1\n\t"
"mov.b %x2,%w1\n\t"
"mov.w %1,%0"
:"=r"(r),"=r"(t)
:"r"(v));
return r;
} }
static inline unsigned int _swapl(volatile unsigned long v) static inline unsigned int _swapl(volatile unsigned long v)
{ {
return ((v << 24) | ((v & 0xff00) << 8) | ((v & 0xff0000) >> 8) | (v >> 24)); unsigned int r,t;
__asm__("mov.b %w2,%x1\n\t"
"mov.b %x2,%w1\n\t"
"mov.w %f1,%e0\n\t"
"mov.w %e2,%f1\n\t"
"mov.b %w1,%x0\n\t"
"mov.b %x1,%w0"
:"=r"(r),"=r"(t)
:"r"(v));
return r;
} }
#define readb(addr) \ #define readb(addr) \
...@@ -96,7 +104,7 @@ static inline void io_outsw(unsigned int addr, const void *buf, int len) ...@@ -96,7 +104,7 @@ static inline void io_outsw(unsigned int addr, const void *buf, int len)
volatile unsigned short *ap = (volatile unsigned short *) addr; volatile unsigned short *ap = (volatile unsigned short *) addr;
unsigned short *bp = (unsigned short *) buf; unsigned short *bp = (unsigned short *) buf;
while (len--) while (len--)
*ap = *bp++; *ap = _swapw(*bp++);
} }
static inline void io_outsl(unsigned int addr, const void *buf, int len) static inline void io_outsl(unsigned int addr, const void *buf, int len)
...@@ -104,7 +112,7 @@ static inline void io_outsl(unsigned int addr, const void *buf, int len) ...@@ -104,7 +112,7 @@ static inline void io_outsl(unsigned int addr, const void *buf, int len)
volatile unsigned int *ap = (volatile unsigned int *) addr; volatile unsigned int *ap = (volatile unsigned int *) addr;
unsigned long *bp = (unsigned long *) buf; unsigned long *bp = (unsigned long *) buf;
while (len--) while (len--)
*ap = *bp++; *ap = _swapl(*bp++);
} }
static inline void io_insb(unsigned int addr, void *buf, int len) static inline void io_insb(unsigned int addr, void *buf, int len)
...@@ -129,7 +137,7 @@ static inline void io_insw(unsigned int addr, void *buf, int len) ...@@ -129,7 +137,7 @@ static inline void io_insw(unsigned int addr, void *buf, int len)
volatile unsigned short *ap = (volatile unsigned short *) addr; volatile unsigned short *ap = (volatile unsigned short *) addr;
unsigned short *bp = (unsigned short *) buf; unsigned short *bp = (unsigned short *) buf;
while (len--) while (len--)
*bp++ = *ap; *bp++ = _swapw(*ap);
} }
static inline void io_insl(unsigned int addr, void *buf, int len) static inline void io_insl(unsigned int addr, void *buf, int len)
...@@ -137,7 +145,7 @@ static inline void io_insl(unsigned int addr, void *buf, int len) ...@@ -137,7 +145,7 @@ static inline void io_insl(unsigned int addr, void *buf, int len)
volatile unsigned int *ap = (volatile unsigned int *) addr; volatile unsigned int *ap = (volatile unsigned int *) addr;
unsigned long *bp = (unsigned long *) buf; unsigned long *bp = (unsigned long *) buf;
while (len--) while (len--)
*bp++ = *ap; *bp++ = _swapl(*ap);
} }
/* /*
......
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