Blame view

drivers/ide/trm290.c 10.8 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
   *  Copyright (c) 1997-1998  Mark Lord
93c0b5608   Sergei Shtylyov   trm290: do hook d...
3
   *  Copyright (c) 2007       MontaVista Software, Inc. <source@mvista.com>
58f189fcc   Bartlomiej Zolnierkiewicz   ide: delete filen...
4
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5
6
7
   *  May be copied or modified under the terms of the GNU General Public License
   *
   *  June 22, 2004 - get rid of check_region
59904159c   Jesper Juhl   [PATCH] Update CR...
8
   *                   - Jesper Juhl
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
   *
   */
  
  /*
   * This module provides support for the bus-master IDE DMA function
   * of the Tekram TRM290 chip, used on a variety of PCI IDE add-on boards,
   * including a "Precision Instruments" board.  The TRM290 pre-dates
   * the sff-8038 standard (ide-dma.c) by a few months, and differs
   * significantly enough to warrant separate routines for some functions,
   * while re-using others from ide-dma.c.
   *
   * EXPERIMENTAL!  It works for me (a sample of one).
   *
   * Works reliably for me in DMA mode (READs only),
   * DMA WRITEs are disabled by default (see #define below);
   *
   * DMA is not enabled automatically for this chipset,
   * but can be turned on manually (with "hdparm -d1") at run time.
   *
   * I need volunteers with "spare" drives for further testing
   * and development, and maybe to help figure out the peculiarities.
   * Even knowing the registers (below), some things behave strangely.
   */
  
  #define TRM290_NO_DMA_WRITES	/* DMA writes seem unreliable sometimes */
  
  /*
   * TRM-290 PCI-IDE2 Bus Master Chip
   * ================================
   * The configuration registers are addressed in normal I/O port space
   * and are used as follows:
   *
   * trm290_base depends on jumper settings, and is probed for by ide-dma.c
   *
   * trm290_base+2 when WRITTEN: chiptest register (byte, write-only)
   *	bit7 must always be written as "1"
   *	bits6-2 undefined
   *	bit1 1=legacy_compatible_mode, 0=native_pci_mode
   *	bit0 1=test_mode, 0=normal(default)
   *
   * trm290_base+2 when READ: status register (byte, read-only)
   *	bits7-2 undefined
   *	bit1 channel0 busmaster interrupt status 0=none, 1=asserted
   *	bit0 channel0 interrupt status 0=none, 1=asserted
   *
   * trm290_base+3 Interrupt mask register
   *	bits7-5 undefined
   *	bit4 legacy_header: 1=present, 0=absent
   *	bit3 channel1 busmaster interrupt status 0=none, 1=asserted (read only)
   *	bit2 channel1 interrupt status 0=none, 1=asserted (read only)
   *	bit1 channel1 interrupt mask: 1=masked, 0=unmasked(default)
   *	bit0 channel0 interrupt mask: 1=masked, 0=unmasked(default)
   *
   * trm290_base+1 "CPR" Config Pointer Register (byte)
   *	bit7 1=autoincrement CPR bits 2-0 after each access of CDR
   *	bit6 1=min. 1 wait-state posted write cycle (default), 0=0 wait-state
   *	bit5 0=enabled master burst access (default), 1=disable  (write only)
   *	bit4 PCI DEVSEL# timing select: 1=medium(default), 0=fast
   *	bit3 0=primary IDE channel, 1=secondary IDE channel
   *	bits2-0 register index for accesses through CDR port
   *
   * trm290_base+0 "CDR" Config Data Register (word)
   *	two sets of seven config registers,
   *	selected by CPR bit 3 (channel) and CPR bits 2-0 (index 0 to 6),
   *	each index defined below:
   *
   * Index-0 Base address register for command block (word)
   *	defaults: 0x1f0 for primary, 0x170 for secondary
   *
   * Index-1 general config register (byte)
   *	bit7 1=DMA enable, 0=DMA disable
   *	bit6 1=activate IDE_RESET, 0=no action (default)
   *	bit5 1=enable IORDY, 0=disable IORDY (default)
   *	bit4 0=16-bit data port(default), 1=8-bit (XT) data port
   *	bit3 interrupt polarity: 1=active_low, 0=active_high(default)
   *	bit2 power-saving-mode(?): 1=enable, 0=disable(default) (write only)
   *	bit1 bus_master_mode(?): 1=enable, 0=disable(default)
   *	bit0 enable_io_ports: 1=enable(default), 0=disable
   *
   * Index-2 read-ahead counter preload bits 0-7 (byte, write only)
   *	bits7-0 bits7-0 of readahead count
   *
   * Index-3 read-ahead config register (byte, write only)
   *	bit7 1=enable_readahead, 0=disable_readahead(default)
   *	bit6 1=clear_FIFO, 0=no_action
   *	bit5 undefined
   *	bit4 mode4 timing control: 1=enable, 0=disable(default)
   *	bit3 undefined
   *	bit2 undefined
   *	bits1-0 bits9-8 of read-ahead count
   *
   * Index-4 base address register for control block (word)
   *	defaults: 0x3f6 for primary, 0x376 for secondary
   *
   * Index-5 data port timings (shared by both drives) (byte)
   *	standard PCI "clk" (clock) counts, default value = 0xf5
   *
   *	bits7-6 setup time:  00=1clk, 01=2clk, 10=3clk, 11=4clk
   *	bits5-3 hold time:	000=1clk, 001=2clk, 010=3clk,
   *				011=4clk, 100=5clk, 101=6clk,
   *				110=8clk, 111=12clk
   *	bits2-0 active time:	000=2clk, 001=3clk, 010=4clk,
   *				011=5clk, 100=6clk, 101=8clk,
   *				110=12clk, 111=16clk
   *
   * Index-6 command/control port timings (shared by both drives) (byte)
   *	same layout as Index-5, default value = 0xde
   *
   * Suggested CDR programming for PIO mode0 (600ns):
   *	0x01f0,0x21,0xff,0x80,0x03f6,0xf5,0xde	; primary
   *	0x0170,0x21,0xff,0x80,0x0376,0xf5,0xde	; secondary
   *
   * Suggested CDR programming for PIO mode3 (180ns):
   *	0x01f0,0x21,0xff,0x80,0x03f6,0x09,0xde	; primary
   *	0x0170,0x21,0xff,0x80,0x0376,0x09,0xde	; secondary
   *
   * Suggested CDR programming for PIO mode4 (120ns):
   *	0x01f0,0x21,0xff,0x80,0x03f6,0x00,0xde	; primary
   *	0x0170,0x21,0xff,0x80,0x0376,0x00,0xde	; secondary
   *
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
130
131
132
  #include <linux/types.h>
  #include <linux/module.h>
  #include <linux/kernel.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
133
134
135
136
  #include <linux/ioport.h>
  #include <linux/interrupt.h>
  #include <linux/blkdev.h>
  #include <linux/init.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
137
  #include <linux/pci.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
138
139
140
  #include <linux/ide.h>
  
  #include <asm/io.h>
ced3ec8aa   Bartlomiej Zolnierkiewicz   ide: prefix messa...
141
  #define DRV_NAME "trm290"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
142
143
  static void trm290_prepare_drive (ide_drive_t *drive, unsigned int use_dma)
  {
898ec223f   Bartlomiej Zolnierkiewicz   ide: remove HWIF(...
144
  	ide_hwif_t *hwif = drive->hwif;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
145
146
147
148
149
150
151
152
153
154
155
  	u16 reg = 0;
  	unsigned long flags;
  
  	/* select PIO or DMA */
  	reg = use_dma ? (0x21 | 0x82) : (0x21 & ~0x82);
  
  	local_irq_save(flags);
  
  	if (reg != hwif->select_data) {
  		hwif->select_data = reg;
  		/* set PIO/DMA */
0ecdca26e   Bartlomiej Zolnierkiewicz   ide: use PIO/MMIO...
156
157
  		outb(0x51 | (hwif->channel << 3), hwif->config_data + 1);
  		outw(reg & 0xff, hwif->config_data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
158
159
160
  	}
  
  	/* enable IRQ if not probing */
97100fc81   Bartlomiej Zolnierkiewicz   ide: add device f...
161
  	if (drive->dev_flags & IDE_DFLAG_PRESENT) {
0ecdca26e   Bartlomiej Zolnierkiewicz   ide: use PIO/MMIO...
162
  		reg = inw(hwif->config_data + 3);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
163
164
  		reg &= 0x13;
  		reg &= ~(1 << hwif->channel);
0ecdca26e   Bartlomiej Zolnierkiewicz   ide: use PIO/MMIO...
165
  		outw(reg, hwif->config_data + 3);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
166
167
168
169
  	}
  
  	local_irq_restore(flags);
  }
