mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-31 04:01:48 -04:00
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6: (365 commits) ALSA: hda - Disable sticky PCM stream assignment for AD codecs ALSA: usb - Creative USB X-Fi volume knob support ALSA: ca0106: Use card specific dac id for mute controls. ALSA: ca0106: Allow different sound cards to use different SPI channel mappings. ALSA: ca0106: Create a nice spot for mapping channels to dacs. ALSA: ca0106: Move enabling of front dac out of hardcoded setup sequence. ALSA: ca0106: Pull out dac powering routine into separate function. ALSA: ca0106 - add Sound Blaster 5.1vx info. ASoC: tlv320dac33: Use usleep_range for delays ALSA: usb-audio: add Novation Launchpad support ALSA: hda - Add workarounds for CT-IBG controllers ALSA: hda - Fix wrong TLV mute bit for STAC/IDT codecs ASoC: tpa6130a2: Error handling for broken chip ASoC: max98088: Staticise m98088_eq_band ASoC: soc-core: Fix codec->name memory leak ALSA: hda - Apply ideapad quirk to Acer laptops with Cxt5066 ALSA: hda - Add some workarounds for Creative IBG ALSA: hda - Fix wrong SPDIF NID assignment for CA0110 ALSA: hda - Fix codec rename rules for ALC662-compatible codecs ALSA: hda - Add alc_init_jacks() call to other codecs ...
This commit is contained in:
commit
33081adf8b
479 changed files with 37901 additions and 19477 deletions
|
|
@ -545,11 +545,3 @@ config SOUND_KAHLUA
|
|||
|
||||
endif # SOUND_OSS
|
||||
|
||||
config SOUND_SH_DAC_AUDIO
|
||||
tristate "SuperH DAC audio support"
|
||||
depends on CPU_SH3 && HIGH_RES_TIMERS
|
||||
|
||||
config SOUND_SH_DAC_AUDIO_CHANNEL
|
||||
int "DAC channel"
|
||||
default "1"
|
||||
depends on SOUND_SH_DAC_AUDIO
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@ obj-$(CONFIG_SOUND_OSS) += sound.o
|
|||
|
||||
# Please leave it as is, cause the link order is significant !
|
||||
|
||||
obj-$(CONFIG_SOUND_SH_DAC_AUDIO) += sh_dac_audio.o
|
||||
obj-$(CONFIG_SOUND_AEDSP16) += aedsp16.o
|
||||
obj-$(CONFIG_SOUND_PSS) += pss.o ad1848.o mpu401.o
|
||||
obj-$(CONFIG_SOUND_TRIX) += trix.o ad1848.o sb_lib.o uart401.o
|
||||
|
|
|
|||
|
|
@ -43,7 +43,6 @@
|
|||
#include <linux/sound.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/soundcard.h>
|
||||
#include <linux/smp_lock.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/kernel.h>
|
||||
|
|
@ -77,6 +76,7 @@
|
|||
/* Boot options
|
||||
* 0 = no VRA, 1 = use VRA if codec supports it
|
||||
*/
|
||||
static DEFINE_MUTEX(au1550_ac97_mutex);
|
||||
static int vra = 1;
|
||||
module_param(vra, bool, 0);
|
||||
MODULE_PARM_DESC(vra, "if 1 use VRA if codec supports it");
|
||||
|
|
@ -171,7 +171,7 @@ au1550_delay(int msec)
|
|||
static u16
|
||||
rdcodec(struct ac97_codec *codec, u8 addr)
|
||||
{
|
||||
struct au1550_state *s = (struct au1550_state *)codec->private_data;
|
||||
struct au1550_state *s = codec->private_data;
|
||||
unsigned long flags;
|
||||
u32 cmd, val;
|
||||
u16 data;
|
||||
|
|
@ -239,7 +239,7 @@ rdcodec(struct ac97_codec *codec, u8 addr)
|
|||
static void
|
||||
wrcodec(struct ac97_codec *codec, u8 addr, u16 data)
|
||||
{
|
||||
struct au1550_state *s = (struct au1550_state *)codec->private_data;
|
||||
struct au1550_state *s = codec->private_data;
|
||||
unsigned long flags;
|
||||
u32 cmd, val;
|
||||
int i;
|
||||
|
|
@ -798,9 +798,9 @@ au1550_llseek(struct file *file, loff_t offset, int origin)
|
|||
static int
|
||||
au1550_open_mixdev(struct inode *inode, struct file *file)
|
||||
{
|
||||
lock_kernel();
|
||||
mutex_lock(&au1550_ac97_mutex);
|
||||
file->private_data = &au1550_state;
|
||||
unlock_kernel();
|
||||
mutex_unlock(&au1550_ac97_mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -820,13 +820,13 @@ mixdev_ioctl(struct ac97_codec *codec, unsigned int cmd,
|
|||
static long
|
||||
au1550_ioctl_mixdev(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
struct au1550_state *s = (struct au1550_state *)file->private_data;
|
||||
struct au1550_state *s = file->private_data;
|
||||
struct ac97_codec *codec = s->codec;
|
||||
int ret;
|
||||
|
||||
lock_kernel();
|
||||
mutex_lock(&au1550_ac97_mutex);
|
||||
ret = mixdev_ioctl(codec, cmd, arg);
|
||||
unlock_kernel();
|
||||
mutex_unlock(&au1550_ac97_mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -1031,7 +1031,7 @@ copy_dmabuf_user(struct dmabuf *db, char* userbuf, int count, int to_user)
|
|||
static ssize_t
|
||||
au1550_read(struct file *file, char *buffer, size_t count, loff_t *ppos)
|
||||
{
|
||||
struct au1550_state *s = (struct au1550_state *)file->private_data;
|
||||
struct au1550_state *s = file->private_data;
|
||||
struct dmabuf *db = &s->dma_adc;
|
||||
DECLARE_WAITQUEUE(wait, current);
|
||||
ssize_t ret;
|
||||
|
|
@ -1111,7 +1111,7 @@ out2:
|
|||
static ssize_t
|
||||
au1550_write(struct file *file, const char *buffer, size_t count, loff_t * ppos)
|
||||
{
|
||||
struct au1550_state *s = (struct au1550_state *)file->private_data;
|
||||
struct au1550_state *s = file->private_data;
|
||||
struct dmabuf *db = &s->dma_dac;
|
||||
DECLARE_WAITQUEUE(wait, current);
|
||||
ssize_t ret = 0;
|
||||
|
|
@ -1211,7 +1211,7 @@ out2:
|
|||
static unsigned int
|
||||
au1550_poll(struct file *file, struct poll_table_struct *wait)
|
||||
{
|
||||
struct au1550_state *s = (struct au1550_state *)file->private_data;
|
||||
struct au1550_state *s = file->private_data;
|
||||
unsigned long flags;
|
||||
unsigned int mask = 0;
|
||||
|
||||
|
|
@ -1250,12 +1250,12 @@ au1550_poll(struct file *file, struct poll_table_struct *wait)
|
|||
static int
|
||||
au1550_mmap(struct file *file, struct vm_area_struct *vma)
|
||||
{
|
||||
struct au1550_state *s = (struct au1550_state *)file->private_data;
|
||||
struct au1550_state *s = file->private_data;
|
||||
struct dmabuf *db;
|
||||
unsigned long size;
|
||||
int ret = 0;
|
||||
|
||||
lock_kernel();
|
||||
mutex_lock(&au1550_ac97_mutex);
|
||||
mutex_lock(&s->sem);
|
||||
if (vma->vm_flags & VM_WRITE)
|
||||
db = &s->dma_dac;
|
||||
|
|
@ -1283,7 +1283,7 @@ au1550_mmap(struct file *file, struct vm_area_struct *vma)
|
|||
db->mapped = 1;
|
||||
out:
|
||||
mutex_unlock(&s->sem);
|
||||
unlock_kernel();
|
||||
mutex_unlock(&au1550_ac97_mutex);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -1342,7 +1342,7 @@ dma_count_done(struct dmabuf *db)
|
|||
static int
|
||||
au1550_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
struct au1550_state *s = (struct au1550_state *)file->private_data;
|
||||
struct au1550_state *s = file->private_data;
|
||||
unsigned long flags;
|
||||
audio_buf_info abinfo;
|
||||
count_info cinfo;
|
||||
|
|
@ -1781,9 +1781,9 @@ au1550_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
|||
{
|
||||
int ret;
|
||||
|
||||
lock_kernel();
|
||||
mutex_lock(&au1550_ac97_mutex);
|
||||
ret = au1550_ioctl(file, cmd, arg);
|
||||
unlock_kernel();
|
||||
mutex_unlock(&au1550_ac97_mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -1804,7 +1804,7 @@ au1550_open(struct inode *inode, struct file *file)
|
|||
#endif
|
||||
|
||||
file->private_data = s;
|
||||
lock_kernel();
|
||||
mutex_lock(&au1550_ac97_mutex);
|
||||
/* wait for device to become free */
|
||||
mutex_lock(&s->open_mutex);
|
||||
while (s->open_mode & file->f_mode) {
|
||||
|
|
@ -1861,21 +1861,21 @@ au1550_open(struct inode *inode, struct file *file)
|
|||
out:
|
||||
mutex_unlock(&s->open_mutex);
|
||||
out2:
|
||||
unlock_kernel();
|
||||
mutex_unlock(&au1550_ac97_mutex);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
au1550_release(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct au1550_state *s = (struct au1550_state *)file->private_data;
|
||||
struct au1550_state *s = file->private_data;
|
||||
|
||||
lock_kernel();
|
||||
mutex_lock(&au1550_ac97_mutex);
|
||||
|
||||
if (file->f_mode & FMODE_WRITE) {
|
||||
unlock_kernel();
|
||||
mutex_unlock(&au1550_ac97_mutex);
|
||||
drain_dac(s, file->f_flags & O_NONBLOCK);
|
||||
lock_kernel();
|
||||
mutex_lock(&au1550_ac97_mutex);
|
||||
}
|
||||
|
||||
mutex_lock(&s->open_mutex);
|
||||
|
|
@ -1892,7 +1892,7 @@ au1550_release(struct inode *inode, struct file *file)
|
|||
s->open_mode &= ((~file->f_mode) & (FMODE_READ|FMODE_WRITE));
|
||||
mutex_unlock(&s->open_mutex);
|
||||
wake_up(&s->open_wait);
|
||||
unlock_kernel();
|
||||
mutex_unlock(&au1550_ac97_mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -181,7 +181,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/soundcard.h>
|
||||
#include <linux/poll.h>
|
||||
#include <linux/smp_lock.h>
|
||||
#include <linux/mutex.h>
|
||||
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
|
|
@ -194,6 +194,7 @@
|
|||
* Declarations
|
||||
*/
|
||||
|
||||
static DEFINE_MUTEX(dmasound_core_mutex);
|
||||
int dmasound_catchRadius = 0;
|
||||
module_param(dmasound_catchRadius, int, 0);
|
||||
|
||||
|
|
@ -323,22 +324,22 @@ static struct {
|
|||
|
||||
static int mixer_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
lock_kernel();
|
||||
mutex_lock(&dmasound_core_mutex);
|
||||
if (!try_module_get(dmasound.mach.owner)) {
|
||||
unlock_kernel();
|
||||
mutex_unlock(&dmasound_core_mutex);
|
||||
return -ENODEV;
|
||||
}
|
||||
mixer.busy = 1;
|
||||
unlock_kernel();
|
||||
mutex_unlock(&dmasound_core_mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mixer_release(struct inode *inode, struct file *file)
|
||||
{
|
||||
lock_kernel();
|
||||
mutex_lock(&dmasound_core_mutex);
|
||||
mixer.busy = 0;
|
||||
module_put(dmasound.mach.owner);
|
||||
unlock_kernel();
|
||||
mutex_unlock(&dmasound_core_mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -370,9 +371,9 @@ static long mixer_unlocked_ioctl(struct file *file, u_int cmd, u_long arg)
|
|||
{
|
||||
int ret;
|
||||
|
||||
lock_kernel();
|
||||
mutex_lock(&dmasound_core_mutex);
|
||||
ret = mixer_ioctl(file, cmd, arg);
|
||||
unlock_kernel();
|
||||
mutex_unlock(&dmasound_core_mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -752,9 +753,9 @@ static int sq_open(struct inode *inode, struct file *file)
|
|||
{
|
||||
int rc;
|
||||
|
||||
lock_kernel();
|
||||
mutex_lock(&dmasound_core_mutex);
|
||||
if (!try_module_get(dmasound.mach.owner)) {
|
||||
unlock_kernel();
|
||||
mutex_unlock(&dmasound_core_mutex);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
|
@ -799,11 +800,11 @@ static int sq_open(struct inode *inode, struct file *file)
|
|||
sound_set_format(AFMT_MU_LAW);
|
||||
}
|
||||
#endif
|
||||
unlock_kernel();
|
||||
mutex_unlock(&dmasound_core_mutex);
|
||||
return 0;
|
||||
out:
|
||||
module_put(dmasound.mach.owner);
|
||||
unlock_kernel();
|
||||
mutex_unlock(&dmasound_core_mutex);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
|
@ -869,7 +870,7 @@ static int sq_release(struct inode *inode, struct file *file)
|
|||
{
|
||||
int rc = 0;
|
||||
|
||||
lock_kernel();
|
||||
mutex_lock(&dmasound_core_mutex);
|
||||
|
||||
if (file->f_mode & FMODE_WRITE) {
|
||||
if (write_sq.busy)
|
||||
|
|
@ -900,7 +901,7 @@ static int sq_release(struct inode *inode, struct file *file)
|
|||
write_sq_wake_up(file); /* checks f_mode */
|
||||
#endif /* blocking open() */
|
||||
|
||||
unlock_kernel();
|
||||
mutex_unlock(&dmasound_core_mutex);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
|
@ -1141,9 +1142,9 @@ static long sq_unlocked_ioctl(struct file *file, u_int cmd, u_long arg)
|
|||
{
|
||||
int ret;
|
||||
|
||||
lock_kernel();
|
||||
mutex_lock(&dmasound_core_mutex);
|
||||
ret = sq_ioctl(file, cmd, arg);
|
||||
unlock_kernel();
|
||||
mutex_unlock(&dmasound_core_mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -1257,7 +1258,7 @@ static int state_open(struct inode *inode, struct file *file)
|
|||
int len = 0;
|
||||
int ret;
|
||||
|
||||
lock_kernel();
|
||||
mutex_lock(&dmasound_core_mutex);
|
||||
ret = -EBUSY;
|
||||
if (state.busy)
|
||||
goto out;
|
||||
|
|
@ -1329,16 +1330,16 @@ printk("dmasound: stat buffer used %d bytes\n", len) ;
|
|||
state.len = len;
|
||||
ret = 0;
|
||||
out:
|
||||
unlock_kernel();
|
||||
mutex_unlock(&dmasound_core_mutex);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int state_release(struct inode *inode, struct file *file)
|
||||
{
|
||||
lock_kernel();
|
||||
mutex_lock(&dmasound_core_mutex);
|
||||
state.busy = 0;
|
||||
module_put(dmasound.mach.owner);
|
||||
unlock_kernel();
|
||||
mutex_unlock(&dmasound_core_mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@
|
|||
#include <linux/delay.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/smp_lock.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/io.h>
|
||||
|
|
@ -79,6 +79,7 @@
|
|||
dev.rec_sample_rate / \
|
||||
dev.rec_channels)
|
||||
|
||||
static DEFINE_MUTEX(msnd_pinnacle_mutex);
|
||||
static multisound_dev_t dev;
|
||||
|
||||
#ifndef HAVE_DSPCODEH
|
||||
|
|
@ -651,12 +652,12 @@ static long dev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
|||
|
||||
ret = -EINVAL;
|
||||
|
||||
lock_kernel();
|
||||
mutex_lock(&msnd_pinnacle_mutex);
|
||||
if (minor == dev.dsp_minor)
|
||||
ret = dsp_ioctl(file, cmd, arg);
|
||||
else if (minor == dev.mixer_minor)
|
||||
ret = mixer_ioctl(cmd, arg);
|
||||
unlock_kernel();
|
||||
mutex_unlock(&msnd_pinnacle_mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -761,7 +762,7 @@ static int dev_open(struct inode *inode, struct file *file)
|
|||
int minor = iminor(inode);
|
||||
int err = 0;
|
||||
|
||||
lock_kernel();
|
||||
mutex_lock(&msnd_pinnacle_mutex);
|
||||
if (minor == dev.dsp_minor) {
|
||||
if ((file->f_mode & FMODE_WRITE &&
|
||||
test_bit(F_AUDIO_WRITE_INUSE, &dev.flags)) ||
|
||||
|
|
@ -791,7 +792,7 @@ static int dev_open(struct inode *inode, struct file *file)
|
|||
} else
|
||||
err = -EINVAL;
|
||||
out:
|
||||
unlock_kernel();
|
||||
mutex_unlock(&msnd_pinnacle_mutex);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
@ -800,14 +801,14 @@ static int dev_release(struct inode *inode, struct file *file)
|
|||
int minor = iminor(inode);
|
||||
int err = 0;
|
||||
|
||||
lock_kernel();
|
||||
mutex_lock(&msnd_pinnacle_mutex);
|
||||
if (minor == dev.dsp_minor)
|
||||
err = dsp_release(file);
|
||||
else if (minor == dev.mixer_minor) {
|
||||
/* nothing */
|
||||
} else
|
||||
err = -EINVAL;
|
||||
unlock_kernel();
|
||||
mutex_unlock(&msnd_pinnacle_mutex);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,325 +0,0 @@
|
|||
/*
|
||||
* sound/oss/sh_dac_audio.c
|
||||
*
|
||||
* SH DAC based sound :(
|
||||
*
|
||||
* Copyright (C) 2004,2005 Andriy Skulysh
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*/
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/sound.h>
|
||||
#include <linux/smp_lock.h>
|
||||
#include <linux/soundcard.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/hrtimer.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/delay.h>
|
||||
#include <asm/clock.h>
|
||||
#include <cpu/dac.h>
|
||||
#include <asm/machvec.h>
|
||||
#include <mach/hp6xx.h>
|
||||
#include <asm/hd64461.h>
|
||||
|
||||
#define MODNAME "sh_dac_audio"
|
||||
|
||||
#define BUFFER_SIZE 48000
|
||||
|
||||
static int rate;
|
||||
static int empty;
|
||||
static char *data_buffer, *buffer_begin, *buffer_end;
|
||||
static int in_use, device_major;
|
||||
static struct hrtimer hrtimer;
|
||||
static ktime_t wakeups_per_second;
|
||||
|
||||
static void dac_audio_start_timer(void)
|
||||
{
|
||||
hrtimer_start(&hrtimer, wakeups_per_second, HRTIMER_MODE_REL);
|
||||
}
|
||||
|
||||
static void dac_audio_stop_timer(void)
|
||||
{
|
||||
hrtimer_cancel(&hrtimer);
|
||||
}
|
||||
|
||||
static void dac_audio_reset(void)
|
||||
{
|
||||
dac_audio_stop_timer();
|
||||
buffer_begin = buffer_end = data_buffer;
|
||||
empty = 1;
|
||||
}
|
||||
|
||||
static void dac_audio_sync(void)
|
||||
{
|
||||
while (!empty)
|
||||
schedule();
|
||||
}
|
||||
|
||||
static void dac_audio_start(void)
|
||||
{
|
||||
if (mach_is_hp6xx()) {
|
||||
u16 v = __raw_readw(HD64461_GPADR);
|
||||
v &= ~HD64461_GPADR_SPEAKER;
|
||||
__raw_writew(v, HD64461_GPADR);
|
||||
}
|
||||
|
||||
sh_dac_enable(CONFIG_SOUND_SH_DAC_AUDIO_CHANNEL);
|
||||
}
|
||||
static void dac_audio_stop(void)
|
||||
{
|
||||
dac_audio_stop_timer();
|
||||
|
||||
if (mach_is_hp6xx()) {
|
||||
u16 v = __raw_readw(HD64461_GPADR);
|
||||
v |= HD64461_GPADR_SPEAKER;
|
||||
__raw_writew(v, HD64461_GPADR);
|
||||
}
|
||||
|
||||
sh_dac_output(0, CONFIG_SOUND_SH_DAC_AUDIO_CHANNEL);
|
||||
sh_dac_disable(CONFIG_SOUND_SH_DAC_AUDIO_CHANNEL);
|
||||
}
|
||||
|
||||
static void dac_audio_set_rate(void)
|
||||
{
|
||||
wakeups_per_second = ktime_set(0, 1000000000 / rate);
|
||||
}
|
||||
|
||||
static int dac_audio_ioctl(struct file *file,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
int val;
|
||||
|
||||
switch (cmd) {
|
||||
case OSS_GETVERSION:
|
||||
return put_user(SOUND_VERSION, (int *)arg);
|
||||
|
||||
case SNDCTL_DSP_SYNC:
|
||||
dac_audio_sync();
|
||||
return 0;
|
||||
|
||||
case SNDCTL_DSP_RESET:
|
||||
dac_audio_reset();
|
||||
return 0;
|
||||
|
||||
case SNDCTL_DSP_GETFMTS:
|
||||
return put_user(AFMT_U8, (int *)arg);
|
||||
|
||||
case SNDCTL_DSP_SETFMT:
|
||||
return put_user(AFMT_U8, (int *)arg);
|
||||
|
||||
case SNDCTL_DSP_NONBLOCK:
|
||||
spin_lock(&file->f_lock);
|
||||
file->f_flags |= O_NONBLOCK;
|
||||
spin_unlock(&file->f_lock);
|
||||
return 0;
|
||||
|
||||
case SNDCTL_DSP_GETCAPS:
|
||||
return 0;
|
||||
|
||||
case SOUND_PCM_WRITE_RATE:
|
||||
val = *(int *)arg;
|
||||
if (val > 0) {
|
||||
rate = val;
|
||||
dac_audio_set_rate();
|
||||
}
|
||||
return put_user(rate, (int *)arg);
|
||||
|
||||
case SNDCTL_DSP_STEREO:
|
||||
return put_user(0, (int *)arg);
|
||||
|
||||
case SOUND_PCM_WRITE_CHANNELS:
|
||||
return put_user(1, (int *)arg);
|
||||
|
||||
case SNDCTL_DSP_SETDUPLEX:
|
||||
return -EINVAL;
|
||||
|
||||
case SNDCTL_DSP_PROFILE:
|
||||
return -EINVAL;
|
||||
|
||||
case SNDCTL_DSP_GETBLKSIZE:
|
||||
return put_user(BUFFER_SIZE, (int *)arg);
|
||||
|
||||
case SNDCTL_DSP_SETFRAGMENT:
|
||||
return 0;
|
||||
|
||||
default:
|
||||
printk(KERN_ERR "sh_dac_audio: unimplemented ioctl=0x%x\n",
|
||||
cmd);
|
||||
return -EINVAL;
|
||||
}
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static long dac_audio_unlocked_ioctl(struct file *file, u_int cmd, u_long arg)
|
||||
{
|
||||
int ret;
|
||||
|
||||
lock_kernel();
|
||||
ret = dac_audio_ioctl(file, cmd, arg);
|
||||
unlock_kernel();
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ssize_t dac_audio_write(struct file *file, const char *buf, size_t count,
|
||||
loff_t * ppos)
|
||||
{
|
||||
int free;
|
||||
int nbytes;
|
||||
|
||||
if (!count) {
|
||||
dac_audio_sync();
|
||||
return 0;
|
||||
}
|
||||
|
||||
free = buffer_begin - buffer_end;
|
||||
|
||||
if (free < 0)
|
||||
free += BUFFER_SIZE;
|
||||
if ((free == 0) && (empty))
|
||||
free = BUFFER_SIZE;
|
||||
if (count > free)
|
||||
count = free;
|
||||
if (buffer_begin > buffer_end) {
|
||||
if (copy_from_user((void *)buffer_end, buf, count))
|
||||
return -EFAULT;
|
||||
|
||||
buffer_end += count;
|
||||
} else {
|
||||
nbytes = data_buffer + BUFFER_SIZE - buffer_end;
|
||||
if (nbytes > count) {
|
||||
if (copy_from_user((void *)buffer_end, buf, count))
|
||||
return -EFAULT;
|
||||
buffer_end += count;
|
||||
} else {
|
||||
if (copy_from_user((void *)buffer_end, buf, nbytes))
|
||||
return -EFAULT;
|
||||
if (copy_from_user
|
||||
((void *)data_buffer, buf + nbytes, count - nbytes))
|
||||
return -EFAULT;
|
||||
buffer_end = data_buffer + count - nbytes;
|
||||
}
|
||||
}
|
||||
|
||||
if (empty) {
|
||||
empty = 0;
|
||||
dac_audio_start_timer();
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t dac_audio_read(struct file *file, char *buf, size_t count,
|
||||
loff_t * ppos)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int dac_audio_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
if (file->f_mode & FMODE_READ)
|
||||
return -ENODEV;
|
||||
|
||||
lock_kernel();
|
||||
if (in_use) {
|
||||
unlock_kernel();
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
in_use = 1;
|
||||
|
||||
dac_audio_start();
|
||||
unlock_kernel();
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dac_audio_release(struct inode *inode, struct file *file)
|
||||
{
|
||||
dac_audio_sync();
|
||||
dac_audio_stop();
|
||||
in_use = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
const struct file_operations dac_audio_fops = {
|
||||
.read = dac_audio_read,
|
||||
.write = dac_audio_write,
|
||||
.unlocked_ioctl = dac_audio_unlocked_ioctl,
|
||||
.open = dac_audio_open,
|
||||
.release = dac_audio_release,
|
||||
};
|
||||
|
||||
static enum hrtimer_restart sh_dac_audio_timer(struct hrtimer *handle)
|
||||
{
|
||||
if (!empty) {
|
||||
sh_dac_output(*buffer_begin, CONFIG_SOUND_SH_DAC_AUDIO_CHANNEL);
|
||||
buffer_begin++;
|
||||
|
||||
if (buffer_begin == data_buffer + BUFFER_SIZE)
|
||||
buffer_begin = data_buffer;
|
||||
if (buffer_begin == buffer_end)
|
||||
empty = 1;
|
||||
}
|
||||
|
||||
if (!empty)
|
||||
hrtimer_start(&hrtimer, wakeups_per_second, HRTIMER_MODE_REL);
|
||||
|
||||
return HRTIMER_NORESTART;
|
||||
}
|
||||
|
||||
static int __init dac_audio_init(void)
|
||||
{
|
||||
if ((device_major = register_sound_dsp(&dac_audio_fops, -1)) < 0) {
|
||||
printk(KERN_ERR "Cannot register dsp device");
|
||||
return device_major;
|
||||
}
|
||||
|
||||
in_use = 0;
|
||||
|
||||
data_buffer = kmalloc(BUFFER_SIZE, GFP_KERNEL);
|
||||
if (data_buffer == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
dac_audio_reset();
|
||||
rate = 8000;
|
||||
dac_audio_set_rate();
|
||||
|
||||
/* Today: High Resolution Timer driven DAC playback.
|
||||
* The timer callback gets called once per sample. Ouch.
|
||||
*
|
||||
* Future: A much better approach would be to use the
|
||||
* SH7720 CMT+DMAC+DAC hardware combination like this:
|
||||
* - Program sample rate using CMT0 or CMT1
|
||||
* - Program DMAC to use CMT for timing and output to DAC
|
||||
* - Play sound using DMAC, let CPU sleep.
|
||||
* - While at it, rewrite this driver to use ALSA.
|
||||
*/
|
||||
|
||||
hrtimer_init(&hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
|
||||
hrtimer.function = sh_dac_audio_timer;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit dac_audio_exit(void)
|
||||
{
|
||||
unregister_sound_dsp(device_major);
|
||||
kfree((void *)data_buffer);
|
||||
}
|
||||
|
||||
module_init(dac_audio_init);
|
||||
module_exit(dac_audio_exit);
|
||||
|
||||
MODULE_AUTHOR("Andriy Skulysh, [email protected]");
|
||||
MODULE_DESCRIPTION("SH DAC sound driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
@ -40,7 +40,7 @@
|
|||
#include <linux/major.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/smp_lock.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/device.h>
|
||||
|
|
@ -56,6 +56,7 @@
|
|||
* Table for permanently allocated memory (used when unloading the module)
|
||||
*/
|
||||
void * sound_mem_blocks[MAX_MEM_BLOCKS];
|
||||
static DEFINE_MUTEX(soundcard_mutex);
|
||||
int sound_nblocks = 0;
|
||||
|
||||
/* Persistent DMA buffers */
|
||||
|
|
@ -151,7 +152,7 @@ static ssize_t sound_read(struct file *file, char __user *buf, size_t count, lof
|
|||
* big one anyway, we might as well bandage here..
|
||||
*/
|
||||
|
||||
lock_kernel();
|
||||
mutex_lock(&soundcard_mutex);
|
||||
|
||||
DEB(printk("sound_read(dev=%d, count=%d)\n", dev, count));
|
||||
switch (dev & 0x0f) {
|
||||
|
|
@ -169,7 +170,7 @@ static ssize_t sound_read(struct file *file, char __user *buf, size_t count, lof
|
|||
case SND_DEV_MIDIN:
|
||||
ret = MIDIbuf_read(dev, file, buf, count);
|
||||
}
|
||||
unlock_kernel();
|
||||
mutex_unlock(&soundcard_mutex);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -178,7 +179,7 @@ static ssize_t sound_write(struct file *file, const char __user *buf, size_t cou
|
|||
int dev = iminor(file->f_path.dentry->d_inode);
|
||||
int ret = -EINVAL;
|
||||
|
||||
lock_kernel();
|
||||
mutex_lock(&soundcard_mutex);
|
||||
DEB(printk("sound_write(dev=%d, count=%d)\n", dev, count));
|
||||
switch (dev & 0x0f) {
|
||||
case SND_DEV_SEQ:
|
||||
|
|
@ -196,7 +197,7 @@ static ssize_t sound_write(struct file *file, const char __user *buf, size_t cou
|
|||
ret = MIDIbuf_write(dev, file, buf, count);
|
||||
break;
|
||||
}
|
||||
unlock_kernel();
|
||||
mutex_unlock(&soundcard_mutex);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -210,7 +211,7 @@ static int sound_open(struct inode *inode, struct file *file)
|
|||
printk(KERN_ERR "Invalid minor device %d\n", dev);
|
||||
return -ENXIO;
|
||||
}
|
||||
lock_kernel();
|
||||
mutex_lock(&soundcard_mutex);
|
||||
switch (dev & 0x0f) {
|
||||
case SND_DEV_CTL:
|
||||
dev >>= 4;
|
||||
|
|
@ -247,15 +248,15 @@ static int sound_open(struct inode *inode, struct file *file)
|
|||
retval = -ENXIO;
|
||||
}
|
||||
|
||||
unlock_kernel();
|
||||
return 0;
|
||||
mutex_unlock(&soundcard_mutex);
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int sound_release(struct inode *inode, struct file *file)
|
||||
{
|
||||
int dev = iminor(inode);
|
||||
|
||||
lock_kernel();
|
||||
mutex_lock(&soundcard_mutex);
|
||||
DEB(printk("sound_release(dev=%d)\n", dev));
|
||||
switch (dev & 0x0f) {
|
||||
case SND_DEV_CTL:
|
||||
|
|
@ -280,7 +281,7 @@ static int sound_release(struct inode *inode, struct file *file)
|
|||
default:
|
||||
printk(KERN_ERR "Sound error: Releasing unknown device 0x%02x\n", dev);
|
||||
}
|
||||
unlock_kernel();
|
||||
mutex_unlock(&soundcard_mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -354,7 +355,7 @@ static long sound_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
|||
if (cmd == OSS_GETVERSION)
|
||||
return __put_user(SOUND_VERSION, (int __user *)p);
|
||||
|
||||
lock_kernel();
|
||||
mutex_lock(&soundcard_mutex);
|
||||
if (_IOC_TYPE(cmd) == 'M' && num_mixers > 0 && /* Mixer ioctl */
|
||||
(dev & 0x0f) != SND_DEV_CTL) {
|
||||
dtype = dev & 0x0f;
|
||||
|
|
@ -369,7 +370,7 @@ static long sound_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
|||
ret = sound_mixer_ioctl(dev >> 4, cmd, p);
|
||||
break;
|
||||
}
|
||||
unlock_kernel();
|
||||
mutex_unlock(&soundcard_mutex);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -399,7 +400,7 @@ static long sound_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
|||
break;
|
||||
|
||||
}
|
||||
unlock_kernel();
|
||||
mutex_unlock(&soundcard_mutex);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -439,35 +440,35 @@ static int sound_mmap(struct file *file, struct vm_area_struct *vma)
|
|||
printk(KERN_ERR "Sound: mmap() not supported for other than audio devices\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
lock_kernel();
|
||||
mutex_lock(&soundcard_mutex);
|
||||
if (vma->vm_flags & VM_WRITE) /* Map write and read/write to the output buf */
|
||||
dmap = audio_devs[dev]->dmap_out;
|
||||
else if (vma->vm_flags & VM_READ)
|
||||
dmap = audio_devs[dev]->dmap_in;
|
||||
else {
|
||||
printk(KERN_ERR "Sound: Undefined mmap() access\n");
|
||||
unlock_kernel();
|
||||
mutex_unlock(&soundcard_mutex);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (dmap == NULL) {
|
||||
printk(KERN_ERR "Sound: mmap() error. dmap == NULL\n");
|
||||
unlock_kernel();
|
||||
mutex_unlock(&soundcard_mutex);
|
||||
return -EIO;
|
||||
}
|
||||
if (dmap->raw_buf == NULL) {
|
||||
printk(KERN_ERR "Sound: mmap() called when raw_buf == NULL\n");
|
||||
unlock_kernel();
|
||||
mutex_unlock(&soundcard_mutex);
|
||||
return -EIO;
|
||||
}
|
||||
if (dmap->mapping_flags) {
|
||||
printk(KERN_ERR "Sound: mmap() called twice for the same DMA buffer\n");
|
||||
unlock_kernel();
|
||||
mutex_unlock(&soundcard_mutex);
|
||||
return -EIO;
|
||||
}
|
||||
if (vma->vm_pgoff != 0) {
|
||||
printk(KERN_ERR "Sound: mmap() offset must be 0.\n");
|
||||
unlock_kernel();
|
||||
mutex_unlock(&soundcard_mutex);
|
||||
return -EINVAL;
|
||||
}
|
||||
size = vma->vm_end - vma->vm_start;
|
||||
|
|
@ -478,7 +479,7 @@ static int sound_mmap(struct file *file, struct vm_area_struct *vma)
|
|||
if (remap_pfn_range(vma, vma->vm_start,
|
||||
virt_to_phys(dmap->raw_buf) >> PAGE_SHIFT,
|
||||
vma->vm_end - vma->vm_start, vma->vm_page_prot)) {
|
||||
unlock_kernel();
|
||||
mutex_unlock(&soundcard_mutex);
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
|
|
@ -490,7 +491,7 @@ static int sound_mmap(struct file *file, struct vm_area_struct *vma)
|
|||
memset(dmap->raw_buf,
|
||||
dmap->neutral_byte,
|
||||
dmap->bytes_in_use);
|
||||
unlock_kernel();
|
||||
mutex_unlock(&soundcard_mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -68,7 +68,6 @@
|
|||
#include <linux/delay.h>
|
||||
#include <linux/sound.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/smp_lock.h>
|
||||
#include <linux/soundcard.h>
|
||||
#include <linux/ac97_codec.h>
|
||||
#include <linux/pci.h>
|
||||
|
|
@ -94,6 +93,7 @@
|
|||
|
||||
struct cs4297a_state;
|
||||
|
||||
static DEFINE_MUTEX(swarm_cs4297a_mutex);
|
||||
static void stop_dac(struct cs4297a_state *s);
|
||||
static void stop_adc(struct cs4297a_state *s);
|
||||
static void start_dac(struct cs4297a_state *s);
|
||||
|
|
@ -1535,7 +1535,7 @@ static int cs4297a_open_mixdev(struct inode *inode, struct file *file)
|
|||
CS_DBGOUT(CS_FUNCTION | CS_OPEN, 4,
|
||||
printk(KERN_INFO "cs4297a: cs4297a_open_mixdev()+\n"));
|
||||
|
||||
lock_kernel();
|
||||
mutex_lock(&swarm_cs4297a_mutex);
|
||||
list_for_each(entry, &cs4297a_devs)
|
||||
{
|
||||
s = list_entry(entry, struct cs4297a_state, list);
|
||||
|
|
@ -1547,7 +1547,7 @@ static int cs4297a_open_mixdev(struct inode *inode, struct file *file)
|
|||
CS_DBGOUT(CS_FUNCTION | CS_OPEN | CS_ERROR, 2,
|
||||
printk(KERN_INFO "cs4297a: cs4297a_open_mixdev()- -ENODEV\n"));
|
||||
|
||||
unlock_kernel();
|
||||
mutex_unlock(&swarm_cs4297a_mutex);
|
||||
return -ENODEV;
|
||||
}
|
||||
VALIDATE_STATE(s);
|
||||
|
|
@ -1555,7 +1555,7 @@ static int cs4297a_open_mixdev(struct inode *inode, struct file *file)
|
|||
|
||||
CS_DBGOUT(CS_FUNCTION | CS_OPEN, 4,
|
||||
printk(KERN_INFO "cs4297a: cs4297a_open_mixdev()- 0\n"));
|
||||
unlock_kernel();
|
||||
mutex_unlock(&swarm_cs4297a_mutex);
|
||||
|
||||
return nonseekable_open(inode, file);
|
||||
}
|
||||
|
|
@ -1575,10 +1575,10 @@ static int cs4297a_ioctl_mixdev(struct file *file,
|
|||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
int ret;
|
||||
lock_kernel();
|
||||
mutex_lock(&swarm_cs4297a_mutex);
|
||||
ret = mixer_ioctl((struct cs4297a_state *) file->private_data, cmd,
|
||||
arg);
|
||||
unlock_kernel();
|
||||
mutex_unlock(&swarm_cs4297a_mutex);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -2350,9 +2350,9 @@ static long cs4297a_unlocked_ioctl(struct file *file, u_int cmd, u_long arg)
|
|||
{
|
||||
int ret;
|
||||
|
||||
lock_kernel();
|
||||
mutex_lock(&swarm_cs4297a_mutex);
|
||||
ret = cs4297a_ioctl(file, cmd, arg);
|
||||
unlock_kernel();
|
||||
mutex_unlock(&swarm_cs4297a_mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -2509,9 +2509,9 @@ static int cs4297a_open(struct inode *inode, struct file *file)
|
|||
{
|
||||
int ret;
|
||||
|
||||
lock_kernel();
|
||||
mutex_lock(&swarm_cs4297a_mutex);
|
||||
ret = cs4297a_open(inode, file);
|
||||
unlock_kernel();
|
||||
mutex_unlock(&swarm_cs4297a_mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -145,7 +145,6 @@
|
|||
#include <linux/init.h>
|
||||
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/smp_lock.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/mutex.h>
|
||||
|
|
@ -160,6 +159,7 @@
|
|||
|
||||
#ifdef VWSND_DEBUG
|
||||
|
||||
static DEFINE_MUTEX(vwsnd_mutex);
|
||||
static int shut_up = 1;
|
||||
|
||||
/*
|
||||
|
|
@ -2891,11 +2891,11 @@ static long vwsnd_audio_ioctl(struct file *file,
|
|||
vwsnd_dev_t *devc = (vwsnd_dev_t *) file->private_data;
|
||||
int ret;
|
||||
|
||||
lock_kernel();
|
||||
mutex_lock(&vwsnd_mutex);
|
||||
mutex_lock(&devc->io_mutex);
|
||||
ret = vwsnd_audio_do_ioctl(file, cmd, arg);
|
||||
mutex_unlock(&devc->io_mutex);
|
||||
unlock_kernel();
|
||||
mutex_unlock(&vwsnd_mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -2922,7 +2922,7 @@ static int vwsnd_audio_open(struct inode *inode, struct file *file)
|
|||
|
||||
DBGE("(inode=0x%p, file=0x%p)\n", inode, file);
|
||||
|
||||
lock_kernel();
|
||||
mutex_lock(&vwsnd_mutex);
|
||||
INC_USE_COUNT;
|
||||
for (devc = vwsnd_dev_list; devc; devc = devc->next_dev)
|
||||
if ((devc->audio_minor & ~0x0F) == (minor & ~0x0F))
|
||||
|
|
@ -2930,7 +2930,7 @@ static int vwsnd_audio_open(struct inode *inode, struct file *file)
|
|||
|
||||
if (devc == NULL) {
|
||||
DEC_USE_COUNT;
|
||||
unlock_kernel();
|
||||
mutex_unlock(&vwsnd_mutex);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
|
@ -2939,13 +2939,13 @@ static int vwsnd_audio_open(struct inode *inode, struct file *file)
|
|||
mutex_unlock(&devc->open_mutex);
|
||||
if (file->f_flags & O_NONBLOCK) {
|
||||
DEC_USE_COUNT;
|
||||
unlock_kernel();
|
||||
mutex_unlock(&vwsnd_mutex);
|
||||
return -EBUSY;
|
||||
}
|
||||
interruptible_sleep_on(&devc->open_wait);
|
||||
if (signal_pending(current)) {
|
||||
DEC_USE_COUNT;
|
||||
unlock_kernel();
|
||||
mutex_unlock(&vwsnd_mutex);
|
||||
return -ERESTARTSYS;
|
||||
}
|
||||
mutex_lock(&devc->open_mutex);
|
||||
|
|
@ -2998,7 +2998,7 @@ static int vwsnd_audio_open(struct inode *inode, struct file *file)
|
|||
|
||||
file->private_data = devc;
|
||||
DBGRV();
|
||||
unlock_kernel();
|
||||
mutex_unlock(&vwsnd_mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -3012,7 +3012,7 @@ static int vwsnd_audio_release(struct inode *inode, struct file *file)
|
|||
vwsnd_port_t *wport = NULL, *rport = NULL;
|
||||
int err = 0;
|
||||
|
||||
lock_kernel();
|
||||
mutex_lock(&vwsnd_mutex);
|
||||
mutex_lock(&devc->io_mutex);
|
||||
{
|
||||
DBGEV("(inode=0x%p, file=0x%p)\n", inode, file);
|
||||
|
|
@ -3040,7 +3040,7 @@ static int vwsnd_audio_release(struct inode *inode, struct file *file)
|
|||
wake_up(&devc->open_wait);
|
||||
DEC_USE_COUNT;
|
||||
DBGR();
|
||||
unlock_kernel();
|
||||
mutex_unlock(&vwsnd_mutex);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
@ -3068,18 +3068,18 @@ static int vwsnd_mixer_open(struct inode *inode, struct file *file)
|
|||
DBGEV("(inode=0x%p, file=0x%p)\n", inode, file);
|
||||
|
||||
INC_USE_COUNT;
|
||||
lock_kernel();
|
||||
mutex_lock(&vwsnd_mutex);
|
||||
for (devc = vwsnd_dev_list; devc; devc = devc->next_dev)
|
||||
if (devc->mixer_minor == iminor(inode))
|
||||
break;
|
||||
|
||||
if (devc == NULL) {
|
||||
DEC_USE_COUNT;
|
||||
unlock_kernel();
|
||||
mutex_unlock(&vwsnd_mutex);
|
||||
return -ENODEV;
|
||||
}
|
||||
file->private_data = devc;
|
||||
unlock_kernel();
|
||||
mutex_unlock(&vwsnd_mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -3223,7 +3223,7 @@ static long vwsnd_mixer_ioctl(struct file *file,
|
|||
|
||||
DBGEV("(devc=0x%p, cmd=0x%x, arg=0x%lx)\n", devc, cmd, arg);
|
||||
|
||||
lock_kernel();
|
||||
mutex_lock(&vwsnd_mutex);
|
||||
mutex_lock(&devc->mix_mutex);
|
||||
{
|
||||
if ((cmd & ~nrmask) == MIXER_READ(0))
|
||||
|
|
@ -3234,7 +3234,7 @@ static long vwsnd_mixer_ioctl(struct file *file,
|
|||
retval = -EINVAL;
|
||||
}
|
||||
mutex_unlock(&devc->mix_mutex);
|
||||
unlock_kernel();
|
||||
mutex_unlock(&vwsnd_mutex);
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue