Lines Matching refs:link
10 * 1. Support more than one IRQ resource entry per link device (index).
52 * If a link is initialized, we never change its active and initialized
53 * later even the link is disable. Instead, we just repick the active irq
82 * set context (link) possible list from resource list
87 struct acpi_pci_link *link = context;
111 link->irq.possible[i] = p->interrupts[i];
112 link->irq.possible_count++;
114 link->irq.triggering = p->triggering;
115 link->irq.polarity = p->polarity;
116 link->irq.resource_type = ACPI_RESOURCE_TYPE_IRQ;
137 link->irq.possible[i] = p->interrupts[i];
138 link->irq.possible_count++;
140 link->irq.triggering = p->triggering;
141 link->irq.polarity = p->polarity;
142 link->irq.resource_type = ACPI_RESOURCE_TYPE_EXTENDED_IRQ;
154 static int acpi_pci_link_get_possible(struct acpi_pci_link *link)
158 status = acpi_walk_resources(link->device->handle, METHOD_NAME__PRS,
159 acpi_pci_link_check_possible, link);
161 acpi_handle_debug(link->device->handle, "_PRS not present or invalid");
167 link->irq.possible_count));
223 * Run _CRS and set link->irq.active
229 static int acpi_pci_link_get_current(struct acpi_pci_link *link)
235 link->irq.active = 0;
239 /* Query _STA, set link->device->status */
240 result = acpi_bus_get_status(link->device);
246 if (!link->device->status.enabled) {
256 status = acpi_walk_resources(link->device->handle, METHOD_NAME__CRS,
269 link->irq.active = irq;
271 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Link at IRQ %d \n", link->irq.active));
277 static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
297 switch (link->irq.resource_type) {
301 resource->res.data.irq.triggering = link->irq.triggering;
303 link->irq.polarity;
304 if (link->irq.triggering == ACPI_EDGE_SENSITIVE)
319 link->irq.triggering;
321 link->irq.polarity;
322 if (link->irq.triggering == ACPI_EDGE_SENSITIVE)
332 printk(KERN_ERR PREFIX "Invalid Resource_type %d\n", link->irq.resource_type);
341 status = acpi_set_current_resources(link->device->handle, &buffer);
351 result = acpi_bus_get_status(link->device);
356 if (!link->device->status.enabled) {
359 acpi_device_name(link->device),
360 acpi_device_bid(link->device));
363 /* Query _CRS, set link->irq.active */
364 result = acpi_pci_link_get_current(link);
371 * set link->irq.active
373 if (link->irq.active != irq) {
380 acpi_device_name(link->device),
381 acpi_device_bid(link->device), link->irq.active, irq);
382 link->irq.active = irq;
385 ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Set IRQ %d\n", link->irq.active));
418 * Since this heuristic can't tell the difference between a link
419 * that no device will attach to, vs. a link which may be shared
457 struct acpi_pci_link *link;
461 list_for_each_entry(link, &acpi_link_list, list) {
463 * If a link is active, penalize its IRQ heavily
466 if (link->irq.active && link->irq.active == irq)
472 for (i = 0; i < link->irq.possible_count; i++)
473 if (link->irq.possible[i] == irq)
475 link->irq.possible_count;
496 struct acpi_pci_link *link;
502 list_for_each_entry(link, &acpi_link_list, list) {
508 if (link->irq.possible_count) {
511 link->irq.possible_count;
513 for (i = 0; i < link->irq.possible_count; i++) {
514 if (link->irq.possible[i] < ACPI_MAX_ISA_IRQS)
515 acpi_isa_irq_penalty[link->irq.
520 } else if (link->irq.active &&
521 (link->irq.active < ACPI_MAX_ISA_IRQS)) {
522 acpi_isa_irq_penalty[link->irq.active] +=
532 static int acpi_pci_link_allocate(struct acpi_pci_link *link)
537 if (link->irq.initialized) {
538 if (link->refcnt == 0)
539 /* This means the link is disabled but initialized */
540 acpi_pci_link_set(link, link->irq.active);
547 for (i = 0; i < link->irq.possible_count; ++i) {
548 if (link->irq.active == link->irq.possible[i])
554 if (i == link->irq.possible_count) {
557 " in _PRS\n", link->irq.active);
558 link->irq.active = 0;
564 if (link->irq.active)
565 irq = link->irq.active;
567 irq = link->irq.possible[link->irq.possible_count - 1];
569 if (acpi_irq_balance || !link->irq.active) {
574 for (i = (link->irq.possible_count - 1); i >= 0; i--) {
576 acpi_irq_get_penalty(link->irq.possible[i]))
577 irq = link->irq.possible[i];
583 acpi_device_name(link->device),
584 acpi_device_bid(link->device));
588 /* Attempt to enable the link device at this IRQ. */
589 if (acpi_pci_link_set(link, irq)) {
592 acpi_device_name(link->device),
593 acpi_device_bid(link->device));
596 if (link->irq.active < ACPI_MAX_ISA_IRQS)
597 acpi_isa_irq_penalty[link->irq.active] +=
601 acpi_device_name(link->device),
602 acpi_device_bid(link->device), link->irq.active);
605 link->irq.initialized = 1;
619 struct acpi_pci_link *link;
623 printk(KERN_ERR PREFIX "Invalid link device\n");
627 link = acpi_driver_data(device);
628 if (!link) {
629 printk(KERN_ERR PREFIX "Invalid link context\n");
640 if (acpi_pci_link_allocate(link)) {
645 if (!link->irq.active) {
650 link->refcnt++;
654 *triggering = link->irq.triggering;
656 *polarity = link->irq.polarity;
658 *name = acpi_device_bid(link->device);
661 acpi_device_bid(link->device)));
662 return link->irq.active;
666 * We don't change link's irq information here. After it is reenabled, we
672 struct acpi_pci_link *link;
677 printk(KERN_ERR PREFIX "Invalid link device\n");
681 link = acpi_driver_data(device);
682 if (!link) {
683 printk(KERN_ERR PREFIX "Invalid link context\n");
688 if (!link->irq.initialized) {
695 * The Link reference count allows us to _DISable an unused link
698 * which blindly restores the link state.
703 link->refcnt--;
707 acpi_device_bid(link->device)));
709 if (link->refcnt == 0)
710 acpi_evaluate_object(link->device->handle, "_DIS", NULL, NULL);
713 return link->irq.active;
724 struct acpi_pci_link *link;
728 link = kzalloc(sizeof(struct acpi_pci_link), GFP_KERNEL);
729 if (!link)
732 link->device = device;
735 device->driver_data = link;
738 result = acpi_pci_link_get_possible(link);
742 /* query and set link->irq.active */
743 acpi_pci_link_get_current(link);
747 for (i = 0; i < link->irq.possible_count; i++) {
748 if (link->irq.active == link->irq.possible[i]) {
749 printk(KERN_CONT " *%d", link->irq.possible[i]);
752 printk(KERN_CONT " %d", link->irq.possible[i]);
758 printk(KERN_CONT " *%d", link->irq.active);
760 if (!link->device->status.enabled)
765 list_add_tail(&link->list, &acpi_link_list);
773 kfree(link);
778 static int acpi_pci_link_resume(struct acpi_pci_link *link)
780 if (link->refcnt && link->irq.active && link->irq.initialized)
781 return (acpi_pci_link_set(link, link->irq.active));
788 struct acpi_pci_link *link;
790 list_for_each_entry(link, &acpi_link_list, list) {
791 acpi_pci_link_resume(link);
797 struct acpi_pci_link *link;
799 link = acpi_driver_data(device);
802 list_del(&link->list);
805 kfree(link);