linux/sound/pci/bt87x.c
<<
>>
Prefs
   1/*
   2 * bt87x.c - Brooktree Bt878/Bt879 driver for ALSA
   3 *
   4 * Copyright (c) Clemens Ladisch <clemens@ladisch.de>
   5 *
   6 * based on btaudio.c by Gerd Knorr <kraxel@bytesex.org>
   7 *
   8 *
   9 *  This driver is free software; you can redistribute it and/or modify
  10 *  it under the terms of the GNU General Public License as published by
  11 *  the Free Software Foundation; either version 2 of the License, or
  12 *  (at your option) any later version.
  13 *
  14 *  This driver is distributed in the hope that it will be useful,
  15 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  16 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17 *  GNU General Public License for more details.
  18 *
  19 *  You should have received a copy of the GNU General Public License
  20 *  along with this program; if not, write to the Free Software
  21 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  22 */
  23
  24#include <linux/init.h>
  25#include <linux/interrupt.h>
  26#include <linux/pci.h>
  27#include <linux/slab.h>
  28#include <linux/moduleparam.h>
  29#include <linux/bitops.h>
  30#include <asm/io.h>
  31#include <sound/core.h>
  32#include <sound/pcm.h>
  33#include <sound/pcm_params.h>
  34#include <sound/control.h>
  35#include <sound/initval.h>
  36
  37MODULE_AUTHOR("Clemens Ladisch <clemens@ladisch.de>");
  38MODULE_DESCRIPTION("Brooktree Bt87x audio driver");
  39MODULE_LICENSE("GPL");
  40MODULE_SUPPORTED_DEVICE("{{Brooktree,Bt878},"
  41                "{Brooktree,Bt879}}");
  42
  43static int index[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = -2}; /* Exclude the first card */
  44static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;       /* ID for this card */
  45static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;      /* Enable this card */
  46static int digital_rate[SNDRV_CARDS];   /* digital input rate */
  47static int load_all;    /* allow to load the non-whitelisted cards */
  48
  49module_param_array(index, int, NULL, 0444);
  50MODULE_PARM_DESC(index, "Index value for Bt87x soundcard");
  51module_param_array(id, charp, NULL, 0444);
  52MODULE_PARM_DESC(id, "ID string for Bt87x soundcard");
  53module_param_array(enable, bool, NULL, 0444);
  54MODULE_PARM_DESC(enable, "Enable Bt87x soundcard");
  55module_param_array(digital_rate, int, NULL, 0444);
  56MODULE_PARM_DESC(digital_rate, "Digital input rate for Bt87x soundcard");
  57module_param(load_all, bool, 0444);
  58MODULE_PARM_DESC(load_all, "Allow to load the non-whitelisted cards");
  59
  60
  61/* register offsets */
  62#define REG_INT_STAT            0x100   /* interrupt status */
  63#define REG_INT_MASK            0x104   /* interrupt mask */
  64#define REG_GPIO_DMA_CTL        0x10c   /* audio control */
  65#define REG_PACKET_LEN          0x110   /* audio packet lengths */
  66#define REG_RISC_STRT_ADD       0x114   /* RISC program start address */
  67#define REG_RISC_COUNT          0x120   /* RISC program counter */
  68
  69/* interrupt bits */
  70#define INT_OFLOW       (1 <<  3)       /* audio A/D overflow */
  71#define INT_RISCI       (1 << 11)       /* RISC instruction IRQ bit set */
  72#define INT_FBUS        (1 << 12)       /* FIFO overrun due to bus access latency */
  73#define INT_FTRGT       (1 << 13)       /* FIFO overrun due to target latency */
  74#define INT_FDSR        (1 << 14)       /* FIFO data stream resynchronization */
  75#define INT_PPERR       (1 << 15)       /* PCI parity error */
  76#define INT_RIPERR      (1 << 16)       /* RISC instruction parity error */
  77#define INT_PABORT      (1 << 17)       /* PCI master or target abort */
  78#define INT_OCERR       (1 << 18)       /* invalid opcode */
  79#define INT_SCERR       (1 << 19)       /* sync counter overflow */
  80#define INT_RISC_EN     (1 << 27)       /* DMA controller running */
  81#define INT_RISCS_SHIFT       28        /* RISC status bits */
  82
  83/* audio control bits */
  84#define CTL_FIFO_ENABLE         (1 <<  0)       /* enable audio data FIFO */
  85#define CTL_RISC_ENABLE         (1 <<  1)       /* enable audio DMA controller */
  86#define CTL_PKTP_4              (0 <<  2)       /* packet mode FIFO trigger point - 4 DWORDs */
  87#define CTL_PKTP_8              (1 <<  2)       /* 8 DWORDs */
  88#define CTL_PKTP_16             (2 <<  2)       /* 16 DWORDs */
  89#define CTL_ACAP_EN             (1 <<  4)       /* enable audio capture */
  90#define CTL_DA_APP              (1 <<  5)       /* GPIO input */
  91#define CTL_DA_IOM_AFE          (0 <<  6)       /* audio A/D input */
  92#define CTL_DA_IOM_DA           (1 <<  6)       /* digital audio input */
  93#define CTL_DA_SDR_SHIFT               8        /* DDF first stage decimation rate */
  94#define CTL_DA_SDR_MASK         (0xf<< 8)
  95#define CTL_DA_LMT              (1 << 12)       /* limit audio data values */
  96#define CTL_DA_ES2              (1 << 13)       /* enable DDF stage 2 */
  97#define CTL_DA_SBR              (1 << 14)       /* samples rounded to 8 bits */
  98#define CTL_DA_DPM              (1 << 15)       /* data packet mode */
  99#define CTL_DA_LRD_SHIFT              16        /* ALRCK delay */
 100#define CTL_DA_MLB              (1 << 21)       /* MSB/LSB format */
 101#define CTL_DA_LRI              (1 << 22)       /* left/right indication */
 102#define CTL_DA_SCE              (1 << 23)       /* sample clock edge */
 103#define CTL_A_SEL_STV           (0 << 24)       /* TV tuner audio input */
 104#define CTL_A_SEL_SFM           (1 << 24)       /* FM audio input */
 105#define CTL_A_SEL_SML           (2 << 24)       /* mic/line audio input */
 106#define CTL_A_SEL_SMXC          (3 << 24)       /* MUX bypass */
 107#define CTL_A_SEL_SHIFT               24
 108#define CTL_A_SEL_MASK          (3 << 24)
 109#define CTL_A_PWRDN             (1 << 26)       /* analog audio power-down */
 110#define CTL_A_G2X               (1 << 27)       /* audio gain boost */
 111#define CTL_A_GAIN_SHIFT              28        /* audio input gain */
 112#define CTL_A_GAIN_MASK         (0xf<<28)
 113
 114/* RISC instruction opcodes */
 115#define RISC_WRITE      (0x1 << 28)     /* write FIFO data to memory at address */
 116#define RISC_WRITEC     (0x5 << 28)     /* write FIFO data to memory at current address */
 117#define RISC_SKIP       (0x2 << 28)     /* skip FIFO data */
 118#define RISC_JUMP       (0x7 << 28)     /* jump to address */
 119#define RISC_SYNC       (0x8 << 28)     /* synchronize with FIFO */
 120
 121/* RISC instruction bits */
 122#define RISC_BYTES_ENABLE       (0xf << 12)     /* byte enable bits */
 123#define RISC_RESYNC             (  1 << 15)     /* disable FDSR errors */
 124#define RISC_SET_STATUS_SHIFT           16      /* set status bits */
 125#define RISC_RESET_STATUS_SHIFT         20      /* clear status bits */
 126#define RISC_IRQ                (  1 << 24)     /* interrupt */
 127#define RISC_EOL                (  1 << 26)     /* end of line */
 128#define RISC_SOL                (  1 << 27)     /* start of line */
 129
 130/* SYNC status bits values */
 131#define RISC_SYNC_FM1   0x6
 132#define RISC_SYNC_VRO   0xc
 133
 134#define ANALOG_CLOCK 1792000
 135#ifdef CONFIG_SND_BT87X_OVERCLOCK
 136#define CLOCK_DIV_MIN 1
 137#else
 138#define CLOCK_DIV_MIN 4
 139#endif
 140#define CLOCK_DIV_MAX 15
 141
 142#define ERROR_INTERRUPTS (INT_FBUS | INT_FTRGT | INT_PPERR | \
 143                          INT_RIPERR | INT_PABORT | INT_OCERR)
 144#define MY_INTERRUPTS (INT_RISCI | ERROR_INTERRUPTS)
 145
 146/* SYNC, one WRITE per line, one extra WRITE per page boundary, SYNC, JUMP */
 147#define MAX_RISC_SIZE ((1 + 255 + (PAGE_ALIGN(255 * 4092) / PAGE_SIZE - 1) + 1 + 1) * 8)
 148
 149/* Cards with configuration information */
 150enum snd_bt87x_boardid {
 151        SND_BT87X_BOARD_UNKNOWN,
 152        SND_BT87X_BOARD_GENERIC,        /* both an & dig interfaces, 32kHz */
 153        SND_BT87X_BOARD_ANALOG,         /* board with no external A/D */
 154        SND_BT87X_BOARD_OSPREY2x0,
 155        SND_BT87X_BOARD_OSPREY440,
 156        SND_BT87X_BOARD_AVPHONE98,
 157};
 158
 159/* Card configuration */
 160struct snd_bt87x_board {
 161        int dig_rate;           /* Digital input sampling rate */
 162        u32 digital_fmt;        /* Register settings for digital input */
 163        unsigned no_analog:1;   /* No analog input */
 164        unsigned no_digital:1;  /* No digital input */
 165};
 166
 167static __devinitdata struct snd_bt87x_board snd_bt87x_boards[] = {
 168        [SND_BT87X_BOARD_UNKNOWN] = {
 169                .dig_rate = 32000, /* just a guess */
 170        },
 171        [SND_BT87X_BOARD_GENERIC] = {
 172                .dig_rate = 32000,
 173        },
 174        [SND_BT87X_BOARD_ANALOG] = {
 175                .no_digital = 1,
 176        },
 177        [SND_BT87X_BOARD_OSPREY2x0] = {
 178                .dig_rate = 44100,
 179                .digital_fmt = CTL_DA_LRI | (1 << CTL_DA_LRD_SHIFT),
 180        },
 181        [SND_BT87X_BOARD_OSPREY440] = {
 182                .dig_rate = 32000,
 183                .digital_fmt = CTL_DA_LRI | (1 << CTL_DA_LRD_SHIFT),
 184                .no_analog = 1,
 185        },
 186        [SND_BT87X_BOARD_AVPHONE98] = {
 187                .dig_rate = 48000,
 188        },
 189};
 190
 191struct snd_bt87x {
 192        struct snd_card *card;
 193        struct pci_dev *pci;
 194        struct snd_bt87x_board board;
 195
 196        void __iomem *mmio;
 197        int irq;
 198
 199        spinlock_t reg_lock;
 200        unsigned long opened;
 201        struct snd_pcm_substream *substream;
 202
 203        struct snd_dma_buffer dma_risc;
 204        unsigned int line_bytes;
 205        unsigned int lines;
 206
 207        u32 reg_control;
 208        u32 interrupt_mask;
 209
 210        int current_line;
 211
 212        int pci_parity_errors;
 213};
 214
 215enum { DEVICE_DIGITAL, DEVICE_ANALOG };
 216
 217static inline u32 snd_bt87x_readl(struct snd_bt87x *chip, u32 reg)
 218{
 219        return readl(chip->mmio + reg);
 220}
 221
 222static inline void snd_bt87x_writel(struct snd_bt87x *chip, u32 reg, u32 value)
 223{
 224        writel(value, chip->mmio + reg);
 225}
 226
 227static int snd_bt87x_create_risc(struct snd_bt87x *chip, struct snd_pcm_substream *substream,
 228                                 unsigned int periods, unsigned int period_bytes)
 229{
 230        struct snd_sg_buf *sgbuf = snd_pcm_substream_sgbuf(substream);
 231        unsigned int i, offset;
 232        u32 *risc;
 233
 234        if (chip->dma_risc.area == NULL) {
 235                if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(chip->pci),
 236                                        PAGE_ALIGN(MAX_RISC_SIZE), &chip->dma_risc) < 0)
 237                        return -ENOMEM;
 238        }
 239        risc = (u32 *)chip->dma_risc.area;
 240        offset = 0;
 241        *risc++ = cpu_to_le32(RISC_SYNC | RISC_SYNC_FM1);
 242        *risc++ = cpu_to_le32(0);
 243        for (i = 0; i < periods; ++i) {
 244                u32 rest;
 245
 246                rest = period_bytes;
 247                do {
 248                        u32 cmd, len;
 249
 250                        len = PAGE_SIZE - (offset % PAGE_SIZE);
 251                        if (len > rest)
 252                                len = rest;
 253                        cmd = RISC_WRITE | len;
 254                        if (rest == period_bytes) {
 255                                u32 block = i * 16 / periods;
 256                                cmd |= RISC_SOL;
 257                                cmd |= block << RISC_SET_STATUS_SHIFT;
 258                                cmd |= (~block & 0xf) << RISC_RESET_STATUS_SHIFT;
 259                        }
 260                        if (len == rest)
 261                                cmd |= RISC_EOL | RISC_IRQ;
 262                        *risc++ = cpu_to_le32(cmd);
 263                        *risc++ = cpu_to_le32((u32)snd_pcm_sgbuf_get_addr(sgbuf, offset));
 264                        offset += len;
 265                        rest -= len;
 266                } while (rest > 0);
 267        }
 268        *risc++ = cpu_to_le32(RISC_SYNC | RISC_SYNC_VRO);
 269        *risc++ = cpu_to_le32(0);
 270        *risc++ = cpu_to_le32(RISC_JUMP);
 271        *risc++ = cpu_to_le32(chip->dma_risc.addr);
 272        chip->line_bytes = period_bytes;
 273        chip->lines = periods;
 274        return 0;
 275}
 276
 277static void snd_bt87x_free_risc(struct snd_bt87x *chip)
 278{
 279        if (chip->dma_risc.area) {
 280                snd_dma_free_pages(&chip->dma_risc);
 281                chip->dma_risc.area = NULL;
 282        }
 283}
 284
 285static void snd_bt87x_pci_error(struct snd_bt87x *chip, unsigned int status)
 286{
 287        u16 pci_status;
 288
 289        pci_read_config_word(chip->pci, PCI_STATUS, &pci_status);
 290        pci_status &= PCI_STATUS_PARITY | PCI_STATUS_SIG_TARGET_ABORT |
 291                PCI_STATUS_REC_TARGET_ABORT | PCI_STATUS_REC_MASTER_ABORT |
 292                PCI_STATUS_SIG_SYSTEM_ERROR | PCI_STATUS_DETECTED_PARITY;
 293        pci_write_config_word(chip->pci, PCI_STATUS, pci_status);
 294        if (pci_status != PCI_STATUS_DETECTED_PARITY)
 295                snd_printk(KERN_ERR "Aieee - PCI error! status %#08x, PCI status %#04x\n",
 296                           status & ERROR_INTERRUPTS, pci_status);
 297        else {
 298                snd_printk(KERN_ERR "Aieee - PCI parity error detected!\n");
 299                /* error 'handling' similar to aic7xxx_pci.c: */
 300                chip->pci_parity_errors++;
 301                if (chip->pci_parity_errors > 20) {
 302                        snd_printk(KERN_ERR "Too many PCI parity errors observed.\n");
 303                        snd_printk(KERN_ERR "Some device on this bus is generating bad parity.\n");
 304                        snd_printk(KERN_ERR "This is an error *observed by*, not *generated by*, this card.\n");
 305                        snd_printk(KERN_ERR "PCI parity error checking has been disabled.\n");
 306                        chip->interrupt_mask &= ~(INT_PPERR | INT_RIPERR);
 307                        snd_bt87x_writel(chip, REG_INT_MASK, chip->interrupt_mask);
 308                }
 309        }
 310}
 311
 312static irqreturn_t snd_bt87x_interrupt(int irq, void *dev_id)
 313{
 314        struct snd_bt87x *chip = dev_id;
 315        unsigned int status, irq_status;
 316
 317        status = snd_bt87x_readl(chip, REG_INT_STAT);
 318        irq_status = status & chip->interrupt_mask;
 319        if (!irq_status)
 320                return IRQ_NONE;
 321        snd_bt87x_writel(chip, REG_INT_STAT, irq_status);
 322
 323        if (irq_status & ERROR_INTERRUPTS) {
 324                if (irq_status & (INT_FBUS | INT_FTRGT))
 325                        snd_printk(KERN_WARNING "FIFO overrun, status %#08x\n", status);
 326                if (irq_status & INT_OCERR)
 327                        snd_printk(KERN_ERR "internal RISC error, status %#08x\n", status);
 328                if (irq_status & (INT_PPERR | INT_RIPERR | INT_PABORT))
 329                        snd_bt87x_pci_error(chip, irq_status);
 330        }
 331        if ((irq_status & INT_RISCI) && (chip->reg_control & CTL_ACAP_EN)) {
 332                int current_block, irq_block;
 333
 334                /* assume that exactly one line has been recorded */
 335                chip->current_line = (chip->current_line + 1) % chip->lines;
 336                /* but check if some interrupts have been skipped */
 337                current_block = chip->current_line * 16 / chip->lines;
 338                irq_block = status >> INT_RISCS_SHIFT;
 339                if (current_block != irq_block)
 340                        chip->current_line = (irq_block * chip->lines + 15) / 16;
 341
 342                snd_pcm_period_elapsed(chip->substream);
 343        }
 344        return IRQ_HANDLED;
 345}
 346
 347static struct snd_pcm_hardware snd_bt87x_digital_hw = {
 348        .info = SNDRV_PCM_INFO_MMAP |
 349                SNDRV_PCM_INFO_INTERLEAVED |
 350                SNDRV_PCM_INFO_BLOCK_TRANSFER |
 351                SNDRV_PCM_INFO_MMAP_VALID,
 352        .formats = SNDRV_PCM_FMTBIT_S16_LE,
 353        .rates = 0, /* set at runtime */
 354        .channels_min = 2,
 355        .channels_max = 2,
 356        .buffer_bytes_max = 255 * 4092,
 357        .period_bytes_min = 32,
 358        .period_bytes_max = 4092,
 359        .periods_min = 2,
 360        .periods_max = 255,
 361};
 362
 363static struct snd_pcm_hardware snd_bt87x_analog_hw = {
 364        .info = SNDRV_PCM_INFO_MMAP |
 365                SNDRV_PCM_INFO_INTERLEAVED |
 366                SNDRV_PCM_INFO_BLOCK_TRANSFER |
 367                SNDRV_PCM_INFO_MMAP_VALID,
 368        .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8,
 369        .rates = SNDRV_PCM_RATE_KNOT,
 370        .rate_min = ANALOG_CLOCK / CLOCK_DIV_MAX,
 371        .rate_max = ANALOG_CLOCK / CLOCK_DIV_MIN,
 372        .channels_min = 1,
 373        .channels_max = 1,
 374        .buffer_bytes_max = 255 * 4092,
 375        .period_bytes_min = 32,
 376        .period_bytes_max = 4092,
 377        .periods_min = 2,
 378        .periods_max = 255,
 379};
 380
 381static int snd_bt87x_set_digital_hw(struct snd_bt87x *chip, struct snd_pcm_runtime *runtime)
 382{
 383        chip->reg_control |= CTL_DA_IOM_DA | CTL_A_PWRDN;
 384        runtime->hw = snd_bt87x_digital_hw;
 385        runtime->hw.rates = snd_pcm_rate_to_rate_bit(chip->board.dig_rate);
 386        runtime->hw.rate_min = chip->board.dig_rate;
 387        runtime->hw.rate_max = chip->board.dig_rate;
 388        return 0;
 389}
 390
 391static int snd_bt87x_set_analog_hw(struct snd_bt87x *chip, struct snd_pcm_runtime *runtime)
 392{
 393        static struct snd_ratnum analog_clock = {
 394                .num = ANALOG_CLOCK,
 395                .den_min = CLOCK_DIV_MIN,
 396                .den_max = CLOCK_DIV_MAX,
 397                .den_step = 1
 398        };
 399        static struct snd_pcm_hw_constraint_ratnums constraint_rates = {
 400                .nrats = 1,
 401                .rats = &analog_clock
 402        };
 403
 404        chip->reg_control &= ~(CTL_DA_IOM_DA | CTL_A_PWRDN);
 405        runtime->hw = snd_bt87x_analog_hw;
 406        return snd_pcm_hw_constraint_ratnums(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
 407                                             &constraint_rates);
 408}
 409
 410static int snd_bt87x_pcm_open(struct snd_pcm_substream *substream)
 411{
 412        struct snd_bt87x *chip = snd_pcm_substream_chip(substream);
 413        struct snd_pcm_runtime *runtime = substream->runtime;
 414        int err;
 415
 416        if (test_and_set_bit(0, &chip->opened))
 417                return -EBUSY;
 418
 419        if (substream->pcm->device == DEVICE_DIGITAL)
 420                err = snd_bt87x_set_digital_hw(chip, runtime);
 421        else
 422                err = snd_bt87x_set_analog_hw(chip, runtime);
 423        if (err < 0)
 424                goto _error;
 425
 426        err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
 427        if (err < 0)
 428                goto _error;
 429
 430        chip->substream = substream;
 431        return 0;
 432
 433_error:
 434        clear_bit(0, &chip->opened);
 435        smp_mb__after_clear_bit();
 436        return err;
 437}
 438
 439static int snd_bt87x_close(struct snd_pcm_substream *substream)
 440{
 441        struct snd_bt87x *chip = snd_pcm_substream_chip(substream);
 442
 443        spin_lock_irq(&chip->reg_lock);
 444        chip->reg_control |= CTL_A_PWRDN;
 445        snd_bt87x_writel(chip, REG_GPIO_DMA_CTL, chip->reg_control);
 446        spin_unlock_irq(&chip->reg_lock);
 447
 448        chip->substream = NULL;
 449        clear_bit(0, &chip->opened);
 450        smp_mb__after_clear_bit();
 451        return 0;
 452}
 453
 454static int snd_bt87x_hw_params(struct snd_pcm_substream *substream,
 455                               struct snd_pcm_hw_params *hw_params)
 456{
 457        struct snd_bt87x *chip = snd_pcm_substream_chip(substream);
 458        int err;
 459
 460        err = snd_pcm_lib_malloc_pages(substream,
 461                                       params_buffer_bytes(hw_params));
 462        if (err < 0)
 463                return err;
 464        return snd_bt87x_create_risc(chip, substream,
 465                                     params_periods(hw_params),
 466                                     params_period_bytes(hw_params));
 467}
 468
 469static int snd_bt87x_hw_free(struct snd_pcm_substream *substream)
 470{
 471        struct snd_bt87x *chip = snd_pcm_substream_chip(substream);
 472
 473        snd_bt87x_free_risc(chip);
 474        snd_pcm_lib_free_pages(substream);
 475        return 0;
 476}
 477
 478static int snd_bt87x_prepare(struct snd_pcm_substream *substream)
 479{
 480        struct snd_bt87x *chip = snd_pcm_substream_chip(substream);
 481        struct snd_pcm_runtime *runtime = substream->runtime;
 482        int decimation;
 483
 484        spin_lock_irq(&chip->reg_lock);
 485        chip->reg_control &= ~(CTL_DA_SDR_MASK | CTL_DA_SBR);
 486        decimation = (ANALOG_CLOCK + runtime->rate / 4) / runtime->rate;
 487        chip->reg_control |= decimation << CTL_DA_SDR_SHIFT;
 488        if (runtime->format == SNDRV_PCM_FORMAT_S8)
 489                chip->reg_control |= CTL_DA_SBR;
 490        snd_bt87x_writel(chip, REG_GPIO_DMA_CTL, chip->reg_control);
 491        spin_unlock_irq(&chip->reg_lock);
 492        return 0;
 493}
 494
 495static int snd_bt87x_start(struct snd_bt87x *chip)
 496{
 497        spin_lock(&chip->reg_lock);
 498        chip->current_line = 0;
 499        chip->reg_control |= CTL_FIFO_ENABLE | CTL_RISC_ENABLE | CTL_ACAP_EN;
 500        snd_bt87x_writel(chip, REG_RISC_STRT_ADD, chip->dma_risc.addr);
 501        snd_bt87x_writel(chip, REG_PACKET_LEN,
 502                         chip->line_bytes | (chip->lines << 16));
 503        snd_bt87x_writel(chip, REG_INT_MASK, chip->interrupt_mask);
 504        snd_bt87x_writel(chip, REG_GPIO_DMA_CTL, chip->reg_control);
 505        spin_unlock(&chip->reg_lock);
 506        return 0;
 507}
 508
 509static int snd_bt87x_stop(struct snd_bt87x *chip)
 510{
 511        spin_lock(&chip->reg_lock);
 512        chip->reg_control &= ~(CTL_FIFO_ENABLE | CTL_RISC_ENABLE | CTL_ACAP_EN);
 513        snd_bt87x_writel(chip, REG_GPIO_DMA_CTL, chip->reg_control);
 514        snd_bt87x_writel(chip, REG_INT_MASK, 0);
 515        snd_bt87x_writel(chip, REG_INT_STAT, MY_INTERRUPTS);
 516        spin_unlock(&chip->reg_lock);
 517        return 0;
 518}
 519
 520static int snd_bt87x_trigger(struct snd_pcm_substream *substream, int cmd)
 521{
 522        struct snd_bt87x *chip = snd_pcm_substream_chip(substream);
 523
 524        switch (cmd) {
 525        case SNDRV_PCM_TRIGGER_START:
 526                return snd_bt87x_start(chip);
 527        case SNDRV_PCM_TRIGGER_STOP:
 528                return snd_bt87x_stop(chip);
 529        default:
 530                return -EINVAL;
 531        }
 532}
 533
 534static snd_pcm_uframes_t snd_bt87x_pointer(struct snd_pcm_substream *substream)
 535{
 536        struct snd_bt87x *chip = snd_pcm_substream_chip(substream);
 537        struct snd_pcm_runtime *runtime = substream->runtime;
 538
 539        return (snd_pcm_uframes_t)bytes_to_frames(runtime, chip->current_line * chip->line_bytes);
 540}
 541
 542static struct snd_pcm_ops snd_bt87x_pcm_ops = {
 543        .open = snd_bt87x_pcm_open,
 544        .close = snd_bt87x_close,
 545        .ioctl = snd_pcm_lib_ioctl,
 546        .hw_params = snd_bt87x_hw_params,
 547        .hw_free = snd_bt87x_hw_free,
 548        .prepare = snd_bt87x_prepare,
 549        .trigger = snd_bt87x_trigger,
 550        .pointer = snd_bt87x_pointer,
 551        .page = snd_pcm_sgbuf_ops_page,
 552};
 553
 554static int snd_bt87x_capture_volume_info(struct snd_kcontrol *kcontrol,
 555                                         struct snd_ctl_elem_info *info)
 556{
 557        info->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
 558        info->count = 1;
 559        info->value.integer.min = 0;
 560        info->value.integer.max = 15;
 561        return 0;
 562}
 563
 564static int snd_bt87x_capture_volume_get(struct snd_kcontrol *kcontrol,
 565                                        struct snd_ctl_elem_value *value)
 566{
 567        struct snd_bt87x *chip = snd_kcontrol_chip(kcontrol);
 568
 569        value->value.integer.value[0] = (chip->reg_control & CTL_A_GAIN_MASK) >> CTL_A_GAIN_SHIFT;
 570        return 0;
 571}
 572
 573static int snd_bt87x_capture_volume_put(struct snd_kcontrol *kcontrol,
 574                                        struct snd_ctl_elem_value *value)
 575{
 576        struct snd_bt87x *chip = snd_kcontrol_chip(kcontrol);
 577        u32 old_control;
 578        int changed;
 579
 580        spin_lock_irq(&chip->reg_lock);
 581        old_control = chip->reg_control;
 582        chip->reg_control = (chip->reg_control & ~CTL_A_GAIN_MASK)
 583                | (value->value.integer.value[0] << CTL_A_GAIN_SHIFT);
 584        snd_bt87x_writel(chip, REG_GPIO_DMA_CTL, chip->reg_control);
 585        changed = old_control != chip->reg_control;
 586        spin_unlock_irq(&chip->reg_lock);
 587        return changed;
 588}
 589
 590static struct snd_kcontrol_new snd_bt87x_capture_volume = {
 591        .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 592        .name = "Capture Volume",
 593        .info = snd_bt87x_capture_volume_info,
 594        .get = snd_bt87x_capture_volume_get,
 595        .put = snd_bt87x_capture_volume_put,
 596};
 597
 598#define snd_bt87x_capture_boost_info    snd_ctl_boolean_mono_info
 599
 600static int snd_bt87x_capture_boost_get(struct snd_kcontrol *kcontrol,
 601                                       struct snd_ctl_elem_value *value)
 602{
 603        struct snd_bt87x *chip = snd_kcontrol_chip(kcontrol);
 604
 605        value->value.integer.value[0] = !! (chip->reg_control & CTL_A_G2X);
 606        return 0;
 607}
 608
 609static int snd_bt87x_capture_boost_put(struct snd_kcontrol *kcontrol,
 610                                       struct snd_ctl_elem_value *value)
 611{
 612        struct snd_bt87x *chip = snd_kcontrol_chip(kcontrol);
 613        u32 old_control;
 614        int changed;
 615
 616        spin_lock_irq(&chip->reg_lock);
 617        old_control = chip->reg_control;
 618        chip->reg_control = (chip->reg_control & ~CTL_A_G2X)
 619                | (value->value.integer.value[0] ? CTL_A_G2X : 0);
 620        snd_bt87x_writel(chip, REG_GPIO_DMA_CTL, chip->reg_control);
 621        changed = chip->reg_control != old_control;
 622        spin_unlock_irq(&chip->reg_lock);
 623        return changed;
 624}
 625
 626static struct snd_kcontrol_new snd_bt87x_capture_boost = {
 627        .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 628        .name = "Capture Boost",
 629        .info = snd_bt87x_capture_boost_info,
 630        .get = snd_bt87x_capture_boost_get,
 631        .put = snd_bt87x_capture_boost_put,
 632};
 633
 634static int snd_bt87x_capture_source_info(struct snd_kcontrol *kcontrol,
 635                                         struct snd_ctl_elem_info *info)
 636{
 637        static char *texts[3] = {"TV Tuner", "FM", "Mic/Line"};
 638
 639        info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
 640        info->count = 1;
 641        info->value.enumerated.items = 3;
 642        if (info->value.enumerated.item > 2)
 643                info->value.enumerated.item = 2;
 644        strcpy(info->value.enumerated.name, texts[info->value.enumerated.item]);
 645        return 0;
 646}
 647
 648static int snd_bt87x_capture_source_get(struct snd_kcontrol *kcontrol,
 649                                        struct snd_ctl_elem_value *value)
 650{
 651        struct snd_bt87x *chip = snd_kcontrol_chip(kcontrol);
 652
 653        value->value.enumerated.item[0] = (chip->reg_control & CTL_A_SEL_MASK) >> CTL_A_SEL_SHIFT;
 654        return 0;
 655}
 656
 657static int snd_bt87x_capture_source_put(struct snd_kcontrol *kcontrol,
 658                                        struct snd_ctl_elem_value *value)
 659{
 660        struct snd_bt87x *chip = snd_kcontrol_chip(kcontrol);
 661        u32 old_control;
 662        int changed;
 663
 664        spin_lock_irq(&chip->reg_lock);
 665        old_control = chip->reg_control;
 666        chip->reg_control = (chip->reg_control & ~CTL_A_SEL_MASK)
 667                | (value->value.enumerated.item[0] << CTL_A_SEL_SHIFT);
 668        snd_bt87x_writel(chip, REG_GPIO_DMA_CTL, chip->reg_control);
 669        changed = chip->reg_control != old_control;
 670        spin_unlock_irq(&chip->reg_lock);
 671        return changed;
 672}
 673
 674static struct snd_kcontrol_new snd_bt87x_capture_source = {
 675        .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 676        .name = "Capture Source",
 677        .info = snd_bt87x_capture_source_info,
 678        .get = snd_bt87x_capture_source_get,
 679        .put = snd_bt87x_capture_source_put,
 680};
 681
 682static int snd_bt87x_free(struct snd_bt87x *chip)
 683{
 684        if (chip->mmio)
 685                snd_bt87x_stop(chip);
 686        if (chip->irq >= 0)
 687                free_irq(chip->irq, chip);
 688        if (chip->mmio)
 689                iounmap(chip->mmio);
 690        pci_release_regions(chip->pci);
 691        pci_disable_device(chip->pci);
 692        kfree(chip);
 693        return 0;
 694}
 695
 696static int snd_bt87x_dev_free(struct snd_device *device)
 697{
 698        struct snd_bt87x *chip = device->device_data;
 699        return snd_bt87x_free(chip);
 700}
 701
 702static int __devinit snd_bt87x_pcm(struct snd_bt87x *chip, int device, char *name)
 703{
 704        int err;
 705        struct snd_pcm *pcm;
 706
 707        err = snd_pcm_new(chip->card, name, device, 0, 1, &pcm);
 708        if (err < 0)
 709                return err;
 710        pcm->private_data = chip;
 711        strcpy(pcm->name, name);
 712        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_bt87x_pcm_ops);
 713        return snd_pcm_lib_preallocate_pages_for_all(pcm,
 714                                                     SNDRV_DMA_TYPE_DEV_SG,
 715                                                     snd_dma_pci_data(chip->pci),
 716                                                        128 * 1024,
 717                                                        ALIGN(255 * 4092, 1024));
 718}
 719
 720static int __devinit snd_bt87x_create(struct snd_card *card,
 721                                      struct pci_dev *pci,
 722                                      struct snd_bt87x **rchip)
 723{
 724        struct snd_bt87x *chip;
 725        int err;
 726        static struct snd_device_ops ops = {
 727                .dev_free = snd_bt87x_dev_free
 728        };
 729
 730        *rchip = NULL;
 731
 732        err = pci_enable_device(pci);
 733        if (err < 0)
 734                return err;
 735
 736        chip = kzalloc(sizeof(*chip), GFP_KERNEL);
 737        if (!chip) {
 738                pci_disable_device(pci);
 739                return -ENOMEM;
 740        }
 741        chip->card = card;
 742        chip->pci = pci;
 743        chip->irq = -1;
 744        spin_lock_init(&chip->reg_lock);
 745
 746        if ((err = pci_request_regions(pci, "Bt87x audio")) < 0) {
 747                kfree(chip);
 748                pci_disable_device(pci);
 749                return err;
 750        }
 751        chip->mmio = ioremap_nocache(pci_resource_start(pci, 0),
 752                                     pci_resource_len(pci, 0));
 753        if (!chip->mmio) {
 754                snd_printk(KERN_ERR "cannot remap io memory\n");
 755                err = -ENOMEM;
 756                goto fail;
 757        }
 758
 759        chip->reg_control = CTL_A_PWRDN | CTL_DA_ES2 |
 760                            CTL_PKTP_16 | (15 << CTL_DA_SDR_SHIFT);
 761        chip->interrupt_mask = MY_INTERRUPTS;
 762        snd_bt87x_writel(chip, REG_GPIO_DMA_CTL, chip->reg_control);
 763        snd_bt87x_writel(chip, REG_INT_MASK, 0);
 764        snd_bt87x_writel(chip, REG_INT_STAT, MY_INTERRUPTS);
 765
 766        err = request_irq(pci->irq, snd_bt87x_interrupt, IRQF_SHARED,
 767                          "Bt87x audio", chip);
 768        if (err < 0) {
 769                snd_printk(KERN_ERR "cannot grab irq %d\n", pci->irq);
 770                goto fail;
 771        }
 772        chip->irq = pci->irq;
 773        pci_set_master(pci);
 774        synchronize_irq(chip->irq);
 775
 776        err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
 777        if (err < 0)
 778                goto fail;
 779
 780        snd_card_set_dev(card, &pci->dev);
 781        *rchip = chip;
 782        return 0;
 783
 784fail:
 785        snd_bt87x_free(chip);
 786        return err;
 787}
 788
 789#define BT_DEVICE(chip, subvend, subdev, id) \
 790        { .vendor = PCI_VENDOR_ID_BROOKTREE, \
 791          .device = chip, \
 792          .subvendor = subvend, .subdevice = subdev, \
 793          .driver_data = SND_BT87X_BOARD_ ## id }
 794/* driver_data is the card id for that device */
 795
 796static struct pci_device_id snd_bt87x_ids[] = {
 797        /* Hauppauge WinTV series */
 798        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x0070, 0x13eb, GENERIC),
 799        /* Hauppauge WinTV series */
 800        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_879, 0x0070, 0x13eb, GENERIC),
 801        /* Viewcast Osprey 200 */
 802        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x0070, 0xff01, OSPREY2x0),
 803        /* Viewcast Osprey 440 (rate is configurable via gpio) */
 804        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x0070, 0xff07, OSPREY440),
 805        /* ATI TV-Wonder */
 806        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x1002, 0x0001, GENERIC),
 807        /* Leadtek Winfast tv 2000xp delux */
 808        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x107d, 0x6606, GENERIC),
 809        /* Voodoo TV 200 */
 810        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x121a, 0x3000, GENERIC),
 811        /* AVerMedia Studio No. 103, 203, ...? */
 812        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x1461, 0x0003, AVPHONE98),
 813        /* Prolink PixelView PV-M4900 */
 814        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x1554, 0x4011, GENERIC),
 815        /* Pinnacle  Studio PCTV rave */
 816        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0xbd11, 0x1200, GENERIC),
 817        { }
 818};
 819MODULE_DEVICE_TABLE(pci, snd_bt87x_ids);
 820
 821/* cards known not to have audio
 822 * (DVB cards use the audio function to transfer MPEG data) */
 823static struct {
 824        unsigned short subvendor, subdevice;
 825} blacklist[] __devinitdata = {
 826        {0x0071, 0x0101}, /* Nebula Electronics DigiTV */
 827        {0x11bd, 0x001c}, /* Pinnacle PCTV Sat */
 828        {0x11bd, 0x0026}, /* Pinnacle PCTV SAT CI */
 829        {0x1461, 0x0761}, /* AVermedia AverTV DVB-T */
 830        {0x1461, 0x0771}, /* AVermedia DVB-T 771 */
 831        {0x1822, 0x0001}, /* Twinhan VisionPlus DVB-T */
 832        {0x18ac, 0xd500}, /* DVICO FusionHDTV 5 Lite */
 833        {0x18ac, 0xdb10}, /* DVICO FusionHDTV DVB-T Lite */
 834        {0x18ac, 0xdb11}, /* Ultraview DVB-T Lite */
 835        {0x270f, 0xfc00}, /* Chaintech Digitop DST-1000 DVB-S */
 836        {0x7063, 0x2000}, /* pcHDTV HD-2000 TV */
 837};
 838
 839static struct pci_driver driver;
 840
 841/* return the id of the card, or a negative value if it's blacklisted */
 842static int __devinit snd_bt87x_detect_card(struct pci_dev *pci)
 843{
 844        int i;
 845        const struct pci_device_id *supported;
 846
 847        supported = pci_match_id(snd_bt87x_ids, pci);
 848        if (supported && supported->driver_data > 0)
 849                return supported->driver_data;
 850
 851        for (i = 0; i < ARRAY_SIZE(blacklist); ++i)
 852                if (blacklist[i].subvendor == pci->subsystem_vendor &&
 853                    blacklist[i].subdevice == pci->subsystem_device) {
 854                        snd_printdd(KERN_INFO "card %#04x-%#04x:%#04x has no audio\n",
 855                                    pci->device, pci->subsystem_vendor, pci->subsystem_device);
 856                        return -EBUSY;
 857                }
 858
 859        snd_printk(KERN_INFO "unknown card %#04x-%#04x:%#04x\n",
 860                   pci->device, pci->subsystem_vendor, pci->subsystem_device);
 861        snd_printk(KERN_DEBUG "please mail id, board name, and, "
 862                   "if it works, the correct digital_rate option to "
 863                   "<alsa-devel@alsa-project.org>\n");
 864        return SND_BT87X_BOARD_UNKNOWN;
 865}
 866
 867static int __devinit snd_bt87x_probe(struct pci_dev *pci,
 868                                     const struct pci_device_id *pci_id)
 869{
 870        static int dev;
 871        struct snd_card *card;
 872        struct snd_bt87x *chip;
 873        int err;
 874        enum snd_bt87x_boardid boardid;
 875
 876        if (!pci_id->driver_data) {
 877                err = snd_bt87x_detect_card(pci);
 878                if (err < 0)
 879                        return -ENODEV;
 880                boardid = err;
 881        } else
 882                boardid = pci_id->driver_data;
 883
 884        if (dev >= SNDRV_CARDS)
 885                return -ENODEV;
 886        if (!enable[dev]) {
 887                ++dev;
 888                return -ENOENT;
 889        }
 890
 891        card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0);
 892        if (!card)
 893                return -ENOMEM;
 894
 895        err = snd_bt87x_create(card, pci, &chip);
 896        if (err < 0)
 897                goto _error;
 898
 899        memcpy(&chip->board, &snd_bt87x_boards[boardid], sizeof(chip->board));
 900
 901        if (!chip->board.no_digital) {
 902                if (digital_rate[dev] > 0)
 903                        chip->board.dig_rate = digital_rate[dev];
 904
 905                chip->reg_control |= chip->board.digital_fmt;
 906
 907                err = snd_bt87x_pcm(chip, DEVICE_DIGITAL, "Bt87x Digital");
 908                if (err < 0)
 909                        goto _error;
 910        }
 911        if (!chip->board.no_analog) {
 912                err = snd_bt87x_pcm(chip, DEVICE_ANALOG, "Bt87x Analog");
 913                if (err < 0)
 914                        goto _error;
 915                err = snd_ctl_add(card, snd_ctl_new1(
 916                                  &snd_bt87x_capture_volume, chip));
 917                if (err < 0)
 918                        goto _error;
 919                err = snd_ctl_add(card, snd_ctl_new1(
 920                                  &snd_bt87x_capture_boost, chip));
 921                if (err < 0)
 922                        goto _error;
 923                err = snd_ctl_add(card, snd_ctl_new1(
 924                                  &snd_bt87x_capture_source, chip));
 925                if (err < 0)
 926                        goto _error;
 927        }
 928        snd_printk(KERN_INFO "bt87x%d: Using board %d, %sanalog, %sdigital "
 929                   "(rate %d Hz)\n", dev, boardid,
 930                   chip->board.no_analog ? "no " : "",
 931                   chip->board.no_digital ? "no " : "", chip->board.dig_rate);
 932
 933        strcpy(card->driver, "Bt87x");
 934        sprintf(card->shortname, "Brooktree Bt%x", pci->device);
 935        sprintf(card->longname, "%s at %#llx, irq %i",
 936                card->shortname, (unsigned long long)pci_resource_start(pci, 0),
 937                chip->irq);
 938        strcpy(card->mixername, "Bt87x");
 939
 940        err = snd_card_register(card);
 941        if (err < 0)
 942                goto _error;
 943
 944        pci_set_drvdata(pci, card);
 945        ++dev;
 946        return 0;
 947
 948_error:
 949        snd_card_free(card);
 950        return err;
 951}
 952
 953static void __devexit snd_bt87x_remove(struct pci_dev *pci)
 954{
 955        snd_card_free(pci_get_drvdata(pci));
 956        pci_set_drvdata(pci, NULL);
 957}
 958
 959/* default entries for all Bt87x cards - it's not exported */
 960/* driver_data is set to 0 to call detection */
 961static struct pci_device_id snd_bt87x_default_ids[] __devinitdata = {
 962        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, PCI_ANY_ID, PCI_ANY_ID, UNKNOWN),
 963        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_879, PCI_ANY_ID, PCI_ANY_ID, UNKNOWN),
 964        { }
 965};
 966
 967static struct pci_driver driver = {
 968        .name = "Bt87x",
 969        .id_table = snd_bt87x_ids,
 970        .probe = snd_bt87x_probe,
 971        .remove = __devexit_p(snd_bt87x_remove),
 972};
 973
 974static int __init alsa_card_bt87x_init(void)
 975{
 976        if (load_all)
 977                driver.id_table = snd_bt87x_default_ids;
 978        return pci_register_driver(&driver);
 979}
 980
 981static void __exit alsa_card_bt87x_exit(void)
 982{
 983        pci_unregister_driver(&driver);
 984}
 985
 986module_init(alsa_card_bt87x_init)
 987module_exit(alsa_card_bt87x_exit)
 988