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
d27ba47e
Commit
d27ba47e
authored
Nov 07, 2005
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6
parents
e3d8b77b
dd3e2dcf
Changes
32
Hide whitespace changes
Inline
Side-by-side
Showing
32 changed files
with
673 additions
and
1569 deletions
+673
-1569
Documentation/ioctl-number.txt
Documentation/ioctl-number.txt
+0
-2
arch/sparc/Kconfig
arch/sparc/Kconfig
+8
-0
arch/sparc/kernel/Makefile
arch/sparc/kernel/Makefile
+1
-0
arch/sparc/kernel/led.c
arch/sparc/kernel/led.c
+139
-0
arch/sparc/kernel/sunos_ioctl.c
arch/sparc/kernel/sunos_ioctl.c
+0
-1
arch/sparc64/kernel/ioctl32.c
arch/sparc64/kernel/ioctl32.c
+0
-459
arch/sparc64/kernel/setup.c
arch/sparc64/kernel/setup.c
+8
-4
arch/sparc64/kernel/signal32.c
arch/sparc64/kernel/signal32.c
+4
-2
arch/sparc64/kernel/smp.c
arch/sparc64/kernel/smp.c
+22
-57
arch/sparc64/kernel/sunos_ioctl32.c
arch/sparc64/kernel/sunos_ioctl32.c
+0
-1
arch/sparc64/kernel/time.c
arch/sparc64/kernel/time.c
+2
-11
drivers/sbus/char/cpwatchdog.c
drivers/sbus/char/cpwatchdog.c
+24
-0
drivers/sbus/char/display7seg.c
drivers/sbus/char/display7seg.c
+20
-12
drivers/sbus/char/envctrl.c
drivers/sbus/char/envctrl.c
+10
-8
drivers/sbus/char/openprom.c
drivers/sbus/char/openprom.c
+33
-0
drivers/serial/sunsu.c
drivers/serial/sunsu.c
+1
-1
drivers/video/cg6.c
drivers/video/cg6.c
+0
-6
include/asm-m68k/kbio.h
include/asm-m68k/kbio.h
+0
-1
include/asm-m68k/vuid_event.h
include/asm-m68k/vuid_event.h
+0
-4
include/asm-sparc/audioio.h
include/asm-sparc/audioio.h
+0
-234
include/asm-sparc/kbio.h
include/asm-sparc/kbio.h
+0
-56
include/asm-sparc/termios.h
include/asm-sparc/termios.h
+0
-9
include/asm-sparc/vuid_event.h
include/asm-sparc/vuid_event.h
+0
-41
include/asm-sparc64/audioio.h
include/asm-sparc64/audioio.h
+0
-234
include/asm-sparc64/ebus.h
include/asm-sparc64/ebus.h
+1
-0
include/asm-sparc64/kbio.h
include/asm-sparc64/kbio.h
+0
-56
include/asm-sparc64/mmu_context.h
include/asm-sparc64/mmu_context.h
+24
-22
include/asm-sparc64/termios.h
include/asm-sparc64/termios.h
+0
-9
include/asm-sparc64/tlb.h
include/asm-sparc64/tlb.h
+5
-9
include/asm-sparc64/vuid_event.h
include/asm-sparc64/vuid_event.h
+0
-40
kernel/fork.c
kernel/fork.c
+0
-7
sound/sparc/cs4231.c
sound/sparc/cs4231.c
+371
-283
No files found.
Documentation/ioctl-number.txt
View file @
d27ba47e
...
...
@@ -130,8 +130,6 @@ Code Seq# Include File Comments
<mailto:zapman@interlan.net>
'i' 00-3F linux/i2o.h
'j' 00-3F linux/joystick.h
'k' all asm-sparc/kbio.h
asm-sparc64/kbio.h
'l' 00-3F linux/tcfs_fs.h transparent cryptographic file system
<http://mikonos.dia.unisa.it/tcfs>
'l' 40-7F linux/udf_fs_i.h in development:
...
...
arch/sparc/Kconfig
View file @
d27ba47e
...
...
@@ -201,6 +201,14 @@ config SUN_OPENPROMFS
Only choose N if you know in advance that you will not need to modify
OpenPROM settings on the running system.
config SPARC_LED
tristate "Sun4m LED driver"
help
This driver toggles the front-panel LED on sun4m systems
in a user-specifyable manner. It's state can be probed
by reading /proc/led and it's blinking mode can be changed
via writes to /proc/led
source "fs/Kconfig.binfmt"
config SUNOS_EMUL
...
...
arch/sparc/kernel/Makefile
View file @
d27ba47e
...
...
@@ -21,6 +21,7 @@ obj-$(CONFIG_SUN_AUXIO) += auxio.o
obj-$(CONFIG_PCI)
+=
ebus.o
obj-$(CONFIG_SUN_PM)
+=
apc.o pmc.o
obj-$(CONFIG_MODULES)
+=
module.o sparc_ksyms.o
obj-$(CONFIG_SPARC_LED)
+=
led.o
ifdef
CONFIG_SUNOS_EMUL
obj-y
+=
sys_sunos.o sunos_ioctl.o
...
...
arch/sparc/kernel/led.c
0 → 100644
View file @
d27ba47e
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/proc_fs.h>
#include <linux/string.h>
#include <asm/auxio.h>
#define LED_MAX_LENGTH 8
/* maximum chars written to proc file */
static
inline
void
led_toggle
(
void
)
{
unsigned
char
val
=
get_auxio
();
unsigned
char
on
,
off
;
if
(
val
&
AUXIO_LED
)
{
on
=
0
;
off
=
AUXIO_LED
;
}
else
{
on
=
AUXIO_LED
;
off
=
0
;
}
set_auxio
(
on
,
off
);
}
static
struct
timer_list
led_blink_timer
;
static
void
led_blink
(
unsigned
long
timeout
)
{
led_toggle
();
/* reschedule */
if
(
!
timeout
)
{
/* blink according to load */
led_blink_timer
.
expires
=
jiffies
+
((
1
+
(
avenrun
[
0
]
>>
FSHIFT
))
*
HZ
);
led_blink_timer
.
data
=
0
;
}
else
{
/* blink at user specified interval */
led_blink_timer
.
expires
=
jiffies
+
(
timeout
*
HZ
);
led_blink_timer
.
data
=
timeout
;
}
add_timer
(
&
led_blink_timer
);
}
static
int
led_read_proc
(
char
*
buf
,
char
**
start
,
off_t
offset
,
int
count
,
int
*
eof
,
void
*
data
)
{
int
len
=
0
;
if
(
get_auxio
()
&
AUXIO_LED
)
len
=
sprintf
(
buf
,
"on
\n
"
);
else
len
=
sprintf
(
buf
,
"off
\n
"
);
return
len
;
}
static
int
led_write_proc
(
struct
file
*
file
,
const
char
*
buffer
,
unsigned
long
count
,
void
*
data
)
{
char
*
buf
=
NULL
;
if
(
count
>
LED_MAX_LENGTH
)
count
=
LED_MAX_LENGTH
;
buf
=
kmalloc
(
sizeof
(
char
)
*
(
count
+
1
),
GFP_KERNEL
);
if
(
!
buf
)
return
-
ENOMEM
;
if
(
copy_from_user
(
buf
,
buffer
,
count
))
{
kfree
(
buf
);
return
-
EFAULT
;
}
buf
[
count
]
=
'\0'
;
/* work around \n when echo'ing into proc */
if
(
buf
[
count
-
1
]
==
'\n'
)
buf
[
count
-
1
]
=
'\0'
;
/* before we change anything we want to stop any running timers,
* otherwise calls such as on will have no persistent effect
*/
del_timer_sync
(
&
led_blink_timer
);
if
(
!
strcmp
(
buf
,
"on"
))
{
auxio_set_led
(
AUXIO_LED_ON
);
}
else
if
(
!
strcmp
(
buf
,
"toggle"
))
{
led_toggle
();
}
else
if
((
*
buf
>
'0'
)
&&
(
*
buf
<=
'9'
))
{
led_blink
(
simple_strtoul
(
buf
,
NULL
,
10
));
}
else
if
(
!
strcmp
(
buf
,
"load"
))
{
led_blink
(
0
);
}
else
{
auxio_set_led
(
AUXIO_LED_OFF
);
}
kfree
(
buf
);
return
count
;
}
static
struct
proc_dir_entry
*
led
;
#define LED_VERSION "0.1"
static
int
__init
led_init
(
void
)
{
init_timer
(
&
led_blink_timer
);
led_blink_timer
.
function
=
led_blink
;
led
=
create_proc_entry
(
"led"
,
0
,
NULL
);
if
(
!
led
)
return
-
ENOMEM
;
led
->
read_proc
=
led_read_proc
;
/* reader function */
led
->
write_proc
=
led_write_proc
;
/* writer function */
led
->
owner
=
THIS_MODULE
;
printk
(
KERN_INFO
"led: version %s, Lars Kotthoff <metalhead@metalhead.ws>
\n
"
,
LED_VERSION
);
return
0
;
}
static
void
__exit
led_exit
(
void
)
{
remove_proc_entry
(
"led"
,
NULL
);
del_timer_sync
(
&
led_blink_timer
);
}
module_init
(
led_init
);
module_exit
(
led_exit
);
MODULE_AUTHOR
(
"Lars Kotthoff <metalhead@metalhead.ws>"
);
MODULE_DESCRIPTION
(
"Provides control of the front LED on SPARC systems."
);
MODULE_LICENSE
(
"GPL"
);
MODULE_VERSION
(
LED_VERSION
);
arch/sparc/kernel/sunos_ioctl.c
View file @
d27ba47e
...
...
@@ -23,7 +23,6 @@
#include <linux/smp_lock.h>
#include <linux/syscalls.h>
#include <linux/file.h>
#include <asm/kbio.h>
#if 0
extern char sunkbd_type;
...
...
arch/sparc64/kernel/ioctl32.c
View file @
d27ba47e
...
...
@@ -11,33 +11,14 @@
#define INCLUDES
#include "compat_ioctl.c"
#include <linux/ncp_fs.h>
#include <linux/syscalls.h>
#include <asm/fbio.h>
#include <asm/kbio.h>
#include <asm/vuid_event.h>
#include <asm/envctrl.h>
#include <asm/display7seg.h>
#include <asm/openpromio.h>
#include <asm/audioio.h>
#include <asm/watchdog.h>
/* Use this to get at 32-bit user passed pointers.
* See sys_sparc32.c for description about it.
*/
#define A(__x) compat_ptr(__x)
static
__inline__
void
*
alloc_user_space
(
long
len
)
{
struct
pt_regs
*
regs
=
current_thread_info
()
->
kregs
;
unsigned
long
usp
=
regs
->
u_regs
[
UREG_I6
];
if
(
!
(
test_thread_flag
(
TIF_32BIT
)))
usp
+=
STACK_BIAS
;
return
(
void
*
)
(
usp
-
len
);
}
#define CODE
#include "compat_ioctl.c"
...
...
@@ -111,357 +92,6 @@ static int fbiogscursor(unsigned int fd, unsigned int cmd, unsigned long arg)
return
sys_ioctl
(
fd
,
FBIOSCURSOR
,
(
unsigned
long
)
p
);
}
#if defined(CONFIG_DRM) || defined(CONFIG_DRM_MODULE)
/* This really belongs in include/linux/drm.h -DaveM */
#include "../../../drivers/char/drm/drm.h"
typedef
struct
drm32_version
{
int
version_major
;
/* Major version */
int
version_minor
;
/* Minor version */
int
version_patchlevel
;
/* Patch level */
int
name_len
;
/* Length of name buffer */
u32
name
;
/* Name of driver */
int
date_len
;
/* Length of date buffer */
u32
date
;
/* User-space buffer to hold date */
int
desc_len
;
/* Length of desc buffer */
u32
desc
;
/* User-space buffer to hold desc */
}
drm32_version_t
;
#define DRM32_IOCTL_VERSION DRM_IOWR(0x00, drm32_version_t)
static
int
drm32_version
(
unsigned
int
fd
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
drm32_version_t
__user
*
uversion
=
(
drm32_version_t
__user
*
)
arg
;
drm_version_t
__user
*
p
=
compat_alloc_user_space
(
sizeof
(
*
p
));
compat_uptr_t
addr
;
int
n
;
int
ret
;
if
(
clear_user
(
p
,
3
*
sizeof
(
int
))
||
get_user
(
n
,
&
uversion
->
name_len
)
||
put_user
(
n
,
&
p
->
name_len
)
||
get_user
(
addr
,
&
uversion
->
name
)
||
put_user
(
compat_ptr
(
addr
),
&
p
->
name
)
||
get_user
(
n
,
&
uversion
->
date_len
)
||
put_user
(
n
,
&
p
->
date_len
)
||
get_user
(
addr
,
&
uversion
->
date
)
||
put_user
(
compat_ptr
(
addr
),
&
p
->
date
)
||
get_user
(
n
,
&
uversion
->
desc_len
)
||
put_user
(
n
,
&
p
->
desc_len
)
||
get_user
(
addr
,
&
uversion
->
desc
)
||
put_user
(
compat_ptr
(
addr
),
&
p
->
desc
))
return
-
EFAULT
;
ret
=
sys_ioctl
(
fd
,
DRM_IOCTL_VERSION
,
(
unsigned
long
)
p
);
if
(
ret
)
return
ret
;
if
(
copy_in_user
(
uversion
,
p
,
3
*
sizeof
(
int
))
||
get_user
(
n
,
&
p
->
name_len
)
||
put_user
(
n
,
&
uversion
->
name_len
)
||
get_user
(
n
,
&
p
->
date_len
)
||
put_user
(
n
,
&
uversion
->
date_len
)
||
get_user
(
n
,
&
p
->
desc_len
)
||
put_user
(
n
,
&
uversion
->
desc_len
))
return
-
EFAULT
;
return
0
;
}
typedef
struct
drm32_unique
{
int
unique_len
;
/* Length of unique */
u32
unique
;
/* Unique name for driver instantiation */
}
drm32_unique_t
;
#define DRM32_IOCTL_GET_UNIQUE DRM_IOWR(0x01, drm32_unique_t)
#define DRM32_IOCTL_SET_UNIQUE DRM_IOW( 0x10, drm32_unique_t)
static
int
drm32_getsetunique
(
unsigned
int
fd
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
drm32_unique_t
__user
*
uarg
=
(
drm32_unique_t
__user
*
)
arg
;
drm_unique_t
__user
*
p
=
compat_alloc_user_space
(
sizeof
(
*
p
));
compat_uptr_t
addr
;
int
n
;
int
ret
;
if
(
get_user
(
n
,
&
uarg
->
unique_len
)
||
put_user
(
n
,
&
p
->
unique_len
)
||
get_user
(
addr
,
&
uarg
->
unique
)
||
put_user
(
compat_ptr
(
addr
),
&
p
->
unique
))
return
-
EFAULT
;
if
(
cmd
==
DRM32_IOCTL_GET_UNIQUE
)
ret
=
sys_ioctl
(
fd
,
DRM_IOCTL_GET_UNIQUE
,
(
unsigned
long
)
p
);
else
ret
=
sys_ioctl
(
fd
,
DRM_IOCTL_SET_UNIQUE
,
(
unsigned
long
)
p
);
if
(
ret
)
return
ret
;
if
(
get_user
(
n
,
&
p
->
unique_len
)
||
put_user
(
n
,
&
uarg
->
unique_len
))
return
-
EFAULT
;
return
0
;
}
typedef
struct
drm32_map
{
u32
offset
;
/* Requested physical address (0 for SAREA)*/
u32
size
;
/* Requested physical size (bytes) */
drm_map_type_t
type
;
/* Type of memory to map */
drm_map_flags_t
flags
;
/* Flags */
u32
handle
;
/* User-space: "Handle" to pass to mmap */
/* Kernel-space: kernel-virtual address */
int
mtrr
;
/* MTRR slot used */
/* Private data */
}
drm32_map_t
;
#define DRM32_IOCTL_ADD_MAP DRM_IOWR(0x15, drm32_map_t)
static
int
drm32_addmap
(
unsigned
int
fd
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
drm32_map_t
__user
*
uarg
=
(
drm32_map_t
__user
*
)
arg
;
drm_map_t
karg
;
mm_segment_t
old_fs
;
u32
tmp
;
int
ret
;
ret
=
get_user
(
karg
.
offset
,
&
uarg
->
offset
);
ret
|=
get_user
(
karg
.
size
,
&
uarg
->
size
);
ret
|=
get_user
(
karg
.
type
,
&
uarg
->
type
);
ret
|=
get_user
(
karg
.
flags
,
&
uarg
->
flags
);
ret
|=
get_user
(
tmp
,
&
uarg
->
handle
);
ret
|=
get_user
(
karg
.
mtrr
,
&
uarg
->
mtrr
);
if
(
ret
)
return
-
EFAULT
;
karg
.
handle
=
(
void
*
)
(
unsigned
long
)
tmp
;
old_fs
=
get_fs
();
set_fs
(
KERNEL_DS
);
ret
=
sys_ioctl
(
fd
,
DRM_IOCTL_ADD_MAP
,
(
unsigned
long
)
&
karg
);
set_fs
(
old_fs
);
if
(
!
ret
)
{
ret
=
put_user
(
karg
.
offset
,
&
uarg
->
offset
);
ret
|=
put_user
(
karg
.
size
,
&
uarg
->
size
);
ret
|=
put_user
(
karg
.
type
,
&
uarg
->
type
);
ret
|=
put_user
(
karg
.
flags
,
&
uarg
->
flags
);
tmp
=
(
u32
)
(
long
)
karg
.
handle
;
ret
|=
put_user
(
tmp
,
&
uarg
->
handle
);
ret
|=
put_user
(
karg
.
mtrr
,
&
uarg
->
mtrr
);
if
(
ret
)
ret
=
-
EFAULT
;
}
return
ret
;
}
typedef
struct
drm32_buf_info
{
int
count
;
/* Entries in list */
u32
list
;
/* (drm_buf_desc_t *) */
}
drm32_buf_info_t
;
#define DRM32_IOCTL_INFO_BUFS DRM_IOWR(0x18, drm32_buf_info_t)
static
int
drm32_info_bufs
(
unsigned
int
fd
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
drm32_buf_info_t
__user
*
uarg
=
(
drm32_buf_info_t
__user
*
)
arg
;
drm_buf_info_t
__user
*
p
=
compat_alloc_user_space
(
sizeof
(
*
p
));
compat_uptr_t
addr
;
int
n
;
int
ret
;
if
(
get_user
(
n
,
&
uarg
->
count
)
||
put_user
(
n
,
&
p
->
count
)
||
get_user
(
addr
,
&
uarg
->
list
)
||
put_user
(
compat_ptr
(
addr
),
&
p
->
list
))
return
-
EFAULT
;
ret
=
sys_ioctl
(
fd
,
DRM_IOCTL_INFO_BUFS
,
(
unsigned
long
)
p
);
if
(
ret
)
return
ret
;
if
(
get_user
(
n
,
&
p
->
count
)
||
put_user
(
n
,
&
uarg
->
count
))
return
-
EFAULT
;
return
0
;
}
typedef
struct
drm32_buf_free
{
int
count
;
u32
list
;
/* (int *) */
}
drm32_buf_free_t
;
#define DRM32_IOCTL_FREE_BUFS DRM_IOW( 0x1a, drm32_buf_free_t)
static
int
drm32_free_bufs
(
unsigned
int
fd
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
drm32_buf_free_t
__user
*
uarg
=
(
drm32_buf_free_t
__user
*
)
arg
;
drm_buf_free_t
__user
*
p
=
compat_alloc_user_space
(
sizeof
(
*
p
));
compat_uptr_t
addr
;
int
n
;
if
(
get_user
(
n
,
&
uarg
->
count
)
||
put_user
(
n
,
&
p
->
count
)
||
get_user
(
addr
,
&
uarg
->
list
)
||
put_user
(
compat_ptr
(
addr
),
&
p
->
list
))
return
-
EFAULT
;
return
sys_ioctl
(
fd
,
DRM_IOCTL_FREE_BUFS
,
(
unsigned
long
)
p
);
}
typedef
struct
drm32_buf_pub
{
int
idx
;
/* Index into master buflist */
int
total
;
/* Buffer size */
int
used
;
/* Amount of buffer in use (for DMA) */
u32
address
;
/* Address of buffer (void *) */
}
drm32_buf_pub_t
;
typedef
struct
drm32_buf_map
{
int
count
;
/* Length of buflist */
u32
virtual
;
/* Mmaped area in user-virtual (void *) */
u32
list
;
/* Buffer information (drm_buf_pub_t *) */
}
drm32_buf_map_t
;
#define DRM32_IOCTL_MAP_BUFS DRM_IOWR(0x19, drm32_buf_map_t)
static
int
drm32_map_bufs
(
unsigned
int
fd
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
drm32_buf_map_t
__user
*
uarg
=
(
drm32_buf_map_t
__user
*
)
arg
;
drm32_buf_pub_t
__user
*
ulist
;
drm_buf_map_t
__user
*
arg64
;
drm_buf_pub_t
__user
*
list
;
int
orig_count
,
ret
,
i
;
int
n
;
compat_uptr_t
addr
;
if
(
get_user
(
orig_count
,
&
uarg
->
count
))
return
-
EFAULT
;
arg64
=
compat_alloc_user_space
(
sizeof
(
drm_buf_map_t
)
+
(
size_t
)
orig_count
*
sizeof
(
drm_buf_pub_t
));
list
=
(
void
__user
*
)(
arg64
+
1
);
if
(
put_user
(
orig_count
,
&
arg64
->
count
)
||
put_user
(
list
,
&
arg64
->
list
)
||
get_user
(
addr
,
&
uarg
->
virtual
)
||
put_user
(
compat_ptr
(
addr
),
&
arg64
->
virtual
)
||
get_user
(
addr
,
&
uarg
->
list
))
return
-
EFAULT
;
ulist
=
compat_ptr
(
addr
);
for
(
i
=
0
;
i
<
orig_count
;
i
++
)
{
if
(
get_user
(
n
,
&
ulist
[
i
].
idx
)
||
put_user
(
n
,
&
list
[
i
].
idx
)
||
get_user
(
n
,
&
ulist
[
i
].
total
)
||
put_user
(
n
,
&
list
[
i
].
total
)
||
get_user
(
n
,
&
ulist
[
i
].
used
)
||
put_user
(
n
,
&
list
[
i
].
used
)
||
get_user
(
addr
,
&
ulist
[
i
].
address
)
||
put_user
(
compat_ptr
(
addr
),
&
list
[
i
].
address
))
return
-
EFAULT
;
}
ret
=
sys_ioctl
(
fd
,
DRM_IOCTL_MAP_BUFS
,
(
unsigned
long
)
arg64
);
if
(
ret
)
return
ret
;
for
(
i
=
0
;
i
<
orig_count
;
i
++
)
{
void
__user
*
p
;
if
(
get_user
(
n
,
&
list
[
i
].
idx
)
||
put_user
(
n
,
&
ulist
[
i
].
idx
)
||
get_user
(
n
,
&
list
[
i
].
total
)
||
put_user
(
n
,
&
ulist
[
i
].
total
)
||
get_user
(
n
,
&
list
[
i
].
used
)
||
put_user
(
n
,
&
ulist
[
i
].
used
)
||
get_user
(
p
,
&
list
[
i
].
address
)
||
put_user
((
unsigned
long
)
p
,
&
ulist
[
i
].
address
))
return
-
EFAULT
;
}
if
(
get_user
(
n
,
&
arg64
->
count
)
||
put_user
(
n
,
&
uarg
->
count
))
return
-
EFAULT
;
return
0
;
}
typedef
struct
drm32_dma
{
/* Indices here refer to the offset into
buflist in drm_buf_get_t. */
int
context
;
/* Context handle */
int
send_count
;
/* Number of buffers to send */
u32
send_indices
;
/* List of handles to buffers (int *) */
u32
send_sizes
;
/* Lengths of data to send (int *) */
drm_dma_flags_t
flags
;
/* Flags */
int
request_count
;
/* Number of buffers requested */
int
request_size
;
/* Desired size for buffers */
u32
request_indices
;
/* Buffer information (int *) */
u32
request_sizes
;
/* (int *) */
int
granted_count
;
/* Number of buffers granted */
}
drm32_dma_t
;
#define DRM32_IOCTL_DMA DRM_IOWR(0x29, drm32_dma_t)
/* RED PEN The DRM layer blindly dereferences the send/request
* index/size arrays even though they are userland
* pointers. -DaveM
*/
static
int
drm32_dma
(
unsigned
int
fd
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
drm32_dma_t
__user
*
uarg
=
(
drm32_dma_t
__user
*
)
arg
;
drm_dma_t
__user
*
p
=
compat_alloc_user_space
(
sizeof
(
*
p
));
compat_uptr_t
addr
;
int
ret
;
if
(
copy_in_user
(
p
,
uarg
,
2
*
sizeof
(
int
))
||
get_user
(
addr
,
&
uarg
->
send_indices
)
||
put_user
(
compat_ptr
(
addr
),
&
p
->
send_indices
)
||
get_user
(
addr
,
&
uarg
->
send_sizes
)
||
put_user
(
compat_ptr
(
addr
),
&
p
->
send_sizes
)
||
copy_in_user
(
&
p
->
flags
,
&
uarg
->
flags
,
sizeof
(
drm_dma_flags_t
))
||
copy_in_user
(
&
p
->
request_count
,
&
uarg
->
request_count
,
sizeof
(
int
))
||
copy_in_user
(
&
p
->
request_size
,
&
uarg
->
request_size
,
sizeof
(
int
))
||
get_user
(
addr
,
&
uarg
->
request_indices
)
||
put_user
(
compat_ptr
(
addr
),
&
p
->
request_indices
)
||
get_user
(
addr
,
&
uarg
->
request_sizes
)
||
put_user
(
compat_ptr
(
addr
),
&
p
->
request_sizes
)
||
copy_in_user
(
&
p
->
granted_count
,
&
uarg
->
granted_count
,
sizeof
(
int
)))
return
-
EFAULT
;
ret
=
sys_ioctl
(
fd
,
DRM_IOCTL_DMA
,
(
unsigned
long
)
p
);
if
(
ret
)
return
ret
;
if
(
copy_in_user
(
uarg
,
p
,
2
*
sizeof
(
int
))
||
copy_in_user
(
&
uarg
->
flags
,
&
p
->
flags
,
sizeof
(
drm_dma_flags_t
))
||
copy_in_user
(
&
uarg
->
request_count
,
&
p
->
request_count
,
sizeof
(
int
))
||
copy_in_user
(
&
uarg
->
request_size
,
&
p
->
request_size
,
sizeof
(
int
))
||
copy_in_user
(
&
uarg
->
granted_count
,
&
p
->
granted_count
,
sizeof
(
int
)))
return
-
EFAULT
;
return
0
;
}
typedef
struct
drm32_ctx_res
{
int
count
;
u32
contexts
;
/* (drm_ctx_t *) */
}
drm32_ctx_res_t
;
#define DRM32_IOCTL_RES_CTX DRM_IOWR(0x26, drm32_ctx_res_t)
static
int
drm32_res_ctx
(
unsigned
int
fd
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
drm32_ctx_res_t
__user
*
uarg
=
(
drm32_ctx_res_t
__user
*
)
arg
;
drm_ctx_res_t
__user
*
p
=
compat_alloc_user_space
(
sizeof
(
*
p
));
compat_uptr_t
addr
;
int
ret
;
if
(
copy_in_user
(
p
,
uarg
,
sizeof
(
int
))
||
get_user
(
addr
,
&
uarg
->
contexts
)
||
put_user
(
compat_ptr
(
addr
),
&
p
->
contexts
))
return
-
EFAULT
;
ret
=
sys_ioctl
(
fd
,
DRM_IOCTL_RES_CTX
,
(
unsigned
long
)
p
);
if
(
ret
)
return
ret
;
if
(
copy_in_user
(
uarg
,
p
,
sizeof
(
int
)))
return
-
EFAULT
;
return
0
;
}
#endif
typedef
int
(
*
ioctl32_handler_t
)(
unsigned
int
,
unsigned
int
,
unsigned
long
,
struct
file
*
);
#define COMPATIBLE_IOCTL(cmd) HANDLE_IOCTL((cmd),sys_ioctl)
...
...
@@ -485,103 +115,14 @@ COMPATIBLE_IOCTL(FBIOSCURPOS)
COMPATIBLE_IOCTL
(
FBIOGCURPOS
)
COMPATIBLE_IOCTL
(
FBIOGCURMAX
)
/* Little k */
COMPATIBLE_IOCTL
(
KIOCTYPE
)
COMPATIBLE_IOCTL
(
KIOCLAYOUT
)
COMPATIBLE_IOCTL
(
KIOCGTRANS
)
COMPATIBLE_IOCTL
(
KIOCTRANS
)
COMPATIBLE_IOCTL
(
KIOCCMD
)
COMPATIBLE_IOCTL
(
KIOCSDIRECT
)
COMPATIBLE_IOCTL
(
KIOCSLED
)
COMPATIBLE_IOCTL
(
KIOCGLED
)
COMPATIBLE_IOCTL
(
KIOCSRATE
)
COMPATIBLE_IOCTL
(
KIOCGRATE
)
COMPATIBLE_IOCTL
(
VUIDSFORMAT
)
COMPATIBLE_IOCTL
(
VUIDGFORMAT
)
/* Little v, the video4linux ioctls */
COMPATIBLE_IOCTL
(
_IOR
(
'p'
,
20
,
int
[
7
]))
/* RTCGET */
COMPATIBLE_IOCTL
(
_IOW
(
'p'
,
21
,
int
[
7
]))
/* RTCSET */
COMPATIBLE_IOCTL
(
ENVCTRL_RD_WARNING_TEMPERATURE
)
COMPATIBLE_IOCTL
(
ENVCTRL_RD_SHUTDOWN_TEMPERATURE
)
COMPATIBLE_IOCTL
(
ENVCTRL_RD_CPU_TEMPERATURE
)
COMPATIBLE_IOCTL
(
ENVCTRL_RD_FAN_STATUS
)
COMPATIBLE_IOCTL
(
ENVCTRL_RD_VOLTAGE_STATUS
)
COMPATIBLE_IOCTL
(
ENVCTRL_RD_SCSI_TEMPERATURE
)
COMPATIBLE_IOCTL
(
ENVCTRL_RD_ETHERNET_TEMPERATURE
)
COMPATIBLE_IOCTL
(
ENVCTRL_RD_MTHRBD_TEMPERATURE
)
COMPATIBLE_IOCTL
(
ENVCTRL_RD_CPU_VOLTAGE
)
COMPATIBLE_IOCTL
(
ENVCTRL_RD_GLOBALADDRESS
)
/* COMPATIBLE_IOCTL(D7SIOCRD) same value as ENVCTRL_RD_VOLTAGE_STATUS */
COMPATIBLE_IOCTL
(
D7SIOCWR
)
COMPATIBLE_IOCTL
(
D7SIOCTM
)
/* OPENPROMIO, SunOS/Solaris only, the NetBSD one's have
* embedded pointers in the arg which we'd need to clean up...
*/
COMPATIBLE_IOCTL
(
OPROMGETOPT
)
COMPATIBLE_IOCTL
(
OPROMSETOPT
)
COMPATIBLE_IOCTL
(
OPROMNXTOPT
)
COMPATIBLE_IOCTL
(
OPROMSETOPT2
)
COMPATIBLE_IOCTL
(
OPROMNEXT
)
COMPATIBLE_IOCTL
(
OPROMCHILD
)
COMPATIBLE_IOCTL
(
OPROMGETPROP
)
COMPATIBLE_IOCTL
(
OPROMNXTPROP
)
COMPATIBLE_IOCTL
(
OPROMU2P
)
COMPATIBLE_IOCTL
(
OPROMGETCONS
)
COMPATIBLE_IOCTL
(
OPROMGETFBNAME
)
COMPATIBLE_IOCTL
(
OPROMGETBOOTARGS
)
COMPATIBLE_IOCTL
(
OPROMSETCUR
)
COMPATIBLE_IOCTL
(
OPROMPCI2NODE
)
COMPATIBLE_IOCTL
(
OPROMPATH2NODE
)
/* Big L */
COMPATIBLE_IOCTL
(
LOOP_SET_STATUS64
)
COMPATIBLE_IOCTL
(
LOOP_GET_STATUS64
)
/* Big A */
COMPATIBLE_IOCTL
(
AUDIO_GETINFO
)
COMPATIBLE_IOCTL
(
AUDIO_SETINFO
)
COMPATIBLE_IOCTL
(
AUDIO_DRAIN
)
COMPATIBLE_IOCTL
(
AUDIO_GETDEV
)
COMPATIBLE_IOCTL
(
AUDIO_GETDEV_SUNOS
)
COMPATIBLE_IOCTL
(
AUDIO_FLUSH
)
COMPATIBLE_IOCTL
(
AUTOFS_IOC_EXPIRE_MULTI
)
#if defined(CONFIG_DRM) || defined(CONFIG_DRM_MODULE)
COMPATIBLE_IOCTL
(
DRM_IOCTL_GET_MAGIC
)
COMPATIBLE_IOCTL
(
DRM_IOCTL_IRQ_BUSID
)
COMPATIBLE_IOCTL
(
DRM_IOCTL_AUTH_MAGIC
)
COMPATIBLE_IOCTL
(
DRM_IOCTL_BLOCK
)
COMPATIBLE_IOCTL
(
DRM_IOCTL_UNBLOCK
)
COMPATIBLE_IOCTL
(
DRM_IOCTL_CONTROL
)
COMPATIBLE_IOCTL
(
DRM_IOCTL_ADD_BUFS
)
COMPATIBLE_IOCTL
(
DRM_IOCTL_MARK_BUFS
)
COMPATIBLE_IOCTL
(
DRM_IOCTL_ADD_CTX
)
COMPATIBLE_IOCTL
(
DRM_IOCTL_RM_CTX
)
COMPATIBLE_IOCTL
(
DRM_IOCTL_MOD_CTX
)
COMPATIBLE_IOCTL
(
DRM_IOCTL_GET_CTX
)
COMPATIBLE_IOCTL
(
DRM_IOCTL_SWITCH_CTX
)
COMPATIBLE_IOCTL
(
DRM_IOCTL_NEW_CTX
)
COMPATIBLE_IOCTL
(
DRM_IOCTL_ADD_DRAW
)
COMPATIBLE_IOCTL
(
DRM_IOCTL_RM_DRAW
)
COMPATIBLE_IOCTL
(
DRM_IOCTL_LOCK
)
COMPATIBLE_IOCTL
(
DRM_IOCTL_UNLOCK
)
COMPATIBLE_IOCTL
(
DRM_IOCTL_FINISH
)
#endif
/* DRM */
COMPATIBLE_IOCTL
(
WIOCSTART
)
COMPATIBLE_IOCTL
(
WIOCSTOP
)
COMPATIBLE_IOCTL
(
WIOCGSTAT
)
/* And these ioctls need translation */
/* Note SIOCRTMSG is no longer, so this is safe and * the user would have seen just an -EINVAL anyways. */
HANDLE_IOCTL
(
FBIOPUTCMAP32
,
fbiogetputcmap
)
HANDLE_IOCTL
(
FBIOGETCMAP32
,
fbiogetputcmap
)
HANDLE_IOCTL
(
FBIOSCURSOR32
,
fbiogscursor
)
#if defined(CONFIG_DRM) || defined(CONFIG_DRM_MODULE)
HANDLE_IOCTL
(
DRM32_IOCTL_VERSION
,
drm32_version
)
HANDLE_IOCTL
(
DRM32_IOCTL_GET_UNIQUE
,
drm32_getsetunique
)
HANDLE_IOCTL
(
DRM32_IOCTL_SET_UNIQUE
,
drm32_getsetunique
)
HANDLE_IOCTL
(
DRM32_IOCTL_ADD_MAP
,
drm32_addmap
)
HANDLE_IOCTL
(
DRM32_IOCTL_INFO_BUFS
,
drm32_info_bufs
)
HANDLE_IOCTL
(
DRM32_IOCTL_FREE_BUFS
,
drm32_free_bufs
)
HANDLE_IOCTL
(
DRM32_IOCTL_MAP_BUFS
,
drm32_map_bufs
)
HANDLE_IOCTL
(
DRM32_IOCTL_DMA
,
drm32_dma
)
HANDLE_IOCTL
(
DRM32_IOCTL_RES_CTX
,
drm32_res_ctx
)
#endif
/* DRM */
#if 0
HANDLE_IOCTL(RTC32_IRQP_READ, do_rtc_ioctl)
HANDLE_IOCTL(RTC32_IRQP_SET, do_rtc_ioctl)
...
...
arch/sparc64/kernel/setup.c
View file @
d27ba47e
...
...
@@ -154,6 +154,7 @@ int prom_callback(long *args)
pud_t
*
pudp
;
pmd_t
*
pmdp
;
pte_t
*
ptep
;
pte_t
pte
;
for_each_process
(
p
)
{
mm
=
p
->
mm
;
...
...
@@ -178,8 +179,9 @@ int prom_callback(long *args)
* being called from inside OBP.
*/
ptep
=
pte_offset_map
(
pmdp
,
va
);
if
(
pte_present
(
*
ptep
))
{
tte
=
pte_val
(
*
ptep
);
pte
=
*
ptep
;
if
(
pte_present
(
pte
))
{
tte
=
pte_val
(
pte
);
res
=
PROM_TRUE
;
}
pte_unmap
(
ptep
);
...
...
@@ -218,6 +220,7 @@ int prom_callback(long *args)
pud_t
*
pudp
;
pmd_t
*
pmdp
;
pte_t
*
ptep
;
pte_t
pte
;
int
error
;
if
((
va
>=
LOW_OBP_ADDRESS
)
&&
(
va
<
HI_OBP_ADDRESS
))
{
...
...
@@ -240,8 +243,9 @@ int prom_callback(long *args)
* being called from inside OBP.
*/
ptep
=
pte_offset_kernel
(
pmdp
,
va
);
if
(
pte_present
(
*
ptep
))
{
tte
=
pte_val
(
*
ptep
);
pte
=
*
ptep
;
if
(
pte_present
(
pte
))
{
tte
=
pte_val
(
pte
);
res
=
PROM_TRUE
;
}
goto
done
;
...
...
arch/sparc64/kernel/signal32.c
View file @
d27ba47e
...
...
@@ -863,6 +863,7 @@ static void new_setup_frame32(struct k_sigaction *ka, struct pt_regs *regs,
pud_t
*
pudp
=
pud_offset
(
pgdp
,
address
);
pmd_t
*
pmdp
=
pmd_offset
(
pudp
,
address
);
pte_t
*
ptep
;
pte_t
pte
;
regs
->
u_regs
[
UREG_I7
]
=
(
unsigned
long
)
(
&
(
sf
->
insns
[
0
])
-
2
);
...
...
@@ -873,9 +874,10 @@ static void new_setup_frame32(struct k_sigaction *ka, struct pt_regs *regs,
preempt_disable
();
ptep
=
pte_offset_map
(
pmdp
,
address
);
if
(
pte_present
(
*
ptep
))
{
pte
=
*
ptep
;
if
(
pte_present
(
pte
))
{
unsigned
long
page
=
(
unsigned
long
)
page_address
(
pte_page
(
*
ptep
));
page_address
(
pte_page
(
pte
));
wmb
();
__asm__
__volatile__
(
"flush %0 + %1"
...
...
arch/sparc64/kernel/smp.c
View file @
d27ba47e
...
...
@@ -839,43 +839,29 @@ void smp_flush_tlb_all(void)
* questionable (in theory the big win for threads is the massive sharing of
* address space state across processors).
*/
/* This currently is only used by the hugetlb arch pre-fault
* hook on UltraSPARC-III+ and later when changing the pagesize
* bits of the context register for an address space.
*/
void
smp_flush_tlb_mm
(
struct
mm_struct
*
mm
)
{
/*
* This code is called from two places, dup_mmap and exit_mmap. In the
* former case, we really need a flush. In the later case, the callers
* are single threaded exec_mmap (really need a flush), multithreaded
* exec_mmap case (do not need to flush, since the caller gets a new
* context via activate_mm), and all other callers of mmput() whence
* the flush can be optimized since the associated threads are dead and
* the mm is being torn down (__exit_mm and other mmput callers) or the
* owning thread is dissociating itself from the mm. The
* (atomic_read(&mm->mm_users) == 0) check ensures real work is done
* for single thread exec and dup_mmap cases. An alternate check might
* have been (current->mm != mm).
* Kanoj Sarcar
*/
if
(
atomic_read
(
&
mm
->
mm_users
)
==
0
)
return
;
{
u32
ctx
=
CTX_HWBITS
(
mm
->
context
);
int
cpu
=
get_cpu
();
u32
ctx
=
CTX_HWBITS
(
mm
->
context
);
int
cpu
=
get_cpu
();
if
(
atomic_read
(
&
mm
->
mm_users
)
==
1
)
{
mm
->
cpu_vm_mask
=
cpumask_of_cpu
(
cpu
);
goto
local_flush_and_out
;
}
if
(
atomic_read
(
&
mm
->
mm_users
)
==
1
)
{
mm
->
cpu_vm_mask
=
cpumask_of_cpu
(
cpu
);
goto
local_flush_and_out
;
}
smp_cross_call_masked
(
&
xcall_flush_tlb_mm
,
ctx
,
0
,
0
,
mm
->
cpu_vm_mask
);
smp_cross_call_masked
(
&
xcall_flush_tlb_mm
,
ctx
,
0
,
0
,
mm
->
cpu_vm_mask
);
local_flush_and_out:
__flush_tlb_mm
(
ctx
,
SECONDARY_CONTEXT
);
local_flush_and_out:
__flush_tlb_mm
(
ctx
,
SECONDARY_CONTEXT
);
put_cpu
();
}
put_cpu
();
}
void
smp_flush_tlb_pending
(
struct
mm_struct
*
mm
,
unsigned
long
nr
,
unsigned
long
*
vaddrs
)
...
...
@@ -883,34 +869,13 @@ void smp_flush_tlb_pending(struct mm_struct *mm, unsigned long nr, unsigned long
u32
ctx
=
CTX_HWBITS
(
mm
->
context
);
int
cpu
=
get_cpu
();
if
(
mm
==
current
->
active_mm
&&
atomic_read
(
&
mm
->
mm_users
)
==
1
)
{
if
(
mm
==
current
->
active_mm
&&
atomic_read
(
&
mm
->
mm_users
)
==
1
)
mm
->
cpu_vm_mask
=
cpumask_of_cpu
(
cpu
);
goto
local_flush_and_out
;
}
else
{
/* This optimization is not valid. Normally
* we will be holding the page_table_lock, but
* there is an exception which is copy_page_range()
* when forking. The lock is held during the individual
* page table updates in the parent, but not at the
* top level, which is where we are invoked.
*/
if
(
0
)
{
cpumask_t
this_cpu_mask
=
cpumask_of_cpu
(
cpu
);
/* By virtue of running under the mm->page_table_lock,
* and mmu_context.h:switch_mm doing the same, the
* following operation is safe.
*/
if
(
cpus_equal
(
mm
->
cpu_vm_mask
,
this_cpu_mask
))
goto
local_flush_and_out
;
}
}
smp_cross_call_masked
(
&
xcall_flush_tlb_pending
,
ctx
,
nr
,
(
unsigned
long
)
vaddrs
,
mm
->
cpu_vm_mask
);
else
smp_cross_call_masked
(
&
xcall_flush_tlb_pending
,
ctx
,
nr
,
(
unsigned
long
)
vaddrs
,
mm
->
cpu_vm_mask
);
local_flush_and_out:
__flush_tlb_pending
(
ctx
,
nr
,
vaddrs
);
put_cpu
();
...
...
arch/sparc64/kernel/sunos_ioctl32.c
View file @
d27ba47e
...
...
@@ -24,7 +24,6 @@
#include <linux/smp_lock.h>
#include <linux/syscalls.h>
#include <linux/compat.h>
#include <asm/kbio.h>
#define SUNOS_NR_OPEN 256
...
...
arch/sparc64/kernel/time.c
View file @
d27ba47e
...
...
@@ -60,17 +60,6 @@ static void __iomem *mstk48t59_regs;
static
int
set_rtc_mmss
(
unsigned
long
);
static
__init
unsigned
long
dummy_get_tick
(
void
)
{
return
0
;
}
static
__initdata
struct
sparc64_tick_ops
dummy_tick_ops
=
{
.
get_tick
=
dummy_get_tick
,
};
struct
sparc64_tick_ops
*
tick_ops
__read_mostly
=
&
dummy_tick_ops
;
#define TICK_PRIV_BIT (1UL << 63)
#ifdef CONFIG_SMP
...
...
@@ -200,6 +189,8 @@ static struct sparc64_tick_ops tick_operations __read_mostly = {
.
softint_mask
=
1UL
<<
0
,
};
struct
sparc64_tick_ops
*
tick_ops
__read_mostly
=
&
tick_operations
;
static
void
stick_init_tick
(
unsigned
long
offset
)
{
tick_disable_protection
();
...
...
drivers/sbus/char/cpwatchdog.c
View file @
d27ba47e
...
...
@@ -26,6 +26,7 @@
#include <linux/interrupt.h>
#include <linux/ioport.h>
#include <linux/timer.h>
#include <linux/smp_lock.h>
#include <asm/irq.h>
#include <asm/ebus.h>
#include <asm/oplib.h>
...
...
@@ -394,6 +395,28 @@ static int wd_ioctl(struct inode *inode, struct file *file,
return
(
0
);
}
static
long
wd_compat_ioctl
(
struct
file
*
file
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
int
rval
=
-
ENOIOCTLCMD
;
switch
(
cmd
)
{
/* solaris ioctls are specific to this driver */
case
WIOCSTART
:
case
WIOCSTOP
:
case
WIOCGSTAT
:
lock_kernel
();
rval
=
wd_ioctl
(
file
->
f_dentry
->
d_inode
,
file
,
cmd
,
arg
);
lock_kernel
();
break
;
/* everything else is handled by the generic compat layer */
default:
break
;
}
return
rval
;
}
static
ssize_t
wd_write
(
struct
file
*
file
,
const
char
__user
*
buf
,
size_t
count
,
...
...
@@ -441,6 +464,7 @@ static irqreturn_t wd_interrupt(int irq, void *dev_id, struct pt_regs *regs)
static
struct
file_operations
wd_fops
=
{
.
owner
=
THIS_MODULE
,
.
ioctl
=
wd_ioctl
,
.
compat_ioctl
=
wd_compat_ioctl
,
.
open
=
wd_open
,
.
write
=
wd_write
,
.
read
=
wd_read
,
...
...
drivers/sbus/char/display7seg.c
View file @
d27ba47e
...
...
@@ -15,6 +15,7 @@
#include <linux/init.h>
#include <linux/miscdevice.h>
#include <linux/ioport.h>
/* request_region */
#include <linux/smp_lock.h>
#include <asm/atomic.h>
#include <asm/ebus.h>
/* EBus device */
#include <asm/oplib.h>
/* OpenProm Library */
...
...
@@ -114,22 +115,25 @@ static int d7s_release(struct inode *inode, struct file *f)
return
0
;
}
static
int
d7s_ioctl
(
struct
inode
*
inode
,
struct
file
*
f
,
unsigned
int
cmd
,
unsigned
long
arg
)
static
long
d7s_ioctl
(
struct
file
*
file
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
__u8
regs
=
readb
(
d7s_regs
);
__u8
ireg
=
0
;
int
error
=
0
if
(
D7S_MINOR
!=
iminor
(
inode
))
if
(
D7S_MINOR
!=
iminor
(
file
->
f_dentry
->
d_
inode
))
return
-
ENODEV
;
lock_kernel
();
switch
(
cmd
)
{
case
D7SIOCWR
:
/* assign device register values
* we mask-out D7S_FLIP if in sol_compat mode
*/
if
(
get_user
(
ireg
,
(
int
__user
*
)
arg
))
return
-
EFAULT
;
if
(
get_user
(
ireg
,
(
int
__user
*
)
arg
))
{
error
=
-
EFAULT
;
break
;
}
if
(
0
!=
sol_compat
)
{
(
regs
&
D7S_FLIP
)
?
(
ireg
|=
D7S_FLIP
)
:
(
ireg
&=
~
D7S_FLIP
);
...
...
@@ -144,8 +148,10 @@ static int d7s_ioctl(struct inode *inode, struct file *f,
* This driver will not misinform you about the state
* of your hardware while in sol_compat mode
*/
if
(
put_user
(
regs
,
(
int
__user
*
)
arg
))
return
-
EFAULT
;
if
(
put_user
(
regs
,
(
int
__user
*
)
arg
))
{
error
=
-
EFAULT
;
break
;
}
break
;
case
D7SIOCTM
:
...
...
@@ -155,15 +161,17 @@ static int d7s_ioctl(struct inode *inode, struct file *f,
writeb
(
regs
,
d7s_regs
);
break
;
};
lock_kernel
();
return
0
;
return
error
;
}
static
struct
file_operations
d7s_fops
=
{
.
owner
=
THIS_MODULE
,
.
ioctl
=
d7s_ioctl
,
.
open
=
d7s_open
,
.
release
=
d7s_release
,
.
owner
=
THIS_MODULE
,
.
unlocked_ioctl
=
d7s_ioctl
,
.
compat_ioctl
=
d7s_ioctl
,
.
open
=
d7s_open
,
.
release
=
d7s_release
,
};
static
struct
miscdevice
d7s_miscdev
=
{
D7S_MINOR
,
D7S_DEVNAME
,
&
d7s_fops
};
...
...
drivers/sbus/char/envctrl.c
View file @
d27ba47e
...
...
@@ -654,9 +654,8 @@ envctrl_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
/* Function Description: Command what to read. Mapped to user ioctl().
* Return: Gives 0 for implemented commands, -EINVAL otherwise.
*/
static
int
envctrl_ioctl
(
struct
inode
*
inode
,
struct
file
*
file
,
unsigned
int
cmd
,
unsigned
long
arg
)
static
long
envctrl_ioctl
(
struct
file
*
file
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
char
__user
*
infobuf
;
...
...
@@ -715,11 +714,14 @@ envctrl_release(struct inode *inode, struct file *file)
}
static
struct
file_operations
envctrl_fops
=
{
.
owner
=
THIS_MODULE
,
.
read
=
envctrl_read
,
.
ioctl
=
envctrl_ioctl
,
.
open
=
envctrl_open
,
.
release
=
envctrl_release
,
.
owner
=
THIS_MODULE
,
.
read
=
envctrl_read
,
.
unlocked_ioctl
=
envctrl_ioctl
,
#ifdef CONFIG_COMPAT
.
compat_ioctl
=
envctrl_ioctl
,
#endif
.
open
=
envctrl_open
,
.
release
=
envctrl_release
,
};
static
struct
miscdevice
envctrl_dev
=
{
...
...
drivers/sbus/char/openprom.c
View file @
d27ba47e
...
...
@@ -39,6 +39,7 @@
#include <linux/slab.h>
#include <linux/string.h>
#include <linux/miscdevice.h>
#include <linux/smp_lock.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <asm/oplib.h>
...
...
@@ -565,6 +566,38 @@ static int openprom_ioctl(struct inode * inode, struct file * file,
}
}
static
long
openprom_compat_ioctl
(
struct
file
*
file
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
long
rval
=
-
ENOTTY
;
/*
* SunOS/Solaris only, the NetBSD one's have embedded pointers in
* the arg which we'd need to clean up...
*/
switch
(
cmd
)
{
case
OPROMGETOPT
:
case
OPROMSETOPT
:
case
OPROMNXTOPT
:
case
OPROMSETOPT2
:
case
OPROMNEXT
:
case
OPROMCHILD
:
case
OPROMGETPROP
:
case
OPROMNXTPROP
:
case
OPROMU2P
:
case
OPROMGETCONS
:
case
OPROMGETFBNAME
:
case
OPROMGETBOOTARGS
:
case
OPROMSETCUR
:
case
OPROMPCI2NODE
:
case
OPROMPATH2NODE
:
lock_kernel
();
rval
=
openprom_ioctl
(
file
->
f_dentry
->
d_inode
,
file
,
cmd
,
arg
);
lock_kernel
();
break
;
}
}
static
int
openprom_open
(
struct
inode
*
inode
,
struct
file
*
file
)
{
DATA
*
data
;
...
...
drivers/serial/sunsu.c
View file @
d27ba47e
...
...
@@ -1441,7 +1441,7 @@ static void sunsu_console_write(struct console *co, const char *s,
* - initialize the serial port
* Return non-zero if we didn't find a serial port.
*/
static
int
__init
sunsu_console_setup
(
struct
console
*
co
,
char
*
options
)
static
int
sunsu_console_setup
(
struct
console
*
co
,
char
*
options
)
{
struct
uart_port
*
port
;
int
baud
=
9600
;
...
...
drivers/video/cg6.c
View file @
d27ba47e
...
...
@@ -653,12 +653,6 @@ static void cg6_chip_init(struct fb_info *info)
sbus_writel
(
0
,
&
fbc
->
clipminy
);
sbus_writel
(
info
->
var
.
xres
-
1
,
&
fbc
->
clipmaxx
);
sbus_writel
(
info
->
var
.
yres
-
1
,
&
fbc
->
clipmaxy
);
/* Disable cursor in Brooktree DAC. */
sbus_writel
(
0x06
<<
24
,
&
par
->
bt
->
addr
);
tmp
=
sbus_readl
(
&
par
->
bt
->
control
);
tmp
&=
~
(
0x03
<<
24
);
sbus_writel
(
tmp
,
&
par
->
bt
->
control
);
}
struct
all_info
{
...
...
include/asm-m68k/kbio.h
deleted
100644 → 0
View file @
e3d8b77b
#include <asm-sparc/kbio.h>
include/asm-m68k/vuid_event.h
deleted
100644 → 0
View file @
e3d8b77b
#ifndef _M68K_VUID_EVENT_H
#define _M68K_VUID_EVENT_H
#include <asm-sparc/vuid_event.h>
#endif
include/asm-sparc/audioio.h
deleted
100644 → 0
View file @
e3d8b77b
/*
* include/asm-sparc/audioio.h
*
* Sparc Audio Midlayer
* Copyright (C) 1996 Thomas K. Dyas (tdyas@noc.rutgers.edu)
*/
#ifndef _AUDIOIO_H_
#define _AUDIOIO_H_
/*
* SunOS/Solaris /dev/audio interface
*/
#if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2)
#include <linux/types.h>
#include <linux/time.h>
#include <linux/ioctl.h>
#endif
/*
* This structure contains state information for audio device IO streams.
*/
typedef
struct
audio_prinfo
{
/*
* The following values describe the audio data encoding.
*/
unsigned
int
sample_rate
;
/* samples per second */
unsigned
int
channels
;
/* number of interleaved channels */
unsigned
int
precision
;
/* bit-width of each sample */
unsigned
int
encoding
;
/* data encoding method */
/*
* The following values control audio device configuration
*/
unsigned
int
gain
;
/* gain level: 0 - 255 */
unsigned
int
port
;
/* selected I/O port (see below) */
unsigned
int
avail_ports
;
/* available I/O ports (see below) */
unsigned
int
_xxx
[
2
];
/* Reserved for future use */
unsigned
int
buffer_size
;
/* I/O buffer size */
/*
* The following values describe driver state
*/
unsigned
int
samples
;
/* number of samples converted */
unsigned
int
eof
;
/* End Of File counter (play only) */
unsigned
char
pause
;
/* non-zero for pause, zero to resume */
unsigned
char
error
;
/* non-zero if overflow/underflow */
unsigned
char
waiting
;
/* non-zero if a process wants access */
unsigned
char
balance
;
/* stereo channel balance */
unsigned
short
minordev
;
/*
* The following values are read-only state flags
*/
unsigned
char
open
;
/* non-zero if open access permitted */
unsigned
char
active
;
/* non-zero if I/O is active */
}
audio_prinfo_t
;
/*
* This structure describes the current state of the audio device.
*/
typedef
struct
audio_info
{
/*
* Per-stream information
*/
audio_prinfo_t
play
;
/* output status information */
audio_prinfo_t
record
;
/* input status information */
/*
* Per-unit/channel information
*/
unsigned
int
monitor_gain
;
/* input to output mix: 0 - 255 */
unsigned
char
output_muted
;
/* non-zero if output is muted */
unsigned
char
_xxx
[
3
];
/* Reserved for future use */
unsigned
int
_yyy
[
3
];
/* Reserved for future use */
}
audio_info_t
;
/*
* Audio encoding types
*/
#define AUDIO_ENCODING_NONE (0)
/* no encoding assigned */
#define AUDIO_ENCODING_ULAW (1)
/* u-law encoding */
#define AUDIO_ENCODING_ALAW (2)
/* A-law encoding */
#define AUDIO_ENCODING_LINEAR (3)
/* Linear PCM encoding */
#define AUDIO_ENCODING_FLOAT (4)
/* IEEE float (-1. <-> +1.) */
#define AUDIO_ENCODING_DVI (104)
/* DVI ADPCM */
#define AUDIO_ENCODING_LINEAR8 (105)
/* 8 bit UNSIGNED */
#define AUDIO_ENCODING_LINEARLE (106)
/* Linear PCM LE encoding */
/*
* These ranges apply to record, play, and monitor gain values
*/
#define AUDIO_MIN_GAIN (0)
/* minimum gain value */
#define AUDIO_MAX_GAIN (255)
/* maximum gain value */
/*
* These values apply to the balance field to adjust channel gain values
*/
#define AUDIO_LEFT_BALANCE (0)
/* left channel only */
#define AUDIO_MID_BALANCE (32)
/* equal left/right channel */
#define AUDIO_RIGHT_BALANCE (64)
/* right channel only */
#define AUDIO_BALANCE_SHIFT (3)
/*
* Generic minimum/maximum limits for number of channels, both modes
*/
#define AUDIO_MIN_PLAY_CHANNELS (1)
#define AUDIO_MAX_PLAY_CHANNELS (4)
#define AUDIO_MIN_REC_CHANNELS (1)
#define AUDIO_MAX_REC_CHANNELS (4)
/*
* Generic minimum/maximum limits for sample precision
*/
#define AUDIO_MIN_PLAY_PRECISION (8)
#define AUDIO_MAX_PLAY_PRECISION (32)
#define AUDIO_MIN_REC_PRECISION (8)
#define AUDIO_MAX_REC_PRECISION (32)
/*
* Define some convenient names for typical audio ports
*/
/*
* output ports (several may be enabled simultaneously)
*/
#define AUDIO_SPEAKER 0x01
/* output to built-in speaker */
#define AUDIO_HEADPHONE 0x02
/* output to headphone jack */
#define AUDIO_LINE_OUT 0x04
/* output to line out */
/*
* input ports (usually only one at a time)
*/
#define AUDIO_MICROPHONE 0x01
/* input from microphone */
#define AUDIO_LINE_IN 0x02
/* input from line in */
#define AUDIO_CD 0x04
/* input from on-board CD inputs */
#define AUDIO_INTERNAL_CD_IN AUDIO_CD
/* input from internal CDROM */
#define AUDIO_ANALOG_LOOPBACK 0x40
/* input from output */
/*
* This macro initializes an audio_info structure to 'harmless' values.
* Note that (~0) might not be a harmless value for a flag that was
* a signed int.
*/
#define AUDIO_INITINFO(i) { \
unsigned int *__x__; \
for (__x__ = (unsigned int *)(i); \
(char *) __x__ < (((char *)(i)) + sizeof (audio_info_t)); \
*__x__++ = ~0); \
}
/*
* These allow testing for what the user wants to set
*/
#define AUD_INITVALUE (~0)
#define Modify(X) ((unsigned int)(X) != AUD_INITVALUE)
#define Modifys(X) ((X) != (unsigned short)AUD_INITVALUE)
#define Modifyc(X) ((X) != (unsigned char)AUD_INITVALUE)
/*
* Parameter for the AUDIO_GETDEV ioctl to determine current
* audio devices.
*/
#define MAX_AUDIO_DEV_LEN (16)
typedef
struct
audio_device
{
char
name
[
MAX_AUDIO_DEV_LEN
];
char
version
[
MAX_AUDIO_DEV_LEN
];
char
config
[
MAX_AUDIO_DEV_LEN
];
}
audio_device_t
;
/*
* Ioctl calls for the audio device.
*/
/*
* AUDIO_GETINFO retrieves the current state of the audio device.
*
* AUDIO_SETINFO copies all fields of the audio_info structure whose
* values are not set to the initialized value (-1) to the device state.
* It performs an implicit AUDIO_GETINFO to return the new state of the
* device. Note that the record.samples and play.samples fields are set
* to the last value before the AUDIO_SETINFO took effect. This allows
* an application to reset the counters while atomically retrieving the
* last value.
*
* AUDIO_DRAIN suspends the calling process until the write buffers are
* empty.
*
* AUDIO_GETDEV returns a structure of type audio_device_t which contains
* three strings. The string "name" is a short identifying string (for
* example, the SBus Fcode name string), the string "version" identifies
* the current version of the device, and the "config" string identifies
* the specific configuration of the audio stream. All fields are
* device-dependent -- see the device specific manual pages for details.
*
* AUDIO_GETDEV_SUNOS returns a number which is an audio device defined
* herein (making it not too portable)
*
* AUDIO_FLUSH stops all playback and recording, clears all queued buffers,
* resets error counters, and restarts recording and playback as appropriate
* for the current sampling mode.
*/
#define AUDIO_GETINFO _IOR('A', 1, audio_info_t)
#define AUDIO_SETINFO _IOWR('A', 2, audio_info_t)
#define AUDIO_DRAIN _IO('A', 3)
#define AUDIO_GETDEV _IOR('A', 4, audio_device_t)
#define AUDIO_GETDEV_SUNOS _IOR('A', 4, int)
#define AUDIO_FLUSH _IO('A', 5)
/* Define possible audio hardware configurations for
* old SunOS-style AUDIO_GETDEV ioctl */
#define AUDIO_DEV_UNKNOWN (0)
/* not defined */
#define AUDIO_DEV_AMD (1)
/* audioamd device */
#define AUDIO_DEV_SPEAKERBOX (2)
/* dbri device with speakerbox */
#define AUDIO_DEV_CODEC (3)
/* dbri device (internal speaker) */
#define AUDIO_DEV_CS4231 (5)
/* cs4231 device */
/*
* The following ioctl sets the audio device into an internal loopback mode,
* if the hardware supports this. The argument is TRUE to set loopback,
* FALSE to reset to normal operation. If the hardware does not support
* internal loopback, the ioctl should fail with EINVAL.
* Causes ADC data to be digitally mixed in and sent to the DAC.
*/
#define AUDIO_DIAG_LOOPBACK _IOW('A', 101, int)
#endif
/* _AUDIOIO_H_ */
include/asm-sparc/kbio.h
deleted
100644 → 0
View file @
e3d8b77b
#ifndef __LINUX_KBIO_H
#define __LINUX_KBIO_H
/* Return keyboard type */
#define KIOCTYPE _IOR('k', 9, int)
/* Return Keyboard layout */
#define KIOCLAYOUT _IOR('k', 20, int)
enum
{
TR_NONE
,
TR_ASCII
,
/* keyboard is in regular state */
TR_EVENT
,
/* keystrokes sent as firm events */
TR_UNTRANS_EVENT
/* EVENT+up and down+no translation */
};
/* Return the current keyboard translation */
#define KIOCGTRANS _IOR('k', 5, int)
/* Set the keyboard translation */
#define KIOCTRANS _IOW('k', 0, int)
/* Send a keyboard command */
#define KIOCCMD _IOW('k', 8, int)
/* Return if keystrokes are being sent to /dev/kbd */
/* Set routing of keystrokes to /dev/kbd */
#define KIOCSDIRECT _IOW('k', 10, int)
/* Set keyboard leds */
#define KIOCSLED _IOW('k', 14, unsigned char)
/* Get keyboard leds */
#define KIOCGLED _IOR('k', 15, unsigned char)
/* Used by KIOC[GS]RATE */
struct
kbd_rate
{
unsigned
char
delay
;
/* Delay in Hz before first repeat. */
unsigned
char
rate
;
/* In characters per second (0..50). */
};
/* Set keyboard rate */
#define KIOCSRATE _IOW('k', 40, struct kbd_rate)
/* Get keyboard rate */
#define KIOCGRATE _IOW('k', 41, struct kbd_rate)
/* Top bit records if the key is up or down */
#define KBD_UP 0x80
/* Usable information */
#define KBD_KEYMASK 0x7f
/* All keys up */
#define KBD_IDLE 0x75
#endif
/* __LINUX_KBIO_H */
include/asm-sparc/termios.h
View file @
d27ba47e
...
...
@@ -38,15 +38,6 @@ struct sunos_ttysize {
int
st_columns
;
/* Columns on the terminal */
};
/* Used for packet mode */
#define TIOCPKT_DATA 0
#define TIOCPKT_FLUSHREAD 1
#define TIOCPKT_FLUSHWRITE 2
#define TIOCPKT_STOP 4
#define TIOCPKT_START 8
#define TIOCPKT_NOSTOP 16
#define TIOCPKT_DOSTOP 32
struct
winsize
{
unsigned
short
ws_row
;
unsigned
short
ws_col
;
...
...
include/asm-sparc/vuid_event.h
deleted
100644 → 0
View file @
e3d8b77b
/* SunOS Virtual User Input Device (VUID) compatibility */
typedef
struct
firm_event
{
unsigned
short
id
;
/* tag for this event */
unsigned
char
pair_type
;
/* unused by X11 */
unsigned
char
pair
;
/* unused by X11 */
int
value
;
/* VKEY_UP, VKEY_DOWN or delta */
struct
timeval
time
;
}
Firm_event
;
enum
{
FE_PAIR_NONE
,
FE_PAIR_SET
,
FE_PAIR_DELTA
,
FE_PAIR_ABSOLUTE
};
/* VUID stream formats */
#define VUID_NATIVE 0
/* Native byte stream format */
#define VUID_FIRM_EVENT 1
/* send firm_event structures */
/* ioctls */
/* Set input device byte stream format (any of VUID_{NATIVE,FIRM_EVENT}) */
#define VUIDSFORMAT _IOW('v', 1, int)
/* Retrieve input device byte stream format */
#define VUIDGFORMAT _IOR('v', 2, int)
/* Possible tag values */
/* mouse buttons: */
#define MS_LEFT 0x7f20
#define MS_MIDDLE 0x7f21
#define MS_RIGHT 0x7f22
/* motion: */
#define LOC_X_DELTA 0x7f80
#define LOC_Y_DELTA 0x7f81
#define LOC_X_ABSOLUTE 0x7f82
/* X compat, unsupported */
#define LOC_Y_ABSOLUTE 0x7f83
/* X compat, unsupported */
#define VKEY_UP 0
#define VKEY_DOWN 1
include/asm-sparc64/audioio.h
deleted
100644 → 0
View file @
e3d8b77b
/*
* include/asm-sparc/audioio.h
*
* Sparc Audio Midlayer
* Copyright (C) 1996 Thomas K. Dyas (tdyas@noc.rutgers.edu)
*/
#ifndef _AUDIOIO_H_
#define _AUDIOIO_H_
/*
* SunOS/Solaris /dev/audio interface
*/
#if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2)
#include <linux/types.h>
#include <linux/time.h>
#include <linux/ioctl.h>
#endif
/*
* This structure contains state information for audio device IO streams.
*/
typedef
struct
audio_prinfo
{
/*
* The following values describe the audio data encoding.
*/
unsigned
int
sample_rate
;
/* samples per second */
unsigned
int
channels
;
/* number of interleaved channels */
unsigned
int
precision
;
/* bit-width of each sample */
unsigned
int
encoding
;
/* data encoding method */
/*
* The following values control audio device configuration
*/
unsigned
int
gain
;
/* gain level: 0 - 255 */
unsigned
int
port
;
/* selected I/O port (see below) */
unsigned
int
avail_ports
;
/* available I/O ports (see below) */
unsigned
int
_xxx
[
2
];
/* Reserved for future use */
unsigned
int
buffer_size
;
/* I/O buffer size */
/*
* The following values describe driver state
*/
unsigned
int
samples
;
/* number of samples converted */
unsigned
int
eof
;
/* End Of File counter (play only) */
unsigned
char
pause
;
/* non-zero for pause, zero to resume */
unsigned
char
error
;
/* non-zero if overflow/underflow */
unsigned
char
waiting
;
/* non-zero if a process wants access */
unsigned
char
balance
;
/* stereo channel balance */
unsigned
short
minordev
;
/*
* The following values are read-only state flags
*/
unsigned
char
open
;
/* non-zero if open access permitted */
unsigned
char
active
;
/* non-zero if I/O is active */
}
audio_prinfo_t
;
/*
* This structure describes the current state of the audio device.
*/
typedef
struct
audio_info
{
/*
* Per-stream information
*/
audio_prinfo_t
play
;
/* output status information */
audio_prinfo_t
record
;
/* input status information */
/*
* Per-unit/channel information
*/
unsigned
int
monitor_gain
;
/* input to output mix: 0 - 255 */
unsigned
char
output_muted
;
/* non-zero if output is muted */
unsigned
char
_xxx
[
3
];
/* Reserved for future use */
unsigned
int
_yyy
[
3
];
/* Reserved for future use */
}
audio_info_t
;
/*
* Audio encoding types
*/
#define AUDIO_ENCODING_NONE (0)
/* no encoding assigned */
#define AUDIO_ENCODING_ULAW (1)
/* u-law encoding */
#define AUDIO_ENCODING_ALAW (2)
/* A-law encoding */
#define AUDIO_ENCODING_LINEAR (3)
/* Linear PCM encoding */
#define AUDIO_ENCODING_FLOAT (4)
/* IEEE float (-1. <-> +1.) */
#define AUDIO_ENCODING_DVI (104)
/* DVI ADPCM */
#define AUDIO_ENCODING_LINEAR8 (105)
/* 8 bit UNSIGNED */
#define AUDIO_ENCODING_LINEARLE (106)
/* Linear PCM LE encoding */
/*
* These ranges apply to record, play, and monitor gain values
*/
#define AUDIO_MIN_GAIN (0)
/* minimum gain value */
#define AUDIO_MAX_GAIN (255)
/* maximum gain value */
/*
* These values apply to the balance field to adjust channel gain values
*/
#define AUDIO_LEFT_BALANCE (0)
/* left channel only */
#define AUDIO_MID_BALANCE (32)
/* equal left/right channel */
#define AUDIO_RIGHT_BALANCE (64)
/* right channel only */
#define AUDIO_BALANCE_SHIFT (3)
/*
* Generic minimum/maximum limits for number of channels, both modes
*/
#define AUDIO_MIN_PLAY_CHANNELS (1)
#define AUDIO_MAX_PLAY_CHANNELS (4)
#define AUDIO_MIN_REC_CHANNELS (1)
#define AUDIO_MAX_REC_CHANNELS (4)
/*
* Generic minimum/maximum limits for sample precision
*/
#define AUDIO_MIN_PLAY_PRECISION (8)
#define AUDIO_MAX_PLAY_PRECISION (32)
#define AUDIO_MIN_REC_PRECISION (8)
#define AUDIO_MAX_REC_PRECISION (32)
/*
* Define some convenient names for typical audio ports
*/
/*
* output ports (several may be enabled simultaneously)
*/
#define AUDIO_SPEAKER 0x01
/* output to built-in speaker */
#define AUDIO_HEADPHONE 0x02
/* output to headphone jack */
#define AUDIO_LINE_OUT 0x04
/* output to line out */
/*
* input ports (usually only one at a time)
*/
#define AUDIO_MICROPHONE 0x01
/* input from microphone */
#define AUDIO_LINE_IN 0x02
/* input from line in */
#define AUDIO_CD 0x04
/* input from on-board CD inputs */
#define AUDIO_INTERNAL_CD_IN AUDIO_CD
/* input from internal CDROM */
#define AUDIO_ANALOG_LOOPBACK 0x40
/* input from output */
/*
* This macro initializes an audio_info structure to 'harmless' values.
* Note that (~0) might not be a harmless value for a flag that was
* a signed int.
*/
#define AUDIO_INITINFO(i) { \
unsigned int *__x__; \
for (__x__ = (unsigned int *)(i); \
(char *) __x__ < (((char *)(i)) + sizeof (audio_info_t)); \
*__x__++ = ~0); \
}
/*
* These allow testing for what the user wants to set
*/
#define AUD_INITVALUE (~0)
#define Modify(X) ((unsigned int)(X) != AUD_INITVALUE)
#define Modifys(X) ((X) != (unsigned short)AUD_INITVALUE)
#define Modifyc(X) ((X) != (unsigned char)AUD_INITVALUE)
/*
* Parameter for the AUDIO_GETDEV ioctl to determine current
* audio devices.
*/
#define MAX_AUDIO_DEV_LEN (16)
typedef
struct
audio_device
{
char
name
[
MAX_AUDIO_DEV_LEN
];
char
version
[
MAX_AUDIO_DEV_LEN
];
char
config
[
MAX_AUDIO_DEV_LEN
];
}
audio_device_t
;
/*
* Ioctl calls for the audio device.
*/
/*
* AUDIO_GETINFO retrieves the current state of the audio device.
*
* AUDIO_SETINFO copies all fields of the audio_info structure whose
* values are not set to the initialized value (-1) to the device state.
* It performs an implicit AUDIO_GETINFO to return the new state of the
* device. Note that the record.samples and play.samples fields are set
* to the last value before the AUDIO_SETINFO took effect. This allows
* an application to reset the counters while atomically retrieving the
* last value.
*
* AUDIO_DRAIN suspends the calling process until the write buffers are
* empty.
*
* AUDIO_GETDEV returns a structure of type audio_device_t which contains
* three strings. The string "name" is a short identifying string (for
* example, the SBus Fcode name string), the string "version" identifies
* the current version of the device, and the "config" string identifies
* the specific configuration of the audio stream. All fields are
* device-dependent -- see the device specific manual pages for details.
*
* AUDIO_GETDEV_SUNOS returns a number which is an audio device defined
* herein (making it not too portable)
*
* AUDIO_FLUSH stops all playback and recording, clears all queued buffers,
* resets error counters, and restarts recording and playback as appropriate
* for the current sampling mode.
*/
#define AUDIO_GETINFO _IOR('A', 1, audio_info_t)
#define AUDIO_SETINFO _IOWR('A', 2, audio_info_t)
#define AUDIO_DRAIN _IO('A', 3)
#define AUDIO_GETDEV _IOR('A', 4, audio_device_t)
#define AUDIO_GETDEV_SUNOS _IOR('A', 4, int)
#define AUDIO_FLUSH _IO('A', 5)
/* Define possible audio hardware configurations for
* old SunOS-style AUDIO_GETDEV ioctl */
#define AUDIO_DEV_UNKNOWN (0)
/* not defined */
#define AUDIO_DEV_AMD (1)
/* audioamd device */
#define AUDIO_DEV_SPEAKERBOX (2)
/* dbri device with speakerbox */
#define AUDIO_DEV_CODEC (3)
/* dbri device (internal speaker) */
#define AUDIO_DEV_CS4231 (5)
/* cs4231 device */
/*
* The following ioctl sets the audio device into an internal loopback mode,
* if the hardware supports this. The argument is TRUE to set loopback,
* FALSE to reset to normal operation. If the hardware does not support
* internal loopback, the ioctl should fail with EINVAL.
* Causes ADC data to be digitally mixed in and sent to the DAC.
*/
#define AUDIO_DIAG_LOOPBACK _IOW('A', 101, int)
#endif
/* _AUDIOIO_H_ */
include/asm-sparc64/ebus.h
View file @
d27ba47e
...
...
@@ -79,6 +79,7 @@ extern int ebus_dma_request(struct ebus_dma_info *p, dma_addr_t bus_addr,
size_t
len
);
extern
void
ebus_dma_prepare
(
struct
ebus_dma_info
*
p
,
int
write
);
extern
unsigned
int
ebus_dma_residue
(
struct
ebus_dma_info
*
p
);
extern
unsigned
int
ebus_dma_addr
(
struct
ebus_dma_info
*
p
);
extern
void
ebus_dma_enable
(
struct
ebus_dma_info
*
p
,
int
on
);
extern
struct
linux_ebus
*
ebus_chain
;
...
...
include/asm-sparc64/kbio.h
deleted
100644 → 0
View file @
e3d8b77b
#ifndef __LINUX_KBIO_H
#define __LINUX_KBIO_H
/* Return keyboard type */
#define KIOCTYPE _IOR('k', 9, int)
/* Return Keyboard layout */
#define KIOCLAYOUT _IOR('k', 20, int)
enum
{
TR_NONE
,
TR_ASCII
,
/* keyboard is in regular state */
TR_EVENT
,
/* keystrokes sent as firm events */
TR_UNTRANS_EVENT
/* EVENT+up and down+no translation */
};
/* Return the current keyboard translation */
#define KIOCGTRANS _IOR('k', 5, int)
/* Set the keyboard translation */
#define KIOCTRANS _IOW('k', 0, int)
/* Send a keyboard command */
#define KIOCCMD _IOW('k', 8, int)
/* Return if keystrokes are being sent to /dev/kbd */
/* Set routing of keystrokes to /dev/kbd */
#define KIOCSDIRECT _IOW('k', 10, int)
/* Set keyboard leds */
#define KIOCSLED _IOW('k', 14, unsigned char)
/* Get keyboard leds */
#define KIOCGLED _IOR('k', 15, unsigned char)
/* Used by KIOC[GS]RATE */
struct
kbd_rate
{
unsigned
char
delay
;
/* Delay in Hz before first repeat. */
unsigned
char
rate
;
/* In characters per second (0..50). */
};
/* Set keyboard rate */
#define KIOCSRATE _IOW('k', 40, struct kbd_rate)
/* Get keyboard rate */
#define KIOCGRATE _IOW('k', 41, struct kbd_rate)
/* Top bit records if the key is up or down */
#define KBD_UP 0x80
/* Usable information */
#define KBD_KEYMASK 0x7f
/* All keys up */
#define KBD_IDLE 0x75
#endif
/* __LINUX_KBIO_H */
include/asm-sparc64/mmu_context.h
View file @
d27ba47e
...
...
@@ -87,37 +87,35 @@ extern void __flush_tlb_mm(unsigned long, unsigned long);
static
inline
void
switch_mm
(
struct
mm_struct
*
old_mm
,
struct
mm_struct
*
mm
,
struct
task_struct
*
tsk
)
{
unsigned
long
ctx_valid
;
int
cpu
;
/* Note: page_table_lock is used here to serialize switch_mm
* and activate_mm, and their calls to get_new_mmu_context.
* This use of page_table_lock is unrelated to its other uses.
*/
spin_lock
(
&
mm
->
page_table_lock
);
if
(
CTX_VALID
(
mm
->
context
))
ctx_valid
=
1
;
else
ctx_valid
=
0
;
ctx_valid
=
CTX_VALID
(
mm
->
context
);
if
(
!
ctx_valid
)
get_new_mmu_context
(
mm
);
spin_unlock
(
&
mm
->
page_table_lock
)
;
if
(
!
ctx_valid
||
(
old_mm
!=
mm
))
{
if
(
!
ctx_valid
)
get_new_mmu_context
(
mm
);
load_secondary_context
(
mm
);
reload_tlbmiss_state
(
tsk
,
mm
);
}
{
int
cpu
=
smp_processor_id
();
/* Even if (mm == old_mm) we _must_ check
* the cpu_vm_mask. If we do not we could
* corrupt the TLB state because of how
* smp_flush_tlb_{page,range,mm} on sparc64
* and lazy tlb switches work. -DaveM
*/
if
(
!
ctx_valid
||
!
cpu_isset
(
cpu
,
mm
->
cpu_vm_mask
))
{
cpu_set
(
cpu
,
mm
->
cpu_vm_mask
);
__flush_tlb_mm
(
CTX_HWBITS
(
mm
->
context
),
SECONDARY_CONTEXT
);
}
/* Even if (mm == old_mm) we _must_ check
* the cpu_vm_mask. If we do not we could
* corrupt the TLB state because of how
* smp_flush_tlb_{page,range,mm} on sparc64
* and lazy tlb switches work. -DaveM
*/
cpu
=
smp_processor_id
();
if
(
!
ctx_valid
||
!
cpu_isset
(
cpu
,
mm
->
cpu_vm_mask
))
{
cpu_set
(
cpu
,
mm
->
cpu_vm_mask
);
__flush_tlb_mm
(
CTX_HWBITS
(
mm
->
context
),
SECONDARY_CONTEXT
);
}
spin_unlock
(
&
mm
->
page_table_lock
);
}
#define deactivate_mm(tsk,mm) do { } while (0)
...
...
@@ -127,6 +125,10 @@ static inline void activate_mm(struct mm_struct *active_mm, struct mm_struct *mm
{
int
cpu
;
/* Note: page_table_lock is used here to serialize switch_mm
* and activate_mm, and their calls to get_new_mmu_context.
* This use of page_table_lock is unrelated to its other uses.
*/
spin_lock
(
&
mm
->
page_table_lock
);
if
(
!
CTX_VALID
(
mm
->
context
))
get_new_mmu_context
(
mm
);
...
...
include/asm-sparc64/termios.h
View file @
d27ba47e
...
...
@@ -38,15 +38,6 @@ struct sunos_ttysize {
int
st_columns
;
/* Columns on the terminal */
};
/* Used for packet mode */
#define TIOCPKT_DATA 0
#define TIOCPKT_FLUSHREAD 1
#define TIOCPKT_FLUSHWRITE 2
#define TIOCPKT_STOP 4
#define TIOCPKT_START 8
#define TIOCPKT_NOSTOP 16
#define TIOCPKT_DOSTOP 32
struct
winsize
{
unsigned
short
ws_row
;
unsigned
short
ws_col
;
...
...
include/asm-sparc64/tlb.h
View file @
d27ba47e
...
...
@@ -58,11 +58,9 @@ static inline struct mmu_gather *tlb_gather_mmu(struct mm_struct *mm, unsigned i
static
inline
void
tlb_flush_mmu
(
struct
mmu_gather
*
mp
)
{
if
(
mp
->
need_flush
)
{
free_pages_and_swap_cache
(
mp
->
pages
,
mp
->
pages_nr
);
mp
->
pages_nr
=
0
;
mp
->
need_flush
=
0
;
if
(
!
tlb_fast_mode
(
mp
))
{
free_pages_and_swap_cache
(
mp
->
pages
,
mp
->
pages_nr
);
mp
->
pages_nr
=
0
;
}
}
}
...
...
@@ -78,11 +76,9 @@ static inline void tlb_finish_mmu(struct mmu_gather *mp, unsigned long start, un
{
tlb_flush_mmu
(
mp
);
if
(
mp
->
fullmm
)
{
if
(
CTX_VALID
(
mp
->
mm
->
context
))
do_flush_tlb_mm
(
mp
->
mm
);
if
(
mp
->
fullmm
)
mp
->
fullmm
=
0
;
}
else
else
flush_tlb_pending
();
/* keep the page table cache within bounds */
...
...
@@ -93,11 +89,11 @@ static inline void tlb_finish_mmu(struct mmu_gather *mp, unsigned long start, un
static
inline
void
tlb_remove_page
(
struct
mmu_gather
*
mp
,
struct
page
*
page
)
{
mp
->
need_flush
=
1
;
if
(
tlb_fast_mode
(
mp
))
{
free_page_and_swap_cache
(
page
);
return
;
}
mp
->
need_flush
=
1
;
mp
->
pages
[
mp
->
pages_nr
++
]
=
page
;
if
(
mp
->
pages_nr
>=
FREE_PTE_NR
)
tlb_flush_mmu
(
mp
);
...
...
include/asm-sparc64/vuid_event.h
deleted
100644 → 0
View file @
e3d8b77b
/* SunOS Virtual User Input Device (VUID) compatibility */
typedef
struct
firm_event
{
unsigned
short
id
;
/* tag for this event */
unsigned
char
pair_type
;
/* unused by X11 */
unsigned
char
pair
;
/* unused by X11 */
int
value
;
/* VKEY_UP, VKEY_DOWN or delta */
struct
timeval
time
;
}
Firm_event
;
enum
{
FE_PAIR_NONE
,
FE_PAIR_SET
,
FE_PAIR_DELTA
,
FE_PAIR_ABSOLUTE
};
/* VUID stream formats */
#define VUID_NATIVE 0
/* Native byte stream format */
#define VUID_FIRM_EVENT 1
/* send firm_event structures */
/* ioctls */
/* Set input device byte stream format (any of VUID_{NATIVE,FIRM_EVENT}) */
#define VUIDSFORMAT _IOW('v', 1, int)
/* Retrieve input device byte stream format */
#define VUIDGFORMAT _IOR('v', 2, int)
/* Possible tag values */
/* mouse buttons: */
#define MS_LEFT 0x7f20
#define MS_MIDDLE 0x7f21
#define MS_RIGHT 0x7f22
/* motion: */
#define LOC_X_DELTA 0x7f80
#define LOC_Y_DELTA 0x7f81
#define LOC_X_ABSOLUTE 0x7f82
/* X compat, unsupported */
#define LOC_Y_ABSOLUTE 0x7f83
/* X compat, unsupported */
#define VKEY_UP 0
#define VKEY_DOWN 1
kernel/fork.c
View file @
d27ba47e
...
...
@@ -470,13 +470,6 @@ static int copy_mm(unsigned long clone_flags, struct task_struct * tsk)
if
(
clone_flags
&
CLONE_VM
)
{
atomic_inc
(
&
oldmm
->
mm_users
);
mm
=
oldmm
;
/*
* There are cases where the PTL is held to ensure no
* new threads start up in user mode using an mm, which
* allows optimizing out ipis; the tlb_gather_mmu code
* is an example.
*/
spin_unlock_wait
(
&
oldmm
->
page_table_lock
);
goto
good_mm
;
}
...
...
sound/sparc/cs4231.c
View file @
d27ba47e
...
...
@@ -61,13 +61,37 @@ MODULE_DESCRIPTION("Sun CS4231");
MODULE_LICENSE
(
"GPL"
);
MODULE_SUPPORTED_DEVICE
(
"{{Sun,CS4231}}"
);
typedef
struct
snd_cs4231
{
spinlock_t
lock
;
void
__iomem
*
port
;
#ifdef SBUS_SUPPORT
typedef
struct
sbus_dma_info
{
spinlock_t
lock
;
int
dir
;
void
__iomem
*
regs
;
}
sbus_dma_info_t
;
#endif
typedef
struct
snd_cs4231
cs4231_t
;
typedef
struct
cs4231_dma_control
{
void
(
*
prepare
)(
struct
cs4231_dma_control
*
dma_cont
,
int
dir
);
void
(
*
enable
)(
struct
cs4231_dma_control
*
dma_cont
,
int
on
);
int
(
*
request
)(
struct
cs4231_dma_control
*
dma_cont
,
dma_addr_t
bus_addr
,
size_t
len
);
unsigned
int
(
*
address
)(
struct
cs4231_dma_control
*
dma_cont
);
void
(
*
reset
)(
cs4231_t
*
chip
);
void
(
*
preallocate
)(
cs4231_t
*
chip
,
snd_pcm_t
*
pcm
);
#ifdef EBUS_SUPPORT
struct
ebus_dma_info
eb2c
;
struct
ebus_dma_info
eb2p
;
struct
ebus_dma_info
ebus_info
;
#endif
#ifdef SBUS_SUPPORT
struct
sbus_dma_info
sbus_info
;
#endif
}
cs4231_dma_control_t
;
struct
snd_cs4231
{
spinlock_t
lock
;
void
__iomem
*
port
;
cs4231_dma_control_t
p_dma
;
cs4231_dma_control_t
c_dma
;
u32
flags
;
#define CS4231_FLAG_EBUS 0x00000001
...
...
@@ -106,7 +130,7 @@ typedef struct snd_cs4231 {
unsigned
int
irq
[
2
];
unsigned
int
regs_size
;
struct
snd_cs4231
*
next
;
}
cs4231_t
;
};
static
cs4231_t
*
cs4231_list
;
...
...
@@ -251,6 +275,15 @@ static cs4231_t *cs4231_list;
#define APCPNVA 0x38UL
/* APC Play DMA Next Address */
#define APCPNC 0x3cUL
/* APC Play Next Count */
/* Defines for SBUS DMA-routines */
#define APCVA 0x0UL
/* APC DMA Address */
#define APCC 0x4UL
/* APC Count */
#define APCNVA 0x8UL
/* APC DMA Next Address */
#define APCNC 0xcUL
/* APC Next Count */
#define APC_PLAY 0x30UL
/* Play registers start at 0x30 */
#define APC_RECORD 0x20UL
/* Record registers start at 0x20 */
/* APCCSR bits */
#define APC_INT_PENDING 0x800000
/* Interrupt Pending */
...
...
@@ -569,8 +602,7 @@ static void snd_cs4231_mce_down(cs4231_t *chip)
spin_unlock_irqrestore
(
&
chip
->
lock
,
flags
);
}
#ifdef EBUS_SUPPORT
static
void
snd_cs4231_ebus_advance_dma
(
struct
ebus_dma_info
*
p
,
snd_pcm_substream_t
*
substream
,
unsigned
int
*
periods_sent
)
static
void
snd_cs4231_advance_dma
(
struct
cs4231_dma_control
*
dma_cont
,
snd_pcm_substream_t
*
substream
,
unsigned
int
*
periods_sent
)
{
snd_pcm_runtime_t
*
runtime
=
substream
->
runtime
;
...
...
@@ -581,129 +613,41 @@ static void snd_cs4231_ebus_advance_dma(struct ebus_dma_info *p, snd_pcm_substre
if
(
period_size
>=
(
1
<<
24
))
BUG
();
if
(
ebus_dma_request
(
p
,
runtime
->
dma_addr
+
offset
,
period_size
))
if
(
dma_cont
->
request
(
dma_cont
,
runtime
->
dma_addr
+
offset
,
period_size
))
return
;
(
*
periods_sent
)
=
((
*
periods_sent
)
+
1
)
%
runtime
->
periods
;
}
}
#endif
#ifdef SBUS_SUPPORT
static
void
snd_cs4231_sbus_advance_dma
(
snd_pcm_substream_t
*
substream
,
unsigned
int
*
periods_sent
)
{
cs4231_t
*
chip
=
snd_pcm_substream_chip
(
substream
);
snd_pcm_runtime_t
*
runtime
=
substream
->
runtime
;
unsigned
int
period_size
=
snd_pcm_lib_period_bytes
(
substream
);
unsigned
int
offset
=
period_size
*
(
*
periods_sent
%
runtime
->
periods
);
if
(
runtime
->
period_size
>
0xffff
+
1
)
BUG
();
switch
(
substream
->
stream
)
{
case
SNDRV_PCM_STREAM_PLAYBACK
:
sbus_writel
(
runtime
->
dma_addr
+
offset
,
chip
->
port
+
APCPNVA
);
sbus_writel
(
period_size
,
chip
->
port
+
APCPNC
);
break
;
case
SNDRV_PCM_STREAM_CAPTURE
:
sbus_writel
(
runtime
->
dma_addr
+
offset
,
chip
->
port
+
APCCNVA
);
sbus_writel
(
period_size
,
chip
->
port
+
APCCNC
);
break
;
}
(
*
periods_sent
)
=
(
*
periods_sent
+
1
)
%
runtime
->
periods
;
}
#endif
static
void
cs4231_dma_trigger
(
snd_pcm_substream_t
*
substream
,
unsigned
int
what
,
int
on
)
{
cs4231_t
*
chip
=
snd_pcm_substream_chip
(
substream
);
cs4231_dma_control_t
*
dma_cont
;
#ifdef EBUS_SUPPORT
if
(
chip
->
flags
&
CS4231_FLAG_EBUS
)
{
if
(
what
&
CS4231_PLAYBACK_ENABLE
)
{
if
(
on
)
{
ebus_dma_prepare
(
&
chip
->
eb2p
,
0
);
ebus_dma_enable
(
&
chip
->
eb2p
,
1
);
snd_cs4231_ebus_advance_dma
(
&
chip
->
eb2p
,
chip
->
playback_substream
,
&
chip
->
p_periods_sent
);
}
else
{
ebus_dma_enable
(
&
chip
->
eb2p
,
0
);
}
}
if
(
what
&
CS4231_RECORD_ENABLE
)
{
if
(
on
)
{
ebus_dma_prepare
(
&
chip
->
eb2c
,
1
);
ebus_dma_enable
(
&
chip
->
eb2c
,
1
);
snd_cs4231_ebus_advance_dma
(
&
chip
->
eb2c
,
chip
->
capture_substream
,
&
chip
->
c_periods_sent
);
}
else
{
ebus_dma_enable
(
&
chip
->
eb2c
,
0
);
}
}
}
else
{
#endif
#ifdef SBUS_SUPPORT
u32
csr
=
sbus_readl
(
chip
->
port
+
APCCSR
);
/* I don't know why, but on sbus the period counter must
* only start counting after the first period is sent.
* Therefore this dummy thing.
*/
unsigned
int
dummy
=
0
;
switch
(
what
)
{
case
CS4231_PLAYBACK_ENABLE
:
if
(
what
&
CS4231_PLAYBACK_ENABLE
)
{
dma_cont
=
&
chip
->
p_dma
;
if
(
on
)
{
csr
&=
~
APC_XINT_PLAY
;
sbus_writel
(
csr
,
chip
->
port
+
APCCSR
);
csr
&=
~
APC_PPAUSE
;
sbus_writel
(
csr
,
chip
->
port
+
APCCSR
);
snd_cs4231_sbus_advance_dma
(
substream
,
&
dummy
);
csr
|=
APC_GENL_INT
|
APC_PLAY_INT
|
APC_XINT_ENA
|
APC_XINT_PLAY
|
APC_XINT_EMPT
|
APC_XINT_GENL
|
APC_XINT_PENA
|
APC_PDMA_READY
;
sbus_writel
(
csr
,
chip
->
port
+
APCCSR
);
dma_cont
->
prepare
(
dma_cont
,
0
);
dma_cont
->
enable
(
dma_cont
,
1
);
snd_cs4231_advance_dma
(
dma_cont
,
chip
->
playback_substream
,
&
chip
->
p_periods_sent
);
}
else
{
csr
|=
APC_PPAUSE
;
sbus_writel
(
csr
,
chip
->
port
+
APCCSR
);
csr
&=
~
APC_PDMA_READY
;
sbus_writel
(
csr
,
chip
->
port
+
APCCSR
);
dma_cont
->
enable
(
dma_cont
,
0
);
}
break
;
case
CS4231_RECORD_ENABLE
:
}
if
(
what
&
CS4231_RECORD_ENABLE
)
{
dma_cont
=
&
chip
->
c_dma
;
if
(
on
)
{
csr
&=
~
APC_XINT_CAPT
;
sbus_writel
(
csr
,
chip
->
port
+
APCCSR
);
csr
&=
~
APC_CPAUSE
;
sbus_writel
(
csr
,
chip
->
port
+
APCCSR
);
snd_cs4231_sbus_advance_dma
(
substream
,
&
dummy
);
csr
|=
APC_GENL_INT
|
APC_CAPT_INT
|
APC_XINT_ENA
|
APC_XINT_CAPT
|
APC_XINT_CEMP
|
APC_XINT_GENL
|
APC_CDMA_READY
;
sbus_writel
(
csr
,
chip
->
port
+
APCCSR
);
dma_cont
->
prepare
(
dma_cont
,
1
);
dma_cont
->
enable
(
dma_cont
,
1
);
snd_cs4231_advance_dma
(
dma_cont
,
chip
->
capture_substream
,
&
chip
->
c_periods_sent
);
}
else
{
csr
|=
APC_CPAUSE
;
sbus_writel
(
csr
,
chip
->
port
+
APCCSR
);
csr
&=
~
APC_CDMA_READY
;
sbus_writel
(
csr
,
chip
->
port
+
APCCSR
);
dma_cont
->
enable
(
dma_cont
,
0
);
}
break
;
}
#endif
#ifdef EBUS_SUPPORT
}
#endif
}
static
int
snd_cs4231_trigger
(
snd_pcm_substream_t
*
substream
,
int
cmd
)
...
...
@@ -1136,10 +1080,7 @@ static int snd_cs4231_playback_prepare(snd_pcm_substream_t *substream)
if
(
runtime
->
period_size
>
0xffff
+
1
)
BUG
();
snd_cs4231_out
(
chip
,
CS4231_PLY_LWR_CNT
,
(
runtime
->
period_size
-
1
)
&
0x00ff
);
snd_cs4231_out
(
chip
,
CS4231_PLY_UPR_CNT
,
(
runtime
->
period_size
-
1
)
>>
8
&
0x00ff
);
chip
->
p_periods_sent
=
0
;
spin_unlock_irqrestore
(
&
chip
->
lock
,
flags
);
return
0
;
...
...
@@ -1171,16 +1112,14 @@ static int snd_cs4231_capture_hw_free(snd_pcm_substream_t *substream)
static
int
snd_cs4231_capture_prepare
(
snd_pcm_substream_t
*
substream
)
{
cs4231_t
*
chip
=
snd_pcm_substream_chip
(
substream
);
snd_pcm_runtime_t
*
runtime
=
substream
->
runtime
;
unsigned
long
flags
;
spin_lock_irqsave
(
&
chip
->
lock
,
flags
);
chip
->
image
[
CS4231_IFACE_CTRL
]
&=
~
(
CS4231_RECORD_ENABLE
|
CS4231_RECORD_PIO
);
snd_cs4231_out
(
chip
,
CS4231_REC_LWR_CNT
,
(
runtime
->
period_size
-
1
)
&
0x00ff
);
snd_cs4231_out
(
chip
,
CS4231_REC_LWR_CNT
,
(
runtime
->
period_size
-
1
)
>>
8
&
0x00ff
);
chip
->
c_periods_sent
=
0
;
spin_unlock_irqrestore
(
&
chip
->
lock
,
flags
);
return
0
;
...
...
@@ -1199,134 +1138,55 @@ static void snd_cs4231_overrange(cs4231_t *chip)
chip
->
capture_substream
->
runtime
->
overrange
++
;
}
static
irqreturn_t
snd_cs4231_generic_interrupt
(
cs4231_t
*
chip
)
{
unsigned
long
flags
;
unsigned
char
status
;
/*This is IRQ is not raised by the cs4231*/
if
(
!
(
__cs4231_readb
(
chip
,
CS4231P
(
chip
,
STATUS
))
&
CS4231_GLOBALIRQ
))
return
IRQ_NONE
;
status
=
snd_cs4231_in
(
chip
,
CS4231_IRQ_STATUS
);
if
(
status
&
CS4231_TIMER_IRQ
)
{
if
(
chip
->
timer
)
snd_timer_interrupt
(
chip
->
timer
,
chip
->
timer
->
sticks
);
}
if
(
status
&
CS4231_RECORD_IRQ
)
snd_cs4231_overrange
(
chip
);
/* ACK the CS4231 interrupt. */
spin_lock_irqsave
(
&
chip
->
lock
,
flags
);
snd_cs4231_outm
(
chip
,
CS4231_IRQ_STATUS
,
~
CS4231_ALL_IRQS
|
~
status
,
0
);
spin_unlock_irqrestore
(
&
chip
->
lock
,
flags
);
return
0
;
}
#ifdef SBUS_SUPPORT
static
irqreturn_t
snd_cs4231_sbus_interrupt
(
int
irq
,
void
*
dev_id
,
struct
pt_regs
*
regs
)
{
cs4231_t
*
chip
=
dev_id
;
/* ACK the APC interrupt. */
u32
csr
=
sbus_readl
(
chip
->
port
+
APCCSR
);
sbus_writel
(
csr
,
chip
->
port
+
APCCSR
);
if
((
chip
->
image
[
CS4231_IFACE_CTRL
]
&
CS4231_PLAYBACK_ENABLE
)
&&
(
csr
&
APC_PLAY_INT
)
&&
(
csr
&
APC_XINT_PNVA
)
&&
!
(
csr
&
APC_XINT_EMPT
))
{
snd_cs4231_sbus_advance_dma
(
chip
->
playback_substream
,
&
chip
->
p_periods_sent
);
snd_pcm_period_elapsed
(
chip
->
playback_substream
);
}
if
((
chip
->
image
[
CS4231_IFACE_CTRL
]
&
CS4231_RECORD_ENABLE
)
&&
(
csr
&
APC_CAPT_INT
)
&&
(
csr
&
APC_XINT_CNVA
))
{
snd_cs4231_sbus_advance_dma
(
chip
->
capture_substream
,
&
chip
->
c_periods_sent
);
snd_pcm_period_elapsed
(
chip
->
capture_substream
);
}
return
snd_cs4231_generic_interrupt
(
chip
);
}
#endif
#ifdef EBUS_SUPPORT
static
void
snd_cs4231_ebus_play_callback
(
struct
ebus_dma_info
*
p
,
int
event
,
void
*
cookie
)
static
void
snd_cs4231_play_callback
(
cs4231_t
*
cookie
)
{
cs4231_t
*
chip
=
cookie
;
if
(
chip
->
image
[
CS4231_IFACE_CTRL
]
&
CS4231_PLAYBACK_ENABLE
)
{
snd_pcm_period_elapsed
(
chip
->
playback_substream
);
snd_cs4231_
ebus_advance_dma
(
p
,
chip
->
playback_substream
,
snd_cs4231_
advance_dma
(
&
chip
->
p_dma
,
chip
->
playback_substream
,
&
chip
->
p_periods_sent
);
}
}
static
void
snd_cs4231_
ebus_capture_callback
(
struct
ebus_dma_info
*
p
,
int
event
,
void
*
cookie
)
static
void
snd_cs4231_
capture_callback
(
cs4231_t
*
cookie
)
{
cs4231_t
*
chip
=
cookie
;
if
(
chip
->
image
[
CS4231_IFACE_CTRL
]
&
CS4231_RECORD_ENABLE
)
{
snd_pcm_period_elapsed
(
chip
->
capture_substream
);
snd_cs4231_
ebus_advance_dma
(
p
,
chip
->
capture_substream
,
snd_cs4231_
advance_dma
(
&
chip
->
c_dma
,
chip
->
capture_substream
,
&
chip
->
c_periods_sent
);
}
}
#endif
static
snd_pcm_uframes_t
snd_cs4231_playback_pointer
(
snd_pcm_substream_t
*
substream
)
{
cs4231_t
*
chip
=
snd_pcm_substream_chip
(
substream
);
size_t
ptr
,
residue
,
period_bytes
;
cs4231_dma_control_t
*
dma_cont
=
&
chip
->
p_dma
;
size_t
ptr
;
if
(
!
(
chip
->
image
[
CS4231_IFACE_CTRL
]
&
CS4231_PLAYBACK_ENABLE
))
return
0
;
period_bytes
=
snd_pcm_lib_period_bytes
(
substream
);
ptr
=
period_bytes
*
chip
->
p_periods_sent
;
#ifdef EBUS_SUPPORT
if
(
chip
->
flags
&
CS4231_FLAG_EBUS
)
{
residue
=
ebus_dma_residue
(
&
chip
->
eb2p
);
}
else
{
#endif
#ifdef SBUS_SUPPORT
residue
=
sbus_readl
(
chip
->
port
+
APCPC
);
#endif
#ifdef EBUS_SUPPORT
}
#endif
ptr
+=
period_bytes
-
residue
;
ptr
=
dma_cont
->
address
(
dma_cont
);
if
(
ptr
!=
0
)
ptr
-=
substream
->
runtime
->
dma_addr
;
return
bytes_to_frames
(
substream
->
runtime
,
ptr
);
}
static
snd_pcm_uframes_t
snd_cs4231_capture_pointer
(
snd_pcm_substream_t
*
substream
)
{
cs4231_t
*
chip
=
snd_pcm_substream_chip
(
substream
);
size_t
ptr
,
residue
,
period_bytes
;
cs4231_dma_control_t
*
dma_cont
=
&
chip
->
c_dma
;
size_t
ptr
;
if
(
!
(
chip
->
image
[
CS4231_IFACE_CTRL
]
&
CS4231_RECORD_ENABLE
))
return
0
;
period_bytes
=
snd_pcm_lib_period_bytes
(
substream
);
ptr
=
period_bytes
*
chip
->
c_periods_sent
;
#ifdef EBUS_SUPPORT
if
(
chip
->
flags
&
CS4231_FLAG_EBUS
)
{
residue
=
ebus_dma_residue
(
&
chip
->
eb2c
);
}
else
{
#endif
#ifdef SBUS_SUPPORT
residue
=
sbus_readl
(
chip
->
port
+
APCCC
);
#endif
#ifdef EBUS_SUPPORT
}
#endif
ptr
+=
period_bytes
-
residue
;
ptr
=
dma_cont
->
address
(
dma_cont
);
if
(
ptr
!=
0
)
ptr
-=
substream
->
runtime
->
dma_addr
;
return
bytes_to_frames
(
substream
->
runtime
,
ptr
);
}
...
...
@@ -1362,30 +1222,8 @@ static int snd_cs4231_probe(cs4231_t *chip)
spin_lock_irqsave
(
&
chip
->
lock
,
flags
);
/* Reset DMA engine. */
#ifdef EBUS_SUPPORT
if
(
chip
->
flags
&
CS4231_FLAG_EBUS
)
{
/* Done by ebus_dma_register */
}
else
{
#endif
#ifdef SBUS_SUPPORT
sbus_writel
(
APC_CHIP_RESET
,
chip
->
port
+
APCCSR
);
sbus_writel
(
0x00
,
chip
->
port
+
APCCSR
);
sbus_writel
(
sbus_readl
(
chip
->
port
+
APCCSR
)
|
APC_CDC_RESET
,
chip
->
port
+
APCCSR
);
udelay
(
20
);
sbus_writel
(
sbus_readl
(
chip
->
port
+
APCCSR
)
&
~
APC_CDC_RESET
,
chip
->
port
+
APCCSR
);
sbus_writel
(
sbus_readl
(
chip
->
port
+
APCCSR
)
|
(
APC_XINT_ENA
|
APC_XINT_PENA
|
APC_XINT_CENA
),
chip
->
port
+
APCCSR
);
#endif
#ifdef EBUS_SUPPORT
}
#endif
/* Reset DMA engine (sbus only). */
chip
->
p_dma
.
reset
(
chip
);
__cs4231_readb
(
chip
,
CS4231P
(
chip
,
STATUS
));
/* clear any pendings IRQ */
__cs4231_writeb
(
chip
,
0
,
CS4231P
(
chip
,
STATUS
));
...
...
@@ -1505,8 +1343,8 @@ static int snd_cs4231_playback_close(snd_pcm_substream_t *substream)
{
cs4231_t
*
chip
=
snd_pcm_substream_chip
(
substream
);
chip
->
playback_substream
=
NULL
;
snd_cs4231_close
(
chip
,
CS4231_MODE_PLAY
);
chip
->
playback_substream
=
NULL
;
return
0
;
}
...
...
@@ -1515,8 +1353,8 @@ static int snd_cs4231_capture_close(snd_pcm_substream_t *substream)
{
cs4231_t
*
chip
=
snd_pcm_substream_chip
(
substream
);
chip
->
capture_substream
=
NULL
;
snd_cs4231_close
(
chip
,
CS4231_MODE_RECORD
);
chip
->
capture_substream
=
NULL
;
return
0
;
}
...
...
@@ -1571,21 +1409,7 @@ int snd_cs4231_pcm(cs4231_t *chip)
pcm
->
info_flags
=
SNDRV_PCM_INFO_JOINT_DUPLEX
;
strcpy
(
pcm
->
name
,
"CS4231"
);
#ifdef EBUS_SUPPORT
if
(
chip
->
flags
&
CS4231_FLAG_EBUS
)
{
snd_pcm_lib_preallocate_pages_for_all
(
pcm
,
SNDRV_DMA_TYPE_DEV
,
snd_dma_pci_data
(
chip
->
dev_u
.
pdev
),
64
*
1024
,
128
*
1024
);
}
else
{
#endif
#ifdef SBUS_SUPPORT
snd_pcm_lib_preallocate_pages_for_all
(
pcm
,
SNDRV_DMA_TYPE_SBUS
,
snd_dma_sbus_data
(
chip
->
dev_u
.
sdev
),
64
*
1024
,
128
*
1024
);
#endif
#ifdef EBUS_SUPPORT
}
#endif
chip
->
p_dma
.
preallocate
(
chip
,
pcm
);
chip
->
pcm
=
pcm
;
...
...
@@ -1942,6 +1766,180 @@ static int cs4231_attach_finish(snd_card_t *card, cs4231_t *chip)
}
#ifdef SBUS_SUPPORT
static
irqreturn_t
snd_cs4231_sbus_interrupt
(
int
irq
,
void
*
dev_id
,
struct
pt_regs
*
regs
)
{
unsigned
long
flags
;
unsigned
char
status
;
u32
csr
;
cs4231_t
*
chip
=
dev_id
;
/*This is IRQ is not raised by the cs4231*/
if
(
!
(
__cs4231_readb
(
chip
,
CS4231P
(
chip
,
STATUS
))
&
CS4231_GLOBALIRQ
))
return
IRQ_NONE
;
/* ACK the APC interrupt. */
csr
=
sbus_readl
(
chip
->
port
+
APCCSR
);
sbus_writel
(
csr
,
chip
->
port
+
APCCSR
);
if
((
csr
&
APC_PDMA_READY
)
&&
(
csr
&
APC_PLAY_INT
)
&&
(
csr
&
APC_XINT_PNVA
)
&&
!
(
csr
&
APC_XINT_EMPT
))
snd_cs4231_play_callback
(
chip
);
if
((
csr
&
APC_CDMA_READY
)
&&
(
csr
&
APC_CAPT_INT
)
&&
(
csr
&
APC_XINT_CNVA
)
&&
!
(
csr
&
APC_XINT_EMPT
))
snd_cs4231_capture_callback
(
chip
);
status
=
snd_cs4231_in
(
chip
,
CS4231_IRQ_STATUS
);
if
(
status
&
CS4231_TIMER_IRQ
)
{
if
(
chip
->
timer
)
snd_timer_interrupt
(
chip
->
timer
,
chip
->
timer
->
sticks
);
}
if
((
status
&
CS4231_RECORD_IRQ
)
&&
(
csr
&
APC_CDMA_READY
))
snd_cs4231_overrange
(
chip
);
/* ACK the CS4231 interrupt. */
spin_lock_irqsave
(
&
chip
->
lock
,
flags
);
snd_cs4231_outm
(
chip
,
CS4231_IRQ_STATUS
,
~
CS4231_ALL_IRQS
|
~
status
,
0
);
spin_unlock_irqrestore
(
&
chip
->
lock
,
flags
);
return
0
;
}
/*
* SBUS DMA routines
*/
int
sbus_dma_request
(
struct
cs4231_dma_control
*
dma_cont
,
dma_addr_t
bus_addr
,
size_t
len
)
{
unsigned
long
flags
;
u32
test
,
csr
;
int
err
;
sbus_dma_info_t
*
base
=
&
dma_cont
->
sbus_info
;
if
(
len
>=
(
1
<<
24
))
return
-
EINVAL
;
spin_lock_irqsave
(
&
base
->
lock
,
flags
);
csr
=
sbus_readl
(
base
->
regs
+
APCCSR
);
err
=
-
EINVAL
;
test
=
APC_CDMA_READY
;
if
(
base
->
dir
==
APC_PLAY
)
test
=
APC_PDMA_READY
;
if
(
!
(
csr
&
test
))
goto
out
;
err
=
-
EBUSY
;
csr
=
sbus_readl
(
base
->
regs
+
APCCSR
);
test
=
APC_XINT_CNVA
;
if
(
base
->
dir
==
APC_PLAY
)
test
=
APC_XINT_PNVA
;
if
(
!
(
csr
&
test
))
goto
out
;
err
=
0
;
sbus_writel
(
bus_addr
,
base
->
regs
+
base
->
dir
+
APCNVA
);
sbus_writel
(
len
,
base
->
regs
+
base
->
dir
+
APCNC
);
out:
spin_unlock_irqrestore
(
&
base
->
lock
,
flags
);
return
err
;
}
void
sbus_dma_prepare
(
struct
cs4231_dma_control
*
dma_cont
,
int
d
)
{
unsigned
long
flags
;
u32
csr
,
test
;
sbus_dma_info_t
*
base
=
&
dma_cont
->
sbus_info
;
spin_lock_irqsave
(
&
base
->
lock
,
flags
);
csr
=
sbus_readl
(
base
->
regs
+
APCCSR
);
test
=
APC_GENL_INT
|
APC_PLAY_INT
|
APC_XINT_ENA
|
APC_XINT_PLAY
|
APC_XINT_PEMP
|
APC_XINT_GENL
|
APC_XINT_PENA
;
if
(
base
->
dir
==
APC_RECORD
)
test
=
APC_GENL_INT
|
APC_CAPT_INT
|
APC_XINT_ENA
|
APC_XINT_CAPT
|
APC_XINT_CEMP
|
APC_XINT_GENL
;
csr
|=
test
;
sbus_writel
(
csr
,
base
->
regs
+
APCCSR
);
spin_unlock_irqrestore
(
&
base
->
lock
,
flags
);
}
void
sbus_dma_enable
(
struct
cs4231_dma_control
*
dma_cont
,
int
on
)
{
unsigned
long
flags
;
u32
csr
,
shift
;
sbus_dma_info_t
*
base
=
&
dma_cont
->
sbus_info
;
spin_lock_irqsave
(
&
base
->
lock
,
flags
);
if
(
!
on
)
{
if
(
base
->
dir
==
APC_PLAY
)
{
sbus_writel
(
0
,
base
->
regs
+
base
->
dir
+
APCNVA
);
sbus_writel
(
1
,
base
->
regs
+
base
->
dir
+
APCC
);
}
else
{
sbus_writel
(
0
,
base
->
regs
+
base
->
dir
+
APCNC
);
sbus_writel
(
0
,
base
->
regs
+
base
->
dir
+
APCVA
);
}
}
udelay
(
600
);
csr
=
sbus_readl
(
base
->
regs
+
APCCSR
);
shift
=
0
;
if
(
base
->
dir
==
APC_PLAY
)
shift
=
1
;
if
(
on
)
csr
&=
~
(
APC_CPAUSE
<<
shift
);
else
csr
|=
(
APC_CPAUSE
<<
shift
);
sbus_writel
(
csr
,
base
->
regs
+
APCCSR
);
if
(
on
)
csr
|=
(
APC_CDMA_READY
<<
shift
);
else
csr
&=
~
(
APC_CDMA_READY
<<
shift
);
sbus_writel
(
csr
,
base
->
regs
+
APCCSR
);
spin_unlock_irqrestore
(
&
base
->
lock
,
flags
);
}
unsigned
int
sbus_dma_addr
(
struct
cs4231_dma_control
*
dma_cont
)
{
sbus_dma_info_t
*
base
=
&
dma_cont
->
sbus_info
;
return
sbus_readl
(
base
->
regs
+
base
->
dir
+
APCVA
);
}
void
sbus_dma_reset
(
cs4231_t
*
chip
)
{
sbus_writel
(
APC_CHIP_RESET
,
chip
->
port
+
APCCSR
);
sbus_writel
(
0x00
,
chip
->
port
+
APCCSR
);
sbus_writel
(
sbus_readl
(
chip
->
port
+
APCCSR
)
|
APC_CDC_RESET
,
chip
->
port
+
APCCSR
);
udelay
(
20
);
sbus_writel
(
sbus_readl
(
chip
->
port
+
APCCSR
)
&
~
APC_CDC_RESET
,
chip
->
port
+
APCCSR
);
sbus_writel
(
sbus_readl
(
chip
->
port
+
APCCSR
)
|
(
APC_XINT_ENA
|
APC_XINT_PENA
|
APC_XINT_CENA
),
chip
->
port
+
APCCSR
);
}
void
sbus_dma_preallocate
(
cs4231_t
*
chip
,
snd_pcm_t
*
pcm
)
{
snd_pcm_lib_preallocate_pages_for_all
(
pcm
,
SNDRV_DMA_TYPE_SBUS
,
snd_dma_sbus_data
(
chip
->
dev_u
.
sdev
),
64
*
1024
,
128
*
1024
);
}
/*
* Init and exit routines
*/
static
int
snd_cs4231_sbus_free
(
cs4231_t
*
chip
)
{
if
(
chip
->
irq
[
0
])
...
...
@@ -1983,6 +1981,8 @@ static int __init snd_cs4231_sbus_create(snd_card_t *card,
return
-
ENOMEM
;
spin_lock_init
(
&
chip
->
lock
);
spin_lock_init
(
&
chip
->
c_dma
.
sbus_info
.
lock
);
spin_lock_init
(
&
chip
->
p_dma
.
sbus_info
.
lock
);
init_MUTEX
(
&
chip
->
mce_mutex
);
init_MUTEX
(
&
chip
->
open_mutex
);
chip
->
card
=
card
;
...
...
@@ -1998,6 +1998,25 @@ static int __init snd_cs4231_sbus_create(snd_card_t *card,
return
-
EIO
;
}
chip
->
c_dma
.
sbus_info
.
regs
=
chip
->
port
;
chip
->
p_dma
.
sbus_info
.
regs
=
chip
->
port
;
chip
->
c_dma
.
sbus_info
.
dir
=
APC_RECORD
;
chip
->
p_dma
.
sbus_info
.
dir
=
APC_PLAY
;
chip
->
p_dma
.
prepare
=
sbus_dma_prepare
;
chip
->
p_dma
.
enable
=
sbus_dma_enable
;
chip
->
p_dma
.
request
=
sbus_dma_request
;
chip
->
p_dma
.
address
=
sbus_dma_addr
;
chip
->
p_dma
.
reset
=
sbus_dma_reset
;
chip
->
p_dma
.
preallocate
=
sbus_dma_preallocate
;
chip
->
c_dma
.
prepare
=
sbus_dma_prepare
;
chip
->
c_dma
.
enable
=
sbus_dma_enable
;
chip
->
c_dma
.
request
=
sbus_dma_request
;
chip
->
c_dma
.
address
=
sbus_dma_addr
;
chip
->
c_dma
.
reset
=
sbus_dma_reset
;
chip
->
c_dma
.
preallocate
=
sbus_dma_preallocate
;
if
(
request_irq
(
sdev
->
irqs
[
0
],
snd_cs4231_sbus_interrupt
,
SA_SHIRQ
,
"cs4231"
,
chip
))
{
snd_printdd
(
"cs4231-%d: Unable to grab SBUS IRQ %s
\n
"
,
...
...
@@ -2051,15 +2070,70 @@ static int cs4231_sbus_attach(struct sbus_dev *sdev)
#endif
#ifdef EBUS_SUPPORT
static
void
snd_cs4231_ebus_play_callback
(
struct
ebus_dma_info
*
p
,
int
event
,
void
*
cookie
)
{
cs4231_t
*
chip
=
cookie
;
snd_cs4231_play_callback
(
chip
);
}
static
void
snd_cs4231_ebus_capture_callback
(
struct
ebus_dma_info
*
p
,
int
event
,
void
*
cookie
)
{
cs4231_t
*
chip
=
cookie
;
snd_cs4231_capture_callback
(
chip
);
}
/*
* EBUS DMA wrappers
*/
int
_ebus_dma_request
(
struct
cs4231_dma_control
*
dma_cont
,
dma_addr_t
bus_addr
,
size_t
len
)
{
return
ebus_dma_request
(
&
dma_cont
->
ebus_info
,
bus_addr
,
len
);
}
void
_ebus_dma_enable
(
struct
cs4231_dma_control
*
dma_cont
,
int
on
)
{
ebus_dma_enable
(
&
dma_cont
->
ebus_info
,
on
);
}
void
_ebus_dma_prepare
(
struct
cs4231_dma_control
*
dma_cont
,
int
dir
)
{
ebus_dma_prepare
(
&
dma_cont
->
ebus_info
,
dir
);
}
unsigned
int
_ebus_dma_addr
(
struct
cs4231_dma_control
*
dma_cont
)
{
return
ebus_dma_addr
(
&
dma_cont
->
ebus_info
);
}
void
_ebus_dma_reset
(
cs4231_t
*
chip
)
{
return
;
}
void
_ebus_dma_preallocate
(
cs4231_t
*
chip
,
snd_pcm_t
*
pcm
)
{
snd_pcm_lib_preallocate_pages_for_all
(
pcm
,
SNDRV_DMA_TYPE_DEV
,
snd_dma_pci_data
(
chip
->
dev_u
.
pdev
),
64
*
1024
,
128
*
1024
);
}
/*
* Init and exit routines
*/
static
int
snd_cs4231_ebus_free
(
cs4231_t
*
chip
)
{
if
(
chip
->
eb2c
.
regs
)
{
ebus_dma_unregister
(
&
chip
->
eb2c
);
iounmap
(
chip
->
eb2c
.
regs
);
if
(
chip
->
c_dma
.
ebus_info
.
regs
)
{
ebus_dma_unregister
(
&
chip
->
c_dma
.
ebus_info
);
iounmap
(
chip
->
c_dma
.
ebus_info
.
regs
);
}
if
(
chip
->
eb2p
.
regs
)
{
ebus_dma_unregister
(
&
chip
->
eb2p
);
iounmap
(
chip
->
eb2p
.
regs
);
if
(
chip
->
p_dma
.
ebus_info
.
regs
)
{
ebus_dma_unregister
(
&
chip
->
p_dma
.
ebus_info
);
iounmap
(
chip
->
p_dma
.
ebus_info
.
regs
);
}
if
(
chip
->
port
)
...
...
@@ -2097,8 +2171,8 @@ static int __init snd_cs4231_ebus_create(snd_card_t *card,
return
-
ENOMEM
;
spin_lock_init
(
&
chip
->
lock
);
spin_lock_init
(
&
chip
->
eb2c
.
lock
);
spin_lock_init
(
&
chip
->
eb2p
.
lock
);
spin_lock_init
(
&
chip
->
c_dma
.
ebus_info
.
lock
);
spin_lock_init
(
&
chip
->
p_dma
.
ebus_info
.
lock
);
init_MUTEX
(
&
chip
->
mce_mutex
);
init_MUTEX
(
&
chip
->
open_mutex
);
chip
->
flags
|=
CS4231_FLAG_EBUS
;
...
...
@@ -2106,43 +2180,57 @@ static int __init snd_cs4231_ebus_create(snd_card_t *card,
chip
->
dev_u
.
pdev
=
edev
->
bus
->
self
;
memcpy
(
&
chip
->
image
,
&
snd_cs4231_original_image
,
sizeof
(
snd_cs4231_original_image
));
strcpy
(
chip
->
eb2c
.
name
,
"cs4231(capture)"
);
chip
->
eb2c
.
flags
=
EBUS_DMA_FLAG_USE_EBDMA_HANDLER
;
chip
->
eb2c
.
callback
=
snd_cs4231_ebus_capture_callback
;
chip
->
eb2c
.
client_cookie
=
chip
;
chip
->
eb2c
.
irq
=
edev
->
irqs
[
0
];
strcpy
(
chip
->
eb2p
.
name
,
"cs4231(play)"
);
chip
->
eb2p
.
flags
=
EBUS_DMA_FLAG_USE_EBDMA_HANDLER
;
chip
->
eb2p
.
callback
=
snd_cs4231_ebus_play_callback
;
chip
->
eb2p
.
client_cookie
=
chip
;
chip
->
eb2p
.
irq
=
edev
->
irqs
[
1
];
strcpy
(
chip
->
c_dma
.
ebus_info
.
name
,
"cs4231(capture)"
);
chip
->
c_dma
.
ebus_info
.
flags
=
EBUS_DMA_FLAG_USE_EBDMA_HANDLER
;
chip
->
c_dma
.
ebus_info
.
callback
=
snd_cs4231_ebus_capture_callback
;
chip
->
c_dma
.
ebus_info
.
client_cookie
=
chip
;
chip
->
c_dma
.
ebus_info
.
irq
=
edev
->
irqs
[
0
];
strcpy
(
chip
->
p_dma
.
ebus_info
.
name
,
"cs4231(play)"
);
chip
->
p_dma
.
ebus_info
.
flags
=
EBUS_DMA_FLAG_USE_EBDMA_HANDLER
;
chip
->
p_dma
.
ebus_info
.
callback
=
snd_cs4231_ebus_play_callback
;
chip
->
p_dma
.
ebus_info
.
client_cookie
=
chip
;
chip
->
p_dma
.
ebus_info
.
irq
=
edev
->
irqs
[
1
];
chip
->
p_dma
.
prepare
=
_ebus_dma_prepare
;
chip
->
p_dma
.
enable
=
_ebus_dma_enable
;
chip
->
p_dma
.
request
=
_ebus_dma_request
;
chip
->
p_dma
.
address
=
_ebus_dma_addr
;
chip
->
p_dma
.
reset
=
_ebus_dma_reset
;
chip
->
p_dma
.
preallocate
=
_ebus_dma_preallocate
;
chip
->
c_dma
.
prepare
=
_ebus_dma_prepare
;
chip
->
c_dma
.
enable
=
_ebus_dma_enable
;
chip
->
c_dma
.
request
=
_ebus_dma_request
;
chip
->
c_dma
.
address
=
_ebus_dma_addr
;
chip
->
c_dma
.
reset
=
_ebus_dma_reset
;
chip
->
c_dma
.
preallocate
=
_ebus_dma_preallocate
;
chip
->
port
=
ioremap
(
edev
->
resource
[
0
].
start
,
0x10
);
chip
->
eb2p
.
regs
=
ioremap
(
edev
->
resource
[
1
].
start
,
0x10
);
chip
->
eb2c
.
regs
=
ioremap
(
edev
->
resource
[
2
].
start
,
0x10
);
if
(
!
chip
->
port
||
!
chip
->
eb2p
.
regs
||
!
chip
->
eb2c
.
regs
)
{
chip
->
p_dma
.
ebus_info
.
regs
=
ioremap
(
edev
->
resource
[
1
].
start
,
0x10
);
chip
->
c_dma
.
ebus_info
.
regs
=
ioremap
(
edev
->
resource
[
2
].
start
,
0x10
);
if
(
!
chip
->
port
||
!
chip
->
p_dma
.
ebus_info
.
regs
||
!
chip
->
c_dma
.
ebus_info
.
regs
)
{
snd_cs4231_ebus_free
(
chip
);
snd_printdd
(
"cs4231-%d: Unable to map chip registers.
\n
"
,
dev
);
return
-
EIO
;
}
if
(
ebus_dma_register
(
&
chip
->
eb2c
))
{
if
(
ebus_dma_register
(
&
chip
->
c_dma
.
ebus_info
))
{
snd_cs4231_ebus_free
(
chip
);
snd_printdd
(
"cs4231-%d: Unable to register EBUS capture DMA
\n
"
,
dev
);
return
-
EBUSY
;
}
if
(
ebus_dma_irq_enable
(
&
chip
->
eb2c
,
1
))
{
if
(
ebus_dma_irq_enable
(
&
chip
->
c_dma
.
ebus_info
,
1
))
{
snd_cs4231_ebus_free
(
chip
);
snd_printdd
(
"cs4231-%d: Unable to enable EBUS capture IRQ
\n
"
,
dev
);
return
-
EBUSY
;
}
if
(
ebus_dma_register
(
&
chip
->
eb2p
))
{
if
(
ebus_dma_register
(
&
chip
->
p_dma
.
ebus_info
))
{
snd_cs4231_ebus_free
(
chip
);
snd_printdd
(
"cs4231-%d: Unable to register EBUS play DMA
\n
"
,
dev
);
return
-
EBUSY
;
}
if
(
ebus_dma_irq_enable
(
&
chip
->
eb2p
,
1
))
{
if
(
ebus_dma_irq_enable
(
&
chip
->
p_dma
.
ebus_info
,
1
))
{
snd_cs4231_ebus_free
(
chip
);
snd_printdd
(
"cs4231-%d: Unable to enable EBUS play IRQ
\n
"
,
dev
);
return
-
EBUSY
;
...
...
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