Blame view

drivers/ide/ide.c 10.4 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
  /*
59bca8cc9   Bartlomiej Zolnierkiewicz   ide: update/add m...
2
   *  Copyright (C) 1994-1998	    Linus Torvalds & authors (see below)
fc410698e   Pavel Machek   ide: small whites...
3
   *  Copyright (C) 2003-2005, 2007   Bartlomiej Zolnierkiewicz
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4
5
6
7
8
9
10
11
12
13
14
15
16
17
   */
  
  /*
   *  Mostly written by Mark Lord  <mlord@pobox.com>
   *                and Gadi Oxman <gadio@netvision.net.il>
   *                and Andre Hedrick <andre@linux-ide.org>
   *
   *  See linux/MAINTAINERS for address of current maintainer.
   *
   * This is the multiple IDE interface driver, as evolved from hd.c.
   * It supports up to MAX_HWIFS IDE interfaces, on one or more IRQs
   *   (usually 14 & 15).
   * There can be up to two drives per interface, as per the ATA-2 spec.
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
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
   * ...
   *
   *  From hd.c:
   *  |
   *  | It traverses the request-list, using interrupts to jump between functions.
   *  | As nearly all functions can be called within interrupts, we may not sleep.
   *  | Special care is recommended.  Have Fun!
   *  |
   *  | modified by Drew Eckhardt to check nr of hd's from the CMOS.
   *  |
   *  | Thanks to Branko Lankester, lankeste@fwi.uva.nl, who found a bug
   *  | in the early extended-partition checks and added DM partitions.
   *  |
   *  | Early work on error handling by Mika Liljeberg (liljeber@cs.Helsinki.FI).
   *  |
   *  | IRQ-unmask, drive-id, multiple-mode, support for ">16 heads",
   *  | and general streamlining by Mark Lord (mlord@pobox.com).
   *
   *  October, 1994 -- Complete line-by-line overhaul for linux 1.1.x, by:
   *
   *	Mark Lord	(mlord@pobox.com)		(IDE Perf.Pkg)
   *	Delman Lee	(delman@ieee.org)		("Mr. atdisk2")
   *	Scott Snyder	(snyder@fnald0.fnal.gov)	(ATAPI IDE cd-rom)
   *
   *  This was a rewrite of just about everything from hd.c, though some original
   *  code is still sprinkled about.  Think of it as a major evolution, with
   *  inspiration from lots of linux users, esp.  hamish@zot.apana.org.au
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
45
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
46
47
48
49
  #include <linux/module.h>
  #include <linux/types.h>
  #include <linux/string.h>
  #include <linux/kernel.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
50
51
52
53
  #include <linux/interrupt.h>
  #include <linux/major.h>
  #include <linux/errno.h>
  #include <linux/genhd.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
54
55
  #include <linux/init.h>
  #include <linux/pci.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
56
  #include <linux/ide.h>
3ceca727f   Bartlomiej Zolnierkiewicz   ide: include <lin...
57
  #include <linux/hdreg.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
58
  #include <linux/completion.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
59
  #include <linux/device.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
60

f74c91413   Bartlomiej Zolnierkiewicz   ide: add warm-plu...
61
  struct class *ide_port_class;
08da591e1   Bartlomiej Zolnierkiewicz   ide: add ide_devi...
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
  /**
   * ide_device_get	-	get an additional reference to a ide_drive_t
   * @drive:	device to get a reference to
   *
   * Gets a reference to the ide_drive_t and increments the use count of the
   * underlying LLDD module.
   */
  int ide_device_get(ide_drive_t *drive)
  {
  	struct device *host_dev;
  	struct module *module;
  
  	if (!get_device(&drive->gendev))
  		return -ENXIO;
  
  	host_dev = drive->hwif->host->dev[0];
  	module = host_dev ? host_dev->driver->owner : NULL;
  
  	if (module && !try_module_get(module)) {
  		put_device(&drive->gendev);
  		return -ENXIO;
  	}
  
  	return 0;
  }
  EXPORT_SYMBOL_GPL(ide_device_get);
  
  /**
   * ide_device_put	-	release a reference to a ide_drive_t
   * @drive:	device to release a reference on
   *
   * Release a reference to the ide_drive_t and decrements the use count of
   * the underlying LLDD module.
   */
  void ide_device_put(ide_drive_t *drive)
  {
  #ifdef CONFIG_MODULE_UNLOAD
  	struct device *host_dev = drive->hwif->host->dev[0];
  	struct module *module = host_dev ? host_dev->driver->owner : NULL;
1746fbe56   Markus Elfring   IDE: Deletion of ...
101
  	module_put(module);
08da591e1   Bartlomiej Zolnierkiewicz   ide: add ide_devi...
102
103
104
105
  #endif
  	put_device(&drive->gendev);
  }
  EXPORT_SYMBOL_GPL(ide_device_put);
