Blame view

drivers/ata/pata_artop.c 12.1 KB
09c434b8a   Thomas Gleixner   treewide: Add SPD...
1
  // SPDX-License-Identifier: GPL-2.0-only
669a5db41   Jeff Garzik   [libata] Add a bu...
2
3
4
  /*
   *    pata_artop.c - ARTOP ATA controller driver
   *
ab7716300   Alan Cox   ata: Switch all m...
5
   *	(C) 2006 Red Hat
067f8c7b4   Bartlomiej Zolnierkiewicz   pata_artop: add P...
6
   *	(C) 2007,2011 Bartlomiej Zolnierkiewicz
669a5db41   Jeff Garzik   [libata] Add a bu...
7
8
9
10
11
12
13
14
15
   *
   *    Based in part on drivers/ide/pci/aec62xx.c
   *	Copyright (C) 1999-2002	Andre Hedrick <andre@linux-ide.org>
   *	865/865R fixes for Macintosh card version from a patch to the old
   *		driver by Thibaut VARENE <varenet@parisc-linux.org>
   *	When setting the PCI latency we must set 0x80 or higher for burst
   *		performance Alessandro Zummo <alessandro.zummo@towertech.it>
   *
   *	TODO
669a5db41   Jeff Garzik   [libata] Add a bu...
16
17
18
19
20
21
22
   *	Investigate no_dsc on 850R
   *	Clock detect
   */
  
  #include <linux/kernel.h>
  #include <linux/module.h>
  #include <linux/pci.h>
669a5db41   Jeff Garzik   [libata] Add a bu...
23
24
25
26
27
28
29
30
  #include <linux/blkdev.h>
  #include <linux/delay.h>
  #include <linux/device.h>
  #include <scsi/scsi_host.h>
  #include <linux/libata.h>
  #include <linux/ata.h>
  
  #define DRV_NAME	"pata_artop"
067f8c7b4   Bartlomiej Zolnierkiewicz   pata_artop: add P...
31
  #define DRV_VERSION	"0.4.6"
669a5db41   Jeff Garzik   [libata] Add a bu...
32
33
34
35
36
37
38
39
40
  
  /*
   *	The ARTOP has 33 Mhz and "over clocked" timing tables. Until we
   *	get PCI bus speed functionality we leave this as 0. Its a variable
   *	for when we get the functionality and also for folks wanting to
   *	test stuff.
   */
  
  static int clock = 0;
669a5db41   Jeff Garzik   [libata] Add a bu...
41
  /**
f6b56696b   Bartlomiej Zolnierkiewicz   pata_artop: unify...
42
   *	artop62x0_pre_reset	-	probe begin
cc0680a58   Tejun Heo   libata-link: link...
43
   *	@link: link
d4b2bab4f   Tejun Heo   libata: add deadl...
44
   *	@deadline: deadline jiffies for the operation
669a5db41   Jeff Garzik   [libata] Add a bu...
45
   *
669a5db41   Jeff Garzik   [libata] Add a bu...
46
47
   *	Nothing complicated needed here.
   */
f6b56696b   Bartlomiej Zolnierkiewicz   pata_artop: unify...
48
  static int artop62x0_pre_reset(struct ata_link *link, unsigned long deadline)
