Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
Commits
86b3aa39
Commit
86b3aa39
authored
Dec 25, 2008
by
Takashi Iwai
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'topic/ca0106' into to-push
parents
e4456e71
ebef7cfc
Changes
25
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
25 changed files
with
1012 additions
and
670 deletions
+1012
-670
include/sound/core.h
include/sound/core.h
+25
-3
include/sound/version.h
include/sound/version.h
+1
-1
sound/ac97_bus.c
sound/ac97_bus.c
+1
-0
sound/core/device.c
sound/core/device.c
+2
-2
sound/drivers/Kconfig
sound/drivers/Kconfig
+1
-1
sound/drivers/pcsp/pcsp.c
sound/drivers/pcsp/pcsp.c
+3
-5
sound/drivers/pcsp/pcsp.h
sound/drivers/pcsp/pcsp.h
+3
-0
sound/drivers/pcsp/pcsp_lib.c
sound/drivers/pcsp/pcsp_lib.c
+101
-67
sound/isa/sb/sb8.c
sound/isa/sb/sb8.c
+3
-1
sound/pci/ac97/ac97_codec.c
sound/pci/ac97/ac97_codec.c
+1
-1
sound/pci/ac97/ac97_patch.c
sound/pci/ac97/ac97_patch.c
+2
-0
sound/pci/ca0106/ca0106.h
sound/pci/ca0106/ca0106.h
+24
-6
sound/pci/ca0106/ca0106_main.c
sound/pci/ca0106/ca0106_main.c
+333
-217
sound/pci/ca0106/ca0106_mixer.c
sound/pci/ca0106/ca0106_mixer.c
+195
-68
sound/pci/cs46xx/cs46xx_lib.c
sound/pci/cs46xx/cs46xx_lib.c
+4
-1
sound/pci/emu10k1/emu10k1_main.c
sound/pci/emu10k1/emu10k1_main.c
+258
-236
sound/pci/ice1712/ice1724.c
sound/pci/ice1712/ice1724.c
+12
-11
sound/pci/mixart/mixart.c
sound/pci/mixart/mixart.c
+3
-1
sound/pci/pcxhr/pcxhr.c
sound/pci/pcxhr/pcxhr.c
+3
-1
sound/pci/riptide/riptide.c
sound/pci/riptide/riptide.c
+1
-1
sound/ppc/pmac.c
sound/ppc/pmac.c
+1
-1
sound/ppc/tumbler.c
sound/ppc/tumbler.c
+2
-1
sound/usb/caiaq/caiaq-control.c
sound/usb/caiaq/caiaq-control.c
+30
-43
sound/usb/caiaq/caiaq-device.c
sound/usb/caiaq/caiaq-device.c
+1
-1
sound/usb/usx2y/usb_stream.c
sound/usb/usx2y/usb_stream.c
+2
-1
No files found.
include/sound/core.h
View file @
86b3aa39
...
...
@@ -353,7 +353,7 @@ void snd_verbose_printd(const char *file, int line, const char *format, ...)
* snd_printk - printk wrapper
* @fmt: format string
*
* Works like print() but prints the file and the line of the caller
* Works like print
k
() but prints the file and the line of the caller
* when configured with CONFIG_SND_VERBOSE_PRINTK.
*/
#define snd_printk(fmt, args...) \
...
...
@@ -380,18 +380,40 @@ void snd_verbose_printd(const char *file, int line, const char *format, ...)
printk(fmt ,##args)
#endif
/**
* snd_BUG - give a BUG warning message and stack trace
*
* Calls WARN() if CONFIG_SND_DEBUG is set.
* Ignored when CONFIG_SND_DEBUG is not set.
*/
#define snd_BUG() WARN(1, "BUG?\n")
/**
* snd_BUG_ON - debugging check macro
* @cond: condition to evaluate
*
* When CONFIG_SND_DEBUG is set, this macro evaluates the given condition,
* and call WARN() and returns the value if it's non-zero.
*
* When CONFIG_SND_DEBUG is not set, this just returns zero, and the given
* condition is ignored.
*
* NOTE: the argument won't be evaluated at all when CONFIG_SND_DEBUG=n.
* Thus, don't put any statement that influences on the code behavior,
* such as pre/post increment, to the argument of this macro.
* If you want to evaluate and give a warning, use standard WARN_ON().
*/
#define snd_BUG_ON(cond) WARN((cond), "BUG? (%s)\n", __stringify(cond))
#else
/* !CONFIG_SND_DEBUG */
#define snd_printd(fmt, args...) do { } while (0)
#define snd_BUG() do { } while (0)
static
inline
int
__snd_bug_on
(
voi
d
)
static
inline
int
__snd_bug_on
(
int
con
d
)
{
return
0
;
}
#define snd_BUG_ON(cond)
__snd_bug_on(
)
/* always false */
#define snd_BUG_ON(cond)
__snd_bug_on(0 && (cond)
)
/* always false */
#endif
/* CONFIG_SND_DEBUG */
...
...
include/sound/version.h
View file @
86b3aa39
/* include/version.h */
#define CONFIG_SND_VERSION "1.0.18
rc3
"
#define CONFIG_SND_VERSION "1.0.18
a
"
#define CONFIG_SND_DATE ""
sound/ac97_bus.c
View file @
86b3aa39
...
...
@@ -15,6 +15,7 @@
#include <linux/init.h>
#include <linux/device.h>
#include <linux/string.h>
#include <sound/ac97_codec.h>
/*
* Let drivers decide whether they want to support given codec from their
...
...
sound/core/device.c
View file @
86b3aa39
...
...
@@ -98,7 +98,7 @@ int snd_device_free(struct snd_card *card, void *device_data)
kfree
(
dev
);
return
0
;
}
snd_printd
(
"device free %p (from %p), not found
\n
"
,
device_data
,
snd_printd
(
"device free %p (from %p
F
), not found
\n
"
,
device_data
,
__builtin_return_address
(
0
));
return
-
ENXIO
;
}
...
...
@@ -135,7 +135,7 @@ int snd_device_disconnect(struct snd_card *card, void *device_data)
}
return
0
;
}
snd_printd
(
"device disconnect %p (from %p), not found
\n
"
,
device_data
,
snd_printd
(
"device disconnect %p (from %p
F
), not found
\n
"
,
device_data
,
__builtin_return_address
(
0
));
return
-
ENXIO
;
}
...
...
sound/drivers/Kconfig
View file @
86b3aa39
...
...
@@ -163,7 +163,7 @@ config SND_ML403_AC97CR
config SND_AC97_POWER_SAVE
bool "AC97 Power-Saving Mode"
depends on SND_AC97_CODEC
&& EXPERIMENTAL
depends on SND_AC97_CODEC
default n
help
Say Y here to enable the aggressive power-saving support of
...
...
sound/drivers/pcsp/pcsp.c
View file @
86b3aa39
...
...
@@ -96,7 +96,7 @@ static int __devinit snd_card_pcsp_probe(int devnum, struct device *dev)
return
-
EINVAL
;
hrtimer_init
(
&
pcsp_chip
.
timer
,
CLOCK_MONOTONIC
,
HRTIMER_MODE_REL
);
pcsp_chip
.
timer
.
cb_mode
=
HRTIMER_CB_
SOFTIRQ
;
pcsp_chip
.
timer
.
cb_mode
=
HRTIMER_CB_
IRQSAFE_UNLOCKED
;
pcsp_chip
.
timer
.
function
=
pcsp_do_timer
;
card
=
snd_card_new
(
index
,
id
,
THIS_MODULE
,
0
);
...
...
@@ -188,10 +188,8 @@ static int __devexit pcsp_remove(struct platform_device *dev)
static
void
pcsp_stop_beep
(
struct
snd_pcsp
*
chip
)
{
spin_lock_irq
(
&
chip
->
substream_lock
);
if
(
!
chip
->
playback_substream
)
pcspkr_stop_sound
();
spin_unlock_irq
(
&
chip
->
substream_lock
);
pcsp_sync_stop
(
chip
);
pcspkr_stop_sound
();
}
#ifdef CONFIG_PM
...
...
sound/drivers/pcsp/pcsp.h
View file @
86b3aa39
...
...
@@ -62,6 +62,8 @@ struct snd_pcsp {
unsigned
short
port
,
irq
,
dma
;
spinlock_t
substream_lock
;
struct
snd_pcm_substream
*
playback_substream
;
unsigned
int
fmt_size
;
unsigned
int
is_signed
;
size_t
playback_ptr
;
size_t
period_ptr
;
atomic_t
timer_active
;
...
...
@@ -77,6 +79,7 @@ struct snd_pcsp {
extern
struct
snd_pcsp
pcsp_chip
;
extern
enum
hrtimer_restart
pcsp_do_timer
(
struct
hrtimer
*
handle
);
extern
void
pcsp_sync_stop
(
struct
snd_pcsp
*
chip
);
extern
int
snd_pcsp_new_pcm
(
struct
snd_pcsp
*
chip
);
extern
int
snd_pcsp_new_mixer
(
struct
snd_pcsp
*
chip
);
...
...
sound/drivers/pcsp/pcsp_lib.c
View file @
86b3aa39
...
...
@@ -8,6 +8,7 @@
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/interrupt.h>
#include <sound/pcm.h>
#include <asm/io.h>
#include "pcsp.h"
...
...
@@ -19,61 +20,57 @@ MODULE_PARM_DESC(nforce_wa, "Apply NForce chipset workaround "
#define DMIX_WANTS_S16 1
enum
hrtimer_restart
pcsp_do_timer
(
struct
hrtimer
*
handle
)
/*
* Call snd_pcm_period_elapsed in a tasklet
* This avoids spinlock messes and long-running irq contexts
*/
static
void
pcsp_call_pcm_elapsed
(
unsigned
long
priv
)
{
if
(
atomic_read
(
&
pcsp_chip
.
timer_active
))
{
struct
snd_pcm_substream
*
substream
;
substream
=
pcsp_chip
.
playback_substream
;
if
(
substream
)
snd_pcm_period_elapsed
(
substream
);
}
}
static
DECLARE_TASKLET
(
pcsp_pcm_tasklet
,
pcsp_call_pcm_elapsed
,
0
);
/* write the port and returns the next expire time in ns;
* called at the trigger-start and in hrtimer callback
*/
static
unsigned
long
pcsp_timer_update
(
struct
hrtimer
*
handle
)
{
unsigned
char
timer_cnt
,
val
;
int
fmt_size
,
periods_elapsed
;
u64
ns
;
size_t
period_bytes
,
buffer_bytes
;
struct
snd_pcm_substream
*
substream
;
struct
snd_pcm_runtime
*
runtime
;
struct
snd_pcsp
*
chip
=
container_of
(
handle
,
struct
snd_pcsp
,
timer
);
unsigned
long
flags
;
if
(
chip
->
thalf
)
{
outb
(
chip
->
val61
,
0x61
);
chip
->
thalf
=
0
;
if
(
!
atomic_read
(
&
chip
->
timer_active
))
return
HRTIMER_NORESTART
;
hrtimer_forward
(
&
chip
->
timer
,
hrtimer_get_expires
(
&
chip
->
timer
),
ktime_set
(
0
,
chip
->
ns_rem
));
return
HRTIMER_RESTART
;
return
0
;
return
chip
->
ns_rem
;
}
spin_lock_irq
(
&
chip
->
substream_lock
);
/* Takashi Iwai says regarding this extra lock:
If the irq handler handles some data on the DMA buffer, it should
do snd_pcm_stream_lock().
That protects basically against all races among PCM callbacks, yes.
However, there are two remaining issues:
1. The substream pointer you try to lock isn't protected _before_
this lock yet.
2. snd_pcm_period_elapsed() itself acquires the lock.
The requirement of another lock is because of 1. When you get
chip->playback_substream, it's not protected.
Keeping this lock while snd_pcm_period_elapsed() assures the substream
is still protected (at least, not released). And the other status is
handled properly inside snd_pcm_stream_lock() in
snd_pcm_period_elapsed().
*/
if
(
!
chip
->
playback_substream
)
goto
exit_nr_unlock1
;
substream
=
chip
->
playback_substream
;
snd_pcm_stream_lock
(
substream
);
if
(
!
atomic_read
(
&
chip
->
timer_active
))
goto
exit_nr_unlock2
;
return
0
;
substream
=
chip
->
playback_substream
;
if
(
!
substream
)
return
0
;
runtime
=
substream
->
runtime
;
fmt_size
=
snd_pcm_format_physical_width
(
runtime
->
format
)
>>
3
;
/* assume it is mono! */
val
=
runtime
->
dma_area
[
chip
->
playback_ptr
+
fmt_size
-
1
];
if
(
snd_pcm_format_signed
(
runtime
->
format
)
)
val
=
runtime
->
dma_area
[
chip
->
playback_ptr
+
chip
->
fmt_size
-
1
];
if
(
chip
->
is_signed
)
val
^=
0x80
;
timer_cnt
=
val
*
CUR_DIV
()
/
256
;
if
(
timer_cnt
&&
chip
->
enable
)
{
spin_lock
(
&
i8253_lock
);
spin_lock
_irqsave
(
&
i8253_lock
,
flags
);
if
(
!
nforce_wa
)
{
outb_p
(
chip
->
val61
,
0x61
);
outb_p
(
timer_cnt
,
0x42
);
...
...
@@ -82,12 +79,39 @@ enum hrtimer_restart pcsp_do_timer(struct hrtimer *handle)
outb
(
chip
->
val61
^
2
,
0x61
);
chip
->
thalf
=
1
;
}
spin_unlock
(
&
i8253_lock
);
spin_unlock
_irqrestore
(
&
i8253_lock
,
flags
);
}
chip
->
ns_rem
=
PCSP_PERIOD_NS
();
ns
=
(
chip
->
thalf
?
PCSP_CALC_NS
(
timer_cnt
)
:
chip
->
ns_rem
);
chip
->
ns_rem
-=
ns
;
return
ns
;
}
enum
hrtimer_restart
pcsp_do_timer
(
struct
hrtimer
*
handle
)
{
struct
snd_pcsp
*
chip
=
container_of
(
handle
,
struct
snd_pcsp
,
timer
);
struct
snd_pcm_substream
*
substream
;
int
periods_elapsed
,
pointer_update
;
size_t
period_bytes
,
buffer_bytes
;
unsigned
long
ns
;
unsigned
long
flags
;
pointer_update
=
!
chip
->
thalf
;
ns
=
pcsp_timer_update
(
handle
);
if
(
!
ns
)
return
HRTIMER_NORESTART
;
/* update the playback position */
substream
=
chip
->
playback_substream
;
if
(
!
substream
)
return
HRTIMER_NORESTART
;
period_bytes
=
snd_pcm_lib_period_bytes
(
substream
);
buffer_bytes
=
snd_pcm_lib_buffer_bytes
(
substream
);
chip
->
playback_ptr
+=
PCSP_INDEX_INC
()
*
fmt_size
;
spin_lock_irqsave
(
&
chip
->
substream_lock
,
flags
);
chip
->
playback_ptr
+=
PCSP_INDEX_INC
()
*
chip
->
fmt_size
;
periods_elapsed
=
chip
->
playback_ptr
-
chip
->
period_ptr
;
if
(
periods_elapsed
<
0
)
{
#if PCSP_DEBUG
...
...
@@ -102,41 +126,30 @@ enum hrtimer_restart pcsp_do_timer(struct hrtimer *handle)
* or ALSA will BUG on us. */
chip
->
playback_ptr
%=
buffer_bytes
;
snd_pcm_stream_unlock
(
substream
);
if
(
periods_elapsed
)
{
snd_pcm_period_elapsed
(
substream
);
chip
->
period_ptr
+=
periods_elapsed
*
period_bytes
;
chip
->
period_ptr
%=
buffer_bytes
;
}
spin_unlock_irqrestore
(
&
chip
->
substream_lock
,
flags
);
spin_unlock_irq
(
&
chip
->
substream_lock
);
if
(
periods_elapsed
)
tasklet_schedule
(
&
pcsp_pcm_tasklet
);
if
(
!
atomic_read
(
&
chip
->
timer_active
))
return
HRTIMER_NORESTART
;
hrtimer_forward
(
handle
,
hrtimer_get_expires
(
handle
),
ns_to_ktime
(
ns
));
chip
->
ns_rem
=
PCSP_PERIOD_NS
();
ns
=
(
chip
->
thalf
?
PCSP_CALC_NS
(
timer_cnt
)
:
chip
->
ns_rem
);
chip
->
ns_rem
-=
ns
;
hrtimer_forward
(
&
chip
->
timer
,
hrtimer_get_expires
(
&
chip
->
timer
),
ktime_set
(
0
,
ns
));
return
HRTIMER_RESTART
;
exit_nr_unlock2:
snd_pcm_stream_unlock
(
substream
);
exit_nr_unlock1:
spin_unlock_irq
(
&
chip
->
substream_lock
);
return
HRTIMER_NORESTART
;
}
static
void
pcsp_start_playing
(
struct
snd_pcsp
*
chip
)
static
int
pcsp_start_playing
(
struct
snd_pcsp
*
chip
)
{
unsigned
long
ns
;
#if PCSP_DEBUG
printk
(
KERN_INFO
"PCSP: start_playing called
\n
"
);
#endif
if
(
atomic_read
(
&
chip
->
timer_active
))
{
printk
(
KERN_ERR
"PCSP: Timer already active
\n
"
);
return
;
return
-
EIO
;
}
spin_lock
(
&
i8253_lock
);
...
...
@@ -146,7 +159,12 @@ static void pcsp_start_playing(struct snd_pcsp *chip)
atomic_set
(
&
chip
->
timer_active
,
1
);
chip
->
thalf
=
0
;
hrtimer_start
(
&
pcsp_chip
.
timer
,
ktime_set
(
0
,
0
),
HRTIMER_MODE_REL
);
ns
=
pcsp_timer_update
(
&
pcsp_chip
.
timer
);
if
(
!
ns
)
return
-
EIO
;
hrtimer_start
(
&
pcsp_chip
.
timer
,
ktime_set
(
0
,
ns
),
HRTIMER_MODE_REL
);
return
0
;
}
static
void
pcsp_stop_playing
(
struct
snd_pcsp
*
chip
)
...
...
@@ -165,26 +183,35 @@ static void pcsp_stop_playing(struct snd_pcsp *chip)
spin_unlock
(
&
i8253_lock
);
}
/*
* Force to stop and sync the stream
*/
void
pcsp_sync_stop
(
struct
snd_pcsp
*
chip
)
{
local_irq_disable
();
pcsp_stop_playing
(
chip
);
local_irq_enable
();
hrtimer_cancel
(
&
chip
->
timer
);
tasklet_kill
(
&
pcsp_pcm_tasklet
);
}
static
int
snd_pcsp_playback_close
(
struct
snd_pcm_substream
*
substream
)
{
struct
snd_pcsp
*
chip
=
snd_pcm_substream_chip
(
substream
);
#if PCSP_DEBUG
printk
(
KERN_INFO
"PCSP: close called
\n
"
);
#endif
if
(
atomic_read
(
&
chip
->
timer_active
))
{
printk
(
KERN_ERR
"PCSP: timer still active
\n
"
);
pcsp_stop_playing
(
chip
);
}
spin_lock_irq
(
&
chip
->
substream_lock
);
pcsp_sync_stop
(
chip
);
chip
->
playback_substream
=
NULL
;
spin_unlock_irq
(
&
chip
->
substream_lock
);
return
0
;
}
static
int
snd_pcsp_playback_hw_params
(
struct
snd_pcm_substream
*
substream
,
struct
snd_pcm_hw_params
*
hw_params
)
{
struct
snd_pcsp
*
chip
=
snd_pcm_substream_chip
(
substream
);
int
err
;
pcsp_sync_stop
(
chip
);
err
=
snd_pcm_lib_malloc_pages
(
substream
,
params_buffer_bytes
(
hw_params
));
if
(
err
<
0
)
...
...
@@ -194,9 +221,11 @@ static int snd_pcsp_playback_hw_params(struct snd_pcm_substream *substream,
static
int
snd_pcsp_playback_hw_free
(
struct
snd_pcm_substream
*
substream
)
{
struct
snd_pcsp
*
chip
=
snd_pcm_substream_chip
(
substream
);
#if PCSP_DEBUG
printk
(
KERN_INFO
"PCSP: hw_free called
\n
"
);
#endif
pcsp_sync_stop
(
chip
);
return
snd_pcm_lib_free_pages
(
substream
);
}
...
...
@@ -212,8 +241,12 @@ static int snd_pcsp_playback_prepare(struct snd_pcm_substream *substream)
snd_pcm_lib_period_bytes
(
substream
),
substream
->
runtime
->
periods
);
#endif
pcsp_sync_stop
(
chip
);
chip
->
playback_ptr
=
0
;
chip
->
period_ptr
=
0
;
chip
->
fmt_size
=
snd_pcm_format_physical_width
(
substream
->
runtime
->
format
)
>>
3
;
chip
->
is_signed
=
snd_pcm_format_signed
(
substream
->
runtime
->
format
);
return
0
;
}
...
...
@@ -226,8 +259,7 @@ static int snd_pcsp_trigger(struct snd_pcm_substream *substream, int cmd)
switch
(
cmd
)
{
case
SNDRV_PCM_TRIGGER_START
:
case
SNDRV_PCM_TRIGGER_RESUME
:
pcsp_start_playing
(
chip
);
break
;
return
pcsp_start_playing
(
chip
);
case
SNDRV_PCM_TRIGGER_STOP
:
case
SNDRV_PCM_TRIGGER_SUSPEND
:
pcsp_stop_playing
(
chip
);
...
...
@@ -242,7 +274,11 @@ static snd_pcm_uframes_t snd_pcsp_playback_pointer(struct snd_pcm_substream
*
substream
)
{
struct
snd_pcsp
*
chip
=
snd_pcm_substream_chip
(
substream
);
return
bytes_to_frames
(
substream
->
runtime
,
chip
->
playback_ptr
);
unsigned
int
pos
;
spin_lock
(
&
chip
->
substream_lock
);
pos
=
chip
->
playback_ptr
;
spin_unlock
(
&
chip
->
substream_lock
);
return
bytes_to_frames
(
substream
->
runtime
,
pos
);
}
static
struct
snd_pcm_hardware
snd_pcsp_playback
=
{
...
...
@@ -279,9 +315,7 @@ static int snd_pcsp_playback_open(struct snd_pcm_substream *substream)
return
-
EBUSY
;
}
runtime
->
hw
=
snd_pcsp_playback
;
spin_lock_irq
(
&
chip
->
substream_lock
);
chip
->
playback_substream
=
substream
;
spin_unlock_irq
(
&
chip
->
substream_lock
);
return
0
;
}
...
...
sound/isa/sb/sb8.c
View file @
86b3aa39
...
...
@@ -140,8 +140,10 @@ static int __devinit snd_sb8_probe(struct device *pdev, unsigned int dev)
break
;
}
}
if
(
i
>=
ARRAY_SIZE
(
possible_ports
))
if
(
i
>=
ARRAY_SIZE
(
possible_ports
))
{
err
=
-
EINVAL
;
goto
_err
;
}
}
acard
->
chip
=
chip
;
...
...
sound/pci/ac97/ac97_codec.c
View file @
86b3aa39
...
...
@@ -175,7 +175,7 @@ static const struct ac97_codec_id snd_ac97_codec_ids[] = {
{
0x574d4C04
,
0xffffffff
,
"WM9704M,WM9704Q"
,
patch_wolfson04
,
NULL
},
{
0x574d4C05
,
0xffffffff
,
"WM9705,WM9710"
,
patch_wolfson05
,
NULL
},
{
0x574d4C09
,
0xffffffff
,
"WM9709"
,
NULL
,
NULL
},
{
0x574d4C12
,
0xffffffff
,
"WM9711,WM9712"
,
patch_wolfson11
,
NULL
},
{
0x574d4C12
,
0xffffffff
,
"WM9711,WM9712
,WM9715
"
,
patch_wolfson11
,
NULL
},
{
0x574d4c13
,
0xffffffff
,
"WM9713,WM9714"
,
patch_wolfson13
,
NULL
,
AC97_DEFAULT_POWER_OFF
},
{
0x594d4800
,
0xffffffff
,
"YMF743"
,
patch_yamaha_ymf743
,
NULL
},
{
0x594d4802
,
0xffffffff
,
"YMF752"
,
NULL
,
NULL
},
...
...
sound/pci/ac97/ac97_patch.c
View file @
86b3aa39
...
...
@@ -2832,6 +2832,8 @@ static int patch_alc655(struct snd_ac97 * ac97)
val
&=
~
(
1
<<
1
);
/* Pin 47 is EAPD (for internal speaker) */
else
val
|=
(
1
<<
1
);
/* Pin 47 is spdif input pin */
/* this seems missing on some hardwares */
ac97
->
ext_id
|=
AC97_EI_SPDIF
;
}
val
&=
~
(
1
<<
12
);
/* vref enable */
snd_ac97_write_cache
(
ac97
,
0x7a
,
val
);
...
...
sound/pci/ca0106/ca0106.h
View file @
86b3aa39
...
...
@@ -664,10 +664,14 @@ struct snd_ca0106_pcm {
struct
snd_ca0106_details
{
u32
serial
;
char
*
name
;
int
ac97
;
int
gpio_type
;
int
i2c_adc
;
int
spi_dac
;
int
ac97
;
/* ac97 = 0 -> Select MIC, Line in, TAD in, AUX in.
ac97 = 1 -> Default to AC97 in. */
int
gpio_type
;
/* gpio_type = 1 -> shared mic-in/line-in
gpio_type = 2 -> shared side-out/line-in. */
int
i2c_adc
;
/* with i2c_adc=1, the driver adds some capture volume
controls, phone, mic, line-in and aux. */
int
spi_dac
;
/* spi_dac=1 adds the mute switch for each analog
output, front, rear, etc. */
};
// definition of the chip-specific record
...
...
@@ -686,11 +690,12 @@ struct snd_ca0106 {
spinlock_t
emu_lock
;
struct
snd_ac97
*
ac97
;
struct
snd_pcm
*
pcm
;
struct
snd_pcm
*
pcm
[
4
]
;
struct
snd_ca0106_channel
playback_channels
[
4
];
struct
snd_ca0106_channel
capture_channels
[
4
];
u32
spdif_bits
[
4
];
/* s/pdif out setup */
u32
spdif_bits
[
4
];
/* s/pdif out default setup */
u32
spdif_str_bits
[
4
];
/* s/pdif out per-stream setup */
int
spdif_enable
;
int
capture_source
;
int
i2c_capture_source
;
...
...
@@ -703,6 +708,11 @@ struct snd_ca0106 {
struct
snd_ca_midi
midi2
;
u16
spi_dac_reg
[
16
];
#ifdef CONFIG_PM
#define NUM_SAVED_VOLUMES 9
unsigned
int
saved_vol
[
NUM_SAVED_VOLUMES
];
#endif
};
int
snd_ca0106_mixer
(
struct
snd_ca0106
*
emu
);
...
...
@@ -721,3 +731,11 @@ int snd_ca0106_i2c_write(struct snd_ca0106 *emu, u32 reg, u32 value);
int
snd_ca0106_spi_write
(
struct
snd_ca0106
*
emu
,
unsigned
int
data
);
#ifdef CONFIG_PM
void
snd_ca0106_mixer_suspend
(
struct
snd_ca0106
*
chip
);
void
snd_ca0106_mixer_resume
(
struct
snd_ca0106
*
chip
);
#else
#define snd_ca0106_mixer_suspend(chip) do { } while (0)
#define snd_ca0106_mixer_resume(chip) do { } while (0)
#endif
sound/pci/ca0106/ca0106_main.c
View file @
86b3aa39
This diff is collapsed.
Click to expand it.
sound/pci/ca0106/ca0106_mixer.c
View file @
86b3aa39
This diff is collapsed.
Click to expand it.
sound/pci/cs46xx/cs46xx_lib.c
View file @
86b3aa39
...
...
@@ -3640,7 +3640,10 @@ int snd_cs46xx_resume(struct pci_dev *pci)
{
struct
snd_card
*
card
=
pci_get_drvdata
(
pci
);
struct
snd_cs46xx
*
chip
=
card
->
private_data
;
int
i
,
amp_saved
;
int
amp_saved
;
#ifdef CONFIG_SND_CS46XX_NEW_DSP
int
i
;
#endif
pci_set_power_state
(
pci
,
PCI_D0
);
pci_restore_state
(
pci
);
...
...
sound/pci/emu10k1/emu10k1_main.c
View file @
86b3aa39
This diff is collapsed.
Click to expand it.
sound/pci/ice1712/ice1724.c
View file @
86b3aa39
...
...
@@ -382,23 +382,25 @@ static irqreturn_t snd_vt1724_interrupt(int irq, void *dev_id)
unsigned
char
status_mask
=
VT1724_IRQ_MPU_RX
|
VT1724_IRQ_MPU_TX
|
VT1724_IRQ_MTPCM
;
int
handled
=
0
;
#ifdef CONFIG_SND_DEBUG
int
timeout
=
0
;
#endif
while
(
1
)
{
status
=
inb
(
ICEREG1724
(
ice
,
IRQSTAT
));
status
&=
status_mask
;
if
(
status
==
0
)
break
;
#ifdef CONFIG_SND_DEBUG
if
(
++
timeout
>
10
)
{
printk
(
KERN_ERR
"ice1724: Too long irq loop, status = 0x%x
\n
"
,
status
);
status
=
inb
(
ICEREG1724
(
ice
,
IRQSTAT
));
printk
(
KERN_ERR
"ice1724: Too long irq loop, "
"status = 0x%x
\n
"
,
status
);
if
(
status
&
VT1724_IRQ_MPU_TX
)
{
printk
(
KERN_ERR
"ice1724: Disabling MPU_TX
\n
"
);
outb
(
inb
(
ICEREG1724
(
ice
,
IRQMASK
))
|
VT1724_IRQ_MPU_TX
,
ICEREG1724
(
ice
,
IRQMASK
));
}
break
;
}
#endif
handled
=
1
;
if
(
status
&
VT1724_IRQ_MPU_TX
)
{
spin_lock
(
&
ice
->
reg_lock
);
...
...
@@ -2351,7 +2353,6 @@ static int __devinit snd_vt1724_create(struct snd_card *card,
{
struct
snd_ice1712
*
ice
;
int
err
;
unsigned
char
mask
;
static
struct
snd_device_ops
ops
=
{
.
dev_free
=
snd_vt1724_dev_free
,
};
...
...
@@ -2412,9 +2413,9 @@ static int __devinit snd_vt1724_create(struct snd_card *card,
return
-
EIO
;
}
/*
unmask used interrupts
*/
mask
=
VT1724_IRQ_MPU_RX
|
VT1724_IRQ_MPU_TX
;
outb
(
mask
,
ICEREG1724
(
ice
,
IRQMASK
));
/*
MPU_RX and TX irq masks are cleared later dynamically
*/
outb
(
VT1724_IRQ_MPU_RX
|
VT1724_IRQ_MPU_TX
,
ICEREG1724
(
ice
,
IRQMASK
))
;
/* don't handle FIFO overrun/underruns (just yet),
* since they cause machine lockups
*/
...
...
sound/pci/mixart/mixart.c
View file @
86b3aa39
...
...
@@ -1010,7 +1010,7 @@ static int __devinit snd_mixart_create(struct mixart_mgr *mgr, struct snd_card *
.
dev_free
=
snd_mixart_chip_dev_free
,
};
mgr
->
chip
[
idx
]
=
chip
=
kzalloc
(
sizeof
(
*
chip
),
GFP_KERNEL
);
chip
=
kzalloc
(
sizeof
(
*
chip
),
GFP_KERNEL
);
if
(
!
chip
)
{
snd_printk
(
KERN_ERR
"cannot allocate chip
\n
"
);
return
-
ENOMEM
;
...
...
@@ -1025,6 +1025,7 @@ static int __devinit snd_mixart_create(struct mixart_mgr *mgr, struct snd_card *
return
err
;
}
mgr
->
chip
[
idx
]
=
chip
;
snd_card_set_dev
(
card
,
&
mgr
->
pci
->
dev
);
return
0
;
...
...
@@ -1377,6 +1378,7 @@ static int __devinit snd_mixart_probe(struct pci_dev *pci,
sprintf
(
card
->
longname
,
"%s [PCM #%d]"
,
mgr
->
longname
,
i
);
if
((
err
=
snd_mixart_create
(
mgr
,
card
,
i
))
<
0
)
{
snd_card_free
(
card
);
snd_mixart_free
(
mgr
);
return
err
;
}
...
...
sound/pci/pcxhr/pcxhr.c
View file @
86b3aa39
...
...
@@ -1024,7 +1024,7 @@ static int __devinit pcxhr_create(struct pcxhr_mgr *mgr, struct snd_card *card,
.
dev_free
=
pcxhr_chip_dev_free
,
};
mgr
->
chip
[
idx
]
=
chip
=
kzalloc
(
sizeof
(
*
chip
),
GFP_KERNEL
);
chip
=
kzalloc
(
sizeof
(
*
chip
),
GFP_KERNEL
);
if
(
!
chip
)
{
snd_printk
(
KERN_ERR
"cannot allocate chip
\n
"
);
return
-
ENOMEM
;
...
...
@@ -1050,6 +1050,7 @@ static int __devinit pcxhr_create(struct pcxhr_mgr *mgr, struct snd_card *card,
return
err
;
}
mgr
->
chip
[
idx
]
=
chip
;
snd_card_set_dev
(
card
,
&
mgr
->
pci
->
dev
);
return
0
;
...
...
@@ -1310,6 +1311,7 @@ static int __devinit pcxhr_probe(struct pci_dev *pci, const struct pci_device_id
sprintf
(
card
->
longname
,
"%s [PCM #%d]"
,
mgr
->
longname
,
i
);
if
((
err
=
pcxhr_create
(
mgr
,
card
,
i
))
<
0
)
{
snd_card_free
(
card
);
pcxhr_free
(
mgr
);
return
err
;
}
...
...
sound/pci/riptide/riptide.c
View file @
86b3aa39
...
...
@@ -172,7 +172,7 @@ MODULE_PARM_DESC(opl3_port, "OPL3 port # for Riptide driver.");
#define MAX_WRITE_RETRY 10
/* cmd interface limits */
#define MAX_ERROR_COUNT 10
#define CMDIF_TIMEOUT 50000
0
#define CMDIF_TIMEOUT 50000
#define RESET_TRIES 5
#define READ_PORT_ULONG(p) inl((unsigned long)&(p))
...
...
sound/ppc/pmac.c
View file @
86b3aa39
...
...
@@ -1033,7 +1033,7 @@ static int __init snd_pmac_detect(struct snd_pmac *chip)
}
if
(
of_device_is_compatible
(
sound
,
"tumbler"
))
{
chip
->
model
=
PMAC_TUMBLER
;
chip
->
can_capture
=
0
;
/* no capture */
chip
->
can_capture
=
machine_is_compatible
(
"PowerMac4,2"
);
chip
->
can_duplex
=
0
;
// chip->can_byte_swap = 0; /* FIXME: check this */
chip
->
num_freqs
=
ARRAY_SIZE
(
tumbler_freqs
);
...
...
sound/ppc/tumbler.c
View file @
86b3aa39
...
...
@@ -875,7 +875,8 @@ static struct snd_kcontrol_new snapper_mixers[] __initdata = {
.
put
=
tumbler_put_master_switch
},
DEFINE_SNAPPER_MIX
(
"PCM Playback Volume"
,
0
,
VOL_IDX_PCM
),
DEFINE_SNAPPER_MIX
(
"PCM Playback Volume"
,
1
,
VOL_IDX_PCM2
),
/* Alternative PCM is assigned to Mic analog loopback on iBook G4 */
DEFINE_SNAPPER_MIX
(
"Mic Playback Volume"
,
0
,
VOL_IDX_PCM2
),
DEFINE_SNAPPER_MIX
(
"Monitor Mix Volume"
,
0
,
VOL_IDX_ADC
),
DEFINE_SNAPPER_MONO
(
"Tone Control - Bass"
,
bass
),
DEFINE_SNAPPER_MONO
(
"Tone Control - Treble"
,
treble
),
...
...
sound/usb/caiaq/caiaq-control.c
View file @
86b3aa39
...
...
@@ -247,69 +247,56 @@ static struct caiaq_controller a8dj_controller[] = {
{
"Software lock"
,
40
}
};
int
__devinit
snd_usb_caiaq_control_init
(
struct
snd_usb_caiaqdev
*
dev
)
static
int
__devinit
add_controls
(
struct
caiaq_controller
*
c
,
int
num
,
struct
snd_usb_caiaqdev
*
dev
)
{
int
i
;
int
i
,
ret
;
struct
snd_kcontrol
*
kc
;
for
(
i
=
0
;
i
<
num
;
i
++
,
c
++
)
{
kcontrol_template
.
name
=
c
->
name
;
kcontrol_template
.
private_value
=
c
->
index
;
kc
=
snd_ctl_new1
(
&
kcontrol_template
,
dev
);
ret
=
snd_ctl_add
(
dev
->
chip
.
card
,
kc
);
if
(
ret
<
0
)
return
ret
;
}
return
0
;
}
int
__devinit
snd_usb_caiaq_control_init
(
struct
snd_usb_caiaqdev
*
dev
)
{
int
ret
=
0
;
switch
(
dev
->
chip
.
usb_id
)
{
case
USB_ID
(
USB_VID_NATIVEINSTRUMENTS
,
USB_PID_AK1
):
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
ak1_controller
);
i
++
)
{
struct
caiaq_controller
*
c
=
ak1_controller
+
i
;
kcontrol_template
.
name
=
c
->
name
;
kcontrol_template
.
private_value
=
c
->
index
;
kc
=
snd_ctl_new1
(
&
kcontrol_template
,
dev
);
snd_ctl_add
(
dev
->
chip
.
card
,
kc
);
}
ret
=
add_controls
(
ak1_controller
,
ARRAY_SIZE
(
ak1_controller
),
dev
);
break
;
case
USB_ID
(
USB_VID_NATIVEINSTRUMENTS
,
USB_PID_RIGKONTROL2
):
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
rk2_controller
);
i
++
)
{
struct
caiaq_controller
*
c
=
rk2_controller
+
i
;
kcontrol_template
.
name
=
c
->
name
;
kcontrol_template
.
private_value
=
c
->
index
;
kc
=
snd_ctl_new1
(
&
kcontrol_template
,
dev
);
snd_ctl_add
(
dev
->
chip
.
card
,
kc
);
}
ret
=
add_controls
(
rk2_controller
,
ARRAY_SIZE
(
rk2_controller
),
dev
);
break
;
case
USB_ID
(
USB_VID_NATIVEINSTRUMENTS
,
USB_PID_RIGKONTROL3
):
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
rk3_controller
);
i
++
)
{
struct
caiaq_controller
*
c
=
rk3_controller
+
i
;
kcontrol_template
.
name
=
c
->
name
;
kcontrol_template
.
private_value
=
c
->
index
;
kc
=
snd_ctl_new1
(
&
kcontrol_template
,
dev
);
snd_ctl_add
(
dev
->
chip
.
card
,
kc
);
}
ret
=
add_controls
(
rk3_controller
,
ARRAY_SIZE
(
rk3_controller
),
dev
);
break
;
case
USB_ID
(
USB_VID_NATIVEINSTRUMENTS
,
USB_PID_KORECONTROLLER
):
case
USB_ID
(
USB_VID_NATIVEINSTRUMENTS
,
USB_PID_KORECONTROLLER2
):
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
kore_controller
);
i
++
)
{
struct
caiaq_controller
*
c
=
kore_controller
+
i
;
kcontrol_template
.
name
=
c
->
name
;
kcontrol_template
.
private_value
=
c
->
index
;
kc
=
snd_ctl_new1
(
&
kcontrol_template
,
dev
);
snd_ctl_add
(
dev
->
chip
.
card
,
kc
);
}
ret
=
add_controls
(
kore_controller
,
ARRAY_SIZE
(
kore_controller
),
dev
);
break
;
case
USB_ID
(
USB_VID_NATIVEINSTRUMENTS
,
USB_PID_AUDIO8DJ
):
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
a8dj_controller
);
i
++
)
{
struct
caiaq_controller
*
c
=
a8dj_controller
+
i
;
kcontrol_template
.
name
=
c
->
name
;
kcontrol_template
.
private_value
=
c
->
index
;
kc
=
snd_ctl_new1
(
&
kcontrol_template
,
dev
);
snd_ctl_add
(
dev
->
chip
.
card
,
kc
);
}
ret
=
add_controls
(
a8dj_controller
,
ARRAY_SIZE
(
a8dj_controller
),
dev
);
break
;
}
return
0
;
return
ret
;
}
sound/usb/caiaq/caiaq-device.c
View file @
86b3aa39
...
...
@@ -42,7 +42,7 @@
#endif
MODULE_AUTHOR
(
"Daniel Mack <daniel@caiaq.de>"
);
MODULE_DESCRIPTION
(
"caiaq USB audio, version 1.3.
8
"
);
MODULE_DESCRIPTION
(
"caiaq USB audio, version 1.3.
9
"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_SUPPORTED_DEVICE
(
"{{Native Instruments, RigKontrol2},"
"{Native Instruments, RigKontrol3},"
...
...
sound/usb/usx2y/usb_stream.c
View file @
86b3aa39
...
...
@@ -276,7 +276,8 @@ static void subs_set_complete(struct urb **urbs, void (*complete)(struct urb *))
}
}
int
usb_stream_prepare_playback
(
struct
usb_stream_kernel
*
sk
,
struct
urb
*
inurb
)
static
int
usb_stream_prepare_playback
(
struct
usb_stream_kernel
*
sk
,
struct
urb
*
inurb
)
{
struct
usb_stream
*
s
=
sk
->
s
;
struct
urb
*
io
;
...
...
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