alim15x3.c 15.1 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7
/*
 *  Copyright (C) 1998-2000 Michel Aubry, Maintainer
 *  Copyright (C) 1998-2000 Andrzej Krzysztofowicz, Maintainer
 *  Copyright (C) 1999-2000 CJ, cjtsai@ali.com.tw, Maintainer
 *
 *  Copyright (C) 1998-2000 Andre Hedrick (andre@linux-ide.org)
 *  May be copied or modified under the terms of the GNU General Public License
A
Alan Cox 已提交
8
 *  Copyright (C) 2002 Alan Cox
L
Linus Torvalds 已提交
9
 *  ALi (now ULi M5228) support by Clear Zhang <Clear.Zhang@ali.com.tw>
S
Sergei Shtylyov 已提交
10
 *  Copyright (C) 2007 MontaVista Software, Inc. <source@mvista.com>
11
 *  Copyright (C) 2007-2010 Bartlomiej Zolnierkiewicz
L
Linus Torvalds 已提交
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
 *
 *  (U)DMA capable version of ali 1533/1543(C), 1535(D)
 *
 **********************************************************************
 *  9/7/99 --Parts from the above author are included and need to be
 *  converted into standard interface, once I finish the thought.
 *
 *  Recent changes
 *	Don't use LBA48 mode on ALi <= 0xC4
 *	Don't poke 0x79 with a non ALi northbridge
 *	Don't flip undefined bits on newer chipsets (fix Fujitsu laptop hang)
 *	Allow UDMA6 on revisions > 0xC4
 *
 *  Documentation
 *	Chipset documentation available under NDA only
 *
 */

#include <linux/module.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/pci.h>
#include <linux/ide.h>
#include <linux/init.h>
36
#include <linux/dmi.h>
L
Linus Torvalds 已提交
37 38 39

#include <asm/io.h>

40 41
#define DRV_NAME "alim15x3"

L
Linus Torvalds 已提交
42 43 44 45 46 47 48 49 50
/*
 *	ALi devices are not plug in. Otherwise these static values would
 *	need to go. They ought to go away anyway
 */
 
static u8 m5229_revision;
static u8 chip_is_1543c_e;
static struct pci_dev *isa_dev;

51 52 53 54 55 56 57 58 59 60 61 62 63
static void ali_fifo_control(ide_hwif_t *hwif, ide_drive_t *drive, int on)
{
	struct pci_dev *pdev = to_pci_dev(hwif->dev);
	int pio_fifo = 0x54 + hwif->channel;
	u8 fifo;
	int shift = 4 * (drive->dn & 1);

	pci_read_config_byte(pdev, pio_fifo, &fifo);
	fifo &= ~(0x0F << shift);
	fifo |= (on << shift);
	pci_write_config_byte(pdev, pio_fifo, fifo);
}

64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
static void ali_program_timings(ide_hwif_t *hwif, ide_drive_t *drive,
				struct ide_timing *t)
{
	struct pci_dev *dev = to_pci_dev(hwif->dev);
	int port = hwif->channel ? 0x5c : 0x58;
	u8 unit = drive->dn & 1;

	t->setup = clamp_val(t->setup, 1, 8) & 7;
	t->act8b = clamp_val(t->act8b, 1, 8) & 7;
	t->rec8b = clamp_val(t->rec8b, 1, 16) & 15;
	t->active = clamp_val(t->active, 1, 8) & 7;
	t->recover = clamp_val(t->recover, 1, 16) & 15;

	pci_write_config_byte(dev, port, t->setup);
	pci_write_config_byte(dev, port + 1, (t->act8b << 4) | t->rec8b);
	pci_write_config_byte(dev, port + unit + 2,
			      (t->active << 4) | t->recover);
}

L
Linus Torvalds 已提交
83
/**
84
 *	ali_set_pio_mode	-	set host controller for PIO mode
85
 *	@hwif: port
86
 *	@drive: drive
S
Sergei Shtylyov 已提交
87
 *
88
 *	Program the controller for the given PIO mode.
L
Linus Torvalds 已提交
89
 */
90

91
static void ali_set_pio_mode(ide_hwif_t *hwif, ide_drive_t *drive)
L
Linus Torvalds 已提交
92
{
93
	ide_drive_t *pair = ide_get_pair_dev(drive);
94
	int bus_speed = ide_pci_clk ? ide_pci_clk : 33;
95 96
	unsigned long T =  1000000 / bus_speed; /* PCI clock based */
	struct ide_timing t;
L
Linus Torvalds 已提交
97

98
	ide_timing_compute(drive, drive->pio_mode, &t, T, 1);
99 100 101 102
	if (pair) {
		struct ide_timing p;

		ide_timing_compute(pair, pair->pio_mode, &p, T, 1);
103 104
		ide_timing_merge(&p, &t, &t,
			IDE_TIMING_SETUP | IDE_TIMING_8BIT);
105 106
		if (pair->dma_mode) {
			ide_timing_compute(pair, pair->dma_mode, &p, T, 1);
107 108
			ide_timing_merge(&p, &t, &t,
				IDE_TIMING_SETUP | IDE_TIMING_8BIT);
109 110
		}
	}
111

L
Linus Torvalds 已提交
112 113 114
	/* 
	 * PIO mode => ATA FIFO on, ATAPI FIFO off
	 */
115
	ali_fifo_control(hwif, drive, (drive->media == ide_disk) ? 0x05 : 0x00);
116

117
	ali_program_timings(hwif, drive, &t);
S
Sergei Shtylyov 已提交
118 119
}

L
Linus Torvalds 已提交
120
/**
121 122
 *	ali_udma_filter		-	compute UDMA mask
 *	@drive: IDE device
L
Linus Torvalds 已提交
123
 *
124 125 126
 *	Return available UDMA modes.
 *
 *	The actual rules for the ALi are:
L
Linus Torvalds 已提交
127 128
 *		No UDMA on revisions <= 0x20
 *		Disk only for revisions < 0xC2
129
 *		Not WDC drives on M1543C-E (?)
L
Linus Torvalds 已提交
130 131
 */

132
static u8 ali_udma_filter(ide_drive_t *drive)
L
Linus Torvalds 已提交
133
{
134 135 136
	if (m5229_revision > 0x20 && m5229_revision < 0xC2) {
		if (drive->media != ide_disk)
			return 0;
137
		if (chip_is_1543c_e &&
138
		    strstr((char *)&drive->id[ATA_ID_PROD], "WDC "))
139
			return 0;
L
Linus Torvalds 已提交
140 141
	}

142
	return drive->hwif->ultra_mask;
L
Linus Torvalds 已提交
143 144 145
}

/**
146
 *	ali_set_dma_mode	-	set host controller for DMA mode
147
 *	@hwif: port
148
 *	@drive: drive
L
Linus Torvalds 已提交
149 150 151
 *
 *	Configure the hardware for the desired IDE transfer mode.
 */
152

153
static void ali_set_dma_mode(ide_hwif_t *hwif, ide_drive_t *drive)
L
Linus Torvalds 已提交
154
{
155
	struct pci_dev *dev	= to_pci_dev(hwif->dev);
156 157 158
	ide_drive_t *pair	= ide_get_pair_dev(drive);
	int bus_speed		= ide_pci_clk ? ide_pci_clk : 33;
	unsigned long T		=  1000000 / bus_speed; /* PCI clock based */
159
	const u8 speed		= drive->dma_mode;
L
Linus Torvalds 已提交
160
	u8 speed1		= speed;
161
	u8 unit			= drive->dn & 1;
L
Linus Torvalds 已提交
162 163
	u8 tmpbyte		= 0x00;
	int m5229_udma		= (hwif->channel) ? 0x57 : 0x56;
164
	struct ide_timing t;
L
Linus Torvalds 已提交
165 166 167 168 169 170 171 172 173 174 175 176 177

	if (speed == XFER_UDMA_6)
		speed1 = 0x47;

	if (speed < XFER_UDMA_0) {
		u8 ultra_enable	= (unit) ? 0x7f : 0xf7;
		/*
		 * clear "ultra enable" bit
		 */
		pci_read_config_byte(dev, m5229_udma, &tmpbyte);
		tmpbyte &= ultra_enable;
		pci_write_config_byte(dev, m5229_udma, tmpbyte);

178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
		ide_timing_compute(drive, drive->dma_mode, &t, T, 1);
		if (pair) {
			struct ide_timing p;

			ide_timing_compute(pair, pair->pio_mode, &p, T, 1);
			ide_timing_merge(&p, &t, &t,
				IDE_TIMING_SETUP | IDE_TIMING_8BIT);
			if (pair->dma_mode) {
				ide_timing_compute(pair, pair->dma_mode,
						&p, T, 1);
				ide_timing_merge(&p, &t, &t,
					IDE_TIMING_SETUP | IDE_TIMING_8BIT);
			}
		}
		ali_program_timings(hwif, drive, &t);
L
Linus Torvalds 已提交
193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
	} else {
		pci_read_config_byte(dev, m5229_udma, &tmpbyte);
		tmpbyte &= (0x0f << ((1-unit) << 2));
		/*
		 * enable ultra dma and set timing
		 */
		tmpbyte |= ((0x08 | ((4-speed1)&0x07)) << (unit << 2));
		pci_write_config_byte(dev, m5229_udma, tmpbyte);
		if (speed >= XFER_UDMA_3) {
			pci_read_config_byte(dev, 0x4b, &tmpbyte);
			tmpbyte |= 1;
			pci_write_config_byte(dev, 0x4b, tmpbyte);
		}
	}
}

/**
210
 *	ali_dma_check	-	DMA check
L
Linus Torvalds 已提交
211
 *	@drive:	target device
212
 *	@cmd: command
L
Linus Torvalds 已提交
213 214 215 216
 *
 *	Returns 1 if the DMA cannot be performed, zero on success.
 */

217
static int ali_dma_check(ide_drive_t *drive, struct ide_cmd *cmd)
L
Linus Torvalds 已提交
218 219
{
	if (m5229_revision < 0xC2 && drive->media != ide_disk) {
220
		if (cmd->tf_flags & IDE_TFLAG_WRITE)
L
Linus Torvalds 已提交
221 222
			return 1;	/* try PIO instead of DMA */
	}
223
	return 0;
L
Linus Torvalds 已提交
224 225 226 227 228 229 230 231 232
}

/**
 *	init_chipset_ali15x3	-	Initialise an ALi IDE controller
 *	@dev: PCI device
 *
 *	This function initializes the ALI IDE controller and where 
 *	appropriate also sets up the 1533 southbridge.
 */
233

234
static int init_chipset_ali15x3(struct pci_dev *dev)
L
Linus Torvalds 已提交
235 236 237
{
	unsigned long flags;
	u8 tmpbyte;
238
	struct pci_dev *north = pci_get_slot(dev->bus, PCI_DEVFN(0,0));
L
Linus Torvalds 已提交
239

240
	m5229_revision = dev->revision;
L
Linus Torvalds 已提交
241

242
	isa_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533, NULL);
L
Linus Torvalds 已提交
243 244 245 246 247 248 249 250 251 252 253 254 255 256

	local_irq_save(flags);

	if (m5229_revision < 0xC2) {
		/*
		 * revision 0x20 (1543-E, 1543-F)
		 * revision 0xC0, 0xC1 (1543C-C, 1543C-D, 1543C-E)
		 * clear CD-ROM DMA write bit, m5229, 0x4b, bit 7
		 */
		pci_read_config_byte(dev, 0x4b, &tmpbyte);
		/*
		 * clear bit 7
		 */
		pci_write_config_byte(dev, 0x4b, tmpbyte & 0x7F);
257 258 259 260 261 262 263
		/*
		 * check m1533, 0x5e, bit 1~4 == 1001 => & 00011110 = 00010010
		 */
		if (m5229_revision >= 0x20 && isa_dev) {
			pci_read_config_byte(isa_dev, 0x5e, &tmpbyte);
			chip_is_1543c_e = ((tmpbyte & 0x1e) == 0x12) ? 1: 0;
		}
264
		goto out;
L
Linus Torvalds 已提交
265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286
	}

	/*
	 * 1543C-B?, 1535, 1535D, 1553
	 * Note 1: not all "motherboard" support this detection
	 * Note 2: if no udma 66 device, the detection may "error".
	 *         but in this case, we will not set the device to
	 *         ultra 66, the detection result is not important
	 */

	/*
	 * enable "Cable Detection", m5229, 0x4b, bit3
	 */
	pci_read_config_byte(dev, 0x4b, &tmpbyte);
	pci_write_config_byte(dev, 0x4b, tmpbyte | 0x08);

	/*
	 * We should only tune the 1533 enable if we are using an ALi
	 * North bridge. We might have no north found on some zany
	 * box without a device at 0:0.0. The ALi bridge will be at
	 * 0:0.0 so if we didn't find one we know what is cooking.
	 */
287 288
	if (north && north->vendor != PCI_VENDOR_ID_AL)
		goto out;
