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

Modified Files:
        als4000.c azt3328.c bt87x.c cmipci.c cs4281.c ens1370.c 
        es1938.c fm801.c maestro3.c rme32.c rme96.c sonicvibes.c 
        via82xx.c 
Log Message:
Big DMA cleanup originated by Russell King <[EMAIL PROTECTED]>
* Russel
  - introduced 'struct device' support for 2.6 dma_alloc_coherent()
* Jaroslav
  - removed all bus-specific allocation functions
  - extended snd_dma_alloc_pages/snd_dma_free_pages to handle all bus types
  - recoded all (or almost all) device drivers
  - sgbuf functions are bus independent now


Index: als4000.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/pci/als4000.c,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -r1.29 -r1.30
--- als4000.c   24 Feb 2004 12:03:51 -0000      1.29
+++ als4000.c   2 Mar 2004 15:32:37 -0000       1.30
@@ -523,7 +523,8 @@
        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_als4000_playback_ops);
        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_als4000_capture_ops);
 
-       snd_pcm_lib_preallocate_pci_pages_for_all(chip->pci, pcm, 64*1024, 64*1024);
+       snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_PCI, chip->pci,
+                                             64*1024, 64*1024);
 
        chip->pcm = pcm;
 

Index: azt3328.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/pci/azt3328.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- azt3328.c   21 Jan 2004 18:32:47 -0000      1.9
+++ azt3328.c   2 Mar 2004 15:32:37 -0000       1.10
@@ -1253,7 +1253,8 @@
        strcpy(pcm->name, chip->card->shortname);
        chip->pcm = pcm;
 
-       snd_pcm_lib_preallocate_pci_pages_for_all(chip->pci, pcm, 64*1024, 64*1024);
+       snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_PCI,
+                                             chip->pci, 64*1024, 64*1024);
 
        snd_azf3328_dbgcallleave();
        return 0;

Index: bt87x.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/pci/bt87x.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- bt87x.c     28 Jan 2004 18:55:20 -0000      1.1
+++ bt87x.c     2 Mar 2004 15:32:37 -0000       1.2
@@ -167,8 +167,8 @@
        long opened;
        snd_pcm_substream_t *substream;
 
-       u32 *risc;
-       dma_addr_t risc_dma;
+       struct snd_dma_device dma_dev;
+       struct snd_dma_buffer dma_risc;
        unsigned int line_bytes;
        unsigned int lines;
 
@@ -195,13 +195,14 @@
        unsigned int i, offset;
        u32 *risc;
 
