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/module.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 bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;     /* Enable this card */
  46static int digital_rate[SNDRV_CARDS];   /* digital input rate */
  47static bool 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                SNDRV_PCM_INFO_BATCH,
 354        .formats = SNDRV_PCM_FMTBIT_S16_LE,
 355        .rates = 0, /* set at runtime */
 356        .channels_min = 2,
 357        .channels_max = 2,
 358        .buffer_bytes_max = 255 * 4092,
 359        .period_bytes_min = 32,
 360        .period_bytes_max = 4092,
 361        .periods_min = 2,
 362        .periods_max = 255,
 363};
 364
 365static struct snd_pcm_hardware snd_bt87x_analog_hw = {
 366        .info = SNDRV_PCM_INFO_MMAP |
 367                SNDRV_PCM_INFO_INTERLEAVED |
 368                SNDRV_PCM_INFO_BLOCK_TRANSFER |
 369                SNDRV_PCM_INFO_MMAP_VALID |
 370                SNDRV_PCM_INFO_BATCH,
 371        .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8,
 372        .rates = SNDRV_PCM_RATE_KNOT,
 373        .rate_min = ANALOG_CLOCK / CLOCK_DIV_MAX,
 374        .rate_max = ANALOG_CLOCK / CLOCK_DIV_MIN,
 375        .channels_min = 1,
 376        .channels_max = 1,
 377        .buffer_bytes_max = 255 * 4092,
 378        .period_bytes_min = 32,
 379        .period_bytes_max = 4092,
 380        .periods_min = 2,
 381        .periods_max = 255,
 382};
 383
 384static int snd_bt87x_set_digital_hw(struct snd_bt87x *chip, struct snd_pcm_runtime *runtime)
 385{
 386        chip->reg_control |= CTL_DA_IOM_DA | CTL_A_PWRDN;
 387        runtime->hw = snd_bt87x_digital_hw;
 388        runtime->hw.rates = snd_pcm_rate_to_rate_bit(chip->board.dig_rate);
 389        runtime->hw.rate_min = chip->board.dig_rate;
 390        runtime->hw.rate_max = chip->board.dig_rate;
 391        return 0;
 392}
 393
 394static int snd_bt87x_set_analog_hw(struct snd_bt87x *chip, struct snd_pcm_runtime *runtime)
 395{
 396        static struct snd_ratnum analog_clock = {
 397                .num = ANALOG_CLOCK,
 398                .den_min = CLOCK_DIV_MIN,
 399                .den_max = CLOCK_DIV_MAX,
 400                .den_step = 1
 401        };
 402        static struct snd_pcm_hw_constraint_ratnums constraint_rates = {
 403                .nrats = 1,
 404                .rats = &analog_clock
 405        };
 406
 407        chip->reg_control &= ~(CTL_DA_IOM_DA | CTL_A_PWRDN);
 408        runtime->hw = snd_bt87x_analog_hw;
 409        return snd_pcm_hw_constraint_ratnums(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
 410                                             &constraint_rates);
 411}
 412
 413static int snd_bt87x_pcm_open(struct snd_pcm_substream *substream)
 414{
 415        struct snd_bt87x *chip = snd_pcm_substream_chip(substream);
 416        struct snd_pcm_runtime *runtime = substream->runtime;
 417        int err;
 418
 419        if (test_and_set_bit(0, &chip->opened))
 420                return -EBUSY;
 421
 422        if (substream->pcm->device == DEVICE_DIGITAL)
 423                err = snd_bt87x_set_digital_hw(chip, runtime);
 424        else
 425                err = snd_bt87x_set_analog_hw(chip, runtime);
 426        if (err < 0)
 427                goto _error;
 428
 429        err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
 430        if (err < 0)
 431                goto _error;
 432
 433        chip->substream = substream;
 434        return 0;
 435
 436_error:
 437        clear_bit(0, &chip->opened);
 438        smp_mb__after_clear_bit();
 439        return err;
 440}
 441
 442static int snd_bt87x_close(struct snd_pcm_substream *substream)
 443{
 444        struct snd_bt87x *chip = snd_pcm_substream_chip(substream);
 445
 446        spin_lock_irq(&chip->reg_lock);
 447        chip->reg_control |= CTL_A_PWRDN;
 448        snd_bt87x_writel(chip, REG_GPIO_DMA_CTL, chip->reg_control);
 449        spin_unlock_irq(&chip->reg_lock);
 450
 451        chip->substream = NULL;
 452        clear_bit(0, &chip->opened);
 453        smp_mb__after_clear_bit();
 454        return 0;
 455}
 456
 457static int snd_bt87x_hw_params(struct snd_pcm_substream *substream,
 458                               struct snd_pcm_hw_params *hw_params)
 459{
 460        struct snd_bt87x *chip = snd_pcm_substream_chip(substream);
 461        int err;
 462
 463        err = snd_pcm_lib_malloc_pages(substream,
 464                                       params_buffer_bytes(hw_params));
 465        if (err < 0)
 466                return err;
 467        return snd_bt87x_create_risc(chip, substream,
 468                                     params_periods(hw_params),
 469                                     params_period_bytes(hw_params));
 470}
 471
 472static int snd_bt87x_hw_free(struct snd_pcm_substream *substream)
 473{
 474        struct snd_bt87x *chip = snd_pcm_substream_chip(substream);
 475
 476        snd_bt87x_free_risc(chip);
 477        snd_pcm_lib_free_pages(substream);
 478        return 0;
 479}
 480
 481static int snd_bt87x_prepare(struct snd_pcm_substream *substream)
 482{
 483        struct snd_bt87x *chip = snd_pcm_substream_chip(substream);
 484        struct snd_pcm_runtime *runtime = substream->runtime;
 485        int decimation;
 486
 487        spin_lock_irq(&chip->reg_lock);
 488        chip->reg_control &= ~(CTL_DA_SDR_MASK | CTL_DA_SBR);
 489        decimation = (ANALOG_CLOCK + runtime->rate / 4) / runtime->rate;
 490        chip->reg_control |= decimation << CTL_DA_SDR_SHIFT;
 491        if (runtime->format == SNDRV_PCM_FORMAT_S8)
 492                chip->reg_control |= CTL_DA_SBR;
 493        snd_bt87x_writel(chip, REG_GPIO_DMA_CTL, chip->reg_control);
 494        spin_unlock_irq(&chip->reg_lock);
 495        return 0;
 496}
 497
 498static int snd_bt87x_start(struct snd_bt87x *chip)
 499{
 500        spin_lock(&chip->reg_lock);
 501        chip->current_line = 0;
 502        chip->reg_control |= CTL_FIFO_ENABLE | CTL_RISC_ENABLE | CTL_ACAP_EN;
 503        snd_bt87x_writel(chip, REG_RISC_STRT_ADD, chip->dma_risc.addr);
 504        snd_bt87x_writel(chip, REG_PACKET_LEN,
 505                         chip->line_bytes | (chip->lines << 16));
 506        snd_bt87x_writel(chip, REG_INT_MASK, chip->interrupt_mask);
 507        snd_bt87x_writel(chip, REG_GPIO_DMA_CTL, chip->reg_control);
 508        spin_unlock(&chip->reg_lock);
 509        return 0;
 510}
 511
 512static int snd_bt87x_stop(struct snd_bt87x *chip)
 513{
 514        spin_lock(&chip->reg_lock);
 515        chip->reg_control &= ~(CTL_FIFO_ENABLE | CTL_RISC_ENABLE | CTL_ACAP_EN);
 516        snd_bt87x_writel(chip, REG_GPIO_DMA_CTL, chip->reg_control);
 517        snd_bt87x_writel(chip, REG_INT_MASK, 0);
 518        snd_bt87x_writel(chip, REG_INT_STAT, MY_INTERRUPTS);
 519        spin_unlock(&chip->reg_lock);
 520        return 0;
 521}
 522
 523static int snd_bt87x_trigger(struct snd_pcm_substream *substream, int cmd)
 524{
 525        struct snd_bt87x *chip = snd_pcm_substream_chip(substream);
 526
 527        switch (cmd) {
 528        case SNDRV_PCM_TRIGGER_START:
 529                return snd_bt87x_start(chip);
 530        case SNDRV_PCM_TRIGGER_STOP:
 531                return snd_bt87x_stop(chip);
 532        default:
 533                return -EINVAL;
 534        }
 535}
 536
 537static snd_pcm_uframes_t snd_bt87x_pointer(struct snd_pcm_substream *substream)
 538{
 539        struct snd_bt87x *chip = snd_pcm_substream_chip(substream);
 540        struct snd_pcm_runtime *runtime = substream->runtime;
 541
 542        return (snd_pcm_uframes_t)bytes_to_frames(runtime, chip->current_line * chip->line_bytes);
 543}
 544
 545static struct snd_pcm_ops snd_bt87x_pcm_ops = {
 546        .open = snd_bt87x_pcm_open,
 547        .close = snd_bt87x_close,
 548        .ioctl = snd_pcm_lib_ioctl,
 549        .hw_params = snd_bt87x_hw_params,
 550        .hw_free = snd_bt87x_hw_free,
 551        .prepare = snd_bt87x_prepare,
 552        .trigger = snd_bt87x_trigger,
 553        .pointer = snd_bt87x_pointer,
 554        .page = snd_pcm_sgbuf_ops_page,
 555};
 556
 557static int snd_bt87x_capture_volume_info(struct snd_kcontrol *kcontrol,
 558                                         struct snd_ctl_elem_info *info)
 559{
 560        info->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
 561        info->count = 1;
 562        info->value.integer.min = 0;
 563        info->value.integer.max = 15;
 564        return 0;
 565}
 566
 567static int snd_bt87x_capture_volume_get(struct snd_kcontrol *kcontrol,
 568                                        struct snd_ctl_elem_value *value)
 569{
 570        struct snd_bt87x *chip = snd_kcontrol_chip(kcontrol);
 571
 572        value->value.integer.value[0] = (chip->reg_control & CTL_A_GAIN_MASK) >> CTL_A_GAIN_SHIFT;
 573        return 0;
 574}
 575
 576static int snd_bt87x_capture_volume_put(struct snd_kcontrol *kcontrol,
 577                                        struct snd_ctl_elem_value *value)
 578{
 579        struct snd_bt87x *chip = snd_kcontrol_chip(kcontrol);
 580        u32 old_control;
 581        int changed;
 582
 583        spin_lock_irq(&chip->reg_lock);
 584        old_control = chip->reg_control;
 585        chip->reg_control = (chip->reg_control & ~CTL_A_GAIN_MASK)
 586                | (value->value.integer.value[0] << CTL_A_GAIN_SHIFT);
 587        snd_bt87x_writel(chip, REG_GPIO_DMA_CTL, chip->reg_control);
 588        changed = old_control != chip->reg_control;
 589        spin_unlock_irq(&chip->reg_lock);
 590        return changed;
 591}
 592
 593static struct snd_kcontrol_new snd_bt87x_capture_volume = {
 594        .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 595        .name = "Capture Volume",
 596        .info = snd_bt87x_capture_volume_info,
 597        .get = snd_bt87x_capture_volume_get,
 598        .put = snd_bt87x_capture_volume_put,
 599};
 600
 601#define snd_bt87x_capture_boost_info    snd_ctl_boolean_mono_info
 602
 603static int snd_bt87x_capture_boost_get(struct snd_kcontrol *kcontrol,
 604                                       struct snd_ctl_elem_value *value)
 605{
 606        struct snd_bt87x *chip = snd_kcontrol_chip(kcontrol);
 607
 608        value->value.integer.value[0] = !! (chip->reg_control & CTL_A_G2X);
 609        return 0;
 610}
 611
 612static int snd_bt87x_capture_boost_put(struct snd_kcontrol *kcontrol,
 613                                       struct snd_ctl_elem_value *value)
 614{
 615        struct snd_bt87x *chip = snd_kcontrol_chip(kcontrol);
 616        u32 old_control;
 617        int changed;
 618
 619        spin_lock_irq(&chip->reg_lock);
 620        old_control = chip->reg_control;
 621        chip->reg_control = (chip->reg_control & ~CTL_A_G2X)
 622                | (value->value.integer.value[0] ? CTL_A_G2X : 0);
 623        snd_bt87x_writel(chip, REG_GPIO_DMA_CTL, chip->reg_control);
 624        changed = chip->reg_control != old_control;
 625        spin_unlock_irq(&chip->reg_lock);
 626        return changed;
 627}
 628
 629static struct snd_kcontrol_new snd_bt87x_capture_boost = {
 630        .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 631        .name = "Capture Boost",
 632        .info = snd_bt87x_capture_boost_info,
 633        .get = snd_bt87x_capture_boost_get,
 634        .put = snd_bt87x_capture_boost_put,
 635};
 636
 637static int snd_bt87x_capture_source_info(struct snd_kcontrol *kcontrol,
 638                                         struct snd_ctl_elem_info *info)
 639{
 640        static const char *const texts[3] = {"TV Tuner", "FM", "Mic/Line"};
 641
 642        return snd_ctl_enum_info(info, 1, 3, texts);
 643}
 644
 645static int snd_bt87x_capture_source_get(struct snd_kcontrol *kcontrol,
 646                                        struct snd_ctl_elem_value *value)
 647{
 648        struct snd_bt87x *chip = snd_kcontrol_chip(kcontrol);
 649
 650        value->value.enumerated.item[0] = (chip->reg_control & CTL_A_SEL_MASK) >> CTL_A_SEL_SHIFT;
 651        return 0;
 652}
 653
 654static int snd_bt87x_capture_source_put(struct snd_kcontrol *kcontrol,
 655                                        struct snd_ctl_elem_value *value)
 656{
 657        struct snd_bt87x *chip = snd_kcontrol_chip(kcontrol);
 658        u32 old_control;
 659        int changed;
 660
 661        spin_lock_irq(&chip->reg_lock);
 662        old_control = chip->reg_control;
 663        chip->reg_control = (chip->reg_control & ~CTL_A_SEL_MASK)
 664                | (value->value.enumerated.item[0] << CTL_A_SEL_SHIFT);
 665        snd_bt87x_writel(chip, REG_GPIO_DMA_CTL, chip->reg_control);
 666        changed = chip->reg_control != old_control;
 667        spin_unlock_irq(&chip->reg_lock);
 668        return changed;
 669}
 670
 671static struct snd_kcontrol_new snd_bt87x_capture_source = {
 672        .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 673        .name = "Capture Source",
 674        .info = snd_bt87x_capture_source_info,
 675        .get = snd_bt87x_capture_source_get,
 676        .put = snd_bt87x_capture_source_put,
 677};
 678
 679static int snd_bt87x_free(struct snd_bt87x *chip)
 680{
 681        if (chip->mmio)
 682                snd_bt87x_stop(chip);
 683        if (chip->irq >= 0)
 684                free_irq(chip->irq, chip);
 685        if (chip->mmio)
 686                iounmap(chip->mmio);
 687        pci_release_regions(chip->pci);
 688        pci_disable_device(chip->pci);
 689        kfree(chip);
 690        return 0;
 691}
 692
 693static int snd_bt87x_dev_free(struct snd_device *device)
 694{
 695        struct snd_bt87x *chip = device->device_data;
 696        return snd_bt87x_free(chip);
 697}
 698
 699static int __devinit snd_bt87x_pcm(struct snd_bt87x *chip, int device, char *name)
 700{
 701        int err;
 702        struct snd_pcm *pcm;
 703
 704        err = snd_pcm_new(chip->card, name, device, 0, 1, &pcm);
 705        if (err < 0)
 706                return err;
 707        pcm->private_data = chip;
 708        strcpy(pcm->name, name);
 709        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_bt87x_pcm_ops);
 710        return snd_pcm_lib_preallocate_pages_for_all(pcm,
 711                                                     SNDRV_DMA_TYPE_DEV_SG,
 712                                                     snd_dma_pci_data(chip->pci),
 713                                                        128 * 1024,
 714                                                        ALIGN(255 * 4092, 1024));
 715}
 716
 717static int __devinit snd_bt87x_create(struct snd_card *card,
 718                                      struct pci_dev *pci,
 719                                      struct snd_bt87x **rchip)
 720{
 721        struct snd_bt87x *chip;
 722        int err;
 723        static struct snd_device_ops ops = {
 724                .dev_free = snd_bt87x_dev_free
 725        };
 726
 727        *rchip = NULL;
 728
 729        err = pci_enable_device(pci);
 730        if (err < 0)
 731                return err;
 732
 733        chip = kzalloc(sizeof(*chip), GFP_KERNEL);
 734        if (!chip) {
 735                pci_disable_device(pci);
 736                return -ENOMEM;
 737        }
 738        chip->card = card;
 739        chip->pci = pci;
 740        chip->irq = -1;
 741        spin_lock_init(&chip->reg_lock);
 742
 743        if ((err = pci_request_regions(pci, "Bt87x audio")) < 0) {
 744                kfree(chip);
 745                pci_disable_device(pci);
 746                return err;
 747        }
 748        chip->mmio = pci_ioremap_bar(pci, 0);
 749        if (!chip->mmio) {
 750                snd_printk(KERN_ERR "cannot remap io memory\n");
 751                err = -ENOMEM;
 752                goto fail;
 753        }
 754
 755        chip->reg_control = CTL_A_PWRDN | CTL_DA_ES2 |
 756                            CTL_PKTP_16 | (15 << CTL_DA_SDR_SHIFT);
 757        chip->interrupt_mask = MY_INTERRUPTS;
 758        snd_bt87x_writel(chip, REG_GPIO_DMA_CTL, chip->reg_control);
 759        snd_bt87x_writel(chip, REG_INT_MASK, 0);
 760        snd_bt87x_writel(chip, REG_INT_STAT, MY_INTERRUPTS);
 761
 762        err = request_irq(pci->irq, snd_bt87x_interrupt, IRQF_SHARED,
 763                          KBUILD_MODNAME, chip);
 764        if (err < 0) {
 765                snd_printk(KERN_ERR "cannot grab irq %d\n", pci->irq);
 766                goto fail;
 767        }
 768        chip->irq = pci->irq;
 769        pci_set_master(pci);
 770        synchronize_irq(chip->irq);
 771
 772        err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
 773        if (err < 0)
 774                goto fail;
 775
 776        snd_card_set_dev(card, &pci->dev);
 777        *rchip = chip;
 778        return 0;
 779
 780fail:
 781        snd_bt87x_free(chip);
 782        return err;
 783}
 784
 785#define BT_DEVICE(chip, subvend, subdev, id) \
 786        { .vendor = PCI_VENDOR_ID_BROOKTREE, \
 787          .device = chip, \
 788          .subvendor = subvend, .subdevice = subdev, \
 789          .driver_data = SND_BT87X_BOARD_ ## id }
 790/* driver_data is the card id for that device */
 791
 792static DEFINE_PCI_DEVICE_TABLE(snd_bt87x_ids) = {
 793        /* Hauppauge WinTV series */
 794        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x0070, 0x13eb, GENERIC),
 795        /* Hauppauge WinTV series */
 796        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_879, 0x0070, 0x13eb, GENERIC),
 797        /* Viewcast Osprey 200 */
 798        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x0070, 0xff01, OSPREY2x0),
 799        /* Viewcast Osprey 440 (rate is configurable via gpio) */
 800        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x0070, 0xff07, OSPREY440),
 801        /* ATI TV-Wonder */
 802        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x1002, 0x0001, GENERIC),
 803        /* Leadtek Winfast tv 2000xp delux */
 804        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x107d, 0x6606, GENERIC),
 805        /* Pinnacle PCTV */
 806        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x11bd, 0x0012, GENERIC),
 807        /* Voodoo TV 200 */
 808        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x121a, 0x3000, GENERIC),
 809        /* Askey Computer Corp. MagicTView'99 */
 810        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x144f, 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
 839/* return the id of the card, or a negative value if it's blacklisted */
 840static int __devinit snd_bt87x_detect_card(struct pci_dev *pci)
 841{
 842        int i;
 843        const struct pci_device_id *supported;
 844
 845        supported = pci_match_id(snd_bt87x_ids, pci);
 846        if (supported && supported->driver_data > 0)
 847                return supported->driver_data;
 848
 849        for (i = 0; i < ARRAY_SIZE(blacklist); ++i)
 850                if (blacklist[i].subvendor == pci->subsystem_vendor &&
 851                    blacklist[i].subdevice == pci->subsystem_device) {
 852                        snd_printdd(KERN_INFO "card %#04x-%#04x:%#04x has no audio\n",
 853                                    pci->device, pci->subsystem_vendor, pci->subsystem_device);
 854                        return -EBUSY;
 855                }
 856
 857        snd_printk(KERN_INFO "unknown card %#04x-%#04x:%#04x\n",
 858                   pci->device, pci->subsystem_vendor, pci->subsystem_device);
 859        snd_printk(KERN_DEBUG "please mail id, board name, and, "
 860                   "if it works, the correct digital_rate option to "
 861                   "<alsa-devel@alsa-project.org>\n");
 862        return SND_BT87X_BOARD_UNKNOWN;
 863}
 864
 865static int __devinit snd_bt87x_probe(struct pci_dev *pci,
 866                                     const struct pci_device_id *pci_id)
 867{
 868        static int dev;
 869        struct snd_card *card;
 870        struct snd_bt87x *chip;
 871        int err;
 872        enum snd_bt87x_boardid boardid;
 873
 874        if (!pci_id->driver_data) {
 875                err = snd_bt87x_detect_card(pci);
 876                if (err < 0)
 877                        return -ENODEV;
 878                boardid = err;
 879        } else
 880                boardid = pci_id->driver_data;
 881
 882        if (dev >= SNDRV_CARDS)
 883                return -ENODEV;
 884        if (!enable[dev]) {
 885                ++dev;
 886                return -ENOENT;
 887        }
 888
 889        err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card);
 890        if (err < 0)
 891                return err;
 892
 893        err = snd_bt87x_create(card, pci, &chip);
 894        if (err < 0)
 895                goto _error;
 896
 897        memcpy(&chip->board, &snd_bt87x_boards[boardid], sizeof(chip->board));
 898
 899        if (!chip->board.no_digital) {
 900                if (digital_rate[dev] > 0)
 901                        chip->board.dig_rate = digital_rate[dev];
 902
 903                chip->reg_control |= chip->board.digital_fmt;
 904
 905                err = snd_bt87x_pcm(chip, DEVICE_DIGITAL, "Bt87x Digital");
 906                if (err < 0)
 907                        goto _error;
 908        }
 909        if (!chip->board.no_analog) {
 910                err = snd_bt87x_pcm(chip, DEVICE_ANALOG, "Bt87x Analog");
 911                if (err < 0)
 912                        goto _error;
 913                err = snd_ctl_add(card, snd_ctl_new1(
 914                                  &snd_bt87x_capture_volume, chip));
 915                if (err < 0)
 916                        goto _error;
 917                err = snd_ctl_add(card, snd_ctl_new1(
 918                                  &snd_bt87x_capture_boost, chip));
 919                if (err < 0)
 920                        goto _error;
 921                err = snd_ctl_add(card, snd_ctl_new1(
 922                                  &snd_bt87x_capture_source, chip));
 923                if (err < 0)
 924                        goto _error;
 925        }
 926        snd_printk(KERN_INFO "bt87x%d: Using board %d, %sanalog, %sdigital "
 927                   "(rate %d Hz)\n", dev, boardid,
 928                   chip->board.no_analog ? "no " : "",
 929                   chip->board.no_digital ? "no " : "", chip->board.dig_rate);
 930
 931        strcpy(card->driver, "Bt87x");
 932        sprintf(card->shortname, "Brooktree Bt%x", pci->device);
 933        sprintf(card->longname, "%s at %#llx, irq %i",
 934                card->shortname, (unsigned long long)pci_resource_start(pci, 0),
 935                chip->irq);
 936        strcpy(card->mixername, "Bt87x");
 937
 938        err = snd_card_register(card);
 939        if (err < 0)
 940                goto _error;
 941
 942        pci_set_drvdata(pci, card);
 943        ++dev;
 944        return 0;
 945
 946_error:
 947        snd_card_free(card);
 948        return err;
 949}
 950
 951static void __devexit snd_bt87x_remove(struct pci_dev *pci)
 952{
 953        snd_card_free(pci_get_drvdata(pci));
 954        pci_set_drvdata(pci, NULL);
 955}
 956
 957/* default entries for all Bt87x cards - it's not exported */
 958/* driver_data is set to 0 to call detection */
 959static DEFINE_PCI_DEVICE_TABLE(snd_bt87x_default_ids) = {
 960        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, PCI_ANY_ID, PCI_ANY_ID, UNKNOWN),
 961        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_879, PCI_ANY_ID, PCI_ANY_ID, UNKNOWN),
 962        { }
 963};
 964
 965static struct pci_driver bt87x_driver = {
 966        .name = KBUILD_MODNAME,
 967        .id_table = snd_bt87x_ids,
 968        .probe = snd_bt87x_probe,
 969        .remove = __devexit_p(snd_bt87x_remove),
 970};
 971
 972module_pci_driver(bt87x_driver);
 973
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.