Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
Commits
e857b33d
Commit
e857b33d
authored
Apr 05, 2009
by
Len Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'bjorn-cleanups' into release
parents
9a38f4ee
1c48aa36
Changes
3
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
135 additions
and
164 deletions
+135
-164
drivers/acpi/Kconfig
drivers/acpi/Kconfig
+86
-64
drivers/acpi/pci_irq.c
drivers/acpi/pci_irq.c
+1
-1
drivers/acpi/pci_link.c
drivers/acpi/pci_link.c
+48
-99
No files found.
drivers/acpi/Kconfig
View file @
e857b33d
This diff is collapsed.
Click to expand it.
drivers/acpi/pci_irq.c
View file @
e857b33d
...
...
@@ -319,7 +319,7 @@ static struct acpi_prt_entry *acpi_pci_irq_lookup(struct pci_dev *dev, int pin)
*/
bridge
=
dev
->
bus
->
self
;
while
(
bridge
)
{
pin
=
(((
pin
-
1
)
+
PCI_SLOT
(
dev
->
devfn
))
%
4
)
+
1
;
pin
=
pci_swizzle_interrupt_pin
(
dev
,
pin
)
;
if
((
bridge
->
class
>>
8
)
==
PCI_CLASS_BRIDGE_CARDBUS
)
{
/* PC card has the same IRQ as its cardbridge */
...
...
drivers/acpi/pci_link.c
View file @
e857b33d
...
...
@@ -43,13 +43,14 @@
#include <acpi/acpi_bus.h>
#include <acpi/acpi_drivers.h>
#define _COMPONENT ACPI_PCI_COMPONENT
#define _COMPONENT
ACPI_PCI_COMPONENT
ACPI_MODULE_NAME
(
"pci_link"
);
#define ACPI_PCI_LINK_CLASS "pci_irq_routing"
#define ACPI_PCI_LINK_DEVICE_NAME "PCI Interrupt Link"
#define ACPI_PCI_LINK_FILE_INFO "info"
#define ACPI_PCI_LINK_FILE_STATUS "state"
#define ACPI_PCI_LINK_MAX_POSSIBLE 16
#define ACPI_PCI_LINK_MAX_POSSIBLE 16
static
int
acpi_pci_link_add
(
struct
acpi_device
*
device
);
static
int
acpi_pci_link_remove
(
struct
acpi_device
*
device
,
int
type
);
...
...
@@ -66,7 +67,7 @@ static struct acpi_driver acpi_pci_link_driver = {
.
ops
=
{
.
add
=
acpi_pci_link_add
,
.
remove
=
acpi_pci_link_remove
,
},
},
};
/*
...
...
@@ -76,7 +77,7 @@ static struct acpi_driver acpi_pci_link_driver = {
struct
acpi_pci_link_irq
{
u8
active
;
/* Current IRQ */
u8
triggering
;
/* All IRQs */
u8
polarity
;
/* All IRQs */
u8
polarity
;
/* All IRQs */
u8
resource_type
;
u8
possible_count
;
u8
possible
[
ACPI_PCI_LINK_MAX_POSSIBLE
];
...
...
@@ -85,16 +86,13 @@ struct acpi_pci_link_irq {
};
struct
acpi_pci_link
{
struct
list_head
node
;
struct
acpi_device
*
device
;
struct
acpi_pci_link_irq
irq
;
int
refcnt
;
struct
list_head
list
;
struct
acpi_device
*
device
;
struct
acpi_pci_link_irq
irq
;
int
refcnt
;
};
static
struct
{
int
count
;
struct
list_head
entries
;
}
acpi_link
;
static
LIST_HEAD
(
acpi_link_list
);
static
DEFINE_MUTEX
(
acpi_link_lock
);
/* --------------------------------------------------------------------------
...
...
@@ -104,12 +102,11 @@ static DEFINE_MUTEX(acpi_link_lock);
/*
* set context (link) possible list from resource list
*/
static
acpi_status
acpi_pci_link_check_possible
(
struct
acpi_resource
*
resource
,
void
*
context
)
static
acpi_status
acpi_pci_link_check_possible
(
struct
acpi_resource
*
resource
,
void
*
context
)
{
struct
acpi_pci_link
*
link
=
context
;
u32
i
=
0
;
u32
i
;
switch
(
resource
->
type
)
{
case
ACPI_RESOURCE_TYPE_START_DEPENDENT
:
...
...
@@ -179,10 +176,6 @@ static int acpi_pci_link_get_possible(struct acpi_pci_link *link)
{
acpi_status
status
;
if
(
!
link
)
return
-
EINVAL
;
status
=
acpi_walk_resources
(
link
->
device
->
handle
,
METHOD_NAME__PRS
,
acpi_pci_link_check_possible
,
link
);
if
(
ACPI_FAILURE
(
status
))
{
...
...
@@ -197,11 +190,10 @@ static int acpi_pci_link_get_possible(struct acpi_pci_link *link)
return
0
;
}
static
acpi_status
acpi_pci_link_check_current
(
struct
acpi_resource
*
resource
,
void
*
context
)
static
acpi_status
acpi_pci_link_check_current
(
struct
acpi_resource
*
resource
,
void
*
context
)
{
int
*
irq
=
(
int
*
)
context
;
int
*
irq
=
context
;
switch
(
resource
->
type
)
{
case
ACPI_RESOURCE_TYPE_START_DEPENDENT
:
...
...
@@ -258,12 +250,9 @@ acpi_pci_link_check_current(struct acpi_resource *resource, void *context)
static
int
acpi_pci_link_get_current
(
struct
acpi_pci_link
*
link
)
{
int
result
=
0
;
acpi_status
status
=
AE_OK
;
acpi_status
status
;
int
irq
=
0
;
if
(
!
link
)
return
-
EINVAL
;
link
->
irq
.
active
=
0
;
/* in practice, status disabled is meaningless, ignore it */
...
...
@@ -308,16 +297,15 @@ static int acpi_pci_link_get_current(struct acpi_pci_link *link)
static
int
acpi_pci_link_set
(
struct
acpi_pci_link
*
link
,
int
irq
)
{
int
result
=
0
;
acpi_status
status
=
AE_OK
;
int
result
;
acpi_status
status
;
struct
{
struct
acpi_resource
res
;
struct
acpi_resource
end
;
}
*
resource
;
struct
acpi_buffer
buffer
=
{
0
,
NULL
};
if
(
!
link
||
!
irq
)
if
(
!
irq
)
return
-
EINVAL
;
resource
=
kzalloc
(
sizeof
(
*
resource
)
+
1
,
irqs_disabled
()
?
GFP_ATOMIC
:
GFP_KERNEL
);
...
...
@@ -479,30 +467,22 @@ static int acpi_irq_penalty[ACPI_MAX_IRQS] = {
PIRQ_PENALTY_PCI_AVAILABLE
,
/* IRQ9 PCI, often acpi */
PIRQ_PENALTY_PCI_AVAILABLE
,
/* IRQ10 PCI */
PIRQ_PENALTY_PCI_AVAILABLE
,
/* IRQ11 PCI */
PIRQ_PENALTY_ISA_USED
,
/* IRQ12 mouse */
PIRQ_PENALTY_ISA_USED
,
/* IRQ13 fpe, sometimes */
PIRQ_PENALTY_ISA_USED
,
/* IRQ14 ide0 */
PIRQ_PENALTY_ISA_USED
,
/* IRQ15 ide1 */
PIRQ_PENALTY_ISA_USED
,
/* IRQ12 mouse */
PIRQ_PENALTY_ISA_USED
,
/* IRQ13 fpe, sometimes */
PIRQ_PENALTY_ISA_USED
,
/* IRQ14 ide0 */
PIRQ_PENALTY_ISA_USED
,
/* IRQ15 ide1 */
/* >IRQ15 */
};
int
__init
acpi_irq_penalty_init
(
void
)
{
struct
list_head
*
node
=
NULL
;
struct
acpi_pci_link
*
link
=
NULL
;
int
i
=
0
;
struct
acpi_pci_link
*
link
;
int
i
;
/*
* Update penalties to facilitate IRQ balancing.
*/
list_for_each
(
node
,
&
acpi_link
.
entries
)
{
link
=
list_entry
(
node
,
struct
acpi_pci_link
,
node
);
if
(
!
link
)
{
printk
(
KERN_ERR
PREFIX
"Invalid link context
\n
"
);
continue
;
}
list_for_each_entry
(
link
,
&
acpi_link_list
,
list
)
{
/*
* reflect the possible and active irqs in the penalty table --
...
...
@@ -527,7 +507,6 @@ int __init acpi_irq_penalty_init(void)
}
/* Add a penalty for the SCI */
acpi_irq_penalty
[
acpi_gbl_FADT
.
sci_interrupt
]
+=
PIRQ_PENALTY_PCI_USING
;
return
0
;
}
...
...
@@ -538,7 +517,6 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
int
irq
;
int
i
;
if
(
link
->
irq
.
initialized
)
{
if
(
link
->
refcnt
==
0
)
/* This means the link is disabled but initialized */
...
...
@@ -566,11 +544,10 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
/*
* if active found, use it; else pick entry from end of possible list.
*/
if
(
link
->
irq
.
active
)
{
if
(
link
->
irq
.
active
)
irq
=
link
->
irq
.
active
;
}
else
{
else
irq
=
link
->
irq
.
possible
[
link
->
irq
.
possible_count
-
1
];
}
if
(
acpi_irq_balance
||
!
link
->
irq
.
active
)
{
/*
...
...
@@ -599,7 +576,6 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
}
link
->
irq
.
initialized
=
1
;
return
0
;
}
...
...
@@ -608,16 +584,12 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
* success: return IRQ >= 0
* failure: return -1
*/
int
acpi_pci_link_allocate_irq
(
acpi_handle
handle
,
int
index
,
int
*
triggering
,
int
*
polarity
,
char
**
name
)
int
acpi_pci_link_allocate_irq
(
acpi_handle
handle
,
int
index
,
int
*
triggering
,
int
*
polarity
,
char
**
name
)
{
int
result
=
0
;
struct
acpi_device
*
device
=
NULL
;
struct
acpi_pci_link
*
link
=
NULL
;
int
result
;
struct
acpi_device
*
device
;
struct
acpi_pci_link
*
link
;
result
=
acpi_bus_get_device
(
handle
,
&
device
);
if
(
result
)
{
...
...
@@ -669,11 +641,10 @@ acpi_pci_link_allocate_irq(acpi_handle handle,
*/
int
acpi_pci_link_free_irq
(
acpi_handle
handle
)
{
struct
acpi_device
*
device
=
NULL
;
struct
acpi_pci_link
*
link
=
NULL
;
struct
acpi_device
*
device
;
struct
acpi_pci_link
*
link
;
acpi_status
result
;
result
=
acpi_bus_get_device
(
handle
,
&
device
);
if
(
result
)
{
printk
(
KERN_ERR
PREFIX
"Invalid link device
\n
"
);
...
...
@@ -708,9 +679,9 @@ int acpi_pci_link_free_irq(acpi_handle handle)
"Link %s is dereferenced
\n
"
,
acpi_device_bid
(
link
->
device
)));
if
(
link
->
refcnt
==
0
)
{
if
(
link
->
refcnt
==
0
)
acpi_evaluate_object
(
link
->
device
->
handle
,
"_DIS"
,
NULL
,
NULL
);
}
mutex_unlock
(
&
acpi_link_lock
);
return
(
link
->
irq
.
active
);
}
...
...
@@ -721,15 +692,11 @@ int acpi_pci_link_free_irq(acpi_handle handle)
static
int
acpi_pci_link_add
(
struct
acpi_device
*
device
)
{
int
result
=
0
;
struct
acpi_pci_link
*
link
=
NULL
;
int
i
=
0
;
int
result
;
struct
acpi_pci_link
*
link
;
int
i
;
int
found
=
0
;
if
(
!
device
)
return
-
EINVAL
;
link
=
kzalloc
(
sizeof
(
struct
acpi_pci_link
),
GFP_KERNEL
);
if
(
!
link
)
return
-
ENOMEM
;
...
...
@@ -767,9 +734,7 @@ static int acpi_pci_link_add(struct acpi_device *device)
printk
(
"
\n
"
);
/* TBD: Acquire/release lock */
list_add_tail
(
&
link
->
node
,
&
acpi_link
.
entries
);
acpi_link
.
count
++
;
list_add_tail
(
&
link
->
list
,
&
acpi_link_list
);
end:
/* disable all links -- to be activated on use */
...
...
@@ -784,24 +749,17 @@ static int acpi_pci_link_add(struct acpi_device *device)
static
int
acpi_pci_link_resume
(
struct
acpi_pci_link
*
link
)
{
if
(
link
->
refcnt
&&
link
->
irq
.
active
&&
link
->
irq
.
initialized
)
return
(
acpi_pci_link_set
(
link
,
link
->
irq
.
active
));
else
return
0
;
return
0
;
}
static
int
irqrouter_resume
(
struct
sys_device
*
dev
)
{
struct
list_head
*
node
=
NULL
;
struct
acpi_pci_link
*
link
=
NULL
;
struct
acpi_pci_link
*
link
;
list_for_each
(
node
,
&
acpi_link
.
entries
)
{
link
=
list_entry
(
node
,
struct
acpi_pci_link
,
node
);
if
(
!
link
)
{
printk
(
KERN_ERR
PREFIX
"Invalid link context
\n
"
);
continue
;
}
list_for_each_entry
(
link
,
&
acpi_link_list
,
list
)
{
acpi_pci_link_resume
(
link
);
}
return
0
;
...
...
@@ -809,20 +767,15 @@ static int irqrouter_resume(struct sys_device *dev)
static
int
acpi_pci_link_remove
(
struct
acpi_device
*
device
,
int
type
)
{
struct
acpi_pci_link
*
link
=
NULL
;
if
(
!
device
||
!
acpi_driver_data
(
device
))
return
-
EINVAL
;
struct
acpi_pci_link
*
link
;
link
=
acpi_driver_data
(
device
);
mutex_lock
(
&
acpi_link_lock
);
list_del
(
&
link
->
node
);
list_del
(
&
link
->
list
);
mutex_unlock
(
&
acpi_link_lock
);
kfree
(
link
);
return
0
;
}
...
...
@@ -931,7 +884,6 @@ static int __init irqrouter_init_sysfs(void)
{
int
error
;
if
(
acpi_disabled
||
acpi_noirq
)
return
0
;
...
...
@@ -957,9 +909,6 @@ static int __init acpi_pci_link_init(void)
acpi_irq_balance
=
0
;
}
acpi_link
.
count
=
0
;
INIT_LIST_HEAD
(
&
acpi_link
.
entries
);
if
(
acpi_bus_register_driver
(
&
acpi_pci_link_driver
)
<
0
)
return
-
ENODEV
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment