Update of /cvsroot/alsa/alsa-kernel/parisc
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv32133

Modified Files:
        harmony.c 
Log Message:
- fixed the buffer handling without dma_alloc_coherent support.



Index: harmony.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/parisc/harmony.c,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
--- harmony.c   7 May 2004 17:04:31 -0000       1.10
+++ harmony.c   24 May 2004 14:51:51 -0000      1.11
@@ -751,6 +751,8 @@
        int err;
        
        err = snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params));
+       if (err > 0 && substream->dma_device.type == SNDRV_DMA_TYPE_CONTINUOUS)
+               substream->runtime->dma_addr = __pa(substream->runtime->dma_area);
        DPRINTK(KERN_INFO PFX "HW Params returned %d, dma_addr %lx\n", err,
                        (unsigned long)substream->runtime->dma_addr);
        return err;
@@ -784,7 +786,7 @@
        .pointer =              snd_card_harmony_capture_pointer,
 };
 
-static int snd_card_harmony_pcm_init(snd_card_harmony_t *harmony, int device)
+static int snd_card_harmony_pcm_init(snd_card_harmony_t *harmony)
 {
        snd_pcm_t *pcm;
        int err;
@@ -797,7 +799,7 @@
        
        snd_harmony_disable_interrupts(harmony);
        
-       if ((err = snd_pcm_new(harmony->card, "Harmony", device, 1, 1, &pcm)) < 0)
+       if ((err = snd_pcm_new(harmony->card, "Harmony", 0, 1, 1, &pcm)) < 0)
                return err;
        
        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, 
&snd_card_harmony_playback_ops);
@@ -813,26 +815,46 @@
        harmony->dma_dev.dev = &harmony->pa_dev->dev;
        err = snd_dma_alloc_pages(&harmony->dma_dev, HARMONY_BUF_SIZE*GRAVEYARD_BUFS,
                                  &harmony->graveyard_dma);
-       if (err < 0)
+       if (err == -ENOMEM) {
+               /* use continuous buffers */
+               harmony->dma_dev.type = SNDRV_DMA_TYPE_CONTINUOUS;
+               harmony->dma_dev.dev = snd_dma_continuous_data(GFP_KERNEL);
+               err = snd_dma_alloc_pages(&harmony->dma_dev, 
HARMONY_BUF_SIZE*GRAVEYARD_BUFS,
+                                         &harmony->graveyard_dma);
+       }
+       if (err < 0) {
+               printk(KERN_ERR PFX "can't allocate graveyard buffer\n");
                return err;
+       }
        harmony->graveyard_count = 0;
        
        /* initialize silence buffers */
        err = snd_dma_alloc_pages(&harmony->dma_dev, HARMONY_BUF_SIZE*SILENCE_BUFS,
                                  &harmony->silence_dma);
-       if (err < 0)
+       if (err < 0) {
+               printk(KERN_ERR PFX "can't allocate silence buffer\n");
                return err;
+       }
        harmony->silence_count = 0;
 
+       if (harmony->dma_dev.type == SNDRV_DMA_TYPE_CONTINUOUS) {
+               harmony->graveyard_dma.addr = __pa(harmony->graveyard_dma.area);
+               harmony->silence_dma.addr = __pa(harmony->silence_dma.area);
+       }
+
        harmony->ply_stopped = harmony->cap_stopped = 1;
        
        harmony->playback_substream = NULL;
        harmony->capture_substream = NULL;
        harmony->graveyard_count = 0;
-       
-       snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
-                                             &harmony->pa_dev->dev,
-                                             MAX_BUFFER_SIZE, MAX_BUFFER_SIZE);
+
+       err = snd_pcm_lib_preallocate_pages_for_all(pcm, harmony->dma_dev.type,
+                                                   harmony->dma_dev.dev,
+                                                   MAX_BUFFER_SIZE, MAX_BUFFER_SIZE);
+       if (err < 0) {
+               printk(KERN_ERR PFX "buffer allocation error %d\n", err);
+               // return err;
+       }
 
        return 0;
 }
@@ -1037,7 +1059,7 @@
                snd_card_free(card);
                return err;
        }
-       if ((err = snd_card_harmony_pcm_init(chip, dev)) < 0) {
+       if ((err = snd_card_harmony_pcm_init(chip)) < 0) {
                printk(KERN_ERR PFX "PCM Init failed\n");
                snd_card_free(card);
                return err;



-------------------------------------------------------
This SF.Net email is sponsored by: Oracle 10g
Get certified on the hottest thing ever to hit the market... Oracle 10g. 
Take an Oracle 10g class now, and we'll give you the exam FREE.
http://ads.osdn.com/?ad_id=3149&alloc_id=8166&op=click
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog

Reply via email to