Blame view

drivers/eisa/eisa-bus.c 10.6 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  /*
   * EISA bus support functions for sysfs.
   *
   * (C) 2002, 2003 Marc Zyngier <maz@wild-wind.fr.eu.org>
   *
   * This code is released under the GPL version 2.
   */
  
  #include <linux/kernel.h>
  #include <linux/device.h>
  #include <linux/eisa.h>
  #include <linux/module.h>
  #include <linux/moduleparam.h>
  #include <linux/init.h>
  #include <linux/slab.h>
  #include <linux/ioport.h>
  #include <asm/io.h>
  
  #define SLOT_ADDRESS(r,n) (r->bus_base_addr + (0x1000 * n))
  
  #define EISA_DEVINFO(i,s) { .id = { .sig = i }, .name = s }
  
  struct eisa_device_info {
  	struct eisa_device_id id;
ca52a4984   Kay Sievers   driver core: remo...
25
  	char name[50];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
26
27
28
29
30
31
32
33
34
35
36
37
  };
  
  #ifdef CONFIG_EISA_NAMES
  static struct eisa_device_info __initdata eisa_table[] = {
  #include "devlist.h"
  };
  #define EISA_INFOS (sizeof (eisa_table) / (sizeof (struct eisa_device_info)))
  #endif
  
  #define EISA_MAX_FORCED_DEV 16
  
  static int enable_dev[EISA_MAX_FORCED_DEV];
64a6f9500   Al Viro   signedness: modul...
38
  static unsigned int enable_dev_count;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
39
  static int disable_dev[EISA_MAX_FORCED_DEV];
64a6f9500   Al Viro   signedness: modul...
40
  static unsigned int disable_dev_count;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
41