-       if (!chip->risc) {
-               chip->risc = (u32*)snd_malloc_pci_pages
-                       (chip->pci, PAGE_ALIGN(MAX_RISC_SIZE), &chip->risc_dma);
-               if (!chip->risc)
+       if (chip->dma_risc.area == NULL) {
+               memset(&chip->dma_dev, 0, sizeof(chip->dma_dev));
+               chip->dma_dev.type = SNDRV_DMA_TYPE_PCI;
+               chip->dma_dev.dev.pci = chip->pci;
+               if (snd_dma_alloc_pages(&chip->dma_dev, PAGE_ALIGN(MAX_RISC_SIZE), 
&chip->dma_risc) < 0)
                        return -ENOMEM;
        }
-       risc = chip->risc;
+       risc = (u32 *)chip->dma_risc.area;
        offset = 0;
        *risc++ = cpu_to_le32(RISC_SYNC | RISC_SYNC_FM1);
        *risc++ = cpu_to_le32(0);
@@ -233,7 +234,7 @@
        *risc++ = cpu_to_le32(RISC_SYNC | RISC_SYNC_VRO);
        *risc++ = cpu_to_le32(0);
        *risc++ = cpu_to_le32(RISC_JUMP);
-       *risc++ = cpu_to_le32(chip->risc_dma);
+       *risc++ = cpu_to_le32(chip->dma_risc.addr);
        chip->line_bytes = period_bytes;
        chip->lines = periods;
        return 0;
@@ -241,10 +242,9 @@
 
 static void snd_bt87x_free_risc(bt87x_t *chip)
 {
-       if (chip->risc) {
-               snd_free_pci_pages(chip->pci, PAGE_ALIGN(MAX_RISC_SIZE),
-                                  chip->risc, chip->risc_dma);
-               chip->risc = NULL;
+       if (chip->dma_risc.area) {
+               snd_dma_free_pages(&chip->dma_dev, &chip->dma_risc);
+               chip->dma_risc.area = NULL;
        }
 }
 
@@ -459,7 +459,7 @@
        spin_lock_irqsave(&chip->reg_lock, flags);
        chip->current_line = 0;
        chip->reg_control |= CTL_FIFO_ENABLE | CTL_RISC_ENABLE | CTL_ACAP_EN;
-       snd_bt87x_writel(chip, REG_RISC_STRT_ADD, chip->risc_dma);
+       snd_bt87x_writel(chip, REG_RISC_STRT_ADD, chip->dma_risc.addr);
        snd_bt87x_writel(chip, REG_PACKET_LEN,
                         chip->line_bytes | (chip->lines << 16));
        snd_bt87x_writel(chip, REG_INT_MASK, MY_INTERRUPTS);
@@ -681,7 +681,9 @@
        pcm->private_data = chip;
        strcpy(pcm->name, name);
        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_bt87x_pcm_ops);
-       return snd_pcm_lib_preallocate_sg_pages_for_all(chip->pci, pcm,
+       return snd_pcm_lib_preallocate_pages_for_all(pcm,
+                                                       SNDRV_DMA_TYPE_PCI_SG,
+                                                       chip->pci,
                                                        128 * 1024,
                                                        (255 * 4092 + 1023) & ~1023);
 }

Index: cmipci.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/pci/cmipci.c,v
retrieving revision 1.59
retrieving revision 1.60
diff -u -r1.59 -r1.60
--- cmipci.c    24 Feb 2004 12:04:14 -0000      1.59
+++ cmipci.c    2 Mar 2004 15:32:37 -0000       1.60
@@ -2087,7 +2087,8 @@
        strcpy(pcm->name, "C-Media PCI DAC/ADC");
        cm->pcm = pcm;
 
-       snd_pcm_lib_preallocate_pci_pages_for_all(cm->pci, pcm, 64*1024, 128*1024);
+       snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_PCI,
+                                             cm->pci, 64*1024, 128*1024);
 
        return 0;
 }
@@ -2109,7 +2110,8 @@
        strcpy(pcm->name, "C-Media PCI 2nd DAC");
        cm->pcm2 = pcm;
 
-       snd_pcm_lib_preallocate_pci_pages_for_all(cm->pci, pcm, 64*1024, 128*1024);
+       snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_PCI,
+                                             cm->pci, 64*1024, 128*1024);
 
        return 0;
 }
@@ -2139,7 +2141,8 @@
        strcpy(pcm->name, "C-Media PCI IEC958");
        cm->pcm_spdif = pcm;
 
-       snd_pcm_lib_preallocate_pci_pages_for_all(cm->pci, pcm, 64*1024, 128*1024);
+       snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_PCI,
+                                             cm->pci, 64*1024, 128*1024);
 
        return 0;
 }

Index: cs4281.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/pci/cs4281.c,v
retrieving revision 1.47
retrieving revision 1.48
diff -u -r1.47 -r1.48
--- cs4281.c    21 Jan 2004 18:32:47 -0000      1.47
+++ cs4281.c    2 Mar 2004 15:32:37 -0000       1.48
@@ -1039,7 +1039,8 @@
        strcpy(pcm->name, "CS4281");
        chip->pcm = pcm;
 
-       snd_pcm_lib_preallocate_pci_pages_for_all(chip->pci, pcm, 64*1024, 512*1024);
+       snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_PCI,
+                                             chip->pci, 64*1024, 512*1024);
 
        if (rpcm)
                *rpcm = pcm;

Index: ens1370.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/pci/ens1370.c,v
retrieving revision 1.56
retrieving revision 1.57
diff -u -r1.56 -r1.57
--- ens1370.c   21 Jan 2004 18:32:47 -0000      1.56
+++ ens1370.c   2 Mar 2004 15:32:37 -0000       1.57
@@ -434,8 +434,8 @@
        unsigned int spdif_stream;
 
 #ifdef CHIP1370
-       unsigned char *bugbuf;
-       dma_addr_t bugbuf_addr;
+       struct snd_dma_device dma_dev;
+       struct snd_dma_buffer dma_bug;
 #endif
 
 #ifdef SUPPORT_JOYSTICK
@@ -1250,7 +1250,8 @@
 #endif
        ensoniq->pcm1 = pcm;
 
-       snd_pcm_lib_preallocate_pci_pages_for_all(ensoniq->pci, pcm, 64*1024, 
128*1024);
+       snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_PCI,
+                                             ensoniq->pci, 64*1024, 128*1024);
 
        if (rpcm)
                *rpcm = pcm;
@@ -1294,7 +1295,8 @@
 #endif
        ensoniq->pcm2 = pcm;
 
-       snd_pcm_lib_preallocate_pci_pages_for_all(ensoniq->pci, pcm, 64*1024, 
128*1024);
+       snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_PCI,
+                                             ensoniq->pci, 64*1024, 128*1024);
 
        if (rpcm)
                *rpcm = pcm;
@@ -1829,8 +1831,8 @@
        pci_set_power_state(ensoniq->pci, 3);
       __hw_end:
 #ifdef CHIP1370
-       if (ensoniq->bugbuf)
-               snd_free_pci_pages(ensoniq->pci, 16, ensoniq->bugbuf, 
ensoniq->bugbuf_addr);
+       if (ensoniq->dma_bug.area)
+               snd_dma_free_pages(&ensoniq->dma_dev, &ensoniq->dma_bug);
 #endif
        if (ensoniq->res_port) {
                release_resource(ensoniq->res_port);
@@ -1911,8 +1913,11 @@
        }
        ensoniq->irq = pci->irq;
 #ifdef CHIP1370
-       if ((ensoniq->bugbuf = snd_malloc_pci_pages(pci, 16, &ensoniq->bugbuf_addr)) 
== NULL) {
-               snd_printk("unable to allocate space for phantom area - bugbuf\n");
+       memset(&ensoniq->dma_dev, 0, sizeof(ensoniq->dma_dev));
+       ensoniq->dma_dev.type = SNDRV_DMA_TYPE_PCI;
+       ensoniq->dma_dev.dev.pci = pci;
+       if (snd_dma_alloc_pages(&ensoniq->dma_dev, 16, &ensoniq->dma_bug) < 0) {
+               snd_printk("unable to allocate space for phantom area - dma_bug\n");
                snd_ensoniq_free(ensoniq);
                return -EBUSY;
        }
@@ -1936,7 +1941,7 @@
        outl(ensoniq->ctrl, ES_REG(ensoniq, CONTROL));
        outl(ensoniq->sctrl, ES_REG(ensoniq, SERIAL));
        outl(ES_MEM_PAGEO(ES_PAGE_ADC), ES_REG(ensoniq, MEM_PAGE));
-       outl(ensoniq->bugbuf_addr, ES_REG(ensoniq, PHANTOM_FRAME));
+       outl(ensoniq->dma_bug.addr, ES_REG(ensoniq, PHANTOM_FRAME));
        outl(0, ES_REG(ensoniq, PHANTOM_COUNT));
 #else
        ensoniq->ctrl = 0;

Index: es1938.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/pci/es1938.c,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -r1.31 -r1.32
--- es1938.c    26 Jan 2004 14:27:13 -0000      1.31
+++ es1938.c    2 Mar 2004 15:32:37 -0000       1.32
@@ -946,17 +946,14 @@
 static int snd_es1938_capture_close(snd_pcm_substream_t * substream)
 {
        es1938_t *chip = snd_pcm_substream_chip(substream);
-       snd_pcm_runtime_t *runtime = substream->runtime;
 
        chip->capture_substream = NULL;
-       snd_free_pci_pages(chip->pci, runtime->dma_bytes, runtime->dma_area, 
runtime->dma_addr);
        return 0;
 }
 
 static int snd_es1938_playback_close(snd_pcm_substream_t * substream)
 {
        es1938_t *chip = snd_pcm_substream_chip(substream);
-       snd_pcm_runtime_t *runtime = substream->runtime;
 
        switch (substream->number) {
        case 0:
@@ -969,7 +966,6 @@
                snd_BUG();
                return -EINVAL;
        }
-       snd_free_pci_pages(chip->pci, runtime->dma_bytes, runtime->dma_area, 
runtime->dma_addr);
        return 0;
 }
 
@@ -1018,7 +1014,8 @@
        pcm->info_flags = 0;
        strcpy(pcm->name, "ESS Solo-1");
 
-       snd_pcm_lib_preallocate_pci_pages_for_all(chip->pci, pcm, 64*1024, 64*1024);
+       snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_PCI,
+                                             chip->pci, 64*1024, 64*1024);
 
        if (rpcm)
                *rpcm = pcm;

Index: fm801.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/pci/fm801.c,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -r1.41 -r1.42
--- fm801.c     1 Mar 2004 15:23:16 -0000       1.41
+++ fm801.c     2 Mar 2004 15:32:37 -0000       1.42
@@ -703,7 +703,8 @@
        strcpy(pcm->name, "FM801");
        chip->pcm = pcm;
 
-       snd_pcm_lib_preallocate_pci_pages_for_all(chip->pci, pcm, chip->multichannel ? 
128*1024 : 64*1024, 128*1024);
+       snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_PCI,
+                                             chip->pci, chip->multichannel ? 128*1024 
: 64*1024, 128*1024);
 
        if (rpcm)
                *rpcm = pcm;

Index: maestro3.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/pci/maestro3.c,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -r1.46 -r1.47
--- maestro3.c  21 Jan 2004 18:32:47 -0000      1.46
+++ maestro3.c  2 Mar 2004 15:32:37 -0000       1.47
@@ -1816,7 +1816,8 @@
        strcpy(pcm->name, chip->card->driver);
        chip->pcm = pcm;
        
-       snd_pcm_lib_preallocate_pci_pages_for_all(chip->pci, pcm, 64*1024, 64*1024);
+       snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_PCI,
+                                             chip->pci, 64*1024, 64*1024);
 
        return 0;
 }

Index: rme32.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/pci/rme32.c,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -r1.29 -r1.30
--- rme32.c     21 Jan 2004 18:32:47 -0000      1.29
+++ rme32.c     2 Mar 2004 15:32:37 -0000       1.30
@@ -1378,9 +1378,10 @@
        rme32->spdif_pcm->info_flags = 0;
 
        snd_pcm_lib_preallocate_pages_for_all(rme32->spdif_pcm,
+                                             SNDRV_DMA_TYPE_CONTINUOUS,
+                                             snd_pcm_dma_flags(GFP_KERNEL),
                                              RME32_BUFFER_SIZE,
-                                             RME32_BUFFER_SIZE,
-                                             GFP_KERNEL);
+                                             RME32_BUFFER_SIZE);
 
        /* set up ALSA pcm device for ADAT */
        if ((pci->device == PCI_DEVICE_ID_DIGI32) ||
@@ -1405,9 +1406,10 @@
                rme32->adat_pcm->info_flags = 0;
 
                snd_pcm_lib_preallocate_pages_for_all(rme32->adat_pcm, 
+                                                     SNDRV_DMA_TYPE_CONTINUOUS,
+                                                     snd_pcm_dma_flags(GFP_KERNEL),
                                                      RME32_BUFFER_SIZE, 
-                                                     RME32_BUFFER_SIZE, 
-                                                     GFP_KERNEL);
+                                                     RME32_BUFFER_SIZE);
        }
 
 

Index: rme96.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/pci/rme96.c,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -r1.31 -r1.32
--- rme96.c     21 Jan 2004 18:32:47 -0000      1.31
+++ rme96.c     2 Mar 2004 15:32:37 -0000       1.32
@@ -1718,7 +1718,11 @@
 
        rme96->spdif_pcm->info_flags = 0;
 
-       snd_pcm_lib_preallocate_pages_for_all(rme96->spdif_pcm, RME96_BUFFER_SIZE, 
RME96_BUFFER_SIZE, GFP_KERNEL);
+       snd_pcm_lib_preallocate_pages_for_all(rme96->spdif_pcm,
+                                             SNDRV_DMA_TYPE_CONTINUOUS,
+                                             snd_pcm_dma_flags(GFP_KERNEL),
+                                             RME96_BUFFER_SIZE,
+                                             RME96_BUFFER_SIZE);
 
        /* set up ALSA pcm device for ADAT */
        if (pci->device == PCI_DEVICE_ID_DIGI96) {
@@ -1738,7 +1742,11 @@
                
                rme96->adat_pcm->info_flags = 0;
 
-               snd_pcm_lib_preallocate_pages_for_all(rme96->adat_pcm, 
RME96_BUFFER_SIZE, RME96_BUFFER_SIZE, GFP_KERNEL);
+               snd_pcm_lib_preallocate_pages_for_all(rme96->adat_pcm,
+                                                     SNDRV_DMA_TYPE_CONTINUOUS,
+                                                     snd_pcm_dma_flags(GFP_KERNEL),
+                                                     RME96_BUFFER_SIZE,
+                                                     RME96_BUFFER_SIZE);
        }
 
        rme96->playback_periodsize = 0;

Index: sonicvibes.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/pci/sonicvibes.c,v
retrieving revision 1.31
retrieving revision 1.32
diff -u -r1.31 -r1.32
--- sonicvibes.c        26 Jan 2004 14:27:13 -0000      1.31
+++ sonicvibes.c        2 Mar 2004 15:32:37 -0000       1.32
@@ -886,7 +886,8 @@
        strcpy(pcm->name, "S3 SonicVibes");
        sonic->pcm = pcm;
 
-       snd_pcm_lib_preallocate_pci_pages_for_all(sonic->pci, pcm, 64*1024, 128*1024);
+       snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_PCI,
+                                             sonic->pci, 64*1024, 128*1024);
 
        if (rpcm)
                *rpcm = pcm;

Index: via82xx.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/pci/via82xx.c,v
retrieving revision 1.88
retrieving revision 1.89
diff -u -r1.88 -r1.89
--- via82xx.c   25 Feb 2004 15:15:21 -0000      1.88
+++ via82xx.c   2 Mar 2004 15:32:37 -0000       1.89
@@ -337,8 +337,7 @@
         snd_pcm_substream_t *substream;
        int running;
        unsigned int tbl_entries; /* # descriptors */
-       u32 *table; /* physical address + flag */
-       dma_addr_t table_addr;
+       struct snd_dma_buffer table;
        struct snd_via_sg_table *idx_table;
        /* for recovery from the unexpected pointer */
        unsigned int lastpos;
@@ -347,6 +346,73 @@
 };
 
 
+enum { TYPE_CARD_VIA686 = 1, TYPE_CARD_VIA8233 };
+enum { TYPE_VIA686, TYPE_VIA8233, TYPE_VIA8233A };
+
+#define VIA_MAX_DEVS   7       /* 4 playback, 1 multi, 2 capture */
+
+struct via_rate_lock {
+       spinlock_t lock;
+       int rate;
+       int used;
+};
+
+struct _snd_via82xx {
+       int irq;
+
+       unsigned long port;
+       struct resource *res_port;
+       struct resource *mpu_res;
+       int chip_type;
+       unsigned char revision;
+
+       unsigned char old_legacy;
+       unsigned char old_legacy_cfg;
+
+       unsigned char playback_volume[4][2]; /* for VIA8233/C/8235; default = 0 */
+
+       unsigned int intr_mask; /* SGD_SHADOW mask to check interrupts */
+
+       struct pci_dev *pci;
+       snd_card_t *card;
+
+       unsigned int num_devs;
+       unsigned int playback_devno, multi_devno, capture_devno;
+       viadev_t devs[VIA_MAX_DEVS];
+       struct via_rate_lock rates[2]; /* playback and capture */
+       unsigned int dxs_fixed: 1;      /* DXS channel accepts only 48kHz */
+       unsigned int no_vra: 1;         /* no need to set VRA on DXS channels */
+
+       snd_rawmidi_t *rmidi;
+
+       ac97_bus_t *ac97_bus;
+       ac97_t *ac97;
+       unsigned int ac97_clock;
+       unsigned int ac97_secondary;    /* secondary AC'97 codec is present */
+
+       spinlock_t reg_lock;
+       spinlock_t ac97_lock;
+       snd_info_entry_t *proc_entry;
+
+       struct snd_dma_device dma_dev;
+
+#ifdef SUPPORT_JOYSTICK
+       struct gameport gameport;
+       struct resource *res_joystick;
+#endif
+};
+
+static struct pci_device_id snd_via82xx_ids[] = {
+       { 0x1106, 0x3058, PCI_ANY_ID, PCI_ANY_ID, 0, 0, TYPE_CARD_VIA686, },    /* 
686A */
+       { 0x1106, 0x3059, PCI_ANY_ID, PCI_ANY_ID, 0, 0, TYPE_CARD_VIA8233, },   /* 
VT8233 */
+       { 0, }
+};
+
+MODULE_DEVICE_TABLE(pci, snd_via82xx_ids);
+
+/*
+ */
+
 /*
  * allocate and initialize the descriptor buffers
  * periods = number of periods
@@ -357,14 +423,14 @@
                           unsigned int periods, unsigned int fragsize)
 {
        unsigned int i, idx, ofs, rest;
+       via82xx_t *chip = snd_pcm_substream_chip(substream);
        struct snd_sg_buf *sgbuf = snd_pcm_substream_sgbuf(substream);
 
-       if (! dev->table) {
+       if (dev->table.area == NULL) {
                /* the start of each lists must be aligned to 8 bytes,
                 * but the kernel pages are much bigger, so we don't care
                 */
-               dev->table = (u32*)snd_malloc_pci_pages(pci, PAGE_ALIGN(VIA_TABLE_SIZE 
* 2 * 8), &dev->table_addr);
-               if (! dev->table)
+               if (snd_dma_alloc_pages(&chip->dma_dev, PAGE_ALIGN(VIA_TABLE_SIZE * 2 
* 8), &dev->table) < 0)
                        return -ENOMEM;
        }
        if (! dev->idx_table) {
@@ -390,7 +456,7 @@
                                snd_printk(KERN_ERR "via82xx: too much table size!\n");
                                return -EINVAL;
                        }
-                       dev->table[idx << 1] = 
cpu_to_le32((u32)snd_pcm_sgbuf_get_addr(sgbuf, ofs));
+                       ((u32 *)dev->table.area)[idx << 1] = 
cpu_to_le32((u32)snd_pcm_sgbuf_get_addr(sgbuf, ofs));
                        r = PAGE_SIZE - (ofs % PAGE_SIZE);
                        if (rest < r)
                                r = rest;
@@ -403,7 +469,7 @@
                        } else
                                flag = 0; /* period continues to the next */
                        // printk("via: tbl %d: at %d  size %d (rest %d)\n", idx, ofs, 
r, rest);
-                       dev->table[(idx<<1) + 1] = cpu_to_le32(r | flag);
+                       ((u32 *)dev->table.area)[(idx<<1) + 1] = cpu_to_le32(r | flag);
                        dev->idx_table[idx].offset = ofs;
                        dev->idx_table[idx].size = r;
                        ofs += r;
@@ -417,85 +483,21 @@
 }
 
 
-static void clean_via_table(viadev_t *dev, snd_pcm_substream_t *substream,
-                           struct pci_dev *pci)
+static int clean_via_table(viadev_t *dev, snd_pcm_substream_t *substream,
+                          struct pci_dev *pci)
 {
-       if (dev->table) {
-               snd_free_pci_pages(pci, PAGE_ALIGN(VIA_TABLE_SIZE * 2 * 8), 
dev->table, dev->table_addr);
-               dev->table = NULL;
+       via82xx_t *chip = snd_pcm_substream_chip(substream);
+       if (dev->table.area) {
+               snd_dma_free_pages(&chip->dma_dev, &dev->table);
+               dev->table.area = NULL;
        }
        if (dev->idx_table) {
                kfree(dev->idx_table);
                dev->idx_table = NULL;
        }
+       return 0;
 }
 
-
-/*
- */
-
-enum { TYPE_CARD_VIA686 = 1, TYPE_CARD_VIA8233 };
-enum { TYPE_VIA686, TYPE_VIA8233, TYPE_VIA8233A };
-
-#define VIA_MAX_DEVS   7       /* 4 playback, 1 multi, 2 capture */
-
-struct via_rate_lock {
-       spinlock_t lock;
-       int rate;
-       int used;
-};
-
-struct _snd_via82xx {
-       int irq;
-
-       unsigned long port;
-       struct resource *res_port;
-       struct resource *mpu_res;
-       int chip_type;
-       unsigned char revision;
-
-       unsigned char old_legacy;
-       unsigned char old_legacy_cfg;
-
-       unsigned char playback_volume[4][2]; /* for VIA8233/C/8235; default = 0 */
-
-       unsigned int intr_mask; /* SGD_SHADOW mask to check interrupts */
-
-       struct pci_dev *pci;
-       snd_card_t *card;
-
-       unsigned int num_devs;
-       unsigned int playback_devno, multi_devno, capture_devno;
-       viadev_t devs[VIA_MAX_DEVS];
-       struct via_rate_lock rates[2]; /* playback and capture */
-       unsigned int dxs_fixed: 1;      /* DXS channel accepts only 48kHz */
-       unsigned int no_vra: 1;         /* no need to set VRA on DXS channels */
-
-       snd_rawmidi_t *rmidi;
-
-       ac97_bus_t *ac97_bus;
-       ac97_t *ac97;
-       unsigned int ac97_clock;
-       unsigned int ac97_secondary;    /* secondary AC'97 codec is present */
-
-       spinlock_t reg_lock;
-       spinlock_t ac97_lock;
-       snd_info_entry_t *proc_entry;
-
-#ifdef SUPPORT_JOYSTICK
-       struct gameport gameport;
-       struct resource *res_joystick;
-#endif
-};
-
-static struct pci_device_id snd_via82xx_ids[] = {
-       { 0x1106, 0x3058, PCI_ANY_ID, PCI_ANY_ID, 0, 0, TYPE_CARD_VIA686, },    /* 
686A */
-       { 0x1106, 0x3059, PCI_ANY_ID, PCI_ANY_ID, 0, 0, TYPE_CARD_VIA8233, },   /* 
VT8233 */
-       { 0, }
-};
-
-MODULE_DEVICE_TABLE(pci, snd_via82xx_ids);
-
 /*
  *  Basic I/O
  */
@@ -756,10 +758,10 @@
         * so we need to calculate the index from CURR_PTR.
         */
        ptr = inl(VIADEV_REG(viadev, OFFSET_CURR_PTR));
-       if (ptr <= (unsigned int)viadev->table_addr)
+       if (ptr <= (unsigned int)viadev->table.addr)
                idx = 0;
        else /* CURR_PTR holds the address + 8 */
-               idx = ((ptr - (unsigned int)viadev->table_addr) / 8 - 1) % 
viadev->tbl_entries;
+               idx = ((ptr - (unsigned int)viadev->table.addr) / 8 - 1) % 
viadev->tbl_entries;
        res = calc_linear_pos(viadev, idx, count);
        spin_unlock(&chip->reg_lock);
 
@@ -840,7 +842,7 @@
 static void snd_via82xx_set_table_ptr(via82xx_t *chip, viadev_t *viadev)
 {
        snd_via82xx_codec_ready(chip, 0);
-       outl((u32)viadev->table_addr, VIADEV_REG(viadev, OFFSET_TABLE_PTR));
+       outl((u32)viadev->table.addr, VIADEV_REG(viadev, OFFSET_TABLE_PTR));
        udelay(20);
        snd_via82xx_codec_ready(chip, 0);
 }
@@ -1288,7 +1290,8 @@
        /* capture */
        init_viadev(chip, chip->capture_devno, VIA_REG_CAPTURE_8233_STATUS, 1);
 
-       if ((err = snd_pcm_lib_preallocate_sg_pages_for_all(chip->pci, pcm, 64*1024, 
128*1024)) < 0)
+       if ((err = snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_PCI_SG,
+                                                        chip->pci, 64*1024, 
128*1024)) < 0)
                return err;
 
        /* PCM #1:  multi-channel playback and 2nd capture */
