Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
47baacef
Commit
47baacef
authored
Jun 30, 2003
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://kernel.bkbits.net/davem/net-2.5
into home.osdl.org:/home/torvalds/v2.5/linux
parents
2708bcf5
2af67469
Changes
12
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
101 additions
and
288 deletions
+101
-288
arch/alpha/kernel/core_t2.c
arch/alpha/kernel/core_t2.c
+11
-4
arch/alpha/kernel/process.c
arch/alpha/kernel/process.c
+6
-3
drivers/pcmcia/cs.c
drivers/pcmcia/cs.c
+55
-40
drivers/pcmcia/i82092.c
drivers/pcmcia/i82092.c
+3
-39
drivers/pcmcia/i82092aa.h
drivers/pcmcia/i82092aa.h
+0
-1
drivers/pcmcia/i82365.c
drivers/pcmcia/i82365.c
+6
-65
drivers/pcmcia/sa11xx_core.c
drivers/pcmcia/sa11xx_core.c
+13
-53
drivers/pcmcia/sa11xx_core.h
drivers/pcmcia/sa11xx_core.h
+0
-3
drivers/pcmcia/tcic.c
drivers/pcmcia/tcic.c
+3
-41
drivers/pcmcia/yenta_socket.c
drivers/pcmcia/yenta_socket.c
+2
-33
drivers/pcmcia/yenta_socket.h
drivers/pcmcia/yenta_socket.h
+0
-5
include/pcmcia/ss.h
include/pcmcia/ss.h
+2
-1
No files found.
arch/alpha/kernel/core_t2.c
View file @
47baacef
...
...
@@ -465,10 +465,17 @@ t2_init_arch(void)
*
(
vulp
)
T2_HAE_1
=
0
;
mb
();
/* Sparse MEM HAE */
*
(
vulp
)
T2_HAE_2
=
0
;
mb
();
/* Sparse I/O HAE */
*
(
vulp
)
T2_HAE_3
=
0
;
mb
();
/* Config Space HAE */
#if 0
/* !!! DO NOT EVER TOUCH THIS !!! */
*(vulp)T2_HAE_4 = 0; mb(); /* Dense MEM HAE */
#endif
/*
* We also now zero out HAE_4, the dense memory HAE, so that
* we need not account for its "offset" when accessing dense
* memory resources which we allocated in our normal way. This
* HAE would need to stay untouched were we to keep the SRM
* resource settings.
*
* Thus we can now run standard X servers on SABLE/LYNX. :-)
*/
*
(
vulp
)
T2_HAE_4
=
0
;
mb
();
}
void
...
...
arch/alpha/kernel/process.c
View file @
47baacef
...
...
@@ -270,7 +270,7 @@ copy_thread(int nr, unsigned long clone_flags, unsigned long usp,
struct
thread_info
*
childti
=
p
->
thread_info
;
struct
pt_regs
*
childregs
;
struct
switch_stack
*
childstack
,
*
stack
;
unsigned
long
stack_offset
;
unsigned
long
stack_offset
,
settls
;
stack_offset
=
PAGE_SIZE
-
sizeof
(
struct
pt_regs
);
if
(
!
(
regs
->
ps
&
8
))
...
...
@@ -279,6 +279,7 @@ copy_thread(int nr, unsigned long clone_flags, unsigned long usp,
(
stack_offset
+
PAGE_SIZE
+
(
long
)
childti
);
*
childregs
=
*
regs
;
settls
=
regs
->
r20
;
childregs
->
r0
=
0
;
childregs
->
r19
=
0
;
childregs
->
r20
=
1
;
/* OSF/1 has some strange fork() semantics. */
...
...
@@ -292,14 +293,16 @@ copy_thread(int nr, unsigned long clone_flags, unsigned long usp,
childti
->
pcb
.
flags
=
1
;
/* set FEN, clear everything else */
/* Set a new TLS for the child thread? Peek back into the
syscall arguments that we saved on syscall entry. */
syscall arguments that we saved on syscall entry. Oops,
except we'd have clobbered it with the parent/child set
of r20. Read the saved copy. */
/* Note: if CLONE_SETTLS is not set, then we must inherit the
value from the parent, which will have been set by the block
copy in dup_task_struct. This is non-intuitive, but is
required for proper operation in the case of a threaded
application calling fork. */
if
(
clone_flags
&
CLONE_SETTLS
)
childti
->
pcb
.
unique
=
regs
->
r20
;
childti
->
pcb
.
unique
=
settls
;
return
0
;
}
...
...
drivers/pcmcia/cs.c
View file @
47baacef
...
...
@@ -231,18 +231,6 @@ static const lookup_t service_table[] = {
======================================================================*/
static
int
register_callback
(
struct
pcmcia_socket
*
s
,
void
(
*
handler
)(
void
*
,
unsigned
int
),
void
*
info
)
{
int
error
;
if
(
handler
&&
!
try_module_get
(
s
->
ss_entry
->
owner
))
return
-
ENODEV
;
error
=
s
->
ss_entry
->
register_callback
(
s
,
handler
,
info
);
if
(
!
handler
)
module_put
(
s
->
ss_entry
->
owner
);
return
error
;
}
static
int
get_socket_status
(
struct
pcmcia_socket
*
s
,
int
*
val
)
{
return
s
->
ss_entry
->
get_status
(
s
,
val
);
...
...
@@ -363,6 +351,7 @@ static int pcmcia_add_socket(struct class_device *class_dev)
wait_for_completion
(
&
socket
->
thread_done
);
BUG_ON
(
!
socket
->
thread
);
pcmcia_parse_events
(
socket
,
SS_DETECT
);
return
0
;
}
...
...
@@ -723,6 +712,9 @@ static int socket_insert(struct pcmcia_socket *skt)
{
int
ret
;
if
(
!
try_module_get
(
skt
->
owner
))
return
CS_NO_CARD
;
ret
=
socket_setup
(
skt
,
setup_delay
);
if
(
ret
==
CS_SUCCESS
)
{
#ifdef CONFIG_CARDBUS
...
...
@@ -733,8 +725,10 @@ static int socket_insert(struct pcmcia_socket *skt)
#endif
send_event
(
skt
,
CS_EVENT_CARD_INSERTION
,
CS_EVENT_PRI_LOW
);
skt
->
socket
.
flags
&=
~
SS_DEBOUNCED
;
}
else
}
else
{
socket_shutdown
(
skt
);
module_put
(
skt
->
owner
);
}
return
ret
;
}
...
...
@@ -778,14 +772,55 @@ static int socket_resume(struct pcmcia_socket *skt)
send_event
(
skt
,
CS_EVENT_PM_RESUME
,
CS_EVENT_PRI_LOW
);
}
skt
->
socket
.
flags
&=
~
SS_DEBOUNCED
;
}
else
}
else
{
unsigned
int
old_state
=
skt
->
state
;
socket_shutdown
(
skt
);
if
(
old_state
&
SOCKET_PRESENT
)
module_put
(
skt
->
owner
);
}
skt
->
state
&=
~
SOCKET_SUSPEND
;
return
CS_SUCCESS
;
}
static
void
socket_remove
(
struct
pcmcia_socket
*
skt
)
{
socket_shutdown
(
skt
);
module_put
(
skt
->
owner
);
}
/*
* Process a socket card detect status change.
*
* If we don't have a card already present, delay the detect event for
* about 20ms (to be on the safe side) before reading the socket status.
*
* Some i82365-based systems send multiple SS_DETECT events during card
* insertion, and the "card present" status bit seems to bounce. This
* will probably be true with GPIO-based card detection systems after
* the product has aged.
*/
static
void
socket_detect_change
(
struct
pcmcia_socket
*
skt
)
{
if
(
!
(
skt
->
state
&
SOCKET_SUSPEND
))
{
int
status
;
if
(
!
(
skt
->
state
&
SOCKET_PRESENT
))
{
set_current_state
(
TASK_UNINTERRUPTIBLE
);
schedule_timeout
(
cs_to_timeout
(
2
));
}
get_socket_status
(
skt
,
&
status
);
if
((
skt
->
state
&
SOCKET_PRESENT
)
&&
!
(
status
&
SS_DETECT
))
socket_remove
(
skt
);
if
(
!
(
skt
->
state
&
SOCKET_PRESENT
)
&&
(
status
&
SS_DETECT
))
socket_insert
(
skt
);
}
}
static
int
pccardd
(
void
*
__skt
)
{
struct
pcmcia_socket
*
skt
=
__skt
;
...
...
@@ -809,17 +844,8 @@ static int pccardd(void *__skt)
if
(
events
)
{
down
(
&
skt
->
skt_sem
);
if
(
events
&
SS_DETECT
&&
!
(
skt
->
state
&
SOCKET_SUSPEND
))
{
int
status
;
get_socket_status
(
skt
,
&
status
);
if
((
skt
->
state
&
SOCKET_PRESENT
)
&&
!
(
status
&
SS_DETECT
))
socket_shutdown
(
skt
);
if
(
!
(
skt
->
state
&
SOCKET_PRESENT
)
&&
(
status
&
SS_DETECT
))
socket_insert
(
skt
);
}
if
(
events
&
SS_DETECT
)
socket_detect_change
(
skt
);
if
(
events
&
SS_BATDEAD
)
send_event
(
skt
,
CS_EVENT_BATTERY_DEAD
,
CS_EVENT_PRI_LOW
);
if
(
events
&
SS_BATWARN
)
...
...
@@ -839,21 +865,17 @@ static int pccardd(void *__skt)
}
remove_wait_queue
(
&
skt
->
thread_wait
,
&
wait
);
socket_shutdown
(
skt
);
complete_and_exit
(
&
skt
->
thread_done
,
0
);
}
static
void
parse_events
(
void
*
info
,
u_int
events
)
void
pcmcia_parse_events
(
struct
pcmcia_socket
*
s
,
u_int
events
)
{
struct
pcmcia_socket
*
s
=
info
;
spin_lock
(
&
s
->
thread_lock
);
s
->
thread_events
|=
events
;
spin_unlock
(
&
s
->
thread_lock
);
wake_up
(
&
s
->
thread_wait
);
}
/* parse_events */
}
/* p
cmcia_p
arse_events */
/*======================================================================
...
...
@@ -1114,9 +1136,6 @@ int pcmcia_deregister_client(client_handle_t handle)
handle
->
event_handler
=
NULL
;
}
if
(
--
s
->
real_clients
==
0
)
register_callback
(
s
,
NULL
,
NULL
);
return
CS_SUCCESS
;
}
/* deregister_client */
...
...
@@ -1531,11 +1550,6 @@ int pcmcia_register_client(client_handle_t *handle, client_reg_t *req)
if
(
client
==
NULL
)
return
CS_OUT_OF_RESOURCE
;
if
(
++
s
->
real_clients
==
1
)
{
register_callback
(
s
,
&
parse_events
,
s
);
parse_events
(
s
,
SS_DETECT
);
}
*
handle
=
client
;
client
->
state
&=
~
CLIENT_UNBOUND
;
client
->
Socket
=
s
;
...
...
@@ -2213,7 +2227,7 @@ int pcmcia_eject_card(client_handle_t handle, client_req_t *req)
if
(
ret
!=
0
)
break
;
socket_
shutdown
(
skt
);
socket_
remove
(
skt
);
ret
=
CS_SUCCESS
;
}
while
(
0
);
up
(
&
skt
->
skt_sem
);
...
...
@@ -2504,6 +2518,7 @@ EXPORT_SYMBOL(pcmcia_write_memory);
EXPORT_SYMBOL
(
dead_socket
);
EXPORT_SYMBOL
(
CardServices
);
EXPORT_SYMBOL
(
MTDHelperEntry
);
EXPORT_SYMBOL
(
pcmcia_parse_events
);
struct
class
pcmcia_socket_class
=
{
.
name
=
"pcmcia_socket"
,
...
...
drivers/pcmcia/i82092.c
View file @
47baacef
...
...
@@ -64,10 +64,8 @@ static struct pci_driver i82092aa_pci_drv = {
/* the pccard structure and its functions */
static
struct
pccard_operations
i82092aa_operations
=
{
.
owner
=
THIS_MODULE
,
.
init
=
i82092aa_init
,
.
suspend
=
i82092aa_suspend
,
.
register_callback
=
i82092aa_register_callback
,
.
get_status
=
i82092aa_get_status
,
.
get_socket
=
i82092aa_get_socket
,
.
set_socket
=
i82092aa_set_socket
,
...
...
@@ -85,12 +83,6 @@ struct socket_info {
3 = operational card */
int
io_base
;
/* base io address of the socket */
unsigned
int
pending_events
;
/* Pending events on this interface */
void
(
*
handler
)(
void
*
info
,
u_int
events
);
/* callback to the driver of the card */
void
*
info
;
/* to be passed to the handler */
struct
pcmcia_socket
socket
;
struct
pci_dev
*
dev
;
/* The PCI device for the socket */
};
...
...
@@ -142,6 +134,7 @@ static int __init i82092aa_pci_probe(struct pci_dev *dev, const struct pci_devic
sockets
[
i
].
socket
.
map_size
=
0x1000
;
sockets
[
i
].
socket
.
irq_mask
=
0
;
sockets
[
i
].
socket
.
pci_irq
=
dev
->
irq
;
sockets
[
i
].
socket
.
owner
=
THIS_MODULE
;
sockets
[
i
].
number
=
i
;
...
...
@@ -324,23 +317,6 @@ static int to_cycles(int ns)
/* Interrupt handler functionality */
static
void
i82092aa_bh
(
void
*
dummy
)
{
unsigned
int
events
;
int
i
;
for
(
i
=
0
;
i
<
socket_count
;
i
++
)
{
events
=
xchg
(
&
(
sockets
[
i
].
pending_events
),
0
);
printk
(
"events = %x
\n
"
,
events
);
if
(
sockets
[
i
].
handler
)
sockets
[
i
].
handler
(
sockets
[
i
].
info
,
events
);
}
}
static
DECLARE_WORK
(
i82092aa_task
,
i82092aa_bh
,
NULL
);
static
irqreturn_t
i82092aa_interrupt
(
int
irq
,
void
*
dev
,
struct
pt_regs
*
regs
)
{
int
i
;
...
...
@@ -367,8 +343,7 @@ static irqreturn_t i82092aa_interrupt(int irq, void *dev, struct pt_regs *regs)
csc
=
indirect_read
(
i
,
I365_CSC
);
/* card status change register */
if
((
csc
==
0
)
||
/* no events on this socket */
(
sockets
[
i
].
handler
==
NULL
))
/* no way to handle events */
if
(
csc
==
0
)
/* no events on this socket */
continue
;
handled
=
1
;
events
=
0
;
...
...
@@ -389,8 +364,7 @@ static irqreturn_t i82092aa_interrupt(int irq, void *dev, struct pt_regs *regs)
}
if
(
events
)
{
sockets
[
i
].
pending_events
|=
events
;
schedule_work
(
&
i82092aa_task
);
pcmcia_parse_events
(
&
sockets
[
i
].
socket
,
events
);
}
active
|=
events
;
}
...
...
@@ -475,16 +449,6 @@ static int i82092aa_suspend(struct pcmcia_socket *sock)
return
retval
;
}
static
int
i82092aa_register_callback
(
struct
pcmcia_socket
*
socket
,
void
(
*
handler
)(
void
*
,
unsigned
int
),
void
*
info
)
{
unsigned
int
sock
=
container_of
(
socket
,
struct
socket_info
,
socket
)
->
number
;
enter
(
"i82092aa_register_callback"
);
sockets
[
sock
].
handler
=
handler
;
sockets
[
sock
].
info
=
info
;
leave
(
"i82092aa_register_callback"
);
return
0
;
}
/* i82092aa_register_callback */
static
int
i82092aa_get_status
(
struct
pcmcia_socket
*
socket
,
u_int
*
value
)
{
unsigned
int
sock
=
container_of
(
socket
,
struct
socket_info
,
socket
)
->
number
;
...
...
drivers/pcmcia/i82092aa.h
View file @
47baacef
...
...
@@ -35,7 +35,6 @@ static int i82092aa_set_io_map(struct pcmcia_socket *socket, struct pccard_io_ma
static
int
i82092aa_set_mem_map
(
struct
pcmcia_socket
*
socket
,
struct
pccard_mem_map
*
mem
);
static
int
i82092aa_init
(
struct
pcmcia_socket
*
socket
);
static
int
i82092aa_suspend
(
struct
pcmcia_socket
*
socket
);
static
int
i82092aa_register_callback
(
struct
pcmcia_socket
*
socket
,
void
(
*
handler
)(
void
*
,
unsigned
int
),
void
*
info
);
#endif
drivers/pcmcia/i82365.c
View file @
47baacef
...
...
@@ -164,8 +164,6 @@ struct i82365_socket {
ioaddr_t
ioaddr
;
u_short
psock
;
u_char
cs_irq
,
intr
;
void
(
*
handler
)(
void
*
info
,
u_int
events
);
void
*
info
;
union
{
cirrus_state_t
cirrus
;
vg46x_state_t
vg46x
;
...
...
@@ -863,35 +861,6 @@ static void __init isa_probe(void)
/*====================================================================*/
static
u_int
pending_events
[
8
];
static
spinlock_t
pending_event_lock
=
SPIN_LOCK_UNLOCKED
;
static
void
pcic_bh
(
void
*
dummy
)
{
u_int
events
;
int
i
;
for
(
i
=
0
;
i
<
sockets
;
i
++
)
{
spin_lock_irq
(
&
pending_event_lock
);
events
=
pending_events
[
i
];
pending_events
[
i
]
=
0
;
spin_unlock_irq
(
&
pending_event_lock
);
/*
SS_DETECT events need a small delay here. The reason for this is that
the "is there a card" electronics need time to see the card after the
"we have a card coming in" electronics have seen it.
*/
if
(
events
&
SS_DETECT
)
mdelay
(
4
);
if
(
socket
[
i
].
handler
)
socket
[
i
].
handler
(
socket
[
i
].
info
,
events
);
}
}
static
DECLARE_WORK
(
pcic_task
,
pcic_bh
,
NULL
);
static
unsigned
long
last_detect_jiffies
;
static
irqreturn_t
pcic_interrupt
(
int
irq
,
void
*
dev
,
struct
pt_regs
*
regs
)
{
...
...
@@ -911,26 +880,12 @@ static irqreturn_t pcic_interrupt(int irq, void *dev,
handled
=
1
;
ISA_LOCK
(
i
,
flags
);
csc
=
i365_get
(
i
,
I365_CSC
);
if
((
csc
==
0
)
||
(
!
socket
[
i
].
handler
)
||
(
i365_get
(
i
,
I365_IDENT
)
&
0x70
))
{
if
((
csc
==
0
)
||
(
i365_get
(
i
,
I365_IDENT
)
&
0x70
))
{
ISA_UNLOCK
(
i
,
flags
);
continue
;
}
events
=
(
csc
&
I365_CSC_DETECT
)
?
SS_DETECT
:
0
;
/* Several sockets will send multiple "new card detected"
events in rapid succession. However, the rest of the pcmcia expects
only one such event. We just ignore these events by having a
timeout */
if
(
events
)
{
if
((
jiffies
-
last_detect_jiffies
)
<
(
HZ
/
20
))
events
=
0
;
last_detect_jiffies
=
jiffies
;
}
if
(
i365_get
(
i
,
I365_INTCTL
)
&
I365_PC_IOCARD
)
events
|=
(
csc
&
I365_CSC_STSCHG
)
?
SS_STSCHG
:
0
;
else
{
...
...
@@ -941,12 +896,9 @@ static irqreturn_t pcic_interrupt(int irq, void *dev,
ISA_UNLOCK
(
i
,
flags
);
DEBUG
(
2
,
"i82365: socket %d event 0x%02x
\n
"
,
i
,
events
);
if
(
events
)
{
spin_lock
(
&
pending_event_lock
);
pending_events
[
i
]
|=
events
;
spin_unlock
(
&
pending_event_lock
);
schedule_work
(
&
pcic_task
);
}
if
(
events
)
pcmcia_parse_events
(
&
socket
[
i
].
socket
,
events
);
active
|=
events
;
}
if
(
!
active
)
break
;
...
...
@@ -968,16 +920,6 @@ static void pcic_interrupt_wrapper(u_long data)
/*====================================================================*/
static
int
pcic_register_callback
(
struct
pcmcia_socket
*
s
,
void
(
*
handler
)(
void
*
,
unsigned
int
),
void
*
info
)
{
unsigned
int
sock
=
container_of
(
s
,
struct
i82365_socket
,
socket
)
->
number
;
socket
[
sock
].
handler
=
handler
;
socket
[
sock
].
info
=
info
;
return
0
;
}
/* pcic_register_callback */
/*====================================================================*/
static
int
i365_get_status
(
u_short
sock
,
u_int
*
value
)
{
u_int
status
;
...
...
@@ -1400,10 +1342,8 @@ static int pcic_suspend(struct pcmcia_socket *sock)
}
static
struct
pccard_operations
pcic_operations
=
{
.
owner
=
THIS_MODULE
,
.
init
=
pcic_init
,
.
suspend
=
pcic_suspend
,
.
register_callback
=
pcic_register_callback
,
.
get_status
=
pcic_get_status
,
.
get_socket
=
pcic_get_socket
,
.
set_socket
=
pcic_set_socket
,
...
...
@@ -1464,6 +1404,7 @@ static int __init init_i82365(void)
for
(
i
=
0
;
i
<
sockets
;
i
++
)
{
socket
[
i
].
socket
.
dev
.
dev
=
&
i82365_device
.
dev
;
socket
[
i
].
socket
.
ss_entry
=
&
pcic_operations
;
socket
[
i
].
socket
.
owner
=
THIS_MODULE
;
socket
[
i
].
number
=
i
;
ret
=
pcmcia_register_socket
(
&
socket
[
i
].
socket
);
if
(
ret
&&
i
--
)
{
...
...
drivers/pcmcia/sa11xx_core.c
View file @
47baacef
...
...
@@ -38,15 +38,13 @@
#include <linux/init.h>
#include <linux/config.h>
#include <linux/cpufreq.h>
#include <linux/delay.h>
#include <linux/ioport.h>
#include <linux/kernel.h>
#include <linux/workqueue.h>
#include <linux/timer.h>
#include <linux/mm.h>
#include <linux/notifier.h>
#include <linux/version.h>
#include <linux/interrupt.h>
#include <linux/spinlock.h>
#include <asm/hardware.h>
#include <asm/io.h>
...
...
@@ -263,29 +261,27 @@ static int sa1100_pcmcia_suspend(struct pcmcia_socket *sock)
return
ret
;
}
static
spinlock_t
status_lock
=
SPIN_LOCK_UNLOCKED
;
/* sa1100_pcmcia_task_handler()
* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
* Processes serviceable socket events using the "eventd" thread context.
*
* Event processing (specifically, the invocation of the Card Services event
* callback) occurs in this thread rather than in the actual interrupt
* handler due to the use of scheduling operations in the PCMCIA core.
/* sa1100_check_status()
* ^^^^^^^^^^^^^^^^^^^^^
*/
static
void
sa1100_
pcmcia_task_handler
(
void
*
data
)
static
void
sa1100_
check_status
(
struct
sa1100_pcmcia_socket
*
skt
)
{
struct
sa1100_pcmcia_socket
*
skt
=
data
;
unsigned
int
events
;
DEBUG
(
4
,
"%s(): entering PCMCIA monitoring thread
\n
"
,
__FUNCTION__
);
do
{
unsigned
int
status
;
unsigned
long
flags
;
status
=
sa1100_pcmcia_skt_state
(
skt
);
spin_lock_irqsave
(
&
status_lock
,
flags
);
events
=
(
status
^
skt
->
status
)
&
skt
->
cs_state
.
csc_mask
;
skt
->
status
=
status
;
spin_unlock_irqrestore
(
&
status_lock
,
flags
);
DEBUG
(
2
,
"events: %s%s%s%s%s%s
\n
"
,
events
==
0
?
"<NONE>"
:
""
,
...
...
@@ -295,8 +291,8 @@ static void sa1100_pcmcia_task_handler(void *data)
events
&
SS_BATWARN
?
"BATWARN "
:
""
,
events
&
SS_STSCHG
?
"STSCHG "
:
""
);
if
(
events
&&
skt
->
handler
!=
NULL
)
skt
->
handler
(
skt
->
handler_info
,
events
);
if
(
events
)
pcmcia_parse_events
(
&
skt
->
socket
,
events
);
}
while
(
events
);
}
...
...
@@ -311,7 +307,7 @@ static void sa1100_pcmcia_poll_event(unsigned long dummy)
mod_timer
(
&
skt
->
poll_timer
,
jiffies
+
SA1100_PCMCIA_POLL_PERIOD
);
s
chedule_work
(
&
skt
->
work
);
s
a1100_check_status
(
skt
);
}
...
...
@@ -330,44 +326,11 @@ static irqreturn_t sa1100_pcmcia_interrupt(int irq, void *dev, struct pt_regs *r
DEBUG
(
3
,
"%s(): servicing IRQ %d
\n
"
,
__FUNCTION__
,
irq
);
s
chedule_work
(
&
skt
->
work
);
s
a1100_check_status
(
skt
);
return
IRQ_HANDLED
;
}
/* sa1100_pcmcia_register_callback()
* ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
* Implements the register_callback() operation for the in-kernel
* PCMCIA service (formerly SS_RegisterCallback in Card Services). If
* the function pointer `handler' is not NULL, remember the callback
* location in the state for `sock', and increment the usage counter
* for the driver module. (The callback is invoked from the interrupt
* service routine, sa1100_pcmcia_interrupt(), to notify Card Services
* of interesting events.) Otherwise, clear the callback pointer in the
* socket state and decrement the module usage count.
*
* Returns: 0
*/
static
int
sa1100_pcmcia_register_callback
(
struct
pcmcia_socket
*
sock
,
void
(
*
handler
)(
void
*
,
unsigned
int
),
void
*
info
)
{
struct
sa1100_pcmcia_socket
*
skt
=
to_sa1100_socket
(
sock
);
if
(
handler
)
{
if
(
!
try_module_get
(
skt
->
ops
->
owner
))
return
-
ENODEV
;
skt
->
handler_info
=
info
;
skt
->
handler
=
handler
;
}
else
{
skt
->
handler
=
NULL
;
module_put
(
skt
->
ops
->
owner
);
}
return
0
;
}
/* sa1100_pcmcia_get_status()
* ^^^^^^^^^^^^^^^^^^^^^^^^^^
...
...
@@ -655,10 +618,8 @@ static CLASS_DEVICE_ATTR(status, S_IRUGO, show_status, NULL);
static
struct
pccard_operations
sa11xx_pcmcia_operations
=
{
.
owner
=
THIS_MODULE
,
.
init
=
sa1100_pcmcia_sock_init
,
.
suspend
=
sa1100_pcmcia_suspend
,
.
register_callback
=
sa1100_pcmcia_register_callback
,
.
get_status
=
sa1100_pcmcia_get_status
,
.
get_socket
=
sa1100_pcmcia_get_socket
,
.
set_socket
=
sa1100_pcmcia_set_socket
,
...
...
@@ -765,10 +726,9 @@ int sa11xx_drv_pcmcia_probe(struct device *dev, struct pcmcia_low_level *ops, in
memset
(
skt
,
0
,
sizeof
(
*
skt
));
skt
->
socket
.
ss_entry
=
&
sa11xx_pcmcia_operations
;
skt
->
socket
.
owner
=
ops
->
owner
;
skt
->
socket
.
dev
.
dev
=
dev
;
INIT_WORK
(
&
skt
->
work
,
sa1100_pcmcia_task_handler
,
skt
);
init_timer
(
&
skt
->
poll_timer
);
skt
->
poll_timer
.
function
=
sa1100_pcmcia_poll_event
;
skt
->
poll_timer
.
data
=
(
unsigned
long
)
skt
;
...
...
drivers/pcmcia/sa11xx_core.h
View file @
47baacef
...
...
@@ -59,8 +59,6 @@ struct sa1100_pcmcia_socket {
unsigned
int
status
;
socket_state_t
cs_state
;
void
(
*
handler
)(
void
*
,
unsigned
int
);
void
*
handler_info
;
unsigned
short
spd_io
[
MAX_IO_WIN
];
unsigned
short
spd_mem
[
MAX_WIN
];
...
...
@@ -75,7 +73,6 @@ struct sa1100_pcmcia_socket {
unsigned
int
irq_state
;
struct
timer_list
poll_timer
;
struct
work_struct
work
;
};
struct
pcmcia_low_level
{
...
...
drivers/pcmcia/tcic.c
View file @
47baacef
...
...
@@ -116,8 +116,6 @@ static struct pccard_operations tcic_operations;
struct
tcic_socket
{
u_short
psock
;
void
(
*
handler
)(
void
*
info
,
u_int
events
);
void
*
info
;
u_char
last_sstat
;
u_char
id
;
struct
pcmcia_socket
socket
;
...
...
@@ -433,10 +431,9 @@ static int __init init_tcic(void)
for
(
i
=
0
;
i
<
sock
;
i
++
)
{
if
((
i
==
ignore
)
||
is_active
(
i
))
continue
;
socket_table
[
sockets
].
psock
=
i
;
socket_table
[
sockets
].
handler
=
NULL
;
socket_table
[
sockets
].
info
=
NULL
;
socket_table
[
sockets
].
id
=
get_tcic_id
();
socket_table
[
sockets
].
socket
.
owner
=
THIS_MODULE
;
/* only 16-bit cards, memory windows must be size-aligned */
/* No PCI or CardBus support */
socket_table
[
sockets
].
socket
.
features
=
SS_CAP_PCCARD
|
SS_CAP_MEM_ALIGN
;
...
...
@@ -558,26 +555,6 @@ static void __exit exit_tcic(void)
/*====================================================================*/
static
u_int
pending_events
[
2
];
static
spinlock_t
pending_event_lock
=
SPIN_LOCK_UNLOCKED
;
static
void
tcic_bh
(
void
*
dummy
)
{
u_int
events
;
int
i
;
for
(
i
=
0
;
i
<
sockets
;
i
++
)
{
spin_lock_irq
(
&
pending_event_lock
);
events
=
pending_events
[
i
];
pending_events
[
i
]
=
0
;
spin_unlock_irq
(
&
pending_event_lock
);
if
(
socket_table
[
i
].
handler
)
socket_table
[
i
].
handler
(
socket_table
[
i
].
info
,
events
);
}
}
static
DECLARE_WORK
(
tcic_task
,
tcic_bh
,
NULL
);
static
irqreturn_t
tcic_interrupt
(
int
irq
,
void
*
dev
,
struct
pt_regs
*
regs
)
{
int
i
,
quick
=
0
;
...
...
@@ -605,7 +582,7 @@ static irqreturn_t tcic_interrupt(int irq, void *dev, struct pt_regs *regs)
tcic_setb
(
TCIC_ICSR
,
TCIC_ICSR_CLEAR
);
quick
=
1
;
}
if
(
(
latch
==
0
)
||
(
socket_table
[
psock
].
handler
==
NULL
)
)
if
(
latch
==
0
)
continue
;
events
=
(
latch
&
TCIC_SSTAT_CD
)
?
SS_DETECT
:
0
;
events
|=
(
latch
&
TCIC_SSTAT_WP
)
?
SS_WRPROT
:
0
;
...
...
@@ -617,10 +594,7 @@ static irqreturn_t tcic_interrupt(int irq, void *dev, struct pt_regs *regs)
events
|=
(
latch
&
TCIC_SSTAT_LBAT2
)
?
SS_BATWARN
:
0
;
}
if
(
events
)
{
spin_lock
(
&
pending_event_lock
);
pending_events
[
i
]
|=
events
;
spin_unlock
(
&
pending_event_lock
);
schedule_work
(
&
tcic_task
);
pcmcia_parse_events
(
&
socket_table
[
i
].
socket
,
events
);
}
}
...
...
@@ -645,16 +619,6 @@ static void tcic_timer(u_long data)
/*====================================================================*/
static
int
tcic_register_callback
(
struct
pcmcia_socket
*
sock
,
void
(
*
handler
)(
void
*
,
unsigned
int
),
void
*
info
)
{
u_short
psock
=
container_of
(
sock
,
struct
tcic_socket
,
socket
)
->
psock
;
socket_table
[
psock
].
handler
=
handler
;
socket_table
[
psock
].
info
=
info
;
return
0
;
}
/* tcic_register_callback */
/*====================================================================*/
static
int
tcic_get_status
(
struct
pcmcia_socket
*
sock
,
u_int
*
value
)
{
u_short
psock
=
container_of
(
sock
,
struct
tcic_socket
,
socket
)
->
psock
;
...
...
@@ -915,10 +879,8 @@ static int tcic_suspend(struct pcmcia_socket *sock)
}
static
struct
pccard_operations
tcic_operations
=
{
.
owner
=
THIS_MODULE
,
.
init
=
tcic_init
,
.
suspend
=
tcic_suspend
,
.
register_callback
=
tcic_register_callback
,
.
get_status
=
tcic_get_status
,
.
get_socket
=
tcic_get_socket
,
.
set_socket
=
tcic_set_socket
,
...
...
drivers/pcmcia/yenta_socket.c
View file @
47baacef
...
...
@@ -250,7 +250,6 @@ static int yenta_set_socket(struct pcmcia_socket *sock, socket_state_t *state)
if
(
state
->
flags
&
SS_DEBOUNCED
)
{
/* The insertion debounce period has ended. Clear any pending insertion events */
socket
->
events
&=
~
SS_DETECT
;
state
->
flags
&=
~
SS_DEBOUNCED
;
/* SS_DEBOUNCED is oneshot */
}
yenta_set_power
(
socket
,
state
);
...
...
@@ -420,19 +419,6 @@ static unsigned int yenta_events(struct yenta_socket *socket)
}
static
void
yenta_bh
(
void
*
data
)
{
struct
yenta_socket
*
socket
=
data
;
unsigned
int
events
;
spin_lock_irq
(
&
socket
->
event_lock
);
events
=
socket
->
events
;
socket
->
events
=
0
;
spin_unlock_irq
(
&
socket
->
event_lock
);
if
(
socket
->
handler
)
socket
->
handler
(
socket
->
info
,
events
);
}
static
irqreturn_t
yenta_interrupt
(
int
irq
,
void
*
dev_id
,
struct
pt_regs
*
regs
)
{
unsigned
int
events
;
...
...
@@ -440,10 +426,7 @@ static irqreturn_t yenta_interrupt(int irq, void *dev_id, struct pt_regs *regs)
events
=
yenta_events
(
socket
);
if
(
events
)
{
spin_lock
(
&
socket
->
event_lock
);
socket
->
events
|=
events
;
spin_unlock
(
&
socket
->
event_lock
);
schedule_work
(
&
socket
->
tq_task
);
pcmcia_parse_events
(
&
socket
->
socket
,
events
);
return
IRQ_HANDLED
;
}
return
IRQ_NONE
;
...
...
@@ -771,21 +754,9 @@ static void yenta_close(struct pci_dev *dev)
}
static
int
yenta_register_callback
(
struct
pcmcia_socket
*
sock
,
void
(
*
handler
)(
void
*
,
unsigned
int
),
void
*
info
)
{
struct
yenta_socket
*
socket
=
container_of
(
sock
,
struct
yenta_socket
,
socket
);
socket
->
handler
=
handler
;
socket
->
info
=
info
;
return
0
;
}
static
struct
pccard_operations
yenta_socket_operations
=
{
.
owner
=
THIS_MODULE
,
.
init
=
yenta_init
,
.
suspend
=
yenta_suspend
,
.
register_callback
=
yenta_register_callback
,
.
get_status
=
yenta_get_status
,
.
get_socket
=
yenta_get_socket
,
.
set_socket
=
yenta_set_socket
,
...
...
@@ -860,11 +831,11 @@ static int __devinit yenta_probe (struct pci_dev *dev, const struct pci_device_i
socket
->
socket
.
ss_entry
=
&
yenta_socket_operations
;
socket
->
socket
.
dev
.
dev
=
&
dev
->
dev
;
socket
->
socket
.
driver_data
=
socket
;
socket
->
socket
.
owner
=
THIS_MODULE
;
/* prepare struct yenta_socket */
socket
->
dev
=
dev
;
pci_set_drvdata
(
dev
,
socket
);
spin_lock_init
(
&
socket
->
event_lock
);
/*
* Do some basic sanity checking..
...
...
@@ -907,8 +878,6 @@ static int __devinit yenta_probe (struct pci_dev *dev, const struct pci_device_i
/* We must finish initialization here */
INIT_WORK
(
&
socket
->
tq_task
,
yenta_bh
,
socket
);
if
(
!
socket
->
cb_irq
||
request_irq
(
socket
->
cb_irq
,
yenta_interrupt
,
SA_SHIRQ
,
socket
->
dev
->
dev
.
name
,
socket
))
{
/* No IRQ or request_irq failed. Poll */
socket
->
cb_irq
=
0
;
/* But zero is a valid IRQ number. */
...
...
drivers/pcmcia/yenta_socket.h
View file @
47baacef
...
...
@@ -99,11 +99,6 @@ struct yenta_socket {
struct
pci_dev
*
dev
;
int
cb_irq
,
io_irq
;
void
*
base
;
void
(
*
handler
)(
void
*
,
unsigned
int
);
void
*
info
;
spinlock_t
event_lock
;
unsigned
int
events
;
struct
work_struct
tq_task
;
struct
timer_list
poll_timer
;
struct
pcmcia_socket
socket
;
...
...
include/pcmcia/ss.h
View file @
47baacef
...
...
@@ -119,7 +119,6 @@ typedef struct cb_bridge_map {
struct
pcmcia_socket
;
struct
pccard_operations
{
struct
module
*
owner
;
int
(
*
init
)(
struct
pcmcia_socket
*
sock
);
int
(
*
suspend
)(
struct
pcmcia_socket
*
sock
);
int
(
*
register_callback
)(
struct
pcmcia_socket
*
sock
,
void
(
*
handler
)(
void
*
,
unsigned
int
),
void
*
info
);
...
...
@@ -169,6 +168,7 @@ struct config_t;
struct
region_t
;
struct
pcmcia_socket
{
struct
module
*
owner
;
spinlock_t
lock
;
struct
pccard_operations
*
ss_entry
;
socket_state_t
socket
;
...
...
@@ -235,6 +235,7 @@ struct pcmcia_socket * pcmcia_get_socket_by_nr(unsigned int nr);
extern
void
pcmcia_parse_events
(
struct
pcmcia_socket
*
socket
,
unsigned
int
events
);
extern
int
pcmcia_register_socket
(
struct
pcmcia_socket
*
socket
);
extern
void
pcmcia_unregister_socket
(
struct
pcmcia_socket
*
socket
);
...
...
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