aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/pci_irq.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi/pci_irq.c')
-rw-r--r--drivers/acpi/pci_irq.c92
1 files changed, 40 insertions, 52 deletions
diff --git a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c
index 65aee79b397..feda0341f5a 100644
--- a/drivers/acpi/pci_irq.c
+++ b/drivers/acpi/pci_irq.c
@@ -24,7 +24,6 @@
24 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 24 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
25 */ 25 */
26 26
27#include <linux/config.h>
28 27
29#include <linux/kernel.h> 28#include <linux/kernel.h>
30#include <linux/module.h> 29#include <linux/module.h>
@@ -55,10 +54,9 @@ static struct acpi_prt_entry *acpi_pci_irq_find_prt_entry(int segment,
55 struct list_head *node = NULL; 54 struct list_head *node = NULL;
56 struct acpi_prt_entry *entry = NULL; 55 struct acpi_prt_entry *entry = NULL;
57 56
58 ACPI_FUNCTION_TRACE("acpi_pci_irq_find_prt_entry");
59 57
60 if (!acpi_prt.count) 58 if (!acpi_prt.count)
61 return_PTR(NULL); 59 return NULL;
62 60
63 /* 61 /*
64 * Parse through all PRT entries looking for a match on the specified 62 * Parse through all PRT entries looking for a match on the specified
@@ -73,12 +71,12 @@ static struct acpi_prt_entry *acpi_pci_irq_find_prt_entry(int segment,
73 && (device == entry->id.device) 71 && (device == entry->id.device)
74 && (pin == entry->pin)) { 72 && (pin == entry->pin)) {
75 spin_unlock(&acpi_prt_lock); 73 spin_unlock(&acpi_prt_lock);
76 return_PTR(entry); 74 return entry;
77 } 75 }
78 } 76 }
79 77
80 spin_unlock(&acpi_prt_lock); 78 spin_unlock(&acpi_prt_lock);
81 return_PTR(NULL); 79 return NULL;
82} 80}
83 81
84static int 82static int
@@ -87,14 +85,13 @@ acpi_pci_irq_add_entry(acpi_handle handle,
87{ 85{
88 struct acpi_prt_entry *entry = NULL; 86 struct acpi_prt_entry *entry = NULL;
89 87
90 ACPI_FUNCTION_TRACE("acpi_pci_irq_add_entry");
91 88
92 if (!prt) 89 if (!prt)
93 return_VALUE(-EINVAL); 90 return -EINVAL;
94 91
95 entry = kmalloc(sizeof(struct acpi_prt_entry), GFP_KERNEL); 92 entry = kmalloc(sizeof(struct acpi_prt_entry), GFP_KERNEL);
96 if (!entry) 93 if (!entry)
97 return_VALUE(-ENOMEM); 94 return -ENOMEM;
98 memset(entry, 0, sizeof(struct acpi_prt_entry)); 95 memset(entry, 0, sizeof(struct acpi_prt_entry));
99 96
100 entry->id.segment = segment; 97 entry->id.segment = segment;
@@ -141,7 +138,7 @@ acpi_pci_irq_add_entry(acpi_handle handle,
141 acpi_prt.count++; 138 acpi_prt.count++;
142 spin_unlock(&acpi_prt_lock); 139 spin_unlock(&acpi_prt_lock);
143 140
144 return_VALUE(0); 141 return 0;
145} 142}
146 143
147static void 144static void
@@ -163,11 +160,10 @@ int acpi_pci_irq_add_prt(acpi_handle handle, int segment, int bus)
163 struct acpi_pci_routing_table *entry = NULL; 160 struct acpi_pci_routing_table *entry = NULL;
164 static int first_time = 1; 161 static int first_time = 1;
165 162
166 ACPI_FUNCTION_TRACE("acpi_pci_irq_add_prt");
167 163
168 pathname = (char *)kmalloc(ACPI_PATHNAME_MAX, GFP_KERNEL); 164 pathname = (char *)kmalloc(ACPI_PATHNAME_MAX, GFP_KERNEL);
169 if (!pathname) 165 if (!pathname)
170 return_VALUE(-ENOMEM); 166 return -ENOMEM;
171 memset(pathname, 0, ACPI_PATHNAME_MAX); 167 memset(pathname, 0, ACPI_PATHNAME_MAX);
172 168
173 if (first_time) { 169 if (first_time) {
@@ -197,24 +193,24 @@ int acpi_pci_irq_add_prt(acpi_handle handle, int segment, int bus)
197 kfree(pathname); 193 kfree(pathname);
198 status = acpi_get_irq_routing_table(handle, &buffer); 194 status = acpi_get_irq_routing_table(handle, &buffer);
199 if (status != AE_BUFFER_OVERFLOW) { 195 if (status != AE_BUFFER_OVERFLOW) {
200 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error evaluating _PRT [%s]\n", 196 ACPI_EXCEPTION((AE_INFO, status, "Evaluating _PRT [%s]",
201 acpi_format_exception(status))); 197 acpi_format_exception(status)));
202 return_VALUE(-ENODEV); 198 return -ENODEV;
203 } 199 }
204 200
205 prt = kmalloc(buffer.length, GFP_KERNEL); 201 prt = kmalloc(buffer.length, GFP_KERNEL);
206 if (!prt) { 202 if (!prt) {
207 return_VALUE(-ENOMEM); 203 return -ENOMEM;
208 } 204 }
209 memset(prt, 0, buffer.length); 205 memset(prt, 0, buffer.length);
210 buffer.pointer = prt; 206 buffer.pointer = prt;
211 207
212 status = acpi_get_irq_routing_table(handle, &buffer); 208 status = acpi_get_irq_routing_table(handle, &buffer);
213 if (ACPI_FAILURE(status)) { 209 if (ACPI_FAILURE(status)) {
214 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error evaluating _PRT [%s]\n", 210 ACPI_EXCEPTION((AE_INFO, status, "Evaluating _PRT [%s]",
215 acpi_format_exception(status))); 211 acpi_format_exception(status)));
216 kfree(buffer.pointer); 212 kfree(buffer.pointer);
217 return_VALUE(-ENODEV); 213 return -ENODEV;
218 } 214 }
219 215
220 entry = prt; 216 entry = prt;
@@ -227,7 +223,7 @@ int acpi_pci_irq_add_prt(acpi_handle handle, int segment, int bus)
227 223
228 kfree(prt); 224 kfree(prt);
229 225
230 return_VALUE(0); 226 return 0;
231} 227}
232 228
233void acpi_pci_irq_del_prt(int segment, int bus) 229void acpi_pci_irq_del_prt(int segment, int bus)
@@ -262,16 +258,15 @@ acpi_pci_allocate_irq(struct acpi_prt_entry *entry,
262{ 258{
263 int irq; 259 int irq;
264 260
265 ACPI_FUNCTION_TRACE("acpi_pci_allocate_irq");
266 261
267 if (entry->link.handle) { 262 if (entry->link.handle) {
268 irq = acpi_pci_link_allocate_irq(entry->link.handle, 263 irq = acpi_pci_link_allocate_irq(entry->link.handle,
269 entry->link.index, triggering, 264 entry->link.index, triggering,
270 polarity, link); 265 polarity, link);
271 if (irq < 0) { 266 if (irq < 0) {
272 ACPI_DEBUG_PRINT((ACPI_DB_WARN, 267 printk(KERN_WARNING PREFIX
273 "Invalid IRQ link routing entry\n")); 268 "Invalid IRQ link routing entry\n");
274 return_VALUE(-1); 269 return -1;
275 } 270 }
276 } else { 271 } else {
277 irq = entry->link.index; 272 irq = entry->link.index;
@@ -280,7 +275,7 @@ acpi_pci_allocate_irq(struct acpi_prt_entry *entry,
280 } 275 }
281 276
282 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found IRQ %d\n", irq)); 277 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found IRQ %d\n", irq));
283 return_VALUE(irq); 278 return irq;
284} 279}
285 280
286static int 281static int
@@ -289,13 +284,12 @@ acpi_pci_free_irq(struct acpi_prt_entry *entry,
289{ 284{
290 int irq; 285 int irq;
291 286
292 ACPI_FUNCTION_TRACE("acpi_pci_free_irq");
293 if (entry->link.handle) { 287 if (entry->link.handle) {
294 irq = acpi_pci_link_free_irq(entry->link.handle); 288 irq = acpi_pci_link_free_irq(entry->link.handle);
295 } else { 289 } else {
296 irq = entry->link.index; 290 irq = entry->link.index;
297 } 291 }
298 return_VALUE(irq); 292 return irq;
299} 293}
300 294
301/* 295/*
@@ -315,7 +309,6 @@ acpi_pci_irq_lookup(struct pci_bus *bus,
315 int bus_nr = bus->number; 309 int bus_nr = bus->number;
316 int ret; 310 int ret;
317 311
318 ACPI_FUNCTION_TRACE("acpi_pci_irq_lookup");
319 312
320 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 313 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
321 "Searching for PRT entry for %02x:%02x:%02x[%c]\n", 314 "Searching for PRT entry for %02x:%02x:%02x[%c]\n",
@@ -324,11 +317,11 @@ acpi_pci_irq_lookup(struct pci_bus *bus,
324 entry = acpi_pci_irq_find_prt_entry(segment, bus_nr, device, pin); 317 entry = acpi_pci_irq_find_prt_entry(segment, bus_nr, device, pin);
325 if (!entry) { 318 if (!entry) {
326 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "PRT entry not found\n")); 319 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "PRT entry not found\n"));
327 return_VALUE(-1); 320 return -1;
328 } 321 }
329 322
330 ret = func(entry, triggering, polarity, link); 323 ret = func(entry, triggering, polarity, link);
331 return_VALUE(ret); 324 return ret;
332} 325}
333 326
334/* 327/*
@@ -346,10 +339,9 @@ acpi_pci_irq_derive(struct pci_dev *dev,
346 int irq = -1; 339 int irq = -1;
347 u8 bridge_pin = 0; 340 u8 bridge_pin = 0;
348 341
349 ACPI_FUNCTION_TRACE("acpi_pci_irq_derive");
350 342
351 if (!dev) 343 if (!dev)
352 return_VALUE(-EINVAL); 344 return -EINVAL;
353 345
354 /* 346 /*
355 * Attempt to derive an IRQ for this device from a parent bridge's 347 * Attempt to derive an IRQ for this device from a parent bridge's
@@ -366,7 +358,7 @@ acpi_pci_irq_derive(struct pci_dev *dev,
366 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 358 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
367 "No interrupt pin configured for device %s\n", 359 "No interrupt pin configured for device %s\n",
368 pci_name(bridge))); 360 pci_name(bridge)));
369 return_VALUE(-1); 361 return -1;
370 } 362 }
371 /* Pin is from 0 to 3 */ 363 /* Pin is from 0 to 3 */
372 bridge_pin--; 364 bridge_pin--;
@@ -379,16 +371,15 @@ acpi_pci_irq_derive(struct pci_dev *dev,
379 } 371 }
380 372
381 if (irq < 0) { 373 if (irq < 0) {
382 ACPI_DEBUG_PRINT((ACPI_DB_WARN, 374 printk(KERN_WARNING PREFIX "Unable to derive IRQ for device %s\n",
383 "Unable to derive IRQ for device %s\n", 375 pci_name(dev));
384 pci_name(dev))); 376 return -1;
385 return_VALUE(-1);
386 } 377 }
387 378
388 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Derive IRQ %d for device %s from %s\n", 379 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Derive IRQ %d for device %s from %s\n",
389 irq, pci_name(dev), pci_name(bridge))); 380 irq, pci_name(dev), pci_name(bridge)));
390 381
391 return_VALUE(irq); 382 return irq;
392} 383}
393 384
394/* 385/*
@@ -406,24 +397,22 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
406 char *link = NULL; 397 char *link = NULL;
407 int rc; 398 int rc;
408 399
409 ACPI_FUNCTION_TRACE("acpi_pci_irq_enable");
410 400
411 if (!dev) 401 if (!dev)
412 return_VALUE(-EINVAL); 402 return -EINVAL;
413 403
414 pin = dev->pin; 404 pin = dev->pin;
415 if (!pin) { 405 if (!pin) {
416 ACPI_DEBUG_PRINT((ACPI_DB_INFO, 406 ACPI_DEBUG_PRINT((ACPI_DB_INFO,
417 "No interrupt pin configured for device %s\n", 407 "No interrupt pin configured for device %s\n",
418 pci_name(dev))); 408 pci_name(dev)));
419 return_VALUE(0); 409 return 0;
420 } 410 }
421 pin--; 411 pin--;
422 412
423 if (!dev->bus) { 413 if (!dev->bus) {
424 ACPI_DEBUG_PRINT((ACPI_DB_ERROR, 414 printk(KERN_ERR PREFIX "Invalid (NULL) 'bus' field\n");
425 "Invalid (NULL) 'bus' field\n")); 415 return -ENODEV;
426 return_VALUE(-ENODEV);
427 } 416 }
428 417
429 /* 418 /*
@@ -455,10 +444,10 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
455 printk(" - using IRQ %d\n", dev->irq); 444 printk(" - using IRQ %d\n", dev->irq);
456 acpi_register_gsi(dev->irq, ACPI_LEVEL_SENSITIVE, 445 acpi_register_gsi(dev->irq, ACPI_LEVEL_SENSITIVE,
457 ACPI_ACTIVE_LOW); 446 ACPI_ACTIVE_LOW);
458 return_VALUE(0); 447 return 0;
459 } else { 448 } else {
460 printk("\n"); 449 printk("\n");
461 return_VALUE(0); 450 return 0;
462 } 451 }
463 } 452 }
464 453
@@ -466,7 +455,7 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
466 if (rc < 0) { 455 if (rc < 0) {
467 printk(KERN_WARNING PREFIX "PCI Interrupt %s[%c]: failed " 456 printk(KERN_WARNING PREFIX "PCI Interrupt %s[%c]: failed "
468 "to register GSI\n", pci_name(dev), ('A' + pin)); 457 "to register GSI\n", pci_name(dev), ('A' + pin));
469 return_VALUE(rc); 458 return rc;
470 } 459 }
471 dev->irq = rc; 460 dev->irq = rc;
472 461
@@ -480,7 +469,7 @@ int acpi_pci_irq_enable(struct pci_dev *dev)
480 (triggering == ACPI_LEVEL_SENSITIVE) ? "level" : "edge", 469 (triggering == ACPI_LEVEL_SENSITIVE) ? "level" : "edge",
481 (polarity == ACPI_ACTIVE_LOW) ? "low" : "high", dev->irq); 470 (polarity == ACPI_ACTIVE_LOW) ? "low" : "high", dev->irq);
482 471
483 return_VALUE(0); 472 return 0;
484} 473}
485 474
486EXPORT_SYMBOL(acpi_pci_irq_enable); 475EXPORT_SYMBOL(acpi_pci_irq_enable);
@@ -497,14 +486,13 @@ void acpi_pci_irq_disable(struct pci_dev *dev)
497 int triggering = ACPI_LEVEL_SENSITIVE; 486 int triggering = ACPI_LEVEL_SENSITIVE;
498 int polarity = ACPI_ACTIVE_LOW; 487 int polarity = ACPI_ACTIVE_LOW;
499 488
500 ACPI_FUNCTION_TRACE("acpi_pci_irq_disable");
501 489
502 if (!dev || !dev->bus) 490 if (!dev || !dev->bus)
503 return_VOID; 491 return;
504 492
505 pin = dev->pin; 493 pin = dev->pin;
506 if (!pin) 494 if (!pin)
507 return_VOID; 495 return;
508 pin--; 496 pin--;
509 497
510 /* 498 /*
@@ -522,7 +510,7 @@ void acpi_pci_irq_disable(struct pci_dev *dev)
522 &triggering, &polarity, NULL, 510 &triggering, &polarity, NULL,
523 acpi_pci_free_irq); 511 acpi_pci_free_irq);
524 if (gsi < 0) 512 if (gsi < 0)
525 return_VOID; 513 return;
526 514
527 /* 515 /*
528 * TBD: It might be worth clearing dev->irq by magic constant 516 * TBD: It might be worth clearing dev->irq by magic constant
@@ -534,5 +522,5 @@ void acpi_pci_irq_disable(struct pci_dev *dev)
534 522
535 acpi_unregister_gsi(gsi); 523 acpi_unregister_gsi(gsi);
536 524
537 return_VOID; 525 return;
538} 526}