Blame view

drivers/ata/pata_hpt366.c 10.9 KB
669a5db41   Jeff Garzik   [libata] Add a bu...
1
2
3
4
5
6
7
8
9
10
11
12
13
  /*
   * Libata driver for the highpoint 366 and 368 UDMA66 ATA controllers.
   *
   * This driver is heavily based upon:
   *
   * linux/drivers/ide/pci/hpt366.c		Version 0.36	April 25, 2003
   *
   * Copyright (C) 1999-2003		Andre Hedrick <andre@linux-ide.org>
   * Portions Copyright (C) 2001	        Sun Microsystems, Inc.
   * Portions Copyright (C) 2003		Red Hat Inc
   *
   *
   * TODO
d817898c2   Sergei Shtylyov   pata_hpt366: remo...
14
   *	Look into engine reset on timeout errors. Should not be required.
669a5db41   Jeff Garzik   [libata] Add a bu...
15
   */
8d7b1c70b   Joe Perches   ata: pata: Conver...
16
  #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
669a5db41   Jeff Garzik   [libata] Add a bu...
17
18
19
20
21
22
23
24
25
26
27
  
  #include <linux/kernel.h>
  #include <linux/module.h>
  #include <linux/pci.h>
  #include <linux/init.h>
  #include <linux/blkdev.h>
  #include <linux/delay.h>
  #include <scsi/scsi_host.h>
  #include <linux/libata.h>
  
  #define DRV_NAME	"pata_hpt366"
8d7b1c70b   Joe Perches   ata: pata: Conver...
28
  #define DRV_VERSION	"0.6.11"
