via82cxxx.c 15.9 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5
/*
 * VIA IDE driver for Linux. Supported southbridges:
 *
 *   vt82c576, vt82c586, vt82c586a, vt82c586b, vt82c596a, vt82c596b,
 *   vt82c686, vt82c686a, vt82c686b, vt8231, vt8233, vt8233c, vt8233a,
6
 *   vt8235, vt8237, vt8237a
L
Linus Torvalds 已提交
7 8
 *
 * Copyright (c) 2000-2002 Vojtech Pavlik
9
 * Copyright (c) 2007-2010 Bartlomiej Zolnierkiewicz
L
Linus Torvalds 已提交
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
 *
 * Based on the work of:
 *	Michel Aubry
 *	Jeff Garzik
 *	Andre Hedrick
 *
 * Documentation:
 *	Obsolete device documentation publically available from via.com.tw
 *	Current device documentation available under NDA only
 */

/*
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 as published by
 * the Free Software Foundation.
 */

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/pci.h>
#include <linux/init.h>
#include <linux/ide.h>
32 33
#include <linux/dmi.h>

34
#ifdef CONFIG_PPC_CHRP
L
Linus Torvalds 已提交
35 36 37
#include <asm/processor.h>
#endif

38 39
#define DRV_NAME "via82cxxx"

L
Linus Torvalds 已提交
40 41 42 43 44 45 46 47 48 49 50
#define VIA_IDE_ENABLE		0x40
#define VIA_IDE_CONFIG		0x41
#define VIA_FIFO_CONFIG		0x43
#define VIA_MISC_1		0x44
#define VIA_MISC_2		0x45
#define VIA_MISC_3		0x46
#define VIA_DRIVE_TIMING	0x48
#define VIA_8BIT_TIMING		0x4e
#define VIA_ADDRESS_SETUP	0x4c
#define VIA_UDMA_TIMING		0x50

51 52 53 54 55 56
#define VIA_BAD_PREQ		0x01 /* Crashes if PREQ# till DDACK# set */
#define VIA_BAD_CLK66		0x02 /* 66 MHz clock doesn't work correctly */
#define VIA_SET_FIFO		0x04 /* Needs to have FIFO split set */
#define VIA_NO_UNMASK		0x08 /* Doesn't work with IRQ unmasking on */
#define VIA_BAD_ID		0x10 /* Has wrong vendor ID (0x1107) */
#define VIA_BAD_AST		0x20 /* Don't touch Address Setup Timing */
57
#define VIA_SATA_PATA		0x80 /* SATA/PATA combined configuration */
L
Linus Torvalds 已提交
58

59 60 61 62
enum {
	VIA_IDFLAG_SINGLE = (1 << 1), /* single channel controller */
};

L
Linus Torvalds 已提交
63 64 65 66 67 68 69 70 71
/*
 * VIA SouthBridge chips.
 */

