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        unsigned int i, offset;
 231        u32 *risc;
 232
 233        if (chip->dma_risc.area == NULL) {
 234                if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(chip->pci),
 235                                        PAGE_ALIGN(MAX_RISC_SIZE), &chip->dma_risc) < 0)
 236                        return -ENOMEM;
 237        }
 238        risc = (u32 *)chip->dma_risc.area;
 239        offset = 0;
 240        *risc++ = cpu_to_le32(RISC_SYNC | RISC_SYNC_FM1);
 241        *risc++ = cpu_to_le32(0);
 242        for (i = 0; i < periods; ++i) {
 243                u32 rest;
 244
 245                rest = period_bytes;
 246                do {
 247                        u32 cmd, len;
 248                        unsigned int addr;
 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                        addr = snd_pcm_sgbuf_get_addr(substream, offset);
 264                        *risc++ = cpu_to_le32(addr);
 265                        offset += len;
 266                        rest -= len;
 267                } while (rest > 0);
 268        }
 269        *risc++ = cpu_to_le32(RISC_SYNC | RISC_SYNC_VRO);
 270        *risc++ = cpu_to_le32(0);
 271        *risc++ = cpu_to_le32(RISC_JUMP);
 272        *risc++ = cpu_to_le32(chip->dma_risc.addr);
 273        chip->line_bytes = period_bytes;
 274        chip->lines = periods;
 275        return 0;
 276}
 277
 278static void snd_bt87x_free_risc(struct snd_bt87x *chip)
 279{
 280        if (chip->dma_risc.area) {
 281                snd_dma_free_pages(&chip->dma_risc);
 282                chip->dma_risc.area = NULL;
 283        }
 284}
 285
 286static void snd_bt87x_pci_error(struct snd_bt87x *chip, unsigned int status)
 287{
 288        u16 pci_status;
 289
 290        pci_read_config_word(chip->pci, PCI_STATUS, &pci_status);
 291        pci_status &= PCI_STATUS_PARITY | PCI_STATUS_SIG_TARGET_ABORT |
 292                PCI_STATUS_REC_TARGET_ABORT | PCI_STATUS_REC_MASTER_ABORT |
 293                PCI_STATUS_SIG_SYSTEM_ERROR | PCI_STATUS_DETECTED_PARITY;
 294        pci_write_config_word(chip->pci, PCI_STATUS, pci_status);
 295        if (pci_status != PCI_STATUS_DETECTED_PARITY)
 296                snd_printk(KERN_ERR "Aieee - PCI error! status %#08x, PCI status %#04x\n",
 297                           status & ERROR_INTERRUPTS, pci_status);
 298        else {
 299                snd_printk(KERN_ERR "Aieee - PCI parity error detected!\n");
 300                /* error 'handling' similar to aic7xxx_pci.c: */
 301                chip->pci_parity_errors++;
 302                if (chip->pci_parity_errors > 20) {
 303                        snd_printk(KERN_ERR "Too many PCI parity errors observed.\n");
 304                        snd_printk(KERN_ERR "Some device on this bus is generating bad parity.\n");
 305                        snd_printk(KERN_ERR "This is an error *observed by*, not *generated by*, this card.\n");
 306                        snd_printk(KERN_ERR "PCI parity error checking has been disabled.\n");
 307                        chip->interrupt_mask &= ~(INT_PPERR | INT_RIPERR);
 308                        snd_bt87x_writel(chip, REG_INT_MASK, chip->interrupt_mask);
 309                }
 310        }
 311}
 312
 313static irqreturn_t snd_bt87x_interrupt(int irq, void *dev_id)
 314{
 315        struct snd_bt87x *chip = dev_id;
 316        unsigned int status, irq_status;
 317
 318        status = snd_bt87x_readl(chip, REG_INT_STAT);
 319        irq_status = status & chip->interrupt_mask;
 320        if (!irq_status)
 321                return IRQ_NONE;
 322        snd_bt87x_writel(chip, REG_INT_STAT, irq_status);
 323
 324        if (irq_status & ERROR_INTERRUPTS) {
 325                if (irq_status & (INT_FBUS | INT_FTRGT))
 326                        snd_printk(KERN_WARNING "FIFO overrun, status %#08x\n", status);
 327                if (irq_status & INT_OCERR)
 328                        snd_printk(KERN_ERR "internal RISC error, status %#08x\n", status);
 329                if (irq_status & (INT_PPERR | INT_RIPERR | INT_PABORT))
 330                        snd_bt87x_pci_error(chip, irq_status);
 331        }
 332        if ((irq_status & INT_RISCI) && (chip->reg_control & CTL_ACAP_EN)) {
 333                int current_block, irq_block;
 334
 335                /* assume that exactly one line has been recorded */
 336                chip->current_line = (chip->current_line + 1) % chip->lines;
 337                /* but check if some interrupts have been skipped */
 338                current_block = chip->current_line * 16 / chip->lines;
 339                irq_block = status >> INT_RISCS_SHIFT;
 340                if (current_block != irq_block)
 341                        chip->current_line = (irq_block * chip->lines + 15) / 16;
 342
 343                snd_pcm_period_elapsed(chip->substream);
 344        }
 345        return IRQ_HANDLED;
 346}
 347
 348static struct snd_pcm_hardware snd_bt87x_digital_hw = {
 349        .info = SNDRV_PCM_INFO_MMAP |
 350                SNDRV_PCM_INFO_INTERLEAVED |
 351                SNDRV_PCM_INFO_BLOCK_TRANSFER |
 352                SNDRV_PCM_INFO_MMAP_VALID,
 353        .formats = SNDRV_PCM_FMTBIT_S16_LE,
 354        .rates = 0, /* set at runtime */
 355        .channels_min = 2,
 356        .channels_max = 2,
 357        .buffer_bytes_max = 255 * 4092,
 358        .period_bytes_min = 32,
 359        .period_bytes_max = 4092,
 360        .periods_min = 2,
 361        .periods_max = 255,
 362};
 363
 364static struct snd_pcm_hardware snd_bt87x_analog_hw = {
 365        .info = SNDRV_PCM_INFO_MMAP |
 366                SNDRV_PCM_INFO_INTERLEAVED |
 367                SNDRV_PCM_INFO_BLOCK_TRANSFER |
 368                SNDRV_PCM_INFO_MMAP_VALID,
 369        .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8,
 370        .rates = SNDRV_PCM_RATE_KNOT,
 371        .rate_min = ANALOG_CLOCK / CLOCK_DIV_MAX,
 372        .rate_max = ANALOG_CLOCK / CLOCK_DIV_MIN,
 373        .channels_min = 1,
 374        .channels_max = 1,
 375        .buffer_bytes_max = 255 * 4092,
 376        .period_bytes_min = 32,
 377        .period_bytes_max = 4092,
 378        .periods_min = 2,
 379        .periods_max = 255,
 380};
 381
 382static int snd_bt87x_set_digital_hw(struct snd_bt87x *chip, struct snd_pcm_runtime *runtime)
 383{
 384        chip->reg_control |= CTL_DA_IOM_DA | CTL_A_PWRDN;
 385        runtime->hw = snd_bt87x_digital_hw;
 386        runtime->hw.rates = snd_pcm_rate_to_rate_bit(chip->board.dig_rate);
 387        runtime->hw.rate_min = chip->board.dig_rate;
 388        runtime->hw.rate_max = chip->board.dig_rate;
 389        return 0;
 390}
 391
 392static int snd_bt87x_set_analog_hw(struct snd_bt87x *chip, struct snd_pcm_runtime *runtime)
 393{
 394        static struct snd_ratnum analog_clock = {
 395                .num = ANALOG_CLOCK,
 396                .den_min = CLOCK_DIV_MIN,
 397                .den_max = CLOCK_DIV_MAX,
 398                .den_step = 1
 399        };
 400        static struct snd_pcm_hw_constraint_ratnums constraint_rates = {
 401                .nrats = 1,
 402                .rats = &analog_clock
 403        };
 404
 405        chip->reg_control &= ~(CTL_DA_IOM_DA | CTL_A_PWRDN);
 406        runtime->hw = snd_bt87x_analog_hw;
 407        return snd_pcm_hw_constraint_ratnums(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
 408                                             &constraint_rates);
 409}
 410
 411static int snd_bt87x_pcm_open(struct snd_pcm_substream *substream)
 412{
 413        struct snd_bt87x *chip = snd_pcm_substream_chip(substream);
 414        struct snd_pcm_runtime *runtime = substream->runtime;
 415        int err;
 416
 417        if (test_and_set_bit(0, &chip->opened))
 418                return -EBUSY;
 419
 420        if (substream->pcm->device == DEVICE_DIGITAL)
 421                err = snd_bt87x_set_digital_hw(chip, runtime);
 422        else
 423                err = snd_bt87x_set_analog_hw(chip, runtime);
 424        if (err < 0)
 425                goto _error;
 426
 427        err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
 428        if (err < 0)
 429                goto _error;
 430
 431        chip->substream = substream;
 432        return 0;
 433
 434_error:
 435        clear_bit(0, &chip->opened);
 436        smp_mb__after_clear_bit();
 437        return err;
 438}
 439
 440static int snd_bt87x_close(struct snd_pcm_substream *substream)
 441{
 442        struct snd_bt87x *chip = snd_pcm_substream_chip(substream);
 443
 444        spin_lock_irq(&chip->reg_lock);
 445        chip->reg_control |= CTL_A_PWRDN;
 446        snd_bt87x_writel(chip, REG_GPIO_DMA_CTL, chip->reg_control);
 447        spin_unlock_irq(&chip->reg_lock);
 448
 449        chip->substream = NULL;
 450        clear_bit(0, &chip->opened);
 451        smp_mb__after_clear_bit();
 452        return 0;
 453}
 454
 455static int snd_bt87x_hw_params(struct snd_pcm_substream *substream,
 456                               struct snd_pcm_hw_params *hw_params)
 457{
 458        struct snd_bt87x *chip = snd_pcm_substream_chip(substream);
 459        int err;
 460
 461        err = snd_pcm_lib_malloc_pages(substream,
 462                                       params_buffer_bytes(hw_params));
 463        if (err < 0)
 464                return err;
 465        return snd_bt87x_create_risc(chip, substream,
 466                                     params_periods(hw_params),
 467                                     params_period_bytes(hw_params));
 468}
 469
 470static int snd_bt87x_hw_free(struct snd_pcm_substream *substream)
 471{
 472        struct snd_bt87x *chip = snd_pcm_substream_chip(substream);
 473
 474        snd_bt87x_free_risc(chip);
 475        snd_pcm_lib_free_pages(substream);
 476        return 0;
 477}
 478
 479static int snd_bt87x_prepare(struct snd_pcm_substream *substream)
 480{
 481        struct snd_bt87x *chip = snd_pcm_substream_chip(substream);
 482        struct snd_pcm_runtime *runtime = substream->runtime;
 483        int decimation;
 484
 485        spin_lock_irq(&chip->reg_lock);
 486        chip->reg_control &= ~(CTL_DA_SDR_MASK | CTL_DA_SBR);
 487        decimation = (ANALOG_CLOCK + runtime->rate / 4) / runtime->rate;
 488        chip->reg_control |= decimation << CTL_DA_SDR_SHIFT;
 489        if (runtime->format == SNDRV_PCM_FORMAT_S8)
 490                chip->reg_control |= CTL_DA_SBR;
 491        snd_bt87x_writel(chip, REG_GPIO_DMA_CTL, chip->reg_control);
 492        spin_unlock_irq(&chip->reg_lock);
 493        return 0;
 494}
 495
 496static int snd_bt87x_start(struct snd_bt87x *chip)
 497{
 498        spin_lock(&chip->reg_lock);
 499        chip->current_line = 0;
 500        chip->reg_control |= CTL_FIFO_ENABLE | CTL_RISC_ENABLE | CTL_ACAP_EN;
 501        snd_bt87x_writel(chip, REG_RISC_STRT_ADD, chip->dma_risc.addr);
 502        snd_bt87x_writel(chip, REG_PACKET_LEN,
 503                         chip->line_bytes | (chip->lines << 16));
 504        snd_bt87x_writel(chip, REG_INT_MASK, chip->interrupt_mask);
 505        snd_bt87x_writel(chip, REG_GPIO_DMA_CTL, chip->reg_control);
 506        spin_unlock(&chip->reg_lock);
 507        return 0;
 508}
 509
 510static int snd_bt87x_stop(struct snd_bt87x *chip)
 511{
 512        spin_lock(&chip->reg_lock);
 513        chip->reg_control &= ~(CTL_FIFO_ENABLE | CTL_RISC_ENABLE | CTL_ACAP_EN);
 514        snd_bt87x_writel(chip, REG_GPIO_DMA_CTL, chip->reg_control);
 515        snd_bt87x_writel(chip, REG_INT_MASK, 0);
 516        snd_bt87x_writel(chip, REG_INT_STAT, MY_INTERRUPTS);
 517        spin_unlock(&chip->reg_lock);
 518        return 0;
 519}
 520
 521static int snd_bt87x_trigger(struct snd_pcm_substream *substream, int cmd)
 522{
 523        struct snd_bt87x *chip = snd_pcm_substream_chip(substream);
 524
 525        switch (cmd) {
 526        case SNDRV_PCM_TRIGGER_START:
 527                return snd_bt87x_start(chip);
 528        case SNDRV_PCM_TRIGGER_STOP:
 529                return snd_bt87x_stop(chip);
 530        default:
 531                return -EINVAL;
 532        }
 533}
 534
 535static snd_pcm_uframes_t snd_bt87x_pointer(struct snd_pcm_substream *substream)
 536{
 537        struct snd_bt87x *chip = snd_pcm_substream_chip(substream);
 538        struct snd_pcm_runtime *runtime = substream->runtime;
 539
 540        return (snd_pcm_uframes_t)bytes_to_frames(runtime, chip->current_line * chip->line_bytes);
 541}
 542
 543static struct snd_pcm_ops snd_bt87x_pcm_ops = {
 544        .open = snd_bt87x_pcm_open,
 545        .close = snd_bt87x_close,
 546        .ioctl = snd_pcm_lib_ioctl,
 547        .hw_params = snd_bt87x_hw_params,
 548        .hw_free = snd_bt87x_hw_free,
 549        .prepare = snd_bt87x_prepare,
 550        .trigger = snd_bt87x_trigger,
 551        .pointer = snd_bt87x_pointer,
 552        .page = snd_pcm_sgbuf_ops_page,
 553};
 554
 555static int snd_bt87x_capture_volume_info(struct snd_kcontrol *kcontrol,
 556                                         struct snd_ctl_elem_info *info)
 557{
 558        info->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
 559        info->count = 1;
 560        info->value.integer.min = 0;
 561        info->value.integer.max = 15;
 562        return 0;
 563}
 564
 565static int snd_bt87x_capture_volume_get(struct snd_kcontrol *kcontrol,
 566                                        struct snd_ctl_elem_value *value)
 567{
 568        struct snd_bt87x *chip = snd_kcontrol_chip(kcontrol);
 569
 570        value->value.integer.value[0] = (chip->reg_control & CTL_A_GAIN_MASK) >> CTL_A_GAIN_SHIFT;
 571        return 0;
 572}
 573
 574static int snd_bt87x_capture_volume_put(struct snd_kcontrol *kcontrol,
 575                                        struct snd_ctl_elem_value *value)
 576{
 577        struct snd_bt87x *chip = snd_kcontrol_chip(kcontrol);
 578        u32 old_control;
 579        int changed;
 580
 581        spin_lock_irq(&chip->reg_lock);
 582        old_control = chip->reg_control;
 583        chip->reg_control = (chip->reg_control & ~CTL_A_GAIN_MASK)
 584                | (value->value.integer.value[0] << CTL_A_GAIN_SHIFT);
 585        snd_bt87x_writel(chip, REG_GPIO_DMA_CTL, chip->reg_control);
 586        changed = old_control != chip->reg_control;
 587        spin_unlock_irq(&chip->reg_lock);
 588        return changed;
 589}
 590
 591static struct snd_kcontrol_new snd_bt87x_capture_volume = {
 592        .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 593        .name = "Capture Volume",
 594        .info = snd_bt87x_capture_volume_info,
 595        .get = snd_bt87x_capture_volume_get,
 596        .put = snd_bt87x_capture_volume_put,
 597};
 598
 599#define snd_bt87x_capture_boost_info    snd_ctl_boolean_mono_info
 600
 601static int snd_bt87x_capture_boost_get(struct snd_kcontrol *kcontrol,
 602                                       struct snd_ctl_elem_value *value)
 603{
 604        struct snd_bt87x *chip = snd_kcontrol_chip(kcontrol);
 605
 606        value->value.integer.value[0] = !! (chip->reg_control & CTL_A_G2X);
 607        return 0;
 608}
 609
 610static int snd_bt87x_capture_boost_put(struct snd_kcontrol *kcontrol,
 611                                       struct snd_ctl_elem_value *value)
 612{
 613        struct snd_bt87x *chip = snd_kcontrol_chip(kcontrol);
 614        u32 old_control;
 615        int changed;
 616
 617        spin_lock_irq(&chip->reg_lock);
 618        old_control = chip->reg_control;
 619        chip->reg_control = (chip->reg_control & ~CTL_A_G2X)
 620                | (value->value.integer.value[0] ? CTL_A_G2X : 0);
 621        snd_bt87x_writel(chip, REG_GPIO_DMA_CTL, chip->reg_control);
 622        changed = chip->reg_control != old_control;
 623        spin_unlock_irq(&chip->reg_lock);
 624        return changed;
 625}
 626
 627static struct snd_kcontrol_new snd_bt87x_capture_boost = {
 628        .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 629        .name = "Capture Boost",
 630        .info = snd_bt87x_capture_boost_info,
 631        .get = snd_bt87x_capture_boost_get,
 632        .put = snd_bt87x_capture_boost_put,
 633};
 634
 635static int snd_bt87x_capture_source_info(struct snd_kcontrol *kcontrol,
 636                                         struct snd_ctl_elem_info *info)
 637{
 638        static char *texts[3] = {"TV Tuner", "FM", "Mic/Line"};
 639
 640        info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
 641        info->count = 1;
 642        info->value.enumerated.items = 3;
 643        if (info->value.enumerated.item > 2)
 644                info->value.enumerated.item = 2;
 645        strcpy(info->value.enumerated.name, texts[info->value.enumerated.item]);
 646        return 0;
 647}
 648
 649static int snd_bt87x_capture_source_get(struct snd_kcontrol *kcontrol,
 650                                        struct snd_ctl_elem_value *value)
 651{
 652        struct snd_bt87x *chip = snd_kcontrol_chip(kcontrol);
 653
 654        value->value.enumerated.item[0] = (chip->reg_control & CTL_A_SEL_MASK) >> CTL_A_SEL_SHIFT;
 655        return 0;
 656}
 657
 658static int snd_bt87x_capture_source_put(struct snd_kcontrol *kcontrol,
 659                                        struct snd_ctl_elem_value *value)
 660{
 661        struct snd_bt87x *chip = snd_kcontrol_chip(kcontrol);
 662        u32 old_control;
 663        int changed;
 664
 665        spin_lock_irq(&chip->reg_lock);
 666        old_control = chip->reg_control;
 667        chip->reg_control = (chip->reg_control & ~CTL_A_SEL_MASK)
 668                | (value->value.enumerated.item[0] << CTL_A_SEL_SHIFT);
 669        snd_bt87x_writel(chip, REG_GPIO_DMA_CTL, chip->reg_control);
 670        changed = chip->reg_control != old_control;
 671        spin_unlock_irq(&chip->reg_lock);
 672        return changed;
 673}
 674
 675static struct snd_kcontrol_new snd_bt87x_capture_source = {
 676        .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 677        .name = "Capture Source",
 678        .info = snd_bt87x_capture_source_info,
 679        .get = snd_bt87x_capture_source_get,
 680        .put = snd_bt87x_capture_source_put,
 681};
 682
 683static int snd_bt87x_free(struct snd_bt87x *chip)
 684{
 685        if (chip->mmio)
 686                snd_bt87x_stop(chip);
 687        if (chip->irq >= 0)
 688                free_irq(chip->irq, chip);
 689        if (chip->mmio)
 690                iounmap(chip->mmio);
 691        pci_release_regions(chip->pci);
 692        pci_disable_device(chip->pci);
 693        kfree(chip);
 694        return 0;
 695}
 696
 697static int snd_bt87x_dev_free(struct snd_device *device)
 698{
 699        struct snd_bt87x *chip = device->device_data;
 700        return snd_bt87x_free(chip);
 701}
 702
 703static int __devinit snd_bt87x_pcm(struct snd_bt87x *chip, int device, char *name)
 704{
 705        int err;
 706        struct snd_pcm *pcm;
 707
 708        err = snd_pcm_new(chip->card, name, device, 0, 1, &pcm);
 709        if (err < 0)
 710                return err;
 711        pcm->private_data = chip;
 712        strcpy(pcm->name, name);
 713        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_bt87x_pcm_ops);
 714        return snd_pcm_lib_preallocate_pages_for_all(pcm,
 715                                                     SNDRV_DMA_TYPE_DEV_SG,
 716                                                     snd_dma_pci_data(chip->pci),
 717                                                        128 * 1024,
 718                                                        ALIGN(255 * 4092, 1024));
 719}
 720
 721static int __devinit snd_bt87x_create(struct snd_card *card,
 722                                      struct pci_dev *pci,
 723                                      struct snd_bt87x **rchip)
 724{
 725        struct snd_bt87x *chip;
 726        int err;
 727        static struct snd_device_ops ops = {
 728                .dev_free = snd_bt87x_dev_free
 729        };
 730
 731        *rchip = NULL;
 732
 733        err = pci_enable_device(pci);
 734        if (err < 0)
 735                return err;
 736
 737        chip = kzalloc(sizeof(*chip), GFP_KERNEL);
 738        if (!chip) {
 739                pci_disable_device(pci);
 740                return -ENOMEM;
 741        }
 742        chip->card = card;
 743        chip->pci = pci;
 744        chip->irq = -1;
 745        spin_lock_init(&chip->reg_lock);
 746
 747        if ((err = pci_request_regions(pci, "Bt87x audio")) < 0) {
 748                kfree(chip);
 749                pci_disable_device(pci);
 750                return err;
 751        }
 752        chip->mmio = pci_ioremap_bar(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