669a5db41   Jeff Garzik   [libata] Add a bu...
49
50
51
52
53
  {
  	static const struct pci_bits artop_enable_bits[] = {
  		{ 0x4AU, 1U, 0x02UL, 0x02UL },	/* port 0 */
  		{ 0x4AU, 1U, 0x04UL, 0x04UL },	/* port 1 */
  	};
cc0680a58   Tejun Heo   libata-link: link...
54
  	struct ata_port *ap = link->ap;
669a5db41   Jeff Garzik   [libata] Add a bu...
55
  	struct pci_dev *pdev = to_pci_dev(ap->host->dev);
669a5db41   Jeff Garzik   [libata] Add a bu...
56

f6b56696b   Bartlomiej Zolnierkiewicz   pata_artop: unify...
57
  	/* Odd numbered device ids are the units with enable bits. */
673424c08   Jean Delvare   pata_artop: Fix d...
58
59
  	if ((pdev->device & 1) &&
  	    !pci_test_config_bits(pdev, &artop_enable_bits[ap->port_no]))
c961922b7   Alan Cox   [PATCH] libata-eh...
60
  		return -ENOENT;
27c78b372   Jeff Garzik   [libata reset-seq...
61

9363c3825   Tejun Heo   libata: rename SF...
62
  	return ata_sff_prereset(link, deadline);
a73984a0d   Jeff Garzik   [libata] More PAT...
63
  }
c961922b7   Alan Cox   [PATCH] libata-eh...
64

a73984a0d   Jeff Garzik   [libata] More PAT...
65
66
67
68
  /**
   *	artop6260_cable_detect	-	identify cable type
   *	@ap: Port
   *
c343a8391   Alan Cox   pata: Trivia
69
   *	Identify the cable type for the ARTOP interface in question
a73984a0d   Jeff Garzik   [libata] More PAT...
70
   */
a617c09f6   Jeff Garzik   libata: Trim trai...
71

a73984a0d   Jeff Garzik   [libata] More PAT...
72
73
74
75
  static int artop6260_cable_detect(struct ata_port *ap)
  {
  	struct pci_dev *pdev = to_pci_dev(ap->host->dev);
  	u8 tmp;
669a5db41   Jeff Garzik   [libata] Add a bu...
76
  	pci_read_config_byte(pdev, 0x49, &tmp);
3f9dd27a2   Alexey Dobriyan   [PATCH] pata_arto...
77
  	if (tmp & (1 << ap->port_no))
a73984a0d   Jeff Garzik   [libata] More PAT...
78
79
  		return ATA_CBL_PATA40;
  	return ATA_CBL_PATA80;
669a5db41   Jeff Garzik   [libata] Add a bu...
80
81
82
  }
  
  /**
669a5db41   Jeff Garzik   [libata] Add a bu...
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
   *	artop6210_load_piomode - Load a set of PATA PIO timings
   *	@ap: Port whose timings we are configuring
   *	@adev: Device
   *	@pio: PIO mode
   *
   *	Set PIO mode for device, in host controller PCI config space. This
   *	is used both to set PIO timings in PIO mode and also to set the
   *	matching PIO clocking for UDMA, as well as the MWDMA timings.
   *
   *	LOCKING:
   *	None (inherited from caller).
   */
  
  static void artop6210_load_piomode(struct ata_port *ap, struct ata_device *adev, unsigned int pio)
  {
  	struct pci_dev *pdev	= to_pci_dev(ap->host->dev);
  	int dn = adev->devno + 2 * ap->port_no;
44bdc2fb6   Colin Ian King   ata: pata_artop: ...
100
  	static const u16 timing[2][5] = {
669a5db41   Jeff Garzik   [libata] Add a bu...
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
  		{ 0x0000, 0x000A, 0x0008, 0x0303, 0x0301 },
  		{ 0x0700, 0x070A, 0x0708, 0x0403, 0x0401 }
  
  	};
  	/* Load the PIO timing active/recovery bits */
  	pci_write_config_word(pdev, 0x40 + 2 * dn, timing[clock][pio]);
  }
  
  /**
   *	artop6210_set_piomode - Initialize host controller PATA PIO timings
   *	@ap: Port whose timings we are configuring
   *	@adev: Device we are configuring
   *
   *	Set PIO mode for device, in host controller PCI config space. For
   *	ARTOP we must also clear the UDMA bits if we are not doing UDMA. In
   *	the event UDMA is used the later call to set_dmamode will set the
   *	bits as required.
   *
   *	LOCKING:
   *	None (inherited from caller).
   */
  
  static void artop6210_set_piomode(struct ata_port *ap, struct ata_device *adev)
  {
  	struct pci_dev *pdev	= to_pci_dev(ap->host->dev);
  	int dn = adev->devno + 2 * ap->port_no;
  	u8 ultra;
  
  	artop6210_load_piomode(ap, adev, adev->pio_mode - XFER_PIO_0);
  
  	/* Clear the UDMA mode bits (set_dmamode will redo this if needed) */
  	pci_read_config_byte(pdev, 0x54, &ultra);
  	ultra &= ~(3 << (2 * dn));
  	pci_write_config_byte(pdev, 0x54, ultra);
  }
  
  /**
   *	artop6260_load_piomode - Initialize host controller PATA PIO timings
   *	@ap: Port whose timings we are configuring
   *	@adev: Device we are configuring
   *	@pio: PIO mode
   *
   *	Set PIO mode for device, in host controller PCI config space. The
   *	ARTOP6260 and relatives store the timing data differently.
   *
   *	LOCKING:
   *	None (inherited from caller).
   */
  
  static void artop6260_load_piomode (struct ata_port *ap, struct ata_device *adev, unsigned int pio)
  {
  	struct pci_dev *pdev	= to_pci_dev(ap->host->dev);
  	int dn = adev->devno + 2 * ap->port_no;
44bdc2fb6   Colin Ian King   ata: pata_artop: ...
154
  	static const u8 timing[2][5] = {
669a5db41   Jeff Garzik   [libata] Add a bu...
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
  		{ 0x00, 0x0A, 0x08, 0x33, 0x31 },
  		{ 0x70, 0x7A, 0x78, 0x43, 0x41 }
  
  	};
  	/* Load the PIO timing active/recovery bits */
  	pci_write_config_byte(pdev, 0x40 + dn, timing[clock][pio]);
  }
  
  /**
   *	artop6260_set_piomode - Initialize host controller PATA PIO timings
   *	@ap: Port whose timings we are configuring
   *	@adev: Device we are configuring
   *
   *	Set PIO mode for device, in host controller PCI config space. For
   *	ARTOP we must also clear the UDMA bits if we are not doing UDMA. In
   *	the event UDMA is used the later call to set_dmamode will set the
   *	bits as required.
   *
   *	LOCKING:
   *	None (inherited from caller).
   */
  
  static void artop6260_set_piomode(struct ata_port *ap, struct ata_device *adev)
  {
  	struct pci_dev *pdev	= to_pci_dev(ap->host->dev);
  	u8 ultra;
  
  	artop6260_load_piomode(ap, adev, adev->pio_mode - XFER_PIO_0);
  
  	/* Clear the UDMA mode bits (set_dmamode will redo this if needed) */
  	pci_read_config_byte(pdev, 0x44 + ap->port_no, &ultra);
  	ultra &= ~(7 << (4  * adev->devno));	/* One nibble per drive */
  	pci_write_config_byte(pdev, 0x44 + ap->port_no, ultra);
  }
  
  /**
   *	artop6210_set_dmamode - Initialize host controller PATA PIO timings
   *	@ap: Port whose timings we are configuring
a73984a0d   Jeff Garzik   [libata] More PAT...
193
   *	@adev: Device whose timings we are configuring
669a5db41   Jeff Garzik   [libata] Add a bu...
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
   *
   *	Set DMA mode for device, in host controller PCI config space.
   *
   *	LOCKING:
   *	None (inherited from caller).
   */
  
  static void artop6210_set_dmamode (struct ata_port *ap, struct ata_device *adev)
  {
  	unsigned int pio;
  	struct pci_dev *pdev	= to_pci_dev(ap->host->dev);
  	int dn = adev->devno + 2 * ap->port_no;
  	u8 ultra;
  
  	if (adev->dma_mode == XFER_MW_DMA_0)
  		pio = 1;
  	else
  		pio = 4;
  
  	/* Load the PIO timing active/recovery bits */
  	artop6210_load_piomode(ap, adev, pio);
  
  	pci_read_config_byte(pdev, 0x54, &ultra);
  	ultra &= ~(3 << (2 * dn));
  
  	/* Add ultra DMA bits if in UDMA mode */
  	if (adev->dma_mode >= XFER_UDMA_0) {
  		u8 mode = (adev->dma_mode - XFER_UDMA_0) + 1 - clock;
  		if (mode == 0)
  			mode = 1;
  		ultra |= (mode << (2 * dn));
  	}
  	pci_write_config_byte(pdev, 0x54, ultra);
  }
  
  /**
   *	artop6260_set_dmamode - Initialize host controller PATA PIO timings
   *	@ap: Port whose timings we are configuring
   *	@adev: Device we are configuring
   *
   *	Set DMA mode for device, in host controller PCI config space. The
   *	ARTOP6260 and relatives store the timing data differently.
   *
   *	LOCKING:
   *	None (inherited from caller).
   */
  
  static void artop6260_set_dmamode (struct ata_port *ap, struct ata_device *adev)
  {
01bb12e49   Colin Ian King   ata: pata_artop: ...
243
  	unsigned int pio;
669a5db41   Jeff Garzik   [libata] Add a bu...
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
  	struct pci_dev *pdev	= to_pci_dev(ap->host->dev);
  	u8 ultra;
  
  	if (adev->dma_mode == XFER_MW_DMA_0)
  		pio = 1;
  	else
  		pio = 4;
  
  	/* Load the PIO timing active/recovery bits */
  	artop6260_load_piomode(ap, adev, pio);
  
  	/* Add ultra DMA bits if in UDMA mode */
  	pci_read_config_byte(pdev, 0x44 + ap->port_no, &ultra);
  	ultra &= ~(7 << (4  * adev->devno));	/* One nibble per drive */
  	if (adev->dma_mode >= XFER_UDMA_0) {
  		u8 mode = adev->dma_mode - XFER_UDMA_0 + 1 - clock;
  		if (mode == 0)
  			mode = 1;
  		ultra |= (mode << (4 * adev->devno));
  	}
  	pci_write_config_byte(pdev, 0x44 + ap->port_no, ultra);
  }
140d6fed7   Alan Cox   pata_artop: Seria...
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
  /**
   *	artop_6210_qc_defer	-	implement serialization
   *	@qc: command
   *
   *	Issue commands per host on this chip.
   */
  
  static int artop6210_qc_defer(struct ata_queued_cmd *qc)
  {
  	struct ata_host *host = qc->ap->host;
  	struct ata_port *alt = host->ports[1 ^ qc->ap->port_no];
  	int rc;
  
  	/* First apply the usual rules */
  	rc = ata_std_qc_defer(qc);
  	if (rc != 0)
  		return rc;
  
  	/* Now apply serialization rules. Only allow a command if the
  	   other channel state machine is idle */
  	if (alt && alt->qc_active)
  		return	ATA_DEFER_PORT;
  	return 0;
  }
669a5db41   Jeff Garzik   [libata] Add a bu...
290
  static struct scsi_host_template artop_sht = {
68d1d07b5   Tejun Heo   libata: implement...
291
  	ATA_BMDMA_SHT(DRV_NAME),
669a5db41   Jeff Garzik   [libata] Add a bu...
292
  };
029cfd6b7   Tejun Heo   libata: implement...
293
294
295
  static struct ata_port_operations artop6210_ops = {
  	.inherits		= &ata_bmdma_port_ops,
  	.cable_detect		= ata_cable_40wire,
669a5db41   Jeff Garzik   [libata] Add a bu...
296
297
  	.set_piomode		= artop6210_set_piomode,
  	.set_dmamode		= artop6210_set_dmamode,
f6b56696b   Bartlomiej Zolnierkiewicz   pata_artop: unify...
298
  	.prereset		= artop62x0_pre_reset,
140d6fed7   Alan Cox   pata_artop: Seria...
299
  	.qc_defer		= artop6210_qc_defer,
669a5db41   Jeff Garzik   [libata] Add a bu...
300
  };
029cfd6b7   Tejun Heo   libata: implement...
301
302
303
  static struct ata_port_operations artop6260_ops = {
  	.inherits		= &ata_bmdma_port_ops,
  	.cable_detect		= artop6260_cable_detect,
669a5db41   Jeff Garzik   [libata] Add a bu...
304
305
  	.set_piomode		= artop6260_set_piomode,
  	.set_dmamode		= artop6260_set_dmamode,
f6b56696b   Bartlomiej Zolnierkiewicz   pata_artop: unify...
306
  	.prereset		= artop62x0_pre_reset,
669a5db41   Jeff Garzik   [libata] Add a bu...
307
  };
067f8c7b4   Bartlomiej Zolnierkiewicz   pata_artop: add P...
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
  static void atp8xx_fixup(struct pci_dev *pdev)
  {
  	if (pdev->device == 0x0005)
  		/* BIOS may have left us in UDMA, clear it before libata probe */
  		pci_write_config_byte(pdev, 0x54, 0);
  	else if (pdev->device == 0x0008 || pdev->device == 0x0009) {
  		u8 reg;
  
  		/* Mac systems come up with some registers not set as we
  		   will need them */
  
  		/* Clear reset & test bits */
  		pci_read_config_byte(pdev, 0x49, &reg);
  		pci_write_config_byte(pdev, 0x49, reg & ~0x30);
  
  		/* PCI latency must be > 0x80 for burst mode, tweak it
  		 * if required.
  		 */
  		pci_read_config_byte(pdev, PCI_LATENCY_TIMER, &reg);
  		if (reg <= 0x80)
  			pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0x90);
  
  		/* Enable IRQ output and burst mode */
  		pci_read_config_byte(pdev, 0x4a, &reg);
  		pci_write_config_byte(pdev, 0x4a, (reg & ~0x01) | 0x80);
  	}
  }
