Skip to content

Commit 476cc43

Browse files
committed
Merge branches 'acpi-pci', 'acpi-irq' and 'acpi-assorted'
* acpi-pci: ACPI, PCI, irq: remove redundant check for null string pointer ACPI / PCI: Simplify acpi_penalize_isa_irq() ACPI, PCI, irq: remove interrupt number restriction ACPI, PCI, irq: remove interrupt count restriction * acpi-irq: ACPI / spi: attach GPIO IRQ from ACPI description to SPI device ACPI / gpio: Add irq_type when a GPIO is used as an interrupt ACPI: Rename acpi_gsi_get_irq_type to acpi_dev_get_irq_type and export symbol * acpi-assorted: ACPI / SBS: fix inconsistent indenting inside if statement ACPI: Fix build errors due objects compiled unconditionally
4 parents 42d287d + 4528897 + 33ada67 + a84bc8c commit 476cc43

File tree

11 files changed

+165
-75
lines changed

11 files changed

+165
-75
lines changed

drivers/acpi/Makefile

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@ ccflags-$(CONFIG_ACPI_DEBUG) += -DACPI_DEBUG_OUTPUT
88
#
99
# ACPI Boot-Time Table Parsing
1010
#
11-
obj-y += tables.o
11+
obj-$(CONFIG_ACPI) += tables.o
1212
obj-$(CONFIG_X86) += blacklist.o
1313

1414
#
1515
# ACPI Core Subsystem (Interpreter)
1616
#
17-
obj-y += acpi.o \
17+
obj-$(CONFIG_ACPI) += acpi.o \
1818
acpica/
1919

2020
# All the builtin files are in the "acpi." module_param namespace.
@@ -66,10 +66,10 @@ obj-$(CONFIG_ACPI_FAN) += fan.o
6666
obj-$(CONFIG_ACPI_VIDEO) += video.o
6767
obj-$(CONFIG_ACPI_PCI_SLOT) += pci_slot.o
6868
obj-$(CONFIG_ACPI_PROCESSOR) += processor.o
69-
obj-y += container.o
69+
obj-$(CONFIG_ACPI) += container.o
7070
obj-$(CONFIG_ACPI_THERMAL) += thermal.o
7171
obj-$(CONFIG_ACPI_NFIT) += nfit.o
72-
obj-y += acpi_memhotplug.o
72+
obj-$(CONFIG_ACPI) += acpi_memhotplug.o
7373
obj-$(CONFIG_ACPI_HOTPLUG_IOAPIC) += ioapic.o
7474
obj-$(CONFIG_ACPI_BATTERY) += battery.o
7575
obj-$(CONFIG_ACPI_SBS) += sbshc.o

drivers/acpi/gsi.c

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,25 +17,6 @@ enum acpi_irq_model_id acpi_irq_model;
1717

1818
static struct fwnode_handle *acpi_gsi_domain_id;
1919