@@ -1304,7 +1307,8 @@
        /* set up capture */
        init_viadev(chip, chip->capture_devno + 1, VIA_REG_CAPTURE_8233_STATUS + 0x10, 
1);
 
-       if ((err = snd_pcm_lib_preallocate_sg_pages_for_all(chip->pci, pcm, 64*1024, 
128*1024)) < 0)
+       if ((err = snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_PCI_SG,
+                                                        chip->pci, 64*1024, 
128*1024)) < 0)
                return err;
 
        return 0;
@@ -1337,7 +1341,8 @@
        /* capture */
        init_viadev(chip, chip->capture_devno, VIA_REG_CAPTURE_8233_STATUS, 1);
 
-       if ((err = snd_pcm_lib_preallocate_sg_pages_for_all(chip->pci, pcm, 64*1024, 
128*1024)) < 0)
+       if ((err = snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_PCI_SG,
+                                                        chip->pci, 64*1024, 
128*1024)) < 0)
                return err;
 
        /* PCM #1:  DXS3 playback (for spdif) */
@@ -1350,7 +1355,8 @@
        /* set up playback */
        init_viadev(chip, chip->playback_devno, 0x30, 0);
 
-       if ((err = snd_pcm_lib_preallocate_sg_pages_for_all(chip->pci, pcm, 64*1024, 
128*1024)) < 0)
+       if ((err = snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_PCI_SG,
+                                                        chip->pci, 64*1024, 
128*1024)) < 0)
                return err;
 
        return 0;
@@ -1379,7 +1385,8 @@
        init_viadev(chip, 0, VIA_REG_PLAYBACK_STATUS, 0);
        init_viadev(chip, 1, VIA_REG_CAPTURE_STATUS, 1);
 
-       if ((err = snd_pcm_lib_preallocate_sg_pages_for_all(chip->pci, pcm, 64*1024, 
128*1024)) < 0)
+       if ((err = snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_PCI_SG,
+                                                        chip->pci, 64*1024, 
128*1024)) < 0)
                return err;
 
        return 0;
@@ -1911,6 +1918,10 @@
        chip->pci = pci;
        chip->irq = -1;
 
+       memset(&chip->dma_dev, 0, sizeof(chip->dma_dev));
+       chip->dma_dev.type = SNDRV_DMA_TYPE_PCI;
+       chip->dma_dev.dev.pci = pci;
+
        pci_read_config_byte(pci, VIA_FUNC_ENABLE, &chip->old_legacy);
        pci_read_config_byte(pci, VIA_PNP_CONTROL, &chip->old_legacy_cfg);
 



-------------------------------------------------------
SF.Net is sponsored by: Speed Start Your Linux Apps Now.
Build and deploy apps & Web services for Linux with
a free DVD software kit from IBM. Click Now!
http://ads.osdn.com/?ad_id=1356&alloc_id=3438&op=click
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog

Reply via email to