8604affde   Bartlomiej Zolnierkiewicz   [PATCH] convert I...
106
107
108
109
  static int ide_bus_match(struct device *dev, struct device_driver *drv)
  {
  	return 1;
  }
7eff2e7a8   Kay Sievers   Driver core: chan...
110
  static int ide_uevent(struct device *dev, struct kobj_uevent_env *env)
263756ec2   Kay Sievers   [PATCH] ide: MODA...
111
112
  {
  	ide_drive_t *drive = to_ide_device(dev);
7eff2e7a8   Kay Sievers   Driver core: chan...
113

ebdab07da   Bartlomiej Zolnierkiewicz   ide: move sysfs s...
114
  	add_uevent_var(env, "MEDIA=%s", ide_media_string(drive));
7eff2e7a8   Kay Sievers   Driver core: chan...
115
  	add_uevent_var(env, "DRIVENAME=%s", drive->name);
ebdab07da   Bartlomiej Zolnierkiewicz   ide: move sysfs s...
116
  	add_uevent_var(env, "MODALIAS=ide:m-%s", ide_media_string(drive));
263756ec2   Kay Sievers   [PATCH] ide: MODA...
117
118
  	return 0;
  }
4031bbe4b   Russell King   [PATCH] Add ide_b...
119
120
121
  static int generic_ide_probe(struct device *dev)
  {
  	ide_drive_t *drive = to_ide_device(dev);
7f3c868ba   Bartlomiej Zolnierkiewicz   ide: remove ide_d...
122
  	struct ide_driver *drv = to_ide_driver(dev->driver);
4031bbe4b   Russell King   [PATCH] Add ide_b...
123
124
125
126
127
128
129
  
  	return drv->probe ? drv->probe(drive) : -ENODEV;
  }
  
  static int generic_ide_remove(struct device *dev)
  {
  	ide_drive_t *drive = to_ide_device(dev);
7f3c868ba   Bartlomiej Zolnierkiewicz   ide: remove ide_d...
130
  	struct ide_driver *drv = to_ide_driver(dev->driver);
4031bbe4b   Russell King   [PATCH] Add ide_b...
131
132
133
134
135
136
137
138
139
140
  
  	if (drv->remove)
  		drv->remove(drive);
  
  	return 0;
  }
  
  static void generic_ide_shutdown(struct device *dev)
  {
  	ide_drive_t *drive = to_ide_device(dev);
7f3c868ba   Bartlomiej Zolnierkiewicz   ide: remove ide_d...
141
  	struct ide_driver *drv = to_ide_driver(dev->driver);
4031bbe4b   Russell King   [PATCH] Add ide_b...
142
143
144
145
  
  	if (dev->driver && drv->shutdown)
  		drv->shutdown(drive);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
146
147
  struct bus_type ide_bus_type = {
  	.name		= "ide",
8604affde   Bartlomiej Zolnierkiewicz   [PATCH] convert I...
148
  	.match		= ide_bus_match,
263756ec2   Kay Sievers   [PATCH] ide: MODA...
149
  	.uevent		= ide_uevent,
4031bbe4b   Russell King   [PATCH] Add ide_b...
150
151
152
  	.probe		= generic_ide_probe,
  	.remove		= generic_ide_remove,
  	.shutdown	= generic_ide_shutdown,
fb3fed792   Greg Kroah-Hartman   ide: convert bus ...
153
  	.dev_groups	= ide_dev_groups,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
154
155
156
  	.suspend	= generic_ide_suspend,
  	.resume		= generic_ide_resume,
  };
8604affde   Bartlomiej Zolnierkiewicz   [PATCH] convert I...
157
  EXPORT_SYMBOL_GPL(ide_bus_type);
ebae41a5a   Bartlomiej Zolnierkiewicz   ide: add "vlb|pci...
158
159
160
161
162
163
164
165
166
167
168
  int ide_vlb_clk;
  EXPORT_SYMBOL_GPL(ide_vlb_clk);
  
  module_param_named(vlb_clock, ide_vlb_clk, int, 0);
  MODULE_PARM_DESC(vlb_clock, "VLB clock frequency (in MHz)");
  
  int ide_pci_clk;
  EXPORT_SYMBOL_GPL(ide_pci_clk);
  
  module_param_named(pci_clock, ide_pci_clk, int, 0);
  MODULE_PARM_DESC(pci_clock, "PCI bus clock frequency (in MHz)");
1a8bff5b4   Rusty Russell   ide: use module_p...
169
  static int ide_set_dev_param_mask(const char *s, const struct kernel_param *kp)
6e87543a9   Bartlomiej Zolnierkiewicz   ide: add "nodma|n...
170
  {
0860bf947   Dan Carpenter   ide: silence some...
171
  	unsigned int a, b, i, j = 1;
6e87543a9   Bartlomiej Zolnierkiewicz   ide: add "nodma|n...
172
  	unsigned int *dev_param_mask = (unsigned int *)kp->arg;
0af80c04e   David Fries   ide: ide.c 'clear...
173
  	/* controller . device (0 or 1) [ : 1 (set) | 0 (clear) ] */
0860bf947   Dan Carpenter   ide: silence some...
174
175
  	if (sscanf(s, "%u.%u:%u", &a, &b, &j) != 3 &&
  	    sscanf(s, "%u.%u", &a, &b) != 2)
6e87543a9   Bartlomiej Zolnierkiewicz   ide: add "nodma|n...
176
177
178
  		return -EINVAL;
  
  	i = a * MAX_DRIVES + b;
0860bf947   Dan Carpenter   ide: silence some...
179
  	if (i >= MAX_HWIFS * MAX_DRIVES || j > 1)
6e87543a9   Bartlomiej Zolnierkiewicz   ide: add "nodma|n...
180
181
182
183
184
  		return -EINVAL;
  
  	if (j)
  		*dev_param_mask |= (1 << i);
  	else
0af80c04e   David Fries   ide: ide.c 'clear...
185
  		*dev_param_mask &= ~(1 << i);
6e87543a9   Bartlomiej Zolnierkiewicz   ide: add "nodma|n...
186
187
188
  
  	return 0;
  }
9c27847dd   Luis R. Rodriguez   kernel/params: co...
189
  static const struct kernel_param_ops param_ops_ide_dev_mask = {
1a8bff5b4   Rusty Russell   ide: use module_p...
190
191
192
193
  	.set = ide_set_dev_param_mask
  };
  
  #define param_check_ide_dev_mask(name, p) param_check_uint(name, p)
6e87543a9   Bartlomiej Zolnierkiewicz   ide: add "nodma|n...
194
  static unsigned int ide_nodma;
1a8bff5b4   Rusty Russell   ide: use module_p...
195
  module_param_named(nodma, ide_nodma, ide_dev_mask, 0);
6e87543a9   Bartlomiej Zolnierkiewicz   ide: add "nodma|n...
196
197
198
  MODULE_PARM_DESC(nodma, "disallow DMA for a device");
  
  static unsigned int ide_noflush;
1a8bff5b4   Rusty Russell   ide: use module_p...
199
  module_param_named(noflush, ide_noflush, ide_dev_mask, 0);
6e87543a9   Bartlomiej Zolnierkiewicz   ide: add "nodma|n...
200
  MODULE_PARM_DESC(noflush, "disable flush requests for a device");
075affcbe   Bartlomiej Zolnierkiewicz   ide: preserve Hos...
201
  static unsigned int ide_nohpa;
1a8bff5b4   Rusty Russell   ide: use module_p...
202
  module_param_named(nohpa, ide_nohpa, ide_dev_mask, 0);
075affcbe   Bartlomiej Zolnierkiewicz   ide: preserve Hos...
203
  MODULE_PARM_DESC(nohpa, "disable Host Protected Area for a device");
6e87543a9   Bartlomiej Zolnierkiewicz   ide: add "nodma|n...
204
  static unsigned int ide_noprobe;
1a8bff5b4   Rusty Russell   ide: use module_p...
205
  module_param_named(noprobe, ide_noprobe, ide_dev_mask, 0);
6e87543a9   Bartlomiej Zolnierkiewicz   ide: add "nodma|n...
206
207
208
  MODULE_PARM_DESC(noprobe, "skip probing for a device");
  
  static unsigned int ide_nowerr;
1a8bff5b4   Rusty Russell   ide: use module_p...
209
  module_param_named(nowerr, ide_nowerr, ide_dev_mask, 0);
3a7d24841   Bartlomiej Zolnierkiewicz   ide: use ATA_* de...
210
  MODULE_PARM_DESC(nowerr, "ignore the ATA_DF bit for a device");
6e87543a9   Bartlomiej Zolnierkiewicz   ide: add "nodma|n...
211

4706a7e03   Bartlomiej Zolnierkiewicz   ide: add "cdrom="...
212
  static unsigned int ide_cdroms;
1a8bff5b4   Rusty Russell   ide: use module_p...
213
  module_param_named(cdrom, ide_cdroms, ide_dev_mask, 0);
4706a7e03   Bartlomiej Zolnierkiewicz   ide: add "cdrom="...
214
215
216
217
218
219
220
221
222
223
224
225
226
  MODULE_PARM_DESC(cdrom, "force device as a CD-ROM");
  
  struct chs_geom {
  	unsigned int	cyl;
  	u8		head;
  	u8		sect;
  };
  
  static unsigned int ide_disks;
  static struct chs_geom ide_disks_chs[MAX_HWIFS * MAX_DRIVES];
  
  static int ide_set_disk_chs(const char *str, struct kernel_param *kp)
  {
0860bf947   Dan Carpenter   ide: silence some...
227
  	unsigned int a, b, c = 0, h = 0, s = 0, i, j = 1;
4706a7e03   Bartlomiej Zolnierkiewicz   ide: add "cdrom="...
228

0af80c04e   David Fries   ide: ide.c 'clear...
229
230
  	/* controller . device (0 or 1) : Cylinders , Heads , Sectors */
  	/* controller . device (0 or 1) : 1 (use CHS) | 0 (ignore CHS) */
0860bf947   Dan Carpenter   ide: silence some...
231
232
  	if (sscanf(str, "%u.%u:%u,%u,%u", &a, &b, &c, &h, &s) != 5 &&
  	    sscanf(str, "%u.%u:%u", &a, &b, &j) != 3)
4706a7e03   Bartlomiej Zolnierkiewicz   ide: add "cdrom="...
233
234
235
  		return -EINVAL;
  
  	i = a * MAX_DRIVES + b;
0860bf947   Dan Carpenter   ide: silence some...
236
  	if (i >= MAX_HWIFS * MAX_DRIVES || j > 1)
4706a7e03   Bartlomiej Zolnierkiewicz   ide: add "cdrom="...
237
238
239
240
241
242
243
244
  		return -EINVAL;
  
  	if (c > INT_MAX || h > 255 || s > 255)
  		return -EINVAL;
  
  	if (j)
  		ide_disks |= (1 << i);
  	else
0af80c04e   David Fries   ide: ide.c 'clear...
245
  		ide_disks &= ~(1 << i);
4706a7e03   Bartlomiej Zolnierkiewicz   ide: add "cdrom="...
246
247
248
249
250
251
252
253
254
255
  
  	ide_disks_chs[i].cyl  = c;
  	ide_disks_chs[i].head = h;
  	ide_disks_chs[i].sect = s;
  
  	return 0;
  }
  
  module_param_call(chs, ide_set_disk_chs, NULL, NULL, 0);
  MODULE_PARM_DESC(chs, "force device as a disk (using CHS)");
123995b97   Bartlomiej Zolnierkiewicz   ide: use 'drive->...
256
  static void ide_dev_apply_params(ide_drive_t *drive, u8 unit)
6e87543a9   Bartlomiej Zolnierkiewicz   ide: add "nodma|n...
257
  {
123995b97   Bartlomiej Zolnierkiewicz   ide: use 'drive->...
258
  	int i = drive->hwif->index * MAX_DRIVES + unit;
6e87543a9   Bartlomiej Zolnierkiewicz   ide: add "nodma|n...
259
260
261
262
  
  	if (ide_nodma & (1 << i)) {
  		printk(KERN_INFO "ide: disallowing DMA for %s
  ", drive->name);
97100fc81   Bartlomiej Zolnierkiewicz   ide: add device f...
263
  		drive->dev_flags |= IDE_DFLAG_NODMA;
6e87543a9   Bartlomiej Zolnierkiewicz   ide: add "nodma|n...
264
265
266
267
268
  	}
  	if (ide_noflush & (1 << i)) {
  		printk(KERN_INFO "ide: disabling flush requests for %s
  ",
  				 drive->name);
97100fc81   Bartlomiej Zolnierkiewicz   ide: add device f...
269
  		drive->dev_flags |= IDE_DFLAG_NOFLUSH;
6e87543a9   Bartlomiej Zolnierkiewicz   ide: add "nodma|n...
270
  	}
075affcbe   Bartlomiej Zolnierkiewicz   ide: preserve Hos...
271
272
273
274
275
276
  	if (ide_nohpa & (1 << i)) {
  		printk(KERN_INFO "ide: disabling Host Protected Area for %s
  ",
  				 drive->name);
  		drive->dev_flags |= IDE_DFLAG_NOHPA;
  	}
6e87543a9   Bartlomiej Zolnierkiewicz   ide: add "nodma|n...
277
278
279
  	if (ide_noprobe & (1 << i)) {
  		printk(KERN_INFO "ide: skipping probe for %s
  ", drive->name);
97100fc81   Bartlomiej Zolnierkiewicz   ide: add device f...
280
  		drive->dev_flags |= IDE_DFLAG_NOPROBE;
6e87543a9   Bartlomiej Zolnierkiewicz   ide: add "nodma|n...
281
282
  	}
  	if (ide_nowerr & (1 << i)) {
3a7d24841   Bartlomiej Zolnierkiewicz   ide: use ATA_* de...
283
284
  		printk(KERN_INFO "ide: ignoring the ATA_DF bit for %s
  ",
6e87543a9   Bartlomiej Zolnierkiewicz   ide: add "nodma|n...
285
286
287
  				 drive->name);
  		drive->bad_wstat = BAD_R_STAT;
  	}
4706a7e03   Bartlomiej Zolnierkiewicz   ide: add "cdrom="...
288
289
290
  	if (ide_cdroms & (1 << i)) {
  		printk(KERN_INFO "ide: forcing %s as a CD-ROM
  ", drive->name);
97100fc81   Bartlomiej Zolnierkiewicz   ide: add device f...
291
  		drive->dev_flags |= IDE_DFLAG_PRESENT;
4706a7e03   Bartlomiej Zolnierkiewicz   ide: add "cdrom="...
292
293
294
295
296
297
298
299
  		drive->media = ide_cdrom;
  		/* an ATAPI device ignores DRDY */
  		drive->ready_stat = 0;
  	}
  	if (ide_disks & (1 << i)) {
  		drive->cyl  = drive->bios_cyl  = ide_disks_chs[i].cyl;
  		drive->head = drive->bios_head = ide_disks_chs[i].head;
  		drive->sect = drive->bios_sect = ide_disks_chs[i].sect;
97100fc81   Bartlomiej Zolnierkiewicz   ide: add device f...
300

4706a7e03   Bartlomiej Zolnierkiewicz   ide: add "cdrom="...
301
302
303
304
  		printk(KERN_INFO "ide: forcing %s as a disk (%d/%d/%d)
  ",
  				 drive->name,
  				 drive->cyl, drive->head, drive->sect);
97100fc81   Bartlomiej Zolnierkiewicz   ide: add device f...
305
306
  
  		drive->dev_flags |= IDE_DFLAG_FORCED_GEOM | IDE_DFLAG_PRESENT;
4706a7e03   Bartlomiej Zolnierkiewicz   ide: add "cdrom="...
307
  		drive->media = ide_disk;
3a7d24841   Bartlomiej Zolnierkiewicz   ide: use ATA_* de...
308
  		drive->ready_stat = ATA_DRDY;
4706a7e03   Bartlomiej Zolnierkiewicz   ide: add "cdrom="...
309
  	}
6e87543a9   Bartlomiej Zolnierkiewicz   ide: add "nodma|n...
310
  }
9fd91d959   Bartlomiej Zolnierkiewicz   ide: add "ignore_...
311
312
313
314
315
  static unsigned int ide_ignore_cable;
  
  static int ide_set_ignore_cable(const char *s, struct kernel_param *kp)
  {
  	int i, j = 1;
0af80c04e   David Fries   ide: ide.c 'clear...
316
317
  	/* controller (ignore) */
  	/* controller : 1 (ignore) | 0 (use) */
9fd91d959   Bartlomiej Zolnierkiewicz   ide: add "ignore_...
318
319
320
321
322
323
324
325
326
  	if (sscanf(s, "%d:%d", &i, &j) != 2 && sscanf(s, "%d", &i) != 1)
  		return -EINVAL;
  
  	if (i >= MAX_HWIFS || j < 0 || j > 1)
  		return -EINVAL;
  
  	if (j)
  		ide_ignore_cable |= (1 << i);
  	else
0af80c04e   David Fries   ide: ide.c 'clear...
327
  		ide_ignore_cable &= ~(1 << i);
9fd91d959   Bartlomiej Zolnierkiewicz   ide: add "ignore_...
328
329
330
331
332
333
334
335
336
  
  	return 0;
  }
  
  module_param_call(ignore_cable, ide_set_ignore_cable, NULL, NULL, 0);
  MODULE_PARM_DESC(ignore_cable, "ignore cable detection");
  
  void ide_port_apply_params(ide_hwif_t *hwif)
  {
2bd24a1cf   Bartlomiej Zolnierkiewicz   ide: add port and...
337
  	ide_drive_t *drive;
6e87543a9   Bartlomiej Zolnierkiewicz   ide: add "nodma|n...
338
  	int i;
9fd91d959   Bartlomiej Zolnierkiewicz   ide: add "ignore_...
339
340
341
342
343
344
  	if (ide_ignore_cable & (1 << hwif->index)) {
  		printk(KERN_INFO "ide: ignoring cable detection for %s
  ",
  				 hwif->name);
  		hwif->cbl = ATA_CBL_PATA40_SHORT;
  	}
6e87543a9   Bartlomiej Zolnierkiewicz   ide: add "nodma|n...
345

2bd24a1cf   Bartlomiej Zolnierkiewicz   ide: add port and...
346
347
  	ide_port_for_each_dev(i, drive, hwif)
  		ide_dev_apply_params(drive, i);
9fd91d959   Bartlomiej Zolnierkiewicz   ide: add "ignore_...
348
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
349
350
351
352
353
  /*
   * This is gets invoked once during initialization, to set *everything* up
   */
  static int __init ide_init(void)
  {
349ae23fe   Randy Dunlap   [PATCH] IDE core:...
354
  	int ret;
eba8ff946   Bartlomiej Zolnierkiewicz   ide: remove stale...
355
356
  	printk(KERN_INFO "Uniform Multi-Platform E-IDE driver
  ");
537f06c5d   Bartlomiej Zolnierkiewicz   ide: cleanup ide_...
357

349ae23fe   Randy Dunlap   [PATCH] IDE core:...
358
359
360
361
362
363
  	ret = bus_register(&ide_bus_type);
  	if (ret < 0) {
  		printk(KERN_WARNING "IDE: bus_register error: %d
  ", ret);
  		return ret;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
364

f74c91413   Bartlomiej Zolnierkiewicz   ide: add warm-plu...
365
366
367
368
369
  	ide_port_class = class_create(THIS_MODULE, "ide_port");
  	if (IS_ERR(ide_port_class)) {
  		ret = PTR_ERR(ide_port_class);
  		goto out_port_class;
  	}
f74c91413   Bartlomiej Zolnierkiewicz   ide: add warm-plu...
370

8b803bd18   Bartlomiej Zolnierkiewicz   ide: sanitize ACP...
371
  	ide_acpi_init();
5cbf79cdb   Bartlomiej Zolnierkiewicz   ide: add ide_proc...
372
  	proc_ide_create();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
373

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
374
  	return 0;
f74c91413   Bartlomiej Zolnierkiewicz   ide: add warm-plu...
375
376
377
378
379
  
  out_port_class:
  	bus_unregister(&ide_bus_type);
  
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
380
  }
931ee0dc5   Bartlomiej Zolnierkiewicz   ide: remove obsol...
381
  static void __exit ide_exit(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
382
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
383
  	proc_ide_destroy();
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
384

f74c91413   Bartlomiej Zolnierkiewicz   ide: add warm-plu...
385
  	class_destroy(ide_port_class);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
386
387
  	bus_unregister(&ide_bus_type);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
388
  module_init(ide_init);
931ee0dc5   Bartlomiej Zolnierkiewicz   ide: remove obsol...
389
  module_exit(ide_exit);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
390

931ee0dc5   Bartlomiej Zolnierkiewicz   ide: remove obsol...
391
  MODULE_LICENSE("GPL");