L
Linus Torvalds 已提交
289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308

	if (m5229_revision < 0xC5 && isa_dev)
	{	
		/*
		 * set south-bridge's enable bit, m1533, 0x79
		 */

		pci_read_config_byte(isa_dev, 0x79, &tmpbyte);
		if (m5229_revision == 0xC2) {
			/*
			 * 1543C-B0 (m1533, 0x79, bit 2)
			 */
			pci_write_config_byte(isa_dev, 0x79, tmpbyte | 0x04);
		} else if (m5229_revision >= 0xC3) {
			/*
			 * 1553/1535 (m1533, 0x79, bit 1)
			 */
			pci_write_config_byte(isa_dev, 0x79, tmpbyte | 0x02);
		}
	}
309

310
out:
311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332
	/*
	 * CD_ROM DMA on (m5229, 0x53, bit0)
	 *      Enable this bit even if we want to use PIO.
	 * PIO FIFO off (m5229, 0x53, bit1)
	 *      The hardware will use 0x54h and 0x55h to control PIO FIFO.
	 *	(Not on later devices it seems)
	 *
	 *	0x53 changes meaning on later revs - we must no touch
	 *	bit 1 on them.  Need to check if 0x20 is the right break.
	 */
	if (m5229_revision >= 0x20) {
		pci_read_config_byte(dev, 0x53, &tmpbyte);

		if (m5229_revision <= 0x20)
			tmpbyte = (tmpbyte & (~0x02)) | 0x01;
		else if (m5229_revision == 0xc7 || m5229_revision == 0xc8)
			tmpbyte |= 0x03;
		else
			tmpbyte |= 0x01;

		pci_write_config_byte(dev, 0x53, tmpbyte);
	}
333 334
	pci_dev_put(north);
	pci_dev_put(isa_dev);
L
Linus Torvalds 已提交
335 336 337 338
	local_irq_restore(flags);
	return 0;
}

339 340 341 342
/*
 *	Cable special cases
 */

343
static const struct dmi_system_id cable_dmi_table[] = {
344 345 346 347
	{
		.ident = "HP Pavilion N5430",
		.matches = {
			DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
348
			DMI_MATCH(DMI_BOARD_VERSION, "OmniBook N32N-736"),
349 350
		},
	},
351 352 353 354 355 356 357
	{
		.ident = "Toshiba Satellite S1800-814",
		.matches = {
			DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
			DMI_MATCH(DMI_PRODUCT_NAME, "S1800-814"),
		},
	},
358 359 360 361 362 363 364 365 366 367
	{ }
};

static int ali_cable_override(struct pci_dev *pdev)
{
	/* Fujitsu P2000 */
	if (pdev->subsystem_vendor == 0x10CF &&
	    pdev->subsystem_device == 0x10AF)
		return 1;

368 369 370 371 372
	/* Mitac 8317 (Winbook-A) and relatives */
	if (pdev->subsystem_vendor == 0x1071 &&
	    pdev->subsystem_device == 0x8317)
		return 1;

373 374 375 376 377 378 379
	/* Systems by DMI */
	if (dmi_check_system(cable_dmi_table))
		return 1;

	return 0;
}

L
Linus Torvalds 已提交
380
/**
381
 *	ali_cable_detect	-	cable detection
L
Linus Torvalds 已提交
382 383 384 385 386 387
 *	@hwif: IDE interface
 *
 *	This checks if the controller and the cable are capable
 *	of UDMA66 transfers. It doesn't check the drives.
 */

388
static u8 ali_cable_detect(ide_hwif_t *hwif)
L
Linus Torvalds 已提交
389
{
390
	struct pci_dev *dev = to_pci_dev(hwif->dev);
391
	u8 cbl = ATA_CBL_PATA40, tmpbyte;
L
Linus Torvalds 已提交
392 393 394

	if (m5229_revision >= 0xC2) {
		/*
395 396 397 398 399 400 401
		 * m5229 80-pin cable detection (from Host View)
		 *
		 * 0x4a bit0 is 0 => primary channel has 80-pin
		 * 0x4a bit1 is 0 => secondary channel has 80-pin
		 *
		 * Certain laptops use short but suitable cables
		 * and don't implement the detect logic.
L
Linus Torvalds 已提交
402
		 */
403 404 405 406 407 408 409
		if (ali_cable_override(dev))
			cbl = ATA_CBL_PATA40_SHORT;
		else {
			pci_read_config_byte(dev, 0x4a, &tmpbyte);
			if ((tmpbyte & (1 << hwif->channel)) == 0)
				cbl = ATA_CBL_PATA80;
		}
L
Linus Torvalds 已提交
410 411
	}

412
	return cbl;
L
Linus Torvalds 已提交
413 414
}

