|
@@ -66,7 +66,7 @@ MODULE_PARM_DESC(doubler, "enable support for IDE doublers");
|
|
|
* Check and acknowledge the interrupt status
|
|
|
*/
|
|
|
|
|
|
-static int gayle_ack_intr_a4000(ide_hwif_t *hwif)
|
|
|
+static int gayle_ack_intr(ide_hwif_t *hwif)
|
|
|
{
|
|
|
unsigned char ch;
|
|
|
|
|
@@ -76,16 +76,12 @@ static int gayle_ack_intr_a4000(ide_hwif_t *hwif)
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
-static int gayle_ack_intr_a1200(ide_hwif_t *hwif)
|
|
|
+static void gayle_a1200_clear_irq(ide_drive_t *drive)
|
|
|
{
|
|
|
- unsigned char ch;
|
|
|
+ ide_hwif_t *hwif = drive->hwif;
|
|
|
|
|
|
- ch = z_readb(hwif->io_ports.irq_addr);
|
|
|
- if (!(ch & GAYLE_IRQ_IDE))
|
|
|
- return 0;
|
|
|
(void)z_readb(hwif->io_ports.status_addr);
|
|
|
z_writeb(0x7c, hwif->io_ports.irq_addr);
|
|
|
- return 1;
|
|
|
}
|
|
|
|
|
|
static void __init gayle_setup_ports(struct ide_hw *hw, unsigned long base,
|
|
@@ -108,6 +104,10 @@ static void __init gayle_setup_ports(struct ide_hw *hw, unsigned long base,
|
|
|
hw->ack_intr = ack_intr;
|
|
|
}
|
|
|
|
|
|
+static const struct ide_port_ops gayle_a1200_port_ops = {
|
|
|
+ .clear_irq = gayle_a1200_clear_irq,
|
|
|
+};
|
|
|
+
|
|
|
static const struct ide_port_info gayle_port_info = {
|
|
|
.host_flags = IDE_HFLAG_MMIO | IDE_HFLAG_SERIALIZE |
|
|
|
IDE_HFLAG_NO_DMA,
|
|
@@ -123,9 +123,9 @@ static int __init gayle_init(void)
|
|
|
{
|
|
|
unsigned long phys_base, res_start, res_n;
|
|
|
unsigned long base, ctrlport, irqport;
|
|
|
- ide_ack_intr_t *ack_intr;
|
|
|
int a4000, i, rc;
|
|
|
struct ide_hw hw[GAYLE_NUM_HWIFS], *hws[GAYLE_NUM_HWIFS];
|
|
|
+ struct ide_port_info d = gayle_port_info;
|
|
|
|
|
|
if (!MACH_IS_AMIGA)
|
|
|
return -ENODEV;
|
|
@@ -148,11 +148,10 @@ found:
|
|
|
if (a4000) {
|
|
|
phys_base = GAYLE_BASE_4000;
|
|
|
irqport = (unsigned long)ZTWO_VADDR(GAYLE_IRQ_4000);
|
|
|
- ack_intr = gayle_ack_intr_a4000;
|
|
|
} else {
|
|
|
phys_base = GAYLE_BASE_1200;
|
|
|
irqport = (unsigned long)ZTWO_VADDR(GAYLE_IRQ_1200);
|
|
|
- ack_intr = gayle_ack_intr_a1200;
|
|
|
+ d.port_ops = &gayle_a1200_port_ops;
|
|
|
}
|
|
|
|
|
|
res_start = ((unsigned long)phys_base) & ~(GAYLE_NEXT_PORT-1);
|
|
@@ -165,12 +164,12 @@ found:
|
|
|
base = (unsigned long)ZTWO_VADDR(phys_base + i * GAYLE_NEXT_PORT);
|
|
|
ctrlport = GAYLE_HAS_CONTROL_REG ? (base + GAYLE_CONTROL) : 0;
|
|
|
|
|
|
- gayle_setup_ports(&hw[i], base, ctrlport, irqport, ack_intr);
|
|
|
+ gayle_setup_ports(&hw[i], base, ctrlport, irqport, gayle_ack_intr);
|
|
|
|
|
|
hws[i] = &hw[i];
|
|
|
}
|
|
|
|
|
|
- rc = ide_host_add(&gayle_port_info, hws, i, NULL);
|
|
|
+ rc = ide_host_add(&d, hws, i, NULL);
|
|
|
if (rc)
|
|
|
release_mem_region(res_start, res_n);
|
|
|
|