Commit 7b4ac0ae authored by Bartlomiej Zolnierkiewicz's avatar Bartlomiej Zolnierkiewicz Committed by Linus Torvalds

[PATCH] H8/300 IDE support update

From: Yoshinori Sato <ysato@users.sourceforge.jp>

With minor fixes from me
parent 77124e4c
......@@ -41,6 +41,9 @@ ide-core-$(CONFIG_BLK_DEV_MPC8xx_IDE) += ppc/mpc8xx.o
ide-core-$(CONFIG_BLK_DEV_IDE_PMAC) += ppc/pmac.o
ide-core-$(CONFIG_BLK_DEV_IDE_SWARM) += ppc/swarm.o
# built-in only drivers from h8300/
ide-core-$(CONFIG_H8300) += h8300/ide-h8300.o
obj-$(CONFIG_BLK_DEV_IDE) += ide-core.o
obj-$(CONFIG_IDE_GENERIC) += ide-generic.o
......
/*
* drivers/ide/ide-h8300.c
* H8/300 generic IDE interface
*/
#include <linux/init.h>
#include <linux/ide.h>
#include <linux/config.h>
#include <asm/io.h>
#include <asm/irq.h>
#define bswap(d) \
({ \
u16 r; \
__asm__("mov.b %w1,r1h\n\t" \
"mov.b %x1,r1l\n\t" \
"mov.w r1,%0" \
:"=r"(r) \
:"r"(d) \
:"er1"); \
(r); \
})
static void mm_outw(u16 d, unsigned long a)
{
__asm__("mov.b %w0,r2h\n\t"
"mov.b %x0,r2l\n\t"
"mov.w r2,@%1"
:
:"r"(d),"r"(a)
:"er2");
}
static u16 mm_inw(unsigned long a)
{
register u16 r __asm__("er0");
__asm__("mov.w @%1,r2\n\t"
"mov.b r2l,%x0\n\t"
"mov.b r2h,%w0"
:"=r"(r)
:"r"(a)
:"er2");
return r;
}
static void mm_outsw(unsigned long addr, void *buf, u32 len)
{
unsigned short *bp = (unsigned short *)buf;
for (; len > 0; len--, bp++)
*(volatile u16 *)addr = bswap(*bp);
}
static void mm_insw(unsigned long addr, void *buf, u32 len)
{
unsigned short *bp = (unsigned short *)buf;
for (; len > 0; len--, bp++)
*bp = bswap(*(volatile u16 *)addr);
}
#define H8300_IDE_GAP (2)
static inline void hw_setup(hw_regs_t *hw)
{
int i;
memset(hw, 0, sizeof(hw_regs_t));
for (i = 0; i <= IDE_STATUS_OFFSET; i++)
hw->io_ports[i] = CONFIG_H8300_IDE_BASE + H8300_IDE_GAP*i;
hw->io_ports[IDE_CONTROL_OFFSET] = CONFIG_H8300_IDE_ALT;
hw->irq = EXT_IRQ0 + CONFIG_H8300_IDE_IRQ;
hw->dma = NO_DMA;
hw->chipset = ide_generic;
}
static inline void hwif_setup(ide_hwif_t *hwif)
{
default_hwif_iops(hwif);
hwif->mmio = 2;
hwif->OUTW = mm_outw;
hwif->OUTSW = mm_outsw;
hwif->INW = mm_inw;
hwif->INSW = mm_insw;
hwif->OUTL = NULL;
hwif->INL = NULL;
hwif->OUTSL = NULL;
hwif->INSL = NULL;
}
void __init h8300_ide_init(void)
{
hw_regs_t hw;
ide_hwif_t *hwif;
int idx;
if (!request_region(CONFIG_H8300_IDE_BASE, H8300_IDE_GAP*8, "ide-h8300"))
goto out_busy;
if (!request_region(CONFIG_H8300_IDE_ALT, H8300_IDE_GAP, "ide-h8300")) {
release_region(CONFIG_H8300_IDE_BASE, H8300_IDE_GAP*8);
goto out_busy;
}
hw_setup(&hw);
/* register if */
idx = ide_register_hw(&hw, &hwif);
if (idx == -1) {
printk(KERN_ERR "ide-h8300: IDE I/F register failed\n");
return;
}
hwif_setup(hwif);
printk(KERN_INFO "ide%d: H8/300 generic IDE interface\n", idx);
return;
out_busy:
printk(KERN_ERR "ide-h8300: IDE I/F resource already used.\n");
}
......@@ -2054,6 +2054,8 @@ int __init ide_setup (char *s)
return 1;
}
extern void h8300_ide_init(void);
/*
* probe_for_hwifs() finds/initializes "known" IDE interfaces
*/
......@@ -2130,6 +2132,9 @@ static void __init probe_for_hwifs (void)
pnpide_init(1);
}
#endif /* CONFIG_BLK_DEV_IDEPNP */
#ifdef CONFIG_H8300
h8300_ide_init();
#endif
}
/*
......
......@@ -16,23 +16,14 @@
#ifdef __KERNEL__
/****************************************************************************/
void h8300_ide_print_resource(char *name, hw_regs_t *hw);
static __inline__ int ide_default_irq(unsigned long base) { return 0; };
static __inline__ unsigned long ide_default_io_base(int index) { return 0; };
static __inline__ void ide_init_hwif_ports(hw_regs_t *hw, unsigned long data_port,
unsigned long ctrl_port, int *irq)
{
}
#define ide_default_irq(base) (0)
#define ide_default_io_base(index) (0)
#define ide_init_default_irq(base) (0)
#define MAX_HWIFS 1
#define __ide_mm_insw(port,addr,count) do { } while(0)
#define __ide_mm_insl(port,addr,count) do { } while(0)
#define __ide_mm_outsw(port,addr,count) do { } while(0)
#define __ide_mm_outsl(port,addr,count) do { } while(0)
#include <asm-generic/ide_iops.h>
/****************************************************************************/
#endif /* __KERNEL__ */
......
......@@ -309,10 +309,10 @@ static inline void ide_std_init_ports(hw_regs_t *hw,
* ide_init_hwif_ports() is OBSOLETE and will be removed in 2.7 series.
* New ports shouldn't define IDE_ARCH_OBSOLETE_INIT in <asm/ide.h>.
*
* h8300, m68k, m68knommu (broken) and i386-pc9800 (broken)
* m68k, m68knommu (broken) and i386-pc9800 (broken)
* still have their own versions.
*/
#if !defined(CONFIG_H8300) && !defined(CONFIG_M68K)
#ifndef CONFIG_M68K
#ifdef IDE_ARCH_OBSOLETE_INIT
static inline void ide_init_hwif_ports(hw_regs_t *hw,
unsigned long io_addr,
......@@ -337,7 +337,7 @@ static inline void ide_init_hwif_ports(hw_regs_t *hw,
#else
# define ide_init_hwif_ports(hw, io, ctl, irq) do {} while (0)
#endif /* IDE_ARCH_OBSOLETE_INIT */
#endif /* !H8300 && !M68K */
#endif /* !M68K */
/* Currently only m68k, apus and m8xx need it */
#ifndef IDE_ARCH_ACK_INTR
......
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