415
#ifndef CONFIG_SPARC64
L
Linus Torvalds 已提交
416 417 418 419 420 421
/**
 *	init_hwif_ali15x3	-	Initialize the ALI IDE x86 stuff
 *	@hwif: interface to configure
 *
 *	Obtain the IRQ tables for an ALi based IDE solution on the PC
 *	class platforms. This part of the code isn't applicable to the
422
 *	Sparc systems.
L
Linus Torvalds 已提交
423 424
 */

425
static void __devinit init_hwif_ali15x3 (ide_hwif_t *hwif)
L
Linus Torvalds 已提交
426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461
{
	u8 ideic, inmir;
	s8 irq_routing_table[] = { -1,  9, 3, 10, 4,  5, 7,  6,
				      1, 11, 0, 12, 0, 14, 0, 15 };
	int irq = -1;

	if (isa_dev) {
		/*
		 * read IDE interface control
		 */
		pci_read_config_byte(isa_dev, 0x58, &ideic);

		/* bit0, bit1 */
		ideic = ideic & 0x03;

		/* get IRQ for IDE Controller */
		if ((hwif->channel && ideic == 0x03) ||
		    (!hwif->channel && !ideic)) {
			/*
			 * get SIRQ1 routing table
			 */
			pci_read_config_byte(isa_dev, 0x44, &inmir);
			inmir = inmir & 0x0f;
			irq = irq_routing_table[inmir];
		} else if (hwif->channel && !(ideic & 0x01)) {
			/*
			 * get SIRQ2 routing table
			 */
			pci_read_config_byte(isa_dev, 0x75, &inmir);
			inmir = inmir & 0x0f;
			irq = irq_routing_table[inmir];
		}
		if(irq >= 0)
			hwif->irq = irq;
	}
}
462 463
#else
#define init_hwif_ali15x3 NULL
464
#endif /* CONFIG_SPARC64 */
L
Linus Torvalds 已提交
465 466 467 468

/**
 *	init_dma_ali15x3	-	set up DMA on ALi15x3
 *	@hwif: IDE interface
469
 *	@d: IDE port info
L
Linus Torvalds 已提交
470
 *
471
 *	Set up the DMA functionality on the ALi 15x3.
L
Linus Torvalds 已提交
472 473
 */

474 475
static int __devinit init_dma_ali15x3(ide_hwif_t *hwif,
				      const struct ide_port_info *d)
L
Linus Torvalds 已提交
476
{
477 478 479
	struct pci_dev *dev = to_pci_dev(hwif->dev);
	unsigned long base = ide_pci_dma_base(hwif, d);

480 481 482 483 484 485 486 487 488
	if (base == 0)
		return -1;

	hwif->dma_base = base;

	if (ide_pci_check_simplex(hwif, d) < 0)
		return -1;

	if (ide_pci_set_master(dev, d->name) < 0)
489 490
		return -1;

491
	if (!hwif->channel)
492 493 494 495 496 497 498 499 500
		outb(inb(base + 2) & 0x60, base + 2);

	printk(KERN_INFO "    %s: BM-DMA at 0x%04lx-0x%04lx\n",
			 hwif->name, base, base + 7);

	if (ide_allocate_dma_engine(hwif))
		return -1;

	return 0;
L
Linus Torvalds 已提交
501 502
}

503 504 505 506 507 508 509
static const struct ide_port_ops ali_port_ops = {
	.set_pio_mode		= ali_set_pio_mode,
	.set_dma_mode		= ali_set_dma_mode,
	.udma_filter		= ali_udma_filter,
	.cable_detect		= ali_cable_detect,
};

510 511
static const struct ide_dma_ops ali_dma_ops = {
	.dma_host_set		= ide_dma_host_set,
512
	.dma_setup		= ide_dma_setup,
513
	.dma_start		= ide_dma_start,
514
	.dma_end		= ide_dma_end,
515 516
	.dma_test_irq		= ide_dma_test_irq,
	.dma_lost_irq		= ide_dma_lost_irq,
517
	.dma_check		= ali_dma_check,
518
	.dma_timer_expiry	= ide_dma_sff_timer_expiry,
519
	.dma_sff_read_status	= ide_dma_sff_read_status,
520 521
};