669a5db41   Jeff Garzik   [libata] Add a bu...
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
  
  /**
   *	artop_init_one - Register ARTOP ATA PCI device with kernel services
   *	@pdev: PCI device to register
   *	@ent: Entry in artop_pci_tbl matching with @pdev
   *
   *	Called from kernel PCI layer.
   *
   *	LOCKING:
   *	Inherited from PCI layer (may sleep).
   *
   *	RETURNS:
   *	Zero on success, or -ERRNO value.
   */
  
  static int artop_init_one (struct pci_dev *pdev, const struct pci_device_id *id)
  {
1626aeb88   Tejun Heo   libata: clean up ...
352
  	static const struct ata_port_info info_6210 = {
1d2808fd3   Jeff Garzik   [libata] PATA dri...
353
  		.flags		= ATA_FLAG_SLAVE_POSS,
14bdef982   Erik Inge Bolsø   [libata] convert ...
354
355
  		.pio_mask	= ATA_PIO4,
  		.mwdma_mask	= ATA_MWDMA2,
669a5db41   Jeff Garzik   [libata] Add a bu...
356
357
358
  		.udma_mask 	= ATA_UDMA2,
  		.port_ops	= &artop6210_ops,
  	};
1626aeb88   Tejun Heo   libata: clean up ...
359
  	static const struct ata_port_info info_626x = {
1d2808fd3   Jeff Garzik   [libata] PATA dri...
360
  		.flags		= ATA_FLAG_SLAVE_POSS,
14bdef982   Erik Inge Bolsø   [libata] convert ...
361
362
  		.pio_mask	= ATA_PIO4,
  		.mwdma_mask	= ATA_MWDMA2,
669a5db41   Jeff Garzik   [libata] Add a bu...
363
364
365
  		.udma_mask 	= ATA_UDMA4,
  		.port_ops	= &artop6260_ops,
  	};
be456b77f   Bartlomiej Zolnierkiewicz   pata_artop: fix U...
366
  	static const struct ata_port_info info_628x = {
1d2808fd3   Jeff Garzik   [libata] PATA dri...
367
  		.flags		= ATA_FLAG_SLAVE_POSS,
14bdef982   Erik Inge Bolsø   [libata] convert ...
368
369
  		.pio_mask	= ATA_PIO4,
  		.mwdma_mask	= ATA_MWDMA2,
669a5db41   Jeff Garzik   [libata] Add a bu...
370
371
372
  		.udma_mask 	= ATA_UDMA5,
  		.port_ops	= &artop6260_ops,
  	};
be456b77f   Bartlomiej Zolnierkiewicz   pata_artop: fix U...
373
  	static const struct ata_port_info info_628x_fast = {
be456b77f   Bartlomiej Zolnierkiewicz   pata_artop: fix U...
374
  		.flags		= ATA_FLAG_SLAVE_POSS,
14bdef982   Erik Inge Bolsø   [libata] convert ...
375
376
  		.pio_mask	= ATA_PIO4,
  		.mwdma_mask	= ATA_MWDMA2,
be456b77f   Bartlomiej Zolnierkiewicz   pata_artop: fix U...
377
378
379
  		.udma_mask 	= ATA_UDMA6,
  		.port_ops	= &artop6260_ops,
  	};
1626aeb88   Tejun Heo   libata: clean up ...
380
  	const struct ata_port_info *ppi[] = { NULL, NULL };
f08048e94   Tejun Heo   libata: PCI devic...
381
  	int rc;
669a5db41   Jeff Garzik   [libata] Add a bu...
382

06296a1e6   Joe Perches   ata: Add and use ...
383
  	ata_print_version_once(&pdev->dev, DRV_VERSION);
669a5db41   Jeff Garzik   [libata] Add a bu...
384

f08048e94   Tejun Heo   libata: PCI devic...
385
386
387
  	rc = pcim_enable_device(pdev);
  	if (rc)
  		return rc;
067f8c7b4   Bartlomiej Zolnierkiewicz   pata_artop: add P...
388
  	if (id->driver_data == 0)	/* 6210 variant */
1626aeb88   Tejun Heo   libata: clean up ...
389
  		ppi[0] = &info_6210;
669a5db41   Jeff Garzik   [libata] Add a bu...
390
  	else if (id->driver_data == 1)	/* 6260 */
1626aeb88   Tejun Heo   libata: clean up ...
391
  		ppi[0] = &info_626x;
be456b77f   Bartlomiej Zolnierkiewicz   pata_artop: fix U...
392
  	else if (id->driver_data == 2)	{ /* 6280 or 6280 + fast */
669a5db41   Jeff Garzik   [libata] Add a bu...
393
  		unsigned long io = pci_resource_start(pdev, 4);
669a5db41   Jeff Garzik   [libata] Add a bu...
394

be456b77f   Bartlomiej Zolnierkiewicz   pata_artop: fix U...
395
  		ppi[0] = &info_628x;
669a5db41   Jeff Garzik   [libata] Add a bu...
396
  		if (inb(io) & 0x10)
be456b77f   Bartlomiej Zolnierkiewicz   pata_artop: fix U...
397
  			ppi[0] = &info_628x_fast;
669a5db41   Jeff Garzik   [libata] Add a bu...
398
  	}
15a7c3bbe   Jeff Garzik   [libata] pata_art...
399

1626aeb88   Tejun Heo   libata: clean up ...
400
  	BUG_ON(ppi[0] == NULL);
15a7c3bbe   Jeff Garzik   [libata] pata_art...
401

067f8c7b4   Bartlomiej Zolnierkiewicz   pata_artop: add P...
402
  	atp8xx_fixup(pdev);
1c5afdf7a   Tejun Heo   libata-sff: separ...
403
  	return ata_pci_bmdma_init_one(pdev, ppi, &artop_sht, NULL, 0);
669a5db41   Jeff Garzik   [libata] Add a bu...
404
405
406
  }
  
  static const struct pci_device_id artop_pci_tbl[] = {
2d2744fc8   Jeff Garzik   [libata] PCI ID t...
407
408
409
410
411
  	{ PCI_VDEVICE(ARTOP, 0x0005), 0 },
  	{ PCI_VDEVICE(ARTOP, 0x0006), 1 },
  	{ PCI_VDEVICE(ARTOP, 0x0007), 1 },
  	{ PCI_VDEVICE(ARTOP, 0x0008), 2 },
  	{ PCI_VDEVICE(ARTOP, 0x0009), 2 },
669a5db41   Jeff Garzik   [libata] Add a bu...
412
413
  	{ }	/* terminate list */
  };