static struct via_isa_bridge {
	char *name;
	u16 id;
	u8 rev_min;
	u8 rev_max;
72 73
	u8 udma_mask;
	u8 flags;
L
Linus Torvalds 已提交
74
} via_isa_bridges[] = {
75 76 77
	{ "vx855",	PCI_DEVICE_ID_VIA_VX855,    0x00, 0x2f, ATA_UDMA6, VIA_BAD_AST | VIA_SATA_PATA },
	{ "vx800",	PCI_DEVICE_ID_VIA_VX800,    0x00, 0x2f, ATA_UDMA6, VIA_BAD_AST | VIA_SATA_PATA },
	{ "cx700",	PCI_DEVICE_ID_VIA_CX700,    0x00, 0x2f, ATA_UDMA6, VIA_BAD_AST | VIA_SATA_PATA },
78
	{ "vt8261",	PCI_DEVICE_ID_VIA_8261,     0x00, 0x2f, ATA_UDMA6, VIA_BAD_AST },
79 80
	{ "vt8237s",	PCI_DEVICE_ID_VIA_8237S,    0x00, 0x2f, ATA_UDMA6, VIA_BAD_AST },
	{ "vt6410",	PCI_DEVICE_ID_VIA_6410,     0x00, 0x2f, ATA_UDMA6, VIA_BAD_AST },
81
	{ "vt6415",	PCI_DEVICE_ID_VIA_6410,     0x00, 0xff, ATA_UDMA6, VIA_BAD_AST },
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
	{ "vt8251",	PCI_DEVICE_ID_VIA_8251,     0x00, 0x2f, ATA_UDMA6, VIA_BAD_AST },
	{ "vt8237",	PCI_DEVICE_ID_VIA_8237,     0x00, 0x2f, ATA_UDMA6, VIA_BAD_AST },
	{ "vt8237a",	PCI_DEVICE_ID_VIA_8237A,    0x00, 0x2f, ATA_UDMA6, VIA_BAD_AST },
	{ "vt8235",	PCI_DEVICE_ID_VIA_8235,     0x00, 0x2f, ATA_UDMA6, VIA_BAD_AST },
	{ "vt8233a",	PCI_DEVICE_ID_VIA_8233A,    0x00, 0x2f, ATA_UDMA6, VIA_BAD_AST },
	{ "vt8233c",	PCI_DEVICE_ID_VIA_8233C_0,  0x00, 0x2f, ATA_UDMA5, },
	{ "vt8233",	PCI_DEVICE_ID_VIA_8233_0,   0x00, 0x2f, ATA_UDMA5, },
	{ "vt8231",	PCI_DEVICE_ID_VIA_8231,     0x00, 0x2f, ATA_UDMA5, },
	{ "vt82c686b",	PCI_DEVICE_ID_VIA_82C686,   0x40, 0x4f, ATA_UDMA5, },
	{ "vt82c686a",	PCI_DEVICE_ID_VIA_82C686,   0x10, 0x2f, ATA_UDMA4, },
	{ "vt82c686",	PCI_DEVICE_ID_VIA_82C686,   0x00, 0x0f, ATA_UDMA2, VIA_BAD_CLK66 },
	{ "vt82c596b",	PCI_DEVICE_ID_VIA_82C596,   0x10, 0x2f, ATA_UDMA4, },
	{ "vt82c596a",	PCI_DEVICE_ID_VIA_82C596,   0x00, 0x0f, ATA_UDMA2, VIA_BAD_CLK66 },
	{ "vt82c586b",	PCI_DEVICE_ID_VIA_82C586_0, 0x47, 0x4f, ATA_UDMA2, VIA_SET_FIFO },
	{ "vt82c586b",	PCI_DEVICE_ID_VIA_82C586_0, 0x40, 0x46, ATA_UDMA2, VIA_SET_FIFO | VIA_BAD_PREQ },
	{ "vt82c586b",	PCI_DEVICE_ID_VIA_82C586_0, 0x30, 0x3f, ATA_UDMA2, VIA_SET_FIFO },
	{ "vt82c586a",	PCI_DEVICE_ID_VIA_82C586_0, 0x20, 0x2f, ATA_UDMA2, VIA_SET_FIFO },
	{ "vt82c586",	PCI_DEVICE_ID_VIA_82C586_0, 0x00, 0x0f,      0x00, VIA_SET_FIFO },
	{ "vt82c576",	PCI_DEVICE_ID_VIA_82C576,   0x00, 0x2f,      0x00, VIA_SET_FIFO | VIA_NO_UNMASK },
	{ "vt82c576",	PCI_DEVICE_ID_VIA_82C576,   0x00, 0x2f,      0x00, VIA_SET_FIFO | VIA_NO_UNMASK | VIA_BAD_ID },
102
	{ "vtxxxx",	PCI_DEVICE_ID_VIA_ANON,     0x00, 0x2f, ATA_UDMA6, VIA_BAD_AST },
L
Linus Torvalds 已提交
103 104 105 106
	{ NULL }
};

static unsigned int via_clock;
107
static char *via_dma[] = { "16", "25", "33", "44", "66", "100", "133" };
L
Linus Torvalds 已提交
108