abb596b25   Sergei Shtylyov   ide: turn selectp...
170
  static void trm290_dev_select(ide_drive_t *drive)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
171
  {
97100fc81   Bartlomiej Zolnierkiewicz   ide: add device f...
172
  	trm290_prepare_drive(drive, !!(drive->dev_flags & IDE_DFLAG_USING_DMA));
abb596b25   Sergei Shtylyov   ide: turn selectp...
173
174
  
  	outb(drive->select | ATA_DEVICE_OBS, drive->hwif->io_ports.device_addr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
175
  }
8a4a5738b   Bartlomiej Zolnierkiewicz   ide: add ->dma_ch...
176
  static int trm290_dma_check(ide_drive_t *drive, struct ide_cmd *cmd)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
177
  {
229816941   Bartlomiej Zolnierkiewicz   ide: pass command...
178
  	if (cmd->tf_flags & IDE_TFLAG_WRITE) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
179
180
  #ifdef TRM290_NO_DMA_WRITES
  		/* always use PIO for writes */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
181
182
  		return 1;
  #endif
8a4a5738b   Bartlomiej Zolnierkiewicz   ide: add ->dma_ch...
183
184
185
186
187
188
189
190
  	}
  	return 0;
  }
  
  static int trm290_dma_setup(ide_drive_t *drive, struct ide_cmd *cmd)
  {
  	ide_hwif_t *hwif = drive->hwif;
  	unsigned int count, rw = (cmd->tf_flags & IDE_TFLAG_WRITE) ? 1 : 2;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
191

229816941   Bartlomiej Zolnierkiewicz   ide: pass command...
192
  	count = ide_build_dmatable(drive, cmd);
11998b316   Bartlomiej Zolnierkiewicz   ide: move ide_map...
193
  	if (count == 0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
194
  		/* try PIO instead of DMA */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
195
  		return 1;
11998b316   Bartlomiej Zolnierkiewicz   ide: move ide_map...
196

4e5a68aeb   Sergei Shtylyov   trm290: cannot ca...
197
  	outl(hwif->dmatable_dma | rw, hwif->dma_base);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
198
  	/* start DMA */
4e5a68aeb   Sergei Shtylyov   trm290: cannot ca...
199
  	outw(count * 2 - 1, hwif->dma_base + 2);
88b4132e1   Bartlomiej Zolnierkiewicz   ide: set/clear dr...
200

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
201
202
  	return 0;
  }
93c0b5608   Sergei Shtylyov   trm290: do hook d...
203
  static void trm290_dma_start(ide_drive_t *drive)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
204
  {
7526efaaf   Bartlomiej Zolnierkiewicz   trm290: use custo...
205
  	trm290_prepare_drive(drive, 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
206
  }
5e37bdc08   Bartlomiej Zolnierkiewicz   ide: add struct i...
207
  static int trm290_dma_end(ide_drive_t *drive)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
208
  {
88b4132e1   Bartlomiej Zolnierkiewicz   ide: set/clear dr...
209
  	u16 status = inw(drive->hwif->dma_base + 2);
898ec223f   Bartlomiej Zolnierkiewicz   ide: remove HWIF(...
210

7526efaaf   Bartlomiej Zolnierkiewicz   trm290: use custo...
211
  	trm290_prepare_drive(drive, 0);
4e5a68aeb   Sergei Shtylyov   trm290: cannot ca...
212
  	return status != 0x00ff;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
213
  }
5e37bdc08   Bartlomiej Zolnierkiewicz   ide: add struct i...
214
  static int trm290_dma_test_irq(ide_drive_t *drive)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
215
  {
898ec223f   Bartlomiej Zolnierkiewicz   ide: remove HWIF(...
216
  	u16 status = inw(drive->hwif->dma_base + 2);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
217

4e5a68aeb   Sergei Shtylyov   trm290: cannot ca...
218
  	return status == 0x00ff;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
219
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
220

15ce926ad   Bartlomiej Zolnierkiewicz   ide: merge ->dma_...
221
  static void trm290_dma_host_set(ide_drive_t *drive, int on)
93c0b5608   Sergei Shtylyov   trm290: do hook d...
222
223
  {
  }
fe31edc8a   Greg Kroah-Hartman   Drivers: ide: rem...
224
  static void init_hwif_trm290(ide_hwif_t *hwif)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
225
  {
36501650e   Bartlomiej Zolnierkiewicz   ide: keep pointer...
226
  	struct pci_dev *dev	= to_pci_dev(hwif->dev);
4e5a68aeb   Sergei Shtylyov   trm290: cannot ca...
227
  	unsigned int  cfg_base	= pci_resource_start(dev, 4);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
228
229
  	unsigned long flags;
  	u8 reg = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
230

4e5a68aeb   Sergei Shtylyov   trm290: cannot ca...
231
  	if ((dev->class & 5) && cfg_base)
ced3ec8aa   Bartlomiej Zolnierkiewicz   ide: prefix messa...
232
  		printk(KERN_INFO DRV_NAME " %s: chip", pci_name(dev));
4e5a68aeb   Sergei Shtylyov   trm290: cannot ca...
233
234
  	else {
  		cfg_base = 0x3df0;
ced3ec8aa   Bartlomiej Zolnierkiewicz   ide: prefix messa...
235
  		printk(KERN_INFO DRV_NAME " %s: using default", pci_name(dev));
4e5a68aeb   Sergei Shtylyov   trm290: cannot ca...
236
237
238
239
240
  	}
  	printk(KERN_CONT " config base at 0x%04x
  ", cfg_base);
  	hwif->config_data = cfg_base;
  	hwif->dma_base = (cfg_base + 4) ^ (hwif->channel ? 0x80 : 0);
b8e73fba6   Bartlomiej Zolnierkiewicz   ide: export ide_a...
241
242
  	printk(KERN_INFO "    %s: BM-DMA at 0x%04lx-0x%04lx
  ",
4e5a68aeb   Sergei Shtylyov   trm290: cannot ca...
243
  	       hwif->name, hwif->dma_base, hwif->dma_base + 3);
b8e73fba6   Bartlomiej Zolnierkiewicz   ide: export ide_a...
244
  	if (ide_allocate_dma_engine(hwif))
4e5a68aeb   Sergei Shtylyov   trm290: cannot ca...
245
  		return;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
246
247
248
  
  	local_irq_save(flags);
  	/* put config reg into first byte of hwif->select_data */
0ecdca26e   Bartlomiej Zolnierkiewicz   ide: use PIO/MMIO...
249
  	outb(0x51 | (hwif->channel << 3), hwif->config_data + 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
250
251
  	/* select PIO as default */
  	hwif->select_data = 0x21;
0ecdca26e   Bartlomiej Zolnierkiewicz   ide: use PIO/MMIO...
252
  	outb(hwif->select_data, hwif->config_data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
253
  	/* get IRQ info */
0ecdca26e   Bartlomiej Zolnierkiewicz   ide: use PIO/MMIO...
254
  	reg = inb(hwif->config_data + 3);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
255
256
  	/* mask IRQs for both ports */
  	reg = (reg & 0x10) | 0x03;
0ecdca26e   Bartlomiej Zolnierkiewicz   ide: use PIO/MMIO...
257
  	outb(reg, hwif->config_data + 3);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
258
  	local_irq_restore(flags);
4e5a68aeb   Sergei Shtylyov   trm290: cannot ca...
259
  	if (reg & 0x10)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
260
261
  		/* legacy mode */
  		hwif->irq = hwif->channel ? 15 : 14;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
262

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
263
264
265
266
267
268
269
270
271
272
  #if 1
  	{
  	/*
  	 * My trm290-based card doesn't seem to work with all possible values
  	 * for the control basereg, so this kludge ensures that we use only
  	 * values that are known to work.  Ugh.		-ml
  	 */
  		u16 new, old, compat = hwif->channel ? 0x374 : 0x3f4;
  		static u16 next_offset = 0;
  		u8 old_mask;
0ecdca26e   Bartlomiej Zolnierkiewicz   ide: use PIO/MMIO...
273
274
  		outb(0x54 | (hwif->channel << 3), hwif->config_data + 1);
  		old = inw(hwif->config_data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
275
  		old &= ~1;
0ecdca26e   Bartlomiej Zolnierkiewicz   ide: use PIO/MMIO...
276
  		old_mask = inb(old + 2);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
277
278
279
  		if (old != compat && old_mask == 0xff) {
  			/* leave lower 10 bits untouched */
  			compat += (next_offset += 0x400);
4c3032d8a   Bartlomiej Zolnierkiewicz   ide: add struct i...
280
  			hwif->io_ports.ctl_addr = compat + 2;
0ecdca26e   Bartlomiej Zolnierkiewicz   ide: use PIO/MMIO...
281
282
  			outw(compat | 1, hwif->config_data);
  			new = inw(hwif->config_data);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
283
284
285
286
287
288
289
290
  			printk(KERN_INFO "%s: control basereg workaround: "
  				"old=0x%04x, new=0x%04x
  ",
  				hwif->name, old, new & ~1);
  		}
  	}
  #endif
  }
abb596b25   Sergei Shtylyov   ide: turn selectp...
291
292
293
294
295
296
297
298
299
300
301
302
  static const struct ide_tp_ops trm290_tp_ops = {
  	.exec_command		= ide_exec_command,
  	.read_status		= ide_read_status,
  	.read_altstatus		= ide_read_altstatus,
  	.write_devctl		= ide_write_devctl,
  
  	.dev_select		= trm290_dev_select,
  	.tf_load		= ide_tf_load,
  	.tf_read		= ide_tf_read,
  
  	.input_data		= ide_input_data,
  	.output_data		= ide_output_data,
ac95beedf   Bartlomiej Zolnierkiewicz   ide: add struct i...
303
  };
b5a608fb2   Julia Lawall   ide: constify ide...
304
  static const struct ide_dma_ops trm290_dma_ops = {
5e37bdc08   Bartlomiej Zolnierkiewicz   ide: add struct i...
305
306
  	.dma_host_set		= trm290_dma_host_set,
  	.dma_setup 		= trm290_dma_setup,
5e37bdc08   Bartlomiej Zolnierkiewicz   ide: add struct i...
307
308
309
  	.dma_start 		= trm290_dma_start,
  	.dma_end		= trm290_dma_end,
  	.dma_test_irq		= trm290_dma_test_irq,
f37afdaca   Bartlomiej Zolnierkiewicz   ide: constify str...
310
  	.dma_lost_irq		= ide_dma_lost_irq,
8a4a5738b   Bartlomiej Zolnierkiewicz   ide: add ->dma_ch...
311
  	.dma_check		= trm290_dma_check,
5e37bdc08   Bartlomiej Zolnierkiewicz   ide: add struct i...
312
  };
fe31edc8a   Greg Kroah-Hartman   Drivers: ide: rem...
313
  static const struct ide_port_info trm290_chipset = {
ced3ec8aa   Bartlomiej Zolnierkiewicz   ide: prefix messa...
314
  	.name		= DRV_NAME,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
315
  	.init_hwif	= init_hwif_trm290,
abb596b25   Sergei Shtylyov   ide: turn selectp...
316
  	.tp_ops 	= &trm290_tp_ops,
5e37bdc08   Bartlomiej Zolnierkiewicz   ide: add struct i...
317
  	.dma_ops	= &trm290_dma_ops,
1f66019bd   Bartlomiej Zolnierkiewicz   trm290: add IDE_H...
318
319
  	.host_flags	= IDE_HFLAG_TRM290 |
  			  IDE_HFLAG_NO_ATAPI_DMA |
9ff6f72f4   Bartlomiej Zolnierkiewicz   ide: remove hwif-...
320
  #if 0 /* play it safe for now */
7cab14a79   Bartlomiej Zolnierkiewicz   ide: add IDE_HFLA...
321
  			  IDE_HFLAG_TRUST_BIOS_FOR_DMA |
9ff6f72f4   Bartlomiej Zolnierkiewicz   ide: remove hwif-...
322
  #endif
47b687882   Bartlomiej Zolnierkiewicz   ide: add IDE_HFLA...
323
  			  IDE_HFLAG_NO_AUTODMA |
238e4f142   Bartlomiej Zolnierkiewicz   ide: add IDE_HFLA...
324
  			  IDE_HFLAG_NO_LBA48,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
325
  };
fe31edc8a   Greg Kroah-Hartman   Drivers: ide: rem...
326
  static int trm290_init_one(struct pci_dev *dev, const struct pci_device_id *id)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
327
  {
6cdf6eb35   Bartlomiej Zolnierkiewicz   ide: add ->dev an...
328
  	return ide_pci_init_one(dev, &trm290_chipset, NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
329
  }
9cbcc5e3c   Bartlomiej Zolnierkiewicz   ide: use PCI_VDEV...
330
331
  static const struct pci_device_id trm290_pci_tbl[] = {
  	{ PCI_VDEVICE(TEKRAM, PCI_DEVICE_ID_TEKRAM_DC290), 0 },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
332
333
334
  	{ 0, },
  };
  MODULE_DEVICE_TABLE(pci, trm290_pci_tbl);
a9ab09e26   Bartlomiej Zolnierkiewicz   ide: use unique n...
335
  static struct pci_driver trm290_pci_driver = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
336
337
338
  	.name		= "TRM290_IDE",
  	.id_table	= trm290_pci_tbl,
  	.probe		= trm290_init_one,
fc2c32b73   Bartlomiej Zolnierkiewicz   trm290: add ->rem...
339
  	.remove		= ide_pci_remove,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
340
  };
82ab1eece   Bartlomiej Zolnierkiewicz   ide: add missing ...
341
  static int __init trm290_ide_init(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
342
  {
a9ab09e26   Bartlomiej Zolnierkiewicz   ide: use unique n...
343
  	return ide_pci_register_driver(&trm290_pci_driver);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
344
  }
fc2c32b73   Bartlomiej Zolnierkiewicz   trm290: add ->rem...
345
346
  static void __exit trm290_ide_exit(void)
  {
a9ab09e26   Bartlomiej Zolnierkiewicz   ide: use unique n...
347
  	pci_unregister_driver(&trm290_pci_driver);
fc2c32b73   Bartlomiej Zolnierkiewicz   trm290: add ->rem...
348
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
349
  module_init(trm290_ide_init);
fc2c32b73   Bartlomiej Zolnierkiewicz   trm290: add ->rem...
350
  module_exit(trm290_ide_exit);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
351
352
353
354
  
  MODULE_AUTHOR("Mark Lord");
  MODULE_DESCRIPTION("PCI driver module for Tekram TRM290 IDE");
  MODULE_LICENSE("GPL");