20-
static unsigned int acpi_gsi_get_irq_type(int trigger, int polarity)
21-
{
22-
switch (polarity) {
23-
case ACPI_ACTIVE_LOW:
24-
return trigger == ACPI_EDGE_SENSITIVE ?
25-
IRQ_TYPE_EDGE_FALLING :
26-
IRQ_TYPE_LEVEL_LOW;
27-
case ACPI_ACTIVE_HIGH:
28-
return trigger == ACPI_EDGE_SENSITIVE ?
29-
IRQ_TYPE_EDGE_RISING :
30-
IRQ_TYPE_LEVEL_HIGH;
31-
case ACPI_ACTIVE_BOTH:
32-
if (trigger == ACPI_EDGE_SENSITIVE)
33-
return IRQ_TYPE_EDGE_BOTH;
34-
default:
35-
return IRQ_TYPE_NONE;
36-
}
37-
}
38-
3920
/**
4021
* acpi_gsi_to_irq() - Retrieve the linux irq number for a given GSI
4122
* @gsi: GSI IRQ number to map
@@ -82,7 +63,7 @@ int acpi_register_gsi(struct device *dev, u32 gsi, int trigger,
8263

8364
fwspec.fwnode = acpi_gsi_domain_id;
8465
fwspec.param[0] = gsi;
85-
fwspec.param[1] = acpi_gsi_get_irq_type(trigger, polarity);
66+
fwspec.param[1] = acpi_dev_get_irq_type(trigger, polarity);
8667
fwspec.param_count = 2;
8768

8869
return irq_create_fwspec_mapping(&fwspec);

drivers/acpi/pci_irq.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,6 @@ static void do_prt_fixups(struct acpi_prt_entry *entry,
131131
quirk = &prt_quirks[i];
132132

133133
/* All current quirks involve link devices, not GSIs */
134-
if (!prt->source)
135-
continue;
136-
137134
if (dmi_check_system(quirk->system) &&
138135
entry->id.segment == quirk->segment &&
139136
entry->id.bus == quirk->bus &&

drivers/acpi/pci_link.c

Lines changed: 96 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
* Copyright (C) 2001, 2002 Andy Grover <[email protected]>
55
* Copyright (C) 2001, 2002 Paul Diefenbaugh <[email protected]>
66
* Copyright (C) 2002 Dominik Brodowski <[email protected]>
7+
* Copyright (c) 2015, The Linux Foundation. All rights reserved.
78
*
89
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
910
*
@@ -67,12 +68,12 @@ static struct acpi_scan_handler pci_link_handler = {
6768
* later even the link is disable. Instead, we just repick the active irq
6869
*/
6970
struct acpi_pci_link_irq {
70-
u8 active; /* Current IRQ */
71+
u32 active; /* Current IRQ */
7172
u8 triggering; /* All IRQs */
7273
u8 polarity; /* All IRQs */
7374
u8 resource_type;
7475
u8 possible_count;
75-
u8 possible[ACPI_PCI_LINK_MAX_POSSIBLE];
76+
u32 possible[ACPI_PCI_LINK_MAX_POSSIBLE];
7677
u8 initialized:1;
7778
u8 reserved:7;
7879
};
@@ -437,7 +438,6 @@ static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
437438
* enabled system.
438439
*/
439440

440-
#define ACPI_MAX_IRQS 256
441441
#define ACPI_MAX_ISA_IRQ 16
442442

443443
#define PIRQ_PENALTY_PCI_AVAILABLE (0)
@@ -447,7 +447,7 @@ static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
447447
#define PIRQ_PENALTY_ISA_USED (16*16*16*16*16)
448448
#define PIRQ_PENALTY_ISA_ALWAYS (16*16*16*16*16*16)
449449

450-
static int acpi_irq_penalty[ACPI_MAX_IRQS] = {
450+
static int acpi_irq_isa_penalty[ACPI_MAX_ISA_IRQ] = {
451451
PIRQ_PENALTY_ISA_ALWAYS, /* IRQ0 timer */
452452
PIRQ_PENALTY_ISA_ALWAYS, /* IRQ1 keyboard */
453453
PIRQ_PENALTY_ISA_ALWAYS, /* IRQ2 cascade */
@@ -464,9 +464,68 @@ static int acpi_irq_penalty[ACPI_MAX_IRQS] = {
464464
PIRQ_PENALTY_ISA_USED, /* IRQ13 fpe, sometimes */
465465
PIRQ_PENALTY_ISA_USED, /* IRQ14 ide0 */
466466
PIRQ_PENALTY_ISA_USED, /* IRQ15 ide1 */
467-
/* >IRQ15 */
468467
};
469468

469+
struct irq_penalty_info {
470+
int irq;
471+
int penalty;
472+
struct list_head node;
473+
};
474+
475+
static LIST_HEAD(acpi_irq_penalty_list);
476+
477+
static int acpi_irq_get_penalty(int irq)
478+
{
479+
struct irq_penalty_info *irq_info;
480+
481+
if (irq < ACPI_MAX_ISA_IRQ)
482+
return acpi_irq_isa_penalty[irq];
483+
484+
list_for_each_entry(irq_info, &acpi_irq_penalty_list, node) {
485+
if (irq_info->irq == irq)
486+
return irq_info->penalty;
487+
}
488+
489+
return 0;
490+
}
491+
492+
static int acpi_irq_set_penalty(int irq, int new_penalty)
493+
{
494+
struct irq_penalty_info *irq_info;
495+
496+
/* see if this is a ISA IRQ */
497+
if (irq < ACPI_MAX_ISA_IRQ) {
498+
acpi_irq_isa_penalty[irq] = new_penalty;
499+
return 0;
500+
}
501+
502+
/* next, try to locate from the dynamic list */
503+
list_for_each_entry(irq_info, &acpi_irq_penalty_list, node) {
504+
if (irq_info->irq == irq) {
505+
irq_info->penalty = new_penalty;
506+
return 0;
507+
}
508+
}
509+
510+
/* nope, let's allocate a slot for this IRQ */
511+
irq_info = kzalloc(sizeof(*irq_info), GFP_KERNEL);
512+
if (!irq_info)
513+
return -ENOMEM;
514+
515+
irq_info->irq = irq;
516+
irq_info->penalty = new_penalty;
517+
list_add_tail(&irq_info->node, &acpi_irq_penalty_list);
518+
519+
return 0;
520+
}
521+
522+
static void acpi_irq_add_penalty(int irq, int penalty)
523+
{
524+
int curpen = acpi_irq_get_penalty(irq);
525+
526+
acpi_irq_set_penalty(irq, curpen + penalty);
527+
}
528+
470529
int __init acpi_irq_penalty_init(void)
471530
{
472531
struct acpi_pci_link *link;
@@ -487,15 +546,16 @@ int __init acpi_irq_penalty_init(void)
487546
link->irq.possible_count;
488547

489548
for (i = 0; i < link->irq.possible_count; i++) {
490-
if (link->irq.possible[i] < ACPI_MAX_ISA_IRQ)
491-
acpi_irq_penalty[link->irq.
492-
possible[i]] +=
493-
penalty;
549+
if (link->irq.possible[i] < ACPI_MAX_ISA_IRQ) {
550+
int irqpos = link->irq.possible[i];
551+
552+
acpi_irq_add_penalty(irqpos, penalty);
553+
}
494554
}
495555

496556
} else if (link->irq.active) {
497-
acpi_irq_penalty[link->irq.active] +=
498-
PIRQ_PENALTY_PCI_POSSIBLE;
557+
acpi_irq_add_penalty(link->irq.active,
558+
PIRQ_PENALTY_PCI_POSSIBLE);
499559
}
500560
}
501561

@@ -547,12 +607,12 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
547607
* the use of IRQs 9, 10, 11, and >15.
548608
*/
549609
for (i = (link->irq.possible_count - 1); i >= 0; i--) {
550-
if (acpi_irq_penalty[irq] >
551-
acpi_irq_penalty[link->irq.possible[i]])
610+
if (acpi_irq_get_penalty(irq) >
611+
acpi_irq_get_penalty(link->irq.possible[i]))
552612
irq = link->irq.possible[i];
553613
}
554614
}
555-
if (acpi_irq_penalty[irq] >= PIRQ_PENALTY_ISA_ALWAYS) {
615+
if (acpi_irq_get_penalty(irq) >= PIRQ_PENALTY_ISA_ALWAYS) {
556616
printk(KERN_ERR PREFIX "No IRQ available for %s [%s]. "
557617
"Try pci=noacpi or acpi=off\n",
558618
acpi_device_name(link->device),
@@ -568,7 +628,8 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
568628
acpi_device_bid(link->device));
569629
return -ENODEV;
570630
} else {
571-
acpi_irq_penalty[link->irq.active] += PIRQ_PENALTY_PCI_USING;
631+
acpi_irq_add_penalty(link->irq.active, PIRQ_PENALTY_PCI_USING);
632+
572633
printk(KERN_WARNING PREFIX "%s [%s] enabled at IRQ %d\n",
573634
acpi_device_name(link->device),
574635
acpi_device_bid(link->device), link->irq.active);
@@ -778,7 +839,7 @@ static void acpi_pci_link_remove(struct acpi_device *device)
778839
}
779840

780841
/*
781-
* modify acpi_irq_penalty[] from cmdline
842+
* modify penalty from cmdline
782843
*/
783844
static int __init acpi_irq_penalty_update(char *str, int used)
784845
{
@@ -796,13 +857,10 @@ static int __init acpi_irq_penalty_update(char *str, int used)
796857
if (irq < 0)
797858
continue;
798859

799-
if (irq >= ARRAY_SIZE(acpi_irq_penalty))
800-
continue;
801-
802860
if (used)
803-
acpi_irq_penalty[irq] += PIRQ_PENALTY_ISA_USED;
861+
acpi_irq_add_penalty(irq, PIRQ_PENALTY_ISA_USED);
804862
else
805-
acpi_irq_penalty[irq] = PIRQ_PENALTY_PCI_AVAILABLE;
863+
acpi_irq_set_penalty(irq, PIRQ_PENALTY_PCI_AVAILABLE);
806864

807865
if (retval != 2) /* no next number */
808866
break;
@@ -819,18 +877,15 @@ static int __init acpi_irq_penalty_update(char *str, int used)
819877
*/
820878
void acpi_penalize_isa_irq(int irq, int active)
821879
{
822-
if (irq >= 0 && irq < ARRAY_SIZE(acpi_irq_penalty)) {
823-
if (active)
824-
acpi_irq_penalty[irq] += PIRQ_PENALTY_ISA_USED;
825-
else
826-
acpi_irq_penalty[irq] += PIRQ_PENALTY_PCI_USING;
827-
}
880+
if (irq >= 0)
881+
acpi_irq_add_penalty(irq, active ?
882+
PIRQ_PENALTY_ISA_USED : PIRQ_PENALTY_PCI_USING);
828883
}
829884

830885
bool acpi_isa_irq_available(int irq)
831886
{
832-
return irq >= 0 && (irq >= ARRAY_SIZE(acpi_irq_penalty) ||
833-
acpi_irq_penalty[irq] < PIRQ_PENALTY_ISA_ALWAYS);
887+
return irq >= 0 &&
888+
(acpi_irq_get_penalty(irq) < PIRQ_PENALTY_ISA_ALWAYS);
834889
}
835890

836891
/*
@@ -840,13 +895,18 @@ bool acpi_isa_irq_available(int irq)
840895
*/
841896
void acpi_penalize_sci_irq(int irq, int trigger, int polarity)
842897
{
843-
if (irq >= 0 && irq < ARRAY_SIZE(acpi_irq_penalty)) {
844-
if (trigger != ACPI_MADT_TRIGGER_LEVEL ||
845-
polarity != ACPI_MADT_POLARITY_ACTIVE_LOW)
846-
acpi_irq_penalty[irq] += PIRQ_PENALTY_ISA_ALWAYS;
847-
else
848-
acpi_irq_penalty[irq] += PIRQ_PENALTY_PCI_USING;
849-
}
898+
int penalty;
899+
900+
if (irq < 0)
901+
return;
902+
903+
if (trigger != ACPI_MADT_TRIGGER_LEVEL ||
904+
polarity != ACPI_MADT_POLARITY_ACTIVE_LOW)
905+
penalty = PIRQ_PENALTY_ISA_ALWAYS;
906+
else
907+
penalty = PIRQ_PENALTY_PCI_USING;
908+
909+
acpi_irq_add_penalty(irq, penalty);
850910
}
851911

852912
/*

drivers/acpi/resource.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include <linux/export.h>
2424
#include <linux/ioport.h>
2525
#include <linux/slab.h>
26+
#include <linux/irq.h>
2627

2728
#ifdef CONFIG_X86
2829
#define valid_IRQ(i) (((i) != 0) && ((i) != 2))
@@ -336,6 +337,31 @@ unsigned long acpi_dev_irq_flags(u8 triggering, u8 polarity, u8 shareable)
336337
}
337338
EXPORT_SYMBOL_GPL(acpi_dev_irq_flags);
338339

340+
/**
341+
* acpi_dev_get_irq_type - Determine irq type.
342+
* @triggering: Triggering type as provided by ACPI.
343+
* @polarity: Interrupt polarity as provided by ACPI.
344+
*/
345+
unsigned int acpi_dev_get_irq_type(int triggering, int polarity)
346+
{
347+
switch (polarity) {
348+
case ACPI_ACTIVE_LOW:
349+
return triggering == ACPI_EDGE_SENSITIVE ?
350+
IRQ_TYPE_EDGE_FALLING :
351+
IRQ_TYPE_LEVEL_LOW;
352+
case ACPI_ACTIVE_HIGH:
353+
return triggering == ACPI_EDGE_SENSITIVE ?
354+
IRQ_TYPE_EDGE_RISING :
355+
IRQ_TYPE_LEVEL_HIGH;
356+
case ACPI_ACTIVE_BOTH:
357+
if (triggering == ACPI_EDGE_SENSITIVE)
358+
return IRQ_TYPE_EDGE_BOTH;
359+
default:
360+
return IRQ_TYPE_NONE;
361+
}
362+
}
363+
EXPORT_SYMBOL_GPL(acpi_dev_get_irq_type);
364+
339365
static void acpi_dev_irqresource_disabled(struct resource *res, u32 gsi)
340366
{
341367
res->start = gsi;

drivers/acpi/sbs.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -417,11 +417,11 @@ static int acpi_battery_set_alarm(struct acpi_battery *battery)
417417
if ((value & 0xf000) != sel) {
418418
value &= 0x0fff;
419419
value |= sel;
420-
ret = acpi_smbus_write(sbs->hc, SMBUS_WRITE_WORD,
420+
ret = acpi_smbus_write(sbs->hc, SMBUS_WRITE_WORD,
421421
ACPI_SBS_MANAGER,
422422
0x01, (u8 *)&value, 2);
423-
if (ret)
424-
goto end;
423+
if (ret)
424+
goto end;
425425
}
426426
}
427427
ret = acpi_smbus_write(sbs->hc, SMBUS_WRITE_WORD, ACPI_SBS_BATTERY,

0 commit comments

Comments
 (0)