This commit was manufactured by cvs2svn to create branch 'vserver'.
[linux-2.6.git] / sound / drivers / dummy.c
index b6fba1a..a61640c 100644 (file)
@@ -34,8 +34,7 @@
 MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>");
 MODULE_DESCRIPTION("Dummy soundcard (/dev/null)");
 MODULE_LICENSE("GPL");
-MODULE_CLASSES("{sound}");
-MODULE_DEVICES("{{ALSA,Dummy soundcard}}");
+MODULE_SUPPORTED_DEVICE("{{ALSA,Dummy soundcard}}");
 
 #define MAX_PCM_DEVICES                4
 #define MAX_PCM_SUBSTREAMS     16
@@ -129,26 +128,19 @@ static int enable[SNDRV_CARDS] = {1, [1 ... (SNDRV_CARDS - 1)] = 0};
 static int pcm_devs[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 1};
 static int pcm_substreams[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 8};
 //static int midi_devs[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = 2};
-static int boot_devs;
 
-module_param_array(index, int, boot_devs, 0444);
+module_param_array(index, int, NULL, 0444);
 MODULE_PARM_DESC(index, "Index value for dummy soundcard.");
-MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
-module_param_array(id, charp, boot_devs, 0444);
+module_param_array(id, charp, NULL, 0444);
 MODULE_PARM_DESC(id, "ID string for dummy soundcard.");
-MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
-module_param_array(enable, bool, boot_devs, 0444);
+module_param_array(enable, bool, NULL, 0444);
 MODULE_PARM_DESC(enable, "Enable this dummy soundcard.");
-MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
-module_param_array(pcm_devs, int, boot_devs, 0444);
+module_param_array(pcm_devs, int, NULL, 0444);
 MODULE_PARM_DESC(pcm_devs, "PCM devices # (0-4) for dummy driver.");
-MODULE_PARM_SYNTAX(pcm_devs, SNDRV_ENABLED ",allows:{{0,4}},default:1,dialog:list");
-module_param_array(pcm_substreams, int, boot_devs, 0444);
+module_param_array(pcm_substreams, int, NULL, 0444);
 MODULE_PARM_DESC(pcm_substreams, "PCM substreams # (1-16) for dummy driver.");
-MODULE_PARM_SYNTAX(pcm_substreams, SNDRV_ENABLED ",allows:{{1,16}},default:8,dialog:list");
-//module_param_array(midi_devs, int, boot_devs, 0444);
+//module_param_array(midi_devs, int, NULL, 0444);
 //MODULE_PARM_DESC(midi_devs, "MIDI devices # (0-2) for dummy driver.");
-//MODULE_PARM_SYNTAX(midi_devs, SNDRV_ENABLED ",allows:{{0,2}},default:8,dialog:list");
 
 #define MIXER_ADDR_MASTER      0
 #define MIXER_ADDR_LINE                1
@@ -180,24 +172,10 @@ typedef struct snd_card_dummy_pcm {
 static snd_card_t *snd_dummy_cards[SNDRV_CARDS] = SNDRV_DEFAULT_PTR;
 
 
-static int snd_card_dummy_playback_ioctl(snd_pcm_substream_t * substream,
-                                        unsigned int cmd,
-                                        void *arg)
-{
-       return snd_pcm_lib_ioctl(substream, cmd, arg);
-}
-
-static int snd_card_dummy_capture_ioctl(snd_pcm_substream_t * substream,
-                                       unsigned int cmd,
-                                       void *arg)
-{
-       return snd_pcm_lib_ioctl(substream, cmd, arg);
-}
-
 static void snd_card_dummy_pcm_timer_start(snd_pcm_substream_t * substream)
 {
        snd_pcm_runtime_t *runtime = substream->runtime;
-       snd_card_dummy_pcm_t *dpcm = snd_magic_cast(snd_card_dummy_pcm_t, runtime->private_data, return);
+       snd_card_dummy_pcm_t *dpcm = runtime->private_data;
 
        dpcm->timer.expires = 1 + jiffies;
        add_timer(&dpcm->timer);
@@ -206,7 +184,7 @@ static void snd_card_dummy_pcm_timer_start(snd_pcm_substream_t * substream)
 static void snd_card_dummy_pcm_timer_stop(snd_pcm_substream_t * substream)
 {
        snd_pcm_runtime_t *runtime = substream->runtime;
-       snd_card_dummy_pcm_t *dpcm = snd_magic_cast(snd_card_dummy_pcm_t, runtime->private_data, return);
+       snd_card_dummy_pcm_t *dpcm = runtime->private_data;
 
        del_timer(&dpcm->timer);
 }
@@ -240,7 +218,7 @@ static int snd_card_dummy_capture_trigger(snd_pcm_substream_t * substream,
 static int snd_card_dummy_pcm_prepare(snd_pcm_substream_t * substream)
 {
        snd_pcm_runtime_t *runtime = substream->runtime;
-       snd_card_dummy_pcm_t *dpcm = snd_magic_cast(snd_card_dummy_pcm_t, runtime->private_data, return -ENXIO);
+       snd_card_dummy_pcm_t *dpcm = runtime->private_data;
        unsigned int bps;
 
        bps = runtime->rate * runtime->channels;
@@ -269,7 +247,7 @@ static int snd_card_dummy_capture_prepare(snd_pcm_substream_t * substream)
 
 static void snd_card_dummy_pcm_timer_function(unsigned long data)
 {
-       snd_card_dummy_pcm_t *dpcm = snd_magic_cast(snd_card_dummy_pcm_t, (void *)data, return);
+       snd_card_dummy_pcm_t *dpcm = (snd_card_dummy_pcm_t *)data;
        
        dpcm->timer.expires = 1 + jiffies;
        add_timer(&dpcm->timer);
@@ -287,7 +265,7 @@ static void snd_card_dummy_pcm_timer_function(unsigned long data)
 static snd_pcm_uframes_t snd_card_dummy_playback_pointer(snd_pcm_substream_t * substream)
 {
        snd_pcm_runtime_t *runtime = substream->runtime;
-       snd_card_dummy_pcm_t *dpcm = snd_magic_cast(snd_card_dummy_pcm_t, runtime->private_data, return -ENXIO);
+       snd_card_dummy_pcm_t *dpcm = runtime->private_data;
 
        return bytes_to_frames(runtime, dpcm->pcm_buf_pos);
 }
@@ -295,7 +273,7 @@ static snd_pcm_uframes_t snd_card_dummy_playback_pointer(snd_pcm_substream_t * s
 static snd_pcm_uframes_t snd_card_dummy_capture_pointer(snd_pcm_substream_t * substream)
 {
        snd_pcm_runtime_t *runtime = substream->runtime;
-       snd_card_dummy_pcm_t *dpcm = snd_magic_cast(snd_card_dummy_pcm_t, runtime->private_data, return -ENXIO);
+       snd_card_dummy_pcm_t *dpcm = runtime->private_data;
 
        return bytes_to_frames(runtime, dpcm->pcm_buf_pos);
 }
@@ -338,8 +316,19 @@ static snd_pcm_hardware_t snd_card_dummy_capture =
 
 static void snd_card_dummy_runtime_free(snd_pcm_runtime_t *runtime)
 {
-       snd_card_dummy_pcm_t *dpcm = snd_magic_cast(snd_card_dummy_pcm_t, runtime->private_data, return);
-       snd_magic_kfree(dpcm);
+       snd_card_dummy_pcm_t *dpcm = runtime->private_data;
+       kfree(dpcm);
+}
+
+static int snd_card_dummy_hw_params(snd_pcm_substream_t * substream,
+                                   snd_pcm_hw_params_t * hw_params)
+{
+       return snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params));
+}
+
+static int snd_card_dummy_hw_free(snd_pcm_substream_t * substream)
+{
+       return snd_pcm_lib_free_pages(substream);
 }
 
 static int snd_card_dummy_playback_open(snd_pcm_substream_t * substream)
@@ -348,13 +337,9 @@ static int snd_card_dummy_playback_open(snd_pcm_substream_t * substream)
        snd_card_dummy_pcm_t *dpcm;
        int err;
 
-       dpcm = snd_magic_kcalloc(snd_card_dummy_pcm_t, 0, GFP_KERNEL);
+       dpcm = kcalloc(1, sizeof(*dpcm), GFP_KERNEL);
        if (dpcm == NULL)
                return -ENOMEM;
-       if ((runtime->dma_area = snd_malloc_pages_fallback(MAX_BUFFER_SIZE, GFP_KERNEL, &runtime->dma_bytes)) == NULL) {
-               snd_magic_kfree(dpcm);
-               return -ENOMEM;
-       }
        init_timer(&dpcm->timer);
        dpcm->timer.data = (unsigned long) dpcm;
        dpcm->timer.function = snd_card_dummy_pcm_timer_function;
@@ -370,7 +355,7 @@ static int snd_card_dummy_playback_open(snd_pcm_substream_t * substream)
        if (substream->pcm->device & 2)
                runtime->hw.info &= ~(SNDRV_PCM_INFO_MMAP|SNDRV_PCM_INFO_MMAP_VALID);
        if ((err = add_playback_constraints(runtime)) < 0) {
-               snd_magic_kfree(dpcm);
+               kfree(dpcm);
                return err;
        }
 
@@ -383,14 +368,9 @@ static int snd_card_dummy_capture_open(snd_pcm_substream_t * substream)
        snd_card_dummy_pcm_t *dpcm;
        int err;
 
-       dpcm = snd_magic_kcalloc(snd_card_dummy_pcm_t, 0, GFP_KERNEL);
+       dpcm = kcalloc(1, sizeof(*dpcm), GFP_KERNEL);
        if (dpcm == NULL)
                return -ENOMEM;
-       if ((runtime->dma_area = snd_malloc_pages_fallback(MAX_BUFFER_SIZE, GFP_KERNEL, &runtime->dma_bytes)) == NULL) {
-               snd_magic_kfree(dpcm);
-               return -ENOMEM;
-       }
-       memset(runtime->dma_area, 0, runtime->dma_bytes);
        init_timer(&dpcm->timer);
        dpcm->timer.data = (unsigned long) dpcm;
        dpcm->timer.function = snd_card_dummy_pcm_timer_function;
@@ -406,7 +386,7 @@ static int snd_card_dummy_capture_open(snd_pcm_substream_t * substream)
        if (substream->pcm->device & 2)
                runtime->hw.info &= ~(SNDRV_PCM_INFO_MMAP|SNDRV_PCM_INFO_MMAP_VALID);
        if ((err = add_capture_constraints(runtime)) < 0) {
-               snd_magic_kfree(dpcm);
+               kfree(dpcm);
                return err;
        }
 
@@ -415,24 +395,20 @@ static int snd_card_dummy_capture_open(snd_pcm_substream_t * substream)
 
 static int snd_card_dummy_playback_close(snd_pcm_substream_t * substream)
 {
-       snd_pcm_runtime_t *runtime = substream->runtime;
-
-       snd_free_pages(runtime->dma_area, runtime->dma_bytes);
        return 0;
 }
 
 static int snd_card_dummy_capture_close(snd_pcm_substream_t * substream)
 {
-       snd_pcm_runtime_t *runtime = substream->runtime;
-
-       snd_free_pages(runtime->dma_area, runtime->dma_bytes);
        return 0;
 }
 
 static snd_pcm_ops_t snd_card_dummy_playback_ops = {
        .open =                 snd_card_dummy_playback_open,
        .close =                snd_card_dummy_playback_close,
-       .ioctl =                snd_card_dummy_playback_ioctl,
+       .ioctl =                snd_pcm_lib_ioctl,
+       .hw_params =            snd_card_dummy_hw_params,
+       .hw_free =              snd_card_dummy_hw_free,
        .prepare =              snd_card_dummy_playback_prepare,
        .trigger =              snd_card_dummy_playback_trigger,
        .pointer =              snd_card_dummy_playback_pointer,
@@ -441,7 +417,9 @@ static snd_pcm_ops_t snd_card_dummy_playback_ops = {
 static snd_pcm_ops_t snd_card_dummy_capture_ops = {
        .open =                 snd_card_dummy_capture_open,
        .close =                snd_card_dummy_capture_close,
-       .ioctl =                snd_card_dummy_capture_ioctl,
+       .ioctl =                snd_pcm_lib_ioctl,
+       .hw_params =            snd_card_dummy_hw_params,
+       .hw_free =              snd_card_dummy_hw_free,
        .prepare =              snd_card_dummy_capture_prepare,
        .trigger =              snd_card_dummy_capture_trigger,
        .pointer =              snd_card_dummy_capture_pointer,
@@ -459,6 +437,9 @@ static int __init snd_card_dummy_pcm(snd_card_dummy_t *dummy, int device, int su
        pcm->private_data = dummy;
        pcm->info_flags = 0;
        strcpy(pcm->name, "Dummy PCM");
+       snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_CONTINUOUS,
+                                             snd_dma_continuous_data(GFP_KERNEL),
+                                             0, 64*1024);
        return 0;
 }
 
@@ -479,7 +460,7 @@ static int snd_dummy_volume_info(snd_kcontrol_t * kcontrol, snd_ctl_elem_info_t
  
 static int snd_dummy_volume_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
 {
-       snd_card_dummy_t *dummy = _snd_kcontrol_chip(kcontrol);
+       snd_card_dummy_t *dummy = snd_kcontrol_chip(kcontrol);
        unsigned long flags;
        int addr = kcontrol->private_value;
 
@@ -488,11 +469,11 @@ static int snd_dummy_volume_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t
        ucontrol->value.integer.value[1] = dummy->mixer_volume[addr][1];
        spin_unlock_irqrestore(&dummy->mixer_lock, flags);
        return 0;
-}                                                                                                                                                                                                                                                                                                            
+}
 
 static int snd_dummy_volume_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
 {
-       snd_card_dummy_t *dummy = _snd_kcontrol_chip(kcontrol);
+       snd_card_dummy_t *dummy = snd_kcontrol_chip(kcontrol);
        unsigned long flags;
        int change, addr = kcontrol->private_value;
        int left, right;
@@ -514,7 +495,7 @@ static int snd_dummy_volume_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t
        dummy->mixer_volume[addr][1] = right;
        spin_unlock_irqrestore(&dummy->mixer_lock, flags);
        return change;
-}                                                                                                                                                                                                                                                                                                            
+}
 
 #define DUMMY_CAPSRC(xname, xindex, addr) \
 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
@@ -533,7 +514,7 @@ static int snd_dummy_capsrc_info(snd_kcontrol_t * kcontrol, snd_ctl_elem_info_t
  
 static int snd_dummy_capsrc_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
 {
-       snd_card_dummy_t *dummy = _snd_kcontrol_chip(kcontrol);
+       snd_card_dummy_t *dummy = snd_kcontrol_chip(kcontrol);
        unsigned long flags;
        int addr = kcontrol->private_value;
 
@@ -546,7 +527,7 @@ static int snd_dummy_capsrc_get(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t
 
 static int snd_dummy_capsrc_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
 {
-       snd_card_dummy_t *dummy = _snd_kcontrol_chip(kcontrol);
+       snd_card_dummy_t *dummy = snd_kcontrol_chip(kcontrol);
        unsigned long flags;
        int change, addr = kcontrol->private_value;
        int left, right;
@@ -560,9 +541,7 @@ static int snd_dummy_capsrc_put(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t
        dummy->capture_source[addr][1] = right;
        spin_unlock_irqrestore(&dummy->mixer_lock, flags);
        return change;
-}                                                                                                                                                                                                                                                                                                            
-
-#define DUMMY_CONTROLS (sizeof(snd_dummy_controls)/sizeof(snd_kcontrol_new_t))
+}
 
 static snd_kcontrol_new_t snd_dummy_controls[] = {
 DUMMY_VOLUME("Master Volume", 0, MIXER_ADDR_MASTER),
@@ -577,7 +556,7 @@ DUMMY_VOLUME("CD Volume", 0, MIXER_ADDR_CD),
 DUMMY_CAPSRC("CD Capture Switch", 0, MIXER_ADDR_MASTER)
 };
 
-int __init snd_card_dummy_new_mixer(snd_card_dummy_t * dummy)
+static int __init snd_card_dummy_new_mixer(snd_card_dummy_t * dummy)
 {
        snd_card_t *card = dummy->card;
        unsigned int idx;
@@ -587,7 +566,7 @@ int __init snd_card_dummy_new_mixer(snd_card_dummy_t * dummy)
        spin_lock_init(&dummy->mixer_lock);
        strcpy(card->mixername, "Dummy Mixer");
 
-       for (idx = 0; idx < DUMMY_CONTROLS; idx++) {
+       for (idx = 0; idx < ARRAY_SIZE(snd_dummy_controls); idx++) {
                if ((err = snd_ctl_add(card, snd_ctl_new1(&snd_dummy_controls[idx], dummy))) < 0)
                        return err;
        }