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
Kirill Smelkov
linux
Commits
507e658a
Commit
507e658a
authored
Jul 10, 2004
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://bk.arm.linux.org.uk/linux-2.6-pcmcia
into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents
de05cbbb
b55cdbfa
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
192 additions
and
15 deletions
+192
-15
drivers/pcmcia/Makefile
drivers/pcmcia/Makefile
+1
-1
drivers/pcmcia/cs.c
drivers/pcmcia/cs.c
+24
-12
drivers/pcmcia/cs_internal.h
drivers/pcmcia/cs_internal.h
+4
-0
drivers/pcmcia/ds.c
drivers/pcmcia/ds.c
+2
-2
drivers/pcmcia/socket_sysfs.c
drivers/pcmcia/socket_sysfs.c
+161
-0
No files found.
drivers/pcmcia/Makefile
View file @
507e658a
...
...
@@ -18,7 +18,7 @@ obj-$(CONFIG_PCMCIA_SA1100) += sa11xx_core.o sa1100_cs.o
obj-$(CONFIG_PCMCIA_SA1111)
+=
sa11xx_core.o sa1111_cs.o
obj-$(CONFIG_PCMCIA_PXA2XX)
+=
pxa2xx_core.o pxa2xx_cs.o
pcmcia_core-y
+=
cistpl.o rsrc_mgr.o bulkmem.o cs.o
pcmcia_core-y
+=
cistpl.o rsrc_mgr.o bulkmem.o cs.o
socket_sysfs.o
pcmcia_core-$(CONFIG_CARDBUS)
+=
cardbus.o
sa11xx_core-y
+=
soc_common.o sa11xx_base.o
...
...
drivers/pcmcia/cs.c
View file @
507e658a
...
...
@@ -264,7 +264,10 @@ int pcmcia_register_socket(struct pcmcia_socket *socket)
goto
err
;
wait_for_completion
(
&
socket
->
thread_done
);
BUG_ON
(
!
socket
->
thread
);
if
(
!
socket
->
thread
)
{
printk
(
KERN_WARNING
"PCMCIA: warning: socket thread for socket %p did not start
\n
"
,
socket
);
return
-
EIO
;
}
pcmcia_parse_events
(
socket
,
SS_DETECT
);
return
0
;
...
...
@@ -678,9 +681,8 @@ static int pccardd(void *__skt)
int
ret
;
daemonize
(
"pccardd"
);
skt
->
thread
=
current
;
complete
(
&
skt
->
thread_done
);
skt
->
thread
=
current
;
skt
->
socket
=
dead_socket
;
skt
->
ops
->
init
(
skt
);
skt
->
ops
->
set_socket
(
skt
,
&
skt
->
socket
);
...
...
@@ -690,7 +692,10 @@ static int pccardd(void *__skt)
if
(
ret
)
{
printk
(
KERN_WARNING
"PCMCIA: unable to register socket 0x%p
\n
"
,
skt
);
skt
->
thread
=
NULL
;
complete_and_exit
(
&
skt
->
thread_done
,
0
);
}
complete
(
&
skt
->
thread_done
);
add_wait_queue
(
&
skt
->
thread_wait
,
&
wait
);
for
(;;)
{
...
...
@@ -2031,16 +2036,18 @@ int pcmcia_eject_card(struct pcmcia_socket *skt)
down
(
&
skt
->
skt_sem
);
do
{
if
(
!
(
skt
->
state
&
SOCKET_PRESENT
))
{
ret
=
CS_NO_CARD
;
ret
=
-
ENODEV
;
break
;
}
ret
=
send_event
(
skt
,
CS_EVENT_EJECTION_REQUEST
,
CS_EVENT_PRI_LOW
);
if
(
ret
!=
0
)
if
(
ret
!=
0
)
{
ret
=
-
EINVAL
;
break
;
}
socket_remove
(
skt
);
ret
=
CS_SUCCESS
;
ret
=
0
;
}
while
(
0
);
up
(
&
skt
->
skt_sem
);
...
...
@@ -2056,14 +2063,14 @@ int pcmcia_insert_card(struct pcmcia_socket *skt)
down
(
&
skt
->
skt_sem
);
do
{
if
(
skt
->
state
&
SOCKET_PRESENT
)
{
ret
=
CS_IN_USE
;
ret
=
-
EBUSY
;
break
;
}
if
(
socket_insert
(
skt
)
==
CS_NO_CARD
)
{
ret
=
CS_NO_CARD
;
ret
=
-
ENODEV
;
break
;
}
ret
=
CS_SUCCESS
;
ret
=
0
;
}
while
(
0
);
up
(
&
skt
->
skt_sem
);
...
...
@@ -2161,16 +2168,21 @@ EXPORT_SYMBOL(pcmcia_socket_class);
static
int
__init
init_pcmcia_cs
(
void
)
{
printk
(
KERN_INFO
"%s
\n
"
,
release
);
printk
(
KERN_INFO
" %s
\n
"
,
options
);
int
ret
;
printk
(
KERN_INFO
"%s
\n
"
,
release
);
printk
(
KERN_INFO
" %s
\n
"
,
options
);
return
class_register
(
&
pcmcia_socket_class
);
ret
=
class_register
(
&
pcmcia_socket_class
);
if
(
ret
)
return
(
ret
);
return
class_interface_register
(
&
pccard_sysfs_interface
);
}
static
void
__exit
exit_pcmcia_cs
(
void
)
{
printk
(
KERN_INFO
"unloading Kernel Card Services
\n
"
);
release_resource_db
();
class_interface_unregister
(
&
pccard_sysfs_interface
);
class_unregister
(
&
pcmcia_socket_class
);
}
...
...
drivers/pcmcia/cs_internal.h
View file @
507e658a
...
...
@@ -192,6 +192,10 @@ void undo_irq(u_int Attributes, int irq);
int
adjust_resource_info
(
client_handle_t
handle
,
adjust_t
*
adj
);
void
release_resource_db
(
void
);
/* In socket_sysfs.c */
extern
struct
class_interface
pccard_sysfs_interface
;
/* In cs.c */
extern
struct
rw_semaphore
pcmcia_socket_list_rwsem
;
extern
struct
list_head
pcmcia_socket_list
;
...
...
drivers/pcmcia/ds.c
View file @
507e658a
...
...
@@ -973,10 +973,10 @@ static int ds_ioctl(struct inode * inode, struct file * file,
ret
=
pcmcia_resume_card
(
s
->
parent
);
break
;
case
DS_EJECT_CARD
:
ret
=
pcmcia_eject_card
(
s
->
parent
);
err
=
pcmcia_eject_card
(
s
->
parent
);
break
;
case
DS_INSERT_CARD
:
ret
=
pcmcia_insert_card
(
s
->
parent
);
err
=
pcmcia_insert_card
(
s
->
parent
);
break
;
case
DS_ACCESS_CONFIGURATION_REGISTER
:
if
((
buf
.
conf_reg
.
Action
==
CS_WRITE
)
&&
!
capable
(
CAP_SYS_ADMIN
))
...
...
drivers/pcmcia/socket_sysfs.c
0 → 100644
View file @
507e658a
/*
* socket_sysfs.c -- most of socket-related sysfs output
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* (C) 2003 - 2004 Dominik Brodowski
*/
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/config.h>
#include <linux/string.h>
#include <linux/major.h>
#include <linux/errno.h>
#include <linux/slab.h>
#include <linux/mm.h>
#include <linux/interrupt.h>
#include <linux/timer.h>
#include <linux/ioport.h>
#include <linux/delay.h>
#include <linux/pm.h>
#include <linux/pci.h>
#include <linux/device.h>
#include <linux/suspend.h>
#include <asm/system.h>
#include <asm/irq.h>
#define IN_CARD_SERVICES
#include <pcmcia/version.h>
#include <pcmcia/cs_types.h>
#include <pcmcia/ss.h>
#include <pcmcia/cs.h>
#include <pcmcia/bulkmem.h>
#include <pcmcia/cistpl.h>
#include <pcmcia/cisreg.h>
#include <pcmcia/ds.h>
#include "cs_internal.h"
#define to_socket(_dev) container_of(_dev, struct pcmcia_socket, dev)
static
ssize_t
pccard_show_type
(
struct
class_device
*
dev
,
char
*
buf
)
{
int
val
;
struct
pcmcia_socket
*
s
=
to_socket
(
dev
);
if
(
!
(
s
->
state
&
SOCKET_PRESENT
))
return
-
ENODEV
;
s
->
ops
->
get_status
(
s
,
&
val
);
if
(
val
&
SS_CARDBUS
)
return
sprintf
(
buf
,
"32-bit
\n
"
);
if
(
val
&
SS_DETECT
)
return
sprintf
(
buf
,
"16-bit
\n
"
);
return
sprintf
(
buf
,
"invalid
\n
"
);
}
static
CLASS_DEVICE_ATTR
(
card_type
,
0400
,
pccard_show_type
,
NULL
);
static
ssize_t
pccard_show_voltage
(
struct
class_device
*
dev
,
char
*
buf
)
{
int
val
;
struct
pcmcia_socket
*
s
=
to_socket
(
dev
);
if
(
!
(
s
->
state
&
SOCKET_PRESENT
))
return
-
ENODEV
;
s
->
ops
->
get_status
(
s
,
&
val
);
if
(
val
&
SS_3VCARD
)
return
sprintf
(
buf
,
"3.3V
\n
"
);
if
(
val
&
SS_XVCARD
)
return
sprintf
(
buf
,
"X.XV
\n
"
);
return
sprintf
(
buf
,
"5.0V
\n
"
);
}
static
CLASS_DEVICE_ATTR
(
card_voltage
,
0400
,
pccard_show_voltage
,
NULL
);
static
ssize_t
pccard_show_vpp
(
struct
class_device
*
dev
,
char
*
buf
)
{
struct
pcmcia_socket
*
s
=
to_socket
(
dev
);
if
(
!
(
s
->
state
&
SOCKET_PRESENT
))
return
-
ENODEV
;
return
sprintf
(
buf
,
"%d.%dV
\n
"
,
s
->
socket
.
Vpp
/
10
,
s
->
socket
.
Vpp
%
10
);
}
static
CLASS_DEVICE_ATTR
(
card_vpp
,
0400
,
pccard_show_vpp
,
NULL
);
static
ssize_t
pccard_show_vcc
(
struct
class_device
*
dev
,
char
*
buf
)
{
struct
pcmcia_socket
*
s
=
to_socket
(
dev
);
if
(
!
(
s
->
state
&
SOCKET_PRESENT
))
return
-
ENODEV
;
return
sprintf
(
buf
,
"%d.%dV
\n
"
,
s
->
socket
.
Vcc
/
10
,
s
->
socket
.
Vcc
%
10
);
}
static
CLASS_DEVICE_ATTR
(
card_vcc
,
0400
,
pccard_show_vcc
,
NULL
);
static
ssize_t
pccard_store_insert
(
struct
class_device
*
dev
,
const
char
*
buf
,
size_t
count
)
{
ssize_t
ret
;
struct
pcmcia_socket
*
s
=
to_socket
(
dev
);
if
(
!
count
)
return
-
EINVAL
;
ret
=
pcmcia_insert_card
(
s
);
return
ret
?
ret
:
count
;
}
static
CLASS_DEVICE_ATTR
(
card_insert
,
0200
,
NULL
,
pccard_store_insert
);
static
ssize_t
pccard_store_eject
(
struct
class_device
*
dev
,
const
char
*
buf
,
size_t
count
)
{
ssize_t
ret
;
struct
pcmcia_socket
*
s
=
to_socket
(
dev
);
if
(
!
count
)
return
-
EINVAL
;
ret
=
pcmcia_eject_card
(
s
);
return
ret
?
ret
:
count
;
}
static
CLASS_DEVICE_ATTR
(
card_eject
,
0200
,
NULL
,
pccard_store_eject
);
static
struct
class_device_attribute
*
pccard_socket_attributes
[]
=
{
&
class_device_attr_card_type
,
&
class_device_attr_card_voltage
,
&
class_device_attr_card_vpp
,
&
class_device_attr_card_vcc
,
&
class_device_attr_card_insert
,
&
class_device_attr_card_eject
,
NULL
,
};
static
int
__devinit
pccard_sysfs_add_socket
(
struct
class_device
*
class_dev
)
{
struct
class_device_attribute
**
attr
;
int
ret
=
0
;
for
(
attr
=
pccard_socket_attributes
;
*
attr
;
attr
++
)
{
ret
=
class_device_create_file
(
class_dev
,
*
attr
);
if
(
ret
)
break
;
}
return
ret
;
}
static
void
__devexit
pccard_sysfs_remove_socket
(
struct
class_device
*
class_dev
)
{
struct
class_device_attribute
**
attr
;
for
(
attr
=
pccard_socket_attributes
;
*
attr
;
attr
++
)
class_device_remove_file
(
class_dev
,
*
attr
);
}
struct
class_interface
pccard_sysfs_interface
=
{
.
class
=
&
pcmcia_socket_class
,
.
add
=
&
pccard_sysfs_add_socket
,
.
remove
=
__devexit_p
(
&
pccard_sysfs_remove_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