linux/drivers/media/pci/saa7134/saa7134-alsa.c
<<
>>
Prefs
   1/*
   2 *   SAA713x ALSA support for V4L
   3 *
   4 *   This program is free software; you can redistribute it and/or modify
   5 *   it under the terms of the GNU General Public License as published by
   6 *   the Free Software Foundation, version 2
   7 *
   8 *   This program is distributed in the hope that it will be useful,
   9 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
  10 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11 *   GNU General Public License for more details.
  12 *
  13 */
  14
  15#include "saa7134.h"
  16#include "saa7134-reg.h"
  17
  18#include <linux/init.h>
  19#include <linux/slab.h>
  20#include <linux/time.h>
  21#include <linux/wait.h>
  22#include <linux/module.h>
  23#include <sound/core.h>
  24#include <sound/control.h>
  25#include <sound/pcm.h>
  26#include <sound/pcm_params.h>
  27#include <sound/initval.h>
  28#include <linux/interrupt.h>
  29#include <linux/vmalloc.h>
  30
  31/*
  32 * Configuration macros
  33 */
  34
  35/* defaults */
  36#define MIXER_ADDR_UNSELECTED   -1
  37#define MIXER_ADDR_TVTUNER      0
  38#define MIXER_ADDR_LINE1        1
  39#define MIXER_ADDR_LINE2        2
  40#define MIXER_ADDR_LAST         2
  41
  42
  43static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;      /* Index 0-MAX */
  44static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;       /* ID for this card */
  45static int enable[SNDRV_CARDS] = {1, [1 ... (SNDRV_CARDS - 1)] = 1};
  46
  47module_param_array(index, int, NULL, 0444);
  48module_param_array(enable, int, NULL, 0444);
  49MODULE_PARM_DESC(index, "Index value for SAA7134 capture interface(s).");
  50MODULE_PARM_DESC(enable, "Enable (or not) the SAA7134 capture interface(s).");
  51
  52/*
  53 * Main chip structure
  54 */
  55
  56typedef struct snd_card_saa7134 {
  57        struct snd_card *card;
  58        spinlock_t mixer_lock;
  59        int mixer_volume[MIXER_ADDR_LAST+1][2];
  60        int capture_source_addr;
  61        int capture_source[2];
  62        struct snd_kcontrol *capture_ctl[MIXER_ADDR_LAST+1];
  63        struct pci_dev *pci;
  64        struct saa7134_dev *dev;
  65
  66        unsigned long iobase;
  67        s16 irq;
  68        u16 mute_was_on;
  69
  70        spinlock_t lock;
  71} snd_card_saa7134_t;
  72
  73
  74/*
  75 * PCM structure
  76 */
  77
  78typedef struct snd_card_saa7134_pcm {
  79        struct saa7134_dev *dev;
  80
  81        spinlock_t lock;
  82
  83        struct snd_pcm_substream *substream;
  84} snd_card_saa7134_pcm_t;
  85
  86static struct snd_card *snd_saa7134_cards[SNDRV_CARDS];
  87
  88
  89/*
  90 * saa7134 DMA audio stop
  91 *
  92 *   Called when the capture device is released or the buffer overflows
  93 *
  94 *   - Copied verbatim from saa7134-oss's dsp_dma_stop.
  95 *
  96 */
  97
  98static void saa7134_dma_stop(struct saa7134_dev *dev)
  99{
 100        dev->dmasound.dma_blk     = -1;
 101        dev->dmasound.dma_running = 0;
 102        saa7134_set_dmabits(dev);
 103}
 104
 105/*
 106 * saa7134 DMA audio start
 107 *
 108 *   Called when preparing the capture device for use
 109 *
 110 *   - Copied verbatim from saa7134-oss's dsp_dma_start.
 111 *
 112 */
 113
 114static void saa7134_dma_start(struct saa7134_dev *dev)
 115{
 116        dev->dmasound.dma_blk     = 0;
 117        dev->dmasound.dma_running = 1;
 118        saa7134_set_dmabits(dev);
 119}
 120
 121/*
 122 * saa7134 audio DMA IRQ handler
 123 *
 124 *   Called whenever we get an SAA7134_IRQ_REPORT_DONE_RA3 interrupt
 125 *   Handles shifting between the 2 buffers, manages the read counters,
 126 *  and notifies ALSA when periods elapse
 127 *
 128 *   - Mostly copied from saa7134-oss's saa7134_irq_oss_done.
 129 *
 130 */
 131
 132static void saa7134_irq_alsa_done(struct saa7134_dev *dev,
 133                                  unsigned long status)
 134{
 135        int next_blk, reg = 0;
 136
 137        spin_lock(&dev->slock);
 138        if (UNSET == dev->dmasound.dma_blk) {
 139                pr_debug("irq: recording stopped\n");
 140                goto done;
 141        }
 142        if (0 != (status & 0x0f000000))
 143                pr_debug("irq: lost %ld\n", (status >> 24) & 0x0f);
 144        if (0 == (status & 0x10000000)) {
 145                /* odd */
 146                if (0 == (dev->dmasound.dma_blk & 0x01))
 147                        reg = SAA7134_RS_BA1(6);
 148        } else {
 149                /* even */
 150                if (1 == (dev->dmasound.dma_blk & 0x01))
 151                        reg = SAA7134_RS_BA2(6);
 152        }
 153        if (0 == reg) {
 154                pr_debug("irq: field oops [%s]\n",
 155                        (status & 0x10000000) ? "even" : "odd");
 156                goto done;
 157        }
 158
 159        if (dev->dmasound.read_count >= dev->dmasound.blksize * (dev->dmasound.blocks-2)) {
 160                pr_debug("irq: overrun [full=%d/%d] - Blocks in %d\n",
 161                        dev->dmasound.read_count,
 162                        dev->dmasound.bufsize, dev->dmasound.blocks);
 163                spin_unlock(&dev->slock);
 164                snd_pcm_stop_xrun(dev->dmasound.substream);
 165                return;
 166        }
 167
 168        /* next block addr */
 169        next_blk = (dev->dmasound.dma_blk + 2) % dev->dmasound.blocks;
 170        saa_writel(reg,next_blk * dev->dmasound.blksize);
 171        pr_debug("irq: ok, %s, next_blk=%d, addr=%x, blocks=%u, size=%u, read=%u\n",
 172                (status & 0x10000000) ? "even" : "odd ", next_blk,
 173                 next_blk * dev->dmasound.blksize, dev->dmasound.blocks,
 174                 dev->dmasound.blksize, dev->dmasound.read_count);
 175
 176        /* update status & wake waiting readers */
 177        dev->dmasound.dma_blk = (dev->dmasound.dma_blk + 1) % dev->dmasound.blocks;
 178        dev->dmasound.read_count += dev->dmasound.blksize;
 179
 180        dev->dmasound.recording_on = reg;
 181
 182        if (dev->dmasound.read_count >= snd_pcm_lib_period_bytes(dev->dmasound.substream)) {
 183                spin_unlock(&dev->slock);
 184                snd_pcm_period_elapsed(dev->dmasound.substream);
 185                spin_lock(&dev->slock);
 186        }
 187
 188 done:
 189        spin_unlock(&dev->slock);
 190
 191}
 192
 193/*
 194 * IRQ request handler
 195 *
 196 *   Runs along with saa7134's IRQ handler, discards anything that isn't
 197 *   DMA sound
 198 *
 199 */
 200
 201static irqreturn_t saa7134_alsa_irq(int irq, void *dev_id)
 202{
 203        struct saa7134_dmasound *dmasound = dev_id;
 204        struct saa7134_dev *dev = dmasound->priv_data;
 205
 206        unsigned long report, status;
 207        int loop, handled = 0;
 208
 209        for (loop = 0; loop < 10; loop++) {
 210                report = saa_readl(SAA7134_IRQ_REPORT);
 211                status = saa_readl(SAA7134_IRQ_STATUS);
 212
 213                if (report & SAA7134_IRQ_REPORT_DONE_RA3) {
 214                        handled = 1;
 215                        saa_writel(SAA7134_IRQ_REPORT,
 216                                   SAA7134_IRQ_REPORT_DONE_RA3);
 217                        saa7134_irq_alsa_done(dev, status);
 218                } else {
 219                        goto out;
 220                }
 221        }
 222
 223        if (loop == 10) {
 224                pr_debug("error! looping IRQ!");
 225        }
 226
 227out:
 228        return IRQ_RETVAL(handled);
 229}
 230
 231/*
 232 * ALSA capture trigger
 233 *
 234 *   - One of the ALSA capture callbacks.
 235 *
 236 *   Called whenever a capture is started or stopped. Must be defined,
 237 *   but there's nothing we want to do here
 238 *
 239 */
 240
 241static int snd_card_saa7134_capture_trigger(struct snd_pcm_substream * substream,
 242                                          int cmd)
 243{
 244        struct snd_pcm_runtime *runtime = substream->runtime;
 245        snd_card_saa7134_pcm_t *pcm = runtime->private_data;
 246        struct saa7134_dev *dev=pcm->dev;
 247        int err = 0;
 248
 249        spin_lock(&dev->slock);
 250        if (cmd == SNDRV_PCM_TRIGGER_START) {
 251                /* start dma */
 252                saa7134_dma_start(dev);
 253        } else if (cmd == SNDRV_PCM_TRIGGER_STOP) {
 254                /* stop dma */
 255                saa7134_dma_stop(dev);
 256        } else {
 257                err = -EINVAL;
 258        }
 259        spin_unlock(&dev->slock);
 260
 261        return err;
 262}
 263
 264static int saa7134_alsa_dma_init(struct saa7134_dev *dev, int nr_pages)
 265{
 266        struct saa7134_dmasound *dma = &dev->dmasound;
 267        struct page *pg;
 268        int i;
 269
 270        dma->vaddr = vmalloc_32(nr_pages << PAGE_SHIFT);
 271        if (NULL == dma->vaddr) {
 272                pr_debug("vmalloc_32(%d pages) failed\n", nr_pages);
 273                return -ENOMEM;
 274        }
 275
 276        pr_debug("vmalloc is at addr %p, size=%d\n",
 277                 dma->vaddr, nr_pages << PAGE_SHIFT);
 278
 279        memset(dma->vaddr, 0, nr_pages << PAGE_SHIFT);
 280        dma->nr_pages = nr_pages;
 281
 282        dma->sglist = vzalloc(array_size(sizeof(*dma->sglist), dma->nr_pages));
 283        if (NULL == dma->sglist)
 284                goto vzalloc_err;
 285
 286        sg_init_table(dma->sglist, dma->nr_pages);
 287        for (i = 0; i < dma->nr_pages; i++) {
 288                pg = vmalloc_to_page(dma->vaddr + i * PAGE_SIZE);
 289                if (NULL == pg)
 290                        goto vmalloc_to_page_err;
 291                sg_set_page(&dma->sglist[i], pg, PAGE_SIZE, 0);
 292        }
 293        return 0;
 294
 295vmalloc_to_page_err:
 296        vfree(dma->sglist);
 297        dma->sglist = NULL;
 298vzalloc_err:
 299        vfree(dma->vaddr);
 300        dma->vaddr = NULL;
 301        return -ENOMEM;
 302}
 303
 304static int saa7134_alsa_dma_map(struct saa7134_dev *dev)
 305{
 306        struct saa7134_dmasound *dma = &dev->dmasound;
 307
 308        dma->sglen = dma_map_sg(&dev->pci->dev, dma->sglist,
 309                        dma->nr_pages, PCI_DMA_FROMDEVICE);
 310
 311        if (0 == dma->sglen) {
 312                pr_warn("%s: saa7134_alsa_map_sg failed\n", __func__);
 313                return -ENOMEM;
 314        }
 315        return 0;
 316}
 317
 318static int saa7134_alsa_dma_unmap(struct saa7134_dev *dev)
 319{
 320        struct saa7134_dmasound *dma = &dev->dmasound;
 321
 322        if (!dma->sglen)
 323                return 0;
 324
 325        dma_unmap_sg(&dev->pci->dev, dma->sglist, dma->sglen, PCI_DMA_FROMDEVICE);
 326        dma->sglen = 0;
 327        return 0;
 328}
 329
 330static int saa7134_alsa_dma_free(struct saa7134_dmasound *dma)
 331{
 332        vfree(dma->sglist);
 333        dma->sglist = NULL;
 334        vfree(dma->vaddr);
 335        dma->vaddr = NULL;
 336        return 0;
 337}
 338
 339/*
 340 * DMA buffer initialization
 341 *
 342 *   Uses V4L functions to initialize the DMA. Shouldn't be necessary in
 343 *  ALSA, but I was unable to use ALSA's own DMA, and had to force the
 344 *  usage of V4L's
 345 *
 346 *   - Copied verbatim from saa7134-oss.
 347 *
 348 */
 349
 350static int dsp_buffer_init(struct saa7134_dev *dev)
 351{
 352        int err;
 353
 354        BUG_ON(!dev->dmasound.bufsize);
 355
 356        err = saa7134_alsa_dma_init(dev,
 357                               (dev->dmasound.bufsize + PAGE_SIZE) >> PAGE_SHIFT);
 358        if (0 != err)
 359                return err;
 360        return 0;
 361}
 362
 363/*
 364 * DMA buffer release
 365 *
 366 *   Called after closing the device, during snd_card_saa7134_capture_close
 367 *
 368 */
 369
 370static int dsp_buffer_free(struct saa7134_dev *dev)
 371{
 372        BUG_ON(!dev->dmasound.blksize);
 373
 374        saa7134_alsa_dma_free(&dev->dmasound);
 375
 376        dev->dmasound.blocks  = 0;
 377        dev->dmasound.blksize = 0;
 378        dev->dmasound.bufsize = 0;
 379
 380        return 0;
 381}
 382
 383/*
 384 * Setting the capture source and updating the ALSA controls
 385 */
 386static int snd_saa7134_capsrc_set(struct snd_kcontrol *kcontrol,
 387                                  int left, int right, bool force_notify)
 388{
 389        snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol);
 390        int change = 0, addr = kcontrol->private_value;
 391        int active, old_addr;
 392        u32 anabar, xbarin;
 393        int analog_io, rate;
 394        struct saa7134_dev *dev;
 395
 396        dev = chip->dev;
 397
 398        spin_lock_irq(&chip->mixer_lock);
 399
 400        active = left != 0 || right != 0;
 401        old_addr = chip->capture_source_addr;
 402
 403        /* The active capture source cannot be deactivated */
 404        if (active) {
 405                change = old_addr != addr ||
 406                         chip->capture_source[0] != left ||
 407                         chip->capture_source[1] != right;
 408
 409                chip->capture_source[0] = left;
 410                chip->capture_source[1] = right;
 411                chip->capture_source_addr = addr;
 412                dev->dmasound.input = addr;
 413        }
 414        spin_unlock_irq(&chip->mixer_lock);
 415
 416        if (change) {
 417                switch (dev->pci->device) {
 418
 419                case PCI_DEVICE_ID_PHILIPS_SAA7134:
 420                        switch (addr) {
 421                        case MIXER_ADDR_TVTUNER:
 422                                saa_andorb(SAA7134_AUDIO_FORMAT_CTRL,
 423                                           0xc0, 0xc0);
 424                                saa_andorb(SAA7134_SIF_SAMPLE_FREQ,
 425                                           0x03, 0x00);
 426                                break;
 427                        case MIXER_ADDR_LINE1:
 428                        case MIXER_ADDR_LINE2:
 429                                analog_io = (MIXER_ADDR_LINE1 == addr) ?
 430                                             0x00 : 0x08;
 431                                rate = (32000 == dev->dmasound.rate) ?
 432                                        0x01 : 0x03;
 433                                saa_andorb(SAA7134_ANALOG_IO_SELECT,
 434                                           0x08, analog_io);
 435                                saa_andorb(SAA7134_AUDIO_FORMAT_CTRL,
 436                                           0xc0, 0x80);
 437                                saa_andorb(SAA7134_SIF_SAMPLE_FREQ,
 438                                           0x03, rate);
 439                                break;
 440                        }
 441
 442                        break;
 443                case PCI_DEVICE_ID_PHILIPS_SAA7133:
 444                case PCI_DEVICE_ID_PHILIPS_SAA7135:
 445                        xbarin = 0x03; /* adc */
 446                        anabar = 0;
 447                        switch (addr) {
 448                        case MIXER_ADDR_TVTUNER:
 449                                xbarin = 0; /* Demodulator */
 450                                anabar = 2; /* DACs */
 451                                break;
 452                        case MIXER_ADDR_LINE1:
 453                                anabar = 0;  /* aux1, aux1 */
 454                                break;
 455                        case MIXER_ADDR_LINE2:
 456                                anabar = 9;  /* aux2, aux2 */
 457                                break;
 458                        }
 459
 460                        /* output xbar always main channel */
 461                        saa_dsp_writel(dev, SAA7133_DIGITAL_OUTPUT_SEL1,
 462                                       0xbbbb10);
 463
 464                        if (left || right) {
 465                                /* We've got data, turn the input on */
 466                                saa_dsp_writel(dev, SAA7133_DIGITAL_INPUT_XBAR1,
 467                                               xbarin);
 468                                saa_writel(SAA7133_ANALOG_IO_SELECT, anabar);
 469                        } else {
 470                                saa_dsp_writel(dev, SAA7133_DIGITAL_INPUT_XBAR1,
 471                                               0);
 472                                saa_writel(SAA7133_ANALOG_IO_SELECT, 0);
 473                        }
 474                        break;
 475                }
 476        }
 477
 478        if (change) {
 479                if (force_notify)
 480                        snd_ctl_notify(chip->card,
 481                                       SNDRV_CTL_EVENT_MASK_VALUE,
 482                                       &chip->capture_ctl[addr]->id);
 483
 484                if (old_addr != MIXER_ADDR_UNSELECTED && old_addr != addr)
 485                        snd_ctl_notify(chip->card,
 486                                       SNDRV_CTL_EVENT_MASK_VALUE,
 487                                       &chip->capture_ctl[old_addr]->id);
 488        }
 489
 490        return change;
 491}
 492
 493/*
 494 * ALSA PCM preparation
 495 *
 496 *   - One of the ALSA capture callbacks.
 497 *
 498 *   Called right after the capture device is opened, this function configures
 499 *  the buffer using the previously defined functions, allocates the memory,
 500 *  sets up the hardware registers, and then starts the DMA. When this function
 501 *  returns, the audio should be flowing.
 502 *
 503 */
 504
 505static int snd_card_saa7134_capture_prepare(struct snd_pcm_substream * substream)
 506{
 507        struct snd_pcm_runtime *runtime = substream->runtime;
 508        int bswap, sign;
 509        u32 fmt, control;
 510        snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream);
 511        struct saa7134_dev *dev;
 512        snd_card_saa7134_pcm_t *pcm = runtime->private_data;
 513
 514        pcm->dev->dmasound.substream = substream;
 515
 516        dev = saa7134->dev;
 517
 518        if (snd_pcm_format_width(runtime->format) == 8)
 519                fmt = 0x00;
 520        else
 521                fmt = 0x01;
 522
 523        if (snd_pcm_format_signed(runtime->format))
 524                sign = 1;
 525        else
 526                sign = 0;
 527
 528        if (snd_pcm_format_big_endian(runtime->format))
 529                bswap = 1;
 530        else
 531                bswap = 0;
 532
 533        switch (dev->pci->device) {
 534          case PCI_DEVICE_ID_PHILIPS_SAA7134:
 535                if (1 == runtime->channels)
 536                        fmt |= (1 << 3);
 537                if (2 == runtime->channels)
 538                        fmt |= (3 << 3);
 539                if (sign)
 540                        fmt |= 0x04;
 541
 542                fmt |= (MIXER_ADDR_TVTUNER == dev->dmasound.input) ? 0xc0 : 0x80;
 543                saa_writeb(SAA7134_NUM_SAMPLES0, ((dev->dmasound.blksize - 1) & 0x0000ff));
 544                saa_writeb(SAA7134_NUM_SAMPLES1, ((dev->dmasound.blksize - 1) & 0x00ff00) >>  8);
 545                saa_writeb(SAA7134_NUM_SAMPLES2, ((dev->dmasound.blksize - 1) & 0xff0000) >> 16);
 546                saa_writeb(SAA7134_AUDIO_FORMAT_CTRL, fmt);
 547
 548                break;
 549          case PCI_DEVICE_ID_PHILIPS_SAA7133:
 550          case PCI_DEVICE_ID_PHILIPS_SAA7135:
 551                if (1 == runtime->channels)
 552                        fmt |= (1 << 4);
 553                if (2 == runtime->channels)
 554                        fmt |= (2 << 4);
 555                if (!sign)
 556                        fmt |= 0x04;
 557                saa_writel(SAA7133_NUM_SAMPLES, dev->dmasound.blksize -1);
 558                saa_writel(SAA7133_AUDIO_CHANNEL, 0x543210 | (fmt << 24));
 559                break;
 560        }
 561
 562        pr_debug("rec_start: afmt=%d ch=%d  =>  fmt=0x%x swap=%c\n",
 563                runtime->format, runtime->channels, fmt,
 564                bswap ? 'b' : '-');
 565        /* dma: setup channel 6 (= AUDIO) */
 566        control = SAA7134_RS_CONTROL_BURST_16 |
 567                SAA7134_RS_CONTROL_ME |
 568                (dev->dmasound.pt.dma >> 12);
 569        if (bswap)
 570                control |= SAA7134_RS_CONTROL_BSWAP;
 571
 572        saa_writel(SAA7134_RS_BA1(6),0);
 573        saa_writel(SAA7134_RS_BA2(6),dev->dmasound.blksize);
 574        saa_writel(SAA7134_RS_PITCH(6),0);
 575        saa_writel(SAA7134_RS_CONTROL(6),control);
 576
 577        dev->dmasound.rate = runtime->rate;
 578
 579        /* Setup and update the card/ALSA controls */
 580        snd_saa7134_capsrc_set(saa7134->capture_ctl[dev->dmasound.input], 1, 1,
 581                               true);
 582
 583        return 0;
 584
 585}
 586
 587/*
 588 * ALSA pointer fetching
 589 *
 590 *   - One of the ALSA capture callbacks.
 591 *
 592 *   Called whenever a period elapses, it must return the current hardware
 593 *  position of the buffer.
 594 *   Also resets the read counter used to prevent overruns
 595 *
 596 */
 597
 598static snd_pcm_uframes_t
 599snd_card_saa7134_capture_pointer(struct snd_pcm_substream * substream)
 600{
 601        struct snd_pcm_runtime *runtime = substream->runtime;
 602        snd_card_saa7134_pcm_t *pcm = runtime->private_data;
 603        struct saa7134_dev *dev=pcm->dev;
 604
 605        if (dev->dmasound.read_count) {
 606                dev->dmasound.read_count  -= snd_pcm_lib_period_bytes(substream);
 607                dev->dmasound.read_offset += snd_pcm_lib_period_bytes(substream);
 608                if (dev->dmasound.read_offset == dev->dmasound.bufsize)
 609                        dev->dmasound.read_offset = 0;
 610        }
 611
 612        return bytes_to_frames(runtime, dev->dmasound.read_offset);
 613}
 614
 615/*
 616 * ALSA hardware capabilities definition
 617 *
 618 *  Report only 32kHz for ALSA:
 619 *
 620 *  - SAA7133/35 uses DDEP (DemDec Easy Programming mode), which works in 32kHz
 621 *    only
 622 *  - SAA7134 for TV mode uses DemDec mode (32kHz)
 623 *  - Radio works in 32kHz only
 624 *  - When recording 48kHz from Line1/Line2, switching of capture source to TV
 625 *    means
 626 *    switching to 32kHz without any frequency translation
 627 */
 628
 629static const struct snd_pcm_hardware snd_card_saa7134_capture =
 630{
 631        .info =                 (SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
 632                                 SNDRV_PCM_INFO_BLOCK_TRANSFER |
 633                                 SNDRV_PCM_INFO_MMAP_VALID),
 634        .formats =              SNDRV_PCM_FMTBIT_S16_LE | \
 635                                SNDRV_PCM_FMTBIT_S16_BE | \
 636                                SNDRV_PCM_FMTBIT_S8 | \
 637                                SNDRV_PCM_FMTBIT_U8 | \
 638                                SNDRV_PCM_FMTBIT_U16_LE | \
 639                                SNDRV_PCM_FMTBIT_U16_BE,
 640        .rates =                SNDRV_PCM_RATE_32000,
 641        .rate_min =             32000,
 642        .rate_max =             32000,
 643        .channels_min =         1,
 644        .channels_max =         2,
 645        .buffer_bytes_max =     (256*1024),
 646        .period_bytes_min =     64,
 647        .period_bytes_max =     (256*1024),
 648        .periods_min =          4,
 649        .periods_max =          1024,
 650};
 651
 652static void snd_card_saa7134_runtime_free(struct snd_pcm_runtime *runtime)
 653{
 654        snd_card_saa7134_pcm_t *pcm = runtime->private_data;
 655
 656        kfree(pcm);
 657}
 658
 659
 660/*
 661 * ALSA hardware params
 662 *
 663 *   - One of the ALSA capture callbacks.
 664 *
 665 *   Called on initialization, right before the PCM preparation
 666 *
 667 */
 668
 669static int snd_card_saa7134_hw_params(struct snd_pcm_substream * substream,
 670                                      struct snd_pcm_hw_params * hw_params)
 671{
 672        snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream);
 673        struct saa7134_dev *dev;
 674        unsigned int period_size, periods;
 675        int err;
 676
 677        period_size = params_period_bytes(hw_params);
 678        periods = params_periods(hw_params);
 679
 680        if (period_size < 0x100 || period_size > 0x10000)
 681                return -EINVAL;
 682        if (periods < 4)
 683                return -EINVAL;
 684        if (period_size * periods > 1024 * 1024)
 685                return -EINVAL;
 686
 687        dev = saa7134->dev;
 688
 689        if (dev->dmasound.blocks == periods &&
 690            dev->dmasound.blksize == period_size)
 691                return 0;
 692
 693        /* release the old buffer */
 694        if (substream->runtime->dma_area) {
 695                saa7134_pgtable_free(dev->pci, &dev->dmasound.pt);
 696                saa7134_alsa_dma_unmap(dev);
 697                dsp_buffer_free(dev);
 698                substream->runtime->dma_area = NULL;
 699        }
 700        dev->dmasound.blocks  = periods;
 701        dev->dmasound.blksize = period_size;
 702        dev->dmasound.bufsize = period_size * periods;
 703
 704        err = dsp_buffer_init(dev);
 705        if (0 != err) {
 706                dev->dmasound.blocks  = 0;
 707                dev->dmasound.blksize = 0;
 708                dev->dmasound.bufsize = 0;
 709                return err;
 710        }
 711
 712        err = saa7134_alsa_dma_map(dev);
 713        if (err) {
 714                dsp_buffer_free(dev);
 715                return err;
 716        }
 717        err = saa7134_pgtable_alloc(dev->pci, &dev->dmasound.pt);
 718        if (err) {
 719                saa7134_alsa_dma_unmap(dev);
 720                dsp_buffer_free(dev);
 721                return err;
 722        }
 723        err = saa7134_pgtable_build(dev->pci, &dev->dmasound.pt,
 724                                dev->dmasound.sglist, dev->dmasound.sglen, 0);
 725        if (err) {
 726                saa7134_pgtable_free(dev->pci, &dev->dmasound.pt);
 727                saa7134_alsa_dma_unmap(dev);
 728                dsp_buffer_free(dev);
 729                return err;
 730        }
 731
 732        /* I should be able to use runtime->dma_addr in the control
 733           byte, but it doesn't work. So I allocate the DMA using the
 734           V4L functions, and force ALSA to use that as the DMA area */
 735
 736        substream->runtime->dma_area = dev->dmasound.vaddr;
 737        substream->runtime->dma_bytes = dev->dmasound.bufsize;
 738        substream->runtime->dma_addr = 0;
 739
 740        return 0;
 741
 742}
 743
 744/*
 745 * ALSA hardware release
 746 *
 747 *   - One of the ALSA capture callbacks.
 748 *
 749 *   Called after closing the device, but before snd_card_saa7134_capture_close
 750 *   It stops the DMA audio and releases the buffers.
 751 *
 752 */
 753
 754static int snd_card_saa7134_hw_free(struct snd_pcm_substream * substream)
 755{
 756        snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream);
 757        struct saa7134_dev *dev;
 758
 759        dev = saa7134->dev;
 760
 761        if (substream->runtime->dma_area) {
 762                saa7134_pgtable_free(dev->pci, &dev->dmasound.pt);
 763                saa7134_alsa_dma_unmap(dev);
 764                dsp_buffer_free(dev);
 765                substream->runtime->dma_area = NULL;
 766        }
 767
 768        return 0;
 769}
 770
 771/*
 772 * ALSA capture finish
 773 *
 774 *   - One of the ALSA capture callbacks.
 775 *
 776 *   Called after closing the device.
 777 *
 778 */
 779
 780static int snd_card_saa7134_capture_close(struct snd_pcm_substream * substream)
 781{
 782        snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream);
 783        struct saa7134_dev *dev = saa7134->dev;
 784
 785        if (saa7134->mute_was_on) {
 786                dev->ctl_mute = 1;
 787                saa7134_tvaudio_setmute(dev);
 788        }
 789        return 0;
 790}
 791
 792/*
 793 * ALSA capture start
 794 *
 795 *   - One of the ALSA capture callbacks.
 796 *
 797 *   Called when opening the device. It creates and populates the PCM
 798 *  structure
 799 *
 800 */
 801
 802static int snd_card_saa7134_capture_open(struct snd_pcm_substream * substream)
 803{
 804        struct snd_pcm_runtime *runtime = substream->runtime;
 805        snd_card_saa7134_pcm_t *pcm;
 806        snd_card_saa7134_t *saa7134 = snd_pcm_substream_chip(substream);
 807        struct saa7134_dev *dev;
 808        int amux, err;
 809
 810        if (!saa7134) {
 811                pr_err("BUG: saa7134 can't find device struct. Can't proceed with open\n");
 812                return -ENODEV;
 813        }
 814        dev = saa7134->dev;
 815        mutex_lock(&dev->dmasound.lock);
 816
 817        dev->dmasound.read_count  = 0;
 818        dev->dmasound.read_offset = 0;
 819
 820        amux = dev->input->amux;
 821        if ((amux < 1) || (amux > 3))
 822                amux = 1;
 823        dev->dmasound.input  =  amux - 1;
 824
 825        mutex_unlock(&dev->dmasound.lock);
 826
 827        pcm = kzalloc(sizeof(*pcm), GFP_KERNEL);
 828        if (pcm == NULL)
 829                return -ENOMEM;
 830
 831        pcm->dev=saa7134->dev;
 832
 833        spin_lock_init(&pcm->lock);
 834
 835        pcm->substream = substream;
 836        runtime->private_data = pcm;
 837        runtime->private_free = snd_card_saa7134_runtime_free;
 838        runtime->hw = snd_card_saa7134_capture;
 839
 840        if (dev->ctl_mute != 0) {
 841                saa7134->mute_was_on = 1;
 842                dev->ctl_mute = 0;
 843                saa7134_tvaudio_setmute(dev);
 844        }
 845
 846        err = snd_pcm_hw_constraint_integer(runtime,
 847                                                SNDRV_PCM_HW_PARAM_PERIODS);
 848        if (err < 0)
 849                return err;
 850
 851        err = snd_pcm_hw_constraint_step(runtime, 0,
 852                                                SNDRV_PCM_HW_PARAM_PERIODS, 2);
 853        if (err < 0)
 854                return err;
 855
 856        return 0;
 857}
 858
 859/*
 860 * page callback (needed for mmap)
 861 */
 862
 863static struct page *snd_card_saa7134_page(struct snd_pcm_substream *substream,
 864                                        unsigned long offset)
 865{
 866        void *pageptr = substream->runtime->dma_area + offset;
 867        return vmalloc_to_page(pageptr);
 868}
 869
 870/*
 871 * ALSA capture callbacks definition
 872 */
 873
 874static const struct snd_pcm_ops snd_card_saa7134_capture_ops = {
 875        .open =                 snd_card_saa7134_capture_open,
 876        .close =                snd_card_saa7134_capture_close,
 877        .ioctl =                snd_pcm_lib_ioctl,
 878        .hw_params =            snd_card_saa7134_hw_params,
 879        .hw_free =              snd_card_saa7134_hw_free,
 880        .prepare =              snd_card_saa7134_capture_prepare,
 881        .trigger =              snd_card_saa7134_capture_trigger,
 882        .pointer =              snd_card_saa7134_capture_pointer,
 883        .page =                 snd_card_saa7134_page,
 884};
 885
 886/*
 887 * ALSA PCM setup
 888 *
 889 *   Called when initializing the board. Sets up the name and hooks up
 890 *  the callbacks
 891 *
 892 */
 893
 894static int snd_card_saa7134_pcm(snd_card_saa7134_t *saa7134, int device)
 895{
 896        struct snd_pcm *pcm;
 897        int err;
 898
 899        if ((err = snd_pcm_new(saa7134->card, "SAA7134 PCM", device, 0, 1, &pcm)) < 0)
 900                return err;
 901        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_card_saa7134_capture_ops);
 902        pcm->private_data = saa7134;
 903        pcm->info_flags = 0;
 904        strcpy(pcm->name, "SAA7134 PCM");
 905        return 0;
 906}
 907
 908#define SAA713x_VOLUME(xname, xindex, addr) \
 909{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
 910  .info = snd_saa7134_volume_info, \
 911  .get = snd_saa7134_volume_get, .put = snd_saa7134_volume_put, \
 912  .private_value = addr }
 913
 914static int snd_saa7134_volume_info(struct snd_kcontrol * kcontrol,
 915                                   struct snd_ctl_elem_info * uinfo)
 916{
 917        uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
 918        uinfo->count = 2;
 919        uinfo->value.integer.min = 0;
 920        uinfo->value.integer.max = 20;
 921        return 0;
 922}
 923
 924static int snd_saa7134_volume_get(struct snd_kcontrol * kcontrol,
 925                                  struct snd_ctl_elem_value * ucontrol)
 926{
 927        snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol);
 928        int addr = kcontrol->private_value;
 929
 930        ucontrol->value.integer.value[0] = chip->mixer_volume[addr][0];
 931        ucontrol->value.integer.value[1] = chip->mixer_volume[addr][1];
 932        return 0;
 933}
 934
 935static int snd_saa7134_volume_put(struct snd_kcontrol * kcontrol,
 936                                  struct snd_ctl_elem_value * ucontrol)
 937{
 938        snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol);
 939        struct saa7134_dev *dev = chip->dev;
 940
 941        int change, addr = kcontrol->private_value;
 942        int left, right;
 943
 944        left = ucontrol->value.integer.value[0];
 945        if (left < 0)
 946                left = 0;
 947        if (left > 20)
 948                left = 20;
 949        right = ucontrol->value.integer.value[1];
 950        if (right < 0)
 951                right = 0;
 952        if (right > 20)
 953                right = 20;
 954        spin_lock_irq(&chip->mixer_lock);
 955        change = 0;
 956        if (chip->mixer_volume[addr][0] != left) {
 957                change = 1;
 958                right = left;
 959        }
 960        if (chip->mixer_volume[addr][1] != right) {
 961                change = 1;
 962                left = right;
 963        }
 964        if (change) {
 965                switch (dev->pci->device) {
 966                        case PCI_DEVICE_ID_PHILIPS_SAA7134:
 967                                switch (addr) {
 968                                        case MIXER_ADDR_TVTUNER:
 969                                                left = 20;
 970                                                break;
 971                                        case MIXER_ADDR_LINE1:
 972                                                saa_andorb(SAA7134_ANALOG_IO_SELECT,  0x10,
 973                                                           (left > 10) ? 0x00 : 0x10);
 974                                                break;
 975                                        case MIXER_ADDR_LINE2:
 976                                                saa_andorb(SAA7134_ANALOG_IO_SELECT,  0x20,
 977                                                           (left > 10) ? 0x00 : 0x20);
 978                                                break;
 979                                }
 980                                break;
 981                        case PCI_DEVICE_ID_PHILIPS_SAA7133:
 982                        case PCI_DEVICE_ID_PHILIPS_SAA7135:
 983                                switch (addr) {
 984                                        case MIXER_ADDR_TVTUNER:
 985                                                left = 20;
 986                                                break;
 987                                        case MIXER_ADDR_LINE1:
 988                                                saa_andorb(0x0594,  0x10,
 989                                                           (left > 10) ? 0x00 : 0x10);
 990                                                break;
 991                                        case MIXER_ADDR_LINE2:
 992                                                saa_andorb(0x0594,  0x20,
 993                                                           (left > 10) ? 0x00 : 0x20);
 994                                                break;
 995                                }
 996                                break;
 997                }
 998                chip->mixer_volume[addr][0] = left;
 999                chip->mixer_volume[addr][1] = right;
1000        }
1001        spin_unlock_irq(&chip->mixer_lock);
1002        return change;
1003}
1004
1005#define SAA713x_CAPSRC(xname, xindex, addr) \
1006{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xindex, \
1007  .info = snd_saa7134_capsrc_info, \
1008  .get = snd_saa7134_capsrc_get, .put = snd_saa7134_capsrc_put, \
1009  .private_value = addr }
1010
1011static int snd_saa7134_capsrc_info(struct snd_kcontrol * kcontrol,
1012                                   struct snd_ctl_elem_info * uinfo)
1013{
1014        uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
1015        uinfo->count = 2;
1016        uinfo->value.integer.min = 0;
1017        uinfo->value.integer.max = 1;
1018        return 0;
1019}
1020
1021static int snd_saa7134_capsrc_get(struct snd_kcontrol * kcontrol,
1022                                  struct snd_ctl_elem_value * ucontrol)
1023{
1024        snd_card_saa7134_t *chip = snd_kcontrol_chip(kcontrol);
1025        int addr = kcontrol->private_value;
1026
1027        spin_lock_irq(&chip->mixer_lock);
1028        if (chip->capture_source_addr == addr) {
1029                ucontrol->value.integer.value[0] = chip->capture_source[0];
1030                ucontrol->value.integer.value[1] = chip->capture_source[1];
1031        } else {
1032                ucontrol->value.integer.value[0] = 0;
1033                ucontrol->value.integer.value[1] = 0;
1034        }
1035        spin_unlock_irq(&chip->mixer_lock);
1036
1037        return 0;
1038}
1039
1040static int snd_saa7134_capsrc_put(struct snd_kcontrol * kcontrol,
1041                                  struct snd_ctl_elem_value * ucontrol)
1042{
1043        int left, right;
1044        left = ucontrol->value.integer.value[0] & 1;
1045        right = ucontrol->value.integer.value[1] & 1;
1046
1047        return snd_saa7134_capsrc_set(kcontrol, left, right, false);
1048}
1049
1050static struct snd_kcontrol_new snd_saa7134_volume_controls[] = {
1051SAA713x_VOLUME("Video Volume", 0, MIXER_ADDR_TVTUNER),
1052SAA713x_VOLUME("Line Volume", 1, MIXER_ADDR_LINE1),
1053SAA713x_VOLUME("Line Volume", 2, MIXER_ADDR_LINE2),
1054};
1055
1056static struct snd_kcontrol_new snd_saa7134_capture_controls[] = {
1057SAA713x_CAPSRC("Video Capture Switch", 0, MIXER_ADDR_TVTUNER),
1058SAA713x_CAPSRC("Line Capture Switch", 1, MIXER_ADDR_LINE1),
1059SAA713x_CAPSRC("Line Capture Switch", 2, MIXER_ADDR_LINE2),
1060};
1061
1062/*
1063 * ALSA mixer setup
1064 *
1065 *   Called when initializing the board. Sets up the name and hooks up
1066 *  the callbacks
1067 *
1068 */
1069
1070static int snd_card_saa7134_new_mixer(snd_card_saa7134_t * chip)
1071{
1072        struct snd_card *card = chip->card;
1073        struct snd_kcontrol *kcontrol;
1074        unsigned int idx;
1075        int err, addr;
1076
1077        strcpy(card->mixername, "SAA7134 Mixer");
1078
1079        for (idx = 0; idx < ARRAY_SIZE(snd_saa7134_volume_controls); idx++) {
1080                kcontrol = snd_ctl_new1(&snd_saa7134_volume_controls[idx],
1081                                        chip);
1082                err = snd_ctl_add(card, kcontrol);
1083                if (err < 0)
1084                        return err;
1085        }
1086
1087        for (idx = 0; idx < ARRAY_SIZE(snd_saa7134_capture_controls); idx++) {
1088                kcontrol = snd_ctl_new1(&snd_saa7134_capture_controls[idx],
1089                                        chip);
1090                addr = snd_saa7134_capture_controls[idx].private_value;
1091                chip->capture_ctl[addr] = kcontrol;
1092                err = snd_ctl_add(card, kcontrol);
1093                if (err < 0)
1094                        return err;
1095        }
1096
1097        chip->capture_source_addr = MIXER_ADDR_UNSELECTED;
1098        return 0;
1099}
1100
1101static void snd_saa7134_free(struct snd_card * card)
1102{
1103        snd_card_saa7134_t *chip = card->private_data;
1104
1105        if (chip->dev->dmasound.priv_data == NULL)
1106                return;
1107
1108        if (chip->irq >= 0)
1109                free_irq(chip->irq, &chip->dev->dmasound);
1110
1111        chip->dev->dmasound.priv_data = NULL;
1112
1113}
1114
1115/*
1116 * ALSA initialization
1117 *
1118 *   Called by the init routine, once for each saa7134 device present,
1119 *  it creates the basic structures and registers the ALSA devices
1120 *
1121 */
1122
1123static int alsa_card_saa7134_create(struct saa7134_dev *dev, int devnum)
1124{
1125
1126        struct snd_card *card;
1127        snd_card_saa7134_t *chip;
1128        int err;
1129
1130
1131        if (devnum >= SNDRV_CARDS)
1132                return -ENODEV;
1133        if (!enable[devnum])
1134                return -ENODEV;
1135
1136        err = snd_card_new(&dev->pci->dev, index[devnum], id[devnum],
1137                           THIS_MODULE, sizeof(snd_card_saa7134_t), &card);
1138        if (err < 0)
1139                return err;
1140
1141        strcpy(card->driver, "SAA7134");
1142
1143        /* Card "creation" */
1144
1145        card->private_free = snd_saa7134_free;
1146        chip = card->private_data;
1147
1148        spin_lock_init(&chip->lock);
1149        spin_lock_init(&chip->mixer_lock);
1150
1151        chip->dev = dev;
1152
1153        chip->card = card;
1154
1155        chip->pci = dev->pci;
1156        chip->iobase = pci_resource_start(dev->pci, 0);
1157
1158
1159        err = request_irq(dev->pci->irq, saa7134_alsa_irq,
1160                                IRQF_SHARED, dev->name,
1161                                (void*) &dev->dmasound);
1162
1163        if (err < 0) {
1164                pr_err("%s: can't get IRQ %d for ALSA\n",
1165                        dev->name, dev->pci->irq);
1166                goto __nodev;
1167        }
1168
1169        chip->irq = dev->pci->irq;
1170
1171        mutex_init(&dev->dmasound.lock);
1172
1173        if ((err = snd_card_saa7134_new_mixer(chip)) < 0)
1174                goto __nodev;
1175
1176        if ((err = snd_card_saa7134_pcm(chip, 0)) < 0)
1177                goto __nodev;
1178
1179        /* End of "creation" */
1180
1181        strcpy(card->shortname, "SAA7134");
1182        sprintf(card->longname, "%s at 0x%lx irq %d",
1183                chip->dev->name, chip->iobase, chip->irq);
1184
1185        pr_info("%s/alsa: %s registered as card %d\n",
1186                dev->name, card->longname, index[devnum]);
1187
1188        if ((err = snd_card_register(card)) == 0) {
1189                snd_saa7134_cards[devnum] = card;
1190                return 0;
1191        }
1192
1193__nodev:
1194        snd_card_free(card);
1195        return err;
1196}
1197
1198
1199static int alsa_device_init(struct saa7134_dev *dev)
1200{
1201        dev->dmasound.priv_data = dev;
1202        alsa_card_saa7134_create(dev,dev->nr);
1203        return 1;
1204}
1205
1206static int alsa_device_exit(struct saa7134_dev *dev)
1207{
1208        if (!snd_saa7134_cards[dev->nr])
1209                return 1;
1210
1211        snd_card_free(snd_saa7134_cards[dev->nr]);
1212        snd_saa7134_cards[dev->nr] = NULL;
1213        return 1;
1214}
1215
1216/*
1217 * Module initializer
1218 *
1219 * Loops through present saa7134 cards, and assigns an ALSA device
1220 * to each one
1221 *
1222 */
1223
1224static int saa7134_alsa_init(void)
1225{
1226        struct saa7134_dev *dev = NULL;
1227        struct list_head *list;
1228
1229        saa7134_dmasound_init = alsa_device_init;
1230        saa7134_dmasound_exit = alsa_device_exit;
1231
1232        pr_info("saa7134 ALSA driver for DMA sound loaded\n");
1233
1234        list_for_each(list,&saa7134_devlist) {
1235                dev = list_entry(list, struct saa7134_dev, devlist);
1236                if (dev->pci->device == PCI_DEVICE_ID_PHILIPS_SAA7130)
1237                        pr_info("%s/alsa: %s doesn't support digital audio\n",
1238                                dev->name, saa7134_boards[dev->board].name);
1239                else
1240                        alsa_device_init(dev);
1241        }
1242
1243        if (dev == NULL)
1244                pr_info("saa7134 ALSA: no saa7134 cards found\n");
1245
1246        return 0;
1247
1248}
1249
1250/*
1251 * Module destructor
1252 */
1253
1254static void saa7134_alsa_exit(void)
1255{
1256        int idx;
1257
1258        for (idx = 0; idx < SNDRV_CARDS; idx++) {
1259                if (snd_saa7134_cards[idx])
1260                        snd_card_free(snd_saa7134_cards[idx]);
1261        }
1262
1263        saa7134_dmasound_init = NULL;
1264        saa7134_dmasound_exit = NULL;
1265        pr_info("saa7134 ALSA driver for DMA sound unloaded\n");
1266
1267        return;
1268}
1269
1270/* We initialize this late, to make sure the sound system is up and running */
1271late_initcall(saa7134_alsa_init);
1272module_exit(saa7134_alsa_exit);
1273MODULE_LICENSE("GPL");
1274MODULE_AUTHOR("Ricardo Cerqueira");
1275