linux/sound/oss/dmabuf.c
<<
>>
Prefs
   1/*
   2 * sound/oss/dmabuf.c
   3 *
   4 * The DMA buffer manager for digitized voice applications
   5 */
   6/*
   7 * Copyright (C) by Hannu Savolainen 1993-1997
   8 *
   9 * OSS/Free for Linux is distributed under the GNU GENERAL PUBLIC LICENSE (GPL)
  10 * Version 2 (June 1991). See the "COPYING" file distributed with this software
  11 * for more info.
  12 *
  13 * Thomas Sailer   : moved several static variables into struct audio_operations
  14 *                   (which is grossly misnamed btw.) because they have the same
  15 *                   lifetime as the rest in there and dynamic allocation saves
  16 *                   12k or so
  17 * Thomas Sailer   : remove {in,out}_sleep_flag. It was used for the sleeper to
  18 *                   determine if it was woken up by the expiring timeout or by
  19 *                   an explicit wake_up. The return value from schedule_timeout
  20 *                   can be used instead; if 0, the wakeup was due to the timeout.
  21 *
  22 * Rob Riggs            Added persistent DMA buffers (1998/10/17)
  23 */
  24
  25#define BE_CONSERVATIVE
  26#define SAMPLE_ROUNDUP 0
  27
  28#include <linux/mm.h>
  29#include <linux/gfp.h>
  30#include "sound_config.h"
  31
  32#define DMAP_FREE_ON_CLOSE      0
  33#define DMAP_KEEP_ON_CLOSE      1
  34extern int sound_dmap_flag;
  35
  36static void dma_reset_output(int dev);
  37static void dma_reset_input(int dev);
  38static int local_start_dma(struct audio_operations *adev, unsigned long physaddr, int count, int dma_mode);
  39
  40
  41
  42static int debugmem;            /* switched off by default */
  43static int dma_buffsize = DSP_BUFFSIZE;
  44
  45static long dmabuf_timeout(struct dma_buffparms *dmap)
  46{
  47        long tmout;
  48
  49        tmout = (dmap->fragment_size * HZ) / dmap->data_rate;
  50        tmout += HZ / 5;        /* Some safety distance */
  51        if (tmout < (HZ / 2))
  52                tmout = HZ / 2;
  53        if (tmout > 20 * HZ)
  54                tmout = 20 * HZ;
  55        return tmout;
  56}
  57
  58static int sound_alloc_dmap(struct dma_buffparms *dmap)
  59{
  60        char *start_addr, *end_addr;
  61        int dma_pagesize;
  62        int sz, size;
  63        struct page *page;
  64
  65        dmap->mapping_flags &= ~DMA_MAP_MAPPED;
  66
  67        if (dmap->raw_buf != NULL)
  68                return 0;       /* Already done */
  69        if (dma_buffsize < 4096)
  70                dma_buffsize = 4096;
  71        dma_pagesize = (dmap->dma < 4) ? (64 * 1024) : (128 * 1024);
  72        
  73        /*
  74         *      Now check for the Cyrix problem.
  75         */
  76         
  77        if(isa_dma_bridge_buggy==2)
  78                dma_pagesize=32768;
  79         
  80        dmap->raw_buf = NULL;
  81        dmap->buffsize = dma_buffsize;
  82        if (dmap->buffsize > dma_pagesize)
  83                dmap->buffsize = dma_pagesize;
  84        start_addr = NULL;
  85        /*
  86         * Now loop until we get a free buffer. Try to get smaller buffer if
  87         * it fails. Don't accept smaller than 8k buffer for performance
  88         * reasons.
  89         */
  90        while (start_addr == NULL && dmap->buffsize > PAGE_SIZE) {
  91                for (sz = 0, size = PAGE_SIZE; size < dmap->buffsize; sz++, size <<= 1);
  92                dmap->buffsize = PAGE_SIZE * (1 << sz);
  93                start_addr = (char *) __get_free_pages(GFP_ATOMIC|GFP_DMA|__GFP_NOWARN, sz);
  94                if (start_addr == NULL)
  95                        dmap->buffsize /= 2;
  96        }
  97
  98        if (start_addr == NULL) {
  99                printk(KERN_WARNING "Sound error: Couldn't allocate DMA buffer\n");
 100                return -ENOMEM;
 101        } else {
 102                /* make some checks */
 103                end_addr = start_addr + dmap->buffsize - 1;
 104
 105                if (debugmem)
 106                        printk(KERN_DEBUG "sound: start 0x%lx, end 0x%lx\n", (long) start_addr, (long) end_addr);
 107                
 108                /* now check if it fits into the same dma-pagesize */
 109
 110                if (((long) start_addr & ~(dma_pagesize - 1)) != ((long) end_addr & ~(dma_pagesize - 1))
 111                    || end_addr >= (char *) (MAX_DMA_ADDRESS)) {
 112                        printk(KERN_ERR "sound: Got invalid address 0x%lx for %db DMA-buffer\n", (long) start_addr, dmap->buffsize);
 113                        return -EFAULT;
 114                }
 115        }
 116        dmap->raw_buf = start_addr;
 117        dmap->raw_buf_phys = virt_to_bus(start_addr);
 118
 119        for (page = virt_to_page(start_addr); page <= virt_to_page(end_addr); page++)
 120                SetPageReserved(page);
 121        return 0;
 122}
 123
 124static void sound_free_dmap(struct dma_buffparms *dmap)
 125{
 126        int sz, size;
 127        struct page *page;
 128        unsigned long start_addr, end_addr;
 129
 130        if (dmap->raw_buf == NULL)
 131                return;
 132        if (dmap->mapping_flags & DMA_MAP_MAPPED)
 133                return;         /* Don't free mmapped buffer. Will use it next time */
 134        for (sz = 0, size = PAGE_SIZE; size < dmap->buffsize; sz++, size <<= 1);
 135
 136        start_addr = (unsigned long) dmap->raw_buf;
 137        end_addr = start_addr + dmap->buffsize;
 138
 139        for (page = virt_to_page(start_addr); page <= virt_to_page(end_addr); page++)
 140                ClearPageReserved(page);
 141
 142        free_pages((unsigned long) dmap->raw_buf, sz);
 143        dmap->raw_buf = NULL;
 144}
 145
 146
 147/* Intel version !!!!!!!!! */
 148
 149static int sound_start_dma(struct dma_buffparms *dmap, unsigned long physaddr, int count, int dma_mode)
 150{
 151        unsigned long flags;
 152        int chan = dmap->dma;
 153
 154        /* printk( "Start DMA%d %d, %d\n",  chan,  (int)(physaddr-dmap->raw_buf_phys),  count); */
 155
 156        flags = claim_dma_lock();
 157        disable_dma(chan);
 158        clear_dma_ff(chan);
 159        set_dma_mode(chan, dma_mode);
 160        set_dma_addr(chan, physaddr);
 161        set_dma_count(chan, count);
 162        enable_dma(chan);
 163        release_dma_lock(flags);
 164
 165        return 0;
 166}
 167
 168static void dma_init_buffers(struct dma_buffparms *dmap)
 169{
 170        dmap->qlen = dmap->qhead = dmap->qtail = dmap->user_counter = 0;
 171        dmap->byte_counter = 0;
 172        dmap->max_byte_counter = 8000 * 60 * 60;
 173        dmap->bytes_in_use = dmap->buffsize;
 174
 175        dmap->dma_mode = DMODE_NONE;
 176        dmap->mapping_flags = 0;
 177        dmap->neutral_byte = 0x80;
 178        dmap->data_rate = 8000;
 179        dmap->cfrag = -1;
 180        dmap->closing = 0;
 181        dmap->nbufs = 1;
 182        dmap->flags = DMA_BUSY; /* Other flags off */
 183}
 184
 185static int open_dmap(struct audio_operations *adev, int mode, struct dma_buffparms *dmap)
 186{
 187        int err;
 188        
 189        if (dmap->flags & DMA_BUSY)
 190                return -EBUSY;
 191        if ((err = sound_alloc_dmap(dmap)) < 0)
 192                return err;
 193
 194        if (dmap->raw_buf == NULL) {
 195                printk(KERN_WARNING "Sound: DMA buffers not available\n");
 196                return -ENOSPC; /* Memory allocation failed during boot */
 197        }
 198        if (dmap->dma >= 0 && sound_open_dma(dmap->dma, adev->name)) {
 199                printk(KERN_WARNING "Unable to grab(2) DMA%d for the audio driver\n", dmap->dma);
 200                return -EBUSY;
 201        }
 202        dma_init_buffers(dmap);
 203        spin_lock_init(&dmap->lock);
 204        dmap->open_mode = mode;
 205        dmap->subdivision = dmap->underrun_count = 0;
 206        dmap->fragment_size = 0;
 207        dmap->max_fragments = 65536;    /* Just a large value */
 208        dmap->byte_counter = 0;
 209        dmap->max_byte_counter = 8000 * 60 * 60;
 210        dmap->applic_profile = APF_NORMAL;
 211        dmap->needs_reorg = 1;
 212        dmap->audio_callback = NULL;
 213        dmap->callback_parm = 0;
 214        return 0;
 215}
 216
 217static void close_dmap(struct audio_operations *adev, struct dma_buffparms *dmap)
 218{
 219        unsigned long flags;
 220        
 221        if (dmap->dma >= 0) {
 222                sound_close_dma(dmap->dma);
 223                flags=claim_dma_lock();
 224                disable_dma(dmap->dma);
 225                release_dma_lock(flags);
 226        }
 227        if (dmap->flags & DMA_BUSY)
 228                dmap->dma_mode = DMODE_NONE;
 229        dmap->flags &= ~DMA_BUSY;
 230        
 231        if (sound_dmap_flag == DMAP_FREE_ON_CLOSE)
 232                sound_free_dmap(dmap);
 233}
 234
 235
 236static unsigned int default_set_bits(int dev, unsigned int bits)
 237{
 238        mm_segment_t fs = get_fs();
 239
 240        set_fs(get_ds());
 241        audio_devs[dev]->d->ioctl(dev, SNDCTL_DSP_SETFMT, (void __user *)&bits);
 242        set_fs(fs);
 243        return bits;
 244}
 245
 246static int default_set_speed(int dev, int speed)
 247{
 248        mm_segment_t fs = get_fs();
 249
 250        set_fs(get_ds());
 251        audio_devs[dev]->d->ioctl(dev, SNDCTL_DSP_SPEED, (void __user *)&speed);
 252        set_fs(fs);
 253        return speed;
 254}
 255
 256static short default_set_channels(int dev, short channels)
 257{
 258        int c = channels;
 259        mm_segment_t fs = get_fs();
 260
 261        set_fs(get_ds());
 262        audio_devs[dev]->d->ioctl(dev, SNDCTL_DSP_CHANNELS, (void __user *)&c);
 263        set_fs(fs);
 264        return c;
 265}
 266
 267static void check_driver(struct audio_driver *d)
 268{
 269        if (d->set_speed == NULL)
 270                d->set_speed = default_set_speed;
 271        if (d->set_bits == NULL)
 272                d->set_bits = default_set_bits;
 273        if (d->set_channels == NULL)
 274                d->set_channels = default_set_channels;
 275}
 276
 277int DMAbuf_open(int dev, int mode)
 278{
 279        struct audio_operations *adev = audio_devs[dev];
 280        int retval;
 281        struct dma_buffparms *dmap_in = NULL;
 282        struct dma_buffparms *dmap_out = NULL;
 283
 284        if (!adev)
 285                  return -ENXIO;
 286        if (!(adev->flags & DMA_DUPLEX))
 287                adev->dmap_in = adev->dmap_out;
 288        check_driver(adev->d);
 289
 290        if ((retval = adev->d->open(dev, mode)) < 0)
 291                return retval;
 292        dmap_out = adev->dmap_out;
 293        dmap_in = adev->dmap_in;
 294        if (dmap_in == dmap_out)
 295                adev->flags &= ~DMA_DUPLEX;
 296
 297        if (mode & OPEN_WRITE) {
 298                if ((retval = open_dmap(adev, mode, dmap_out)) < 0) {
 299                        adev->d->close(dev);
 300                        return retval;
 301                }
 302        }
 303        adev->enable_bits = mode;
 304
 305        if (mode == OPEN_READ || (mode != OPEN_WRITE && (adev->flags & DMA_DUPLEX))) {
 306                if ((retval = open_dmap(adev, mode, dmap_in)) < 0) {
 307                        adev->d->close(dev);
 308                        if (mode & OPEN_WRITE)
 309                                close_dmap(adev, dmap_out);
 310                        return retval;
 311                }
 312        }
 313        adev->open_mode = mode;
 314        adev->go = 1;
 315
 316        adev->d->set_bits(dev, 8);
 317        adev->d->set_channels(dev, 1);
 318        adev->d->set_speed(dev, DSP_DEFAULT_SPEED);
 319        if (adev->dmap_out->dma_mode == DMODE_OUTPUT) 
 320                memset(adev->dmap_out->raw_buf, adev->dmap_out->neutral_byte,
 321                       adev->dmap_out->bytes_in_use);
 322        return 0;
 323}
 324/* MUST not hold the spinlock */
 325void DMAbuf_reset(int dev)
 326{
 327        if (audio_devs[dev]->open_mode & OPEN_WRITE)
 328                dma_reset_output(dev);
 329
 330        if (audio_devs[dev]->open_mode & OPEN_READ)
 331                dma_reset_input(dev);
 332}
 333
 334static void dma_reset_output(int dev)
 335{
 336        struct audio_operations *adev = audio_devs[dev];
 337        unsigned long flags,f ;
 338        struct dma_buffparms *dmap = adev->dmap_out;
 339
 340        if (!(dmap->flags & DMA_STARTED))       /* DMA is not active */
 341                return;
 342
 343        /*
 344         *      First wait until the current fragment has been played completely
 345         */
 346        spin_lock_irqsave(&dmap->lock,flags);
 347        adev->dmap_out->flags |= DMA_SYNCING;
 348
 349        adev->dmap_out->underrun_count = 0;
 350        if (!signal_pending(current) && adev->dmap_out->qlen && 
 351            adev->dmap_out->underrun_count == 0){
 352                spin_unlock_irqrestore(&dmap->lock,flags);
 353                interruptible_sleep_on_timeout(&adev->out_sleeper,
 354                                               dmabuf_timeout(dmap));
 355                spin_lock_irqsave(&dmap->lock,flags);
 356        }
 357        adev->dmap_out->flags &= ~(DMA_SYNCING | DMA_ACTIVE);
 358
 359        /*
 360         *      Finally shut the device off
 361         */
 362        if (!(adev->flags & DMA_DUPLEX) || !adev->d->halt_output)
 363                adev->d->halt_io(dev);
 364        else
 365                adev->d->halt_output(dev);
 366        adev->dmap_out->flags &= ~DMA_STARTED;
 367        
 368        f=claim_dma_lock();
 369        clear_dma_ff(dmap->dma);
 370        disable_dma(dmap->dma);
 371        release_dma_lock(f);
 372        
 373        dmap->byte_counter = 0;
 374        reorganize_buffers(dev, adev->dmap_out, 0);
 375        dmap->qlen = dmap->qhead = dmap->qtail = dmap->user_counter = 0;
 376        spin_unlock_irqrestore(&dmap->lock,flags);
 377}
 378
 379static void dma_reset_input(int dev)
 380{
 381        struct audio_operations *adev = audio_devs[dev];
 382        unsigned long flags;
 383        struct dma_buffparms *dmap = adev->dmap_in;
 384
 385        spin_lock_irqsave(&dmap->lock,flags);
 386        if (!(adev->flags & DMA_DUPLEX) || !adev->d->halt_input)
 387                adev->d->halt_io(dev);
 388        else
 389                adev->d->halt_input(dev);
 390        adev->dmap_in->flags &= ~DMA_STARTED;
 391
 392        dmap->qlen = dmap->qhead = dmap->qtail = dmap->user_counter = 0;
 393        dmap->byte_counter = 0;
 394        reorganize_buffers(dev, adev->dmap_in, 1);
 395        spin_unlock_irqrestore(&dmap->lock,flags);
 396}
 397/* MUST be called with holding the dmap->lock */
 398void DMAbuf_launch_output(int dev, struct dma_buffparms *dmap)
 399{
 400        struct audio_operations *adev = audio_devs[dev];
 401
 402        if (!((adev->enable_bits * adev->go) & PCM_ENABLE_OUTPUT))
 403                return;         /* Don't start DMA yet */
 404        dmap->dma_mode = DMODE_OUTPUT;
 405
 406        if (!(dmap->flags & DMA_ACTIVE) || !(adev->flags & DMA_AUTOMODE) || (dmap->flags & DMA_NODMA)) {
 407                if (!(dmap->flags & DMA_STARTED)) {
 408                        reorganize_buffers(dev, dmap, 0);
 409                        if (adev->d->prepare_for_output(dev, dmap->fragment_size, dmap->nbufs))
 410                                return;
 411                        if (!(dmap->flags & DMA_NODMA))
 412                                local_start_dma(adev, dmap->raw_buf_phys, dmap->bytes_in_use,DMA_MODE_WRITE);
 413                        dmap->flags |= DMA_STARTED;
 414                }
 415                if (dmap->counts[dmap->qhead] == 0)
 416                        dmap->counts[dmap->qhead] = dmap->fragment_size;
 417                dmap->dma_mode = DMODE_OUTPUT;
 418                adev->d->output_block(dev, dmap->raw_buf_phys + dmap->qhead * dmap->fragment_size,
 419                                      dmap->counts[dmap->qhead], 1);
 420                if (adev->d->trigger)
 421                        adev->d->trigger(dev,adev->enable_bits * adev->go);
 422        }
 423        dmap->flags |= DMA_ACTIVE;
 424}
 425
 426int DMAbuf_sync(int dev)
 427{
 428        struct audio_operations *adev = audio_devs[dev];
 429        unsigned long flags;
 430        int n = 0;
 431        struct dma_buffparms *dmap;
 432
 433        if (!adev->go && !(adev->enable_bits & PCM_ENABLE_OUTPUT))
 434                return 0;
 435
 436        if (adev->dmap_out->dma_mode == DMODE_OUTPUT) {
 437                dmap = adev->dmap_out;
 438                spin_lock_irqsave(&dmap->lock,flags);
 439                if (dmap->qlen > 0 && !(dmap->flags & DMA_ACTIVE))
 440                        DMAbuf_launch_output(dev, dmap);
 441                adev->dmap_out->flags |= DMA_SYNCING;
 442                adev->dmap_out->underrun_count = 0;
 443                while (!signal_pending(current) && n++ < adev->dmap_out->nbufs &&
 444                       adev->dmap_out->qlen && adev->dmap_out->underrun_count == 0) {
 445                        long t = dmabuf_timeout(dmap);
 446                        spin_unlock_irqrestore(&dmap->lock,flags);
 447                        /* FIXME: not safe may miss events */
 448                        t = interruptible_sleep_on_timeout(&adev->out_sleeper, t);
 449                        spin_lock_irqsave(&dmap->lock,flags);
 450                        if (!t) {
 451                                adev->dmap_out->flags &= ~DMA_SYNCING;
 452                                spin_unlock_irqrestore(&dmap->lock,flags);
 453                                return adev->dmap_out->qlen;
 454                        }
 455                }
 456                adev->dmap_out->flags &= ~(DMA_SYNCING | DMA_ACTIVE);
 457                
 458                /*
 459                 * Some devices such as GUS have huge amount of on board RAM for the
 460                 * audio data. We have to wait until the device has finished playing.
 461                 */
 462
 463                /* still holding the lock */
 464                if (adev->d->local_qlen) {   /* Device has hidden buffers */
 465                        while (!signal_pending(current) &&
 466                               adev->d->local_qlen(dev)){
 467                                spin_unlock_irqrestore(&dmap->lock,flags);
 468                                interruptible_sleep_on_timeout(&adev->out_sleeper,
 469                                                               dmabuf_timeout(dmap));
 470                                spin_lock_irqsave(&dmap->lock,flags);
 471                        }
 472                }
 473                spin_unlock_irqrestore(&dmap->lock,flags);
 474        }
 475        adev->dmap_out->dma_mode = DMODE_NONE;
 476        return adev->dmap_out->qlen;
 477}
 478
 479int DMAbuf_release(int dev, int mode)
 480{
 481        struct audio_operations *adev = audio_devs[dev];
 482        struct dma_buffparms *dmap;
 483        unsigned long flags;
 484
 485        dmap = adev->dmap_out;
 486        if (adev->open_mode & OPEN_WRITE)
 487                adev->dmap_out->closing = 1;
 488
 489        if (adev->open_mode & OPEN_READ){
 490                adev->dmap_in->closing = 1;
 491                dmap = adev->dmap_in;
 492        }
 493        if (adev->open_mode & OPEN_WRITE)
 494                if (!(adev->dmap_out->mapping_flags & DMA_MAP_MAPPED))
 495                        if (!signal_pending(current) && (adev->dmap_out->dma_mode == DMODE_OUTPUT))
 496                                DMAbuf_sync(dev);
 497        if (adev->dmap_out->dma_mode == DMODE_OUTPUT)
 498                memset(adev->dmap_out->raw_buf, adev->dmap_out->neutral_byte, adev->dmap_out->bytes_in_use);
 499
 500        DMAbuf_reset(dev);
 501        spin_lock_irqsave(&dmap->lock,flags);
 502        adev->d->close(dev);
 503
 504        if (adev->open_mode & OPEN_WRITE)
 505                close_dmap(adev, adev->dmap_out);
 506
 507        if (adev->open_mode == OPEN_READ ||
 508            (adev->open_mode != OPEN_WRITE &&
 509             (adev->flags & DMA_DUPLEX)))
 510                close_dmap(adev, adev->dmap_in);
 511        adev->open_mode = 0;
 512        spin_unlock_irqrestore(&dmap->lock,flags);
 513        return 0;
 514}
 515/* called with dmap->lock dold */
 516int DMAbuf_activate_recording(int dev, struct dma_buffparms *dmap)
 517{
 518        struct audio_operations *adev = audio_devs[dev];
 519        int  err;
 520
 521        if (!(adev->open_mode & OPEN_READ))
 522                return 0;
 523        if (!(adev->enable_bits & PCM_ENABLE_INPUT))
 524                return 0;
 525        if (dmap->dma_mode == DMODE_OUTPUT) {   /* Direction change */
 526                /* release lock - it's not recursive */
 527                spin_unlock_irq(&dmap->lock);
 528                DMAbuf_sync(dev);
 529                DMAbuf_reset(dev);
 530                spin_lock_irq(&dmap->lock);
 531                dmap->dma_mode = DMODE_NONE;
 532        }
 533        if (!dmap->dma_mode) {
 534                reorganize_buffers(dev, dmap, 1);
 535                if ((err = adev->d->prepare_for_input(dev,
 536                                dmap->fragment_size, dmap->nbufs)) < 0)
 537                        return err;
 538                dmap->dma_mode = DMODE_INPUT;
 539        }
 540        if (!(dmap->flags & DMA_ACTIVE)) {
 541                if (dmap->needs_reorg)
 542                        reorganize_buffers(dev, dmap, 0);
 543                local_start_dma(adev, dmap->raw_buf_phys, dmap->bytes_in_use, DMA_MODE_READ);
 544                adev->d->start_input(dev, dmap->raw_buf_phys + dmap->qtail * dmap->fragment_size,
 545                                     dmap->fragment_size, 0);
 546                dmap->flags |= DMA_ACTIVE;
 547                if (adev->d->trigger)
 548                        adev->d->trigger(dev, adev->enable_bits * adev->go);
 549        }
 550        return 0;
 551}
 552/* acquires lock */
 553int DMAbuf_getrdbuffer(int dev, char **buf, int *len, int dontblock)
 554{
 555        struct audio_operations *adev = audio_devs[dev];
 556        unsigned long flags;
 557        int err = 0, n = 0;
 558        struct dma_buffparms *dmap = adev->dmap_in;
 559        int go;
 560
 561        if (!(adev->open_mode & OPEN_READ))
 562                return -EIO;
 563        spin_lock_irqsave(&dmap->lock,flags);
 564        if (dmap->needs_reorg)
 565                reorganize_buffers(dev, dmap, 0);
 566        if (adev->dmap_in->mapping_flags & DMA_MAP_MAPPED) {
 567/*                printk(KERN_WARNING "Sound: Can't read from mmapped device (1)\n");*/
 568                  spin_unlock_irqrestore(&dmap->lock,flags);
 569                  return -EINVAL;
 570        } else while (dmap->qlen <= 0 && n++ < 10) {
 571                long timeout = MAX_SCHEDULE_TIMEOUT;
 572                if (!(adev->enable_bits & PCM_ENABLE_INPUT) || !adev->go) {
 573                        spin_unlock_irqrestore(&dmap->lock,flags);
 574                        return -EAGAIN;
 575                }
 576                if ((err = DMAbuf_activate_recording(dev, dmap)) < 0) {
 577                        spin_unlock_irqrestore(&dmap->lock,flags);
 578                        return err;
 579                }
 580                /* Wait for the next block */
 581
 582                if (dontblock) {
 583                        spin_unlock_irqrestore(&dmap->lock,flags);
 584                        return -EAGAIN;
 585                }
 586                if ((go = adev->go))
 587                        timeout = dmabuf_timeout(dmap);
 588
 589                spin_unlock_irqrestore(&dmap->lock,flags);
 590                timeout = interruptible_sleep_on_timeout(&adev->in_sleeper,
 591                                                         timeout);
 592                if (!timeout) {
 593                        /* FIXME: include device name */
 594                        err = -EIO;
 595                        printk(KERN_WARNING "Sound: DMA (input) timed out - IRQ/DRQ config error?\n");
 596                        dma_reset_input(dev);
 597                } else
 598                        err = -EINTR;
 599                spin_lock_irqsave(&dmap->lock,flags);
 600        }
 601        spin_unlock_irqrestore(&dmap->lock,flags);
 602
 603        if (dmap->qlen <= 0)
 604                return err ? err : -EINTR;
 605        *buf = &dmap->raw_buf[dmap->qhead * dmap->fragment_size + dmap->counts[dmap->qhead]];
 606        *len = dmap->fragment_size - dmap->counts[dmap->qhead];
 607
 608        return dmap->qhead;
 609}
 610
 611int DMAbuf_rmchars(int dev, int buff_no, int c)
 612{
 613        struct audio_operations *adev = audio_devs[dev];
 614        struct dma_buffparms *dmap = adev->dmap_in;
 615        int p = dmap->counts[dmap->qhead] + c;
 616
 617        if (dmap->mapping_flags & DMA_MAP_MAPPED)
 618        {
 619/*                printk("Sound: Can't read from mmapped device (2)\n");*/
 620                return -EINVAL;
 621        }
 622        else if (dmap->qlen <= 0)
 623                return -EIO;
 624        else if (p >= dmap->fragment_size) {  /* This buffer is completely empty */
 625                dmap->counts[dmap->qhead] = 0;
 626                dmap->qlen--;
 627                dmap->qhead = (dmap->qhead + 1) % dmap->nbufs;
 628        }
 629        else dmap->counts[dmap->qhead] = p;
 630
 631        return 0;
 632}
 633/* MUST be called with dmap->lock hold */
 634int DMAbuf_get_buffer_pointer(int dev, struct dma_buffparms *dmap, int direction)
 635{
 636        /*
 637         *      Try to approximate the active byte position of the DMA pointer within the
 638         *      buffer area as well as possible.
 639         */
 640
 641        int pos;
 642        unsigned long f;
 643
 644        if (!(dmap->flags & DMA_ACTIVE))
 645                pos = 0;
 646        else {
 647                int chan = dmap->dma;
 648                
 649                f=claim_dma_lock();
 650                clear_dma_ff(chan);
 651                
 652                if(!isa_dma_bridge_buggy)
 653                        disable_dma(dmap->dma);
 654                
 655                pos = get_dma_residue(chan);
 656                
 657                pos = dmap->bytes_in_use - pos;
 658
 659                if (!(dmap->mapping_flags & DMA_MAP_MAPPED)) {
 660                        if (direction == DMODE_OUTPUT) {
 661                                if (dmap->qhead == 0)
 662                                        if (pos > dmap->fragment_size)
 663                                                pos = 0;
 664                        } else {
 665                                if (dmap->qtail == 0)
 666                                        if (pos > dmap->fragment_size)
 667                                                pos = 0;
 668                        }
 669                }
 670                if (pos < 0)
 671                        pos = 0;
 672                if (pos >= dmap->bytes_in_use)
 673                        pos = 0;
 674                
 675                if(!isa_dma_bridge_buggy)
 676                        enable_dma(dmap->dma);
 677                        
 678                release_dma_lock(f);
 679        }
 680        /* printk( "%04x ",  pos); */
 681
 682        return pos;
 683}
 684
 685/*
 686 *      DMAbuf_start_devices() is called by the /dev/music driver to start
 687 *      one or more audio devices at desired moment.
 688 */
 689
 690void DMAbuf_start_devices(unsigned int devmask)
 691{
 692        struct audio_operations *adev;
 693        int dev;
 694
 695        for (dev = 0; dev < num_audiodevs; dev++) {
 696                if (!(devmask & (1 << dev)))
 697                        continue;
 698                if (!(adev = audio_devs[dev]))
 699                        continue;
 700                if (adev->open_mode == 0)
 701                        continue;
 702                if (adev->go)
 703                        continue;
 704                /* OK to start the device */
 705                adev->go = 1;
 706                if (adev->d->trigger)
 707                        adev->d->trigger(dev,adev->enable_bits * adev->go);
 708        }
 709}
 710/* via poll called without a lock ?*/
 711int DMAbuf_space_in_queue(int dev)
 712{
 713        struct audio_operations *adev = audio_devs[dev];
 714        int len, max, tmp;
 715        struct dma_buffparms *dmap = adev->dmap_out;
 716        int lim = dmap->nbufs;
 717
 718        if (lim < 2)
 719                lim = 2;
 720
 721        if (dmap->qlen >= lim)  /* No space at all */
 722                return 0;
 723
 724        /*
 725         *      Verify that there are no more pending buffers than the limit
 726         *      defined by the process.
 727         */
 728
 729        max = dmap->max_fragments;
 730        if (max > lim)
 731                max = lim;
 732        len = dmap->qlen;
 733
 734        if (adev->d->local_qlen) {
 735                tmp = adev->d->local_qlen(dev);
 736                if (tmp && len)
 737                        tmp--;  /* This buffer has been counted twice */
 738                len += tmp;
 739        }
 740        if (dmap->byte_counter % dmap->fragment_size)   /* There is a partial fragment */
 741                len = len + 1;
 742
 743        if (len >= max)
 744                return 0;
 745        return max - len;
 746}
 747/* MUST not hold the spinlock  - this function may sleep */
 748static int output_sleep(int dev, int dontblock)
 749{
 750        struct audio_operations *adev = audio_devs[dev];
 751        int err = 0;
 752        struct dma_buffparms *dmap = adev->dmap_out;
 753        long timeout;
 754        long timeout_value;
 755
 756        if (dontblock)
 757                return -EAGAIN;
 758        if (!(adev->enable_bits & PCM_ENABLE_OUTPUT))
 759                return -EAGAIN;
 760
 761        /*
 762         * Wait for free space
 763         */
 764        if (signal_pending(current))
 765                return -EINTR;
 766        timeout = (adev->go && !(dmap->flags & DMA_NOTIMEOUT));
 767        if (timeout) 
 768                timeout_value = dmabuf_timeout(dmap);
 769        else
 770                timeout_value = MAX_SCHEDULE_TIMEOUT;
 771        timeout_value = interruptible_sleep_on_timeout(&adev->out_sleeper,
 772                                                       timeout_value);
 773        if (timeout != MAX_SCHEDULE_TIMEOUT && !timeout_value) {
 774                printk(KERN_WARNING "Sound: DMA (output) timed out - IRQ/DRQ config error?\n");
 775                dma_reset_output(dev);
 776        } else {
 777                if (signal_pending(current))
 778                        err = -EINTR;
 779        }
 780        return err;
 781}
 782/* called with the lock held */
 783static int find_output_space(int dev, char **buf, int *size)
 784{
 785        struct audio_operations *adev = audio_devs[dev];
 786        struct dma_buffparms *dmap = adev->dmap_out;
 787        unsigned long active_offs;
 788        long len, offs;
 789        int maxfrags;
 790        int occupied_bytes = (dmap->user_counter % dmap->fragment_size);
 791
 792        *buf = dmap->raw_buf;
 793        if (!(maxfrags = DMAbuf_space_in_queue(dev)) && !occupied_bytes)
 794                return 0;
 795
 796#ifdef BE_CONSERVATIVE
 797        active_offs = dmap->byte_counter + dmap->qhead * dmap->fragment_size;
 798#else
 799        active_offs = max(DMAbuf_get_buffer_pointer(dev, dmap, DMODE_OUTPUT), 0);
 800        /* Check for pointer wrapping situation */
 801        if (active_offs >= dmap->bytes_in_use)
 802                active_offs = 0;
 803        active_offs += dmap->byte_counter;
 804#endif
 805
 806        offs = (dmap->user_counter % dmap->bytes_in_use) & ~SAMPLE_ROUNDUP;
 807        if (offs < 0 || offs >= dmap->bytes_in_use) {
 808                printk(KERN_ERR "Sound: Got unexpected offs %ld. Giving up.\n", offs);
 809                printk("Counter = %ld, bytes=%d\n", dmap->user_counter, dmap->bytes_in_use);
 810                return 0;
 811        }
 812        *buf = dmap->raw_buf + offs;
 813
 814        len = active_offs + dmap->bytes_in_use - dmap->user_counter;    /* Number of unused bytes in buffer */
 815
 816        if ((offs + len) > dmap->bytes_in_use)
 817                len = dmap->bytes_in_use - offs;
 818        if (len < 0) {
 819                return 0;
 820        }
 821        if (len > ((maxfrags * dmap->fragment_size) - occupied_bytes))
 822                len = (maxfrags * dmap->fragment_size) - occupied_bytes;
 823        *size = len & ~SAMPLE_ROUNDUP;
 824        return (*size > 0);
 825}
 826/* acquires lock  */
 827int DMAbuf_getwrbuffer(int dev, char **buf, int *size, int dontblock)
 828{
 829        struct audio_operations *adev = audio_devs[dev];
 830        unsigned long flags;
 831        int err = -EIO;
 832        struct dma_buffparms *dmap = adev->dmap_out;
 833
 834        if (dmap->mapping_flags & DMA_MAP_MAPPED) {
 835/*              printk(KERN_DEBUG "Sound: Can't write to mmapped device (3)\n");*/
 836                return -EINVAL;
 837        }
 838        spin_lock_irqsave(&dmap->lock,flags);
 839        if (dmap->needs_reorg)
 840                reorganize_buffers(dev, dmap, 0);
 841
 842        if (dmap->dma_mode == DMODE_INPUT) {    /* Direction change */
 843                spin_unlock_irqrestore(&dmap->lock,flags);
 844                DMAbuf_reset(dev);
 845                spin_lock_irqsave(&dmap->lock,flags);
 846        }
 847        dmap->dma_mode = DMODE_OUTPUT;
 848
 849        while (find_output_space(dev, buf, size) <= 0) {
 850                spin_unlock_irqrestore(&dmap->lock,flags);
 851                if ((err = output_sleep(dev, dontblock)) < 0) {
 852                        return err;
 853                }
 854                spin_lock_irqsave(&dmap->lock,flags);
 855        }
 856
 857        spin_unlock_irqrestore(&dmap->lock,flags);
 858        return 0;
 859}
 860/* has to acquire dmap->lock */
 861int DMAbuf_move_wrpointer(int dev, int l)
 862{
 863        struct audio_operations *adev = audio_devs[dev];
 864        struct dma_buffparms *dmap = adev->dmap_out;
 865        unsigned long ptr;
 866        unsigned long end_ptr, p;
 867        int post;
 868        unsigned long flags;
 869
 870        spin_lock_irqsave(&dmap->lock,flags);
 871        post= (dmap->flags & DMA_POST);
 872        ptr = (dmap->user_counter / dmap->fragment_size) * dmap->fragment_size;
 873
 874        dmap->flags &= ~DMA_POST;
 875        dmap->cfrag = -1;
 876        dmap->user_counter += l;
 877        dmap->flags |= DMA_DIRTY;
 878
 879        if (dmap->byte_counter >= dmap->max_byte_counter) {
 880                /* Wrap the byte counters */
 881                long decr = dmap->byte_counter;
 882                dmap->byte_counter = (dmap->byte_counter % dmap->bytes_in_use);
 883                decr -= dmap->byte_counter;
 884                dmap->user_counter -= decr;
 885        }
 886        end_ptr = (dmap->user_counter / dmap->fragment_size) * dmap->fragment_size;
 887
 888        p = (dmap->user_counter - 1) % dmap->bytes_in_use;
 889        dmap->neutral_byte = dmap->raw_buf[p];
 890
 891        /* Update the fragment based bookkeeping too */
 892        while (ptr < end_ptr) {
 893                dmap->counts[dmap->qtail] = dmap->fragment_size;
 894                dmap->qtail = (dmap->qtail + 1) % dmap->nbufs;
 895                dmap->qlen++;
 896                ptr += dmap->fragment_size;
 897        }
 898
 899        dmap->counts[dmap->qtail] = dmap->user_counter - ptr;
 900
 901        /*
 902         *      Let the low level driver perform some postprocessing to
 903         *      the written data.
 904         */
 905        if (adev->d->postprocess_write)
 906                adev->d->postprocess_write(dev);
 907
 908        if (!(dmap->flags & DMA_ACTIVE))
 909                if (dmap->qlen > 1 || (dmap->qlen > 0 && (post || dmap->qlen >= dmap->nbufs - 1)))
 910                        DMAbuf_launch_output(dev, dmap);
 911
 912        spin_unlock_irqrestore(&dmap->lock,flags);
 913        return 0;
 914}
 915
 916int DMAbuf_start_dma(int dev, unsigned long physaddr, int count, int dma_mode)
 917{
 918        struct audio_operations *adev = audio_devs[dev];
 919        struct dma_buffparms *dmap = (dma_mode == DMA_MODE_WRITE) ? adev->dmap_out : adev->dmap_in;
 920
 921        if (dmap->raw_buf == NULL) {
 922                printk(KERN_ERR "sound: DMA buffer(1) == NULL\n");
 923                printk("Device %d, chn=%s\n", dev, (dmap == adev->dmap_out) ? "out" : "in");
 924                return 0;
 925        }
 926        if (dmap->dma < 0)
 927                return 0;
 928        sound_start_dma(dmap, physaddr, count, dma_mode);
 929        return count;
 930}
 931EXPORT_SYMBOL(DMAbuf_start_dma);
 932
 933static int local_start_dma(struct audio_operations *adev, unsigned long physaddr, int count, int dma_mode)
 934{
 935        struct dma_buffparms *dmap = (dma_mode == DMA_MODE_WRITE) ? adev->dmap_out : adev->dmap_in;
 936
 937        if (dmap->raw_buf == NULL) {
 938                printk(KERN_ERR "sound: DMA buffer(2) == NULL\n");
 939                printk(KERN_ERR "Device %s, chn=%s\n", adev->name, (dmap == adev->dmap_out) ? "out" : "in");
 940                return 0;
 941        }
 942        if (dmap->flags & DMA_NODMA)
 943                return 1;
 944        if (dmap->dma < 0)
 945                return 0;
 946        sound_start_dma(dmap, dmap->raw_buf_phys, dmap->bytes_in_use, dma_mode | DMA_AUTOINIT);
 947        dmap->flags |= DMA_STARTED;
 948        return count;
 949}
 950
 951static void finish_output_interrupt(int dev, struct dma_buffparms *dmap)
 952{
 953        struct audio_operations *adev = audio_devs[dev];
 954
 955        if (dmap->audio_callback != NULL)
 956                dmap->audio_callback(dev, dmap->callback_parm);
 957        wake_up(&adev->out_sleeper);
 958        wake_up(&adev->poll_sleeper);
 959}
 960/* called with dmap->lock held in irq context*/
 961static void do_outputintr(int dev, int dummy)
 962{
 963        struct audio_operations *adev = audio_devs[dev];
 964        struct dma_buffparms *dmap = adev->dmap_out;
 965        int this_fragment;
 966
 967        if (dmap->raw_buf == NULL) {
 968                printk(KERN_ERR "Sound: Error. Audio interrupt (%d) after freeing buffers.\n", dev);
 969                return;
 970        }
 971        if (dmap->mapping_flags & DMA_MAP_MAPPED) {     /* Virtual memory mapped access */
 972                /* mmapped access */
 973                dmap->qhead = (dmap->qhead + 1) % dmap->nbufs;
 974                if (dmap->qhead == 0) {     /* Wrapped */
 975                        dmap->byte_counter += dmap->bytes_in_use;
 976                        if (dmap->byte_counter >= dmap->max_byte_counter) {     /* Overflow */
 977                                long decr = dmap->byte_counter;
 978                                dmap->byte_counter = (dmap->byte_counter % dmap->bytes_in_use);
 979                                decr -= dmap->byte_counter;
 980                                dmap->user_counter -= decr;
 981                        }
 982                }
 983                dmap->qlen++;   /* Yes increment it (don't decrement) */
 984                if (!(adev->flags & DMA_AUTOMODE))
 985                        dmap->flags &= ~DMA_ACTIVE;
 986                dmap->counts[dmap->qhead] = dmap->fragment_size;
 987                DMAbuf_launch_output(dev, dmap);
 988                finish_output_interrupt(dev, dmap);
 989                return;
 990        }
 991
 992        dmap->qlen--;
 993        this_fragment = dmap->qhead;
 994        dmap->qhead = (dmap->qhead + 1) % dmap->nbufs;
 995
 996        if (dmap->qhead == 0) { /* Wrapped */
 997                dmap->byte_counter += dmap->bytes_in_use;
 998                if (dmap->byte_counter >= dmap->max_byte_counter) {     /* Overflow */
 999                        long decr = dmap->byte_counter;
1000                        dmap->byte_counter = (dmap->byte_counter % dmap->bytes_in_use);
1001                        decr -= dmap->byte_counter;
1002                        dmap->user_counter -= decr;
1003                }
1004        }
1005        if (!(adev->flags & DMA_AUTOMODE))
1006                dmap->flags &= ~DMA_ACTIVE;
1007                
1008        /*
1009         *      This is  dmap->qlen <= 0 except when closing when
1010         *      dmap->qlen < 0
1011         */
1012         
1013        while (dmap->qlen <= -dmap->closing) {
1014                dmap->underrun_count++;
1015                dmap->qlen++;
1016                if ((dmap->flags & DMA_DIRTY) && dmap->applic_profile != APF_CPUINTENS) {
1017                        dmap->flags &= ~DMA_DIRTY;
1018                        memset(adev->dmap_out->raw_buf, adev->dmap_out->neutral_byte,
1019                               adev->dmap_out->buffsize);
1020                }
1021                dmap->user_counter += dmap->fragment_size;
1022                dmap->qtail = (dmap->qtail + 1) % dmap->nbufs;
1023        }
1024        if (dmap->qlen > 0)
1025                DMAbuf_launch_output(dev, dmap);
1026        finish_output_interrupt(dev, dmap);
1027}
1028/* called in irq context */
1029void DMAbuf_outputintr(int dev, int notify_only)
1030{
1031        struct audio_operations *adev = audio_devs[dev];
1032        unsigned long flags;
1033        struct dma_buffparms *dmap = adev->dmap_out;
1034
1035        spin_lock_irqsave(&dmap->lock,flags);
1036        if (!(dmap->flags & DMA_NODMA)) {
1037                int chan = dmap->dma, pos, n;
1038                unsigned long f;
1039                
1040                f=claim_dma_lock();
1041                
1042                if(!isa_dma_bridge_buggy)
1043                        disable_dma(dmap->dma);
1044                clear_dma_ff(chan);
1045                pos = dmap->bytes_in_use - get_dma_residue(chan);
1046                if(!isa_dma_bridge_buggy)
1047                        enable_dma(dmap->dma);
1048                release_dma_lock(f);
1049                
1050                pos = pos / dmap->fragment_size;        /* Actual qhead */
1051                if (pos < 0 || pos >= dmap->nbufs)
1052                        pos = 0;
1053                n = 0;
1054                while (dmap->qhead != pos && n++ < dmap->nbufs)
1055                        do_outputintr(dev, notify_only);
1056        }
1057        else
1058                do_outputintr(dev, notify_only);
1059        spin_unlock_irqrestore(&dmap->lock,flags);
1060}
1061EXPORT_SYMBOL(DMAbuf_outputintr);
1062
1063/* called with dmap->lock held in irq context */
1064static void do_inputintr(int dev)
1065{
1066        struct audio_operations *adev = audio_devs[dev];
1067        struct dma_buffparms *dmap = adev->dmap_in;
1068
1069        if (dmap->raw_buf == NULL) {
1070                printk(KERN_ERR "Sound: Fatal error. Audio interrupt after freeing buffers.\n");
1071                return;
1072        }
1073        if (dmap->mapping_flags & DMA_MAP_MAPPED) {
1074                dmap->qtail = (dmap->qtail + 1) % dmap->nbufs;
1075                if (dmap->qtail == 0) {         /* Wrapped */
1076                        dmap->byte_counter += dmap->bytes_in_use;
1077                        if (dmap->byte_counter >= dmap->max_byte_counter) {     /* Overflow */
1078                                long decr = dmap->byte_counter;
1079                                dmap->byte_counter = (dmap->byte_counter % dmap->bytes_in_use) + dmap->bytes_in_use;
1080                                decr -= dmap->byte_counter;
1081                                dmap->user_counter -= decr;
1082                        }
1083                }
1084                dmap->qlen++;
1085
1086                if (!(adev->flags & DMA_AUTOMODE)) {
1087                        if (dmap->needs_reorg)
1088                                reorganize_buffers(dev, dmap, 0);
1089                        local_start_dma(adev, dmap->raw_buf_phys, dmap->bytes_in_use,DMA_MODE_READ);
1090                        adev->d->start_input(dev, dmap->raw_buf_phys + dmap->qtail * dmap->fragment_size,
1091                                             dmap->fragment_size, 1);
1092                        if (adev->d->trigger)
1093                                adev->d->trigger(dev, adev->enable_bits * adev->go);
1094                }
1095                dmap->flags |= DMA_ACTIVE;
1096        } else if (dmap->qlen >= (dmap->nbufs - 1)) {
1097                printk(KERN_WARNING "Sound: Recording overrun\n");
1098                dmap->underrun_count++;
1099
1100                /* Just throw away the oldest fragment but keep the engine running */
1101                dmap->qhead = (dmap->qhead + 1) % dmap->nbufs;
1102                dmap->qtail = (dmap->qtail + 1) % dmap->nbufs;
1103        } else if (dmap->qlen >= 0 && dmap->qlen < dmap->nbufs) {
1104                dmap->qlen++;
1105                dmap->qtail = (dmap->qtail + 1) % dmap->nbufs;
1106                if (dmap->qtail == 0) {         /* Wrapped */
1107                        dmap->byte_counter += dmap->bytes_in_use;
1108                        if (dmap->byte_counter >= dmap->max_byte_counter) {     /* Overflow */
1109                                long decr = dmap->byte_counter;
1110                                dmap->byte_counter = (dmap->byte_counter % dmap->bytes_in_use) + dmap->bytes_in_use;
1111                                decr -= dmap->byte_counter;
1112                                dmap->user_counter -= decr;
1113                        }
1114                }
1115        }
1116        if (!(adev->flags & DMA_AUTOMODE) || (dmap->flags & DMA_NODMA)) {
1117                local_start_dma(adev, dmap->raw_buf_phys, dmap->bytes_in_use, DMA_MODE_READ);
1118                adev->d->start_input(dev, dmap->raw_buf_phys + dmap->qtail * dmap->fragment_size, dmap->fragment_size, 1);
1119                if (adev->d->trigger)
1120                        adev->d->trigger(dev,adev->enable_bits * adev->go);
1121        }
1122        dmap->flags |= DMA_ACTIVE;
1123        if (dmap->qlen > 0)
1124        {
1125                wake_up(&adev->in_sleeper);
1126                wake_up(&adev->poll_sleeper);
1127        }
1128}
1129/* called in irq context */
1130void DMAbuf_inputintr(int dev)
1131{
1132        struct audio_operations *adev = audio_devs[dev];
1133        struct dma_buffparms *dmap = adev->dmap_in;
1134        unsigned long flags;
1135
1136        spin_lock_irqsave(&dmap->lock,flags);
1137
1138        if (!(dmap->flags & DMA_NODMA)) {
1139                int chan = dmap->dma, pos, n;
1140                unsigned long f;
1141                
1142                f=claim_dma_lock();
1143                if(!isa_dma_bridge_buggy)
1144                        disable_dma(dmap->dma);
1145                clear_dma_ff(chan);
1146                pos = dmap->bytes_in_use - get_dma_residue(chan);
1147                if(!isa_dma_bridge_buggy)
1148                        enable_dma(dmap->dma);
1149                release_dma_lock(f);
1150
1151                pos = pos / dmap->fragment_size;        /* Actual qhead */
1152                if (pos < 0 || pos >= dmap->nbufs)
1153                        pos = 0;
1154
1155                n = 0;
1156                while (dmap->qtail != pos && ++n < dmap->nbufs)
1157                        do_inputintr(dev);
1158        } else
1159                do_inputintr(dev);
1160        spin_unlock_irqrestore(&dmap->lock,flags);
1161}
1162EXPORT_SYMBOL(DMAbuf_inputintr);
1163
1164void DMAbuf_init(int dev, int dma1, int dma2)
1165{
1166        struct audio_operations *adev = audio_devs[dev];
1167        /*
1168         * NOTE! This routine could be called several times.
1169         */
1170
1171        if (adev && adev->dmap_out == NULL) {
1172                if (adev->d == NULL)
1173                        panic("OSS: audio_devs[%d]->d == NULL\n", dev);
1174
1175                if (adev->parent_dev) {  /* Use DMA map of the parent dev */
1176                        int parent = adev->parent_dev - 1;
1177                        adev->dmap_out = audio_devs[parent]->dmap_out;
1178                        adev->dmap_in = audio_devs[parent]->dmap_in;
1179                } else {
1180                        adev->dmap_out = adev->dmap_in = &adev->dmaps[0];
1181                        adev->dmap_out->dma = dma1;
1182                        if (adev->flags & DMA_DUPLEX) {
1183                                adev->dmap_in = &adev->dmaps[1];
1184                                adev->dmap_in->dma = dma2;
1185                        }
1186                }
1187                /* Persistent DMA buffers allocated here */
1188                if (sound_dmap_flag == DMAP_KEEP_ON_CLOSE) {
1189                        if (adev->dmap_in->raw_buf == NULL)
1190                                sound_alloc_dmap(adev->dmap_in);
1191                        if (adev->dmap_out->raw_buf == NULL)
1192                                sound_alloc_dmap(adev->dmap_out);
1193                }
1194        }
1195}
1196
1197/* No kernel lock - DMAbuf_activate_recording protected by global cli/sti */
1198static unsigned int poll_input(struct file * file, int dev, poll_table *wait)
1199{
1200        struct audio_operations *adev = audio_devs[dev];
1201        struct dma_buffparms *dmap = adev->dmap_in;
1202
1203        if (!(adev->open_mode & OPEN_READ))
1204                return 0;
1205        if (dmap->mapping_flags & DMA_MAP_MAPPED) {
1206                if (dmap->qlen)
1207                        return POLLIN | POLLRDNORM;
1208                return 0;
1209        }
1210        if (dmap->dma_mode != DMODE_INPUT) {
1211                if (dmap->dma_mode == DMODE_NONE &&
1212                    adev->enable_bits & PCM_ENABLE_INPUT &&
1213                    !dmap->qlen && adev->go) {
1214                        unsigned long flags;
1215                        
1216                        spin_lock_irqsave(&dmap->lock,flags);
1217                        DMAbuf_activate_recording(dev, dmap);
1218                        spin_unlock_irqrestore(&dmap->lock,flags);
1219                }
1220                return 0;
1221        }
1222        if (!dmap->qlen)
1223                return 0;
1224        return POLLIN | POLLRDNORM;
1225}
1226
1227static unsigned int poll_output(struct file * file, int dev, poll_table *wait)
1228{
1229        struct audio_operations *adev = audio_devs[dev];
1230        struct dma_buffparms *dmap = adev->dmap_out;
1231        
1232        if (!(adev->open_mode & OPEN_WRITE))
1233                return 0;
1234        if (dmap->mapping_flags & DMA_MAP_MAPPED) {
1235                if (dmap->qlen)
1236                        return POLLOUT | POLLWRNORM;
1237                return 0;
1238        }
1239        if (dmap->dma_mode == DMODE_INPUT)
1240                return 0;
1241        if (dmap->dma_mode == DMODE_NONE)
1242                return POLLOUT | POLLWRNORM;
1243        if (!DMAbuf_space_in_queue(dev))
1244                return 0;
1245        return POLLOUT | POLLWRNORM;
1246}
1247
1248unsigned int DMAbuf_poll(struct file * file, int dev, poll_table *wait)
1249{
1250        struct audio_operations *adev = audio_devs[dev];
1251        poll_wait(file, &adev->poll_sleeper, wait);
1252        return poll_input(file, dev, wait) | poll_output(file, dev, wait);
1253}
1254
1255void DMAbuf_deinit(int dev)
1256{
1257        struct audio_operations *adev = audio_devs[dev];
1258        /* This routine is called when driver is being unloaded */
1259        if (!adev)
1260                return;
1261
1262        /* Persistent DMA buffers deallocated here */
1263        if (sound_dmap_flag == DMAP_KEEP_ON_CLOSE) {
1264                sound_free_dmap(adev->dmap_out);
1265                if (adev->flags & DMA_DUPLEX)
1266                        sound_free_dmap(adev->dmap_in);
1267        }
1268}
1269
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.