669a5db41   Jeff Garzik   [libata] Add a bu...
29
30
  
  struct hpt_clock {
6ecb6f25d   Tejun Heo   pata_hpt366: reim...
31
  	u8	xfer_mode;
669a5db41   Jeff Garzik   [libata] Add a bu...
32
33
34
35
36
  	u32	timing;
  };
  
  /* key for bus clock timings
   * bit
82beb5d89   Sergei Shtylyov   pata_hpt366: fix ...
37
38
39
40
41
   * 0:3    data_high_time. Inactive time of DIOW_/DIOR_ for PIO and MW DMA.
   *        cycles = value + 1
   * 4:7    data_low_time. Active time of DIOW_/DIOR_ for PIO and MW DMA.
   *        cycles = value + 1
   * 8:11   cmd_high_time. Inactive time of DIOW_/DIOR_ during task file
669a5db41   Jeff Garzik   [libata] Add a bu...
42
   *        register access.
82beb5d89   Sergei Shtylyov   pata_hpt366: fix ...
43
   * 12:15  cmd_low_time. Active time of DIOW_/DIOR_ during task file
669a5db41   Jeff Garzik   [libata] Add a bu...
44
   *        register access.
82beb5d89   Sergei Shtylyov   pata_hpt366: fix ...
45
46
47
   * 16:18  udma_cycle_time. Clock cycles for UDMA xfer?
   * 19:21  pre_high_time. Time to initialize 1st cycle for PIO and MW DMA xfer.
   * 22:24  cmd_pre_high_time. Time to initialize 1st PIO cycle for task file
669a5db41   Jeff Garzik   [libata] Add a bu...
48
   *        register access.
82beb5d89   Sergei Shtylyov   pata_hpt366: fix ...
49
50
51
52
   * 28     UDMA enable.
   * 29     DMA  enable.
   * 30     PIO_MST enable. If set, the chip is in bus master mode during
   *        PIO xfer.
669a5db41   Jeff Garzik   [libata] Add a bu...
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
   * 31     FIFO enable.
   */
  
  static const struct hpt_clock hpt366_40[] = {
  	{	XFER_UDMA_4,	0x900fd943	},
  	{	XFER_UDMA_3,	0x900ad943	},
  	{	XFER_UDMA_2,	0x900bd943	},
  	{	XFER_UDMA_1,	0x9008d943	},
  	{	XFER_UDMA_0,	0x9008d943	},
  
  	{	XFER_MW_DMA_2,	0xa008d943	},
  	{	XFER_MW_DMA_1,	0xa010d955	},
  	{	XFER_MW_DMA_0,	0xa010d9fc	},
  
  	{	XFER_PIO_4,	0xc008d963	},
  	{	XFER_PIO_3,	0xc010d974	},
  	{	XFER_PIO_2,	0xc010d997	},
  	{	XFER_PIO_1,	0xc010d9c7	},
  	{	XFER_PIO_0,	0xc018d9d9	},
  	{	0,		0x0120d9d9	}
  };
  
  static const struct hpt_clock hpt366_33[] = {
  	{	XFER_UDMA_4,	0x90c9a731	},
  	{	XFER_UDMA_3,	0x90cfa731	},
  	{	XFER_UDMA_2,	0x90caa731	},
  	{	XFER_UDMA_1,	0x90cba731	},
  	{	XFER_UDMA_0,	0x90c8a731	},
  
  	{	XFER_MW_DMA_2,	0xa0c8a731	},
  	{	XFER_MW_DMA_1,	0xa0c8a732	},	/* 0xa0c8a733 */
  	{	XFER_MW_DMA_0,	0xa0c8a797	},
  
  	{	XFER_PIO_4,	0xc0c8a731	},
  	{	XFER_PIO_3,	0xc0c8a742	},
  	{	XFER_PIO_2,	0xc0d0a753	},
  	{	XFER_PIO_1,	0xc0d0a7a3	},	/* 0xc0d0a793 */
  	{	XFER_PIO_0,	0xc0d0a7aa	},	/* 0xc0d0a7a7 */
  	{	0,		0x0120a7a7	}
  };
  
  static const struct hpt_clock hpt366_25[] = {
  	{	XFER_UDMA_4,	0x90c98521	},
  	{	XFER_UDMA_3,	0x90cf8521	},
  	{	XFER_UDMA_2,	0x90cf8521	},
  	{	XFER_UDMA_1,	0x90cb8521	},
  	{	XFER_UDMA_0,	0x90cb8521	},
  
  	{	XFER_MW_DMA_2,	0xa0ca8521	},
  	{	XFER_MW_DMA_1,	0xa0ca8532	},
  	{	XFER_MW_DMA_0,	0xa0ca8575	},
  
  	{	XFER_PIO_4,	0xc0ca8521	},
  	{	XFER_PIO_3,	0xc0ca8532	},
  	{	XFER_PIO_2,	0xc0ca8542	},
  	{	XFER_PIO_1,	0xc0d08572	},
  	{	XFER_PIO_0,	0xc0d08585	},
  	{	0,		0x01208585	}
  };
dc5e44ec6   Bartlomiej Zolnierkiewicz   pata_hpt366: add ...
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
  /**
   *	hpt36x_find_mode	-	find the hpt36x timing
   *	@ap: ATA port
   *	@speed: transfer mode
   *
   *	Return the 32bit register programming information for this channel
   *	that matches the speed provided.
   */
  
  static u32 hpt36x_find_mode(struct ata_port *ap, int speed)
  {
  	struct hpt_clock *clocks = ap->host->private_data;
  
  	while (clocks->xfer_mode) {
  		if (clocks->xfer_mode == speed)
  			return clocks->timing;
  		clocks++;
  	}
  	BUG();
  	return 0xffffffffU;	/* silence compiler warning */
  }