522
static const struct ide_port_info ali15x3_chipset __devinitdata = {
523
	.name		= DRV_NAME,
L
Linus Torvalds 已提交
524 525 526
	.init_chipset	= init_chipset_ali15x3,
	.init_hwif	= init_hwif_ali15x3,
	.init_dma	= init_dma_ali15x3,
527
	.port_ops	= &ali_port_ops,
528
	.dma_ops	= &sff_dma_ops,
B
Bartlomiej Zolnierkiewicz 已提交
529
	.pio_mask	= ATA_PIO5,
530 531
	.swdma_mask	= ATA_SWDMA2,
	.mwdma_mask	= ATA_MWDMA2,
L
Linus Torvalds 已提交
532 533 534 535 536 537 538 539 540 541 542 543
};

/**
 *	alim15x3_init_one	-	set up an ALi15x3 IDE controller
 *	@dev: PCI device to set up
 *
 *	Perform the actual set up for an ALi15x3 that has been found by the
 *	hot plug layer.
 */
 
static int __devinit alim15x3_init_one(struct pci_dev *dev, const struct pci_device_id *id)
{
544
	struct ide_port_info d = ali15x3_chipset;
545
	u8 rev = dev->revision, idx = id->driver_data;
L
Linus Torvalds 已提交
546

547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562
	/* don't use LBA48 DMA on ALi devices before rev 0xC5 */
	if (rev <= 0xC4)
		d.host_flags |= IDE_HFLAG_NO_LBA48_DMA;

	if (rev >= 0x20) {
		if (rev == 0x20)
			d.host_flags |= IDE_HFLAG_NO_ATAPI_DMA;

		if (rev < 0xC2)
			d.udma_mask = ATA_UDMA2;
		else if (rev == 0xC2 || rev == 0xC3)
			d.udma_mask = ATA_UDMA4;
		else if (rev == 0xC4)
			d.udma_mask = ATA_UDMA5;
		else
			d.udma_mask = ATA_UDMA6;
563 564

		d.dma_ops = &ali_dma_ops;
565 566 567 568
	} else {
		d.host_flags |= IDE_HFLAG_NO_DMA;

		d.mwdma_mask = d.swdma_mask = 0;
569 570
	}

571 572 573
	if (idx == 0)
		d.host_flags |= IDE_HFLAG_CLEAR_SIMPLEX;

574
	return ide_pci_init_one(dev, &d, NULL);
L
Linus Torvalds 已提交
575 576 577
}


578 579
static const struct pci_device_id alim15x3_pci_tbl[] = {
	{ PCI_VDEVICE(AL, PCI_DEVICE_ID_AL_M5229), 0 },
580
	{ PCI_VDEVICE(AL, PCI_DEVICE_ID_AL_M5228), 1 },
L
Linus Torvalds 已提交
581 582 583 584
	{ 0, },
};
MODULE_DEVICE_TABLE(pci, alim15x3_pci_tbl);

585
static struct pci_driver alim15x3_pci_driver = {
L
Linus Torvalds 已提交
586 587 588
	.name		= "ALI15x3_IDE",
	.id_table	= alim15x3_pci_tbl,
	.probe		= alim15x3_init_one,
589
	.remove		= ide_pci_remove,
590 591
	.suspend	= ide_pci_suspend,
	.resume		= ide_pci_resume,
L
Linus Torvalds 已提交
592 593
};

594
static int __init ali15x3_ide_init(void)
L
Linus Torvalds 已提交
595
{
596
	return ide_pci_register_driver(&alim15x3_pci_driver);
L
Linus Torvalds 已提交
597 598
}

599 600
static void __exit ali15x3_ide_exit(void)
{
H
Hannes Eder 已提交
601
	pci_unregister_driver(&alim15x3_pci_driver);
602 603
}

L
Linus Torvalds 已提交
604
module_init(ali15x3_ide_init);
605
module_exit(ali15x3_ide_exit);
L
Linus Torvalds 已提交
606

607
MODULE_AUTHOR("Michael Aubry, Andrzej Krzysztofowicz, CJ, Andre Hedrick, Alan Cox, Bartlomiej Zolnierkiewicz");
L
Linus Torvalds 已提交
608 609
MODULE_DESCRIPTION("PCI driver module for ALi 15x3 IDE");
MODULE_LICENSE("GPL");