58eb8cd56   Bartlomiej Zolnierkiewicz   ata: use CONFIG_P...
414
  #ifdef CONFIG_PM_SLEEP
067f8c7b4   Bartlomiej Zolnierkiewicz   pata_artop: add P...
415
416
  static int atp8xx_reinit_one(struct pci_dev *pdev)
  {
0a86e1c85   Jingoo Han   ata: use pci_get_...
417
  	struct ata_host *host = pci_get_drvdata(pdev);
067f8c7b4   Bartlomiej Zolnierkiewicz   pata_artop: add P...
418
419
420
421
422
423
424
425
426
427
428
429
  	int rc;
  
  	rc = ata_pci_device_do_resume(pdev);
  	if (rc)
  		return rc;
  
  	atp8xx_fixup(pdev);
  
  	ata_host_resume(host);
  	return 0;
  }
  #endif
669a5db41   Jeff Garzik   [libata] Add a bu...
430
431
432
433
434
  static struct pci_driver artop_pci_driver = {
  	.name			= DRV_NAME,
  	.id_table		= artop_pci_tbl,
  	.probe			= artop_init_one,
  	.remove			= ata_pci_remove_one,
58eb8cd56   Bartlomiej Zolnierkiewicz   ata: use CONFIG_P...
435
  #ifdef CONFIG_PM_SLEEP
067f8c7b4   Bartlomiej Zolnierkiewicz   pata_artop: add P...
436
437
438
  	.suspend		= ata_pci_device_suspend,
  	.resume			= atp8xx_reinit_one,
  #endif
669a5db41   Jeff Garzik   [libata] Add a bu...
439
  };
2fc75da0c   Axel Lin   ata: use module_p...
440
  module_pci_driver(artop_pci_driver);
669a5db41   Jeff Garzik   [libata] Add a bu...
441

067f8c7b4   Bartlomiej Zolnierkiewicz   pata_artop: add P...
442
  MODULE_AUTHOR("Alan Cox, Bartlomiej Zolnierkiewicz");
669a5db41   Jeff Garzik   [libata] Add a bu...
443
444
445
446
  MODULE_DESCRIPTION("SCSI low-level driver for ARTOP PATA");
  MODULE_LICENSE("GPL");
  MODULE_DEVICE_TABLE(pci, artop_pci_tbl);
  MODULE_VERSION(DRV_VERSION);