28cd4b6b4   Sergei Shtylyov   pata_hpt366: codi...
133
134
135
136
137
138
139
  static const char * const bad_ata33[] = {
  	"Maxtor 92720U8", "Maxtor 92040U6", "Maxtor 91360U4", "Maxtor 91020U3",
  	"Maxtor 90845U3", "Maxtor 90650U2",
  	"Maxtor 91360D8", "Maxtor 91190D7", "Maxtor 91020D6", "Maxtor 90845D5",
  	"Maxtor 90680D4", "Maxtor 90510D3", "Maxtor 90340D2",
  	"Maxtor 91152D8", "Maxtor 91008D7", "Maxtor 90845D6", "Maxtor 90840D6",
  	"Maxtor 90720D5", "Maxtor 90648D5", "Maxtor 90576D4",
669a5db41   Jeff Garzik   [libata] Add a bu...
140
141
  	"Maxtor 90510D4",
  	"Maxtor 90432D3", "Maxtor 90288D2", "Maxtor 90256D2",
28cd4b6b4   Sergei Shtylyov   pata_hpt366: codi...
142
143
144
145
  	"Maxtor 91000D8", "Maxtor 90910D8", "Maxtor 90875D7", "Maxtor 90840D7",
  	"Maxtor 90750D6", "Maxtor 90625D5", "Maxtor 90500D4",
  	"Maxtor 91728D8", "Maxtor 91512D7", "Maxtor 91303D6", "Maxtor 91080D5",
  	"Maxtor 90845D4", "Maxtor 90680D4", "Maxtor 90648D3", "Maxtor 90432D2",
669a5db41   Jeff Garzik   [libata] Add a bu...
146
147
  	NULL
  };
28cd4b6b4   Sergei Shtylyov   pata_hpt366: codi...
148
  static const char * const bad_ata66_4[] = {
669a5db41   Jeff Garzik   [libata] Add a bu...
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
  	"IBM-DTLA-307075",
  	"IBM-DTLA-307060",
  	"IBM-DTLA-307045",
  	"IBM-DTLA-307030",
  	"IBM-DTLA-307020",
  	"IBM-DTLA-307015",
  	"IBM-DTLA-305040",
  	"IBM-DTLA-305030",
  	"IBM-DTLA-305020",
  	"IC35L010AVER07-0",
  	"IC35L020AVER07-0",
  	"IC35L030AVER07-0",
  	"IC35L040AVER07-0",
  	"IC35L060AVER07-0",
  	"WDC AC310200R",
  	NULL
  };
28cd4b6b4   Sergei Shtylyov   pata_hpt366: codi...
166
  static const char * const bad_ata66_3[] = {
669a5db41   Jeff Garzik   [libata] Add a bu...
167
168
169
  	"WDC AC310200R",
  	NULL
  };
28cd4b6b4   Sergei Shtylyov   pata_hpt366: codi...
170
171
  static int hpt_dma_blacklisted(const struct ata_device *dev, char *modestr,
  			       const char * const list[])
669a5db41   Jeff Garzik   [libata] Add a bu...
172
  {
8bfa79fcb   Tejun Heo   libata: use ata_i...
173
  	unsigned char model_num[ATA_ID_PROD_LEN + 1];
669a5db41   Jeff Garzik   [libata] Add a bu...
174
  	int i = 0;
8bfa79fcb   Tejun Heo   libata: use ata_i...
175
  	ata_id_c_string(dev->id, model_num, ATA_ID_PROD, sizeof(model_num));
669a5db41   Jeff Garzik   [libata] Add a bu...
176

8bfa79fcb   Tejun Heo   libata: use ata_i...
177
178
  	while (list[i] != NULL) {
  		if (!strcmp(list[i], model_num)) {
8d7b1c70b   Joe Perches   ata: pata: Conver...
179
180
181
  			pr_warn("%s is not supported for %s
  ",
  				modestr, list[i]);
669a5db41   Jeff Garzik   [libata] Add a bu...
182
183
184
185
186
187
188
189
190
  			return 1;
  		}
  		i++;
  	}
  	return 0;
  }
  
  /**
   *	hpt366_filter	-	mode selection filter
669a5db41   Jeff Garzik   [libata] Add a bu...
191
192
193
194
   *	@adev: ATA device
   *
   *	Block UDMA on devices that cause trouble with this controller.
   */
