Ignore:
Timestamp:
Mar 24, 2008, 2:43:42 AM (17 years ago)
Author:
Paul Smedley
Message:

Update source to ALSA 1.0.16 level

File:
1 edited

Legend:

Unmodified
Added
Removed
  • GPL/branches/uniaud-2.0/alsa-kernel/pci/bt87x.c

    r77 r305  
    2222 */
    2323
    24 #include <sound/driver.h>
    2524#include <linux/init.h>
    2625#include <linux/interrupt.h>
    2726#include <linux/pci.h>
    2827#include <linux/slab.h>
    29 //#include <linux/moduleparam.h>
     28#include <linux/moduleparam.h>
    3029#include <linux/bitops.h>
    3130#include <asm/io.h>
     
    4039MODULE_LICENSE("GPL");
    4140MODULE_SUPPORTED_DEVICE("{{Brooktree,Bt878},"
    42                         "{Brooktree,Bt879}}");
    43 
    44 static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;      /* Index 0-MAX */
     41                "{Brooktree,Bt879}}");
     42
     43static int index[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = -2}; /* Exclude the first card */
    4544static char *id[SNDRV_CARDS] = SNDRV_DEFAULT_STR;       /* ID for this card */
    4645static int enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;      /* Enable this card */
    47 static int digital_rate[SNDRV_CARDS] = { 0,0,0,0,0,0,0,0 }; /* digital input rate */
     46static int digital_rate[SNDRV_CARDS];   /* digital input rate */
    4847static int load_all;    /* allow to load the non-whitelisted cards */
    4948
    50 //module_param_array(index, int, NULL, 0444);
     49module_param_array(index, int, NULL, 0444);
    5150MODULE_PARM_DESC(index, "Index value for Bt87x soundcard");
    52 //module_param_array(id, charp, NULL, 0444);
     51module_param_array(id, charp, NULL, 0444);
    5352MODULE_PARM_DESC(id, "ID string for Bt87x soundcard");
    54 //module_param_array(enable, bool, NULL, 0444);
     53module_param_array(enable, bool, NULL, 0444);
    5554MODULE_PARM_DESC(enable, "Enable Bt87x soundcard");
    56 //module_param_array(digital_rate, int, NULL, 0444);
     55module_param_array(digital_rate, int, NULL, 0444);
    5756MODULE_PARM_DESC(digital_rate, "Digital input rate for Bt87x soundcard");
    58 //module_param(load_all, bool, 0444);
     57module_param(load_all, bool, 0444);
    5958MODULE_PARM_DESC(load_all, "Allow to load the non-whitelisted cards");
    6059
    61 
    62 #ifndef PCI_VENDOR_ID_BROOKTREE
    63 #define PCI_VENDOR_ID_BROOKTREE 0x109e
    64 #endif
    65 #ifndef PCI_DEVICE_ID_BROOKTREE_878
    66 #define PCI_DEVICE_ID_BROOKTREE_878 0x0878
    67 #endif
    68 #ifndef PCI_DEVICE_ID_BROOKTREE_879
    69 #define PCI_DEVICE_ID_BROOKTREE_879 0x0879
    70 #endif
    7160
    7261/* register offsets */
     
    152141
    153142#define ERROR_INTERRUPTS (INT_FBUS | INT_FTRGT | INT_PPERR | \
    154     INT_RIPERR | INT_PABORT | INT_OCERR)
     143                          INT_RIPERR | INT_PABORT | INT_OCERR)
    155144#define MY_INTERRUPTS (INT_RISCI | ERROR_INTERRUPTS)
    156145
     
    158147#define MAX_RISC_SIZE ((1 + 255 + (PAGE_ALIGN(255 * 4092) / PAGE_SIZE - 1) + 1 + 1) * 8)
    159148
    160 typedef struct snd_bt87x bt87x_t;
     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
    161191struct snd_bt87x {
    162     snd_card_t *card;
    163     struct pci_dev *pci;
    164 
    165     void *mmio;
    166     int irq;
    167 
    168     int dig_rate;
    169 
    170     spinlock_t reg_lock;
    171     long opened;
    172     snd_pcm_substream_t *substream;
    173 
    174     struct snd_dma_buffer dma_risc;
    175     unsigned int line_bytes;
    176     unsigned int lines;
    177 
    178     u32 reg_control;
    179     u32 interrupt_mask;
    180 
    181     int current_line;
    182 
    183     int pci_parity_errors;
     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;
    184213};
    185214
    186215enum { DEVICE_DIGITAL, DEVICE_ANALOG };
    187216
    188 static inline u32 snd_bt87x_readl(bt87x_t *chip, u32 reg)
    189 {
    190     return readl((char*)chip->mmio + reg);
    191 }
    192 
    193 static inline void snd_bt87x_writel(bt87x_t *chip, u32 reg, u32 value)
    194 {
    195     writel(value, (char*)chip->mmio + reg);
    196 }
    197 
    198 static int snd_bt87x_create_risc(bt87x_t *chip, snd_pcm_substream_t *substream,
    199                                  unsigned int periods, unsigned int period_bytes)
    200 {
    201     struct snd_sg_buf *sgbuf = snd_pcm_substream_sgbuf(substream);
    202     unsigned int i, offset;
    203     u32 *risc;
    204 
    205     if (chip->dma_risc.area == NULL) {
    206         if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(chip->pci),
    207                                 PAGE_ALIGN(MAX_RISC_SIZE), &chip->dma_risc) < 0)
    208             return -ENOMEM;
    209     }
    210     risc = (u32 *)chip->dma_risc.area;
    211     offset = 0;
    212     *risc++ = cpu_to_le32(RISC_SYNC | RISC_SYNC_FM1);
    213     *risc++ = cpu_to_le32(0);
    214     for (i = 0; i < periods; ++i) {
    215         u32 rest;
    216 
    217         rest = period_bytes;
    218         do {
    219             u32 cmd, len;
    220 
    221             len = PAGE_SIZE - (offset % PAGE_SIZE);
    222             if (len > rest)
    223                 len = rest;
    224             cmd = RISC_WRITE | len;
    225             if (rest == period_bytes) {
    226                 u32 block = i * 16 / periods;
    227                 cmd |= RISC_SOL;
    228                 cmd |= block << RISC_SET_STATUS_SHIFT;
    229                 cmd |= (~block & 0xf) << RISC_RESET_STATUS_SHIFT;
    230             }
    231             if (len == rest)
    232                 cmd |= RISC_EOL | RISC_IRQ;
    233             *risc++ = cpu_to_le32(cmd);
    234             *risc++ = cpu_to_le32((u32)snd_pcm_sgbuf_get_addr(sgbuf, offset));
    235             offset += len;
    236             rest -= len;
    237         } while (rest > 0);
    238     }
    239     *risc++ = cpu_to_le32(RISC_SYNC | RISC_SYNC_VRO);
    240     *risc++ = cpu_to_le32(0);
    241     *risc++ = cpu_to_le32(RISC_JUMP);
    242     *risc++ = cpu_to_le32(chip->dma_risc.addr);
    243     chip->line_bytes = period_bytes;
    244     chip->lines = periods;
    245     return 0;
    246 }
    247 
    248 static void snd_bt87x_free_risc(bt87x_t *chip)
    249 {
    250     if (chip->dma_risc.area) {
    251         snd_dma_free_pages(&chip->dma_risc);
    252         chip->dma_risc.area = NULL;
    253     }
    254 }
    255 
    256 static void snd_bt87x_pci_error(bt87x_t *chip, unsigned int status)
    257 {
    258     u16 pci_status;
    259 
    260     pci_read_config_word(chip->pci, PCI_STATUS, &pci_status);
    261     pci_status &= PCI_STATUS_PARITY | PCI_STATUS_SIG_TARGET_ABORT |
    262         PCI_STATUS_REC_TARGET_ABORT | PCI_STATUS_REC_MASTER_ABORT |
    263         PCI_STATUS_SIG_SYSTEM_ERROR | PCI_STATUS_DETECTED_PARITY;
    264     pci_write_config_word(chip->pci, PCI_STATUS, pci_status);
    265     if (pci_status != PCI_STATUS_DETECTED_PARITY)
    266         snd_printk(KERN_ERR "Aieee - PCI error! status %#08x, PCI status %#04x\n",
    267                    status & ERROR_INTERRUPTS, pci_status);
    268     else {
    269         snd_printk(KERN_ERR "Aieee - PCI parity error detected!\n");
    270         /* error 'handling' similar to aic7xxx_pci.c: */
    271         chip->pci_parity_errors++;
    272         if (chip->pci_parity_errors > 20) {
    273             snd_printk(KERN_ERR "Too many PCI parity errors observed.\n");
    274             snd_printk(KERN_ERR "Some device on this bus is generating bad parity.\n");
    275             snd_printk(KERN_ERR "This is an error *observed by*, not *generated by*, this card.\n");
    276             snd_printk(KERN_ERR "PCI parity error checking has been disabled.\n");
    277             chip->interrupt_mask &= ~(INT_PPERR | INT_RIPERR);
    278             snd_bt87x_writel(chip, REG_INT_MASK, chip->interrupt_mask);
    279         }
    280     }
    281 }
    282 
    283 static irqreturn_t snd_bt87x_interrupt(int irq, void *dev_id, struct pt_regs *regs)
    284 {
    285     bt87x_t *chip = dev_id;
    286     unsigned int status, irq_status;
    287 
    288     status = snd_bt87x_readl(chip, REG_INT_STAT);
    289     irq_status = status & chip->interrupt_mask;
    290     if (!irq_status)
    291         return IRQ_NONE;
    292     snd_bt87x_writel(chip, REG_INT_STAT, irq_status);
    293 
    294     if (irq_status & ERROR_INTERRUPTS) {
    295         if (irq_status & (INT_FBUS | INT_FTRGT))
    296             snd_printk(KERN_WARNING "FIFO overrun, status %#08x\n", status);
    297         if (irq_status & INT_OCERR)
    298             snd_printk(KERN_ERR "internal RISC error, status %#08x\n", status);
    299         if (irq_status & (INT_PPERR | INT_RIPERR | INT_PABORT))
    300             snd_bt87x_pci_error(chip, irq_status);
    301     }
    302     if ((irq_status & INT_RISCI) && (chip->reg_control & CTL_ACAP_EN)) {
    303         int current_block, irq_block;
    304 
    305         /* assume that exactly one line has been recorded */
    306         chip->current_line = (chip->current_line + 1) % chip->lines;
    307         /* but check if some interrupts have been skipped */
    308         current_block = chip->current_line * 16 / chip->lines;
    309         irq_block = status >> INT_RISCS_SHIFT;
    310         if (current_block != irq_block)
    311             chip->current_line = (irq_block * chip->lines + 15) / 16;
    312 
    313         snd_pcm_period_elapsed(chip->substream);
    314     }
    315 #ifdef TARGET_OS2
    316     eoi_irq(irq);
    317 #endif //TARGET_OS2
    318 
    319     return IRQ_HANDLED;
    320 }
    321 
    322 static snd_pcm_hardware_t snd_bt87x_digital_hw = {
    323     /*.info = */SNDRV_PCM_INFO_MMAP |
    324         SNDRV_PCM_INFO_INTERLEAVED |
    325         SNDRV_PCM_INFO_BLOCK_TRANSFER |
    326         SNDRV_PCM_INFO_MMAP_VALID,
    327     /*    .formats = */SNDRV_PCM_FMTBIT_S16_LE,
    328     /*    .rates = */0, /* set at runtime */
    329     0,0,
    330     /*    .channels_min = */2,
    331     /*    .channels_max = */2,
    332     /*    .buffer_bytes_max = */255 * 4092,
    333     /*    .period_bytes_min = */32,
    334     /*    .period_bytes_max = */4092,
    335     /*    .periods_min = */2,
    336     /*    .periods_max = */255,
    337     0
    338 };
    339 
    340 static snd_pcm_hardware_t snd_bt87x_analog_hw = {
    341     /*.info = */SNDRV_PCM_INFO_MMAP |
    342         SNDRV_PCM_INFO_INTERLEAVED |
    343         SNDRV_PCM_INFO_BLOCK_TRANSFER |
    344         SNDRV_PCM_INFO_MMAP_VALID,
    345     /*    .formats = */SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S8,
    346     /*    .rates = */SNDRV_PCM_RATE_KNOT,
    347     /*    .rate_min = */ANALOG_CLOCK / CLOCK_DIV_MAX,
    348     /*    .rate_max = */ANALOG_CLOCK / CLOCK_DIV_MIN,
    349     /*    .channels_min = */1,
    350     /*    .channels_max = */1,
    351     /*    .buffer_bytes_max = */255 * 4092,
    352     /*    .period_bytes_min = */32,
    353     /*    .period_bytes_max = */4092,
    354     /*    .periods_min = */2,
    355     /*    .periods_max = */255,
    356     0
    357 };
    358 
    359 static int snd_bt87x_set_digital_hw(bt87x_t *chip, snd_pcm_runtime_t *runtime)
    360 {
    361     static struct {
    362         int rate;
    363         unsigned int bit;
    364     } ratebits[] = {
    365         {8000, SNDRV_PCM_RATE_8000},
    366         {11025, SNDRV_PCM_RATE_11025},
    367         {16000, SNDRV_PCM_RATE_16000},
    368         {22050, SNDRV_PCM_RATE_22050},
    369         {32000, SNDRV_PCM_RATE_32000},
    370         {44100, SNDRV_PCM_RATE_44100},
    371         {48000, SNDRV_PCM_RATE_48000}
    372     };
    373     int i;
    374 
    375     chip->reg_control |= CTL_DA_IOM_DA;
    376     runtime->hw = snd_bt87x_digital_hw;
    377     runtime->hw.rates = SNDRV_PCM_RATE_KNOT;
    378     for (i = 0; i < ARRAY_SIZE(ratebits); ++i)
    379         if (chip->dig_rate == ratebits[i].rate) {
    380             runtime->hw.rates = ratebits[i].bit;
    381             break;
    382         }
    383     runtime->hw.rate_min = chip->dig_rate;
    384     runtime->hw.rate_max = chip->dig_rate;
    385     return 0;
    386 }
    387 
    388 static int snd_bt87x_set_analog_hw(bt87x_t *chip, snd_pcm_runtime_t *runtime)
    389 {
    390     static ratnum_t analog_clock = {
    391         /*.num = */ANALOG_CLOCK,
    392         /*.den_min = */CLOCK_DIV_MIN,
    393         /*.den_max = */CLOCK_DIV_MAX,
    394         /*.den_step = */1
    395     };
    396     static snd_pcm_hw_constraint_ratnums_t constraint_rates = {
    397         /*.nrats = */1,
    398         /*.rats = */&analog_clock
    399     };
    400 
    401     chip->reg_control &= ~CTL_DA_IOM_DA;
    402     runtime->hw = snd_bt87x_analog_hw;
    403     return snd_pcm_hw_constraint_ratnums(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
    404                                          &constraint_rates);
    405 }
    406 
    407 static int snd_bt87x_pcm_open(snd_pcm_substream_t *substream)
    408 {
    409     bt87x_t *chip = snd_pcm_substream_chip(substream);
    410     snd_pcm_runtime_t *runtime = substream->runtime;
    411     int err;
    412 
    413     if (test_and_set_bit(0, &chip->opened))
    414         return -EBUSY;
    415 
    416     if (substream->pcm->device == DEVICE_DIGITAL)
    417         err = snd_bt87x_set_digital_hw(chip, runtime);
    418     else
    419         err = snd_bt87x_set_analog_hw(chip, runtime);
    420     if (err < 0)
    421         goto _error;
    422 
    423     err = snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
    424     if (err < 0)
    425         goto _error;
    426 
    427     chip->substream = substream;
    428     return 0;
     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;
    429432
    430433_error:
    431     clear_bit(0, &chip->opened);
    432 #ifndef TARGET_OS2
    433     smp_mb__after_clear_bit();
    434 #endif
    435     return err;
    436 }
    437 
    438 static int snd_bt87x_close(snd_pcm_substream_t *substream)
    439 {
    440     bt87x_t *chip = snd_pcm_substream_chip(substream);
    441 
    442     chip->substream = NULL;
    443     clear_bit(0, &chip->opened);
    444 #ifndef TARGET_OS2
    445     smp_mb__after_clear_bit();
    446 #endif
    447     return 0;
    448 }
    449 
    450 static int snd_bt87x_hw_params(snd_pcm_substream_t *substream,
    451                                snd_pcm_hw_params_t *hw_params)
    452 {
    453     bt87x_t *chip = snd_pcm_substream_chip(substream);
    454     int err;
    455 
    456     err = snd_pcm_lib_malloc_pages(substream,
    457                                    params_buffer_bytes(hw_params));
    458     if (err < 0)
    459         return err;
    460     return snd_bt87x_create_risc(chip, substream,
    461                                  params_periods(hw_params),
    462                                  params_period_bytes(hw_params));
    463 }
    464 
    465 static int snd_bt87x_hw_free(snd_pcm_substream_t *substream)
    466 {
    467     bt87x_t *chip = snd_pcm_substream_chip(substream);
    468 
    469     snd_bt87x_free_risc(chip);
    470     snd_pcm_lib_free_pages(substream);
    471     return 0;
    472 }
    473 
    474 static int snd_bt87x_prepare(snd_pcm_substream_t *substream)
    475 {
    476     bt87x_t *chip = snd_pcm_substream_chip(substream);
    477     snd_pcm_runtime_t *runtime = substream->runtime;
    478     int decimation;
    479 
    480     spin_lock_irq(&chip->reg_lock);
    481     chip->reg_control &= ~(CTL_DA_SDR_MASK | CTL_DA_SBR);
    482     decimation = (ANALOG_CLOCK + runtime->rate / 4) / runtime->rate;
    483     chip->reg_control |= decimation << CTL_DA_SDR_SHIFT;
    484     if (runtime->format == SNDRV_PCM_FORMAT_S8)
    485         chip->reg_control |= CTL_DA_SBR;
    486     snd_bt87x_writel(chip, REG_GPIO_DMA_CTL, chip->reg_control);
    487     spin_unlock_irq(&chip->reg_lock);
    488     return 0;
    489 }
    490 
    491 static int snd_bt87x_start(bt87x_t *chip)
    492 {
    493     spin_lock(&chip->reg_lock);
    494     chip->current_line = 0;
    495     chip->reg_control |= CTL_FIFO_ENABLE | CTL_RISC_ENABLE | CTL_ACAP_EN;
    496     snd_bt87x_writel(chip, REG_RISC_STRT_ADD, chip->dma_risc.addr);
    497     snd_bt87x_writel(chip, REG_PACKET_LEN,
    498                      chip->line_bytes | (chip->lines << 16));
    499     snd_bt87x_writel(chip, REG_INT_MASK, chip->interrupt_mask);
    500     snd_bt87x_writel(chip, REG_GPIO_DMA_CTL, chip->reg_control);
    501     spin_unlock(&chip->reg_lock);
    502     return 0;
    503 }
    504 
    505 static int snd_bt87x_stop(bt87x_t *chip)
    506 {
    507     spin_lock(&chip->reg_lock);
    508     chip->reg_control &= ~(CTL_FIFO_ENABLE | CTL_RISC_ENABLE | CTL_ACAP_EN);
    509     snd_bt87x_writel(chip, REG_GPIO_DMA_CTL, chip->reg_control);
    510     snd_bt87x_writel(chip, REG_INT_MASK, 0);
    511     snd_bt87x_writel(chip, REG_INT_STAT, MY_INTERRUPTS);
    512     spin_unlock(&chip->reg_lock);
    513     return 0;
    514 }
    515 
    516 static int snd_bt87x_trigger(snd_pcm_substream_t *substream, int cmd)
    517 {
    518     bt87x_t *chip = snd_pcm_substream_chip(substream);
    519 
    520     switch (cmd) {
    521     case SNDRV_PCM_TRIGGER_START:
    522         return snd_bt87x_start(chip);
    523     case SNDRV_PCM_TRIGGER_STOP:
    524         return snd_bt87x_stop(chip);
    525     default:
    526         return -EINVAL;
    527     }
    528 }
    529 
    530 static snd_pcm_uframes_t snd_bt87x_pointer(snd_pcm_substream_t *substream)
    531 {
    532     bt87x_t *chip = snd_pcm_substream_chip(substream);
    533     snd_pcm_runtime_t *runtime = substream->runtime;
    534 
    535     return (snd_pcm_uframes_t)bytes_to_frames(runtime, chip->current_line * chip->line_bytes);
    536 }
    537 
    538 static snd_pcm_ops_t snd_bt87x_pcm_ops = {
    539     /*.open = */snd_bt87x_pcm_open,
    540     /*.close = */snd_bt87x_close,
    541     /*.ioctl = */snd_pcm_lib_ioctl,
    542     /*.hw_params = */snd_bt87x_hw_params,
    543     /*.hw_free = */snd_bt87x_hw_free,
    544     /*.prepare = */snd_bt87x_prepare,
    545     /*.trigger = */snd_bt87x_trigger,
    546     /*.pointer = */snd_bt87x_pointer,0,0,
    547     /*.page = */snd_pcm_sgbuf_ops_page,0
    548 };
    549 
    550 static int snd_bt87x_capture_volume_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *info)
    551 {
    552     info->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
    553     info->count = 1;
    554     info->value.integer.min = 0;
    555     info->value.integer.max = 15;
    556     return 0;
    557 }
    558 
    559 static int snd_bt87x_capture_volume_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *value)
    560 {
    561     bt87x_t *chip = snd_kcontrol_chip(kcontrol);
    562 
    563     value->value.integer.value[0] = (chip->reg_control & CTL_A_GAIN_MASK) >> CTL_A_GAIN_SHIFT;
    564     return 0;
    565 }
    566 
    567 static int snd_bt87x_capture_volume_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *value)
    568 {
    569     bt87x_t *chip = snd_kcontrol_chip(kcontrol);
    570     u32 old_control;
    571     int changed;
    572 
    573     spin_lock_irq(&chip->reg_lock);
    574     old_control = chip->reg_control;
    575     chip->reg_control = (chip->reg_control & ~CTL_A_GAIN_MASK)
    576         | (value->value.integer.value[0] << CTL_A_GAIN_SHIFT);
    577     snd_bt87x_writel(chip, REG_GPIO_DMA_CTL, chip->reg_control);
    578     changed = old_control != chip->reg_control;
    579     spin_unlock_irq(&chip->reg_lock);
    580     return changed;
    581 }
    582 
    583 static snd_kcontrol_new_t snd_bt87x_capture_volume = {
    584     /*.iface = */SNDRV_CTL_ELEM_IFACE_MIXER,0,0,
    585     /*.name = */"Capture Volume",0,0,0,
    586     /*.info = */snd_bt87x_capture_volume_info,
    587     /*.get = */snd_bt87x_capture_volume_get,
    588     /*.put = */snd_bt87x_capture_volume_put,0
    589 };
    590 
    591 static int snd_bt87x_capture_boost_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *info)
    592 {
    593     info->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
    594     info->count = 1;
    595     info->value.integer.min = 0;
    596     info->value.integer.max = 1;
    597     return 0;
    598 }
    599 
    600 static int snd_bt87x_capture_boost_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *value)
    601 {
    602     bt87x_t *chip = snd_kcontrol_chip(kcontrol);
    603 
    604     value->value.integer.value[0] = !! (chip->reg_control & CTL_A_G2X);
    605     return 0;
    606 }
    607 
    608 static int snd_bt87x_capture_boost_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *value)
    609 {
    610     bt87x_t *chip = snd_kcontrol_chip(kcontrol);
    611     u32 old_control;
    612     int changed;
    613 
    614     spin_lock_irq(&chip->reg_lock);
    615     old_control = chip->reg_control;
    616     chip->reg_control = (chip->reg_control & ~CTL_A_G2X)
    617         | (value->value.integer.value[0] ? CTL_A_G2X : 0);
    618     snd_bt87x_writel(chip, REG_GPIO_DMA_CTL, chip->reg_control);
    619     changed = chip->reg_control != old_control;
    620     spin_unlock_irq(&chip->reg_lock);
    621     return changed;
    622 }
    623 
    624 static snd_kcontrol_new_t snd_bt87x_capture_boost = {
    625     /*.iface = */SNDRV_CTL_ELEM_IFACE_MIXER,0,0,
    626     /*.name = */"Capture Boost",0,0,0,
    627     /*.info = */snd_bt87x_capture_boost_info,
    628     /*.get = */snd_bt87x_capture_boost_get,
    629     /*.put = */snd_bt87x_capture_boost_put,0
    630 };
    631 
    632 static int snd_bt87x_capture_source_info(snd_kcontrol_t *kcontrol, snd_ctl_elem_info_t *info)
    633 {
    634     static char *texts[3] = {"TV Tuner", "FM", "Mic/Line"};
    635 
    636     info->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
    637     info->count = 1;
    638     info->value.enumerated.items = 3;
    639     if (info->value.enumerated.item > 2)
    640         info->value.enumerated.item = 2;
    641     strcpy(info->value.enumerated.name, texts[info->value.enumerated.item]);
    642     return 0;
    643 }
    644 
    645 static int snd_bt87x_capture_source_get(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *value)
    646 {
    647     bt87x_t *chip = snd_kcontrol_chip(kcontrol);
    648 
    649     value->value.enumerated.item[0] = (chip->reg_control & CTL_A_SEL_MASK) >> CTL_A_SEL_SHIFT;
    650     return 0;
    651 }
    652 
    653 static int snd_bt87x_capture_source_put(snd_kcontrol_t *kcontrol, snd_ctl_elem_value_t *value)
    654 {
    655     bt87x_t *chip = snd_kcontrol_chip(kcontrol);
    656     u32 old_control;
    657     int changed;
    658 
    659     spin_lock_irq(&chip->reg_lock);
    660     old_control = chip->reg_control;
    661     chip->reg_control = (chip->reg_control & ~CTL_A_SEL_MASK)
    662         | (value->value.enumerated.item[0] << CTL_A_SEL_SHIFT);
    663     snd_bt87x_writel(chip, REG_GPIO_DMA_CTL, chip->reg_control);
    664     changed = chip->reg_control != old_control;
    665     spin_unlock_irq(&chip->reg_lock);
    666     return changed;
    667 }
    668 
    669 static snd_kcontrol_new_t snd_bt87x_capture_source = {
    670     /*.iface =*/ SNDRV_CTL_ELEM_IFACE_MIXER,0,0,
    671     /*.name = */"Capture Source",0,0,0,
    672     /*.info = */snd_bt87x_capture_source_info,
    673     /*.get = */snd_bt87x_capture_source_get,
    674     /*.put = */snd_bt87x_capture_source_put,0
    675 };
    676 
    677 static int snd_bt87x_free(bt87x_t *chip)
    678 {
    679     if (chip->mmio) {
    680         snd_bt87x_stop(chip);
    681         if (chip->irq >= 0)
    682             synchronize_irq(chip->irq);
    683 
    684         iounmap(chip->mmio);
    685     }
    686     if (chip->irq >= 0)
    687         free_irq(chip->irq, chip);
    688     pci_release_regions(chip->pci);
    689     pci_disable_device(chip->pci);
    690     kfree(chip);
    691     return 0;
    692 }
    693 
    694 static int snd_bt87x_dev_free(snd_device_t *device)
    695 {
    696     bt87x_t *chip = device->device_data;
    697     return snd_bt87x_free(chip);
    698 }
    699 
    700 static int __devinit snd_bt87x_pcm(bt87x_t *chip, int device, char *name)
    701 {
    702     int err;
    703     snd_pcm_t *pcm;
    704 
    705     err = snd_pcm_new(chip->card, name, device, 0, 1, &pcm);
    706     if (err < 0)
    707         return err;
    708     pcm->private_data = chip;
    709     strcpy(pcm->name, name);
    710     snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_bt87x_pcm_ops);
    711     return snd_pcm_lib_preallocate_pages_for_all(pcm,
    712                                                  SNDRV_DMA_TYPE_DEV_SG,
    713                                                  snd_dma_pci_data(chip->pci),
    714                                                  128 * 1024,
    715                                                  (255 * 4092 + 1023) & ~1023);
    716 }
    717 
    718 static int __devinit snd_bt87x_create(snd_card_t *card,
    719                                       struct pci_dev *pci,
    720                                       bt87x_t **rchip)
    721 {
    722     bt87x_t *chip;
    723     int err;
    724     static snd_device_ops_t ops = {
    725         /*.dev_free = */snd_bt87x_dev_free,0,0,0
    726     };
    727 
    728     *rchip = NULL;
    729 
    730     err = pci_enable_device(pci);
    731     if (err < 0)
    732         return err;
    733 
    734     chip = kcalloc(1, sizeof(*chip), GFP_KERNEL);
    735     if (!chip) {
    736         pci_disable_device(pci);
    737         return -ENOMEM;
    738     }
    739     chip->card = card;
    740     chip->pci = pci;
    741     chip->irq = -1;
    742     spin_lock_init(&chip->reg_lock);
    743 
    744     if ((err = pci_request_regions(pci, "Bt87x audio")) < 0) {
    745         kfree(chip);
    746         pci_disable_device(pci);
    747         return err;
    748     }
    749     chip->mmio = ioremap_nocache(pci_resource_start(pci, 0),
    750                                  pci_resource_len(pci, 0));
    751     if (!chip->mmio) {
    752         snd_bt87x_free(chip);
    753         snd_printk(KERN_ERR "cannot remap io memory\n");
    754         return -ENOMEM;
    755     }
    756 
    757     chip->reg_control = CTL_DA_ES2 | CTL_PKTP_16 | (15 << CTL_DA_SDR_SHIFT);
    758     chip->interrupt_mask = MY_INTERRUPTS;
    759     snd_bt87x_writel(chip, REG_GPIO_DMA_CTL, chip->reg_control);
    760     snd_bt87x_writel(chip, REG_INT_MASK, 0);
    761     snd_bt87x_writel(chip, REG_INT_STAT, MY_INTERRUPTS);
    762 
    763     if (request_irq(pci->irq, snd_bt87x_interrupt, SA_INTERRUPT | SA_SHIRQ,
    764                     "Bt87x audio", chip)) {
    765         snd_bt87x_free(chip);
    766         snd_printk(KERN_ERR "cannot grab irq\n");
    767         return -EBUSY;
    768     }
    769     chip->irq = pci->irq;
    770     pci_set_master(pci);
    771     synchronize_irq(chip->irq);
    772 
    773     err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
    774     if (err < 0) {
    775         snd_bt87x_free(chip);
    776         return err;
    777     }
    778     snd_card_set_dev(card, &pci->dev);
    779     *rchip = chip;
    780     return 0;
    781 }
    782 
    783 #define BT_DEVICE(chip, subvend, subdev, rate) \
    784     { PCI_VENDOR_ID_BROOKTREE, \
    785       PCI_DEVICE_ID_BROOKTREE_##chip, \
    786       subvend, subdev, 0,0,\
    787       rate }
    788 
    789 /* driver_data is the default digital_rate value for that device */
     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                        synchronize_irq(chip->irq);
     688
     689                iounmap(chip->mmio);
     690        }
     691        if (chip->irq >= 0)
     692                free_irq(chip->irq, chip);
     693        pci_release_regions(chip->pci);
     694        pci_disable_device(chip->pci);
     695        kfree(chip);
     696        return 0;
     697}
     698
     699static int snd_bt87x_dev_free(struct snd_device *device)
     700{
     701        struct snd_bt87x *chip = device->device_data;
     702        return snd_bt87x_free(chip);
     703}
     704
     705static int __devinit snd_bt87x_pcm(struct snd_bt87x *chip, int device, char *name)
     706{
     707        int err;
     708        struct snd_pcm *pcm;
     709
     710        err = snd_pcm_new(chip->card, name, device, 0, 1, &pcm);
     711        if (err < 0)
     712                return err;
     713        pcm->private_data = chip;
     714        strcpy(pcm->name, name);
     715        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_bt87x_pcm_ops);
     716        return snd_pcm_lib_preallocate_pages_for_all(pcm,
     717                                                     SNDRV_DMA_TYPE_DEV_SG,
     718                                                     snd_dma_pci_data(chip->pci),
     719                                                        128 * 1024,
     720                                                        ALIGN(255 * 4092, 1024));
     721}
     722
     723static int __devinit snd_bt87x_create(struct snd_card *card,
     724                                      struct pci_dev *pci,
     725                                      struct snd_bt87x **rchip)
     726{
     727        struct snd_bt87x *chip;
     728        int err;
     729        static struct snd_device_ops ops = {
     730                .dev_free = snd_bt87x_dev_free
     731        };
     732
     733        *rchip = NULL;
     734
     735        err = pci_enable_device(pci);
     736        if (err < 0)
     737                return err;
     738
     739        chip = kzalloc(sizeof(*chip), GFP_KERNEL);
     740        if (!chip) {
     741                pci_disable_device(pci);
     742                return -ENOMEM;
     743        }
     744        chip->card = card;
     745        chip->pci = pci;
     746        chip->irq = -1;
     747        spin_lock_init(&chip->reg_lock);
     748
     749        if ((err = pci_request_regions(pci, "Bt87x audio")) < 0) {
     750                kfree(chip);
     751                pci_disable_device(pci);
     752                return err;
     753        }
     754        chip->mmio = ioremap_nocache(pci_resource_start(pci, 0),
     755                                     pci_resource_len(pci, 0));
     756        if (!chip->mmio) {
     757                snd_printk(KERN_ERR "cannot remap io memory\n");
     758                err = -ENOMEM;
     759                goto fail;
     760        }
     761
     762        chip->reg_control = CTL_A_PWRDN | CTL_DA_ES2 |
     763                            CTL_PKTP_16 | (15 << CTL_DA_SDR_SHIFT);
     764        chip->interrupt_mask = MY_INTERRUPTS;
     765        snd_bt87x_writel(chip, REG_GPIO_DMA_CTL, chip->reg_control);
     766        snd_bt87x_writel(chip, REG_INT_MASK, 0);
     767        snd_bt87x_writel(chip, REG_INT_STAT, MY_INTERRUPTS);
     768
     769        err = request_irq(pci->irq, snd_bt87x_interrupt, IRQF_SHARED,
     770                          "Bt87x audio", chip);
     771        if (err < 0) {
     772                snd_printk(KERN_ERR "cannot grab irq %d\n", pci->irq);
     773                goto fail;
     774        }
     775        chip->irq = pci->irq;
     776        pci_set_master(pci);
     777        synchronize_irq(chip->irq);
     778
     779        err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops);
     780        if (err < 0)
     781                goto fail;
     782
     783        snd_card_set_dev(card, &pci->dev);
     784        *rchip = chip;
     785        return 0;
     786
     787fail:
     788        snd_bt87x_free(chip);
     789        return err;
     790}
     791
     792#define BT_DEVICE(chip, subvend, subdev, id) \
     793        { .vendor = PCI_VENDOR_ID_BROOKTREE, \
     794          .device = chip, \
     795          .subvendor = subvend, .subdevice = subdev, \
     796          .driver_data = SND_BT87X_BOARD_ ## id }
     797/* driver_data is the card id for that device */
     798
    790799static struct pci_device_id snd_bt87x_ids[] = {
    791     BT_DEVICE(878, 0x0070, 0x13eb, 32000), /* Hauppauge WinTV series */
    792     BT_DEVICE(879, 0x0070, 0x13eb, 32000), /* Hauppauge WinTV series */
    793     BT_DEVICE(878, 0x0070, 0xff01, 44100), /* Viewcast Osprey 200 */
    794     /* Leadtek Winfast tv 2000xp delux */
    795     BT_DEVICE(878, 0x107d, 0x6606, 32000),
    796     /* Voodoo TV 200 */
    797     BT_DEVICE(878, 0x121a, 0x3000, 32000),
    798     /* AVerMedia Studio No. 103, 203, ...? */
    799     BT_DEVICE(878, 0x1461, 0x0003, 48000),
    800     {0}
     800        /* Hauppauge WinTV series */
     801        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x0070, 0x13eb, GENERIC),
     802        /* Hauppauge WinTV series */
     803        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_879, 0x0070, 0x13eb, GENERIC),
     804        /* Viewcast Osprey 200 */
     805        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x0070, 0xff01, OSPREY2x0),
     806        /* Viewcast Osprey 440 (rate is configurable via gpio) */
     807        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x0070, 0xff07, OSPREY440),
     808        /* ATI TV-Wonder */
     809        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x1002, 0x0001, GENERIC),
     810        /* Leadtek Winfast tv 2000xp delux */
     811        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x107d, 0x6606, GENERIC),
     812        /* Voodoo TV 200 */
     813        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x121a, 0x3000, GENERIC),
     814        /* AVerMedia Studio No. 103, 203, ...? */
     815        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x1461, 0x0003, AVPHONE98),
     816        /* Prolink PixelView PV-M4900 */
     817        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0x1554, 0x4011, GENERIC),
     818        /* Pinnacle  Studio PCTV rave */
     819        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, 0xbd11, 0x1200, GENERIC),
     820        { }
    801821};
    802822MODULE_DEVICE_TABLE(pci, snd_bt87x_ids);
     
    805825 * (DVB cards use the audio function to transfer MPEG data) */
    806826static struct {
    807     unsigned short subvendor, subdevice;
     827        unsigned short subvendor, subdevice;
    808828} blacklist[] __devinitdata = {
    809     {0x0071, 0x0101}, /* Nebula Electronics DigiTV */
    810     {0x11bd, 0x001c}, /* Pinnacle PCTV Sat */
    811     {0x11bd, 0x0026}, /* Pinnacle PCTV SAT CI */
    812     {0x1461, 0x0761}, /* AVermedia AverTV DVB-T */
    813     {0x1461, 0x0771}, /* AVermedia DVB-T 771 */
    814     {0x1822, 0x0001}, /* Twinhan VisionPlus DVB-T */
    815     {0x18ac, 0xd500}, /* DVICO FusionHDTV 5 Lite */
    816     {0x18ac, 0xdb10}, /* DVICO FusionHDTV DVB-T Lite */
    817     {0x270f, 0xfc00}, /* Chaintech Digitop DST-1000 DVB-S */
    818     {0x7063, 0x2000}, /* pcHDTV HD-2000 TV */
    819 };
    820 
    821 /* return the rate of the card, or a negative value if it's blacklisted */
     829        {0x0071, 0x0101}, /* Nebula Electronics DigiTV */
     830        {0x11bd, 0x001c}, /* Pinnacle PCTV Sat */
     831        {0x11bd, 0x0026}, /* Pinnacle PCTV SAT CI */
     832        {0x1461, 0x0761}, /* AVermedia AverTV DVB-T */
     833        {0x1461, 0x0771}, /* AVermedia DVB-T 771 */
     834        {0x1822, 0x0001}, /* Twinhan VisionPlus DVB-T */
     835        {0x18ac, 0xd500}, /* DVICO FusionHDTV 5 Lite */
     836        {0x18ac, 0xdb10}, /* DVICO FusionHDTV DVB-T Lite */
     837        {0x18ac, 0xdb11}, /* Ultraview DVB-T Lite */
     838        {0x270f, 0xfc00}, /* Chaintech Digitop DST-1000 DVB-S */
     839        {0x7063, 0x2000}, /* pcHDTV HD-2000 TV */
     840};
     841
     842static struct pci_driver driver;
     843
     844/* return the id of the card, or a negative value if it's blacklisted */
    822845static int __devinit snd_bt87x_detect_card(struct pci_dev *pci)
    823846{
    824     int i;
    825     const struct pci_device_id *supported;
    826 
    827     supported = pci_match_device(snd_bt87x_ids, pci);
    828     if (supported && supported->driver_data > 0)
    829         return supported->driver_data;
    830 
    831     for (i = 0; i < ARRAY_SIZE(blacklist); ++i)
    832         if (blacklist[i].subvendor == pci->subsystem_vendor &&
    833             blacklist[i].subdevice == pci->subsystem_device) {
    834             snd_printdd(KERN_INFO "card %#04x-%#04x:%#04x has no audio\n",
    835                         pci->device, pci->subsystem_vendor, pci->subsystem_device);
    836             return -EBUSY;
    837         }
    838 
    839     snd_printk(KERN_INFO "unknown card %#04x-%#04x:%#04x, using default rate 32000\n",
    840                pci->device, pci->subsystem_vendor, pci->subsystem_device);
    841     snd_printk(KERN_DEBUG "please mail id, board name, and, "
    842                "if it works, the correct digital_rate option to "
    843                "<alsa-devel@lists.sf.net>\n");
    844     return 32000; /* default rate */
     847        int i;
     848        const struct pci_device_id *supported;
     849
     850        supported = pci_match_id(snd_bt87x_ids, pci);
     851        if (supported && supported->driver_data > 0)
     852                return supported->driver_data;
     853
     854        for (i = 0; i < ARRAY_SIZE(blacklist); ++i)
     855                if (blacklist[i].subvendor == pci->subsystem_vendor &&
     856                    blacklist[i].subdevice == pci->subsystem_device) {
     857                        snd_printdd(KERN_INFO "card %#04x-%#04x:%#04x has no audio\n",
     858                                    pci->device, pci->subsystem_vendor, pci->subsystem_device);
     859                        return -EBUSY;
     860                }
     861
     862        snd_printk(KERN_INFO "unknown card %#04x-%#04x:%#04x\n",
     863                   pci->device, pci->subsystem_vendor, pci->subsystem_device);
     864        snd_printk(KERN_DEBUG "please mail id, board name, and, "
     865                   "if it works, the correct digital_rate option to "
     866                   "<alsa-devel@alsa-project.org>\n");
     867        return SND_BT87X_BOARD_UNKNOWN;
    845868}
    846869
    847870static int __devinit snd_bt87x_probe(struct pci_dev *pci,
    848                                      const struct pci_device_id *pci_id)
    849 {
    850     static int dev;
    851     snd_card_t *card;
    852     bt87x_t *chip;
    853     int err, rate;
    854 
    855     rate = pci_id->driver_data;
    856     if (! rate)
    857         if ((rate = snd_bt87x_detect_card(pci)) <= 0)
    858             return -ENODEV;
    859 
    860     if (dev >= SNDRV_CARDS)
    861         return -ENODEV;
    862     if (!enable[dev]) {
    863         ++dev;
    864         return -ENOENT;
    865     }
    866 
    867     card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0);
    868     if (!card)
    869         return -ENOMEM;
    870 
    871     err = snd_bt87x_create(card, pci, &chip);
    872     if (err < 0)
    873         goto _error;
    874 
    875     if (digital_rate[dev] > 0)
    876         chip->dig_rate = digital_rate[dev];
    877     else
    878         chip->dig_rate = rate;
    879 
    880     err = snd_bt87x_pcm(chip, DEVICE_DIGITAL, "Bt87x Digital");
    881     if (err < 0)
    882         goto _error;
    883     err = snd_bt87x_pcm(chip, DEVICE_ANALOG, "Bt87x Analog");
    884     if (err < 0)
    885         goto _error;
    886 
    887     err = snd_ctl_add(card, snd_ctl_new1(&snd_bt87x_capture_volume, chip));
    888     if (err < 0)
    889         goto _error;
    890     err = snd_ctl_add(card, snd_ctl_new1(&snd_bt87x_capture_boost, chip));
    891     if (err < 0)
    892         goto _error;
    893     err = snd_ctl_add(card, snd_ctl_new1(&snd_bt87x_capture_source, chip));
    894     if (err < 0)
    895         goto _error;
    896 
    897     strcpy(card->driver, "Bt87x");
    898     sprintf(card->shortname, "Brooktree Bt%x", pci->device);
    899     sprintf(card->longname, "%s at %#lx, irq %i",
    900             card->shortname, pci_resource_start(pci, 0), chip->irq);
    901     strcpy(card->mixername, "Bt87x");
    902 
    903     err = snd_card_register(card);
    904     if (err < 0)
    905         goto _error;
    906 
    907     pci_set_drvdata(pci, card);
    908     ++dev;
    909     return 0;
     871                                     const struct pci_device_id *pci_id)
     872{
     873        static int dev;
     874        struct snd_card *card;
     875        struct snd_bt87x *chip;
     876        int err;
     877        enum snd_bt87x_boardid boardid;
     878
     879        if (!pci_id->driver_data) {
     880                err = snd_bt87x_detect_card(pci);
     881                if (err < 0)
     882                        return -ENODEV;
     883                boardid = err;
     884        } else
     885                boardid = pci_id->driver_data;
     886
     887        if (dev >= SNDRV_CARDS)
     888                return -ENODEV;
     889        if (!enable[dev]) {
     890                ++dev;
     891                return -ENOENT;
     892        }
     893
     894        card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0);
     895        if (!card)
     896                return -ENOMEM;
     897
     898        err = snd_bt87x_create(card, pci, &chip);
     899        if (err < 0)
     900                goto _error;
     901
     902        memcpy(&chip->board, &snd_bt87x_boards[boardid], sizeof(chip->board));
     903
     904        if (!chip->board.no_digital) {
     905                if (digital_rate[dev] > 0)
     906                        chip->board.dig_rate = digital_rate[dev];
     907
     908                chip->reg_control |= chip->board.digital_fmt;
     909
     910                err = snd_bt87x_pcm(chip, DEVICE_DIGITAL, "Bt87x Digital");
     911                if (err < 0)
     912                        goto _error;
     913        }
     914        if (!chip->board.no_analog) {
     915                err = snd_bt87x_pcm(chip, DEVICE_ANALOG, "Bt87x Analog");
     916                if (err < 0)
     917                        goto _error;
     918                err = snd_ctl_add(card, snd_ctl_new1(
     919                                  &snd_bt87x_capture_volume, chip));
     920                if (err < 0)
     921                        goto _error;
     922                err = snd_ctl_add(card, snd_ctl_new1(
     923                                  &snd_bt87x_capture_boost, chip));
     924                if (err < 0)
     925                        goto _error;
     926                err = snd_ctl_add(card, snd_ctl_new1(
     927                                  &snd_bt87x_capture_source, chip));
     928                if (err < 0)
     929                        goto _error;
     930        }
     931        snd_printk(KERN_INFO "bt87x%d: Using board %d, %sanalog, %sdigital "
     932                   "(rate %d Hz)\n", dev, boardid,
     933                   chip->board.no_analog ? "no " : "",
     934                   chip->board.no_digital ? "no " : "", chip->board.dig_rate);
     935
     936        strcpy(card->driver, "Bt87x");
     937        sprintf(card->shortname, "Brooktree Bt%x", pci->device);
     938        sprintf(card->longname, "%s at %#llx, irq %i",
     939                card->shortname, (unsigned long long)pci_resource_start(pci, 0),
     940                chip->irq);
     941        strcpy(card->mixername, "Bt87x");
     942
     943        err = snd_card_register(card);
     944        if (err < 0)
     945                goto _error;
     946
     947        pci_set_drvdata(pci, card);
     948        ++dev;
     949        return 0;
    910950
    911951_error:
    912     snd_card_free(card);
    913     return err;
     952        snd_card_free(card);
     953        return err;
    914954}
    915955
    916956static void __devexit snd_bt87x_remove(struct pci_dev *pci)
    917957{
    918     snd_card_free(pci_get_drvdata(pci));
    919     pci_set_drvdata(pci, NULL);
     958        snd_card_free(pci_get_drvdata(pci));
     959        pci_set_drvdata(pci, NULL);
    920960}
    921961
    922962/* default entries for all Bt87x cards - it's not exported */
    923963/* driver_data is set to 0 to call detection */
    924 static struct pci_device_id snd_bt87x_default_ids[] = {
    925     BT_DEVICE(878, PCI_ANY_ID, PCI_ANY_ID, 0),
    926     BT_DEVICE(879, PCI_ANY_ID, PCI_ANY_ID, 0),
    927     {0}
     964static struct pci_device_id snd_bt87x_default_ids[] __devinitdata = {
     965        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_878, PCI_ANY_ID, PCI_ANY_ID, UNKNOWN),
     966        BT_DEVICE(PCI_DEVICE_ID_BROOKTREE_879, PCI_ANY_ID, PCI_ANY_ID, UNKNOWN),
     967        { }
    928968};
    929969
    930970static struct pci_driver driver = {
    931     0,0,0,
    932     /*.name =*/ "Bt87x",
    933     /*.id_table = */snd_bt87x_ids,
    934     /*.probe = */snd_bt87x_probe,
    935     /*.remove = */snd_bt87x_remove,
    936     0,0
     971        .name = "Bt87x",
     972        .id_table = snd_bt87x_ids,
     973        .probe = snd_bt87x_probe,
     974        .remove = __devexit_p(snd_bt87x_remove),
    937975};
    938976
    939977static int __init alsa_card_bt87x_init(void)
    940978{
    941     if (load_all)
    942         driver.id_table = snd_bt87x_default_ids;
    943     return pci_module_init(&driver);
     979        if (load_all)
     980                driver.id_table = snd_bt87x_default_ids;
     981        return pci_register_driver(&driver);
    944982}
    945983
    946984static void __exit alsa_card_bt87x_exit(void)
    947985{
    948     pci_unregister_driver(&driver);
     986        pci_unregister_driver(&driver);
    949987}
    950988
Note: See TracChangeset for help on using the changeset viewer.