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/cs4281.c

    r135 r305  
    11/*
    22 *  Driver for Cirrus Logic CS4281 based PCI soundcard
    3  *  Copyright (c) by Jaroslav Kysela <perex@suse.cz>,
     3 *  Copyright (c) by Jaroslav Kysela <perex@perex.cz>,
    44 *
    55 *
     
    2020 */
    2121
    22 #include <sound/driver.h>
    2322#include <asm/io.h>
    2423#include <linux/delay.h>
     
    2726#include <linux/pci.h>
    2827#include <linux/slab.h>
     28#include <linux/gameport.h>
     29#include <linux/moduleparam.h>
    2930#include <sound/core.h>
    3031#include <sound/control.h>
     
    3233#include <sound/rawmidi.h>
    3334#include <sound/ac97_codec.h>
     35#include <sound/tlv.h>
    3436#include <sound/opl3.h>
    35 #define SNDRV_GET_ID
    3637#include <sound/initval.h>
    3738
    38 #ifndef LINUX_2_2
    39 #include <linux/gameport.h>
    40 #endif
    41 
    42 MODULE_AUTHOR("Jaroslav Kysela <perex@suse.cz>");
     39
     40MODULE_AUTHOR("Jaroslav Kysela <perex@perex.cz>");
    4341MODULE_DESCRIPTION("Cirrus Logic CS4281");
    4442MODULE_LICENSE("GPL");
    45 MODULE_CLASSES("{sound}");
    46 MODULE_DEVICES("{{Cirrus Logic,CS4281}}");
     43MODULE_SUPPORTED_DEVICE("{{Cirrus Logic,CS4281}}");
    4744
    4845static int index[SNDRV_CARDS] = SNDRV_DEFAULT_IDX;      /* Index 0-MAX */
     
    5148static int dual_codec[SNDRV_CARDS];     /* dual codec */
    5249
    53 MODULE_PARM(index, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
     50module_param_array(index, int, NULL, 0444);
    5451MODULE_PARM_DESC(index, "Index value for CS4281 soundcard.");
    55 MODULE_PARM_SYNTAX(index, SNDRV_INDEX_DESC);
    56 MODULE_PARM(id, "1-" __MODULE_STRING(SNDRV_CARDS) "s");
     52module_param_array(id, charp, NULL, 0444);
    5753MODULE_PARM_DESC(id, "ID string for CS4281 soundcard.");
    58 MODULE_PARM_SYNTAX(id, SNDRV_ID_DESC);
    59 MODULE_PARM(enable, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
     54module_param_array(enable, bool, NULL, 0444);
    6055MODULE_PARM_DESC(enable, "Enable CS4281 soundcard.");
    61 MODULE_PARM_SYNTAX(enable, SNDRV_ENABLE_DESC);
    62 MODULE_PARM(dual_codec, "1-" __MODULE_STRING(SNDRV_CARDS) "i");
     56module_param_array(dual_codec, bool, NULL, 0444);
    6357MODULE_PARM_DESC(dual_codec, "Secondary Codec ID (0 = disabled).");
    64 MODULE_PARM_SYNTAX(dual_codec, SNDRV_ENABLED ",allows:{{0,3}}");
    65 
    66 /*
    67  *
    68  */
    69 
    70 #ifndef PCI_VENDOR_ID_CIRRUS
    71 #define PCI_VENDOR_ID_CIRRUS            0x1013
    72 #endif
    73 #ifndef PCI_DEVICE_ID_CIRRUS_4281
    74 #define PCI_DEVICE_ID_CIRRUS_4281       0x6005
    75 #endif
    7658
    7759/*
     
    10587
    10688#define BA0_HIMR                0x000c  /* Host Interrupt Mask Register */
    107 /* Use same contants as for BA0_HISR */
     89                                        /* Use same contants as for BA0_HISR */
    10890
    10991#define BA0_IIER                0x0010  /* ISA Interrupt Enable Register */
     
    216198
    217199#define BA0_EPPMC               0x03e4  /* Extended PCI Power Management Control */
    218 #define BA0_EPPMC_FPDN          (1<<14) /* Full Power DowN */
     200#define BA0_EPPMC_FPDN          (1<<14) /* Full Power DowN */
    219201
    220202#define BA0_GPIOR               0x03e8  /* GPIO Pin Interface Register */
     
    446428 */
    447429
    448 typedef struct snd_cs4281 cs4281_t;
    449 typedef struct snd_cs4281_dma cs4281_dma_t;
    450 
    451 struct snd_cs4281_dma {
    452     snd_pcm_substream_t *substream;
    453     unsigned int regDBA;                /* offset to DBA register */
    454     unsigned int regDCA;                /* offset to DCA register */
    455     unsigned int regDBC;                /* offset to DBC register */
    456     unsigned int regDCC;                /* offset to DCC register */
    457     unsigned int regDMR;                /* offset to DMR register */
    458     unsigned int regDCR;                /* offset to DCR register */
    459     unsigned int regHDSR;               /* offset to HDSR register */
    460     unsigned int regFCR;                /* offset to FCR register */
    461     unsigned int regFSIC;               /* offset to FSIC register */
    462     unsigned int valDMR;                /* DMA mode */
    463     unsigned int valDCR;                /* DMA command */
    464     unsigned int valFCR;                /* FIFO control */
    465     unsigned int fifo_offset;   /* FIFO offset within BA1 */
    466     unsigned char left_slot;    /* FIFO left slot */
    467     unsigned char right_slot;   /* FIFO right slot */
    468     int frag;                   /* period number */
     430struct cs4281_dma {
     431        struct snd_pcm_substream *substream;
     432        unsigned int regDBA;            /* offset to DBA register */
     433        unsigned int regDCA;            /* offset to DCA register */
     434        unsigned int regDBC;            /* offset to DBC register */
     435        unsigned int regDCC;            /* offset to DCC register */
     436        unsigned int regDMR;            /* offset to DMR register */
     437        unsigned int regDCR;            /* offset to DCR register */
     438        unsigned int regHDSR;           /* offset to HDSR register */
     439        unsigned int regFCR;            /* offset to FCR register */
     440        unsigned int regFSIC;           /* offset to FSIC register */
     441        unsigned int valDMR;            /* DMA mode */
     442        unsigned int valDCR;            /* DMA command */
     443        unsigned int valFCR;            /* FIFO control */
     444        unsigned int fifo_offset;       /* FIFO offset within BA1 */
     445        unsigned char left_slot;        /* FIFO left slot */
     446        unsigned char right_slot;       /* FIFO right slot */
     447        int frag;                       /* period number */
    469448};
    470449
    471450#define SUSPEND_REGISTERS       20
    472451
    473 struct snd_cs4281 {
    474     int irq;
    475 
    476     unsigned long ba0;          /* virtual (accessible) address */
    477     unsigned long ba1;          /* virtual (accessible) address */
    478     unsigned long ba0_addr;
    479     unsigned long ba1_addr;
    480 
    481     int dual_codec;
    482 
    483     ac97_bus_t *ac97_bus;
    484     ac97_t *ac97;
    485     ac97_t *ac97_secondary;
    486 
    487     struct pci_dev *pci;
    488     snd_card_t *card;
    489     snd_pcm_t *pcm;
    490     snd_rawmidi_t *rmidi;
    491     snd_rawmidi_substream_t *midi_input;
    492     snd_rawmidi_substream_t *midi_output;
    493 
    494     cs4281_dma_t dma[4];
    495 
    496     unsigned char src_left_play_slot;
    497     unsigned char src_right_play_slot;
    498     unsigned char src_left_rec_slot;
    499     unsigned char src_right_rec_slot;
    500 
    501     unsigned int spurious_dhtc_irq;
    502     unsigned int spurious_dtc_irq;
    503 
    504     spinlock_t reg_lock;
    505     unsigned int midcr;
    506     unsigned int uartm;
    507 
    508     struct snd_cs4281_gameport *gameport;
     452struct cs4281 {
     453        int irq;
     454
     455        void __iomem *ba0;              /* virtual (accessible) address */
     456        void __iomem *ba1;              /* virtual (accessible) address */
     457        unsigned long ba0_addr;
     458        unsigned long ba1_addr;
     459
     460        int dual_codec;
     461
     462        struct snd_ac97_bus *ac97_bus;
     463        struct snd_ac97 *ac97;
     464        struct snd_ac97 *ac97_secondary;
     465
     466        struct pci_dev *pci;
     467        struct snd_card *card;
     468        struct snd_pcm *pcm;
     469        struct snd_rawmidi *rmidi;
     470        struct snd_rawmidi_substream *midi_input;
     471        struct snd_rawmidi_substream *midi_output;
     472
     473        struct cs4281_dma dma[4];
     474
     475        unsigned char src_left_play_slot;
     476        unsigned char src_right_play_slot;
     477        unsigned char src_left_rec_slot;
     478        unsigned char src_right_rec_slot;
     479
     480        unsigned int spurious_dhtc_irq;
     481        unsigned int spurious_dtc_irq;
     482
     483        spinlock_t reg_lock;
     484        unsigned int midcr;
     485        unsigned int uartm;
     486
     487        struct gameport *gameport;
    509488
    510489#ifdef CONFIG_PM
    511     u32 suspend_regs[SUSPEND_REGISTERS];
     490        u32 suspend_regs[SUSPEND_REGISTERS];
    512491#endif
    513492
    514493};
    515494
    516 static irqreturn_t snd_cs4281_interrupt(int irq, void *dev_id, struct pt_regs *regs);
     495static irqreturn_t snd_cs4281_interrupt(int irq, void *dev_id);
    517496
    518497static struct pci_device_id snd_cs4281_ids[] = {
    519     { 0x1013, 0x6005, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, },       /* CS4281 */
    520     { 0, }
     498        { 0x1013, 0x6005, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0, },   /* CS4281 */
     499        { 0, }
    521500};
    522501
     
    526505 *  constants
    527506 */
     507
    528508#define CS4281_FIFO_SIZE        32
    529509
     
    532512 */
    533513
    534 static void snd_cs4281_delay(unsigned int delay)
    535 {
    536     if (delay > 999) {
    537         unsigned long end_time;
    538         delay = (delay * HZ) / 1000000;
    539         if (delay < 1)
    540             delay = 1;
    541         end_time = jiffies + delay;
    542         do {
    543             set_current_state(TASK_UNINTERRUPTIBLE);
    544             schedule_timeout(1);
    545         } while (time_after_eq(end_time, jiffies));
    546     } else {
    547         udelay(delay);
    548     }
    549 }
    550 
    551 inline static void snd_cs4281_delay_long(void)
    552 {
    553     set_current_state(TASK_UNINTERRUPTIBLE);
    554     schedule_timeout(1);
    555 }
    556 
    557 static inline void snd_cs4281_pokeBA0(cs4281_t *chip, unsigned long offset, unsigned int val)
    558 {
    559     writel(val, chip->ba0 + offset);
    560 }
    561 
    562 static inline unsigned int snd_cs4281_peekBA0(cs4281_t *chip, unsigned long offset)
    563 {
    564     return readl(chip->ba0 + offset);
    565 }
    566 
    567 static void snd_cs4281_ac97_write(ac97_t *ac97,
    568                                   unsigned short reg, unsigned short val)
    569 {
    570     /*
    571      *  1. Write ACCAD = Command Address Register = 46Ch for AC97 register address
    572      *  2. Write ACCDA = Command Data Register = 470h    for data to write to AC97
    573      *  3. Write ACCTL = Control Register = 460h for initiating the write
    574      *  4. Read ACCTL = 460h, DCV should be reset by now and 460h = 07h
    575      *  5. if DCV not cleared, break and return error
    576      */
    577     cs4281_t *chip = ac97->private_data;
    578     int count;
    579 
    580     /*
    581      *  Setup the AC97 control registers on the CS461x to send the
    582      *  appropriate command to the AC97 to perform the read.
    583      *  ACCAD = Command Address Register = 46Ch
    584      *  ACCDA = Command Data Register = 470h
    585      *  ACCTL = Control Register = 460h
    586      *  set DCV - will clear when process completed
    587      *  reset CRW - Write command
    588      *  set VFRM - valid frame enabled
    589      *  set ESYN - ASYNC generation enabled
    590      *  set RSTN - ARST# inactive, AC97 codec not reset
    591      */
    592     snd_cs4281_pokeBA0(chip, BA0_ACCAD, reg);
    593     snd_cs4281_pokeBA0(chip, BA0_ACCDA, val);
    594     snd_cs4281_pokeBA0(chip, BA0_ACCTL, BA0_ACCTL_DCV | BA0_ACCTL_VFRM |
    595                        BA0_ACCTL_ESYN | (ac97->num ? BA0_ACCTL_TC : 0));
    596     for (count = 0; count < 2000; count++) {
    597         /*
    598          *  First, we want to wait for a short time.
     514static inline void snd_cs4281_pokeBA0(struct cs4281 *chip, unsigned long offset,
     515                                      unsigned int val)
     516{
     517        writel(val, chip->ba0 + offset);
     518}
     519
     520static inline unsigned int snd_cs4281_peekBA0(struct cs4281 *chip, unsigned long offset)
     521{
     522        return readl(chip->ba0 + offset);
     523}
     524
     525static void snd_cs4281_ac97_write(struct snd_ac97 *ac97,
     526                                  unsigned short reg, unsigned short val)
     527{
     528        /*
     529         *  1. Write ACCAD = Command Address Register = 46Ch for AC97 register address
     530         *  2. Write ACCDA = Command Data Register = 470h    for data to write to AC97
     531         *  3. Write ACCTL = Control Register = 460h for initiating the write
     532         *  4. Read ACCTL = 460h, DCV should be reset by now and 460h = 07h
     533         *  5. if DCV not cleared, break and return error
     534         */
     535        struct cs4281 *chip = ac97->private_data;
     536        int count;
     537
     538        /*
     539         *  Setup the AC97 control registers on the CS461x to send the
     540         *  appropriate command to the AC97 to perform the read.
     541         *  ACCAD = Command Address Register = 46Ch
     542         *  ACCDA = Command Data Register = 470h
     543         *  ACCTL = Control Register = 460h
     544         *  set DCV - will clear when process completed
     545         *  reset CRW - Write command
     546         *  set VFRM - valid frame enabled
     547         *  set ESYN - ASYNC generation enabled
     548         *  set RSTN - ARST# inactive, AC97 codec not reset
    599549         */
    600         udelay(10);
    601         /*
    602          *  Now, check to see if the write has completed.
    603          *  ACCTL = 460h, DCV should be reset by now and 460h = 07h
    604          */
    605         if (!(snd_cs4281_peekBA0(chip, BA0_ACCTL) & BA0_ACCTL_DCV)) {
    606             return;
    607         }
    608     }
    609     snd_printk(KERN_ERR "AC'97 write problem, reg = 0x%x, val = 0x%x\n", reg, val);
    610 }
    611 
    612 static unsigned short snd_cs4281_ac97_read(ac97_t *ac97,
    613                                            unsigned short reg)
    614 {
    615     cs4281_t *chip = ac97->private_data;
    616     int count;
    617     unsigned short result;
    618     // FIXME: volatile is necessary in the following due to a bug of
    619     // some gcc versions
    620     volatile int ac97_num = ((volatile ac97_t *)ac97)->num;
    621 
    622     /*
    623      *  1. Write ACCAD = Command Address Register = 46Ch for AC97 register address
    624      *  2. Write ACCDA = Command Data Register = 470h    for data to write to AC97
    625      *  3. Write ACCTL = Control Register = 460h for initiating the write
    626      *  4. Read ACCTL = 460h, DCV should be reset by now and 460h = 17h
    627      *  5. if DCV not cleared, break and return error
    628      *  6. Read ACSTS = Status Register = 464h, check VSTS bit
    629      */
    630 
    631     snd_cs4281_peekBA0(chip, ac97_num ? BA0_ACSDA2 : BA0_ACSDA);
    632 
    633     /*
    634      *  Setup the AC97 control registers on the CS461x to send the
    635      *  appropriate command to the AC97 to perform the read.
    636      *  ACCAD = Command Address Register = 46Ch
    637      *  ACCDA = Command Data Register = 470h
    638      *  ACCTL = Control Register = 460h
    639      *  set DCV - will clear when process completed
    640      *  set CRW - Read command
    641      *  set VFRM - valid frame enabled
    642      *  set ESYN - ASYNC generation enabled
    643      *  set RSTN - ARST# inactive, AC97 codec not reset
    644      */
    645 
    646     snd_cs4281_pokeBA0(chip, BA0_ACCAD, reg);
    647     snd_cs4281_pokeBA0(chip, BA0_ACCDA, 0);
    648     snd_cs4281_pokeBA0(chip, BA0_ACCTL, BA0_ACCTL_DCV | BA0_ACCTL_CRW |
    649                        BA0_ACCTL_VFRM | BA0_ACCTL_ESYN |
    650                        (ac97_num ? BA0_ACCTL_TC : 0));
    651 
    652 
    653     /*
    654      *  Wait for the read to occur.
    655      */
    656     for (count = 0; count < 500; count++) {
    657         /*
    658          *  First, we want to wait for a short time.
    659          */
    660         udelay(10);
    661         /*
    662          *  Now, check to see if the read has completed.
    663          *  ACCTL = 460h, DCV should be reset by now and 460h = 17h
    664          */
    665         if (!(snd_cs4281_peekBA0(chip, BA0_ACCTL) & BA0_ACCTL_DCV))
    666             goto __ok1;
    667     }
    668 
    669     snd_printk(KERN_ERR "AC'97 read problem (ACCTL_DCV), reg = 0x%x\n", reg);
    670     result = 0xffff;
    671     goto __end;
    672 
    673 __ok1:
    674     /*
    675      *  Wait for the valid status bit to go active.
    676      */
    677     for (count = 0; count < 100; count++) {
    678         /*
    679          *  Read the AC97 status register.
    680          *  ACSTS = Status Register = 464h
    681          *  VSTS - Valid Status
    682          */
    683         if (snd_cs4281_peekBA0(chip, ac97_num ? BA0_ACSTS2 : BA0_ACSTS) & BA0_ACSTS_VSTS)
    684             goto __ok2;
    685         udelay(10);
    686     }
    687 
    688     snd_printk(KERN_ERR "AC'97 read problem (ACSTS_VSTS), reg = 0x%x\n", reg);
    689     result = 0xffff;
    690     goto __end;
    691 
    692 __ok2:
    693     /*
    694      *  Read the data returned from the AC97 register.
    695      *  ACSDA = Status Data Register = 474h
    696      */
    697     result = snd_cs4281_peekBA0(chip, ac97_num ? BA0_ACSDA2 : BA0_ACSDA);
    698 
    699 __end:
    700     return result;
     550        snd_cs4281_pokeBA0(chip, BA0_ACCAD, reg);
     551        snd_cs4281_pokeBA0(chip, BA0_ACCDA, val);
     552        snd_cs4281_pokeBA0(chip, BA0_ACCTL, BA0_ACCTL_DCV | BA0_ACCTL_VFRM |
     553                                            BA0_ACCTL_ESYN | (ac97->num ? BA0_ACCTL_TC : 0));
     554        for (count = 0; count < 2000; count++) {
     555                /*
     556                 *  First, we want to wait for a short time.
     557                 */
     558                udelay(10);
     559                /*
     560                 *  Now, check to see if the write has completed.
     561                 *  ACCTL = 460h, DCV should be reset by now and 460h = 07h
     562                 */
     563                if (!(snd_cs4281_peekBA0(chip, BA0_ACCTL) & BA0_ACCTL_DCV)) {
     564                        return;
     565                }
     566        }
     567        snd_printk(KERN_ERR "AC'97 write problem, reg = 0x%x, val = 0x%x\n", reg, val);
     568}
     569
     570static unsigned short snd_cs4281_ac97_read(struct snd_ac97 *ac97,
     571                                           unsigned short reg)
     572{
     573        struct cs4281 *chip = ac97->private_data;
     574        int count;
     575        unsigned short result;
     576        // FIXME: volatile is necessary in the following due to a bug of
     577        // some gcc versions
     578        volatile int ac97_num = ((volatile struct snd_ac97 *)ac97)->num;
     579
     580        /*
     581         *  1. Write ACCAD = Command Address Register = 46Ch for AC97 register address
     582         *  2. Write ACCDA = Command Data Register = 470h    for data to write to AC97
     583         *  3. Write ACCTL = Control Register = 460h for initiating the write
     584         *  4. Read ACCTL = 460h, DCV should be reset by now and 460h = 17h
     585         *  5. if DCV not cleared, break and return error
     586         *  6. Read ACSTS = Status Register = 464h, check VSTS bit
     587         */
     588
     589        snd_cs4281_peekBA0(chip, ac97_num ? BA0_ACSDA2 : BA0_ACSDA);
     590
     591        /*
     592         *  Setup the AC97 control registers on the CS461x to send the
     593         *  appropriate command to the AC97 to perform the read.
     594         *  ACCAD = Command Address Register = 46Ch
     595         *  ACCDA = Command Data Register = 470h
     596         *  ACCTL = Control Register = 460h
     597         *  set DCV - will clear when process completed
     598         *  set CRW - Read command
     599         *  set VFRM - valid frame enabled
     600         *  set ESYN - ASYNC generation enabled
     601         *  set RSTN - ARST# inactive, AC97 codec not reset
     602         */
     603
     604        snd_cs4281_pokeBA0(chip, BA0_ACCAD, reg);
     605        snd_cs4281_pokeBA0(chip, BA0_ACCDA, 0);
     606        snd_cs4281_pokeBA0(chip, BA0_ACCTL, BA0_ACCTL_DCV | BA0_ACCTL_CRW |
     607                                            BA0_ACCTL_VFRM | BA0_ACCTL_ESYN |
     608                           (ac97_num ? BA0_ACCTL_TC : 0));
     609
     610
     611        /*
     612         *  Wait for the read to occur.
     613         */
     614        for (count = 0; count < 500; count++) {
     615                /*
     616                 *  First, we want to wait for a short time.
     617                 */
     618                udelay(10);
     619                /*
     620                 *  Now, check to see if the read has completed.
     621                 *  ACCTL = 460h, DCV should be reset by now and 460h = 17h
     622                 */
     623                if (!(snd_cs4281_peekBA0(chip, BA0_ACCTL) & BA0_ACCTL_DCV))
     624                        goto __ok1;
     625        }
     626
     627        snd_printk(KERN_ERR "AC'97 read problem (ACCTL_DCV), reg = 0x%x\n", reg);
     628        result = 0xffff;
     629        goto __end;
     630       
     631      __ok1:
     632        /*
     633         *  Wait for the valid status bit to go active.
     634         */
     635        for (count = 0; count < 100; count++) {
     636                /*
     637                 *  Read the AC97 status register.
     638                 *  ACSTS = Status Register = 464h
     639                 *  VSTS - Valid Status
     640                 */
     641                if (snd_cs4281_peekBA0(chip, ac97_num ? BA0_ACSTS2 : BA0_ACSTS) & BA0_ACSTS_VSTS)
     642                        goto __ok2;
     643                udelay(10);
     644        }
     645       
     646        snd_printk(KERN_ERR "AC'97 read problem (ACSTS_VSTS), reg = 0x%x\n", reg);
     647        result = 0xffff;
     648        goto __end;
     649
     650      __ok2:
     651        /*
     652         *  Read the data returned from the AC97 register.
     653         *  ACSDA = Status Data Register = 474h
     654         */
     655        result = snd_cs4281_peekBA0(chip, ac97_num ? BA0_ACSDA2 : BA0_ACSDA);
     656
     657      __end:
     658        return result;
    701659}
    702660
     
    705663 */
    706664
    707 static int snd_cs4281_trigger(snd_pcm_substream_t *substream, int cmd)
    708 {
    709     cs4281_dma_t *dma = (cs4281_dma_t *)substream->runtime->private_data;
    710     cs4281_t *chip = snd_pcm_substream_chip(substream);
    711 
    712     spin_lock(&chip->reg_lock);
    713     switch (cmd) {
    714     case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
    715         dma->valDCR |= BA0_DCR_MSK;
    716         dma->valFCR |= BA0_FCR_FEN;
    717         break;
    718     case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
    719         dma->valDCR &= ~BA0_DCR_MSK;
    720         dma->valFCR &= ~BA0_FCR_FEN;
    721         break;
    722     case SNDRV_PCM_TRIGGER_START:
    723     case SNDRV_PCM_TRIGGER_RESUME:
    724         snd_cs4281_pokeBA0(chip, dma->regDMR, dma->valDMR & ~BA0_DMR_DMA);
    725         dma->valDMR |= BA0_DMR_DMA;
    726         dma->valDCR &= ~BA0_DCR_MSK;
    727         dma->valFCR |= BA0_FCR_FEN;
    728         break;
    729     case SNDRV_PCM_TRIGGER_STOP:
    730     case SNDRV_PCM_TRIGGER_SUSPEND:
    731         dma->valDMR &= ~(BA0_DMR_DMA|BA0_DMR_POLL);
    732         dma->valDCR |= BA0_DCR_MSK;
    733         dma->valFCR &= ~BA0_FCR_FEN;
    734         /* Leave wave playback FIFO enabled for FM */
    735         if(dma->regFCR != BA0_FCR0)
    736             dma->valFCR &= ~BA0_FCR_FEN;
    737         break;
    738     default:
    739         spin_unlock(&chip->reg_lock);
    740         return -EINVAL;
    741     }
    742     snd_cs4281_pokeBA0(chip, dma->regDMR, dma->valDMR);
    743     snd_cs4281_pokeBA0(chip, dma->regFCR, dma->valFCR);
    744     snd_cs4281_pokeBA0(chip, dma->regDCR, dma->valDCR);
    745     spin_unlock(&chip->reg_lock);
    746     return 0;
     665static int snd_cs4281_trigger(struct snd_pcm_substream *substream, int cmd)
     666{
     667        struct cs4281_dma *dma = substream->runtime->private_data;
     668        struct cs4281 *chip = snd_pcm_substream_chip(substream);
     669
     670        spin_lock(&chip->reg_lock);
     671        switch (cmd) {
     672        case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
     673                dma->valDCR |= BA0_DCR_MSK;
     674                dma->valFCR |= BA0_FCR_FEN;
     675                break;
     676        case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
     677                dma->valDCR &= ~BA0_DCR_MSK;
     678                dma->valFCR &= ~BA0_FCR_FEN;
     679                break;
     680        case SNDRV_PCM_TRIGGER_START:
     681        case SNDRV_PCM_TRIGGER_RESUME:
     682                snd_cs4281_pokeBA0(chip, dma->regDMR, dma->valDMR & ~BA0_DMR_DMA);
     683                dma->valDMR |= BA0_DMR_DMA;
     684                dma->valDCR &= ~BA0_DCR_MSK;
     685                dma->valFCR |= BA0_FCR_FEN;
     686                break;
     687        case SNDRV_PCM_TRIGGER_STOP:
     688        case SNDRV_PCM_TRIGGER_SUSPEND:
     689                dma->valDMR &= ~(BA0_DMR_DMA|BA0_DMR_POLL);
     690                dma->valDCR |= BA0_DCR_MSK;
     691                dma->valFCR &= ~BA0_FCR_FEN;
     692                /* Leave wave playback FIFO enabled for FM */
     693                if (dma->regFCR != BA0_FCR0)
     694                        dma->valFCR &= ~BA0_FCR_FEN;
     695                break;
     696        default:
     697                spin_unlock(&chip->reg_lock);
     698                return -EINVAL;
     699        }
     700        snd_cs4281_pokeBA0(chip, dma->regDMR, dma->valDMR);
     701        snd_cs4281_pokeBA0(chip, dma->regFCR, dma->valFCR);
     702        snd_cs4281_pokeBA0(chip, dma->regDCR, dma->valDCR);
     703        spin_unlock(&chip->reg_lock);
     704        return 0;
    747705}
    748706
    749707static unsigned int snd_cs4281_rate(unsigned int rate, unsigned int *real_rate)
    750708{
    751     unsigned int val = ~0;
    752 
    753     if (real_rate)
    754         *real_rate = rate;
    755     /* special "hardcoded" rates */
    756     switch (rate) {
    757     case 8000:  return 5;
    758     case 11025: return 4;
    759     case 16000: return 3;
    760     case 22050: return 2;
    761     case 44100: return 1;
    762     case 48000: return 0;
    763     default:
    764         goto __variable;
    765     }
    766 __variable:
    767     val = 1536000 / rate;
    768     if (real_rate)
    769         *real_rate = 1536000 / val;
    770     return val;
    771 }
    772 
    773 static void snd_cs4281_mode(cs4281_t *chip, cs4281_dma_t *dma, snd_pcm_runtime_t *runtime, int capture, int src)
    774 {
    775     int rec_mono;
    776 
    777     dma->valDMR = BA0_DMR_TYPE_SINGLE | BA0_DMR_AUTO |
    778         (capture ? BA0_DMR_TR_WRITE : BA0_DMR_TR_READ);
    779     if (runtime->channels == 1)
    780         dma->valDMR |= BA0_DMR_MONO;
    781     if (snd_pcm_format_unsigned(runtime->format) > 0)
    782         dma->valDMR |= BA0_DMR_USIGN;
    783     if (snd_pcm_format_big_endian(runtime->format) > 0)
    784         dma->valDMR |= BA0_DMR_BEND;
    785     switch (snd_pcm_format_width(runtime->format)) {
    786     case 8: dma->valDMR |= BA0_DMR_SIZE8;
    787     if (runtime->channels == 1)
    788         dma->valDMR |= BA0_DMR_SWAPC;
    789     break;
    790     case 32: dma->valDMR |= BA0_DMR_SIZE20; break;
    791     }
    792     dma->frag = 0;      /* for workaround */
    793     dma->valDCR = BA0_DCR_TCIE | BA0_DCR_MSK;
    794     if (runtime->buffer_size != runtime->period_size)
    795         dma->valDCR |= BA0_DCR_HTCIE;
    796     /* Initialize DMA */
    797     snd_cs4281_pokeBA0(chip, dma->regDBA, runtime->dma_addr);
    798     snd_cs4281_pokeBA0(chip, dma->regDBC, runtime->buffer_size - 1);
    799     rec_mono = (chip->dma[1].valDMR & BA0_DMR_MONO) == BA0_DMR_MONO;
    800     snd_cs4281_pokeBA0(chip, BA0_SRCSA, (chip->src_left_play_slot << 0) |
    801                        (chip->src_right_play_slot << 8) |
    802                        (chip->src_left_rec_slot << 16) |
    803                        ((rec_mono ? 31 : chip->src_right_rec_slot) << 24));
    804     if (!src)
    805         goto __skip_src;
    806     if (!capture) {
    807         if (dma->left_slot == chip->src_left_play_slot) {
    808             unsigned int val = snd_cs4281_rate(runtime->rate, NULL);
    809             snd_assert(dma->right_slot == chip->src_right_play_slot, );
    810             snd_cs4281_pokeBA0(chip, BA0_DACSR, val);
    811         }
    812     } else {
    813         if (dma->left_slot == chip->src_left_rec_slot) {
    814             unsigned int val = snd_cs4281_rate(runtime->rate, NULL);
    815             snd_assert(dma->right_slot == chip->src_right_rec_slot, );
    816             snd_cs4281_pokeBA0(chip, BA0_ADCSR, val);
    817         }
    818     }
    819 __skip_src:
    820     /* Deactivate wave playback FIFO before changing slot assignments */
    821     if(dma->regFCR == BA0_FCR0)
    822         snd_cs4281_pokeBA0(chip, dma->regFCR, snd_cs4281_peekBA0(chip, dma->regFCR) & ~BA0_FCR_FEN);
    823     /* Initialize FIFO */
    824     dma->valFCR = BA0_FCR_LS(dma->left_slot) |
    825         BA0_FCR_RS(capture && (dma->valDMR & BA0_DMR_MONO) ? 31 : dma->right_slot) |
    826         BA0_FCR_SZ(CS4281_FIFO_SIZE) |
    827         BA0_FCR_OF(dma->fifo_offset);
    828     snd_cs4281_pokeBA0(chip, dma->regFCR, dma->valFCR | (capture ? BA0_FCR_PSH : 0));
    829     /* Activate FIFO again for FM playback */
    830     if(dma->regFCR == BA0_FCR0)
    831         snd_cs4281_pokeBA0(chip, dma->regFCR, dma->valFCR | BA0_FCR_FEN);
    832     /* Clear FIFO Status and Interrupt Control Register */
    833     snd_cs4281_pokeBA0(chip, dma->regFSIC, 0);
    834 }
    835 
    836 static int snd_cs4281_hw_params(snd_pcm_substream_t * substream,
    837                                 snd_pcm_hw_params_t * hw_params)
    838 {
    839     return snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params));
    840 }
    841 
    842 static int snd_cs4281_hw_free(snd_pcm_substream_t * substream)
    843 {
    844     return snd_pcm_lib_free_pages(substream);
    845 }
    846 
    847 static int snd_cs4281_playback_prepare(snd_pcm_substream_t * substream)
    848 {
    849     snd_pcm_runtime_t *runtime = substream->runtime;
    850     cs4281_dma_t *dma = (cs4281_dma_t *)runtime->private_data;
    851     cs4281_t *chip = snd_pcm_substream_chip(substream);
    852 
    853     spin_lock_irq(&chip->reg_lock);
    854     snd_cs4281_mode(chip, dma, runtime, 0, 1);
    855     spin_unlock_irq(&chip->reg_lock);
    856     return 0;
    857 }
    858 
    859 static int snd_cs4281_capture_prepare(snd_pcm_substream_t * substream)
    860 {
    861     snd_pcm_runtime_t *runtime = substream->runtime;
    862     cs4281_dma_t *dma = (cs4281_dma_t *)runtime->private_data;
    863     cs4281_t *chip = snd_pcm_substream_chip(substream);
    864 
    865     spin_lock_irq(&chip->reg_lock);
    866     snd_cs4281_mode(chip, dma, runtime, 1, 1);
    867     spin_unlock_irq(&chip->reg_lock);
    868     return 0;
    869 }
    870 
    871 static snd_pcm_uframes_t snd_cs4281_pointer(snd_pcm_substream_t * substream)
    872 {
    873     snd_pcm_runtime_t *runtime = substream->runtime;
    874     cs4281_dma_t *dma = (cs4281_dma_t *)runtime->private_data;
    875     cs4281_t *chip = snd_pcm_substream_chip(substream);
    876 
    877     // printk("DCC = 0x%x, buffer_size = 0x%x, jiffies = %li\n", snd_cs4281_peekBA0(chip, dma->regDCC), runtime->buffer_size, jiffies);
    878     return runtime->buffer_size -
    879         snd_cs4281_peekBA0(chip, dma->regDCC) - 1;
    880 }
    881 
    882 static snd_pcm_hardware_t snd_cs4281_playback =
    883 {
    884     /*  info:                   */      (SNDRV_PCM_INFO_MMAP |
    885                                          SNDRV_PCM_INFO_INTERLEAVED |
    886                                          SNDRV_PCM_INFO_MMAP_VALID |
    887                                          SNDRV_PCM_INFO_PAUSE |
    888                                          SNDRV_PCM_INFO_RESUME |
    889                                          SNDRV_PCM_INFO_SYNC_START),
    890                                          /*     formats:                */      SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S8 |
    891                                          SNDRV_PCM_FMTBIT_U16_LE | SNDRV_PCM_FMTBIT_S16_LE |
    892                                          SNDRV_PCM_FMTBIT_U16_BE | SNDRV_PCM_FMTBIT_S16_BE |
    893                                          SNDRV_PCM_FMTBIT_U32_LE | SNDRV_PCM_FMTBIT_S32_LE |
    894                                          SNDRV_PCM_FMTBIT_U32_BE | SNDRV_PCM_FMTBIT_S32_BE,
    895                                          /*     rates:                  */      SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000,
    896                                          /*     rate_min:               */      4000,
    897                                          /*     rate_max:               */      48000,
    898                                          /*     channels_min:           */      1,
    899                                          /*     channels_max:           */      2,
    900                                          /*     buffer_bytes_max:       */      (512*1024),
    901                                          /*     period_bytes_min:       */      64,
    902                                          /*     period_bytes_max:       */      (512*1024),
    903                                          /*     periods_min:            */      1,
    904                                          /*     periods_max:            */      2,
    905                                          /*     fifo_size:              */      CS4281_FIFO_SIZE,
     709        unsigned int val = ~0;
     710       
     711        if (real_rate)
     712                *real_rate = rate;
     713        /* special "hardcoded" rates */
     714        switch (rate) {
     715        case 8000:      return 5;
     716        case 11025:     return 4;
     717        case 16000:     return 3;
     718        case 22050:     return 2;
     719        case 44100:     return 1;
     720        case 48000:     return 0;
     721        default:
     722                goto __variable;
     723        }
     724      __variable:
     725        val = 1536000 / rate;
     726        if (real_rate)
     727                *real_rate = 1536000 / val;
     728        return val;
     729}
     730
     731static void snd_cs4281_mode(struct cs4281 *chip, struct cs4281_dma *dma,
     732                            struct snd_pcm_runtime *runtime,
     733                            int capture, int src)
     734{
     735        int rec_mono;
     736
     737        dma->valDMR = BA0_DMR_TYPE_SINGLE | BA0_DMR_AUTO |
     738                      (capture ? BA0_DMR_TR_WRITE : BA0_DMR_TR_READ);
     739        if (runtime->channels == 1)
     740                dma->valDMR |= BA0_DMR_MONO;
     741        if (snd_pcm_format_unsigned(runtime->format) > 0)
     742                dma->valDMR |= BA0_DMR_USIGN;
     743        if (snd_pcm_format_big_endian(runtime->format) > 0)
     744                dma->valDMR |= BA0_DMR_BEND;
     745        switch (snd_pcm_format_width(runtime->format)) {
     746        case 8: dma->valDMR |= BA0_DMR_SIZE8;
     747                if (runtime->channels == 1)
     748                        dma->valDMR |= BA0_DMR_SWAPC;
     749                break;
     750        case 32: dma->valDMR |= BA0_DMR_SIZE20; break;
     751        }
     752        dma->frag = 0;  /* for workaround */
     753        dma->valDCR = BA0_DCR_TCIE | BA0_DCR_MSK;
     754        if (runtime->buffer_size != runtime->period_size)
     755                dma->valDCR |= BA0_DCR_HTCIE;
     756        /* Initialize DMA */
     757        snd_cs4281_pokeBA0(chip, dma->regDBA, runtime->dma_addr);
     758        snd_cs4281_pokeBA0(chip, dma->regDBC, runtime->buffer_size - 1);
     759        rec_mono = (chip->dma[1].valDMR & BA0_DMR_MONO) == BA0_DMR_MONO;
     760        snd_cs4281_pokeBA0(chip, BA0_SRCSA, (chip->src_left_play_slot << 0) |
     761                                            (chip->src_right_play_slot << 8) |
     762                                            (chip->src_left_rec_slot << 16) |
     763                                            ((rec_mono ? 31 : chip->src_right_rec_slot) << 24));
     764        if (!src)
     765                goto __skip_src;
     766        if (!capture) {
     767                if (dma->left_slot == chip->src_left_play_slot) {
     768                        unsigned int val = snd_cs4281_rate(runtime->rate, NULL);
     769                        snd_assert(dma->right_slot == chip->src_right_play_slot, );
     770                        snd_cs4281_pokeBA0(chip, BA0_DACSR, val);
     771                }
     772        } else {
     773                if (dma->left_slot == chip->src_left_rec_slot) {
     774                        unsigned int val = snd_cs4281_rate(runtime->rate, NULL);
     775                        snd_assert(dma->right_slot == chip->src_right_rec_slot, );
     776                        snd_cs4281_pokeBA0(chip, BA0_ADCSR, val);
     777                }
     778        }
     779      __skip_src:
     780        /* Deactivate wave playback FIFO before changing slot assignments */
     781        if (dma->regFCR == BA0_FCR0)
     782                snd_cs4281_pokeBA0(chip, dma->regFCR, snd_cs4281_peekBA0(chip, dma->regFCR) & ~BA0_FCR_FEN);
     783        /* Initialize FIFO */
     784        dma->valFCR = BA0_FCR_LS(dma->left_slot) |
     785                      BA0_FCR_RS(capture && (dma->valDMR & BA0_DMR_MONO) ? 31 : dma->right_slot) |
     786                      BA0_FCR_SZ(CS4281_FIFO_SIZE) |
     787                      BA0_FCR_OF(dma->fifo_offset);
     788        snd_cs4281_pokeBA0(chip, dma->regFCR, dma->valFCR | (capture ? BA0_FCR_PSH : 0));
     789        /* Activate FIFO again for FM playback */
     790        if (dma->regFCR == BA0_FCR0)
     791                snd_cs4281_pokeBA0(chip, dma->regFCR, dma->valFCR | BA0_FCR_FEN);
     792        /* Clear FIFO Status and Interrupt Control Register */
     793        snd_cs4281_pokeBA0(chip, dma->regFSIC, 0);
     794}
     795
     796static int snd_cs4281_hw_params(struct snd_pcm_substream *substream,
     797                                struct snd_pcm_hw_params *hw_params)
     798{
     799        return snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(hw_params));
     800}
     801
     802static int snd_cs4281_hw_free(struct snd_pcm_substream *substream)
     803{
     804        return snd_pcm_lib_free_pages(substream);
     805}
     806
     807static int snd_cs4281_playback_prepare(struct snd_pcm_substream *substream)
     808{
     809        struct snd_pcm_runtime *runtime = substream->runtime;
     810        struct cs4281_dma *dma = runtime->private_data;
     811        struct cs4281 *chip = snd_pcm_substream_chip(substream);
     812
     813        spin_lock_irq(&chip->reg_lock);
     814        snd_cs4281_mode(chip, dma, runtime, 0, 1);
     815        spin_unlock_irq(&chip->reg_lock);
     816        return 0;
     817}
     818
     819static int snd_cs4281_capture_prepare(struct snd_pcm_substream *substream)
     820{
     821        struct snd_pcm_runtime *runtime = substream->runtime;
     822        struct cs4281_dma *dma = runtime->private_data;
     823        struct cs4281 *chip = snd_pcm_substream_chip(substream);
     824
     825        spin_lock_irq(&chip->reg_lock);
     826        snd_cs4281_mode(chip, dma, runtime, 1, 1);
     827        spin_unlock_irq(&chip->reg_lock);
     828        return 0;
     829}
     830
     831static snd_pcm_uframes_t snd_cs4281_pointer(struct snd_pcm_substream *substream)
     832{
     833        struct snd_pcm_runtime *runtime = substream->runtime;
     834        struct cs4281_dma *dma = runtime->private_data;
     835        struct cs4281 *chip = snd_pcm_substream_chip(substream);
     836
     837        // printk("DCC = 0x%x, buffer_size = 0x%x, jiffies = %li\n", snd_cs4281_peekBA0(chip, dma->regDCC), runtime->buffer_size, jiffies);
     838        return runtime->buffer_size -
     839               snd_cs4281_peekBA0(chip, dma->regDCC) - 1;
     840}
     841
     842static struct snd_pcm_hardware snd_cs4281_playback =
     843{
     844        .info =                 SNDRV_PCM_INFO_MMAP |
     845                                SNDRV_PCM_INFO_INTERLEAVED |
     846                                SNDRV_PCM_INFO_MMAP_VALID |
     847                                SNDRV_PCM_INFO_PAUSE |
     848                                SNDRV_PCM_INFO_RESUME,
     849        .formats =              SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S8 |
     850                                SNDRV_PCM_FMTBIT_U16_LE | SNDRV_PCM_FMTBIT_S16_LE |
     851                                SNDRV_PCM_FMTBIT_U16_BE | SNDRV_PCM_FMTBIT_S16_BE |
     852                                SNDRV_PCM_FMTBIT_U32_LE | SNDRV_PCM_FMTBIT_S32_LE |
     853                                SNDRV_PCM_FMTBIT_U32_BE | SNDRV_PCM_FMTBIT_S32_BE,
     854        .rates =                SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000,
     855        .rate_min =             4000,
     856        .rate_max =             48000,
     857        .channels_min =         1,
     858        .channels_max =         2,
     859        .buffer_bytes_max =     (512*1024),
     860        .period_bytes_min =     64,
     861        .period_bytes_max =     (512*1024),
     862        .periods_min =          1,
     863        .periods_max =          2,
     864        .fifo_size =            CS4281_FIFO_SIZE,
    906865};
    907866
    908 static snd_pcm_hardware_t snd_cs4281_capture =
    909 {
    910     /*  info:                   */      (SNDRV_PCM_INFO_MMAP |
    911                                          SNDRV_PCM_INFO_INTERLEAVED |
    912                                          SNDRV_PCM_INFO_MMAP_VALID |
    913                                          SNDRV_PCM_INFO_PAUSE |
    914                                          SNDRV_PCM_INFO_RESUME |
    915                                          SNDRV_PCM_INFO_SYNC_START),
    916                                          /*     formats:                */      //SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S8 |
    917                                          SNDRV_PCM_FMTBIT_U16_LE | SNDRV_PCM_FMTBIT_S16_LE |
    918                                          SNDRV_PCM_FMTBIT_U16_BE | SNDRV_PCM_FMTBIT_S16_BE |
    919                                          SNDRV_PCM_FMTBIT_U32_LE | SNDRV_PCM_FMTBIT_S32_LE |
    920                                          SNDRV_PCM_FMTBIT_U32_BE | SNDRV_PCM_FMTBIT_S32_BE,
    921                                          /*     rates:                  */      SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000,
    922                                          /*     rate_min:               */      4000,
    923                                          /*     rate_max:               */      48000,
    924                                          /*     channels_min:           */      1,
    925                                          /*     channels_max:           */      2,
    926                                          /*     buffer_bytes_max:       */      (512*1024),
    927                                          /*     period_bytes_min:       */      64,
    928                                          /*     period_bytes_max:       */      (512*1024),
    929                                          /*     periods_min:            */      1,
    930                                          /*     periods_max:            */      2,
    931                                          /*     fifo_size:              */      CS4281_FIFO_SIZE,
     867static struct snd_pcm_hardware snd_cs4281_capture =
     868{
     869        .info =                 SNDRV_PCM_INFO_MMAP |
     870                                SNDRV_PCM_INFO_INTERLEAVED |
     871                                SNDRV_PCM_INFO_MMAP_VALID |
     872                                SNDRV_PCM_INFO_PAUSE |
     873                                SNDRV_PCM_INFO_RESUME,
     874        .formats =              SNDRV_PCM_FMTBIT_U8 | SNDRV_PCM_FMTBIT_S8 |
     875                                SNDRV_PCM_FMTBIT_U16_LE | SNDRV_PCM_FMTBIT_S16_LE |
     876                                SNDRV_PCM_FMTBIT_U16_BE | SNDRV_PCM_FMTBIT_S16_BE |
     877                                SNDRV_PCM_FMTBIT_U32_LE | SNDRV_PCM_FMTBIT_S32_LE |
     878                                SNDRV_PCM_FMTBIT_U32_BE | SNDRV_PCM_FMTBIT_S32_BE,
     879        .rates =                SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000_48000,
     880        .rate_min =             4000,
     881        .rate_max =             48000,
     882        .channels_min =         1,
     883        .channels_max =         2,
     884        .buffer_bytes_max =     (512*1024),
     885        .period_bytes_min =     64,
     886        .period_bytes_max =     (512*1024),
     887        .periods_min =          1,
     888        .periods_max =          2,
     889        .fifo_size =            CS4281_FIFO_SIZE,
    932890};
    933891
    934 static int snd_cs4281_playback_open(snd_pcm_substream_t * substream)
    935 {
    936     cs4281_t *chip = snd_pcm_substream_chip(substream);
    937     snd_pcm_runtime_t *runtime = substream->runtime;
    938     cs4281_dma_t *dma;
    939 
    940     dma = &chip->dma[0];
    941     dma->substream = substream;
    942     dma->left_slot = 0;
    943     dma->right_slot = 1;
    944     runtime->private_data = dma;
    945     runtime->hw = snd_cs4281_playback;
    946     snd_pcm_set_sync(substream);
    947     /* should be detected from the AC'97 layer, but it seems
    948      that although CS4297A rev B reports 18-bit ADC resolution,
    949      samples are 20-bit */
    950     snd_pcm_hw_constraint_msbits(runtime, 0, 32, 20);
    951     return 0;
    952 }
    953 
    954 static int snd_cs4281_capture_open(snd_pcm_substream_t * substream)
    955 {
    956     cs4281_t *chip = snd_pcm_substream_chip(substream);
    957     snd_pcm_runtime_t *runtime = substream->runtime;
    958     cs4281_dma_t *dma;
    959 
    960     dma = &chip->dma[1];
    961     dma->substream = substream;
    962     dma->left_slot = 10;
    963     dma->right_slot = 11;
    964     runtime->private_data = dma;
    965     runtime->hw = snd_cs4281_capture;
    966     snd_pcm_set_sync(substream);
    967     /* should be detected from the AC'97 layer, but it seems
    968      that although CS4297A rev B reports 18-bit ADC resolution,
    969      samples are 20-bit */
    970     snd_pcm_hw_constraint_msbits(runtime, 0, 32, 20);
    971     return 0;
    972 }
    973 
    974 static int snd_cs4281_playback_close(snd_pcm_substream_t * substream)
    975 {
    976     cs4281_dma_t *dma = (cs4281_dma_t *)substream->runtime->private_data;
    977 
    978     dma->substream = NULL;
    979     return 0;
    980 }
    981 
    982 static int snd_cs4281_capture_close(snd_pcm_substream_t * substream)
    983 {
    984     cs4281_dma_t *dma = (cs4281_dma_t *)substream->runtime->private_data;
    985 
    986     dma->substream = NULL;
    987     return 0;
    988 }
    989 
    990 static snd_pcm_ops_t snd_cs4281_playback_ops = {
    991     /*  .open =       */  snd_cs4281_playback_open,
    992     /*  .close =      */  snd_cs4281_playback_close,
    993     /*  .ioctl =      */  snd_pcm_lib_ioctl,
    994     /*  .hw_params =  */  snd_cs4281_hw_params,
    995     /*  .hw_free =    */  snd_cs4281_hw_free,
    996     /*  .prepare =    */  snd_cs4281_playback_prepare,
    997     /*  .trigger =    */  snd_cs4281_trigger,
    998     /*  .pointer =    */  snd_cs4281_pointer,
    999     0,0,0,0
     892static int snd_cs4281_playback_open(struct snd_pcm_substream *substream)
     893{
     894        struct cs4281 *chip = snd_pcm_substream_chip(substream);
     895        struct snd_pcm_runtime *runtime = substream->runtime;
     896        struct cs4281_dma *dma;
     897
     898        dma = &chip->dma[0];
     899        dma->substream = substream;
     900        dma->left_slot = 0;
     901        dma->right_slot = 1;
     902        runtime->private_data = dma;
     903        runtime->hw = snd_cs4281_playback;
     904        /* should be detected from the AC'97 layer, but it seems
     905           that although CS4297A rev B reports 18-bit ADC resolution,
     906           samples are 20-bit */
     907        snd_pcm_hw_constraint_msbits(runtime, 0, 32, 20);
     908        return 0;
     909}
     910
     911static int snd_cs4281_capture_open(struct snd_pcm_substream *substream)
     912{
     913        struct cs4281 *chip = snd_pcm_substream_chip(substream);
     914        struct snd_pcm_runtime *runtime = substream->runtime;
     915        struct cs4281_dma *dma;
     916
     917        dma = &chip->dma[1];
     918        dma->substream = substream;
     919        dma->left_slot = 10;
     920        dma->right_slot = 11;
     921        runtime->private_data = dma;
     922        runtime->hw = snd_cs4281_capture;
     923        /* should be detected from the AC'97 layer, but it seems
     924           that although CS4297A rev B reports 18-bit ADC resolution,
     925           samples are 20-bit */
     926        snd_pcm_hw_constraint_msbits(runtime, 0, 32, 20);
     927        return 0;
     928}
     929
     930static int snd_cs4281_playback_close(struct snd_pcm_substream *substream)
     931{
     932        struct cs4281_dma *dma = substream->runtime->private_data;
     933
     934        dma->substream = NULL;
     935        return 0;
     936}
     937
     938static int snd_cs4281_capture_close(struct snd_pcm_substream *substream)
     939{
     940        struct cs4281_dma *dma = substream->runtime->private_data;
     941
     942        dma->substream = NULL;
     943        return 0;
     944}
     945
     946static struct snd_pcm_ops snd_cs4281_playback_ops = {
     947        .open =         snd_cs4281_playback_open,
     948        .close =        snd_cs4281_playback_close,
     949        .ioctl =        snd_pcm_lib_ioctl,
     950        .hw_params =    snd_cs4281_hw_params,
     951        .hw_free =      snd_cs4281_hw_free,
     952        .prepare =      snd_cs4281_playback_prepare,
     953        .trigger =      snd_cs4281_trigger,
     954        .pointer =      snd_cs4281_pointer,
    1000955};
    1001956
    1002 static snd_pcm_ops_t snd_cs4281_capture_ops = {
    1003     /*  .open =       */  snd_cs4281_capture_open,
    1004     /*  .close =      */  snd_cs4281_capture_close,
    1005     /*  .ioctl =      */  snd_pcm_lib_ioctl,
    1006     /*  .hw_params =  */  snd_cs4281_hw_params,
    1007     /*  .hw_free =    */  snd_cs4281_hw_free,
    1008     /*  .prepare =    */  snd_cs4281_capture_prepare,
    1009     /*  .trigger =    */  snd_cs4281_trigger,
    1010     /*  .pointer =    */  snd_cs4281_pointer,
    1011     0,0,0,0
     957static struct snd_pcm_ops snd_cs4281_capture_ops = {
     958        .open =         snd_cs4281_capture_open,
     959        .close =        snd_cs4281_capture_close,
     960        .ioctl =        snd_pcm_lib_ioctl,
     961        .hw_params =    snd_cs4281_hw_params,
     962        .hw_free =      snd_cs4281_hw_free,
     963        .prepare =      snd_cs4281_capture_prepare,
     964        .trigger =      snd_cs4281_trigger,
     965        .pointer =      snd_cs4281_pointer,
    1012966};
    1013967
    1014 static void snd_cs4281_pcm_free(snd_pcm_t *pcm)
    1015 {
    1016     cs4281_t *chip = pcm->private_data;
    1017     chip->pcm = NULL;
    1018     snd_pcm_lib_preallocate_free_for_all(pcm);
    1019 }
    1020 
    1021 static int __devinit snd_cs4281_pcm(cs4281_t * chip, int device, snd_pcm_t ** rpcm)
    1022 {
    1023     snd_pcm_t *pcm;
    1024     int err;
    1025 
    1026     if (rpcm)
    1027         *rpcm = NULL;
    1028     err = snd_pcm_new(chip->card, "CS4281", device, 1, 1, &pcm);
    1029     if (err < 0)
    1030         return err;
    1031 
    1032     snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_cs4281_playback_ops);
    1033     snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_cs4281_capture_ops);
    1034 
    1035     pcm->private_data = chip;
    1036     pcm->private_free = snd_cs4281_pcm_free;
    1037     pcm->info_flags = 0;
    1038     strcpy(pcm->name, "CS4281");
    1039     chip->pcm = pcm;
    1040 
    1041     snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
    1042                                           snd_dma_pci_data(chip->pci), 64*1024, 512*1024);
    1043 
    1044     if (rpcm)
    1045         *rpcm = pcm;
    1046     return 0;
     968static int __devinit snd_cs4281_pcm(struct cs4281 * chip, int device,
     969                                    struct snd_pcm ** rpcm)
     970{
     971        struct snd_pcm *pcm;
     972        int err;
     973
     974        if (rpcm)
     975                *rpcm = NULL;
     976        err = snd_pcm_new(chip->card, "CS4281", device, 1, 1, &pcm);
     977        if (err < 0)
     978                return err;
     979
     980        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_cs4281_playback_ops);
     981        snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_cs4281_capture_ops);
     982
     983        pcm->private_data = chip;
     984        pcm->info_flags = 0;
     985        strcpy(pcm->name, "CS4281");
     986        chip->pcm = pcm;
     987
     988        snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,
     989                                              snd_dma_pci_data(chip->pci), 64*1024, 512*1024);
     990
     991        if (rpcm)
     992                *rpcm = pcm;
     993        return 0;
    1047994}
    1048995
     
    1050997 *  Mixer section
    1051998 */
     999
    10521000#define CS_VOL_MASK     0x1f
    10531001
    1054 static int snd_cs4281_info_volume(snd_kcontrol_t * kcontrol, snd_ctl_elem_info_t * uinfo)
    1055 {
    1056     uinfo->type              = SNDRV_CTL_ELEM_TYPE_INTEGER;
    1057     uinfo->count             = 2;
    1058     uinfo->value.integer.min = 0;
    1059     uinfo->value.integer.max = CS_VOL_MASK;
    1060     return 0;
    1061 }
    1062 
    1063 static int snd_cs4281_get_volume(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
    1064 {
    1065     cs4281_t *chip = snd_kcontrol_chip(kcontrol);
    1066     int regL = (kcontrol->private_value >> 16) & 0xffff;
    1067     int regR = kcontrol->private_value & 0xffff;
    1068     int volL, volR;
    1069 
    1070     volL = CS_VOL_MASK - (snd_cs4281_peekBA0(chip, regL) & CS_VOL_MASK);
    1071     volR = CS_VOL_MASK - (snd_cs4281_peekBA0(chip, regR) & CS_VOL_MASK);
    1072 
    1073     ucontrol->value.integer.value[0] = volL;
    1074     ucontrol->value.integer.value[1] = volR;
    1075     return 0;
    1076 }
    1077 
    1078 static int snd_cs4281_put_volume(snd_kcontrol_t * kcontrol, snd_ctl_elem_value_t * ucontrol)
    1079 {
    1080     cs4281_t *chip = snd_kcontrol_chip(kcontrol);
    1081     int change = 0;
    1082     int regL = (kcontrol->private_value >> 16) & 0xffff;
    1083     int regR = kcontrol->private_value & 0xffff;
    1084     int volL, volR;
    1085 
    1086     volL = CS_VOL_MASK - (snd_cs4281_peekBA0(chip, regL) & CS_VOL_MASK);
    1087     volR = CS_VOL_MASK - (snd_cs4281_peekBA0(chip, regR) & CS_VOL_MASK);
    1088 
    1089     if (ucontrol->value.integer.value[0] != volL) {
    1090         volL = CS_VOL_MASK - (ucontrol->value.integer.value[0] & CS_VOL_MASK);
    1091         snd_cs4281_pokeBA0(chip, regL, volL);
    1092         change = 1;
    1093     }
    1094     if (ucontrol->value.integer.value[0] != volR) {
    1095         volR = CS_VOL_MASK - (ucontrol->value.integer.value[1] & CS_VOL_MASK);
    1096         snd_cs4281_pokeBA0(chip, regR, volR);
    1097         change = 1;
    1098     }
    1099     return change;
    1100 }
    1101 
    1102 static snd_kcontrol_new_t snd_cs4281_fm_vol =
    1103 {
    1104     .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
    1105     .name = "Synth Playback Volume",
    1106     .info = snd_cs4281_info_volume,
    1107     .get = snd_cs4281_get_volume,
    1108     .put = snd_cs4281_put_volume,
    1109     .private_value = ((BA0_FMLVC << 16) | BA0_FMRVC)
     1002static int snd_cs4281_info_volume(struct snd_kcontrol *kcontrol,
     1003                                  struct snd_ctl_elem_info *uinfo)
     1004{
     1005        uinfo->type              = SNDRV_CTL_ELEM_TYPE_INTEGER;
     1006        uinfo->count             = 2;
     1007        uinfo->value.integer.min = 0;
     1008        uinfo->value.integer.max = CS_VOL_MASK;
     1009        return 0;
     1010}
     1011 
     1012static int snd_cs4281_get_volume(struct snd_kcontrol *kcontrol,
     1013                                 struct snd_ctl_elem_value *ucontrol)
     1014{
     1015        struct cs4281 *chip = snd_kcontrol_chip(kcontrol);
     1016        int regL = (kcontrol->private_value >> 16) & 0xffff;
     1017        int regR = kcontrol->private_value & 0xffff;
     1018        int volL, volR;
     1019
     1020        volL = CS_VOL_MASK - (snd_cs4281_peekBA0(chip, regL) & CS_VOL_MASK);
     1021        volR = CS_VOL_MASK - (snd_cs4281_peekBA0(chip, regR) & CS_VOL_MASK);
     1022
     1023        ucontrol->value.integer.value[0] = volL;
     1024        ucontrol->value.integer.value[1] = volR;
     1025        return 0;
     1026}
     1027
     1028static int snd_cs4281_put_volume(struct snd_kcontrol *kcontrol,
     1029                                 struct snd_ctl_elem_value *ucontrol)
     1030{
     1031        struct cs4281 *chip = snd_kcontrol_chip(kcontrol);
     1032        int change = 0;
     1033        int regL = (kcontrol->private_value >> 16) & 0xffff;
     1034        int regR = kcontrol->private_value & 0xffff;
     1035        int volL, volR;
     1036
     1037        volL = CS_VOL_MASK - (snd_cs4281_peekBA0(chip, regL) & CS_VOL_MASK);
     1038        volR = CS_VOL_MASK - (snd_cs4281_peekBA0(chip, regR) & CS_VOL_MASK);
     1039
     1040        if (ucontrol->value.integer.value[0] != volL) {
     1041                volL = CS_VOL_MASK - (ucontrol->value.integer.value[0] & CS_VOL_MASK);
     1042                snd_cs4281_pokeBA0(chip, regL, volL);
     1043                change = 1;
     1044        }
     1045        if (ucontrol->value.integer.value[1] != volR) {
     1046                volR = CS_VOL_MASK - (ucontrol->value.integer.value[1] & CS_VOL_MASK);
     1047                snd_cs4281_pokeBA0(chip, regR, volR);
     1048                change = 1;
     1049        }
     1050        return change;
     1051}
     1052
     1053static const DECLARE_TLV_DB_SCALE(db_scale_dsp, -4650, 150, 0);
     1054
     1055static struct snd_kcontrol_new snd_cs4281_fm_vol =
     1056{
     1057        .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
     1058        .name = "Synth Playback Volume",
     1059        .info = snd_cs4281_info_volume,
     1060        .get = snd_cs4281_get_volume,
     1061        .put = snd_cs4281_put_volume,
     1062        .private_value = ((BA0_FMLVC << 16) | BA0_FMRVC),
     1063        .tlv = { .p = db_scale_dsp },
    11101064};
    11111065
    1112 static snd_kcontrol_new_t snd_cs4281_pcm_vol =
    1113 {
    1114     .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
    1115     .name = "PCM Stream Playback Volume",
    1116     .info = snd_cs4281_info_volume,
    1117     .get = snd_cs4281_get_volume,
    1118     .put = snd_cs4281_put_volume,
    1119     .private_value = ((BA0_PPLVC << 16) | BA0_PPRVC)
     1066static struct snd_kcontrol_new snd_cs4281_pcm_vol =
     1067{
     1068        .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
     1069        .name = "PCM Stream Playback Volume",
     1070        .info = snd_cs4281_info_volume,
     1071        .get = snd_cs4281_get_volume,
     1072        .put = snd_cs4281_put_volume,
     1073        .private_value = ((BA0_PPLVC << 16) | BA0_PPRVC),
     1074        .tlv = { .p = db_scale_dsp },
    11201075};
    11211076
    1122 static void snd_cs4281_mixer_free_ac97_bus(ac97_bus_t *bus)
    1123 {
    1124     cs4281_t *chip = bus->private_data;
    1125     chip->ac97_bus = NULL;
    1126 }
    1127 
    1128 
    1129 static void snd_cs4281_mixer_free_ac97(ac97_t *ac97)
    1130 {
    1131     cs4281_t *chip = ac97->private_data;
    1132     if (ac97->num)
    1133         chip->ac97_secondary = NULL;
    1134     else
    1135         chip->ac97 = NULL;
    1136 }
    1137 
    1138 static int __devinit snd_cs4281_mixer(cs4281_t * chip)
    1139 {
    1140     snd_card_t *card = chip->card;
    1141     ac97_template_t ac97;
    1142     int err;
    1143     static ac97_bus_ops_t ops = {
    1144         0,0,
    1145         snd_cs4281_ac97_write,
    1146         snd_cs4281_ac97_read,
    1147         0,0
    1148     };
    1149     if ((err = snd_ac97_bus(card, 0, &ops, chip, &chip->ac97_bus)) < 0)
    1150         return err;
    1151 
    1152     chip->ac97_bus->private_free = snd_cs4281_mixer_free_ac97_bus;
    1153 
    1154     memset(&ac97, 0, sizeof(ac97));
    1155     ac97.private_data = chip;
    1156     ac97.private_free = snd_cs4281_mixer_free_ac97;
    1157     if ((err = snd_ac97_mixer(chip->ac97_bus, &ac97, &chip->ac97)) < 0)
    1158         return err;
    1159     if (chip->dual_codec) {
    1160         ac97.num = 1;
    1161         if ((err = snd_ac97_mixer(chip->ac97_bus, &ac97, &chip->ac97_secondary)) < 0)
    1162             return err;
    1163     }
    1164     if ((err = snd_ctl_add(card, snd_ctl_new1(&snd_cs4281_fm_vol, chip))) < 0)
    1165         return err;
    1166     if ((err = snd_ctl_add(card, snd_ctl_new1(&snd_cs4281_pcm_vol, chip))) < 0)
    1167         return err;
    1168     return 0;
    1169 }
     1077static void snd_cs4281_mixer_free_ac97_bus(struct snd_ac97_bus *bus)
     1078{
     1079        struct cs4281 *chip = bus->private_data;
     1080        chip->ac97_bus = NULL;
     1081}
     1082
     1083static void snd_cs4281_mixer_free_ac97(struct snd_ac97 *ac97)
     1084{
     1085        struct cs4281 *chip = ac97->private_data;
     1086        if (ac97->num)
     1087                chip->ac97_secondary = NULL;
     1088        else
     1089                chip->ac97 = NULL;
     1090}
     1091
     1092static int __devinit snd_cs4281_mixer(struct cs4281 * chip)
     1093{
     1094        struct snd_card *card = chip->card;
     1095        struct snd_ac97_template ac97;
     1096        int err;
     1097        static struct snd_ac97_bus_ops ops = {
     1098                .write = snd_cs4281_ac97_write,
     1099                .read = snd_cs4281_ac97_read,
     1100        };
     1101
     1102        if ((err = snd_ac97_bus(card, 0, &ops, chip, &chip->ac97_bus)) < 0)
     1103                return err;
     1104        chip->ac97_bus->private_free = snd_cs4281_mixer_free_ac97_bus;
     1105
     1106        memset(&ac97, 0, sizeof(ac97));
     1107        ac97.private_data = chip;
     1108        ac97.private_free = snd_cs4281_mixer_free_ac97;
     1109        if ((err = snd_ac97_mixer(chip->ac97_bus, &ac97, &chip->ac97)) < 0)
     1110                return err;
     1111        if (chip->dual_codec) {
     1112                ac97.num = 1;
     1113                if ((err = snd_ac97_mixer(chip->ac97_bus, &ac97, &chip->ac97_secondary)) < 0)
     1114                        return err;
     1115        }
     1116        if ((err = snd_ctl_add(card, snd_ctl_new1(&snd_cs4281_fm_vol, chip))) < 0)
     1117                return err;
     1118        if ((err = snd_ctl_add(card, snd_ctl_new1(&snd_cs4281_pcm_vol, chip))) < 0)
     1119                return err;
     1120        return 0;
     1121}
     1122
    11701123
    11711124/*
     
    11731126 */
    11741127
    1175 static void snd_cs4281_proc_read(snd_info_entry_t *entry,
    1176                                  snd_info_buffer_t * buffer)
    1177 {
    1178     cs4281_t *chip = entry->private_data;
    1179 
    1180     snd_iprintf(buffer, "Cirrus Logic CS4281\n\n");
    1181     snd_iprintf(buffer, "Spurious half IRQs   : %u\n", chip->spurious_dhtc_irq);
    1182     snd_iprintf(buffer, "Spurious end IRQs    : %u\n", chip->spurious_dtc_irq);
    1183 }
    1184 
    1185 static long snd_cs4281_BA0_read(snd_info_entry_t *entry, void *file_private_data,
    1186                                 struct file *file, char __user *buf,
    1187                                 unsigned long count, unsigned long pos)
    1188 {
    1189     long size;
    1190     cs4281_t *chip = entry->private_data;
    1191 
    1192     size = count;
    1193     if (pos + size > CS4281_BA0_SIZE)
    1194         size = (long)CS4281_BA0_SIZE - pos;
    1195     if (size > 0) {
    1196         if (copy_to_user_fromio(buf, (char*)chip->ba0 + pos, size))
    1197             return -EFAULT;
    1198     }
    1199     return size;
    1200 }
    1201 
    1202 static long snd_cs4281_BA1_read(snd_info_entry_t *entry, void *file_private_data,
    1203                                 struct file *file, char __user *buf,
    1204                                 unsigned long count, unsigned long pos)
    1205 {
    1206     long size;
    1207     cs4281_t *chip = entry->private_data;
    1208 
    1209     size = count;
    1210     if (pos + size > CS4281_BA1_SIZE)
    1211         size = (long)CS4281_BA1_SIZE - pos;
    1212     if (size > 0) {
    1213         if (copy_to_user_fromio(buf, (char*)chip->ba1 + pos, size))
    1214             return -EFAULT;
    1215     }
    1216     return size;
     1128static void snd_cs4281_proc_read(struct snd_info_entry *entry,
     1129                                  struct snd_info_buffer *buffer)
     1130{
     1131        struct cs4281 *chip = entry->private_data;
     1132
     1133        snd_iprintf(buffer, "Cirrus Logic CS4281\n\n");
     1134        snd_iprintf(buffer, "Spurious half IRQs   : %u\n", chip->spurious_dhtc_irq);
     1135        snd_iprintf(buffer, "Spurious end IRQs    : %u\n", chip->spurious_dtc_irq);
     1136}
     1137
     1138static long snd_cs4281_BA0_read(struct snd_info_entry *entry,
     1139                                void *file_private_data,
     1140                                struct file *file, char __user *buf,
     1141                                unsigned long count, unsigned long pos)
     1142{
     1143        long size;
     1144        struct cs4281 *chip = entry->private_data;
     1145       
     1146        size = count;
     1147        if (pos + size > CS4281_BA0_SIZE)
     1148                size = (long)CS4281_BA0_SIZE - pos;
     1149        if (size > 0) {
     1150                if (copy_to_user_fromio(buf, chip->ba0 + pos, size))
     1151                        return -EFAULT;
     1152        }
     1153        return size;
     1154}
     1155
     1156static long snd_cs4281_BA1_read(struct snd_info_entry *entry,
     1157                                void *file_private_data,
     1158                                struct file *file, char __user *buf,
     1159                                unsigned long count, unsigned long pos)
     1160{
     1161        long size;
     1162        struct cs4281 *chip = entry->private_data;
     1163       
     1164        size = count;
     1165        if (pos + size > CS4281_BA1_SIZE)
     1166                size = (long)CS4281_BA1_SIZE - pos;
     1167        if (size > 0) {
     1168                if (copy_to_user_fromio(buf, chip->ba1 + pos, size))
     1169                        return -EFAULT;
     1170        }
     1171        return size;
    12171172}
    12181173
     
    12251180};
    12261181
    1227 static void __devinit snd_cs4281_proc_init(cs4281_t * chip)
    1228 {
    1229     snd_info_entry_t *entry;
    1230 
    1231     if (! snd_card_proc_new(chip->card, "cs4281", &entry))
    1232         snd_info_set_text_ops(entry, chip, 1024, snd_cs4281_proc_read);
    1233     if (! snd_card_proc_new(chip->card, "cs4281_BA0", &entry)) {
    1234         entry->content = SNDRV_INFO_CONTENT_DATA;
    1235         entry->private_data = chip;
    1236         entry->c.ops = &snd_cs4281_proc_ops_BA0;
    1237         entry->size = CS4281_BA0_SIZE;
    1238     }
    1239     if (! snd_card_proc_new(chip->card, "cs4281_BA1", &entry)) {
    1240         entry->content = SNDRV_INFO_CONTENT_DATA;
    1241         entry->private_data = chip;
    1242         entry->c.ops = &snd_cs4281_proc_ops_BA1;
    1243         entry->size = CS4281_BA1_SIZE;
    1244     }
     1182static void __devinit snd_cs4281_proc_init(struct cs4281 * chip)
     1183{
     1184        struct snd_info_entry *entry;
     1185
     1186        if (! snd_card_proc_new(chip->card, "cs4281", &entry))
     1187                snd_info_set_text_ops(entry, chip, snd_cs4281_proc_read);
     1188        if (! snd_card_proc_new(chip->card, "cs4281_BA0", &entry)) {
     1189                entry->content = SNDRV_INFO_CONTENT_DATA;
     1190                entry->private_data = chip;
     1191                entry->c.ops = &snd_cs4281_proc_ops_BA0;
     1192                entry->size = CS4281_BA0_SIZE;
     1193        }
     1194        if (! snd_card_proc_new(chip->card, "cs4281_BA1", &entry)) {
     1195                entry->content = SNDRV_INFO_CONTENT_DATA;
     1196                entry->private_data = chip;
     1197                entry->c.ops = &snd_cs4281_proc_ops_BA1;
     1198                entry->size = CS4281_BA1_SIZE;
     1199        }
    12451200}
    12461201
     
    12491204 */
    12501205
    1251 #ifndef LINUX_2_2
    1252 
    1253 typedef struct snd_cs4281_gameport {
    1254     struct gameport info;
    1255     cs4281_t *chip;
    1256 } cs4281_gameport_t;
     1206#if defined(CONFIG_GAMEPORT) || (defined(MODULE) && defined(CONFIG_GAMEPORT_MODULE))
    12571207
    12581208static void snd_cs4281_gameport_trigger(struct gameport *gameport)
    12591209{
    1260     cs4281_gameport_t *gp = (cs4281_gameport_t *)gameport;
    1261     cs4281_t *chip;
    1262     snd_assert(gp, return);
    1263     chip = gp->chip;
    1264     snd_cs4281_pokeBA0(chip, BA0_JSPT, 0xff);
     1210        struct cs4281 *chip = gameport_get_port_data(gameport);
     1211
     1212        snd_assert(chip, return);
     1213        snd_cs4281_pokeBA0(chip, BA0_JSPT, 0xff);
    12651214}
    12661215
    12671216static unsigned char snd_cs4281_gameport_read(struct gameport *gameport)
    12681217{
    1269     cs4281_gameport_t *gp = (cs4281_gameport_t *)gameport;
    1270     cs4281_t *chip;
    1271     snd_assert(gp, return 0);
    1272     chip = gp->chip;
    1273     return snd_cs4281_peekBA0(chip, BA0_JSPT);
     1218        struct cs4281 *chip = gameport_get_port_data(gameport);
     1219
     1220        snd_assert(chip, return 0);
     1221        return snd_cs4281_peekBA0(chip, BA0_JSPT);
    12741222}
    12751223
    12761224#ifdef COOKED_MODE
    1277 static int snd_cs4281_gameport_cooked_read(struct gameport *gameport, int *axes, int *buttons)
    1278 {
    1279     cs4281_gameport_t *gp = (cs4281_gameport_t *)gameport;
    1280     cs4281_t *chip;
    1281     unsigned js1, js2, jst;
    1282 
    1283     snd_assert(gp, return 0);
    1284     chip = gp->chip;
    1285 
    1286     js1 = snd_cs4281_peekBA0(chip, BA0_JSC1);
    1287     js2 = snd_cs4281_peekBA0(chip, BA0_JSC2);
    1288     jst = snd_cs4281_peekBA0(chip, BA0_JSPT);
    1289 
    1290     *buttons = (~jst >> 4) & 0x0F;
    1291 
    1292     axes[0] = ((js1 & JSC1_Y1V_MASK) >> JSC1_Y1V_SHIFT) & 0xFFFF;
    1293     axes[1] = ((js1 & JSC1_X1V_MASK) >> JSC1_X1V_SHIFT) & 0xFFFF;
    1294     axes[2] = ((js2 & JSC2_Y2V_MASK) >> JSC2_Y2V_SHIFT) & 0xFFFF;
    1295     axes[3] = ((js2 & JSC2_X2V_MASK) >> JSC2_X2V_SHIFT) & 0xFFFF;
    1296 
    1297     for(jst=0;jst<4;++jst)
    1298         if(axes[jst]==0xFFFF) axes[jst] = -1;
    1299     return 0;
    1300 }
     1225static int snd_cs4281_gameport_cooked_read(struct gameport *gameport,
     1226                                           int *axes, int *buttons)
     1227{
     1228        struct cs4281 *chip = gameport_get_port_data(gameport);
     1229        unsigned js1, js2, jst;
     1230       
     1231        snd_assert(chip, return 0);
     1232
     1233        js1 = snd_cs4281_peekBA0(chip, BA0_JSC1);
     1234        js2 = snd_cs4281_peekBA0(chip, BA0_JSC2);
     1235        jst = snd_cs4281_peekBA0(chip, BA0_JSPT);
     1236       
     1237        *buttons = (~jst >> 4) & 0x0F;
     1238       
     1239        axes[0] = ((js1 & JSC1_Y1V_MASK) >> JSC1_Y1V_SHIFT) & 0xFFFF;
     1240        axes[1] = ((js1 & JSC1_X1V_MASK) >> JSC1_X1V_SHIFT) & 0xFFFF;
     1241        axes[2] = ((js2 & JSC2_Y2V_MASK) >> JSC2_Y2V_SHIFT) & 0xFFFF;
     1242        axes[3] = ((js2 & JSC2_X2V_MASK) >> JSC2_X2V_SHIFT) & 0xFFFF;
     1243
     1244        for (jst = 0; jst < 4; ++jst)
     1245                if (axes[jst] == 0xFFFF) axes[jst] = -1;
     1246        return 0;
     1247}
     1248#else
     1249#define snd_cs4281_gameport_cooked_read NULL
    13011250#endif
    13021251
    13031252static int snd_cs4281_gameport_open(struct gameport *gameport, int mode)
    13041253{
    1305     switch (mode) {
     1254        switch (mode) {
    13061255#ifdef COOKED_MODE
    1307     case GAMEPORT_MODE_COOKED:
    1308         return 0;
     1256        case GAMEPORT_MODE_COOKED:
     1257                return 0;
    13091258#endif
    1310     case GAMEPORT_MODE_RAW:
    1311         return 0;
    1312     default:
    1313         return -1;
    1314     }
    1315     return 0;
    1316 }
    1317 
    1318 static void __devinit snd_cs4281_gameport(cs4281_t *chip)
    1319 {
    1320     cs4281_gameport_t *gp;
    1321     gp = kmalloc(sizeof(*gp), GFP_KERNEL);
    1322     if (! gp) {
    1323         snd_printk(KERN_ERR "cannot allocate gameport area\n");
    1324         return;
    1325     }
    1326     memset(gp, 0, sizeof(*gp));
    1327     gp->info.open = snd_cs4281_gameport_open;
    1328     gp->info.read = snd_cs4281_gameport_read;
    1329     gp->info.trigger = snd_cs4281_gameport_trigger;
    1330 #ifdef COOKED_MODE
    1331     gp->info.cooked_read = snd_cs4281_gameport_cooked_read;
    1332 #endif
    1333     gp->chip = chip;
    1334     chip->gameport = gp;
    1335 
    1336     snd_cs4281_pokeBA0(chip, BA0_JSIO, 0xFF); // ?
    1337     snd_cs4281_pokeBA0(chip, BA0_JSCTL, JSCTL_SP_MEDIUM_SLOW);
    1338     gameport_register_port(&gp->info);
    1339 }
    1340 
    1341 #endif /* !LINUX_2_2 */
    1342 
    1343 
    1344 static int snd_cs4281_free(cs4281_t *chip)
    1345 {
    1346 #ifndef LINUX_2_2
    1347     if (chip->gameport) {
    1348         gameport_unregister_port(&chip->gameport->info);
    1349         kfree(chip->gameport);
    1350     }
    1351 #endif
    1352     if (chip->irq >= 0)
    1353         synchronize_irq(chip->irq);
    1354 
    1355     /* Mask interrupts */
    1356     snd_cs4281_pokeBA0(chip, BA0_HIMR, 0x7fffffff);
    1357     /* Stop the DLL Clock logic. */
    1358     snd_cs4281_pokeBA0(chip, BA0_CLKCR1, 0);
    1359     /* Sound System Power Management - Turn Everything OFF */
    1360     snd_cs4281_pokeBA0(chip, BA0_SSPM, 0);
    1361     /* PCI interface - D3 state */
    1362     pci_set_power_state(chip->pci, 3);
    1363 
    1364     if (chip->irq >= 0)
    1365         free_irq(chip->irq, (void *)chip);
    1366     if (chip->ba0)
    1367         iounmap((void *) chip->ba0);
    1368     if (chip->ba1)
    1369         iounmap((void *) chip->ba1);
    1370     pci_release_regions(chip->pci);
    1371     kfree(chip);
    1372     return 0;
    1373 }
    1374 
    1375 static int snd_cs4281_dev_free(snd_device_t *device)
    1376 {
    1377     cs4281_t *chip = device->device_data;
    1378     return snd_cs4281_free(chip);
    1379 }
    1380 
    1381 static int snd_cs4281_chip_init(cs4281_t *chip); /* defined below */
    1382 #ifdef CONFIG_PM
    1383 static int cs4281_suspend(snd_card_t *card, unsigned int state);
    1384 static int cs4281_resume(snd_card_t *card, unsigned int state);
    1385 #endif
    1386 
    1387 static int __devinit snd_cs4281_create(snd_card_t * card,
    1388                                        struct pci_dev *pci,
    1389                                        cs4281_t ** rchip,
    1390                                        int dual_codec)
    1391 {
    1392     cs4281_t *chip;
    1393     unsigned int tmp;
    1394     int err;
    1395 #ifdef TARGET_OS2
    1396     static snd_device_ops_t ops = {
    1397         snd_cs4281_dev_free,0,0,0
    1398     };
     1259        case GAMEPORT_MODE_RAW:
     1260                return 0;
     1261        default:
     1262                return -1;
     1263        }
     1264        return 0;
     1265}
     1266
     1267static int __devinit snd_cs4281_create_gameport(struct cs4281 *chip)
     1268{
     1269        struct gameport *gp;
     1270
     1271        chip->gameport = gp = gameport_allocate_port();
     1272        if (!gp) {
     1273                printk(KERN_ERR "cs4281: cannot allocate memory for gameport\n");
     1274                return -ENOMEM;
     1275        }
     1276
     1277        gameport_set_name(gp, "CS4281 Gameport");
     1278        gameport_set_phys(gp, "pci%s/gameport0", pci_name(chip->pci));
     1279        gameport_set_dev_parent(gp, &chip->pci->dev);
     1280        gp->open = snd_cs4281_gameport_open;
     1281        gp->read = snd_cs4281_gameport_read;
     1282        gp->trigger = snd_cs4281_gameport_trigger;
     1283        gp->cooked_read = snd_cs4281_gameport_cooked_read;
     1284        gameport_set_port_data(gp, chip);
     1285
     1286        snd_cs4281_pokeBA0(chip, BA0_JSIO, 0xFF); // ?
     1287        snd_cs4281_pokeBA0(chip, BA0_JSCTL, JSCTL_SP_MEDIUM_SLOW);
     1288
     1289        gameport_register_port(gp);
     1290
     1291        return 0;
     1292}
     1293
     1294static void snd_cs4281_free_gameport(struct cs4281 *chip)
     1295{
     1296        if (chip->gameport) {
     1297                gameport_unregister_port(chip->gameport);
     1298                chip->gameport = NULL;
     1299        }
     1300}
    13991301#else
    1400     static snd_device_ops_t ops = {
    1401     dev_free:   snd_cs4281_dev_free,
    1402     };
    1403 #endif
    1404 
    1405     *rchip = NULL;
    1406     if ((err = pci_enable_device(pci)) < 0)
    1407         return err;
    1408     chip = kcalloc(1, sizeof(*chip), GFP_KERNEL);
    1409     if (chip == NULL)
    1410         return -ENOMEM;
    1411     spin_lock_init(&chip->reg_lock);
    1412     chip->card = card;
    1413     chip->pci = pci;
    1414     chip->irq = -1;
    1415     pci_set_master(pci);
    1416     if (dual_codec < 0 || dual_codec > 3) {
    1417         snd_printk(KERN_ERR "invalid snd_dual_codec option %d\n", dual_codec);
    1418         dual_codec = 0;
    1419     }
    1420     chip->dual_codec = dual_codec;
    1421 
    1422     if ((err = pci_request_regions(pci, "CS4281")) < 0) {
    1423         kfree(chip);
    1424         return err;
    1425     }
    1426     chip->ba0_addr = pci_resource_start(pci, 0);
    1427     chip->ba1_addr = pci_resource_start(pci, 1);
    1428     chip->ba0 = (unsigned long) ioremap_nocache(chip->ba0_addr, pci_resource_len(pci, 0));
    1429     chip->ba1 = (unsigned long) ioremap_nocache(chip->ba1_addr, pci_resource_len(pci, 1));
    1430     if (!chip->ba0 || !chip->ba1) {
    1431         snd_cs4281_free(chip);
    1432         return -ENOMEM;
    1433     }
    1434 
    1435     if (request_irq(pci->irq, snd_cs4281_interrupt, SA_INTERRUPT|SA_SHIRQ, "CS4281", (void *)chip)) {
    1436         snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq);
    1437         snd_cs4281_free(chip);
    1438         return -ENOMEM;
    1439     }
    1440     chip->irq = pci->irq;
    1441 
    1442     tmp = snd_cs4281_chip_init(chip);
    1443     if(tmp) {
    1444         snd_cs4281_free(chip);
    1445         return tmp;
    1446     }
    1447 
    1448     snd_cs4281_proc_init(chip);
    1449 
    1450     snd_card_set_pm_callback(card, cs4281_suspend, cs4281_resume, chip);
    1451 
    1452     if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) {
    1453         snd_cs4281_free(chip);
    1454         return err;
    1455     }
    1456 
    1457     *rchip = chip;
    1458     return 0;
    1459 }
    1460 
    1461 static int snd_cs4281_chip_init(cs4281_t *chip)
    1462 {
    1463     unsigned int tmp;
    1464     unsigned long end_time;
    1465     int retry_count = 2;
    1466 
    1467     /* Having EPPMC.FPDN=1 prevent proper chip initialisation */
    1468     tmp = snd_cs4281_peekBA0(chip, BA0_EPPMC);
    1469     if (tmp & BA0_EPPMC_FPDN)
    1470         snd_cs4281_pokeBA0(chip, BA0_EPPMC, tmp & ~BA0_EPPMC_FPDN);
    1471 __retry:
    1472     tmp = snd_cs4281_peekBA0(chip, BA0_CFLR);
    1473     if (tmp != BA0_CFLR_DEFAULT) {
    1474         snd_cs4281_pokeBA0(chip, BA0_CFLR, BA0_CFLR_DEFAULT);
    1475         tmp = snd_cs4281_peekBA0(chip, BA0_CFLR);
    1476         if (tmp != BA0_CFLR_DEFAULT) {
    1477             snd_printk(KERN_ERR "CFLR setup failed (0x%x)\n", tmp);
    1478             return -EIO;
    1479         }
    1480     }
    1481 
    1482     /* Set the 'Configuration Write Protect' register
    1483      * to 4281h.  Allows vendor-defined configuration
    1484      * space between 0e4h and 0ffh to be written. */
    1485     snd_cs4281_pokeBA0(chip, BA0_CWPR, 0x4281);
    1486 
    1487     if ((tmp = snd_cs4281_peekBA0(chip, BA0_SERC1)) != (BA0_SERC1_SO1EN | BA0_SERC1_AC97)) {
    1488         snd_printk(KERN_ERR "SERC1 AC'97 check failed (0x%x)\n", tmp);
    1489         return -EIO;
    1490     }
    1491     if ((tmp = snd_cs4281_peekBA0(chip, BA0_SERC2)) != (BA0_SERC2_SI1EN | BA0_SERC2_AC97)) {
    1492         snd_printk(KERN_ERR "SERC2 AC'97 check failed (0x%x)\n", tmp);
    1493         return -EIO;
    1494     }
    1495 
    1496     /* Sound System Power Management */
    1497     snd_cs4281_pokeBA0(chip, BA0_SSPM, BA0_SSPM_MIXEN | BA0_SSPM_CSRCEN |
    1498                        BA0_SSPM_PSRCEN | BA0_SSPM_JSEN |
    1499                        BA0_SSPM_ACLEN | BA0_SSPM_FMEN);
    1500 
    1501     /* Serial Port Power Management */
    1502     /* Blast the clock control register to zero so that the
    1503      * PLL starts out in a known state, and blast the master serial
    1504      * port control register to zero so that the serial ports also
    1505      * start out in a known state. */
    1506     snd_cs4281_pokeBA0(chip, BA0_CLKCR1, 0);
    1507     snd_cs4281_pokeBA0(chip, BA0_SERMC, 0);
    1508 
    1509     /* Make ESYN go to zero to turn off
    1510      * the Sync pulse on the AC97 link. */
    1511     snd_cs4281_pokeBA0(chip, BA0_ACCTL, 0);
    1512     udelay(50);
    1513 
    1514     /*  Drive the ARST# pin low for a minimum of 1uS (as defined in the AC97
    1515      *  spec) and then drive it high.  This is done for non AC97 modes since
    1516      *  there might be logic external to the CS4281 that uses the ARST# line
    1517      *  for a reset. */
    1518     snd_cs4281_pokeBA0(chip, BA0_SPMC, 0);
    1519     udelay(50);
    1520     snd_cs4281_pokeBA0(chip, BA0_SPMC, BA0_SPMC_RSTN);
    1521     snd_cs4281_delay(50000);
    1522 
    1523     if (chip->dual_codec)
    1524         snd_cs4281_pokeBA0(chip, BA0_SPMC, BA0_SPMC_RSTN | BA0_SPMC_ASDI2E);
    1525 
    1526     /*
    1527      *  Set the serial port timing configuration.
    1528      */
    1529     snd_cs4281_pokeBA0(chip, BA0_SERMC,
    1530                        (chip->dual_codec ? BA0_SERMC_TCID(chip->dual_codec) : BA0_SERMC_TCID(1)) |
    1531                        BA0_SERMC_PTC_AC97 | BA0_SERMC_MSPE);
    1532 
    1533     /*
    1534      *  Start the DLL Clock logic.
    1535      */
    1536     snd_cs4281_pokeBA0(chip, BA0_CLKCR1, BA0_CLKCR1_DLLP);
    1537     snd_cs4281_delay(50000);
    1538     snd_cs4281_pokeBA0(chip, BA0_CLKCR1, BA0_CLKCR1_SWCE | BA0_CLKCR1_DLLP);
    1539 
    1540     /*
    1541      * Wait for the DLL ready signal from the clock logic.
    1542      */
    1543     end_time = jiffies + HZ;
    1544     do {
    1545         /*
    1546          *  Read the AC97 status register to see if we've seen a CODEC
    1547          *  signal from the AC97 codec.
    1548          */
    1549         if (snd_cs4281_peekBA0(chip, BA0_CLKCR1) & BA0_CLKCR1_DLLRDY)
    1550             goto __ok0;
    1551         schedule_timeout_uninterruptible(1);
    1552     } while (time_after_eq(end_time, jiffies));
    1553 
    1554     snd_printk(KERN_ERR "DLLRDY not seen\n");
    1555     return -EIO;
    1556 
    1557 __ok0:
    1558 
    1559     /*
    1560      *  The first thing we do here is to enable sync generation.  As soon
    1561      *  as we start receiving bit clock, we'll start producing the SYNC
    1562      *  signal.
    1563      */
    1564     snd_cs4281_pokeBA0(chip, BA0_ACCTL, BA0_ACCTL_ESYN);
    1565 
    1566     /*
    1567      * Wait for the codec ready signal from the AC97 codec.
    1568      */
    1569     end_time = jiffies + HZ;
    1570     do {
    1571         /*
    1572          *  Read the AC97 status register to see if we've seen a CODEC
    1573          *  signal from the AC97 codec.
    1574          */
    1575         if (snd_cs4281_peekBA0(chip, BA0_ACSTS) & BA0_ACSTS_CRDY)
    1576             goto __ok1;
    1577         schedule_timeout_uninterruptible(1);
    1578     } while (time_after_eq(end_time, jiffies));
    1579 
    1580     snd_printk(KERN_ERR "never read codec ready from AC'97 (0x%x)\n", snd_cs4281_peekBA0(chip, BA0_ACSTS));
    1581     return -EIO;
    1582 
    1583 __ok1:
    1584     if (chip->dual_codec) {
    1585         end_time = jiffies + HZ;
    1586         do {
    1587             if (snd_cs4281_peekBA0(chip, BA0_ACSTS2) & BA0_ACSTS_CRDY)
    1588                 goto __codec2_ok;
    1589             schedule_timeout_uninterruptible(1);
    1590         } while (time_after_eq(end_time, jiffies));
    1591         snd_printk(KERN_INFO "secondary codec doesn't respond. disable it...\n");
    1592         chip->dual_codec = 0;
    1593     __codec2_ok: ;
    1594     }
    1595 
    1596     /*
    1597      *  Assert the valid frame signal so that we can start sending commands
    1598      *  to the AC97 codec.
    1599      */
    1600 
    1601     snd_cs4281_pokeBA0(chip, BA0_ACCTL, BA0_ACCTL_VFRM | BA0_ACCTL_ESYN);
    1602 
    1603     /*
    1604      *  Wait until we've sampled input slots 3 and 4 as valid, meaning that
    1605      *  the codec is pumping ADC data across the AC-link.
    1606      */
    1607     end_time = jiffies + HZ;
    1608     do {
    1609         /*
    1610          *  Read the input slot valid register and see if input slots 3
    1611          *  4 are valid yet.
    1612          */
    1613         if ((snd_cs4281_peekBA0(chip, BA0_ACISV) & (BA0_ACISV_SLV(3) | BA0_ACISV_SLV(4))) == (BA0_ACISV_SLV(3) | BA0_ACISV_SLV(4)))
    1614             goto __ok2;
    1615         schedule_timeout_uninterruptible(1);
    1616     } while (time_after_eq(end_time, jiffies));
    1617 
    1618     if (--retry_count > 0)
    1619         goto __retry;
    1620     snd_printk(KERN_ERR "never read ISV3 and ISV4 from AC'97\n");
    1621     return -EIO;
    1622 
    1623 __ok2:
    1624 
    1625     /*
    1626      *  Now, assert valid frame and the slot 3 and 4 valid bits.  This will
    1627      *  commense the transfer of digital audio data to the AC97 codec.
    1628      */
    1629     snd_cs4281_pokeBA0(chip, BA0_ACOSV, BA0_ACOSV_SLV(3) | BA0_ACOSV_SLV(4));
    1630 
    1631     /*
    1632      *  Initialize DMA structures
    1633      */
    1634     for (tmp = 0; tmp < 4; tmp++) {
    1635         cs4281_dma_t *dma = &chip->dma[tmp];
    1636         dma->regDBA = BA0_DBA0 + (tmp * 0x10);
    1637         dma->regDCA = BA0_DCA0 + (tmp * 0x10);
    1638         dma->regDBC = BA0_DBC0 + (tmp * 0x10);
    1639         dma->regDCC = BA0_DCC0 + (tmp * 0x10);
    1640         dma->regDMR = BA0_DMR0 + (tmp * 8);
    1641         dma->regDCR = BA0_DCR0 + (tmp * 8);
    1642         dma->regHDSR = BA0_HDSR0 + (tmp * 4);
    1643         dma->regFCR = BA0_FCR0 + (tmp * 4);
    1644         dma->regFSIC = BA0_FSIC0 + (tmp * 4);
    1645         dma->fifo_offset = tmp * CS4281_FIFO_SIZE;
    1646 
    1647         snd_cs4281_pokeBA0(chip, dma->regFCR,
    1648                            BA0_FCR_LS(31) |
    1649                            BA0_FCR_RS(31) |
    1650                            BA0_FCR_SZ(CS4281_FIFO_SIZE) |
    1651                            BA0_FCR_OF(dma->fifo_offset));
    1652     }
    1653 
    1654     chip->src_left_play_slot = 0;       /* AC'97 left PCM playback (3) */
    1655     chip->src_right_play_slot = 1;      /* AC'97 right PCM playback (4) */
    1656     chip->src_left_rec_slot = 10;       /* AC'97 left PCM record (3) */
    1657     chip->src_right_rec_slot = 11;      /* AC'97 right PCM record (4) */
    1658 
    1659     /* Activate wave playback FIFO for FM playback */
    1660     chip->dma[0].valFCR = BA0_FCR_FEN | BA0_FCR_LS(0) |
    1661         BA0_FCR_RS(1) |
    1662         BA0_FCR_SZ(CS4281_FIFO_SIZE) |
    1663         BA0_FCR_OF(chip->dma[0].fifo_offset);
    1664     snd_cs4281_pokeBA0(chip, chip->dma[0].regFCR, chip->dma[0].valFCR);
    1665     snd_cs4281_pokeBA0(chip, BA0_SRCSA, (chip->src_left_play_slot << 0) |
    1666                        (chip->src_right_play_slot << 8) |
    1667                        (chip->src_left_rec_slot << 16) |
    1668                        (chip->src_right_rec_slot << 24));
    1669 
    1670     /* Initialize digital volume */
    1671     snd_cs4281_pokeBA0(chip, BA0_PPLVC, 0);
    1672     snd_cs4281_pokeBA0(chip, BA0_PPRVC, 0);
    1673 
    1674     /* Enable IRQs */
    1675     snd_cs4281_pokeBA0(chip, BA0_HICR, BA0_HICR_EOI);
    1676     /* Unmask interrupts */
    1677     snd_cs4281_pokeBA0(chip, BA0_HIMR, 0x7fffffff & ~(
    1678                                                       BA0_HISR_MIDI |
    1679                                                       BA0_HISR_DMAI |
    1680                                                       BA0_HISR_DMA(0) |
    1681                                                       BA0_HISR_DMA(1) |
    1682                                                       BA0_HISR_DMA(2) |
    1683                                                       BA0_HISR_DMA(3)));
    1684     synchronize_irq(chip->irq);
    1685 
    1686     return 0;
     1302static inline int snd_cs4281_create_gameport(struct cs4281 *chip) { return -ENOSYS; }
     1303static inline void snd_cs4281_free_gameport(struct cs4281 *chip) { }
     1304#endif /* CONFIG_GAMEPORT || (MODULE && CONFIG_GAMEPORT_MODULE) */
     1305
     1306static int snd_cs4281_free(struct cs4281 *chip)
     1307{
     1308        snd_cs4281_free_gameport(chip);
     1309
     1310        if (chip->irq >= 0)
     1311                synchronize_irq(chip->irq);
     1312
     1313        /* Mask interrupts */
     1314        snd_cs4281_pokeBA0(chip, BA0_HIMR, 0x7fffffff);
     1315        /* Stop the DLL Clock logic. */
     1316        snd_cs4281_pokeBA0(chip, BA0_CLKCR1, 0);
     1317        /* Sound System Power Management - Turn Everything OFF */
     1318        snd_cs4281_pokeBA0(chip, BA0_SSPM, 0);
     1319        /* PCI interface - D3 state */
     1320        pci_set_power_state(chip->pci, 3);
     1321
     1322        if (chip->irq >= 0)
     1323                free_irq(chip->irq, chip);
     1324        if (chip->ba0)
     1325                iounmap(chip->ba0);
     1326        if (chip->ba1)
     1327                iounmap(chip->ba1);
     1328        pci_release_regions(chip->pci);
     1329        pci_disable_device(chip->pci);
     1330
     1331        kfree(chip);
     1332        return 0;
     1333}
     1334
     1335static int snd_cs4281_dev_free(struct snd_device *device)
     1336{
     1337        struct cs4281 *chip = device->device_data;
     1338        return snd_cs4281_free(chip);
     1339}
     1340
     1341static int snd_cs4281_chip_init(struct cs4281 *chip); /* defined below */
     1342
     1343static int __devinit snd_cs4281_create(struct snd_card *card,
     1344                                       struct pci_dev *pci,
     1345                                       struct cs4281 ** rchip,
     1346                                       int dual_codec)
     1347{
     1348        struct cs4281 *chip;
     1349        unsigned int tmp;
     1350        int err;
     1351        static struct snd_device_ops ops = {
     1352                .dev_free =     snd_cs4281_dev_free,
     1353        };
     1354
     1355        *rchip = NULL;
     1356        if ((err = pci_enable_device(pci)) < 0)
     1357                return err;
     1358        chip = kzalloc(sizeof(*chip), GFP_KERNEL);
     1359        if (chip == NULL) {
     1360                pci_disable_device(pci);
     1361                return -ENOMEM;
     1362        }
     1363        spin_lock_init(&chip->reg_lock);
     1364        chip->card = card;
     1365        chip->pci = pci;
     1366        chip->irq = -1;
     1367        pci_set_master(pci);
     1368        if (dual_codec < 0 || dual_codec > 3) {
     1369                snd_printk(KERN_ERR "invalid dual_codec option %d\n", dual_codec);
     1370                dual_codec = 0;
     1371        }
     1372        chip->dual_codec = dual_codec;
     1373
     1374        if ((err = pci_request_regions(pci, "CS4281")) < 0) {
     1375                kfree(chip);
     1376                pci_disable_device(pci);
     1377                return err;
     1378        }
     1379        chip->ba0_addr = pci_resource_start(pci, 0);
     1380        chip->ba1_addr = pci_resource_start(pci, 1);
     1381
     1382        chip->ba0 = ioremap_nocache(chip->ba0_addr, pci_resource_len(pci, 0));
     1383        chip->ba1 = ioremap_nocache(chip->ba1_addr, pci_resource_len(pci, 1));
     1384        if (!chip->ba0 || !chip->ba1) {
     1385                snd_cs4281_free(chip);
     1386                return -ENOMEM;
     1387        }
     1388       
     1389        if (request_irq(pci->irq, snd_cs4281_interrupt, IRQF_SHARED,
     1390                        "CS4281", chip)) {
     1391                snd_printk(KERN_ERR "unable to grab IRQ %d\n", pci->irq);
     1392                snd_cs4281_free(chip);
     1393                return -ENOMEM;
     1394        }
     1395        chip->irq = pci->irq;
     1396
     1397        tmp = snd_cs4281_chip_init(chip);
     1398        if (tmp) {
     1399                snd_cs4281_free(chip);
     1400                return tmp;
     1401        }
     1402
     1403        if ((err = snd_device_new(card, SNDRV_DEV_LOWLEVEL, chip, &ops)) < 0) {
     1404                snd_cs4281_free(chip);
     1405                return err;
     1406        }
     1407
     1408        snd_cs4281_proc_init(chip);
     1409
     1410        snd_card_set_dev(card, &pci->dev);
     1411
     1412        *rchip = chip;
     1413        return 0;
     1414}
     1415
     1416static int snd_cs4281_chip_init(struct cs4281 *chip)
     1417{
     1418        unsigned int tmp;
     1419        unsigned long end_time;
     1420        int retry_count = 2;
     1421
     1422        /* Having EPPMC.FPDN=1 prevent proper chip initialisation */
     1423        tmp = snd_cs4281_peekBA0(chip, BA0_EPPMC);
     1424        if (tmp & BA0_EPPMC_FPDN)
     1425                snd_cs4281_pokeBA0(chip, BA0_EPPMC, tmp & ~BA0_EPPMC_FPDN);
     1426
     1427      __retry:
     1428        tmp = snd_cs4281_peekBA0(chip, BA0_CFLR);
     1429        if (tmp != BA0_CFLR_DEFAULT) {
     1430                snd_cs4281_pokeBA0(chip, BA0_CFLR, BA0_CFLR_DEFAULT);
     1431                tmp = snd_cs4281_peekBA0(chip, BA0_CFLR);
     1432                if (tmp != BA0_CFLR_DEFAULT) {
     1433                        snd_printk(KERN_ERR "CFLR setup failed (0x%x)\n", tmp);
     1434                        return -EIO;
     1435                }
     1436        }
     1437
     1438        /* Set the 'Configuration Write Protect' register
     1439         * to 4281h.  Allows vendor-defined configuration
     1440         * space between 0e4h and 0ffh to be written. */       
     1441        snd_cs4281_pokeBA0(chip, BA0_CWPR, 0x4281);
     1442       
     1443        if ((tmp = snd_cs4281_peekBA0(chip, BA0_SERC1)) != (BA0_SERC1_SO1EN | BA0_SERC1_AC97)) {
     1444                snd_printk(KERN_ERR "SERC1 AC'97 check failed (0x%x)\n", tmp);
     1445                return -EIO;
     1446        }
     1447        if ((tmp = snd_cs4281_peekBA0(chip, BA0_SERC2)) != (BA0_SERC2_SI1EN | BA0_SERC2_AC97)) {
     1448                snd_printk(KERN_ERR "SERC2 AC'97 check failed (0x%x)\n", tmp);
     1449                return -EIO;
     1450        }
     1451
     1452        /* Sound System Power Management */
     1453        snd_cs4281_pokeBA0(chip, BA0_SSPM, BA0_SSPM_MIXEN | BA0_SSPM_CSRCEN |
     1454                                           BA0_SSPM_PSRCEN | BA0_SSPM_JSEN |
     1455                                           BA0_SSPM_ACLEN | BA0_SSPM_FMEN);
     1456
     1457        /* Serial Port Power Management */
     1458        /* Blast the clock control register to zero so that the
     1459         * PLL starts out in a known state, and blast the master serial
     1460         * port control register to zero so that the serial ports also
     1461         * start out in a known state. */
     1462        snd_cs4281_pokeBA0(chip, BA0_CLKCR1, 0);
     1463        snd_cs4281_pokeBA0(chip, BA0_SERMC, 0);
     1464
     1465        /* Make ESYN go to zero to turn off
     1466         * the Sync pulse on the AC97 link. */
     1467        snd_cs4281_pokeBA0(chip, BA0_ACCTL, 0);
     1468        udelay(50);
     1469               
     1470        /*  Drive the ARST# pin low for a minimum of 1uS (as defined in the AC97
     1471         *  spec) and then drive it high.  This is done for non AC97 modes since
     1472         *  there might be logic external to the CS4281 that uses the ARST# line
     1473         *  for a reset. */
     1474        snd_cs4281_pokeBA0(chip, BA0_SPMC, 0);
     1475        udelay(50);
     1476        snd_cs4281_pokeBA0(chip, BA0_SPMC, BA0_SPMC_RSTN);
     1477        msleep(50);
     1478
     1479        if (chip->dual_codec)
     1480                snd_cs4281_pokeBA0(chip, BA0_SPMC, BA0_SPMC_RSTN | BA0_SPMC_ASDI2E);
     1481
     1482        /*
     1483         *  Set the serial port timing configuration.
     1484         */
     1485        snd_cs4281_pokeBA0(chip, BA0_SERMC,
     1486                           (chip->dual_codec ? BA0_SERMC_TCID(chip->dual_codec) : BA0_SERMC_TCID(1)) |
     1487                           BA0_SERMC_PTC_AC97 | BA0_SERMC_MSPE);
     1488
     1489        /*
     1490         *  Start the DLL Clock logic.
     1491         */
     1492        snd_cs4281_pokeBA0(chip, BA0_CLKCR1, BA0_CLKCR1_DLLP);
     1493        msleep(50);
     1494        snd_cs4281_pokeBA0(chip, BA0_CLKCR1, BA0_CLKCR1_SWCE | BA0_CLKCR1_DLLP);
     1495
     1496        /*
     1497         * Wait for the DLL ready signal from the clock logic.
     1498         */
     1499        end_time = jiffies + HZ;
     1500        do {
     1501                /*
     1502                 *  Read the AC97 status register to see if we've seen a CODEC
     1503                 *  signal from the AC97 codec.
     1504                 */
     1505                if (snd_cs4281_peekBA0(chip, BA0_CLKCR1) & BA0_CLKCR1_DLLRDY)
     1506                        goto __ok0;
     1507                schedule_timeout_uninterruptible(1);
     1508        } while (time_after_eq(end_time, jiffies));
     1509
     1510        snd_printk(KERN_ERR "DLLRDY not seen\n");
     1511        return -EIO;
     1512
     1513      __ok0:
     1514
     1515        /*
     1516         *  The first thing we do here is to enable sync generation.  As soon
     1517         *  as we start receiving bit clock, we'll start producing the SYNC
     1518         *  signal.
     1519         */
     1520        snd_cs4281_pokeBA0(chip, BA0_ACCTL, BA0_ACCTL_ESYN);
     1521
     1522        /*
     1523         * Wait for the codec ready signal from the AC97 codec.
     1524         */
     1525        end_time = jiffies + HZ;
     1526        do {
     1527                /*
     1528                 *  Read the AC97 status register to see if we've seen a CODEC
     1529                 *  signal from the AC97 codec.
     1530                 */
     1531                if (snd_cs4281_peekBA0(chip, BA0_ACSTS) & BA0_ACSTS_CRDY)
     1532                        goto __ok1;
     1533                schedule_timeout_uninterruptible(1);
     1534        } while (time_after_eq(end_time, jiffies));
     1535
     1536        snd_printk(KERN_ERR "never read codec ready from AC'97 (0x%x)\n", snd_cs4281_peekBA0(chip, BA0_ACSTS));
     1537        return -EIO;
     1538
     1539      __ok1:
     1540        if (chip->dual_codec) {
     1541                end_time = jiffies + HZ;
     1542                do {
     1543                        if (snd_cs4281_peekBA0(chip, BA0_ACSTS2) & BA0_ACSTS_CRDY)
     1544                                goto __codec2_ok;
     1545                        schedule_timeout_uninterruptible(1);
     1546                } while (time_after_eq(end_time, jiffies));
     1547                snd_printk(KERN_INFO "secondary codec doesn't respond. disable it...\n");
     1548                chip->dual_codec = 0;
     1549        __codec2_ok: ;
     1550        }
     1551
     1552        /*
     1553         *  Assert the valid frame signal so that we can start sending commands
     1554         *  to the AC97 codec.
     1555         */
     1556
     1557        snd_cs4281_pokeBA0(chip, BA0_ACCTL, BA0_ACCTL_VFRM | BA0_ACCTL_ESYN);
     1558
     1559        /*
     1560         *  Wait until we've sampled input slots 3 and 4 as valid, meaning that
     1561         *  the codec is pumping ADC data across the AC-link.
     1562         */
     1563
     1564        end_time = jiffies + HZ;
     1565        do {
     1566                /*
     1567                 *  Read the input slot valid register and see if input slots 3
     1568                 *  4 are valid yet.
     1569                 */
     1570                if ((snd_cs4281_peekBA0(chip, BA0_ACISV) & (BA0_ACISV_SLV(3) | BA0_ACISV_SLV(4))) == (BA0_ACISV_SLV(3) | BA0_ACISV_SLV(4)))
     1571                        goto __ok2;
     1572                schedule_timeout_uninterruptible(1);
     1573        } while (time_after_eq(end_time, jiffies));
     1574
     1575        if (--retry_count > 0)
     1576                goto __retry;
     1577        snd_printk(KERN_ERR "never read ISV3 and ISV4 from AC'97\n");
     1578        return -EIO;
     1579
     1580      __ok2:
     1581
     1582        /*
     1583         *  Now, assert valid frame and the slot 3 and 4 valid bits.  This will
     1584         *  commense the transfer of digital audio data to the AC97 codec.
     1585         */
     1586        snd_cs4281_pokeBA0(chip, BA0_ACOSV, BA0_ACOSV_SLV(3) | BA0_ACOSV_SLV(4));
     1587
     1588        /*
     1589         *  Initialize DMA structures
     1590         */
     1591        for (tmp = 0; tmp < 4; tmp++) {
     1592                struct cs4281_dma *dma = &chip->dma[tmp];
     1593                dma->regDBA = BA0_DBA0 + (tmp * 0x10);
     1594                dma->regDCA = BA0_DCA0 + (tmp * 0x10);
     1595                dma->regDBC = BA0_DBC0 + (tmp * 0x10);
     1596                dma->regDCC = BA0_DCC0 + (tmp * 0x10);
     1597                dma->regDMR = BA0_DMR0 + (tmp * 8);
     1598                dma->regDCR = BA0_DCR0 + (tmp * 8);
     1599                dma->regHDSR = BA0_HDSR0 + (tmp * 4);
     1600                dma->regFCR = BA0_FCR0 + (tmp * 4);
     1601                dma->regFSIC = BA0_FSIC0 + (tmp * 4);
     1602                dma->fifo_offset = tmp * CS4281_FIFO_SIZE;
     1603                snd_cs4281_pokeBA0(chip, dma->regFCR,
     1604                                   BA0_FCR_LS(31) |
     1605                                   BA0_FCR_RS(31) |
     1606                                   BA0_FCR_SZ(CS4281_FIFO_SIZE) |
     1607                                   BA0_FCR_OF(dma->fifo_offset));
     1608        }
     1609
     1610        chip->src_left_play_slot = 0;   /* AC'97 left PCM playback (3) */
     1611        chip->src_right_play_slot = 1;  /* AC'97 right PCM playback (4) */
     1612        chip->src_left_rec_slot = 10;   /* AC'97 left PCM record (3) */
     1613        chip->src_right_rec_slot = 11;  /* AC'97 right PCM record (4) */
     1614
     1615        /* Activate wave playback FIFO for FM playback */
     1616        chip->dma[0].valFCR = BA0_FCR_FEN | BA0_FCR_LS(0) |
     1617                              BA0_FCR_RS(1) |
     1618                              BA0_FCR_SZ(CS4281_FIFO_SIZE) |
     1619                              BA0_FCR_OF(chip->dma[0].fifo_offset);
     1620        snd_cs4281_pokeBA0(chip, chip->dma[0].regFCR, chip->dma[0].valFCR);
     1621        snd_cs4281_pokeBA0(chip, BA0_SRCSA, (chip->src_left_play_slot << 0) |
     1622                                            (chip->src_right_play_slot << 8) |
     1623                                            (chip->src_left_rec_slot << 16) |
     1624                                            (chip->src_right_rec_slot << 24));
     1625
     1626        /* Initialize digital volume */
     1627        snd_cs4281_pokeBA0(chip, BA0_PPLVC, 0);
     1628        snd_cs4281_pokeBA0(chip, BA0_PPRVC, 0);
     1629
     1630        /* Enable IRQs */
     1631        snd_cs4281_pokeBA0(chip, BA0_HICR, BA0_HICR_EOI);
     1632        /* Unmask interrupts */
     1633        snd_cs4281_pokeBA0(chip, BA0_HIMR, 0x7fffffff & ~(
     1634                                        BA0_HISR_MIDI |
     1635                                        BA0_HISR_DMAI |
     1636                                        BA0_HISR_DMA(0) |
     1637                                        BA0_HISR_DMA(1) |
     1638                                        BA0_HISR_DMA(2) |
     1639                                        BA0_HISR_DMA(3)));
     1640        synchronize_irq(chip->irq);
     1641
     1642        return 0;
    16871643}
    16881644
     
    16911647 */
    16921648
    1693 static void snd_cs4281_midi_reset(cs4281_t *chip)
    1694 {
    1695     snd_cs4281_pokeBA0(chip, BA0_MIDCR, chip->midcr | BA0_MIDCR_MRST);
    1696     udelay(100);
    1697     snd_cs4281_pokeBA0(chip, BA0_MIDCR, chip->midcr);
    1698 }
    1699 
    1700 static int snd_cs4281_midi_input_open(snd_rawmidi_substream_t * substream)
    1701 {
    1702     cs4281_t *chip = substream->rmidi->private_data;
    1703 
    1704     spin_lock_irq(&chip->reg_lock);
    1705     chip->midcr |= BA0_MIDCR_RXE;
    1706     chip->midi_output = substream;
    1707     if (!(chip->uartm & CS4281_MODE_OUTPUT)) {
    1708         snd_cs4281_midi_reset(chip);
    1709     } else {
    1710         snd_cs4281_pokeBA0(chip, BA0_MIDCR, chip->midcr);
    1711     }
    1712     spin_unlock_irq(&chip->reg_lock);
    1713     return 0;
    1714 }
    1715 
    1716 static int snd_cs4281_midi_input_close(snd_rawmidi_substream_t * substream)
    1717 {
    1718     cs4281_t *chip = substream->rmidi->private_data;
    1719 
    1720     spin_lock_irq(&chip->reg_lock);
    1721     chip->midcr &= ~(BA0_MIDCR_RXE | BA0_MIDCR_RIE);
    1722     chip->midi_input = NULL;
    1723     if (!(chip->uartm & CS4281_MODE_OUTPUT)) {
    1724         snd_cs4281_midi_reset(chip);
    1725     } else {
    1726         snd_cs4281_pokeBA0(chip, BA0_MIDCR, chip->midcr);
    1727     }
    1728     chip->uartm &= ~CS4281_MODE_INPUT;
    1729     spin_unlock_irq(&chip->reg_lock);
    1730     return 0;
    1731 }
    1732 
    1733 static int snd_cs4281_midi_output_open(snd_rawmidi_substream_t * substream)
    1734 {
    1735     cs4281_t *chip = substream->rmidi->private_data;
    1736 
    1737     spin_lock_irq(&chip->reg_lock);
    1738     chip->uartm |= CS4281_MODE_OUTPUT;
    1739     chip->midcr |= BA0_MIDCR_TXE;
    1740     chip->midi_input = substream;
    1741     if (!(chip->uartm & CS4281_MODE_INPUT)) {
    1742         snd_cs4281_midi_reset(chip);
    1743     } else {
    1744         snd_cs4281_pokeBA0(chip, BA0_MIDCR, chip->midcr);
    1745     }
    1746     spin_unlock_irq(&chip->reg_lock);
    1747     return 0;
    1748 }
    1749 
    1750 static int snd_cs4281_midi_output_close(snd_rawmidi_substream_t * substream)
    1751 {
    1752     cs4281_t *chip = substream->rmidi->private_data;
    1753 
    1754     spin_lock_irq(&chip->reg_lock);
    1755     chip->midcr &= ~(BA0_MIDCR_TXE | BA0_MIDCR_TIE);
    1756     chip->midi_output = NULL;
    1757     if (!(chip->uartm & CS4281_MODE_INPUT)) {
    1758         snd_cs4281_midi_reset(chip);
    1759     } else {
    1760         snd_cs4281_pokeBA0(chip, BA0_MIDCR, chip->midcr);
    1761     }
    1762     chip->uartm &= ~CS4281_MODE_OUTPUT;
    1763     spin_unlock_irq(&chip->reg_lock);
    1764     return 0;
    1765 }
    1766 
    1767 static void snd_cs4281_midi_input_trigger(snd_rawmidi_substream_t * substream, int up)
    1768 {
    1769     unsigned long flags;
    1770     cs4281_t *chip = substream->rmidi->private_data;
    1771 
    1772     spin_lock_irqsave(&chip->reg_lock, flags);
    1773     if (up) {
    1774         if ((chip->midcr & BA0_MIDCR_RIE) == 0) {
    1775             chip->midcr |= BA0_MIDCR_RIE;
    1776             snd_cs4281_pokeBA0(chip, BA0_MIDCR, chip->midcr);
    1777         }
    1778     } else {
    1779         if (chip->midcr & BA0_MIDCR_RIE) {
    1780             chip->midcr &= ~BA0_MIDCR_RIE;
    1781             snd_cs4281_pokeBA0(chip, BA0_MIDCR, chip->midcr);
    1782         }
    1783     }
    1784     spin_unlock_irqrestore(&chip->reg_lock, flags);
    1785 }
    1786 
    1787 static void snd_cs4281_midi_output_trigger(snd_rawmidi_substream_t * substream, int up)
    1788 {
    1789     unsigned long flags;
    1790     cs4281_t *chip = substream->rmidi->private_data;
    1791     unsigned char byte;
    1792 
    1793     spin_lock_irqsave(&chip->reg_lock, flags);
    1794     if (up) {
    1795         if ((chip->midcr & BA0_MIDCR_TIE) == 0) {
    1796             chip->midcr |= BA0_MIDCR_TIE;
    1797             /* fill UART FIFO buffer at first, and turn Tx interrupts only if necessary */
    1798             while ((chip->midcr & BA0_MIDCR_TIE) &&
    1799                    (snd_cs4281_peekBA0(chip, BA0_MIDSR) & BA0_MIDSR_TBF) == 0) {
    1800                 if (snd_rawmidi_transmit(substream, &byte, 1) != 1) {
    1801                     chip->midcr &= ~BA0_MIDCR_TIE;
    1802                 } else {
    1803                     snd_cs4281_pokeBA0(chip, BA0_MIDWP, byte);
    1804                 }
    1805             }
    1806             snd_cs4281_pokeBA0(chip, BA0_MIDCR, chip->midcr);
    1807         }
    1808     } else {
    1809         if (chip->midcr & BA0_MIDCR_TIE) {
    1810             chip->midcr &= ~BA0_MIDCR_TIE;
    1811             snd_cs4281_pokeBA0(chip, BA0_MIDCR, chip->midcr);
    1812         }
    1813     }
    1814     spin_unlock_irqrestore(&chip->reg_lock, flags);
     1649static void snd_cs4281_midi_reset(struct cs4281 *chip)
     1650{
     1651        snd_cs4281_pokeBA0(chip, BA0_MIDCR, chip->midcr | BA0_MIDCR_MRST);
     1652        udelay(100);
     1653        snd_cs4281_pokeBA0(chip, BA0_MIDCR, chip->midcr);
     1654}
     1655
     1656static int snd_cs4281_midi_input_open(struct snd_rawmidi_substream *substream)
     1657{
     1658        struct cs4281 *chip = substream->rmidi->private_data;
     1659
     1660        spin_lock_irq(&chip->reg_lock);
     1661        chip->midcr |= BA0_MIDCR_RXE;
     1662        chip->midi_input = substream;
     1663        if (!(chip->uartm & CS4281_MODE_OUTPUT)) {
     1664                snd_cs4281_midi_reset(chip);
     1665        } else {
     1666                snd_cs4281_pokeBA0(chip, BA0_MIDCR, chip->midcr);
     1667        }
     1668        spin_unlock_irq(&chip->reg_lock);
     1669        return 0;
     1670}
     1671
     1672static int snd_cs4281_midi_input_close(struct snd_rawmidi_substream *substream)
     1673{
     1674        struct cs4281 *chip = substream->rmidi->private_data;
     1675
     1676        spin_lock_irq(&chip->reg_lock);
     1677        chip->midcr &= ~(BA0_MIDCR_RXE | BA0_MIDCR_RIE);
     1678        chip->midi_input = NULL;
     1679        if (!(chip->uartm & CS4281_MODE_OUTPUT)) {
     1680                snd_cs4281_midi_reset(chip);
     1681        } else {
     1682                snd_cs4281_pokeBA0(chip, BA0_MIDCR, chip->midcr);
     1683        }
     1684        chip->uartm &= ~CS4281_MODE_INPUT;
     1685        spin_unlock_irq(&chip->reg_lock);
     1686        return 0;
     1687}
     1688
     1689static int snd_cs4281_midi_output_open(struct snd_rawmidi_substream *substream)
     1690{
     1691        struct cs4281 *chip = substream->rmidi->private_data;
     1692
     1693        spin_lock_irq(&chip->reg_lock);
     1694        chip->uartm |= CS4281_MODE_OUTPUT;
     1695        chip->midcr |= BA0_MIDCR_TXE;
     1696        chip->midi_output = substream;
     1697        if (!(chip->uartm & CS4281_MODE_INPUT)) {
     1698                snd_cs4281_midi_reset(chip);
     1699        } else {
     1700                snd_cs4281_pokeBA0(chip, BA0_MIDCR, chip->midcr);
     1701        }
     1702        spin_unlock_irq(&chip->reg_lock);
     1703        return 0;
     1704}
     1705
     1706static int snd_cs4281_midi_output_close(struct snd_rawmidi_substream *substream)
     1707{
     1708        struct cs4281 *chip = substream->rmidi->private_data;
     1709
     1710        spin_lock_irq(&chip->reg_lock);
     1711        chip->midcr &= ~(BA0_MIDCR_TXE | BA0_MIDCR_TIE);
     1712        chip->midi_output = NULL;
     1713        if (!(chip->uartm & CS4281_MODE_INPUT)) {
     1714                snd_cs4281_midi_reset(chip);
     1715        } else {
     1716                snd_cs4281_pokeBA0(chip, BA0_MIDCR, chip->midcr);
     1717        }
     1718        chip->uartm &= ~CS4281_MODE_OUTPUT;
     1719        spin_unlock_irq(&chip->reg_lock);
     1720        return 0;
     1721}
     1722
     1723static void snd_cs4281_midi_input_trigger(struct snd_rawmidi_substream *substream, int up)
     1724{
     1725        unsigned long flags;
     1726        struct cs4281 *chip = substream->rmidi->private_data;
     1727
     1728        spin_lock_irqsave(&chip->reg_lock, flags);
     1729        if (up) {
     1730                if ((chip->midcr & BA0_MIDCR_RIE) == 0) {
     1731                        chip->midcr |= BA0_MIDCR_RIE;
     1732                        snd_cs4281_pokeBA0(chip, BA0_MIDCR, chip->midcr);
     1733                }
     1734        } else {
     1735                if (chip->midcr & BA0_MIDCR_RIE) {
     1736                        chip->midcr &= ~BA0_MIDCR_RIE;
     1737                        snd_cs4281_pokeBA0(chip, BA0_MIDCR, chip->midcr);
     1738                }
     1739        }
     1740        spin_unlock_irqrestore(&chip->reg_lock, flags);
     1741}
     1742
     1743static void snd_cs4281_midi_output_trigger(struct snd_rawmidi_substream *substream, int up)
     1744{
     1745        unsigned long flags;
     1746        struct cs4281 *chip = substream->rmidi->private_data;
     1747        unsigned char byte;
     1748
     1749        spin_lock_irqsave(&chip->reg_lock, flags);
     1750        if (up) {
     1751                if ((chip->midcr & BA0_MIDCR_TIE) == 0) {
     1752                        chip->midcr |= BA0_MIDCR_TIE;
     1753                        /* fill UART FIFO buffer at first, and turn Tx interrupts only if necessary */
     1754                        while ((chip->midcr & BA0_MIDCR_TIE) &&
     1755                               (snd_cs4281_peekBA0(chip, BA0_MIDSR) & BA0_MIDSR_TBF) == 0) {
     1756                                if (snd_rawmidi_transmit(substream, &byte, 1) != 1) {
     1757                                        chip->midcr &= ~BA0_MIDCR_TIE;
     1758                                } else {
     1759                                        snd_cs4281_pokeBA0(chip, BA0_MIDWP, byte);
     1760                                }
     1761                        }
     1762                        snd_cs4281_pokeBA0(chip, BA0_MIDCR, chip->midcr);
     1763                }
     1764        } else {
     1765                if (chip->midcr & BA0_MIDCR_TIE) {
     1766                        chip->midcr &= ~BA0_MIDCR_TIE;
     1767                        snd_cs4281_pokeBA0(chip, BA0_MIDCR, chip->midcr);
     1768                }
     1769        }
     1770        spin_unlock_irqrestore(&chip->reg_lock, flags);
    18151771}
    18161772
    18171773static struct snd_rawmidi_ops snd_cs4281_midi_output =
    18181774{
    1819     .open =             snd_cs4281_midi_output_open,
    1820     .close =    snd_cs4281_midi_output_close,
    1821     .trigger =  snd_cs4281_midi_output_trigger,
     1775        .open =         snd_cs4281_midi_output_open,
     1776        .close =        snd_cs4281_midi_output_close,
     1777        .trigger =      snd_cs4281_midi_output_trigger,
    18221778};
    18231779
    18241780static struct snd_rawmidi_ops snd_cs4281_midi_input =
    18251781{
    1826     .open =     snd_cs4281_midi_input_open,
    1827     .close =    snd_cs4281_midi_input_close,
    1828     .trigger =  snd_cs4281_midi_input_trigger,
     1782        .open =         snd_cs4281_midi_input_open,
     1783        .close =        snd_cs4281_midi_input_close,
     1784        .trigger =      snd_cs4281_midi_input_trigger,
    18291785};
    18301786
    1831 static int __devinit snd_cs4281_midi(cs4281_t * chip, int device, snd_rawmidi_t **rrawmidi)
    1832 {
    1833     snd_rawmidi_t *rmidi;
    1834     int err;
    1835 
    1836     if (rrawmidi)
    1837         *rrawmidi = NULL;
    1838     if ((err = snd_rawmidi_new(chip->card, "CS4281", device, 1, 1, &rmidi)) < 0)
    1839         return err;
    1840     strcpy(rmidi->name, "CS4281");
    1841     snd_rawmidi_set_ops(rmidi, SNDRV_RAWMIDI_STREAM_OUTPUT, &snd_cs4281_midi_output);
    1842     snd_rawmidi_set_ops(rmidi, SNDRV_RAWMIDI_STREAM_INPUT, &snd_cs4281_midi_input);
    1843     rmidi->info_flags |= SNDRV_RAWMIDI_INFO_OUTPUT | SNDRV_RAWMIDI_INFO_INPUT | SNDRV_RAWMIDI_INFO_DUPLEX;
    1844     rmidi->private_data = chip;
    1845     chip->rmidi = rmidi;
    1846     if (rrawmidi)
    1847         *rrawmidi = rmidi;
    1848     return 0;
     1787static int __devinit snd_cs4281_midi(struct cs4281 * chip, int device,
     1788                                     struct snd_rawmidi **rrawmidi)
     1789{
     1790        struct snd_rawmidi *rmidi;
     1791        int err;
     1792
     1793        if (rrawmidi)
     1794                *rrawmidi = NULL;
     1795        if ((err = snd_rawmidi_new(chip->card, "CS4281", device, 1, 1, &rmidi)) < 0)
     1796                return err;
     1797        strcpy(rmidi->name, "CS4281");
     1798        snd_rawmidi_set_ops(rmidi, SNDRV_RAWMIDI_STREAM_OUTPUT, &snd_cs4281_midi_output);
     1799        snd_rawmidi_set_ops(rmidi, SNDRV_RAWMIDI_STREAM_INPUT, &snd_cs4281_midi_input);
     1800        rmidi->info_flags |= SNDRV_RAWMIDI_INFO_OUTPUT | SNDRV_RAWMIDI_INFO_INPUT | SNDRV_RAWMIDI_INFO_DUPLEX;
     1801        rmidi->private_data = chip;
     1802        chip->rmidi = rmidi;
     1803        if (rrawmidi)
     1804                *rrawmidi = rmidi;
     1805        return 0;
    18491806}
    18501807
     
    18531810 */
    18541811
    1855 static irqreturn_t snd_cs4281_interrupt(int irq, void *dev_id, struct pt_regs *regs)
    1856 {
    1857     cs4281_t *chip = dev_id;
    1858     unsigned int status, dma, val;
    1859     cs4281_dma_t *cdma;
    1860 
    1861     if (chip == NULL)
    1862         return IRQ_NONE;
    1863     status = snd_cs4281_peekBA0(chip, BA0_HISR);
    1864     if ((status & 0x7fffffff) == 0) {
    1865         snd_cs4281_pokeBA0(chip, BA0_HICR, BA0_HICR_EOI);
    1866         return IRQ_NONE;
    1867     }
    1868 
    1869     if (status & (BA0_HISR_DMA(0)|BA0_HISR_DMA(1)|BA0_HISR_DMA(2)|BA0_HISR_DMA(3))) {
    1870         for (dma = 0; dma < 4; dma++)
    1871             if (status & BA0_HISR_DMA(dma)) {
    1872                 cdma = &chip->dma[dma];
    1873                 spin_lock(&chip->reg_lock);
    1874                 /* ack DMA IRQ */
    1875                 val = snd_cs4281_peekBA0(chip, cdma->regHDSR);
    1876                 /* workaround, sometimes CS4281 acknowledges */
    1877                 /* end or middle transfer position twice */
    1878                 cdma->frag++;
    1879                 if ((val & BA0_HDSR_DHTC) && !(cdma->frag & 1)) {
    1880                     cdma->frag--;
    1881                     chip->spurious_dhtc_irq++;
    1882                     spin_unlock(&chip->reg_lock);
    1883                     continue;
    1884                 }
    1885                 if ((val & BA0_HDSR_DTC) && (cdma->frag & 1)) {
    1886                     cdma->frag--;
    1887                     chip->spurious_dtc_irq++;
    1888                     spin_unlock(&chip->reg_lock);
    1889                     continue;
    1890                 }
    1891                 spin_unlock(&chip->reg_lock);
    1892                 snd_pcm_period_elapsed(cdma->substream);
    1893             }
    1894     }
    1895 
    1896     if ((status & BA0_HISR_MIDI) && chip->rmidi) {
    1897         unsigned char c;
    1898 
    1899         spin_lock(&chip->reg_lock);
    1900         while ((snd_cs4281_peekBA0(chip, BA0_MIDSR) & BA0_MIDSR_RBE) == 0) {
    1901             c = snd_cs4281_peekBA0(chip, BA0_MIDRP);
    1902             if ((chip->midcr & BA0_MIDCR_RIE) == 0)
    1903                 continue;
    1904             spin_unlock(&chip->reg_lock);
    1905             snd_rawmidi_receive(chip->midi_input, &c, 1);
    1906             spin_lock(&chip->reg_lock);
    1907         }
    1908         while ((snd_cs4281_peekBA0(chip, BA0_MIDSR) & BA0_MIDSR_TBF) == 0) {
    1909             if ((chip->midcr & BA0_MIDCR_TIE) == 0)
    1910                 break;
    1911             if (snd_rawmidi_transmit(chip->midi_output, &c, 1) != 1) {
    1912                 chip->midcr &= ~BA0_MIDCR_TIE;
    1913                 snd_cs4281_pokeBA0(chip, BA0_MIDCR, chip->midcr);
    1914                 break;
    1915             }
    1916             snd_cs4281_pokeBA0(chip, BA0_MIDWP, c);
    1917         }
    1918         spin_unlock(&chip->reg_lock);
    1919     }
    1920 
    1921     /* EOI to the PCI part... reenables interrupts */
    1922     snd_cs4281_pokeBA0(chip, BA0_HICR, BA0_HICR_EOI);
    1923     return IRQ_HANDLED;
    1924 
    1925 }
     1812static irqreturn_t snd_cs4281_interrupt(int irq, void *dev_id)
     1813{
     1814        struct cs4281 *chip = dev_id;
     1815        unsigned int status, dma, val;
     1816        struct cs4281_dma *cdma;
     1817
     1818        if (chip == NULL)
     1819                return IRQ_NONE;
     1820        status = snd_cs4281_peekBA0(chip, BA0_HISR);
     1821        if ((status & 0x7fffffff) == 0) {
     1822                snd_cs4281_pokeBA0(chip, BA0_HICR, BA0_HICR_EOI);
     1823                return IRQ_NONE;
     1824        }
     1825
     1826        if (status & (BA0_HISR_DMA(0)|BA0_HISR_DMA(1)|BA0_HISR_DMA(2)|BA0_HISR_DMA(3))) {
     1827                for (dma = 0; dma < 4; dma++)
     1828                        if (status & BA0_HISR_DMA(dma)) {
     1829                                cdma = &chip->dma[dma];
     1830                                spin_lock(&chip->reg_lock);
     1831                                /* ack DMA IRQ */
     1832                                val = snd_cs4281_peekBA0(chip, cdma->regHDSR);
     1833                                /* workaround, sometimes CS4281 acknowledges */
     1834                                /* end or middle transfer position twice */
     1835                                cdma->frag++;
     1836                                if ((val & BA0_HDSR_DHTC) && !(cdma->frag & 1)) {
     1837                                        cdma->frag--;
     1838                                        chip->spurious_dhtc_irq++;
     1839                                        spin_unlock(&chip->reg_lock);
     1840                                        continue;
     1841                                }
     1842                                if ((val & BA0_HDSR_DTC) && (cdma->frag & 1)) {
     1843                                        cdma->frag--;
     1844                                        chip->spurious_dtc_irq++;
     1845                                        spin_unlock(&chip->reg_lock);
     1846                                        continue;
     1847                                }
     1848                                spin_unlock(&chip->reg_lock);
     1849                                snd_pcm_period_elapsed(cdma->substream);
     1850                        }
     1851        }
     1852
     1853        if ((status & BA0_HISR_MIDI) && chip->rmidi) {
     1854                unsigned char c;
     1855               
     1856                spin_lock(&chip->reg_lock);
     1857                while ((snd_cs4281_peekBA0(chip, BA0_MIDSR) & BA0_MIDSR_RBE) == 0) {
     1858                        c = snd_cs4281_peekBA0(chip, BA0_MIDRP);
     1859                        if ((chip->midcr & BA0_MIDCR_RIE) == 0)
     1860                                continue;
     1861                        snd_rawmidi_receive(chip->midi_input, &c, 1);
     1862                }
     1863                while ((snd_cs4281_peekBA0(chip, BA0_MIDSR) & BA0_MIDSR_TBF) == 0) {
     1864                        if ((chip->midcr & BA0_MIDCR_TIE) == 0)
     1865                                break;
     1866                        if (snd_rawmidi_transmit(chip->midi_output, &c, 1) != 1) {
     1867                                chip->midcr &= ~BA0_MIDCR_TIE;
     1868                                snd_cs4281_pokeBA0(chip, BA0_MIDCR, chip->midcr);
     1869                                break;
     1870                        }
     1871                        snd_cs4281_pokeBA0(chip, BA0_MIDWP, c);
     1872                }
     1873                spin_unlock(&chip->reg_lock);
     1874        }
     1875
     1876        /* EOI to the PCI part... reenables interrupts */
     1877        snd_cs4281_pokeBA0(chip, BA0_HICR, BA0_HICR_EOI);
     1878
     1879        return IRQ_HANDLED;
     1880}
     1881
    19261882
    19271883/*
    19281884 * OPL3 command
    19291885 */
    1930 static void snd_cs4281_opl3_command(opl3_t * opl3, unsigned short cmd, unsigned char val)
    1931 {
    1932     unsigned long flags;
    1933     cs4281_t *chip = opl3->private_data;
    1934     void __iomem *port;
    1935 
    1936     if (cmd & OPL3_RIGHT)
    1937         port = (void *)chip->ba0 + BA0_B1AP; /* right port */
    1938     else
    1939         port = (void *)chip->ba0 + BA0_B0AP; /* left port */
    1940 
    1941     spin_lock_irqsave(&opl3->reg_lock, flags);
    1942 
    1943     writel((unsigned int)cmd, port);
    1944     udelay(10);
    1945 
    1946     writel((unsigned int)val, (unsigned long)port + 4);
    1947     udelay(30);
    1948 
    1949     spin_unlock_irqrestore(&opl3->reg_lock, flags);
     1886static void snd_cs4281_opl3_command(struct snd_opl3 *opl3, unsigned short cmd,
     1887                                    unsigned char val)
     1888{
     1889        unsigned long flags;
     1890        struct cs4281 *chip = opl3->private_data;
     1891        void __iomem *port;
     1892
     1893        if (cmd & OPL3_RIGHT)
     1894                port = chip->ba0 + BA0_B1AP; /* right port */
     1895        else
     1896                port = chip->ba0 + BA0_B0AP; /* left port */
     1897
     1898        spin_lock_irqsave(&opl3->reg_lock, flags);
     1899
     1900        writel((unsigned int)cmd, port);
     1901        udelay(10);
     1902
     1903        writel((unsigned int)val, port + 4);
     1904        udelay(30);
     1905
     1906        spin_unlock_irqrestore(&opl3->reg_lock, flags);
    19501907}
    19511908
    19521909static int __devinit snd_cs4281_probe(struct pci_dev *pci,
    1953                                       const struct pci_device_id *pci_id)
    1954 {
    1955     static int dev;
    1956     snd_card_t *card;
    1957     cs4281_t *chip;
    1958     opl3_t *opl3;
    1959     int err;
    1960 
    1961     if (dev >= SNDRV_CARDS)
    1962         return -ENODEV;
    1963     if (!enable[dev]) {
    1964         dev++;
    1965         return -ENOENT;
    1966     }
    1967 
    1968     card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0);
    1969     if (card == NULL)
    1970         return -ENOMEM;
    1971 
    1972     if ((err = snd_cs4281_create(card, pci, &chip, dual_codec[dev])) < 0) {
    1973         snd_card_free(card);
    1974         return err;
    1975     }
    1976 
    1977     if ((err = snd_cs4281_mixer(chip)) < 0) {
    1978         snd_card_free(card);
    1979         return err;
    1980     }
    1981     if ((err = snd_cs4281_pcm(chip, 0, NULL)) < 0) {
    1982         snd_card_free(card);
    1983         return err;
    1984     }
    1985     if ((err = snd_cs4281_midi(chip, 0, NULL)) < 0) {
    1986         snd_card_free(card);
    1987         return err;
    1988     }
    1989     if ((err = snd_opl3_new(card, OPL3_HW_OPL3_CS4281, &opl3)) < 0) {
    1990         snd_card_free(card);
    1991         return err;
    1992     }
    1993     opl3->private_data = chip;
    1994     opl3->command = snd_cs4281_opl3_command;
    1995     snd_opl3_init(opl3);
    1996 
    1997     if ((err = snd_opl3_hwdep_new(opl3, 0, 1, NULL)) < 0) {
    1998         snd_card_free(card);
    1999         return err;
    2000     }
    2001 #ifndef LINUX_2_2
    2002     snd_cs4281_gameport(chip);
    2003 #endif
    2004     strcpy(card->driver, "CS4281");
    2005     strcpy(card->shortname, "Cirrus Logic CS4281");
    2006     sprintf(card->longname, "%s at 0x%lx, irq %d",
    2007             card->shortname,
    2008             chip->ba0_addr,
    2009             chip->irq);
    2010 
    2011     if ((err = snd_card_register(card)) < 0) {
    2012         snd_card_free(card);
    2013         return err;
    2014     }
    2015 
    2016     pci_set_drvdata(pci, card);
    2017     dev++;
    2018     return 0;
     1910                                      const struct pci_device_id *pci_id)
     1911{
     1912        static int dev;
     1913        struct snd_card *card;
     1914        struct cs4281 *chip;
     1915        struct snd_opl3 *opl3;
     1916        int err;
     1917
     1918        if (dev >= SNDRV_CARDS)
     1919                return -ENODEV;
     1920        if (!enable[dev]) {
     1921                dev++;
     1922                return -ENOENT;
     1923        }
     1924
     1925        card = snd_card_new(index[dev], id[dev], THIS_MODULE, 0);
     1926        if (card == NULL)
     1927                return -ENOMEM;
     1928
     1929        if ((err = snd_cs4281_create(card, pci, &chip, dual_codec[dev])) < 0) {
     1930                snd_card_free(card);
     1931                return err;
     1932        }
     1933        card->private_data = chip;
     1934
     1935        if ((err = snd_cs4281_mixer(chip)) < 0) {
     1936                snd_card_free(card);
     1937                return err;
     1938        }
     1939        if ((err = snd_cs4281_pcm(chip, 0, NULL)) < 0) {
     1940                snd_card_free(card);
     1941                return err;
     1942        }
     1943        if ((err = snd_cs4281_midi(chip, 0, NULL)) < 0) {
     1944                snd_card_free(card);
     1945                return err;
     1946        }
     1947        if ((err = snd_opl3_new(card, OPL3_HW_OPL3_CS4281, &opl3)) < 0) {
     1948                snd_card_free(card);
     1949                return err;
     1950        }
     1951        opl3->private_data = chip;
     1952        opl3->command = snd_cs4281_opl3_command;
     1953        snd_opl3_init(opl3);
     1954        if ((err = snd_opl3_hwdep_new(opl3, 0, 1, NULL)) < 0) {
     1955                snd_card_free(card);
     1956                return err;
     1957        }
     1958        snd_cs4281_create_gameport(chip);
     1959        strcpy(card->driver, "CS4281");
     1960        strcpy(card->shortname, "Cirrus Logic CS4281");
     1961        sprintf(card->longname, "%s at 0x%lx, irq %d",
     1962                card->shortname,
     1963                chip->ba0_addr,
     1964                chip->irq);
     1965
     1966        if ((err = snd_card_register(card)) < 0) {
     1967                snd_card_free(card);
     1968                return err;
     1969        }
     1970
     1971        pci_set_drvdata(pci, card);
     1972        dev++;
     1973        return 0;
    20191974}
    20201975
    20211976static void __devexit snd_cs4281_remove(struct pci_dev *pci)
    20221977{
    2023     snd_card_free(pci_get_drvdata(pci));
    2024     pci_set_drvdata(pci, NULL);
     1978        snd_card_free(pci_get_drvdata(pci));
     1979        pci_set_drvdata(pci, NULL);
    20251980}
    20261981
     
    20311986
    20321987static int saved_regs[SUSPEND_REGISTERS] = {
    2033     BA0_JSCTL,
    2034     BA0_GPIOR,
    2035     BA0_SSCR,
    2036     BA0_MIDCR,
    2037     BA0_SRCSA,
    2038     BA0_PASR,
    2039     BA0_CASR,
    2040     BA0_DACSR,
    2041     BA0_ADCSR,
    2042     BA0_FMLVC,
    2043     BA0_FMRVC,
    2044     BA0_PPLVC,
    2045     BA0_PPRVC,
     1988        BA0_JSCTL,
     1989        BA0_GPIOR,
     1990        BA0_SSCR,
     1991        BA0_MIDCR,
     1992        BA0_SRCSA,
     1993        BA0_PASR,
     1994        BA0_CASR,
     1995        BA0_DACSR,
     1996        BA0_ADCSR,
     1997        BA0_FMLVC,
     1998        BA0_FMRVC,
     1999        BA0_PPLVC,
     2000        BA0_PPRVC,
    20462001};
    20472002
    2048 #define number_of(array)        (sizeof(array) / sizeof(array[0]))
    2049 
    20502003#define CLKCR1_CKRA                             0x00010000L
    20512004
    2052 static int cs4281_suspend(snd_card_t *card, unsigned int state)
    2053 {
    2054     cs4281_t *chip = card->pm_private_data;
    2055     u32 ulCLK;
    2056     unsigned int i;
    2057 
    2058     snd_pcm_suspend_all(chip->pcm);
    2059 
    2060     if (chip->ac97)
    2061         snd_ac97_suspend(chip->ac97);
    2062     if (chip->ac97_secondary)
    2063         snd_ac97_suspend(chip->ac97_secondary);
    2064 
    2065     ulCLK = snd_cs4281_peekBA0(chip, BA0_CLKCR1);
    2066     ulCLK |= CLKCR1_CKRA;
    2067     snd_cs4281_pokeBA0(chip, BA0_CLKCR1, ulCLK);
    2068 
    2069     /* Disable interrupts. */
    2070     snd_cs4281_pokeBA0(chip, BA0_HICR, BA0_HICR_CHGM);
    2071 
    2072     /* remember the status registers */
    2073     for (i = 0; i < number_of(saved_regs); i++)
    2074         if (saved_regs[i])
    2075             chip->suspend_regs[i] = snd_cs4281_peekBA0(chip, saved_regs[i]);
    2076 
    2077     /* Turn off the serial ports. */
    2078     snd_cs4281_pokeBA0(chip, BA0_SERMC, 0);
    2079 
    2080     /* Power off FM, Joystick, AC link, */
    2081     snd_cs4281_pokeBA0(chip, BA0_SSPM, 0);
    2082 
    2083     /* DLL off. */
    2084     snd_cs4281_pokeBA0(chip, BA0_CLKCR1, 0);
    2085 
    2086     /* AC link off. */
    2087     snd_cs4281_pokeBA0(chip, BA0_SPMC, 0);
    2088 
    2089     ulCLK = snd_cs4281_peekBA0(chip, BA0_CLKCR1);
    2090     ulCLK &= ~CLKCR1_CKRA;
    2091     snd_cs4281_pokeBA0(chip, BA0_CLKCR1, ulCLK);
    2092 
    2093     return 0;
    2094 }
    2095 
    2096 static int cs4281_resume(snd_card_t *card, unsigned int state)
    2097 {
    2098     cs4281_t *chip = card->pm_private_data;
    2099     unsigned int i;
    2100     u32 ulCLK;
    2101 
    2102     pci_enable_device(chip->pci);
    2103 
    2104     ulCLK = snd_cs4281_peekBA0(chip, BA0_CLKCR1);
    2105     ulCLK |= CLKCR1_CKRA;
    2106     snd_cs4281_pokeBA0(chip, BA0_CLKCR1, ulCLK);
    2107 
    2108     snd_cs4281_chip_init(chip);
    2109 
    2110     /* restore the status registers */
    2111     for (i = 0; i < number_of(saved_regs); i++)
    2112         if (saved_regs[i])
    2113             snd_cs4281_pokeBA0(chip, saved_regs[i], chip->suspend_regs[i]);
    2114 
    2115     if (chip->ac97)
    2116         snd_ac97_resume(chip->ac97);
    2117     if (chip->ac97_secondary)
    2118         snd_ac97_resume(chip->ac97_secondary);
    2119 
    2120     ulCLK = snd_cs4281_peekBA0(chip, BA0_CLKCR1);
    2121     ulCLK &= ~CLKCR1_CKRA;
    2122     snd_cs4281_pokeBA0(chip, BA0_CLKCR1, ulCLK);
    2123 
    2124     return 0;
    2125 }
    2126 
    2127 
     2005static int cs4281_suspend(struct pci_dev *pci, pm_message_t state)
     2006{
     2007        struct snd_card *card = pci_get_drvdata(pci);
     2008        struct cs4281 *chip = card->private_data;
     2009        u32 ulCLK;
     2010        unsigned int i;
     2011
     2012        snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
     2013        snd_pcm_suspend_all(chip->pcm);
     2014
     2015        snd_ac97_suspend(chip->ac97);
     2016        snd_ac97_suspend(chip->ac97_secondary);
     2017
     2018        ulCLK = snd_cs4281_peekBA0(chip, BA0_CLKCR1);
     2019        ulCLK |= CLKCR1_CKRA;
     2020        snd_cs4281_pokeBA0(chip, BA0_CLKCR1, ulCLK);
     2021
     2022        /* Disable interrupts. */
     2023        snd_cs4281_pokeBA0(chip, BA0_HICR, BA0_HICR_CHGM);
     2024
     2025        /* remember the status registers */
     2026        for (i = 0; i < ARRAY_SIZE(saved_regs); i++)
     2027                if (saved_regs[i])
     2028                        chip->suspend_regs[i] = snd_cs4281_peekBA0(chip, saved_regs[i]);
     2029
     2030        /* Turn off the serial ports. */
     2031        snd_cs4281_pokeBA0(chip, BA0_SERMC, 0);
     2032
     2033        /* Power off FM, Joystick, AC link, */
     2034        snd_cs4281_pokeBA0(chip, BA0_SSPM, 0);
     2035
     2036        /* DLL off. */
     2037        snd_cs4281_pokeBA0(chip, BA0_CLKCR1, 0);
     2038
     2039        /* AC link off. */
     2040        snd_cs4281_pokeBA0(chip, BA0_SPMC, 0);
     2041
     2042        ulCLK = snd_cs4281_peekBA0(chip, BA0_CLKCR1);
     2043        ulCLK &= ~CLKCR1_CKRA;
     2044        snd_cs4281_pokeBA0(chip, BA0_CLKCR1, ulCLK);
     2045
     2046        pci_disable_device(pci);
     2047        pci_save_state(pci);
     2048        pci_set_power_state(pci, pci_choose_state(pci, state));
     2049        return 0;
     2050}
     2051
     2052static int cs4281_resume(struct pci_dev *pci)
     2053{
     2054        struct snd_card *card = pci_get_drvdata(pci);
     2055        struct cs4281 *chip = card->private_data;
     2056        unsigned int i;
     2057        u32 ulCLK;
     2058
     2059        pci_set_power_state(pci, PCI_D0);
     2060        pci_restore_state(pci);
     2061        if (pci_enable_device(pci) < 0) {
     2062                printk(KERN_ERR "cs4281: pci_enable_device failed, "
     2063                       "disabling device\n");
     2064                snd_card_disconnect(card);
     2065                return -EIO;
     2066        }
     2067        pci_set_master(pci);
     2068
     2069        ulCLK = snd_cs4281_peekBA0(chip, BA0_CLKCR1);
     2070        ulCLK |= CLKCR1_CKRA;
     2071        snd_cs4281_pokeBA0(chip, BA0_CLKCR1, ulCLK);
     2072
     2073        snd_cs4281_chip_init(chip);
     2074
     2075        /* restore the status registers */
     2076        for (i = 0; i < ARRAY_SIZE(saved_regs); i++)
     2077                if (saved_regs[i])
     2078                        snd_cs4281_pokeBA0(chip, saved_regs[i], chip->suspend_regs[i]);
     2079
     2080        snd_ac97_resume(chip->ac97);
     2081        snd_ac97_resume(chip->ac97_secondary);
     2082
     2083        ulCLK = snd_cs4281_peekBA0(chip, BA0_CLKCR1);
     2084        ulCLK &= ~CLKCR1_CKRA;
     2085        snd_cs4281_pokeBA0(chip, BA0_CLKCR1, ulCLK);
     2086
     2087        snd_power_change_state(card, SNDRV_CTL_POWER_D0);
     2088        return 0;
     2089}
    21282090#endif /* CONFIG_PM */
    21292091
    21302092static struct pci_driver driver = {
    2131     0, 0,0,
    2132     "CS4281",
    2133     snd_cs4281_ids,
    2134     snd_cs4281_probe,
    2135     snd_cs4281_remove,
    2136     SND_PCI_PM_CALLBACKS
     2093        .name = "CS4281",
     2094        .id_table = snd_cs4281_ids,
     2095        .probe = snd_cs4281_probe,
     2096        .remove = __devexit_p(snd_cs4281_remove),
     2097#ifdef CONFIG_PM
     2098        .suspend = cs4281_suspend,
     2099        .resume = cs4281_resume,
     2100#endif
    21372101};
    2138 
     2102       
    21392103static int __init alsa_card_cs4281_init(void)
    21402104{
    2141     int err;
    2142 
    2143     if ((err = pci_module_init(&driver)) < 0) {
    2144 #ifdef MODULE
    2145         //              printk(KERN_ERR "CS4281 soundcard not found or device busy\n");
    2146 #endif
    2147         return err;
    2148     }
    2149     return 0;
     2105        return pci_register_driver(&driver);
    21502106}
    21512107
    21522108static void __exit alsa_card_cs4281_exit(void)
    21532109{
    2154     pci_unregister_driver(&driver);
     2110        pci_unregister_driver(&driver);
    21552111}
    21562112
    21572113module_init(alsa_card_cs4281_init)
    21582114module_exit(alsa_card_cs4281_exit)
    2159 
    2160 #ifndef MODULE
    2161 
    2162 /* format is: snd-cs4281=snd_enable,snd_index,snd_id */
    2163 
    2164 static int __init alsa_card_cs4281_setup(char *str)
    2165 {
    2166     static unsigned __initdata nr_dev = 0;
    2167 
    2168     if (nr_dev >= SNDRV_CARDS)
    2169         return 0;
    2170     (void)(get_option(&str,&enable[nr_dev]) == 2 &&
    2171            get_option(&str,&index[nr_dev]) == 2 &&
    2172            get_id(&str,&id[nr_dev]) == 2);
    2173     nr_dev++;
    2174     return 1;
    2175 }
    2176 
    2177 __setup("snd-cs4281=", alsa_card_cs4281_setup);
    2178 
    2179 #endif /* ifndef MODULE */
Note: See TracChangeset for help on using the changeset viewer.