85cd7251b   Jeff Garzik   [libata #pata-dri...
195

a76b62ca7   Alan Cox   libata: Change pr...
196
  static unsigned long hpt366_filter(struct ata_device *adev, unsigned long mask)
669a5db41   Jeff Garzik   [libata] Add a bu...
197
198
199
200
201
  {
  	if (adev->class == ATA_DEV_ATA) {
  		if (hpt_dma_blacklisted(adev, "UDMA",  bad_ata33))
  			mask &= ~ATA_MASK_UDMA;
  		if (hpt_dma_blacklisted(adev, "UDMA3", bad_ata66_3))
6ddd68615   Alan Cox   pata_hpt*, pata_s...
202
  			mask &= ~(0xF8 << ATA_SHIFT_UDMA);
669a5db41   Jeff Garzik   [libata] Add a bu...
203
  		if (hpt_dma_blacklisted(adev, "UDMA4", bad_ata66_4))
6ddd68615   Alan Cox   pata_hpt*, pata_s...
204
  			mask &= ~(0xF0 << ATA_SHIFT_UDMA);
3ee89f177   Tejun Heo   pata_hpt366: no A...
205
206
  	} else if (adev->class == ATA_DEV_ATAPI)
  		mask &= ~(ATA_MASK_MWDMA | ATA_MASK_UDMA);
c7087652e   Tejun Heo   libata-sff: clean...
207
  	return mask;
669a5db41   Jeff Garzik   [libata] Add a bu...
208
  }
fecfda5d8   Alan Cox   pata_hpt366: supp...
209
210
  static int hpt36x_cable_detect(struct ata_port *ap)
  {
fecfda5d8   Alan Cox   pata_hpt366: supp...
211
  	struct pci_dev *pdev = to_pci_dev(ap->host->dev);
bab5b32a5   Tejun Heo   pata_hpt366: fix ...
212
  	u8 ata66;
fecfda5d8   Alan Cox   pata_hpt366: supp...
213

bab5b32a5   Tejun Heo   pata_hpt366: fix ...
214
215
216
217
  	/*
  	 * Each channel of pata_hpt366 occupies separate PCI function
  	 * as the primary channel and bit1 indicates the cable type.
  	 */
fecfda5d8   Alan Cox   pata_hpt366: supp...
218
  	pci_read_config_byte(pdev, 0x5A, &ata66);
bab5b32a5   Tejun Heo   pata_hpt366: fix ...
219
  	if (ata66 & 2)
fecfda5d8   Alan Cox   pata_hpt366: supp...
220
221
222
  		return ATA_CBL_PATA40;
  	return ATA_CBL_PATA80;
  }
6ecb6f25d   Tejun Heo   pata_hpt366: reim...
223
224
  static void hpt366_set_mode(struct ata_port *ap, struct ata_device *adev,
  			    u8 mode)
669a5db41   Jeff Garzik   [libata] Add a bu...
225
226
  {
  	struct pci_dev *pdev = to_pci_dev(ap->host->dev);
859faa875   Sergei Shtylyov   pata_hpt366: remo...
227
  	u32 addr = 0x40 + 4 * adev->devno;
dc5e44ec6   Bartlomiej Zolnierkiewicz   pata_hpt366: add ...
228
  	u32 mask, reg, t;
85cd7251b   Jeff Garzik   [libata #pata-dri...
229

6ecb6f25d   Tejun Heo   pata_hpt366: reim...
230
231
232
233
234
235
236
  	/* determine timing mask and find matching clock entry */
  	if (mode < XFER_MW_DMA_0)
  		mask = 0xc1f8ffff;
  	else if (mode < XFER_UDMA_0)
  		mask = 0x303800ff;
  	else
  		mask = 0x30070000;
dc5e44ec6   Bartlomiej Zolnierkiewicz   pata_hpt366: add ...
237
  	t = hpt36x_find_mode(ap, mode);
6ecb6f25d   Tejun Heo   pata_hpt366: reim...
238
239
240
241
242
243
  
  	/*
  	 * Combine new mode bits with old config bits and disable
  	 * on-chip PIO FIFO/buffer (and PIO MST mode as well) to avoid
  	 * problems handling I/O errors later.
  	 */
859faa875   Sergei Shtylyov   pata_hpt366: remo...
244
  	pci_read_config_dword(pdev, addr, &reg);
dc5e44ec6   Bartlomiej Zolnierkiewicz   pata_hpt366: add ...
245
  	reg = ((reg & ~mask) | (t & mask)) & ~0xc0000000;
859faa875   Sergei Shtylyov   pata_hpt366: remo...
246
  	pci_write_config_dword(pdev, addr, reg);
6ecb6f25d   Tejun Heo   pata_hpt366: reim...
247
248
249
250
251
252
253
254
255
256
257
258
259
  }
  
  /**
   *	hpt366_set_piomode		-	PIO setup
   *	@ap: ATA interface
   *	@adev: device on the interface
   *
   *	Perform PIO mode setup.
   */
  
  static void hpt366_set_piomode(struct ata_port *ap, struct ata_device *adev)
  {
  	hpt366_set_mode(ap, adev, adev->pio_mode);
669a5db41   Jeff Garzik   [libata] Add a bu...
260
261
262
263
264
265
266
267
268
269
  }
  
  /**
   *	hpt366_set_dmamode		-	DMA timing setup
   *	@ap: ATA interface
   *	@adev: Device being configured
   *
   *	Set up the channel for MWDMA or UDMA modes. Much the same as with
   *	PIO, load the mode number and then set MWDMA or UDMA flag.
   */
85cd7251b   Jeff Garzik   [libata #pata-dri...
270

669a5db41   Jeff Garzik   [libata] Add a bu...
271
272
  static void hpt366_set_dmamode(struct ata_port *ap, struct ata_device *adev)
  {
6ecb6f25d   Tejun Heo   pata_hpt366: reim...
273
  	hpt366_set_mode(ap, adev, adev->dma_mode);
669a5db41   Jeff Garzik   [libata] Add a bu...
274
275
276
  }
  
  static struct scsi_host_template hpt36x_sht = {
68d1d07b5   Tejun Heo   libata: implement...
277
  	ATA_BMDMA_SHT(DRV_NAME),
669a5db41   Jeff Garzik   [libata] Add a bu...
278
279
280
281
282
  };
  
  /*
   *	Configuration for HPT366/68
   */
85cd7251b   Jeff Garzik   [libata #pata-dri...
283

669a5db41   Jeff Garzik   [libata] Add a bu...
284
  static struct ata_port_operations hpt366_port_ops = {
029cfd6b7   Tejun Heo   libata: implement...
285
286
287
  	.inherits	= &ata_bmdma_port_ops,
  	.cable_detect	= hpt36x_cable_detect,
  	.mode_filter	= hpt366_filter,
669a5db41   Jeff Garzik   [libata] Add a bu...
288
289
  	.set_piomode	= hpt366_set_piomode,
  	.set_dmamode	= hpt366_set_dmamode,
85cd7251b   Jeff Garzik   [libata #pata-dri...
290
  };
669a5db41   Jeff Garzik   [libata] Add a bu...
291
292
  
  /**
aa54ab1ef   Alan Cox   [PATCH] hpt36x: S...
293
294
295
296
297
298
299
300
301
302
   *	hpt36x_init_chipset	-	common chip setup
   *	@dev: PCI device
   *
   *	Perform the chip setup work that must be done at both init and
   *	resume time
   */
  
  static void hpt36x_init_chipset(struct pci_dev *dev)
  {
  	u8 drive_fast;
28cd4b6b4   Sergei Shtylyov   pata_hpt366: codi...
303

aa54ab1ef   Alan Cox   [PATCH] hpt36x: S...
304
305
306
307
308
309
310
311
312
313
314
  	pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, (L1_CACHE_BYTES / 4));
  	pci_write_config_byte(dev, PCI_LATENCY_TIMER, 0x78);
  	pci_write_config_byte(dev, PCI_MIN_GNT, 0x08);
  	pci_write_config_byte(dev, PCI_MAX_LAT, 0x08);
  
  	pci_read_config_byte(dev, 0x51, &drive_fast);
  	if (drive_fast & 0x80)
  		pci_write_config_byte(dev, 0x51, drive_fast & ~0x80);
  }
  
  /**
669a5db41   Jeff Garzik   [libata] Add a bu...
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
   *	hpt36x_init_one		-	Initialise an HPT366/368
   *	@dev: PCI device
   *	@id: Entry in match table
   *
   *	Initialise an HPT36x device. There are some interesting complications
   *	here. Firstly the chip may report 366 and be one of several variants.
   *	Secondly all the timings depend on the clock for the chip which we must
   *	detect and look up
   *
   *	This is the known chip mappings. It may be missing a couple of later
   *	releases.
   *
   *	Chip version		PCI		Rev	Notes
   *	HPT366			4 (HPT366)	0	UDMA66
   *	HPT366			4 (HPT366)	1	UDMA66
   *	HPT368			4 (HPT366)	2	UDMA66
   *	HPT37x/30x		4 (HPT366)	3+	Other driver
   *
   */
85cd7251b   Jeff Garzik   [libata #pata-dri...
334

669a5db41   Jeff Garzik   [libata] Add a bu...
335
336
  static int hpt36x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
  {
1626aeb88   Tejun Heo   libata: clean up ...
337
  	static const struct ata_port_info info_hpt366 = {
1d2808fd3   Jeff Garzik   [libata] PATA dri...
338
  		.flags = ATA_FLAG_SLAVE_POSS,
14bdef982   Erik Inge Bolsø   [libata] convert ...
339
340
  		.pio_mask = ATA_PIO4,
  		.mwdma_mask = ATA_MWDMA2,
bf6263a85   Jeff Garzik   [libata] Use ATA_...
341
  		.udma_mask = ATA_UDMA4,
669a5db41   Jeff Garzik   [libata] Add a bu...
342
343
  		.port_ops = &hpt366_port_ops
  	};
887125e37   Tejun Heo   libata: stop over...
344
  	const struct ata_port_info *ppi[] = { &info_hpt366, NULL };
669a5db41   Jeff Garzik   [libata] Add a bu...
345

887125e37   Tejun Heo   libata: stop over...
346
  	void *hpriv = NULL;
669a5db41   Jeff Garzik   [libata] Add a bu...
347
  	u32 reg1;
f08048e94   Tejun Heo   libata: PCI devic...
348
349
350
351
352
  	int rc;
  
  	rc = pcim_enable_device(dev);
  	if (rc)
  		return rc;
669a5db41   Jeff Garzik   [libata] Add a bu...
353

669a5db41   Jeff Garzik   [libata] Add a bu...
354
355
  	/* May be a later chip in disguise. Check */
  	/* Newer chips are not in the HPT36x driver. Ignore them */
89d3b3603   Sergei Shtylyov   ata: use pci_dev-...
356
357
  	if (dev->revision > 2)
  		return -ENODEV;
669a5db41   Jeff Garzik   [libata] Add a bu...
358

aa54ab1ef   Alan Cox   [PATCH] hpt36x: S...
359
  	hpt36x_init_chipset(dev);
669a5db41   Jeff Garzik   [libata] Add a bu...
360
361
  
  	pci_read_config_dword(dev, 0x40,  &reg1);
85cd7251b   Jeff Garzik   [libata #pata-dri...
362

669a5db41   Jeff Garzik   [libata] Add a bu...
363
364
  	/* PCI clocking determines the ATA timing values to use */
  	/* info_hpt366 is safe against re-entry so we can scribble on it */
28cd4b6b4   Sergei Shtylyov   pata_hpt366: codi...
365
366
367
368
369
370
371
372
373
374
  	switch ((reg1 & 0x700) >> 8) {
  	case 9:
  		hpriv = &hpt366_40;
  		break;
  	case 5:
  		hpriv = &hpt366_25;
  		break;
  	default:
  		hpriv = &hpt366_33;
  		break;
669a5db41   Jeff Garzik   [libata] Add a bu...
375
376
  	}
  	/* Now kick off ATA set up */
1c5afdf7a   Tejun Heo   libata-sff: separ...
377
  	return ata_pci_bmdma_init_one(dev, ppi, &hpt36x_sht, hpriv, 0);
669a5db41   Jeff Garzik   [libata] Add a bu...
378
  }
438ac6d5e   Tejun Heo   libata: add missi...
379
  #ifdef CONFIG_PM
aa54ab1ef   Alan Cox   [PATCH] hpt36x: S...
380
381
  static int hpt36x_reinit_one(struct pci_dev *dev)
  {
f08048e94   Tejun Heo   libata: PCI devic...
382
383
384
385
386
387
  	struct ata_host *host = dev_get_drvdata(&dev->dev);
  	int rc;
  
  	rc = ata_pci_device_do_resume(dev);
  	if (rc)
  		return rc;
aa54ab1ef   Alan Cox   [PATCH] hpt36x: S...
388
  	hpt36x_init_chipset(dev);
f08048e94   Tejun Heo   libata: PCI devic...
389
390
  	ata_host_resume(host);
  	return 0;
aa54ab1ef   Alan Cox   [PATCH] hpt36x: S...
391
  }
438ac6d5e   Tejun Heo   libata: add missi...
392
  #endif
aa54ab1ef   Alan Cox   [PATCH] hpt36x: S...
393

2d2744fc8   Jeff Garzik   [libata] PCI ID t...
394
395
  static const struct pci_device_id hpt36x[] = {
  	{ PCI_VDEVICE(TTI, PCI_DEVICE_ID_TTI_HPT366), },
2d2744fc8   Jeff Garzik   [libata] PCI ID t...
396
  	{ },
669a5db41   Jeff Garzik   [libata] Add a bu...
397
398
399
  };
  
  static struct pci_driver hpt36x_pci_driver = {
28cd4b6b4   Sergei Shtylyov   pata_hpt366: codi...
400
  	.name		= DRV_NAME,
669a5db41   Jeff Garzik   [libata] Add a bu...
401
  	.id_table	= hpt36x,
28cd4b6b4   Sergei Shtylyov   pata_hpt366: codi...
402
  	.probe		= hpt36x_init_one,
aa54ab1ef   Alan Cox   [PATCH] hpt36x: S...
403
  	.remove		= ata_pci_remove_one,
438ac6d5e   Tejun Heo   libata: add missi...
404
  #ifdef CONFIG_PM
aa54ab1ef   Alan Cox   [PATCH] hpt36x: S...
405
406
  	.suspend	= ata_pci_device_suspend,
  	.resume		= hpt36x_reinit_one,
438ac6d5e   Tejun Heo   libata: add missi...
407
  #endif
669a5db41   Jeff Garzik   [libata] Add a bu...
408
409
410
411
412
413
  };
  
  static int __init hpt36x_init(void)
  {
  	return pci_register_driver(&hpt36x_pci_driver);
  }
669a5db41   Jeff Garzik   [libata] Add a bu...
414
415
416
417
  static void __exit hpt36x_exit(void)
  {
  	pci_unregister_driver(&hpt36x_pci_driver);
  }
669a5db41   Jeff Garzik   [libata] Add a bu...
418
419
420
421
422
423
424
425
  MODULE_AUTHOR("Alan Cox");
  MODULE_DESCRIPTION("low-level driver for the Highpoint HPT366/368");
  MODULE_LICENSE("GPL");
  MODULE_DEVICE_TABLE(pci, hpt36x);
  MODULE_VERSION(DRV_VERSION);
  
  module_init(hpt36x_init);
  module_exit(hpt36x_exit);