109 110 111 112
struct via82cxxx_dev
{
	struct via_isa_bridge *via_config;
	unsigned int via_80w;
113
	u8 cached_device[2];
114 115
};

L
Linus Torvalds 已提交
116 117 118 119 120 121 122 123 124
/**
 *	via_set_speed			-	write timing registers
 *	@dev: PCI device
 *	@dn: device
 *	@timing: IDE timing data to use
 *
 *	via_set_speed writes timing values to the chipset registers
 */

125
static void via_set_speed(ide_hwif_t *hwif, u8 dn, struct ide_timing *timing)
L
Linus Torvalds 已提交
126
{
127
	struct pci_dev *dev = to_pci_dev(hwif->dev);
128 129
	struct ide_host *host = pci_get_drvdata(dev);
	struct via82cxxx_dev *vdev = host->host_priv;
L
Linus Torvalds 已提交
130 131
	u8 t;

132
	if (~vdev->via_config->flags & VIA_BAD_AST) {
L
Linus Torvalds 已提交
133
		pci_read_config_byte(dev, VIA_ADDRESS_SETUP, &t);
H
Harvey Harrison 已提交
134
		t = (t & ~(3 << ((3 - dn) << 1))) | ((clamp_val(timing->setup, 1, 4) - 1) << ((3 - dn) << 1));
L
Linus Torvalds 已提交
135 136 137 138
		pci_write_config_byte(dev, VIA_ADDRESS_SETUP, t);
	}

	pci_write_config_byte(dev, VIA_8BIT_TIMING + (1 - (dn >> 1)),
H
Harvey Harrison 已提交
139
		((clamp_val(timing->act8b, 1, 16) - 1) << 4) | (clamp_val(timing->rec8b, 1, 16) - 1));
L
Linus Torvalds 已提交
140 141

	pci_write_config_byte(dev, VIA_DRIVE_TIMING + (3 - dn),
H
Harvey Harrison 已提交
142
		((clamp_val(timing->active, 1, 16) - 1) << 4) | (clamp_val(timing->recover, 1, 16) - 1));
L
Linus Torvalds 已提交
143

144
	switch (vdev->via_config->udma_mask) {
H
Harvey Harrison 已提交
145 146 147 148
	case ATA_UDMA2: t = timing->udma ? (0xe0 | (clamp_val(timing->udma, 2, 5) - 2)) : 0x03; break;
	case ATA_UDMA4: t = timing->udma ? (0xe8 | (clamp_val(timing->udma, 2, 9) - 2)) : 0x0f; break;
	case ATA_UDMA5: t = timing->udma ? (0xe0 | (clamp_val(timing->udma, 2, 9) - 2)) : 0x07; break;
	case ATA_UDMA6: t = timing->udma ? (0xe0 | (clamp_val(timing->udma, 2, 9) - 2)) : 0x07; break;
149
	default: return;
L
Linus Torvalds 已提交
150 151 152 153 154 155 156 157 158 159
	}

	pci_write_config_byte(dev, VIA_UDMA_TIMING + (3 - dn), t);
}

/**
 *	via_set_drive		-	configure transfer mode
 *	@drive: Drive to set up
 *	@speed: desired speed
 *
160 161
 *	via_set_drive() computes timing values configures the chipset to
 *	a desired transfer mode.  It also can be called by upper layers.
L
Linus Torvalds 已提交
162 163
 */

