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;
88 acpi_handle handle = link->device->handle;
112 link->irq.possible[i] = p->interrupts[i];
113 link->irq.possible_count++;
115 link->irq.triggering = p->triggering;
116 link->irq.polarity = p->polarity;
117 link->irq.resource_type = ACPI_RESOURCE_TYPE_IRQ;
138 link->irq.possible[i] = p->interrupts[i];
139 link->irq.possible_count++;
141 link->irq.triggering = p->triggering;
142 link->irq.polarity = p->polarity;
143 link->irq.resource_type = ACPI_RESOURCE_TYPE_EXTENDED_IRQ;
155 static int acpi_pci_link_get_possible(struct acpi_pci_link *link)
157 acpi_handle handle = link->device->handle;
161 acpi_pci_link_check_possible, link);
168 link->irq.possible_count);
222 * Run _CRS and set link->irq.active
228 static int acpi_pci_link_get_current(struct acpi_pci_link *link)
230 acpi_handle handle = link->device->handle;
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) {
269 link->irq.active = irq;
271 acpi_handle_debug(handle, "Link at IRQ %d\n", link->irq.active);
277 static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
284 acpi_handle handle = link->device->handle;
298 switch (link->irq.resource_type) {
302 resource->res.data.irq.triggering = link->irq.triggering;
304 link->irq.polarity;
305 if (link->irq.triggering == ACPI_EDGE_SENSITIVE)
320 link->irq.triggering;
322 link->irq.polarity;
323 if (link->irq.triggering == ACPI_EDGE_SENSITIVE)
334 link->irq.resource_type);
343 status = acpi_set_current_resources(link->device->handle, &buffer);
353 result = acpi_bus_get_status(link->device);
358 if (!link->device->status.enabled)
361 /* Query _CRS, set link->irq.active */
362 result = acpi_pci_link_get_current(link);
369 * set link->irq.active
371 if (link->irq.active != irq) {
377 link->irq.active, irq);
378 link->irq.active = irq;
381 acpi_handle_debug(handle, "Set IRQ %d\n", link->irq.active);
414 * Since this heuristic can't tell the difference between a link
415 * that no device will attach to, vs. a link which may be shared
453 struct acpi_pci_link *link;
457 list_for_each_entry(link, &acpi_link_list, list) {
459 * If a link is active, penalize its IRQ heavily
462 if (link->irq.active && link->irq.active == irq)
468 for (i = 0; i < link->irq.possible_count; i++)
469 if (link->irq.possible[i] == irq)
471 link->irq.possible_count;
492 struct acpi_pci_link *link;
498 list_for_each_entry(link, &acpi_link_list, list) {
504 if (link->irq.possible_count) {
507 link->irq.possible_count;
509 for (i = 0; i < link->irq.possible_count; i++) {
510 if (link->irq.possible[i] < ACPI_MAX_ISA_IRQS)
511 acpi_isa_irq_penalty[link->irq.
516 } else if (link->irq.active &&
517 (link->irq.active < ACPI_MAX_ISA_IRQS)) {
518 acpi_isa_irq_penalty[link->irq.active] +=
528 static int acpi_pci_link_allocate(struct acpi_pci_link *link)
530 acpi_handle handle = link->device->handle;
534 if (link->irq.initialized) {
535 if (link->refcnt == 0)
536 /* This means the link is disabled but initialized */
537 acpi_pci_link_set(link, link->irq.active);
544 for (i = 0; i < link->irq.possible_count; ++i) {
545 if (link->irq.active == link->irq.possible[i])
551 if (i == link->irq.possible_count) {
554 link->irq.active);
555 link->irq.active = 0;
561 if (link->irq.active)
562 irq = link->irq.active;
564 irq = link->irq.possible[link->irq.possible_count - 1];
566 if (acpi_irq_balance || !link->irq.active) {
571 for (i = (link->irq.possible_count - 1); i >= 0; i--) {
573 acpi_irq_get_penalty(link->irq.possible[i]))
574 irq = link->irq.possible[i];
583 /* Attempt to enable the link device at this IRQ. */
584 if (acpi_pci_link_set(link, irq)) {
589 if (link->irq.active < ACPI_MAX_ISA_IRQS)
590 acpi_isa_irq_penalty[link->irq.active] +=
594 link->irq.active);
597 link->irq.initialized = 1;
610 struct acpi_pci_link *link;
613 acpi_handle_err(handle, "Invalid link device\n");
617 link = acpi_driver_data(device);
618 if (!link) {
619 acpi_handle_err(handle, "Invalid link context\n");
630 if (acpi_pci_link_allocate(link)) {
635 if (!link->irq.active) {
640 link->refcnt++;
644 *triggering = link->irq.triggering;
646 *polarity = link->irq.polarity;
648 *name = acpi_device_bid(link->device);
650 return link->irq.active;
654 * We don't change link's irq information here. After it is reenabled, we
660 struct acpi_pci_link *link;
663 acpi_handle_err(handle, "Invalid link device\n");
667 link = acpi_driver_data(device);
668 if (!link) {
669 acpi_handle_err(handle, "Invalid link context\n");
674 if (!link->irq.initialized) {
681 * The Link reference count allows us to _DISable an unused link
684 * which blindly restores the link state.
689 link->refcnt--;
693 if (link->refcnt == 0)
694 acpi_evaluate_object(link->device->handle, "_DIS", NULL, NULL);
697 return link->irq.active;
708 struct acpi_pci_link *link;
712 link = kzalloc(sizeof(struct acpi_pci_link), GFP_KERNEL);
713 if (!link)
716 link->device = device;
719 device->driver_data = link;
722 result = acpi_pci_link_get_possible(link);
726 /* query and set link->irq.active */
727 acpi_pci_link_get_current(link);
729 pr_info("Interrupt link %s configured for IRQ %d\n",
730 acpi_device_bid(device), link->irq.active);
732 for (i = 0; i < link->irq.possible_count; i++) {
733 if (link->irq.active != link->irq.possible[i])
735 link->irq.possible[i]);
738 if (!link->device->status.enabled)
739 pr_info("Interrupt link %s disabled\n", acpi_device_bid(device));
741 list_add_tail(&link->list, &acpi_link_list);
749 kfree(link);
756 static int acpi_pci_link_resume(struct acpi_pci_link *link)
758 if (link->refcnt && link->irq.active && link->irq.initialized)
759 return (acpi_pci_link_set(link, link->irq.active));
766 struct acpi_pci_link *link;
768 list_for_each_entry(link, &acpi_link_list, list) {
769 acpi_pci_link_resume(link);
775 struct acpi_pci_link *link;
777 link = acpi_driver_data(device);
780 list_del(&link->list);
783 kfree(link);