33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
42
43
44
45
  static int is_forced_dev(int *forced_tab,
  			 int forced_count,
  			 struct eisa_root_device *root,
  			 struct eisa_device *edev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
46
47
48
49
50
51
52
53
54
55
56
  {
  	int i, x;
  
  	for (i = 0; i < forced_count; i++) {
  		x = (root->bus_nr << 8) | edev->slot;
  		if (forced_tab[i] == x)
  			return 1;
  	}
  
  	return 0;
  }
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
57
  static void __init eisa_name_device(struct eisa_device *edev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
58
59
60
61
  {
  #ifdef CONFIG_EISA_NAMES
  	int i;
  	for (i = 0; i < EISA_INFOS; i++) {
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
62
63
64
65
  		if (!strcmp(edev->id.sig, eisa_table[i].id.sig)) {
  			strlcpy(edev->pretty_name,
  				eisa_table[i].name,
  				sizeof(edev->pretty_name));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
66
67
68
69
70
  			return;
  		}
  	}
  
  	/* No name was found */
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
71
  	sprintf(edev->pretty_name, "EISA device %.7s", edev->id.sig);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
  #endif
  }
  
  static char __init *decode_eisa_sig(unsigned long addr)
  {
          static char sig_str[EISA_SIG_LEN];
  	u8 sig[4];
          u16 rev;
  	int i;
  
  	for (i = 0; i < 4; i++) {
  #ifdef CONFIG_EISA_VLB_PRIMING
  		/*
  		 * This ugly stuff is used to wake up VL-bus cards
  		 * (AHA-284x is the only known example), so we can
  		 * read the EISA id.
  		 *
  		 * Thankfully, this only exists on x86...
  		 */
  		outb(0x80 + i, addr);
  #endif
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
93
  		sig[i] = inb(addr + i);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
94
95
96
97
98
99
100
101
102
103
104
105
106
  
  		if (!i && (sig[0] & 0x80))
  			return NULL;
  	}
  	
          sig_str[0] = ((sig[0] >> 2) & 0x1f) + ('A' - 1);
          sig_str[1] = (((sig[0] & 3) << 3) | (sig[1] >> 5)) + ('A' - 1);
          sig_str[2] = (sig[1] & 0x1f) + ('A' - 1);
          rev = (sig[2] << 8) | sig[3];
          sprintf(sig_str + 3, "%04X", rev);
  
          return sig_str;
  }
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
107
  static int eisa_bus_match(struct device *dev, struct device_driver *drv)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
108
  {
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
109
110
  	struct eisa_device *edev = to_eisa_device(dev);
  	struct eisa_driver *edrv = to_eisa_driver(drv);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
111
112
113
114
  	const struct eisa_device_id *eids = edrv->id_table;
  
  	if (!eids)
  		return 0;
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
115
116
  	while (strlen(eids->sig)) {
  		if (!strcmp(eids->sig, edev->id.sig) &&
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
117
118
119
120
121
122
123
124
125
126
  		    edev->state & EISA_CONFIG_ENABLED) {
  			edev->id.driver_data = eids->driver_data;
  			return 1;
  		}
  
  		eids++;
  	}
  
  	return 0;
  }
7eff2e7a8   Kay Sievers   Driver core: chan...
127
  static int eisa_bus_uevent(struct device *dev, struct kobj_uevent_env *env)
07563c711   Michael Tokarev   [PATCH] EISA bus ...
128
129
  {
  	struct eisa_device *edev = to_eisa_device(dev);
07563c711   Michael Tokarev   [PATCH] EISA bus ...
130

7eff2e7a8   Kay Sievers   Driver core: chan...
131
  	add_uevent_var(env, "MODALIAS=" EISA_DEVICE_MODALIAS_FMT, edev->id.sig);
07563c711   Michael Tokarev   [PATCH] EISA bus ...
132
133
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
134
135
136
  struct bus_type eisa_bus_type = {
  	.name  = "eisa",
  	.match = eisa_bus_match,
07563c711   Michael Tokarev   [PATCH] EISA bus ...
137
  	.uevent = eisa_bus_uevent,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
138
  };
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
139
  EXPORT_SYMBOL(eisa_bus_type);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
140

33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
141
  int eisa_driver_register(struct eisa_driver *edrv)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
142
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
143
  	edrv->driver.bus = &eisa_bus_type;
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
144
  	return driver_register(&edrv->driver);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
145
  }
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
146
  EXPORT_SYMBOL(eisa_driver_register);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
147

33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
148
  void eisa_driver_unregister(struct eisa_driver *edrv)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
149
  {
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
150
  	driver_unregister(&edrv->driver);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
151
  }
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
152
  EXPORT_SYMBOL(eisa_driver_unregister);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
153

33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
154
155
  static ssize_t eisa_show_sig(struct device *dev, struct device_attribute *attr,
  			     char *buf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
156
  {
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
157
158
159
  	struct eisa_device *edev = to_eisa_device(dev);
  	return sprintf(buf, "%s
  ", edev->id.sig);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
160
161
162
  }
  
  static DEVICE_ATTR(signature, S_IRUGO, eisa_show_sig, NULL);
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
163
164
165
  static ssize_t eisa_show_state(struct device *dev,
  			       struct device_attribute *attr,
  			       char *buf)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
166
  {
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
167
168
169
  	struct eisa_device *edev = to_eisa_device(dev);
  	return sprintf(buf, "%d
  ", edev->state & EISA_CONFIG_ENABLED);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
170
171
172
  }
  
  static DEVICE_ATTR(enabled, S_IRUGO, eisa_show_state, NULL);
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
173
174
175
  static ssize_t eisa_show_modalias(struct device *dev,
  				  struct device_attribute *attr,
  				  char *buf)
07563c711   Michael Tokarev   [PATCH] EISA bus ...
176
  {
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
177
178
179
  	struct eisa_device *edev = to_eisa_device(dev);
  	return sprintf(buf, EISA_DEVICE_MODALIAS_FMT "
  ", edev->id.sig);
07563c711   Michael Tokarev   [PATCH] EISA bus ...
180
181
182
  }
  
  static DEVICE_ATTR(modalias, S_IRUGO, eisa_show_modalias, NULL);
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
183
184
185
  static int __init eisa_init_device(struct eisa_root_device *root,
  				   struct eisa_device *edev,
  				   int slot)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
186
187
  {
  	char *sig;
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
188
  	unsigned long sig_addr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
189
  	int i;
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
190
  	sig_addr = SLOT_ADDRESS(root, slot) + EISA_VENDOR_ID_OFFSET;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
191

33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
192
193
  	sig = decode_eisa_sig(sig_addr);
  	if (!sig)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
194
195
  		return -1;	/* No EISA device here */
  	
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
196
  	memcpy(edev->id.sig, sig, EISA_SIG_LEN);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
197
  	edev->slot = slot;
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
198
199
200
  	edev->state = inb(SLOT_ADDRESS(root, slot) + EISA_CONFIG_OFFSET)
  		      & EISA_CONFIG_ENABLED;
  	edev->base_addr = SLOT_ADDRESS(root, slot);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
201
  	edev->dma_mask = root->dma_mask; /* Default DMA mask */
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
202
  	eisa_name_device(edev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
203
204
205
206
  	edev->dev.parent = root->dev;
  	edev->dev.bus = &eisa_bus_type;
  	edev->dev.dma_mask = &edev->dma_mask;
  	edev->dev.coherent_dma_mask = edev->dma_mask;
e537b2453   Kay Sievers   eisa: struct devi...
207
  	dev_set_name(&edev->dev, "%02X:%02X", root->bus_nr, slot);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
208
209
210
211
212
213
214
215
  
  	for (i = 0; i < EISA_MAX_RESOURCES; i++) {
  #ifdef CONFIG_EISA_NAMES
  		edev->res[i].name = edev->pretty_name;
  #else
  		edev->res[i].name = edev->id.sig;
  #endif
  	}
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
216
  	if (is_forced_dev(enable_dev, enable_dev_count, root, edev))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
217
218
  		edev->state = EISA_CONFIG_ENABLED | EISA_CONFIG_FORCED;
  	
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
219
  	if (is_forced_dev(disable_dev, disable_dev_count, root, edev))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
220
221
222
223
  		edev->state = EISA_CONFIG_FORCED;
  
  	return 0;
  }
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
224
  static int __init eisa_register_device(struct eisa_device *edev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
225
  {
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
226
  	int rc = device_register(&edev->dev);
42ddfd685   Jeff Garzik   [PATCH] EISA: han...
227
228
  	if (rc)
  		return rc;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
229

33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
230
231
232
233
234
235
236
237
238
  	rc = device_create_file(&edev->dev, &dev_attr_signature);
  	if (rc)
  		goto err_devreg;
  	rc = device_create_file(&edev->dev, &dev_attr_enabled);
  	if (rc)
  		goto err_sig;
  	rc = device_create_file(&edev->dev, &dev_attr_modalias);
  	if (rc)
  		goto err_enab;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
239
240
  
  	return 0;
42ddfd685   Jeff Garzik   [PATCH] EISA: han...
241
242
  
  err_enab:
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
243
  	device_remove_file(&edev->dev, &dev_attr_enabled);
42ddfd685   Jeff Garzik   [PATCH] EISA: han...
244
  err_sig:
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
245
  	device_remove_file(&edev->dev, &dev_attr_signature);
42ddfd685   Jeff Garzik   [PATCH] EISA: han...
246
247
248
  err_devreg:
  	device_unregister(&edev->dev);
  	return rc;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
249
  }
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
250
251
252
  static int __init eisa_request_resources(struct eisa_root_device *root,
  					 struct eisa_device *edev,
  					 int slot)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
  {
  	int i;
  
  	for (i = 0; i < EISA_MAX_RESOURCES; i++) {
  		/* Don't register resource for slot 0, since this is
  		 * very likely to fail... :-( Instead, grab the EISA
  		 * id, now we can display something in /proc/ioports.
  		 */
  
  		/* Only one region for mainboard */
  		if (!slot && i > 0) {
  			edev->res[i].start = edev->res[i].end = 0;
  			continue;
  		}
  		
  		if (slot) {
  			edev->res[i].name  = NULL;
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
270
271
  			edev->res[i].start = SLOT_ADDRESS(root, slot)
  					     + (i * 0x400);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
272
273
274
275
  			edev->res[i].end   = edev->res[i].start + 0xff;
  			edev->res[i].flags = IORESOURCE_IO;
  		} else {
  			edev->res[i].name  = NULL;
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
276
277
  			edev->res[i].start = SLOT_ADDRESS(root, slot)
  					     + EISA_VENDOR_ID_OFFSET;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
278
279
280
  			edev->res[i].end   = edev->res[i].start + 3;
  			edev->res[i].flags = IORESOURCE_BUSY;
  		}
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
281
  		if (request_resource(root->res, &edev->res[i]))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
282
283
284
285
286
287
288
  			goto failed;
  	}
  
  	return 0;
  	
   failed:
  	while (--i >= 0)
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
289
  		release_resource(&edev->res[i]);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
290
291
292
  
  	return -1;
  }
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
293
  static void __init eisa_release_resources(struct eisa_device *edev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
294
295
296
297
298
  {
  	int i;
  
  	for (i = 0; i < EISA_MAX_RESOURCES; i++)
  		if (edev->res[i].start || edev->res[i].end)
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
299
  			release_resource(&edev->res[i]);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
300
  }
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
301
  static int __init eisa_probe(struct eisa_root_device *root)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
302
303
304
  {
          int i, c;
  	struct eisa_device *edev;
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
305
306
307
  	printk(KERN_INFO "EISA: Probing bus %d at %s
  ",
  	       root->bus_nr, dev_name(root->dev));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
308
309
310
311
  
  	/* First try to get hold of slot 0. If there is no device
  	 * here, simply fail, unless root->force_probe is set. */
  	
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
312
313
314
315
  	edev = kzalloc(sizeof(*edev), GFP_KERNEL);
  	if (!edev) {
  		printk(KERN_ERR "EISA: Couldn't allocate mainboard slot
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
316
317
318
  		return -ENOMEM;
  	}
  		
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
319
320
321
322
323
  	if (eisa_request_resources(root, edev, 0)) {
  		printk(KERN_WARNING \
  		       "EISA: Cannot allocate resource for mainboard
  ");
  		kfree(edev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
324
325
326
327
  		if (!root->force_probe)
  			return -EBUSY;
  		goto force_probe;
  	}
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
328
329
330
  	if (eisa_init_device(root, edev, 0)) {
  		eisa_release_resources(edev);
  		kfree(edev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
331
332
333
334
  		if (!root->force_probe)
  			return -ENODEV;
  		goto force_probe;
  	}
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
335
336
  	printk(KERN_INFO "EISA: Mainboard %s detected.
  ", edev->id.sig);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
337

33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
338
339
340
341
342
343
  	if (eisa_register_device(edev)) {
  		printk(KERN_ERR "EISA: Failed to register %s
  ",
  		       edev->id.sig);
  		eisa_release_resources(edev);
  		kfree(edev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
344
345
346
347
348
  	}
  	
   force_probe:
  	
          for (c = 0, i = 1; i <= root->slots; i++) {
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
349
350
351
352
  		edev = kzalloc(sizeof(*edev), GFP_KERNEL);
  		if (!edev) {
  			printk(KERN_ERR "EISA: Out of memory for slot %d
  ", i);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
353
354
  			continue;
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
355

33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
356
357
358
359
360
361
  		if (eisa_request_resources(root, edev, i)) {
  			printk(KERN_WARNING \
  			       "Cannot allocate resource for EISA slot %d
  ",
  			       i);
  			kfree(edev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
362
363
  			continue;
  		}
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
364
365
366
  		if (eisa_init_device(root, edev, i)) {
  			eisa_release_resources(edev);
  			kfree(edev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
367
368
369
  			continue;
  		}
  		
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
370
371
  		printk(KERN_INFO "EISA: slot %d : %s detected",
  		       i, edev->id.sig);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
372
373
374
  			
  		switch (edev->state) {
  		case EISA_CONFIG_ENABLED | EISA_CONFIG_FORCED:
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
375
  			printk(" (forced enabled)");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
376
377
378
  			break;
  
  		case EISA_CONFIG_FORCED:
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
379
  			printk(" (forced disabled)");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
380
381
382
  			break;
  
  		case 0:
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
383
  			printk(" (disabled)");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
384
385
386
387
388
389
390
  			break;
  		}
  			
  		printk (".
  ");
  
  		c++;
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
391
392
393
394
395
396
  		if (eisa_register_device(edev)) {
  			printk(KERN_ERR "EISA: Failed to register %s
  ",
  			       edev->id.sig);
  			eisa_release_resources(edev);
  			kfree(edev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
397
398
  		}
          }
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
399
400
  	printk(KERN_INFO "EISA: Detected %d card%s.
  ", c, c == 1 ? "" : "s");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
401
402
403
404
405
406
407
408
409
410
411
412
  
  	return 0;
  }
  
  static struct resource eisa_root_res = {
  	.name  = "EISA root resource",
  	.start = 0,
  	.end   = 0xffffffff,
  	.flags = IORESOURCE_IO,
  };
  
  static int eisa_bus_count;
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
413
  int __init eisa_root_register(struct eisa_root_device *root)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
414
415
416
417
418
419
420
421
422
423
424
425
  {
  	int err;
  
  	/* Use our own resources to check if this bus base address has
  	 * been already registered. This prevents the virtual root
  	 * device from registering after the real one has, for
  	 * example... */
  	
  	root->eisa_root_res.name  = eisa_root_res.name;
  	root->eisa_root_res.start = root->res->start;
  	root->eisa_root_res.end   = root->res->end;
  	root->eisa_root_res.flags = IORESOURCE_BUSY;
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
426
427
  	err = request_resource(&eisa_root_res, &root->eisa_root_res);
  	if (err)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
428
429
430
  		return err;
  	
  	root->bus_nr = eisa_bus_count++;
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
431
432
433
  	err = eisa_probe(root);
  	if (err)
  		release_resource(&root->eisa_root_res);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
434
435
436
  
  	return err;
  }
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
437
  static int __init eisa_init(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
438
439
440
  {
  	int r;
  	
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
441
442
  	r = bus_register(&eisa_bus_type);
  	if (r)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
443
  		return r;
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
444
445
  	printk(KERN_INFO "EISA bus registered
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
446
447
448
449
450
  	return 0;
  }
  
  module_param_array(enable_dev, int, &enable_dev_count, 0444);
  module_param_array(disable_dev, int, &disable_dev_count, 0444);
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
451
  postcore_initcall(eisa_init);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
452
453
  
  int EISA_bus;		/* for legacy drivers */
33fd797b3   Thadeu Lima de Souza Cascardo   eisa: fix coding ...
454
  EXPORT_SYMBOL(EISA_bus);