164
static void via_set_drive(ide_drive_t *drive, const u8 speed)
L
Linus Torvalds 已提交
165
{
166
	ide_hwif_t *hwif = drive->hwif;
167
	ide_drive_t *peer = ide_get_pair_dev(drive);
168
	struct pci_dev *dev = to_pci_dev(hwif->dev);
169 170
	struct ide_host *host = pci_get_drvdata(dev);
	struct via82cxxx_dev *vdev = host->host_priv;
L
Linus Torvalds 已提交
171 172 173 174 175
	struct ide_timing t, p;
	unsigned int T, UT;

	T = 1000000000 / via_clock;

176 177 178 179 180 181
	switch (vdev->via_config->udma_mask) {
	case ATA_UDMA2: UT = T;   break;
	case ATA_UDMA4: UT = T/2; break;
	case ATA_UDMA5: UT = T/3; break;
	case ATA_UDMA6: UT = T/4; break;
	default:	UT = T;
L
Linus Torvalds 已提交
182 183 184 185
	}

	ide_timing_compute(drive, speed, &t, T, UT);

186
	if (peer) {
L
Linus Torvalds 已提交
187 188 189 190
		ide_timing_compute(peer, peer->current_speed, &p, T, UT);
		ide_timing_merge(&p, &t, &t, IDE_TIMING_8BIT);
	}

191
	via_set_speed(hwif, drive->dn, &t);
L
Linus Torvalds 已提交
192 193 194
}

/**
195
 *	via_set_pio_mode	-	set host controller for PIO mode
196 197
 *	@drive: drive
 *	@pio: PIO mode number
L
Linus Torvalds 已提交
198 199 200 201
 *
 *	A callback from the upper layers for PIO-only tuning.
 */

202
static void via_set_pio_mode(ide_drive_t *drive, const u8 pio)
L
Linus Torvalds 已提交
203
{
204
	via_set_drive(drive, XFER_PIO_0 + pio);
L
Linus Torvalds 已提交
205 206
}

207 208 209 210
static struct via_isa_bridge *via_config_find(struct pci_dev **isa)
{
	struct via_isa_bridge *via_config;

211 212
	for (via_config = via_isa_bridges;
	     via_config->id != PCI_DEVICE_ID_VIA_ANON; via_config++)
A
Alan Cox 已提交
213
		if ((*isa = pci_get_device(PCI_VENDOR_ID_VIA +
214 215 216
			!!(via_config->flags & VIA_BAD_ID),
			via_config->id, NULL))) {

217 218
			if ((*isa)->revision >= via_config->rev_min &&
			    (*isa)->revision <= via_config->rev_max)
219
				break;
A
Alan Cox 已提交
220
			pci_dev_put(*isa);
221 222 223
		}

	return via_config;
L
Linus Torvalds 已提交
224 225
}

226 227 228
/*
 * Check and handle 80-wire cable presence
 */
229
static void via_cable_detect(struct via82cxxx_dev *vdev, u32 u)
230 231 232
{
	int i;

233 234
	switch (vdev->via_config->udma_mask) {
		case ATA_UDMA4:
235 236 237 238 239 240 241 242 243 244 245 246
			for (i = 24; i >= 0; i -= 8)
				if (((u >> (i & 16)) & 8) &&
				    ((u >> i) & 0x20) &&
				     (((u >> i) & 7) < 2)) {
					/*
					 * 2x PCI clock and
					 * UDMA w/ < 3T/cycle
					 */
					vdev->via_80w |= (1 << (1 - (i >> 4)));
				}
			break;

247
		case ATA_UDMA5:
248 249 250 251 252 253 254 255 256 257 258
			for (i = 24; i >= 0; i -= 8)
				if (((u >> i) & 0x10) ||
				    (((u >> i) & 0x20) &&
				     (((u >> i) & 7) < 4))) {
					/* BIOS 80-wire bit or
					 * UDMA w/ < 60ns/cycle
					 */
					vdev->via_80w |= (1 << (1 - (i >> 4)));
				}
			break;

259
		case ATA_UDMA6:
260 261 262 263 264 265 266 267 268 269 270 271 272
			for (i = 24; i >= 0; i -= 8)
				if (((u >> i) & 0x10) ||
				    (((u >> i) & 0x20) &&
				     (((u >> i) & 7) < 6))) {
					/* BIOS 80-wire bit or
					 * UDMA w/ < 60ns/cycle
					 */
					vdev->via_80w |= (1 << (1 - (i >> 4)));
				}
			break;
	}
}

L
Linus Torvalds 已提交
273 274 275 276 277 278 279 280
/**
 *	init_chipset_via82cxxx	-	initialization handler
 *	@dev: PCI device
 *
 *	The initialization callback. Here we determine the IDE chip type
 *	and initialize its drive independent registers.
 */

