aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorJaroslav Kysela <perex@suse.cz>2004-12-21 16:49:25 +0100
committerJaroslav Kysela <perex@suse.cz>2004-12-21 16:49:25 +0100
commit1efef61e8dc73a81356328651ae839fcf59dec86 (patch)
tree8548af52fbfadd9c10f4cd3a8eded82b2321210e /sound
parentce15ed41e87d853d19274cdd160f4b21b5e8a640 (diff)
downloadhistory-1efef61e8dc73a81356328651ae839fcf59dec86.tar.gz
[ALSA] Export functions for ioctl32 wrapper
Control Midlevel,PCM Midlevel,ALSA Core Export some functions to access from ioctl32 wrapper. This will reduce the memory footprint (doublly kmalloc's for the same ioctl records). Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound')
-rw-r--r--sound/core/control.c62
-rw-r--r--sound/core/pcm_lib.c1
-rw-r--r--sound/core/pcm_native.c4
-rw-r--r--sound/core/sound.c4
4 files changed, 47 insertions, 24 deletions
diff --git a/sound/core/control.c b/sound/core/control.c
index 9b000f7ec1a306..191a0ed67060e9 100644
--- a/sound/core/control.c
+++ b/sound/core/control.c
@@ -635,19 +635,13 @@ static int snd_ctl_elem_info(snd_ctl_file_t *ctl, snd_ctl_elem_info_t __user *_i
return result;
}
-static int snd_ctl_elem_read(snd_card_t *card, snd_ctl_elem_value_t __user *_control)
+int snd_ctl_elem_read(snd_card_t *card, snd_ctl_elem_value_t *control)
{
- snd_ctl_elem_value_t *control;
snd_kcontrol_t *kctl;
snd_kcontrol_volatile_t *vd;
unsigned int index_offset;
int result, indirect;
-
- control = kmalloc(sizeof(*control), GFP_KERNEL);
- if (control == NULL)
- return -ENOMEM;
- if (copy_from_user(control, _control, sizeof(*control)))
- return -EFAULT;
+
down_read(&card->controls_rwsem);
kctl = snd_ctl_find_id(card, &control->id);
if (kctl == NULL) {
@@ -668,27 +662,37 @@ static int snd_ctl_elem_read(snd_card_t *card, snd_ctl_elem_value_t __user *_con
}
}
up_read(&card->controls_rwsem);
+ return result;
+}
+
+static int snd_ctl_elem_read_user(snd_card_t *card, snd_ctl_elem_value_t __user *_control)
+{
+ snd_ctl_elem_value_t *control;
+ int result;
+
+ control = kmalloc(sizeof(*control), GFP_KERNEL);
+ if (control == NULL)
+ return -ENOMEM;
+ if (copy_from_user(control, _control, sizeof(*control))) {
+ kfree(control);
+ return -EFAULT;
+ }
+ result = snd_ctl_elem_read(card, control);
if (result >= 0)
if (copy_to_user(_control, control, sizeof(*control)))
- return -EFAULT;
+ result = -EFAULT;
kfree(control);
return result;
}
-static int snd_ctl_elem_write(snd_ctl_file_t *file, snd_ctl_elem_value_t __user *_control)
+int snd_ctl_elem_write(snd_ctl_file_t *file, snd_ctl_elem_value_t *control)
{
snd_card_t *card = file->card;
- snd_ctl_elem_value_t *control;
snd_kcontrol_t *kctl;
snd_kcontrol_volatile_t *vd;
unsigned int index_offset;
int result, indirect;
- control = kmalloc(sizeof(*control), GFP_KERNEL);
- if (control == NULL)
- return -ENOMEM;
- if (copy_from_user(control, _control, sizeof(*control)))
- return -EFAULT;
down_read(&card->controls_rwsem);
kctl = snd_ctl_find_id(card, &control->id);
if (kctl == NULL) {
@@ -711,16 +715,30 @@ static int snd_ctl_elem_write(snd_ctl_file_t *file, snd_ctl_elem_value_t __user
if (result > 0) {
up_read(&card->controls_rwsem);
snd_ctl_notify(card, SNDRV_CTL_EVENT_MASK_VALUE, &control->id);
- result = 0;
- goto __unlocked;
+ return 0;
}
}
}
up_read(&card->controls_rwsem);
- __unlocked:
+ return result;
+}
+
+static int snd_ctl_elem_write_user(snd_ctl_file_t *file, snd_ctl_elem_value_t __user *_control)
+{
+ snd_ctl_elem_value_t *control;
+ int result;
+
+ control = kmalloc(sizeof(*control), GFP_KERNEL);
+ if (control == NULL)
+ return -ENOMEM;
+ if (copy_from_user(control, _control, sizeof(*control))) {
+ kfree(control);
+ return -EFAULT;
+ }
+ result = snd_ctl_elem_write(file, control);
if (result >= 0)
if (copy_to_user(_control, control, sizeof(*control)))
- return -EFAULT;
+ result = -EFAULT;
kfree(control);
return result;
}
@@ -1045,9 +1063,9 @@ static inline int _snd_ctl_ioctl(struct inode *inode, struct file *file,
case SNDRV_CTL_IOCTL_ELEM_INFO:
return snd_ctl_elem_info(ctl, argp);
case SNDRV_CTL_IOCTL_ELEM_READ:
- return snd_ctl_elem_read(ctl->card, argp);
+ return snd_ctl_elem_read_user(ctl->card, argp);
case SNDRV_CTL_IOCTL_ELEM_WRITE:
- return snd_ctl_elem_write(ctl, argp);
+ return snd_ctl_elem_write_user(ctl, argp);
case SNDRV_CTL_IOCTL_ELEM_LOCK:
return snd_ctl_elem_lock(ctl, argp);
case SNDRV_CTL_IOCTL_ELEM_UNLOCK:
diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c
index 07ee3a9476f4a1..4d0b0f719721a2 100644
--- a/sound/core/pcm_lib.c
+++ b/sound/core/pcm_lib.c
@@ -2660,6 +2660,7 @@ EXPORT_SYMBOL(snd_pcm_hw_param_last);
EXPORT_SYMBOL(snd_pcm_hw_param_near);
EXPORT_SYMBOL(snd_pcm_hw_param_set);
EXPORT_SYMBOL(snd_pcm_hw_refine);
+EXPORT_SYMBOL(snd_pcm_hw_params);
EXPORT_SYMBOL(snd_pcm_hw_constraints_init);
EXPORT_SYMBOL(snd_pcm_hw_constraints_complete);
EXPORT_SYMBOL(snd_pcm_hw_constraint_list);
diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c
index b503741679d358..366e00facde48f 100644
--- a/sound/core/pcm_native.c
+++ b/sound/core/pcm_native.c
@@ -329,8 +329,8 @@ out:
return err;
}
-static int snd_pcm_hw_params(snd_pcm_substream_t *substream,
- snd_pcm_hw_params_t *params)
+int snd_pcm_hw_params(snd_pcm_substream_t *substream,
+ snd_pcm_hw_params_t *params)
{
snd_pcm_runtime_t *runtime;
int err;
diff --git a/sound/core/sound.c b/sound/core/sound.c
index 1fef4ed60a33b3..bf94a8d4a8b0b6 100644
--- a/sound/core/sound.c
+++ b/sound/core/sound.c
@@ -475,6 +475,10 @@ EXPORT_SYMBOL(snd_ctl_find_id);
EXPORT_SYMBOL(snd_ctl_notify);
EXPORT_SYMBOL(snd_ctl_register_ioctl);
EXPORT_SYMBOL(snd_ctl_unregister_ioctl);
+#ifdef CONFIG_COMPAT
+EXPORT_SYMBOL(snd_ctl_elem_read);
+EXPORT_SYMBOL(snd_ctl_elem_write);
+#endif
/* misc.c */
EXPORT_SYMBOL(snd_task_name);
#ifdef CONFIG_SND_VERBOSE_PRINTK