^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) * Amiga Buddha, Catweasel and X-Surf IDE Driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (C) 1997, 2001 by Geert Uytterhoeven and others
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * This driver was written based on the specifications in README.buddha and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * the X-Surf info from Inside_XSurf.txt available at
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * http://www.jschoenfeld.com
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * This file is subject to the terms and conditions of the GNU General Public
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * License. See the file COPYING in the main directory of this archive for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * more details.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * TODO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) * - test it :-)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * - tune the timings using the speed-register
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <linux/mm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <linux/blkdev.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <linux/zorro.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <linux/ide.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include <asm/amigahw.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #include <asm/amigaints.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) * The Buddha has 2 IDE interfaces, the Catweasel has 3, X-Surf has 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define BUDDHA_NUM_HWIFS 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define CATWEASEL_NUM_HWIFS 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define XSURF_NUM_HWIFS 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define MAX_NUM_HWIFS 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) * Bases of the IDE interfaces (relative to the board address)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define BUDDHA_BASE1 0x800
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define BUDDHA_BASE2 0xa00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define BUDDHA_BASE3 0xc00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define XSURF_BASE1 0xb000 /* 2.5" Interface */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define XSURF_BASE2 0xd000 /* 3.5" Interface */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) static u_int buddha_bases[CATWEASEL_NUM_HWIFS] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) BUDDHA_BASE1, BUDDHA_BASE2, BUDDHA_BASE3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) static u_int xsurf_bases[XSURF_NUM_HWIFS] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) XSURF_BASE1, XSURF_BASE2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) * Offsets from one of the above bases
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #define BUDDHA_CONTROL 0x11a
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) * Other registers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) #define BUDDHA_IRQ1 0xf00 /* MSB = 1, Harddisk is source of */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) #define BUDDHA_IRQ2 0xf40 /* interrupt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) #define BUDDHA_IRQ3 0xf80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) #define XSURF_IRQ1 0x7e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #define XSURF_IRQ2 0x7e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) static int buddha_irqports[CATWEASEL_NUM_HWIFS] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) BUDDHA_IRQ1, BUDDHA_IRQ2, BUDDHA_IRQ3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) static int xsurf_irqports[XSURF_NUM_HWIFS] __initdata = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) XSURF_IRQ1, XSURF_IRQ2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #define BUDDHA_IRQ_MR 0xfc0 /* master interrupt enable */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) * Board information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) typedef enum BuddhaType_Enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) BOARD_BUDDHA, BOARD_CATWEASEL, BOARD_XSURF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) } BuddhaType;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) static const char *buddha_board_name[] = { "Buddha", "Catweasel", "X-Surf" };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) * Check and acknowledge the interrupt status
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) static int buddha_test_irq(ide_hwif_t *hwif)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) unsigned char ch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) ch = z_readb(hwif->io_ports.irq_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) if (!(ch & 0x80))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) static void xsurf_clear_irq(ide_drive_t *drive)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) * X-Surf needs 0 written to IRQ register to ensure ISA bit A11 stays at 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) z_writeb(0, drive->hwif->io_ports.irq_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) static void __init buddha_setup_ports(struct ide_hw *hw, unsigned long base,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) unsigned long ctl, unsigned long irq_port)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) memset(hw, 0, sizeof(*hw));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) hw->io_ports.data_addr = base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) for (i = 1; i < 8; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) hw->io_ports_array[i] = base + 2 + i * 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) hw->io_ports.ctl_addr = ctl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) hw->io_ports.irq_addr = irq_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) hw->irq = IRQ_AMIGA_PORTS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) static const struct ide_port_ops buddha_port_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) .test_irq = buddha_test_irq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) static const struct ide_port_ops xsurf_port_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) .clear_irq = xsurf_clear_irq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) .test_irq = buddha_test_irq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) static const struct ide_port_info buddha_port_info = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) .port_ops = &buddha_port_ops,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) .host_flags = IDE_HFLAG_MMIO | IDE_HFLAG_NO_DMA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) .irq_flags = IRQF_SHARED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) .chipset = ide_generic,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) * Probe for a Buddha or Catweasel IDE interface
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) static int __init buddha_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) struct zorro_dev *z = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) u_long buddha_board = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) BuddhaType type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) int buddha_num_hwifs, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) while ((z = zorro_find_device(ZORRO_WILDCARD, z))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) unsigned long board;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) struct ide_hw hw[MAX_NUM_HWIFS], *hws[MAX_NUM_HWIFS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) struct ide_port_info d = buddha_port_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) if (z->id == ZORRO_PROD_INDIVIDUAL_COMPUTERS_BUDDHA) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) buddha_num_hwifs = BUDDHA_NUM_HWIFS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) type=BOARD_BUDDHA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) } else if (z->id == ZORRO_PROD_INDIVIDUAL_COMPUTERS_CATWEASEL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) buddha_num_hwifs = CATWEASEL_NUM_HWIFS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) type=BOARD_CATWEASEL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) } else if (z->id == ZORRO_PROD_INDIVIDUAL_COMPUTERS_X_SURF) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) buddha_num_hwifs = XSURF_NUM_HWIFS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) type=BOARD_XSURF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) d.port_ops = &xsurf_port_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) board = z->resource.start;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) if(type != BOARD_XSURF) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) if (!request_mem_region(board+BUDDHA_BASE1, 0x800, "IDE"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) if (!request_mem_region(board+XSURF_BASE1, 0x1000, "IDE"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) if (!request_mem_region(board+XSURF_BASE2, 0x1000, "IDE"))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) goto fail_base2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) if (!request_mem_region(board+XSURF_IRQ1, 0x8, "IDE")) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) release_mem_region(board+XSURF_BASE2, 0x1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) fail_base2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) release_mem_region(board+XSURF_BASE1, 0x1000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) buddha_board = (unsigned long)ZTWO_VADDR(board);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) /* write to BUDDHA_IRQ_MR to enable the board IRQ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) /* X-Surf doesn't have this. IRQs are always on */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) if (type != BOARD_XSURF)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) z_writeb(0, buddha_board+BUDDHA_IRQ_MR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) printk(KERN_INFO "ide: %s IDE controller\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) buddha_board_name[type]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) for (i = 0; i < buddha_num_hwifs; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) unsigned long base, ctl, irq_port;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) if (type != BOARD_XSURF) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) base = buddha_board + buddha_bases[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) ctl = base + BUDDHA_CONTROL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) irq_port = buddha_board + buddha_irqports[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) base = buddha_board + xsurf_bases[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) /* X-Surf has no CS1* (Control/AltStat) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) ctl = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) irq_port = buddha_board + xsurf_irqports[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) buddha_setup_ports(&hw[i], base, ctl, irq_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) hws[i] = &hw[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) ide_host_add(&d, hws, i, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) module_init(buddha_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) MODULE_LICENSE("GPL");