281
static int init_chipset_via82cxxx(struct pci_dev *dev)
L
Linus Torvalds 已提交
282
{
283 284
	struct ide_host *host = pci_get_drvdata(dev);
	struct via82cxxx_dev *vdev = host->host_priv;
285
	struct via_isa_bridge *via_config = vdev->via_config;
L
Linus Torvalds 已提交
286
	u8 t, v;
287 288
	u32 u;

L
Linus Torvalds 已提交
289
	/*
290
	 * Detect cable and configure Clk66
L
Linus Torvalds 已提交
291
	 */
292 293 294
	pci_read_config_dword(dev, VIA_UDMA_TIMING, &u);

	via_cable_detect(vdev, u);
L
Linus Torvalds 已提交
295

296
	if (via_config->udma_mask == ATA_UDMA4) {
297 298 299
		/* Enable Clk66 */
		pci_write_config_dword(dev, VIA_UDMA_TIMING, u|0x80008);
	} else if (via_config->flags & VIA_BAD_CLK66) {
L
Linus Torvalds 已提交
300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336
		/* Would cause trouble on 596a and 686 */
		pci_write_config_dword(dev, VIA_UDMA_TIMING, u & ~0x80008);
	}

	/*
	 * Check whether interfaces are enabled.
	 */

	pci_read_config_byte(dev, VIA_IDE_ENABLE, &v);

	/*
	 * Set up FIFO sizes and thresholds.
	 */

	pci_read_config_byte(dev, VIA_FIFO_CONFIG, &t);

	/* Disable PREQ# till DDACK# */
	if (via_config->flags & VIA_BAD_PREQ) {
		/* Would crash on 586b rev 41 */
		t &= 0x7f;
	}

	/* Fix FIFO split between channels */
	if (via_config->flags & VIA_SET_FIFO) {
		t &= (t & 0x9f);
		switch (v & 3) {
			case 2: t |= 0x00; break;	/* 16 on primary */
			case 1: t |= 0x60; break;	/* 16 on secondary */
			case 3: t |= 0x20; break;	/* 8 pri 8 sec */
		}
	}

	pci_write_config_byte(dev, VIA_FIFO_CONFIG, t);

	return 0;
}

337 338 339 340
/*
 *	Cable special cases
 */

341
static const struct dmi_system_id cable_dmi_table[] = {
342 343 344 345 346 347 348 349 350 351
	{
		.ident = "Acer Ferrari 3400",
		.matches = {
			DMI_MATCH(DMI_BOARD_VENDOR, "Acer,Inc."),
			DMI_MATCH(DMI_BOARD_NAME, "Ferrari 3400"),
		},
	},
	{ }
};

352
static int via_cable_override(struct pci_dev *pdev)
353 354 355 356
{
	/* Systems by DMI */
	if (dmi_check_system(cable_dmi_table))
		return 1;
357 358 359 360 361 362

	/* Arima W730-K8/Targa Visionary 811/... */
	if (pdev->subsystem_vendor == 0x161F &&
	    pdev->subsystem_device == 0x2032)
		return 1;

363 364 365
	return 0;
}

366
static u8 via82cxxx_cable_detect(ide_hwif_t *hwif)
367
{
368
	struct pci_dev *pdev = to_pci_dev(hwif->dev);
369 370
	struct ide_host *host = pci_get_drvdata(pdev);
	struct via82cxxx_dev *vdev = host->host_priv;
371

372
	if (via_cable_override(pdev))
373 374
		return ATA_CBL_PATA40_SHORT;

375 376 377
	if ((vdev->via_config->flags & VIA_SATA_PATA) && hwif->channel == 0)
		return ATA_CBL_SATA;

378 379 380 381 382 383
	if ((vdev->via_80w >> hwif->channel) & 1)
		return ATA_CBL_PATA80;
	else
		return ATA_CBL_PATA40;
}

