Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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");