Commit 8ae7d0bf authored by Alan Cox's avatar Alan Cox Committed by Linus Torvalds

[PATCH] clean up the IDE iops, add ones for a dead iface

Also adds the new OUTBSYNC iop
parent 97dbe09f
...@@ -31,60 +31,129 @@ ...@@ -31,60 +31,129 @@
#include <asm/io.h> #include <asm/io.h>
#include <asm/bitops.h> #include <asm/bitops.h>
/*
* IDE operator we assign to an unplugged device so that
* we don't trash new hardware assigned the same resources
*/
static u8 ide_unplugged_inb (unsigned long port)
{
return 0xFF;
}
static u16 ide_unplugged_inw (unsigned long port)
{
return 0xFFFF;
}
static void ide_unplugged_insw (unsigned long port, void *addr, u32 count)
{
}
static u32 ide_unplugged_inl (unsigned long port)
{
return 0xFFFFFFFF;
}
static void ide_unplugged_insl (unsigned long port, void *addr, u32 count)
{
}
static void ide_unplugged_outb (u8 addr, unsigned long port)
{
}
static void ide_unplugged_outw (u16 addr, unsigned long port)
{
}
static u8 ide_inb (ide_ioreg_t port) static void ide_unplugged_outsw (unsigned long port, void *addr, u32 count)
{
}
static void ide_unplugged_outl (u32 addr, unsigned long port)
{
}
static void ide_unplugged_outsl (unsigned long port, void *addr, u32 count)
{
}
void unplugged_hwif_iops (ide_hwif_t *hwif)
{
hwif->OUTB = ide_unplugged_outb;
hwif->OUTBSYNC = ide_unplugged_outb;
hwif->OUTW = ide_unplugged_outw;
hwif->OUTL = ide_unplugged_outl;
hwif->OUTSW = ide_unplugged_outsw;
hwif->OUTSL = ide_unplugged_outsl;
hwif->INB = ide_unplugged_inb;
hwif->INW = ide_unplugged_inw;
hwif->INL = ide_unplugged_inl;
hwif->INSW = ide_unplugged_insw;
hwif->INSL = ide_unplugged_insl;
}
EXPORT_SYMBOL(unplugged_hwif_iops);
/*
* Conventional PIO operations for ATA devices
*/
static u8 ide_inb (unsigned long port)
{ {
return (u8) inb(port); return (u8) inb(port);
} }
static u16 ide_inw (ide_ioreg_t port) static u16 ide_inw (unsigned long port)
{ {
return (u16) inw(port); return (u16) inw(port);
} }
static void ide_insw (ide_ioreg_t port, void *addr, u32 count) static void ide_insw (unsigned long port, void *addr, u32 count)
{ {
return insw(port, addr, count); return insw(port, addr, count);
} }
static u32 ide_inl (ide_ioreg_t port) static u32 ide_inl (unsigned long port)
{ {
return (u32) inl(port); return (u32) inl(port);
} }
static void ide_insl (ide_ioreg_t port, void *addr, u32 count) static void ide_insl (unsigned long port, void *addr, u32 count)
{ {
insl(port, addr, count); insl(port, addr, count);
} }
static void ide_outb (u8 value, ide_ioreg_t port) static void ide_outb (u8 addr, unsigned long port)
{ {
outb(value, port); outb(addr, port);
} }
static void ide_outw (u16 value, ide_ioreg_t port) static void ide_outw (u16 addr, unsigned long port)
{ {
outw(value, port); outw(addr, port);
} }
static void ide_outsw (ide_ioreg_t port, void *addr, u32 count) static void ide_outsw (unsigned long port, void *addr, u32 count)
{ {
outsw(port, addr, count); outsw(port, addr, count);
} }
static void ide_outl (u32 value, ide_ioreg_t port) static void ide_outl (u32 addr, unsigned long port)
{ {
outl(value, port); outl(addr, port);
} }
static void ide_outsl (ide_ioreg_t port, void *addr, u32 count) static void ide_outsl (unsigned long port, void *addr, u32 count)
{ {
outsl(port, addr, count); return outsl(port, addr, count);
} }
void default_hwif_iops (ide_hwif_t *hwif) void default_hwif_iops (ide_hwif_t *hwif)
{ {
hwif->OUTB = ide_outb; hwif->OUTB = ide_outb;
hwif->OUTBSYNC = ide_outb;
hwif->OUTW = ide_outw; hwif->OUTW = ide_outw;
hwif->OUTL = ide_outl; hwif->OUTL = ide_outl;
hwif->OUTSW = ide_outsw; hwif->OUTSW = ide_outsw;
...@@ -98,78 +167,66 @@ void default_hwif_iops (ide_hwif_t *hwif) ...@@ -98,78 +167,66 @@ void default_hwif_iops (ide_hwif_t *hwif)
EXPORT_SYMBOL(default_hwif_iops); EXPORT_SYMBOL(default_hwif_iops);
static u8 ide_mm_inb (ide_ioreg_t port) /*
* MMIO operations, typically used for SATA controllers
*/
static u8 ide_mm_inb (unsigned long port)
{ {
return (u8) readb(port); return (u8) readb(port);
} }
static u16 ide_mm_inw (ide_ioreg_t port) static u16 ide_mm_inw (unsigned long port)
{ {
return (u16) readw(port); return (u16) readw(port);
} }
static void ide_mm_insw (ide_ioreg_t port, void *addr, u32 count) static void ide_mm_insw (unsigned long port, void *addr, u32 count)
{ {
#ifdef CONFIG_PPC __ide_mm_insw(port, addr, count);
/* Can we move the barrier out of the loop ? */
while (count--) { *(u16 *)addr = __raw_readw(port); iobarrier_r(); addr += 2; }
#else /* everything else is sane benh */
while (count--) { *(u16 *)addr = readw(port); addr += 2; }
#endif
} }
static u32 ide_mm_inl (ide_ioreg_t port) static u32 ide_mm_inl (unsigned long port)
{ {
return (u32) readl(port); return (u32) readl(port);
} }
static void ide_mm_insl (ide_ioreg_t port, void *addr, u32 count) static void ide_mm_insl (unsigned long port, void *addr, u32 count)
{ {
#ifdef CONFIG_PPC __ide_mm_insl(port, addr, count);
/* Can we move the barrier out of the loop ? */
while (count--) { *(u32 *)addr = __raw_readl(port); iobarrier_r(); addr += 4; }
#else /* everything else is sane benh */
while (count--) { *(u32 *)addr = readl(port); addr += 4; }
#endif
} }
static void ide_mm_outb (u8 value, ide_ioreg_t port) static void ide_mm_outb (u8 value, unsigned long port)
{ {
writeb(value, port); writeb(value, port);
} }
static void ide_mm_outw (u16 value, ide_ioreg_t port) static void ide_mm_outw (u16 value, unsigned long port)
{ {
writew(value, port); writew(value, port);
} }
static void ide_mm_outsw (ide_ioreg_t port, void *addr, u32 count) static void ide_mm_outsw (unsigned long port, void *addr, u32 count)
{ {
#ifdef CONFIG_PPC __ide_mm_outsw(port, addr, count);
/* Can we move the barrier out of the loop ? */
while (count--) { __raw_writew(*(u16 *)addr, port); iobarrier_w(); addr += 2; }
#else /* everything else is sane benh */
while (count--) { writew(*(u16 *)addr, port); addr += 2; }
#endif
} }
static void ide_mm_outl (u32 value, ide_ioreg_t port) static void ide_mm_outl (u32 value, unsigned long port)
{ {
writel(value, port); writel(value, port);
} }
static void ide_mm_outsl (ide_ioreg_t port, void *addr, u32 count) static void ide_mm_outsl (unsigned long port, void *addr, u32 count)
{ {
#ifdef CONFIG_PPC __ide_mm_outsl(port, addr, count);
while (count--) { __raw_writel(*(u32 *)addr, port); iobarrier_w(); addr += 4; }
#else /* everything else is sane benh */
while (count--) { writel(*(u32 *)addr, port); addr += 4; }
#endif
} }
void default_hwif_mmiops (ide_hwif_t *hwif) void default_hwif_mmiops (ide_hwif_t *hwif)
{ {
hwif->OUTB = ide_mm_outb; hwif->OUTB = ide_mm_outb;
/* Most systems will need to override OUTBSYNC, alas however
this one is controller specific! */
hwif->OUTBSYNC = ide_mm_outb;
hwif->OUTW = ide_mm_outw; hwif->OUTW = ide_mm_outw;
hwif->OUTL = ide_mm_outl; hwif->OUTL = ide_mm_outl;
hwif->OUTSW = ide_mm_outsw; hwif->OUTSW = ide_mm_outsw;
......
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