384 385 386 387 388
static const struct ide_port_ops via_port_ops = {
	.set_pio_mode		= via_set_pio_mode,
	.set_dma_mode		= via_set_drive,
	.cable_detect		= via82cxxx_cable_detect,
};
L
Linus Torvalds 已提交
389

390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444
static void via_write_devctl(ide_hwif_t *hwif, u8 ctl)
{
	struct via82cxxx_dev *vdev = hwif->host->host_priv;

	outb(ctl, hwif->io_ports.ctl_addr);
	outb(vdev->cached_device[hwif->channel], hwif->io_ports.device_addr);
}

static void __via_dev_select(ide_drive_t *drive, u8 select)
{
	ide_hwif_t *hwif = drive->hwif;
	struct via82cxxx_dev *vdev = hwif->host->host_priv;

	outb(select, hwif->io_ports.device_addr);
	vdev->cached_device[hwif->channel] = select;
}

static void via_dev_select(ide_drive_t *drive)
{
	__via_dev_select(drive, drive->select | ATA_DEVICE_OBS);
}

static void via_tf_load(ide_drive_t *drive, struct ide_taskfile *tf, u8 valid)
{
	ide_hwif_t *hwif = drive->hwif;
	struct ide_io_ports *io_ports = &hwif->io_ports;

	if (valid & IDE_VALID_FEATURE)
		outb(tf->feature, io_ports->feature_addr);
	if (valid & IDE_VALID_NSECT)
		outb(tf->nsect, io_ports->nsect_addr);
	if (valid & IDE_VALID_LBAL)
		outb(tf->lbal, io_ports->lbal_addr);
	if (valid & IDE_VALID_LBAM)
		outb(tf->lbam, io_ports->lbam_addr);
	if (valid & IDE_VALID_LBAH)
		outb(tf->lbah, io_ports->lbah_addr);
	if (valid & IDE_VALID_DEVICE)
		__via_dev_select(drive, tf->device);
}

const struct ide_tp_ops via_tp_ops = {
	.exec_command		= ide_exec_command,
	.read_status		= ide_read_status,
	.read_altstatus		= ide_read_altstatus,
	.write_devctl		= via_write_devctl,

	.dev_select		= via_dev_select,
	.tf_load		= via_tf_load,
	.tf_read		= ide_tf_read,

	.input_data		= ide_input_data,
	.output_data		= ide_output_data,
};

445
static const struct ide_port_info via82cxxx_chipset __devinitdata = {
446
	.name		= DRV_NAME,
447 448
	.init_chipset	= init_chipset_via82cxxx,
	.enablebits	= { { 0x40, 0x02, 0x02 }, { 0x40, 0x01, 0x01 } },
449
	.tp_ops		= &via_tp_ops,
450
	.port_ops	= &via_port_ops,
451 452
	.host_flags	= IDE_HFLAG_PIO_NO_BLACKLIST |
			  IDE_HFLAG_POST_SET_MODE |
453
			  IDE_HFLAG_IO_32BIT,
454 455 456
	.pio_mask	= ATA_PIO5,
	.swdma_mask	= ATA_SWDMA2,
	.mwdma_mask	= ATA_MWDMA2,
L
Linus Torvalds 已提交
457 458 459 460
};

