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