static int __devinit via_init_one(struct pci_dev *dev, const struct pci_device_id *id)
{
461 462
	struct pci_dev *isa = NULL;
	struct via_isa_bridge *via_config;
463 464
	struct via82cxxx_dev *vdev;
	int rc;
465
	u8 idx = id->driver_data;
466
	struct ide_port_info d;
467 468

	d = via82cxxx_chipset;
469

470 471 472 473
	/*
	 * Find the ISA bridge and check we know what it is.
	 */
	via_config = via_config_find(&isa);
474

475 476 477
	/*
	 * Print the boot message.
	 */
478
	printk(KERN_INFO DRV_NAME " %s: VIA %s (rev %02x) IDE %sDMA%s\n",
479
		pci_name(dev), via_config->name, isa->revision,
480 481
		via_config->udma_mask ? "U" : "MW",
		via_dma[via_config->udma_mask ?
482
			(fls(via_config->udma_mask) - 1) : 0]);
483 484 485 486 487 488 489 490 491 492 493 494 495 496 497

	pci_dev_put(isa);

	/*
	 * Determine system bus clock.
	 */
	via_clock = (ide_pci_clk ? ide_pci_clk : 33) * 1000;

	switch (via_clock) {
	case 33000: via_clock = 33333; break;
	case 37000: via_clock = 37500; break;
	case 41000: via_clock = 41666; break;
	}

	if (via_clock < 20000 || via_clock > 50000) {
498
		printk(KERN_WARNING DRV_NAME ": User given PCI clock speed "
499 500 501 502
			"impossible (%d), using 33 MHz instead.\n", via_clock);
		via_clock = 33333;
	}

503
	if (idx == 1)
504
		d.enablebits[1].reg = d.enablebits[0].reg = 0;
505 506 507 508 509
	else
		d.host_flags |= IDE_HFLAG_NO_AUTODMA;

	if (idx == VIA_IDFLAG_SINGLE)
		d.host_flags |= IDE_HFLAG_SINGLE;
510 511 512

	if ((via_config->flags & VIA_NO_UNMASK) == 0)
		d.host_flags |= IDE_HFLAG_UNMASK_IRQS;
513

514
	d.udma_mask = via_config->udma_mask;
515

516 517
	vdev = kzalloc(sizeof(*vdev), GFP_KERNEL);
	if (!vdev) {
518 519
		printk(KERN_ERR DRV_NAME " %s: out of memory :(\n",
			pci_name(dev));
520 521 522
		return -ENOMEM;
	}

523 524
	vdev->via_config = via_config;

525 526 527 528 529
	rc = ide_pci_init_one(dev, &d, vdev);
	if (rc)
		kfree(vdev);

	return rc;
L
Linus Torvalds 已提交
530 531
}

532 533 534 535 536 537 538 539 540
static void __devexit via_remove(struct pci_dev *dev)
{
	struct ide_host *host = pci_get_drvdata(dev);
	struct via82cxxx_dev *vdev = host->host_priv;

	ide_pci_remove(dev);
	kfree(vdev);
}

541 542 543
static const struct pci_device_id via_pci_tbl[] = {
	{ PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_82C576_1),  0 },
	{ PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_82C586_1),  0 },
544
	{ PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_CX700_IDE), 0 },
545
	{ PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_VX855_IDE), VIA_IDFLAG_SINGLE },
546
	{ PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_6410),      1 },
547
	{ PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_6415),      1 },
548
	{ PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_SATA_EIDE), 1 },
L
Linus Torvalds 已提交
549 550 551 552
	{ 0, },
};
MODULE_DEVICE_TABLE(pci, via_pci_tbl);

553
static struct pci_driver via_pci_driver = {
L
Linus Torvalds 已提交
554 555 556
	.name 		= "VIA_IDE",
	.id_table 	= via_pci_tbl,
	.probe 		= via_init_one,
557
	.remove		= __devexit_p(via_remove),
558 559
	.suspend	= ide_pci_suspend,
	.resume		= ide_pci_resume,
L
Linus Torvalds 已提交
560 561
};

562
static int __init via_ide_init(void)
L
Linus Torvalds 已提交
563
{
564
	return ide_pci_register_driver(&via_pci_driver);
L
Linus Torvalds 已提交
565 566
}

567 568
static void __exit via_ide_exit(void)
{
569
	pci_unregister_driver(&via_pci_driver);
570 571
}

L
Linus Torvalds 已提交
572
module_init(via_ide_init);
573
module_exit(via_ide_exit);
L
Linus Torvalds 已提交
574

575
MODULE_AUTHOR("Vojtech Pavlik, Bartlomiej Zolnierkiewicz, Michel Aubry, Jeff Garzik, Andre Hedrick");
L
Linus Torvalds 已提交
576 577
MODULE_DESCRIPTION("PCI driver module for VIA IDE");
MODULE_LICENSE("GPL");